[ppl] 01/68: Imported Upstream version 0.9

Andreas Tille tille at debian.org
Sat Nov 12 08:39:48 UTC 2016


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository ppl.

commit ebc0ded6e4c41f61b2585393a42143efb8484290
Author: Andreas Tille <tille at debian.org>
Date:   Sat Nov 12 01:13:11 2016 -0600

    Imported Upstream version 0.9
---
 BUGS                                            |    22 +
 COPYING                                         |   340 +
 CREDITS                                         |   222 +
 ChangeLog                                       | 48803 ++++++++++++++++++++++
 INSTALL                                         |   236 +
 Makefile.am                                     |    42 +
 Makefile.in                                     |   767 +
 NEWS                                            |  1116 +
 README                                          |  1052 +
 README.configure                                |   217 +
 STANDARDS                                       |   489 +
 TODO                                            |    68 +
 Watchdog/BUGS                                   |     2 +
 Watchdog/COPYING                                |   340 +
 Watchdog/CREDITS                                |    12 +
 Watchdog/ChangeLog                              |  1024 +
 Watchdog/INSTALL                                |   236 +
 Watchdog/Makefile.am                            |    30 +
 Watchdog/Makefile.in                            |   654 +
 Watchdog/NEWS                                   |    65 +
 Watchdog/README                                 |    94 +
 Watchdog/aclocal.m4                             |  7227 ++++
 Watchdog/compile                                |   142 +
 Watchdog/config.guess                           |  1498 +
 Watchdog/config.h.in                            |    70 +
 Watchdog/config.sub                             |  1609 +
 Watchdog/configure                              | 22264 ++++++++++
 Watchdog/configure.ac                           |   299 +
 Watchdog/depcomp                                |   530 +
 Watchdog/install-sh                             |   401 +
 Watchdog/ltmain.sh                              |  6863 +++
 Watchdog/missing                                |   359 +
 Watchdog/mkinstalldirs                          |   158 +
 Watchdog/src/Doubly_Linked_Object.defs.hh       |    64 +
 Watchdog/src/Doubly_Linked_Object.inlines.hh    |    69 +
 Watchdog/src/Doubly_Linked_Object.types.hh      |    21 +
 Watchdog/src/EList.defs.hh                      |    87 +
 Watchdog/src/EList.inlines.hh                   |   112 +
 Watchdog/src/EList.types.hh                     |    22 +
 Watchdog/src/EList_Iterator.defs.hh             |    83 +
 Watchdog/src/EList_Iterator.inlines.hh          |   104 +
 Watchdog/src/EList_Iterator.types.hh            |    22 +
 Watchdog/src/Handler.defs.hh                    |    90 +
 Watchdog/src/Handler.inlines.hh                 |    57 +
 Watchdog/src/Handler.types.hh                   |    26 +
 Watchdog/src/Makefile.am                        |   143 +
 Watchdog/src/Makefile.in                        |   644 +
 Watchdog/src/Pending_Element.cc                 |    32 +
 Watchdog/src/Pending_Element.defs.hh            |    75 +
 Watchdog/src/Pending_Element.inlines.hh         |    63 +
 Watchdog/src/Pending_Element.types.hh           |    21 +
 Watchdog/src/Pending_List.cc                    |    75 +
 Watchdog/src/Pending_List.defs.hh               |    74 +
 Watchdog/src/Pending_List.inlines.hh            |    65 +
 Watchdog/src/Pending_List.types.hh              |    21 +
 Watchdog/src/Time.cc                            |    32 +
 Watchdog/src/Time.defs.hh                       |   111 +
 Watchdog/src/Time.inlines.hh                    |   144 +
 Watchdog/src/Time.types.hh                      |    21 +
 Watchdog/src/Watchdog.cc                        |   252 +
 Watchdog/src/Watchdog.defs.hh                   |   139 +
 Watchdog/src/Watchdog.inlines.hh                |    80 +
 Watchdog/src/Watchdog.types.hh                  |    21 +
 Watchdog/src/pwl.hh.dist                        |  1338 +
 Watchdog/src/pwl_header.hh                      |    50 +
 Watchdog/utils/Makefile.am                      |    45 +
 Watchdog/utils/Makefile.in                      |   374 +
 Watchdog/utils/build_header.in                  |   102 +
 aclocal.m4                                      |  7241 ++++
 compile                                         |   142 +
 config.guess                                    |  1498 +
 config.h.in                                     |   286 +
 config.rpath                                    |   557 +
 config.sub                                      |  1609 +
 configure                                       | 33025 +++++++++++++++
 configure.ac                                    |   911 +
 debian/Makefile.am                              |    44 +
 debian/Makefile.in                              |   465 +
 debian/README                                   |    35 +
 debian/changelog                                |    11 +
 debian/compat                                   |     1 +
 debian/control                                  |    74 +
 debian/libppl-c.dirs                            |     1 +
 debian/libppl-c.install                         |     1 +
 debian/libppl-c.links                           |     1 +
 debian/libppl-dev.dirs                          |     3 +
 debian/libppl-dev.doc-base                      |    17 +
 debian/libppl-dev.doc-base.user                 |    17 +
 debian/libppl-dev.docs                          |     0
 debian/libppl-dev.install                       |     5 +
 debian/libppl-dev.links                         |     1 +
 debian/libppl-pwl.copyright.in                  |   444 +
 debian/libppl-pwl.dirs                          |     2 +
 debian/libppl-pwl.docs                          |     5 +
 debian/libppl-pwl.install                       |     4 +
 debian/libppl.copyright.in                      |   444 +
 debian/libppl.dirs                              |     3 +
 debian/libppl.docs                              |     5 +
 debian/libppl.install                           |     8 +
 debian/rules                                    |   186 +
 demos/Makefile.am                               |    23 +
 demos/Makefile.in                               |   594 +
 demos/ppl_lcdd/Makefile.am                      |   122 +
 demos/ppl_lcdd/Makefile.in                      |   770 +
 demos/ppl_lcdd/examples/1d.ine                  |     5 +
 demos/ppl_lcdd/examples/1da.ine                 |     6 +
 demos/ppl_lcdd/examples/Makefile.am             |   135 +
 demos/ppl_lcdd/examples/Makefile.in             |   552 +
 demos/ppl_lcdd/examples/README                  |    13 +
 demos/ppl_lcdd/examples/allzero.ine             |    11 +
 demos/ppl_lcdd/examples/ccc4.ext                |    14 +
 demos/ppl_lcdd/examples/ccc5.ext                |    21 +
 demos/ppl_lcdd/examples/ccc6.ext                |    37 +
 demos/ppl_lcdd/examples/ccp4.ext                |    14 +
 demos/ppl_lcdd/examples/ccp5.ext                |    22 +
 demos/ppl_lcdd/examples/ccp6.ext                |    38 +
 demos/ppl_lcdd/examples/cp4.ext                 |    12 +
 demos/ppl_lcdd/examples/cp4.ine                 |    20 +
 demos/ppl_lcdd/examples/cp5.ext                 |    21 +
 demos/ppl_lcdd/examples/cp5.ine                 |    61 +
 demos/ppl_lcdd/examples/cp6.ext                 |    37 +
 demos/ppl_lcdd/examples/cp6.ine                 |   373 +
 demos/ppl_lcdd/examples/cp7.ext                 |    70 +
 demos/ppl_lcdd/examples/cross10.ine             |  1030 +
 demos/ppl_lcdd/examples/cross12.ine             |  4102 ++
 demos/ppl_lcdd/examples/cross4.ine              |    20 +
 demos/ppl_lcdd/examples/cross6.ine              |    69 +
 demos/ppl_lcdd/examples/cross8.ine              |   261 +
 demos/ppl_lcdd/examples/cube.ext                |    13 +
 demos/ppl_lcdd/examples/cube.ine                |    12 +
 demos/ppl_lcdd/examples/cube10.ine              |    25 +
 demos/ppl_lcdd/examples/cube12.ine              |    29 +
 demos/ppl_lcdd/examples/cube3.ine               |    11 +
 demos/ppl_lcdd/examples/cube6.ine               |    17 +
 demos/ppl_lcdd/examples/cube8.ine               |    21 +
 demos/ppl_lcdd/examples/cubetop.ine             |    12 +
 demos/ppl_lcdd/examples/cubocta.ine             |    19 +
 demos/ppl_lcdd/examples/cut16_11.ext            |    21 +
 demos/ppl_lcdd/examples/cut32_16.ext            |    37 +
 demos/ppl_lcdd/examples/cyc.ine                 |    10 +
 demos/ppl_lcdd/examples/cyclic10-4.ext          |    16 +
 demos/ppl_lcdd/examples/cyclic12-6.ext          |    18 +
 demos/ppl_lcdd/examples/cyclic14-8.ext          |    20 +
 demos/ppl_lcdd/examples/cyclic16-10.ext         |    23 +
 demos/ppl_lcdd/examples/cyclic17_8.ine          |    20 +
 demos/ppl_lcdd/examples/cyclic25_13.ext         |    54 +
 demos/ppl_lcdd/examples/dcube10.ext             |    24 +
 demos/ppl_lcdd/examples/dcube12.ext             |    28 +
 demos/ppl_lcdd/examples/dcube3.ext              |    10 +
 demos/ppl_lcdd/examples/dcube6.ext              |    16 +
 demos/ppl_lcdd/examples/dcube8.ext              |    20 +
 demos/ppl_lcdd/examples/diamond.ine             |    10 +
 demos/ppl_lcdd/examples/dodeca_m.ine            |    17 +
 demos/ppl_lcdd/examples/ex1.ine                 |    10 +
 demos/ppl_lcdd/examples/grcubocta.ine           |    31 +
 demos/ppl_lcdd/examples/hexocta.ine             |    54 +
 demos/ppl_lcdd/examples/icododeca_m.ine         |    39 +
 demos/ppl_lcdd/examples/in0.ine                 |    11 +
 demos/ppl_lcdd/examples/in1.ine                 |    37 +
 demos/ppl_lcdd/examples/in2.ine                 |    19 +
 demos/ppl_lcdd/examples/in3.ine                 |    16 +
 demos/ppl_lcdd/examples/in4.ine                 |    15 +
 demos/ppl_lcdd/examples/in5.ine                 |    17 +
 demos/ppl_lcdd/examples/in6.ine                 |    26 +
 demos/ppl_lcdd/examples/in7.ine                 |    23 +
 demos/ppl_lcdd/examples/infeas.ine              |    18 +
 demos/ppl_lcdd/examples/integralpoints.ine      |    36 +
 demos/ppl_lcdd/examples/irbox20-4.ext           |    25 +
 demos/ppl_lcdd/examples/irbox200-4.ext          |   205 +
 demos/ppl_lcdd/examples/kkd18_4.ine             |    25 +
 demos/ppl_lcdd/examples/kkd27_5.ine             |    34 +
 demos/ppl_lcdd/examples/kkd38_6.ine             |    49 +
 demos/ppl_lcdd/examples/kq20_11_m.ine           |    24 +
 demos/ppl_lcdd/examples/metric40_11.ine         |    45 +
 demos/ppl_lcdd/examples/metric80_16.ine         |    86 +
 demos/ppl_lcdd/examples/mit.ine                 |   732 +
 demos/ppl_lcdd/examples/mit288-281.ine          |   291 +
 demos/ppl_lcdd/examples/mit31-20.ine            |    34 +
 demos/ppl_lcdd/examples/mit41-16.ine            |    44 +
 demos/ppl_lcdd/examples/mit708-9.ine            |   711 +
 demos/ppl_lcdd/examples/mit71-61.ine            |    74 +
 demos/ppl_lcdd/examples/mit90-86.ine            |    93 +
 demos/ppl_lcdd/examples/mp5.ext                 |    36 +
 demos/ppl_lcdd/examples/mp5.ine                 |    45 +
 demos/ppl_lcdd/examples/mp5a.ine                |    44 +
 demos/ppl_lcdd/examples/mp6.ine                 |    84 +
 demos/ppl_lcdd/examples/nonfull.ine             |    11 +
 demos/ppl_lcdd/examples/origin.ine              |    14 +
 demos/ppl_lcdd/examples/prodst62.ext            |  3467 ++
 demos/ppl_lcdd/examples/project1_m.ine          |    24 +
 demos/ppl_lcdd/examples/project1res.ine         |    18 +
 demos/ppl_lcdd/examples/project2_m.ine          |    66 +
 demos/ppl_lcdd/examples/project2res.ine         |    90 +
 demos/ppl_lcdd/examples/rcubocta.ine            |    31 +
 demos/ppl_lcdd/examples/redcheck.ext            |    11 +
 demos/ppl_lcdd/examples/reg24-5.ext             |    31 +
 demos/ppl_lcdd/examples/reg24-5.ine             |    30 +
 demos/ppl_lcdd/examples/reg600-5_m.ext          |   606 +
 demos/ppl_lcdd/examples/rhomtria_m.ine          |    35 +
 demos/ppl_lcdd/examples/sample.ine              |    11 +
 demos/ppl_lcdd/examples/sampleh1.ine            |     9 +
 demos/ppl_lcdd/examples/sampleh2.ine            |     7 +
 demos/ppl_lcdd/examples/sampleh3.ine            |     7 +
 demos/ppl_lcdd/examples/sampleh4.ine            |    12 +
 demos/ppl_lcdd/examples/sampleh5.ine            |    15 +
 demos/ppl_lcdd/examples/sampleh6.ine            |    11 +
 demos/ppl_lcdd/examples/sampleh7.ine            |    19 +
 demos/ppl_lcdd/examples/sampleh8.ine            |   110 +
 demos/ppl_lcdd/examples/samplev1.ext            |     8 +
 demos/ppl_lcdd/examples/samplev2.ext            |    11 +
 demos/ppl_lcdd/examples/samplev3.ext            |    16 +
 demos/ppl_lcdd/examples/trunc10.ine             |   119 +
 demos/ppl_lcdd/examples/trunc7.ine              |    65 +
 demos/ppl_lcdd/examples/tsp5.ext                |    16 +
 demos/ppl_lcdd/examples/tsp5.ine                |    30 +
 demos/ppl_lcdd/expected_int16                   |    98 +
 demos/ppl_lcdd/expected_int16_a                 |    85 +
 demos/ppl_lcdd/expected_int32                   |    98 +
 demos/ppl_lcdd/expected_int32_a                 |    85 +
 demos/ppl_lcdd/expected_int64                   |    98 +
 demos/ppl_lcdd/expected_int64_a                 |    85 +
 demos/ppl_lcdd/expected_int8                    |    98 +
 demos/ppl_lcdd/expected_int8_a                  |    85 +
 demos/ppl_lcdd/expected_mpz                     |    98 +
 demos/ppl_lcdd/expected_mpz_a                   |    85 +
 demos/ppl_lcdd/ppl_lcdd.cc                      |  1294 +
 demos/ppl_lpsol/Makefile.am                     |   160 +
 demos/ppl_lpsol/Makefile.in                     |   821 +
 demos/ppl_lpsol/dummy.cc                        |     1 +
 demos/ppl_lpsol/examples/Makefile.am            |    38 +
 demos/ppl_lpsol/examples/Makefile.in            |   456 +
 demos/ppl_lpsol/examples/README                 |     7 +
 demos/ppl_lpsol/examples/adlittle.mps           |   335 +
 demos/ppl_lpsol/examples/afiro.mps              |    83 +
 demos/ppl_lpsol/examples/bgprtr.mps             |    84 +
 demos/ppl_lpsol/examples/blend.mps              |   359 +
 demos/ppl_lpsol/examples/boeing1.mps            |  2636 ++
 demos/ppl_lpsol/examples/boeing2.mps            |   970 +
 demos/ppl_lpsol/examples/ex1.mps                |    19 +
 demos/ppl_lpsol/examples/kb2.mps                |   219 +
 demos/ppl_lpsol/examples/mip.mps                |    27 +
 demos/ppl_lpsol/examples/sample.mps             |    22 +
 demos/ppl_lpsol/examples/sc105.mps              |   296 +
 demos/ppl_lpsol/examples/sc50a.mps              |   141 +
 demos/ppl_lpsol/examples/sc50b.mps              |   127 +
 demos/ppl_lpsol/examples/ship08l.mps            |  9547 +++++
 demos/ppl_lpsol/examples/unboundedmin.mps       |    19 +
 demos/ppl_lpsol/expected_int16                  |    79 +
 demos/ppl_lpsol/expected_int16_a                |    67 +
 demos/ppl_lpsol/expected_int32                  |    98 +
 demos/ppl_lpsol/expected_int32_a                |    96 +
 demos/ppl_lpsol/expected_int64                  |    98 +
 demos/ppl_lpsol/expected_int64_a                |    96 +
 demos/ppl_lpsol/expected_int8                   |    56 +
 demos/ppl_lpsol/expected_int8_a                 |    54 +
 demos/ppl_lpsol/expected_mpz                    |  1980 +
 demos/ppl_lpsol/expected_mpz_a                  |  1910 +
 demos/ppl_lpsol/ppl_lpsol.c                     |   895 +
 depcomp                                         |   530 +
 doc/Makefile.am                                 |   284 +
 doc/Makefile.in                                 |   766 +
 doc/README.doc                                  |   139 +
 doc/definitions.dox                             |  3502 ++
 doc/devref.doxyconf-html                        |  1446 +
 doc/devref.doxyconf-html.in                     |  1446 +
 doc/devref.doxyconf-latex                       |  1446 +
 doc/devref.doxyconf-latex.in                    |  1446 +
 doc/devref.tex                                  |   135 +
 doc/fdl.dox                                     |   405 +
 doc/fdl.pdf                                     |   Bin 0 -> 59059 bytes
 doc/fdl.ps.gz                                   |   Bin 0 -> 67885 bytes
 doc/fdl.tex                                     |   454 +
 doc/fdl.txt                                     |   397 +
 doc/gpl.dox                                     |   461 +
 doc/gpl.pdf                                     |   Bin 0 -> 71909 bytes
 doc/gpl.ps.gz                                   |   Bin 0 -> 78865 bytes
 doc/gpl.tex                                     |   380 +
 doc/gpl.txt                                     |   340 +
 doc/ppl-config.1                                |   106 +
 doc/ppl-user-0.9-html.tar.gz                    |   Bin 0 -> 583785 bytes
 doc/ppl-user-0.9.pdf                            |   Bin 0 -> 2839226 bytes
 doc/ppl-user-0.9.ps.gz                          |   Bin 0 -> 1163250 bytes
 doc/ppl.sty                                     |   178 +
 doc/ppl_lcdd.1                                  |    50 +
 doc/ppl_lpsol.1                                 |    60 +
 doc/user.doxyconf-html                          |  1243 +
 doc/user.doxyconf-html.in                       |  1243 +
 doc/user.doxyconf-latex                         |  1243 +
 doc/user.doxyconf-latex.in                      |  1243 +
 doc/user.tex                                    |   135 +
 install-sh                                      |   401 +
 instchk.hh                                      |    81 +
 interfaces/C/Makefile.am                        |    70 +
 interfaces/C/Makefile.in                        |   644 +
 interfaces/C/ppl_c.cc                           |  2524 ++
 interfaces/C/ppl_c.h                            |  2695 ++
 interfaces/C/ppl_c.h.in                         |  2695 ++
 interfaces/Makefile.am                          |    23 +
 interfaces/Makefile.in                          |   594 +
 interfaces/Prolog/Ciao/Makefile.am              |   168 +
 interfaces/Prolog/Ciao/Makefile.in              |   734 +
 interfaces/Prolog/Ciao/ciao_clpq.pl             |    55 +
 interfaces/Prolog/Ciao/ciao_clpq2.pl            |    56 +
 interfaces/Prolog/Ciao/ciao_pl_check.pl         |   163 +
 interfaces/Prolog/Ciao/ppl_ciao.cc              |   412 +
 interfaces/Prolog/Ciao/ppl_ciao.pl              |  1683 +
 interfaces/Prolog/GNU/Makefile.am               |   153 +
 interfaces/Prolog/GNU/Makefile.in               |   751 +
 interfaces/Prolog/GNU/README                    |    32 +
 interfaces/Prolog/GNU/gnu_pl_check.pl           |    36 +
 interfaces/Prolog/GNU/gp_clpq.pl                |    31 +
 interfaces/Prolog/GNU/ppl_gprolog.pl            |   182 +
 interfaces/Prolog/GNU/ppl_gprolog_sd.cc         |   438 +
 interfaces/Prolog/Makefile.am                   |    25 +
 interfaces/Prolog/Makefile.in                   |   598 +
 interfaces/Prolog/Prolog_interface.dox          |  2175 +
 interfaces/Prolog/SICStus/Makefile.am           |   162 +
 interfaces/Prolog/SICStus/Makefile.in           |   742 +
 interfaces/Prolog/SICStus/ppl_sicstus.pl        |    29 +
 interfaces/Prolog/SICStus/ppl_sicstus_sd.cc     |   474 +
 interfaces/Prolog/SICStus/sicstus_cfli.cc       |    27 +
 interfaces/Prolog/SICStus/sicstus_cfli.h        |   155 +
 interfaces/Prolog/SICStus/sicstus_cfli.ic       |   299 +
 interfaces/Prolog/SICStus/sp_clpq.pl            |    35 +
 interfaces/Prolog/SICStus/sp_pl_check.pl        |    40 +
 interfaces/Prolog/SWI/Makefile.am               |   151 +
 interfaces/Prolog/SWI/Makefile.in               |   789 +
 interfaces/Prolog/SWI/pl_clpq.cc                |    42 +
 interfaces/Prolog/SWI/pl_clpq.pl                |    32 +
 interfaces/Prolog/SWI/ppl_pl.cc                 |    38 +
 interfaces/Prolog/SWI/ppl_swiprolog.cc          |   524 +
 interfaces/Prolog/SWI/ppl_swiprolog.pl          |    23 +
 interfaces/Prolog/SWI/swi_pl_check.pl           |    38 +
 interfaces/Prolog/XSB/Makefile.am               |   171 +
 interfaces/Prolog/XSB/Makefile.in               |   737 +
 interfaces/Prolog/XSB/expected_clpq2_int16      |   102 +
 interfaces/Prolog/XSB/expected_clpq2_int16_a    |   103 +
 interfaces/Prolog/XSB/expected_clpq2_int32      |   109 +
 interfaces/Prolog/XSB/expected_clpq2_int32_a    |   102 +
 interfaces/Prolog/XSB/expected_clpq2_int64      |   109 +
 interfaces/Prolog/XSB/expected_clpq2_int64_a    |   109 +
 interfaces/Prolog/XSB/expected_clpq2_int8       |   101 +
 interfaces/Prolog/XSB/expected_clpq2_int8_a     |   101 +
 interfaces/Prolog/XSB/expected_clpq2_mpz        |   109 +
 interfaces/Prolog/XSB/expected_clpq2_mpz_a      |   109 +
 interfaces/Prolog/XSB/expected_clpq_int16       |    35 +
 interfaces/Prolog/XSB/expected_clpq_int16_a     |    35 +
 interfaces/Prolog/XSB/expected_clpq_int32       |    35 +
 interfaces/Prolog/XSB/expected_clpq_int32_a     |    35 +
 interfaces/Prolog/XSB/expected_clpq_int64       |    35 +
 interfaces/Prolog/XSB/expected_clpq_int64_a     |    35 +
 interfaces/Prolog/XSB/expected_clpq_int8        |    29 +
 interfaces/Prolog/XSB/expected_clpq_int8_a      |    29 +
 interfaces/Prolog/XSB/expected_clpq_mpz         |    35 +
 interfaces/Prolog/XSB/expected_clpq_mpz_a       |    35 +
 interfaces/Prolog/XSB/expected_pchk_int16       |     3 +
 interfaces/Prolog/XSB/expected_pchk_int16_a     |     3 +
 interfaces/Prolog/XSB/expected_pchk_int32       |     3 +
 interfaces/Prolog/XSB/expected_pchk_int32_a     |     3 +
 interfaces/Prolog/XSB/expected_pchk_int64       |     1 +
 interfaces/Prolog/XSB/expected_pchk_int64_a     |     3 +
 interfaces/Prolog/XSB/expected_pchk_int8        |     9 +
 interfaces/Prolog/XSB/expected_pchk_int8_a      |     9 +
 interfaces/Prolog/XSB/expected_pchk_mpz         |     1 +
 interfaces/Prolog/XSB/expected_pchk_mpz_a       |     1 +
 interfaces/Prolog/XSB/ppl_xsb.H                 |   143 +
 interfaces/Prolog/XSB/ppl_xsb.cc                |   834 +
 interfaces/Prolog/XSB/xsb_clpq.P                |    52 +
 interfaces/Prolog/XSB/xsb_clpq2.P               |    53 +
 interfaces/Prolog/XSB/xsb_pl_check.P            |   163 +
 interfaces/Prolog/YAP/Makefile.am               |   125 +
 interfaces/Prolog/YAP/Makefile.in               |   685 +
 interfaces/Prolog/YAP/ppl_yap.cc                |   725 +
 interfaces/Prolog/YAP/ppl_yap.pl                |    23 +
 interfaces/Prolog/YAP/yap_clpq.pl               |    30 +
 interfaces/Prolog/YAP/yap_clpq2.pl              |    30 +
 interfaces/Prolog/YAP/yap_pl_check.pl           |    34 +
 interfaces/Prolog/exceptions.hh                 |   174 +
 interfaces/Prolog/ppl_prolog.icc                |  3483 ++
 interfaces/Prolog/tests/Makefile.am             |    51 +
 interfaces/Prolog/tests/Makefile.in             |   465 +
 interfaces/Prolog/tests/ack.clpq                |     5 +
 interfaces/Prolog/tests/ackn.clpq               |     6 +
 interfaces/Prolog/tests/clpq.pl                 |   801 +
 interfaces/Prolog/tests/clpq2.pl                |  1119 +
 interfaces/Prolog/tests/expected_clpq2_int16    |   102 +
 interfaces/Prolog/tests/expected_clpq2_int16_a  |   103 +
 interfaces/Prolog/tests/expected_clpq2_int32    |   109 +
 interfaces/Prolog/tests/expected_clpq2_int32_a  |   102 +
 interfaces/Prolog/tests/expected_clpq2_int64    |   109 +
 interfaces/Prolog/tests/expected_clpq2_int64_a  |   109 +
 interfaces/Prolog/tests/expected_clpq2_int8     |   101 +
 interfaces/Prolog/tests/expected_clpq2_int8_a   |   101 +
 interfaces/Prolog/tests/expected_clpq2_mpz      |   109 +
 interfaces/Prolog/tests/expected_clpq2_mpz_a    |   109 +
 interfaces/Prolog/tests/expected_clpq_int16     |    35 +
 interfaces/Prolog/tests/expected_clpq_int16_a   |    35 +
 interfaces/Prolog/tests/expected_clpq_int32     |    35 +
 interfaces/Prolog/tests/expected_clpq_int32_a   |    35 +
 interfaces/Prolog/tests/expected_clpq_int64     |    35 +
 interfaces/Prolog/tests/expected_clpq_int64_a   |    35 +
 interfaces/Prolog/tests/expected_clpq_int8      |    29 +
 interfaces/Prolog/tests/expected_clpq_int8_a    |    29 +
 interfaces/Prolog/tests/expected_clpq_mpz       |    35 +
 interfaces/Prolog/tests/expected_clpq_mpz_a     |    35 +
 interfaces/Prolog/tests/expected_pchk_int16     |     3 +
 interfaces/Prolog/tests/expected_pchk_int16_a   |     3 +
 interfaces/Prolog/tests/expected_pchk_int32     |     3 +
 interfaces/Prolog/tests/expected_pchk_int32_a   |     3 +
 interfaces/Prolog/tests/expected_pchk_int64     |     1 +
 interfaces/Prolog/tests/expected_pchk_int64_a   |     3 +
 interfaces/Prolog/tests/expected_pchk_int8      |     9 +
 interfaces/Prolog/tests/expected_pchk_int8_a    |     9 +
 interfaces/Prolog/tests/expected_pchk_mpz       |     1 +
 interfaces/Prolog/tests/expected_pchk_mpz_a     |     1 +
 interfaces/Prolog/tests/fib.clpq                |     6 +
 interfaces/Prolog/tests/mc91.clpq               |     6 +
 interfaces/Prolog/tests/pl_check.pl             |  3314 ++
 interfaces/Prolog/tests/schedule.clpq           |    22 +
 interfaces/Prolog/tests/script_clpq             |    18 +
 interfaces/Prolog/tests/script_clpq2            |    36 +
 interfaces/Prolog/tests/script_clpq2_int8       |    34 +
 interfaces/Prolog/tests/smm.clpq                |    31 +
 interfaces/Prolog/tests/sumto.clpq              |     4 +
 interfaces/Prolog/tests/tak.clpq                |    20 +
 interfaces/Prolog/track_allocation.hh           |   116 +
 ltmain.sh                                       |  6863 +++
 m4/Makefile.am                                  |    44 +
 m4/Makefile.in                                  |   488 +
 m4/ac_check_fpu_control.m4                      |    51 +
 m4/ac_check_gmp.m4                              |   127 +
 m4/ac_check_sicstus_prolog.m4                   |    62 +
 m4/ac_check_swi_prolog.m4                       |    79 +
 m4/ac_check_xsb_prolog.m4                       |    49 +
 m4/ac_cxx_attribute_weak.m4                     |    58 +
 m4/ac_cxx_double_binary_format.m4               |   100 +
 m4/ac_cxx_flexible_arrays.m4                    |    95 +
 m4/ac_cxx_float_binary_format.m4                |    91 +
 m4/ac_cxx_long_double_binary_format.m4          |   272 +
 m4/ac_text_md5sum.m4                            |    37 +
 m4/lib-ld.m4                                    |   110 +
 m4/lib-link.m4                                  |   553 +
 m4/lib-prefix.m4                                |   153 +
 m4/ppl.m4                                       |   280 +
 missing                                         |   359 +
 mkinstalldirs                                   |   158 +
 ppl.lsm.in                                      |    31 +
 ppl.spec.in                                     |   185 +
 src/BDS_Status.idefs.hh                         |   116 +
 src/BDS_Status.inlines.hh                       |   266 +
 src/BD_Shape.cc                                 |    96 +
 src/BD_Shape.defs.hh                            |  1342 +
 src/BD_Shape.inlines.hh                         |   711 +
 src/BD_Shape.templates.hh                       |  3774 ++
 src/BD_Shape.types.hh                           |    22 +
 src/BHRZ03_Certificate.cc                       |   332 +
 src/BHRZ03_Certificate.defs.hh                  |   117 +
 src/BHRZ03_Certificate.inlines.hh               |    62 +
 src/BHRZ03_Certificate.types.hh                 |    21 +
 src/BUGS.cc.dist                                |    24 +
 src/Bounding_Box.cc                             |   158 +
 src/Bounding_Box.defs.hh                        |   207 +
 src/Bounding_Box.inlines.hh                     |   137 +
 src/Bounding_Box.types.hh                       |    21 +
 src/COPYING.cc.dist                             |   342 +
 src/CREDITS.cc.dist                             |   224 +
 src/C_Polyhedron.cc                             |    71 +
 src/C_Polyhedron.defs.hh                        |   213 +
 src/C_Polyhedron.inlines.hh                     |   135 +
 src/C_Polyhedron.types.hh                       |    21 +
 src/Checked_Number.cc                           |    89 +
 src/Checked_Number.defs.hh                      |   913 +
 src/Checked_Number.inlines.hh                   |   820 +
 src/Checked_Number.types.hh                     |    27 +
 src/Coefficient.cc                              |    25 +
 src/Coefficient.defs.hh                         |    47 +
 src/Coefficient.inlines.hh                      |    42 +
 src/Coefficient.types.hh                        |    99 +
 src/Coefficient_traits_template.hh              |    27 +
 src/Congruence.cc                               |   251 +
 src/Congruence.defs.hh                          |   474 +
 src/Congruence.inlines.hh                       |   233 +
 src/Congruence.types.hh                         |    21 +
 src/Congruence_System.cc                        |   550 +
 src/Congruence_System.defs.hh                   |   480 +
 src/Congruence_System.inlines.hh                |   211 +
 src/Congruence_System.types.hh                  |    21 +
 src/Constraint.cc                               |   268 +
 src/Constraint.defs.hh                          |   489 +
 src/Constraint.inlines.hh                       |   343 +
 src/Constraint.types.hh                         |    21 +
 src/Constraint_System.cc                        |   594 +
 src/Constraint_System.defs.hh                   |   394 +
 src/Constraint_System.inlines.hh                |   220 +
 src/Constraint_System.types.hh                  |    21 +
 src/DB_Matrix.defs.hh                           |   324 +
 src/DB_Matrix.inlines.hh                        |   679 +
 src/DB_Matrix.types.hh                          |    22 +
 src/DB_Row.defs.hh                              |   431 +
 src/DB_Row.inlines.hh                           |   556 +
 src/DB_Row.types.hh                             |    25 +
 src/Determinate.defs.hh                         |   316 +
 src/Determinate.inlines.hh                      |   291 +
 src/Determinate.types.hh                        |    22 +
 src/Float.cc                                    |    42 +
 src/Float.defs.hh                               |   249 +
 src/Float.inlines.hh                            |   388 +
 src/GMP_Integer.defs.hh                         |   136 +
 src/GMP_Integer.inlines.hh                      |   112 +
 src/GMP_Integer.types.hh                        |    43 +
 src/Generator.cc                                |   381 +
 src/Generator.defs.hh                           |   508 +
 src/Generator.inlines.hh                        |   225 +
 src/Generator.types.hh                          |    21 +
 src/Generator_System.cc                         |  1032 +
 src/Generator_System.defs.hh                    |   506 +
 src/Generator_System.inlines.hh                 |   212 +
 src/Generator_System.types.hh                   |    21 +
 src/Grid.defs.hh                                |  2485 ++
 src/Grid.inlines.hh                             |   264 +
 src/Grid.templates.hh                           |   569 +
 src/Grid.types.hh                               |    21 +
 src/Grid_Certificate.cc                         |   114 +
 src/Grid_Certificate.defs.hh                    |   103 +
 src/Grid_Certificate.inlines.hh                 |    60 +
 src/Grid_Certificate.types.hh                   |    21 +
 src/Grid_Generator.cc                           |   339 +
 src/Grid_Generator.defs.hh                      |   493 +
 src/Grid_Generator.inlines.hh                   |   218 +
 src/Grid_Generator.types.hh                     |    21 +
 src/Grid_Generator_System.cc                    |   429 +
 src/Grid_Generator_System.defs.hh               |   497 +
 src/Grid_Generator_System.inlines.hh            |   268 +
 src/Grid_Generator_System.types.hh              |    21 +
 src/Grid_Status.cc                              |   245 +
 src/Grid_Status.idefs.hh                        |   167 +
 src/Grid_Status.inlines.hh                      |   216 +
 src/Grid_chdims.cc                              |   444 +
 src/Grid_conversion.cc                          |   559 +
 src/Grid_nonpublic.cc                           |   612 +
 src/Grid_public.cc                              |  2218 +
 src/Grid_simplify.cc                            |   660 +
 src/Grid_widenings.cc                           |   226 +
 src/H79_Certificate.cc                          |   119 +
 src/H79_Certificate.defs.hh                     |    97 +
 src/H79_Certificate.inlines.hh                  |    70 +
 src/H79_Certificate.types.hh                    |    21 +
 src/Init.cc                                     |    71 +
 src/Init.defs.hh                                |    57 +
 src/Init.types.hh                               |    21 +
 src/Interval.cc                                 |    55 +
 src/Interval.defs.hh                            |   204 +
 src/Interval.inlines.hh                         |   127 +
 src/Interval.types.hh                           |    24 +
 src/LP_Problem.cc                               |  1035 +
 src/LP_Problem.defs.hh                          |   394 +
 src/LP_Problem.inlines.hh                       |   267 +
 src/LP_Problem.types.hh                         |    32 +
 src/Limits.hh                                   |    95 +
 src/Linear_Expression.cc                        |   289 +
 src/Linear_Expression.defs.hh                   |   444 +
 src/Linear_Expression.inlines.hh                |   212 +
 src/Linear_Expression.types.hh                  |    21 +
 src/Linear_Row.cc                               |   209 +
 src/Linear_Row.defs.hh                          |   458 +
 src/Linear_Row.inlines.hh                       |   290 +
 src/Linear_Row.types.hh                         |    21 +
 src/Linear_System.cc                            |   916 +
 src/Linear_System.defs.hh                       |   517 +
 src/Linear_System.inlines.hh                    |   393 +
 src/Linear_System.types.hh                      |    21 +
 src/Makefile.am                                 |   413 +
 src/Makefile.in                                 |  1167 +
 src/Matrix.cc                                   |   409 +
 src/Matrix.defs.hh                              |   356 +
 src/Matrix.inlines.hh                           |   213 +
 src/Matrix.types.hh                             |    21 +
 src/NNC_Polyhedron.cc                           |    66 +
 src/NNC_Polyhedron.defs.hh                      |   187 +
 src/NNC_Polyhedron.inlines.hh                   |   134 +
 src/NNC_Polyhedron.types.hh                     |    21 +
 src/Numeric_Format.defs.hh                      |    37 +
 src/Ph_Status.cc                                |   245 +
 src/Ph_Status.idefs.hh                          |   182 +
 src/Ph_Status.inlines.hh                        |   216 +
 src/Poly_Con_Relation.cc                        |    77 +
 src/Poly_Con_Relation.defs.hh                   |   170 +
 src/Poly_Con_Relation.inlines.hh                |    99 +
 src/Poly_Con_Relation.types.hh                  |    21 +
 src/Poly_Gen_Relation.cc                        |    65 +
 src/Poly_Gen_Relation.defs.hh                   |   143 +
 src/Poly_Gen_Relation.inlines.hh                |    84 +
 src/Poly_Gen_Relation.types.hh                  |    21 +
 src/Polyhedra_Powerset.cc                       |   143 +
 src/Polyhedra_Powerset.defs.hh                  |   553 +
 src/Polyhedra_Powerset.inlines.hh               |   268 +
 src/Polyhedra_Powerset.templates.hh             |   684 +
 src/Polyhedra_Powerset.types.hh                 |    22 +
 src/Polyhedron.defs.hh                          |  2475 ++
 src/Polyhedron.inlines.hh                       |   344 +
 src/Polyhedron.templates.hh                     |   512 +
 src/Polyhedron.types.hh                         |    21 +
 src/Polyhedron_chdims.cc                        |   637 +
 src/Polyhedron_nonpublic.cc                     |  1568 +
 src/Polyhedron_public.cc                        |  2965 ++
 src/Polyhedron_widenings.cc                     |   862 +
 src/Powerset.defs.hh                            |   620 +
 src/Powerset.inlines.hh                         |   399 +
 src/Powerset.templates.hh                       |   302 +
 src/Powerset.types.hh                           |    22 +
 src/Ptr_Iterator.defs.hh                        |   171 +
 src/Ptr_Iterator.inlines.hh                     |   188 +
 src/Ptr_Iterator.types.hh                       |    26 +
 src/Result.defs.hh                              |   118 +
 src/Result.inlines.hh                           |    60 +
 src/Rounding_Dir.defs.hh                        |    70 +
 src/Rounding_Dir.inlines.hh                     |    48 +
 src/Row.cc                                      |   282 +
 src/Row.defs.hh                                 |   496 +
 src/Row.inlines.hh                              |   404 +
 src/Row.types.hh                                |    22 +
 src/Saturation_Matrix.cc                        |   227 +
 src/Saturation_Matrix.defs.hh                   |   177 +
 src/Saturation_Matrix.inlines.hh                |   145 +
 src/Saturation_Matrix.types.hh                  |    21 +
 src/Saturation_Row.cc                           |   347 +
 src/Saturation_Row.defs.hh                      |   239 +
 src/Saturation_Row.inlines.hh                   |   136 +
 src/Saturation_Row.types.hh                     |    21 +
 src/Scalar_Products.cc                          |   121 +
 src/Scalar_Products.defs.hh                     |   182 +
 src/Scalar_Products.inlines.hh                  |   152 +
 src/Scalar_Products.types.hh                    |    23 +
 src/Topology.hh                                 |    28 +
 src/Variable.cc                                 |    52 +
 src/Variable.defs.hh                            |   156 +
 src/Variable.inlines.hh                         |    88 +
 src/Variable.types.hh                           |    21 +
 src/Widening_Function.defs.hh                   |   126 +
 src/Widening_Function.inlines.hh                |    74 +
 src/Widening_Function.types.hh                  |    25 +
 src/algorithms.hh                               |    71 +
 src/checked.cc                                  |   375 +
 src/checked.defs.hh                             |   392 +
 src/checked.inlines.hh                          |   277 +
 src/checked_ext.inlines.hh                      |   763 +
 src/checked_float.inlines.hh                    |   940 +
 src/checked_int.inlines.hh                      |  1537 +
 src/checked_mpq.inlines.hh                      |   413 +
 src/checked_mpz.inlines.hh                      |   529 +
 src/checked_numeric_limits.hh                   |   161 +
 src/compiler.hh                                 |    38 +
 src/conversion.cc                               |   856 +
 src/fpu-c99.inlines.hh                          |    81 +
 src/fpu-ia32.inlines.hh                         |   134 +
 src/fpu-none.inlines.hh                         |    69 +
 src/fpu-sparc.inlines.hh                        |    73 +
 src/fpu.defs.hh                                 |    85 +
 src/fpu.types.hh                                |    26 +
 src/globals.cc                                  |    33 +
 src/globals.defs.hh                             |   290 +
 src/globals.inlines.hh                          |    80 +
 src/globals.types.hh                            |    73 +
 src/initializer.hh                              |    34 +
 src/max_space_dimension.hh                      |    48 +
 src/minimize.cc                                 |   401 +
 src/mp_numeric_limits.hh                        |   157 +
 src/namespaces.hh                               |   100 +
 src/ppl-config.cc                               |   720 +
 src/ppl-config.cc.in                            |   720 +
 src/ppl.hh.dist                                 | 41175 ++++++++++++++++++
 src/ppl_header.hh                               |    51 +
 src/simplify.cc                                 |   307 +
 src/swapping_sort.icc                           |   141 +
 src/version.cc                                  |    83 +
 src/version.hh.in                               |    92 +
 tests/BBox.cc                                   |   188 +
 tests/BBox.hh                                   |   129 +
 tests/BD_Shape/Makefile.am                      |   202 +
 tests/BD_Shape/Makefile.in                      |  1217 +
 tests/BD_Shape/addconstraints1.cc               |   231 +
 tests/BD_Shape/addspacedims1.cc                 |   277 +
 tests/BD_Shape/affinedimension1.cc              |   236 +
 tests/BD_Shape/affineimage1.cc                  |   467 +
 tests/BD_Shape/affineimage2.cc                  |   351 +
 tests/BD_Shape/affinepreimage1.cc               |   181 +
 tests/BD_Shape/affinepreimage2.cc               |   253 +
 tests/BD_Shape/ascii_dump_load1.cc              |   246 +
 tests/BD_Shape/bdsdifference1.cc                |   278 +
 tests/BD_Shape/bdshull1.cc                      |   220 +
 tests/BD_Shape/bgp99extrapolation1.cc           |    93 +
 tests/BD_Shape/bhmz05widening1.cc               |   343 +
 tests/BD_Shape/bhz03widening1.cc                |    76 +
 tests/BD_Shape/cc76extrapolation1.cc            |   488 +
 tests/BD_Shape/cc76narrowing1.cc                |   216 +
 tests/BD_Shape/closure1.cc                      |   379 +
 tests/BD_Shape/concatenate1.cc                  |   203 +
 tests/BD_Shape/constraints1.cc                  |   124 +
 tests/BD_Shape/contains1.cc                     |   124 +
 tests/BD_Shape/empty1.cc                        |   206 +
 tests/BD_Shape/equality1.cc                     |   131 +
 tests/BD_Shape/fromgensys1.cc                   |   163 +
 tests/BD_Shape/generalizedaffineimage1.cc       |   592 +
 tests/BD_Shape/generalizedaffineimage2.cc       |   516 +
 tests/BD_Shape/generalizedaffinepreimage1.cc    |   477 +
 tests/BD_Shape/generalizedaffinepreimage2.cc    |   118 +
 tests/BD_Shape/geomcovers1.cc                   |    69 +
 tests/BD_Shape/h79widening1.cc                  |    62 +
 tests/BD_Shape/intersection1.cc                 |   324 +
 tests/BD_Shape/limitedbhmz05extrapolation1.cc   |   526 +
 tests/BD_Shape/limitedcc76extrapolation1.cc     |   537 +
 tests/BD_Shape/limitedh79extrapolation1.cc      |    70 +
 tests/BD_Shape/mapspacedims1.cc                 |   291 +
 tests/BD_Shape/maxspacedim.cc                   |    92 +
 tests/BD_Shape/minconstraints1.cc               |    70 +
 tests/BD_Shape/relations1.cc                    |   470 +
 tests/BD_Shape/relations2.cc                    |   449 +
 tests/BD_Shape/relations3.cc                    |   108 +
 tests/BD_Shape/removespacedims1.cc              |   311 +
 tests/BD_Shape/run_tests                        |    30 +
 tests/BD_Shape/timeelapse1.cc                   |   209 +
 tests/BD_Shape/universe1.cc                     |    57 +
 tests/BD_Shape/writebdshape1.cc                 |    78 +
 tests/Grid/Makefile.am                          |   261 +
 tests/Grid/Makefile.in                          |  1494 +
 tests/Grid/addcongruence1.cc                    |   135 +
 tests/Grid/addcongruences1.cc                   |   409 +
 tests/Grid/addconstraint1.cc                    |   244 +
 tests/Grid/addconstraints1.cc                   |   516 +
 tests/Grid/addgenerator1.cc                     |   366 +
 tests/Grid/addgenerators1.cc                    |   281 +
 tests/Grid/addspacedims1.cc                     |   546 +
 tests/Grid/affinedim1.cc                        |   321 +
 tests/Grid/affineimage1.cc                      |   402 +
 tests/Grid/affineimage2.cc                      |   317 +
 tests/Grid/affinepreimage1.cc                   |   443 +
 tests/Grid/affinepreimage2.cc                   |   372 +
 tests/Grid/asciidumpload1.cc                    |   178 +
 tests/Grid/bhz03widening1.cc                    |   111 +
 tests/Grid/bounded1.cc                          |   397 +
 tests/Grid/boundingbox1.cc                      |   295 +
 tests/Grid/boundingbox2.cc                      |   520 +
 tests/Grid/bounds1.cc                           |   441 +
 tests/Grid/certificate1.cc                      |   228 +
 tests/Grid/concatenate1.cc                      |   341 +
 tests/Grid/congruence1.cc                       |   377 +
 tests/Grid/congruences1.cc                      |   213 +
 tests/Grid/congruencesystem1.cc                 |   419 +
 tests/Grid/contains1.cc                         |   213 +
 tests/Grid/copyconstruct1.cc                    |    70 +
 tests/Grid/coveringbox1.cc                      |   305 +
 tests/Grid/coveringbox2.cc                      |   879 +
 tests/Grid/discrete1.cc                         |   342 +
 tests/Grid/disjoint1.cc                         |   234 +
 tests/Grid/equals1.cc                           |   253 +
 tests/Grid/expandspacedim1.cc                   |   238 +
 tests/Grid/foldspacedims1.cc                    |   400 +
 tests/Grid/generalizedaffineimage1.cc           |   555 +
 tests/Grid/generalizedaffineimage2.cc           |   552 +
 tests/Grid/generalizedaffinepreimage1.cc        |   514 +
 tests/Grid/generalizedaffinepreimage2.cc        |   359 +
 tests/Grid/generator1.cc                        |   209 +
 tests/Grid/generators1.cc                       |   309 +
 tests/Grid/grid1.cc                             |   586 +
 tests/Grid/grid2.cc                             |   558 +
 tests/Grid/grid3.cc                             |   488 +
 tests/Grid/griddifference1.cc                   |   349 +
 tests/Grid/intersection1.cc                     |   500 +
 tests/Grid/isempty1.cc                          |   293 +
 tests/Grid/isuniverse1.cc                       |   321 +
 tests/Grid/join1.cc                             |   376 +
 tests/Grid/join2.cc                             |   325 +
 tests/Grid/limitedextrapolation1.cc             |   496 +
 tests/Grid/mapspacedims1.cc                     |   313 +
 tests/Grid/maxmin1.cc                           |   494 +
 tests/Grid/membytes1.cc                         |   284 +
 tests/Grid/mincongruences1.cc                   |   214 +
 tests/Grid/mingenerators1.cc                    |   240 +
 tests/Grid/outputoperator1.cc                   |   139 +
 tests/Grid/relations1.cc                        |   180 +
 tests/Grid/relations2.cc                        |   376 +
 tests/Grid/removespacedims1.cc                  |   484 +
 tests/Grid/timeelapse1.cc                       |   340 +
 tests/Grid/topclosed1.cc                        |   336 +
 tests/Grid/topclosure1.cc                       |    93 +
 tests/Grid/widening1.cc                         |   616 +
 tests/Grid/writecongruencesystem.cc             |    61 +
 tests/Makefile.am                               |    50 +
 tests/Makefile.in                               |   693 +
 tests/Partial_Function.cc                       |    73 +
 tests/Partial_Function.defs.hh                  |    53 +
 tests/Partial_Function.inlines.hh               |    40 +
 tests/Partial_Function.types.hh                 |    21 +
 tests/Polyhedron/Makefile.am                    |   663 +
 tests/Polyhedron/Makefile.in                    |  4125 ++
 tests/Polyhedron/README                         |   115 +
 tests/Polyhedron/addcongruence1.cc              |   129 +
 tests/Polyhedron/addcongruences1.cc             |   166 +
 tests/Polyhedron/addconstraint1.cc              |   106 +
 tests/Polyhedron/addconstraints1.cc             |   363 +
 tests/Polyhedron/addconstraints2.cc             |    93 +
 tests/Polyhedron/addgenerator1.cc               |   101 +
 tests/Polyhedron/addgenerator2.cc               |   129 +
 tests/Polyhedron/addgenerators1.cc              |   336 +
 tests/Polyhedron/addgenerators2.cc              |   137 +
 tests/Polyhedron/addspacedims1.cc               |   201 +
 tests/Polyhedron/addspacedims2.cc               |   248 +
 tests/Polyhedron/affineimage1.cc                |   265 +
 tests/Polyhedron/affineimage2.cc                |    74 +
 tests/Polyhedron/affinepreimage1.cc             |   437 +
 tests/Polyhedron/affinetrans.cc                 |    81 +
 tests/Polyhedron/append1.cc                     |   108 +
 tests/Polyhedron/append2.cc                     |   129 +
 tests/Polyhedron/ascii_dump_load1.cc            |   601 +
 tests/Polyhedron/ascii_dump_load2.cc            |   138 +
 tests/Polyhedron/ascii_dump_load3.cc            |   433 +
 tests/Polyhedron/bgp99extrapolation1.cc         |   269 +
 tests/Polyhedron/bhrz03widening1.cc             |   754 +
 tests/Polyhedron/bhrz03widening2.cc             |   261 +
 tests/Polyhedron/bhrz03widening3.cc             |   607 +
 tests/Polyhedron/bhz03widening1.cc              |   723 +
 tests/Polyhedron/bounded1.cc                    |   106 +
 tests/Polyhedron/boundedaffineimage1.cc         |   120 +
 tests/Polyhedron/boundedaffinepreimage1.cc      |   124 +
 tests/Polyhedron/boundedbhrz03extrapolation1.cc |   111 +
 tests/Polyhedron/boundedh79extrapolation1.cc    |    74 +
 tests/Polyhedron/boundingbox1.cc                |   594 +
 tests/Polyhedron/boundingbox2.cc                |    50 +
 tests/Polyhedron/boundingbox3.cc                |   218 +
 tests/Polyhedron/bounds1.cc                     |    64 +
 tests/Polyhedron/bug2.cc                        |    62 +
 tests/Polyhedron/cnncconversion1.cc             |   103 +
 tests/Polyhedron/concatenate1.cc                |   283 +
 tests/Polyhedron/congruences1.cc                |    53 +
 tests/Polyhedron/constraints1.cc                |   165 +
 tests/Polyhedron/contains1.cc                   |   114 +
 tests/Polyhedron/contains2.cc                   |   176 +
 tests/Polyhedron/disjoint1.cc                   |   145 +
 tests/Polyhedron/disjoint2.cc                   |   132 +
 tests/Polyhedron/dualhypercubes.cc              |   290 +
 tests/Polyhedron/empty1.cc                      |    50 +
 tests/Polyhedron/equals1.cc                     |    61 +
 tests/Polyhedron/exceptions1.cc                 |  1375 +
 tests/Polyhedron/exceptions2.cc                 |  1098 +
 tests/Polyhedron/exceptions3.cc                 |   242 +
 tests/Polyhedron/expandspacedim1.cc             |   268 +
 tests/Polyhedron/expandspacedim2.cc             |   102 +
 tests/Polyhedron/foldspacedims1.cc              |   336 +
 tests/Polyhedron/foldspacedims2.cc              |   230 +
 tests/Polyhedron/generalizedaffineimage1.cc     |   268 +
 tests/Polyhedron/generalizedaffineimage2.cc     |   559 +
 tests/Polyhedron/generalizedaffinepreimage1.cc  |   123 +
 tests/Polyhedron/generalizedaffinepreimage2.cc  |    63 +
 tests/Polyhedron/generators1.cc                 |   234 +
 tests/Polyhedron/geomcovers1.cc                 |    60 +
 tests/Polyhedron/h79widening1.cc                |   254 +
 tests/Polyhedron/h79widening2.cc                |    63 +
 tests/Polyhedron/intersection1.cc               |   516 +
 tests/Polyhedron/limitedbhrz03extrapolation1.cc |    66 +
 tests/Polyhedron/limitedh79extrapolation1.cc    |   273 +
 tests/Polyhedron/linearpartition1.cc            |   298 +
 tests/Polyhedron/linearsystem1.cc               |   105 +
 tests/Polyhedron/linexpression1.cc              |    56 +
 tests/Polyhedron/lpproblem1.cc                  |   764 +
 tests/Polyhedron/mapspacedims1.cc               |   443 +
 tests/Polyhedron/matrix1.cc                     |    80 +
 tests/Polyhedron/max_min1.cc                    |   138 +
 tests/Polyhedron/maxspacedim1.cc                |    62 +
 tests/Polyhedron/mc91.cc                        |   117 +
 tests/Polyhedron/membytes1.cc                   |   218 +
 tests/Polyhedron/membytes2.cc                   |    92 +
 tests/Polyhedron/memory1.cc                     |   195 +
 tests/Polyhedron/memory2.cc                     |   222 +
 tests/Polyhedron/minconstraints1.cc             |    77 +
 tests/Polyhedron/minconstraints2.cc             |    70 +
 tests/Polyhedron/mingenerators1.cc              |    85 +
 tests/Polyhedron/mingenerators2.cc              |    48 +
 tests/Polyhedron/nncminimize1.cc                |   378 +
 tests/Polyhedron/nncminimize2.cc                |    80 +
 tests/Polyhedron/numberinput1.cc                |   341 +
 tests/Polyhedron/onepoint.cc                    |    56 +
 tests/Polyhedron/permute.cc                     |   221 +
 tests/Polyhedron/polydifference1.cc             |   276 +
 tests/Polyhedron/polydifference2.cc             |   150 +
 tests/Polyhedron/polyhull1.cc                   |   404 +
 tests/Polyhedron/polyhull2.cc                   |    58 +
 tests/Polyhedron/polypowerset1.cc               |   382 +
 tests/Polyhedron/powerset1.cc                   |   249 +
 tests/Polyhedron/randphull1.cc                  |    68 +
 tests/Polyhedron/randphull2.cc                  |   131 +
 tests/Polyhedron/relations1.cc                  |   484 +
 tests/Polyhedron/relations2.cc                  |   128 +
 tests/Polyhedron/relations3.cc                  |   294 +
 tests/Polyhedron/removespacedims1.cc            |   298 +
 tests/Polyhedron/removespacedims2.cc            |    66 +
 tests/Polyhedron/smm1.cc                        |   149 +
 tests/Polyhedron/timeelapse1.cc                 |   250 +
 tests/Polyhedron/timeelapse2.cc                 |   132 +
 tests/Polyhedron/topclosed1.cc                  |    95 +
 tests/Polyhedron/topclosure1.cc                 |   160 +
 tests/Polyhedron/universe1.cc                   |   164 +
 tests/Polyhedron/universe2.cc                   |    79 +
 tests/Polyhedron/watchdog1.cc                   |   131 +
 tests/Polyhedron/writeconsys1.cc                |    58 +
 tests/Polyhedron/writegensys1.cc                |    97 +
 tests/Polyhedron/writepolyhedron1.cc            |    77 +
 tests/Polyhedron/writepolyhedron2.cc            |    71 +
 tests/Polyhedron/writerelation1.cc              |    95 +
 tests/Polyhedron/writevariable1.cc              |   103 +
 tests/Random_Number_Generator.defs.hh           |    46 +
 tests/Random_Number_Generator.inlines.hh        |    90 +
 tests/Random_Number_Generator.types.hh          |    21 +
 tests/files.cc                                  |    49 +
 tests/files.hh                                  |    35 +
 tests/ppl_test.cc                               |   137 +
 tests/ppl_test.hh                               |   390 +
 tests/print.cc                                  |   158 +
 tests/print.hh                                  |   186 +
 utils/Makefile.am                               |    58 +
 utils/Makefile.in                               |   592 +
 utils/build_header.in                           |   102 +
 utils/text2cxxarray.in                          |    61 +
 utils/timings.cc                                |    88 +
 utils/timings.hh                                |    31 +
 924 files changed, 437068 insertions(+)

diff --git a/BUGS b/BUGS
new file mode 100644
index 0000000..794468e
--- /dev/null
+++ b/BUGS
@@ -0,0 +1,22 @@
+
+The PPL developers encourage you to report any bugs you find to
+ppl-devel at cs.unipr.it.  Here `bug' should be interpreted in its
+broadest sense: outright software errors, misfeatures, bad interfaces,
+missing or unclear documentation... whatever is a subject for possible
+improvement.
+
+As far as software bugs are concerned, the best reports are those that
+are reproducible.  Including (or pointing us to) code that exhibits
+the reported misbehavior is the best thing you can do to help us fix
+the library.  Of course, this is not always possible and we will
+welcome any kind of bug report.  Anyway, you may be interested to read
+http://www.chiark.greenend.org.uk/~sgtatham/bugs.html on how to report
+bugs effectively.
+
+
+KNOWN BUGS
+==========
+
+All known bugs were resolved before the release.  It is likely that
+there are still bugs in the released version.  Any bugs found after
+the release will be listed at http://www.cs.unipr.it/ppl/Bugs/ .
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..3912109
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, 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 or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+

+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+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 give any other recipients of the Program a copy of this License
+along with the Program.
+
+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 Program or any portion
+of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+

+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+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 Program, 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 Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) 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; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, 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 executable.  However, as a
+special exception, the source code 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.
+
+If distribution of executable or 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 counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+

+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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.
+
+  5. 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 Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program 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 to
+this License.
+
+  7. 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 Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program 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 Program.
+
+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.
+

+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program 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.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the 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 Program
+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 Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, 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
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), 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 Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  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.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/CREDITS b/CREDITS
new file mode 100644
index 0000000..8bc4e84
--- /dev/null
+++ b/CREDITS
@@ -0,0 +1,222 @@
+
+Authors
+=======
+
+The Parma Polyhedra Library and its documentation is being designed,
+written, debugged and improved by the following people:
+
+
+Current core development team:
+------------------------------
+
+  Roberto Bagnara       [1] (University of Parma)
+  Patricia M. Hill      [2] (University of Leeds)
+  Enea Zaffanella       [3] (University of Parma)
+
+
+Former members of the core development team:
+--------------------------------------------
+
+  Elisa Ricci           (former student of the University of Parma) has
+                        been a major contributor to the development of
+                        the PPL, up until December 2002.
+
+
+Current contributors:
+---------------------
+
+  Abramo Bagnara        (Opera Unica) rewrote and generalized the
+                        support for checked coefficients.  He also
+                        wrote the support for extended numbers and is
+                        currently writing a new implementation of
+                        intervals.  He also helps on other design and
+                        implementation issues.
+
+  Andrea Cimino         (University of Parma) wrote the initial version
+                        of our primal simplex solver.  He is still
+                        working on its refinement and optimization.
+
+  Katy Dobson           [4] (University of Leeds) is working on the
+                        formalization and definition of algorithms
+                        for rational grids.
+
+  Elena Mazzi           (University of Parma) has been working on our
+                        first implementation of bounded differences
+                        and octagons.  She also participated in the
+                        theoretical and practical work concerning
+                        widening operators for weakly relational
+                        domains.  She is still working on this.
+
+  David Merchat         [5] (University of Parma) is helping us with
+                        the generation of the library's documentation
+                        using Doxygen.
+
+  Matthew Mundell       [6] (University of Leeds) is working on the
+                        implementation of rational grids.  He also
+                        helps on other implementation issues.
+
+  Andrea Pescetti       (University of Parma) is helping with the
+                        library's documentation.  Andrea was also one
+                        of the four students with which the PPL
+                        project started.
+
+  Barbara Quartieri     (University of Parma) is working on the
+                        implementation of bounded differences
+                        and octagons.
+
+  Alessandro Zaccagnini [7] (University of Parma) has helped with
+                        the efficient implementation of GCD and LCM
+                        for checked numbers.  He is now working on the
+                        definitions of interval arithmetic operations.
+                        Alessandro is always a very valuable source of
+                        mathematical advice.
+
+
+Past contributors:
+------------------
+
+  Irene Bacchi          (University of Parma) worked on a development
+                        branch where she implemented several variants of
+                        algorithms, checking whether or not the set-union
+                        of two polyhedra is the same as their poly-hull.
+
+  Danilo Bonardi        (University of Parma) worked on a development
+                        branch where he experimented with the use of
+                        metaprogramming techniques based on
+                        "expression templates".  The objective of this
+                        work was to check the effectiveness of these
+                        techniques for moving computations from
+                        run-time to compile-time.
+
+  Sara Bonini           (former student of the University of Parma) is
+                        one of the four students with which the PPL
+                        project started.
+
+  Giordano Fracasso     (University of Parma) wrote the initial version
+                        of the support for native and checked integer
+                        coefficients.
+
+  Maximiliano Marchesi  (University of Parma) helped to improve the
+                        documentation for bounded differences.
+
+  Angela Stazzone       (former student of the University of Parma)
+                        worked on the library's documentation.
+
+
+  Fabio Trabucchi       (University of Parma) worked on a development
+                        branch where he added serializers for all the
+                        objects of the PPL.  Support for serialization
+                        based on Fabio's work, will be available in a
+                        future release of the library.
+
+  Claudio Trento        (University of Pisa) worked on an experimental
+                        OCaml interface for the PPL.
+
+  Tatiana Zolo          (former student of the University of Parma) is
+                        one of the four students with which the PPL
+                        project started.
+
+
+Thanks!
+=======
+
+The following people have given important help to the project:
+
+  Lucia Alessandrini    (University of Parma) provided 4 hour-long
+                        lectures on convex polyhedra for the Italian
+                        authors.  This was crucial for us to acquire
+                        and/or refresh the notions needed for
+                        developing the PPL library.
+
+  Marco Comini          [8] (University of Udine) allowed us to use his
+                        Mac OS X machine to work on portability to
+                        that platform.
+
+  Bruno Haible          [9] (ILOG) made it possible (by writing the
+                        AC_LIB_LINKFLAGS macro and explaining how
+                        to use it) to allow the use of versions of the
+                        GMP library installed into nonstandard places.
+
+  Bertrand Jeannet      [10] (IRISA) wrote the New Polka library [11]
+                        and made it available.
+
+  Herve' Le Verge       (r.i.p.) wrote and published an implementation
+                        [12] of the Chernikova's algorithm [13] that
+                        has set the stage for subsequent
+                        implementation work, including our own.
+
+  Francesco Logozzo     [14] (Ecole Polytechnique) helped us straighten
+                        out some portability issues on Cygwin.
+
+  Costantino Medori     [15] (University of Parma) helped us on the
+                        mathematical aspects of the development.
+
+  Fred Mesnard          [16] (University of La Reunion), the main author
+                        of cTI [17], has worked with us at one of the
+                        first applications of the PPL: the "cTI"
+                        data-flow analyzer, which performs a linear
+                        size relation analysis using a domain of
+                        convex polyhedra.  The China data-flow
+                        analyzer [18] uses the Parma Polyhedra Library
+                        to perform the same analysis.  We have been
+                        running China against an old version of cTI
+                        that did not use the PPL, using them to
+                        analyze the same Prolog programs.  Since that
+                        systems did not share a single line of code,
+                        this gave us excellent opportunities for our
+                        initial testing and debugging work.
+
+
+This work has been partly supported by the following projects and
+organizations:
+
+  1. University of Parma's FIL scientific research project (ex 60%)
+     ``Pure and Applied Mathematics'';
+
+  2. MURST project ``Automatic Program Certification by Abstract
+     Interpretation'' [19];
+
+  3. MURST project ``Abstract Interpretation, Type Systems and
+     Control-Flow Analysis''.
+
+  4. MURST project ``Automatic Aggregate- and Number-Reasoning for
+     Computing: from Decision Algorithms to Constraint Programming
+     with Multisets, Sets, and Maps'' [20].
+
+  5. MURST project ``Constraint Based Verification of Reactive
+     Systems'' [21].
+
+  6. MURST project ``AIDA - Abstract Interpretation: Design and
+     Applications'' [22].
+
+  7. Royal Society Joint project 2004/R1-EU (UK-Italy)
+     ``Automatic Detection of Unstable Numerical Computations''.
+
+  8. EPSRC (UK) project EP/C520726/1
+     ``Numerical Domains for Software Analysis'' [23].
+
+--------
+
+ [1] http://www.cs.unipr.it/~bagnara/
+ [2] http://www.comp.leeds.ac.uk/hill/
+ [3] http://www.cs.unipr.it/~zaffanella/
+ [4] http://www.comp.leeds.ac.uk/katyd/
+ [5] http://www.cs.unipr.it/~merchat/
+ [6] http://www.mundell.ukfsn.org/
+ [7] http://www.math.unipr.it/~zaccagni/
+ [8] http://www.dimi.uniud.it/~comini/
+ [9] http://www.haible.de/bruno/
+[10] http://www.irisa.fr/prive/Bertrand.Jeannet/
+[11] http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html
+[12] http://www.cs.unipr.it/ppl/Documentation/chernikova.c
+[13] http://www.cs.unipr.it/ppl/Documentation/bibliography#LeVerge92
+[14] http://www.enseignement.polytechnique.fr/profs/informatique/Francesco.Logozzo/
+[15] http://www.math.unipr.it/~medori/
+[16] http://www.univ-reunion.fr/~fred/
+[17] http://www.cs.unipr.it/cTI/
+[18] http://www.cs.unipr.it/China/
+[19] http://theory.sci.univr.it/p40/
+[20] http://www.cs.unipr.it/Projects/COFIN01
+[21] http://www.disi.unige.it/person/DelzannoG/cover/
+[22] http://www.cs.unipr.it/Projects/AIDA/
+[23] http://www.comp.leeds.ac.uk/hill/linda/
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..8d39dd8
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,48803 @@
+2006-03-12  Release Manager
+
+	* PPL 0.9 Released.
+
+2006-03-11 Saturday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.8): Updated.
+
+2006-03-10 Friday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/README (1.2): Incomplete sentence removed.
+
+2006-03-10 Friday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/changelog (1.4): Updated for PPL 0.9.
+
+2006-03-10 Friday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.25), Watchdog/ChangeLog (1.15): Updated.
+
+2006-03-10 Friday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: README.doc (1.10), devref.tex (1.20), user.tex (1.21):
+	  Followed the advice of the people at FSF: it should now be
+	  overwhelmingly clear that the documentation is distributed under
+	  the terms of the GNU Free Documentation License, Version 1.2 or
+	  any later version published by the Free Software Foundation.
+
+2006-03-10 Friday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.48), Watchdog/README (1.14): Updated.
+
+2006-03-10 Friday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.47): Formatting improved.
+
+2006-03-10 Friday 10:47  Andrea Cimino
+
+	* TODO (simplex.3): Added one item.
+
+2006-03-10 Friday 10:40  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.36): Fixed a comment, due to the
+	  change in the last commit.
+
+2006-03-10 Friday 10:36  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.35): Don't add artificial variables
+	  also if the inhomogeneous term of an inequality is a zero. In
+	  many problems this decreases the number of iterations involved,
+	  specially in the satisfiability check.
+
+2006-03-10 Friday 10:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (1.6): Added a FIXME comment.
+
+2006-03-10 Friday 09:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (1.5): Fixed a bug in Grid simplify when
+	  there are two all zero (trivially true) equalities.
+
+2006-03-09 Thursday 11:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/linearsystem1.cc (1.6): Added a workaround to
+	  avoid trivial (but intermittent) positive overflows when
+	  populating a Linear_Row with randomly generated values and using
+	  a bounded integer datatype.
+
+2006-03-09 Thursday 10:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Random_Number_Generator.defs.hh (1.3),
+	  Random_Number_Generator.inlines.hh (1.8): Allow for the
+	  specification of a fixed seed.
+
+2006-03-09 Thursday 08:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.cc (1.4), Grid_Generator_System.inlines.hh
+	  (1.6): Comments concerning the extra parameter divisor column
+	  improved.
+
+2006-03-08 Wednesday 23:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.inlines.hh (1.5): Bug fixed for
+	  clear().
+
+2006-03-08 Wednesday 21:43  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[34,25]): Major
+	  improvement: check if a slack variable can avoid to insert an
+	  (useless) artificial variable.  Now (in the standard way, not
+	  incremental) the simplex solves `boeing1.mps --max' in half the
+	  time than before!
+
+2006-03-08 Wednesday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: ppl_lcdd/Makefile.am (1.26), ppl_lpsol/Makefile.am
+	  (1.30): Fixed the use of ECHO_N and ECHO_C.
+
+2006-03-08 Wednesday 08:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (1.5): Fixed a bug in
+	  remove_higher_space_dimensions().
+
+2006-03-08 Wednesday 07:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: ppl_lcdd/Makefile.am (1.25), ppl_lpsol/Makefile.am
+	  (1.29): No longer use `echo -n': it is non portable.
+
+2006-03-08 Wednesday 07:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.55): Enforce dependencies
+	  in order to cater for parallel builds.
+
+2006-03-07 Tuesday 22:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.28): No longer use the
+	  non-portable `-e' option of `grep'.  On Solaris, optima are
+	  compared only up to 8 digits of precision.
+
+2006-03-07 Tuesday 21:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.230): New Automake conditional HOST_OS_SOLARIS.
+
+2006-03-07 Tuesday 21:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.27): No longer use the
+	  `--ignore-all-space' option of `diff'.  Check the obtained optima
+	  also under Darwin.
+
+2006-03-07 Tuesday 16:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (1.8): Code change in previous commit
+	  revised and improved.
+
+2006-03-07 Tuesday 16:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (1.7): Bug fixed in
+	  PPL::Congruence_System::insert(const Congruence_System& y)
+
+2006-03-07 Tuesday 13:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (1.6): Fixed a bug in is_equal-to():
+	  Return false if the congruence systems do not have the same
+	  number of rows.
+
+2006-03-07 Tuesday 08:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* STANDARDS (1.33): Typo corrected.  Revised for new standards for
+	  test programs.
+
+2006-03-07 Tuesday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.26): The `--ignore-all-space' of
+	  `diff' is not portable.
+
+2006-03-07 Tuesday 07:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README (1.46): Added an item about grids.
+
+2006-03-06 Monday 15:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.25): Check obtained optima on
+	  Cygwin.
+
+2006-03-06 Monday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_int16 (1.5), expected_int16_a (1.5),
+	  expected_int32 (1.6), expected_int32_a (1.6), expected_int64
+	  (1.6), expected_int64_a (1.6), expected_int8 (1.5),
+	  expected_int8_a (1.4), expected_mpz (1.7), expected_mpz_a (1.7),
+	  ppl_lpsol.c (1.30): Use a different format to print the optimum
+	  value.
+
+2006-03-06 Monday 13:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.88): The failing configurations
+	  of dualhypercubes.cc are now recorded inside the test.
+
+2006-03-06 Monday 13:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.24): Invoke `ppl_lpsol' with the
+	  `-c' option, when assertions are disabled.
+
+2006-03-06 Monday 13:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.29): Drafted a partial
+	  implementation for option -c (check result). Currently, it only
+	  tests for the feasibility of the computed optimal point.
+
+2006-03-06 Monday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.54): Dependencies fixed.
+
+2006-03-06 Monday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/dualhypercubes.cc (1.8): Started adapting it to
+	  the new standards (but still checking nothing).
+
+2006-03-06 Monday 11:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/maxspacedim1.cc (1.7): Added a fixme: the test
+	  is only doing some compile-time type checking.
+
+2006-03-06 Monday 11:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: minconstraints2.cc (1.10), nncminimize1.cc
+	  (1.4): Using std::distance() to compute the number of
+	  constraints/generators and check their count is the expected one.
+
+2006-03-06 Monday 11:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence_System.defs.hh (1.7), Constraint_System.defs.hh
+	  (1.27), Generator_System.defs.hh (1.16),
+	  Grid_Generator_System.defs.hh (1.10): Let the const_iterator's of
+	  systems of constraints, generators, congruences and
+	  grid-genreators define the type alias difference_type, so as to
+	  allow for their use in algorithm such as std::distance.
+	  Corrected a bug in Grid_Generator_System, which was defining none
+	  of the required type aliases.
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.45), BD_Shape/addconstraints1.cc (1.11),
+	  BD_Shape/addspacedims1.cc (1.11), BD_Shape/affinedimension1.cc
+	  (1.7), BD_Shape/affineimage1.cc (1.12), BD_Shape/affineimage2.cc
+	  (1.11), BD_Shape/affinepreimage1.cc (1.12),
+	  BD_Shape/affinepreimage2.cc (1.11), BD_Shape/ascii_dump_load1.cc
+	  (1.12), BD_Shape/bdsdifference1.cc (1.8), BD_Shape/bdshull1.cc
+	  (1.8), BD_Shape/bgp99extrapolation1.cc (1.7),
+	  BD_Shape/bhmz05widening1.cc (1.8), BD_Shape/bhz03widening1.cc
+	  (1.7), BD_Shape/cc76extrapolation1.cc (1.12),
+	  BD_Shape/cc76narrowing1.cc (1.12), BD_Shape/closure1.cc (1.14),
+	  BD_Shape/concatenate1.cc (1.11), BD_Shape/constraints1.cc (1.14),
+	  BD_Shape/contains1.cc (1.10), BD_Shape/empty1.cc (1.9),
+	  BD_Shape/equality1.cc (1.14), BD_Shape/fromgensys1.cc (1.11),
+	  BD_Shape/generalizedaffineimage1.cc (1.13),
+	  BD_Shape/generalizedaffineimage2.cc (1.13),
+	  BD_Shape/generalizedaffinepreimage1.cc (1.12),
+	  BD_Shape/generalizedaffinepreimage2.cc (1.9),
+	  BD_Shape/geomcovers1.cc (1.7), BD_Shape/h79widening1.cc (1.10),
+	  BD_Shape/intersection1.cc (1.11),
+	  BD_Shape/limitedbhmz05extrapolation1.cc (1.7),
+	  BD_Shape/limitedcc76extrapolation1.cc (1.7),
+	  BD_Shape/limitedh79extrapolation1.cc (1.10),
+	  BD_Shape/mapspacedims1.cc (1.11), BD_Shape/maxspacedim.cc (1.13),
+	  BD_Shape/minconstraints1.cc (1.7), BD_Shape/relations1.cc (1.15),
+	  BD_Shape/relations2.cc (1.16), BD_Shape/relations3.cc (1.13),
+	  BD_Shape/removespacedims1.cc (1.12), BD_Shape/timeelapse1.cc
+	  (1.11), BD_Shape/universe1.cc (1.11), BD_Shape/writebdshape1.cc
+	  (1.7), Grid/addcongruence1.cc (1.8), Grid/addcongruences1.cc
+	  (1.10), Grid/addconstraint1.cc (1.8), Grid/addconstraints1.cc
+	  (1.8), Grid/addgenerator1.cc (1.10), Grid/addgenerators1.cc
+	  (1.6), Grid/addspacedims1.cc (1.9), Grid/affinedim1.cc (1.8),
+	  Grid/affineimage1.cc (1.10), Grid/affineimage2.cc (1.5),
+	  Grid/affinepreimage1.cc (1.8), Grid/affinepreimage2.cc (1.3),
+	  Grid/asciidumpload1.cc (1.6), Grid/bhz03widening1.cc (1.8),
+	  Grid/bounded1.cc (1.9), Grid/boundingbox1.cc (1.8),
+	  Grid/boundingbox2.cc (1.7), Grid/bounds1.cc (1.10),
+	  Grid/certificate1.cc (1.10), Grid/concatenate1.cc (1.9),
+	  Grid/congruence1.cc (1.9), Grid/congruences1.cc (1.7),
+	  Grid/congruencesystem1.cc (1.7), Grid/contains1.cc (1.8),
+	  Grid/copyconstruct1.cc (1.6), Grid/coveringbox1.cc (1.7),
+	  Grid/coveringbox2.cc (1.8), Grid/discrete1.cc (1.3),
+	  Grid/disjoint1.cc (1.7), Grid/equals1.cc (1.8),
+	  Grid/expandspacedim1.cc (1.7), Grid/foldspacedims1.cc (1.7),
+	  Grid/generalizedaffineimage1.cc (1.8),
+	  Grid/generalizedaffineimage2.cc (1.8),
+	  Grid/generalizedaffinepreimage1.cc (1.9),
+	  Grid/generalizedaffinepreimage2.cc (1.9), Grid/generator1.cc
+	  (1.6), Grid/generators1.cc (1.8), Grid/grid1.cc (1.12),
+	  Grid/grid2.cc (1.9), Grid/grid3.cc (1.8), Grid/griddifference1.cc
+	  (1.8), Grid/intersection1.cc (1.7), Grid/isempty1.cc (1.5),
+	  Grid/isuniverse1.cc (1.8), Grid/join1.cc (1.10), Grid/join2.cc
+	  (1.6), Grid/limitedextrapolation1.cc (1.7), Grid/mapspacedims1.cc
+	  (1.8), Grid/maxmin1.cc (1.6), Grid/membytes1.cc (1.5),
+	  Grid/mincongruences1.cc (1.7), Grid/mingenerators1.cc (1.7),
+	  Grid/outputoperator1.cc (1.5), Grid/relations1.cc (1.9),
+	  Grid/relations2.cc (1.8), Grid/removespacedims1.cc (1.7),
+	  Grid/timeelapse1.cc (1.7), Grid/topclosed1.cc (1.7),
+	  Grid/topclosure1.cc (1.6), Grid/widening1.cc (1.9),
+	  Grid/writecongruencesystem.cc (1.5), Polyhedron/addcongruence1.cc
+	  (1.6), Polyhedron/addcongruences1.cc (1.8),
+	  Polyhedron/addconstraint1.cc (1.8), Polyhedron/addconstraints1.cc
+	  (1.9), Polyhedron/addconstraints2.cc (1.8),
+	  Polyhedron/addgenerator1.cc (1.9), Polyhedron/addgenerator2.cc
+	  (1.9), Polyhedron/addgenerators1.cc (1.9),
+	  Polyhedron/addgenerators2.cc (1.9), Polyhedron/addspacedims1.cc
+	  (1.9), Polyhedron/addspacedims2.cc (1.9),
+	  Polyhedron/affineimage1.cc (1.9), Polyhedron/affineimage2.cc
+	  (1.9), Polyhedron/affinepreimage1.cc (1.8),
+	  Polyhedron/affinetrans.cc (1.9), Polyhedron/ascii_dump_load1.cc
+	  (1.8), Polyhedron/ascii_dump_load2.cc (1.8),
+	  Polyhedron/ascii_dump_load3.cc (1.9),
+	  Polyhedron/bgp99extrapolation1.cc (1.10),
+	  Polyhedron/bhrz03widening1.cc (1.8),
+	  Polyhedron/bhrz03widening2.cc (1.8),
+	  Polyhedron/bhrz03widening3.cc (1.9), Polyhedron/bhz03widening1.cc
+	  (1.10), Polyhedron/bounded1.cc (1.9),
+	  Polyhedron/boundedaffineimage1.cc (1.7),
+	  Polyhedron/boundedaffinepreimage1.cc (1.6),
+	  Polyhedron/boundedbhrz03extrapolation1.cc (1.7),
+	  Polyhedron/boundedh79extrapolation1.cc (1.9),
+	  Polyhedron/boundingbox1.cc (1.12), Polyhedron/boundingbox2.cc
+	  (1.11), Polyhedron/boundingbox3.cc (1.12), Polyhedron/bounds1.cc
+	  (1.9), Polyhedron/cnncconversion1.cc (1.2),
+	  Polyhedron/concatenate1.cc (1.8), Polyhedron/congruences1.cc
+	  (1.6), Polyhedron/constraints1.cc (1.8), Polyhedron/contains1.cc
+	  (1.8), Polyhedron/contains2.cc (1.8), Polyhedron/disjoint1.cc
+	  (1.8), Polyhedron/disjoint2.cc (1.10), Polyhedron/empty1.cc
+	  (1.9), Polyhedron/equals1.cc (1.8), Polyhedron/expandspacedim1.cc
+	  (1.10), Polyhedron/expandspacedim2.cc (1.10),
+	  Polyhedron/foldspacedims1.cc (1.12), Polyhedron/foldspacedims2.cc
+	  (1.12), Polyhedron/generalizedaffineimage1.cc (1.9),
+	  Polyhedron/generalizedaffineimage2.cc (1.9),
+	  Polyhedron/generalizedaffinepreimage1.cc (1.6),
+	  Polyhedron/generalizedaffinepreimage2.cc (1.6),
+	  Polyhedron/generators1.cc (1.9), Polyhedron/geomcovers1.cc
+	  (1.11), Polyhedron/h79widening1.cc (1.8),
+	  Polyhedron/h79widening2.cc (1.8), Polyhedron/intersection1.cc
+	  (1.10), Polyhedron/limitedh79extrapolation1.cc (1.8),
+	  Polyhedron/linearpartition1.cc (1.8), Polyhedron/linearsystem1.cc
+	  (1.5), Polyhedron/linexpression1.cc (1.8),
+	  Polyhedron/lpproblem1.cc (1.7), Polyhedron/mapspacedims1.cc
+	  (1.11), Polyhedron/max_min1.cc (1.9), Polyhedron/mc91.cc (1.12),
+	  Polyhedron/minconstraints1.cc (1.8),
+	  Polyhedron/minconstraints2.cc (1.9), Polyhedron/mingenerators1.cc
+	  (1.8), Polyhedron/mingenerators2.cc (1.9),
+	  Polyhedron/nncminimize1.cc (1.3), Polyhedron/nncminimize2.cc
+	  (1.5), Polyhedron/numberinput1.cc (1.28), Polyhedron/onepoint.cc
+	  (1.9), Polyhedron/polydifference1.cc (1.8),
+	  Polyhedron/polydifference2.cc (1.8), Polyhedron/polyhull1.cc
+	  (1.8), Polyhedron/polyhull2.cc (1.9), Polyhedron/polypowerset1.cc
+	  (1.20), Polyhedron/relations1.cc (1.8), Polyhedron/relations2.cc
+	  (1.9), Polyhedron/relations3.cc (1.8),
+	  Polyhedron/removespacedims1.cc (1.8),
+	  Polyhedron/removespacedims2.cc (1.8), Polyhedron/timeelapse1.cc
+	  (1.8), Polyhedron/timeelapse2.cc (1.9), Polyhedron/topclosed1.cc
+	  (1.9), Polyhedron/topclosure1.cc (1.8), Polyhedron/universe1.cc
+	  (1.8), Polyhedron/universe2.cc (1.8), Polyhedron/writeconsys1.cc
+	  (1.8), Polyhedron/writegensys1.cc (1.8),
+	  Polyhedron/writepolyhedron1.cc (1.8),
+	  Polyhedron/writepolyhedron2.cc (1.8),
+	  Polyhedron/writerelation1.cc (1.10): Obsolete macro DO_TEST
+	  removed.  Macros NEW_TEST* renamed DO_TEST*.
+
+2006-03-06 Monday 08:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/topclosed1.cc (1.6): Renovation of topclosed1.cc done.
+
+2006-03-05 Sunday 23:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.87): Adapted removespacedims*.cc,
+	  timeelapse*.cc, topclosed*.cc, topclosure*.cc, universe*.cc,
+	  writegensys*.cc and writepolyhedron*.cc to new standards.
+
+2006-03-05 Sunday 23:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: writeconsys1.cc (1.7), writerelation1.cc
+	  (1.9): Adapted to new standards for tests.
+
+2006-03-05 Sunday 23:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: topclosure1.cc (1.7), topclosure2.cc (1.8),
+	  topclosure3.cc (1.7), topclosure4.cc (1.9), universe1.cc (1.7),
+	  universe2.cc (1.7), universe3.cc (1.7), universe4.cc (1.7),
+	  universe5.cc (1.7), universe6.cc (1.7), universe7.cc (1.7),
+	  writepolyhedron1.cc (1.7), writepolyhedron2.cc (1.7),
+	  writepolyhedron3.cc (1.8), writegensys1.cc (1.7), writegensys2.cc
+	  (1.8), writegensys3.cc (1.7): Adapted to new standards for tests.
+
+2006-03-05 Sunday 23:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: removespacedims1.cc (1.7),
+	  removespacedims10.cc (1.8), removespacedims2.cc (1.7),
+	  removespacedims3.cc (1.8), removespacedims4.cc (1.7),
+	  removespacedims5.cc (1.8), removespacedims6.cc (1.7),
+	  removespacedims7.cc (1.7), removespacedims8.cc (1.7),
+	  removespacedims9.cc (1.7), timeelapse1.cc (1.7), timeelapse2.cc
+	  (1.8), timeelapse3.cc (1.7), timeelapse4.cc (1.7), timeelapse5.cc
+	  (1.8), timeelapse6.cc (1.7), timeelapse7.cc (1.8), timeelapse8.cc
+	  (1.8), timeelapse9.cc (1.8), topclosed1.cc (1.8), topclosed2.cc
+	  (1.8), topclosed3.cc (1.7): Adapted to new standards for tests.
+
+2006-03-05 Sunday 22:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.186): Added item to "Enhancements for PPL 0.10" - Add a
+	  widening for grids using only generator representations.
+
+2006-03-05 Sunday 22:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (1.4): Changed name of variable "num_rows"
+	  to more descriptive name.  Added and improved comments wrt this
+	  variable.
+
+2006-03-05 Sunday 22:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: print.hh (1.34), Grid/bhz03widening1.cc (1.7),
+	  Grid/certificate1.cc (1.9): Removed redundant code from
+	  Grid/certificate1.cc Added print_congruences for powersets in
+	  print.hh and use it in Grid/bhz03widening1.cc
+
+2006-03-05 Sunday 21:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.24), boundingbox1.cc (1.7),
+	  coveringbox2.cc (1.7), grid1.cc (1.11), limitedextrapolation1.cc
+	  (1.6), mapspacedims1.cc (1.7), maxmin1.cc (1.5), membytes1.cc
+	  (1.4), membytes2.cc (1.4), mincongruences1.cc (1.6),
+	  mingenerators1.cc (1.6), outputoperator1.cc (1.4), relations1.cc
+	  (1.8), relations2.cc (1.7), removespacedims1.cc (1.6),
+	  removespacedims2.cc (1.6), timeelapse1.cc (1.6), timeelapse2.cc
+	  (1.5), topclosure1.cc (1.5), widening1.cc (1.8),
+	  writecongruencesystem.cc (1.4): Basic renovation of grids tests
+	  completed.
+
+2006-03-05 Sunday 21:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/intersection1.cc (1.9): Invoke `test01' and
+	  `test02' with NEW_TEST_F8A.
+
+2006-03-05 Sunday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.191): Added a brief description of the new Grid class.
+	  Added a mention of the new possibility of building only static or
+	  only shared libraries.  Completed the section on bugfixes.
+	  Tentative release date for PPL 0.9 is March 12, 2006.
+
+2006-03-05 Sunday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.185): Removed items that have already done.  Pushed all
+	  the others down to PPL 0.10.
+
+2006-03-05 Sunday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.36), config.sub (1.34), Watchdog/config.guess
+	  (1.20), Watchdog/config.sub (1.19): Updated.
+
+2006-03-05 Sunday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.229), demos/ppl_lpsol/Makefile.am (1.23):
+	  Automake conditional CYGWIN renamed HOST_OS_CYGWIN.  New Automake
+	  conditional HOST_OS_DARWIN.  Refrain from literal comparison of
+	  ppl_lpsol output also on Darwin.
+
+2006-03-05 Sunday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affineimage2.cc (1.4): Use NEW_TEST_F16A to invoke
+	  `test10'.
+
+2006-03-05 Sunday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.44): New macro NEW_TEST_F16A.
+
+2006-03-05 Sunday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/intersection1.cc (1.8): Tests `test01' and
+	  `test02' succeed also with 8-bit coefficients.
+
+2006-03-05 Sunday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/mc91.cc (1.11): Actually, 16-bit coefficients
+	  are enough for `test01'.
+
+2006-03-05 Sunday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.71), devref.doxyconf-latex.in
+	  (1.11): Source file float.types.hh does not exist anymore.
+
+2006-03-05 Sunday 13:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.22): Do not use `diff' to check
+	  the results under Cygwin.
+
+2006-03-05 Sunday 12:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.228): New AM_CONDITIONAL CYGWIN.  Version number
+	  bumped.
+
+2006-03-05 Sunday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/Makefile.am (1.19): Copy and paste mistake fixed.
+
+2006-03-05 Sunday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/mc91.cc (1.10): Test `test01' requires at least
+	  32-bit coefficients to succeed.
+
+2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_binary_format.m4 (1.3): Support 64-bit long
+	  doubles.  Fixed several copy and paste mistakes.
+
+2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_double_binary_format.m4 (1.3): Fixed a couple of
+	  comments.
+
+2006-03-05 Sunday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.41), run_tests (1.17): Do not
+	  test with unsupported floating point types.
+
+2006-03-04 Saturday 23:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.19): Adapted to the new
+	  standards.
+
+2006-03-04 Saturday 23:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.86), relations1.cc (1.7),
+	  relations10.cc (1.7), relations11.cc (1.7), relations12.cc (1.7),
+	  relations13.cc (1.7), relations14.cc (1.7), relations15.cc (1.7),
+	  relations16.cc (1.7), relations17.cc (1.9), relations18.cc (1.7),
+	  relations19.cc (1.9), relations2.cc (1.8), relations3.cc (1.7),
+	  relations4.cc (1.7), relations5.cc (1.7), relations6.cc (1.8),
+	  relations7.cc (1.7), relations8.cc (1.7), relations9.cc (1.8):
+	  Adapted relations*.cc to the new standards for tests.
+
+2006-03-04 Saturday 22:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/Makefile.am (1.18), m4/ac_cxx_double_binary_format.m4 (1.2),
+	  m4/ac_cxx_float_binary_format.m4 (1.2),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.2),
+	  src/Checked_Number.defs.hh (1.75), src/Checked_Number.inlines.hh
+	  (1.64), src/Float.defs.hh (1.21), src/checked_float.inlines.hh
+	  (1.65), src/checked_numeric_limits.hh (1.15): More improvements
+	  concerning the detection of supported floating point numbers.
+
+2006-03-04 Saturday 21:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.227), m4/ac_cxx_double_binary_format.m4 (1.1),
+	  m4/ac_cxx_double_is_iec_559.m4 (1.6),
+	  m4/ac_cxx_float128_binary_format.m4 (1.6),
+	  m4/ac_cxx_float32_binary_format.m4 (1.4),
+	  m4/ac_cxx_float64_binary_format.m4 (1.5),
+	  m4/ac_cxx_float96_binary_format.m4 (1.5),
+	  m4/ac_cxx_float_binary_format.m4 (1.1),
+	  m4/ac_cxx_float_is_iec_559.m4 (1.6), m4/ac_cxx_long_double.m4
+	  (1.7), m4/ac_cxx_long_double_binary_format.m4 (1.1),
+	  m4/ac_cxx_long_double_is_iec_559.m4 (1.6), m4/ac_cxx_long_long.m4
+	  (1.6), src/Float.defs.hh (1.20), src/Makefile.am (1.150),
+	  src/checked_int.inlines.hh (1.51), src/float.types.hh (1.17):
+	  Simplified the logic behind the detection of the relevant
+	  properties of the available floating point numbers.  Several
+	  unused Autoconf functions have been removed.
+
+2006-03-04 Saturday 20:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.43), print.hh (1.33): Added template
+	  <typename PH> void print_constraints(const
+	  Polyhedra_Powerset<PH>&, const std::string, std::ostream& s).
+
+2006-03-04 Saturday 20:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: polyhull10.cc (1.7), polyhull11.cc (1.7),
+	  polyhull3.cc (1.8), polyhull4.cc (1.7), polyhull5.cc (1.8),
+	  polyhull6.cc (1.7), polyhull7.cc (1.7), polyhull8.cc (1.9),
+	  polyhull9.cc (1.9): No longer needed.
+
+2006-03-04 Saturday 20:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.85), polyhull1.cc (1.7),
+	  polyhull2.cc (1.8): Adapted polyhull*.cc to the new standards for
+	  tests.
+
+2006-03-04 Saturday 19:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.84): Corrected (was still
+	  including referecnes to deleted polydifference*.cc tests).
+
+2006-03-04 Saturday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/append1.cc (1.8): Indentation fixed.
+
+2006-03-04 Saturday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/mc91.cc (1.9): Rewritten.
+
+2006-03-04 Saturday 14:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.83): Adapted mingenerators*.cc,
+	  polydifference*.cc and onepoint.cc to new standards for tests.
+
+2006-03-04 Saturday 14:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.27): Started adapting this
+	  test to the new standards for tests.
+
+2006-03-04 Saturday 14:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/mc91.cc (1.8): Adapted to new standards for
+	  tests. Also added a FIXME as it currently tests nothing.
+
+2006-03-04 Saturday 13:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: mingenerators1.cc (1.7), mingenerators2.cc
+	  (1.8), mingenerators3.cc (1.7), polydifference1.cc (1.7),
+	  polydifference2.cc (1.7), polydifference3.cc (1.7),
+	  polydifference4.cc (1.8), polydifference5.cc (1.7),
+	  polydifference6.cc (1.7), polydifference7.cc (1.9),
+	  polydifference8.cc (1.7), polydifference9.cc (1.8), onepoint.cc
+	  (1.8): Adapted to new standards for tests.
+
+2006-03-03 Friday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.68): Dependencies fixed.
+
+2006-03-03 Friday 17:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.82): Adapted lpproblem*.cc,
+	  mapspacedims*.cc, max_min*.cc and minconstraints*.cc to new
+	  standards.
+
+2006-03-03 Friday 17:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: minconstraints1.cc (1.7), minconstraints2.cc
+	  (1.8), minconstraints3.cc (1.7), minconstraints4.cc (1.7),
+	  lpproblem1.cc (1.6), lpproblem2.cc (1.5), lpproblem3.cc (1.3),
+	  max_min1.cc (1.8), max_min2.cc (1.8), mapspacedims1.cc (1.10),
+	  mapspacedims2.cc (1.8), mapspacedims3.cc (1.8), mapspacedims4.cc
+	  (1.8): Adapted to new standards for tests.
+
+2006-03-03 Friday 09:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.81): Adapted ascii_dump_laod* to
+	  new standards for tests.
+
+2006-03-03 Friday 09:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/foldspacedims1.cc (1.11): Test test06() will
+	  only fail when using C_Polyhedron and 8 bit coefficients.
+
+2006-03-03 Friday 09:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: linearsystem1.cc (1.4), linexpression1.cc
+	  (1.7): Adapted to new standards for tests.
+
+2006-03-03 Friday 09:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: ascii_dump_load1.cc (1.7), ascii_dump_load2.cc
+	  (1.7), ascii_dump_load3.cc (1.8), ascii_dump_load4.cc (1.8),
+	  ascii_dump_load5.cc (1.8), ascii_dump_load6.cc (1.9),
+	  ascii_dump_load7.cc (1.7): Adapted ascii_dump_load*.cc to new
+	  standards for tests.
+
+2006-03-03 Friday 08:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.80), linearpartition1.cc (1.7),
+	  linearpartition2.cc (1.7), linearpartition3.cc (1.7),
+	  linearpartition4.cc (1.8): Adapted linearpartition*.cc and
+	  limitedh79extrapolation*.cc to new standards for tests.
+
+2006-03-03 Friday 08:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: limitedh79extrapolation1.cc (1.7),
+	  limitedh79extrapolation2.cc (1.7), limitedh79extrapolation3.cc
+	  (1.7), limitedh79extrapolation4.cc (1.9): Adapted to new
+	  standards for tests.
+
+2006-03-02 Thursday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.226): The only purpose of the `debug_flag'
+	  variable is to hold "-DNDEBUG=1" when assertions are enabled.
+
+2006-03-02 Thursday 21:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/foldspacedims2.cc (1.11): With 8-bit
+	  coefficients and assertions enabled test04 must fail.
+
+2006-03-02 Thursday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Polyhedron/Makefile.am (1.79), BD_Shape/Makefile.am
+	  (1.40), Grid/Makefile.am (1.23): Added @debug_flag@ to
+	  AM_CPPFLAGS.
+
+2006-03-02 Thursday 11:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.78): Removing tests from XFAILS
+	  if they have already been adapted to the new standards for
+	  handling failures.
+
+2006-03-02 Thursday 11:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: foldspacedims1.cc (1.10), foldspacedims2.cc
+	  (1.10): Mark tests that should fail with 8 bit coefficients.
+
+2006-03-02 Thursday 08:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/join3.cc (1.7): Tests in join3.cc now included in
+	  join2.cc
+
+2006-03-02 Thursday 08:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.22), join1.cc (1.9), join1_16.cc
+	  (1.4), join2.cc (1.5): Revised tests using new guidelines
+
+2006-03-02 Thursday 07:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/intersection2.cc (1.6): Tests now in intersection1.cc
+
+2006-03-02 Thursday 07:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.21), generalizedaffineimage1.cc
+	  (1.7), generalizedaffineimage2.cc (1.7),
+	  generalizedaffinepreimage1.cc (1.8),
+	  generalizedaffinepreimage2.cc (1.8), generator1.cc (1.5),
+	  generators1.cc (1.7), grid1.cc (1.10), grid1_16.cc (1.7),
+	  grid1_64.cc (1.5), grid1_gmp.cc (1.5), grid2.cc (1.8),
+	  grid2_16.cc (1.5), grid3.cc (1.7), griddifference1.cc (1.7),
+	  intersection1.cc (1.6), intersection2.cc (1.5), isempty1.cc
+	  (1.4), isuniverse1.cc (1.7): Revised tests for new guidelines.
+
+2006-03-01 Wednesday 22:05  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.33): Added a float-based version of
+	  the steepest-edge technique (disabled by default).
+
+2006-03-01 Wednesday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: bgp99extrapolation1.cc (1.6), bhmz05widening1.cc
+	  (1.7), bhz03widening1.cc (1.6), cc76extrapolation1.cc (1.11),
+	  geomcovers1.cc (1.6), minconstraints1.cc (1.6), relations1.cc
+	  (1.14), relations2.cc (1.15): Standardize the use of using
+	  declarations: only local ones, without unnecessary
+	  Parma_Polyhedra_Library:: qualifications, and with a scope
+	  reduced as much as possible.
+
+2006-03-01 Wednesday 19:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/geomcovers1.cc (1.10): Do not require recent
+	  versions of GCC just for printing something in test programs: use
+	  `using namespace IO_Operators;' instead of more refined things.
+
+2006-03-01 Wednesday 18:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.77): No longer needed XFAILs
+	  removed.
+
+2006-03-01 Wednesday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.10): Temporarily disable this test
+	  on Alpha machines.
+
+2006-03-01 Wednesday 16:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.76), intersection1.cc (1.7),
+	  intersection10.cc (1.9), intersection11.cc (1.9),
+	  intersection2.cc (1.7), intersection3.cc (1.7), intersection4.cc
+	  (1.8), intersection5.cc (1.8), intersection6.cc (1.8),
+	  intersection7.cc (1.7), intersection8.cc (1.8), intersection9.cc
+	  (1.8): Adapted intersection*.cc to new standards for tests.
+
+2006-03-01 Wednesday 15:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.75), h79widening1.cc (1.7),
+	  h79widening2.cc (1.7), h79widening3.cc (1.7), h79widening4.cc
+	  (1.7), h79widening5.cc (1.8), h79widening6.cc (1.7),
+	  h79widening7.cc (1.7), h79widening8.cc (1.7): Adapted
+	  h79widening*.cc to new standards for tests.
+
+2006-03-01 Wednesday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/geomcovers1.cc (1.9): Adapted to the new
+	  standards for tests.
+
+2006-03-01 Wednesday 14:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.74), generators1.cc (1.8),
+	  generators2.cc (1.8), generators3.cc (1.8), generators4.cc (1.8),
+	  generators5.cc (1.7), generators6.cc (1.9), generators7.cc (1.7):
+	  Adapted generators*.cc to new standards for tests.
+
+2006-03-01 Wednesday 14:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.73),
+	  generalizedaffinepreimage1.cc (1.5),
+	  generalizedaffinepreimage2.cc (1.5),
+	  generalizedaffinepreimage3.cc (1.5),
+	  generalizedaffinepreimage4.cc (1.5): Adapted
+	  generalizedaffinepreimage*.cc to the new standards for tests.
+
+2006-03-01 Wednesday 13:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize2.cc (1.4): Fails with all bounded
+	  integers.
+
+2006-03-01 Wednesday 12:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.72), generalizedaffineimage1.cc
+	  (1.8), generalizedaffineimage10.cc (1.8),
+	  generalizedaffineimage11.cc (1.9), generalizedaffineimage12.cc
+	  (1.7), generalizedaffineimage13.cc (1.6),
+	  generalizedaffineimage14.cc (1.6), generalizedaffineimage2.cc
+	  (1.8), generalizedaffineimage3.cc (1.8),
+	  generalizedaffineimage4.cc (1.8), generalizedaffineimage5.cc
+	  (1.7), generalizedaffineimage6.cc (1.8),
+	  generalizedaffineimage7.cc (1.8), generalizedaffineimage8.cc
+	  (1.7), generalizedaffineimage9.cc (1.8): Adapted
+	  generalizedaffineimage*.cc to new standards for tests.
+
+2006-03-01 Wednesday 12:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: foldspacedims1.cc (1.9), foldspacedims2.cc
+	  (1.9): Adapted foldspacedims*.cc to new standards for tests.
+
+2006-03-01 Wednesday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: expandspacedim1.cc (1.9), expandspacedim2.cc
+	  (1.9): Adapted expandspacedim*.cc to new standards for tests.
+
+2006-03-01 Wednesday 11:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/equals1.cc (1.7): Adapted to new standards for
+	  tests.
+
+2006-03-01 Wednesday 11:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/empty1.cc (1.8): Adapted empty*.cc to new
+	  standards for tests.
+
+2006-03-01 Wednesday 11:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: boundedbhrz03extrapolation1.cc (1.6),
+	  boundedh79extrapolation1.cc (1.8): Modified to work correclty
+	  with failing coefficient configurations.
+
+2006-03-01 Wednesday 11:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.71), disjoint1.cc (1.7),
+	  disjoint2.cc (1.9), disjoint3.cc (1.9): Adapted disjoint*.cc to
+	  new standards for tests.
+
+2006-03-01 Wednesday 11:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.70), contains1.cc (1.7),
+	  contains2.cc (1.7), contains3.cc (1.7), contains4.cc (1.7),
+	  contains5.cc (1.8): Adapted contsains*.cc to new standards for
+	  tests.
+
+2006-03-01 Wednesday 10:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.69), boundedaffineimage1.cc
+	  (1.6), boundedaffineimage2.cc (1.5), boundedaffineimage3.cc
+	  (1.5), boundedaffinepreimage1.cc (1.5), boundedaffinepreimage2.cc
+	  (1.5), boundedaffinepreimage3.cc (1.5): Adapted
+	  boundedaffine[pre]image*.cc to new standards for tests.
+
+2006-03-01 Wednesday 09:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.68), bhz03widening1.cc (1.9),
+	  bhz03widening2.cc (1.9), bhz03widening3.cc (1.9),
+	  bhz03widening4.cc (1.8), bhz03widening5.cc (1.8),
+	  bhz03widening6.cc (1.10): Adapted bhz03widening*.cc to new
+	  standards for tests files.
+
+2006-03-01 Wednesday 09:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/bgp99extrapolation1.cc (1.9): Correctly handling
+	  with failing coefficient configurations.
+
+2006-03-01 Wednesday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.67), constraints1.cc (1.7),
+	  constraints2.cc (1.8), constraints3.cc (1.7), constraints4.cc
+	  (1.9), constraints5.cc (1.6): Translated constraints*.cc
+	  according to new standards for tests.
+
+2006-03-01 Wednesday 09:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.66): Adapted for changes to
+	  bounds*.cc.
+
+2006-03-01 Wednesday 09:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: bounds1.cc (1.8), bounds2.cc (1.7),
+	  congruences1.cc (1.5): Adapted to new standards for tests.
+
+2006-03-01 Wednesday 09:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize1.cc (1.2): Using new macros for
+	  handling with failing coefficent configurations.
+
+2006-03-01 Wednesday 09:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: CbecomesNNC1.cc (1.7), Makefile.am (1.65),
+	  NNCbecomesC1.cc (1.8), cnncconversion1.cc (1.1): Tests
+	  CbecomesNNC1 and NNCbecomesC1 translated according to new
+	  standards.
+
+2006-03-01 Wednesday 09:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: boundingbox1.cc (1.11), boundingbox2.cc
+	  (1.10), boundingbox3.cc (1.11): Removed useless parentheses in
+	  return statement.  Moved test descriptions in front of the tests.
+
+2006-03-01 Wednesday 09:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.42): Corrected macro NEW_TEST_F* to
+	  correctly deal with failing tests.
+
+2006-02-28 Tuesday 23:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/equals1.cc (1.7): Test added to improve coverage.
+
+2006-02-28 Tuesday 12:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/addcongruences1.cc (1.7): Use
+	  print_congruences() instead of print_constraints() when printing
+	  a ystem of congruences.
+
+2006-02-28 Tuesday 10:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.20), affineimage1_16.cc (1.6): Test
+	  in affineimage1_16.cc is now included in affineimage2.cc
+
+2006-02-28 Tuesday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affineimage2.cc (1.3): Activated test10.
+
+2006-02-28 Tuesday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.41): NEW_TEST* macros fixed and completed.
+
+2006-02-28 Tuesday 09:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.3): Use more efficient iteration in
+	  a couple of cases.
+
+2006-02-28 Tuesday 09:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.inlines.hh (1.17): Added more comments to explain the
+	  order of construction/destruction.
+
+2006-02-28 Tuesday 08:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: print.cc (1.25), print.hh (1.32): Two FIXMEs dealt with.
+
+2006-02-28 Tuesday 08:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: contains2.cc (1.5), discrete1.cc (1.2), disjoint1.cc
+	  (1.6), equals1.cc (1.6), expandspacedim1.cc (1.6),
+	  foldspacedims1.cc (1.6): Tests in contains2.cc already in
+	  contains1.cc.  Modified tests following new guidelines.
+
+2006-02-28 Tuesday 08:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: addcongruence1.cc (1.7), addcongruences1.cc (1.9),
+	  addconstraint1.cc (1.7), addconstraints1.cc (1.7),
+	  addgenerator1.cc (1.9), addgenerators1.cc (1.5), addspacedims1.cc
+	  (1.8), affinedim1.cc (1.7), affineimage1.cc (1.9),
+	  affineimage1_16.cc (1.5), affineimage2.cc (1.2),
+	  affinepreimage1.cc (1.7), affinepreimage2.cc (1.2),
+	  asciidumpload1.cc (1.5), bhz03widening1.cc (1.6), bounded1.cc
+	  (1.8), boundingbox1.cc (1.6), boundingbox2.cc (1.6), bounds1.cc
+	  (1.9), certificate1.cc (1.8), concatenate1.cc (1.8),
+	  congruence1.cc (1.8), congruences1.cc (1.6), congruencesystem1.cc
+	  (1.6), contains1.cc (1.7), coveringbox1.cc (1.6), coveringbox2.cc
+	  (1.6): Blank line before test comment removed.  A few missing
+	  comments for tests added.
+
+2006-02-28 Tuesday 07:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.184), src/Polyhedron_nonpublic.cc (1.65): TODO item
+	  partly done: added some missing assert(OK()).
+
+2006-02-27 Monday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.46): Upon `make clean', erase also the
+	  temporary directories (they will be there if the build did not
+	  complete successfully).
+
+2006-02-27 Monday 18:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.45): Use two distinct rules for the user and
+	  developer HTML documentation.
+
+2006-02-27 Monday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.70), user.doxyconf-html.in
+	  (1.37): Set HTML_OUTPUT the right way.
+
+2006-02-27 Monday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.44): Allow parallel building of the user and
+	  developer HTML documentation.
+
+2006-02-27 Monday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.40), Polyhedron/bhrz03widening3.cc (1.8),
+	  Polyhedron/boundingbox3.cc (1.10): New macros NEW_TEST_F,
+	  NEW_TEST_F64, NEW_TEST_F32, NEW_TEST_F16, NEW_TEST_F8 and
+	  NEW_TEST_F8A to be used for tests that are known to fail always,
+	  with bounded coefficients with number of bits less than or equal
+	  to the indicated number, or with 8-bit coefficient and with
+	  assertions enabled, respectively.
+
+2006-02-27 Monday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.225): Improved the selection of the type of
+	  coefficients.  New C++ macro COEFFICIENT_BITS holds the number of
+	  bits of coefficients, 0 if they are unbounded.
+
+2006-02-27 Monday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.54): The GNU-Prolog
+	  interface can now be built also with --disable-static and with
+	  --disable-shared.
+
+2006-02-27 Monday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.44): The YAP-Prolog
+	  interface cannot be built if shared libraries are not available.
+
+2006-02-27 Monday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.53): The Ciao-Prolog
+	  interface cannot be built if shared libraries are not available.
+
+2006-02-27 Monday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.67): Work also if the
+	  PPL was configure with --disable-shared.  Moreover, unless the
+	  PPL was configured with --disable-static, `ppl_sicstus' uses only
+	  static modules.
+
+2006-02-27 Monday 13:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/affineimage2.cc (1.8): Helper function renamed
+	  according to new standard.
+
+2006-02-27 Monday 13:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.64), concatenate1.cc (1.7),
+	  concatenate2.cc (1.8), concatenate3.cc (1.7), concatenate4.cc
+	  (1.7), concatenate5.cc (1.7), concatenate6.cc (1.9),
+	  concatenate7.cc (1.6): Transformed according to new standards for
+	  tests.
+
+2006-02-27 Monday 13:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/bounded1.cc (1.8): Tranformed according to new
+	  standards for tests.
+
+2006-02-27 Monday 13:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.63), bhrz03widening1.cc (1.7),
+	  bhrz03widening10.cc (1.8), bhrz03widening11.cc (1.7),
+	  bhrz03widening12.cc (1.8), bhrz03widening13.cc (1.7),
+	  bhrz03widening14.cc (1.7), bhrz03widening15.cc (1.8),
+	  bhrz03widening16.cc (1.7), bhrz03widening17.cc (1.7),
+	  bhrz03widening18.cc (1.7), bhrz03widening19.cc (1.7),
+	  bhrz03widening2.cc (1.7), bhrz03widening3.cc (1.7),
+	  bhrz03widening4.cc (1.7), bhrz03widening5.cc (1.7),
+	  bhrz03widening6.cc (1.7), bhrz03widening7.cc (1.7),
+	  bhrz03widening8.cc (1.7), bhrz03widening9.cc (1.7): Transformed
+	  according to new standards for tests.
+
+2006-02-27 Monday 13:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: affinetrans.cc (1.8), Makefile.am (1.62),
+	  bgp99extrapolation1.cc (1.8), bgp99extrapolation2.cc (1.8):
+	  Transformed according to new standards for tests.
+
+2006-02-27 Monday 13:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.60), affineimage1.cc (1.8),
+	  affineimage2.cc (1.7), affineimage3.cc (1.7), affineimage4.cc
+	  (1.8), affineimage5.cc (1.9), affineimage6.cc (1.9),
+	  affineimage7.cc (1.7), affineimage8.cc (1.8), affineimage9.cc
+	  (1.7), Makefile.am (1.61), affinepreimage1.cc (1.7),
+	  affinepreimage10.cc (1.8), affinepreimage11.cc (1.5),
+	  affinepreimage12.cc (1.3), affinepreimage2.cc (1.7),
+	  affinepreimage3.cc (1.8), affinepreimage4.cc (1.7),
+	  affinepreimage5.cc (1.7), affinepreimage6.cc (1.7),
+	  affinepreimage7.cc (1.7), affinepreimage8.cc (1.8),
+	  affinepreimage9.cc (1.8): Transformed according to new standards
+	  for tests.
+
+2006-02-27 Monday 12:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.59), addspacedims1.cc (1.8),
+	  addspacedims10.cc (1.7), addspacedims11.cc (1.7),
+	  addspacedims12.cc (1.7), addspacedims13.cc (1.8),
+	  addspacedims2.cc (1.8), addspacedims3.cc (1.9), addspacedims4.cc
+	  (1.7), addspacedims5.cc (1.7), addspacedims6.cc (1.7),
+	  addspacedims7.cc (1.7), addspacedims8.cc (1.8), addspacedims9.cc
+	  (1.7): Transformed according to new standards for tests.
+
+2006-02-27 Monday 12:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.58), addgenerator1.cc (1.8),
+	  addgenerator2.cc (1.8), addgenerator3.cc (1.8), addgenerator4.cc
+	  (1.8), addgenerator5.cc (1.8), addgenerators1.cc (1.8),
+	  addgenerators10.cc (1.8), addgenerators11.cc (1.8),
+	  addgenerators12.cc (1.9), addgenerators13.cc (1.8),
+	  addgenerators2.cc (1.8), addgenerators3.cc (1.7),
+	  addgenerators4.cc (1.7), addgenerators5.cc (1.7),
+	  addgenerators6.cc (1.8), addgenerators7.cc (1.7),
+	  addgenerators8.cc (1.8), addgenerators9.cc (1.7): Transformed
+	  according to new standards for tests.
+
+2006-02-27 Monday 12:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.57), addconstraint1.cc (1.7),
+	  addconstraint2.cc (1.8), addconstraint3.cc (1.8),
+	  addconstraints1.cc (1.8), addconstraints10.cc (1.8),
+	  addconstraints11.cc (1.7), addconstraints12.cc (1.7),
+	  addconstraints13.cc (1.9), addconstraints2.cc (1.7),
+	  addconstraints3.cc (1.8), addconstraints4.cc (1.7),
+	  addconstraints5.cc (1.8), addconstraints6.cc (1.8),
+	  addconstraints7.cc (1.8), addconstraints8.cc (1.8),
+	  addconstraints9.cc (1.7): Transformed according to new standards
+	  for tests.
+
+2006-02-27 Monday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.56), addcongruences1.cc (1.6),
+	  addcongruences2.cc (1.5), addcongruences3.cc (1.5),
+	  addcongruences4.cc (1.5), addcongruences5.cc (1.5): Transformed
+	  according to new standards for tests.
+
+2006-02-27 Monday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.55): Dealing with addcongruence.
+
+2006-02-27 Monday 12:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: addcongruence1.cc (1.5), addcongruence2.cc
+	  (1.5), addcongruence3.cc (1.5), addcongruence4.cc (1.5),
+	  addcongruence5.cc (1.5): Transformed according to new standard
+	  for tests.
+
+2006-02-27 Monday 12:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.54): Added nncminimize1.cc and
+	  removed NNCminimize*.
+
+2006-02-27 Monday 12:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: NNCminimize1.cc (1.7), NNCminimize2.cc (1.7),
+	  NNCminimize3.cc (1.7), NNCminimize4.cc (1.7), NNCminimize5.cc
+	  (1.7), NNCminimize6.cc (1.7), nncminimize1.cc (1.1): Transformed
+	  according to new standard for tests.
+
+2006-02-27 Monday 07:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.190), src/Saturation_Row.cc (1.10): Fixed a long-standing
+	  bug in Saturation_Row::prev().
+
+2006-02-26 Sunday 21:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/bhz03widening1.cc (1.5): Revised test to guidelines.
+
+2006-02-26 Sunday 21:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.defs.hh (1.10): Documentation for ascii_load()
+	  bug fixed.  Comment made conditional on
+	  PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS being defined.
+
+2006-02-26 Sunday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize2.cc (1.3): Make sure vnout is
+	  flushed just after the dumps.
+
+2006-02-26 Sunday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize2.cc (1.2): Dump the polyhedron
+	  multiple times when very noisy.
+
+2006-02-26 Sunday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.53), nncminimize2.cc (1.1): New
+	  test for NNC_Polyhedron::ph.minimized_generators().
+
+2006-02-26 Sunday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.66): Dependencies fixed.
+
+2006-02-26 Sunday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (1.19): Fixed the ordering in the
+	  definition of LDADD.
+
+2006-02-26 Sunday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.43): Portability improvement: `tar zxf' is
+	  non-portable;  use `gunzip -c' and pipe the result to `tar xf'
+	  instead.
+
+2006-02-26 Sunday 09:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: ppl_lcdd/Makefile.am (1.24), ppl_lpsol/Makefile.am
+	  (1.21): Portability improvement: instead of using `grep -q'
+	  (which is non-portable) we redirect the standard output and
+	  standard error to `/dev/null'.
+
+2006-02-26 Sunday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.74), Checked_Number.inlines.hh
+	  (1.63), Float.inlines.hh (1.27), Grid_Certificate.cc (1.4),
+	  Grid_Generator.defs.hh (1.9), Grid_Generator_System.cc (1.4),
+	  Grid_Generator_System.inlines.hh (1.4), Grid_conversion.cc (1.5),
+	  Grid_public.cc (1.12), Scalar_Products.defs.hh (1.6),
+	  checked_ext.defs.hh (1.11), checked_ext.inlines.hh (1.30),
+	  checked_int.inlines.hh (1.50): Try to avoid long source lines.
+
+2006-02-26 Sunday 07:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.26): Do not leave operators ad end of
+	  line.
+
+2006-02-26 Sunday 07:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.cc (1.57), H79_Certificate.inlines.hh (1.8),
+	  Polyhedra_Powerset.templates.hh (1.2): Avoid useless parentheses.
+
+2006-02-26 Sunday 07:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.inlines.hh (1.3): Fix misplaced parenthesis.
+
+2006-02-26 Sunday 00:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.templates.hh (1.3): Fixed a bug in get_covering_box().
+
+2006-02-26 Sunday 00:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: print.cc (1.24), print.hh (1.31), Grid/Makefile.am
+	  (1.18), Grid/bounds1.cc (1.8), Grid/certificate1.cc (1.7),
+	  Grid/concatenate1.cc (1.7), Grid/congruence1.cc (1.7),
+	  Grid/congruences1.cc (1.5), Grid/congruencesystem1.cc (1.5),
+	  Grid/congruencesystem2.cc (1.5), Grid/contains1.cc (1.6),
+	  Grid/copyconstruct1.cc (1.5), Grid/coveringbox1.cc (1.5),
+	  Grid/coveringbox2.cc (1.5): Revised tests following guidelines.
+	  Added 2 tests to coveringbox2 for generator systems with
+	  parameters.
+
+2006-02-25 Saturday 18:57  Abramo Bagnara
+
+	* src/: Float.inlines.hh (1.25), checked_int.inlines.hh (1.49):
+	  Fixed mpz_export use.
+
+2006-02-25 Saturday 17:17  Abramo Bagnara
+
+	* src/: Float.inlines.hh (1.24), checked_float.inlines.hh (1.64),
+	  checked_int.inlines.hh (1.48): Fixed mpz_export order argument.
+
+2006-02-25 Saturday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.153): Avoid an ambiguity problem
+	  occurring, e.g., on Solaris 2.9.
+
+2006-02-25 Saturday 14:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: boundingbox4.cc (1.9), boundingbox5.cc (1.8):
+	  Removed (incorporated in other tests).
+
+2006-02-25 Saturday 14:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.52), boundingbox1.cc (1.10),
+	  boundingbox2.cc (1.9), boundingbox3.cc (1.9): Translated the
+	  tests boundingbox* into the new style.
+
+2006-02-25 Saturday 14:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.11): Wrong inline qualifier removed.
+
+2006-02-25 Saturday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.26): Rename store_nan and
+	  store_infinity to handle_nan and handle_infinity.
+
+2006-02-25 Saturday 10:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_Expression.defs.hh (1.22),
+	  Linear_Expression.inlines.hh (1.8): Added operators so as to
+	  obtain perfect matches and avoid ambiguities.
+
+2006-02-25 Saturday 09:58  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.62): Fixed typo.
+
+2006-02-25 Saturday 09:36  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.73), Checked_Number.inlines.hh
+	  (1.61): Added is_non_a_number, is_minus_infinity and
+	  is_plus_infinity.
+
+2006-02-25 Saturday 09:28  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.72), checked.defs.hh (1.35),
+	  checked_int.inlines.hh (1.47), checked_mpq.inlines.hh (1.34),
+	  checked_mpz.inlines.hh (1.38), checked_numeric_limits.hh (1.14):
+	  Renamed store_{nan,infinity} to handle_{nan,infinity}
+
+2006-02-23 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.224), demos/ppl_lcdd/Makefile.am (1.23),
+	  m4/ac_text_md5sum.m4 (1.1): New function to set the command for
+	  computing the MD5 checksum of text files.  Old (not working)
+	  kludges to do the same thing have been removed.
+
+2006-02-23 Thursday 07:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: affinedim1.cc (1.6), bounded1.cc (1.7), bounds1.cc
+	  (1.7): Never let an operator close a source line.  Avoid useless
+	  parentheses.
+
+2006-02-22 Wednesday 23:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: asciidumpload1.cc (1.4), bounded1.cc (1.6),
+	  boundingbox1.cc (1.5), boundingbox2.cc (1.5), bounds1.cc (1.6):
+	  Revised tests following new guidelines.
+
+2006-02-22 Wednesday 20:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.17), affineimage2.cc (1.1),
+	  affinepreimage2.cc (1.1): Test files added due to reorganisation
+	  of tests.
+
+2006-02-22 Wednesday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (1.16): The test program
+	  affinepreimage2.cc does not exist anymore.
+
+2006-02-22 Wednesday 19:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (1.15): The test program affineimage2.cc
+	  does not exist anymore.
+
+2006-02-22 Wednesday 12:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.14), addcongruences1.cc (1.8),
+	  addconstraint1.cc (1.6), addconstraints1.cc (1.6),
+	  addgenerator1.cc (1.8), addgenerators1.cc (1.4), addspacedims1.cc
+	  (1.7), addspacedims2.cc (1.7), affinedim1.cc (1.5),
+	  affineimage1.cc (1.8), affineimage1_16.cc (1.4),
+	  affinepreimage1.cc (1.6), generalizedaffineimage1.cc (1.6),
+	  generalizedaffineimage2.cc (1.6), generalizedaffinepreimage1.cc
+	  (1.7), generalizedaffinepreimage2.cc (1.7), widening1.cc (1.7):
+	  Revised tests following new guidelines.
+
+2006-02-22 Wednesday 11:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.39), run_tests (1.16): Test with
+	  valgrind also in the tests/BD_Shape directory.
+
+2006-02-22 Wednesday 11:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/valgrind_suppressions (1.4): Ignore warnings originating
+	  from /usr/bin/make.
+
+2006-02-22 Wednesday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.51): Path fixed.
+
+2006-02-22 Wednesday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.30): Removed wrong std:: qualification.
+
+2006-02-22 Wednesday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: valgrind_suppressions (1.3), Grid/Makefile.am (1.13),
+	  Polyhedron/Makefile.am (1.50), Polyhedron/valgrind_suppressions
+	  (1.3): Support valgrind testing also in the Grid directory.
+	  Share a single copy of valgrind_suppressions.
+
+2006-02-22 Wednesday 07:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.29): Print to nout by default, not to cout.
+
+2006-02-21 Tuesday 21:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (1.12): Avoid doing what Automake does by
+	  itself.
+
+2006-02-21 Tuesday 19:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.223): On the Alpha, use the appropriate compiler
+	  options in order to obtain support for ANSI/IEEE 754-1985
+	  floating point numbers.
+
+2006-02-21 Tuesday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.9): Exit immediately with error if
+	  the impossible happens.
+
+2006-02-21 Tuesday 16:48  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[32,24]):
+	  Documentation improved.  Header's `parse_constraints' variables
+	  modified to match the ones in LP_Problem.cc.
+
+2006-02-20 Monday 23:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (1.4): Try harder to be informative in case
+	  SIGFPE is raised.
+
+2006-02-20 Monday 23:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.inlines.hh (1.12): Struct fenv_t renamed
+	  ia32_fenv_t.
+
+2006-02-20 Monday 20:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_Expression.defs.hh (1.21),
+	  Linear_Expression.inlines.hh (1.7): Use vertical spacing to avoid
+	  clutter.  Do not expose implementation details.  Improve
+	  const-correctness.
+
+2006-02-20 Monday 14:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (1.5): Remove unwanted comment.
+
+2006-02-20 Monday 14:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (1.3): Be more informative when the signal code
+	  is unknown.
+
+2006-02-20 Monday 14:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: print.cc (1.23), print.hh (1.28): Added
+	  print_generators() for grids.
+
+2006-02-20 Monday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addcongruence1.cc (1.6): Use spacing consistently.
+
+2006-02-20 Monday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.253), ehandlers.cc (1.9), ehandlers.hh
+	  (1.14), ppl_test.cc (1.2), ppl_test.hh (1.39): Source files
+	  ehandlers.* phased out.  Drafted a new SIGFPE handler that every
+	  test installs to help debugging.
+
+2006-02-20 Monday 13:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/addcongruence1.cc (1.5): Added test that showed a bug
+	  in add_congruence_and_minimize(), which is now fixed.
+
+	  All tests here revised to be in the new format.
+
+2006-02-20 Monday 13:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc (1.4), Grid_public.cc (1.10): Changed
+	  add_recycled_congruence_and_minimize() to use recycling_insert()
+	  when adding a congruence.
+
+	  Corrected insert() in Congruence_System.cc so as to correctly
+	  deal with the case that the dimensions of the congruence system
+	  to be added are less than that of *this.
+
+2006-02-19 Sunday 22:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.222): Added Automake conditionals to reflect the
+	  status of shared and static libraries.
+
+2006-02-19 Sunday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.27), checked.cc (1.17), checked_mpq.inlines.hh
+	  (1.33): Finished the implementation of rational square root
+	  calculations.  The precision parameter is now passed and returned
+	  as an unsigned.  The
+	  set_rational_sqrt_precision_parameter(unsigned p) function throws
+	  an exception if `p' is too big.
+
+2006-02-19 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.26), checked.cc (1.16), checked_mpq.inlines.hh
+	  (1.32): New functions void
+	  set_rational_sqrt_precision_parameter(const mpz_class& p) and
+	  mpz_class rational_sqrt_precision_parameter() to set and obtain
+	  the the precision parameter (to be) used for rational sqrt
+	  calculations.
+
+2006-02-19 Sunday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (1.37): Avoid long source lines.
+	  Prefer preincrement and predecrement to postincrement and
+	  postdecrement.
+
+2006-02-19 Sunday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (1.36): No longer include <cmath>.
+
+2006-02-19 Sunday 13:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.63): Do not use the fma(), fmaf()
+	  and fmal() library functions on Alphas, since we cannot guarantee
+	  the library has been compiled with the flags that ensure
+	  controlled rounding is working.
+
+2006-02-19 Sunday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.221): On Alpha chips, support for controlled
+	  rounding is only available if code is compiled to use dynamic
+	  rounding (/d) instructions.  With GCC this can be achieved with
+	  the `-mfp-rounding-mode=d' compiler options;	other compilers are
+	  said to require the `-fprm d' option.
+
+2006-02-19 Sunday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.defs.hh (1.11): Use more standard macros to implement the
+	  switch on the architecture.
+
+2006-02-18 Saturday 07:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am (1.7), src/Makefile.am (1.149): Do not
+	  distribute ppl_include_files.hh and pwl_include_files.hh.  Now
+	  ppl.hh and pwl.hh installation can be completely delegated to
+	  Automake.
+
+2006-02-17 Friday 21:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/float.types.hh (1.16): Fixed nested #if's.
+
+2006-02-15 Wednesday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: print.cc (1.22), print.hh (1.27): Added
+	  print_congruences(const Congruence_System&, const string&,
+	  ostream&) and print_congruences(const Grid&, const string&,
+	  ostream&).
+
+2006-02-15 Wednesday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/maxspacedim.cc (1.12): Trailing blanks removed.
+
+2006-02-15 Wednesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.38), addconstraints1.cc (1.10),
+	  affineimage1.cc (1.11), affinepreimage1.cc (1.11),
+	  bdsdifference1.cc (1.7), bdshull1.cc (1.7), bhmz05widening1.cc
+	  (1.6), cc76extrapolation1.cc (1.10), cc76narrowing1.cc (1.11),
+	  contains1.cc (1.9), exceptions1.cc (1.13), exceptions2.cc (1.12),
+	  exceptions3.cc (1.13), generalizedaffineimage2.cc (1.12),
+	  intersection1.cc (1.10), limitedbhmz05extrapolation1.cc (1.6),
+	  limitedcc76extrapolation1.cc (1.6), relations2.cc (1.14),
+	  relations3.cc (1.12), removespacedims1.cc (1.11), timeelapse1.cc
+	  (1.10): Tests for exceptional cases moved to the appropriate test
+	  programs.
+
+2006-02-15 Wednesday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.37), generalizedaffineimage1.cc
+	  (1.12), generalizedaffineimage2.cc (1.11),
+	  generalizedaffineimage3.cc (1.12): All the tests for
+	  BD_Shape::generalized_affine_preimage() are now in
+	  generalizedaffineimage1.cc and generalizedaffineimage2.cc.
+
+2006-02-15 Wednesday 14:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/addspacedims2.cc (1.11): This is no longer
+	  necessary (all its tests are now in addspacedims1.cc).
+
+2006-02-15 Wednesday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.15): Test also with long doubles.
+
+2006-02-15 Wednesday 12:16  Andrea Cimino
+
+	* TODO (simplex.2): Added one item.  Provide a better
+	  implementation of computing squares.
+
+2006-02-15 Wednesday 12:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: addconstraints1.cc (1.9), addspacedims1.cc
+	  (1.10), addspacedims2.cc (1.10), affinedimension1.cc (1.6),
+	  affineimage1.cc (1.10), affineimage2.cc (1.10),
+	  affinepreimage1.cc (1.10), affinepreimage2.cc (1.10),
+	  ascii_dump_load1.cc (1.11), bdsdifference1.cc (1.6), bdshull1.cc
+	  (1.6), bgp99extrapolation1.cc (1.5), bhmz05widening1.cc (1.5),
+	  bhz03widening1.cc (1.5), cc76extrapolation1.cc (1.9),
+	  cc76narrowing1.cc (1.10), closure1.cc (1.13), concatenate1.cc
+	  (1.10), constraints1.cc (1.13), contains1.cc (1.8), empty1.cc
+	  (1.8), equality1.cc (1.13), exceptions1.cc (1.12), exceptions2.cc
+	  (1.11), exceptions3.cc (1.12), fromgensys1.cc (1.10),
+	  generalizedaffineimage1.cc (1.11), generalizedaffineimage2.cc
+	  (1.10), generalizedaffineimage3.cc (1.11),
+	  generalizedaffinepreimage1.cc (1.11),
+	  generalizedaffinepreimage2.cc (1.8), geomcovers1.cc (1.5),
+	  h79widening1.cc (1.9), intersection1.cc (1.9),
+	  limitedbhmz05extrapolation1.cc (1.5),
+	  limitedcc76extrapolation1.cc (1.5), limitedh79extrapolation1.cc
+	  (1.9), mapspacedims1.cc (1.10), maxspacedim.cc (1.11),
+	  minconstraints1.cc (1.5), relations1.cc (1.13), relations2.cc
+	  (1.13), removespacedims1.cc (1.10), timeelapse1.cc (1.9),
+	  universe1.cc (1.10), writebdshape1.cc (1.6): All test functions
+	  have now a name matching `test[012][1234567890]'.
+
+2006-02-15 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.252), Partial_Function.cc (1.2),
+	  Partial_Function.defs.hh (1.2), ppl_test.cc (1.1), ppl_test.hh
+	  (1.38), print.cc (1.21), BD_Shape/Makefile.am (1.36),
+	  BD_Shape/addconstraints1.cc (1.8), BD_Shape/addspacedims1.cc
+	  (1.9), BD_Shape/addspacedims2.cc (1.9), BD_Shape/addspacedims3.cc
+	  (1.9), BD_Shape/addspacedims4.cc (1.9), BD_Shape/addspacedims5.cc
+	  (1.12), BD_Shape/addspacedims6.cc (1.12),
+	  BD_Shape/addspacedims7.cc (1.8), BD_Shape/affinedimension1.cc
+	  (1.5), BD_Shape/affineimage1.cc (1.9), BD_Shape/affineimage10.cc
+	  (1.8), BD_Shape/affineimage2.cc (1.9), BD_Shape/affineimage3.cc
+	  (1.9), BD_Shape/affineimage4.cc (1.9), BD_Shape/affineimage5.cc
+	  (1.9), BD_Shape/affineimage6.cc (1.9), BD_Shape/affineimage7.cc
+	  (1.9), BD_Shape/affineimage8.cc (1.15), BD_Shape/affineimage9.cc
+	  (1.13), BD_Shape/affinepreimage1.cc (1.9),
+	  BD_Shape/affinepreimage2.cc (1.9), BD_Shape/affinepreimage3.cc
+	  (1.9), BD_Shape/affinepreimage4.cc (1.9),
+	  BD_Shape/affinepreimage5.cc (1.10), BD_Shape/ascii_dump_load1.cc
+	  (1.10), BD_Shape/ascii_dump_load2.cc (1.10),
+	  BD_Shape/bdsdifference1.cc (1.5), BD_Shape/bdsdifference2.cc
+	  (1.5), BD_Shape/bdsdifference3.cc (1.5),
+	  BD_Shape/bdsdifference4.cc (1.5), BD_Shape/bdsdifference5.cc
+	  (1.5), BD_Shape/bdsdifference6.cc (1.5),
+	  BD_Shape/bdsdifference7.cc (1.5), BD_Shape/bdshull1.cc (1.5),
+	  BD_Shape/bdshull2.cc (1.5), BD_Shape/bdshull3.cc (1.5),
+	  BD_Shape/bdshull4.cc (1.5), BD_Shape/bgp99extrapolation1.cc
+	  (1.4), BD_Shape/bhmz05widening1.cc (1.4),
+	  BD_Shape/bhmz05widening2.cc (1.4), BD_Shape/bhmz05widening3.cc
+	  (1.4), BD_Shape/bhmz05widening4.cc (1.4),
+	  BD_Shape/bhmz05widening5.cc (1.4), BD_Shape/bhmz05widening6.cc
+	  (1.4), BD_Shape/bhmz05widening7.cc (1.4),
+	  BD_Shape/bhmz05widening8.cc (1.4), BD_Shape/bhz03widening1.cc
+	  (1.4), BD_Shape/cc76extrapolation1.cc (1.8),
+	  BD_Shape/cc76extrapolation2.cc (1.9),
+	  BD_Shape/cc76extrapolation3.cc (1.8),
+	  BD_Shape/cc76extrapolation4.cc (1.11),
+	  BD_Shape/cc76extrapolation5.cc (1.8),
+	  BD_Shape/cc76extrapolation6.cc (1.9), BD_Shape/cc76narrowing1.cc
+	  (1.9), BD_Shape/cc76narrowing2.cc (1.9),
+	  BD_Shape/cc76narrowing3.cc (1.9), BD_Shape/cc76narrowing4.cc
+	  (1.10), BD_Shape/cc76narrowing5.cc (1.10), BD_Shape/closure1.cc
+	  (1.12), BD_Shape/concatenate1.cc (1.9), BD_Shape/concatenate2.cc
+	  (1.9), BD_Shape/concatenate3.cc (1.8), BD_Shape/concatenate4.cc
+	  (1.8), BD_Shape/concatenate5.cc (1.9), BD_Shape/constraints1.cc
+	  (1.12), BD_Shape/constraints2.cc (1.9), BD_Shape/contains1.cc
+	  (1.7), BD_Shape/contains2.cc (1.9), BD_Shape/contains3.cc (1.9),
+	  BD_Shape/empty1.cc (1.7), BD_Shape/empty2.cc (1.7),
+	  BD_Shape/empty3.cc (1.8), BD_Shape/empty4.cc (1.7),
+	  BD_Shape/empty5.cc (1.7), BD_Shape/equality1.cc (1.12),
+	  BD_Shape/exceptions1.cc (1.11), BD_Shape/exceptions2.cc (1.10),
+	  BD_Shape/exceptions3.cc (1.11), BD_Shape/fromgensys1.cc (1.9),
+	  BD_Shape/generalizedaffineimage1.cc (1.10),
+	  BD_Shape/generalizedaffineimage10.cc (1.9),
+	  BD_Shape/generalizedaffineimage11.cc (1.8),
+	  BD_Shape/generalizedaffineimage12.cc (1.8),
+	  BD_Shape/generalizedaffineimage13.cc (1.9),
+	  BD_Shape/generalizedaffineimage14.cc (1.13),
+	  BD_Shape/generalizedaffineimage2.cc (1.9),
+	  BD_Shape/generalizedaffineimage3.cc (1.10),
+	  BD_Shape/generalizedaffineimage4.cc (1.9),
+	  BD_Shape/generalizedaffineimage5.cc (1.9),
+	  BD_Shape/generalizedaffineimage6.cc (1.9),
+	  BD_Shape/generalizedaffineimage7.cc (1.9),
+	  BD_Shape/generalizedaffineimage8.cc (1.9),
+	  BD_Shape/generalizedaffineimage9.cc (1.8),
+	  BD_Shape/generalizedaffinepreimage1.cc (1.10),
+	  BD_Shape/generalizedaffinepreimage2.cc (1.7),
+	  BD_Shape/geomcovers1.cc (1.4), BD_Shape/h79widening1.cc (1.8),
+	  BD_Shape/intersection1.cc (1.8), BD_Shape/intersection2.cc (1.8),
+	  BD_Shape/intersection3.cc (1.9), BD_Shape/intersection4.cc
+	  (1.10), BD_Shape/intersection5.cc (1.10),
+	  BD_Shape/intersection6.cc (1.9), BD_Shape/intersection7.cc (1.9),
+	  BD_Shape/intersection8.cc (1.9),
+	  BD_Shape/limitedbhmz05extrapolation1.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation2.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation3.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation4.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation5.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation6.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation7.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation8.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation9.cc (1.4),
+	  BD_Shape/limitedcc76extrapolation1.cc (1.4),
+	  BD_Shape/limitedcc76extrapolation2.cc (1.5),
+	  BD_Shape/limitedcc76extrapolation3.cc (1.5),
+	  BD_Shape/limitedh79extrapolation1.cc (1.8),
+	  BD_Shape/mapspacedims1.cc (1.9), BD_Shape/mapspacedims2.cc
+	  (1.12), BD_Shape/mapspacedims3.cc (1.10),
+	  BD_Shape/mapspacedims4.cc (1.10), BD_Shape/maxspacedim.cc (1.10),
+	  BD_Shape/minconstraints1.cc (1.4), BD_Shape/relations1.cc (1.12),
+	  BD_Shape/relations2.cc (1.12), BD_Shape/relations3.cc (1.11),
+	  BD_Shape/relations4.cc (1.10), BD_Shape/relations5.cc (1.12),
+	  BD_Shape/removespacedims1.cc (1.9), BD_Shape/removespacedims2.cc
+	  (1.11), BD_Shape/removespacedims3.cc (1.11),
+	  BD_Shape/timeelapse1.cc (1.8), BD_Shape/timeelapse2.cc (1.8),
+	  BD_Shape/timeelapse3.cc (1.8), BD_Shape/timeelapse4.cc (1.8),
+	  BD_Shape/timeelapse5.cc (1.9), BD_Shape/universe1.cc (1.9),
+	  BD_Shape/writebdshape1.cc (1.5), BD_Shape/writebdshape2.cc (1.6):
+	  Started renovation of the testsuite: number of test programs
+	  drastically reduced; all programs have now the very same
+	  structure; non-exceptions failure of one test does prevent the
+	  other tests to be run.  Several tests have also been fixed.
+
+2006-02-15 Wednesday 09:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.49): dualhypercubes also fails
+	  (due to overflow) for checked 64 bits integers, due to the
+	  steepest-edge implementation in the primal simplex.
+
+2006-02-15 Wednesday 09:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.41): Spcialization of
+	  poly_difference_assign() and check_containment() are now placed
+	  in the same namespace as their declarations.
+
+2006-02-14 Tuesday 21:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (1.9): Adapted the
+	  expected result of test12() to the precision obtained on the
+	  SPARC.
+
+2006-02-14 Tuesday 15:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: ppl_test.hh (1.37), Grid/Makefile.am (1.11): Tests in
+	  Makefile.am are ordered alphabetically.  Added "const" to the
+	  parameters in copy_compare() in ppl_test.hh.
+
+2006-02-14 Tuesday 15:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc (1.3), Grid_Generator_System.cc (1.3),
+	  Grid_Generator_System.defs.hh (1.9): Added assert(OK()) to four
+	  methods in Congruence_System.cc Corrected a cut-and-paste error
+	  in Grid_Generator_System.cc Improved a comment in
+	  Grid_Generator_System.defs.hh.
+
+2006-02-14 Tuesday 13:40  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.60): More correct implementation
+	  for exact_div.
+
+2006-02-14 Tuesday 13:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.71), GMP_Integer.defs.hh (1.21),
+	  GMP_Integer.inlines.hh (1.15): Specify that the behavior of
+	  exact_div_assign(x, y, z) is undefined if `z' does not divide
+	  `y'.	This condition is asserted in the GMP_Integer
+	  implementation.
+
+2006-02-14 Tuesday 09:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (1.6): Corrected.
+
+2006-02-13 Monday 21:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffineimage6.cc (1.8): Corrected a
+	  known result.
+
+2006-02-13 Monday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.251), PFunction.cc (1.9), PFunction.hh
+	  (1.9), Partial_Function.cc (1.1), Partial_Function.defs.hh (1.1),
+	  Partial_Function.inlines.hh (1.1), Partial_Function.types.hh
+	  (1.1), ppl_test.hh (1.36), print.cc (1.20), print.hh (1.26),
+	  BD_Shape/mapspacedims1.cc (1.8), BD_Shape/mapspacedims2.cc
+	  (1.11), BD_Shape/mapspacedims3.cc (1.9),
+	  BD_Shape/mapspacedims4.cc (1.9), Grid/mapspacedims1.cc (1.6),
+	  Polyhedron/mapspacedims1.cc (1.9), Polyhedron/mapspacedims2.cc
+	  (1.7), Polyhedron/mapspacedims3.cc (1.7),
+	  Polyhedron/mapspacedims4.cc (1.7): Class PFunction renamed
+	  Partial_Function and implemented consistently.  Avoided code
+	  duplication for print_function().
+
+2006-02-13 Monday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-sparc.inlines.hh (1.5): Definitions of FPU_UPWARD and
+	  FPU_DOWNWARD fixed.
+
+2006-02-13 Monday 19:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: addconstraints1.cc (1.7), addspacedims1.cc
+	  (1.8), addspacedims2.cc (1.8), addspacedims5.cc (1.11),
+	  addspacedims6.cc (1.11), affineimage1.cc (1.8), affineimage10.cc
+	  (1.7), affineimage2.cc (1.8), affineimage3.cc (1.8),
+	  affineimage4.cc (1.8), affineimage5.cc (1.8), affineimage6.cc
+	  (1.8), affineimage7.cc (1.8), affinepreimage1.cc (1.8),
+	  affinepreimage2.cc (1.8), affinepreimage3.cc (1.8),
+	  affinepreimage4.cc (1.8), bdsdifference1.cc (1.4),
+	  bdsdifference2.cc (1.4), bdsdifference3.cc (1.4),
+	  bdsdifference4.cc (1.4), bdsdifference5.cc (1.4),
+	  bdsdifference6.cc (1.4), bdsdifference7.cc (1.4), bdshull1.cc
+	  (1.4), bdshull2.cc (1.4), bdshull3.cc (1.4), bdshull4.cc (1.4),
+	  bhmz05widening1.cc (1.3), bhmz05widening2.cc (1.3),
+	  bhmz05widening3.cc (1.3), bhmz05widening4.cc (1.3),
+	  bhmz05widening5.cc (1.3), bhmz05widening6.cc (1.3),
+	  bhmz05widening7.cc (1.3), bhmz05widening8.cc (1.3),
+	  cc76extrapolation1.cc (1.7), cc76extrapolation2.cc (1.8),
+	  cc76extrapolation3.cc (1.7), cc76extrapolation4.cc (1.10),
+	  cc76extrapolation5.cc (1.7), cc76narrowing1.cc (1.8),
+	  cc76narrowing2.cc (1.8), cc76narrowing3.cc (1.8),
+	  cc76narrowing4.cc (1.9), cc76narrowing5.cc (1.9), concatenate1.cc
+	  (1.8), concatenate2.cc (1.8), concatenate3.cc (1.7),
+	  concatenate4.cc (1.7), concatenate5.cc (1.8), constraints1.cc
+	  (1.11), constraints2.cc (1.8), equality1.cc (1.11),
+	  fromgensys1.cc (1.8), generalizedaffineimage1.cc (1.9),
+	  generalizedaffineimage10.cc (1.8), generalizedaffineimage11.cc
+	  (1.7), generalizedaffineimage12.cc (1.7),
+	  generalizedaffineimage14.cc (1.12), generalizedaffineimage2.cc
+	  (1.8), generalizedaffineimage3.cc (1.9),
+	  generalizedaffineimage4.cc (1.8), generalizedaffineimage5.cc
+	  (1.8), generalizedaffineimage6.cc (1.7),
+	  generalizedaffineimage7.cc (1.8), generalizedaffineimage8.cc
+	  (1.8), generalizedaffineimage9.cc (1.7),
+	  generalizedaffinepreimage2.cc (1.5), h79widening1.cc (1.7),
+	  intersection1.cc (1.7), intersection2.cc (1.7), intersection3.cc
+	  (1.8), intersection4.cc (1.9), intersection5.cc (1.9),
+	  intersection6.cc (1.8), intersection7.cc (1.8), intersection8.cc
+	  (1.8), limitedbhmz05extrapolation1.cc (1.3),
+	  limitedbhmz05extrapolation2.cc (1.3),
+	  limitedbhmz05extrapolation3.cc (1.3),
+	  limitedbhmz05extrapolation4.cc (1.3),
+	  limitedbhmz05extrapolation5.cc (1.3),
+	  limitedbhmz05extrapolation6.cc (1.3),
+	  limitedbhmz05extrapolation7.cc (1.3),
+	  limitedbhmz05extrapolation8.cc (1.3),
+	  limitedbhmz05extrapolation9.cc (1.3),
+	  limitedcc76extrapolation1.cc (1.3), limitedcc76extrapolation2.cc
+	  (1.4), limitedcc76extrapolation3.cc (1.4),
+	  limitedh79extrapolation1.cc (1.7), mapspacedims1.cc (1.7),
+	  mapspacedims2.cc (1.10), mapspacedims3.cc (1.8), mapspacedims4.cc
+	  (1.8), removespacedims1.cc (1.8), removespacedims2.cc (1.10),
+	  removespacedims3.cc (1.10), timeelapse2.cc (1.7), timeelapse3.cc
+	  (1.7), timeelapse4.cc (1.7), timeelapse5.cc (1.8): Use
+	  BD_Shape<mpq_class> to encode the known results.  Use
+	  check_result() to compare the known result with computed ones
+	  when there might be approximations due to rounding.
+
+2006-02-13 Monday 19:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.66), BD_Shape.templates.hh (1.2): When
+	  building a BD_Shape from a generator system, we should throw an
+	  exception if the system is non-empty but has no points.
+
+2006-02-13 Monday 14:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.220): Version number bumped.
+
+2006-02-13 Monday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.65): Instruct spld to
+	  pass the right options to the linker.
+
+2006-02-13 Monday 14:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.53): Instruct gplc to pass
+	  the right options to the linker.
+
+2006-02-13 Monday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.60): Instruct plld to pass
+	  the right options to the linker (that is, to the C++ compiler).
+
+2006-02-13 Monday 14:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage8.cc (1.14), affineimage9.cc (1.12),
+	  affinepreimage5.cc (1.9), generalizedaffineimage13.cc (1.8),
+	  generalizedaffinepreimage1.cc (1.8): Corrected and standardized
+	  as suggested by Roberto the way we compare the computed and known
+	  results.
+
+2006-02-13 Monday 13:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.183), src/Grid.defs.hh (1.10), src/Grid_public.cc (1.9),
+	  tests/Grid/Makefile.am (1.10), tests/Grid/discrete1.cc (1.1),
+	  tests/Grid/pointed1.cc (1.6): Removed a todo item regarding
+	  missing operators for grids.	Renamed method is_pointed() by
+	  is_discrete().  Changed name of test for this method to match
+	  change of name.
+
+2006-02-13 Monday 11:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/LP_Problem3.cc (1.7): Removed.
+
+2006-02-13 Monday 11:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.32): Explain the new mechanism to obtain noisy
+	  and/or very noisy behavior from test programs.
+
+2006-02-13 Monday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in (1.69), doc/devref.doxyconf-latex.in
+	  (1.10), src/Makefile.am (1.148), src/Polyhedron.defs.hh (1.294),
+	  src/Polyhedron.inlines.hh (1.131), src/Polyhedron.templates.hh
+	  (1.1): New file Polyhedron.templates.hh contains non-inline
+	  template functions of the implementation of class Polyhedron.
+
+2006-02-13 Monday 10:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: addconstraint3.cc (1.7), addgenerator3.cc
+	  (1.7), addspacedims13.cc (1.7), affineimage5.cc (1.8), append1.cc
+	  (1.7), generators1.cc (1.7), generators2.cc (1.7), powerset1.cc
+	  (1.11), writerelation1.cc (1.8): Removed useless invocations to
+	  the OK() methods.
+
+2006-02-13 Monday 10:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.182): Added one item for PPL 0.9.
+
+2006-02-13 Monday 10:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.181): Added an (urgent) item concerning the use of OK()
+	  methods.
+
+2006-02-13 Monday 10:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.180): Pushed several items to PPL 0.10.
+
+2006-02-13 Monday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-pwl.copyright.in (1.3), debian/libppl.copyright.in
+	  (1.3), src/Grid_Generator.cc (1.3), tests/Grid/Makefile.am (1.9),
+	  tests/Grid/addcongruence1.cc (1.4), tests/Grid/addcongruences1.cc
+	  (1.7), tests/Grid/addconstraint1.cc (1.5),
+	  tests/Grid/addconstraints1.cc (1.5), tests/Grid/addgenerator1.cc
+	  (1.7), tests/Grid/addgenerators1.cc (1.3),
+	  tests/Grid/addspacedims1.cc (1.6), tests/Grid/addspacedims2.cc
+	  (1.6), tests/Grid/affinedim1.cc (1.4), tests/Grid/affineimage1.cc
+	  (1.7), tests/Grid/affineimage1_16.cc (1.3),
+	  tests/Grid/affinepreimage1.cc (1.5), tests/Grid/asciidumpload1.cc
+	  (1.3), tests/Grid/bhz03widening1.cc (1.4), tests/Grid/bounded1.cc
+	  (1.5), tests/Grid/boundingbox1.cc (1.4),
+	  tests/Grid/boundingbox2.cc (1.4), tests/Grid/bounds1.cc (1.5),
+	  tests/Grid/certificate1.cc (1.6), tests/Grid/concatenate1.cc
+	  (1.6), tests/Grid/congruence1.cc (1.6),
+	  tests/Grid/congruences1.cc (1.4), tests/Grid/congruencesystem1.cc
+	  (1.4), tests/Grid/congruencesystem2.cc (1.4),
+	  tests/Grid/contains1.cc (1.5), tests/Grid/contains2.cc (1.4),
+	  tests/Grid/copyconstruct1.cc (1.4), tests/Grid/coveringbox1.cc
+	  (1.4), tests/Grid/coveringbox2.cc (1.4), tests/Grid/disjoint1.cc
+	  (1.5), tests/Grid/equals1.cc (1.5), tests/Grid/expandspacedim1.cc
+	  (1.5), tests/Grid/foldspacedims1.cc (1.5),
+	  tests/Grid/generalizedaffineimage1.cc (1.5),
+	  tests/Grid/generalizedaffineimage2.cc (1.5),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.6),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.6),
+	  tests/Grid/generator1.cc (1.4), tests/Grid/generators1.cc (1.6),
+	  tests/Grid/grid1.cc (1.9), tests/Grid/grid1_16.cc (1.6),
+	  tests/Grid/grid1_64.cc (1.4), tests/Grid/grid1_gmp.cc (1.4),
+	  tests/Grid/grid2.cc (1.7), tests/Grid/grid2_16.cc (1.4),
+	  tests/Grid/grid3.cc (1.6), tests/Grid/griddifference1.cc (1.6),
+	  tests/Grid/intersection1.cc (1.5), tests/Grid/intersection2.cc
+	  (1.4), tests/Grid/isempty1.cc (1.3), tests/Grid/isuniverse1.cc
+	  (1.6), tests/Grid/join1.cc (1.8), tests/Grid/join1_16.cc (1.3),
+	  tests/Grid/join2.cc (1.4), tests/Grid/join3.cc (1.6),
+	  tests/Grid/limitedextrapolation1.cc (1.5),
+	  tests/Grid/mapspacedims1.cc (1.5), tests/Grid/maxmin1.cc (1.4),
+	  tests/Grid/membytes1.cc (1.3), tests/Grid/membytes2.cc (1.3),
+	  tests/Grid/mincongruences1.cc (1.5), tests/Grid/mingenerators1.cc
+	  (1.5), tests/Grid/outputoperator1.cc (1.3),
+	  tests/Grid/pointed1.cc (1.5), tests/Grid/relations1.cc (1.7),
+	  tests/Grid/relations2.cc (1.6), tests/Grid/removespacedims1.cc
+	  (1.5), tests/Grid/removespacedims2.cc (1.5),
+	  tests/Grid/timeelapse1.cc (1.5), tests/Grid/timeelapse2.cc (1.4),
+	  tests/Grid/topclosed1.cc (1.5), tests/Grid/topclosure1.cc (1.4),
+	  tests/Grid/widening1.cc (1.6),
+	  tests/Grid/writecongruencesystem.cc (1.3),
+	  tests/Polyhedron/addcongruence1.cc (1.4),
+	  tests/Polyhedron/addcongruence2.cc (1.4),
+	  tests/Polyhedron/addcongruence3.cc (1.4),
+	  tests/Polyhedron/addcongruence4.cc (1.4),
+	  tests/Polyhedron/addcongruence5.cc (1.4),
+	  tests/Polyhedron/addcongruences1.cc (1.5),
+	  tests/Polyhedron/addcongruences2.cc (1.4),
+	  tests/Polyhedron/addcongruences3.cc (1.4),
+	  tests/Polyhedron/addcongruences4.cc (1.4),
+	  tests/Polyhedron/addcongruences5.cc (1.4),
+	  tests/Polyhedron/congruences1.cc (1.4): Copyright years made
+	  consistent across the entire library.
+
+2006-02-13 Monday 08:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/ppl_test.hh (1.35): "const" added in copy_compare().
+
+2006-02-13 Monday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/randphull1.cc (1.9): Added missing semicolons.
+
+2006-02-13 Monday 07:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.sty (1.25): Added new command \Sset.
+
+2006-02-13 Monday 07:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/addcongruences1.cc (1.4): Old bug fixed.
+
+2006-02-12 Sunday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mapspacedims1.cc (1.4): No longer use the NOISY macro.
+
+2006-02-12 Sunday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: LP_Problem3.cc (1.6), lpproblem1.cc (1.5),
+	  lpproblem2.cc (1.4): Comments improved.  Copyright notice fixed.
+
+2006-02-12 Sunday 22:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: LP_Problem3.cc (1.5), addcongruence1.cc (1.3),
+	  addcongruence2.cc (1.3), addcongruence3.cc (1.3),
+	  addcongruence4.cc (1.3), addcongruence5.cc (1.3),
+	  addcongruences1.cc (1.3), addcongruences2.cc (1.3),
+	  addcongruences3.cc (1.3), addcongruences4.cc (1.3),
+	  addcongruences5.cc (1.3), bug2.cc (1.6), congruences1.cc (1.3),
+	  dualhypercubes.cc (1.7), numberinput1.cc (1.25), randphull1.cc
+	  (1.8): No longer use the NOISY or VERY_NOISY macro in test
+	  programs.
+
+2006-02-12 Sunday 22:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.25): check_noisy() is now (temporarily)
+	  declared static.
+
+2006-02-12 Sunday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.24): Noisy and very noisy test output properly
+	  implemented: now the `nout' and `vnout' ostream are controlled by
+	  the `PPL_NOISY_TESTS' and `PPL_VERY_NOISY_TESTS' environment
+	  variables.
+
+2006-02-12 Sunday 20:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/addspacedims5.cc (1.10),
+	  BD_Shape/addspacedims6.cc (1.10), BD_Shape/affinedimension1.cc
+	  (1.4), BD_Shape/affineimage10.cc (1.6), BD_Shape/affineimage9.cc
+	  (1.11), BD_Shape/affinepreimage5.cc (1.8),
+	  BD_Shape/ascii_dump_load2.cc (1.9),
+	  BD_Shape/cc76extrapolation4.cc (1.9), BD_Shape/constraints1.cc
+	  (1.10), BD_Shape/equality1.cc (1.10), BD_Shape/fromgensys1.cc
+	  (1.7), BD_Shape/generalizedaffineimage13.cc (1.7),
+	  BD_Shape/generalizedaffineimage14.cc (1.11),
+	  BD_Shape/generalizedaffinepreimage1.cc (1.7),
+	  BD_Shape/generalizedaffinepreimage2.cc (1.4),
+	  BD_Shape/limitedcc76extrapolation2.cc (1.3),
+	  BD_Shape/limitedcc76extrapolation3.cc (1.3),
+	  BD_Shape/mapspacedims2.cc (1.9), BD_Shape/relations1.cc (1.11),
+	  BD_Shape/relations2.cc (1.11), BD_Shape/relations3.cc (1.10),
+	  BD_Shape/relations4.cc (1.9), BD_Shape/relations5.cc (1.11),
+	  BD_Shape/removespacedims2.cc (1.9), BD_Shape/removespacedims3.cc
+	  (1.9), Grid/addcongruence1.cc (1.3), Grid/addcongruences1.cc
+	  (1.6), Grid/addconstraint1.cc (1.4), Grid/addconstraints1.cc
+	  (1.4), Grid/addgenerator1.cc (1.6), Grid/addgenerators1.cc (1.2),
+	  Grid/addspacedims1.cc (1.5), Grid/addspacedims2.cc (1.5),
+	  Grid/affinedim1.cc (1.3), Grid/affineimage1.cc (1.6),
+	  Grid/affineimage1_16.cc (1.2), Grid/affinepreimage1.cc (1.4),
+	  Grid/asciidumpload1.cc (1.2), Grid/bhz03widening1.cc (1.3),
+	  Grid/bounded1.cc (1.4), Grid/boundingbox1.cc (1.3),
+	  Grid/boundingbox2.cc (1.3), Grid/bounds1.cc (1.4),
+	  Grid/certificate1.cc (1.5), Grid/concatenate1.cc (1.5),
+	  Grid/congruence1.cc (1.5), Grid/congruences1.cc (1.3),
+	  Grid/congruencesystem1.cc (1.3), Grid/congruencesystem2.cc (1.3),
+	  Grid/contains1.cc (1.4), Grid/contains2.cc (1.3),
+	  Grid/copyconstruct1.cc (1.3), Grid/coveringbox1.cc (1.3),
+	  Grid/coveringbox2.cc (1.3), Grid/disjoint1.cc (1.4),
+	  Grid/equals1.cc (1.4), Grid/expandspacedim1.cc (1.4),
+	  Grid/foldspacedims1.cc (1.4), Grid/generalizedaffineimage1.cc
+	  (1.4), Grid/generalizedaffineimage2.cc (1.4),
+	  Grid/generalizedaffinepreimage1.cc (1.5),
+	  Grid/generalizedaffinepreimage2.cc (1.5), Grid/generator1.cc
+	  (1.3), Grid/generators1.cc (1.5), Grid/grid1.cc (1.8),
+	  Grid/grid1_16.cc (1.5), Grid/grid1_64.cc (1.3), Grid/grid1_gmp.cc
+	  (1.3), Grid/grid2.cc (1.6), Grid/grid2_16.cc (1.3), Grid/grid3.cc
+	  (1.5), Grid/griddifference1.cc (1.5), Grid/intersection1.cc
+	  (1.4), Grid/intersection2.cc (1.3), Grid/isempty1.cc (1.2),
+	  Grid/isuniverse1.cc (1.5), Grid/join1.cc (1.7), Grid/join1_16.cc
+	  (1.2), Grid/join2.cc (1.3), Grid/join3.cc (1.5),
+	  Grid/limitedextrapolation1.cc (1.4), Grid/mapspacedims1.cc (1.3),
+	  Grid/maxmin1.cc (1.3), Grid/mincongruences1.cc (1.4),
+	  Grid/mingenerators1.cc (1.4), Grid/outputoperator1.cc (1.2),
+	  Grid/pointed1.cc (1.4), Grid/relations1.cc (1.6),
+	  Grid/relations2.cc (1.5), Grid/removespacedims1.cc (1.4),
+	  Grid/removespacedims2.cc (1.4), Grid/timeelapse1.cc (1.4),
+	  Grid/timeelapse2.cc (1.3), Grid/topclosed1.cc (1.4),
+	  Grid/topclosure1.cc (1.3), Grid/widening1.cc (1.5),
+	  Polyhedron/NNCbecomesC1.cc (1.7), Polyhedron/addconstraints13.cc
+	  (1.8), Polyhedron/addgenerators12.cc (1.8),
+	  Polyhedron/affineimage8.cc (1.7), Polyhedron/affinepreimage10.cc
+	  (1.7), Polyhedron/affinepreimage12.cc (1.2),
+	  Polyhedron/affinepreimage9.cc (1.7),
+	  Polyhedron/ascii_dump_load3.cc (1.7),
+	  Polyhedron/ascii_dump_load4.cc (1.7),
+	  Polyhedron/ascii_dump_load5.cc (1.7),
+	  Polyhedron/ascii_dump_load6.cc (1.8),
+	  Polyhedron/bhrz03widening12.cc (1.7),
+	  Polyhedron/bhz03widening6.cc (1.9), Polyhedron/boundingbox1.cc
+	  (1.9), Polyhedron/boundingbox2.cc (1.8),
+	  Polyhedron/boundingbox3.cc (1.8), Polyhedron/boundingbox4.cc
+	  (1.8), Polyhedron/concatenate6.cc (1.8),
+	  Polyhedron/constraints4.cc (1.8), Polyhedron/contains5.cc (1.7),
+	  Polyhedron/disjoint2.cc (1.8), Polyhedron/disjoint3.cc (1.8),
+	  Polyhedron/expandspacedim1.cc (1.8),
+	  Polyhedron/expandspacedim2.cc (1.8), Polyhedron/foldspacedims1.cc
+	  (1.8), Polyhedron/foldspacedims2.cc (1.8),
+	  Polyhedron/generalizedaffineimage10.cc (1.7),
+	  Polyhedron/generalizedaffineimage11.cc (1.8),
+	  Polyhedron/generalizedaffineimage9.cc (1.7),
+	  Polyhedron/generators6.cc (1.8), Polyhedron/intersection10.cc
+	  (1.8), Polyhedron/intersection11.cc (1.8),
+	  Polyhedron/limitedh79extrapolation4.cc (1.8),
+	  Polyhedron/mapspacedims1.cc (1.8), Polyhedron/polydifference7.cc
+	  (1.8), Polyhedron/polyhull8.cc (1.8), Polyhedron/polyhull9.cc
+	  (1.8), Polyhedron/polypowerset1.cc (1.18),
+	  Polyhedron/relations17.cc (1.8), Polyhedron/relations19.cc (1.8),
+	  Polyhedron/relations9.cc (1.7), Polyhedron/topclosure4.cc (1.8),
+	  Polyhedron/writerelation1.cc (1.7): Use the DO_TEST macro in
+	  multiple tests.
+
+2006-02-12 Sunday 18:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/generators1.cc (1.4): Added three tests; for a
+	  generator system with parameters, one where the parameter is
+	  integral, and two which have divisors.
+
+2006-02-12 Sunday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.219): Check whether getenv() is declared.
+
+2006-02-12 Sunday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/affineimage8.cc (1.13): Changed so as to do
+	  sensible tests.
+
+2006-02-12 Sunday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.34): Added a macro DO_TEST to be used when
+	  implementing more than one test in a test program.  Added all the
+	  infrastructure required to write decent tests for BD_Shape.
+
+2006-02-12 Sunday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpq.inlines.hh (1.31): It is now possible to (very
+	  inefficiently) build and assign an mpq_class checked number from
+	  a long double.
+
+2006-02-12 Sunday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.62): The output_float() function
+	  now takes its `from' parameter as `const Type', not `Type&'.
+
+2006-02-12 Sunday 14:22  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.70), Checked_Number.inlines.hh
+	  (1.59): Added constructor with rounding direction.
+
+2006-02-12 Sunday 12:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: generalizedaffinepreimage1.cc (1.4),
+	  generalizedaffinepreimage2.cc (1.4), grid1_16.cc (1.4): Removed
+	  'FIX check' comments (and similar) as tests now checked.
+	  Renumbered tests in generalizedaffinepreimage2.cc so that they
+	  start from 1.  Added test 6 in generalizedaffinepreimage2.cc.
+
+2006-02-12 Sunday 11:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (1.6): Correct bug in use of NDEBUG.
+
+2006-02-12 Sunday 10:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.194): Improved the section on grids.
+
+2006-02-12 Sunday 09:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/.cvsignore (1.6): File ppl_sicstus.pl
+	  was erroneously ignored.
+
+2006-02-11 Saturday 20:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GMP_Integer.defs.hh (1.20): Added a missing \relates Doxygen
+	  command for gdcext_assign().
+
+2006-02-11 Saturday 20:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence.defs.hh (1.3), Congruence_System.defs.hh (1.6),
+	  Grid.defs.hh (1.9), Grid_Certificate.defs.hh (1.3),
+	  Grid_Generator.defs.hh (1.8), Grid_Generator_System.defs.hh
+	  (1.8), globals.defs.hh (1.36): Inserting the Grid classes in the
+	  C++ interface documentation group.
+
+2006-02-11 Saturday 15:51  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[31,23]):
+	  Removed redundant code where possible.  Properly renamed some
+	  variables and methods.  Try to avoid memory reallocations and to
+	  keep the internal data structures always consistent.
+
+2006-02-11 Saturday 13:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.147), tests/BD_Shape/Makefile.am (1.35),
+	  tests/Grid/Makefile.am (1.8), tests/Polyhedron/Makefile.am
+	  (1.48): Use precompiled headers, if requested to do so.
+
+2006-02-11 Saturday 13:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.193), src/Grid.defs.hh (1.8): Corrected
+	  doxygen references.
+
+2006-02-11 Saturday 12:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.218): Added an initial version of the new
+	  --enable-pch configure option: this will allow to enable
+	  precompiled headers when they are made available by the C/C++
+	  compilers.
+
+2006-02-11 Saturday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/.cvsignore (1.2), Watchdog/src/Makefile.am (1.6),
+	  interfaces/Prolog/ppl_prolog.icc (1.176),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.46),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.39),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.91),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.121),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.86),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.114),
+	  tests/Polyhedron/watchdog1.cc (1.8): We now directly create
+	  `pwl.hh': `pwl_install.hh' does not exist any longer.
+
+2006-02-11 Saturday 11:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.40): Added a couple of
+	  missing namespace qualifications in \relates Doxygen commands.
+
+2006-02-11 Saturday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/utils/.cvsignore (1.2), debian/.cvsignore (1.2),
+	  doc/.cvsignore (1.3), src/.cvsignore (1.10), utils/.cvsignore
+	  (1.2): Ignore more built files and directories.
+
+2006-02-11 Saturday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.55), interfaces/C/ppl_c.cc (1.152),
+	  interfaces/Prolog/ppl_prolog.icc (1.175),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.45),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.38),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.90),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.120),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.85),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.113), src/.cvsignore (1.9),
+	  src/Makefile.am (1.146), src/ppl-config.cc.in (1.18),
+	  tests/ppl_test.hh (1.33): We now directly create `ppl.hh':
+	  `ppl_install.hh' does not exist any longer.
+
+2006-02-11 Saturday 10:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.14): The `$(COMMANDS)' construct is
+	  not portable: use ``COMMANDS`' instead.
+
+2006-02-10 Friday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-sparc.inlines.hh (1.4): Added missing type casts.
+
+2006-02-10 Friday 20:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: fpu-sparc.inlines.hh (1.3), fpu.types.hh (1.2): Now both
+	  fpu_rounding_direction_type and fpu_rounding_control_word_type
+	  are unconditionally defined to be the int type.
+
+2006-02-10 Friday 20:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.61): Avoid long lines.
+
+2006-02-10 Friday 19:58  Abramo Bagnara
+
+	* src/fpu-ia32.inlines.hh (1.11): God rid of HIJACK_FPU (now it's
+	  the normal behaviour).
+
+2006-02-10 Friday 15:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Init.cc (1.25): Initialize the library with
+	  fpu_set_rounding_direction(ROUND_DIRECT) instead of
+	  fpu_set_rounding_direction(FPU_UPWARD).
+
+2006-02-10 Friday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.defs.hh (1.10): Copy and paste mistake fixed.
+
+2006-02-10 Friday 13:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (1.2): Use AC_LANG_SOURCE to obtain
+	  the test program source.
+
+2006-02-10 Friday 13:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.217), src/Init.cc (1.24), src/fpu-none.inlines.hh
+	  (1.4), src/fpu.defs.hh (1.9): Check for the possibility to
+	  control the FPU.  If FPU control is not available, do not try to
+	  use it in Init::Init();  any attempt to use it from elsewhere
+	  will result in an std::logic_error exception being thrown.
+
+2006-02-10 Friday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/Makefile.am (1.17): Updated.
+
+2006-02-10 Friday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (1.1): New function to check for the
+	  possibility to control the FPU.
+
+2006-02-10 Friday 07:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.60): Use the new interfaces
+	  offered by the FPU control/query functions.
+
+2006-02-09 Thursday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.189): Mention the portability improvements.
+
+2006-02-09 Thursday 21:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.46): Be functional also if the
+	  "fast" integral types are missing.
+
+2006-02-09 Thursday 21:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.216): Check for the availability of "fast"
+	  integral types.
+
+2006-02-09 Thursday 20:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.23), Init.defs.hh (1.16): Adapted to the recent
+	  changes concerning FPU control.  Init::Init() was probably broken
+	  on some architectures.
+
+2006-02-09 Thursday 20:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh (1.11): Mac OS X 10.4 has fixed <fenv.h>:
+	  now the FE_* constants are defined by means of macros.
+
+2006-02-09 Thursday 20:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.145), fpu-c99.inlines.hh (1.10),
+	  fpu-ia32.inlines.hh (1.10), fpu-sparc.inlines.hh (1.2),
+	  fpu.defs.hh (1.8), fpu.types.hh (1.1): FPU control functions
+	  documented.  They now use the new system-dependent types
+	  fpu_rounding_direction_type and fpu_rounding_control_word_type.
+
+2006-02-09 Thursday 16:00  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.30): Fixed another bug.  Keep
+	  `last_generator' always updated even if the second phase fails.
+
+2006-02-09 Thursday 13:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c, src/LP_Problem.cc,
+	  src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh
+	  (simplex.[6,29,22,18]): Temporarily replaced method	const
+	  Constraint_System& constraints() const; by   Constraint_System
+	  constraints() const; Removed a fixme.  Simplified the prototype
+	  and the implementation of is_satisfied().
+
+2006-02-09 Thursday 08:46  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.59): Fixed cut and paste typo.
+
+2006-02-08 Wednesday 20:06  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.28): Fixed a bug in `is_satisfied()'.
+
+2006-02-08 Wednesday 12:28  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.69), Checked_Number.inlines.hh
+	  (1.58), Float.cc (1.4), Float.defs.hh (1.19), Float.inlines.hh
+	  (1.23), checked_ext.inlines.hh (1.29), checked_float.inlines.hh
+	  (1.58), checked_numeric_limits.hh (1.13), float.types.hh (1.15):
+	  Better abstraction for float binary format.
+
+2006-02-06 Monday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.144): Distribute also fpu-none.inlines.hh and
+	  fpu-sparc.inlines.hh.
+
+2006-02-06 Monday 21:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.215): Check for the availability of fenv.h and
+	  ieeefp.h.
+
+2006-02-06 Monday 21:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.inlines.hh (1.9): Typo fixed.
+
+2006-02-06 Monday 21:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh (1.9): Do no harm if fenv.h is not
+	  available.
+
+2006-02-06 Monday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.defs.hh (1.7): Only include fpu-c99.inlines.hh if fenv.h
+	  is available.  Otherwise, if `sparc' evaluates to true, include
+	  fpu-sparc.inlines.hh.  Otherwise include fpu-none.inlines.hh.
+
+2006-02-06 Monday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-sparc.inlines.hh (1.1): SPARC floating point unit related
+	  functions.
+
+2006-02-06 Monday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.47): Added NNCminimize1 to
+	  XFAIL_WITH_INT8_A.
+
+2006-02-06 Monday 20:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.214), src/checked_float.inlines.hh (1.57): Do not
+	  use rintf() if it is not available.
+
+2006-02-06 Monday 07:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.34): Undo change erroneously merged
+	  from the `grids' branch.
+
+2006-02-06 Monday 01:29  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.27): Removed redundant and useless
+	  code.
+
+2006-02-05 Sunday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/float.types.hh (1.14): New macros give the binary format of
+	  each supported C++ floating point type: CXX_FLOAT_BINARY_FORMAT,
+	  CXX_DOUBLE_BINARY_FORMAT and CXX_LONG_DOUBLE_BINARY_FORMAT. These
+	  macros are undefined is the format has not been recognized.
+
+2006-02-05 Sunday 20:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float128_binary_format.m4 (1.5): Make sure the macro
+	  CXX_FLOAT128_BINARY_FORMAT_IS_INTEL_DOUBLE_EXTENDED is always
+	  defined.
+
+2006-02-05 Sunday 18:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.213), instchk.hh (1.4),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.119), src/Float.defs.hh
+	  (1.18), src/Float.inlines.hh (1.22), src/checked_int.inlines.hh
+	  (1.45): Cater for those systems providing inttypes.h instead of
+	  stdint.h.
+
+2006-02-05 Sunday 18:38  Andrea Cimino
+
+	* src/: Generator.defs.hh, LP_Problem.cc, LP_Problem.defs.hh
+	  (simplex.[2,26,21]): LP_Problem, during the incrementality
+	  process, checks if an inequality is already satisfied by
+	  `last_generator': this can save a lot of time.  LP_Problem
+	  declared friend of Generator to allow a right use of
+	  Scalar_Products.
+
+2006-02-05 Sunday 18:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_float32_binary_format.m4 (1.3),
+	  ac_cxx_float64_binary_format.m4 (1.4),
+	  ac_cxx_float96_binary_format.m4 (1.4): Be more concise.
+
+2006-02-05 Sunday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float128_binary_format.m4 (1.4): Constants fixed.
+
+2006-02-05 Sunday 17:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.7), affineimage1.cc (1.5),
+	  affineimage1_16.cc (1.1), grid1.cc (1.7), grid1_16.cc (1.3),
+	  join1.cc (1.6), join1_16.cc (1.1): Three tests added before to
+	  grid1.cc join1.cc affineimage1.cc now removed and placed in
+	  grid1_16.cc join1_16.cc affineimage1_16.cc.  These last 3 tests
+	  are expected to fail with 8 bit integers.
+
+2006-02-05 Sunday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float128_binary_format.m4 (1.3): Constant fixed.
+
+2006-02-05 Sunday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_float128_binary_format.m4 (1.2),
+	  ac_cxx_float32_binary_format.m4 (1.2),
+	  ac_cxx_float64_binary_format.m4 (1.3),
+	  ac_cxx_float96_binary_format.m4 (1.3): Cater for those systems
+	  providing inttypes.h instead of stdint.h.
+
+2006-02-05 Sunday 15:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.17): Spurious blank removed.
+
+2006-02-05 Sunday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.212): Detect the binary format used by 128-bit
+	  floats.
+
+2006-02-05 Sunday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float128_binary_format.m4 (1.1): New function to detect
+	  the binary format used by 128-bit floats.
+
+2006-02-05 Sunday 14:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: certificate1.cc (1.4), isuniverse1.cc (1.4): Take
+	  out stray calls to ascii_dump.
+
+2006-02-05 Sunday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float64_binary_format.m4 (1.2): Cosmetic improvements.
+
+2006-02-05 Sunday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.211): Detect the binary format used by 32-bit
+	  floats.
+
+2006-02-05 Sunday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float32_binary_format.m4 (1.1): New function to detect
+	  the binary format used by 32-bit floats.
+
+2006-02-05 Sunday 10:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float96_binary_format.m4 (1.2): Correctly handle the
+	  case where a 96-bit floating point format is not detected.
+
+2006-02-05 Sunday 10:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.210): Detect the binary format used by 96-bit
+	  floats.
+
+2006-02-05 Sunday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float96_binary_format.m4 (1.1): New function to detect
+	  the binary format used by 96-bit floats.
+
+2006-02-04 Saturday 22:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.209): Detect the binary format used by 64-bit
+	  floats.
+
+2006-02-04 Saturday 22:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float64_binary_format.m4 (1.1): New function to detect
+	  the binary format used by 64-bit floats.
+
+2006-02-03 Friday 03:25  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.25): A couple of fixes in OK(): Some
+	  assertions were failing without a good reason.
+
+2006-02-01 Wednesday 23:27  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.24): The FIXME about incrementality
+	  was already dealt with.
+
+2006-02-01 Wednesday 23:23  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.23): Other little improvements.
+
+2006-02-01 Wednesday 22:56  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[22,20]): Major
+	  improvements to the class: now the incrementality process handles
+	  a Constraint_System in one shot instead of a single Constraint.
+	  Added other useful tests in OK().  Minor changes in the
+	  documentation.
+
+2006-02-01 Wednesday 20:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.208): Version number bumped.
+
+2006-02-01 Wednesday 20:06  Abramo Bagnara
+
+	* src/Float.inlines.hh (1.21): Constant is 64 bit long.
+
+2006-02-01 Wednesday 19:35  Abramo Bagnara
+
+	* src/Float.inlines.hh (1.20): Clear most significant bit of the
+	  mantissa.
+
+2006-02-01 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.19): Added missing semicolon.
+
+2006-02-01 Wednesday 18:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.188): Added some items (to be filled in).
+
+2006-02-01 Wednesday 12:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: affineimage1.cc (1.4), grid1.cc (1.6), grid2.cc
+	  (1.5), join1.cc (1.5), widening1.cc (1.4): Removed 3 "FIX "'s in
+	  grid2.cc and widening1.cc.  Added tests based on example in
+	  Muller-Olm and Seidl SAS paper to grid1.cc, join1.cc and
+	  affineimage1.cc.  Added tests based on Example 8 in the technical
+	  report on the grids domain in widening1.cc.  Reordered tests in
+	  widening1.cc so that those based on examples 8 and 9 are
+	  together.
+
+2006-02-01 Wednesday 01:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (1.6): Take NOISY directive out of
+	  AM_CPPFLAGS.
+
+2006-02-01 Wednesday 01:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/README (1.1): Initial revision.
+
+2006-01-31 Tuesday 19:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (1.4): Move variables to a local namespace.
+
+2006-01-31 Tuesday 19:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (1.5): Ensure that all exception tests emit
+	  noisy messages.  Move variables to a local namespace.
+
+2006-01-31 Tuesday 19:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/equals1.cc (1.3): Add tests to cover the rest of
+	  Grid::quick_equivalence_test().  Move variables to a local
+	  namespace.
+
+2006-01-31 Tuesday 19:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/bounds1.cc (1.3): Add space dimension exception test.
+
+2006-01-31 Tuesday 19:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: addgenerator1.cc (1.5), addspacedims1.cc (1.4),
+	  addspacedims2.cc (1.4), concatenate1.cc (1.4), congruence1.cc
+	  (1.4), grid3.cc (1.4), griddifference1.cc (1.4), join1.cc (1.4),
+	  join3.cc (1.4), relations1.cc (1.5): Ensure that all exception
+	  tests emit noisy messages and exit correctly.
+
+2006-01-31 Tuesday 19:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addcongruences1.cc (1.5): Add tests that exercise the
+	  case in minimize() where both systems are up-to-date.
+
+2006-01-31 Tuesday 19:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (1.5): Replace the empty check in the
+	  minimize() case where both systems are up-to-date with an
+	  assertion that the congruence system is empty.
+
+2006-01-31 Tuesday 13:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/removespacedims2.cc (1.3): Add tests where: the
+	  resulting grid is the zero dimension universe, the resulting grid
+	  is the same, a space dimension exception is thrown.
+
+2006-01-31 Tuesday 13:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/removespacedims1.cc (1.3): Add tests of: the exception
+	  case, passing the empty variable set and an outcome of a zero
+	  dimension universe.
+
+2006-01-31 Tuesday 13:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: expandspacedim1.cc (1.3), foldspacedims1.cc (1.3):
+	  Add tests of exception cases.
+
+2006-01-31 Tuesday 13:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/concatenate1.cc (1.3): Add possible space dimension
+	  exception test.
+
+2006-01-31 Tuesday 13:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (1.4): Correct exception message in
+	  expand_space_dimension.
+
+2006-01-30 Monday 20:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: addspacedims1.cc (1.3), addspacedims2.cc (1.3):
+	  Update tests to always call find_variation only once, directly
+	  after the operation under test.  Add tests with space dimension
+	  exceptions, zero dimension universes, minimized congruences, and
+	  out-of-date congruences with minimized generators.
+
+2006-01-30 Monday 19:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (1.3): Update add_space_dimensions_and_project
+	  to adjust dim_kinds when generators are out of date and
+	  congruences are minimized.
+
+2006-01-30 Monday 18:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/certificate1.cc (1.3): Add test7 where the minimized
+	  generators are used for the Grid_Certificate construction.
+
+2006-01-30 Monday 18:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.defs.hh (1.7): Correct the Grid class friend
+	  declaration comment.
+
+2006-01-30 Monday 13:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (1.4): Update lower_triangular and
+	  upper_triangular to check that the diagonal is positive and to
+	  correctly check for squareness when there are virtual rows.
+
+2006-01-30 Monday 11:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/widening1.cc (1.3): Add exception testing test test16.
+	  Add test17 where minimizing the first congruence system finds
+	  the grid empty.
+
+2006-01-30 Monday 11:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/limitedextrapolation1.cc (1.3): Add exception tests.
+	  Add test15, which limits with an empty congruence system.
+
+2006-01-30 Monday 11:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_widenings.cc (1.3): Correct the exception message in
+	  method widening_assign.
+
+2006-01-30 Monday 10:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/join3.cc (1.3): Add test of space dimension exception.
+
+2006-01-30 Monday 10:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/join1.cc (1.3): Add test of space dimension exception.
+	  Add test where updating the generators finds the grid empty.
+
+2006-01-30 Monday 10:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/griddifference1.cc (1.3): Update some tests to call
+	  difference_assign instead of grid_difference_assign.	Add space
+	  dimension exception test.
+
+2006-01-30 Monday 10:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: generalizedaffinepreimage1.cc (1.3),
+	  generalizedaffinepreimage2.cc (1.3): Add tests with zero
+	  denominator parameters, negative moduli and space dimension
+	  exceptions.
+
+2006-01-30 Monday 09:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: affineimage1.cc (1.3), affinepreimage1.cc (1.3),
+	  generalizedaffineimage1.cc (1.3), generalizedaffineimage2.cc
+	  (1.3): Add tests with zero denominator parameters and space
+	  dimension exceptions.
+
+2006-01-30 Monday 09:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addgenerator1.cc (1.4): Add tests for adding to an
+	  empty grid.
+
+2006-01-30 Monday 09:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addcongruences1.cc (1.4): Add tests for adding an
+	  empty system and adding a trivial system to a zero dim grid.
+
+2006-01-30 Monday 09:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.5), addgenerators1.cc (1.1): Add
+	  addgenerators1, which tests methods that can add multiple
+	  generators to a grid.
+
+2006-01-30 Monday 09:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.8): Update add_generator(g) to throw an
+	  exception when a parameter is given and the grid is zero
+	  dimension empty.  Rework the generalized_affine_image(lhs,..) and
+	  generalized_affine_preimage(lhs,..) lhs space dimension
+	  calculation to aid coverage analysis.
+
+2006-01-30 Monday 09:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (1.4): Rename parameters in
+	  throw_dimension_incompatible(char*, char*, Grid).
+
+2006-01-29 Sunday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.18): Fixed the build() method in
+	  specializations ot template <typename T> struct TFloat.
+
+2006-01-29 Sunday 08:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (ppl-0_8-branch.1): Added missing
+	  semicolons.
+
+2006-01-29 Sunday 08:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.17): Added missing semicolons.
+
+2006-01-28 Saturday 22:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.defs.hh (1.5), Grid.defs.hh (1.7),
+	  Grid_Generator.defs.hh (1.6), Grid_Generator_System.defs.hh
+	  (1.7), Polyhedron.defs.hh (1.293): Revised documentation so that
+	  sample code has `grid_point' and `grid_line' instead of `point'
+	  and `line'.  Added an example to Grid_defs.hh showing use of a
+	  parameter.  Revised explanation of affine image and preimage.
+
+	  Corrected some bugs in the explanation of affine image and
+	  preimage in Polyhedron.defs.hh.
+
+2006-01-28 Saturday 18:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (1.3): Add more zero dimension tests.
+
+2006-01-28 Saturday 18:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: addconstraint1.cc (1.3), addconstraints1.cc (1.3),
+	  contains1.cc (1.3), disjoint1.cc (1.3), grid1.cc (1.4), grid3.cc
+	  (1.3), intersection1.cc (1.3), timeelapse1.cc (1.3): Add space
+	  dimension exception tests.
+
+2006-01-28 Saturday 18:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addcongruences1.cc (1.3): Add space dimension
+	  exception tests.  Add test8 which adds to an empty grid.
+
+2006-01-28 Saturday 18:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.7): Update
+	  add_recycled_congruences_and_minimize and
+	  add_recycled_congruences zero dimension grid cases to always
+	  leave the empty grid empty.
+
+2006-01-27 Friday 19:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/topclosed1.cc (1.3): Add test11 where minimizing the
+	  congruence system finds the grid empty.
+
+2006-01-27 Friday 19:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/pointed1.cc (1.3): Add a minimal congruence system
+	  case to test5.  Add test11 where minimizing the congruence system
+	  finds the grid empty.
+
+2006-01-27 Friday 19:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruence1.cc (1.3): Add space dimension exception
+	  test.
+
+2006-01-27 Friday 19:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/bounded1.cc (1.3): Add test13, where a paramter comes
+	  first in the system.
+
+2006-01-27 Friday 19:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addgenerator1.cc (1.3): Add zero dimension and space
+	  dimension exception tests.
+
+2006-01-27 Friday 19:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.4), asciidumpload1.cc (1.1),
+	  outputoperator1.cc (1.1): Add asciidumpload1 and outputoperator1.
+
+2006-01-27 Friday 14:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_simplify.cc (1.3), Grid.templates.hh (1.2),
+	  Grid_Certificate.cc (1.3), Grid_Generator.defs.hh (1.5),
+	  Grid_Generator.inlines.hh (1.4), Grid_Generator_System.defs.hh
+	  (1.6), Grid_Generator_System.inlines.hh (1.3), Grid_conversion.cc
+	  (1.3), Grid_nonpublic.cc (1.3), Grid_public.cc (1.6): Rename
+	  Grid_Generator::set_is_parameter to
+	  Grid_Generator::set_is_parameter_or_point. Rename
+	  Grid_Generator_System methods: num_rows to num_generators,
+	  num_rays to num_parameters.  Correct a typo in the Grid_Generator
+	  class doc.
+
+2006-01-27 Friday 14:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (1.4): Drop the extra
+	  topological_closure_assign and difference_assign PPL namespace
+	  qualifiers.
+
+2006-01-27 Friday 14:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.6): Drop the extra rows_are_zero Grid
+	  namespace qualifier.
+
+2006-01-27 Friday 14:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/devref.doxyconf-latex.in (1.9): Clip trailing whitespace.
+	  Add grid-related files.
+
+2006-01-27 Friday 14:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/devref.doxyconf-html.in (1.68): Add missing Grid files to
+	  INPUT.
+
+2006-01-27 Friday 12:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.192): Use \subsection and not \anchor in
+	  grids section of the documentation.  Avoid a multiply defined
+	  label warning due to label in the powerset section.
+
+2006-01-27 Friday 11:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.defs.hh (1.4), Grid_Generator.inlines.hh
+	  (1.3): Take out method topology.
+
+2006-01-27 Friday 11:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.5), Grid.inlines.hh (1.3),
+	  Grid.templates.hh (1.1), Makefile.am (1.143): Grid.templates.hh
+	  cut out from Grid.inlines.hh as per our standards.
+
+2006-01-27 Friday 10:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.179), src/Congruence_System.defs.hh (1.4),
+	  src/Grid.defs.hh (1.4), src/Grid_Generator.defs.hh (1.3),
+	  src/Grid_Generator_System.defs.hh (1.5):
+	  src/Grid_Generator.defs.hh, src/Grid_Generator_System.defs.hh:
+	  Documentation improved.  src/Congruence_System.defs.hh:    Fixed
+	  a cross reference to point to Grid documentation.
+	  src/Grid.defs.hh:    Improved documentation for affine image.
+
+	  TODO: Removed item concerning documentation for grids.
+
+2006-01-27 Friday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/NNC_Polyhedron.inlines.hh (1.32): Added an `inline' function
+	  specifier.
+
+2006-01-27 Friday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.inlines.hh (1.30), Determinate.inlines.hh
+	  (1.53), Ptr_Iterator.inlines.hh (1.6): Added several `inline'
+	  function specifiers.
+
+2006-01-27 Friday 09:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/ciao_pl_check.pl (1.20),
+	  GNU/gnu_pl_check.pl (1.9), SICStus/sp_pl_check.pl (1.7),
+	  SWI/swi_pl_check.pl (1.8), XSB/xsb_pl_check.P (1.25),
+	  YAP/yap_pl_check.pl (1.11), tests/pl_check.pl (1.31): In the
+	  system files,   the definition of predicate prolog_system/1
+	  modified to return  name capitalised to match system file names.
+
+	  pl_check.pl:	  improved extra_noisy output for large numbers.
+		now we print the expression used to generate	the large
+	  number as well as the number itself.
+
+		  When calling prolog_system/1 use capitalised names.
+
+2006-01-26 Thursday 23:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/relations2.cc (1.4): Add test15, of an empty grid,
+	  where updating finds the grid empty.	Add test16 to test18 which
+	  require the GCD calculation in relation_with.
+
+2006-01-26 Thursday 23:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/relations1.cc (1.4): Add zero dim universe test test9.
+
+2006-01-26 Thursday 23:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/isuniverse1.cc (1.3): Update test4 to actually test
+	  the empty case.  Scrap test10.  Add test15 where use of a point
+	  is required in is_universe.
+
+2006-01-26 Thursday 23:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.3), isempty1.cc (1.1): Add isempty1,
+	  which tests is_empty().
+
+2006-01-26 Thursday 23:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.5): Simplify the satisfy check case in
+	  is_universe.
+
+2006-01-26 Thursday 22:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.31), doc/devref.doxyconf-html.in (1.67),
+	  doc/devref.doxyconf-latex.in (1.8), src/BD_Shape.defs.hh (1.65),
+	  src/BD_Shape.inlines.hh (1.123), src/BD_Shape.templates.hh (1.1),
+	  src/Makefile.am (1.142), src/Polyhedra_Powerset.defs.hh (1.33),
+	  src/Polyhedra_Powerset.inlines.hh (1.39),
+	  src/Polyhedra_Powerset.templates.hh (1.1), src/Powerset.defs.hh
+	  (1.24), src/Powerset.inlines.hh (1.16), src/Powerset.templates.hh
+	  (1.1): From now on we will use source files named *.templates.hh
+	  for the non-inline definitions of all class template members and
+	  all (member or non-member) function templates that are not fully
+	  specialized.
+
+2006-01-26 Thursday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh (1.31): Tests reordered so as to avoid a
+	  compiler warning.
+
+2006-01-26 Thursday 21:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/relations2.cc (1.3): Add test14, of the space
+	  dimension exception.	Add more complex false congruence cases to
+	  test7.
+
+2006-01-26 Thursday 21:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/relations1.cc (1.3): Add test8, of the space dimension
+	  exception.
+
+2006-01-26 Thursday 21:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/mincongruences1.cc (1.3): Add test8, of an empty grid
+	  where updating the congruences finds the grid empty.
+
+2006-01-26 Thursday 21:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (1.3): Add test23, to test the assignment of
+	  a zero dim universe grid.
+
+2006-01-26 Thursday 21:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: generators1.cc (1.3), mingenerators1.cc (1.3): Add
+	  test9, of an empty grid where updating the generators finds the
+	  grid empty.
+
+2006-01-26 Thursday 21:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.4): Improve the relation_with(cg) zero dim
+	  case a little.
+
+2006-01-26 Thursday 18:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_minimize.cc (1.3), src/Makefile.am (1.141),
+	  doc/devref.doxyconf-html.in (1.66): Complete the integration of
+	  the Grid minimize methods into their callers.
+
+2006-01-26 Thursday 16:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.cc (1.3): Take old alternative code out of
+	  ascii_load.
+
+2006-01-26 Thursday 14:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.defs.hh (1.4): Correct typo in
+	  add_universe_rows_and_columns doc.
+
+2006-01-26 Thursday 13:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.191): Update anchor names in references in
+	  the grids sections.
+
+2006-01-26 Thursday 13:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.defs.hh (1.3): Correct
+	  add_universe_rows_and_columns doc.
+
+2006-01-26 Thursday 13:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.3): Neaten some doc formatting.  Align the
+	  class description as in Polyhedron.  Update reference names in
+	  docs.  Improve docs related to covering boxes.
+
+2006-01-26 Thursday 13:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.defs.hh (1.3): Correct
+	  add_unit_rows_and_columns doc.  Correct ref in affine_preimage
+	  doc.
+
+2006-01-26 Thursday 12:26  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.57): Added missing inline.
+
+2006-01-26 Thursday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.178): Old stuff removed or shortened.
+
+2006-01-25 Wednesday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.45), src/Makefile.am (1.140): Updated for PPL 0.9.
+
+2006-01-25 Wednesday 22:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.207): Version number bumped.
+
+2006-01-25 Wednesday 21:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* TODO (1.177): Complete some grid items, move rest into section 1.
+
+2006-01-25 Wednesday 21:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.3): Convert final FIX to a FIXME.
+
+2006-01-25 Wednesday 21:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Makefile.am (1.250): Reorder the directories in SUBDIRS.
+
+2006-01-25 Wednesday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.176): Done items removed.  The need for C and Prolog
+	  interfaces concerns all domains, not just grids.
+
+2006-01-25 Wednesday 21:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.in (grids.4): Makefile.in is automatically
+	  generated: it should not be under CVS.
+
+2006-01-25 Wednesday 21:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.175), configure.ac (1.206), doc/definitions.dox (1.190),
+	  doc/devref.doxyconf-html.in (1.65), src/C_Polyhedron.cc (1.18),
+	  src/C_Polyhedron.defs.hh (1.41), src/Congruence.cc (1.2),
+	  src/Congruence.defs.hh (1.2), src/Congruence.inlines.hh (1.2),
+	  src/Congruence.types.hh (1.2), src/Congruence_System.cc (1.2),
+	  src/Congruence_System.defs.hh (1.2),
+	  src/Congruence_System.inlines.hh (1.2),
+	  src/Congruence_System.types.hh (1.2), src/Constraint.defs.hh
+	  (1.116), src/Determinate.defs.hh (1.62),
+	  src/Determinate.inlines.hh (1.52), src/Generator.defs.hh (1.116),
+	  src/Generator_System.cc (1.17), src/Generator_System.defs.hh
+	  (1.15), src/Grid.defs.hh (1.2), src/Grid.inlines.hh (1.2),
+	  src/Grid.types.hh (1.2), src/Grid_Certificate.cc (1.2),
+	  src/Grid_Certificate.defs.hh (1.2),
+	  src/Grid_Certificate.inlines.hh (1.2),
+	  src/Grid_Certificate.types.hh (1.2), src/Grid_Generator.cc (1.2),
+	  src/Grid_Generator.defs.hh (1.2), src/Grid_Generator.inlines.hh
+	  (1.2), src/Grid_Generator.types.hh (1.2),
+	  src/Grid_Generator_System.cc (1.2),
+	  src/Grid_Generator_System.defs.hh (1.2),
+	  src/Grid_Generator_System.inlines.hh (1.2),
+	  src/Grid_Generator_System.types.hh (1.2), src/Grid_Status.cc
+	  (1.2), src/Grid_Status.idefs.hh (1.2), src/Grid_Status.inlines.hh
+	  (1.2), src/Grid_chdims.cc (1.2), src/Grid_conversion.cc (1.2),
+	  src/Grid_minimize.cc (1.2), src/Grid_nonpublic.cc (1.2),
+	  src/Grid_public.cc (1.2), src/Grid_simplify.cc (1.2),
+	  src/Grid_widenings.cc (1.2), src/Linear_Expression.cc (1.10),
+	  src/Linear_Expression.defs.hh (1.20), src/Linear_Row.inlines.hh
+	  (1.11), src/Makefile.am (1.139), src/NNC_Polyhedron.cc (1.18),
+	  src/NNC_Polyhedron.defs.hh (1.44), src/Polyhedra_Powerset.defs.hh
+	  (1.32), src/Polyhedra_Powerset.inlines.hh (1.38),
+	  src/Polyhedron.defs.hh (1.292), src/Polyhedron_nonpublic.cc
+	  (1.64), src/Polyhedron_public.cc (1.72), src/Scalar_Products.cc
+	  (1.4), src/Scalar_Products.defs.hh (1.5),
+	  src/Scalar_Products.inlines.hh (1.3),
+	  src/Scalar_Products.types.hh (1.3), src/globals.defs.hh (1.35),
+	  tests/Makefile.am (1.249), tests/ppl_test.hh (1.32),
+	  tests/print.cc (1.19), tests/print.hh (1.23),
+	  tests/BD_Shape/Makefile.am (1.33), tests/Grid/.cvsignore (1.2),
+	  tests/Grid/Makefile.am (1.2), tests/Grid/addcongruence1.cc (1.2),
+	  tests/Grid/addcongruences1.cc (1.2), tests/Grid/addconstraint1.cc
+	  (1.2), tests/Grid/addconstraints1.cc (1.2),
+	  tests/Grid/addgenerator1.cc (1.2), tests/Grid/addspacedims1.cc
+	  (1.2), tests/Grid/addspacedims2.cc (1.2),
+	  tests/Grid/affinedim1.cc (1.2), tests/Grid/affineimage1.cc (1.2),
+	  tests/Grid/affinepreimage1.cc (1.2), tests/Grid/bhz03widening1.cc
+	  (1.2), tests/Grid/bounded1.cc (1.2), tests/Grid/boundingbox1.cc
+	  (1.2), tests/Grid/boundingbox2.cc (1.2), tests/Grid/bounds1.cc
+	  (1.2), tests/Grid/certificate1.cc (1.2),
+	  tests/Grid/concatenate1.cc (1.2), tests/Grid/congruence1.cc
+	  (1.2), tests/Grid/congruences1.cc (1.2),
+	  tests/Grid/congruencesystem1.cc (1.2),
+	  tests/Grid/congruencesystem2.cc (1.2), tests/Grid/contains1.cc
+	  (1.2), tests/Grid/contains2.cc (1.2),
+	  tests/Grid/copyconstruct1.cc (1.2), tests/Grid/coveringbox1.cc
+	  (1.2), tests/Grid/coveringbox2.cc (1.2), tests/Grid/disjoint1.cc
+	  (1.2), tests/Grid/equals1.cc (1.2), tests/Grid/expandspacedim1.cc
+	  (1.2), tests/Grid/foldspacedims1.cc (1.2),
+	  tests/Grid/generalizedaffineimage1.cc (1.2),
+	  tests/Grid/generalizedaffineimage2.cc (1.2),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.2),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.2),
+	  tests/Grid/generator1.cc (1.2), tests/Grid/generators1.cc (1.2),
+	  tests/Grid/grid1.cc (1.2), tests/Grid/grid1_16.cc (1.2),
+	  tests/Grid/grid1_64.cc (1.2), tests/Grid/grid1_gmp.cc (1.2),
+	  tests/Grid/grid2.cc (1.2), tests/Grid/grid2_16.cc (1.2),
+	  tests/Grid/grid3.cc (1.2), tests/Grid/griddifference1.cc (1.2),
+	  tests/Grid/intersection1.cc (1.2), tests/Grid/intersection2.cc
+	  (1.2), tests/Grid/isuniverse1.cc (1.2), tests/Grid/join1.cc
+	  (1.2), tests/Grid/join2.cc (1.2), tests/Grid/join3.cc (1.2),
+	  tests/Grid/limitedextrapolation1.cc (1.2),
+	  tests/Grid/mapspacedims1.cc (1.2), tests/Grid/maxmin1.cc (1.2),
+	  tests/Grid/membytes1.cc (1.2), tests/Grid/membytes2.cc (1.2),
+	  tests/Grid/mincongruences1.cc (1.2), tests/Grid/mingenerators1.cc
+	  (1.2), tests/Grid/pointed1.cc (1.2), tests/Grid/relations1.cc
+	  (1.2), tests/Grid/relations2.cc (1.2),
+	  tests/Grid/removespacedims1.cc (1.2),
+	  tests/Grid/removespacedims2.cc (1.2), tests/Grid/timeelapse1.cc
+	  (1.2), tests/Grid/timeelapse2.cc (1.2), tests/Grid/topclosed1.cc
+	  (1.2), tests/Grid/topclosure1.cc (1.2), tests/Grid/widening1.cc
+	  (1.2), tests/Grid/writecongruencesystem.cc (1.2),
+	  tests/Polyhedron/Makefile.am (1.46),
+	  tests/Polyhedron/addcongruence1.cc (1.2),
+	  tests/Polyhedron/addcongruence2.cc (1.2),
+	  tests/Polyhedron/addcongruence3.cc (1.2),
+	  tests/Polyhedron/addcongruence4.cc (1.2),
+	  tests/Polyhedron/addcongruence5.cc (1.2),
+	  tests/Polyhedron/addcongruences1.cc (1.2),
+	  tests/Polyhedron/addcongruences2.cc (1.2),
+	  tests/Polyhedron/addcongruences3.cc (1.2),
+	  tests/Polyhedron/addcongruences4.cc (1.2),
+	  tests/Polyhedron/addcongruences5.cc (1.2),
+	  tests/Polyhedron/congruences1.cc (1.2): First (and, quite likely,
+	  last) merge from the `grids' branch.
+
+2006-01-25 Wednesday 19:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* ChangeLog, Makefile.am, NEWS, README, README.configure, TODO,
+	  configure.ac, ppl.spec.in, Watchdog/CREDITS, Watchdog/ChangeLog,
+	  Watchdog/NEWS, Watchdog/README, debian/Makefile.am,
+	  debian/changelog, debian/control, debian/control.prologs,
+	  debian/libppl-gprolog.links, debian/libppl-sicstus.links,
+	  debian/libppl-swi.links, debian/libppl-yap.links, debian/rules,
+	  doc/definitions.dox, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, interfaces/C/ppl_c.h.in,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  m4/ac_check_swi_prolog.m4, m4/ppl.m4, src/BDS_Status.idefs.hh,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BHRZ03_Certificate.defs.hh, src/Bounding_Box.defs.hh,
+	  src/C_Polyhedron.defs.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Coefficient.types.hh,
+	  src/Coefficient_traits_template.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint_System.defs.hh,
+	  src/DB_Matrix.defs.hh, src/DB_Row.defs.hh,
+	  src/Determinate.defs.hh, src/Float.defs.hh,
+	  src/GMP_Integer.types.hh, src/Generator.defs.hh,
+	  src/Generator_System.defs.hh, src/H79_Certificate.defs.hh,
+	  src/Init.defs.hh, src/Interval.defs.hh, src/LP_Problem.defs.hh,
+	  src/LP_Problem.types.hh, src/Linear_Expression.defs.hh,
+	  src/Linear_Row.defs.hh, src/Linear_System.defs.hh,
+	  src/Makefile.am, src/Matrix.defs.hh, src/NNC_Polyhedron.defs.hh,
+	  src/Ph_Status.idefs.hh, src/Poly_Con_Relation.defs.hh,
+	  src/Poly_Gen_Relation.defs.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedron.defs.hh, src/Powerset.defs.hh,
+	  src/Powerset.inlines.hh, src/Powerset.types.hh,
+	  src/Ptr_Iterator.defs.hh, src/Result.defs.hh,
+	  src/Rounding_Dir.defs.hh, src/Row.defs.hh,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Row.defs.hh,
+	  src/Scalar_Products.defs.hh, src/Topology.hh,
+	  src/Variable.defs.hh, src/Widening_Function.defs.hh,
+	  src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+	  src/checked_numeric_limits.hh, src/compiler.hh,
+	  src/globals.defs.hh, src/globals.types.hh,
+	  src/mp_numeric_limits.hh, src/namespaces.hh, src/version.hh.in,
+	  tests/Makefile.am, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc, tests/BD_Shape/universe1.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/polypowerset1.cc, tests/Polyhedron/powerset1.cc,
+	  tests/Polyhedron/writepolyhedron3.cc
+	  (grids.[3,6,6,4,4,19,10,3,1,3,2,3,2,3,3,3,2,2,2,2,3,11,8,4,6,4,7,5,6,5,5,3,5,8,8,4,5,5,12,10,3,2,6,11,6,4,6,6,5,4,18,13,5,4,4,3,3,12,7,5,14,9,5,4,3,3,8,10,3,4,2,3,5,4,9,3,4,6,2,4,4,7,11,5,7,6,3,7,4,4,3,3,6,10,3,3,3,3,3,4,3,4,3,3]):
+	  Eighth and last merge from the main trunk.
+
+2006-01-25 Wednesday 16:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/generalizedaffinepreimage2.cc (grids.6): Correct the
+	  expected results in test17, test18, test21 and test22.
+
+2006-01-25 Wednesday 16:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/generalizedaffinepreimage1.cc (grids.7): Enable test6
+	  and test7, and adjust their expected results.
+
+2006-01-25 Wednesday 16:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/generalizedaffineimage2.cc (grids.7): Correct the
+	  expected result in test18.
+
+2006-01-25 Wednesday 16:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.138): Correct the
+	  generalized_affine_preimage(lhs,..) case where variables in lhs
+	  also occur in rhs.
+
+2006-01-25 Wednesday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.64): Always link with
+	  the PIC version of ppl_sicstus_sd.o.
+
+2006-01-25 Wednesday 12:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.137): Replace the first
+	  generalized_affine_preimage(lhs,..)  line-adding call to
+	  add_recycled_generators with equivalent code, as in
+	  generalized_affine_image(lhs,..).  Neaten TODO comments.
+
+2006-01-25 Wednesday 12:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.42): Add a simple comment for the
+	  invert-transpose loops in both conversions.
+
+2006-01-24 Tuesday 21:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.41): Improve the comments on the
+	  destination initialization in the conversion methods.
+
+2006-01-24 Tuesday 21:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Checked_Number.defs.hh (1.68), Checked_Number.inlines.hh
+	  (1.56), GMP_Integer.defs.hh (1.19), GMP_Integer.inlines.hh
+	  (1.14), checked.defs.hh (1.34), checked.inlines.hh (1.30),
+	  checked_ext.defs.hh (1.10), checked_ext.inlines.hh (1.28),
+	  checked_float.inlines.hh (1.56), checked_int.inlines.hh (1.44),
+	  checked_mpz.inlines.hh (1.35): Add function
+	  gcdext_assign(to,x,y,s,t) to the GMP and checked integer types.
+
+2006-01-24 Tuesday 16:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.40): Slightly improve comments,
+	  error messages and formatting.
+
+2006-01-24 Tuesday 13:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.39): Improve comments in both
+	  conversion methods.
+
+2006-01-24 Tuesday 11:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.38): Correct the comment in both
+	  conversions about the iteration of source_index and dest_index.
+
+2006-01-24 Tuesday 11:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.37): Leave variable name
+	  tem_source_index as such.
+
+2006-01-24 Tuesday 00:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_simplify.cc (grids.[100,62]): Update
+	  simplify(gs..) to expect the reduction to result in a system
+	  containing a point.
+
+2006-01-23 Monday 23:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.61): Note a possible todo item in the
+	  congruence simplify method.
+
+2006-01-23 Monday 23:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.60): Update
+	  reduce_congruence_with_equality to set the `row' element at
+	  `column' directly and to account for `row' elements known to be
+	  zero.  Improve variable names in same method.
+
+2006-01-23 Monday 23:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.59): Update
+	  reduce_parameter_with_line to set the `row' element at `column'
+	  directly and to account for `row' elements known to be zero.
+
+2006-01-23 Monday 22:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.58): Clean comments and improve
+	  variable names in the reduce methods.  Update these methods to
+	  all subtract the pivot from the row (intead of the other way
+	  around).
+
+2006-01-23 Monday 22:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.136): Update minimized_congruences and
+	  Grid::Grid(n,k) to recover the congruence system minimal form
+	  when inserting the zero dimension integrality.
+
+2006-01-23 Monday 22:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence.cc (grids.[44,23]):
+	  Correct a comment in sign_normalize.	Update normalize to always
+	  normalize the constant term, even when all homogeneous terms are
+	  zero.
+
+2006-01-23 Monday 17:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.defs.hh (grids.28): Move swap into the
+	  public section.  Improve the has_a_free_dimension doc a little.
+
+2006-01-23 Monday 16:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.99): Correct the description of
+	  reduce_parameter_with_line.
+
+2006-01-23 Monday 15:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* TODO (grids.18): Complete the ascii_dump item.
+
+2006-01-23 Monday 12:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.135): Move the gs space dimension
+	  adjustment in add_recycled_generators to the empty case.
+
+2006-01-23 Monday 12:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[16,25]):
+	  Update coefficient_swap to account for the divisor element and
+	  the sizes of the two generators.
+
+2006-01-22 Sunday 22:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.defs.hh (grids.12): Take out the Grid friend
+	  declaration.
+
+2006-01-22 Sunday 22:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addconstraint1.cc (grids.3): Correct test name in
+	  message.
+
+2006-01-22 Sunday 22:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_simplify.cc, Grid.defs.hh, Grid_public.cc
+	  (grids.[57,98,134]): Reduce dependence on the Congruence_System
+	  (cgs) Grid friend declaration:
+
+	    Update relation_with to use cgs::inhomogeneous_term, is_pointed
+	  to
+	    use cgs::has_a_free_dimension, add_recycled_congruences to use
+	    cgs::recycling_insert, and
+	  add_recycled_congruences_and_minimize to
+	    use cgs::insert(cgs).
+
+	  Reduce dependence on the Generator_System Grid friend
+	  declaration: update OK to use is_equal_to and convert function
+	  rows_are_zero to a static template method.
+
+	  Correct the num_cols init in reduce_parameter_with_line.
+
+2006-01-22 Sunday 22:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_widenings.cc (grids.13): Update select_wider_congruences
+	  to use Congruence::is_equal_at_dimension.
+
+2006-01-22 Sunday 22:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.31): Reduce dependence on
+	  Congruence_System's Grid friend declaration: update both
+	  add_space_dimension_and_project methods to use
+	  Congruence_System::add_unit_rows_and_columns and update
+	  concatenate_assign to use Congruence_System::concatenate.
+
+2006-01-22 Sunday 22:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.28): Declare old_num_rows in
+	  recycling_insert const.
+
+2006-01-22 Sunday 22:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator_System.defs.hh,
+	  Grid_Generator_System.inlines.hh (grids.[22,13]): Add wrapper
+	  methods for Linear_System and Matrix methods used in Grid:
+	  permute_columns, erase_to_end, num_columns, resize_no_copy,
+	  set_index_first_pending_row, and unset_pending_rows.
+
+2006-01-22 Sunday 22:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.inlines.hh (grids.23): Correct
+	  is_equal_at_dimension.
+
+2006-01-22 Sunday 22:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[43,27]): Add methods is_equal_to(cgs),
+	  recycling_insert(cgs), add_unit_rows_and_columns(k),
+	  concatenate(cgs) and has_a_free_dimension().	Rename method
+	  add_rows to insert, updating it to add columns as required and
+	  moving it to the public section.
+
+2006-01-22 Sunday 22:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.defs.hh, Congruence.inlines.hh (grids.[40,22]):
+	  Add is_equal_at_dimension.  Improve Grid friend declaration
+	  comment.
+
+2006-01-22 Sunday 21:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.cc (grids.22): Update operator<< to use
+	  Coefficient_zero() for zero.
+
+2006-01-22 Sunday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.cc (1.56): Print objects of class Coefficient as
+	  such.
+
+2006-01-22 Sunday 15:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.56): Simplify the
+	  reduce_line_with_line comment.  Clean up a few comments the other
+	  reduce_x_with_x methods.
+
+2006-01-22 Sunday 13:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.55): Update reduce_line_with_line and
+	  reduce_equality_with_equality to set the column'th element of row
+	  directly.
+
+2006-01-21 Saturday 20:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.54): Take out of
+	  reduce_parameter_with_line a query about an existing improvement.
+
+2006-01-21 Saturday 20:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.53): Update
+	  reduce_equality_with_equality and reduce_line_with_line to
+	  account for columns that are known to be zero.
+
+2006-01-21 Saturday 20:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.97): Improve the description of the col
+	  parameter in some of the reduction methods.
+
+2006-01-21 Saturday 19:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.96): Improve the description of
+	  reduce_line_with_line a little.
+
+2006-01-21 Saturday 19:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_simplify.cc (grids.[95,52]): Update
+	  reduce_pc_with_pc to take arguments `start' and `end' instead of
+	  using a `parameters' argument to calculate the start and end of
+	  the relevant portions of the rows.
+
+2006-01-21 Saturday 19:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.42): Improve a comment in
+	  normalize_moduli.
+
+2006-01-21 Saturday 18:19  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.67), Checked_Number.inlines.hh
+	  (1.55): Simplified Checked and Native mixing.
+
+2006-01-20 Friday 23:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.51): Update reduce_pc_with_pc to set
+	  the column'th element of both row and pivot directly.
+
+2006-01-20 Friday 23:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.50): Correct a comment in the
+	  generator system simplify.
+
+2006-01-20 Friday 23:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.49): Update reduce_pc_with_pc to skip
+	  the trailing or leading columns that are known to be zero.
+
+2006-01-20 Friday 22:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.133): Inline the addition of the
+	  congruence in the case where lhs is a constant.
+
+2006-01-20 Friday 18:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.48): Add a rough query to
+	  reduce_pc_with_pc.
+
+2006-01-20 Friday 18:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, grid2_16.cc, grid4.cc (grids.[60,1,3]):
+	  Rename grid4 to grid2_16.
+
+2006-01-20 Friday 18:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (grids.22): Improve the comment about
+	  cong_test4.
+
+2006-01-20 Friday 18:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: grid1.cc, grid1_16.cc (grids.[28,2]): Move grid1
+	  test11 and test14 into grid1_16.  Describe grid1_16 test1.
+
+2006-01-20 Friday 17:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, grid1.cc, grid1_16.cc
+	  (grids.[59,27,1]): Add grid1_16, for tests that require integers
+	  of at least 16 bits.	Move grid1 test8 into grid1_16.
+
+2006-01-20 Friday 17:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/: control (ppl-0_8-branch.1), control (1.13): Update
+	  libppl-dev to depend on the system compiler.
+
+2006-01-20 Friday 14:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/rules (ppl-0_8-branch.1): Correct version parsing sed
+	  expression.
+
+2006-01-20 Friday 14:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/rules (1.10): Correct version parsing sed expression.
+
+2006-01-20 Friday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_8-branch.1): Update version.
+
+2006-01-20 Friday 09:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_8-branch.[2,2]): Mark
+	  ChangeLog.
+
+2006-01-20 Friday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, Watchdog/ChangeLog (ppl-0_8-branch.[1,1]): Updated.
+
+2006-01-20 Friday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (ppl-0_8-branch.1): Reflected the fact that some files
+	  have been deleted overnight.
+
+2006-01-20 Friday 06:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/Makefile.am (grids.1): file Makefile.am was added on
+	  branch grids on 2006-01-25 18:31:23 +0000
+
+2006-01-20 Friday 06:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/Makefile.am (1.2): Do not distribute no longer existent
+	  files.
+
+2006-01-20 Friday 01:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/: control.prologs (1.2), libppl-gprolog.links (1.2),
+	  libppl-sicstus.links (1.2), libppl-swi.links (1.2),
+	  libppl-yap.links (1.2): Clear out Prolog configuration files.
+
+2006-01-20 Friday 01:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/rules (1.9): Use the system C and C++ compilers.
+
+2006-01-20 Friday 01:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/control (1.12): Revert to the stable distribution (sarge)
+	  dependencies.
+
+2006-01-20 Friday 00:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/changelog (1.3): Add entry for 0.8 release.
+
+2006-01-20 Friday 00:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.defs.hh (grids.21): Improve the
+	  add_universe_rows_and_columns description.
+
+2006-01-20 Friday 00:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/devref.doxyconf-html.in (grids.7): Add to INPUT classes
+	  Grid_Generator, Grid_Generator_System, Grid_Certificate and file
+	  Grid_widenings.cc.
+
+2006-01-19 Thursday 20:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Makefile.am (grids.5): Run the grid tests before the
+	  others.
+
+2006-01-19 Thursday 18:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/Makefile.am (grids.9): Correct temporary
+	  BD_SHAPE_INSTANCE values.
+
+2006-01-19 Thursday 16:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/Makefile.am (grids.8): Temporarily modify to run
+	  the tests once, with BD_SHAPE_INSTANCE set according to
+	  --enable-coefficients, to speed the build machine test cycle.
+
+2006-01-19 Thursday 13:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.64), src/BD_Shape.inlines.hh (1.122),
+	  tests/BD_Shape/cc76narrowing1.cc (1.7),
+	  tests/BD_Shape/cc76narrowing2.cc (1.7),
+	  tests/BD_Shape/cc76narrowing3.cc (1.7),
+	  tests/BD_Shape/cc76narrowing4.cc (1.8),
+	  tests/BD_Shape/cc76narrowing5.cc (1.8): Corrected implementation
+	  and documentation of CC76_narrowing_assign() so as to match the
+	  order of arguments already used in all the widening and
+	  extrapolation operators.
+
+2006-01-19 Thursday 12:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/limitedextrapolation1.cc (grids.7): Insert a second
+	  token test as test9.
+
+2006-01-19 Thursday 11:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.174): Added an item.
+
+2006-01-19 Thursday 11:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.154): Added a missing
+	  full stop.
+
+2006-01-19 Thursday 11:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/NNC_Polyhedron.defs.hh (1.43): Corrected a couple of
+	  comments.
+
+2006-01-19 Thursday 11:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, grid1.cc, grid1_64.cc
+	  (grids.[58,26,1]): Add grid1_64 for tests that require 64 bit or
+	  GMP integers.  Move grid1 test18 into grid1_64.
+
+2006-01-19 Thursday 10:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh (1.34): Removed spurious quote from the
+	  documentation.
+
+2006-01-19 Thursday 10:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.66): Documentation typo fixed.
+
+2006-01-19 Thursday 10:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.63): Corrected several documentation
+	  glitches reported by Andrea and David.
+
+2006-01-19 Thursday 10:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Variable.defs.hh (1.51): "base blocks" --> "basic blocks".
+
+2006-01-18 Wednesday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.118): Avoid a compiler
+	  warning.
+
+2006-01-18 Wednesday 18:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.189): Fixed anchor for LeVerge92.
+
+2006-01-18 Wednesday 16:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.9): Fixed the detection of
+	  SWI-Prolog version 5.6.0 or later.
+
+2006-01-18 Wednesday 16:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, grid1.cc, grid1_gmp.cc
+	  (grids.[57,25,1]): Add grid1_gmp for tests expected to pass only
+	  with GMP integers.  Move grid1 test19 to grid1_gmp.
+
+2006-01-18 Wednesday 13:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.47): Add more tracing to
+	  reduce_pc_with_pc.
+
+2006-01-18 Wednesday 13:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.153): Another typo
+	  fixed.
+
+2006-01-18 Wednesday 13:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.64): Many small improvements to the
+	  documentation of the C interface.
+
+2006-01-18 Wednesday 13:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.152): Several small
+	  corrections pointed out by Andrea.
+
+2006-01-18 Wednesday 13:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/universe1.cc (1.8),
+	  Polyhedron/addconstraints6.cc (1.7),
+	  Polyhedron/writepolyhedron3.cc (1.7): "an universe" ==> "a
+	  universe".
+
+2006-01-18 Wednesday 13:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.types.hh (1.6): Corrected a typo in the
+	  documentation.
+
+2006-01-18 Wednesday 09:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.10): Some old compilers do not
+	  fully understand using directives/declarations.
+
+2006-01-17 Tuesday 21:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruencesystem1.cc (grids.10): Revert change made
+	  during testing.
+
+2006-01-17 Tuesday 20:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid4.cc (grids.2): Clear out tracing messages.
+
+2006-01-17 Tuesday 20:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, timeelapse1.cc, timeelapse2.cc
+	  (grids.[56,7,1]): Add timeelapse2, where the tests are expected
+	  to fail with checkedint8.  Move timeelapse1 test9 into
+	  timeelapse2.
+
+2006-01-17 Tuesday 20:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, grid2.cc, grid4.cc (grids.[55,21,1]):
+	  Add grid4 for tests of grids created from congruences where the
+	  tests are expected to fail with checkedint8.	Move grid2 test10
+	  into grid4.
+
+2006-01-17 Tuesday 18:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Checked_Number.defs.hh (grids.11): Take out the four
+	  parameter gcdext_assign declaration.
+
+2006-01-17 Tuesday 17:50  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[21,19]):
+	  `incremetality' improved and simplified using by using the new
+	  mapping system. Now the Constraint taken by `incrementality' is
+	  passed by const reference.
+
+2006-01-17 Tuesday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/: ppl_test.hh, Grid/congruencesystem1.cc (grids.[18,9]):
+	  Add macro PPL_TEST_STR.  Rename macro stringify to PPL_TEST_XSTR,
+	  correcting the expansion.
+
+2006-01-17 Tuesday 16:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/globals.defs.hh (1.33): Correct the macro names in the
+	  PPL_STR and PPL_XSTR docs.
+
+2006-01-17 Tuesday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.37), README (1.44), configure.ac (1.205),
+	  debian/Makefile.am (1.1): Distribute also the contents of the
+	  `debian' subdirectory.
+
+2006-01-17 Tuesday 15:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* Watchdog/CREDITS (1.2): "inexistent" replaced by "non-existent".
+
+2006-01-17 Tuesday 15:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.9): Corrected a name lookup
+	  problem for the output operator.
+
+2006-01-17 Tuesday 14:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.43): Updated.
+
+2006-01-17 Tuesday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/README (1.13): Updated.
+
+2006-01-17 Tuesday 13:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.138): Removed no longer necessary definition
+	  of DOC_FILES.
+
+2006-01-17 Tuesday 13:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* README (1.42): Change "source distributions" to "source
+	  distribution".
+
+2006-01-17 Tuesday 12:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* README.configure (1.17): Clip trailing whitespace.
+
+2006-01-17 Tuesday 12:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.16), Bounding_Box.defs.hh (1.13),
+	  Checked_Number.defs.hh (1.65), Coefficient_traits_template.hh
+	  (1.6), DB_Matrix.defs.hh (1.19), DB_Row.defs.hh (1.17),
+	  Float.defs.hh (1.17), GMP_Integer.types.hh (1.13), Init.defs.hh
+	  (1.15), Interval.defs.hh (1.27), Linear_Row.defs.hh (1.18),
+	  Linear_System.defs.hh (1.24), Matrix.defs.hh (1.75),
+	  Ph_Status.idefs.hh (1.16), Row.defs.hh (1.104),
+	  Saturation_Matrix.defs.hh (1.7), Saturation_Row.defs.hh (1.10),
+	  Scalar_Products.defs.hh (1.4), Widening_Function.defs.hh (1.14),
+	  checked.defs.hh (1.33), globals.defs.hh (1.32): Added \ingroup
+	  Doxygen commands to the documentation of many
+	  implementation-related C++ type declarations.
+
+2006-01-17 Tuesday 12:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Powerset.defs.hh (1.23): Do not include (useless) header file
+	  <set>.  Do directly include header file <iterator>.
+
+2006-01-17 Tuesday 12:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: C/ppl_c.h.in (1.63), Prolog/Prolog_interface.dox
+	  (1.151): Mark the start/stop of \defgroup documentation blocks
+	  for readability.
+
+2006-01-17 Tuesday 12:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.64), devref.doxyconf-latex.in
+	  (1.7): File globals.types.hh was not considered when building the
+	  devref manual.
+
+2006-01-17 Tuesday 12:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.188): Added Doxygen group
+	  PPL_CXX_interface.
+
+2006-01-17 Tuesday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.8): Fixed the test of constant
+	  reverse iterators.
+
+2006-01-17 Tuesday 10:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Powerset.defs.hh (1.22): Typo's fixed.
+
+2006-01-17 Tuesday 09:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.62), BHRZ03_Certificate.defs.hh (1.15),
+	  C_Polyhedron.defs.hh (1.40), Checked_Number.defs.hh (1.64),
+	  Coefficient.types.hh (1.12), Constraint.defs.hh (1.115),
+	  Constraint_System.defs.hh (1.26), Determinate.defs.hh (1.61),
+	  GMP_Integer.types.hh (1.12), Generator.defs.hh (1.115),
+	  Generator_System.defs.hh (1.14), H79_Certificate.defs.hh (1.14),
+	  LP_Problem.defs.hh (1.7), LP_Problem.types.hh (1.5),
+	  Linear_Expression.defs.hh (1.19), NNC_Polyhedron.defs.hh (1.42),
+	  Poly_Con_Relation.defs.hh (1.31), Poly_Gen_Relation.defs.hh
+	  (1.29), Polyhedra_Powerset.defs.hh (1.31), Polyhedron.defs.hh
+	  (1.291), Powerset.defs.hh (1.21), Rounding_Dir.defs.hh (1.10),
+	  Topology.hh (1.12), Variable.defs.hh (1.50), globals.defs.hh
+	  (1.31), globals.types.hh (1.5), namespaces.hh (1.8),
+	  version.hh.in (1.14): Added Doxygen group PPL_CXX_interface.
+	  Added all (user-level) C++ namespaces, classes, structs, defines,
+	  typedefs and enumerations to the new group.
+
+2006-01-17 Tuesday 09:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Result.defs.hh (1.14): Hiding initializers of enumeration
+	  Result.  try to uniformize the documentation of enumeration
+	  values.
+
+2006-01-17 Tuesday 07:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.204): Bump version number.
+
+2006-01-17 Tuesday 07:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.defs.hh (1.20): List the availability of bool
+	  operator!=(const D& x, const D& y) among the requirements on D
+	  set by the class Powerset<D>.
+
+2006-01-17 Tuesday 07:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.7): Corrected and almost
+	  completed.
+
+2006-01-17 Tuesday 06:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.6): Removed spurious
+	  redeclaration of ps3 (it broke the build).
+
+2006-01-17 Tuesday 01:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Powerset.defs.hh (1.19): Document the requirements for
+	  template parameter D.
+
+2006-01-17 Tuesday 01:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/powerset1.cc (1.5): Involve every method of
+	  Fcaibvp in the test.	Make std::set a private parent of Fcaibvp.
+	  Add operator==(Fcaibvp&, Fcaibvp&).
+
+2006-01-16 Monday 22:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.24): Updated.
+
+2006-01-16 Monday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog (1.14): Updated.
+
+2006-01-16 Monday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.187): Revised a couple of items.
+
+2006-01-16 Monday 22:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.39): Comment the #endif of the
+	  ascii_load doc directive.
+
+2006-01-16 Monday 22:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.186): Improved the paragraph on class BD_Shape<T>.
+
+2006-01-16 Monday 21:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.185): Added some quotations marks.
+
+2006-01-16 Monday 20:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* NEWS (1.184): Change "all what is needed" to "all that is needed"
+	  and "what is the relation" to "what the relation is".
+
+2006-01-16 Monday 20:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.38): Mark the ascii_load doc an
+	  implementation detail.
+
+2006-01-16 Monday 20:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.183): Drafted a news item concerning checked numbers.
+
+2006-01-16 Monday 20:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence_System.cc,
+	  Congruence_System.defs.hh, Grid.defs.hh, Grid_Generator.cc,
+	  Grid_Generator.defs.hh, Grid_Generator_System.cc,
+	  Grid_Generator_System.defs.hh, Grid_Status.cc,
+	  Grid_Status.idefs.hh, Grid_public.cc
+	  (grids.[21,37,41,26,94,15,24,27,20,6,7,132]): Convert all grid
+	  classes to use the PPL_OUTPUT macros.  Update
+	  generalized_affine_preimage to prefer pre-decrement.	Add a \ref
+	  to the Grid_Generator::ascii_load doc.
+
+2006-01-16 Monday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.30): Install gzipped man pages.
+
+2006-01-16 Monday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.29): The `Copyright' tag is no longer supported:
+	  use `License' instead.
+
+2006-01-16 Monday 15:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/polypowerset1.cc (1.17): Fixed tests 15 and 16.
+
+2006-01-16 Monday 15:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.16): Fixed test14().
+
+2006-01-16 Monday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.15): Fixed test13().
+
+2006-01-16 Monday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.14): Fixed test12().
+
+2006-01-16 Monday 15:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Checked_Number.defs.hh, Congruence_System.cc,
+	  GMP_Integer.defs.hh, GMP_Integer.inlines.hh, Grid_conversion.cc,
+	  Grid_nonpublic.cc (grids.[10,40,9,6,36,69]): Clear out the
+	  left-overs of the two parameter version of lcm_assign.  Always
+	  call the three parameter version.
+
+2006-01-16 Monday 15:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: polypowerset1.cc (1.12), polypowerset1.cc
+	  (1.13): Fixed test11().
+
+2006-01-16 Monday 15:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.11): Fixed test10().
+
+2006-01-16 Monday 15:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.10): Fixed test6().  Do not
+	  use ints when bools are wanted.
+
+2006-01-16 Monday 14:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.41): The PPL now also handles bounded-difference
+	  shapes.
+
+2006-01-16 Monday 14:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/polypowerset1.cc (1.9): Tests added.
+
+2006-01-16 Monday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/NEWS (1.8): Release date decided.
+
+2006-01-16 Monday 14:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.182): The section "Integers Represented by Floating Point
+	  Numbers" does not belong to the user's manual.
+
+2006-01-16 Monday 14:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh,
+	  Grid_conversion.cc, Grid_simplify.cc (grids.[23,18,35,46]): Move
+	  negate(gg, start, end) to Grid_Generator::negate(start, end).
+
+2006-01-16 Monday 14:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.181): News items reordered.  Added a notice for the
+	  exchange of unbounded numbers with YAP.
+
+2006-01-16 Monday 14:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Checked_Number.inlines.hh, GMP_Integer.defs.hh,
+	  GMP_Integer.inlines.hh (grids.[9,8,5]): Rename the wrapped
+	  gcdext_assign function to gcdext_assign_r.  Take out the
+	  four-parameter gcdext_assign function.
+
+2006-01-16 Monday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.180): Added an item for the new AM_PATH_PPL Autoconf
+	  function.
+
+2006-01-16 Monday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ppl.m4 (1.4): Comparison fixed.
+
+2006-01-16 Monday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.150): Warn the user
+	  about the fact that YAP's support for big numbers is still very
+	  young.
+
+2006-01-16 Monday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ppl.m4 (1.3): Error message corrected.
+
+2006-01-16 Monday 12:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Result.defs.hh (1.13): Added brief description for
+	  enumeration Result.
+
+2006-01-16 Monday 12:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/namespaces.hh (1.7): Document the Checked namespace (for the
+	  devref manula only).	Specify once and for all in the std
+	  namespace documentation that we are specializing numeric_limits
+	  and, in particular, we are temporarily doing it also for GMP
+	  types.
+
+2006-01-16 Monday 12:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/mp_numeric_limits.hh (1.7): Do not explicitly mention
+	  numeric_limits specializations in the user manual.
+
+2006-01-16 Monday 12:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh (1.9): Added brief description for
+	  enumeration Rounding_Dir; hiding initializers.
+
+2006-01-16 Monday 12:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.12): Specializations of
+	  numeric_limits should be explicitly mentioned in the devref
+	  manual only.
+
+2006-01-16 Monday 12:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked.defs.hh (1.32): Namespaces should be documented in
+	  namespaces.hh.  Cut away another redundant documentation block.
+
+2006-01-16 Monday 12:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.74), compiler.hh (1.7): Filter away
+	  implementation stuff from the user manual.
+
+2006-01-16 Monday 12:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh (1.30): Fixed documentation for
+	  abandon_exponential_computations.
+
+2006-01-16 Monday 12:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Coefficient_traits_template.hh (1.5): The empty traits class
+	  is documented in the devref manual only.
+
+2006-01-16 Monday 12:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user.doxyconf-html.in (1.36), user.doxyconf-latex.in (1.8):
+	  No longer expanding macros related to specialization of
+	  numeric_limits.
+
+2006-01-16 Monday 12:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.63): Comments added/improved.
+
+2006-01-16 Monday 11:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.179): Release date decided.  Improved the entry
+	  concerning ppl-config.
+
+2006-01-16 Monday 11:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.173): To-do items for PPL 0.8 removed.  Remember to
+	  complete/write man pages for PPL 0.9.
+
+2006-01-16 Monday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.121): Comment improved.
+
+2006-01-16 Monday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.62): Obsolete comment removed.
+
+2006-01-16 Monday 09:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh (1.8): Added brief documentation for
+	  class Rounding_Dir.
+
+2006-01-16 Monday 09:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Powerset.defs.hh (1.18), Powerset.inlines.hh (1.15),
+	  Powerset.types.hh (1.5): Renamed "Constraint System" as "Domain"
+	  as in the definitions.dox.  Replaced CS by D everywhere and cs by
+	  d.  Changed the section heading Member Functions for the Direct
+	  Inspection of Disjuncts to Member Functions for the Direct
+	  Manipulation of Disjuncts Moved the methods:	 add_disjunct()
+	  drop_disjunct()   drop_disjuncts()   clear() into this section.
+
+2006-01-16 Monday 09:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.61): Improved the documentation for
+	  function input().
+
+2006-01-16 Monday 09:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user.doxyconf-html.in (1.35), user.doxyconf-latex.in (1.7):
+	  When producing the user manuals, do not warn for undocumented
+	  members.
+
+2006-01-16 Monday 09:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_Row.defs.hh (1.17), Linear_System.defs.hh (1.23),
+	  Ptr_Iterator.defs.hh (1.7), Row.defs.hh (1.103): Do not document
+	  implementation-related classes in the user manual.
+
+2006-01-16 Monday 02:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* BUGS, ChangeLog, Makefile.am, NEWS, README, README.configure,
+	  STANDARDS, TODO, config.guess, config.sub, configure.ac,
+	  install-sh, instchk.hh, ltmain.sh, ppl.lsm.in, ppl.spec.in,
+	  Watchdog/ChangeLog, Watchdog/Makefile.am, Watchdog/NEWS,
+	  Watchdog/README, Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/configure.ac, Watchdog/install-sh, Watchdog/ltmain.sh,
+	  Watchdog/src/Doubly_Linked_Object.defs.hh,
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/src/Doubly_Linked_Object.types.hh,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	  Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	  Watchdog/src/EList_Iterator.inlines.hh,
+	  Watchdog/src/EList_Iterator.types.hh,
+	  Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+	  Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+	  Watchdog/src/Makefile.in, Watchdog/src/Pending_Element.cc,
+	  Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Pending_Element.inlines.hh,
+	  Watchdog/src/Pending_Element.types.hh,
+	  Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+	  Watchdog/src/Pending_List.inlines.hh,
+	  Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+	  Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	  Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	  Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	  Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	  Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+	  debian/changelog, debian/control, debian/control.prologs,
+	  debian/libppl-dev.install, debian/libppl-pwl.install,
+	  debian/libppl.dirs, debian/libppl.install, debian/rules,
+	  demos/Makefile.am, demos/ppl_lcdd/Makefile.am,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/Makefile.am,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+	  demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+	  demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+	  demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+	  demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+	  doc/README.doc, doc/definitions.dox, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/devref.tex, doc/ppl-config.1,
+	  doc/ppl.sty, doc/ppl_lcdd.1, doc/ppl_lpsol.1,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  doc/user.tex, interfaces/Makefile.am, interfaces/C/Makefile.am,
+	  interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+	  interfaces/OCaml/Makefile.am, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/gp_clpq.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/pl_clpq.cc,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/SWI/ppl_pl.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_clpq2_int16,
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int32,
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int64,
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int8,
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq_int16,
+	  interfaces/Prolog/XSB/expected_clpq_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq_int32,
+	  interfaces/Prolog/XSB/expected_clpq_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq_int64,
+	  interfaces/Prolog/XSB/expected_clpq_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq_int8,
+	  interfaces/Prolog/XSB/expected_clpq_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq_mpz,
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a,
+	  interfaces/Prolog/XSB/expected_pchk_int16,
+	  interfaces/Prolog/XSB/expected_pchk_int16_a,
+	  interfaces/Prolog/XSB/expected_pchk_int32,
+	  interfaces/Prolog/XSB/expected_pchk_int32_a,
+	  interfaces/Prolog/XSB/expected_pchk_int64_a,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/ppl_yap.pl,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int32,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int64,
+	  interfaces/Prolog/tests/expected_clpq2_int64_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq2_mpz,
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_clpq_int32,
+	  interfaces/Prolog/tests/expected_clpq_int32_a,
+	  interfaces/Prolog/tests/expected_clpq_int64,
+	  interfaces/Prolog/tests/expected_clpq_int64_a,
+	  interfaces/Prolog/tests/expected_clpq_int8,
+	  interfaces/Prolog/tests/expected_clpq_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_mpz,
+	  interfaces/Prolog/tests/expected_clpq_mpz_a,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl, m4/Makefile.am,
+	  m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+	  m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+	  m4/ac_cxx_attribute_weak.m4, m4/ac_cxx_double_is_iec_559.m4,
+	  m4/ac_cxx_flexible_arrays.m4, m4/ac_cxx_float_is_iec_559.m4,
+	  m4/ac_cxx_long_double.m4, m4/ac_cxx_long_double_is_iec_559.m4,
+	  m4/ac_cxx_long_long.m4, m4/ppl.m4, src/Ask_Tell.defs.hh,
+	  src/Ask_Tell.inlines.hh, src/Ask_Tell.types.hh,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh,
+	  src/BHRZ03_Certificate.types.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+	  src/Bounding_Box.types.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Checked_Number.types.hh, src/Coefficient.cc,
+	  src/Coefficient.defs.hh, src/Coefficient.inlines.hh,
+	  src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+	  src/Congruence.cc, src/Congruence.defs.hh,
+	  src/Congruence.inlines.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint.types.hh, src/Constraint_System.cc,
+	  src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	  src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Matrix.types.hh,
+	  src/DB_Row.defs.hh, src/DB_Row.inlines.hh, src/DB_Row.types.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/Determinate.types.hh, src/Float.cc, src/Float.defs.hh,
+	  src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator.types.hh,
+	  src/Generator_System.cc, src/Generator_System.defs.hh,
+	  src/Generator_System.inlines.hh, src/Generator_System.types.hh,
+	  src/Grid.inlines.hh, src/Grid_Generator.cc,
+	  src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, src/Grid_simplify.cc, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+	  src/H79_Certificate.types.hh, src/Init.cc, src/Init.defs.hh,
+	  src/Init.types.hh, src/Interval.cc, src/Interval.defs.hh,
+	  src/Interval.inlines.hh, src/Interval.types.hh,
+	  src/LP_Problem.cc, src/LP_Problem.defs.hh,
+	  src/LP_Problem.inlines.hh, src/LP_Problem.types.hh,
+	  src/Limits.hh, src/Linear_Expression.cc,
+	  src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	  src/Linear_Expression.types.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_Row.types.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/Linear_System.types.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh, src/Matrix.types.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Native_Integer.types.hh, src/Numeric_Format.defs.hh,
+	  src/Ph_Status.cc, src/Ph_Status.idefs.hh,
+	  src/Ph_Status.inlines.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+	  src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Poly_Gen_Relation.types.hh, src/Polyhedra_Powerset.cc,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+	  src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+	  src/Result.defs.hh, src/Result.inlines.hh,
+	  src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/Row.types.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+	  src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+	  src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Scalar_Products.types.hh, src/Topology.hh, src/Variable.cc,
+	  src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Variable.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	  src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_ext.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/compiler.hh, src/conversion.cc, src/float.types.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh,
+	  src/globals.types.hh, src/initializer.hh,
+	  src/max_space_dimension.hh, src/minimize.cc,
+	  src/mp_numeric_limits.hh, src/namespaces.hh,
+	  src/ppl-config.cc.in, src/ppl_header.hh, src/simplex.cc,
+	  src/simplify.cc, src/swapping_sort.icc, src/version.cc,
+	  src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+	  tests/Makefile.am, tests/PFunction.cc, tests/PFunction.hh,
+	  tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/Random_Number_Generator.types.hh, tests/ehandlers.cc,
+	  tests/ehandlers.hh, tests/files.cc, tests/files.hh,
+	  tests/ppl_test.hh, tests/print.cc, tests/print.hh,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+	  tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/addspacedims7.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage10.cc,
+	  tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+	  tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+	  tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/affinepreimage5.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/bdsdifference1.cc,
+	  tests/BD_Shape/bdsdifference2.cc,
+	  tests/BD_Shape/bdsdifference3.cc,
+	  tests/BD_Shape/bdsdifference4.cc,
+	  tests/BD_Shape/bdsdifference5.cc,
+	  tests/BD_Shape/bdsdifference6.cc,
+	  tests/BD_Shape/bdsdifference7.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bdshull2.cc, tests/BD_Shape/bdshull3.cc,
+	  tests/BD_Shape/bdshull4.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhmz05widening2.cc,
+	  tests/BD_Shape/bhmz05widening3.cc,
+	  tests/BD_Shape/bhmz05widening4.cc,
+	  tests/BD_Shape/bhmz05widening5.cc,
+	  tests/BD_Shape/bhmz05widening6.cc,
+	  tests/BD_Shape/bhmz05widening7.cc,
+	  tests/BD_Shape/bhmz05widening8.cc,
+	  tests/BD_Shape/bhz03widening1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation3.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/cc76extrapolation5.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc,
+	  tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+	  tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+	  tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+	  tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+	  tests/BD_Shape/closure1.cc, tests/BD_Shape/concatenate1.cc,
+	  tests/BD_Shape/concatenate2.cc, tests/BD_Shape/concatenate3.cc,
+	  tests/BD_Shape/concatenate4.cc, tests/BD_Shape/concatenate5.cc,
+	  tests/BD_Shape/constraints1.cc, tests/BD_Shape/constraints2.cc,
+	  tests/BD_Shape/contains1.cc, tests/BD_Shape/contains2.cc,
+	  tests/BD_Shape/contains3.cc, tests/BD_Shape/empty1.cc,
+	  tests/BD_Shape/empty2.cc, tests/BD_Shape/empty3.cc,
+	  tests/BD_Shape/empty4.cc, tests/BD_Shape/empty5.cc,
+	  tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+	  tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+	  tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage11.cc,
+	  tests/BD_Shape/generalizedaffineimage12.cc,
+	  tests/BD_Shape/generalizedaffineimage13.cc,
+	  tests/BD_Shape/generalizedaffineimage14.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage6.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/generalizedaffineimage9.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc, tests/BD_Shape/intersection2.cc,
+	  tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+	  tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+	  tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/limitedCC76extrapolation1.cc,
+	  tests/BD_Shape/limitedCC76extrapolation2.cc,
+	  tests/BD_Shape/limitedCC76extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation1.cc,
+	  tests/BD_Shape/limitedCH78extrapolation2.cc,
+	  tests/BD_Shape/limitedCH78extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation4.cc,
+	  tests/BD_Shape/limitedCH78extrapolation5.cc,
+	  tests/BD_Shape/limitedCH78extrapolation6.cc,
+	  tests/BD_Shape/limitedCH78extrapolation7.cc,
+	  tests/BD_Shape/limitedCH78extrapolation8.cc,
+	  tests/BD_Shape/limitedCH78extrapolation9.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation2.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation3.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation4.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation5.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation6.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation7.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation8.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation9.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation2.cc,
+	  tests/BD_Shape/limitedcc76extrapolation3.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+	  tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	  tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	  tests/BD_Shape/relations5.cc, tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/removespacedims2.cc,
+	  tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+	  tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+	  tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+	  tests/BD_Shape/writebdshape1.cc, tests/BD_Shape/writebdshape2.cc,
+	  tests/Polyhedron/CbecomesNNC1.cc,
+	  tests/Polyhedron/LP_Problem3.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/NNCbecomesC1.cc,
+	  tests/Polyhedron/NNCminimize1.cc,
+	  tests/Polyhedron/NNCminimize2.cc,
+	  tests/Polyhedron/NNCminimize3.cc,
+	  tests/Polyhedron/NNCminimize4.cc,
+	  tests/Polyhedron/NNCminimize5.cc,
+	  tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraint2.cc,
+	  tests/Polyhedron/addconstraint3.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints10.cc,
+	  tests/Polyhedron/addconstraints11.cc,
+	  tests/Polyhedron/addconstraints12.cc,
+	  tests/Polyhedron/addconstraints13.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addconstraints3.cc,
+	  tests/Polyhedron/addconstraints4.cc,
+	  tests/Polyhedron/addconstraints5.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/addconstraints7.cc,
+	  tests/Polyhedron/addconstraints8.cc,
+	  tests/Polyhedron/addconstraints9.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerator3.cc,
+	  tests/Polyhedron/addgenerator4.cc,
+	  tests/Polyhedron/addgenerator5.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators10.cc,
+	  tests/Polyhedron/addgenerators11.cc,
+	  tests/Polyhedron/addgenerators12.cc,
+	  tests/Polyhedron/addgenerators13.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addgenerators3.cc,
+	  tests/Polyhedron/addgenerators4.cc,
+	  tests/Polyhedron/addgenerators5.cc,
+	  tests/Polyhedron/addgenerators6.cc,
+	  tests/Polyhedron/addgenerators7.cc,
+	  tests/Polyhedron/addgenerators8.cc,
+	  tests/Polyhedron/addgenerators9.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims10.cc,
+	  tests/Polyhedron/addspacedims11.cc,
+	  tests/Polyhedron/addspacedims12.cc,
+	  tests/Polyhedron/addspacedims13.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/addspacedims4.cc,
+	  tests/Polyhedron/addspacedims5.cc,
+	  tests/Polyhedron/addspacedims6.cc,
+	  tests/Polyhedron/addspacedims7.cc,
+	  tests/Polyhedron/addspacedims8.cc,
+	  tests/Polyhedron/addspacedims9.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affineimage3.cc,
+	  tests/Polyhedron/affineimage4.cc,
+	  tests/Polyhedron/affineimage5.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/affineimage7.cc,
+	  tests/Polyhedron/affineimage8.cc,
+	  tests/Polyhedron/affineimage9.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinepreimage10.cc,
+	  tests/Polyhedron/affinepreimage11.cc,
+	  tests/Polyhedron/affinepreimage12.cc,
+	  tests/Polyhedron/affinepreimage2.cc,
+	  tests/Polyhedron/affinepreimage3.cc,
+	  tests/Polyhedron/affinepreimage4.cc,
+	  tests/Polyhedron/affinepreimage5.cc,
+	  tests/Polyhedron/affinepreimage6.cc,
+	  tests/Polyhedron/affinepreimage7.cc,
+	  tests/Polyhedron/affinepreimage8.cc,
+	  tests/Polyhedron/affinepreimage9.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/ascii_dump_load4.cc,
+	  tests/Polyhedron/ascii_dump_load5.cc,
+	  tests/Polyhedron/ascii_dump_load6.cc,
+	  tests/Polyhedron/ascii_dump_load7.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening10.cc,
+	  tests/Polyhedron/bhrz03widening11.cc,
+	  tests/Polyhedron/bhrz03widening12.cc,
+	  tests/Polyhedron/bhrz03widening13.cc,
+	  tests/Polyhedron/bhrz03widening14.cc,
+	  tests/Polyhedron/bhrz03widening15.cc,
+	  tests/Polyhedron/bhrz03widening16.cc,
+	  tests/Polyhedron/bhrz03widening17.cc,
+	  tests/Polyhedron/bhrz03widening18.cc,
+	  tests/Polyhedron/bhrz03widening19.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhrz03widening4.cc,
+	  tests/Polyhedron/bhrz03widening5.cc,
+	  tests/Polyhedron/bhrz03widening6.cc,
+	  tests/Polyhedron/bhrz03widening7.cc,
+	  tests/Polyhedron/bhrz03widening8.cc,
+	  tests/Polyhedron/bhrz03widening9.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening4.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffineimage2.cc,
+	  tests/Polyhedron/boundedaffineimage3.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage2.cc,
+	  tests/Polyhedron/boundedaffinepreimage3.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc,
+	  tests/Polyhedron/boundingbox4.cc,
+	  tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/bounds2.cc, tests/Polyhedron/bug2.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/concatenate2.cc,
+	  tests/Polyhedron/concatenate3.cc,
+	  tests/Polyhedron/concatenate4.cc,
+	  tests/Polyhedron/concatenate5.cc,
+	  tests/Polyhedron/concatenate6.cc,
+	  tests/Polyhedron/concatenate7.cc,
+	  tests/Polyhedron/constraints1.cc,
+	  tests/Polyhedron/constraints2.cc,
+	  tests/Polyhedron/constraints3.cc,
+	  tests/Polyhedron/constraints4.cc,
+	  tests/Polyhedron/constraints5.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+	  tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/disjoint3.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage10.cc,
+	  tests/Polyhedron/generalizedaffineimage11.cc,
+	  tests/Polyhedron/generalizedaffineimage12.cc,
+	  tests/Polyhedron/generalizedaffineimage13.cc,
+	  tests/Polyhedron/generalizedaffineimage14.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffineimage3.cc,
+	  tests/Polyhedron/generalizedaffineimage4.cc,
+	  tests/Polyhedron/generalizedaffineimage5.cc,
+	  tests/Polyhedron/generalizedaffineimage6.cc,
+	  tests/Polyhedron/generalizedaffineimage7.cc,
+	  tests/Polyhedron/generalizedaffineimage8.cc,
+	  tests/Polyhedron/generalizedaffineimage9.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generalizedaffinepreimage3.cc,
+	  tests/Polyhedron/generalizedaffinepreimage4.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+	  tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+	  tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+	  tests/Polyhedron/generators7.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/gramschmidt1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc,
+	  tests/Polyhedron/h79widening3.cc,
+	  tests/Polyhedron/h79widening4.cc,
+	  tests/Polyhedron/h79widening5.cc,
+	  tests/Polyhedron/h79widening6.cc,
+	  tests/Polyhedron/h79widening7.cc,
+	  tests/Polyhedron/h79widening8.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/intersection10.cc,
+	  tests/Polyhedron/intersection11.cc,
+	  tests/Polyhedron/intersection2.cc,
+	  tests/Polyhedron/intersection3.cc,
+	  tests/Polyhedron/intersection4.cc,
+	  tests/Polyhedron/intersection5.cc,
+	  tests/Polyhedron/intersection6.cc,
+	  tests/Polyhedron/intersection7.cc,
+	  tests/Polyhedron/intersection8.cc,
+	  tests/Polyhedron/intersection9.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation2.cc,
+	  tests/Polyhedron/limitedh79extrapolation3.cc,
+	  tests/Polyhedron/limitedh79extrapolation4.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearpartition2.cc,
+	  tests/Polyhedron/linearpartition3.cc,
+	  tests/Polyhedron/linearpartition4.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/lpproblem2.cc,
+	  tests/Polyhedron/lpproblem3.cc,
+	  tests/Polyhedron/mapspacedims1.cc,
+	  tests/Polyhedron/mapspacedims2.cc,
+	  tests/Polyhedron/mapspacedims3.cc,
+	  tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/max_min1.cc, tests/Polyhedron/max_min2.cc,
+	  tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+	  tests/Polyhedron/membytes1.cc, tests/Polyhedron/membytes2.cc,
+	  tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+	  tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/minconstraints3.cc,
+	  tests/Polyhedron/minconstraints4.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/mingenerators3.cc,
+	  tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polydifference3.cc,
+	  tests/Polyhedron/polydifference4.cc,
+	  tests/Polyhedron/polydifference5.cc,
+	  tests/Polyhedron/polydifference6.cc,
+	  tests/Polyhedron/polydifference7.cc,
+	  tests/Polyhedron/polydifference8.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+	  tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+	  tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+	  tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+	  tests/Polyhedron/polyhull9.cc, tests/Polyhedron/polypowerset1.cc,
+	  tests/Polyhedron/powerset1.cc,
+	  tests/Polyhedron/primalsimplex1.cc,
+	  tests/Polyhedron/primalsimplex2.cc,
+	  tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+	  tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+	  tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+	  tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+	  tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+	  tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+	  tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+	  tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+	  tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+	  tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+	  tests/Polyhedron/relations9.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims10.cc,
+	  tests/Polyhedron/removespacedims2.cc,
+	  tests/Polyhedron/removespacedims3.cc,
+	  tests/Polyhedron/removespacedims4.cc,
+	  tests/Polyhedron/removespacedims5.cc,
+	  tests/Polyhedron/removespacedims6.cc,
+	  tests/Polyhedron/removespacedims7.cc,
+	  tests/Polyhedron/removespacedims8.cc,
+	  tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+	  tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+	  tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+	  tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+	  tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+	  tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+	  tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+	  tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+	  tests/Polyhedron/universe7.cc, tests/Polyhedron/watchdog1.cc,
+	  tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writegensys2.cc,
+	  tests/Polyhedron/writegensys3.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writepolyhedron3.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+	  utils/build_header.in, utils/text2cxxarray.in, utils/timings.cc,
+	  utils/timings.hh
+	  (grids.[1,2,5,5,3,3,9,17,4,3,9,3,2,3,1,2,2,3,1,2,4,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,5,2,3,2,2,2,2,2,2,2,2,2,2,5,2,6,3,10,6,3,2,2,5,2,2,5,3,2,2,2,6,6,2,2,4,3,5,2,5,2,2,3,3,3,4,2,3,2,3,3,5,2,4,2,2,2,2,3,7,2,2,2,4,2,3,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,3,3,4,4,5,2,2,2,2,3,2,2,2,2,2,3,2,2,3,3,2,2,3,3,2,2,2,2,2,2,2,2,4,4,4,4,3,4,4,4,2,2,3,4,3,2,2,2,2,2,2,2,2,3,2,1,4,4,2,7,7,1,3,3,2,1,4,4,4,1,4,4,3,1,3,9,8 [...]
+	  Seventh (last but one?) merge of the main trunk to the grids
+	  branch.
+
+2006-01-15 Sunday 22:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.inlines.hh (grids.12): Update method
+	  clear to add the parameter divisor column after clearing.  Add
+	  notes that the size adjustments in the space dimension returning
+	  methods are for the parameter divisor column.
+
+2006-01-15 Sunday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.203): Commented out the code for the
+	  --enable-instantiations option (since it does not belong to this
+	  release).
+
+2006-01-15 Sunday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.178): Also the C interface is controlled by
+	  --enable-interfaces.
+
+2006-01-15 Sunday 22:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.202), demos/ppl_lpsol/Makefile.am (1.20),
+	  interfaces/C/Makefile.am (1.23): Allow the C interface not to be
+	  built using the --enable-interfaces configure option.
+
+2006-01-15 Sunday 21:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked.inlines.hh (grids.9): Update gcdext_exact to always
+	  return errors from functions abs and neg.  Describe the COPY_GMP
+	  directive.
+
+2006-01-15 Sunday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.172): Powerset::meet_assign() will not be renamed.
+
+2006-01-15 Sunday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.60): Added several Doxygen comments
+	  and some vertical space.  Fixed a couple of comments.
+
+2006-01-15 Sunday 20:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/DB_Matrix.defs.hh (1.18): Let ascii_load documentation show
+	  in the developers' manual only.
+
+2006-01-15 Sunday 20:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BDS_Status.inlines.hh (1.12): Fixed a \relates Doxygen
+	  command.
+
+2006-01-15 Sunday 18:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_widenings.cc (grids.12): Only add the limiting
+	  congruences if widening will changes the grid.
+
+2006-01-15 Sunday 17:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/: Makefile.am (1.45), affinepreimage12.cc (1.1):
+	  Add affinepreimage12, which tests the examples from
+	  definitions.dox.
+
+2006-01-15 Sunday 17:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/affinepreimage12.cc (grids.1): file
+	  affinepreimage12.cc was added on branch grids on 2006-01-16
+	  01:10:40 +0000
+
+2006-01-15 Sunday 16:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/README.doc (1.9): Changed: "all you need is to find it" to
+	  "all you need to do is to find it".  "to build." to "to be
+	  built." determined before"" to "already determined".
+
+2006-01-15 Sunday 16:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Checked_Number.defs.hh (1.59): Change "proviso" to
+	  "provisos".
+
+2006-01-15 Sunday 16:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/README.doc (1.8): Changed "willing" to "wishing".
+
+2006-01-15 Sunday 14:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.149): Tried to specify
+	  which versions of XSB can be expected to work and which not.	It
+	  is a disaster, but there is little we can do about that.
+
+2006-01-15 Sunday 14:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.44), lpproblem1.cc (1.4),
+	  lpproblem3.cc (1.2): Added another test for LP_Problem.  Avoid
+	  redundnat inclusion in lpproblem1.cc.
+
+2006-01-15 Sunday 14:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/lpproblem1.cc (grids.1): file lpproblem1.cc was
+	  added on branch grids on 2006-01-16 01:10:41 +0000
+
+2006-01-15 Sunday 14:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/lpproblem3.cc (grids.1): file lpproblem3.cc was
+	  added on branch grids on 2006-01-16 01:10:41 +0000
+
+2006-01-15 Sunday 13:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.84): Backtracking: XSB does
+	  not support 32-bit integers.
+
+2006-01-15 Sunday 12:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.187): Corrected the result for the example
+	  on affine preimages as well as a typo, both signaled by Matthew.
+
+2006-01-15 Sunday 11:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.30): Revised tests for
+	  ppl_Coefficient_max/1 and ppl_Coefficient_min/1.  Reduced the
+	  maximum and minimum integer that can be handled by XSB to 2^28-1
+	  and -2^28 respectively.
+
+2006-01-15 Sunday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.174): Predicates
+	  ppl_Coefficient_min/1 and ppl_Coefficient_max/1 now fail if the
+	  respective values are not representable as Prolog integers.
+	  Avoid compiler warnings.  Indentation fixed.
+
+2006-01-15 Sunday 10:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: SICStus/ppl_sicstus_sd.cc (1.89),
+	  YAP/ppl_yap.cc (1.112): Declare and initialize
+	  Prolog_min_integer.  Avoid a compiler warning.
+
+2006-01-15 Sunday 10:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.117): Initialize
+	  Prolog_min_integer and Prolog_max_integer.
+
+2006-01-15 Sunday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/ppl_gprolog_sd.cc (1.37), XSB/ppl_xsb.cc
+	  (1.83): Avoid a compiler warning.
+
+2006-01-15 Sunday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.44): Define
+	  Prolog_min_integer.  Avoid a compiler warning.
+
+2006-01-15 Sunday 09:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.87): Implementation of
+	  ppl_Coefficient_is_bounded/0 improved.
+
+2006-01-15 Sunday 03:29  Andrea Cimino
+
+	* tests/Polyhedron/: Makefile.am, lpproblem3.cc (simplex.[4,1]):
+	  Added another test for LP_Problem.
+
+2006-01-14 Saturday 22:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.186): Revert last change.
+
+2006-01-14 Saturday 22:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.185): Replace "there exist a matrix" with
+	  "there exists a matrix" in subsection "Images and Preimages of
+	  Affine Transfer Relations".
+
+2006-01-14 Saturday 21:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.82): In XSB 2.7.1,
+	  <cinterf.h> no longer pollutes the namespace with `min' and
+	  `max'.  However, in XSB 2.7.1, <error_xsb.h> still does not come
+	  with the extern "C" wrapper.
+
+2006-01-14 Saturday 20:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.184): Change the first \leq in the affine
+	  relation definition in subsection Generalized_Affine_Relations to
+	  \relsym.
+
+2006-01-14 Saturday 20:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.148): Removed an
+	  obsolete (and actually misleading) sentence about the XSB
+	  interface.
+
+2006-01-14 Saturday 19:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.58): Two corrections to the
+	  documentation of input(): acceptable bases are in the range 2-36;
+	  bases (as well as exponents) are always written as plain base-10
+	  integers.
+
+2006-01-14 Saturday 18:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.81): Two FIXMEs turned into
+	  TODOs: we can do nothing about them until the XSB people fix
+	  their header file.
+
+2006-01-14 Saturday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.36): Two FIXMEs turned
+	  into TODOs: we can do nothing about them until the GNU Prolog
+	  people fix their header file.
+
+2006-01-14 Saturday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.43): Two FIXMEs turned into
+	  TODOs: we can do nothing about them until the Ciao people fix
+	  their header file.
+
+2006-01-14 Saturday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.111): Two FIXME's resolved.
+
+2006-01-14 Saturday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.42): Two FIXMEs resolved.
+
+2006-01-14 Saturday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.171): We are well under 40 FIXMEs.  For PPL 0.9 the
+	  objective is to go below 20.
+
+2006-01-14 Saturday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: user.doxyconf-html.in (1.34), user.doxyconf-latex.in (1.6):
+	  Added PPL_SPECIALIZE_LIMITS_INT and PPL_SPECIALIZE_LIMITS_FLOAT
+	  to EXPAND_AS_DEFINED.
+
+2006-01-14 Saturday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.30): Extended the section on limiting the visibility
+	  of everything.  Some material that was in the section about
+	  macros has been moved here.
+
+2006-01-14 Saturday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_numeric_limits.hh (1.6): Comments revised so as to avoid
+	  redundancy.
+
+2006-01-14 Saturday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.11): Macros
+	  SPECIALIZE_LIMITS_INT and SPECIALIZE_LIMITS_FLOAT renamed
+	  PPL_SPECIALIZE_LIMITS_INT and PPL_SPECIALIZE_LIMITS_FLOAT,
+	  respectively.  They are also undefined as soon as no longer
+	  necessary.  Partial specializations of std::numeric_limits
+	  provided with a Doxygen comment.
+
+2006-01-14 Saturday 16:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* NEWS (1.177): Always indent code with two spaces.  Convert tabs
+	  to spaces.
+
+2006-01-14 Saturday 16:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* NEWS (1.176): Correct spelling of "publicly".
+
+2006-01-14 Saturday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.137): Generate ppl.hh simply as a copy of
+	  ppl_install.hh.  The old kludge to generate ppl.hh has simply
+	  been comments out, in case the new method proves to yield worse
+	  user documentation (via Doxygen).
+
+2006-01-14 Saturday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.151): FIXME resolved.
+
+2006-01-14 Saturday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/namespaces.hh (1.6): In the documentation of namespace std,
+	  specify that we also specialize std::numeric_limits.
+
+2006-01-14 Saturday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_numeric_limits.hh (1.5): Specializations for
+	  std::numeric_limits commented.
+
+2006-01-14 Saturday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.57): Improved the documentation for
+	  input(std::istream&, Checked_Number<T, Policy>&, Rounding_Dir).
+
+2006-01-14 Saturday 15:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* Watchdog/NEWS (1.7): Add detail to the 0.5 Time entry.
+
+2006-01-14 Saturday 15:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* Watchdog/NEWS (1.6): Update 0.8 entries from ChangeLog.
+
+2006-01-14 Saturday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.24): Added three new tests.
+
+2006-01-14 Saturday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.150): Two FIXMEs resolved.  Be
+	  consistent in the use of assign_r().
+
+2006-01-14 Saturday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.62): Typo fixed.
+
+2006-01-14 Saturday 14:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* NEWS (1.175): Update 0.8 entries from ChangeLog.
+
+2006-01-14 Saturday 13:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Powerset.defs.hh (1.17), Powerset.inlines.hh (1.14):
+	  Iterators for Powerset renamed as omega_iterator and
+	  omega_const_iterator.  Added corresponding typedefs for the
+	  previous naming and documented the typedefs.
+
+2006-01-14 Saturday 13:48  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (1.56): Added empty fractional to
+	  formal syntax.
+
+2006-01-14 Saturday 13:38  Abramo Bagnara
+
+	* src/checked.cc (1.15), tests/Polyhedron/numberinput1.cc (1.23):
+	  Allow empty fractional part.
+
+2006-01-14 Saturday 12:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.55): Completed a draft
+	  documentation for Result input(std::istream& is,
+	  Checked_Number<T, Policy>& x, Rounding_Dir dir).
+
+2006-01-14 Saturday 09:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.174), README (1.40): Reworded a couple of sentences.
+
+2006-01-14 Saturday 08:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.29): Corrected a test for
+	  ppl_Coefficient_min/1.
+
+2006-01-13 Friday 22:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README (1.39): Added bullet about linear programming problem
+	  solver.  Minor language improvements.
+
+2006-01-13 Friday 21:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.10): Cosmetic changes.
+
+2006-01-13 Friday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_numeric_limits.hh (1.4): Fixed: all specializations of
+	  std::numeric_limits must have the `is_specialized' field set to
+	  true.
+
+2006-01-13 Friday 19:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.54): Include
+	  "checked_numeric_limits.hh".	Long line broken.
+
+2006-01-13 Friday 19:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.173): Do not write
+	  std::numeric_limits<const Coefficient>: write
+	  std::numeric_limits<Coefficient> instead.
+
+2006-01-13 Friday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/Makefile.am (1.22), C/ppl_c.cc (1.149),
+	  Prolog/ppl_prolog.icc (1.172), Prolog/Ciao/Makefile.am (1.52),
+	  Prolog/Ciao/ppl_ciao.cc (1.41), Prolog/GNU/Makefile.am (1.52),
+	  Prolog/GNU/ppl_gprolog_sd.cc (1.35), Prolog/SICStus/Makefile.am
+	  (1.63), Prolog/SICStus/ppl_sicstus_sd.cc (1.88),
+	  Prolog/SWI/Makefile.am (1.59), Prolog/SWI/ppl_swiprolog.cc
+	  (1.116), Prolog/XSB/Makefile.am (1.41), Prolog/XSB/ppl_xsb.cc
+	  (1.80), Prolog/YAP/Makefile.am (1.43), Prolog/YAP/ppl_yap.cc
+	  (1.110): No longer include individual PPL header file: include
+	  ppl_install.hh and pwl_install.hh instead.
+
+2006-01-13 Friday 18:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Powerset.defs.hh (1.16): Some comments revised.
+
+2006-01-13 Friday 14:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* TODO (1.170): Add Debian package TODO list.
+
+2006-01-13 Friday 14:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/control.prologs (1.1): Initial revision.
+
+2006-01-13 Friday 14:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/control.prologs (grids.1): file control.prologs was added
+	  on branch grids on 2006-01-16 01:10:28 +0000
+
+2006-01-13 Friday 14:02  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.20): Some bugs in `incrementality'
+	  (appear to be) fixed.  `erase_artificials', modified for this
+	  reason, now  is used also by incrementality.	Added some useful
+	  checks in OK().
+
+2006-01-13 Friday 13:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/control (1.11): Only build the packages for which Debian
+	  provides the build requirements.
+
+2006-01-13 Friday 13:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.28): Improvements to tests
+	  involving large numbers and coefficients.  Part of test on
+	  coefficients commented temporarily until problems with this are
+	  fixed.
+
+2006-01-13 Friday 10:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.120): ascii_dump&load methods no
+	  longer inlined (and moved away from other inlined methods).
+
+2006-01-13 Friday 10:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.61), BD_Shape.inlines.hh (1.119): No
+	  longer disregard the optional tokens parameter in the widening
+	  and extrapolation methods. A token parameter also added to CC76's
+	  extrapolation operator.  Removed a couple of misplaced OK()
+	  assertions.
+
+2006-01-12 Thursday 22:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/GNU/README (1.2): Clip trailing whitespace.
+
+2006-01-12 Thursday 22:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl-pwl.install (1.3): Add usr/lib/libpwl.so.
+
+2006-01-12 Thursday 22:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/: libppl-dev.install (1.3), libppl.install (1.5): Move
+	  usr/lib/libppl.so from libppl-dev to libppl.	Add
+	  usr/bin/ppl-config to libppl.
+
+2006-01-12 Thursday 22:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/control (1.10): Drop the libppl-swi and libppl-gprolog
+	  dependencies on swi-prolog and gprolog, resp.
+
+2006-01-12 Thursday 22:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* BUGS (1.5): Improve the known bugs statement.
+
+2006-01-12 Thursday 17:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.16): Fix misplaced semicolon.
+
+2006-01-12 Thursday 17:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.183): Small improvements to subsection 1.6
+	  on the powerset domain.
+
+2006-01-12 Thursday 16:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/rules (1.8): Correct the ppl-config source directory.
+	  Improve two comments.
+
+2006-01-12 Thursday 16:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl.install (1.4): Add ppl_lpsol and the manual pages.
+
+2006-01-12 Thursday 16:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl.dirs (1.3): Add usr/share/man/man1.
+
+2006-01-12 Thursday 16:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl-pwl.install (1.2): Move pwl.hh to libppl-dev.
+
+2006-01-12 Thursday 16:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl-dev.install (1.2): Add the header files.
+
+2006-01-12 Thursday 16:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/control (1.9): Add glpk to Build-Depends.
+
+2006-01-12 Thursday 13:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/rules (1.7): Add ppl_lpsol and ppl-config to the programs
+	  installed in install-arch.
+
+2006-01-12 Thursday 13:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/control (1.8): Update to the new GMP package names.  Add
+	  libgmp3-doc to the libdevel suggested packages.  Improve some
+	  wording in the libppl-dev description.
+
+2006-01-12 Thursday 08:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.147),
+	  Ciao/ciao_pl_check.pl (1.19), Ciao/ppl_ciao.cc (1.40),
+	  Ciao/ppl_ciao.pl (1.86), GNU/ppl_gprolog.pl (1.58),
+	  SICStus/ppl_sicstus_sd.cc (1.87), SWI/ppl_swiprolog.cc (1.115),
+	  XSB/ppl_xsb.H (1.46), XSB/ppl_xsb.cc (1.79), XSB/xsb_pl_check.P
+	  (1.24), YAP/ppl_yap.cc (1.109), tests/pl_check.pl (1.27): Added
+	  predicates ppl_Coeffient_is_bounded/0, ppl_Coefficient_max and
+	  ppl_Coefficient_min.	A few small bugs fixed.
+
+2006-01-11 Wednesday 23:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.26): Obsolete hack
+	  removed.
+
+2006-01-11 Wednesday 23:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.171): Fixed
+	  ppl_Coefficient_min() and ppl_Coefficient_max().
+
+2006-01-11 Wednesday 22:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.28): Include ppl-config in %{_bindir} and the man
+	  pages in %{_mandir}/man1.
+
+2006-01-11 Wednesday 22:16  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[19,18]): *this
+	  was not fully cleared if the problem was solved from scratch.
+	  Typo fixed in the documentation.
+
+2006-01-11 Wednesday 20:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/rules (1.6): Improve the comment about ppl_lcdd.  Improve
+	  the comments about the installation of the change logs.  Merge
+	  the copy commands of the merged browse and print documents.
+
+2006-01-11 Wednesday 19:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/rules (1.5): Call autoreconf instead of each of the auto*
+	  scripts.  Leave the configuration of the Watchdog to the PPL
+	  configure command.
+
+2006-01-11 Wednesday 18:35  Andrea Cimino
+
+	* src/LP_Problem.defs.hh (simplex.17): Minor documentation
+	  improvements.
+
+2006-01-11 Wednesday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.170): New functions
+	  ppl_Coefficient_is_bounded(), ppl_Coefficient_min(Prolog_term_ref
+	  t_min) and ppl_Coefficient_max(Prolog_term_ref t_max) allow the
+	  Prolog application to inspect the basic properties of the
+	  `Coefficient' integer type.
+
+2006-01-11 Wednesday 17:52  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[18,16,17]): Totally rehandled the way of mapping the
+	  `input_cs' columns with the `tableau' ones: `dim_map' is no
+	  longer used.	Renamed `swap_base' to `pivot'.  `slack' and
+	  `artificial' variables are better handled and documented.
+
+2006-01-11 Wednesday 15:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Matrix.cc (1.92): Convert the add_recycled_row row size
+	  assertion into an OK assertion on the given row.
+
+2006-01-11 Wednesday 13:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/changelog (1.2): Clear dummy entry.
+
+2006-01-11 Wednesday 12:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.15), Ph_Status.idefs.hh (1.15):
+	  Avoid include directives in files *.idefs.hh.
+
+2006-01-11 Wednesday 11:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.14), BD_Shape.defs.hh (1.60),
+	  DB_Matrix.defs.hh (1.17), Linear_Row.defs.hh (1.16),
+	  Ph_Status.idefs.hh (1.14), Polyhedra_Powerset.defs.hh (1.30),
+	  Row.defs.hh (1.102): Added a few missing \ref doxygen commands.
+	  Prefer direct vs indirect inclusion of globals.defs.hh.
+
+2006-01-11 Wednesday 11:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/DB_Row.defs.hh (1.16): Spurious dot in doxygen documentation
+	  removed.
+
+2006-01-11 Wednesday 11:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.63), devref.doxyconf-latex.in
+	  (1.6), user.doxyconf-html.in (1.33), user.doxyconf-latex.in
+	  (1.5): Expanding as predefined the macro PPL_OUTPUT_DECLARATIONS,
+	  so as to avoid warnings in the user manual and to see the
+	  documentation in the devref manual.
+
+2006-01-11 Wednesday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh (1.29): The comments for output methods
+	  marked as brief comments.
+
+2006-01-11 Wednesday 02:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Linear_System.cc (1.37), Matrix.cc (1.91), Matrix.defs.hh
+	  (1.73), Matrix.inlines.hh (1.49): Add Matrix methods
+	  add_row(const Row&) and add_recycled_row(Row&).  Update
+	  Linear_System::add_row to use Matrix::add_row.
+
+2006-01-10 Tuesday 21:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/ppl-config.1 (grids.1): file ppl-config.1 was added on branch
+	  grids on 2006-01-16 01:10:29 +0000
+
+2006-01-10 Tuesday 21:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config.1 (1.3): Improved.
+
+2006-01-10 Tuesday 21:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/ppl_lcdd.1 (grids.1): file ppl_lcdd.1 was added on branch
+	  grids on 2006-01-16 01:10:29 +0000
+
+2006-01-10 Tuesday 21:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.42), ppl_lcdd.1 (1.1): Added a draft man
+	  page for `ppl_lcdd'.
+
+2006-01-10 Tuesday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.54): Changed again: option
+	  --max-memory has now -R (and not -M) as its short counterpart.
+
+2006-01-10 Tuesday 20:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/ppl_lpsol.1 (grids.1): file ppl_lpsol.1 was added on branch
+	  grids on 2006-01-16 01:10:29 +0000
+
+2006-01-10 Tuesday 20:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.41), ppl_lpsol.1 (1.1): Added a draft man
+	  page for `ppl_lpsol'.
+
+2006-01-10 Tuesday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.28): Option --max-memory has now
+	  -R (and not -V) as its short counterpart.  New option --version
+	  (-V) prints version information on stdout.  Fixed a couple of
+	  error messages.
+
+2006-01-10 Tuesday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.53): Option --max-memory has now -M
+	  (and not -V) as its short counterpart.  New option --version (-V)
+	  prints version information on stdout.  Fixed a bug in the
+	  definition of OPTION_LETTERS (-c is not available unless USE_PPL
+	  is defined).
+
+2006-01-10 Tuesday 20:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config.1 (1.2), src/ppl-config.cc.in (1.15): In the
+	  documentation for option --help (-h), specify that the output is
+	  written on stdout.
+
+2006-01-10 Tuesday 20:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.40), ppl-config.1 (1.1): Added a draft man
+	  page for `ppl-config'.
+
+2006-01-10 Tuesday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.36), Watchdog/Makefile.am (1.25),
+	  Watchdog/src/Makefile.am (1.5), Watchdog/utils/Makefile.am (1.6),
+	  demos/Makefile.am (1.9), demos/ppl_lcdd/Makefile.am (1.22),
+	  demos/ppl_lcdd/examples/Makefile.am (1.7),
+	  demos/ppl_lpsol/Makefile.am (1.19),
+	  demos/ppl_lpsol/examples/Makefile.am (1.6), doc/Makefile.am
+	  (1.39), interfaces/Makefile.am (1.13), interfaces/C/Makefile.am
+	  (1.21), interfaces/OCaml/Makefile.am (1.12),
+	  interfaces/Prolog/Makefile.am (1.30),
+	  interfaces/Prolog/Ciao/Makefile.am (1.51),
+	  interfaces/Prolog/GNU/Makefile.am (1.51),
+	  interfaces/Prolog/SICStus/Makefile.am (1.62),
+	  interfaces/Prolog/SWI/Makefile.am (1.58),
+	  interfaces/Prolog/XSB/Makefile.am (1.40),
+	  interfaces/Prolog/YAP/Makefile.am (1.42),
+	  interfaces/Prolog/tests/Makefile.am (1.7), m4/Makefile.am (1.16),
+	  src/Makefile.am (1.136), tests/Makefile.am (1.248),
+	  tests/BD_Shape/Makefile.am (1.32), tests/Polyhedron/Makefile.am
+	  (1.43), utils/Makefile.am (1.12): Avoid providing default
+	  information that Automake does figure out by itself.
+
+2006-01-10 Tuesday 18:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.14): Option --interface (-I) fixed.
+
+2006-01-10 Tuesday 18:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.13): The --all (-Z) option has been
+	  removed.
+
+2006-01-10 Tuesday 18:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.12): Print usage information to stdout,
+	  not stdin.  Include information on reporting bugs in the usage
+	  information.
+
+2006-01-10 Tuesday 16:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.13): If "$MAKE" is empty, define it
+	  to be "make".
+
+2006-01-10 Tuesday 16:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.12): Exploit the now available ascii_dump()
+	  method for Generator.
+
+2006-01-10 Tuesday 16:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/LP_Problem.cc (grids.1): file LP_Problem.cc was added on
+	  branch grids on 2006-01-16 01:10:33 +0000
+
+2006-01-10 Tuesday 16:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.inlines.hh (1.8): Dealt with another FIXME.
+
+2006-01-10 Tuesday 16:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/LP_Problem.inlines.hh (grids.1): file LP_Problem.inlines.hh
+	  was added on branch grids on 2006-01-16 01:10:33 +0000
+
+2006-01-10 Tuesday 16:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.11): When resizing the tableau, make sure we
+	  never try to go beyond Matrix::max_num_columns().
+
+2006-01-10 Tuesday 16:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.12): Allow to override the `make'
+	  command used: invoke "$MAKE" instead of "make".
+
+2006-01-10 Tuesday 15:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: BD_Shape.inlines.hh (1.118), Constraint.cc (1.55),
+	  Constraint.defs.hh (1.114), Constraint.inlines.hh (1.62),
+	  Constraint_System.cc (1.16), Constraint_System.defs.hh (1.25),
+	  DB_Matrix.defs.hh (1.16), DB_Matrix.inlines.hh (1.24),
+	  Generator.cc (1.68), Generator.defs.hh (1.114),
+	  Generator.inlines.hh (1.59), Generator_System.cc (1.16),
+	  Generator_System.defs.hh (1.13), LP_Problem.cc (1.10),
+	  LP_Problem.defs.hh (1.6), Linear_Row.cc (1.17),
+	  Linear_Row.defs.hh (1.15), Linear_System.cc (1.36),
+	  Linear_System.defs.hh (1.22), Matrix.cc (1.90), Matrix.defs.hh
+	  (1.72), Ph_Status.cc (1.9), Ph_Status.idefs.hh (1.13),
+	  Poly_Con_Relation.cc (1.12), Poly_Con_Relation.defs.hh (1.30),
+	  Poly_Gen_Relation.cc (1.12), Poly_Gen_Relation.defs.hh (1.28),
+	  Polyhedra_Powerset.defs.hh (1.29), Polyhedra_Powerset.inlines.hh
+	  (1.37), Polyhedron.defs.hh (1.290), Polyhedron_public.cc (1.71),
+	  Row.cc (1.97), Row.defs.hh (1.101), Saturation_Matrix.cc (1.8),
+	  Saturation_Matrix.defs.hh (1.6), BDS_Status.idefs.hh (1.13),
+	  BDS_Status.inlines.hh (1.11), BD_Shape.defs.hh (1.59): Add
+	  ascii_load(istream&) and ascii_dump(ostream&) to Constraint and
+	  to Generator.  Add ascii_dump() and print() to all classes having
+	  an ascii_dump(ostream&).  Move the detailed section of the
+	  Linear_System::ascii_dump doxygen doc into the method definition.
+	  Declare Poly_Con_Relation::acsii_dump(ostream&) and
+	  Poly_Gen_Relation::ascii_dump(ostream&) public.
+
+2006-01-10 Tuesday 15:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/LP_Problem.defs.hh (grids.1): file LP_Problem.defs.hh was
+	  added on branch grids on 2006-01-16 01:10:33 +0000
+
+2006-01-10 Tuesday 15:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/globals.defs.hh (1.28): Add macros PPL_STR(s), PPL_XSTR(s),
+	  PPL_OUTPUT_DECLARATIONS, PPL_OUTPUT_DEFINITIONS(class_name),
+	  PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name),
+	  PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix),
+	  PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol,
+	  class_prefix).
+
+2006-01-10 Tuesday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.108): Prolog_get_long()
+	  fixed.
+
+2006-01-10 Tuesday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.173), interfaces/C/ppl_c.cc (1.148),
+	  interfaces/C/ppl_c.h.in (1.61): New functions added to the C
+	  interface:
+
+	    int ppl_Coefficient_is_bounded(void),
+	    int ppl_Coefficient_min(mpz_t min),
+	    int ppl_Coefficient_max(mpz_t max)
+
+	  allow C applications to obtain information about the Coefficient
+	  integer numerical type.
+
+2006-01-10 Tuesday 13:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.9): An anonymous FIXME turned into a
+	  meaningful comment.
+
+2006-01-10 Tuesday 12:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.25): The large integer
+	  tests for Prolog systems with bounded integers improved so that
+	  they check the maximum and minimum integers at the interface.
+
+	  The exception testing for Prolog also improved and a bug fixed
+	  when testing the Prolog_unsigned_out_of_range exception.
+
+	  The exception testing for Prolog systems with bounded integers
+	  improved. We explicitly exclude XSB from these tests as it does
+	  not throw an exception when the numbers are out-of-range.
+
+2006-01-10 Tuesday 11:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.7), ppl.spec.in (1.27): Updated.
+
+2006-01-10 Tuesday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.201): Version number bumped.
+
+2006-01-09 Monday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.35), config.sub (1.33), Watchdog/config.guess
+	  (1.19), Watchdog/config.sub (1.18): Updated.
+
+2006-01-09 Monday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.23), Watchdog/ChangeLog (1.13): Updated.
+
+2006-01-09 Monday 21:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.78): XSB supports only 32-bit
+	  integers: two FIXMEs resolved.
+
+2006-01-09 Monday 18:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.58): Removed a FIXME that was already
+	  dealt with.
+
+2006-01-09 Monday 14:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.172), interfaces/Prolog/Prolog_interface.dox (1.146),
+	  interfaces/Prolog/ppl_prolog.icc (1.169),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.17),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.13),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.18),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.85),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.57),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.86),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.114),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.45),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.77),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.16),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.14),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.23),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.107),
+	  interfaces/Prolog/tests/clpq.pl (1.8),
+	  interfaces/Prolog/tests/clpq2.pl (1.8),
+	  interfaces/Prolog/tests/pl_check.pl (1.24):	 In the Prolog
+	  interface, the names and arities of the predicates
+	     that create handles for new polyhedra have been revised
+	     to match more closely the corresponding C and C++ interface
+	     operators.
+
+	     That is, instead of having "c" and/or "nnc" as arguments to
+	  indicate
+	     the topology of the polyhedron, the topologies are now part of
+	  the
+	     names of the predicates.
+
+	     In Prolog_interface.dox, add a link to a bug report
+	     about handling large numbers in XSB.
+
+2006-01-09 Monday 14:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.inlines.hh (1.7): Definitions reordered for
+	  clarity as well as to actually allow inlining.
+
+2006-01-09 Monday 14:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BDS_Status.inlines.hh (1.10): Methods OK(), ascii_dump() and
+	  ascii_load() are no longer inlined.
+
+2006-01-09 Monday 13:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.145),
+	  XSB/expected_pchk_int16 (1.4), XSB/expected_pchk_int16_a (1.4),
+	  XSB/expected_pchk_int32 (1.4), XSB/expected_pchk_int32_a (1.4),
+	  XSB/expected_pchk_int64_a (1.3), XSB/expected_pchk_int8 (1.3),
+	  XSB/expected_pchk_int8_a (1.4), tests/expected_pchk_int16 (1.7),
+	  tests/expected_pchk_int16_a (1.7), tests/expected_pchk_int32
+	  (1.7), tests/expected_pchk_int32_a (1.7),
+	  tests/expected_pchk_int64_a (1.6), tests/expected_pchk_int8
+	  (1.7), tests/expected_pchk_int8_a (1.7), tests/pl_check.pl
+	  (1.23): The tests in pl_check.pl now continue when there is an
+	  overflow exception.  Also the tests are more careful to output in
+	  'quiet' mode as the default.
+
+	  As a result of these changes, the expected_pchk files have to be
+	  revised.
+
+	  A type fixed in Prolog_definitions.dox.
+
+2006-01-08 Sunday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.35), src/Linear_System.defs.hh (1.21),
+	  tests/Polyhedron/gramschmidt1.cc (1.4): Method
+	  Linear_System::gram_schmidt() removed: it was buggy and not used.
+
+2006-01-08 Sunday 22:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.8): Dealt with a few FIXME's.
+
+2006-01-08 Sunday 21:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.inlines.hh (1.6): A couple of FIXME's properly
+	  renamed as TODO's.
+
+2006-01-08 Sunday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.169), interfaces/Prolog/Prolog_interface.dox (1.144):
+	  Improved the documentation about shared libraries and the Prolog
+	  interfaces.
+
+2006-01-08 Sunday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: DB_Matrix.inlines.hh (1.23), Matrix.inlines.hh (1.48),
+	  Saturation_Matrix.inlines.hh (1.6): Two FIXME's resolved and two
+	  useless static variables removed: while it is not clear why
+	  std::vector::max_size() is not static, GCC and the Intel C++
+	  compiler do compile out all overhead (GCC starting from -O1, the
+	  Intel compiler starting from -O2).
+
+2006-01-08 Sunday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.53), Checked_Number.inlines.hh
+	  (1.54): Constructor to build a Checked_Number from a different
+	  kind of Checked_Number marked "explicit" and made available (it
+	  was commented out).
+
+2006-01-08 Sunday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.168): Parallel builds now work everywhere.
+
+2006-01-08 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.22): Added a test on
+	  hexadecimal number syntax.
+
+2006-01-08 Sunday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.61): Temporarily force
+	  serialization of the tests (see
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html).
+
+2006-01-08 Sunday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.50), SICStus/Makefile.am
+	  (1.60), SWI/Makefile.am (1.57): Renamed some variables.
+
+2006-01-08 Sunday 15:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.49): Dependencies fixed.
+	  Allow the test targets to be executed in parallel.
+
+2006-01-08 Sunday 14:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.48), SICStus/Makefile.am
+	  (1.59), SWI/Makefile.am (1.56): Added missing prerequisites.
+
+2006-01-08 Sunday 11:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.52): Useless, commented-out
+	  declaration removed.
+
+2006-01-08 Sunday 10:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.22): Added a test for
+	  exception "notan_LP_Problem_handle".
+
+2006-01-08 Sunday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.96): Corrected use of exact_div_assign().
+
+2006-01-08 Sunday 08:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.34): Corrected uses of
+	  exact_div_assign().  Repeated computation factorized.
+
+2006-01-08 Sunday 08:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.7): Corrected the uses of lcm_assign().
+
+2006-01-08 Sunday 08:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh (1.18), GMP_Integer.inlines.hh (1.13):
+	  Removed the following redundant functions void
+	  gcd_assign(GMP_Integer& x, const GMP_Integer& y); void
+	  lcm_assign(GMP_Integer& x, const GMP_Integer& y); void
+	  exact_div_assign(GMP_Integer& x, const GMP_Integer& y); void
+	  sqrt_assign(GMP_Integer& x).
+
+2006-01-08 Sunday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.51), Checked_Number.inlines.hh
+	  (1.53): Restored function template <typename T, typename Policy>
+	  void neg_assign(Checked_Number<T, Policy>& x) and macro
+	  DEF_ASSIGN_FUN2_1.
+
+2006-01-07 Saturday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.50), Checked_Number.inlines.hh
+	  (1.52): The following redundant functions have been removed:
+	  template <typename T, typename Policy> void
+	  neg_assign(Checked_Number<T, Policy>& x); template <typename T,
+	  typename Policy> void gcd_assign(Checked_Number<T, Policy>& x,
+	  const Checked_Number<T, Policy>& y); template <typename T,
+	  typename Policy> void lcm_assign(Checked_Number<T, Policy>& x,
+	  const Checked_Number<T, Policy>& y); template <typename T,
+	  typename Policy> void exact_div_assign(Checked_Number<T, Policy>&
+	  x, const Checked_Number<T, Policy>& y); template <typename T,
+	  typename Policy> void sqrt_assign(Checked_Number<T, Policy>& x).
+	  No longer used macros DEF_ASSIGN_FUN2_1 and DEF_ASSIGN_FUN3_2
+	  removed as well.
+
+2006-01-06 Friday 21:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/lpproblem1.cc (simplex.2): Put under CVS
+	  control.
+
+2006-01-06 Friday 21:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* ChangeLog, Makefile.am, NEWS, README, README.configure,
+	  STANDARDS, TODO, config.guess, config.sub, configure.ac,
+	  install-sh, instchk.hh, ltmain.sh, Watchdog/ChangeLog,
+	  Watchdog/Makefile.am, Watchdog/README, Watchdog/config.guess,
+	  Watchdog/config.sub, Watchdog/configure.ac, Watchdog/install-sh,
+	  Watchdog/ltmain.sh, Watchdog/src/Doubly_Linked_Object.defs.hh,
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/src/Doubly_Linked_Object.types.hh,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	  Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	  Watchdog/src/EList_Iterator.inlines.hh,
+	  Watchdog/src/EList_Iterator.types.hh,
+	  Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+	  Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+	  Watchdog/src/Pending_Element.cc,
+	  Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Pending_Element.inlines.hh,
+	  Watchdog/src/Pending_Element.types.hh,
+	  Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+	  Watchdog/src/Pending_List.inlines.hh,
+	  Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+	  Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	  Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	  Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	  Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	  Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+	  demos/Makefile.am, demos/ppl_lcdd/Makefile.am,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/Makefile.am,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+	  demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+	  demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+	  demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+	  demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+	  doc/README.doc, doc/definitions.dox, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/devref.tex, doc/ppl.sty,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  doc/user.tex, interfaces/Makefile.am, interfaces/C/Makefile.am,
+	  interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+	  interfaces/OCaml/Makefile.am, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/gp_clpq.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/pl_clpq.cc,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/SWI/ppl_pl.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_clpq2_int16,
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int32,
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int64,
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int8,
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq_int16,
+	  interfaces/Prolog/XSB/expected_clpq_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq_int32,
+	  interfaces/Prolog/XSB/expected_clpq_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq_int64,
+	  interfaces/Prolog/XSB/expected_clpq_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq_int8,
+	  interfaces/Prolog/XSB/expected_clpq_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq_mpz,
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a,
+	  interfaces/Prolog/XSB/expected_pchk_int16,
+	  interfaces/Prolog/XSB/expected_pchk_int16_a,
+	  interfaces/Prolog/XSB/expected_pchk_int32,
+	  interfaces/Prolog/XSB/expected_pchk_int32_a,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/ppl_yap.pl,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int32,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int64,
+	  interfaces/Prolog/tests/expected_clpq2_int64_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq2_mpz,
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_clpq_int32,
+	  interfaces/Prolog/tests/expected_clpq_int32_a,
+	  interfaces/Prolog/tests/expected_clpq_int64,
+	  interfaces/Prolog/tests/expected_clpq_int64_a,
+	  interfaces/Prolog/tests/expected_clpq_int8,
+	  interfaces/Prolog/tests/expected_clpq_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_mpz,
+	  interfaces/Prolog/tests/expected_clpq_mpz_a,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl, m4/Makefile.am,
+	  m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+	  m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+	  m4/ac_cxx_attribute_weak.m4, m4/ac_cxx_double_is_iec_559.m4,
+	  m4/ac_cxx_flexible_arrays.m4, m4/ac_cxx_float_is_iec_559.m4,
+	  m4/ac_cxx_long_double.m4, m4/ac_cxx_long_double_is_iec_559.m4,
+	  m4/ac_cxx_long_long.m4, m4/ppl.m4, src/Ask_Tell.defs.hh,
+	  src/Ask_Tell.inlines.hh, src/Ask_Tell.types.hh,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh,
+	  src/BHRZ03_Certificate.types.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+	  src/Bounding_Box.types.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Checked_Number.types.hh, src/Coefficient.cc,
+	  src/Coefficient.defs.hh, src/Coefficient.inlines.hh,
+	  src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Constraint.types.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/Constraint_System.inlines.hh, src/Constraint_System.types.hh,
+	  src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+	  src/DB_Matrix.types.hh, src/DB_Row.defs.hh,
+	  src/DB_Row.inlines.hh, src/DB_Row.types.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/Determinate.types.hh, src/Float.cc, src/Float.defs.hh,
+	  src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator.types.hh,
+	  src/Generator_System.cc, src/Generator_System.defs.hh,
+	  src/Generator_System.inlines.hh, src/Generator_System.types.hh,
+	  src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+	  src/H79_Certificate.inlines.hh, src/H79_Certificate.types.hh,
+	  src/Init.cc, src/Init.defs.hh, src/Init.types.hh,
+	  src/Interval.cc, src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Interval.types.hh, src/LP_Problem.cc, src/LP_Problem.defs.hh,
+	  src/LP_Problem.inlines.hh, src/LP_Problem.types.hh,
+	  src/Limits.hh, src/Linear_Expression.cc,
+	  src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	  src/Linear_Expression.types.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_Row.types.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/Linear_System.types.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh, src/Matrix.types.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Native_Integer.types.hh, src/Numeric_Format.defs.hh,
+	  src/Ph_Status.cc, src/Ph_Status.idefs.hh,
+	  src/Ph_Status.inlines.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+	  src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Poly_Gen_Relation.types.hh, src/Polyhedra_Powerset.cc,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+	  src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+	  src/Result.defs.hh, src/Result.inlines.hh,
+	  src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/Row.types.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+	  src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+	  src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Scalar_Products.types.hh, src/Topology.hh, src/Variable.cc,
+	  src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Variable.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	  src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_ext.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/compiler.hh, src/conversion.cc, src/float.types.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh,
+	  src/globals.types.hh, src/initializer.hh,
+	  src/max_space_dimension.hh, src/minimize.cc,
+	  src/mp_numeric_limits.hh, src/namespaces.hh,
+	  src/ppl-config.cc.in, src/ppl_header.hh, src/simplex.cc,
+	  src/simplify.cc, src/swapping_sort.icc, src/version.cc,
+	  src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+	  tests/Makefile.am, tests/PFunction.cc, tests/PFunction.hh,
+	  tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/Random_Number_Generator.types.hh, tests/ehandlers.cc,
+	  tests/ehandlers.hh, tests/files.cc, tests/files.hh,
+	  tests/ppl_test.hh, tests/print.cc, tests/print.hh,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+	  tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/addspacedims7.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage10.cc,
+	  tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+	  tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+	  tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/affinepreimage5.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/bdsdifference1.cc,
+	  tests/BD_Shape/bdsdifference2.cc,
+	  tests/BD_Shape/bdsdifference3.cc,
+	  tests/BD_Shape/bdsdifference4.cc,
+	  tests/BD_Shape/bdsdifference5.cc,
+	  tests/BD_Shape/bdsdifference6.cc,
+	  tests/BD_Shape/bdsdifference7.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bdshull2.cc, tests/BD_Shape/bdshull3.cc,
+	  tests/BD_Shape/bdshull4.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhmz05widening2.cc,
+	  tests/BD_Shape/bhmz05widening3.cc,
+	  tests/BD_Shape/bhmz05widening4.cc,
+	  tests/BD_Shape/bhmz05widening5.cc,
+	  tests/BD_Shape/bhmz05widening6.cc,
+	  tests/BD_Shape/bhmz05widening7.cc,
+	  tests/BD_Shape/bhmz05widening8.cc,
+	  tests/BD_Shape/bhz03widening1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation3.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/cc76extrapolation5.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc,
+	  tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+	  tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+	  tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+	  tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+	  tests/BD_Shape/closure1.cc, tests/BD_Shape/concatenate1.cc,
+	  tests/BD_Shape/concatenate2.cc, tests/BD_Shape/concatenate3.cc,
+	  tests/BD_Shape/concatenate4.cc, tests/BD_Shape/concatenate5.cc,
+	  tests/BD_Shape/constraints1.cc, tests/BD_Shape/constraints2.cc,
+	  tests/BD_Shape/contains1.cc, tests/BD_Shape/contains2.cc,
+	  tests/BD_Shape/contains3.cc, tests/BD_Shape/empty1.cc,
+	  tests/BD_Shape/empty2.cc, tests/BD_Shape/empty3.cc,
+	  tests/BD_Shape/empty4.cc, tests/BD_Shape/empty5.cc,
+	  tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+	  tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+	  tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage11.cc,
+	  tests/BD_Shape/generalizedaffineimage12.cc,
+	  tests/BD_Shape/generalizedaffineimage13.cc,
+	  tests/BD_Shape/generalizedaffineimage14.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage6.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/generalizedaffineimage9.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc, tests/BD_Shape/intersection2.cc,
+	  tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+	  tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+	  tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/limitedCC76extrapolation1.cc,
+	  tests/BD_Shape/limitedCC76extrapolation2.cc,
+	  tests/BD_Shape/limitedCC76extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation1.cc,
+	  tests/BD_Shape/limitedCH78extrapolation2.cc,
+	  tests/BD_Shape/limitedCH78extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation4.cc,
+	  tests/BD_Shape/limitedCH78extrapolation5.cc,
+	  tests/BD_Shape/limitedCH78extrapolation6.cc,
+	  tests/BD_Shape/limitedCH78extrapolation7.cc,
+	  tests/BD_Shape/limitedCH78extrapolation8.cc,
+	  tests/BD_Shape/limitedCH78extrapolation9.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation2.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation3.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation4.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation5.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation6.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation7.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation8.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation9.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation2.cc,
+	  tests/BD_Shape/limitedcc76extrapolation3.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+	  tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	  tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	  tests/BD_Shape/relations5.cc, tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/removespacedims2.cc,
+	  tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+	  tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+	  tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+	  tests/BD_Shape/writebdshape1.cc, tests/BD_Shape/writebdshape2.cc,
+	  tests/Polyhedron/CbecomesNNC1.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/NNCbecomesC1.cc,
+	  tests/Polyhedron/NNCminimize1.cc,
+	  tests/Polyhedron/NNCminimize2.cc,
+	  tests/Polyhedron/NNCminimize3.cc,
+	  tests/Polyhedron/NNCminimize4.cc,
+	  tests/Polyhedron/NNCminimize5.cc,
+	  tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraint2.cc,
+	  tests/Polyhedron/addconstraint3.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints10.cc,
+	  tests/Polyhedron/addconstraints11.cc,
+	  tests/Polyhedron/addconstraints12.cc,
+	  tests/Polyhedron/addconstraints13.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addconstraints3.cc,
+	  tests/Polyhedron/addconstraints4.cc,
+	  tests/Polyhedron/addconstraints5.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/addconstraints7.cc,
+	  tests/Polyhedron/addconstraints8.cc,
+	  tests/Polyhedron/addconstraints9.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerator3.cc,
+	  tests/Polyhedron/addgenerator4.cc,
+	  tests/Polyhedron/addgenerator5.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators10.cc,
+	  tests/Polyhedron/addgenerators11.cc,
+	  tests/Polyhedron/addgenerators12.cc,
+	  tests/Polyhedron/addgenerators13.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addgenerators3.cc,
+	  tests/Polyhedron/addgenerators4.cc,
+	  tests/Polyhedron/addgenerators5.cc,
+	  tests/Polyhedron/addgenerators6.cc,
+	  tests/Polyhedron/addgenerators7.cc,
+	  tests/Polyhedron/addgenerators8.cc,
+	  tests/Polyhedron/addgenerators9.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims10.cc,
+	  tests/Polyhedron/addspacedims11.cc,
+	  tests/Polyhedron/addspacedims12.cc,
+	  tests/Polyhedron/addspacedims13.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/addspacedims4.cc,
+	  tests/Polyhedron/addspacedims5.cc,
+	  tests/Polyhedron/addspacedims6.cc,
+	  tests/Polyhedron/addspacedims7.cc,
+	  tests/Polyhedron/addspacedims8.cc,
+	  tests/Polyhedron/addspacedims9.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affineimage3.cc,
+	  tests/Polyhedron/affineimage4.cc,
+	  tests/Polyhedron/affineimage5.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/affineimage7.cc,
+	  tests/Polyhedron/affineimage8.cc,
+	  tests/Polyhedron/affineimage9.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinepreimage10.cc,
+	  tests/Polyhedron/affinepreimage11.cc,
+	  tests/Polyhedron/affinepreimage2.cc,
+	  tests/Polyhedron/affinepreimage3.cc,
+	  tests/Polyhedron/affinepreimage4.cc,
+	  tests/Polyhedron/affinepreimage5.cc,
+	  tests/Polyhedron/affinepreimage6.cc,
+	  tests/Polyhedron/affinepreimage7.cc,
+	  tests/Polyhedron/affinepreimage8.cc,
+	  tests/Polyhedron/affinepreimage9.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/ascii_dump_load4.cc,
+	  tests/Polyhedron/ascii_dump_load5.cc,
+	  tests/Polyhedron/ascii_dump_load6.cc,
+	  tests/Polyhedron/ascii_dump_load7.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening10.cc,
+	  tests/Polyhedron/bhrz03widening11.cc,
+	  tests/Polyhedron/bhrz03widening12.cc,
+	  tests/Polyhedron/bhrz03widening13.cc,
+	  tests/Polyhedron/bhrz03widening14.cc,
+	  tests/Polyhedron/bhrz03widening15.cc,
+	  tests/Polyhedron/bhrz03widening16.cc,
+	  tests/Polyhedron/bhrz03widening17.cc,
+	  tests/Polyhedron/bhrz03widening18.cc,
+	  tests/Polyhedron/bhrz03widening19.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhrz03widening4.cc,
+	  tests/Polyhedron/bhrz03widening5.cc,
+	  tests/Polyhedron/bhrz03widening6.cc,
+	  tests/Polyhedron/bhrz03widening7.cc,
+	  tests/Polyhedron/bhrz03widening8.cc,
+	  tests/Polyhedron/bhrz03widening9.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening4.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffineimage2.cc,
+	  tests/Polyhedron/boundedaffineimage3.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage2.cc,
+	  tests/Polyhedron/boundedaffinepreimage3.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc,
+	  tests/Polyhedron/boundingbox4.cc,
+	  tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/bounds2.cc, tests/Polyhedron/bug2.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/concatenate2.cc,
+	  tests/Polyhedron/concatenate3.cc,
+	  tests/Polyhedron/concatenate4.cc,
+	  tests/Polyhedron/concatenate5.cc,
+	  tests/Polyhedron/concatenate6.cc,
+	  tests/Polyhedron/concatenate7.cc,
+	  tests/Polyhedron/constraints1.cc,
+	  tests/Polyhedron/constraints2.cc,
+	  tests/Polyhedron/constraints3.cc,
+	  tests/Polyhedron/constraints4.cc,
+	  tests/Polyhedron/constraints5.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+	  tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/disjoint3.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage10.cc,
+	  tests/Polyhedron/generalizedaffineimage11.cc,
+	  tests/Polyhedron/generalizedaffineimage12.cc,
+	  tests/Polyhedron/generalizedaffineimage13.cc,
+	  tests/Polyhedron/generalizedaffineimage14.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffineimage3.cc,
+	  tests/Polyhedron/generalizedaffineimage4.cc,
+	  tests/Polyhedron/generalizedaffineimage5.cc,
+	  tests/Polyhedron/generalizedaffineimage6.cc,
+	  tests/Polyhedron/generalizedaffineimage7.cc,
+	  tests/Polyhedron/generalizedaffineimage8.cc,
+	  tests/Polyhedron/generalizedaffineimage9.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generalizedaffinepreimage3.cc,
+	  tests/Polyhedron/generalizedaffinepreimage4.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+	  tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+	  tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+	  tests/Polyhedron/generators7.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/gramschmidt1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc,
+	  tests/Polyhedron/h79widening3.cc,
+	  tests/Polyhedron/h79widening4.cc,
+	  tests/Polyhedron/h79widening5.cc,
+	  tests/Polyhedron/h79widening6.cc,
+	  tests/Polyhedron/h79widening7.cc,
+	  tests/Polyhedron/h79widening8.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/intersection10.cc,
+	  tests/Polyhedron/intersection11.cc,
+	  tests/Polyhedron/intersection2.cc,
+	  tests/Polyhedron/intersection3.cc,
+	  tests/Polyhedron/intersection4.cc,
+	  tests/Polyhedron/intersection5.cc,
+	  tests/Polyhedron/intersection6.cc,
+	  tests/Polyhedron/intersection7.cc,
+	  tests/Polyhedron/intersection8.cc,
+	  tests/Polyhedron/intersection9.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation2.cc,
+	  tests/Polyhedron/limitedh79extrapolation3.cc,
+	  tests/Polyhedron/limitedh79extrapolation4.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearpartition2.cc,
+	  tests/Polyhedron/linearpartition3.cc,
+	  tests/Polyhedron/linearpartition4.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/lpproblem2.cc,
+	  tests/Polyhedron/mapspacedims1.cc,
+	  tests/Polyhedron/mapspacedims2.cc,
+	  tests/Polyhedron/mapspacedims3.cc,
+	  tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/max_min1.cc, tests/Polyhedron/max_min2.cc,
+	  tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+	  tests/Polyhedron/membytes1.cc, tests/Polyhedron/membytes2.cc,
+	  tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+	  tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/minconstraints3.cc,
+	  tests/Polyhedron/minconstraints4.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/mingenerators3.cc,
+	  tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polydifference3.cc,
+	  tests/Polyhedron/polydifference4.cc,
+	  tests/Polyhedron/polydifference5.cc,
+	  tests/Polyhedron/polydifference6.cc,
+	  tests/Polyhedron/polydifference7.cc,
+	  tests/Polyhedron/polydifference8.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+	  tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+	  tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+	  tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+	  tests/Polyhedron/polyhull9.cc, tests/Polyhedron/polypowerset1.cc,
+	  tests/Polyhedron/powerset1.cc,
+	  tests/Polyhedron/primalsimplex1.cc,
+	  tests/Polyhedron/primalsimplex2.cc,
+	  tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+	  tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+	  tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+	  tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+	  tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+	  tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+	  tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+	  tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+	  tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+	  tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+	  tests/Polyhedron/relations9.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims10.cc,
+	  tests/Polyhedron/removespacedims2.cc,
+	  tests/Polyhedron/removespacedims3.cc,
+	  tests/Polyhedron/removespacedims4.cc,
+	  tests/Polyhedron/removespacedims5.cc,
+	  tests/Polyhedron/removespacedims6.cc,
+	  tests/Polyhedron/removespacedims7.cc,
+	  tests/Polyhedron/removespacedims8.cc,
+	  tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+	  tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+	  tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+	  tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+	  tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+	  tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+	  tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+	  tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+	  tests/Polyhedron/universe7.cc, tests/Polyhedron/watchdog1.cc,
+	  tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writegensys2.cc,
+	  tests/Polyhedron/writegensys3.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writepolyhedron3.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+	  utils/build_header.in, utils/text2cxxarray.in, utils/timings.cc,
+	  utils/timings.hh
+	  (simplex.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,2,1,1,1,1,1,1,1,1,4,4,1,1,3,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,4,1,1,1,1,1,1 [...]
+	  First merge from the main trunk.
+
+2006-01-06 Friday 19:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+	  Congruence.types.hh, Congruence_System.cc,
+	  Congruence_System.defs.hh, Congruence_System.inlines.hh,
+	  Congruence_System.types.hh, Grid.defs.hh, Grid.inlines.hh,
+	  Grid.types.hh, Grid_Certificate.cc, Grid_Certificate.defs.hh,
+	  Grid_Certificate.inlines.hh, Grid_Certificate.types.hh,
+	  Grid_Generator.defs.hh, Grid_Generator.inlines.hh,
+	  Grid_Generator.types.hh, Grid_Generator_System.cc,
+	  Grid_Generator_System.defs.hh, Grid_Generator_System.inlines.hh,
+	  Grid_Generator_System.types.hh, Grid_Status.cc,
+	  Grid_Status.idefs.hh, Grid_Status.inlines.hh, Grid_chdims.cc,
+	  Grid_conversion.cc, Grid_minimize.cc, Grid_nonpublic.cc,
+	  Grid_public.cc, Grid_simplify.cc, Grid_widenings.cc
+	  (grids.[19,35,20,2,39,25,13,2,93,52,2,9,3,2,2,21,16,2,26,19,11,2,5,6,4,30,33,25,67,130,44,11]):
+	  Update copyright year.
+
+2006-01-06 Friday 18:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Matrix.defs.hh (grids.7): Take out old grid includes and
+	  declaration.
+
+2006-01-06 Friday 18:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.defs.hh, Congruence_System.defs.hh,
+	  Grid.defs.hh, Grid_Certificate.defs.hh, Grid_Generator.defs.hh,
+	  Grid_Generator_System.defs.hh, Grid_Status.idefs.hh
+	  (grids.[34,24,92,2,20,18,5]): Update the format of brief comments
+	  to the new standard.
+
+2006-01-06 Friday 08:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.21): Added a comment
+	  explaining the large number tests.  Revised the catch code for
+	  the ppl_overflow_error exception.  Reordered tests so that when
+	  there is an expected overflow exception, more tests are done
+	  before that.
+
+	  Other minor changes.
+
+2006-01-05 Thursday 21:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/expected_pchk_int64_a (1.5): Restore
+	  expected output.
+
+2006-01-05 Thursday 19:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.129): Leave the modulus handling as it
+	  is in the inverse relation case of
+	  generalized_affine_preimage(var..).
+
+2006-01-05 Thursday 18:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/: expected_pchk_int16 (1.6),
+	  expected_pchk_int16_a (1.6), expected_pchk_int32 (1.6),
+	  expected_pchk_int32_a (1.6), expected_pchk_int64 (1.3),
+	  expected_pchk_int64_a (1.4), expected_pchk_int8 (1.6),
+	  expected_pchk_int8_a (1.6), pl_check.pl (1.20): Revised expected
+	  files and avoid error message when there is an overflow exception
+	  for the large numbers in the C++.
+
+2006-01-05 Thursday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.106): Fixed
+	  integer_term_to_Coefficient().
+
+2006-01-05 Thursday 17:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.105): Prolog_is_integer()
+	  updated to support the newest versions of YAP.
+
+2006-01-05 Thursday 13:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/: expected_pchk_int16 (1.5),
+	  expected_pchk_int16_a (1.5), expected_pchk_int32 (1.5),
+	  expected_pchk_int32_a (1.5), expected_pchk_int64 (1.2),
+	  expected_pchk_int64_a (1.3): Revised expected results for
+	  pl_check to allow for tests for large numbers.
+
+2006-01-05 Thursday 11:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/: expected_pchk_int8 (1.5),
+	  expected_pchk_int8_a (1.5): Updated expected results for the
+	  large number tests.
+
+2006-01-05 Thursday 11:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/ciao_pl_check.pl (1.17),
+	  GNU/gnu_pl_check.pl (1.8), SICStus/sp_pl_check.pl (1.6),
+	  SWI/swi_pl_check.pl (1.7), XSB/xsb_pl_check.P (1.22),
+	  YAP/yap_pl_check.pl (1.10), tests/pl_check.pl (1.19): Added to
+	  the system dependent files prolog_system(...).
+
+	  Added tests to pl_check.pl for testing large numbers.  When
+	  prolog_system(xsb) holds, these tests are omitted.
+
+	  Bugs in maximize and minimize test code fixed.  typo in exception
+	  message fixed.
+
+2006-01-05 Thursday 10:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.143), YAP/ppl_yap.cc
+	  (1.104): Use (and require) the new YAP interface for arbitrary
+	  precision integers.
+
+2006-01-05 Thursday 00:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (simplex.16): Added a few calls to ascii_dump()
+	  in the OK method to help in debugging.  Corrected a bug in
+	  incremental() whereby an illegal dim_map was built.  Corrected
+	  another bug whereby last_generator was not updated.
+
+2006-01-04 Wednesday 22:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.103): Use a single temporary
+	  mpz_class object.  Added a missing test to
+	  Coefficient_to_integer_term().  Use direct assignment instead of
+	  assign_r() in integer_term_to_Coefficient().
+
+2006-01-04 Wednesday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.113): Removed an
+	  inclusion and a using declaration probably left there after a
+	  debugging session.  Use a single temporary mpz_class object.
+
+2006-01-04 Wednesday 17:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Limits.hh (1.9): Fixed indentation of a line.
+
+2006-01-04 Wednesday 14:43  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[15,14,15]): Restored last changes made by Enea, were
+	  removed by mistake.  Added a FIXME about incrementality and the
+	  default constructor.
+
+2006-01-04 Wednesday 12:57  Andrea Cimino
+
+	* src/: Constraint.defs.hh, LP_Problem.cc, LP_Problem.defs.hh,
+	  LP_Problem.inlines.hh (simplex.[1,14,13,14]): Added experimental
+	  code for incrementality.  Backported some changes from the main
+	  trunk.  Added a modified version of `ascii_dump' for testing
+	  purposes.  LP_Problem made friend of Constraint to allow
+	  compiling.
+
+2006-01-03 Tuesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Expression.cc (1.9): Print objects of type Coefficient
+	  as such, not as objects of some other type.
+
+2006-01-03 Tuesday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.49): Added a draft input syntax to
+	  the input function for checked numbers: template <typename T,
+	  typename Policy> Result input(std::istream& is, Checked_Number<T,
+	  Policy>& x, Rounding_Dir dir).
+
+2006-01-03 Tuesday 20:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint_System.defs.hh (1.24), Linear_Expression.defs.hh
+	  (1.18): Comments improved.
+
+2006-01-03 Tuesday 18:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.112): Return directly
+	  the temporary Coefficeint object.
+
+2006-01-03 Tuesday 18:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.142): Corrected a typo.
+
+2006-01-03 Tuesday 16:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.111): Tentative
+	  correction of a bug in the conversion from SWI Prolog unbounded
+	  coefficients to PPL's (checked bounded integers) Coefficient.
+
+2006-01-03 Tuesday 16:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/intersection1.cc (grids.8): Replace the Variables in
+	  the tests with common Variables in a local namespace.
+
+2006-01-03 Tuesday 16:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/affinepreimage1.cc (grids.10): Add two simple tests.
+
+2006-01-03 Tuesday 16:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.128): Take the empty flag query out of
+	  add_recycled_generators.
+
+2006-01-03 Tuesday 16:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.66): Note possible improvements to
+	  the empty cases in the construct methods.
+
+2006-01-03 Tuesday 16:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.inlines.hh (grids.10): Add sortedness
+	  and pending row settings to method `clear'.
+
+2006-01-03 Tuesday 16:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.defs.hh (grids.19): Move the
+	  writable-reference-returning divisor method to the private
+	  section.  Improve the comment on the need for the Grid class
+	  friend declaration.
+
+2006-01-03 Tuesday 16:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.51): Update map_space_dimensions to
+	  create the point with the correct divisor when inserting a point,
+	  instead of inserting the point and then adjusting the divisor.
+
+2006-01-03 Tuesday 16:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.defs.hh (grids.23): Add a note to consider
+	  adding a recycling_insert method.
+
+2006-01-03 Tuesday 16:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.33): Move the
+	  writable-reference-returning modulus method to the private
+	  section.  Improve two comments a little.
+
+2006-01-03 Tuesday 16:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.cc (grids.18): Update strong_normalize to use
+	  Row::normalize.
+
+2006-01-03 Tuesday 15:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.141): Added
+	  documentation for the LP Problem predicates.
+
+2006-01-02 Monday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.167): Removed a couple of items that have been dealt
+	  with.
+
+2006-01-02 Monday 14:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_int16 (1.4), expected_int16_a (1.4),
+	  expected_int32 (1.5), expected_int32_a (1.5), expected_int64
+	  (1.5), expected_int64_a (1.5), expected_int8 (1.4),
+	  expected_int8_a (1.3), expected_mpz (1.6), expected_mpz_a (1.6):
+	  Updated to take into account the addition of tests for the
+	  simplex method and the removal of option -v.
+
+2006-01-02 Monday 14:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.18): Do explicitly use option -e
+	  when requiring the enumeration method.
+
+2006-01-02 Monday 14:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.27): Let the option -e be working
+	  as expected.
+
+2006-01-02 Monday 11:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.cc (1.14): Function parse_number1() renamed
+	  parse_number_part().
+
+2006-01-02 Monday 11:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/exceptions2.cc (1.8): Added tests for
+	  excericising the exceptions generated by LP_Problem.
+
+2006-01-02 Monday 11:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.cc (1.13): Comments for parse_number() and
+	  parse_number1() revised.
+
+2006-01-02 Monday 11:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.135): Added globals.types.hh to the
+	  documentation files.
+
+2006-01-02 Monday 11:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LP_Problem.cc (1.6), LP_Problem.defs.hh (1.5): Added and
+	  implemented exception specification for
+	  evaluate_objective_function().
+
+2006-01-02 Monday 10:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.cc (1.12): Functions get_digit() and sum_sign()
+	  properly commented.
+
+2006-01-02 Monday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.21): Got rid of (non-working
+	  and too expensive) tests for large exponents.
+
+2006-01-02 Monday 09:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (simplex.1): file
+	  generalizedaffinepreimage1.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-02 Monday 09:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (grids.1): file
+	  generalizedaffinepreimage1.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-02 Monday 09:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (1.6): If (and only
+	  if) the Coefficient type is not wide enough, test10() does
+	  nothing.
+
+2006-01-02 Monday 00:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LP_Problem.cc (1.5), LP_Problem.inlines.hh (1.5): Drafted
+	  implementations for total_ and external_memory_in_bytes() and for
+	  ascii_dump().
+
+2006-01-01 Sunday 23:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.18): Many improvements to
+	  LP_Problem tests.
+
+2006-01-01 Sunday 22:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/src/EList.defs.hh (1.3),
+	  Watchdog/src/Pending_List.defs.hh (1.3),
+	  Watchdog/src/Time.defs.hh (1.3), src/version.hh.in (1.13): Do
+	  adopt the new format for multiline brief doxygen documentation.
+
+2006-01-01 Sunday 22:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (1.5): Temporarily
+	  disabled test10().
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_clpq2_int32_a (1.4),
+	  XSB/expected_clpq2_int8 (1.3), XSB/expected_clpq2_int8_a (1.4),
+	  XSB/expected_clpq_int16 (1.4), XSB/expected_clpq_int16_a (1.4),
+	  XSB/expected_pchk_int16 (1.3), XSB/expected_pchk_int16_a (1.3),
+	  XSB/expected_pchk_int32 (1.3), XSB/expected_pchk_int32_a (1.3),
+	  XSB/expected_pchk_int8 (1.2), XSB/expected_pchk_int8_a (1.3),
+	  tests/expected_clpq2_int32_a (1.4), tests/expected_clpq2_int8
+	  (1.4), tests/expected_clpq2_int8_a (1.4),
+	  tests/expected_clpq_int16 (1.4), tests/expected_clpq_int16_a
+	  (1.4), tests/expected_pchk_int16 (1.4),
+	  tests/expected_pchk_int16_a (1.4), tests/expected_pchk_int32
+	  (1.4), tests/expected_pchk_int32_a (1.4),
+	  tests/expected_pchk_int8 (1.4), tests/expected_pchk_int8_a (1.4):
+	  Adapted to recent changes in the implementation of checked
+	  numbers.
+
+2006-01-01 Sunday 19:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.166), src/Ask_Tell.defs.hh (1.8), src/BDS_Status.idefs.hh
+	  (1.12), src/BHRZ03_Certificate.defs.hh (1.14),
+	  src/Bounding_Box.defs.hh (1.12), src/C_Polyhedron.defs.hh (1.39),
+	  src/Checked_Number.defs.hh (1.48), src/Constraint.defs.hh
+	  (1.113), src/Constraint_System.defs.hh (1.23),
+	  src/DB_Matrix.defs.hh (1.15), src/DB_Matrix.inlines.hh (1.22),
+	  src/DB_Row.defs.hh (1.15), src/Determinate.defs.hh (1.60),
+	  src/GMP_Integer.defs.hh (1.17), src/GMP_Integer.inlines.hh
+	  (1.12), src/Generator.defs.hh (1.113),
+	  src/Generator_System.defs.hh (1.12), src/Interval.defs.hh (1.26),
+	  src/LP_Problem.defs.hh (1.4), src/Linear_Expression.defs.hh
+	  (1.17), src/Linear_Row.defs.hh (1.14), src/Linear_System.defs.hh
+	  (1.20), src/Matrix.defs.hh (1.71), src/NNC_Polyhedron.defs.hh
+	  (1.41), src/Ph_Status.idefs.hh (1.12),
+	  src/Poly_Con_Relation.defs.hh (1.29),
+	  src/Poly_Gen_Relation.defs.hh (1.27),
+	  src/Polyhedra_Powerset.defs.hh (1.28), src/Polyhedron.defs.hh
+	  (1.289), src/Powerset.defs.hh (1.15), src/Ptr_Iterator.defs.hh
+	  (1.6), src/Rounding_Dir.defs.hh (1.7), src/Row.defs.hh (1.100),
+	  src/Saturation_Matrix.defs.hh (1.5), src/Saturation_Row.defs.hh
+	  (1.9), src/Scalar_Products.defs.hh (1.3), src/Variable.defs.hh
+	  (1.49), src/algorithms.hh (1.45), src/checked.defs.hh (1.31),
+	  src/globals.defs.hh (1.27): Applying the new policy for multiline
+	  brief Doxygen comments.
+
+2006-01-01 Sunday 19:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.57), BD_Shape.inlines.hh (1.117): A few
+	  improvements in the code ofr affine images and preimages. Removed
+	  a (never used) default-valued parameter form an helper function.
+
+2006-01-01 Sunday 19:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.29): Established a new policy for the writing of
+	  multiline *brief* comment in doxygen: besides easing a bit their
+	  writing, this is also useful as a workaround for a long-standing
+	  doxygen bug.
+
+2006-01-01 Sunday 18:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: GNU/ppl_gprolog.pl (1.56), tests/pl_check.pl
+	  (1.17): Code wrongly removed in pl_check.pl replaced.
+
+	  GNU Prolog system code for LP_Problem added.
+
+2006-01-01 Sunday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.42): The tests lpproblem1 and
+	  lpproblem2 also fail with 64-bits coefficients.
+
+2006-01-01 Sunday 17:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.41): With 32-bits coefficients,
+	  the tests lpproblem1 and lpproblem2 are known to fail because of
+	  overflows.
+
+2006-01-01 Sunday 17:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/lpproblem1.cc (simplex.1): file lpproblem1.cc
+	  was added on branch simplex on 2006-01-06 20:01:53 +0000
+
+2006-01-01 Sunday 17:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/lpproblem2.cc (simplex.1): file lpproblem2.cc
+	  was added on branch simplex on 2006-01-06 20:00:58 +0000
+
+2006-01-01 Sunday 17:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/lpproblem2.cc (grids.1): file lpproblem2.cc was
+	  added on branch grids on 2006-01-16 01:10:41 +0000
+
+2006-01-01 Sunday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: lpproblem1.cc (1.3), lpproblem2.cc (1.3):
+	  Added missing try/catch blocks.
+
+2006-01-01 Sunday 14:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/ciao_pl_check.pl (1.16),
+	  Ciao/ppl_ciao.pl (1.84), SICStus/ppl_sicstus_sd.cc (1.85),
+	  XSB/ppl_xsb.H (1.44), XSB/ppl_xsb.cc (1.76), XSB/xsb_pl_check.P
+	  (1.21), YAP/ppl_yap.cc (1.102), tests/pl_check.pl (1.16): Added
+	  needed code for the LP_Problem predicates to the Prolog systems'
+	  code.
+
+	  Added tests to exercise all the LP_Problem predicates.
+
+2006-01-01 Sunday 10:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.15): Corrected and
+	  improved maximize, maximize_with_point, minimize and
+	  minimize_with_point tests.
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/LP_Problem3.cc (grids.1): file LP_Problem3.cc
+	  was added on branch grids on 2006-01-16 01:10:40 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation1.cc (simplex.1): file
+	  limitedbhmz05extrapolation1.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation2.cc (simplex.1): file
+	  limitedbhmz05extrapolation2.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation3.cc (simplex.1): file
+	  limitedbhmz05extrapolation3.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation4.cc (simplex.1): file
+	  limitedbhmz05extrapolation4.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation5.cc (simplex.1): file
+	  limitedbhmz05extrapolation5.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation6.cc (simplex.1): file
+	  limitedbhmz05extrapolation6.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation7.cc (simplex.1): file
+	  limitedbhmz05extrapolation7.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation8.cc (simplex.1): file
+	  limitedbhmz05extrapolation8.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation9.cc (simplex.1): file
+	  limitedbhmz05extrapolation9.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedcc76extrapolation1.cc (simplex.1): file
+	  limitedcc76extrapolation1.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedcc76extrapolation2.cc (simplex.1): file
+	  limitedcc76extrapolation2.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedcc76extrapolation3.cc (simplex.1): file
+	  limitedcc76extrapolation3.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation1.cc (grids.1): file
+	  limitedbhmz05extrapolation1.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation2.cc (grids.1): file
+	  limitedbhmz05extrapolation2.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation3.cc (grids.1): file
+	  limitedbhmz05extrapolation3.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation4.cc (grids.1): file
+	  limitedbhmz05extrapolation4.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation5.cc (grids.1): file
+	  limitedbhmz05extrapolation5.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation6.cc (grids.1): file
+	  limitedbhmz05extrapolation6.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation7.cc (grids.1): file
+	  limitedbhmz05extrapolation7.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation8.cc (grids.1): file
+	  limitedbhmz05extrapolation8.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation9.cc (grids.1): file
+	  limitedbhmz05extrapolation9.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/limitedcc76extrapolation1.cc (grids.1): file
+	  limitedcc76extrapolation1.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/limitedcc76extrapolation2.cc (grids.1): file
+	  limitedcc76extrapolation2.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/limitedcc76extrapolation3.cc (grids.1): file
+	  limitedcc76extrapolation3.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening1.cc (simplex.1): file
+	  bhmz05widening1.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening2.cc (simplex.1): file
+	  bhmz05widening2.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening3.cc (simplex.1): file
+	  bhmz05widening3.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening4.cc (simplex.1): file
+	  bhmz05widening4.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening5.cc (simplex.1): file
+	  bhmz05widening5.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening6.cc (simplex.1): file
+	  bhmz05widening6.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening7.cc (simplex.1): file
+	  bhmz05widening7.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening8.cc (simplex.1): file
+	  bhmz05widening8.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (simplex.1): file
+	  generalizedaffinepreimage2.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/bhmz05widening1.cc (grids.1): file
+	  bhmz05widening1.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/bhmz05widening2.cc (grids.1): file
+	  bhmz05widening2.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/bhmz05widening3.cc (grids.1): file
+	  bhmz05widening3.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/bhmz05widening4.cc (grids.1): file
+	  bhmz05widening4.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/bhmz05widening5.cc (grids.1): file
+	  bhmz05widening5.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/bhmz05widening6.cc (grids.1): file
+	  bhmz05widening6.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/bhmz05widening7.cc (grids.1): file
+	  bhmz05widening7.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/bhmz05widening8.cc (grids.1): file
+	  bhmz05widening8.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (grids.1): file
+	  generalizedaffinepreimage2.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.cc (simplex.1): file BD_Shape.cc was added on branch
+	  simplex on 2006-01-06 20:00:51 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/BD_Shape.cc (grids.1): file BD_Shape.cc was added on branch
+	  grids on 2006-01-16 01:10:33 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/LP_Problem.types.hh (grids.1): file LP_Problem.types.hh was
+	  added on branch grids on 2006-01-16 01:10:33 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.35), README (1.38), README.configure (1.16),
+	  configure.ac (1.200), instchk.hh (1.3), Watchdog/Makefile.am
+	  (1.24), Watchdog/README (1.12), Watchdog/configure.ac (1.33),
+	  Watchdog/src/Doubly_Linked_Object.defs.hh (1.2),
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh (1.2),
+	  Watchdog/src/Doubly_Linked_Object.types.hh (1.2),
+	  Watchdog/src/EList.defs.hh (1.2), Watchdog/src/EList.inlines.hh
+	  (1.2), Watchdog/src/EList.types.hh (1.2),
+	  Watchdog/src/EList_Iterator.defs.hh (1.2),
+	  Watchdog/src/EList_Iterator.inlines.hh (1.2),
+	  Watchdog/src/EList_Iterator.types.hh (1.2),
+	  Watchdog/src/Handler.defs.hh (1.2),
+	  Watchdog/src/Handler.inlines.hh (1.2),
+	  Watchdog/src/Handler.types.hh (1.2), Watchdog/src/Makefile.am
+	  (1.4), Watchdog/src/Pending_Element.cc (1.2),
+	  Watchdog/src/Pending_Element.defs.hh (1.2),
+	  Watchdog/src/Pending_Element.inlines.hh (1.2),
+	  Watchdog/src/Pending_Element.types.hh (1.2),
+	  Watchdog/src/Pending_List.cc (1.2),
+	  Watchdog/src/Pending_List.defs.hh (1.2),
+	  Watchdog/src/Pending_List.inlines.hh (1.2),
+	  Watchdog/src/Pending_List.types.hh (1.2), Watchdog/src/Time.cc
+	  (1.2), Watchdog/src/Time.defs.hh (1.2),
+	  Watchdog/src/Time.inlines.hh (1.2), Watchdog/src/Time.types.hh
+	  (1.2), Watchdog/src/Watchdog.cc (1.2),
+	  Watchdog/src/Watchdog.defs.hh (1.2),
+	  Watchdog/src/Watchdog.inlines.hh (1.2),
+	  Watchdog/src/Watchdog.types.hh (1.2), Watchdog/src/pwl_header.hh
+	  (1.2), Watchdog/utils/Makefile.am (1.5),
+	  Watchdog/utils/build_header.in (1.3), demos/Makefile.am (1.8),
+	  demos/ppl_lcdd/Makefile.am (1.21), demos/ppl_lcdd/ppl_lcdd.cc
+	  (1.52), demos/ppl_lcdd/examples/Makefile.am (1.6),
+	  demos/ppl_lpsol/Makefile.am (1.17), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.26), demos/ppl_lpsol/examples/Makefile.am (1.5),
+	  doc/Makefile.am (1.38), doc/README.doc (1.7), doc/definitions.dox
+	  (1.182), doc/devref.tex (1.19), doc/ppl.sty (1.24), doc/user.tex
+	  (1.20), interfaces/Makefile.am (1.12), interfaces/C/Makefile.am
+	  (1.20), interfaces/C/ppl_c.cc (1.147), interfaces/C/ppl_c.h.in
+	  (1.60), interfaces/OCaml/Makefile.am (1.11),
+	  interfaces/Prolog/Makefile.am (1.29),
+	  interfaces/Prolog/Prolog_interface.dox (1.140),
+	  interfaces/Prolog/exceptions.hh (1.19),
+	  interfaces/Prolog/ppl_prolog.icc (1.168),
+	  interfaces/Prolog/track_allocation.hh (1.18),
+	  interfaces/Prolog/Ciao/Makefile.am (1.47),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.16),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.12),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.15),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.39),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.83),
+	  interfaces/Prolog/GNU/Makefile.am (1.50),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.7),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.10),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.55),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.34),
+	  interfaces/Prolog/SICStus/Makefile.am (1.58),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.26),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.84),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.6),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.7),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.13),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.13),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.5),
+	  interfaces/Prolog/SWI/Makefile.am (1.55),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.10),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.9),
+	  interfaces/Prolog/SWI/ppl_pl.cc (1.10),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.110),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.6),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.6),
+	  interfaces/Prolog/XSB/Makefile.am (1.39),
+	  interfaces/Prolog/XSB/expected_clpq2_int16 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_int32 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_int64 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_int8 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_mpz (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_int16 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int16_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int32 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_int32_a (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_int64 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_int64_a (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_int8 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_int8_a (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_mpz (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a (1.2),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.43),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.75),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.15),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.13),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.20),
+	  interfaces/Prolog/YAP/Makefile.am (1.41),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.101),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.10),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.11),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.7),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.9),
+	  interfaces/Prolog/tests/Makefile.am (1.6),
+	  interfaces/Prolog/tests/clpq.pl (1.7),
+	  interfaces/Prolog/tests/clpq2.pl (1.7),
+	  interfaces/Prolog/tests/expected_clpq2_int16 (1.2),
+	  interfaces/Prolog/tests/expected_clpq2_int16_a (1.2),
+	  interfaces/Prolog/tests/expected_clpq2_int32 (1.2),
+	  interfaces/Prolog/tests/expected_clpq2_int32_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int64 (1.2),
+	  interfaces/Prolog/tests/expected_clpq2_int64_a (1.2),
+	  interfaces/Prolog/tests/expected_clpq2_int8 (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int8_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_mpz (1.2),
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a (1.2),
+	  interfaces/Prolog/tests/expected_clpq_int16 (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int16_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int32 (1.2),
+	  interfaces/Prolog/tests/expected_clpq_int32_a (1.2),
+	  interfaces/Prolog/tests/expected_clpq_int64 (1.2),
+	  interfaces/Prolog/tests/expected_clpq_int64_a (1.2),
+	  interfaces/Prolog/tests/expected_clpq_int8 (1.2),
+	  interfaces/Prolog/tests/expected_clpq_int8_a (1.2),
+	  interfaces/Prolog/tests/expected_clpq_mpz (1.2),
+	  interfaces/Prolog/tests/expected_clpq_mpz_a (1.2),
+	  interfaces/Prolog/tests/pl_check.pl (1.14), m4/Makefile.am
+	  (1.15), m4/ac_check_gmp.m4 (1.23), m4/ac_check_sicstus_prolog.m4
+	  (1.4), m4/ac_check_swi_prolog.m4 (1.8), m4/ac_check_xsb_prolog.m4
+	  (1.2), m4/ac_cxx_attribute_weak.m4 (1.7),
+	  m4/ac_cxx_double_is_iec_559.m4 (1.5),
+	  m4/ac_cxx_flexible_arrays.m4 (1.12),
+	  m4/ac_cxx_float_is_iec_559.m4 (1.5), m4/ac_cxx_long_double.m4
+	  (1.6), m4/ac_cxx_long_double_is_iec_559.m4 (1.5),
+	  m4/ac_cxx_long_long.m4 (1.5), m4/ppl.m4 (1.2),
+	  src/Ask_Tell.defs.hh (1.7), src/Ask_Tell.inlines.hh (1.7),
+	  src/Ask_Tell.types.hh (1.4), src/BDS_Status.idefs.hh (1.11),
+	  src/BDS_Status.inlines.hh (1.9), src/BD_Shape.cc (1.2),
+	  src/BD_Shape.defs.hh (1.56), src/BD_Shape.inlines.hh (1.116),
+	  src/BD_Shape.types.hh (1.5), src/BHRZ03_Certificate.cc (1.10),
+	  src/BHRZ03_Certificate.defs.hh (1.13),
+	  src/BHRZ03_Certificate.inlines.hh (1.7),
+	  src/BHRZ03_Certificate.types.hh (1.4), src/Bounding_Box.cc
+	  (1.13), src/Bounding_Box.defs.hh (1.11),
+	  src/Bounding_Box.inlines.hh (1.14), src/Bounding_Box.types.hh
+	  (1.4), src/C_Polyhedron.cc (1.17), src/C_Polyhedron.defs.hh
+	  (1.38), src/C_Polyhedron.inlines.hh (1.29),
+	  src/C_Polyhedron.types.hh (1.10), src/Checked_Number.cc (1.9),
+	  src/Checked_Number.defs.hh (1.47), src/Checked_Number.inlines.hh
+	  (1.51), src/Checked_Number.types.hh (1.9), src/Coefficient.cc
+	  (1.4), src/Coefficient.defs.hh (1.6), src/Coefficient.inlines.hh
+	  (1.5), src/Coefficient.types.hh (1.11),
+	  src/Coefficient_traits_template.hh (1.4), src/Constraint.cc
+	  (1.54), src/Constraint.defs.hh (1.112), src/Constraint.inlines.hh
+	  (1.61), src/Constraint.types.hh (1.10), src/Constraint_System.cc
+	  (1.15), src/Constraint_System.defs.hh (1.22),
+	  src/Constraint_System.inlines.hh (1.7),
+	  src/Constraint_System.types.hh (1.4), src/DB_Matrix.defs.hh
+	  (1.14), src/DB_Matrix.inlines.hh (1.21), src/DB_Matrix.types.hh
+	  (1.5), src/DB_Row.defs.hh (1.14), src/DB_Row.inlines.hh (1.16),
+	  src/DB_Row.types.hh (1.6), src/Determinate.defs.hh (1.59),
+	  src/Determinate.inlines.hh (1.51), src/Determinate.types.hh
+	  (1.8), src/Float.cc (1.3), src/Float.defs.hh (1.16),
+	  src/Float.inlines.hh (1.16), src/GMP_Integer.defs.hh (1.16),
+	  src/GMP_Integer.inlines.hh (1.11), src/GMP_Integer.types.hh
+	  (1.11), src/Generator.cc (1.67), src/Generator.defs.hh (1.112),
+	  src/Generator.inlines.hh (1.58), src/Generator.types.hh (1.10),
+	  src/Generator_System.cc (1.15), src/Generator_System.defs.hh
+	  (1.11), src/Generator_System.inlines.hh (1.6),
+	  src/Generator_System.types.hh (1.4), src/H79_Certificate.cc
+	  (1.9), src/H79_Certificate.defs.hh (1.13),
+	  src/H79_Certificate.inlines.hh (1.7),
+	  src/H79_Certificate.types.hh (1.4), src/Init.cc (1.22),
+	  src/Init.defs.hh (1.14), src/Init.types.hh (1.9), src/Interval.cc
+	  (1.13), src/Interval.defs.hh (1.25), src/Interval.inlines.hh
+	  (1.24), src/Interval.types.hh (1.11), src/LP_Problem.cc (1.4),
+	  src/LP_Problem.defs.hh (1.3), src/LP_Problem.inlines.hh (1.4),
+	  src/LP_Problem.types.hh (1.4), src/Limits.hh (1.8),
+	  src/Linear_Expression.cc (1.8), src/Linear_Expression.defs.hh
+	  (1.16), src/Linear_Expression.inlines.hh (1.6),
+	  src/Linear_Expression.types.hh (1.4), src/Linear_Row.cc (1.16),
+	  src/Linear_Row.defs.hh (1.13), src/Linear_Row.inlines.hh (1.10),
+	  src/Linear_Row.types.hh (1.4), src/Linear_System.cc (1.33),
+	  src/Linear_System.defs.hh (1.19), src/Linear_System.inlines.hh
+	  (1.18), src/Linear_System.types.hh (1.4), src/Makefile.am
+	  (1.134), src/Matrix.cc (1.89), src/Matrix.defs.hh (1.70),
+	  src/Matrix.inlines.hh (1.47), src/Matrix.types.hh (1.10),
+	  src/NNC_Polyhedron.cc (1.17), src/NNC_Polyhedron.defs.hh (1.40),
+	  src/NNC_Polyhedron.inlines.hh (1.31), src/NNC_Polyhedron.types.hh
+	  (1.10), src/Numeric_Format.defs.hh (1.5), src/Ph_Status.cc (1.8),
+	  src/Ph_Status.idefs.hh (1.11), src/Ph_Status.inlines.hh (1.7),
+	  src/Poly_Con_Relation.cc (1.11), src/Poly_Con_Relation.defs.hh
+	  (1.28), src/Poly_Con_Relation.inlines.hh (1.14),
+	  src/Poly_Con_Relation.types.hh (1.9), src/Poly_Gen_Relation.cc
+	  (1.11), src/Poly_Gen_Relation.defs.hh (1.26),
+	  src/Poly_Gen_Relation.inlines.hh (1.14),
+	  src/Poly_Gen_Relation.types.hh (1.9), src/Polyhedra_Powerset.cc
+	  (1.6), src/Polyhedra_Powerset.defs.hh (1.27),
+	  src/Polyhedra_Powerset.inlines.hh (1.36),
+	  src/Polyhedra_Powerset.types.hh (1.4), src/Polyhedron.defs.hh
+	  (1.288), src/Polyhedron.inlines.hh (1.130),
+	  src/Polyhedron.types.hh (1.16), src/Polyhedron_chdims.cc (1.35),
+	  src/Polyhedron_nonpublic.cc (1.63), src/Polyhedron_public.cc
+	  (1.70), src/Polyhedron_widenings.cc (1.52), src/Powerset.defs.hh
+	  (1.14), src/Powerset.inlines.hh (1.13), src/Powerset.types.hh
+	  (1.4), src/Ptr_Iterator.defs.hh (1.5),
+	  src/Ptr_Iterator.inlines.hh (1.5), src/Ptr_Iterator.types.hh
+	  (1.5), src/Result.defs.hh (1.12), src/Result.inlines.hh (1.7),
+	  src/Rounding_Dir.defs.hh (1.6), src/Rounding_Dir.inlines.hh
+	  (1.3), src/Row.cc (1.95), src/Row.defs.hh (1.99),
+	  src/Row.inlines.hh (1.62), src/Row.types.hh (1.11),
+	  src/Saturation_Matrix.cc (1.7), src/Saturation_Matrix.defs.hh
+	  (1.4), src/Saturation_Matrix.inlines.hh (1.5),
+	  src/Saturation_Matrix.types.hh (1.4), src/Saturation_Row.cc
+	  (1.9), src/Saturation_Row.defs.hh (1.8),
+	  src/Saturation_Row.inlines.hh (1.8), src/Saturation_Row.types.hh
+	  (1.4), src/Scalar_Products.cc (1.3), src/Scalar_Products.defs.hh
+	  (1.2), src/Scalar_Products.inlines.hh (1.2),
+	  src/Scalar_Products.types.hh (1.2), src/Topology.hh (1.11),
+	  src/Variable.cc (1.20), src/Variable.defs.hh (1.48),
+	  src/Variable.inlines.hh (1.23), src/Variable.types.hh (1.10),
+	  src/Widening_Function.defs.hh (1.13),
+	  src/Widening_Function.inlines.hh (1.12),
+	  src/Widening_Function.types.hh (1.5), src/algorithms.hh (1.44),
+	  src/checked.cc (1.11), src/checked.defs.hh (1.30),
+	  src/checked.inlines.hh (1.29), src/checked_ext.defs.hh (1.9),
+	  src/checked_ext.inlines.hh (1.27), src/checked_float.inlines.hh
+	  (1.55), src/checked_int.inlines.hh (1.43),
+	  src/checked_mpq.inlines.hh (1.30), src/checked_mpz.inlines.hh
+	  (1.34), src/checked_numeric_limits.hh (1.9), src/compiler.hh
+	  (1.6), src/conversion.cc (1.77), src/float.types.hh (1.13),
+	  src/fpu-c99.inlines.hh (1.8), src/fpu-ia32.inlines.hh (1.8),
+	  src/fpu-none.inlines.hh (1.3), src/fpu.defs.hh (1.6),
+	  src/globals.cc (1.24), src/globals.defs.hh (1.26),
+	  src/globals.inlines.hh (1.14), src/globals.types.hh (1.4),
+	  src/initializer.hh (1.12), src/max_space_dimension.hh (1.7),
+	  src/minimize.cc (1.43), src/mp_numeric_limits.hh (1.3),
+	  src/namespaces.hh (1.5), src/ppl-config.cc.in (1.11),
+	  src/ppl_header.hh (1.4), src/simplify.cc (1.45),
+	  src/swapping_sort.icc (1.10), src/version.cc (1.7),
+	  src/version.hh.in (1.12), tests/BBox.cc (1.11), tests/BBox.hh
+	  (1.10), tests/Makefile.am (1.247), tests/PFunction.cc (1.8),
+	  tests/PFunction.hh (1.8), tests/Random_Number_Generator.defs.hh
+	  (1.2), tests/Random_Number_Generator.inlines.hh (1.7),
+	  tests/Random_Number_Generator.types.hh (1.2), tests/ehandlers.cc
+	  (1.8), tests/ehandlers.hh (1.13), tests/files.cc (1.8),
+	  tests/files.hh (1.9), tests/ppl_test.hh (1.31), tests/print.cc
+	  (1.18), tests/print.hh (1.22), tests/BD_Shape/Makefile.am (1.31),
+	  tests/BD_Shape/addconstraints1.cc (1.6),
+	  tests/BD_Shape/addspacedims1.cc (1.7),
+	  tests/BD_Shape/addspacedims2.cc (1.7),
+	  tests/BD_Shape/addspacedims3.cc (1.8),
+	  tests/BD_Shape/addspacedims4.cc (1.8),
+	  tests/BD_Shape/addspacedims5.cc (1.9),
+	  tests/BD_Shape/addspacedims6.cc (1.9),
+	  tests/BD_Shape/addspacedims7.cc (1.7),
+	  tests/BD_Shape/affinedimension1.cc (1.3),
+	  tests/BD_Shape/affineimage1.cc (1.7),
+	  tests/BD_Shape/affineimage10.cc (1.5),
+	  tests/BD_Shape/affineimage2.cc (1.7),
+	  tests/BD_Shape/affineimage3.cc (1.7),
+	  tests/BD_Shape/affineimage4.cc (1.7),
+	  tests/BD_Shape/affineimage5.cc (1.7),
+	  tests/BD_Shape/affineimage6.cc (1.7),
+	  tests/BD_Shape/affineimage7.cc (1.7),
+	  tests/BD_Shape/affineimage8.cc (1.12),
+	  tests/BD_Shape/affineimage9.cc (1.10),
+	  tests/BD_Shape/affinepreimage1.cc (1.7),
+	  tests/BD_Shape/affinepreimage2.cc (1.7),
+	  tests/BD_Shape/affinepreimage3.cc (1.7),
+	  tests/BD_Shape/affinepreimage4.cc (1.7),
+	  tests/BD_Shape/affinepreimage5.cc (1.7),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.9),
+	  tests/BD_Shape/ascii_dump_load2.cc (1.8),
+	  tests/BD_Shape/bdsdifference1.cc (1.3),
+	  tests/BD_Shape/bdsdifference2.cc (1.3),
+	  tests/BD_Shape/bdsdifference3.cc (1.3),
+	  tests/BD_Shape/bdsdifference4.cc (1.3),
+	  tests/BD_Shape/bdsdifference5.cc (1.3),
+	  tests/BD_Shape/bdsdifference6.cc (1.3),
+	  tests/BD_Shape/bdsdifference7.cc (1.3),
+	  tests/BD_Shape/bdshull1.cc (1.3), tests/BD_Shape/bdshull2.cc
+	  (1.3), tests/BD_Shape/bdshull3.cc (1.3),
+	  tests/BD_Shape/bdshull4.cc (1.3),
+	  tests/BD_Shape/bgp99extrapolation1.cc (1.3),
+	  tests/BD_Shape/bhmz05widening1.cc (1.2),
+	  tests/BD_Shape/bhmz05widening2.cc (1.2),
+	  tests/BD_Shape/bhmz05widening3.cc (1.2),
+	  tests/BD_Shape/bhmz05widening4.cc (1.2),
+	  tests/BD_Shape/bhmz05widening5.cc (1.2),
+	  tests/BD_Shape/bhmz05widening6.cc (1.2),
+	  tests/BD_Shape/bhmz05widening7.cc (1.2),
+	  tests/BD_Shape/bhmz05widening8.cc (1.2),
+	  tests/BD_Shape/bhz03widening1.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.6),
+	  tests/BD_Shape/cc76extrapolation2.cc (1.7),
+	  tests/BD_Shape/cc76extrapolation3.cc (1.6),
+	  tests/BD_Shape/cc76extrapolation4.cc (1.8),
+	  tests/BD_Shape/cc76extrapolation5.cc (1.6),
+	  tests/BD_Shape/cc76extrapolation6.cc (1.8),
+	  tests/BD_Shape/cc76narrowing1.cc (1.6),
+	  tests/BD_Shape/cc76narrowing2.cc (1.6),
+	  tests/BD_Shape/cc76narrowing3.cc (1.6),
+	  tests/BD_Shape/cc76narrowing4.cc (1.7),
+	  tests/BD_Shape/cc76narrowing5.cc (1.7),
+	  tests/BD_Shape/closure1.cc (1.11), tests/BD_Shape/concatenate1.cc
+	  (1.7), tests/BD_Shape/concatenate2.cc (1.7),
+	  tests/BD_Shape/concatenate3.cc (1.6),
+	  tests/BD_Shape/concatenate4.cc (1.6),
+	  tests/BD_Shape/concatenate5.cc (1.7),
+	  tests/BD_Shape/constraints1.cc (1.9),
+	  tests/BD_Shape/constraints2.cc (1.7), tests/BD_Shape/contains1.cc
+	  (1.6), tests/BD_Shape/contains2.cc (1.8),
+	  tests/BD_Shape/contains3.cc (1.8), tests/BD_Shape/empty1.cc
+	  (1.6), tests/BD_Shape/empty2.cc (1.6), tests/BD_Shape/empty3.cc
+	  (1.7), tests/BD_Shape/empty4.cc (1.6), tests/BD_Shape/empty5.cc
+	  (1.6), tests/BD_Shape/equality1.cc (1.9),
+	  tests/BD_Shape/exceptions1.cc (1.10),
+	  tests/BD_Shape/exceptions2.cc (1.9),
+	  tests/BD_Shape/exceptions3.cc (1.10),
+	  tests/BD_Shape/fromgensys1.cc (1.6),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.8),
+	  tests/BD_Shape/generalizedaffineimage10.cc (1.7),
+	  tests/BD_Shape/generalizedaffineimage11.cc (1.6),
+	  tests/BD_Shape/generalizedaffineimage12.cc (1.6),
+	  tests/BD_Shape/generalizedaffineimage13.cc (1.6),
+	  tests/BD_Shape/generalizedaffineimage14.cc (1.10),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.7),
+	  tests/BD_Shape/generalizedaffineimage3.cc (1.8),
+	  tests/BD_Shape/generalizedaffineimage4.cc (1.7),
+	  tests/BD_Shape/generalizedaffineimage5.cc (1.7),
+	  tests/BD_Shape/generalizedaffineimage6.cc (1.6),
+	  tests/BD_Shape/generalizedaffineimage7.cc (1.7),
+	  tests/BD_Shape/generalizedaffineimage8.cc (1.7),
+	  tests/BD_Shape/generalizedaffineimage9.cc (1.6),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.4),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.3),
+	  tests/BD_Shape/geomcovers1.cc (1.3),
+	  tests/BD_Shape/h79widening1.cc (1.6),
+	  tests/BD_Shape/intersection1.cc (1.6),
+	  tests/BD_Shape/intersection2.cc (1.6),
+	  tests/BD_Shape/intersection3.cc (1.7),
+	  tests/BD_Shape/intersection4.cc (1.8),
+	  tests/BD_Shape/intersection5.cc (1.8),
+	  tests/BD_Shape/intersection6.cc (1.7),
+	  tests/BD_Shape/intersection7.cc (1.7),
+	  tests/BD_Shape/intersection8.cc (1.7),
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation2.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation3.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation4.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation5.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation6.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation7.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation8.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation9.cc (1.2),
+	  tests/BD_Shape/limitedcc76extrapolation1.cc (1.2),
+	  tests/BD_Shape/limitedcc76extrapolation2.cc (1.2),
+	  tests/BD_Shape/limitedcc76extrapolation3.cc (1.2),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.6),
+	  tests/BD_Shape/mapspacedims1.cc (1.6),
+	  tests/BD_Shape/mapspacedims2.cc (1.8),
+	  tests/BD_Shape/mapspacedims3.cc (1.7),
+	  tests/BD_Shape/mapspacedims4.cc (1.7),
+	  tests/BD_Shape/maxspacedim.cc (1.9),
+	  tests/BD_Shape/minconstraints1.cc (1.3),
+	  tests/BD_Shape/relations1.cc (1.10), tests/BD_Shape/relations2.cc
+	  (1.10), tests/BD_Shape/relations3.cc (1.9),
+	  tests/BD_Shape/relations4.cc (1.8), tests/BD_Shape/relations5.cc
+	  (1.10), tests/BD_Shape/removespacedims1.cc (1.7),
+	  tests/BD_Shape/removespacedims2.cc (1.8),
+	  tests/BD_Shape/removespacedims3.cc (1.8),
+	  tests/BD_Shape/timeelapse1.cc (1.7),
+	  tests/BD_Shape/timeelapse2.cc (1.6),
+	  tests/BD_Shape/timeelapse3.cc (1.6),
+	  tests/BD_Shape/timeelapse4.cc (1.6),
+	  tests/BD_Shape/timeelapse5.cc (1.7), tests/BD_Shape/universe1.cc
+	  (1.7), tests/BD_Shape/writebdshape1.cc (1.4),
+	  tests/BD_Shape/writebdshape2.cc (1.5),
+	  tests/Polyhedron/CbecomesNNC1.cc (1.6),
+	  tests/Polyhedron/LP_Problem3.cc (1.4),
+	  tests/Polyhedron/Makefile.am (1.40),
+	  tests/Polyhedron/NNCbecomesC1.cc (1.6),
+	  tests/Polyhedron/NNCminimize1.cc (1.6),
+	  tests/Polyhedron/NNCminimize2.cc (1.6),
+	  tests/Polyhedron/NNCminimize3.cc (1.6),
+	  tests/Polyhedron/NNCminimize4.cc (1.6),
+	  tests/Polyhedron/NNCminimize5.cc (1.6),
+	  tests/Polyhedron/NNCminimize6.cc (1.6), tests/Polyhedron/README
+	  (1.5), tests/Polyhedron/addconstraint1.cc (1.6),
+	  tests/Polyhedron/addconstraint2.cc (1.7),
+	  tests/Polyhedron/addconstraint3.cc (1.6),
+	  tests/Polyhedron/addconstraints1.cc (1.7),
+	  tests/Polyhedron/addconstraints10.cc (1.7),
+	  tests/Polyhedron/addconstraints11.cc (1.6),
+	  tests/Polyhedron/addconstraints12.cc (1.6),
+	  tests/Polyhedron/addconstraints13.cc (1.7),
+	  tests/Polyhedron/addconstraints2.cc (1.6),
+	  tests/Polyhedron/addconstraints3.cc (1.7),
+	  tests/Polyhedron/addconstraints4.cc (1.6),
+	  tests/Polyhedron/addconstraints5.cc (1.7),
+	  tests/Polyhedron/addconstraints6.cc (1.6),
+	  tests/Polyhedron/addconstraints7.cc (1.7),
+	  tests/Polyhedron/addconstraints8.cc (1.7),
+	  tests/Polyhedron/addconstraints9.cc (1.6),
+	  tests/Polyhedron/addgenerator1.cc (1.7),
+	  tests/Polyhedron/addgenerator2.cc (1.7),
+	  tests/Polyhedron/addgenerator3.cc (1.6),
+	  tests/Polyhedron/addgenerator4.cc (1.7),
+	  tests/Polyhedron/addgenerator5.cc (1.7),
+	  tests/Polyhedron/addgenerators1.cc (1.7),
+	  tests/Polyhedron/addgenerators10.cc (1.7),
+	  tests/Polyhedron/addgenerators11.cc (1.7),
+	  tests/Polyhedron/addgenerators12.cc (1.7),
+	  tests/Polyhedron/addgenerators13.cc (1.7),
+	  tests/Polyhedron/addgenerators2.cc (1.7),
+	  tests/Polyhedron/addgenerators3.cc (1.6),
+	  tests/Polyhedron/addgenerators4.cc (1.6),
+	  tests/Polyhedron/addgenerators5.cc (1.6),
+	  tests/Polyhedron/addgenerators6.cc (1.7),
+	  tests/Polyhedron/addgenerators7.cc (1.6),
+	  tests/Polyhedron/addgenerators8.cc (1.7),
+	  tests/Polyhedron/addgenerators9.cc (1.6),
+	  tests/Polyhedron/addspacedims1.cc (1.7),
+	  tests/Polyhedron/addspacedims10.cc (1.6),
+	  tests/Polyhedron/addspacedims11.cc (1.6),
+	  tests/Polyhedron/addspacedims12.cc (1.6),
+	  tests/Polyhedron/addspacedims13.cc (1.6),
+	  tests/Polyhedron/addspacedims2.cc (1.7),
+	  tests/Polyhedron/addspacedims3.cc (1.8),
+	  tests/Polyhedron/addspacedims4.cc (1.6),
+	  tests/Polyhedron/addspacedims5.cc (1.6),
+	  tests/Polyhedron/addspacedims6.cc (1.6),
+	  tests/Polyhedron/addspacedims7.cc (1.6),
+	  tests/Polyhedron/addspacedims8.cc (1.7),
+	  tests/Polyhedron/addspacedims9.cc (1.6),
+	  tests/Polyhedron/affineimage1.cc (1.7),
+	  tests/Polyhedron/affineimage2.cc (1.6),
+	  tests/Polyhedron/affineimage3.cc (1.6),
+	  tests/Polyhedron/affineimage4.cc (1.7),
+	  tests/Polyhedron/affineimage5.cc (1.7),
+	  tests/Polyhedron/affineimage6.cc (1.8),
+	  tests/Polyhedron/affineimage7.cc (1.6),
+	  tests/Polyhedron/affineimage8.cc (1.6),
+	  tests/Polyhedron/affineimage9.cc (1.6),
+	  tests/Polyhedron/affinepreimage1.cc (1.6),
+	  tests/Polyhedron/affinepreimage10.cc (1.6),
+	  tests/Polyhedron/affinepreimage11.cc (1.4),
+	  tests/Polyhedron/affinepreimage2.cc (1.6),
+	  tests/Polyhedron/affinepreimage3.cc (1.7),
+	  tests/Polyhedron/affinepreimage4.cc (1.6),
+	  tests/Polyhedron/affinepreimage5.cc (1.6),
+	  tests/Polyhedron/affinepreimage6.cc (1.6),
+	  tests/Polyhedron/affinepreimage7.cc (1.6),
+	  tests/Polyhedron/affinepreimage8.cc (1.7),
+	  tests/Polyhedron/affinepreimage9.cc (1.6),
+	  tests/Polyhedron/affinetrans.cc (1.7),
+	  tests/Polyhedron/append1.cc (1.6), tests/Polyhedron/append2.cc
+	  (1.6), tests/Polyhedron/ascii_dump_load1.cc (1.6),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.6),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.6),
+	  tests/Polyhedron/ascii_dump_load4.cc (1.6),
+	  tests/Polyhedron/ascii_dump_load5.cc (1.6),
+	  tests/Polyhedron/ascii_dump_load6.cc (1.7),
+	  tests/Polyhedron/ascii_dump_load7.cc (1.6),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.7),
+	  tests/Polyhedron/bgp99extrapolation2.cc (1.7),
+	  tests/Polyhedron/bhrz03widening1.cc (1.6),
+	  tests/Polyhedron/bhrz03widening10.cc (1.7),
+	  tests/Polyhedron/bhrz03widening11.cc (1.6),
+	  tests/Polyhedron/bhrz03widening12.cc (1.6),
+	  tests/Polyhedron/bhrz03widening13.cc (1.6),
+	  tests/Polyhedron/bhrz03widening14.cc (1.6),
+	  tests/Polyhedron/bhrz03widening15.cc (1.7),
+	  tests/Polyhedron/bhrz03widening16.cc (1.6),
+	  tests/Polyhedron/bhrz03widening17.cc (1.6),
+	  tests/Polyhedron/bhrz03widening18.cc (1.6),
+	  tests/Polyhedron/bhrz03widening19.cc (1.6),
+	  tests/Polyhedron/bhrz03widening2.cc (1.6),
+	  tests/Polyhedron/bhrz03widening3.cc (1.6),
+	  tests/Polyhedron/bhrz03widening4.cc (1.6),
+	  tests/Polyhedron/bhrz03widening5.cc (1.6),
+	  tests/Polyhedron/bhrz03widening6.cc (1.6),
+	  tests/Polyhedron/bhrz03widening7.cc (1.6),
+	  tests/Polyhedron/bhrz03widening8.cc (1.6),
+	  tests/Polyhedron/bhrz03widening9.cc (1.6),
+	  tests/Polyhedron/bhz03widening1.cc (1.8),
+	  tests/Polyhedron/bhz03widening2.cc (1.8),
+	  tests/Polyhedron/bhz03widening3.cc (1.8),
+	  tests/Polyhedron/bhz03widening4.cc (1.7),
+	  tests/Polyhedron/bhz03widening5.cc (1.7),
+	  tests/Polyhedron/bhz03widening6.cc (1.8),
+	  tests/Polyhedron/bounded1.cc (1.7),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.5),
+	  tests/Polyhedron/boundedaffineimage2.cc (1.4),
+	  tests/Polyhedron/boundedaffineimage3.cc (1.4),
+	  tests/Polyhedron/boundedaffinepreimage1.cc (1.4),
+	  tests/Polyhedron/boundedaffinepreimage2.cc (1.4),
+	  tests/Polyhedron/boundedaffinepreimage3.cc (1.4),
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.5),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.7),
+	  tests/Polyhedron/boundingbox1.cc (1.8),
+	  tests/Polyhedron/boundingbox2.cc (1.7),
+	  tests/Polyhedron/boundingbox3.cc (1.7),
+	  tests/Polyhedron/boundingbox4.cc (1.7),
+	  tests/Polyhedron/boundingbox5.cc (1.7),
+	  tests/Polyhedron/bounds1.cc (1.7), tests/Polyhedron/bounds2.cc
+	  (1.6), tests/Polyhedron/bug2.cc (1.5),
+	  tests/Polyhedron/concatenate1.cc (1.6),
+	  tests/Polyhedron/concatenate2.cc (1.7),
+	  tests/Polyhedron/concatenate3.cc (1.6),
+	  tests/Polyhedron/concatenate4.cc (1.6),
+	  tests/Polyhedron/concatenate5.cc (1.6),
+	  tests/Polyhedron/concatenate6.cc (1.7),
+	  tests/Polyhedron/concatenate7.cc (1.5),
+	  tests/Polyhedron/constraints1.cc (1.6),
+	  tests/Polyhedron/constraints2.cc (1.7),
+	  tests/Polyhedron/constraints3.cc (1.6),
+	  tests/Polyhedron/constraints4.cc (1.7),
+	  tests/Polyhedron/constraints5.cc (1.5),
+	  tests/Polyhedron/contains1.cc (1.6),
+	  tests/Polyhedron/contains2.cc (1.6),
+	  tests/Polyhedron/contains3.cc (1.6),
+	  tests/Polyhedron/contains4.cc (1.6),
+	  tests/Polyhedron/contains5.cc (1.6),
+	  tests/Polyhedron/disjoint1.cc (1.6),
+	  tests/Polyhedron/disjoint2.cc (1.7),
+	  tests/Polyhedron/disjoint3.cc (1.7),
+	  tests/Polyhedron/dualhypercubes.cc (1.6),
+	  tests/Polyhedron/empty1.cc (1.7), tests/Polyhedron/equals1.cc
+	  (1.6), tests/Polyhedron/exceptions1.cc (1.9),
+	  tests/Polyhedron/exceptions2.cc (1.7),
+	  tests/Polyhedron/exceptions3.cc (1.8),
+	  tests/Polyhedron/expandspacedim1.cc (1.7),
+	  tests/Polyhedron/expandspacedim2.cc (1.7),
+	  tests/Polyhedron/foldspacedims1.cc (1.7),
+	  tests/Polyhedron/foldspacedims2.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage10.cc (1.6),
+	  tests/Polyhedron/generalizedaffineimage11.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage12.cc (1.6),
+	  tests/Polyhedron/generalizedaffineimage13.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage14.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage3.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage4.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage5.cc (1.6),
+	  tests/Polyhedron/generalizedaffineimage6.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage7.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage8.cc (1.6),
+	  tests/Polyhedron/generalizedaffineimage9.cc (1.6),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.4),
+	  tests/Polyhedron/generalizedaffinepreimage2.cc (1.4),
+	  tests/Polyhedron/generalizedaffinepreimage3.cc (1.4),
+	  tests/Polyhedron/generalizedaffinepreimage4.cc (1.4),
+	  tests/Polyhedron/generators1.cc (1.6),
+	  tests/Polyhedron/generators2.cc (1.6),
+	  tests/Polyhedron/generators3.cc (1.7),
+	  tests/Polyhedron/generators4.cc (1.7),
+	  tests/Polyhedron/generators5.cc (1.6),
+	  tests/Polyhedron/generators6.cc (1.7),
+	  tests/Polyhedron/generators7.cc (1.6),
+	  tests/Polyhedron/geomcovers1.cc (1.8),
+	  tests/Polyhedron/gramschmidt1.cc (1.3),
+	  tests/Polyhedron/h79widening1.cc (1.6),
+	  tests/Polyhedron/h79widening2.cc (1.6),
+	  tests/Polyhedron/h79widening3.cc (1.6),
+	  tests/Polyhedron/h79widening4.cc (1.6),
+	  tests/Polyhedron/h79widening5.cc (1.7),
+	  tests/Polyhedron/h79widening6.cc (1.6),
+	  tests/Polyhedron/h79widening7.cc (1.6),
+	  tests/Polyhedron/h79widening8.cc (1.6),
+	  tests/Polyhedron/intersection1.cc (1.6),
+	  tests/Polyhedron/intersection10.cc (1.7),
+	  tests/Polyhedron/intersection11.cc (1.7),
+	  tests/Polyhedron/intersection2.cc (1.6),
+	  tests/Polyhedron/intersection3.cc (1.6),
+	  tests/Polyhedron/intersection4.cc (1.7),
+	  tests/Polyhedron/intersection5.cc (1.7),
+	  tests/Polyhedron/intersection6.cc (1.7),
+	  tests/Polyhedron/intersection7.cc (1.6),
+	  tests/Polyhedron/intersection8.cc (1.7),
+	  tests/Polyhedron/intersection9.cc (1.7),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.6),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.6),
+	  tests/Polyhedron/limitedh79extrapolation2.cc (1.6),
+	  tests/Polyhedron/limitedh79extrapolation3.cc (1.6),
+	  tests/Polyhedron/limitedh79extrapolation4.cc (1.7),
+	  tests/Polyhedron/linearpartition1.cc (1.6),
+	  tests/Polyhedron/linearpartition2.cc (1.6),
+	  tests/Polyhedron/linearpartition3.cc (1.6),
+	  tests/Polyhedron/linearpartition4.cc (1.7),
+	  tests/Polyhedron/linearsystem1.cc (1.3),
+	  tests/Polyhedron/linexpression1.cc (1.6),
+	  tests/Polyhedron/lpproblem1.cc (1.2),
+	  tests/Polyhedron/lpproblem2.cc (1.2),
+	  tests/Polyhedron/mapspacedims1.cc (1.7),
+	  tests/Polyhedron/mapspacedims2.cc (1.6),
+	  tests/Polyhedron/mapspacedims3.cc (1.6),
+	  tests/Polyhedron/mapspacedims4.cc (1.6),
+	  tests/Polyhedron/matrix1.cc (1.6), tests/Polyhedron/max_min1.cc
+	  (1.7), tests/Polyhedron/max_min2.cc (1.7),
+	  tests/Polyhedron/maxspacedim1.cc (1.6), tests/Polyhedron/mc91.cc
+	  (1.7), tests/Polyhedron/membytes1.cc (1.7),
+	  tests/Polyhedron/membytes2.cc (1.6), tests/Polyhedron/memory1.cc
+	  (1.8), tests/Polyhedron/memory2.cc (1.11),
+	  tests/Polyhedron/minconstraints1.cc (1.6),
+	  tests/Polyhedron/minconstraints2.cc (1.7),
+	  tests/Polyhedron/minconstraints3.cc (1.6),
+	  tests/Polyhedron/minconstraints4.cc (1.6),
+	  tests/Polyhedron/mingenerators1.cc (1.6),
+	  tests/Polyhedron/mingenerators2.cc (1.7),
+	  tests/Polyhedron/mingenerators3.cc (1.6),
+	  tests/Polyhedron/numberinput1.cc (1.20),
+	  tests/Polyhedron/onepoint.cc (1.7), tests/Polyhedron/permute.cc
+	  (1.6), tests/Polyhedron/polydifference1.cc (1.6),
+	  tests/Polyhedron/polydifference2.cc (1.6),
+	  tests/Polyhedron/polydifference3.cc (1.6),
+	  tests/Polyhedron/polydifference4.cc (1.7),
+	  tests/Polyhedron/polydifference5.cc (1.6),
+	  tests/Polyhedron/polydifference6.cc (1.6),
+	  tests/Polyhedron/polydifference7.cc (1.7),
+	  tests/Polyhedron/polydifference8.cc (1.6),
+	  tests/Polyhedron/polydifference9.cc (1.7),
+	  tests/Polyhedron/polyhull1.cc (1.6),
+	  tests/Polyhedron/polyhull10.cc (1.6),
+	  tests/Polyhedron/polyhull11.cc (1.6),
+	  tests/Polyhedron/polyhull2.cc (1.7),
+	  tests/Polyhedron/polyhull3.cc (1.7),
+	  tests/Polyhedron/polyhull4.cc (1.6),
+	  tests/Polyhedron/polyhull5.cc (1.7),
+	  tests/Polyhedron/polyhull6.cc (1.6),
+	  tests/Polyhedron/polyhull7.cc (1.6),
+	  tests/Polyhedron/polyhull8.cc (1.7),
+	  tests/Polyhedron/polyhull9.cc (1.7),
+	  tests/Polyhedron/polypowerset1.cc (1.8),
+	  tests/Polyhedron/powerset1.cc (1.4),
+	  tests/Polyhedron/randphull1.cc (1.7),
+	  tests/Polyhedron/randphull2.cc (1.8),
+	  tests/Polyhedron/relations1.cc (1.6),
+	  tests/Polyhedron/relations10.cc (1.6),
+	  tests/Polyhedron/relations11.cc (1.6),
+	  tests/Polyhedron/relations12.cc (1.6),
+	  tests/Polyhedron/relations13.cc (1.6),
+	  tests/Polyhedron/relations14.cc (1.6),
+	  tests/Polyhedron/relations15.cc (1.6),
+	  tests/Polyhedron/relations16.cc (1.6),
+	  tests/Polyhedron/relations17.cc (1.7),
+	  tests/Polyhedron/relations18.cc (1.6),
+	  tests/Polyhedron/relations19.cc (1.7),
+	  tests/Polyhedron/relations2.cc (1.7),
+	  tests/Polyhedron/relations3.cc (1.6),
+	  tests/Polyhedron/relations4.cc (1.6),
+	  tests/Polyhedron/relations5.cc (1.6),
+	  tests/Polyhedron/relations6.cc (1.7),
+	  tests/Polyhedron/relations7.cc (1.6),
+	  tests/Polyhedron/relations8.cc (1.6),
+	  tests/Polyhedron/relations9.cc (1.6),
+	  tests/Polyhedron/removespacedims1.cc (1.6),
+	  tests/Polyhedron/removespacedims10.cc (1.7),
+	  tests/Polyhedron/removespacedims2.cc (1.6),
+	  tests/Polyhedron/removespacedims3.cc (1.7),
+	  tests/Polyhedron/removespacedims4.cc (1.6),
+	  tests/Polyhedron/removespacedims5.cc (1.7),
+	  tests/Polyhedron/removespacedims6.cc (1.6),
+	  tests/Polyhedron/removespacedims7.cc (1.6),
+	  tests/Polyhedron/removespacedims8.cc (1.6),
+	  tests/Polyhedron/removespacedims9.cc (1.6),
+	  tests/Polyhedron/smm1.cc (1.6), tests/Polyhedron/timeelapse1.cc
+	  (1.6), tests/Polyhedron/timeelapse2.cc (1.7),
+	  tests/Polyhedron/timeelapse3.cc (1.6),
+	  tests/Polyhedron/timeelapse4.cc (1.6),
+	  tests/Polyhedron/timeelapse5.cc (1.7),
+	  tests/Polyhedron/timeelapse6.cc (1.6),
+	  tests/Polyhedron/timeelapse7.cc (1.7),
+	  tests/Polyhedron/timeelapse8.cc (1.7),
+	  tests/Polyhedron/timeelapse9.cc (1.7),
+	  tests/Polyhedron/topclosed1.cc (1.7),
+	  tests/Polyhedron/topclosed2.cc (1.7),
+	  tests/Polyhedron/topclosed3.cc (1.6),
+	  tests/Polyhedron/topclosure1.cc (1.6),
+	  tests/Polyhedron/topclosure2.cc (1.7),
+	  tests/Polyhedron/topclosure3.cc (1.6),
+	  tests/Polyhedron/topclosure4.cc (1.7),
+	  tests/Polyhedron/universe1.cc (1.6),
+	  tests/Polyhedron/universe2.cc (1.6),
+	  tests/Polyhedron/universe3.cc (1.6),
+	  tests/Polyhedron/universe4.cc (1.6),
+	  tests/Polyhedron/universe5.cc (1.6),
+	  tests/Polyhedron/universe6.cc (1.6),
+	  tests/Polyhedron/universe7.cc (1.6),
+	  tests/Polyhedron/watchdog1.cc (1.7),
+	  tests/Polyhedron/writeconsys1.cc (1.6),
+	  tests/Polyhedron/writegensys1.cc (1.6),
+	  tests/Polyhedron/writegensys2.cc (1.7),
+	  tests/Polyhedron/writegensys3.cc (1.6),
+	  tests/Polyhedron/writepolyhedron1.cc (1.6),
+	  tests/Polyhedron/writepolyhedron2.cc (1.6),
+	  tests/Polyhedron/writepolyhedron3.cc (1.6),
+	  tests/Polyhedron/writerelation1.cc (1.6),
+	  tests/Polyhedron/writevariable1.cc (1.6), utils/Makefile.am
+	  (1.11), utils/build_header.in (1.3), utils/text2cxxarray.in
+	  (1.2), utils/timings.cc (1.6), utils/timings.hh (1.4): Copyright
+	  years extended.
+
+2005-12-31 Saturday 18:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: primalsimplex1.cc (1.5), primalsimplex2.cc
+	  (1.5): No longer testing the primal_simplex method.
+
+2005-12-31 Saturday 18:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.171): Do not announce the primal_simplex() methods; do
+	  announce the LP_Problem class instead.
+
+2005-12-31 Saturday 18:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.181): The widening on BD_Shape is now the
+	  BHMZ05 widening.
+
+2005-12-31 Saturday 18:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.146), ppl_c.h.in (1.59): Got rid of
+	  the old interfaces for the primal simplex algorithm.
+
+2005-12-31 Saturday 18:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: LP_Problem1.cc (1.3), LP_Problem2.cc (1.3),
+	  Makefile.am (1.39), lpproblem1.cc (1.1), lpproblem2.cc (1.1):
+	  Renamed (and basically rewritten) tests for class LP_Problem.
+
+2005-12-31 Saturday 18:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.30), bhmz05widening1.cc (1.1),
+	  bhmz05widening2.cc (1.1), bhmz05widening3.cc (1.1),
+	  bhmz05widening4.cc (1.1), bhmz05widening5.cc (1.1),
+	  bhmz05widening6.cc (1.1), bhmz05widening7.cc (1.1),
+	  bhmz05widening8.cc (1.1), ch78widening1.cc (1.6),
+	  ch78widening2.cc (1.7), ch78widening3.cc (1.6), ch78widening4.cc
+	  (1.7), ch78widening5.cc (1.7), ch78widening6.cc (1.9),
+	  ch78widening7.cc (1.6), ch78widening8.cc (1.7), exceptions2.cc
+	  (1.8), limitedCC76extrapolation1.cc (1.6),
+	  limitedCC76extrapolation2.cc (1.8), limitedCC76extrapolation3.cc
+	  (1.8), limitedCH78extrapolation1.cc (1.7),
+	  limitedCH78extrapolation2.cc (1.6), limitedCH78extrapolation3.cc
+	  (1.6), limitedCH78extrapolation4.cc (1.6),
+	  limitedCH78extrapolation5.cc (1.6), limitedCH78extrapolation6.cc
+	  (1.6), limitedCH78extrapolation7.cc (1.6),
+	  limitedCH78extrapolation8.cc (1.6), limitedCH78extrapolation9.cc
+	  (1.6), limitedbhmz05extrapolation1.cc (1.1),
+	  limitedbhmz05extrapolation2.cc (1.1),
+	  limitedbhmz05extrapolation3.cc (1.1),
+	  limitedbhmz05extrapolation4.cc (1.1),
+	  limitedbhmz05extrapolation5.cc (1.1),
+	  limitedbhmz05extrapolation6.cc (1.1),
+	  limitedbhmz05extrapolation7.cc (1.1),
+	  limitedbhmz05extrapolation8.cc (1.1),
+	  limitedbhmz05extrapolation9.cc (1.1),
+	  limitedcc76extrapolation1.cc (1.1), limitedcc76extrapolation2.cc
+	  (1.1), limitedcc76extrapolation3.cc (1.1): Renaming the CH78
+	  widening into BHMZ05 widening.  Avoid uppercases in the tests'
+	  filenames.
+
+2005-12-31 Saturday 18:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.55), BD_Shape.inlines.hh (1.115):
+	  Method CH78_widening_assign() renamed as
+	  BHMZ05_widening_assign().  Fixed a few problems in the
+	  documentation.  Fixed several occurrences of a problem regarding
+	  the checked approximation of the negation of a Coefficient.
+
+2005-12-31 Saturday 18:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.129): Exploit LP_Problem when
+	  (efficiently) testing for emptyness of the Polyhedron in method
+	  shrink_bounding_box().
+
+2005-12-31 Saturday 18:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.62): Exploit the new LP_Problem
+	  class in the implementation of minimization for NNC polyhedra.
+
+2005-12-31 Saturday 18:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.inlines.hh (1.3): Properly initialize and copy the
+	  private member working_cost.
+
+2005-12-31 Saturday 18:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Makefile.am (1.133), simplex.cc (1.35): Got rid of the old
+	  simplex implementation.
+
+2005-12-31 Saturday 18:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.defs.hh (1.21): Got rid of the primal
+	  simplex methods.
+
+2005-12-31 Saturday 18:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.111): Corrected documentation for
+	  private method set_is_inequality().
+
+2005-12-31 Saturday 18:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.62), devref.doxyconf-latex.in
+	  (1.5), user.doxyconf-html.in (1.32), user.doxyconf-latex.in
+	  (1.4): Updated to the new version of doxygen (1.4.6).  Completed
+	  the list of input files for the devref manual.
+
+2005-12-31 Saturday 18:03  Abramo Bagnara
+
+	* src/checked.cc (1.10): Reverted to old version and fixed it.
+
+2005-12-31 Saturday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.19): Fixed another expected
+	  result.
+
+2005-12-31 Saturday 17:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.18): Fixed some expected
+	  results.
+
+2005-12-31 Saturday 17:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.17): FIX comments removed:
+	  some were OK, some were not.
+
+2005-12-31 Saturday 15:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.cc (1.5): Added a missing \relates Doxygen
+	  command.
+
+2005-12-31 Saturday 15:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh (1.15), GMP_Integer.inlines.hh (1.10):
+	  Added binary version of neg_assign().
+
+2005-12-31 Saturday 12:23  Abramo Bagnara
+
+	* tests/Polyhedron/numberinput1.cc (1.16): Rewritten test function.
+
+2005-12-31 Saturday 12:17  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.50): Missing rename.
+
+2005-12-31 Saturday 11:40  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.51), interfaces/C/ppl_c.cc (1.145),
+	  interfaces/Prolog/ppl_prolog.icc (1.167),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.38),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.33),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.83),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.109),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.74),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.100), src/BD_Shape.inlines.hh
+	  (1.114), src/Bounding_Box.inlines.hh (1.13),
+	  src/Checked_Number.defs.hh (1.46), src/Checked_Number.inlines.hh
+	  (1.49), src/DB_Matrix.inlines.hh (1.20),
+	  src/Polyhedron.inlines.hh (1.128), src/Polyhedron_nonpublic.cc
+	  (1.61), tests/Random_Number_Generator.inlines.hh (1.6),
+	  tests/BD_Shape/closure1.cc (1.10): Renamed assign in assign_r for
+	  congruency.
+
+2005-12-30 Friday 23:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.180): Removed a repeated "the".
+
+2005-12-30 Friday 23:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.165): Removed two items:
+
+	  - Improve the documentation of Polyhedron::shrink_bounding_box().
+	     See
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2005-July/006191.html.
+	   (documentation of Polyhedron::shrink_bounding_box() has been
+	  improved.)
+
+	  - The documentation has been read through but a more careful
+	  check,   particularly on the detailed descriptions, should be
+	  done.
+
+2005-12-30 Friday 23:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.287): Added more explanation regarding
+	  shrink_bounding_box.
+
+2005-12-30 Friday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Expression.cc (1.7): Removed excessive uses of
+	  vertical space.
+
+2005-12-30 Friday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_Expression.defs.hh (1.15), Polyhedron.defs.hh
+	  (1.286): Removed excessive indentation in Doxygen comments.
+
+2005-12-30 Friday 21:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/LP_Problem3.cc (1.3): Avoid a space dimension
+	  compatibility problem.
+
+2005-12-30 Friday 21:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.50), interfaces/C/ppl_c.cc (1.144),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.37),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.32),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.82),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.108),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.73), src/BD_Shape.inlines.hh
+	  (1.113), src/Bounding_Box.inlines.hh (1.12),
+	  src/Polyhedron.inlines.hh (1.127), src/Polyhedron_nonpublic.cc
+	  (1.60): Got rid of most uses of raw_value().
+
+2005-12-30 Friday 21:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.11): Delete trailing whitespace.
+
+2005-12-30 Friday 21:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.143): Added a couple of missing spaces.
+
+2005-12-30 Friday 21:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.58): Corrected the documentation for
+	  the return value of ppl_LP_Problem_solve().
+
+2005-12-30 Friday 21:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.166): Fixed indentation in a
+	  switch statement.  Added the missing default case in another
+	  switch statement.
+
+2005-12-30 Friday 21:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.16), expected_mpz (1.5),
+	  expected_mpz_a (1.5): Make check now also perform many tests
+	  using the simplex algorithm.	Expected results for mpz
+	  coefficients changed accordingly.
+
+2005-12-30 Friday 21:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.25): Check for all possible values
+	  that can be returned by ppl_LP_Problem_solve().
+
+2005-12-30 Friday 21:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.35): Added namespace
+	  qualification to a doxygen \relates command for a function that
+	  is no longer in the anonymous namespace.
+
+2005-12-30 Friday 21:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GMP_Integer.types.hh (1.10): Let the brief doxygen
+	  documentation be actually printed.
+
+2005-12-30 Friday 19:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ptr_Iterator.types.hh (1.4): Replaced a use of `class' with
+	  `typename'.
+
+2005-12-30 Friday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.types.hh (1.3), BD_Shape.types.hh (1.4),
+	  BHRZ03_Certificate.types.hh (1.3), Bounding_Box.types.hh (1.3),
+	  C_Polyhedron.types.hh (1.9), Constraint.types.hh (1.9),
+	  Constraint_System.types.hh (1.3), DB_Matrix.types.hh (1.4),
+	  DB_Row.types.hh (1.5), Determinate.types.hh (1.7),
+	  Generator.types.hh (1.9), Generator_System.types.hh (1.3),
+	  H79_Certificate.types.hh (1.3), Init.types.hh (1.8),
+	  Interval.types.hh (1.10), LP_Problem.types.hh (1.3),
+	  Linear_Expression.types.hh (1.3), Linear_Row.types.hh (1.3),
+	  Linear_System.types.hh (1.3), Matrix.types.hh (1.9),
+	  NNC_Polyhedron.types.hh (1.9), Poly_Con_Relation.types.hh (1.8),
+	  Poly_Gen_Relation.types.hh (1.8), Polyhedra_Powerset.types.hh
+	  (1.3), Powerset.types.hh (1.3), Row.types.hh (1.10),
+	  Saturation_Matrix.types.hh (1.3), Saturation_Row.types.hh (1.3),
+	  Variable.types.hh (1.9), Widening_Function.types.hh (1.4):
+	  Namespaces' closing brackets should always be commented.
+
+2005-12-30 Friday 19:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Coefficient.types.hh (1.10): Include "Checked_Number.defs.hh"
+	  unconditionally.
+
+2005-12-30 Friday 19:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/namespaces.hh (1.4): Namespaces' closing brackets should
+	  always be commented.
+
+2005-12-30 Friday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.170), demos/ppl_lpsol/Makefile.am (1.15): With the new
+	  simplex implementation, ppl_lpsol is indeed a quite useful tool:
+	  it is now installed in $(bindir) upon `make install'.
+
+2005-12-30 Friday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.24): New option --enumerate, dual
+	  to --simplex.
+
+2005-12-30 Friday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Coefficient.defs.hh (1.5), Coefficient.types.hh (1.9),
+	  Makefile.am (1.132), Native_Integer.defs.hh (1.17),
+	  Native_Integer.inlines.hh (1.20), Native_Integer.types.hh (1.11):
+	  Old implementation of native integer coefficients phased out:
+	  checked numbers with the transparent policy are used instead.
+
+2005-12-30 Friday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.199): When native integers are requested, use
+	  checked numbers with the transparent policy for the coefficients.
+	  Version number bumped.
+
+2005-12-30 Friday 17:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.23): Require at least version 8 of
+	  the PPL.
+
+2005-12-30 Friday 17:10  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.45), Checked_Number.inlines.hh
+	  (1.48), checked.defs.hh (1.29): More visibility to
+	  Checked_Number_Transparent_Policy.
+
+2005-12-30 Friday 16:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.22): Now also accepting the long
+	  option --simplex.  Avoid a duplicated timing output and do not
+	  claim optimization (in the output) when the LP problem has been
+	  found unfeasible or unbounded.
+
+2005-12-30 Friday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.inlines.hh (1.19): Implemented template
+	  <typename T> Native_Integer<T>::operator T() const.
+
+2005-12-30 Friday 10:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (1.88): Added an assertion on the parameter of
+	  permute_columns().
+
+2005-12-30 Friday 10:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.112): Added a missing namespace
+	  qualification in code expoiting the new simplex implementation.
+
+2005-12-30 Friday 09:36  Abramo Bagnara
+
+	* src/: BD_Shape.inlines.hh (1.111), Checked_Number.defs.hh (1.44),
+	  Checked_Number.inlines.hh (1.47), Constraint.cc (1.53),
+	  DB_Matrix.inlines.hh (1.19), GMP_Integer.defs.hh (1.14),
+	  GMP_Integer.inlines.hh (1.9), Generator.cc (1.66), LP_Problem.cc
+	  (1.3), Linear_Expression.cc (1.6), Linear_Row.cc (1.15),
+	  Linear_System.cc (1.32), Native_Integer.defs.hh (1.16),
+	  Native_Integer.inlines.hh (1.18), Polyhedron_public.cc (1.69),
+	  Row.cc (1.94), conversion.cc (1.76), simplex.cc (1.34): Renamed
+	  assign functors for congruency.
+
+2005-12-30 Friday 09:34  Abramo Bagnara
+
+	* src/: checked_int.inlines.hh (1.42), checked_numeric_limits.hh
+	  (1.8): Cleaner implementation of limits.
+
+2005-12-29 Thursday 22:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.21), doc/devref.doxyconf-html.in
+	  (1.61), interfaces/C/ppl_c.cc (1.142), interfaces/C/ppl_c.h.in
+	  (1.57), interfaces/Prolog/Prolog_interface.dox (1.139),
+	  interfaces/Prolog/exceptions.hh (1.18),
+	  interfaces/Prolog/ppl_prolog.icc (1.165),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.107),
+	  src/BD_Shape.inlines.hh (1.110), src/Constraint_System.defs.hh
+	  (1.20), src/LP_Problem.cc (1.2), src/LP_Problem.defs.hh (1.2),
+	  src/LP_Problem.inlines.hh (1.2), src/LP_Problem.types.hh (1.2),
+	  src/Linear_Expression.defs.hh (1.14), src/Makefile.am (1.131),
+	  src/Polyhedron_nonpublic.cc (1.59), src/globals.types.hh (1.3),
+	  src/simplex.cc (1.33), tests/Polyhedron/LP_Problem1.cc (1.2),
+	  tests/Polyhedron/LP_Problem2.cc (1.2),
+	  tests/Polyhedron/LP_Problem3.cc (1.2),
+	  tests/Polyhedron/Makefile.am (1.38),
+	  tests/Polyhedron/primalsimplex1.cc (1.4),
+	  tests/Polyhedron/primalsimplex2.cc (1.4): First merge of the
+	  simplex branch to the main trunk.
+
+2005-12-29 Thursday 20:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.4): Stick to use the new
+	  interface for the simplex algorithm.
+
+2005-12-29 Thursday 08:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.198): Check for egrep: we use it to perform some
+	  version checks.
+
+2005-12-29 Thursday 07:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.169), interfaces/Prolog/Prolog_interface.dox (1.138),
+	  m4/ac_check_swi_prolog.m4 (1.7): We now require SWI-Prolog 5.6.0
+	  or later version: the AC_CHECK_SWI_PROLOG macro checks that this
+	  requirement is fulfilled.
+
+2005-12-29 Thursday 07:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.93): Avoid shadowing variables (and the consequent
+	  compiler warnings).
+
+2005-12-28 Wednesday 17:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.168): Added an item regarding the implementation of the
+	  domain of BD shapes.
+
+2005-12-28 Wednesday 17:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LP_Problem.cc, LP_Problem.inlines.hh (simplex.[13,13]):
+	  Throwing the documented exceptions when appropriate.	Method OK()
+	  is no longer inlined and now performs some more accurate
+	  consistency check.
+
+2005-12-28 Wednesday 17:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (simplex.12): Added documentation about
+	  exceptions that should be thrown.
+
+2005-12-27 Tuesday 13:45  Andrea Cimino
+
+	* tests/Polyhedron/LP_Problem3.cc (simplex.3): Enabled by mistake
+	  NOISY macro: now disabled.
+
+2005-12-27 Tuesday 13:44  Andrea Cimino
+
+	* tests/Polyhedron/LP_Problem3.cc (simplex.2): Inserted another
+	  challenger: the problem is solved also adding `incrementally'
+	  constraints to a Constraint_System and applying the simplex
+	  algorithm.
+
+2005-12-25 Sunday 13:07  Andrea Cimino
+
+	* tests/Polyhedron/: LP_Problem1.cc, LP_Problem3.cc
+	  (simplex.[5,1]): Added another test to check LP_Problem's
+	  incrementality.  Avoid useless inclusions.
+
+2005-12-24 Saturday 12:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.109), Checked_Number.defs.hh (1.43):
+	  Two FIXME replaced by corresponding TODO.  Minor variable name
+	  improvements in generalized_affine_preimage.	Splitted too long
+	  lines in Checked_Number.defs.hh.
+
+2005-12-24 Saturday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.54): Indentation fixed.
+
+2005-12-24 Saturday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.164): A couple of items dealt with.
+
+2005-12-24 Saturday 12:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.167), STANDARDS (1.28): A couple of minor improvements.
+
+2005-12-24 Saturday 12:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/ppl_prolog.icc, src/BD_Shape.inlines.hh,
+	  src/Constraint_System.defs.hh, src/LP_Problem.cc,
+	  src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh,
+	  src/LP_Problem.types.hh, src/Polyhedron_nonpublic.cc,
+	  src/globals.types.hh, src/simplex.cc,
+	  tests/Polyhedron/LP_Problem1.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/primalsimplex1.cc,
+	  tests/Polyhedron/primalsimplex2.cc
+	  (simplex.[3,3,3,2,2,2,3,12,11,12,2,1,2,2,4,2,1,1]): The
+	  enumeration Simplex_Status renamed as LP_Problem_Status.  Its
+	  definition moved into LP_Problem.types.hh.
+
+2005-12-23 Friday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.127): Update the constraint system
+	  adding methods to leave the check on the existence of rows in the
+	  temporary congruence system to the method that will add that
+	  congruence system.
+
+2005-12-23 Friday 16:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.inlines.hh
+	  (grids.[38,12]): Ensure that all constructors create at least two
+	  columns.
+
+2005-12-23 Friday 15:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.126): Enable the all-zero parameter OK
+	  check.
+
+2005-12-23 Friday 15:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.defs.hh (grids.17): Add the all-zero
+	  parameter behaviour to the insert(g) description.
+
+2005-12-23 Friday 15:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.25): Adding setting of the
+	  first pending row index to the recycling_insert methods.
+
+2005-12-23 Friday 14:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/isuniverse1.cc (grids.9): Add three tests where the
+	  grid is defined by a minimized congruence system.
+
+2005-12-23 Friday 14:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.125): Leave the is_universe assumption
+	  that the minimized universe congruence system always contains
+	  exactly the integrality congruence.
+
+2005-12-23 Friday 14:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.29): Add a query about using the
+	  congruence system in remove_space_dimensions.
+
+2005-12-23 Friday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.166): Our tentative release date for PPL 0.8 is January
+	  20, 2006.
+
+2005-12-23 Friday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.163): Two items moved from PPL 0.8 to PPL 0.9.  Added one
+	  more item to PPL 0.9.
+
+2005-12-23 Friday 10:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: generalizedaffinepreimage1.cc (1.3),
+	  generalizedaffinepreimage2.cc (1.2): Avoid using useless explicit
+	  constructors for Linear_Expression.  Maximum allowed distances
+	  updated to reflect the approximations incurred by integer
+	  coefficient types.
+
+2005-12-23 Friday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.108): Minor improvements in the
+	  comments of generalized_affine_preimage.
+
+2005-12-23 Friday 09:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (simplex.1): Added the
+	  list of predicates related to the new PPL object LP_Problem.
+
+2005-12-22 Thursday 20:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh, ppl_prolog.icc,
+	  SWI/ppl_swiprolog.cc, tests/pl_check.pl (simplex.[1,1,1,1]):
+	  Drafted the (SWI) Prolog interface for class LP_Problem.
+
+2005-12-22 Thursday 20:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/relations2.cc (grids.7): Add test10 to test13, which
+	  test grids with divisors that are greater than one.
+
+2005-12-22 Thursday 20:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.124): Account for the divisor in the
+	  parameter case of relation_with(g) by modulating the scalar
+	  product by the product of the parameter divisor and the modulus,
+	  instead of by just the modulus.
+
+2005-12-22 Thursday 17:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc, ppl_c.h.in (simplex.[2,2]): Added the
+	  encoding of domain_error.  The changes in the LP_Problem
+	  interface reflected here.
+
+2005-12-22 Thursday 17:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[11,10,11]): Methods is_satisfiable(), solve(),
+	  feasible_point() and optimizing_point() are now declared const.
+	  A few stylistic and doxygen comments improvements.
+
+2005-12-22 Thursday 17:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.123): Update OK to check that the
+	  con_sys and grid space dimensions match when con_sys is empty.
+
+	  Update add_recycled_generators_and_minimize to insert the
+	  generators with Grid_Generator_System::recycling_insert.
+
+	  Replace the add_recycled_generators call in
+	  generalized_affine_image(l,r,m) with equivalent, quicker code.
+
+2005-12-22 Thursday 17:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+	  (grids.[24,16]): Add recycling_insert(g).
+
+2005-12-22 Thursday 17:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.cc, Grid_Generator.inlines.hh
+	  (grids.[13,15]): Implement operator<< directly, adding divisor
+	  output for parameters.
+
+2005-12-22 Thursday 17:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Matrix.defs.hh (grids.6): Correct typo in add_recycled_row
+	  description.
+
+2005-12-22 Thursday 13:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.23): Improve the insert query
+	  about wrapping an NNC generator.
+
+2005-12-22 Thursday 13:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.22): Leave the tmp_row
+	  allocation in insert alone (tmp_row is a stack variable so the
+	  Linear_Row destructor will be called and it will free the memory
+	  in tmp_row).
+
+2005-12-21 Wednesday 19:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.122): Add divisor normalization after
+	  the parameter insertion in generalized_affine_image.
+
+	  Update add_generator(g) to make one normalize_divisor call when
+	  the grid originally contained points.
+
+2005-12-21 Wednesday 19:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.65): Include parameters in the
+	  normalize_divisors(sys,d,f) LCM calculation.
+
+2005-12-21 Wednesday 19:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.28): Add divisor normalization after
+	  inserting parameters in add_space_dimensions and
+	  add_space_dimensions_and_project.
+
+2005-12-21 Wednesday 19:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.cc (grids.12): Update scale_to_divisor to
+	  leave the divisor column out of the scaling.
+
+2005-12-21 Wednesday 19:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.21): Update affine_image to
+	  use Grid_Generator and Grid_Generator_System instead of Generator
+	  and Generator_System.
+
+2005-12-21 Wednesday 19:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/ppl_test.hh (grids.16): Make parens in find_variation
+	  messages consistent.
+
+2005-12-21 Wednesday 17:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.20): Update method insert to
+	  leave alone the divisors of inserted parameters (Grid will
+	  normalize the divisors).
+
+2005-12-21 Wednesday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/mapspacedims1.cc (grids.13): Revert to the actual
+	  known grid in test3.
+
+2005-12-21 Wednesday 17:02  Elena Mazzi
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (1.2): Try to use
+	  the distance computation so as to detect when a computed result
+	  is ok even if different from the known result.
+
+2005-12-21 Wednesday 16:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.50): Update map_space_dimensions to
+	  call grid_line in place of line.
+
+2005-12-21 Wednesday 16:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator_System.defs.hh,
+	  Grid_Generator_System.inlines.hh (grids.[15,9]): Take out
+	  insert(g).
+
+2005-12-21 Wednesday 16:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh,
+	  Grid_Generator.inlines.hh (grids.[11,18,14]): Add
+	  throw_invalid_argument.  Update the divisor methods to throw
+	  std::invalid_argument if the generator is a line.
+
+2005-12-21 Wednesday 16:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[91,64]): Take out
+	  the throw_topology_incompatible methods.
+
+2005-12-21 Wednesday 15:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[10,17]):
+	  Update scale_to_divisor to throw std::invalid_argument if the
+	  given divisor is zero.
+
+2005-12-21 Wednesday 14:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.121): Update Grid(n,k) to trust the
+	  divisor value of the trivially true point created by grid_point.
+
+2005-12-21 Wednesday 14:30  Elena Mazzi
+
+	* src/BD_Shape.defs.hh (1.53), src/BD_Shape.inlines.hh (1.107),
+	  tests/BD_Shape/Makefile.am (1.29),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.1),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.1): Defined a new
+	  method: BD_Shape::generalized_affine_preimage(var, relsym, expr,
+	  den).  Added some tests about this method.
+
+2005-12-21 Wednesday 14:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.32): Correct a comment in the
+	  congruence to generator conversion.
+
+2005-12-21 Wednesday 14:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.19): Keep the
+	  add_universe_rows_and_columns num_columns assertion.
+
+2005-12-21 Wednesday 14:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_Generator.cc, Grid_Generator.defs.hh,
+	  Grid_nonpublic.cc (grids.[90,9,16,63]): Update
+	  Grid::normalize_divisors(sys,d,f) to simply return zero when the
+	  given divisor is zero.  The previous special behaviour in the
+	  zero case be accomplished by passing a divisor of one.
+
+	  Rename Grid_Generator::multiply to
+	  Grid_Generator::scale_to_divisor.  Correct the description of
+	  this method.
+
+	  Leave the factor normalization in
+	  Grid_Generator::is_equivalent_to as the only normalization, as
+	  sign normalization would only be required if divisors could be
+	  negative.
+
+2005-12-21 Wednesday 14:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/generator1.cc (grids.4): Enable test5 (comparison of
+	  parameters that have divisors > 1).
+
+2005-12-20 Tuesday 21:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/relations1.cc (grids.6): Use parameter divisors in
+	  test6 and test7.
+
+2005-12-20 Tuesday 21:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/mapspacedims1.cc (grids.12): Temporarily match the
+	  expected result in test3 to the actual result.
+
+2005-12-20 Tuesday 21:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/join1.cc (grids.12): Correct the expected result in
+	  test4.
+
+2005-12-20 Tuesday 21:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/isuniverse1.cc (grids.8): Correct the fail case in
+	  test10.
+
+2005-12-20 Tuesday 21:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruencesystem2.cc (grids.11): Use parameter
+	  divisors.
+
+2005-12-20 Tuesday 21:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.27): Take some old code out of
+	  add_space_dimensions_and_embed.
+
+2005-12-20 Tuesday 21:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Grid.inlines.hh,
+	  Grid_Generator_System.defs.hh, Grid_Generator_System.inlines.hh,
+	  Grid_nonpublic.cc, Grid_public.cc, Grid_simplify.cc
+	  (grids.[37,49,14,8,62,120,43]): [rest of previous commit]
+
+	  Add parameter divisors, encoding the divisors in an extra
+	  trailing Grid_Generator column:
+
+	   - implement the Grid_Generator methods point, line,
+	  is_equivalent_to
+	     and all_homogeneous_terms_are_zero directly, instead of
+	  wrapping
+	     the Generator equivalents
+
+	   - move Grid_Generator::strong_normalize to the private section
+
+	   - update Grid_Generator_System to swap the divisor column any
+	  time
+	     the system size changes
+
+	   - update methods Congruence_System::satisfies_all_congruences
+	  and
+	     Grid::relation_with(g) to use the given generator's divisor
+	  instead
+	     of a divisor passed in an extra argument
+
+	   - update the generator reduction and congruence to generator
+	     conversion to ensure that the parameter divisors match the
+	  divisor
+	     of the first point after the reduction or conversion
+
+	   - adapt Grid and Scalar_Product to the extra generator column
+	  (mostly
+	     changes to loop indexing)
+
+	   - add a Grid_Generator friend declaration to Linear_Expression.
+
+	  Take out Grid_Generator_System(const Generator&).
+
+2005-12-20 Tuesday 21:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.defs.hh, Grid.defs.hh, Grid_Generator.cc,
+	  Grid_Generator.defs.hh, Grid_Generator.inlines.hh,
+	  Grid_Generator_System.cc, Grid_conversion.cc,
+	  Linear_Expression.defs.hh, Scalar_Products.cc
+	  (grids.[22,89,8,15,13,18,31,10,5]): Add parameter divisors,
+	  encoding the divisors in an extra trailing Grid_Generator column:
+
+	   - implement the Grid_Generator methods point, line,
+	  is_equivalent_to
+	     and all_homogeneous_terms_are_zero directly, instead of
+	  wrapping
+	     the Generator equivalents
+
+	   - move Grid_Generator::strong_normalize to the private section
+
+	   - update Grid_Generator_System to swap the divisor column any
+	  time
+	     the system size changes
+
+	   - update methods Congruence_System::satisfies_all_congruences
+	  and
+	     Grid::relation_with(g) to use the given generator's divisor
+	  instead
+	     of a divisor passed in an extra argument
+
+	   - update the generator reduction and congruence to generator
+	     conversion to ensure that the parameter divisors match the
+	  divisor
+	     of the first point after the reduction or conversion
+
+	   - adapt Grid and Scalar_Product to the extra generator column
+	  (mostly
+	     changes to loop indexing)
+
+	   - add a Grid_Generator friend declaration to Linear_Expression.
+
+	  Take out Grid_Generator_System(const Generator&).
+
+2005-12-20 Tuesday 11:42  Andrea Cimino
+
+	* src/LP_Problem.defs.hh (simplex.9): Synchronized Doxygen stuff to
+	  reflect last changes to LP_Problem interface.
+
+2005-12-20 Tuesday 08:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Random_Number_Generator.inlines.hh (1.5): Avoid anonymous
+	  namespaces in files that are going to be included.
+
+2005-12-20 Tuesday 08:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BDS_Status.inlines.hh (1.8), BD_Shape.inlines.hh (1.106),
+	  Native_Integer.inlines.hh (1.17), Polyhedra_Powerset.inlines.hh
+	  (1.34), namespaces.hh (1.3): Avoid the use of anonymous
+	  namespaces in files that are going to be included.
+
+2005-12-19 Monday 20:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, copyconstruct1.cc (grids.[54,1]): Add
+	  copyconstruct1, to test Grid copy construction.
+
+2005-12-19 Monday 20:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.119): Update the copy constructor to
+	  always copy the systems when the space dimension is zero.
+
+2005-12-19 Monday 07:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.34), config.sub (1.32), install-sh (1.16),
+	  ltmain.sh (1.27), Watchdog/config.guess (1.18),
+	  Watchdog/config.sub (1.17), Watchdog/install-sh (1.13),
+	  Watchdog/ltmain.sh (1.16): Updated from Libtool 1.5.22.
+
+2005-12-18 Sunday 18:21  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.10): Improved swap_base(): now
+	  directly handles `base'.
+
+2005-12-18 Sunday 16:56  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[9,8,10]): second_phase() declared void.  Many inline
+	  methods simplified: `status' cases during the real simplex
+	  computations are now handled only by is_satisfiable() and
+	  second_phase().
+
+2005-12-17 Saturday 01:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.61): Enable the system equality
+	  checks in quick_equivalence_test.
+
+2005-12-17 Saturday 01:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.inlines.hh (grids.19): Negate the coefficient used
+	  to create the zero_dim_integrality congruence (so that the
+	  resulting constant term is positive).
+
+2005-12-17 Saturday 01:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator_System.defs.hh,
+	  Grid_Generator_System.inlines.hh (grids.[13,7]): Add
+	  Grid_Generator_System::is_equal_to(ggs) and operator==(ggs,ggs).
+
+2005-12-16 Friday 23:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.48): Add note for map_space_dimensions
+	  code awaiting parameter divisors.
+
+2005-12-16 Friday 23:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.118): Improve relation descriptions in
+	  relation_with(cg).
+
+2005-12-16 Friday 23:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_nonpublic.cc, Grid_simplify.cc (grids.[60,42]): Move
+	  update_generators system column assertion into congruence
+	  simplify.
+
+2005-12-16 Friday 21:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.36): Add Constraint_System
+	  includes.
+
+2005-12-16 Friday 11:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.27): Avoid anonymous namespaces in header files.
+
+2005-12-15 Thursday 14:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.117): Update add_generator(g) to insert
+	  the given generator, instead of inserting a copy, when the grid
+	  contains points.
+
+2005-12-15 Thursday 14:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.116): Confirm that creation of the
+	  universe systems in Grid(n,k) works.	Slightly improve spacing
+	  and a few comments in Grid(n,k).
+
+2005-12-15 Thursday 14:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.defs.hh (grids.14): Move Grid_Generator(g) to
+	  the private section.
+
+2005-12-15 Thursday 14:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.cc (grids.7): Improve the note about
+	  converting the Generator in function `parameter' to a
+	  Grid_Generator.
+
+2005-12-15 Thursday 01:20  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.inlines.hh (simplex.[8,9]): Minor
+	  stylistic and performance improvements.
+
+2005-12-14 Wednesday 22:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked_mpz.inlines.hh (grids.6): Update the mpz_gcd call in
+	  gcdext_mpz to mpz_gcdext.
+
+2005-12-14 Wednesday 21:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.162): New to-do item.
+
+2005-12-14 Wednesday 21:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.59): Update set_zero_dim_univ to
+	  leave the con_sys size adjustment to Congruence_System::clear.
+
+2005-12-14 Wednesday 20:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+	  (grids.[17,12]): Update remove_higher_space_dimensions with a
+	  dimension compatibility check, to return immediately if the
+	  dimension will remain the same, and to clear the system if the
+	  new dimension is 0.
+
+2005-12-14 Wednesday 19:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+	  (grids.[16,11]): Update remove_space_dimensions to check the
+	  space dim of the given set and to exit immediately if the set is
+	  empty.
+
+2005-12-14 Wednesday 18:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+	  (grids.[15,10]): Update recycling_insert to increase the system
+	  space dimension if that of the system being inserted is bigger.
+
+2005-12-14 Wednesday 17:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.14): Leave it up to the
+	  add_universe_rows_and_columns to ensure that the system will
+	  contain a point.
+
+2005-12-14 Wednesday 17:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.47): Revert map_space_dimensions to
+	  insert parameters via function point for now (as the given
+	  expression already uses the system divisor).
+
+2005-12-14 Wednesday 16:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/generalizedaffineimage1.cc (grids.6): Correct expected
+	  values in test2, test4, test5 and test6 (now that parameter
+	  divisors are adjusted at insertion).
+
+2005-12-14 Wednesday 16:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.13): Update method insert to
+	  represent inserted parameters with the divisor of the first
+	  point.
+
+2005-12-14 Wednesday 15:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.26): Added a section about test programs.
+
+2005-12-14 Wednesday 12:44  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[7,7]): Better
+	  handled namespaces.  `PPL::LP_Problem::primal_simplex()' removed,
+	  was unused.  Fixed return types in
+	  `PPL::LP_Problem::is_feasible()'.
+
+2005-12-14 Wednesday 12:10  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[6,6,8]): Internal enum `Status' fields renamed from
+	  PROBLEM_* to *.  Added a FIXME.
+
+2005-12-14 Wednesday 11:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/addconstraints1.cc (1.5),
+	  BD_Shape/addspacedims1.cc (1.6), BD_Shape/addspacedims2.cc (1.6),
+	  BD_Shape/addspacedims3.cc (1.7), BD_Shape/addspacedims4.cc (1.7),
+	  BD_Shape/addspacedims5.cc (1.8), BD_Shape/addspacedims6.cc (1.8),
+	  BD_Shape/addspacedims7.cc (1.6), BD_Shape/affinedimension1.cc
+	  (1.2), BD_Shape/affineimage1.cc (1.6), BD_Shape/affineimage10.cc
+	  (1.4), BD_Shape/affineimage2.cc (1.6), BD_Shape/affineimage3.cc
+	  (1.6), BD_Shape/affineimage4.cc (1.6), BD_Shape/affineimage5.cc
+	  (1.6), BD_Shape/affineimage6.cc (1.6), BD_Shape/affineimage7.cc
+	  (1.6), BD_Shape/affineimage8.cc (1.11), BD_Shape/affineimage9.cc
+	  (1.9), BD_Shape/affinepreimage1.cc (1.6),
+	  BD_Shape/affinepreimage2.cc (1.6), BD_Shape/affinepreimage3.cc
+	  (1.6), BD_Shape/affinepreimage4.cc (1.6),
+	  BD_Shape/affinepreimage5.cc (1.6), BD_Shape/ascii_dump_load1.cc
+	  (1.8), BD_Shape/ascii_dump_load2.cc (1.7),
+	  BD_Shape/bdsdifference1.cc (1.2), BD_Shape/bdsdifference2.cc
+	  (1.2), BD_Shape/bdsdifference3.cc (1.2),
+	  BD_Shape/bdsdifference4.cc (1.2), BD_Shape/bdsdifference5.cc
+	  (1.2), BD_Shape/bdsdifference6.cc (1.2),
+	  BD_Shape/bdsdifference7.cc (1.2), BD_Shape/bdshull1.cc (1.2),
+	  BD_Shape/bdshull2.cc (1.2), BD_Shape/bdshull3.cc (1.2),
+	  BD_Shape/bdshull4.cc (1.2), BD_Shape/bgp99extrapolation1.cc
+	  (1.2), BD_Shape/bhz03widening1.cc (1.2),
+	  BD_Shape/cc76extrapolation1.cc (1.5),
+	  BD_Shape/cc76extrapolation2.cc (1.6),
+	  BD_Shape/cc76extrapolation3.cc (1.5),
+	  BD_Shape/cc76extrapolation4.cc (1.7),
+	  BD_Shape/cc76extrapolation5.cc (1.5),
+	  BD_Shape/cc76extrapolation6.cc (1.7), BD_Shape/cc76narrowing1.cc
+	  (1.5), BD_Shape/cc76narrowing2.cc (1.5),
+	  BD_Shape/cc76narrowing3.cc (1.5), BD_Shape/cc76narrowing4.cc
+	  (1.6), BD_Shape/cc76narrowing5.cc (1.6),
+	  BD_Shape/ch78widening1.cc (1.5), BD_Shape/ch78widening2.cc (1.6),
+	  BD_Shape/ch78widening3.cc (1.5), BD_Shape/ch78widening4.cc (1.6),
+	  BD_Shape/ch78widening5.cc (1.6), BD_Shape/ch78widening6.cc (1.8),
+	  BD_Shape/ch78widening7.cc (1.5), BD_Shape/ch78widening8.cc (1.6),
+	  BD_Shape/closure1.cc (1.9), BD_Shape/concatenate1.cc (1.6),
+	  BD_Shape/concatenate2.cc (1.6), BD_Shape/concatenate3.cc (1.5),
+	  BD_Shape/concatenate4.cc (1.5), BD_Shape/concatenate5.cc (1.6),
+	  BD_Shape/constraints1.cc (1.8), BD_Shape/constraints2.cc (1.6),
+	  BD_Shape/contains1.cc (1.5), BD_Shape/contains2.cc (1.7),
+	  BD_Shape/contains3.cc (1.7), BD_Shape/empty1.cc (1.5),
+	  BD_Shape/empty2.cc (1.5), BD_Shape/empty3.cc (1.6),
+	  BD_Shape/empty4.cc (1.5), BD_Shape/empty5.cc (1.5),
+	  BD_Shape/equality1.cc (1.8), BD_Shape/exceptions1.cc (1.9),
+	  BD_Shape/exceptions2.cc (1.7), BD_Shape/exceptions3.cc (1.9),
+	  BD_Shape/fromgensys1.cc (1.5),
+	  BD_Shape/generalizedaffineimage1.cc (1.7),
+	  BD_Shape/generalizedaffineimage10.cc (1.6),
+	  BD_Shape/generalizedaffineimage11.cc (1.5),
+	  BD_Shape/generalizedaffineimage12.cc (1.5),
+	  BD_Shape/generalizedaffineimage13.cc (1.5),
+	  BD_Shape/generalizedaffineimage14.cc (1.9),
+	  BD_Shape/generalizedaffineimage2.cc (1.6),
+	  BD_Shape/generalizedaffineimage3.cc (1.7),
+	  BD_Shape/generalizedaffineimage4.cc (1.6),
+	  BD_Shape/generalizedaffineimage5.cc (1.6),
+	  BD_Shape/generalizedaffineimage6.cc (1.5),
+	  BD_Shape/generalizedaffineimage7.cc (1.6),
+	  BD_Shape/generalizedaffineimage8.cc (1.6),
+	  BD_Shape/generalizedaffineimage9.cc (1.5),
+	  BD_Shape/geomcovers1.cc (1.2), BD_Shape/h79widening1.cc (1.5),
+	  BD_Shape/intersection1.cc (1.5), BD_Shape/intersection2.cc (1.5),
+	  BD_Shape/intersection3.cc (1.6), BD_Shape/intersection4.cc (1.7),
+	  BD_Shape/intersection5.cc (1.7), BD_Shape/intersection6.cc (1.6),
+	  BD_Shape/intersection7.cc (1.6), BD_Shape/intersection8.cc (1.6),
+	  BD_Shape/limitedCC76extrapolation1.cc (1.5),
+	  BD_Shape/limitedCC76extrapolation2.cc (1.7),
+	  BD_Shape/limitedCC76extrapolation3.cc (1.7),
+	  BD_Shape/limitedCH78extrapolation1.cc (1.6),
+	  BD_Shape/limitedCH78extrapolation2.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation3.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation4.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation5.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation6.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation7.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation8.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation9.cc (1.5),
+	  BD_Shape/limitedh79extrapolation1.cc (1.5),
+	  BD_Shape/mapspacedims1.cc (1.5), BD_Shape/mapspacedims2.cc (1.7),
+	  BD_Shape/mapspacedims3.cc (1.6), BD_Shape/mapspacedims4.cc (1.6),
+	  BD_Shape/maxspacedim.cc (1.8), BD_Shape/minconstraints1.cc (1.2),
+	  BD_Shape/relations1.cc (1.9), BD_Shape/relations2.cc (1.9),
+	  BD_Shape/relations3.cc (1.8), BD_Shape/relations4.cc (1.7),
+	  BD_Shape/relations5.cc (1.9), BD_Shape/removespacedims1.cc (1.6),
+	  BD_Shape/removespacedims2.cc (1.7), BD_Shape/removespacedims3.cc
+	  (1.7), BD_Shape/timeelapse1.cc (1.6), BD_Shape/timeelapse2.cc
+	  (1.5), BD_Shape/timeelapse3.cc (1.5), BD_Shape/timeelapse4.cc
+	  (1.5), BD_Shape/timeelapse5.cc (1.6), BD_Shape/universe1.cc
+	  (1.6), BD_Shape/writebdshape1.cc (1.3), BD_Shape/writebdshape2.cc
+	  (1.4), Polyhedron/CbecomesNNC1.cc (1.5),
+	  Polyhedron/NNCbecomesC1.cc (1.5), Polyhedron/NNCminimize1.cc
+	  (1.5), Polyhedron/NNCminimize2.cc (1.5),
+	  Polyhedron/NNCminimize3.cc (1.5), Polyhedron/NNCminimize4.cc
+	  (1.5), Polyhedron/NNCminimize5.cc (1.5),
+	  Polyhedron/NNCminimize6.cc (1.5), Polyhedron/addconstraint1.cc
+	  (1.5), Polyhedron/addconstraint2.cc (1.6),
+	  Polyhedron/addconstraint3.cc (1.5), Polyhedron/addconstraints1.cc
+	  (1.6), Polyhedron/addconstraints10.cc (1.6),
+	  Polyhedron/addconstraints11.cc (1.5),
+	  Polyhedron/addconstraints12.cc (1.5),
+	  Polyhedron/addconstraints13.cc (1.6),
+	  Polyhedron/addconstraints2.cc (1.5),
+	  Polyhedron/addconstraints3.cc (1.6),
+	  Polyhedron/addconstraints4.cc (1.5),
+	  Polyhedron/addconstraints5.cc (1.6),
+	  Polyhedron/addconstraints6.cc (1.5),
+	  Polyhedron/addconstraints7.cc (1.6),
+	  Polyhedron/addconstraints8.cc (1.6),
+	  Polyhedron/addconstraints9.cc (1.5), Polyhedron/addgenerator1.cc
+	  (1.6), Polyhedron/addgenerator2.cc (1.6),
+	  Polyhedron/addgenerator3.cc (1.5), Polyhedron/addgenerator4.cc
+	  (1.6), Polyhedron/addgenerator5.cc (1.6),
+	  Polyhedron/addgenerators1.cc (1.6), Polyhedron/addgenerators10.cc
+	  (1.6), Polyhedron/addgenerators11.cc (1.6),
+	  Polyhedron/addgenerators12.cc (1.6),
+	  Polyhedron/addgenerators13.cc (1.6), Polyhedron/addgenerators2.cc
+	  (1.6), Polyhedron/addgenerators3.cc (1.5),
+	  Polyhedron/addgenerators4.cc (1.5), Polyhedron/addgenerators5.cc
+	  (1.5), Polyhedron/addgenerators6.cc (1.6),
+	  Polyhedron/addgenerators7.cc (1.5), Polyhedron/addgenerators8.cc
+	  (1.6), Polyhedron/addgenerators9.cc (1.5),
+	  Polyhedron/addspacedims1.cc (1.6), Polyhedron/addspacedims10.cc
+	  (1.5), Polyhedron/addspacedims11.cc (1.5),
+	  Polyhedron/addspacedims12.cc (1.5), Polyhedron/addspacedims13.cc
+	  (1.5), Polyhedron/addspacedims2.cc (1.6),
+	  Polyhedron/addspacedims3.cc (1.7), Polyhedron/addspacedims4.cc
+	  (1.5), Polyhedron/addspacedims5.cc (1.5),
+	  Polyhedron/addspacedims6.cc (1.5), Polyhedron/addspacedims7.cc
+	  (1.5), Polyhedron/addspacedims8.cc (1.6),
+	  Polyhedron/addspacedims9.cc (1.5), Polyhedron/affineimage1.cc
+	  (1.6), Polyhedron/affineimage2.cc (1.5),
+	  Polyhedron/affineimage3.cc (1.5), Polyhedron/affineimage4.cc
+	  (1.6), Polyhedron/affineimage5.cc (1.6),
+	  Polyhedron/affineimage6.cc (1.7), Polyhedron/affineimage7.cc
+	  (1.5), Polyhedron/affineimage8.cc (1.5),
+	  Polyhedron/affineimage9.cc (1.5), Polyhedron/affinepreimage1.cc
+	  (1.5), Polyhedron/affinepreimage10.cc (1.5),
+	  Polyhedron/affinepreimage11.cc (1.3),
+	  Polyhedron/affinepreimage2.cc (1.5),
+	  Polyhedron/affinepreimage3.cc (1.6),
+	  Polyhedron/affinepreimage4.cc (1.5),
+	  Polyhedron/affinepreimage5.cc (1.5),
+	  Polyhedron/affinepreimage6.cc (1.5),
+	  Polyhedron/affinepreimage7.cc (1.5),
+	  Polyhedron/affinepreimage8.cc (1.6),
+	  Polyhedron/affinepreimage9.cc (1.5), Polyhedron/affinetrans.cc
+	  (1.6), Polyhedron/append1.cc (1.5), Polyhedron/append2.cc (1.5),
+	  Polyhedron/ascii_dump_load1.cc (1.5),
+	  Polyhedron/ascii_dump_load2.cc (1.5),
+	  Polyhedron/ascii_dump_load3.cc (1.5),
+	  Polyhedron/ascii_dump_load4.cc (1.5),
+	  Polyhedron/ascii_dump_load5.cc (1.5),
+	  Polyhedron/ascii_dump_load6.cc (1.6),
+	  Polyhedron/ascii_dump_load7.cc (1.5),
+	  Polyhedron/bgp99extrapolation1.cc (1.6),
+	  Polyhedron/bgp99extrapolation2.cc (1.6),
+	  Polyhedron/bhrz03widening1.cc (1.5),
+	  Polyhedron/bhrz03widening10.cc (1.6),
+	  Polyhedron/bhrz03widening11.cc (1.5),
+	  Polyhedron/bhrz03widening12.cc (1.5),
+	  Polyhedron/bhrz03widening13.cc (1.5),
+	  Polyhedron/bhrz03widening14.cc (1.5),
+	  Polyhedron/bhrz03widening15.cc (1.6),
+	  Polyhedron/bhrz03widening16.cc (1.5),
+	  Polyhedron/bhrz03widening17.cc (1.5),
+	  Polyhedron/bhrz03widening18.cc (1.5),
+	  Polyhedron/bhrz03widening19.cc (1.5),
+	  Polyhedron/bhrz03widening2.cc (1.5),
+	  Polyhedron/bhrz03widening3.cc (1.5),
+	  Polyhedron/bhrz03widening4.cc (1.5),
+	  Polyhedron/bhrz03widening5.cc (1.5),
+	  Polyhedron/bhrz03widening6.cc (1.5),
+	  Polyhedron/bhrz03widening7.cc (1.5),
+	  Polyhedron/bhrz03widening8.cc (1.5),
+	  Polyhedron/bhrz03widening9.cc (1.5), Polyhedron/bhz03widening1.cc
+	  (1.7), Polyhedron/bhz03widening2.cc (1.7),
+	  Polyhedron/bhz03widening3.cc (1.7), Polyhedron/bhz03widening4.cc
+	  (1.6), Polyhedron/bhz03widening5.cc (1.6),
+	  Polyhedron/bhz03widening6.cc (1.7), Polyhedron/bounded1.cc (1.6),
+	  Polyhedron/boundedaffineimage1.cc (1.4),
+	  Polyhedron/boundedaffineimage2.cc (1.3),
+	  Polyhedron/boundedaffineimage3.cc (1.3),
+	  Polyhedron/boundedaffinepreimage1.cc (1.3),
+	  Polyhedron/boundedaffinepreimage2.cc (1.3),
+	  Polyhedron/boundedaffinepreimage3.cc (1.3),
+	  Polyhedron/boundedbhrz03extrapolation1.cc (1.4),
+	  Polyhedron/boundedh79extrapolation1.cc (1.6),
+	  Polyhedron/boundingbox1.cc (1.7), Polyhedron/boundingbox2.cc
+	  (1.6), Polyhedron/boundingbox3.cc (1.6),
+	  Polyhedron/boundingbox4.cc (1.6), Polyhedron/boundingbox5.cc
+	  (1.6), Polyhedron/bounds1.cc (1.6), Polyhedron/bounds2.cc (1.5),
+	  Polyhedron/bug2.cc (1.4), Polyhedron/concatenate1.cc (1.5),
+	  Polyhedron/concatenate2.cc (1.6), Polyhedron/concatenate3.cc
+	  (1.5), Polyhedron/concatenate4.cc (1.5),
+	  Polyhedron/concatenate5.cc (1.5), Polyhedron/concatenate6.cc
+	  (1.6), Polyhedron/concatenate7.cc (1.4),
+	  Polyhedron/constraints1.cc (1.5), Polyhedron/constraints2.cc
+	  (1.6), Polyhedron/constraints3.cc (1.5),
+	  Polyhedron/constraints4.cc (1.6), Polyhedron/constraints5.cc
+	  (1.4), Polyhedron/contains1.cc (1.5), Polyhedron/contains2.cc
+	  (1.5), Polyhedron/contains3.cc (1.5), Polyhedron/contains4.cc
+	  (1.5), Polyhedron/contains5.cc (1.5), Polyhedron/disjoint1.cc
+	  (1.5), Polyhedron/disjoint2.cc (1.6), Polyhedron/disjoint3.cc
+	  (1.6), Polyhedron/dualhypercubes.cc (1.5), Polyhedron/empty1.cc
+	  (1.6), Polyhedron/equals1.cc (1.5), Polyhedron/exceptions1.cc
+	  (1.8), Polyhedron/exceptions2.cc (1.6), Polyhedron/exceptions3.cc
+	  (1.7), Polyhedron/expandspacedim1.cc (1.6),
+	  Polyhedron/expandspacedim2.cc (1.6), Polyhedron/foldspacedims1.cc
+	  (1.6), Polyhedron/foldspacedims2.cc (1.6),
+	  Polyhedron/generalizedaffineimage1.cc (1.6),
+	  Polyhedron/generalizedaffineimage10.cc (1.5),
+	  Polyhedron/generalizedaffineimage11.cc (1.6),
+	  Polyhedron/generalizedaffineimage12.cc (1.5),
+	  Polyhedron/generalizedaffineimage13.cc (1.4),
+	  Polyhedron/generalizedaffineimage14.cc (1.4),
+	  Polyhedron/generalizedaffineimage2.cc (1.6),
+	  Polyhedron/generalizedaffineimage3.cc (1.6),
+	  Polyhedron/generalizedaffineimage4.cc (1.6),
+	  Polyhedron/generalizedaffineimage5.cc (1.5),
+	  Polyhedron/generalizedaffineimage6.cc (1.6),
+	  Polyhedron/generalizedaffineimage7.cc (1.6),
+	  Polyhedron/generalizedaffineimage8.cc (1.5),
+	  Polyhedron/generalizedaffineimage9.cc (1.5),
+	  Polyhedron/generalizedaffinepreimage1.cc (1.3),
+	  Polyhedron/generalizedaffinepreimage2.cc (1.3),
+	  Polyhedron/generalizedaffinepreimage3.cc (1.3),
+	  Polyhedron/generalizedaffinepreimage4.cc (1.3),
+	  Polyhedron/generators1.cc (1.5), Polyhedron/generators2.cc (1.5),
+	  Polyhedron/generators3.cc (1.6), Polyhedron/generators4.cc (1.6),
+	  Polyhedron/generators5.cc (1.5), Polyhedron/generators6.cc (1.6),
+	  Polyhedron/generators7.cc (1.5), Polyhedron/geomcovers1.cc (1.7),
+	  Polyhedron/gramschmidt1.cc (1.2), Polyhedron/h79widening1.cc
+	  (1.5), Polyhedron/h79widening2.cc (1.5),
+	  Polyhedron/h79widening3.cc (1.5), Polyhedron/h79widening4.cc
+	  (1.5), Polyhedron/h79widening5.cc (1.6),
+	  Polyhedron/h79widening6.cc (1.5), Polyhedron/h79widening7.cc
+	  (1.5), Polyhedron/h79widening8.cc (1.5),
+	  Polyhedron/intersection1.cc (1.5), Polyhedron/intersection10.cc
+	  (1.6), Polyhedron/intersection11.cc (1.6),
+	  Polyhedron/intersection2.cc (1.5), Polyhedron/intersection3.cc
+	  (1.5), Polyhedron/intersection4.cc (1.6),
+	  Polyhedron/intersection5.cc (1.6), Polyhedron/intersection6.cc
+	  (1.6), Polyhedron/intersection7.cc (1.5),
+	  Polyhedron/intersection8.cc (1.6), Polyhedron/intersection9.cc
+	  (1.6), Polyhedron/limitedbhrz03extrapolation1.cc (1.5),
+	  Polyhedron/limitedh79extrapolation1.cc (1.5),
+	  Polyhedron/limitedh79extrapolation2.cc (1.5),
+	  Polyhedron/limitedh79extrapolation3.cc (1.5),
+	  Polyhedron/limitedh79extrapolation4.cc (1.6),
+	  Polyhedron/linearpartition1.cc (1.5),
+	  Polyhedron/linearpartition2.cc (1.5),
+	  Polyhedron/linearpartition3.cc (1.5),
+	  Polyhedron/linearpartition4.cc (1.6), Polyhedron/linearsystem1.cc
+	  (1.2), Polyhedron/linexpression1.cc (1.5),
+	  Polyhedron/mapspacedims1.cc (1.6), Polyhedron/mapspacedims2.cc
+	  (1.5), Polyhedron/mapspacedims3.cc (1.5),
+	  Polyhedron/mapspacedims4.cc (1.5), Polyhedron/matrix1.cc (1.5),
+	  Polyhedron/max_min1.cc (1.6), Polyhedron/max_min2.cc (1.6),
+	  Polyhedron/maxspacedim1.cc (1.5), Polyhedron/mc91.cc (1.6),
+	  Polyhedron/membytes1.cc (1.6), Polyhedron/membytes2.cc (1.5),
+	  Polyhedron/memory1.cc (1.7), Polyhedron/memory2.cc (1.10),
+	  Polyhedron/minconstraints1.cc (1.5),
+	  Polyhedron/minconstraints2.cc (1.6),
+	  Polyhedron/minconstraints3.cc (1.5),
+	  Polyhedron/minconstraints4.cc (1.5), Polyhedron/mingenerators1.cc
+	  (1.5), Polyhedron/mingenerators2.cc (1.6),
+	  Polyhedron/mingenerators3.cc (1.5), Polyhedron/numberinput1.cc
+	  (1.15), Polyhedron/onepoint.cc (1.6), Polyhedron/permute.cc
+	  (1.5), Polyhedron/polydifference1.cc (1.5),
+	  Polyhedron/polydifference2.cc (1.5),
+	  Polyhedron/polydifference3.cc (1.5),
+	  Polyhedron/polydifference4.cc (1.6),
+	  Polyhedron/polydifference5.cc (1.5),
+	  Polyhedron/polydifference6.cc (1.5),
+	  Polyhedron/polydifference7.cc (1.6),
+	  Polyhedron/polydifference8.cc (1.5),
+	  Polyhedron/polydifference9.cc (1.6), Polyhedron/polyhull1.cc
+	  (1.5), Polyhedron/polyhull10.cc (1.5), Polyhedron/polyhull11.cc
+	  (1.5), Polyhedron/polyhull2.cc (1.6), Polyhedron/polyhull3.cc
+	  (1.6), Polyhedron/polyhull4.cc (1.5), Polyhedron/polyhull5.cc
+	  (1.6), Polyhedron/polyhull6.cc (1.5), Polyhedron/polyhull7.cc
+	  (1.5), Polyhedron/polyhull8.cc (1.6), Polyhedron/polyhull9.cc
+	  (1.6), Polyhedron/polypowerset1.cc (1.7), Polyhedron/powerset1.cc
+	  (1.3), Polyhedron/primalsimplex1.cc (1.3),
+	  Polyhedron/primalsimplex2.cc (1.3), Polyhedron/randphull1.cc
+	  (1.6), Polyhedron/randphull2.cc (1.7), Polyhedron/relations1.cc
+	  (1.5), Polyhedron/relations10.cc (1.5), Polyhedron/relations11.cc
+	  (1.5), Polyhedron/relations12.cc (1.5), Polyhedron/relations13.cc
+	  (1.5), Polyhedron/relations14.cc (1.5), Polyhedron/relations15.cc
+	  (1.5), Polyhedron/relations16.cc (1.5), Polyhedron/relations17.cc
+	  (1.6), Polyhedron/relations18.cc (1.5), Polyhedron/relations19.cc
+	  (1.6), Polyhedron/relations2.cc (1.6), Polyhedron/relations3.cc
+	  (1.5), Polyhedron/relations4.cc (1.5), Polyhedron/relations5.cc
+	  (1.5), Polyhedron/relations6.cc (1.6), Polyhedron/relations7.cc
+	  (1.5), Polyhedron/relations8.cc (1.5), Polyhedron/relations9.cc
+	  (1.5), Polyhedron/removespacedims1.cc (1.5),
+	  Polyhedron/removespacedims10.cc (1.6),
+	  Polyhedron/removespacedims2.cc (1.5),
+	  Polyhedron/removespacedims3.cc (1.6),
+	  Polyhedron/removespacedims4.cc (1.5),
+	  Polyhedron/removespacedims5.cc (1.6),
+	  Polyhedron/removespacedims6.cc (1.5),
+	  Polyhedron/removespacedims7.cc (1.5),
+	  Polyhedron/removespacedims8.cc (1.5),
+	  Polyhedron/removespacedims9.cc (1.5), Polyhedron/smm1.cc (1.5),
+	  Polyhedron/timeelapse1.cc (1.5), Polyhedron/timeelapse2.cc (1.6),
+	  Polyhedron/timeelapse3.cc (1.5), Polyhedron/timeelapse4.cc (1.5),
+	  Polyhedron/timeelapse5.cc (1.6), Polyhedron/timeelapse6.cc (1.5),
+	  Polyhedron/timeelapse7.cc (1.6), Polyhedron/timeelapse8.cc (1.6),
+	  Polyhedron/timeelapse9.cc (1.6), Polyhedron/topclosed1.cc (1.6),
+	  Polyhedron/topclosed2.cc (1.6), Polyhedron/topclosed3.cc (1.5),
+	  Polyhedron/topclosure1.cc (1.5), Polyhedron/topclosure2.cc (1.6),
+	  Polyhedron/topclosure3.cc (1.5), Polyhedron/topclosure4.cc (1.6),
+	  Polyhedron/universe1.cc (1.5), Polyhedron/universe2.cc (1.5),
+	  Polyhedron/universe3.cc (1.5), Polyhedron/universe4.cc (1.5),
+	  Polyhedron/universe5.cc (1.5), Polyhedron/universe6.cc (1.5),
+	  Polyhedron/universe7.cc (1.5), Polyhedron/watchdog1.cc (1.6),
+	  Polyhedron/writeconsys1.cc (1.5), Polyhedron/writegensys1.cc
+	  (1.5), Polyhedron/writegensys2.cc (1.6),
+	  Polyhedron/writegensys3.cc (1.5), Polyhedron/writepolyhedron1.cc
+	  (1.5), Polyhedron/writepolyhedron2.cc (1.5),
+	  Polyhedron/writepolyhedron3.cc (1.5),
+	  Polyhedron/writerelation1.cc (1.5), Polyhedron/writevariable1.cc
+	  (1.5): All the test programs in Polyhedron and BD_Shape rewritten
+	  so as to direct their output to nout and vnout without explicitly
+	  checking preprocessor variables.
+
+2005-12-14 Wednesday 11:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.30), print.cc (1.17), print.hh (1.21):
+	  Defined the output streams nout and vnout to help in the control
+	  of the noisy level of test programs. By default, the helper print
+	  functions now print on ostream nout. Also added in ppl_tests.hh
+	  an using directive for the whole PPL namespace and a using
+	  declaration for std::endl.
+
+2005-12-14 Wednesday 11:33  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[5,5,7]): Documentation stuff removed from
+	  implementation file.	Removed redundant parentheses.
+
+2005-12-13 Tuesday 14:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.49): Always add a space between
+	  "catch" and "(".
+
+2005-12-13 Tuesday 14:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.10): Remove trailing whitespace; always
+	  add a space between "catch" and "(".
+
+2005-12-13 Tuesday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.141): Always add a space between "catch"
+	  and the following "(".
+
+2005-12-13 Tuesday 14:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.13): Remove trailing
+	  whitespace.
+
+2005-12-12 Monday 21:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid_Generator.cc,
+	  src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	  src/Grid_Generator_System.defs.hh, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, tests/Grid/addcongruences1.cc,
+	  tests/Grid/addgenerator1.cc, tests/Grid/addspacedims1.cc,
+	  tests/Grid/addspacedims2.cc, tests/Grid/affinedim1.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/affinepreimage1.cc,
+	  tests/Grid/bounded1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruences1.cc, tests/Grid/congruencesystem2.cc,
+	  tests/Grid/contains1.cc, tests/Grid/contains2.cc,
+	  tests/Grid/coveringbox1.cc, tests/Grid/coveringbox2.cc,
+	  tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+	  tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/grid1.cc, tests/Grid/grid2.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/intersection2.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc, tests/Grid/join3.cc,
+	  tests/Grid/limitedextrapolation1.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/mingenerators1.cc,
+	  tests/Grid/pointed1.cc, tests/Grid/relations1.cc,
+	  tests/Grid/relations2.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	  tests/Grid/widening1.cc
+	  (grids.[88,46,6,13,12,9,58,115,3,15,11,9,3,9,9,4,9,5,3,4,6,5,10,6,4,9,7,3,4,6,6,5,6,6,5,3,3,24,20,8,7,9,7,11,7,4,6,11,4,3,3,5,6,10,7,6,4,3,8]):
+	  Update Grid::map_space_dimensions() to use set_empty.  Make
+	  Grid_Generator(Generator&) explicit.	Enable insertion of
+	  parameters directly into a Grid.  Update Grid::is_universe,
+	  Grid::map_space_dimensions() and all the tests to use the grid
+	  generator creation functions.  Correct the expected values of a
+	  few tests that use parameters.
+
+2005-12-12 Monday 17:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
+	  (grids.[87,57,114]): Take out old parameter hiding.
+
+2005-12-12 Monday 16:21  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[4,4,6]): Written some code in `PPL::LP_Problem::OK()'.
+	  Properly renamed `opt_kind' to `opt_mode'.
+
+2005-12-12 Monday 13:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+	  (grids.[12,8]): Implement operator<<(s,ggs).
+
+2005-12-12 Monday 13:27  Andrea Cimino
+
+	* src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh,
+	  tests/Polyhedron/LP_Problem1.cc (simplex.[3,5,3]): Added the
+	  method `PPL::LP_Problem::optimal_value()'.  Modified also
+	  LP_Problem1.cc: all seems to work as expected.
+
+2005-12-10 Saturday 15:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (simplex.1): Exploiting the new
+	  LP_Problem class to build a precise BD_Shape starting from the
+	  constraints of a polyhedron when SIMPLEX_COMPLEXITY is allowed.
+
+2005-12-09 Friday 20:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.52): Some reorganization of the methods
+	  in documentation sections.
+
+2005-12-08 Thursday 20:26  Andrea Cimino
+
+	* src/LP_Problem.inlines.hh (simplex.4): Fixed a bug showed by
+	  `ppl_lpsol'.
+
+2005-12-08 Thursday 20:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.2): Corrected a bug in the
+	  call of ppl_LP_Problem_optimizing_point().
+
+2005-12-08 Thursday 15:22  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.inlines.hh (simplex.[3,3]):
+	  Some switches fixed.
+
+2005-12-08 Thursday 07:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.165), interfaces/Prolog/Prolog_interface.dox (1.137),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.106): Added support for
+	  SWI-Prolog's unbounded numbers.  This requires Prolog version
+	  5.5.40 or later version.
+
+2005-12-07 Wednesday 17:31  Andrea Cimino
+
+	* src/LP_Problem.cc, src/LP_Problem.defs.hh,
+	  src/LP_Problem.inlines.hh, tests/Polyhedron/LP_Problem1.cc,
+	  tests/Polyhedron/LP_Problem2.cc (simplex.[2,2,2,2,2]):
+	  LP_Problem prototypes modified to match the C interface.
+	  Modified also the tests.  The code needs to be hardly tested.
+
+2005-12-06 Tuesday 16:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.1): Using the new interface
+	  to the LP_Problem class.
+
+2005-12-06 Tuesday 16:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc, ppl_c.h.in (simplex.[1,1]): Added
+	  tentative interface for the LP_Problem class.
+
+2005-12-06 Tuesday 16:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint_System.defs.hh, globals.types.hh, simplex.cc
+	  (simplex.[2,1,1]): Enumeration Optimization_Kind renamed as
+	  Optimization_Mode.
+
+2005-12-06 Tuesday 13:24  Andrea Cimino
+
+	* doc/devref.doxyconf-html.in (simplex.1):
+	  Modified to produce PPL::LP_Problem documentation.
+
+2005-12-05 Monday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.22), Watchdog/ChangeLog (1.12): Updated.
+
+2005-12-05 Monday 20:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedCH78extrapolation1.cc (1.5): Changed so as
+	  to rflect the improved precision of the widening.
+
+2005-12-05 Monday 19:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.105): Corrected trivial errors in
+	  calls to function that became a method.
+
+2005-12-05 Monday 19:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.56): Corrected references to the
+	  manual.
+
+2005-12-05 Monday 19:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: ch78widening6.cc (1.7), ch78widening8.cc (1.5):
+	  The known results updated to reflect the increased precision of
+	  the widening operator.
+
+2005-12-05 Monday 19:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.104): The operator
+	  CH78_widening_assign() is now implemented as specified in the SAS
+	  paper BHMZ05, returning immediately if there has been a change in
+	  the affine dimension of the arguments, so that it is well-defined
+	  on the domain of BDSs.
+
+2005-12-05 Monday 19:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.51): Corrected references to the
+	  documentation. Do escape < and > when writing doxygen
+	  documentation.
+
+2005-12-05 Monday 19:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.defs.hh (1.26), Polyhedron.defs.hh
+	  (1.285): Corrected references to the documentation.
+
+2005-12-05 Monday 19:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bounding_Box.defs.hh (1.10): Formatted doxygen commands
+	  according to STANDARDS. Corrected a couple of references to the
+	  manual.
+
+2005-12-05 Monday 19:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bounding_Box.cc (1.12): Removed duplicated doxygen comment.
+
+2005-12-05 Monday 19:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.179): Removed some redundant anchors
+	  (prefer using the anchors automatically defined by sectioning
+	  commands).  Added subsection on the widening and extrapolation
+	  operators for BDSs.
+
+2005-12-05 Monday 14:54  Andrea Cimino
+
+	* src/Constraint_System.defs.hh, src/LP_Problem.cc,
+	  src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh,
+	  src/LP_Problem.types.hh, src/Linear_Expression.defs.hh,
+	  src/Makefile.am, tests/Polyhedron/LP_Problem1.cc,
+	  tests/Polyhedron/LP_Problem2.cc, tests/Polyhedron/Makefile.am
+	  (simplex.[1,1,1,1,1,1,1,1,1,1]):
+	  Added the LP_Problem class to the branch, derived from the
+	  simplex.cc code.  The class is fully functional, but lacks of
+	  some features like `incrementality': in this case the problem is
+	  solved from scratch.	Added also a couple of tests playing with
+	  the class, but other tests are needed.  For significant tests a
+	  change to the C interface and to the	`ppl_lpsol' tool is
+	  required.  LP_Problem declared `friend class' of
+	  `Constraint_System' and `Linear_Expression' to allow compiling.
+
+2005-12-05 Monday 14:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.cc (1.1), BD_Shape.defs.hh (1.50),
+	  BD_Shape.inlines.hh (1.103), Makefile.am (1.130): A couple of
+	  non-inline and non-template functions placed in BD_Shape.cc.	A
+	  few functions have become private members of the BD_Shape class.
+	  Some exception throwers are now declared static.  A few methods
+	  have been renamed for consistency.
+
+2005-12-05 Monday 14:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Matrix.defs.hh (1.13), DB_Matrix.inlines.hh (1.18):
+	  Avoid indirect inclusion dependencies.  Corrected a typo in a
+	  preprocessor variable name.
+
+2005-12-05 Monday 14:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.types.hh (1.8): Also declare the
+	  Extended_Number_Policy type.
+
+2005-12-05 Monday 14:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.136): Corrected a few
+	  typos and removed a repeated paragraph.
+
+2005-12-05 Monday 10:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Ask_Tell.inlines.hh (1.6), Bounding_Box.cc (1.11),
+	  Constraint_System.cc (1.14), DB_Matrix.defs.hh (1.12),
+	  DB_Matrix.inlines.hh (1.17), DB_Row.inlines.hh (1.15),
+	  Generator_System.cc (1.14), Linear_Row.cc (1.14),
+	  Linear_System.cc (1.31), Matrix.cc (1.87),
+	  Polyhedra_Powerset.inlines.hh (1.33), Polyhedron_public.cc
+	  (1.68), Row.cc (1.92), Saturation_Matrix.cc (1.6): Do not flush
+	  too often the ostream buffer when performing normal output.
+
+2005-12-05 Monday 10:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.42), Checked_Number.inlines.hh
+	  (1.46): Added a missing \relates doxygen command.
+
+2005-12-05 Monday 10:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.49), BD_Shape.inlines.hh (1.102):
+	  Helper functions forget_*_constraints_on_var() are now provate
+	  methods of class BD_Shape.  Corrected the implementation of
+	  method swap.
+
+2005-12-04 Sunday 10:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.178): Draftet a section on BD shapes.
+
+2005-12-03 Saturday 15:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.inlines.hh (grids.6): Update insert to
+	  construct the generator directly into the constructor call.
+
+2005-12-03 Saturday 15:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.defs.hh (grids.7): Update the matrix
+	  diagram in the add_universe_rows_and_columns description.
+
+2005-12-03 Saturday 15:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.inlines.hh (grids.11): Update
+	  Grid_Generator(g) to swap with g instead of copying g.  Clean
+	  some comments.  Move the equality operators to better positions.
+	  Update line and point to use Grid_Generator(g).
+
+2005-12-03 Saturday 15:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/generator1.cc (grids.2): Insert test8, to check
+	  construction from a Generator reference.
+
+2005-12-03 Saturday 15:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.defs.hh (grids.12): Move Grid_Generator(g) to
+	  the beginning of the public section.	Improve the
+	  Grid_Generator(g) description.
+
+2005-12-03 Saturday 12:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, generator1.cc (grids.[53,1]): Add
+	  generator1, to test Grid_Generator.
+
+2005-12-03 Saturday 12:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.defs.hh (grids.10): Keep the Grid friend
+	  declaration.
+
+2005-12-03 Saturday 12:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.11): Add a note that
+	  ascii_load is a copy of Generator_System::ascii_load.
+
+2005-12-03 Saturday 12:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
+	  (grids.[11,10]): Add ascii_dump and ascii_load wrappers.
+
+2005-12-03 Saturday 12:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruence1.cc (grids.11): Update main to output the
+	  test name.  Convert variable names to A, B and C.
+
+2005-12-03 Saturday 00:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Generator.defs.hh, Grid.defs.hh, Grid_Generator.defs.hh,
+	  Grid_Generator.inlines.hh, Grid_Generator_System.cc,
+	  Grid_Generator_System.defs.hh, Grid_Generator_System.inlines.hh,
+	  Grid_chdims.cc, Grid_conversion.cc, Grid_nonpublic.cc,
+	  Grid_public.cc, Grid_simplify.cc
+	  (grids.[16,86,10,9,10,6,5,26,30,56,113,41]): Stabilize the grid
+	  friend declarations in Generator.
+
+	  Hence, in Grid
+
+	    - update the rest of the simplify methods to use Grid_Generator
+
+	    - convert reduce_pc_with_pc to a template
+
+	    - update to the Grid_Generator_System method names,
+
+	  and in Grid_Generator
+
+	    - add negate(gg,start,end)
+
+	    - add private wrapper methods topology, size, set_is_line and
+	      set_is_parameter,
+
+	  and in Grid_Generator_System
+
+	    - reduce insert, keeping only the relevant parts, and move
+	      linear_system_insert into insert
+
+	    - revert the affine image parameter list to the
+	  Generator_System
+	      form
+
+	    - take out Grid_Generator_System(topology) and add_row(g)
+
+	  Clean some comments.	Add some comments.  Take out the
+	  directed-out Grid code left in in the last few commits.
+
+2005-12-02 Friday 22:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_chdims.cc, Grid_conversion.cc,
+	  Grid_nonpublic.cc, Grid_public.cc, Grid_simplify.cc
+	  (grids.[85,25,29,55,112,40]): Reduce the dependency on the
+	  Grid_Generator_System Grid friend declaration:
+
+	    - declare function multiply_grid a static method
+
+	    - replace ggs::num_columns calls with equivalents which use
+		  ggs::space_dimension
+
+	    - leave handling of topology, pending rows and the sorted flag
+	  to
+		  Grid_Generator_System
+
+	    - replace add_zero_columns calls with insertions of all-zero
+	      parameters
+
+	    - replace private use of Grid_Generator_System and parents with
+	  use
+	      of remove_space_dimensions and recycling_insert
+
+	    - update to the Grid_Generator_System method names
+
+	    - replace direct resizing of gen_sys with sized system
+	  construction,
+	      or insertion of an all-zero parameter
+
+	    - update time_elapse_assign to leave any origin point in the
+	      resulting gen_sys
+
+	    - update conversion and minimization methods to use
+		  Grid_Generator_System instead of Linear_System.
+
+	  Take the resizing of gen_sys out of the add_generator(g) empty
+	  case, as the generator system is always the right size.
+
+	  Add const to the add_space_dimensions `dims' argument
+	  declarations.
+
+	  Take the topology and sorted checks out of OK.
+
+2005-12-02 Friday 22:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.9): Update
+	  add_universe_rows_and_columns to unset pending rows.	Update
+	  insert(gg) so that at most it adjusts the space dimension if an
+	  all-zero parameter is given.
+
+2005-12-02 Friday 20:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+	  (grids.[8,5]): Add recycling_insert, remove_space_dimensions,
+	  remove_higher_space_dimensions and an OK sorted check.  Move
+	  add_row to the private section.  Keep the Grid friend
+	  declaration, for now.
+
+2005-12-02 Friday 20:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
+	  (grids.[9,8]): Add access operators.
+
+2005-12-02 Friday 17:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.111): Take the topology specification
+	  out of the generator system construction in Grid(n,k).
+
+2005-12-02 Friday 17:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.54): Reduce dependency on the
+	  Grid_Generator_System Grid friend declaration: let
+	  Grid_Generator_System handle pending rows and the sorted flag,
+	  define out the NNC handling in construct(gs,), replace manual
+	  topology and dimension adjustment with calls to
+	  Grid_Generator_System(dim) and replace a Grid_Generator_System
+	  num_columns call with an equivalent which uses
+	  Grid_Generator_System::space_dimension().
+
+2005-12-02 Friday 17:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
+	  Grid_Generator_System.inlines.hh (grids.[7,4,4]): Add a topology
+	  check to OK.	Update `insert' to clear the sorted flag after
+	  inserting.  Update constructors to set the sorted flag.  Add
+	  wrapper methods max_space_dimension, space_dimension and
+	  num_lines.  Add Grid_Generator_System(dim).
+
+2005-12-02 Friday 16:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.110): Update
+	  generalized_affine_image(v,e,d,m) to insert the parameter via
+	  function `parameter'.
+
+2005-12-02 Friday 16:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
+	  Grid_Generator_System.inlines.hh (grids.[6,3,3]): Add method
+	  linear_system_insert, a slightly modified copy of
+	  Linear_System::insert.  Update insert to use linear_system_insert
+	  instead of trying to handle parameters specially.  Make
+	  ascii_dump() a real (vs inline) method.  Set the affine_image
+	  grid parameter automatic value to true.
+
+2005-12-02 Friday 16:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.cc, Grid_Generator.inlines.hh (grids.[5,7]):
+	  Implement method parameter locally to work around the
+	  normalization in Generator::ray.
+
+2005-12-02 Friday 16:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.defs.hh (grids.8): Keep the Grid friend
+	  declaration.
+
+2005-12-01 Thursday 22:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/join1.cc (grids.10): Turn off test4 (includes ray
+	  insertion), for now.
+
+2005-12-01 Thursday 22:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.109): Update add_generator(g) to only
+	  adjust the divisor for points, for now.
+
+2005-12-01 Thursday 22:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.108): Revert is_universe to create a
+	  generator for each dimension.
+
+2005-12-01 Thursday 22:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.28): Improve a comment slightly.
+
+2005-12-01 Thursday 22:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.inlines.hh (grids.6): Add a temporary note.
+
+2005-12-01 Thursday 22:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.5): Update insert to work
+	  around the Linear_System::insert normalization check when
+	  inserting a parameter.
+
+2005-12-01 Thursday 21:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.107): Revert add_generator to multiply
+	  the given point after it has been inserted.
+
+2005-12-01 Thursday 20:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh,
+	  Grid_Generator.inlines.hh, Grid_nonpublic.cc, Grid_public.cc
+	  (grids.[4,7,5,53,106]): Add a Grid_Generator::divisor method
+	  which returns a writable reference.  Update Grid to use this
+	  method instead of casting.  Revert
+	  Grid::generalized_affine_image(v,e,d,m) to insert the parameter
+	  in stages.
+
+2005-12-01 Thursday 20:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/membytes1.cc (grids.3): Update function add_generator
+	  to use Generator instead of Grid_Generator.
+
+2005-12-01 Thursday 19:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
+	  (grids.[6,4]): Add methods total_memory_in_bytes and
+	  external_memory_in_bytes.
+
+2005-12-01 Thursday 19:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruencesystem2.cc (grids.9): Update
+	  satisfies_all_congruences to use Generator instead of
+	  Grid_Generator.
+
+2005-12-01 Thursday 19:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addgenerator1.cc (grids.14): Update test4 to add all
+	  generators.
+
+2005-12-01 Thursday 19:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
+	  (grids.[84,52,105]): Reduce the dependency on the Grid_Generator
+	  Grid friend declaration: turn off hiding of parameters,
+	  temporarily let rays be inserted as parameters, always get the
+	  divisor via the divisor method, switch to use the
+	  Generator_System wrapper methods, multiply generators via
+	  Grid_Generator::multiply, construct grids by inserting rows
+	  instead of modifying inserted rows, compare generator systems in
+	  OK via is_equal_to, and swap entire rows via coefficient_swap.
+
+	  Take out the OK NC check and the add_generator NC handling.
+
+2005-12-01 Thursday 18:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.27): Update upper_triangular to use
+	  Generator instead of Grid_Generator.
+
+2005-12-01 Thursday 18:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.24): In both add_space_dimensions
+	  methods use add_universe_rows_and_columns instead of manually
+	  adding the rows.
+
+2005-12-01 Thursday 18:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
+	  Grid_Generator_System.inlines.hh (grids.[4,2,2]): Add
+	  Generator_System wrappers Grid_Generator_System(gg) and
+	  add_row(gg), and new method add_universe_rows_and_columns.  Use
+	  Generator instead of Grid_Generator in const_iterator.
+
+2005-12-01 Thursday 18:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh,
+	  Grid_Generator.inlines.hh (grids.[3,5,3]): Add many Generator
+	  wrapper methods, and new methods multiply and coefficient_swap.
+	  Update OK to call methods directly, instead of via a reference.
+
+2005-12-01 Thursday 18:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Scalar_Products.cc, Scalar_Products.defs.hh,
+	  Scalar_Products.inlines.hh (grids.[4,4,4]): Use Grid_Generator
+	  instead of Generator in the Grid related methods.  Add
+	  Grid_Generator versions of homogeneous_sign(e,g) and
+	  homogeneous_assign(z,e,g).  Take out
+	  Topology_Adjusted_Scalar_Product_Assign.
+
+2005-12-01 Thursday 18:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[35,21]): Use Grid_Generator instead of Generator.
+
+2005-12-01 Thursday 18:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.23): Turn of ray test for now.
+
+2005-11-30 Wednesday 20:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Generator.defs.hh, Generator_System.defs.hh,
+	  Grid_Generator.defs.hh (grids.[15,9,4]): Comment inclusions above
+	  the line instead of at the line end, to please
+	  utils/build_header.
+
+2005-11-30 Wednesday 19:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (grids.3): Update OK to call the
+	  updated Grid_Generator::OK, and to use Grid_Generator_System for
+	  the generator system type.
+
+2005-11-30 Wednesday 19:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[2,3]):
+	  Add OK method.
+
+2005-11-30 Wednesday 19:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Generator.cc, Generator.defs.hh (grids.[6,14]): Take out
+	  the OK method flag parameter hack.
+
+2005-11-30 Wednesday 19:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addgenerator1.cc (grids.13): Add only NC generators
+	  for now.
+
+2005-11-30 Wednesday 17:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh,
+	  Grid_Generator.inlines.hh, Grid_Generator_System.cc, Makefile.am
+	  (grids.[1,2,2,2,12]): Inherit privately from Generator.  Add enum
+	  Type.  Add methods is_equivalent_to and swap.  Add
+	  operator<<(s,g) friend declaration.
+
+2005-11-30 Wednesday 17:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.161): Testing the notification of commit messages.
+
+2005-11-30 Wednesday 17:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.160): Added an item.
+
+2005-11-30 Wednesday 16:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Linear_Expression.defs.hh, src/Makefile.am,
+	  tests/ppl_test.hh, tests/Grid/addcongruence1.cc,
+	  tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+	  tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/addspacedims2.cc,
+	  tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+	  tests/Grid/affinepreimage1.cc, tests/Grid/bhz03widening1.cc,
+	  tests/Grid/bounded1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruence1.cc, tests/Grid/congruencesystem1.cc,
+	  tests/Grid/congruencesystem2.cc, tests/Grid/contains1.cc,
+	  tests/Grid/contains2.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/disjoint1.cc,
+	  tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	  tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generators1.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/intersection2.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc, tests/Grid/join3.cc,
+	  tests/Grid/limitedextrapolation1.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mingenerators1.cc, tests/Grid/pointed1.cc,
+	  tests/Grid/relations1.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosure1.cc, tests/Grid/widening1.cc,
+	  tests/Grid/writecongruencesystem.cc, src/Generator.defs.hh,
+	  src/Generator_System.cc, src/Generator_System.defs.hh,
+	  src/Grid.defs.hh, src/Grid.inlines.hh,
+	  src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	  src/Grid_Generator.types.hh, src/Grid_Generator_System.cc,
+	  src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh,
+	  src/Grid_Generator_System.types.hh, src/Grid_chdims.cc,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc
+	  (grids.[104,39,9,11,15,7,2,2,11,12,10,8,2,8,8,3,3,8,4,5,10,8,8,5,3,8,6,2,3,5,5,4,5,5,4,2,22,19,6,7,6,8,6,9,6,3,5,10,3,2,2,2,4,9,6,5,2,7,6,13,18,8,83,45,1,1,1,1,1,1,1,23,26,51]):
+	  Rename find_variation_template in ppl_test.hh to find_variation.
+	  Update all tests to call find_variation directly instead of
+	  calling a wrapped instantiation of find_varition.  Update
+	  find_variation to always use nout.  Take the abort call out of
+	  find_variation.
+
+	  Add classes Grid_Generator and Grid_Generator_System.  Update the
+	  grid classes and all tests to use these instead of Generator and
+	  Generator_System.  Take the grid hacks out of Generator_System.
+
+	  Update a comment in Grid_conversion.cc.
+
+2005-11-30 Wednesday 15:36  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.41), Checked_Number.inlines.hh
+	  (1.45): Disabled ROUND_NOT_NEEDED debug check.
+
+2005-11-30 Wednesday 13:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.48): Removed trailing whitespace.
+
+2005-11-30 Wednesday 12:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.48): Removed trailing whitespace.
+
+2005-11-29 Tuesday 21:56  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (1.40): fpu_check_inexact is always
+	  set to true with assertions enabled for debugging purpose.
+
+2005-11-29 Tuesday 18:55  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.47),
+	  interfaces/Prolog/ppl_prolog.icc (1.164),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.36),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.31),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.81),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.105),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.72),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.99), src/BD_Shape.inlines.hh
+	  (1.101), src/Bounding_Box.cc (1.10), src/Bounding_Box.inlines.hh
+	  (1.11), src/Checked_Number.defs.hh (1.39),
+	  src/Checked_Number.inlines.hh (1.44), src/DB_Matrix.inlines.hh
+	  (1.16), src/Polyhedron.inlines.hh (1.126),
+	  src/Polyhedron_nonpublic.cc (1.58), src/Rounding_Dir.defs.hh
+	  (1.5), src/checked.inlines.hh (1.28),
+	  tests/Random_Number_Generator.inlines.hh (1.4),
+	  tests/BD_Shape/closure1.cc (1.8): Reorganized rounding modes.
+
+2005-11-29 Tuesday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.20): Removed trailing whitespace.
+
+2005-11-28 Monday 21:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.34): Compare to zero explicitly
+	  in normalize_moduli.
+
+2005-11-28 Monday 21:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.22): Update
+	  add_space_dimensions_and_embed and
+	  add_space_dimensions_and_project to use set_empty to empty the
+	  grid.  Update concatenate_assign to handle empty congruence
+	  systems.
+
+2005-11-28 Monday 21:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.inlines.hh, Grid_nonpublic.cc, Grid_simplify.cc
+	  (grids.[44,50,38]): Improve a trace message slightly.  Improve a
+	  few comments.  Update the congruence system simplify method to
+	  accept empty congruence systems.
+
+2005-11-28 Monday 20:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.103): Improve a few comments.  Update
+	  intersection_assign to add the `y' congruence system only if it
+	  contains rows.  Take the setting of the up-to-date flag out of
+	  Grid(n,k).
+
+2005-11-28 Monday 20:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_widenings.cc (grids.10): Improve a comment slightly.
+
+2005-11-28 Monday 16:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.102): Update Grid(const Grid&) to
+	  ensure that the out of date systems are the correct size.
+
+2005-11-28 Monday 15:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.21): Update remove_space_dimensions and
+	  remove_higher_space_dimensions to call set_empty when the grid is
+	  empty.
+
+2005-11-28 Monday 15:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.100): The more precise convex
+	  combination is now also used in method
+	  generalized_affine_image(). Common code factored out in a couple
+	  of helper functions.
+
+2005-11-28 Monday 13:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.inlines.hh (grids.11): Align comment.
+
+2005-11-28 Monday 13:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.101): Take out query (set_zero_dim_univ
+	  will insert a point, which adjusts the space dimension).
+
+2005-11-28 Monday 11:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.sty (1.23): "newcommand"s needed for the documentation
+	  for the grid domain added.
+
+2005-11-28 Monday 10:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.99): The computation of convex
+	  combinations in the general case of affine images has been
+	  simplified and properly commented.
+
+2005-11-27 Sunday 23:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.sty (grids.4): Improved comments.
+
+2005-11-27 Sunday 19:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.37): In the generator simplify method
+	  also assert sys is OK in the empty case.  In both cases pass
+	  false to OK.
+
+2005-11-27 Sunday 18:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.100): Leave congruences as they are
+	  (update_generators will simplify them).
+
+2005-11-27 Sunday 18:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.99): Assert false if relation_with(cg)
+	  finds a closure point.
+
+2005-11-27 Sunday 18:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Row.defs.hh (grids.7): Take out the Grid friend declaration.
+
+2005-11-27 Sunday 18:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Polyhedron_public.cc (grids.9): Note a possible improvement
+	  in add_congruences(cgs).
+
+2005-11-27 Sunday 18:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Matrix.defs.hh (grids.5): Mention size and capacity in the
+	  add_recycled_row parameter description.
+
+2005-11-27 Sunday 17:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.36): In the congruence simplify
+	  method always erase rows with erase_to_end.  Take out the
+	  capacity setting after erases.  Add three temporary comments.
+	  Improve two comments.  Compare to zero explicitly in two
+	  assertions.
+
+2005-11-27 Sunday 17:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Constraint.defs.hh (grids.9): Take out the Congruence_System
+	  friend declaration.
+
+2005-11-27 Sunday 17:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.33): Update insert to use
+	  Constraint::space_dimension instead of the Constraint::size and
+	  Constraint::is_necessarily_closed.
+
+2005-11-27 Sunday 17:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+	  Linear_Expression.defs.hh, Linear_Expression.inlines.hh
+	  (grids.[17,32,18,8,3]): Get the size in Congruence(c) via the
+	  space_dimension().  Add flag `capacity' to Congruence(le,m).	Use
+	  Linear_Expression(le,sz) in the Congruence %= operators.  Take
+	  out Linear_Expression(le,sz,capacity).
+
+2005-11-27 Sunday 17:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* STANDARDS (grids.8): Take out section "Standards for the Test
+	  Programs".
+
+2005-11-25 Friday 15:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Row.defs.hh (grids.6): Take out the Congruence_System friend
+	  declaration.
+
+2005-11-25 Friday 14:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Polyhedron_public.cc (grids.8): Take out a query that relates
+	  to the trunk.
+
+2005-11-25 Friday 14:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/affinepreimage1.cc (grids.7): Simplify a congruence in
+	  test8.
+
+2005-11-25 Friday 14:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* STANDARDS (grids.7): Mention that OK is called in
+	  find_variation_template.  Give an example of calling
+	  find_variation_template.
+
+2005-11-25 Friday 13:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Matrix.cc (grids.6): Improve a comment in add_recycled_row.
+
+2005-11-25 Friday 11:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_chdims.cc, Grid_nonpublic.cc, Grid_public.cc,
+	  Grid_widenings.cc (grids.[20,49,98,9]): In is_included_in merge
+	  some BE_LAZY=0 code into the BE_LAZY=1 case, and check if `x' is
+	  empty after minimization when BE_LAZY is 0.  In minimize() call
+	  simplify instead of update_generators and update_congruences,
+	  where possible.  Reduce all update_congruence calls to account
+	  for the fact the resulting grid always contains at least one
+	  point.
+
+2005-11-25 Friday 11:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.43): Keep the shrink_covering_box and
+	  get_covering_box dimension compatibility checks.
+
+2005-11-25 Friday 11:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.82): Improve the update_congruences() and
+	  minimize() descriptions.
+
+2005-11-24 Thursday 13:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.31): Take out Polyhedron friend
+	  declaration.
+
+2005-11-24 Thursday 13:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.42): In the covering box grid
+	  constructor return immediately after setting empty when a
+	  universe interval is encountered.
+
+2005-11-24 Thursday 12:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.25): Move TRACE definition into the
+	  PPL namespace.  #undef TRACE afterwards.
+
+2005-11-24 Thursday 12:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.35): Replace the tracing stream with
+	  cerr and a macro called TRACE.
+
+2005-11-24 Thursday 12:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.48): In bounds(expr,char*) use
+	  Generator::is_line_or_ray.
+
+2005-11-24 Thursday 12:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.24): Replace the tracing stream
+	  with cerr and macro TRACE.
+
+2005-11-23 Wednesday 20:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.cc (grids.17): Re-enable the OK assertion.
+
+2005-11-23 Wednesday 20:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Generator.cc, Generator.defs.hh (grids.[5,12]): Extend the
+	  OK method check_normalization argument to other
+	  polyhedron-specific checks.
+
+2005-11-23 Wednesday 19:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.97): In add_recycled_generators
+	  minimize via update_generators instead of via minimize.
+
+2005-11-23 Wednesday 18:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_public.cc, Grid_nonpublic.cc (grids.[96,47]): In
+	  add_recycled_generators_and_minimize minimize via
+	  update_generators and update_congruences instead of via minimize.
+
+2005-11-23 Wednesday 17:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.defs.hh (grids.20): Make
+	  has_linear_equalities public.
+
+2005-11-23 Wednesday 17:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Checked_Number.inlines.hh (grids.7): Update policy
+	  ROUND_DEFAULT to ROUND_DEFAULT_FUNCTION.
+
+2005-11-23 Wednesday 17:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_nonpublic.cc, Grid_public.cc (grids.[46,95]): Use
+	  Generator::is_line_or_ray instead of Generator::is_point.
+
+2005-11-23 Wednesday 17:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Linear_Expression.defs.hh (grids.7): Declare
+	  Congruence_System a friend.
+
+2005-11-23 Wednesday 17:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.cc (grids.16): Include compiler.hh.  Resolve
+	  two merge conflicts.
+
+2005-11-23 Wednesday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.defs.hh, Congruence_System.cc,
+	  Generator.defs.hh, Grid_nonpublic.cc, Grid_public.cc,
+	  Scalar_Products.cc, Scalar_Products.defs.hh,
+	  Scalar_Products.inlines.hh, Scalar_Products.types.hh
+	  (grids.[30,32,11,45,94,3,3,3,3]): Move the grid scalar product
+	  functions into class Scalar_Products.  Add class
+	  Topology_Adjusted_Scalar_Product_Assign for
+	  Congruence_System::satisfies_all_congruences(g).
+
+2005-11-23 Wednesday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, NEWS, README.configure, STANDARDS, TODO, configure.ac,
+	  doc/definitions.dox, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/ppl.sty,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected2_int16,
+	  interfaces/Prolog/XSB/expected2_int16_a,
+	  interfaces/Prolog/XSB/expected2_int32,
+	  interfaces/Prolog/XSB/expected2_int32_a,
+	  interfaces/Prolog/XSB/expected2_int64,
+	  interfaces/Prolog/XSB/expected2_int64_a,
+	  interfaces/Prolog/XSB/expected2_int8,
+	  interfaces/Prolog/XSB/expected2_int8_a,
+	  interfaces/Prolog/XSB/expected2_mpz,
+	  interfaces/Prolog/XSB/expected2_mpz_a,
+	  interfaces/Prolog/XSB/expected3_int16,
+	  interfaces/Prolog/XSB/expected3_int16_a,
+	  interfaces/Prolog/XSB/expected3_int32,
+	  interfaces/Prolog/XSB/expected3_int32_a,
+	  interfaces/Prolog/XSB/expected3_int64,
+	  interfaces/Prolog/XSB/expected3_int64_a,
+	  interfaces/Prolog/XSB/expected3_int8,
+	  interfaces/Prolog/XSB/expected3_int8_a,
+	  interfaces/Prolog/XSB/expected3_mpz,
+	  interfaces/Prolog/XSB/expected3_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int16,
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int32,
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int64,
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int8,
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq_int16,
+	  interfaces/Prolog/XSB/expected_clpq_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq_int32,
+	  interfaces/Prolog/XSB/expected_clpq_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq_int64,
+	  interfaces/Prolog/XSB/expected_clpq_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq_int8,
+	  interfaces/Prolog/XSB/expected_clpq_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq_mpz,
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a,
+	  interfaces/Prolog/XSB/expected_int16,
+	  interfaces/Prolog/XSB/expected_int16_a,
+	  interfaces/Prolog/XSB/expected_int32,
+	  interfaces/Prolog/XSB/expected_int32_a,
+	  interfaces/Prolog/XSB/expected_int64,
+	  interfaces/Prolog/XSB/expected_int64_a,
+	  interfaces/Prolog/XSB/expected_int8,
+	  interfaces/Prolog/XSB/expected_int8_a,
+	  interfaces/Prolog/XSB/expected_mpz,
+	  interfaces/Prolog/XSB/expected_mpz_a,
+	  interfaces/Prolog/XSB/expected_pchk_int16,
+	  interfaces/Prolog/XSB/expected_pchk_int16_a,
+	  interfaces/Prolog/XSB/expected_pchk_int32,
+	  interfaces/Prolog/XSB/expected_pchk_int32_a,
+	  interfaces/Prolog/XSB/expected_pchk_int64,
+	  interfaces/Prolog/XSB/expected_pchk_int64_a,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/expected_pchk_mpz,
+	  interfaces/Prolog/XSB/expected_pchk_mpz_a,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  m4/ac_check_sicstus_prolog.m4, m4/ac_check_swi_prolog.m4,
+	  m4/ac_check_xsb_prolog.m4, m4/lib-ld.m4, m4/lib-link.m4,
+	  m4/lib-prefix.m4, src/BDS_Status.idefs.hh,
+	  src/BDS_Status.inlines.hh, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.inlines.hh, src/Checked_Number.cc,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Congruence.defs.hh, src/Constraint.defs.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/Constraint_System.inlines.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Row.defs.hh,
+	  src/DB_Row.inlines.hh, src/Determinate.defs.hh, src/Float.cc,
+	  src/Float.defs.hh, src/Float.inlines.hh, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	  src/Init.cc, src/Linear_Expression.defs.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.inlines.hh, src/Native_Integer.defs.hh,
+	  src/Native_Integer.inlines.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Result.defs.hh,
+	  src/Rounding.defs.hh, src/Rounding.types.hh,
+	  src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+	  src/Scalar_Products.cc, src/Scalar_Products.defs.hh,
+	  src/Scalar_Products.inlines.hh, src/Scalar_Products.types.hh,
+	  src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/conversion.cc, src/float.types.hh, src/globals.defs.hh,
+	  src/globals.inlines.hh, src/globals.types.hh,
+	  src/mp_numeric_limits.hh, src/ppl-config.cc.in,
+	  src/scalar_products.cc, src/scalar_products.defs.hh,
+	  src/scalar_products.inlines.hh, src/simplex.cc, src/simplify.cc,
+	  tests/ppl_test.hh, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage10.cc, tests/BD_Shape/affineimage8.cc,
+	  tests/BD_Shape/affineimage9.cc,
+	  tests/BD_Shape/affinepreimage5.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/bdsdifference1.cc,
+	  tests/BD_Shape/bdsdifference2.cc,
+	  tests/BD_Shape/bdsdifference3.cc,
+	  tests/BD_Shape/bdsdifference4.cc,
+	  tests/BD_Shape/bdsdifference5.cc,
+	  tests/BD_Shape/bdsdifference6.cc,
+	  tests/BD_Shape/bdsdifference7.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/ch78widening4.cc, tests/BD_Shape/closure1.cc,
+	  tests/BD_Shape/constraints1.cc, tests/BD_Shape/equality1.cc,
+	  tests/BD_Shape/exceptions1.cc, tests/BD_Shape/exceptions2.cc,
+	  tests/BD_Shape/exceptions3.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage13.cc,
+	  tests/BD_Shape/generalizedaffineimage14.cc,
+	  tests/BD_Shape/limitedCC76extrapolation2.cc,
+	  tests/BD_Shape/limitedCC76extrapolation3.cc,
+	  tests/BD_Shape/mapspacedims2.cc, tests/BD_Shape/mapspacedims3.cc,
+	  tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/polydifference1.cc,
+	  tests/BD_Shape/polydifference2.cc,
+	  tests/BD_Shape/polydifference3.cc,
+	  tests/BD_Shape/polydifference4.cc,
+	  tests/BD_Shape/polydifference5.cc,
+	  tests/BD_Shape/polydifference6.cc, tests/BD_Shape/relations1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/relations4.cc, tests/BD_Shape/relations5.cc,
+	  tests/BD_Shape/removespacedims2.cc,
+	  tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/numberinput1.cc,
+	  tests/Polyhedron/primalsimplex1.cc,
+	  tests/Polyhedron/primalsimplex2.cc
+	  (grids.[2,4,2,6,16,8,9,5,2,3,4,2,5,5,3,4,2,2,2,4,3,6,3,4,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,4,2,2,2,2,2,3,3,3,3,3,3,3,2,3,2,1,1,1,3,3,6,6,3,3,2,8,6,29,8,3,4,3,2,2,4,2,4,2,3,3,10,4,15,7,2,4,6,5,3,10,5,4,5,6,6,7,8,6,5,6,7,4,3,3,2,2,2,2,2,2,2,4,5,8,5,7,6,4,5,4,3,2,5,4,2,2,2,5,6,3,5,2,14,6,3,3,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,3,3,4,3,3,3,3,3,2,2,2,2,2,3,2,2,2,2,2,3,3,3,2,3,2,2,2,10,2,3,2,2]):
+	  Sixth merge from main trunk.	(Note: build is currently broken.)
+
+2005-11-23 Wednesday 12:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.98): Corrected an ambiguous call
+	  problem when coefficients are checked_int64.
+
+2005-11-23 Wednesday 00:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Grid.defs.hh, Grid_minimize.cc,
+	  Grid_nonpublic.cc, Grid_public.cc (grids.[31,81,24,44,93]): Move
+	  the code in the static minimize methods into update_congruences
+	  and update_generators.  Call update_congruences and
+	  update_generators instead of the static minimize methods in
+	  methods add_recycled_congruences_and_minimize and
+	  add_recycled_generators_and_minimize.  In OK test congruence to
+	  generator conversion via a temporary grid instead of a temporary
+	  congruence system.
+
+2005-11-22 Tuesday 12:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.23): Improve two comments.
+
+2005-11-22 Tuesday 11:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_conversion.cc (grids.[80,22]): Make
+	  conversion void of return.
+
+2005-11-22 Tuesday 11:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.92): Leave dim_kinds at the end of the
+	  ASCII dump.  Resign to reading dim_kind into a short temporary
+	  int in ascii_load.
+
+2005-11-22 Tuesday 11:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruence1.cc (grids.9): Use a local namespace.
+	  Merge test10 and test11.  Add is_trivial_* tests of the form b %=
+	  0 mod m where b <> 0 mod m.
+
+2005-11-22 Tuesday 10:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh (grids.[16,28]): Consider
+	  b %= 0 mod m where b <> 0 mod m as false in is_trivial_false.
+	  Leave the constant term be after factoring out the modulus in
+	  normalize.
+
+2005-11-22 Tuesday 07:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh (1.4): Added new rounding modes
+	  ROUND_NOT_NEEDED and ROUND_DONT_CARE.
+
+2005-11-22 Tuesday 07:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh (grids.1): file Rounding_Dir.defs.hh was
+	  added on branch grids on 2005-11-23 13:24:06 +0000
+
+2005-11-22 Tuesday 07:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh (1.3): Added a couple of comments.
+
+2005-11-21 Monday 16:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/isuniverse1.cc (grids.5): Use a local namespace.
+	  Insert test4, where the gird is zero dimension empty.  Add tests
+	  with the systems in various states of minimization and
+	  up-to-date'ness.
+
+2005-11-21 Monday 16:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.91): In is_universe check for a single
+	  integrality congruence if the congruences are minimized, use a
+	  single temporary generator instead of creating a temporary grid,
+	  and take out the gen_sys check.
+
+2005-11-21 Monday 15:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.27): Correct is_trivial_true doc.
+
+2005-11-21 Monday 15:48  Elena Mazzi
+
+	* src/BD_Shape.defs.hh (1.47), src/BD_Shape.inlines.hh (1.97),
+	  tests/BD_Shape/Makefile.am (1.28),
+	  tests/BD_Shape/bdsdifference1.cc (1.1),
+	  tests/BD_Shape/bdsdifference2.cc (1.1),
+	  tests/BD_Shape/bdsdifference3.cc (1.1),
+	  tests/BD_Shape/bdsdifference4.cc (1.1),
+	  tests/BD_Shape/bdsdifference5.cc (1.1),
+	  tests/BD_Shape/bdsdifference6.cc (1.1),
+	  tests/BD_Shape/bdsdifference7.cc (1.1),
+	  tests/BD_Shape/exceptions1.cc (1.8),
+	  tests/BD_Shape/polydifference1.cc (1.7),
+	  tests/BD_Shape/polydifference2.cc (1.5),
+	  tests/BD_Shape/polydifference3.cc (1.5),
+	  tests/BD_Shape/polydifference4.cc (1.5),
+	  tests/BD_Shape/polydifference5.cc (1.6),
+	  tests/BD_Shape/polydifference6.cc (1.5),
+	  tests/BD_Shape/polydifference7.cc (1.2), tests/BD_Shape/run_tests
+	  (1.10): Method BD_Shape::poly_difference_assign() renamed
+	  BD_Shape::bds_difference_assign().  Corrected a bug in
+	  BD_Shape::bds_difference_assign().
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference1.cc (grids.1): file
+	  bdsdifference1.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference2.cc (grids.1): file
+	  bdsdifference2.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference3.cc (grids.1): file
+	  bdsdifference3.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference4.cc (grids.1): file
+	  bdsdifference4.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference5.cc (grids.1): file
+	  bdsdifference5.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference6.cc (grids.1): file
+	  bdsdifference6.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference7.cc (grids.1): file
+	  bdsdifference7.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (grids.1): file run_tests was added on
+	  branch grids on 2005-11-23 13:24:08 +0000
+
+2005-11-21 Monday 15:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.96): Added a couple of missing inline
+	  declarations.  Let definitions of a few inline functions occur
+	  before their first use.
+
+2005-11-21 Monday 11:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage8.cc (1.10),
+	  generalizedaffineimage14.cc (1.8): Removed the last CHECKME's
+	  from the known results.
+
+2005-11-20 Sunday 19:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_pchk_int32 (1.2),
+	  tests/expected_pchk_int32 (1.3): Updated.
+
+2005-11-20 Sunday 19:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int32 (grids.1): file
+	  expected_pchk_int32 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_clpq_int16 (1.2),
+	  XSB/expected_pchk_int16 (1.2), tests/expected_clpq_int16 (1.2),
+	  tests/expected_pchk_int16 (1.3): Updated.
+
+2005-11-20 Sunday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int16 (grids.1): file
+	  expected_clpq_int16 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int16 (grids.1): file
+	  expected_pchk_int16 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 18:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.159): New to-do item.
+
+2005-11-20 Sunday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_clpq2_int8_a (1.2),
+	  XSB/expected_pchk_int8_a (1.2), tests/expected_clpq2_int8_a
+	  (1.2), tests/expected_pchk_int8_a (1.3): Updated.
+
+2005-11-20 Sunday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int8_a (grids.1): file
+	  expected_clpq2_int8_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int8_a (grids.1): file
+	  expected_pchk_int8_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_clpq2_int32_a (1.2),
+	  XSB/expected_clpq_int16_a (1.2), XSB/expected_pchk_int16_a (1.2),
+	  XSB/expected_pchk_int32_a (1.2), XSB/expected_pchk_int64_a (1.2),
+	  tests/expected_clpq2_int32_a (1.2), tests/expected_clpq_int16_a
+	  (1.2), tests/expected_pchk_int16_a (1.3),
+	  tests/expected_pchk_int32_a (1.3): Updated.
+
+2005-11-20 Sunday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int32_a (grids.1): file
+	  expected_clpq2_int32_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int16_a (grids.1): file
+	  expected_clpq_int16_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int16_a (grids.1): file
+	  expected_pchk_int16_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int32_a (grids.1): file
+	  expected_pchk_int32_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int64_a (grids.1): file
+	  expected_pchk_int64_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: Makefile.am (1.38), expected2_int16
+	  (1.5), expected2_int16_a (1.4), expected2_int32 (1.4),
+	  expected2_int32_a (1.3), expected2_int64 (1.3), expected2_int64_a
+	  (1.3), expected2_int8 (1.4), expected2_int8_a (1.3),
+	  expected2_mpz (1.3), expected2_mpz_a (1.3), expected3_int16
+	  (1.3), expected3_int16_a (1.3), expected3_int32 (1.3),
+	  expected3_int32_a (1.2), expected3_int64 (1.2), expected3_int64_a
+	  (1.2), expected3_int8 (1.4), expected3_int8_a (1.2),
+	  expected3_mpz (1.2), expected3_mpz_a (1.2), expected_clpq2_int16
+	  (1.1), expected_clpq2_int16_a (1.1), expected_clpq2_int32 (1.1),
+	  expected_clpq2_int32_a (1.1), expected_clpq2_int64 (1.1),
+	  expected_clpq2_int64_a (1.1), expected_clpq2_int8 (1.1),
+	  expected_clpq2_int8_a (1.1), expected_clpq2_mpz (1.1),
+	  expected_clpq2_mpz_a (1.1), expected_clpq_int16 (1.1),
+	  expected_clpq_int16_a (1.1), expected_clpq_int32 (1.1),
+	  expected_clpq_int32_a (1.1), expected_clpq_int64 (1.1),
+	  expected_clpq_int64_a (1.1), expected_clpq_int8 (1.1),
+	  expected_clpq_int8_a (1.1), expected_clpq_mpz (1.1),
+	  expected_clpq_mpz_a (1.1), expected_int16 (1.3), expected_int16_a
+	  (1.3), expected_int32 (1.3), expected_int32_a (1.3),
+	  expected_int64 (1.3), expected_int64_a (1.3), expected_int8
+	  (1.4), expected_int8_a (1.4), expected_mpz (1.3), expected_mpz_a
+	  (1.3), expected_pchk_int16 (1.1), expected_pchk_int16_a (1.1),
+	  expected_pchk_int32 (1.1), expected_pchk_int32_a (1.1),
+	  expected_pchk_int64 (1.1), expected_pchk_int64_a (1.1),
+	  expected_pchk_int8 (1.1), expected_pchk_int8_a (1.1),
+	  expected_pchk_mpz (1.1), expected_pchk_mpz_a (1.1): Test files
+	  are now named as for the other Prolog systems.
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int16 (grids.1): file
+	  expected_clpq2_int16 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int16_a (grids.1): file
+	  expected_clpq2_int16_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int32 (grids.1): file
+	  expected_clpq2_int32 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int64 (grids.1): file
+	  expected_clpq2_int64 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int64_a (grids.1): file
+	  expected_clpq2_int64_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int8 (grids.1): file
+	  expected_clpq2_int8 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_mpz (grids.1): file
+	  expected_clpq2_mpz was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_mpz_a (grids.1): file
+	  expected_clpq2_mpz_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int32 (grids.1): file
+	  expected_clpq_int32 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int32_a (grids.1): file
+	  expected_clpq_int32_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int64 (grids.1): file
+	  expected_clpq_int64 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int64_a (grids.1): file
+	  expected_clpq_int64_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int8 (grids.1): file
+	  expected_clpq_int8 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int8_a (grids.1): file
+	  expected_clpq_int8_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_mpz (grids.1): file
+	  expected_clpq_mpz was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_mpz_a (grids.1): file
+	  expected_clpq_mpz_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int64 (grids.1): file
+	  expected_pchk_int64 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int8 (grids.1): file
+	  expected_pchk_int8 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_mpz (grids.1): file
+	  expected_pchk_mpz was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_mpz_a (grids.1): file
+	  expected_pchk_mpz_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 16:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected2_int8 (1.3), XSB/expected3_int8
+	  (1.3), tests/expected_clpq2_int8 (1.2), tests/expected_pchk_int8
+	  (1.3): Updated.
+
+2005-11-20 Sunday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.14): Temporary hack to avoid
+	  failure of `make check'.
+
+2005-11-20 Sunday 07:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.13): Removed another instance
+	  of undue reliance on default rounding mode.
+
+2005-11-20 Sunday 00:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.95): Use rounding up in the definition
+	  of stop_points[] in BD_Shape<T>::CC76_extrapolation_assign().
+
+2005-11-19 Saturday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.inlines.hh (1.15): DB_Matrix<T>::ascii_load() was
+	  not failing in case of a conversion error.
+
+2005-11-19 Saturday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Result.defs.hh (1.11): Added some full stops.
+
+2005-11-19 Saturday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.inlines.hh (1.14): DB_Row::OK() is now more
+	  informative upon failure, unless NDEBUG is defined.
+
+2005-11-19 Saturday 20:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.94): Another correction in
+	  BD_Shape<T>::CC76_extrapolation_assign().
+
+2005-11-19 Saturday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.93): Fixed the definition of
+	  stop_points[] in BD_Shape<T>::CC76_extrapolation_assign().
+
+2005-11-19 Saturday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.92), DB_Matrix.inlines.hh (1.14):
+	  Fixed a copy and paste bug in the distance functions.  No longer
+	  rely on default rounding mode for extended numbers.
+
+2005-11-19 Saturday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh (1.13), GMP_Integer.inlines.hh (1.8):
+	  Remove overloadings of raw_value() with an mpq_class argument.
+
+2005-11-19 Saturday 20:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage8.cc (1.9), affineimage9.cc (1.8):
+	  Fixed ambiguous calls to rectilinear_distance_assign().
+
+2005-11-19 Saturday 20:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.27): XFAIL_TESTS should be empty
+	  here.
+
+2005-11-19 Saturday 16:47  Abramo Bagnara
+
+	* src/: Bounding_Box.cc (1.9), Bounding_Box.inlines.hh (1.10),
+	  Checked_Number.defs.hh (1.38), Checked_Number.inlines.hh (1.43),
+	  Polyhedron.inlines.hh (1.125): Don't permit rounding direction
+	  omission when it's relevant.
+
+2005-11-19 Saturday 11:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.9): Temporarily let polydifference7
+	  be an XFAIL test, so as to allow systematic testing of all
+	  incarnations of BD_Shape using tinderbox.
+
+2005-11-19 Saturday 11:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage8.cc (1.8), affineimage9.cc (1.7):
+	  Try to use the distance computation so as to detect when a
+	  computed result is ok even if different from the known result
+	  (not really sure this one was the intended use of these distance
+	  functions).
+
+2005-11-19 Saturday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.91): Previous change reverted.
+
+2005-11-18 Friday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.90): Removed several useless
+	  invocations of raw_value().
+
+2005-11-18 Friday 22:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh (1.12), GMP_Integer.inlines.hh (1.7):
+	  Defined overloaded raw_value() functions that are the identity
+	  functions on mpq_class& and const mpq_class&, respectively.  This
+	  avoids surprises when raw_value() is applied to an mpq_class
+	  object.  The problem is caused by the C++ interface of GMP, which
+	  defines an implicit constructor for mpz_class from an object of
+	  type mpq_class.
+
+2005-11-18 Friday 20:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage8.cc (1.7), affineimage9.cc (1.6),
+	  affinepreimage5.cc (1.5), generalizedaffineimage13.cc (1.4): The
+	  expected results modified accoring to the new precision expected
+	  from method affine_image().
+
+2005-11-18 Friday 20:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.89): The precision of affine_image()
+	  improved further.
+
+2005-11-18 Friday 17:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.19): In concatenate_assign improve some
+	  comments and split an assert into two.
+
+2005-11-18 Friday 17:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/concatenate1.cc (grids.4): Define tests in a local
+	  namespace.  Add a test where the second grid is empty.  Add tests
+	  for zero dimension grids and grids that are empty due to the
+	  congruence system.  In all tests call find_variation only on the
+	  grid under test and only after concatenating.
+
+2005-11-18 Friday 14:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.30): Add an extra loop to
+	  satisfies_all_congruences so that the scalar product is
+	  multiplied by the divisor only as required.
+
+2005-11-18 Friday 14:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc, tests/Grid/removespacedims1.cc
+	  (grids.[18,8]): Add test6 (where the variable set includes the
+	  first dim) and test7 (where the result contains an all-zero
+	  parameter).  Define the tests within a local namespace.
+
+2005-11-18 Friday 13:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.21): Reduce the number of known_gr
+	  congruences in test15.
+
+2005-11-18 Friday 13:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/removespacedims1.cc (grids.7): Enable test4.  Rename
+	  test1 test5.	Add a simple test as test1.
+
+2005-11-18 Friday 12:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/intersection2.cc (grids.7): Modify test7 slightly.
+
+2005-11-18 Friday 12:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruencesystem1.cc (grids.7): Neaten formatting.
+	  Take out list of methods that could be tested.
+
+2005-11-18 Friday 09:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.26), run_tests (1.8): Let
+	  BD_Shape<mpq> be the first one to be tested.
+
+2005-11-17 Thursday 15:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/foldspacedims1.cc (grids.4): Correct two comments.
+	  Add test11, in which a relational grid becomes a grid that is
+	  smaller than universe.
+
+2005-11-17 Thursday 15:20  Abramo Bagnara
+
+	* src/: Float.inlines.hh (1.15), checked_ext.inlines.hh (1.26),
+	  checked_float.inlines.hh (1.54), checked_mpz.inlines.hh (1.33):
+	  Removed traling whitespace.
+
+2005-11-17 Thursday 14:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruencesystem2.cc (grids.7): Add a local namespace.
+	  Fit fulfils to satisfies_all_congruence.  Take out the closure
+	  point tests.	Add tests where the divisor is greater than one.
+
+2005-11-17 Thursday 13:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruence1.cc (grids.8): Resolve a query (the two
+	  grids should be equal).
+
+2005-11-17 Thursday 13:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addspacedims2.cc (grids.7): Take out two simple
+	  queries.  Use equalities where possible to create the test5 known
+	  congruence system.
+
+2005-11-17 Thursday 12:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/scalar_products.cc (grids.4): Clean a
+	  reduced_scalar_product_assign comment.
+
+2005-11-17 Thursday 12:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Certificate.cc (grids.8): Format returns consistently.
+	  Quote variables consistently in comments.  Resign to creating a
+	  temporary certificate in compare(gr).
+
+2005-11-17 Thursday 12:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/scalar_products.defs.hh (grids.5): Keep
+	  homogeneous_scalar_product_sign, which is used in method
+	  `bounds'.
+
+2005-11-17 Thursday 10:14  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (1.29): Fixed proper use of rounding
+	  direction.
+
+2005-11-17 Thursday 09:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.25): Added a guideline regarding trailing
+	  whitespace, as well as an hint for exploiting the power of emacs
+	  in this respect (thanks to Matthew Mundell for pointing this
+	  out).
+
+2005-11-17 Thursday 09:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.88), simplex.cc (1.32): Removed
+	  trailing whitespace.
+
+2005-11-17 Thursday 07:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.7): Spurious line removed.
+
+2005-11-17 Thursday 07:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (grids.1): file closure1.cc was added
+	  on branch grids on 2005-11-23 13:24:07 +0000
+
+2005-11-16 Wednesday 20:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.6): Distance computations enabled.
+
+2005-11-16 Wednesday 20:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpq.inlines.hh (1.28): Quick and dirty (very dirty)
+	  hack to provide mpq-based checked numbers with some sqrt
+	  capability.
+
+2005-11-16 Wednesday 20:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.inlines.hh (1.13): Fixed
+	  Euclidean_Distance_Specialization.  Avoided a compiler warning.
+	  Factorized some common code.
+
+2005-11-16 Wednesday 18:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/scalar_products.defs.hh (grids.4): Keep
+	  homogeneous_scalar_product_assign, which is used in max_min.
+
+2005-11-16 Wednesday 18:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Matrix.defs.hh (grids.4): Take out old friends.
+
+2005-11-16 Wednesday 18:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.34): Correct typo in temporary
+	  comment.
+
+2005-11-16 Wednesday 18:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.79): Mention only that expr in the
+	  bounded methods are bounded (instead of mentioning bounding from
+	  above or below.  Note that the two "bound_from" methods are the
+	  same.
+
+2005-11-16 Wednesday 16:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_widenings.cc (grids.8): Take out the inclusion of the
+	  bounding box header.
+
+2005-11-16 Wednesday 13:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.5): Get ready to test with
+	  Euclidean and L-infinity distances.
+
+2005-11-16 Wednesday 13:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.46): Added missing friend declarations.
+	  Removed superfluous friend declarations.
+
+2005-11-16 Wednesday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.45), BD_Shape.inlines.hh (1.87): Added
+	  methods BD_Shape::euclidean_distance_assign() and
+	  BD_Shape::l_infinity_distance_assign() along the lines of the
+	  existing methods BD_Shape::rectilinear_distance_assign().
+
+2005-11-16 Wednesday 13:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.defs.hh (1.11): Added the declaration of
+	  DB_Matrix::euclidean_distance_assign().
+
+2005-11-16 Wednesday 13:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.25), polydifference7.cc (1.1):
+	  News test shows a bug in BD_Shape::poly_difference_assign().
+
+2005-11-16 Wednesday 07:17  Abramo Bagnara
+
+	* src/DB_Matrix.inlines.hh (1.12): Fixed obnoxious typo. Added
+	  missing qualifiers.
+
+2005-11-15 Tuesday 21:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Congruence.defs.hh, Grid.defs.hh (grids.[26,78]): Reverted
+	  a previous change to the documentation in Congruence.defs.hh
+	  Corrected line expression in example 2 in Grid.defs.hh.
+
+2005-11-15 Tuesday 20:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.4): Added (experimental, commented
+	  out) invocations of the rectilinear_distance_assign() function.
+
+2005-11-15 Tuesday 19:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: DB_Matrix.defs.hh (1.10), DB_Matrix.inlines.hh (1.11): New
+	  functions euclidean_distance_assign() and
+	  l_infinity_distance_assign().  Along with
+	  rectilinear_distance_assign() they are all implemented in terms
+	  of the new, generalized function l_m_distance_assign().
+
+2005-11-15 Tuesday 18:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.inlines.hh (1.10): Several improvements to template
+	  <typename Temp, typename To, typename T> inline bool
+	  rectilinear_distance_assign(Checked_Number<To,
+	  Extended_Number_Policy>& r, const DB_Matrix<T>& x, const
+	  DB_Matrix<T>& y, const Rounding_Dir dir, Temp& tmp0, Temp& tmp1,
+	  Temp& tmp2).	(Joint work with Abramo Bagnara.)
+
+2005-11-15 Tuesday 18:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.31): The steepest-edge technique should be
+	  enabled by default (it was disabled by error in the last commit).
+
+2005-11-15 Tuesday 17:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.inlines.hh (grids.[15,17]): Make
+	  is_trivial_true and is_trivial_false real (vs inline) methods.
+
+2005-11-15 Tuesday 17:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.cc (grids.14): "Use" parameter
+	  check_normalization in method `insert'.
+
+2005-11-15 Tuesday 17:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Certificate.cc, Grid_minimize.cc, Grid_public.cc,
+	  Grid_simplify.cc, Grid_widenings.cc (grids.[7,23,90,33,7]):
+	  Normalize moduli in the congruence system simplify method.  Clean
+	  a few comments.  In the zero dimension cases in
+	  add_recycled_generators and add_recycled_generators_and_minimize
+	  only set zero dimension universe when the grid is empty.
+
+2005-11-15 Tuesday 17:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.77): Doc the minimized_generators()
+	  parameter conversion.
+
+2005-11-15 Tuesday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.86): Statically allocate temporaries
+	  in template <typename Temp, typename To, typename T> bool
+	  rectilinear_distance_assign(Checked_Number<To,
+	  Extended_Number_Policy>& r, const BD_Shape<T>& x, const
+	  BD_Shape<T>& y, const Rounding_Dir dir).
+
+2005-11-15 Tuesday 15:58  Abramo Bagnara
+
+	* src/checked_ext.inlines.hh (1.25): Added missing argument.
+
+2005-11-15 Tuesday 15:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, mingenerators1.cc (grids.[52,1]): Add
+	  mingenerators1, which tests Grid::minimized_generators().
+
+2005-11-15 Tuesday 15:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.89): In generators() use
+	  hide_parameters() and move the zero dim check to precede the
+	  empty check.	Implement minimized_generators() directly, instead
+	  of calling generators().
+
+2005-11-15 Tuesday 15:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[76,43]): Add
+	  hide_parameters().
+
+2005-11-15 Tuesday 15:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.inlines.hh (1.13): Two FIXMEs removed.
+
+2005-11-15 Tuesday 14:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.42): In construct(gs,) move the
+	  gen_sys sorted flag setting into the space_dim > 0 case.
+
+2005-11-15 Tuesday 14:46  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.37), Checked_Number.inlines.hh
+	  (1.42), DB_Row.inlines.hh (1.12), checked.defs.hh (1.28),
+	  checked.inlines.hh (1.27), checked_ext.inlines.hh (1.24),
+	  checked_mpq.inlines.hh (1.27), checked_mpz.inlines.hh (1.32):
+	  Added construct function to Checked_Number. Added specialization
+	  for mpq and mpz.
+
+2005-11-15 Tuesday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.44), BD_Shape.inlines.hh (1.85),
+	  DB_Matrix.defs.hh (1.9), DB_Matrix.inlines.hh (1.9): Added a
+	  first version of some functions computing the rectilinear (or
+	  Manhattan) distance between BD_Shape objects.
+
+2005-11-15 Tuesday 14:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Rounding_Dir.defs.hh (1.2), Rounding_Dir.inlines.hh (1.2):
+	  Added Rounding_Dir inverse(Rounding_Dir dir): returns the inverse
+	  rounding mode of `dir', ROUND_IGNORE being the inverse of itself.
+
+2005-11-15 Tuesday 14:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.inlines.hh (grids.1): file
+	  Rounding_Dir.inlines.hh was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-15 Tuesday 13:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.21), Makefile.am (1.129), Native_Integer.defs.hh
+	  (1.15), Rounding.defs.hh (1.14), Rounding.types.hh (1.5),
+	  Rounding_Dir.defs.hh (1.1), Rounding_Dir.inlines.hh (1.1),
+	  checked.defs.hh (1.27): Rounding.types.hh removed.  Other
+	  Rounding.defs.hh renamed Rounding_Dir.defs.hh.  Comments revised.
+	  New file Rounding_Dir.inlines.hh will contain inline functions
+	  operating on enum Rounding_Dir values.
+
+2005-11-15 Tuesday 12:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, generators1.cc, mincongruences1.cc
+	  (grids.[51,1,1]): Add generators1 and mincongruences1, which test
+	  Grid::generators() and Grid::minimized_congruences().
+
+2005-11-15 Tuesday 12:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruences1.cc (grids.4): Insert test6, where the
+	  grid is defined by generators.  In test8 (was test7) minimize
+	  when adding congruence.
+
+2005-11-15 Tuesday 12:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.inlines.hh, Grid_nonpublic.cc, Grid_public.cc
+	  (grids.[41,41,88]): Always set zero dim universe via
+	  set_zero_dim_univ().	Insert a point in set_zero_dim_univ().
+	  Create a correctly sized gen_sys in set_empty().
+
+	  In the bounding box grid constructor move the generator system
+	  flag setting into the space_dim > 0 case.  In the covering box
+	  grid constructor jump over the sorted flag clearing when an empty
+	  grid is produced.
+
+	  In construct(gs,) set space_dim before the empty test and set
+	  zero dim universe when required.  In Grid(n,kind) set zero dim
+	  universe when required.  Handle the zero dimension case in
+	  minimized_congruences().
+
+	  In generators() just return gen_sys when the grid is marked
+	  empty, return the actual gen_sys for zero dim universe, ensure
+	  that gen_sys is up to date, and convert any parameters to points.
+
+	  In the zero dim cases of add_recycled_congruences_and_minimize
+	  and add_recycled_congruences set empty or zero dim universe only
+	  if required.
+
+2005-11-15 Tuesday 11:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.84): Method is_empty() now computes
+	  shortest-path closure instead of applying the Bellman-Ford
+	  algorithm.
+
+2005-11-15 Tuesday 11:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.30): Some further improvements to the function
+	  steepest().  Function get_exiting_base_index() now takes a
+	  *const* reference to base.
+
+2005-11-15 Tuesday 11:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Scalar_Products.cc (1.2): Don't break comment lines without
+	  reason.
+
+2005-11-15 Tuesday 11:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.cc (grids.1): file Scalar_Products.cc was
+	  added on branch grids on 2005-11-23 13:24:06 +0000
+
+2005-11-15 Tuesday 10:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.25): Improvements to the
+	  documentation about congruences and how to build them.
+
+2005-11-15 Tuesday 01:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint_System.defs.hh (1.19), simplex.cc (1.29): In the
+	  primal simplex algorithm, better separated the first and second
+	  phase of the algorithm. Added a preprocessing flag enabling the
+	  steepest-edge technique: teh flag is enabled by default. Added a
+	  new method   bool Constraint_System::is_satisfiable(Generator&
+	  feasible_point) const; that check the satisfiability of a
+	  constraint system by the primal simplex algorithm, returning a
+	  feasible point if satisfiable.  All of the above based on
+	  implementation work by Andrea Cimino.
+
+2005-11-14 Monday 18:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruences1.cc (grids.3): Add test7, where a
+	  congruence system reference is used after the zero dimension grid
+	  from which it comes has been made empty.
+
+2005-11-14 Monday 17:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (grids.18): Add zero dimension construction
+	  tests.
+
+2005-11-14 Monday 17:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruences1.cc (grids.2): Add test6, where a
+	  congruence system reference is used after the grid from which it
+	  comes has been made empty.
+
+2005-11-14 Monday 16:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, congruences1.cc (grids.[50,1]): Add
+	  congrueces1, which tests Grid::congruences().
+
+2005-11-14 Monday 16:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.75): Note the covering box constructor
+	  behaviour when the box is empty.  Improve the get_covering_box
+	  description.	Add the set_empty method to the methods required of
+	  the box class in the get_covering_box doc.
+
+2005-11-14 Monday 16:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_numeric_limits.hh (1.2): Fixed
+	  numeric_limits<mpz_class>::epsilon() and
+	  numeric_limits<mpz_class>::round_error(): they now return 0.
+
+2005-11-14 Monday 16:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/maxmin1.cc (grids.2): Use check_both in test2.
+	  Implement the zero dimension universe test.
+
+2005-11-14 Monday 16:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/coveringbox2.cc (grids.5): Add an empty fail check to
+	  operator==.  Update the boxes expected from empty grids.  Add
+	  zero dimension tests.
+
+2005-11-14 Monday 16:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/boundingbox2.cc (grids.3): Add an empty fail check to
+	  operator==.  Add zero dimension tests.
+
+2005-11-14 Monday 16:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.87): In Grid(dims,kind),
+	  add_recycled_congruences(cgs) and
+	  add_recycled_congruences_and_minimize(cgs) call set_empty instead
+	  of setting the empty flag directly.
+
+	  In congruences() adjust the assertion on the number of cols for
+	  the modulus and constant term columns.
+
+	  Improve and correct some comments.  Neaten the OK zero dimension
+	  universe check.
+
+2005-11-14 Monday 16:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_minimize.cc (grids.22): In both minimize methods assert
+	  that there are the minimum required number of columns.
+
+2005-11-14 Monday 16:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Certificate.cc (grids.6): Use gr instead of cgr, for
+	  consistency.
+
+2005-11-14 Monday 16:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.inlines.hh, Grid_nonpublic.cc (grids.[40,40]): In
+	  set_empty make con_sys false.
+
+	  Add a zero dimension universe case to max_min.
+
+	  Take out an old topology comment.
+
+	  In construct(ccgs) insert the integrality congruence when the
+	  dimension is greater than zero, and only check for false
+	  congruences in dimension zero when there are two or more columns
+	  in the given congruence system.
+
+	  In the box constructors and construct(const_gs,bool) call
+	  set_empty instead of setting the empty flag directly.
+
+	  In get_covering_box add a zero dimension check and set the box
+	  empty when the grid is empty.  In shrink_bounding_box add a zero
+	  dimension check and take out a redundant check for rows in the
+	  generator system.
+
+2005-11-14 Monday 16:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.inlines.hh (grids.10): Ensure that the
+	  modulus and constant term columns always exist.
+
+2005-11-14 Monday 16:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.29): Neaten formatting.
+
+2005-11-14 Monday 16:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.177): Special Doxygen commands such as
+	  \subsection gets confused by line breaks.
+
+2005-11-14 Monday 15:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.110): Corrected a typo in the
+	  documentation.
+
+2005-11-14 Monday 15:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.43): Class documentation improved a
+	  little.
+
+2005-11-14 Monday 15:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.83): Helper functions min_assign() and
+	  max_assign() renamed as assign_min() and assign_max() for
+	  consistency with those defined in checked.defs.hh.
+
+2005-11-14 Monday 10:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.60), devref.doxyconf-latex.in
+	  (1.4): Also consider BD shapes when building the developers'
+	  manual.
+
+2005-11-14 Monday 10:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.42): A few documentation improvements.
+
+2005-11-14 Monday 10:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BDS_Status.idefs.hh (1.10): Typo corrected in the
+	  documentation.
+
+2005-11-14 Monday 10:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Checked_Number.inlines.hh (1.41), Native_Integer.inlines.hh
+	  (1.16): Avoid a few redundant template qualifications.
+
+2005-11-14 Monday 09:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.defs.hh (1.13): Unneeded friend declaration removed.
+
+2005-11-14 Monday 08:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/DB_Row.inlines.hh (1.11): In new method
+	  DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const
+	  U& y) using y's public indexing operator [] instead of accessing
+	  the private member y.vec_.
+
+2005-11-13 Sunday 23:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.82), tests/BD_Shape/affineimage8.cc
+	  (1.6): Further improvement in the coding as well as precision of
+	  the general case of affineimage. The known result of
+	  affineimage8.cc changed accordingly.
+
+2005-11-13 Sunday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.defs.hh (1.15): Compiler warnings avoided.
+
+2005-11-13 Sunday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.3): Completed.
+
+2005-11-13 Sunday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: DB_Row.defs.hh (1.12), DB_Row.inlines.hh (1.10): New
+	  signature and definition of method void
+	  DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const
+	  U& y).
+
+2005-11-13 Sunday 18:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: globals.defs.hh (1.25), globals.inlines.hh (1.13): Removed
+	  no longer used function compute_capacity() using a single
+	  argument; always use the function also taking the maximum
+	  capacity as second argument.
+
+2005-11-13 Sunday 18:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Matrix.defs.hh (1.8), DB_Matrix.inlines.hh (1.8): Using
+	  max_num_rows() and max_num_columns() where appropriate.  Methods
+	  ascii_dump and ascii_load and the destructor should not be
+	  virtual.
+
+2005-11-13 Sunday 18:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.86), Matrix.inlines.hh (1.46): Using
+	  max_num_columns() where appropriate.
+
+2005-11-13 Sunday 15:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.81): Added a first, tentative
+	  implementation of template <typename T> template <typename U>
+	  BD_Shape<T>::BD_Shape(const BD_Shape<U>& y).
+
+2005-11-13 Sunday 15:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.41): Deckared a new template constructor
+	  template <typename U> explicit BD_Shape(const BD_Shape<U>& y): it
+	  builds a conservative, upward approximation of `y'.
+
+2005-11-13 Sunday 15:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.inlines.hh (1.7): Added a first implementation of
+	  template <typename T> template <typename U>
+	  DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y).  Added the
+	  inclusion of checked.defs.hh, which is needed to get access to
+	  the compute_capacity() functions.
+
+2005-11-13 Sunday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.defs.hh (1.7): Declared new template constructor
+	  template <typename T> template <typename U> explicit
+	  DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y): it constructs a
+	  conservative approximation of `y'.  All DB_Matrix classes are now
+	  friends of each other.
+
+2005-11-13 Sunday 15:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.inlines.hh (1.9): Added (not yet operational)
+	  skeletons for the implementation of template <typename T>
+	  template <typename U> void
+	  DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+	  dimension_type capacity) and template <typename T> template
+	  <typename U> void
+	  DB_Row_Impl_Handler<U>::Impl::construct_upward_approximation(const
+	  typename DB_Row_Impl_Handler<U>::Impl& y).
+
+2005-11-13 Sunday 15:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.defs.hh (1.11): Declared new method template <typename
+	  T> template <typename U> void
+	  DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+	  dimension_type capacity).  Declared new method template <typename
+	  T> template <typename U> void
+	  DB_Row_Impl_Handler<U>::Impl::construct_upward_approximation(const
+	  typename DB_Row_Impl_Handler<U>::Impl& y).  Comments improved.
+
+2005-11-12 Saturday 17:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: addspacedims5.cc (1.7), addspacedims6.cc (1.7),
+	  affineimage10.cc (1.3), affineimage8.cc (1.5), affineimage9.cc
+	  (1.5), affinepreimage5.cc (1.4), ascii_dump_load1.cc (1.7),
+	  ascii_dump_load2.cc (1.6), cc76extrapolation4.cc (1.6),
+	  constraints1.cc (1.7), equality1.cc (1.7), exceptions1.cc (1.7),
+	  exceptions2.cc (1.6), exceptions3.cc (1.8),
+	  generalizedaffineimage13.cc (1.3), generalizedaffineimage14.cc
+	  (1.7), limitedCC76extrapolation2.cc (1.6),
+	  limitedCC76extrapolation3.cc (1.6), mapspacedims2.cc (1.6),
+	  mapspacedims3.cc (1.5), relations1.cc (1.8), relations2.cc (1.8),
+	  relations3.cc (1.7), relations4.cc (1.6), relations5.cc (1.8),
+	  removespacedims2.cc (1.6), removespacedims3.cc (1.6): Using the
+	  anonymous namespace instead of declaring static functions.
+
+2005-11-12 Saturday 17:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/affineimage10.cc (grids.1): file affineimage10.cc
+	  was added on branch grids on 2005-11-23 13:24:07 +0000
+
+2005-11-12 Saturday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: lib-ld.m4 (1.3), lib-link.m4 (1.2), lib-prefix.m4 (1.3):
+	  Updated from Gettext 0.14.5.
+
+2005-11-12 Saturday 13:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.197): Consistently use uppercase letters to
+	  specify (placeholders for) configuration options' arguments.
+	  Systematically use AC_HELP_STRING to format help messages.
+
+2005-11-12 Saturday 13:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* CREDITS (1.21), NEWS (1.164): Corrected a typo.
+
+2005-11-12 Saturday 13:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README.configure (1.15): Corrected a couple of typos.
+
+2005-11-11 Friday 17:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_public.cc, Grid.inlines.hh (grids.[86,39]): Inline
+	  method is_empty.  In is_empty add more fast-fail tests and
+	  minimize only the congruence system in the last-resort test.
+
+2005-11-11 Friday 17:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Status.cc, Grid_Status.idefs.hh,
+	  Grid_Status.inlines.hh (grids.[4,4,3]): Gridify the Grid_Status
+	  comments.
+
+2005-11-11 Friday 17:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (grids.8): Add anchor grid_space_dimensions.
+	  Refer to affine_function instead of affine_transformation.
+
+2005-11-11 Friday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/affinepreimage1.cc (grids.6): Correct expected result
+	  in test16.
+
+2005-11-11 Friday 15:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.inlines.hh (grids.9): Only qualify the
+	  namespace of insert(cg) once.
+
+2005-11-11 Friday 15:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.defs.hh (grids.6): Document all parameters
+	  in a method when some are documented.
+
+2005-11-11 Friday 15:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.74): Improve the class description.
+	  Update to the newly named affine_function and
+	  generalized_affine_relation anchors.	Use \cL for grids instead
+	  of \cP.  Document the space dimension changing behaviour of
+	  map_space_dimension.	Document all parameters when some are
+	  documented.  Correct the return value documentation for the
+	  simplify methods.
+
+2005-11-10 Thursday 21:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.85): Add colon between namespace and
+	  class in comment.
+
+2005-11-10 Thursday 21:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.73): Convert the class doc examples into
+	  grid examples.  Correct a parameter name.
+
+2005-11-10 Thursday 21:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator.defs.hh (grids.9): Keep Congruence_System as a
+	  friend.
+
+2005-11-10 Thursday 21:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: affineimage1.cc, affinepreimage1.cc (grids.[7,5]):
+	  Add three simple tests.
+
+2005-11-10 Thursday 19:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh (grids.[14,24]): Add
+	  method throw_invalid_argument.  Use it in
+	  throw_dimension_incompatible.  In the constructors that take
+	  constraints move the check that the constraint is an equality to
+	  come before the construction of the underlying row.
+
+2005-11-10 Thursday 18:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh,
+	  Congruence_System.inlines.hh, Constraint.defs.hh
+	  (grids.[28,19,8,7]): In insert(cg) use add_recycled_row instead
+	  of add_row when a resized copy of cg is created, and call
+	  num_rows() in place instead of using a variable.
+
+	  Inline insert(cg).
+
+	  Doc the strong normalization of the insert methods.
+
+2005-11-10 Thursday 18:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
+	  (grids.[4,3,3]): Add add_recycled_row(Row&).	Move the bulk of
+	  add_row to add_recycled_row.	Call add_recycled_row from add_row.
+	  Inline add_row.
+
+2005-11-10 Thursday 18:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh (grids.[13,23]): Add
+	  Congruence(c, sz, capacity).
+
+2005-11-10 Thursday 15:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.80): Corrected a bug in method
+	  ascii_load().
+
+2005-11-10 Thursday 14:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.defs.hh, scalar_products.cc,
+	  scalar_products.defs.hh (grids.[22,3,3]): Take out
+	  scalar_product_assign(.., ref) and
+	  reduced_scalar_product_assign(.., ref), which were required by an
+	  older form of Congruence_System::satisfies_all_congruences.
+
+2005-11-10 Thursday 13:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.defs.hh, Congruence_System.inlines.hh
+	  (grids.[18,7]): Make the ascii_dump and ascii_load documentation
+	  implementation details.  Take out
+	  Congruence_System(n_rows,n_cols).  Keep has_linear_equalities().
+
+2005-11-10 Thursday 12:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, topclosure1.cc (grids.[49,1]): Add
+	  topclosure1, which tests Grid::topological_closure_assign().
+
+2005-11-10 Thursday 12:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_public.cc
+	  (grids.[72,38,84]): Declare and implement
+	  topological_closure_assign().
+
+2005-11-10 Thursday 11:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, membytes1.cc, membytes2.cc
+	  (grids.[48,1,1]): Add membytes1 and membytes2, to exercise
+	  Grid::total_memory_in_bytes() and
+	  Grid::external_memory_in_bytes().
+
+2005-11-10 Thursday 11:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_widenings.cc (grids.6): Rename parameter selected_cgs as
+	  cgs_selected.
+
+2005-11-10 Thursday 11:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_minimize.cc,
+	  Grid_nonpublic.cc, Grid_public.cc (grids.[71,37,21,39,83]): Doc
+	  param convert_rays_to_lines in Grid(gs, convert_rays_to_lines).
+	  Neaten some comment widths.  Make the add_space_dimensions
+	  methods private.  Note in docs where Grid maths symbols must be
+	  used.  Doc the return of ascii_load formally.  Shorten the
+	  convert_rays_to_lines param doc for construct(gs,
+	  convert_rays_to_lines).  Use "minimize" instead of "reduce" and
+	  "generator system" instead of "parameter system".  Improve a few
+	  method descriptions.
+
+	  Enable method total_memory_in_bytes.	Take out the remaining
+	  pending row methods, strongly_minimize_congruences and
+	  strongly_minimize_generators.
+
+	  Void the return from minimize(cgs,ls).  Swap the return cases in
+	  minimize(gs,cgs) to match the other methods that return an
+	  indication of the grid's emptiness.
+
+2005-11-08 Tuesday 21:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.70): Correct and neaten comments.
+	  Document the parameters in the shrink and get bounding box
+	  methods.  Document the return in
+	  add_recycled_constraints_and_minimize.  Move the
+	  join_assign_and_minimize declaration to match the Polyhedron
+	  ordering.
+
+2005-11-08 Tuesday 20:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, disjoint1.cc (grids.[47,1]): Add
+	  disjoint1, which tests Grid::is_disjoint_from().
+
+2005-11-08 Tuesday 20:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/contains1.cc (grids.4): Improve comments, messages and
+	  a variable name.
+
+2005-11-08 Tuesday 20:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_widenings.cc (grids.5): In limited_extrapolation_assign
+	  check dimension compatibility before falling back to the ordinary
+	  widening.
+
+2005-11-08 Tuesday 20:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.82): Enable the is_disjoint_from
+	  definition.  In intersection_assign pass true only to y.OK, as x
+	  can be empty.  Update a temporary comment.  In OK use
+	  "unsatisfiable" instead fo "insoluble".  Neaten a comment.
+
+2005-11-08 Tuesday 20:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.36): Take out is_necessarily_closed()
+	  and topology().
+
+2005-11-08 Tuesday 20:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.69): Neaten and correct comments.
+
+2005-11-08 Tuesday 19:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.79), tests/BD_Shape/Makefile.am
+	  (1.24), tests/BD_Shape/minconstraints1.cc (1.1): Corrected a few
+	  bugs in minimized_constraints(); added a new test for it.  The
+	  ascii_dump() and ascii_load() methods now also write/read the
+	  matrix encoding redundancy information.
+
+2005-11-08 Tuesday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/minconstraints1.cc (grids.1): file
+	  minconstraints1.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-08 Tuesday 17:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (grids.17): Align copyright line.
+
+2005-11-08 Tuesday 17:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.68): Document the length_error exceptions
+	  that occur in many constructors.  Mention copying the given
+	  system in the brief descriptions for many constructors.  Improve
+	  formatting and correct typos in a few comments.
+
+2005-11-08 Tuesday 17:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.81): In the copy constructor create
+	  gen_sys NECESSARILY_CLOSED and assert that the given gen_sys was
+	  NECESSARILY_CLOSED.  Move operator= to match the order of method
+	  declarations.
+
+2005-11-08 Tuesday 17:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.35): Move box constructors to follow
+	  other constructors.
+
+2005-11-08 Tuesday 17:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* TODO (grids.15): Complete upper_bound_assign_and_minimize item.
+
+2005-11-08 Tuesday 16:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.78): Corrected a couple of stupid bugs
+	  in the copy constructor and assignment operator of BD_Shape.	A
+	  few useful functions related to the computation of leaders have
+	  been extracted from shortest_path_reduction_assign(), so as to
+	  factor common code in minimized_constraints() and
+	  affine_dimension().  The method minimized_constraints() should
+	  now return a constraint system in minimal form, exploiting
+	  redundancy information. The method constraints() now invokes
+	  minimized_constraints() if the BD_Shape is known to be reduced.
+
+2005-11-08 Tuesday 14:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, addcongruences1.cc (grids.[46,1]): Add
+	  addcongruences1, to test methods which add multiple congruences
+	  to a grid.
+
+2005-11-08 Tuesday 14:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid3.cc (grids.5): Align copyright line.
+
+2005-11-08 Tuesday 14:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addcongruence1.cc (grids.6): Improve title comment.
+	  Add namespace with shared Variables.
+
+2005-11-08 Tuesday 13:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: grid3.cc, Makefile.am, addconstraint1.cc,
+	  addconstraints1.cc (grids.[4,45,1,10]): Add grid3, which tests
+	  construction of grids from constraints.
+
+	  Add addconstraint1, which tests adding single constraints to
+	  grids.  Move the single-constraint adding tests from
+	  addconstraints1 to addconstraint1.
+
+	  Add tests for add_constraints_and_minimize(cs),
+	  add_recycled_constraints(cs) and
+	  add_recycled_constraints_and_minimize(cs) to addconstraints1.
+
+2005-11-08 Tuesday 13:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* TODO, src/Grid.defs.hh, src/Grid_public.cc (grids.[14,67,80]):
+	  Add Grid(cs), add_constraint_and_minimize(c),
+	  add_constraints_and_minimize(cs), add_recycled_constraints(cs)
+	  and add_recycled_constraints_and_minimize(cs).
+
+	  In all of the constraint adding methods allow the addition of any
+	  kind of constraint (instead of only equalities).  In
+	  add_constraints(cs) use Congruence_System(cs) to add the
+	  constraints.
+
+	  Improve some method descriptions.
+
+2005-11-08 Tuesday 12:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage8.cc (1.4), affineimage9.cc (1.4),
+	  generalizedaffineimage14.cc (1.6): Some suspect constraints in
+	  the known_results have been commented out.  They have to be
+	  carefully checked to see of they are really wanted.
+
+2005-11-08 Tuesday 12:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/affineimage10.cc (1.2): Do not be noisy.
+
+2005-11-08 Tuesday 12:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: ch78widening4.cc (1.5),
+	  generalizedaffineimage1.cc (1.6): Avoid lines that are too long.
+	  Removed a few (unnecessary) blank lines.
+
+2005-11-08 Tuesday 12:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.77): Corrected a bug in affine_image()
+	  whereby incorrect bounds for binary constraints could have been
+	  deduced.  In the invariant-checking method OK(), we now also
+	  check that no entry of the dbm has value MINUS_INFINITY; if the
+	  dbm is marked as shortest-path reduced, then we check that the
+	  dbm entry for a non-redundant constraint has a finite value.
+
+2005-11-08 Tuesday 11:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.76): Got rid of the wrong version of
+	  div_round_up().
+
+2005-11-07 Monday 18:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/griddifference1 (grids.2): Remove file added in error
+	  earlier.
+
+2005-11-07 Monday 18:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/maxmin1.cc (grids.1): Add maxmin1, which tests
+	  Grid::maximize(le&, ...) and Grid::minimize(le&, ...).
+
+2005-11-07 Monday 18:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addconstraints1.cc (grids.9): Add test10, for
+	  add_recycled_congruences_and_minimize(cs).
+
+2005-11-07 Monday 18:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Grid_public.cc, TODO (grids.[66,79,13]):
+	  Add add_recycled_congruences_and_minimize(cs).
+
+2005-11-07 Monday 18:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addconstraints1.cc (grids.8): Add test9, for
+	  add_recycled_congruences(cs).
+
+2005-11-07 Monday 18:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* TODO, src/Grid.defs.hh, src/Grid_public.cc (grids.[12,65,78]):
+	  Add add_recycled_congruences(cs).  Add a dimension compatibility
+	  check to add_congruences(cgs).
+
+2005-11-07 Monday 17:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.23), affineimage10.cc (1.1): A
+	  test that was showing a bug in the old implementation of affine
+	  images.
+
+2005-11-07 Monday 17:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.9), BDS_Status.inlines.hh (1.7),
+	  BD_Shape.defs.hh (1.40), BD_Shape.inlines.hh (1.75): A BD_Shape
+	  representation now also carries a dbm matrix of Boolean values,
+	  indicating whether or not the corresponding dbm entry is
+	  redundant.  The new matrix is meaningful only if the BDS_Status
+	  test	   marked_shortest_path_reduced() returns true, otherwise
+	  it is meaningless. Note that a dbm can be shortest-path reduced
+	  only if it is also shortest-path closed.  The redundancy
+	  information is established by shortest_path_reduction_assign()
+	  and is lost as soon as we modify the representation of the
+	  BD_Shape.  That is, currently no effort is done to keep it
+	  up-to-date. Moreover, when we reset the shortest-path closure
+	  flag, then the reduction flag is reset too.
+
+	  Added private helper methods	   add_dbm_constraint() that allow
+	  for the addition of a difference bound constraint without
+	  encoding it into a Constraint object. The method is particularly
+	  used in the computation of affine images.
+
+	  The methods computing affine images and preimages rewritten
+	  (almost) from scratch. (The old implementations, were not
+	  behaving correctly when the denominator was negative or when
+	  considering generalized images).
+
+	  Added a lot of const qualifications; avoided some dbm's
+	  coefficient copies, preferring the use of references instead.
+
+2005-11-07 Monday 16:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.77): Implement add_congruences and
+	  add_congruences_and_minimize via Congruence_System(cs).
+
+2005-11-07 Monday 16:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[27,17]): Add Congruence_System(Constraint_System&).  Move
+	  the normalize_moduli definition into order.
+
+2005-11-07 Monday 16:40  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.53): Don't add nothing to std
+	  namespace.
+
+2005-11-07 Monday 16:30  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.52): Fixed argument order.
+
+2005-11-07 Monday 16:27  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (1.26): Added add_mul and sub_mul.
+
+2005-11-07 Monday 14:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addconstraints1.cc (grids.7): Add test8, for
+	  add_congruences(cs).
+
+2005-11-07 Monday 14:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Grid_public.cc, TODO (grids.[64,76,11]):
+	  Add add_congruences(cs).  In add_congruences_and_minimize(cs) add
+	  the congruences with add_recycled_congruences_and_minimize.
+
+2005-11-07 Monday 12:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.defs.hh (grids.16): Narrow a comment.
+
+2005-11-07 Monday 12:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, griddifference1 (grids.[44,1]): Add
+	  maxmin1, which tests Grid::maximize(le&, ...) and
+	  Grid::minimize(le&, ...).
+
+2005-11-07 Monday 11:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/bounds1.cc (grids.2): Match expected values to updated
+	  method behaviour.
+
+2005-11-07 Monday 11:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid_nonpublic.cc,
+	  TODO (grids.[63,34,38,10]): Separate parameters with semicolons
+	  in descriptions.  Add minimize and maximize methods.	Match the
+	  behaviours of bounds_from_above and bounds_from_below to the
+	  Polyhedron versions.
+
+2005-11-05 Saturday 17:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.176), interfaces/C/ppl_c.h.in (1.55),
+	  interfaces/Prolog/Prolog_interface.dox (1.135),
+	  src/BD_Shape.defs.hh (1.39), src/Constraint_System.defs.hh
+	  (1.18), src/Determinate.defs.hh (1.58),
+	  src/Polyhedra_Powerset.defs.hh (1.25), src/Polyhedron.defs.hh
+	  (1.284): In definitions.doc we were bricolating our own
+	  sectioning with <B> and </B> tags.  Started using Doxygen's
+	  \subsection command.	Started using label names that are easily
+	  obtained from the section or subsection title.  This is less
+	  likely to generate conflicts, but a better scheme must be devised
+	  that can work across the entire library's documentation.
+
+2005-11-05 Saturday 08:59  Abramo Bagnara
+
+	* tests/BD_Shape/run_tests (1.7): Remove dirty marker only after
+	  all is clean.
+
+2005-11-05 Saturday 08:30  Abramo Bagnara
+
+	* src/: Float.defs.hh (1.14), checked_float.inlines.hh (1.51):
+	  *_BITS constants are unsigned.
+
+2005-11-04 Friday 22:22  Abramo Bagnara
+
+	* tests/BD_Shape/run_tests (1.6): Avoid initial make clean.
+
+2005-11-04 Friday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.2): Fixed a copy and paste mistake.
+
+2005-11-04 Friday 21:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.29), BD_Shape/run_tests (1.5): Do not
+	  define TBD_Shape: define BD_SHAPE_INSTANCE instead.
+
+2005-11-04 Friday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.22), closure1.cc (1.1): Draft
+	  test to check closure more seriously (it does not work as
+	  expected at the moment).
+
+2005-11-04 Friday 14:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.74): Old code for div_round_up()
+	  temporarily restored, since some (wrong) tests depend on it.
+
+2005-11-04 Friday 13:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.cc (grids.1): file Float.cc was added on branch grids
+	  on 2005-11-23 13:24:06 +0000
+
+2005-11-04 Friday 13:58  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.36), Float.cc (1.2),
+	  Float.defs.hh (1.13), Float.inlines.hh (1.14),
+	  Native_Integer.defs.hh (1.14), Native_Integer.inlines.hh (1.15),
+	  checked_ext.inlines.hh (1.23), checked_float.inlines.hh (1.50),
+	  checked_int.inlines.hh (1.41), float.types.hh (1.12): Fixed use
+	  of native types also when identical to others.
+
+2005-11-04 Friday 12:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.73): Reimplemented div_round_up().
+
+2005-11-04 Friday 11:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/bounded1.cc (grids.2): Add test12, in which every
+	  generator is the same point.
+
+2005-11-04 Friday 11:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.75): In is_bounded use the generator
+	  system in any form.
+
+2005-11-04 Friday 11:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/topclosed1.cc (grids.3): Take out the find_variation
+	  directive.
+
+2005-11-04 Friday 11:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, bounds1.cc (grids.[43,1]): Add bounds1,
+	  which tests Grid::bounds_from_above and Grid::bounds_from_below.
+
+2005-11-04 Friday 11:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid_nonpublic.cc,
+	  TODO (grids.[62,33,37,9]): Add methods bounds, bounds_from_above
+	  and bounds_from_below.  Reorder a few method definitions.
+
+2005-11-04 Friday 07:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.175): Removed some spurious percent signs.
+
+2005-11-03 Thursday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.158): Begging for a coding guideline as far as the use of
+	  (checked) arithmetic functions is concerned.
+
+2005-11-03 Thursday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: definitions.dox (1.174), ppl.sty (1.22): Added a draft new
+	  section on "Integers Represented by Floating Point Numbers".
+	  This contains results that are needed to prove the correctness of
+	  our implementation of the GCD and LCM operations.  (Joint work
+	  with Alessandro Zaccagnini and Abramo Bagnara.)
+
+2005-11-03 Thursday 14:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (1.31): Be more robust in the
+	  definition of mp_size_field_t.
+
+2005-11-03 Thursday 14:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.196): Added a safeguard against possible changes
+	  in the implementation of GMP.
+
+2005-11-03 Thursday 10:58  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (1.30): mp_size_t is not the size of
+	  size field.
+
+2005-11-03 Thursday 08:06  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.49): Avoid useless #if
+
+2005-11-02 Wednesday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.7): Added missing access control
+	  specification.
+
+2005-11-02 Wednesday 22:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Float.defs.hh (1.12), Polyhedron_nonpublic.cc (1.57):
+	  Spurious semicolons removed.
+
+2005-11-02 Wednesday 21:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* TODO (grids.8): Complete operation is_bounded.
+
+2005-11-02 Wednesday 21:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, bounded1.cc (grids.[42,1]): Add
+	  bounded1, which tests Grid::is_bounded.
+
+2005-11-02 Wednesday 21:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_public.cc (grids.[61,74]): Add method
+	  is_bounded.
+
+2005-11-02 Wednesday 20:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* TODO (grids.7): Complete operation affine_dimension.
+
+2005-11-02 Wednesday 20:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[60,36]): To
+	  normalize_divisors(gs,div) add third argument first_point, which
+	  implies that all points in gs have the same divisor.	Use this
+	  argument in normalize_divisors(gs,gs).
+
+2005-11-02 Wednesday 19:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.73): In is_topologically_closed search
+	  for a single parameter or proper congruence, instead of checking
+	  the counts of these.
+
+2005-11-02 Wednesday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.4): The long double incarnation of
+	  checked numbers is still not ready: do not test with it for the
+	  time being.
+
+2005-11-02 Wednesday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Float.cc (1.1), Makefile.am (1.128): Obey verse 9.4.2.4 of
+	  the C++ standard: "The [static const data] member shall still be
+	  defined in a namespace scope if it is used in the program and the
+	  namespace scope definition shall not contain an initializer."
+
+2005-11-02 Wednesday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/float.types.hh (1.11): Do not define symbols in the global
+	  namespace.
+
+2005-11-02 Wednesday 11:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, affinedim1.cc (grids.[41,1]): Add
+	  affinedim1, which tests Grid::affine_dimension().
+
+2005-11-02 Wednesday 11:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.26): In increase_space_dimension
+	  only add columns when more columns are requested (instead of
+	  always ensuring that the modulus and constant term column exist).
+
+2005-11-02 Wednesday 11:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.72): Enable and implement method
+	  affine_dimension.  In minimized_congruences and
+	  minimized_generators minimize only the required system.  In
+	  generators always set the topology to NECESSARILY_CLOSED.
+
+2005-11-02 Wednesday 11:22  Abramo Bagnara
+
+	* src/Float.defs.hh (1.11): Fixed typo.
+
+2005-11-01 Tuesday 18:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* TODO (grids.6): Complete operators is_topologally_closed and
+	  shrink_bounding_box.
+
+2005-11-01 Tuesday 18:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/topclosed1.cc (grids.2): Replace function
+	  topclosed1_equal with copy_compare (in ppl_test.hh).	Correct
+	  error messages.
+
+2005-11-01 Tuesday 18:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/ppl_test.hh (grids.13): Add function copy_compare(Grid&,
+	  Grid&).
+
+2005-11-01 Tuesday 18:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, pointed1.cc (grids.[40,1]): Add
+	  pointed1, which tests Grid::is_pointed().
+
+2005-11-01 Tuesday 18:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_public.cc, Grid.defs.hh (grids.[71,59]): Add the
+	  definition and improve the doc description of is_pointed.
+
+2005-11-01 Tuesday 14:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, topclosed1.cc (grids.[39,1]): Add
+	  topclosed1, which tests Grid::is_topologically_closed().
+
+2005-11-01 Tuesday 14:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.70): Implement method
+	  is_topologically_closed.
+
+2005-11-01 Tuesday 14:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addgenerator1.cc (grids.11): Add test8, in which the
+	  added generator has a divisor.  Only call find_variation on the
+	  grid under test.
+
+2005-11-01 Tuesday 14:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[58,35]): In
+	  normalize_divisors(gs,coeff) read the initial divisor of gs into
+	  a temporary before the divisor modifying loop.  In the same loop
+	  only multiply the generator when the factor is greater than one.
+	  Improve the description of this method, and improve slightly the
+	  descriptions of a few others.
+
+	  In normalize_divisors(gs,gs) access the divisor via the array
+	  operator instead of the divisor method.
+
+2005-11-01 Tuesday 14:03  Abramo Bagnara
+
+	* src/: Float.defs.hh (1.10), checked_float.inlines.hh (1.48):
+	  Simpler overflow return.
+
+2005-11-01 Tuesday 14:02  Abramo Bagnara
+
+	* src/: checked_mpq.inlines.hh (1.25), checked_mpz.inlines.hh
+	  (1.29): Simplified assign when available in lower level class.
+
+2005-11-01 Tuesday 01:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_ext.inlines.hh (1.22): Corrected a bug in sub_ext()
+	  whereby subtracting any finite value from PLUS_INFINITY resulted
+	  in MINUS_INFINITY (and vice versa).
+
+2005-11-01 Tuesday 01:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.cc (1.8): Minor improvements in the exception
+	  messages.
+
+2005-10-31 Monday 22:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.3): Test also with long doubles.
+
+2005-10-31 Monday 22:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.13): Spurious redeclaration removed.
+
+2005-10-31 Monday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.12): Spurious incomplete statement
+	  removed.
+
+2005-10-31 Monday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.11): Wrong syntax for static_cast fixed.
+
+2005-10-31 Monday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.47): An instance of float127_t
+	  changed to float128_t.
+
+2005-10-31 Monday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Float.defs.hh (1.9), Float.inlines.hh (1.10),
+	  float.types.hh (1.10): The <stdint.h> header file was included
+	  unnecessarily in float.types.hh and not included in Float.defs.hh
+	  and Float.inlines.hh.
+
+2005-10-31 Monday 20:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.28): Define the utility type `long_double'.
+
+2005-10-31 Monday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.127): Added the dependency of ppl_install.hh
+	  on $(INCLUDE_FILES).	Reformatted some rules for consistency.
+
+2005-10-31 Monday 20:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/float.types.hh (1.9): Define FLOAT96_TYPE or FLOAT128_TYPE
+	  depending on SIZEOF_LONG_DOUBLE.  Definition of float128_t fixed.
+
+2005-10-31 Monday 17:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.21): Last change was only
+	  half-made: completed.
+
+2005-10-31 Monday 13:59  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.35), Checked_Number.inlines.hh
+	  (1.40): Added copy constructor and operator=.
+
+2005-10-31 Monday 13:58  Abramo Bagnara
+
+	* src/: checked.defs.hh (1.26), checked.inlines.hh (1.26),
+	  checked_float.inlines.hh (1.46), checked_int.inlines.hh (1.40),
+	  checked_mpq.inlines.hh (1.24), checked_mpz.inlines.hh (1.28):
+	  Added copy function. Fixed float output.
+
+2005-10-31 Monday 07:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.20): The `run_tests' script is now
+	  distributed.
+
+2005-10-30 Sunday 18:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: addconstraints1.cc, addspacedims1.cc,
+	  addspacedims2.cc, concatenate1.cc, congruence1.cc, contains1.cc,
+	  contains2.cc, coveringbox2.cc, griddifference1.cc,
+	  intersection1.cc, intersection2.cc, isuniverse1.cc, join2.cc,
+	  join3.cc, limitedextrapolation1.cc, removespacedims1.cc,
+	  removespacedims2.cc, timeelapse1.cc, widening1.cc
+	  (grids.[6,9,6,3,7,3,2,4,6,5,6,4,5,2,4,6,5,4,6]): Make the title
+	  comments of the tests consistent.
+
+2005-10-30 Sunday 18:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[57,32]): Update
+	  get_covering_box to work directly with any form of generator
+	  system and to only ever attempt to set each bound once.
+
+2005-10-30 Sunday 00:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/coveringbox2.cc (grids.3): Add test14 and test15, to
+	  test that fractions are reduced before being assigned to
+	  intervals.
+
+2005-10-30 Sunday 00:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/boundingbox2.cc (grids.2): Improve comment slightly.
+
+2005-10-30 Sunday 00:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.inlines.hh, Grid.defs.hh (grids.[31,56]): In
+	  get_covering_box reduce the fraction before assigning it to the
+	  interval.
+
+2005-10-29 Saturday 20:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/coveringbox2.cc (grids.2): Name variables
+	  consistently, improve some comments and add test13 (in which an
+	  empty grid is defined by congruences).
+
+2005-10-29 Saturday 20:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/boundingbox1.cc (grids.7): Note that boundingbox2 also
+	  tests the constructor under test.
+
+2005-10-29 Saturday 20:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, boundingbox2.cc (grids.[38,1]): Add
+	  boundingbox2, which tests shrink_bounding_box(Box&).
+
+2005-10-29 Saturday 20:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[55,30]): Add
+	  shrink_bounding_box(Box&).  Correct two comments in
+	  get_covering_box.  Declare method is_topologically_closed.
+
+2005-10-29 Saturday 14:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.2): Several improvements.
+
+2005-10-29 Saturday 14:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.27): No longer define TBD_Shape.
+
+2005-10-29 Saturday 12:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.19), run_tests (1.1): A first
+	  attempt at testing all the instantiations.
+
+2005-10-29 Saturday 09:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.38), BD_Shape.inlines.hh (1.72): In the
+	  limited widening operators, we now avoid having to decode twice
+	  the limiting constraints (joint work with E. Mazzi).	In several
+	  places, upward loop iteration replaced by a downward one.
+
+2005-10-28 Friday 15:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (grids.5): Added a list of TODO items for the grids branch.
+
+2005-10-28 Friday 12:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.29): Calculate the proper congruence
+	  coefficients in the covering box constructor via the GCD of the
+	  divisors, instead of getting the LCM of the divisors (with
+	  lcm_assign) and then repeating parts of this LCM calculation.
+	  Given that the divisors are known to be positive, this also saves
+	  the absolute value calculations that would have been performed in
+	  lcm_assign.
+
+2005-10-27 Thursday 18:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, boundingbox1.cc, coveringbox1.cc,
+	  coveringbox2.cc (grids.[37,6,7,1]): Add coveringbox2.  Move the
+	  coveringbox1 tests into coveringbox2, and move the boundingbox1
+	  tests into coveringbox1.  Fill boundingbox1 with tests of the
+	  bounding box constructor.
+
+2005-10-27 Thursday 18:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[54,28]): Add a
+	  bounding box constructor.  In the covering box constructor move
+	  the closed bound checks to come before the empty test.
+
+2005-10-27 Thursday 12:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.53): Add the open bound behaviour to the
+	  description of the covering box constructor.
+
+2005-10-27 Thursday 12:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/boundingbox1.cc (grids.5): Add test11, in which a
+	  bound in the box is open.
+
+2005-10-27 Thursday 12:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.27): In the covering box constructor
+	  throw an exception if any bound is open.
+
+2005-10-26 Wednesday 17:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Grid.inlines.hh,
+	  tests/Grid/boundingbox1.cc, tests/Grid/coveringbox1.cc
+	  (grids.[52,26,4,6]): Use From_Covering_Box instead of
+	  From_Bounding_Box in the Grid from box constructor.
+
+2005-10-26 Wednesday 17:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/globals.defs.hh (grids.4): Add tag class From_Covering_Box.
+
+2005-10-26 Wednesday 16:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.51): Improve the covering box constructor
+	  description.	Add the methods required of the box class to the
+	  get_covering_box description.
+
+2005-10-26 Wednesday 15:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.69): In OK, assert that the reduced
+	  temporary generator system defines a grid that contains points.
+
+2005-10-26 Wednesday 15:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_minimize.cc (grids.20): In the generator system minimize
+	  method assert that, after being reduced, the generator system
+	  defines a grid that contains points, instead of catering for an
+	  empty resulting grid.  Take out the Linear_Row.defs.hh include.
+	  Correct the title comment.
+
+2005-10-26 Wednesday 15:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.25): In get_covering_box assert that,
+	  after being reduced, the generator system defines a grid that
+	  contains points, instead of catering for an empty resulting grid.
+
+2005-10-26 Wednesday 15:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Certificate.cc (grids.5): Simplify the
+	  Grid_Certificate(cgr) assertion that after being reduced the
+	  generator system defines a grid that contains points.
+
+2005-10-26 Wednesday 12:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/boundingbox1.cc (grids.3): Add test10, where the box
+	  has a dimension open only from below.
+
+2005-10-26 Wednesday 12:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.50): Improve the descriptions of the box
+	  constructor and method get_covering_box.
+
+2005-10-26 Wednesday 12:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.24): In the Grid covering box
+	  constructor add an equality for each interval that is bounded
+	  only from below.
+
+2005-10-26 Wednesday 11:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/coveringbox1.cc (grids.5): Use Bounding_Box instead of
+	  BBox.  Add a temporary Bounding_Box operator==.  Rename box to
+	  box1.  In every test add a further check which uses the Grid
+	  covering box constructor.  Always use closed bounds.
+
+2005-10-26 Wednesday 11:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/boundingbox1.cc (grids.2): Match the expected values
+	  to the updated behaviour of the covering box constructor.
+
+2005-10-26 Wednesday 11:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.23): Update the covering box
+	  constructor to handle universe, empty and half open intervals in
+	  ways that match the behaviour of get_covering_box.  Always use
+	  closed bounds.
+
+2005-10-25 Tuesday 17:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.49): In the get_covering_box description
+	  note that the lower bounds are as close as possible to the
+	  origin, and add information about the calling guarantees.
+
+2005-10-25 Tuesday 14:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/coveringbox1.cc (grids.4): Add test12, in which all
+	  the points have the same value in one of the dimensions.  Update
+	  the expected values in test2 so that the lower bounds are as
+	  close as possible to the origin.  Add the dimension in the test11
+	  description.
+
+2005-10-25 Tuesday 14:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* configure.ac, doc/Makefile.am, src/Checked_Number.defs.hh,
+	  src/Coefficient.cc, src/Coefficient.defs.hh,
+	  src/Grid_conversion.cc, src/Grid_minimize.cc,
+	  src/Grid_nonpublic.cc, src/Grid_simplify.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/coveringbox1.cc
+	  (grids.[7,5,7,3,3,21,19,34,32,6,3]): Revert files accidentally
+	  included in last change.
+
+2005-10-25 Tuesday 13:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* configure.ac, doc/Makefile.am, src/Checked_Number.defs.hh,
+	  src/Coefficient.cc, src/Coefficient.defs.hh, src/Grid.inlines.hh,
+	  src/Grid_conversion.cc, src/Grid_minimize.cc,
+	  src/Grid_nonpublic.cc, src/Grid_simplify.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/coveringbox1.cc
+	  (grids.[6,4,6,2,2,22,20,18,33,31,5,2]): In get_covering_box
+	  rename gcds to interval_sizes and update the algorithm to always
+	  use the smallest possible absolute values for the lower bounds.
+
+2005-10-25 Tuesday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.71): Forgot to close namespace.
+
+2005-10-25 Tuesday 10:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.37), BD_Shape.inlines.hh (1.70): Added
+	  a new function extract_bounded_difference() to factorize repeated
+	  code for decoding a constraint.  A lot of repeated code also
+	  factorized in method relation_with().  Added a private method
+	  BD_Shape<T>::get_limiting_constraints() to be used in the
+	  implementations of limited widening operators.  Prefer assign()
+	  to the direct assignment operator when assigning zero.  Removed a
+	  couple of improper usages of the Coefficient_traits template.
+
+2005-10-24 Monday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/affinedimension1.cc (grids.1): file
+	  affinedimension1.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-10-24 Monday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.36), src/BD_Shape.inlines.hh (1.69),
+	  tests/BD_Shape/Makefile.am (1.18),
+	  tests/BD_Shape/affinedimension1.cc (1.1): Added a first
+	  implementation of new method dimension_type
+	  BD_Shape<T>::affine_dimension() const.  The new program
+	  affinedimension1.cc containts some tests for it.  (Joint work
+	  with Elena Mazzi.)
+
+2005-10-24 Monday 14:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.35), BD_Shape.inlines.hh (1.68),
+	  DB_Matrix.defs.hh (1.6), DB_Matrix.inlines.hh (1.6),
+	  DB_Row.inlines.hh (1.8), checked.defs.hh (1.25): Removed a lot of
+	  commented out stuff from DB_Row.inlines.hh.  When creating DB_Row
+	  and DB_Matrix objects, the coefficients are now initialized to
+	  the value PLUS_INFINITY.  DB_Matrix no longer has unused (and
+	  unimplemented) methods space_dimensions() and
+	  add_rows_and_columns().  BD_Shape no longer needs the method
+	  init().  In the BD_Shape implementation, added a couple of
+	  utility function that help in factoring common code.	In methods
+	  adding space dimensions, take into accoount that the newly added
+	  coefficients are already initialized to PLUS_INFINITY.  Added a
+	  lot of missing const qualifications.	The
+	  shortest_path_reduction_assign() method has been almost
+	  reimplemented from scratch: it should now be easier to move
+	  towards an implementation where shortest-path closure is not
+	  compromised by reduction.  Several comments improved.
+
+2005-10-24 Monday 14:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/DB_Row.defs.hh (1.10): Some comments reworded. An unused
+	  preprocessor variable removed.
+
+2005-10-24 Monday 14:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.140), src/Constraint_System.defs.hh
+	  (1.17), src/globals.types.hh (1.2), src/simplex.cc (1.28),
+	  tests/Polyhedron/primalsimplex1.cc (1.2),
+	  tests/Polyhedron/primalsimplex2.cc (1.2): Using a new enumerated
+	  type Optimization_Kind to specify whether the primal simplex
+	  algorithm should maximize or minimize the object function.
+
+2005-10-24 Monday 12:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* configure.ac (1.195): Set text_md5sum, to complete last change.
+
+2005-10-24 Monday 11:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* configure.ac (1.194): Take out the attempt at checking for an
+	  md5sum -t option.
+
+2005-10-22 Saturday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_sicstus_prolog.m4 (grids.1): file
+	  ac_check_sicstus_prolog.m4 was added on branch grids on
+	  2005-11-23 13:24:06 +0000
+
+2005-10-22 Saturday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_xsb_prolog.m4 (grids.1): file ac_check_xsb_prolog.m4
+	  was added on branch grids on 2005-11-23 13:24:06 +0000
+
+2005-10-22 Saturday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.193), interfaces/Prolog/SICStus/Makefile.am
+	  (1.57), interfaces/Prolog/SWI/Makefile.am (1.54),
+	  interfaces/Prolog/XSB/Makefile.am (1.37),
+	  m4/ac_check_sicstus_prolog.m4 (1.3), m4/ac_check_swi_prolog.m4
+	  (1.6), m4/ac_check_xsb_prolog.m4 (1.1): Treat SICStus, SWI and
+	  XSB Prolog in a uniform way.
+
+2005-10-22 Saturday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.163): Added blank lines to help readability.
+
+2005-10-22 Saturday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_sicstus_prolog.m4 (1.2): Make sure things work even
+	  if `sicstus' is a symbolic link.
+
+2005-10-21 Friday 21:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, coveringbox1.cc (grids.[36,1]): Add
+	  coveringbox1, which tests get_covering_box.
+
+2005-10-21 Friday 21:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Certificate.cc (grids.4): Finalise calculation of number
+	  of congruences from number of generators.
+
+2005-10-21 Friday 21:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[48,21]): Add template
+	  get_covering_box.
+
+2005-10-21 Friday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.192), interfaces/Prolog/SICStus/Makefile.am
+	  (1.56), m4/ac_check_sicstus_prolog.m4 (1.1): New machinery to
+	  automatically detect the location where SICStus Prolog was
+	  installed.  Now, the only requirement imposed on the user is to
+	  have `sicstus' reachable from the shell's PATH.
+
+2005-10-21 Friday 16:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.191): Version number bumped.
+
+2005-10-21 Friday 16:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.5): Comment fixed.
+
+2005-10-21 Friday 14:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.defs.hh (1.24): Added a couple of missing
+	  declarations of template specializations, that were causing an
+	  error to be reported by the Intel compiler.
+
+2005-10-20 Thursday 11:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.34): The Doxygen documentation is now
+	  (almost) formatted according to STANDARDS.
+
+2005-10-20 Thursday 10:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BDS_Status.idefs.hh (1.8), src/BDS_Status.inlines.hh (1.6),
+	  src/BD_Shape.defs.hh (1.33), src/BD_Shape.inlines.hh (1.67),
+	  tests/BD_Shape/ascii_dump_load2.cc (1.5): Started cleaning up the
+	  code for BD_Shape<T>.  The entailment clsoure method ofr BDSs is
+	  shortest-path closure (transitive closure is another thing):
+	  method names and status flags changed accordingly.  Now avoiding
+	  the (almost) useless initialization of BDS in the constructor
+	  BD_Shape(const Generator_System& gs); Source code in file
+	  BD_Shape.inlines.hh reordered so that all inline
+	  methods/functions come before the non-inline method/function
+	  templates.
+
+2005-10-20 Thursday 10:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/boundingbox1.cc (1.6): Added another test for
+	  shrinking a bounding box in polynomial time when there are
+	  redundant constraints.
+
+2005-10-19 Wednesday 17:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.139), ppl_c.h.in (1.54): Public method
+	  Constraint_System::has_strict_inequalities() is now accessible
+	  even from the C interface.
+
+2005-10-19 Wednesday 16:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.162): Method Constraint_System::has_strict_inequalities()
+	  is now public.
+
+2005-10-19 Wednesday 16:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.27): The primal_simplex() is now also
+	  applicable to an NNC constraint system containing no strict
+	  inequality constraints.
+
+2005-10-19 Wednesday 16:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.defs.hh (1.16): Method
+	  has_strict_inequalities() is no longer private.
+
+2005-10-19 Wednesday 16:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.32): Prefer qualified access
+	  to class template member data and functions.	Removed a wrong
+	  const qualification is concatenate_assign().
+
+2005-10-19 Wednesday 12:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.cc (1.13): Added a missing const qualifier.
+
+2005-10-18 Tuesday 23:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/numberinput1.cc (1.12): Include cstdlib.
+
+2005-10-18 Tuesday 23:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/numberinput1.cc (1.11): Add a test where the
+	  parsing fails and whitespace follows the parsed number.
+
+2005-10-18 Tuesday 23:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/numberinput1.cc (1.10): Check for expected
+	  spaces in residuals.	Always exit with 1 on error.
+
+2005-10-18 Tuesday 20:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/numberinput1.cc (1.9): Add three tests with
+	  trailing whitespace.
+
+2005-10-17 Monday 09:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.59), devref.doxyconf-latex.in
+	  (1.3), user.doxyconf-html.in (1.31), user.doxyconf-latex.in
+	  (1.3): In the devref manuals, also produce documentation for
+	  Scalar_Products.
+
+2005-10-17 Monday 09:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.126): Do not forget Scalar_Products.types.hh.
+
+2005-10-16 Sunday 17:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.109), Constraint_System.cc (1.12),
+	  Generator.defs.hh (1.111), Generator_System.cc (1.13),
+	  Linear_Expression.defs.hh (1.13), Linear_System.cc (1.30),
+	  Makefile.am (1.125), Polyhedron_nonpublic.cc (1.56),
+	  Polyhedron_public.cc (1.67), Polyhedron_widenings.cc (1.51),
+	  Scalar_Products.cc (1.1), Scalar_Products.defs.hh (1.1),
+	  Scalar_Products.inlines.hh (1.1), Scalar_Products.types.hh (1.1),
+	  conversion.cc (1.75), scalar_products.cc (1.3),
+	  scalar_products.defs.hh (1.5), scalar_products.inlines.hh (1.6),
+	  scalar_products.types.hh (1.2): Files "scalar_products.*" renamed
+	  as "Scalar_Products.*".
+
+2005-10-16 Sunday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.defs.hh (grids.1): file
+	  Scalar_Products.defs.hh was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-10-16 Sunday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.inlines.hh (grids.1): file
+	  Scalar_Products.inlines.hh was added on branch grids on
+	  2005-11-23 13:24:06 +0000
+
+2005-10-16 Sunday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.types.hh (grids.1): file
+	  Scalar_Products.types.hh was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-10-15 Saturday 15:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.161): Provide better visual separation for "displayed"
+	  material.
+
+2005-10-15 Saturday 15:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.160): Ellipsis has a well-defined meaning in C++: avoid
+	  using it to signify "parameters omitted".
+
+2005-10-15 Saturday 11:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.20): Updated.
+
+2005-10-15 Saturday 09:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint_System.defs.hh (1.15),
+	  Constraint_System.inlines.hh (1.6), Generator_System.defs.hh
+	  (1.10), Generator_System.inlines.hh (1.5): Classes
+	  Constraint_System and Generator_System now have a private method
+	  simplify() that calls the new method of class Linear_System. In
+	  the case of generators, the wrapper method also removes any
+	  invalid rays or lines that may have been generated.
+
+2005-10-15 Saturday 09:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.inlines.hh (1.57), Generator_System.cc (1.12): Do
+	  exploit new method Generator::is_line_or_ray().
+
+2005-10-15 Saturday 09:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.37): Corrected a dependency bug:
+	  test nnc_boudningbox5 was compiling source file boundingbox3.cc.
+
+2005-10-14 Friday 19:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_System.cc (1.29), Linear_System.defs.hh (1.18),
+	  Polyhedron.inlines.hh (1.124), Polyhedron_public.cc (1.66),
+	  simplify.cc (1.44): Linear_System methods gauss() and
+	  back_substitute() modified so as to assert all the known
+	  preconditions. Method gauss() also modified so as to receive as
+	  input the number of lines/equalities on which it should be
+	  applied. Added a new method Linear_System::simplify() that takes
+	  care of appropriately combine the two methods above when needed,
+	  so as to ensure that all preconditions are met. The new method is
+	  now used in the implementation of
+	  Polyhedron::shrink_bounding_box() and Polyhedron::OK().
+
+2005-10-14 Friday 13:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked.cc (1.9): Comment every function.  Slightly improve
+	  the formatting in parse_number and input_mpq.
+
+	  In parse_number1
+
+	   - move the error handling to the first error occurrence (this
+	  ensures
+	     that variables are always initialised at the destinations of
+	  the
+	     error jumps)
+
+	   - capatilise the second 'n' in the "inf" check
+
+	   - make the '+' case when parsing strings like "+inf" fall
+	  through to
+	     the "inf" parsing, instead of jumping to it
+
+	   - after the initial sign-and-symbol-parsing switch statement,
+	  split
+	     the validity check on the current character into two checks,
+	  one of
+	     which is already present
+
+	   - use only variable c when parsing a leading "0x", instead of
+	  using a
+	     second variable (d)
+
+	   - convert the parsing state machine into a series of loops, to
+	  save
+	     the state interpretation overhead and to lower the number of
+	  jumps
+	     and the size of the code
+
+	   - manually inline the small relevant portion of get_digit at the
+	     digit validity checks which call get_digit with a base of ten.
+
+2005-10-14 Friday 11:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.65): Prefer "unsatisfiable" to
+	  "insoluble".
+
+2005-10-14 Friday 09:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/scalar_products.types.hh (1.1): Put under CVS control.
+
+2005-10-13 Thursday 10:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.108), Constraint_System.cc (1.11),
+	  Generator.defs.hh (1.110), Generator.inlines.hh (1.56),
+	  Generator_System.cc (1.11), Generator_System.defs.hh (1.9),
+	  Linear_Expression.defs.hh (1.12), Linear_System.cc (1.28),
+	  Polyhedron_chdims.cc (1.34), Polyhedron_nonpublic.cc (1.55),
+	  Polyhedron_public.cc (1.64), Polyhedron_widenings.cc (1.50),
+	  conversion.cc (1.74), scalar_products.cc (1.2),
+	  scalar_products.defs.hh (1.4), scalar_products.inlines.hh (1.5):
+	  Added class Scalar_Products gathering all scalar product
+	  functions defined so far. Also added class
+	  Topology_Adjusted_Scalar_Product_Sign, implementing a function
+	  object choosing the correct scalar product function for the given
+	  context. Using these classes to simplify friend declarations and
+	  to allow for the removal of some friend declarations. In
+	  particular:  - Constraint_System is no longer a friend of
+	  Generator;  - Generator_System is no longer a friend of
+	  Constraint.  Also added a few missing const qualifications to
+	  local variables.
+
+2005-10-12 Wednesday 17:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.159), TODO (1.157): Updated for the with_token changes to
+	  the Prolog interface.
+
+2005-10-12 Wednesday 17:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.134): Documentation for
+	  the Prolog widening/extrapolation "with_tokens" predicates
+	  revised to match the changes to the actual implementation.
+	  General improvements to the descriptions of all the Prolog
+	  widening/extrapolation predicates.
+
+2005-10-11 Tuesday 12:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.163), Ciao/ciao_pl_check.pl
+	  (1.14), Ciao/ppl_ciao.pl (1.82), GNU/ppl_gprolog.pl (1.54),
+	  SICStus/ppl_sicstus_sd.cc (1.80), SWI/ppl_swiprolog.cc (1.104),
+	  XSB/ppl_xsb.H (1.42), XSB/ppl_xsb.cc (1.71), XSB/xsb_pl_check.P
+	  (1.19), YAP/ppl_yap.cc (1.98), tests/pl_check.pl (1.12): Modified
+	  the "with_token" widening and extrapolation predicates to be
+	  "with_tokens" where each predicate has an extra argument (ie
+	  there are two arguments for the token numbers).
+
+	  All predicates require the number of available tokens as input in
+	  the first token argument and unify the second of the token
+	  arguments with the number of tokens available after the
+	  widening/extrapolation operation.
+
+	  pl_check.pl now tests the modified predicates and their possible
+	  exceptions.
+
+2005-10-11 Tuesday 12:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.9): Help message now says something about
+	  the available options.
+
+2005-10-11 Tuesday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, STANDARDS, TODO, config.guess, configure.ac,
+	  Watchdog/config.guess, Watchdog/src/Makefile.am,
+	  Watchdog/src/Makefile.in, Watchdog/utils/Makefile.am,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/ppl_lpsol.c,
+	  doc/Makefile.am, doc/README.doc,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/devref.tex,
+	  doc/user-browse.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, doc/user.tex,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.types.hh, src/Generator.cc,
+	  src/Generator.defs.hh, src/H79_Certificate.defs.hh,
+	  src/H79_Certificate.inlines.hh, src/Linear_System.cc,
+	  src/Makefile.am, src/Native_Integer.defs.hh,
+	  src/Native_Integer.inlines.hh, src/Polyhedra_Powerset.cc,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_public.cc, src/checked_float.inlines.hh,
+	  src/minimize.cc, src/simplex.cc,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhz03widening1.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/numberinput1.cc,
+	  tests/Polyhedron/polypowerset1.cc, tests/Polyhedron/powerset1.cc,
+	  tests/Polyhedron/primalsimplex2.cc, utils/Makefile.am
+	  (grids.[4,5,4,3,5,3,2,2,3,4,4,3,2,4,4,4,1,1,3,3,3,1,1,4,2,3,5,5,5,5,4,6,6,2,4,8,3,2,4,9,4,5,2,5,6,4,6,6,2,4,2,5,1,1,9,2,2,1,1,3]):
+	  Fifth merge from main trunk.
+
+2005-10-11 Tuesday 09:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.H (1.41): Reflect the
+	  reorganization of the Watchdog directory.
+
+2005-10-10 Monday 17:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/numberinput1.cc (1.8): Add two hexadecimal tests
+	  where parsing will stop after the "0x".  Use valid digits in the
+	  exponent of "3^^e3" (i.e. use "3^^e2").
+
+2005-10-09 Sunday 08:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.97): Comparisons with
+	  LONG_MAX fixed.
+
+2005-10-08 Saturday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.26): Avoid requesting the inlining of complex
+	  functions.
+
+2005-10-08 Saturday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.96): YAP should now support
+	  unlimited precision integers.  Some FIXMEs dealt with, but had to
+	  add one because of what looks like a bug in YAP.
+
+2005-10-08 Saturday 13:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.63): Use
+	  Constraint::inhomogeneous_term() instead of c[0] when
+	  appropriate.	Moved a useful comment outside assertion-like code,
+	  because the comment is relevant even when assertions are
+	  disabled.  When invoking scalar_product_sign(), the first
+	  argument should be the constraint and the second the generator
+	  (not the other way round).  Several occurrences of	 if
+	  (var_space_dim <= expr_space_dim && expr[var_space_dim] != 0) {
+	  replaced by the shorter (and as efficient as)     if
+	  (expr.coefficient(var) != 0) { One use of
+	  Coefficient_traits::const_reference inside a function body
+	  definition replaced by const Cefficient&.
+
+2005-10-08 Saturday 09:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.cc (1.4), Polyhedra_Powerset.inlines.hh
+	  (1.31), checked_float.inlines.hh (1.45): Comments revised.  Refer
+	  to GCC's Bugzilla when talking about GCC bugs.  GCC (the GNU
+	  Compiler Collection) is written with all capitals.
+
+2005-10-08 Saturday 08:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.defs.hh (1.23): To work around a bug in
+	  GCC 3.3.3, we temporarily make all Polyhedra_Powerset's friends
+	  of each other.
+
+2005-10-08 Saturday 07:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.25): Stop being noisy.
+
+2005-10-07 Friday 22:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.27): FIXME resolved.
+
+2005-10-07 Friday 18:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/numberinput1.cc (1.7): Update temporary
+	  comments.  Increase stack space if large exponents are being
+	  used.  Add directive TEST_LARGE_EXPONENTS, which controls the
+	  inclusion of tests with large exponents.
+
+2005-10-07 Friday 14:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.cc (1.3), Polyhedra_Powerset.inlines.hh
+	  (1.30): Applied workaround to a gcc bug affecting version 3.3.3.
+	  See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+
+2005-10-06 Thursday 18:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.19): In the first line comment,
+	  mentioned that the simplex solver can be used too.
+
+2005-10-06 Thursday 18:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.46): Too long line has been split.
+
+2005-10-06 Thursday 18:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.53): The Linear Programming demo is
+	  now in demos/ppl_lpsol/.
+
+2005-10-06 Thursday 17:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/numberinput1.cc (1.6): Improve formatting and
+	  messages slightly.  Take out the "fix" macro.  Group tests into
+	  functions.  Add tests which expect characters trailing the
+	  number.  Add a test of the exponent size limit.  Revise temporary
+	  comments.
+
+2005-10-06 Thursday 12:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/numberinput1.cc (1.5): Take out tracing function
+	  dump_mpz_ptr.  Only print output on error.
+
+2005-10-06 Thursday 12:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked_int.inlines.hh (1.39): Clip trailing spaces.
+
+2005-10-06 Thursday 11:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.25): In satisfies_all_congruences
+	  multiply the modulus by the divisor when the divisor is greater
+	  than 1 (was 0).
+
+2005-10-06 Thursday 11:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/GMP_Integer.defs.hh (grids.5): Take `inline' out of gcdext
+	  declarations.
+
+2005-10-06 Thursday 11:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked.inlines.hh (grids.7): In gcdext_generic do the s and
+	  t negation only once when the given x and y are negative.
+
+2005-10-06 Thursday 11:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.35): Add FAIL_TEST directives for
+	  the checked types.
+
+2005-10-04 Tuesday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.24): Do not use conditional expressions with
+	  expressions of different type.
+
+2005-10-04 Tuesday 22:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.29):
+	  Polyhedra_Powerset<PH>::concatenate_assign() was still buggy.
+
+2005-10-04 Tuesday 20:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.28): Fixed a bug
+	  Polyhedra_Powerset<PH>::concatenate_assign() whereby a temporary
+	  Polyhedra_Powerset object was created with the wrong dimension.
+
+2005-10-04 Tuesday 20:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.6): New test simplified (it
+	  could not reproduce the time-dependent bug it was supposed to
+	  reproduce).
+
+2005-10-04 Tuesday 20:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.5): Added a new test that
+	  exposes a bug in Polyhedra_Powerset<PH>::concatenate_assign().
+
+2005-10-04 Tuesday 15:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.156): A PPL distribution is compilable on environments
+	  lacking Perl.
+
+2005-10-04 Tuesday 15:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.155), src/GMP_Integer.defs.hh (1.11), src/simplex.cc
+	  (1.23): Added macro PPL_NOISY_SIMPLEX to enable a limited amount
+	  of debugging output when executing the primal simplex.  The
+	  documentation of function is_in_base() improved.  Function
+	  compute_generator() also simplified.
+
+2005-10-04 Tuesday 14:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/minimize.cc (1.42): Indent note consistently.
+
+2005-10-04 Tuesday 14:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Polyhedron_public.cc (1.62): Take out two redundant `else'
+	  and a redundant `if'.  Correct some comments (mostly typos).
+	  Clip a trailing space.  Take out a \relates comment on a
+	  Polyhedron method.
+
+2005-10-04 Tuesday 13:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Polyhedron_chdims.cc (1.33): Correct and update some comments
+	  (mostly grammar).  Add a space after two primitive calls in
+	  expand_space_dimension.
+
+2005-10-04 Tuesday 12:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Native_Integer.defs.hh (1.13), Native_Integer.inlines.hh
+	  (1.14): Add template assign(Native_Integer<To>&, const
+	  mpz_class&, Rounding_Dir).
+
+2005-10-04 Tuesday 12:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Random_Number_Generator.inlines.hh (1.3): Revert to using
+	  assign in method get.
+
+2005-10-04 Tuesday 12:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.44): Point 3 of Section 6.7.3
+	  [Type qualifiers] of the C99 standard says that "The properties
+	  associated with qualified types [const, restrict, volatile] are
+	  meaningful only for expressions that are lvalues." Point 8 of
+	  Section 7.1.5.1 [The cv qualifiers] of the C++98 standard says
+	  that "In general, the semantics of volatile are intended to be
+	  the same in C++ as they are in C." Since functions can only
+	  return rvalues, and since C++98 and C99 are (believed to be)
+	  converging, the type qualifier "volatile" on return type has been
+	  removed.  FIXME resolved.
+
+2005-10-03 Monday 23:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.22): Stupid bug recently introduced is now
+	  corrected.
+
+2005-10-03 Monday 18:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.190): Revised the URI for the Perl directory at
+	  perl.org.
+
+2005-10-03 Monday 18:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Random_Number_Generator.inlines.hh (1.2): In method get
+	  "use" parameter info, and assign the generated number with
+	  operator= (via a temporary) instead of with method assign (as
+	  operator= is present in Native_Integer).
+
+2005-10-03 Monday 14:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bgp99extrapolation1.cc (1.1): Put under CVS
+	  control.
+
+2005-10-03 Monday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.17), bhz03widening1.cc (1.1):
+	  Added a new test for the first implementation of a
+	  certificate-based widening on a powerset of BD_Shape's.
+
+2005-10-03 Monday 12:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.32), BD_Shape.inlines.hh (1.66): Added
+	  methods difference_assign() and strictly_contains(), that are
+	  required when instantiating Polyhedra_Powerset<BD_Shape> and
+	  using the BHZ03 widening.  Widening methods now have a dummy
+	  token argument (not used yet).  Removed unreasonable inline
+	  directives from too complex class template member
+	  implementations.
+
+2005-10-03 Monday 12:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: H79_Certificate.defs.hh (1.12), H79_Certificate.inlines.hh
+	  (1.6): Added constructor template and comparison member template,
+	  so as to provide a dummy (but working) certificate implementation
+	  for all classes PH providing method PH::constraints() (e.g.,
+	  BD_Shape).
+
+2005-10-02 Sunday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.65): Added a missing const qualifier
+	  and revised a comment in BD_Shape<T>::init().
+
+2005-10-02 Sunday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am (1.3), src/Makefile.am (1.124):
+	  Definition of BUILT_SOURCES revised.
+
+2005-10-02 Sunday 12:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.189): Version number bumped.
+
+2005-10-02 Sunday 11:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.33), Watchdog/config.guess (1.17): Updated.
+
+2005-10-02 Sunday 11:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.37), devref.doxyconf-html.in (1.58),
+	  devref.doxyconf-latex.in (1.2), devref.tex (1.18),
+	  user.doxyconf-html.in (1.30), user.doxyconf-latex.in (1.2),
+	  user.tex (1.19): We now generate PostScript from PDF.
+
+2005-10-02 Sunday 08:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.2): Added Fcaibvp::OK().
+
+2005-10-01 Saturday 15:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.24): Added a section describing source file naming
+	  and structuring conventions.	Another section has to do with
+	  macros.
+
+2005-10-01 Saturday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.36), powerset1.cc (1.1): New
+	  (incomplete) test program to test the Powerset class.
+
+2005-10-01 Saturday 09:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.188), doc/Makefile.am (1.36), doc/README.doc
+	  (1.6), doc/devref-browse.doxyconf-latex.in (1.57),
+	  doc/devref-print.doxyconf-latex.in (1.57),
+	  doc/devref.doxyconf-html.in (1.57), doc/devref.doxyconf-latex.in
+	  (1.1), doc/user-browse.doxyconf-latex.in (1.27),
+	  doc/user-print.doxyconf-latex.in (1.27),
+	  doc/user.doxyconf-html.in (1.29), doc/user.doxyconf-latex.in
+	  (1.1): No longer produce "browse" and "print" version, since the
+	  "browse" version is equally good for printing.  Construction of
+	  the documentation much simplified.  Doxygen configuration files
+	  updates.
+
+2005-09-30 Friday 23:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.34): Header file instchk.hh listed in
+	  dist_noinst_HEADERS.
+
+2005-09-30 Friday 21:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.21): No longer using (and thus eliminated)
+	  functions insert_row_in_matrix(), add_element_to_row(),
+	  copy_column().  Function check_optimality() renamed as
+	  get_entering_index(), its signature restructured and its
+	  implementation made a little bit more efficient.  Function
+	  choose_out_var() renamed as get_exiting_index(), its signature
+	  restructured and its implementation heavily changed to
+	  (hopefully) made it more efficient.  Function compute_simplex()
+	  changed accordingly.	Function compute_tableau() further
+	  simplified by removing a lot of (not really necessary)
+	  bookkeeping. Local variables renamed for improved readability.
+
+2005-09-30 Friday 09:16  David Merchat <merchat at cs.unipr.it>
+
+	* src/GMP_Integer.types.hh (1.9): We use doxygen command
+	  ``\relates'' to put  all informations about GMP_Integer at the
+	  same place. Since \relates must refer to a class and GMP_Integer
+	  is not a class but a type we obtain a warning for all ``\relates
+	  GMP_Integer'' To eliminate those warnings we add a doxygen
+	  comment ``\class GMP_Integer'' just before declaration of type
+	  GMP_Integer
+
+2005-09-29 Thursday 18:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: checked.inlines.hh, checked_float.inlines.hh,
+	  checked_int.inlines.hh (grids.[6,5,5]): Rename gcdext_generic to
+	  gcdext_exact.
+
+2005-09-29 Thursday 18:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+	  scalar_products.cc, scalar_products.defs.hh,
+	  scalar_products.inlines.hh (grids.[12,21,16,2,2,2]): Move scalar
+	  product functions into scalar_products.*.
+
+2005-09-29 Thursday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/numberinput1.cc (1.4): Improve the call to
+	  function input in function test.  Update temporary comments.	Add
+	  a test with a much larger integer.
+
+2005-09-29 Thursday 11:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/numberinput1.cc (1.3): Convert test_template to
+	  function test, which uses an mpq_class checked number.  In
+	  function test read number with function input (instead of op>>),
+	  compare the result of the conversion with an expected result, and
+	  use is_not_a_number instead of classify.
+
+	  Narrow long test invocations.  Add an expected result value to
+	  each invocation.
+
+2005-09-28 Wednesday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.154), configure.ac (1.187), Watchdog/src/Makefile.am
+	  (1.2), src/Makefile.am (1.123): A PPL distribution should now be
+	  compilable even on environments lacking Perl.
+
+2005-09-28 Wednesday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/: .cvsignore, Doubly_Linked_Object.defs.hh,
+	  Doubly_Linked_Object.inlines.hh, Doubly_Linked_Object.types.hh,
+	  EList.defs.hh, EList.inlines.hh, EList.types.hh,
+	  EList_Iterator.defs.hh, EList_Iterator.inlines.hh,
+	  EList_Iterator.types.hh, Handler.defs.hh, Handler.inlines.hh,
+	  Handler.types.hh, Makefile.am, Makefile.in, Pending_Element.cc,
+	  Pending_Element.defs.hh, Pending_Element.inlines.hh,
+	  Pending_Element.types.hh, Pending_List.cc, Pending_List.defs.hh,
+	  Pending_List.inlines.hh, Pending_List.types.hh, Time.cc,
+	  Time.defs.hh, Time.inlines.hh, Time.types.hh, Watchdog.cc,
+	  Watchdog.defs.hh, Watchdog.inlines.hh, Watchdog.types.hh,
+	  pwl_header.hh
+	  (grids.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Files moved as in the main trunk.
+
+2005-09-28 Wednesday 21:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* CREDITS, ChangeLog, Makefile.am, NEWS, STANDARDS, TODO,
+	  configure.ac, instchk.hh, Watchdog/.cvsignore,
+	  Watchdog/ChangeLog, Watchdog/Doubly_Linked_Object.defs.hh,
+	  Watchdog/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/Doubly_Linked_Object.types.hh, Watchdog/EList.defs.hh,
+	  Watchdog/EList.inlines.hh, Watchdog/EList.types.hh,
+	  Watchdog/EList_Iterator.defs.hh,
+	  Watchdog/EList_Iterator.inlines.hh,
+	  Watchdog/EList_Iterator.types.hh, Watchdog/Handler.defs.hh,
+	  Watchdog/Handler.inlines.hh, Watchdog/Handler.types.hh,
+	  Watchdog/Makefile.am, Watchdog/Pending_Element.cc,
+	  Watchdog/Pending_Element.defs.hh,
+	  Watchdog/Pending_Element.inlines.hh,
+	  Watchdog/Pending_Element.types.hh, Watchdog/Pending_List.cc,
+	  Watchdog/Pending_List.defs.hh, Watchdog/Pending_List.inlines.hh,
+	  Watchdog/Pending_List.types.hh, Watchdog/Time.cc,
+	  Watchdog/Time.defs.hh, Watchdog/Time.inlines.hh,
+	  Watchdog/Time.types.hh, Watchdog/Watchdog.cc,
+	  Watchdog/Watchdog.defs.hh, Watchdog/Watchdog.inlines.hh,
+	  Watchdog/Watchdog.types.hh, Watchdog/configure.ac,
+	  Watchdog/pwl_header.hh, Watchdog/utils/Makefile.am,
+	  Watchdog/utils/build_header, Watchdog/utils/build_header.in,
+	  demos/ppl_lcdd/ppl_lcdd.cc, doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/user-browse.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  interfaces/C/ppl_c.cc, interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected3_int16,
+	  interfaces/Prolog/XSB/expected3_int16_a,
+	  interfaces/Prolog/XSB/expected3_int32,
+	  interfaces/Prolog/XSB/expected3_int8,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl, m4/ac_check_swi_prolog.m4,
+	  src/Ask_Tell.defs.hh, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh, src/Bounding_Box.defs.hh,
+	  src/Bounding_Box.inlines.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Checked_Number.types.hh,
+	  src/Coefficient.types.hh, src/Constraint.defs.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/Constraint_System.inlines.hh, src/DB_Row.defs.hh,
+	  src/Determinate.defs.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	  src/Generator.defs.hh, src/Generator_System.cc,
+	  src/H79_Certificate.cc, src/H79_Certificate.defs.hh, src/Init.cc,
+	  src/Linear_Expression.defs.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_System.cc, src/Linear_System.defs.hh, src/Makefile.am,
+	  src/Matrix.cc, src/Matrix.inlines.hh, src/Native_Integer.defs.hh,
+	  src/Native_Integer.inlines.hh, src/Native_Integer.types.hh,
+	  src/Polyhedra_Powerset.cc, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Row.cc, src/Row.defs.hh,
+	  src/Saturation_Matrix.cc, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+	  src/Variable.defs.hh, src/algorithms.hh, src/checked.cc,
+	  src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/conversion.cc, src/globals.defs.hh, src/globals.inlines.hh,
+	  src/globals.types.hh, src/mp_numeric_limits.hh,
+	  src/scalar_products.cc, src/scalar_products.defs.hh,
+	  src/scalar_products.inlines.hh, src/simplex.cc,
+	  tests/Makefile.am, tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/Random_Number_Generator.types.hh, tests/ppl_test.hh,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/geomcovers1.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening6.cc,
+	  tests/Polyhedron/exceptions1.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/gramschmidt1.cc,
+	  tests/Polyhedron/gramshmidt1.cc,
+	  tests/Polyhedron/linearsystem1.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/numberinput1.cc, utils/Makefile.am,
+	  utils/build_header, utils/build_header.in, utils/text2cxxarray,
+	  utils/text2cxxarray.in
+	  (grids.[1,1,3,3,4,3,4,1,1,1,2,2,1,2,2,1,2,2,1,3,3,1,2,2,2,2,1,2,2,2,1,2,2,3,1,2,2,2,1,2,2,2,2,1,3,3,3,3,2,2,2,4,2,3,4,2,3,2,3,2,5,2,3,1,1,1,1,2,3,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,3,2,4,4,1,1,5,2,3,2,3,3,4,3,1,7,13,2,2,3,5,5,5,4,3,2,8,3,2,3,4,1,1,4,5,7,5,3,5,5,3,2,5,2,2,2,2,2,3,3,4,5,4,4,4,3,4,3,2,3,3,1,1,1,1,1,3,3,1,1,1,12,4,1,2,8,2,2,2,2,2,2,2,2,1,2,1,1,1,2,2,1,2,1]):
+	  Fourth merge from the main trunk.
+
+2005-09-28 Wednesday 19:37  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.34), Checked_Number.inlines.hh
+	  (1.39): Added input and output functions
+
+2005-09-28 Wednesday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/utils/Makefile.am (1.4), utils/Makefile.am (1.10): Make
+	  sure the scripts in the `utils' subdirectory are made also at
+	  distribution time, even if they are not distributed themselves.
+
+2005-09-28 Wednesday 17:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/numberinput1.cc (1.2): In test_template add
+	  checks, including residual checks, and improve the comparison
+	  with the expected value.  Add expected residuals to all tests.
+
+2005-09-28 Wednesday 16:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.52), Constraint.defs.hh (1.107),
+	  Generator.cc (1.65), Generator.defs.hh (1.109): According to
+	  Doxygen manual, the \relates command should name a class, whereas
+	  Constraint::Type and Generator::Type are just enums.
+
+2005-09-28 Wednesday 14:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.20): Function compute_tableau() now directly
+	  detects trivially unbounded problems instead of leaving this
+	  simple check to the caller.  Function primal_simplex() corrected
+	  so as to return the origin point of the right space dimension
+	  when a trivial LP problem is given (fixing the bug uncovered by
+	  test primalsimplex2).
+
+2005-09-28 Wednesday 14:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.35), primalsimplex2.cc (1.1):
+	  New test shows a (space dimension mismatch) bug in the current
+	  implementation of the simplex algorithm.
+
+2005-09-27 Tuesday 21:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.19): Simplified function
+	  prepare_for_1st_ph_simplex(), avoiding useless copies and
+	  factoring 2nd and 3rd Row& arguments into a single Matrix&
+	  argument.  Adding slack variables all in one shot, instead of one
+	  at a time.  Simplified function first_phase() by avoiding useless
+	  matrix copies.
+
+2005-09-27 Tuesday 20:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/: Makefile.am (1.34), numberinput1.cc (1.1): Add
+	  numberinput1, a start at testing number input.
+
+2005-09-27 Tuesday 20:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked.cc (1.8): Really revert to revision 1.4.
+
+2005-09-27 Tuesday 12:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.18): Removed a few useless inclusions
+	  directives.  Added many const modifiers to local variable
+	  definitions.	Function swap_base() now takes a Row& (rather than
+	  a Matrix&) as its second argument.  Avoid recomputing the same
+	  value several times (using a reference instead).  Added some
+	  missing spaces for better readability.  Function erase_slacks()
+	  heavily rewritten so as to avoid a bunch of useless matrix
+	  copies.  Restructured the doxygen comments according to
+	  STANDARDS.  In primal_simplex(), use normalize2() instead of
+	  reinventing the wheel.
+
+2005-09-27 Tuesday 12:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.defs.hh (1.14): Minor formatting
+	  improvement.
+
+2005-09-26 Monday 18:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh (1.24): Removed a few useless inline
+	  directives and const modifiers from function declarations.
+
+2005-09-26 Monday 18:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.defs.hh (1.17): Removed a useless inline
+	  directive from a function declaration.
+
+2005-09-26 Monday 18:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GMP_Integer.defs.hh (1.10): Removed many useless inline
+	  directives from function declarations.
+
+2005-09-26 Monday 18:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.inlines.hh (1.12): Added a const modifier to the
+	  low_bits_mask() parameter.
+
+2005-09-26 Monday 16:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.17): Useless using declaration removed.  A few
+	  FIXME in the comments dealt with. Comments and code still deserve
+	  a lot of work to match the PPL quality standards.
+
+2005-09-26 Monday 16:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.cc (1.2), Polyhedra_Powerset.defs.hh
+	  (1.22), Polyhedra_Powerset.inlines.hh (1.27): Dealt with a couple
+	  of FIXME's in the implementation by introducing a single FIXME in
+	  the definition of the templatic class.
+
+2005-09-26 Monday 16:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BHRZ03_Certificate.cc (1.9), H79_Certificate.cc (1.8): A
+	  few FIXME's have been (properly) renamed into TODO's.
+
+2005-09-26 Monday 15:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/matrix1.cc (1.4): Correct spelling.
+
+2005-09-26 Monday 15:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked.defs.hh (1.24): Indent arguments to function
+	  declaration macros consistently.
+
+2005-09-26 Monday 15:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/linsysasciidumpload1.cc (1.2): Moved to
+	  linearsystem1.cc.
+
+2005-09-26 Monday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/matrix1.cc (1.3): Avoid unnecessary inclusions.
+
+2005-09-26 Monday 13:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/: Makefile.am (1.33), linearsystem1.cc (1.1):
+	  Move linsysasciidumpload1 to linearsystem1.  Match linearsystem1
+	  to matrix1.
+
+2005-09-26 Monday 12:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked.cc (1.7): Revert to revision 1.4.
+
+2005-09-24 Saturday 22:28  Abramo Bagnara
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.35), tests/Makefile.am
+	  (1.246), tests/ppl_test.hh (1.26), tests/Polyhedron/matrix1.cc
+	  (1.2): Use new random number generator class.
+
+2005-09-24 Saturday 22:22  Abramo Bagnara
+
+	* tests/: Random_Number_Generator.defs.hh (1.1),
+	  Random_Number_Generator.inlines.hh (1.1),
+	  Random_Number_Generator.types.hh (1.1): Added random number
+	  generator class.
+
+2005-09-24 Saturday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.6): Class
+	  numeric_limits<Checked_Number<mp_class, Policy> now inherits from
+	  numeric_limits<mp_class> and ovverrides what must be overridden.
+
+2005-09-24 Saturday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.122), mp_numeric_limits.hh (1.1): New file
+	  mp_numeric_limits.hh contains specializations of
+	  std::numeric_limits for multi-precision types.  This will become
+	  obsolete when GMP and MPFR will provide the specializations by
+	  themselves.
+
+2005-09-24 Saturday 21:25  Abramo Bagnara
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.34),
+	  GNU/ppl_gprolog_sd.cc (1.30), SICStus/ppl_sicstus_sd.cc (1.79),
+	  SWI/ppl_swiprolog.cc (1.103), XSB/ppl_xsb.cc (1.70),
+	  YAP/ppl_yap.cc (1.95): Include higher level file for Checked.
+
+2005-09-24 Saturday 18:10  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.45), interfaces/C/ppl_c.cc (1.138),
+	  interfaces/Prolog/ppl_prolog.icc (1.162),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.33),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.29),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.78),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.102),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.69),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.94), src/BD_Shape.inlines.hh
+	  (1.64), src/Bounding_Box.inlines.hh (1.9),
+	  src/Checked_Number.defs.hh (1.33), src/Checked_Number.inlines.hh
+	  (1.38), src/Polyhedron.inlines.hh (1.123),
+	  src/Polyhedron_nonpublic.cc (1.54), src/checked.defs.hh (1.23),
+	  src/checked.inlines.hh (1.25), src/checked_mpq.inlines.hh (1.23),
+	  src/checked_mpz.inlines.hh (1.27): Allow Checked assign functors
+	  to accept native types as To argument. Reordered memory_size
+	  functors for Checked types.
+
+2005-09-24 Saturday 09:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.types.hh (1.7), Coefficient.types.hh (1.8):
+	  Specializations of Coefficient_traits_template moved out from
+	  Checked_Number.types.hh, since they do not belong there.
+
+2005-09-24 Saturday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron_chdims.cc (1.32), Polyhedron_public.cc (1.61),
+	  Polyhedron_widenings.cc (1.49): FIXMEs that do not involve
+	  anything that can be considered broken have been retagged TODOs.
+
+2005-09-24 Saturday 08:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.32): Take into account the
+	  restructuring of the PWL tree.
+
+2005-09-23 Friday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.46), GNU/Makefile.am
+	  (1.49), SICStus/Makefile.am (1.55), SWI/Makefile.am (1.53),
+	  XSB/Makefile.am (1.36), YAP/Makefile.am (1.40): Changed according
+	  to the restructuring of the PWL source tree.
+
+2005-09-23 Friday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/.cvsignore (1.5): Updated.
+
+2005-09-23 Friday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Doubly_Linked_Object.defs.hh (1.4),
+	  Doubly_Linked_Object.inlines.hh (1.4),
+	  Doubly_Linked_Object.types.hh (1.3), EList.defs.hh (1.6),
+	  EList.inlines.hh (1.5), EList.types.hh (1.3),
+	  EList_Iterator.defs.hh (1.4), EList_Iterator.inlines.hh (1.5),
+	  EList_Iterator.types.hh (1.3), Handler.defs.hh (1.6),
+	  Handler.inlines.hh (1.5), Handler.types.hh (1.3), Makefile.am
+	  (1.23), Pending_Element.cc (1.4), Pending_Element.defs.hh (1.4),
+	  Pending_Element.inlines.hh (1.4), Pending_Element.types.hh (1.3),
+	  Pending_List.cc (1.4), Pending_List.defs.hh (1.4),
+	  Pending_List.inlines.hh (1.4), Pending_List.types.hh (1.3),
+	  Time.cc (1.4), Time.defs.hh (1.4), Time.inlines.hh (1.5),
+	  Time.types.hh (1.3), Watchdog.cc (1.21), Watchdog.defs.hh (1.17),
+	  Watchdog.inlines.hh (1.14), Watchdog.types.hh (1.7), configure.ac
+	  (1.32), pwl_header.hh (1.2), src/.cvsignore (1.1),
+	  src/Doubly_Linked_Object.defs.hh (1.1),
+	  src/Doubly_Linked_Object.inlines.hh (1.1),
+	  src/Doubly_Linked_Object.types.hh (1.1), src/EList.defs.hh (1.1),
+	  src/EList.inlines.hh (1.1), src/EList.types.hh (1.1),
+	  src/EList_Iterator.defs.hh (1.1), src/EList_Iterator.inlines.hh
+	  (1.1), src/EList_Iterator.types.hh (1.1), src/Handler.defs.hh
+	  (1.1), src/Handler.inlines.hh (1.1), src/Handler.types.hh (1.1),
+	  src/Makefile.am (1.1), src/Pending_Element.cc (1.1),
+	  src/Pending_Element.defs.hh (1.1), src/Pending_Element.inlines.hh
+	  (1.1), src/Pending_Element.types.hh (1.1), src/Pending_List.cc
+	  (1.1), src/Pending_List.defs.hh (1.1),
+	  src/Pending_List.inlines.hh (1.1), src/Pending_List.types.hh
+	  (1.1), src/Time.cc (1.1), src/Time.defs.hh (1.1),
+	  src/Time.inlines.hh (1.1), src/Time.types.hh (1.1),
+	  src/Watchdog.cc (1.1), src/Watchdog.defs.hh (1.1),
+	  src/Watchdog.inlines.hh (1.1), src/Watchdog.types.hh (1.1),
+	  src/pwl_header.hh (1.1): Restructured.
+
+2005-09-23 Friday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.31): Configure is no longer responsible
+	  for creating build_header.
+
+2005-09-23 Friday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.186), Watchdog/utils/Makefile.am (1.3),
+	  Watchdog/utils/build_header.in (1.2), utils/Makefile.am (1.9),
+	  utils/build_header.in (1.2): Generation of utility scripts fixed.
+
+2005-09-23 Friday 16:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* utils/Makefile.am (1.8): Add bin_SCRIPT.  Set bin_SCRIPT to
+	  build_header, text2cxxarray and a phony target which sets the
+	  script permissions.
+
+2005-09-23 Friday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.31), matasciidumpload1.cc
+	  (1.5), matrix1.cc (1.1): Test program renamed.  The matrix1.cc
+	  (and, possibly, matrix2.cc and so forth) will contain tests of
+	  some functionalities of the class Matrix (especially those that
+	  are not exercised much in an indirect way by the clients of
+	  Matrix).
+
+2005-09-23 Friday 14:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.185): Revised the warning message concerning the
+	  impossibility of propagating exceptions back from GMP.
+
+2005-09-23 Friday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.33), configure.ac (1.184), Watchdog/Makefile.am
+	  (1.22), Watchdog/configure.ac (1.30), Watchdog/utils/Makefile.am
+	  (1.2), Watchdog/utils/build_header (1.2),
+	  Watchdog/utils/build_header.in (1.1),
+	  doc/devref-browse.doxyconf-latex.in (1.56),
+	  doc/devref-print.doxyconf-latex.in (1.56),
+	  doc/devref.doxyconf-html.in (1.56),
+	  doc/user-browse.doxyconf-latex.in (1.26),
+	  doc/user-print.doxyconf-latex.in (1.26),
+	  doc/user.doxyconf-html.in (1.28), src/Makefile.am (1.121),
+	  utils/Makefile.am (1.7), utils/build_header (1.2),
+	  utils/build_header.in (1.1), utils/text2cxxarray (1.3),
+	  utils/text2cxxarray.in (1.1): Allow Perl to be installed into
+	  non-standard places.
+
+2005-09-23 Friday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.29): Check for Perl.
+
+2005-09-23 Friday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.183): Check for Perl.
+
+2005-09-23 Friday 09:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.91): Comment fixed.
+
+2005-09-23 Friday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/matasciidumpload1.cc (1.4): Include <ctime>.  It
+	  does not make sense to use TEMP_INTEGER here: use Coefficient
+	  instead.  Avoid unnecessary use of macros: std::numeric_limits<T>
+	  is (must) be available for all numerical types.  Use GMP's
+	  pseudo-random numbers instead of rand().
+
+2005-09-23 Friday 08:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.182): The C header file <time.h> is subsumed by
+	  C++'s <ctime>: there is no need to check for its availability.
+
+2005-09-22 Thursday 23:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.181): `sys/time.h' was listed twice in the
+	  argument of AC_CHECK_HEADERS.  Check also for `time.h'.
+
+2005-09-22 Thursday 18:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.283): Correct grammar.
+
+2005-09-22 Thursday 17:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked_numeric_limits.hh (1.5): Specialize numeric_limits
+	  for int and all unsigned integer native types.
+
+2005-09-22 Thursday 15:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.68): Automatically initialise con_sys
+	  and gen_sys in Grid(n,k).
+
+2005-09-22 Thursday 15:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/: Makefile.am (1.30), linsysasciidumpload1.cc
+	  (1.1): Add linsysasciidumpload1, which tests Linear_System ASCII
+	  loading.
+
+2005-09-22 Thursday 15:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Linear_Row.cc (1.13), Linear_Row.defs.hh (1.12),
+	  Linear_System.cc (1.26): Add methods Linear_Row::ascii_load and
+	  Linear_Row::Flags::ascii_load.  Complete
+	  Linear_System::ascii_load.
+
+2005-09-22 Thursday 14:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/matasciidumpload1.cc (1.3): Correct the
+	  numeric_limits instantiation.  Only allow valid modulation.
+
+2005-09-22 Thursday 13:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/: Makefile.am (1.29), matasciidumpload1.cc
+	  (1.2): In matasciidumpload1 limit the size of the random values
+	  according to the coefficient type and rename the data file
+	  uniquely.
+
+2005-09-21 Wednesday 19:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.153): One item completed and removed (check_containment).
+
+2005-09-21 Wednesday 19:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.158): Some of the recent changes and bugfixes announced.
+
+2005-09-21 Wednesday 19:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.16), geomcovers1.cc (1.1): Added
+	  a new test showing that geometrically_covers() also works for
+	  powersets of BD_Shape's.
+
+2005-09-21 Wednesday 19:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Makefile.am (1.120), Polyhedra_Powerset.cc (1.1),
+	  Polyhedra_Powerset.defs.hh (1.21), Polyhedra_Powerset.inlines.hh
+	  (1.26), algorithms.hh (1.43): Added new specializations for
+	  Polyhedra_powerset mixed constructors.  Function
+	  check_containment() now works with different instantiations of
+	  Polyhedra_Powerset; the same happens for geometrically_covers()
+	  and geometrically_equals().  A few non-inline full specialization
+	  of member templates have been moved into file
+	  Polyhedra_Powerset.cc.
+
+2005-09-21 Wednesday 17:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Linear_System.cc (1.25): Indent consistently in ascii_load.
+	  Correct typo, grammar and formatting in three comments.
+
+2005-09-21 Wednesday 16:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.defs.hh, Linear_System.cc,
+	  Congruence_System.cc (grids.[15,2,24]): Take out
+	  Congruence_System::add_row.  Replace the bulk of
+	  Linear_System::add_row with a call to Matrix::add_row.
+
+2005-09-21 Wednesday 16:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/geomcovers1.cc (1.6): Test corrected.
+
+2005-09-21 Wednesday 16:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/exceptions1.cc (1.7): Added a new exception
+	  check for Polyhedra_Powerset::add_disjunct().
+
+2005-09-21 Wednesday 16:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.defs.hh (1.20),
+	  Polyhedra_Powerset.inlines.hh (1.25): The new method
+	  Polyhedra_Powerset::add_disjunct() now performs the required
+	  check for space dimension compatibility. The check uncovers a
+	  previously unnoticed (client) bug in Polyhedron/geomcovers1.cc.
+
+2005-09-21 Wednesday 16:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.152): Item:
+
+	   - In the Prolog interface there are predicates such as
+	    ppl_Polyhedron_remove_space_dimensions/2 that require an input
+	  list;
+	    if the argument is not a list, in the current version, the call
+	  to
+	    this predicate will fail. This needs to be changed so that an
+	    exception is thrown.
+
+	  removed.
+
+2005-09-21 Wednesday 16:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: exceptions.hh (1.17), ppl_prolog.icc (1.161),
+	  tests/pl_check.pl (1.11): All Prolog interface predicates
+	  expecting a list as input from the user now throw an exception if
+	  the list is not nil terminated.  (This could be a list of
+	  constraints, generators, intervals, dimensiona or dimension maps)
+
+	  That is interface predicates: ppl_new_Polyhedron_from_constraints
+	  ppl_new_Polyhedron_from_generators
+	  ppl_new_Polyhedron_from_bounding_box
+	  ppl_Polyhedron_add_constraints
+	  ppl_Polyhedron_add_constraints_and_minimize
+	  ppl_Polyhedron_add_generators
+	  ppl_Polyhedron_add_generators_and_minimize
+	  ppl_Polyhedron_limited_H79_extrapolation_assign
+	  ppl_Polyhedron_limited_H79_extrapolation_assign_with_token
+	  ppl_Polyhedron_bounded_H79_extrapolation_assign
+	  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token
+	  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+	  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_token
+	  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+	  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_token
+	  ppl_Polyhedron_remove_space_dimensions
+	  ppl_Polyhedron_fold_space_dimensions
+	  ppl_Polyhedron_map_space_dimensions
+
+	  class not_a_nil_terminated_list added to exception.hh.
+
+	  Code for throwing an exception added to ppl_prolog.icc Exception
+	  thrown for not nil terminating input lists for each of the above.
+	   Also indentation of code improved.
+
+	  Tests for not nil terminating list exceptions, for each of the
+	  above predicates, added to pl_check.pl.  Old tests for prolog
+	  failure when list is not nil terminated removed.  Some tests in
+	  pl_check.pl reordered.
+
+2005-09-21 Wednesday 16:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.cc (1.10): In
+	  adjust_topology_and_space_dimension pass to add_zero_columns the
+	  result of adding to or subtracting from cols_to_be_added, instead
+	  of an increased or decreased cols_to_be_added.
+
+2005-09-21 Wednesday 14:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.31): Out-of-date comments concerning the
+	  template parameter T removed from the documentation of class
+	  BD_Shape.
+
+2005-09-21 Wednesday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.28), matasciidumpload1.cc
+	  (1.1): Test Matrix::ascii_dump() and Matrix::ascii_load().
+
+2005-09-21 Wednesday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.180), tests/Makefile.am (1.245): Previous change
+	  reverted.
+
+2005-09-21 Wednesday 12:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.cc (1.9): Align argument indentation of
+	  affine_image.
+
+2005-09-21 Wednesday 12:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* configure.ac (1.179): Add tests/Matrix/Makefile to
+	  AC_CONFIG_FILES.
+
+2005-09-21 Wednesday 12:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Makefile.am (1.244): Add Matrix to SUBDIRS.
+
+2005-09-21 Wednesday 12:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Matrix.cc (1.85), Row.cc (1.90), Row.defs.hh (1.98):
+	  Complete Matrix::ascii_load.	Restore the stream attributes at
+	  the end of Row::ascii_dump.  Add ascii_load methods to Row::Flags
+	  and Row.
+
+2005-09-21 Wednesday 12:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Constraint_System.cc (1.10): In method num_inequalities use
+	  dimension_type instead of int for temporary n.
+
+2005-09-20 Tuesday 21:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.151): Links in the CREDITS file checked and lists of
+	  collaborators and projects supporting the work updated. So todo
+	  item removed.
+
+2005-09-20 Tuesday 21:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.150): SWI 5.4.7 automatically initializes the library.
+	  So todo item for this removed.
+
+2005-09-20 Tuesday 19:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* configure.ac (1.178): Indent all lines with spaces in
+	  AC_CONFIG_FILES.
+
+2005-09-20 Tuesday 19:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked.inlines.hh (grids.4): Take a redundant assignment out
+	  of gcdext_generic.
+
+2005-09-20 Tuesday 19:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Native_Integer.inlines.hh (grids.3): Take a redundant
+	  assignment out of gcdext.
+
+2005-09-20 Tuesday 19:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.67): Improve temporary comment.
+
+2005-09-20 Tuesday 19:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, boundingbox1.cc (grids.[34,1]): Add
+	  boundingbox1, which tests Grid(Box& box).
+
+2005-09-20 Tuesday 19:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[47,20]): Add template
+	  Grid(box, dummy).  Improve method descriptions.
+
+2005-09-20 Tuesday 15:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* CREDITS (1.19): Added Matthew Mundell as a contributor.
+
+	  Added the Royal Society project and the EPSRC project to the list
+	  of supporting projects.
+
+2005-09-20 Tuesday 13:46  Abramo Bagnara
+
+	* src/: checked_float.inlines.hh (1.43), checked_int.inlines.hh
+	  (1.38): Prepare inexact only when needed. Use new names for gcd
+	  and lcm.
+
+2005-09-20 Tuesday 13:44  Abramo Bagnara
+
+	* src/checked_ext.inlines.hh (1.21): Attempt to reduce code
+	  duplicate using explicit goto. Removed FIXME from add_mul_ext and
+	  sub_mul_ext.
+
+2005-09-20 Tuesday 13:42  Abramo Bagnara
+
+	* src/checked.inlines.hh (1.24): Removed fixme and choosen a better
+	  name for functions.
+
+2005-09-20 Tuesday 13:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.89): Use the ternary version of gcd_assign() so as
+	  to gain on checked numbers.
+
+2005-09-20 Tuesday 11:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked.cc (1.6): In parse_number1 move the maximum remainder
+	  calculation into a variable.
+
+2005-09-20 Tuesday 09:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.60): Unwanted inclusion removed.
+
+2005-09-20 Tuesday 08:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.defs.hh (1.108), Linear_Expression.defs.hh
+	  (1.11): Friend declarations fixed.
+
+2005-09-20 Tuesday 08:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/scalar_products.inlines.hh (1.4): Fixed
+	  homogeneous_scalar_product_assign(Coefficient&, const
+	  Linear_Expression&, const Generator&) and
+	  homogeneous_scalar_product_sign(const Linear_Expression&, const
+	  Generator&).
+
+2005-09-19 Monday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.defs.hh (1.107), Linear_Expression.defs.hh
+	  (1.10), Polyhedron_nonpublic.cc (1.53), scalar_products.defs.hh
+	  (1.3), scalar_products.inlines.hh (1.3): Another twist at
+	  reducing the dependency from friend class declarations.
+
+2005-09-19 Monday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.106), Generator.defs.hh (1.106),
+	  scalar_products.defs.hh (1.2), scalar_products.inlines.hh (1.2):
+	  Computing the scalar product between a Constraint and a Generator
+	  objects no longer requires Polyhedron to be a friend of
+	  Constraint and Generator.
+
+2005-09-19 Monday 22:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.105), Constraint_System.defs.hh
+	  (1.13), Constraint_System.inlines.hh (1.5), Polyhedron.defs.hh
+	  (1.282), Polyhedron.inlines.hh (1.122), Polyhedron_nonpublic.cc
+	  (1.52): The functionality of
+	  Polyhedron::add_low_level_constraints(Constraint_System&) is now
+	  provided by Constraint_System::add_low_level_constraints().
+	  Among other things, this reduces the dependency on friend
+	  declarations.
+
+2005-09-19 Monday 21:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.88): Chosen the more elegant implementation of
+	  Row::normalize() (profiling was inconclusive: they were probably
+	  equivalent).
+
+2005-09-19 Monday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint_System.cc (1.9), Generator_System.cc (1.8),
+	  Linear_Row.cc (1.12), Linear_Row.defs.hh (1.11),
+	  Linear_Row.inlines.hh (1.9), Linear_System.cc (1.24), Makefile.am
+	  (1.119), Polyhedron_nonpublic.cc (1.51), Polyhedron_public.cc
+	  (1.59), Polyhedron_widenings.cc (1.48), conversion.cc (1.73),
+	  scalar_products.cc (1.1), scalar_products.defs.hh (1.1),
+	  scalar_products.inlines.hh (1.1): Scalar product functions moved
+	  from Linear_Row.* to scalar_products.*.
+
+2005-09-19 Monday 20:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Row.cc (1.11): Long source line avoided.
+
+2005-09-19 Monday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.inlines.hh (1.13): Use memory_size_type, not
+	  size_t.
+
+2005-09-19 Monday 19:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.37): FIXME dealt with:
+	  total_memory_in_bytes() and external_memory_in_bytes() properly
+	  implemented for checked numbers.
+
+2005-09-19 Monday 19:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.30): Correct grammar in notes.
+
+2005-09-19 Monday 19:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.29): Clip trailing whitespace.
+
+2005-09-19 Monday 18:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked.cc (1.5): In parse_number1 parse the exponent in the
+	  FRACTIONAL case.
+
+2005-09-19 Monday 17:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/affineimage6.cc (1.6): Neaten expression
+	  formatting.
+
+2005-09-19 Monday 17:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/addspacedims3.cc (1.6): Correct argument in
+	  print_generators message.
+
+2005-09-19 Monday 17:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/Makefile.am (1.27): Indent all lines in
+	  ORIGINAL_TESTS and DERIVED_TESTS with tabs.
+
+2005-09-19 Monday 17:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/Makefile.am (1.15): Clip trailing whitespace.
+
+2005-09-19 Monday 17:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/checked.cc (1.4): Use `true' to evaluate true.  Clip trailing
+	  whitespace.
+
+2005-09-19 Monday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Polyhedron_widenings.cc (1.47): Correct variable names in
+	  H79_widening_assign comments.
+
+2005-09-19 Monday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.281): Markup parameter in description.
+
+2005-09-19 Monday 16:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Linear_System.defs.hh (1.16): Reformat comment.
+
+2005-09-19 Monday 16:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* configure.ac (1.177): Cater for the Debian dpkg version of
+	  md5sum.
+
+2005-09-19 Monday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.16): Let the parameter names in the definition
+	  of primal_simplex() match those used in its declaration.
+
+2005-09-19 Monday 14:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.21), Watchdog/ChangeLog (1.11): Updated.
+
+2005-09-19 Monday 14:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.defs.hh (1.12): Added documentation for
+	  Constraint_System::primal_simplex().
+
+2005-09-19 Monday 14:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.149): Updated.
+
+2005-09-19 Monday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Saturation_Row.inlines.hh (1.7): Include <cassert>.
+
+2005-09-19 Monday 10:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Native_Integer.inlines.hh (1.12): In template gcd take the
+	  absolute value of the resulting gcd instead of initially taking
+	  the absolute value of both arguments.
+
+2005-09-19 Monday 09:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.types.hh (1.10): Fixed struct
+	  Coefficient_traits_template<Native_Integer<int64_t>.
+
+2005-09-19 Monday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.28), Bounding_Box.defs.hh (1.9),
+	  DB_Row.defs.hh (1.9), Determinate.defs.hh (1.57), Init.cc (1.20),
+	  Linear_Row.cc (1.10), Linear_System.cc (1.23), Matrix.cc (1.84),
+	  Polyhedron.defs.hh (1.280), Row.cc (1.87), Row.defs.hh (1.97),
+	  conversion.cc (1.72), globals.cc (1.23): Include globals.types.hh
+	  or globals.defs.hh or none of them as required.
+
+2005-09-19 Monday 09:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GMP_Integer.defs.hh (1.9): Doxygen comments and sectioning
+	  revised.
+
+2005-09-19 Monday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.defs.hh (1.6), BD_Shape.defs.hh (1.27),
+	  BHRZ03_Certificate.defs.hh (1.12), Bounding_Box.defs.hh (1.8),
+	  DB_Row.defs.hh (1.8), Determinate.defs.hh (1.56),
+	  GMP_Integer.defs.hh (1.8), GMP_Integer.inlines.hh (1.6),
+	  H79_Certificate.defs.hh (1.11), Init.cc (1.19), Linear_Row.cc
+	  (1.9), Linear_System.cc (1.22), Makefile.am (1.118), Matrix.cc
+	  (1.83), Matrix.inlines.hh (1.45), Polyhedra_Powerset.defs.hh
+	  (1.19), Polyhedron.defs.hh (1.279), Row.cc (1.86), Row.defs.hh
+	  (1.96), Saturation_Matrix.cc (1.5), Saturation_Row.defs.hh (1.7),
+	  Variable.defs.hh (1.47), conversion.cc (1.71), globals.cc (1.22),
+	  globals.defs.hh (1.23), globals.types.hh (1.1), simplex.cc
+	  (1.15): Memory size inspection functions and methods should
+	  always return a memory_size_type.  Header file global.types.hh
+	  split from global.defs.hh.  Only include global.types.hh when
+	  possible.
+
+2005-09-19 Monday 07:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.63), Checked_Number.defs.hh (1.32),
+	  GMP_Integer.defs.hh (1.7), Native_Integer.defs.hh (1.12): Added a
+	  couple of blank lines to improve readability.
+
+2005-09-18 Sunday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.62): Use raw_value() to turn a
+	  Coefficient into its underlying type.
+
+2005-09-18 Sunday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.inlines.hh (1.11): Avoid a "unused parameter"
+	  warning.
+
+2005-09-18 Sunday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.61): Avoid excessive assumptions on
+	  the nature of the Coefficient type.
+
+2005-09-18 Sunday 21:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.31): Three FIXMEs investigated and
+	  removed.
+
+2005-09-18 Sunday 20:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (grids.[3,3]): Add macros FUNC4, DEF_ASSIGN_FUN5_4 and
+	  DEF_ASSIGN_FUN5_5.  Add function assign_gcdext and the
+	  gcdext_assign user interface functions.
+
+2005-09-18 Sunday 19:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: checked.defs.hh, checked.inlines.hh, checked_ext.defs.hh,
+	  checked_ext.inlines.hh, checked_float.inlines.hh,
+	  checked_int.inlines.hh, checked_mpz.inlines.hh
+	  (grids.[3,3,3,3,3,3,3]): Add macros DECLARE_FUN5_0_1,
+	  SPECIALIZE_FUN5_0_1 and SPECIALIZE_GCDEXT.  Add template
+	  gcdext_generic.  Specialize gcdext_generic for integers and
+	  floats.  Add wrapper gcdext_ext.  Add and specialize wrapper
+	  gcdext_mpz.
+
+2005-09-18 Sunday 19:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addcongruence1.cc (grids.5): Only call find_variation
+	  on the grid under test.
+
+2005-09-18 Sunday 19:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/print.cc (grids.4): Include Congruence_System definitions.
+
+2005-09-18 Sunday 19:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Native_Integer.defs.hh, Native_Integer.inlines.hh
+	  (grids.[2,2]): Add gcdext_assign methods.  "Use" the parameter in
+	  external_memory_in_bytes.
+
+2005-09-18 Sunday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.types.hh (1.9): The specializations of
+	  Coefficient_traits_template for native integers are now
+	  differentiated the same way as for checked integers.
+
+2005-09-18 Sunday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.types.hh (1.6), Coefficient.types.hh (1.7),
+	  GMP_Integer.types.hh (1.8), Native_Integer.types.hh (1.8): Treat
+	  the three basic coefficient types (GMP, checked and native) the
+	  same way, as far as the specialization of
+	  Coefficient_traits_template is concerned.
+
+2005-09-18 Sunday 10:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.18), TODO (1.148): Two links fixed.  All the others
+	  need to be checked.
+
+2005-09-17 Saturday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.85): Added an alternative implementation for
+	  Row::normalize() that should be more efficient than the present
+	  one.
+
+2005-09-17 Saturday 08:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.84): Row::normalize() speeded-up further.
+
+2005-09-16 Friday 21:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int64_a (1.2): Adapted to
+	  the recent changes in pl_check.pl.
+
+2005-09-16 Friday 19:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.83): Row::normalize() speeded up.
+
+2005-09-16 Friday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.14): Reduced the scope of a using declaration.
+
+2005-09-16 Friday 17:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.13): Avoid duplicating code in order to
+	  normalize a Row object.
+
+2005-09-16 Friday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_Row.cc (1.8), Linear_Row.defs.hh (1.10), Row.cc
+	  (1.82), Row.defs.hh (1.95): The normalize() method has been moved
+	  from Linear_Row to its base class Row.
+
+2005-09-16 Friday 12:16  Abramo Bagnara
+
+	* src/checked.inlines.hh (1.23): Removed unneeded checks.
+
+2005-09-16 Friday 09:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.21), src/Linear_System.defs.hh (1.15),
+	  tests/Polyhedron/gramschmidt1.cc (1.1),
+	  tests/Polyhedron/gramshmidt1.cc (1.2): Spelling correction: it is
+	  "Gram-Schmidt" (the orthonormalization procedure), not
+	  "Gram-Shmidt".
+
+2005-09-16 Friday 06:43  Abramo Bagnara
+
+	* src/: Bounding_Box.inlines.hh (1.8), Polyhedron.inlines.hh
+	  (1.121): Fixed mpq building from arbitrary coefficient type.
+
+2005-09-15 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected3_int16 (1.2),
+	  XSB/expected3_int32 (1.2), XSB/expected3_int8 (1.2),
+	  tests/expected_pchk_int16 (1.2), tests/expected_pchk_int32 (1.2),
+	  tests/expected_pchk_int8 (1.2): Adapted to the recent changes in
+	  pl_check.pl.
+
+2005-09-15 Thursday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int8_a (1.2): Adapted to
+	  the recent changes in pl_check.pl.
+
+2005-09-15 Thursday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int32_a (1.2): Adapted to
+	  the recent changes in pl_check.pl.
+
+2005-09-15 Thursday 18:21  Abramo Bagnara
+
+	* src/checked.inlines.hh (1.22): Faster and more precise
+	  implementation of gcd.
+
+2005-09-13 Tuesday 19:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/Makefile.am (grids.7): Add derived tests for the
+	  congruence adding tests.
+
+2005-09-13 Tuesday 19:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/addcongruence2.cc (grids.2): Use C_Polyhedron
+	  instead of NNC_Polyhedron.
+
+2005-09-13 Tuesday 18:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/: Makefile.am, congruences1.cc (grids.[6,1]):
+	  Add test congruences1 and derived test nnc_congruences1, which
+	  test the polyhedra congruence constructors.
+
+2005-09-13 Tuesday 18:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: C_Polyhedron.cc, C_Polyhedron.defs.hh, NNC_Polyhedron.cc,
+	  NNC_Polyhedron.defs.hh (grids.[3,3,3,3]): Add C_Polyhedron(const
+	  cgs), C_Polyhedron(cgs), NNC_Polyhedron(const cgs) and
+	  NNC_Polyhedron(cgs).
+
+2005-09-13 Tuesday 17:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/: Makefile.am, addcongruences1.cc,
+	  addcongruences2.cc, addcongruences3.cc, addcongruences4.cc,
+	  addcongruences5.cc (grids.[5,1,1,1,1,1]): Add addcongruences1-5.
+
+2005-09-13 Tuesday 17:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/: print.cc, print.hh (grids.[3,6]): Add
+	  print_constraints(cgs).
+
+2005-09-13 Tuesday 17:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Polyhedron.defs.hh, Polyhedron_nonpublic.cc,
+	  Polyhedron_public.cc (grids.[6,4,4]): Add
+	  throw_dimension_incompatible(m, cgs_name, cgs) and
+	  add_congruences(cgs).
+
+2005-09-13 Tuesday 17:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.66): In add_constraints(cs) only add
+	  cgs to the grid if congruences have been inserted into cgs.
+
+2005-09-13 Tuesday 17:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.46): Correct two descriptions.
+
+2005-09-13 Tuesday 15:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/: Makefile.am, addcongruence1.cc,
+	  addcongruence2.cc, addcongruence3.cc, addcongruence4.cc,
+	  addcongruence5.cc (grids.[4,1,1,1,1,1]): Add addcongruence1-5.
+
+2005-09-13 Tuesday 15:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.33): List related tests in TESTS on
+	  single lines.
+
+2005-09-13 Tuesday 15:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Polyhedron.defs.hh, Polyhedron_nonpublic.cc,
+	  Polyhedron_public.cc (grids.[5,3,3]): Add
+	  throw_dimension_incompatible(method, cg_name, cg) and
+	  add_congruence(cg).
+
+2005-09-13 Tuesday 15:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.20): Declare Polyhedron a friend.
+
+2005-09-13 Tuesday 15:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Constraint.cc, Constraint.defs.hh (grids.[3,4]): Add
+	  ascii_dump(s).
+
+2005-09-13 Tuesday 15:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.inlines.hh (grids.[11,15]): Make
+	  Congruence(c) a real function (was inline).
+
+2005-09-13 Tuesday 15:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.45): Use \brief on a line of its own.
+	  Prefer //! to \brief for single line comments.
+
+2005-09-13 Tuesday 15:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addconstraints1.cc (grids.5): Add test7 (adds an NNC
+	  constraint).
+
+2005-09-12 Monday 16:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* STANDARDS (1.23): Add coding standard entries for negation and
+	  comparison to zero.
+
+2005-09-12 Monday 14:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/certificate1.cc (grids.3): Correct an error message in
+	  test3.  Add test6, which uses zero dimension universes.
+
+2005-09-12 Monday 14:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Certificate.cc (grids.3): In Grid_Certificate(cgr)
+	  handle the zero dimension universe specially, and improve three
+	  comments.
+
+2005-09-12 Monday 14:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected3_int16_a (1.2),
+	  tests/expected_pchk_int16_a (1.2): Adapted to the recent changes
+	  in pl_check.pl.
+
+2005-09-11 Sunday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/maxspacedim.cc (1.7): Pass the right parameters to
+	  the BD_Shape template class.
+
+2005-09-11 Sunday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.25): Pass the right parameters to the
+	  BD_Shape template class.
+
+2005-09-11 Sunday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.26), BD_Shape.inlines.hh (1.60): Life
+	  of the user of BD_Shape is now simpler, as he can specify a
+	  BD_Shape by providing the base numerical type used to represent
+	  the inhomogeneous terms.
+
+2005-09-11 Sunday 11:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.10): Improved error and
+	  exception messages.  Try and ensure that regardless of the error
+	  or exception, an informative message detailing the group test and
+	  the predicates it is testing is printed.
+
+	  An extra noisy level added (noisy(2) for debugging (set by the
+	  predicate make_extra_noisy).
+
+	  check_all now is quiet only as a default and does not change
+	  existing noisy level.
+
+	  Avoiding abbreviations in group names to improve readability.
+
+	  Made three groups for testing the constructor predicates instead
+	  of one.  Simplified test for new_Polyhedron_from_space_dimension.
+
+	  Added tests for
+	  ppl_Polyhedron_generalized_affine_preimage_lhs_rhs.
+
+	  Improved tests  for ppl_Polyhedron_maximize_with_point and
+	  ppl_Polyhedron_minimize_with_point to correct behaviour on
+	  failure.
+
+2005-09-11 Sunday 10:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.defs.hh (1.18),
+	  src/Polyhedra_Powerset.inlines.hh (1.24),
+	  tests/Polyhedron/bhz03widening1.cc (1.6),
+	  tests/Polyhedron/bhz03widening2.cc (1.6),
+	  tests/Polyhedron/bhz03widening3.cc (1.6),
+	  tests/Polyhedron/bhz03widening6.cc (1.6): Removed the shorthand
+	  notation for
+	  Polyhedra_Powerset::BHZ03_widening_assing<BHRZ03_Certificate>(...).
+	  Now the user should always explicitly mention the (type of)
+	  certificate used for the base-level widening operator.
+
+2005-09-10 Saturday 23:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* instchk.hh (1.2): Description and copyright notice added.
+
+2005-09-10 Saturday 23:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (1.26): Avoid assert(0) and make sure
+	  the compiler does not think we are returning without a value.
+
+2005-09-10 Saturday 23:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.37): Avoid naming unused arguments.
+
+2005-09-10 Saturday 23:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.42): FIXME added.
+
+2005-09-10 Saturday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.176), instchk.hh (1.1): Started the
+	  implementation of the --enable-instances option.
+
+2005-09-08 Thursday 14:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.175): Better logic to handle interfaces that are
+	  enabled by default.
+
+2005-09-08 Thursday 01:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.174), Watchdog/configure.ac (1.28): Allow the
+	  specification of --enable-optimization=zero to temporarily get
+	  around bugs such as the one affecting Intel C/C++ 9.0.25 under
+	  Fedora Core 4.
+
+2005-09-08 Thursday 01:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.173), interfaces/Prolog/Ciao/Makefile.am (1.45),
+	  interfaces/Prolog/GNU/Makefile.am (1.48),
+	  interfaces/Prolog/SICStus/Makefile.am (1.54),
+	  interfaces/Prolog/SWI/Makefile.am (1.52),
+	  interfaces/Prolog/XSB/Makefile.am (1.35),
+	  interfaces/Prolog/YAP/Makefile.am (1.39): Allow to selectively
+	  enable the construction of the Prolog interfaces.
+
+2005-09-07 Wednesday 23:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Certificate.cc (grids.2): In Grid_Certificate(cgr) call
+	  simplify outside the points assertion.
+
+2005-09-07 Wednesday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.4): Only set `have_swi_prolog' and
+	  leave it to the caller to decide whether define an Automake
+	  conditional and which one.
+
+2005-09-07 Wednesday 08:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.172): Started implementing the new
+	  `--enable-interfaces' option.
+
+2005-09-06 Tuesday 16:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/widening1.cc (grids.5): Add test15, to show problems
+	  with using the Halbwachs method.
+
+2005-09-06 Tuesday 16:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_widenings.cc (grids.4): Add space between sentences.
+
+2005-09-06 Tuesday 15:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/certificate1.cc (grids.2): Use compare(gr) or struct
+	  Compare::operator() instead of compare(grc) in some of the
+	  comparison tests.  Also test is_stabilising in some of the tests.
+
+2005-09-06 Tuesday 15:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, certificate1.cc (grids.[32,1]): Add
+	  certificate1, which tests class Grid_Certificate.
+
+2005-09-06 Tuesday 13:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, contains2.cc (grids.[31,1]): Add
+	  contains2, which tests strictly_contains.
+
+2005-09-06 Tuesday 13:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/contains1.cc (grids.2): Improve failure messages.
+
+2005-09-06 Tuesday 13:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/bhz03widening1.cc (grids.2): Describe test1.  Add
+	  test2, where the widening falls back to joining the grids.
+
+2005-09-05 Monday 23:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Widening_Function.defs.hh, Widening_Function.inlines.hh,
+	  Widening_Function.types.hh (grids.[2,2,1]): Ported from the main
+	  trunk: the version of widen_fun_ref() building a limited widening
+	  function is now parametric on its second argument too (i.e., the
+	  limiting cs).
+
+2005-09-05 Monday 22:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruence1.cc (grids.6): Add colons to messages.
+
+2005-09-05 Monday 22:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, bhz03widening1.cc (grids.[30,1]): Add
+	  an initial bhz03widening1.
+
+2005-09-05 Monday 22:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Polyhedra_Powerset.inlines.hh, Polyhedron.defs.hh,
+	  Polyhedron.inlines.hh (grids.[4,4,4]): Add method
+	  Polyhedron::difference_assign, and use it in
+	  BHZ03_widening_assign (shadowing the trunk).
+
+2005-09-05 Monday 22:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.32): Shorten two comments.
+
+2005-09-05 Monday 22:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.defs.hh, Generator_System.defs.hh,
+	  Grid.defs.hh, Grid.inlines.hh (grids.[14,5,44,19]): Befriend
+	  Grid_Certificate where necessary.  Enable
+	  Grid::strictly_contains.  Add difference_assign.
+
+2005-09-05 Monday 22:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_Certificate.cc, Grid_Certificate.defs.hh,
+	  Grid_Certificate.inlines.hh, Grid_Certificate.types.hh,
+	  Makefile.am (grids.[1,1,1,1,7]): Add class Grid_Certificate.
+
+2005-09-05 Monday 17:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.inlines.hh (1.23), Polyhedron.defs.hh
+	  (1.278), Polyhedron.inlines.hh (1.120): Added method
+	  difference_assign(), which is now used in the widening on
+	  powersets.
+
+2005-09-05 Monday 11:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.65): In relation_with(cg) use the
+	  scalar_product_assign that expects cg to be at most the size of
+	  the generator.
+
+2005-09-05 Monday 11:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh (grids.[10,19]): Add
+	  scalar_product_assign(Coefficient&, const Congruence&, const
+	  Linear_Row&).
+
+2005-09-05 Monday 10:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Widening_Function.defs.hh (1.12),
+	  Widening_Function.inlines.hh (1.11), Widening_Function.types.hh
+	  (1.3): The version of widen_fun_ref() building a limited widening
+	  function is now parametric on its second argument too (i.e., the
+	  limiting cs).
+
+2005-09-04 Sunday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh (1.21): Workaround and FIXME added for the
+	  bug affecting lcm_generic().
+
+2005-09-04 Sunday 23:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.70): FIXME dealt with.
+
+2005-09-04 Sunday 21:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: join1.cc, join2.cc (grids.[8,4]): Use common
+	  Variables for all the tests.	Only call find_variation for the
+	  grid under test.
+
+2005-09-04 Sunday 21:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/generalizedaffinepreimage1.cc (grids.4): Correct the
+	  known grids in test3, test4 and test5.
+
+2005-09-04 Sunday 21:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/affinepreimage1.cc (grids.4): Note which second grid
+	  is under test in failure messages.  Correct the known grid and
+	  given variable in test13.
+
+2005-09-04 Sunday 20:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addconstraints1.cc (grids.4): Comment the end of the
+	  namespace block.
+
+2005-09-04 Sunday 20:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, contains1.cc, join3.cc
+	  (grids.[29,1,1]): Add contains1, including a test for the
+	  is_included_in error found via CHINA.  Add join3, which tests
+	  join_assign_if_exact.
+
+2005-09-04 Sunday 20:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.64): Implement join_assign_if_exact.
+
+2005-09-04 Sunday 19:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.31): In is_included_in check that
+	  all generators (including the first one) satisfy the congruences.
+
+2005-09-04 Sunday 00:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence.defs.hh, Congruence.inlines.hh (grids.[18,14]):
+	  Avoid returning references to temporaries.
+
+2005-09-04 Sunday 00:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Saturation_Row.cc (1.8): FIXME dealt with.
+
+2005-09-03 Saturday 23:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: Makefile.am, bug1.cc, bug1.dat (grids.[28,4,4]):
+	  Obsolete test program removed.
+
+2005-09-03 Saturday 23:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: NNC_Polyhedron.inlines.hh (grids.2),
+	  NNC_Polyhedron.inlines.hh (1.30): Added the implementation of
+	  NNC_Polyhedron::upper_bound_assign_if_exact(const
+	  NNC_Polyhedron&).
+
+2005-09-03 Saturday 13:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh, Determinate.inlines.hh,
+	  Polyhedra_Powerset.defs.hh, Polyhedra_Powerset.inlines.hh
+	  (grids.[2,3,3,3]): Added constructors taking congruence systems.
+
+2005-09-03 Saturday 13:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/Makefile.am, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Constraint_System.defs.hh, src/Determinate.inlines.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_nonpublic.cc,
+	  src/Powerset.inlines.hh, src/algorithms.hh, src/simplex.cc,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bdshull2.cc, tests/BD_Shape/bdshull3.cc,
+	  tests/BD_Shape/bdshull4.cc, tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/ch78widening6.cc, tests/BD_Shape/exceptions1.cc,
+	  tests/BD_Shape/polyhull1.cc, tests/BD_Shape/polyhull2.cc,
+	  tests/BD_Shape/polyhull3.cc, tests/BD_Shape/polyhull4.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/max_min1.cc,
+	  tests/Polyhedron/max_min2.cc, tests/Polyhedron/primalsimplex1.cc
+	  (grids.[3,3,3,2,3,3,3,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,3,1,1,1,1,2,2,2,3,2,2,2,2,3,2,2,1]):
+	  Third merge from main trunk.
+
+2005-09-03 Saturday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.inlines.hh (1.12): Output function fixed.
+
+2005-09-03 Saturday 13:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.inlines.hh (1.11): Bracketing fixed in
+	  operator<<(std::ostream&, const Powerset<CS>&).
+
+2005-09-03 Saturday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh (1.50): Do not refer to
+	  element().poly_hull_assign(): refer to
+	  element().upper_bound_assign() instead.
+
+2005-09-03 Saturday 12:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.inlines.hh, Grid_Status.cc,
+	  Grid_conversion.cc, Grid_nonpublic.cc (grids.[6,3,19,30]): Update
+	  FSF address.
+
+2005-09-03 Saturday 12:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_public.cc
+	  (grids.[43,18,63]): Add methods upper_bound_assign,
+	  join_assign_if_exact and upper_bound_assign_if_exact.
+
+2005-09-03 Saturday 12:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/join1.cc (grids.7): Use upper_bound_assign in some of
+	  the tests.
+
+2005-09-03 Saturday 12:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addconstraints1.cc (grids.3): Update FSF address.
+
+2005-09-03 Saturday 12:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.25), BD_Shape.inlines.hh (1.59): Added
+	  declarations and dummy implementations for method bool
+	  BD_Shape<T>::bds_hull_assign_if_exact(const BD_Shape&) and its
+	  alias bool BD_Shape<T>::upper_bound_assign_if_exact(const
+	  BD_Shape&).
+
+2005-09-03 Saturday 12:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.37), NNC_Polyhedron.defs.hh (1.39):
+	  Comments fixed and completed.
+
+2005-09-03 Saturday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.36), NNC_Polyhedron.defs.hh (1.38):
+	  Comments fixed.
+
+2005-09-03 Saturday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.35), C_Polyhedron.inlines.hh
+	  (1.28), NNC_Polyhedron.cc (1.16), NNC_Polyhedron.defs.hh (1.37):
+	  Be consistent in the choice of parameters' names.
+
+2005-09-03 Saturday 12:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.22): Use the
+	  PH::upper_bound_assign_if_exact() method and not the function
+	  with the same name.
+
+2005-09-03 Saturday 12:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: addcongruence1.cc, addgenerator1.cc,
+	  addspacedims1.cc, addspacedims2.cc, affineimage1.cc,
+	  affinepreimage1.cc, bug1.cc, concatenate1.cc, congruence1.cc,
+	  congruencesystem1.cc, congruencesystem2.cc, equals1.cc,
+	  expandspacedim1.cc, foldspacedims1.cc,
+	  generalizedaffineimage1.cc, generalizedaffineimage2.cc,
+	  generalizedaffinepreimage1.cc, generalizedaffinepreimage2.cc,
+	  grid1.cc, grid2.cc, griddifference1.cc, intersection1.cc,
+	  intersection2.cc, isuniverse1.cc, join1.cc, join2.cc,
+	  limitedextrapolation1.cc, mapspacedims1.cc, relations1.cc,
+	  relations2.cc, removespacedims1.cc, removespacedims2.cc,
+	  timeelapse1.cc, widening1.cc, writecongruencesystem.cc
+	  (grids.[4,10,8,5,4,3,3,2,5,6,6,2,4,3,3,4,3,3,20,16,5,4,5,3,6,3,3,9,3,5,5,4,3,4,5]):
+	  Update FSF address.
+
+2005-09-03 Saturday 12:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.16), C_Polyhedron.defs.hh (1.34),
+	  C_Polyhedron.inlines.hh (1.27), NNC_Polyhedron.cc (1.15),
+	  NNC_Polyhedron.defs.hh (1.36), algorithms.hh (1.42): New methods
+	  bool C_Polyhedron::poly_hull_assign_if_exact(const C_Polyhedron&)
+	  and bool NNC_Polyhedron::poly_hull_assign_if_exact(const
+	  NNC_Polyhedron&) and their synonyms bool
+	  C_Polyhedron::upper_bound_assign_if_exact(const C_Polyhedron&)
+	  and bool NNC_Polyhedron::upper_bound_assign_if_exact(const
+	  NNC_Polyhedron&).
+
+2005-09-03 Saturday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.277): Long source line avoided.
+
+2005-09-03 Saturday 11:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+	  Congruence_System.cc, Congruence_System.defs.hh, Grid.defs.hh,
+	  Grid.inlines.hh, Grid_Status.idefs.hh, Grid_Status.inlines.hh,
+	  Grid_chdims.cc, Grid_minimize.cc, Grid_public.cc,
+	  Grid_simplify.cc, Grid_widenings.cc
+	  (grids.[9,17,13,23,13,42,17,3,2,17,17,62,30,3]): Update FSF
+	  address.
+
+2005-09-03 Saturday 11:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: max_min1.cc (1.5), max_min2.cc (1.5): Adapted
+	  so as to use the new interfaces for maximize() and minimize().
+
+2005-09-03 Saturday 11:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/writecongruencesystem.cc (grids.4): Use a single equal
+	  sign in the expected output string.
+
+2005-09-03 Saturday 11:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: addcongruence1.cc, addgenerator1.cc,
+	  affineimage1.cc, affinepreimage1.cc, expandspacedim1.cc,
+	  foldspacedims1.cc, generalizedaffineimage1.cc,
+	  generalizedaffineimage2.cc, generalizedaffinepreimage1.cc,
+	  generalizedaffinepreimage2.cc, grid1.cc, grid2.cc,
+	  griddifference1.cc, intersection1.cc, intersection2.cc,
+	  limitedextrapolation1.cc, mapspacedims1.cc, relations1.cc,
+	  relations2.cc, timeelapse1.cc, widening1.cc
+	  (grids.[3,9,3,2,3,2,2,3,2,2,19,15,4,3,4,2,8,2,4,2,3]): Use the
+	  new Degenerate_Element kinds.
+
+2005-09-03 Saturday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.21): Refer to
+	  "upper_bound_assign" methods rather than "poly_hull_assign" ones.
+	  Corrected several instances were the
+	  `Determinate<PH>::element()' accessor was not used.
+
+2005-09-03 Saturday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.defs.hh (1.17): New typedef `element_type'
+	  corresponding to the type of the underlying numeric domain.
+
+2005-09-03 Saturday 10:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addconstraints1.cc (grids.2): Dump grids on error.
+	  Test Grid(ccs).  Add tests where the resulting grid is empty.
+
+2005-09-03 Saturday 10:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.24), src/BD_Shape.inlines.hh (1.58),
+	  tests/BD_Shape/Makefile.am (1.14), tests/BD_Shape/bdshull1.cc
+	  (1.1), tests/BD_Shape/bdshull2.cc (1.1),
+	  tests/BD_Shape/bdshull3.cc (1.1), tests/BD_Shape/bdshull4.cc
+	  (1.1), tests/BD_Shape/cc76extrapolation2.cc (1.5),
+	  tests/BD_Shape/cc76extrapolation6.cc (1.6),
+	  tests/BD_Shape/ch78widening6.cc (1.6),
+	  tests/BD_Shape/exceptions1.cc (1.6), tests/BD_Shape/polyhull1.cc
+	  (1.5), tests/BD_Shape/polyhull2.cc (1.5),
+	  tests/BD_Shape/polyhull3.cc (1.5), tests/BD_Shape/polyhull4.cc
+	  (1.5): Methods BD_Shape::poly_hull_assign* renamed
+	  bds_hull_assign*.  New method void upper_bound_assign(const
+	  BD_Shape<T>& y) is the same as bds_hull_assign(y).
+
+2005-09-03 Saturday 10:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.61): In Grid(ccs) ensure that the grid
+	  is the same dimension as ccs.
+
+2005-09-03 Saturday 10:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.276), Polyhedron.inlines.hh (1.119):
+	  New method void upper_bound_assign(const Polyhedron& y) is the
+	  same as poly_hull_assign(y).
+
+2005-09-03 Saturday 10:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.18): Corrected to match the new
+	  specifications for Polyhedron::maximize(), Polyhedron::minimize()
+	  and Constraint_System::primal_simplex().  Also corrected a memory
+	  leak bug.
+
+2005-09-03 Saturday 10:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: C/ppl_c.cc (1.137), C/ppl_c.h.in (1.52),
+	  Prolog/ppl_prolog.icc (1.160): Interfaces updated to match the
+	  new specifications of Polyhedron::maximize(),
+	  Polyhedron::minimize() and Constraint_System::primal_simplex().
+
+2005-09-03 Saturday 10:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.57), Constraint_System.defs.hh
+	  (1.11), Polyhedron.defs.hh (1.275), Polyhedron.inlines.hh
+	  (1.118), Polyhedron_nonpublic.cc (1.50), simplex.cc (1.12):
+	  Corrected a bug in the implementation of
+	  Constraint_System::primal_simplex() whereby a feasible solution
+	  was claimed even for inconsistent constraint systems. Added
+	  private method   Simplex_Status
+	  Constraint_System::primal_simplex(obj, gen) that maximizes obj on
+	  the low-level polyhedron (i.e., the eps-polyhedron if topology is
+	  NNC) encoded by the constraint system.  New method used to
+	  correct a bug in the implementation of
+	  Polyhedron::minimized_constraints() whereby the constraint system
+	  could have been marked minimized even if it was not.	Simplified
+	  the interfaces of methods   Polyhedron::minimize(),
+	  Polyhedron::maximize(),   Constraint_System::primal_simplex() by
+	  avoiding memory-leakage prone parameter passing.
+
+2005-09-02 Friday 23:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.26), primalsimplex1.cc (1.1):
+	  This test shows an error in Constraint_System::primal_simplex().
+
+2005-09-02 Friday 20:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh, Grid_public.cc (grids.[41,60]): Use the
+	  global DEGENERATE_ELEMENT enum instead of the local
+	  DEGENERATE_KIND.
+
+2005-09-02 Friday 19:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.inlines.hh (grids.12): Compute the row capacity in
+	  Congruence(c).
+
+2005-09-02 Friday 18:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, addconstraints1.cc (grids.[27,1]): Add
+	  addconstraints1.
+
+2005-09-02 Friday 18:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.inlines.hh (grids.11): Account for the extra
+	  element in NNC constraints in Congruence(c).
+
+2005-09-02 Friday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.44): Dividing by 10 the
+	  parameter GLOBALSTKSIZE seems to help testing with clpq2.
+
+2005-09-02 Friday 18:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING, Makefile.am, NEWS, README, README.configure, STANDARDS,
+	  TODO, build_header, compile, config.guess, config.rpath,
+	  config.sub, configure.ac, depcomp, install-sh, ltmain.sh,
+	  missing, mkinstalldirs, Watchdog/COPYING,
+	  Watchdog/Doubly_Linked_Object.defs.hh,
+	  Watchdog/Doubly_Linked_Object.inlines.hh, Watchdog/EList.defs.hh,
+	  Watchdog/EList.inlines.hh, Watchdog/EList_Iterator.defs.hh,
+	  Watchdog/EList_Iterator.inlines.hh, Watchdog/Handler.defs.hh,
+	  Watchdog/Handler.inlines.hh, Watchdog/Makefile.am,
+	  Watchdog/Pending_Element.cc, Watchdog/Pending_Element.defs.hh,
+	  Watchdog/Pending_Element.inlines.hh, Watchdog/Pending_List.cc,
+	  Watchdog/Pending_List.defs.hh, Watchdog/Pending_List.inlines.hh,
+	  Watchdog/README, Watchdog/Time.cc, Watchdog/Time.defs.hh,
+	  Watchdog/Time.inlines.hh, Watchdog/Watchdog.cc,
+	  Watchdog/Watchdog.defs.hh, Watchdog/Watchdog.inlines.hh,
+	  Watchdog/compile, Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/configure.ac, Watchdog/depcomp, Watchdog/install-sh,
+	  Watchdog/ltmain.sh, Watchdog/missing, Watchdog/mkinstalldirs,
+	  Watchdog/pwl_header.bottom, Watchdog/pwl_header.hh,
+	  Watchdog/pwl_header.middle, Watchdog/pwl_header.top,
+	  Watchdog/utils/.cvsignore, Watchdog/utils/Makefile.am,
+	  Watchdog/utils/build_header, debian/libppl-pwl.copyright.in,
+	  debian/libppl.copyright.in, demos/Makefile.am,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+	  doc/README.doc, doc/definitions.dox,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/fdl.dox, doc/fdl.tex, doc/fdl.txt, doc/gpl.dox, doc/gpl.tex,
+	  doc/gpl.txt, doc/ppl.sty, doc/user-browse.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  interfaces/Makefile.am, interfaces/C/Makefile.am,
+	  interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+	  interfaces/OCaml/Makefile.am, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/gp_clpq.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/pl_clpq.cc,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/SWI/ppl_pl.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/ppl_yap.pl,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/pl_check.pl, m4/Makefile.am,
+	  m4/ac_check_gmp.m4, m4/ac_check_swi_prolog.m4,
+	  m4/ac_cxx_attribute_weak.m4, m4/ac_cxx_double_is_iec_559.m4,
+	  m4/ac_cxx_flexible_arrays.m4, m4/ac_cxx_float_is_iec_559.m4,
+	  m4/ac_cxx_long_double.m4, m4/ac_cxx_long_double_is_iec_559.m4,
+	  m4/ac_cxx_long_long.m4, m4/ppl.m4, src/Ask_Tell.defs.hh,
+	  src/Ask_Tell.inlines.hh, src/BDS_Status.idefs.hh,
+	  src/BDS_Status.inlines.hh, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+	  src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	  src/C_Polyhedron.inlines.hh, src/Checked_Number.cc,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Coefficient.cc, src/Coefficient.defs.hh,
+	  src/Coefficient.inlines.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/Constraint_System.inlines.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Row.defs.hh,
+	  src/DB_Row.inlines.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/E_NIT.defs.hh,
+	  src/E_NIT.inlines.hh, src/E_NIT.types.hh, src/E_Rational.defs.hh,
+	  src/E_Rational.inlines.hh, src/E_Rational.types.hh,
+	  src/Float.defs.hh, src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/Generator.cc,
+	  src/Generator.defs.hh, src/Generator.inlines.hh,
+	  src/Generator_System.cc, src/Generator_System.defs.hh,
+	  src/Generator_System.inlines.hh, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+	  src/Init.cc, src/Init.defs.hh, src/Interval.cc,
+	  src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Interval.types.hh, src/Limits.hh, src/Linear_Expression.cc,
+	  src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	  src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	  src/Linear_Row.inlines.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/Matrix.inlines.hh, src/NNC_Polyhedron.cc,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Numeric_Format.defs.hh, src/Ph_Status.cc,
+	  src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+	  src/Poly_Con_Relation.cc, src/Poly_Con_Relation.defs.hh,
+	  src/Poly_Con_Relation.inlines.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+	  src/Result.defs.hh, src/Result.inlines.hh, src/Rounding.defs.hh,
+	  src/Rounding.types.hh, src/Row.cc, src/Row.defs.hh,
+	  src/Row.inlines.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+	  src/Saturation_Row.cc, src/Saturation_Row.defs.hh,
+	  src/Saturation_Row.inlines.hh, src/Variable.cc,
+	  src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Widening_Function.defs.hh, src/Widening_Function.inlines.hh,
+	  src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_ext.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/compiler.hh, src/conversion.cc, src/float.types.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh, src/initializer.hh,
+	  src/max_space_dimension.hh, src/minimize.cc, src/namespaces.hh,
+	  src/ppl-config.cc.in, src/ppl_header.hh, src/simplex.cc,
+	  src/simplify.cc, src/swapping_sort.icc, src/version.cc,
+	  src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+	  tests/Makefile.am, tests/PFunction.cc, tests/PFunction.hh,
+	  tests/ehandlers.cc, tests/ehandlers.hh, tests/files.cc,
+	  tests/files.hh, tests/ppl_test.hh, tests/print.cc,
+	  tests/print.hh, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+	  tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/addspacedims7.cc, tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+	  tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+	  tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/affinepreimage5.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation3.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/cc76extrapolation5.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc,
+	  tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+	  tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+	  tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+	  tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/concatenate2.cc,
+	  tests/BD_Shape/concatenate3.cc, tests/BD_Shape/concatenate4.cc,
+	  tests/BD_Shape/concatenate5.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/constraints2.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/contains2.cc, tests/BD_Shape/contains3.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/empty2.cc,
+	  tests/BD_Shape/empty3.cc, tests/BD_Shape/empty4.cc,
+	  tests/BD_Shape/empty5.cc, tests/BD_Shape/equality1.cc,
+	  tests/BD_Shape/exceptions1.cc, tests/BD_Shape/exceptions2.cc,
+	  tests/BD_Shape/exceptions3.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage11.cc,
+	  tests/BD_Shape/generalizedaffineimage12.cc,
+	  tests/BD_Shape/generalizedaffineimage13.cc,
+	  tests/BD_Shape/generalizedaffineimage14.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage6.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/generalizedaffineimage9.cc,
+	  tests/BD_Shape/h79widening1.cc, tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/intersection2.cc, tests/BD_Shape/intersection3.cc,
+	  tests/BD_Shape/intersection4.cc, tests/BD_Shape/intersection5.cc,
+	  tests/BD_Shape/intersection6.cc, tests/BD_Shape/intersection7.cc,
+	  tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/limitedCC76extrapolation1.cc,
+	  tests/BD_Shape/limitedCC76extrapolation2.cc,
+	  tests/BD_Shape/limitedCC76extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation1.cc,
+	  tests/BD_Shape/limitedCH78extrapolation2.cc,
+	  tests/BD_Shape/limitedCH78extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation4.cc,
+	  tests/BD_Shape/limitedCH78extrapolation5.cc,
+	  tests/BD_Shape/limitedCH78extrapolation6.cc,
+	  tests/BD_Shape/limitedCH78extrapolation7.cc,
+	  tests/BD_Shape/limitedCH78extrapolation8.cc,
+	  tests/BD_Shape/limitedCH78extrapolation9.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+	  tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/polydifference1.cc,
+	  tests/BD_Shape/polydifference2.cc,
+	  tests/BD_Shape/polydifference3.cc,
+	  tests/BD_Shape/polydifference4.cc,
+	  tests/BD_Shape/polydifference5.cc,
+	  tests/BD_Shape/polydifference6.cc, tests/BD_Shape/polyhull1.cc,
+	  tests/BD_Shape/polyhull2.cc, tests/BD_Shape/polyhull3.cc,
+	  tests/BD_Shape/polyhull4.cc, tests/BD_Shape/relations1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/relations4.cc, tests/BD_Shape/relations5.cc,
+	  tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/removespacedims2.cc,
+	  tests/BD_Shape/removespacedims3.cc,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+	  tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+	  tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+	  tests/BD_Shape/writebdshape1.cc, tests/BD_Shape/writebdshape2.cc,
+	  tests/Polyhedron/CbecomesNNC1.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/NNCbecomesC1.cc,
+	  tests/Polyhedron/NNCminimize1.cc,
+	  tests/Polyhedron/NNCminimize2.cc,
+	  tests/Polyhedron/NNCminimize3.cc,
+	  tests/Polyhedron/NNCminimize4.cc,
+	  tests/Polyhedron/NNCminimize5.cc,
+	  tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraint2.cc,
+	  tests/Polyhedron/addconstraint3.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints10.cc,
+	  tests/Polyhedron/addconstraints11.cc,
+	  tests/Polyhedron/addconstraints12.cc,
+	  tests/Polyhedron/addconstraints13.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addconstraints3.cc,
+	  tests/Polyhedron/addconstraints4.cc,
+	  tests/Polyhedron/addconstraints5.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/addconstraints7.cc,
+	  tests/Polyhedron/addconstraints8.cc,
+	  tests/Polyhedron/addconstraints9.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerator3.cc,
+	  tests/Polyhedron/addgenerator4.cc,
+	  tests/Polyhedron/addgenerator5.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators10.cc,
+	  tests/Polyhedron/addgenerators11.cc,
+	  tests/Polyhedron/addgenerators12.cc,
+	  tests/Polyhedron/addgenerators13.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addgenerators3.cc,
+	  tests/Polyhedron/addgenerators4.cc,
+	  tests/Polyhedron/addgenerators5.cc,
+	  tests/Polyhedron/addgenerators6.cc,
+	  tests/Polyhedron/addgenerators7.cc,
+	  tests/Polyhedron/addgenerators8.cc,
+	  tests/Polyhedron/addgenerators9.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims10.cc,
+	  tests/Polyhedron/addspacedims11.cc,
+	  tests/Polyhedron/addspacedims12.cc,
+	  tests/Polyhedron/addspacedims13.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/addspacedims4.cc,
+	  tests/Polyhedron/addspacedims5.cc,
+	  tests/Polyhedron/addspacedims6.cc,
+	  tests/Polyhedron/addspacedims7.cc,
+	  tests/Polyhedron/addspacedims8.cc,
+	  tests/Polyhedron/addspacedims9.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affineimage3.cc,
+	  tests/Polyhedron/affineimage4.cc,
+	  tests/Polyhedron/affineimage5.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/affineimage7.cc,
+	  tests/Polyhedron/affineimage8.cc,
+	  tests/Polyhedron/affineimage9.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinepreimage10.cc,
+	  tests/Polyhedron/affinepreimage11.cc,
+	  tests/Polyhedron/affinepreimage2.cc,
+	  tests/Polyhedron/affinepreimage3.cc,
+	  tests/Polyhedron/affinepreimage4.cc,
+	  tests/Polyhedron/affinepreimage5.cc,
+	  tests/Polyhedron/affinepreimage6.cc,
+	  tests/Polyhedron/affinepreimage7.cc,
+	  tests/Polyhedron/affinepreimage8.cc,
+	  tests/Polyhedron/affinepreimage9.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/ascii_dump_load4.cc,
+	  tests/Polyhedron/ascii_dump_load5.cc,
+	  tests/Polyhedron/ascii_dump_load6.cc,
+	  tests/Polyhedron/ascii_dump_load7.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening10.cc,
+	  tests/Polyhedron/bhrz03widening11.cc,
+	  tests/Polyhedron/bhrz03widening12.cc,
+	  tests/Polyhedron/bhrz03widening13.cc,
+	  tests/Polyhedron/bhrz03widening14.cc,
+	  tests/Polyhedron/bhrz03widening15.cc,
+	  tests/Polyhedron/bhrz03widening16.cc,
+	  tests/Polyhedron/bhrz03widening17.cc,
+	  tests/Polyhedron/bhrz03widening18.cc,
+	  tests/Polyhedron/bhrz03widening19.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhrz03widening4.cc,
+	  tests/Polyhedron/bhrz03widening5.cc,
+	  tests/Polyhedron/bhrz03widening6.cc,
+	  tests/Polyhedron/bhrz03widening7.cc,
+	  tests/Polyhedron/bhrz03widening8.cc,
+	  tests/Polyhedron/bhrz03widening9.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening4.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffineimage2.cc,
+	  tests/Polyhedron/boundedaffineimage3.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage2.cc,
+	  tests/Polyhedron/boundedaffinepreimage3.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc,
+	  tests/Polyhedron/boundingbox4.cc,
+	  tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/bounds2.cc, tests/Polyhedron/bug2.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/concatenate2.cc,
+	  tests/Polyhedron/concatenate3.cc,
+	  tests/Polyhedron/concatenate4.cc,
+	  tests/Polyhedron/concatenate5.cc,
+	  tests/Polyhedron/concatenate6.cc,
+	  tests/Polyhedron/concatenate7.cc,
+	  tests/Polyhedron/constraints1.cc,
+	  tests/Polyhedron/constraints2.cc,
+	  tests/Polyhedron/constraints3.cc,
+	  tests/Polyhedron/constraints4.cc,
+	  tests/Polyhedron/constraints5.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+	  tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/disjoint3.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage10.cc,
+	  tests/Polyhedron/generalizedaffineimage11.cc,
+	  tests/Polyhedron/generalizedaffineimage12.cc,
+	  tests/Polyhedron/generalizedaffineimage13.cc,
+	  tests/Polyhedron/generalizedaffineimage14.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffineimage3.cc,
+	  tests/Polyhedron/generalizedaffineimage4.cc,
+	  tests/Polyhedron/generalizedaffineimage5.cc,
+	  tests/Polyhedron/generalizedaffineimage6.cc,
+	  tests/Polyhedron/generalizedaffineimage7.cc,
+	  tests/Polyhedron/generalizedaffineimage8.cc,
+	  tests/Polyhedron/generalizedaffineimage9.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generalizedaffinepreimage3.cc,
+	  tests/Polyhedron/generalizedaffinepreimage4.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+	  tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+	  tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+	  tests/Polyhedron/generators7.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/gramshmidt1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc,
+	  tests/Polyhedron/h79widening3.cc,
+	  tests/Polyhedron/h79widening4.cc,
+	  tests/Polyhedron/h79widening5.cc,
+	  tests/Polyhedron/h79widening6.cc,
+	  tests/Polyhedron/h79widening7.cc,
+	  tests/Polyhedron/h79widening8.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/intersection10.cc,
+	  tests/Polyhedron/intersection11.cc,
+	  tests/Polyhedron/intersection2.cc,
+	  tests/Polyhedron/intersection3.cc,
+	  tests/Polyhedron/intersection4.cc,
+	  tests/Polyhedron/intersection5.cc,
+	  tests/Polyhedron/intersection6.cc,
+	  tests/Polyhedron/intersection7.cc,
+	  tests/Polyhedron/intersection8.cc,
+	  tests/Polyhedron/intersection9.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation2.cc,
+	  tests/Polyhedron/limitedh79extrapolation3.cc,
+	  tests/Polyhedron/limitedh79extrapolation4.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearpartition2.cc,
+	  tests/Polyhedron/linearpartition3.cc,
+	  tests/Polyhedron/linearpartition4.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/mapspacedims1.cc,
+	  tests/Polyhedron/mapspacedims2.cc,
+	  tests/Polyhedron/mapspacedims3.cc,
+	  tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/max_min1.cc,
+	  tests/Polyhedron/max_min2.cc, tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+	  tests/Polyhedron/membytes2.cc, tests/Polyhedron/memory1.cc,
+	  tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/minconstraints3.cc,
+	  tests/Polyhedron/minconstraints4.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/mingenerators3.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polydifference3.cc,
+	  tests/Polyhedron/polydifference4.cc,
+	  tests/Polyhedron/polydifference5.cc,
+	  tests/Polyhedron/polydifference6.cc,
+	  tests/Polyhedron/polydifference7.cc,
+	  tests/Polyhedron/polydifference8.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+	  tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+	  tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+	  tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+	  tests/Polyhedron/polyhull9.cc, tests/Polyhedron/polypowerset1.cc,
+	  tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+	  tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+	  tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+	  tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+	  tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+	  tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+	  tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+	  tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+	  tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+	  tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+	  tests/Polyhedron/relations9.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims10.cc,
+	  tests/Polyhedron/removespacedims2.cc,
+	  tests/Polyhedron/removespacedims3.cc,
+	  tests/Polyhedron/removespacedims4.cc,
+	  tests/Polyhedron/removespacedims5.cc,
+	  tests/Polyhedron/removespacedims6.cc,
+	  tests/Polyhedron/removespacedims7.cc,
+	  tests/Polyhedron/removespacedims8.cc,
+	  tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+	  tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+	  tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+	  tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+	  tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+	  tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+	  tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+	  tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+	  tests/Polyhedron/universe7.cc, tests/Polyhedron/watchdog1.cc,
+	  tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writegensys2.cc,
+	  tests/Polyhedron/writegensys3.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writepolyhedron3.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+	  utils/build_header, utils/text2cxxarray, utils/timings.cc,
+	  utils/timings.hh
+	  (grids.[1,2,2,2,1,3,2,2,1,2,1,2,3,1,2,2,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,2,2,1,1,2,1,2,2,1,2,1,7,2,2,2,1,1,1,1,1,1,2,1,1,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,1,1,2,4,1,1,1,1,1,2,2,1,1,2,2,2,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,2,2,1,1,1,1,1,2,2,1,1,1,2,3,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,2,2,3,2,3,6,3,12,4,1,1,1,1,2,2,1,2,2,1,1,2,4,2,4,4,3,1,1,1,6,2,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,2,1,2,1,2, [...]
+	  Second merge from main trunk.
+
+2005-09-02 Friday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.16): Take reference to pending rows
+	  out of comment.
+
+2005-09-02 Friday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/timings.cc (1.5): Fixed print_clock().
+
+2005-09-02 Friday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
+	  (grids.[40,29,59]): Add add_constraint, add_constraints and
+	  Grid(cs). Add throw_dimension_incompatible methods for
+	  Constraints and Constraint_Systems.
+
+2005-09-02 Friday 11:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.inlines.hh (grids.10): Check for all cases of
+	  trivially true congruences.
+
+2005-09-02 Friday 11:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.defs.hh, Congruence_System.cc (grids.[16,22]):
+	  Strong normalize congruences before outputting them from the
+	  congruence system.
+
+2005-09-02 Friday 11:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.cc (grids.8): In the output operator only output
+	  the modulus for proper congruences, and use `=' instead of `=='.
+
+2005-09-02 Friday 10:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.21): Use `while (true)' instead
+	  of `while (1)'.
+
+2005-09-02 Friday 10:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator_System.cc (grids.11): Use booleans when booleans
+	  are intended.
+
+2005-09-02 Friday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (grids.58): Print only the minimized
+	  congruences.
+
+2005-09-01 Thursday 19:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.49): When strongly minimizing a
+	  constraint system, if we add back an epsilon upper bound
+	  constraint we should reset the minimization flag.
+
+2005-09-01 Thursday 18:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.57): In generalized_affine_preimage
+	  improve a variable name and skip the normalization check when
+	  inserting the lines.
+
+2005-09-01 Thursday 18:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.28): Set gen_sys's sortedness false
+	  after clearing gen_sys.  Correct a comment.
+
+2005-09-01 Thursday 18:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.15): In map_space_dimensions clear
+	  minimized flags after permuting columns, and skip the
+	  normalization check when inserting generators.
+
+2005-09-01 Thursday 17:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.56): In the copy constructor set
+	  gen_sys's sortedness to false when given grid's generators are
+	  out of date.	In OK correct a comment and a message and test that
+	  gen_sys's sortedness is false.
+
+2005-09-01 Thursday 17:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.inlines.hh, Grid_chdims.cc, Grid_simplify.cc
+	  (grids.[14,16,29]): Set gen_sys's sortedness to false after
+	  clearing gen_sys.  Take extra set_sorted calls out of the
+	  generator simplify method.
+
+2005-09-01 Thursday 15:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.13): Set sortedness of the temporary
+	  generators system in map_space_dimensions to false.
+
+2005-09-01 Thursday 15:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.27): Take tracing out of
+	  is_included_in.
+
+2005-09-01 Thursday 15:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.20): Take tracing out of
+	  satisfies_all_congruences.
+
+2005-09-01 Thursday 15:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_nonpublic.cc, Grid_public.cc (grids.[26,55]): Always
+	  and only set sorted to false when adding new generators.
+
+2005-09-01 Thursday 15:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.15): Use correct domain in comment.
+
+2005-09-01 Thursday 15:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.39): Take out old Polyhedra comments.
+
+2005-09-01 Thursday 15:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.cc (1.20): Prefer pre-increment to
+	  post-increment.
+
+2005-09-01 Thursday 15:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.56): Using direct initialization
+	  instead of definition+assignment in a few places.
+
+2005-09-01 Thursday 14:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.cc (1.64): Reverted previosu change, since it might
+	  result in poorer performance.
+
+2005-09-01 Thursday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* install-sh (1.15), ltmain.sh (1.26), Watchdog/install-sh (1.12),
+	  Watchdog/ltmain.sh (1.15): Updated from Libtool 1.5.20.
+
+2005-08-31 Wednesday 18:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.38): Mark up parameter description
+	  correctly.
+
+2005-08-31 Wednesday 18:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (grids.6): Correct spelling of anchor.
+
+2005-08-31 Wednesday 17:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (grids.5): Clip trailing whitespace.
+
+2005-08-31 Wednesday 17:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Makefile.am (grids.5): Add grid_widenings.cc to
+	  libppl_la_SOURCES.
+
+2005-08-31 Wednesday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/bug1.dat, src/Grid_public.cc (grids.[3,54]): Enable
+	  dumping and loading of the entire status.
+
+2005-08-31 Wednesday 16:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_Status.cc (grids.2): Append a newline to the ASCII dump.
+	  ASCII dump on failure of the empty flag check in the OK method.
+	  Correct the class name in the file header.
+
+2005-08-30 Tuesday 15:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh (1.49): Do not override the output
+	  function of PH.
+
+2005-08-30 Tuesday 15:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.55): Do not refer to nonexistent
+	  constructors.
+
+2005-08-29 Monday 23:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: Makefile.am (1.14), ppl.m4 (1.1): Initial revision of an
+	  Autoconf function to test for the existence and usability of
+	  particular versions of the PPL, defining macros containing the
+	  required paths.
+
+2005-08-29 Monday 18:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: tests/pl_check.pl (1.9),
+	  Ciao/ciao_pl_check.pl (1.13), XSB/xsb_pl_check.P (1.18): Added
+	  tests for Prolog interface predicates: bounded_affine_image,
+	  bounded_affine_preimage, generalized_affine_preimage.
+
+2005-08-29 Monday 17:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Coefficient.defs.hh (1.4), Coefficient.inlines.hh (1.4),
+	  Generator.cc (1.63), Linear_Row.cc (1.7), globals.defs.hh (1.22),
+	  globals.inlines.hh (1.11), simplex.cc (1.11): Do use
+	  Coefficient_traits where appropriate.
+
+2005-08-29 Monday 16:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.23), BD_Shape.inlines.hh (1.54): Using
+	  Coefficient_traits where appropriate.  Corrected a few comments.
+	  Trying to clean up affine_image().
+
+2005-08-29 Monday 12:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.22): No longer mention is_nonnegative().
+
+2005-08-29 Monday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: cc76extrapolation6.cc (1.5), ch78widening6.cc
+	  (1.5), relations1.cc (1.7), relations2.cc (1.7), relations3.cc
+	  (1.6), relations4.cc (1.5), relations5.cc (1.7): Added, when
+	  needed, using directives for IO_Operators.
+
+2005-08-29 Monday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.53): No longer refer to the obsolete
+	  function is_nonnegative().
+
+2005-08-29 Monday 09:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/gramshmidt1.cc (1.1): Draft test program for
+	  Constraint_System::gram_shmidt().
+
+2005-08-28 Sunday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bounding_Box.inlines.hh (1.7), Polyhedron.inlines.hh
+	  (1.117): Objects of type mpq_class now created properly.
+
+2005-08-28 Sunday 12:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.159), Ciao/ppl_ciao.pl
+	  (1.81), GNU/ppl_gprolog.pl (1.53), SICStus/ppl_sicstus_sd.cc
+	  (1.77), SWI/ppl_swiprolog.cc (1.101), XSB/ppl_xsb.H (1.40),
+	  XSB/ppl_xsb.cc (1.68), YAP/ppl_yap.cc (1.93): Interfaced new
+	  methods computing preimages of generalized affine relations.
+
+2005-08-28 Sunday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bounding_Box.inlines.hh (1.6): Temporary kludges to avoid the
+	  selection of the wrong mpq_class constructor.
+
+2005-08-28 Sunday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_check_gmp.m4 (1.22), ac_check_swi_prolog.m4 (1.3),
+	  ac_cxx_attribute_weak.m4 (1.6), ac_cxx_double_is_iec_559.m4
+	  (1.4), ac_cxx_flexible_arrays.m4 (1.11),
+	  ac_cxx_float_is_iec_559.m4 (1.4), ac_cxx_long_double.m4 (1.5),
+	  ac_cxx_long_double_is_iec_559.m4 (1.4), ac_cxx_long_long.m4
+	  (1.4): Broken comments restored.
+
+2005-08-28 Sunday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* missing (1.12), Watchdog/missing (1.8): Broken comments restored.
+
+2005-08-27 Saturday 23:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.8): Progress on the --ldflags option.
+
+2005-08-27 Saturday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.32), Watchdog/Makefile.am (1.21): The `configure'
+	  script is now listed in `dist_noinst_SCRIPTS' and no longer in
+	  `EXTRA_DIST'.
+
+2005-08-27 Saturday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.31), build_header (1.3), Watchdog/Makefile.am
+	  (1.20), Watchdog/configure.ac (1.27), Watchdog/pwl_header.bottom
+	  (1.3), Watchdog/pwl_header.hh (1.1), Watchdog/pwl_header.middle
+	  (1.4), Watchdog/pwl_header.top (1.8), Watchdog/utils/.cvsignore
+	  (1.1), Watchdog/utils/Makefile.am (1.1),
+	  Watchdog/utils/build_header (1.1), src/Makefile.am (1.117),
+	  utils/Makefile.am (1.6), utils/build_header (1.1): Definitely
+	  switch to the new mechanism to build the library headers.  The
+	  `build_header' script belongs to the `utils' directories.
+
+2005-08-27 Saturday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.46): Fixed a couple of typos in
+	  comments.
+
+2005-08-27 Saturday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.158), src/Bounding_Box.cc
+	  (1.8), src/Bounding_Box.inlines.hh (1.5), src/Interval.cc (1.12),
+	  src/Interval.defs.hh (1.24), src/Interval.inlines.hh (1.23),
+	  src/Interval.types.hh (1.9), src/Polyhedron.inlines.hh (1.116),
+	  src/checked_mpq.inlines.hh (1.22): Obsolete class ERational
+	  removed.  In the process, fixed a couple of bugs whereby GMP
+	  rationals were created out of pairs of integers that could have
+	  common factors, yet the canonicalize() method was not invoked.
+
+2005-08-27 Saturday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/Makefile.am (1.5): Ensure the `text2cxxarray' script is
+	  distributed.
+
+2005-08-27 Saturday 11:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/Makefile.am (1.4): The `text2cxxarray' script is now listed
+	  in `noinst_SCRIPTS'.
+
+2005-08-27 Saturday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.171), src/checked_float.inlines.hh (1.41): Check
+	  for the declaration of long double rintl(long double x): rintl()
+	  is not provided on systems that do not have proper long doubles.
+
+2005-08-26 Friday 11:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.170): Comment restored.
+
+2005-08-26 Friday 10:04  Abramo Bagnara
+
+	* src/: checked.defs.hh (1.22), checked_ext.inlines.hh (1.20),
+	  checked_float.inlines.hh (1.40), checked_int.inlines.hh (1.36),
+	  checked_mpq.inlines.hh (1.21), checked_mpz.inlines.hh (1.25):
+	  Finer grain for policy. New special values functions. Use
+	  assertions when policy does not request checks.
+
+2005-08-26 Friday 10:02  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.36): Added special values
+	  funcions.
+
+2005-08-26 Friday 10:01  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (1.31): Finer grain for policy.
+
+2005-08-25 Thursday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/E_NIT.defs.hh (1.6), src/E_NIT.inlines.hh (1.11),
+	  src/E_NIT.types.hh (1.4), src/E_Rational.defs.hh (1.6),
+	  src/E_Rational.inlines.hh (1.9), src/E_Rational.types.hh (1.4),
+	  src/Makefile.am (1.116), tests/BD_Shape/maxspacedim.cc (1.6):
+	  Obsolete classes E_NIT and E_Rational removed.
+
+2005-08-25 Thursday 18:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, limitedextrapolation1.cc
+	  (grids.[26,1]): Add limitedextrapolation1.
+
+2005-08-25 Thursday 18:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/widening1.cc (grids.2): Add congruences to the correct
+	  grid in test5.  Improve a comment.  Use a definition for the
+	  token count in test10.  Take out the old test invocations.
+
+2005-08-25 Thursday 18:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/relations2.cc (grids.3): Add test9, in which a grid
+	  with a line strictly intersects a relational congruence.
+
+2005-08-25 Thursday 18:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_widenings.cc (grids.[37,2]): Add method
+	  limited_extrapolation_assign.  Improve the description of
+	  dim_kinds.  Rename the congruence parameter in the relation_with
+	  declaration to cg.
+
+2005-08-25 Thursday 18:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.53): In relation_with(cg) only modulate
+	  the scalar product for points and parameters.
+
+2005-08-25 Thursday 18:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.12): Swap dim_kinds in method swap.
+
+2005-08-23 Tuesday 22:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, widening1.cc (grids.[25,1]): Add
+	  widening1.
+
+2005-08-23 Tuesday 22:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_widenings.cc (grids.[36,1]): Add methods
+	  widening_assign and select_wider_congruences.
+
+2005-08-23 Tuesday 11:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.defs.hh, Grid_conversion.cc, Grid_simplify.cc
+	  (grids.[15,18,28]): Prefer postfix operators.
+
+2005-08-22 Monday 12:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.52): In OK check dim_kinds size before
+	  checking upper triangularity.
+
+2005-08-22 Monday 07:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.sty (1.21): Restored comment broken with previous commit.
+
+2005-08-22 Monday 00:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.32), config.sub (1.31), Watchdog/config.guess
+	  (1.16), Watchdog/config.sub (1.16): Updated.
+
+2005-08-22 Monday 00:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING (1.3), Makefile.am (1.30), README (1.37),
+	  README.configure (1.14), build_header (1.2), compile (1.6),
+	  config.guess (1.31), config.rpath (1.4), config.sub (1.30),
+	  configure.ac (1.169), depcomp (1.11), ltmain.sh (1.25), missing
+	  (1.11), Watchdog/COPYING (1.3),
+	  Watchdog/Doubly_Linked_Object.defs.hh (1.3),
+	  Watchdog/Doubly_Linked_Object.inlines.hh (1.3),
+	  Watchdog/EList.defs.hh (1.5), Watchdog/EList.inlines.hh (1.4),
+	  Watchdog/EList_Iterator.defs.hh (1.3),
+	  Watchdog/EList_Iterator.inlines.hh (1.4),
+	  Watchdog/Handler.defs.hh (1.5), Watchdog/Handler.inlines.hh
+	  (1.4), Watchdog/Makefile.am (1.19), Watchdog/Pending_Element.cc
+	  (1.3), Watchdog/Pending_Element.defs.hh (1.3),
+	  Watchdog/Pending_Element.inlines.hh (1.3),
+	  Watchdog/Pending_List.cc (1.3), Watchdog/Pending_List.defs.hh
+	  (1.3), Watchdog/Pending_List.inlines.hh (1.3), Watchdog/README
+	  (1.11), Watchdog/Time.cc (1.3), Watchdog/Time.defs.hh (1.3),
+	  Watchdog/Time.inlines.hh (1.4), Watchdog/Watchdog.cc (1.20),
+	  Watchdog/Watchdog.defs.hh (1.16), Watchdog/Watchdog.inlines.hh
+	  (1.13), Watchdog/compile (1.6), Watchdog/config.guess (1.15),
+	  Watchdog/config.sub (1.15), Watchdog/configure.ac (1.26),
+	  Watchdog/depcomp (1.9), Watchdog/ltmain.sh (1.14),
+	  Watchdog/missing (1.7), Watchdog/pwl_header.top (1.7),
+	  debian/libppl-pwl.copyright.in (1.2), debian/libppl.copyright.in
+	  (1.2), demos/Makefile.am (1.7), demos/ppl_lcdd/Makefile.am
+	  (1.20), demos/ppl_lcdd/ppl_lcdd.cc (1.44),
+	  demos/ppl_lcdd/examples/Makefile.am (1.5),
+	  demos/ppl_lpsol/Makefile.am (1.14), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.17), demos/ppl_lpsol/examples/Makefile.am (1.4),
+	  doc/Makefile.am (1.35), doc/README.doc (1.5), doc/fdl.dox (1.7),
+	  doc/fdl.tex (1.4), doc/fdl.txt (1.2), doc/gpl.dox (1.7),
+	  doc/gpl.tex (1.3), doc/gpl.txt (1.3), doc/ppl.sty (1.20),
+	  interfaces/Makefile.am (1.11), interfaces/C/Makefile.am (1.19),
+	  interfaces/C/ppl_c.cc (1.136), interfaces/C/ppl_c.h.in (1.51),
+	  interfaces/OCaml/Makefile.am (1.10),
+	  interfaces/Prolog/Makefile.am (1.28),
+	  interfaces/Prolog/Prolog_interface.dox (1.133),
+	  interfaces/Prolog/exceptions.hh (1.16),
+	  interfaces/Prolog/ppl_prolog.icc (1.157),
+	  interfaces/Prolog/track_allocation.hh (1.17),
+	  interfaces/Prolog/Ciao/Makefile.am (1.43),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.15),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.11),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.12),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.32),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.80),
+	  interfaces/Prolog/GNU/Makefile.am (1.47),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.6),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.9),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.52),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.28),
+	  interfaces/Prolog/SICStus/Makefile.am (1.53),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.25),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.76),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.5),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.6),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.12),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.12),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.4),
+	  interfaces/Prolog/SWI/Makefile.am (1.51),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.9),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.8),
+	  interfaces/Prolog/SWI/ppl_pl.cc (1.9),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.100),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.5),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.5),
+	  interfaces/Prolog/XSB/Makefile.am (1.34),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.39),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.67),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.14),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.12),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.17),
+	  interfaces/Prolog/YAP/Makefile.am (1.38),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.92),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.9),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.10),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.6),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.8),
+	  interfaces/Prolog/tests/Makefile.am (1.5),
+	  interfaces/Prolog/tests/clpq.pl (1.6),
+	  interfaces/Prolog/tests/clpq2.pl (1.6),
+	  interfaces/Prolog/tests/pl_check.pl (1.8), m4/Makefile.am (1.13),
+	  m4/ac_check_gmp.m4 (1.21), m4/ac_check_swi_prolog.m4 (1.2),
+	  m4/ac_cxx_attribute_weak.m4 (1.5), m4/ac_cxx_double_is_iec_559.m4
+	  (1.3), m4/ac_cxx_flexible_arrays.m4 (1.10),
+	  m4/ac_cxx_float_is_iec_559.m4 (1.3), m4/ac_cxx_long_double.m4
+	  (1.4), m4/ac_cxx_long_double_is_iec_559.m4 (1.3),
+	  m4/ac_cxx_long_long.m4 (1.3), src/Ask_Tell.defs.hh (1.5),
+	  src/Ask_Tell.inlines.hh (1.5), src/BDS_Status.idefs.hh (1.7),
+	  src/BDS_Status.inlines.hh (1.5), src/BD_Shape.defs.hh (1.21),
+	  src/BD_Shape.inlines.hh (1.52), src/BHRZ03_Certificate.cc (1.8),
+	  src/BHRZ03_Certificate.defs.hh (1.11),
+	  src/BHRZ03_Certificate.inlines.hh (1.6), src/Bounding_Box.cc
+	  (1.7), src/Bounding_Box.defs.hh (1.7),
+	  src/Bounding_Box.inlines.hh (1.4), src/C_Polyhedron.cc (1.15),
+	  src/C_Polyhedron.defs.hh (1.33), src/C_Polyhedron.inlines.hh
+	  (1.26), src/Checked_Number.cc (1.7), src/Checked_Number.defs.hh
+	  (1.30), src/Checked_Number.inlines.hh (1.35), src/Coefficient.cc
+	  (1.3), src/Coefficient.defs.hh (1.3), src/Coefficient.inlines.hh
+	  (1.3), src/Constraint.cc (1.51), src/Constraint.defs.hh (1.104),
+	  src/Constraint.inlines.hh (1.60), src/Constraint_System.cc (1.8),
+	  src/Constraint_System.defs.hh (1.10),
+	  src/Constraint_System.inlines.hh (1.4), src/DB_Matrix.defs.hh
+	  (1.5), src/DB_Matrix.inlines.hh (1.5), src/DB_Row.defs.hh (1.7),
+	  src/DB_Row.inlines.hh (1.7), src/Determinate.defs.hh (1.55),
+	  src/Determinate.inlines.hh (1.48), src/E_NIT.defs.hh (1.5),
+	  src/E_NIT.inlines.hh (1.10), src/E_Rational.defs.hh (1.5),
+	  src/E_Rational.inlines.hh (1.8), src/Float.defs.hh (1.8),
+	  src/Float.inlines.hh (1.9), src/GMP_Integer.defs.hh (1.6),
+	  src/GMP_Integer.inlines.hh (1.5), src/Generator.cc (1.62),
+	  src/Generator.defs.hh (1.105), src/Generator.inlines.hh (1.55),
+	  src/Generator_System.cc (1.7), src/Generator_System.defs.hh
+	  (1.8), src/Generator_System.inlines.hh (1.4),
+	  src/H79_Certificate.cc (1.7), src/H79_Certificate.defs.hh (1.10),
+	  src/H79_Certificate.inlines.hh (1.5), src/Init.cc (1.18),
+	  src/Init.defs.hh (1.13), src/Interval.cc (1.11),
+	  src/Interval.defs.hh (1.23), src/Interval.inlines.hh (1.22),
+	  src/Limits.hh (1.7), src/Linear_Expression.cc (1.5),
+	  src/Linear_Expression.defs.hh (1.9),
+	  src/Linear_Expression.inlines.hh (1.5), src/Linear_Row.cc (1.6),
+	  src/Linear_Row.defs.hh (1.9), src/Linear_Row.inlines.hh (1.8),
+	  src/Linear_System.cc (1.19), src/Linear_System.defs.hh (1.14),
+	  src/Linear_System.inlines.hh (1.17), src/Makefile.am (1.115),
+	  src/Matrix.cc (1.82), src/Matrix.defs.hh (1.69),
+	  src/Matrix.inlines.hh (1.44), src/NNC_Polyhedron.cc (1.14),
+	  src/NNC_Polyhedron.defs.hh (1.35), src/NNC_Polyhedron.inlines.hh
+	  (1.29), src/Native_Integer.defs.hh (1.11),
+	  src/Native_Integer.inlines.hh (1.10), src/Numeric_Format.defs.hh
+	  (1.4), src/Ph_Status.cc (1.7), src/Ph_Status.idefs.hh (1.10),
+	  src/Ph_Status.inlines.hh (1.6), src/Poly_Con_Relation.cc (1.10),
+	  src/Poly_Con_Relation.defs.hh (1.27),
+	  src/Poly_Con_Relation.inlines.hh (1.13), src/Poly_Gen_Relation.cc
+	  (1.10), src/Poly_Gen_Relation.defs.hh (1.25),
+	  src/Poly_Gen_Relation.inlines.hh (1.13),
+	  src/Polyhedra_Powerset.defs.hh (1.16),
+	  src/Polyhedra_Powerset.inlines.hh (1.20), src/Polyhedron.defs.hh
+	  (1.274), src/Polyhedron.inlines.hh (1.115),
+	  src/Polyhedron_chdims.cc (1.30), src/Polyhedron_nonpublic.cc
+	  (1.48), src/Polyhedron_public.cc (1.58),
+	  src/Polyhedron_widenings.cc (1.45), src/Powerset.defs.hh (1.13),
+	  src/Powerset.inlines.hh (1.10), src/Ptr_Iterator.defs.hh (1.4),
+	  src/Ptr_Iterator.inlines.hh (1.4), src/Result.defs.hh (1.10),
+	  src/Result.inlines.hh (1.6), src/Rounding.defs.hh (1.13),
+	  src/Rounding.types.hh (1.4), src/Row.cc (1.81), src/Row.defs.hh
+	  (1.94), src/Row.inlines.hh (1.61), src/Saturation_Matrix.cc
+	  (1.4), src/Saturation_Matrix.defs.hh (1.3),
+	  src/Saturation_Matrix.inlines.hh (1.4), src/Saturation_Row.cc
+	  (1.7), src/Saturation_Row.defs.hh (1.6),
+	  src/Saturation_Row.inlines.hh (1.6), src/Variable.cc (1.19),
+	  src/Variable.defs.hh (1.46), src/Variable.inlines.hh (1.22),
+	  src/Widening_Function.defs.hh (1.11),
+	  src/Widening_Function.inlines.hh (1.10), src/algorithms.hh
+	  (1.41), src/checked.cc (1.3), src/checked.defs.hh (1.21),
+	  src/checked.inlines.hh (1.20), src/checked_ext.defs.hh (1.8),
+	  src/checked_ext.inlines.hh (1.19), src/checked_float.inlines.hh
+	  (1.39), src/checked_int.inlines.hh (1.35),
+	  src/checked_mpq.inlines.hh (1.20), src/checked_mpz.inlines.hh
+	  (1.24), src/checked_numeric_limits.hh (1.4), src/compiler.hh
+	  (1.5), src/conversion.cc (1.69), src/float.types.hh (1.8),
+	  src/fpu-c99.inlines.hh (1.7), src/fpu-ia32.inlines.hh (1.7),
+	  src/fpu-none.inlines.hh (1.2), src/fpu.defs.hh (1.5),
+	  src/globals.cc (1.21), src/globals.defs.hh (1.21),
+	  src/globals.inlines.hh (1.10), src/initializer.hh (1.11),
+	  src/max_space_dimension.hh (1.6), src/minimize.cc (1.41),
+	  src/namespaces.hh (1.2), src/ppl-config.cc.in (1.7),
+	  src/ppl_header.hh (1.3), src/simplex.cc (1.10), src/simplify.cc
+	  (1.43), src/swapping_sort.icc (1.9), src/version.cc (1.6),
+	  src/version.hh.in (1.11), tests/BBox.cc (1.10), tests/BBox.hh
+	  (1.9), tests/Makefile.am (1.243), tests/PFunction.cc (1.7),
+	  tests/PFunction.hh (1.7), tests/ehandlers.cc (1.7),
+	  tests/ehandlers.hh (1.12), tests/files.cc (1.7), tests/files.hh
+	  (1.8), tests/ppl_test.hh (1.24), tests/print.cc (1.16),
+	  tests/print.hh (1.20), tests/BD_Shape/Makefile.am (1.13),
+	  tests/BD_Shape/addconstraints1.cc (1.4),
+	  tests/BD_Shape/addspacedims1.cc (1.5),
+	  tests/BD_Shape/addspacedims2.cc (1.5),
+	  tests/BD_Shape/addspacedims3.cc (1.6),
+	  tests/BD_Shape/addspacedims4.cc (1.6),
+	  tests/BD_Shape/addspacedims5.cc (1.6),
+	  tests/BD_Shape/addspacedims6.cc (1.6),
+	  tests/BD_Shape/addspacedims7.cc (1.5),
+	  tests/BD_Shape/affineimage1.cc (1.5),
+	  tests/BD_Shape/affineimage2.cc (1.5),
+	  tests/BD_Shape/affineimage3.cc (1.5),
+	  tests/BD_Shape/affineimage4.cc (1.5),
+	  tests/BD_Shape/affineimage5.cc (1.5),
+	  tests/BD_Shape/affineimage6.cc (1.5),
+	  tests/BD_Shape/affineimage7.cc (1.5),
+	  tests/BD_Shape/affineimage8.cc (1.3),
+	  tests/BD_Shape/affineimage9.cc (1.3),
+	  tests/BD_Shape/affinepreimage1.cc (1.5),
+	  tests/BD_Shape/affinepreimage2.cc (1.5),
+	  tests/BD_Shape/affinepreimage3.cc (1.5),
+	  tests/BD_Shape/affinepreimage4.cc (1.5),
+	  tests/BD_Shape/affinepreimage5.cc (1.3),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.6),
+	  tests/BD_Shape/ascii_dump_load2.cc (1.4),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.4),
+	  tests/BD_Shape/cc76extrapolation2.cc (1.4),
+	  tests/BD_Shape/cc76extrapolation3.cc (1.4),
+	  tests/BD_Shape/cc76extrapolation4.cc (1.5),
+	  tests/BD_Shape/cc76extrapolation5.cc (1.4),
+	  tests/BD_Shape/cc76extrapolation6.cc (1.4),
+	  tests/BD_Shape/cc76narrowing1.cc (1.4),
+	  tests/BD_Shape/cc76narrowing2.cc (1.4),
+	  tests/BD_Shape/cc76narrowing3.cc (1.4),
+	  tests/BD_Shape/cc76narrowing4.cc (1.5),
+	  tests/BD_Shape/cc76narrowing5.cc (1.5),
+	  tests/BD_Shape/ch78widening1.cc (1.4),
+	  tests/BD_Shape/ch78widening2.cc (1.5),
+	  tests/BD_Shape/ch78widening3.cc (1.4),
+	  tests/BD_Shape/ch78widening4.cc (1.4),
+	  tests/BD_Shape/ch78widening5.cc (1.5),
+	  tests/BD_Shape/ch78widening6.cc (1.4),
+	  tests/BD_Shape/ch78widening7.cc (1.4),
+	  tests/BD_Shape/ch78widening8.cc (1.4),
+	  tests/BD_Shape/concatenate1.cc (1.5),
+	  tests/BD_Shape/concatenate2.cc (1.5),
+	  tests/BD_Shape/concatenate3.cc (1.4),
+	  tests/BD_Shape/concatenate4.cc (1.4),
+	  tests/BD_Shape/concatenate5.cc (1.5),
+	  tests/BD_Shape/constraints1.cc (1.6),
+	  tests/BD_Shape/constraints2.cc (1.5), tests/BD_Shape/contains1.cc
+	  (1.4), tests/BD_Shape/contains2.cc (1.6),
+	  tests/BD_Shape/contains3.cc (1.6), tests/BD_Shape/empty1.cc
+	  (1.4), tests/BD_Shape/empty2.cc (1.4), tests/BD_Shape/empty3.cc
+	  (1.5), tests/BD_Shape/empty4.cc (1.4), tests/BD_Shape/empty5.cc
+	  (1.4), tests/BD_Shape/equality1.cc (1.6),
+	  tests/BD_Shape/exceptions1.cc (1.5),
+	  tests/BD_Shape/exceptions2.cc (1.5),
+	  tests/BD_Shape/exceptions3.cc (1.7),
+	  tests/BD_Shape/fromgensys1.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage10.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage11.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage12.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage13.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage14.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage3.cc (1.6),
+	  tests/BD_Shape/generalizedaffineimage4.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage5.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage6.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage7.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage8.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage9.cc (1.4),
+	  tests/BD_Shape/h79widening1.cc (1.4),
+	  tests/BD_Shape/intersection1.cc (1.4),
+	  tests/BD_Shape/intersection2.cc (1.4),
+	  tests/BD_Shape/intersection3.cc (1.5),
+	  tests/BD_Shape/intersection4.cc (1.6),
+	  tests/BD_Shape/intersection5.cc (1.6),
+	  tests/BD_Shape/intersection6.cc (1.5),
+	  tests/BD_Shape/intersection7.cc (1.5),
+	  tests/BD_Shape/intersection8.cc (1.5),
+	  tests/BD_Shape/limitedCC76extrapolation1.cc (1.4),
+	  tests/BD_Shape/limitedCC76extrapolation2.cc (1.5),
+	  tests/BD_Shape/limitedCC76extrapolation3.cc (1.5),
+	  tests/BD_Shape/limitedCH78extrapolation1.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation2.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation3.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation4.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation5.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation6.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation7.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation8.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation9.cc (1.4),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.4),
+	  tests/BD_Shape/mapspacedims1.cc (1.4),
+	  tests/BD_Shape/mapspacedims2.cc (1.5),
+	  tests/BD_Shape/mapspacedims3.cc (1.4),
+	  tests/BD_Shape/mapspacedims4.cc (1.5),
+	  tests/BD_Shape/maxspacedim.cc (1.5),
+	  tests/BD_Shape/polydifference1.cc (1.6),
+	  tests/BD_Shape/polydifference2.cc (1.4),
+	  tests/BD_Shape/polydifference3.cc (1.4),
+	  tests/BD_Shape/polydifference4.cc (1.4),
+	  tests/BD_Shape/polydifference5.cc (1.5),
+	  tests/BD_Shape/polydifference6.cc (1.4),
+	  tests/BD_Shape/polyhull1.cc (1.4), tests/BD_Shape/polyhull2.cc
+	  (1.4), tests/BD_Shape/polyhull3.cc (1.4),
+	  tests/BD_Shape/polyhull4.cc (1.4), tests/BD_Shape/relations1.cc
+	  (1.6), tests/BD_Shape/relations2.cc (1.6),
+	  tests/BD_Shape/relations3.cc (1.5), tests/BD_Shape/relations4.cc
+	  (1.4), tests/BD_Shape/relations5.cc (1.6),
+	  tests/BD_Shape/removespacedims1.cc (1.5),
+	  tests/BD_Shape/removespacedims2.cc (1.5),
+	  tests/BD_Shape/removespacedims3.cc (1.5),
+	  tests/BD_Shape/timeelapse1.cc (1.5),
+	  tests/BD_Shape/timeelapse2.cc (1.4),
+	  tests/BD_Shape/timeelapse3.cc (1.4),
+	  tests/BD_Shape/timeelapse4.cc (1.4),
+	  tests/BD_Shape/timeelapse5.cc (1.5), tests/BD_Shape/universe1.cc
+	  (1.5), tests/BD_Shape/writebdshape1.cc (1.2),
+	  tests/BD_Shape/writebdshape2.cc (1.3),
+	  tests/Polyhedron/CbecomesNNC1.cc (1.4),
+	  tests/Polyhedron/Makefile.am (1.25),
+	  tests/Polyhedron/NNCbecomesC1.cc (1.4),
+	  tests/Polyhedron/NNCminimize1.cc (1.4),
+	  tests/Polyhedron/NNCminimize2.cc (1.4),
+	  tests/Polyhedron/NNCminimize3.cc (1.4),
+	  tests/Polyhedron/NNCminimize4.cc (1.4),
+	  tests/Polyhedron/NNCminimize5.cc (1.4),
+	  tests/Polyhedron/NNCminimize6.cc (1.4), tests/Polyhedron/README
+	  (1.4), tests/Polyhedron/addconstraint1.cc (1.4),
+	  tests/Polyhedron/addconstraint2.cc (1.5),
+	  tests/Polyhedron/addconstraint3.cc (1.4),
+	  tests/Polyhedron/addconstraints1.cc (1.5),
+	  tests/Polyhedron/addconstraints10.cc (1.5),
+	  tests/Polyhedron/addconstraints11.cc (1.4),
+	  tests/Polyhedron/addconstraints12.cc (1.4),
+	  tests/Polyhedron/addconstraints13.cc (1.5),
+	  tests/Polyhedron/addconstraints2.cc (1.4),
+	  tests/Polyhedron/addconstraints3.cc (1.5),
+	  tests/Polyhedron/addconstraints4.cc (1.4),
+	  tests/Polyhedron/addconstraints5.cc (1.5),
+	  tests/Polyhedron/addconstraints6.cc (1.4),
+	  tests/Polyhedron/addconstraints7.cc (1.5),
+	  tests/Polyhedron/addconstraints8.cc (1.5),
+	  tests/Polyhedron/addconstraints9.cc (1.4),
+	  tests/Polyhedron/addgenerator1.cc (1.5),
+	  tests/Polyhedron/addgenerator2.cc (1.5),
+	  tests/Polyhedron/addgenerator3.cc (1.4),
+	  tests/Polyhedron/addgenerator4.cc (1.5),
+	  tests/Polyhedron/addgenerator5.cc (1.5),
+	  tests/Polyhedron/addgenerators1.cc (1.5),
+	  tests/Polyhedron/addgenerators10.cc (1.5),
+	  tests/Polyhedron/addgenerators11.cc (1.5),
+	  tests/Polyhedron/addgenerators12.cc (1.5),
+	  tests/Polyhedron/addgenerators13.cc (1.5),
+	  tests/Polyhedron/addgenerators2.cc (1.5),
+	  tests/Polyhedron/addgenerators3.cc (1.4),
+	  tests/Polyhedron/addgenerators4.cc (1.4),
+	  tests/Polyhedron/addgenerators5.cc (1.4),
+	  tests/Polyhedron/addgenerators6.cc (1.5),
+	  tests/Polyhedron/addgenerators7.cc (1.4),
+	  tests/Polyhedron/addgenerators8.cc (1.5),
+	  tests/Polyhedron/addgenerators9.cc (1.4),
+	  tests/Polyhedron/addspacedims1.cc (1.5),
+	  tests/Polyhedron/addspacedims10.cc (1.4),
+	  tests/Polyhedron/addspacedims11.cc (1.4),
+	  tests/Polyhedron/addspacedims12.cc (1.4),
+	  tests/Polyhedron/addspacedims13.cc (1.4),
+	  tests/Polyhedron/addspacedims2.cc (1.5),
+	  tests/Polyhedron/addspacedims3.cc (1.5),
+	  tests/Polyhedron/addspacedims4.cc (1.4),
+	  tests/Polyhedron/addspacedims5.cc (1.4),
+	  tests/Polyhedron/addspacedims6.cc (1.4),
+	  tests/Polyhedron/addspacedims7.cc (1.4),
+	  tests/Polyhedron/addspacedims8.cc (1.5),
+	  tests/Polyhedron/addspacedims9.cc (1.4),
+	  tests/Polyhedron/affineimage1.cc (1.5),
+	  tests/Polyhedron/affineimage2.cc (1.4),
+	  tests/Polyhedron/affineimage3.cc (1.4),
+	  tests/Polyhedron/affineimage4.cc (1.5),
+	  tests/Polyhedron/affineimage5.cc (1.5),
+	  tests/Polyhedron/affineimage6.cc (1.5),
+	  tests/Polyhedron/affineimage7.cc (1.4),
+	  tests/Polyhedron/affineimage8.cc (1.4),
+	  tests/Polyhedron/affineimage9.cc (1.4),
+	  tests/Polyhedron/affinepreimage1.cc (1.4),
+	  tests/Polyhedron/affinepreimage10.cc (1.4),
+	  tests/Polyhedron/affinepreimage11.cc (1.2),
+	  tests/Polyhedron/affinepreimage2.cc (1.4),
+	  tests/Polyhedron/affinepreimage3.cc (1.5),
+	  tests/Polyhedron/affinepreimage4.cc (1.4),
+	  tests/Polyhedron/affinepreimage5.cc (1.4),
+	  tests/Polyhedron/affinepreimage6.cc (1.4),
+	  tests/Polyhedron/affinepreimage7.cc (1.4),
+	  tests/Polyhedron/affinepreimage8.cc (1.5),
+	  tests/Polyhedron/affinepreimage9.cc (1.4),
+	  tests/Polyhedron/affinetrans.cc (1.5),
+	  tests/Polyhedron/append1.cc (1.4), tests/Polyhedron/append2.cc
+	  (1.4), tests/Polyhedron/ascii_dump_load1.cc (1.4),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.4),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.4),
+	  tests/Polyhedron/ascii_dump_load4.cc (1.4),
+	  tests/Polyhedron/ascii_dump_load5.cc (1.4),
+	  tests/Polyhedron/ascii_dump_load6.cc (1.5),
+	  tests/Polyhedron/ascii_dump_load7.cc (1.4),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.5),
+	  tests/Polyhedron/bgp99extrapolation2.cc (1.5),
+	  tests/Polyhedron/bhrz03widening1.cc (1.4),
+	  tests/Polyhedron/bhrz03widening10.cc (1.5),
+	  tests/Polyhedron/bhrz03widening11.cc (1.4),
+	  tests/Polyhedron/bhrz03widening12.cc (1.4),
+	  tests/Polyhedron/bhrz03widening13.cc (1.4),
+	  tests/Polyhedron/bhrz03widening14.cc (1.4),
+	  tests/Polyhedron/bhrz03widening15.cc (1.5),
+	  tests/Polyhedron/bhrz03widening16.cc (1.4),
+	  tests/Polyhedron/bhrz03widening17.cc (1.4),
+	  tests/Polyhedron/bhrz03widening18.cc (1.4),
+	  tests/Polyhedron/bhrz03widening19.cc (1.4),
+	  tests/Polyhedron/bhrz03widening2.cc (1.4),
+	  tests/Polyhedron/bhrz03widening3.cc (1.4),
+	  tests/Polyhedron/bhrz03widening4.cc (1.4),
+	  tests/Polyhedron/bhrz03widening5.cc (1.4),
+	  tests/Polyhedron/bhrz03widening6.cc (1.4),
+	  tests/Polyhedron/bhrz03widening7.cc (1.4),
+	  tests/Polyhedron/bhrz03widening8.cc (1.4),
+	  tests/Polyhedron/bhrz03widening9.cc (1.4),
+	  tests/Polyhedron/bhz03widening1.cc (1.5),
+	  tests/Polyhedron/bhz03widening2.cc (1.5),
+	  tests/Polyhedron/bhz03widening3.cc (1.5),
+	  tests/Polyhedron/bhz03widening4.cc (1.5),
+	  tests/Polyhedron/bhz03widening5.cc (1.5),
+	  tests/Polyhedron/bhz03widening6.cc (1.5),
+	  tests/Polyhedron/bounded1.cc (1.5),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.3),
+	  tests/Polyhedron/boundedaffineimage2.cc (1.2),
+	  tests/Polyhedron/boundedaffineimage3.cc (1.2),
+	  tests/Polyhedron/boundedaffinepreimage1.cc (1.2),
+	  tests/Polyhedron/boundedaffinepreimage2.cc (1.2),
+	  tests/Polyhedron/boundedaffinepreimage3.cc (1.2),
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.3),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.5),
+	  tests/Polyhedron/boundingbox1.cc (1.5),
+	  tests/Polyhedron/boundingbox2.cc (1.5),
+	  tests/Polyhedron/boundingbox3.cc (1.5),
+	  tests/Polyhedron/boundingbox4.cc (1.5),
+	  tests/Polyhedron/boundingbox5.cc (1.5),
+	  tests/Polyhedron/bounds1.cc (1.5), tests/Polyhedron/bounds2.cc
+	  (1.4), tests/Polyhedron/bug2.cc (1.3),
+	  tests/Polyhedron/concatenate1.cc (1.4),
+	  tests/Polyhedron/concatenate2.cc (1.5),
+	  tests/Polyhedron/concatenate3.cc (1.4),
+	  tests/Polyhedron/concatenate4.cc (1.4),
+	  tests/Polyhedron/concatenate5.cc (1.4),
+	  tests/Polyhedron/concatenate6.cc (1.5),
+	  tests/Polyhedron/concatenate7.cc (1.3),
+	  tests/Polyhedron/constraints1.cc (1.4),
+	  tests/Polyhedron/constraints2.cc (1.5),
+	  tests/Polyhedron/constraints3.cc (1.4),
+	  tests/Polyhedron/constraints4.cc (1.5),
+	  tests/Polyhedron/constraints5.cc (1.3),
+	  tests/Polyhedron/contains1.cc (1.4),
+	  tests/Polyhedron/contains2.cc (1.4),
+	  tests/Polyhedron/contains3.cc (1.4),
+	  tests/Polyhedron/contains4.cc (1.4),
+	  tests/Polyhedron/contains5.cc (1.4),
+	  tests/Polyhedron/disjoint1.cc (1.4),
+	  tests/Polyhedron/disjoint2.cc (1.5),
+	  tests/Polyhedron/disjoint3.cc (1.5),
+	  tests/Polyhedron/dualhypercubes.cc (1.4),
+	  tests/Polyhedron/empty1.cc (1.5), tests/Polyhedron/equals1.cc
+	  (1.4), tests/Polyhedron/exceptions1.cc (1.6),
+	  tests/Polyhedron/exceptions2.cc (1.5),
+	  tests/Polyhedron/exceptions3.cc (1.6),
+	  tests/Polyhedron/expandspacedim1.cc (1.5),
+	  tests/Polyhedron/expandspacedim2.cc (1.5),
+	  tests/Polyhedron/foldspacedims1.cc (1.5),
+	  tests/Polyhedron/foldspacedims2.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage10.cc (1.4),
+	  tests/Polyhedron/generalizedaffineimage11.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage12.cc (1.4),
+	  tests/Polyhedron/generalizedaffineimage13.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage14.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage3.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage4.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage5.cc (1.4),
+	  tests/Polyhedron/generalizedaffineimage6.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage7.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage8.cc (1.4),
+	  tests/Polyhedron/generalizedaffineimage9.cc (1.4),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.2),
+	  tests/Polyhedron/generalizedaffinepreimage2.cc (1.2),
+	  tests/Polyhedron/generalizedaffinepreimage3.cc (1.2),
+	  tests/Polyhedron/generalizedaffinepreimage4.cc (1.2),
+	  tests/Polyhedron/generators1.cc (1.4),
+	  tests/Polyhedron/generators2.cc (1.4),
+	  tests/Polyhedron/generators3.cc (1.5),
+	  tests/Polyhedron/generators4.cc (1.5),
+	  tests/Polyhedron/generators5.cc (1.4),
+	  tests/Polyhedron/generators6.cc (1.5),
+	  tests/Polyhedron/generators7.cc (1.4),
+	  tests/Polyhedron/geomcovers1.cc (1.5),
+	  tests/Polyhedron/h79widening1.cc (1.4),
+	  tests/Polyhedron/h79widening2.cc (1.4),
+	  tests/Polyhedron/h79widening3.cc (1.4),
+	  tests/Polyhedron/h79widening4.cc (1.4),
+	  tests/Polyhedron/h79widening5.cc (1.5),
+	  tests/Polyhedron/h79widening6.cc (1.4),
+	  tests/Polyhedron/h79widening7.cc (1.4),
+	  tests/Polyhedron/h79widening8.cc (1.4),
+	  tests/Polyhedron/intersection1.cc (1.4),
+	  tests/Polyhedron/intersection10.cc (1.5),
+	  tests/Polyhedron/intersection11.cc (1.5),
+	  tests/Polyhedron/intersection2.cc (1.4),
+	  tests/Polyhedron/intersection3.cc (1.4),
+	  tests/Polyhedron/intersection4.cc (1.5),
+	  tests/Polyhedron/intersection5.cc (1.5),
+	  tests/Polyhedron/intersection6.cc (1.5),
+	  tests/Polyhedron/intersection7.cc (1.4),
+	  tests/Polyhedron/intersection8.cc (1.5),
+	  tests/Polyhedron/intersection9.cc (1.5),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.4),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.4),
+	  tests/Polyhedron/limitedh79extrapolation2.cc (1.4),
+	  tests/Polyhedron/limitedh79extrapolation3.cc (1.4),
+	  tests/Polyhedron/limitedh79extrapolation4.cc (1.5),
+	  tests/Polyhedron/linearpartition1.cc (1.4),
+	  tests/Polyhedron/linearpartition2.cc (1.4),
+	  tests/Polyhedron/linearpartition3.cc (1.4),
+	  tests/Polyhedron/linearpartition4.cc (1.5),
+	  tests/Polyhedron/linexpression1.cc (1.4),
+	  tests/Polyhedron/mapspacedims1.cc (1.5),
+	  tests/Polyhedron/mapspacedims2.cc (1.4),
+	  tests/Polyhedron/mapspacedims3.cc (1.4),
+	  tests/Polyhedron/mapspacedims4.cc (1.4),
+	  tests/Polyhedron/max_min1.cc (1.4), tests/Polyhedron/max_min2.cc
+	  (1.4), tests/Polyhedron/maxspacedim1.cc (1.4),
+	  tests/Polyhedron/mc91.cc (1.5), tests/Polyhedron/membytes1.cc
+	  (1.5), tests/Polyhedron/membytes2.cc (1.4),
+	  tests/Polyhedron/memory1.cc (1.6), tests/Polyhedron/memory2.cc
+	  (1.9), tests/Polyhedron/minconstraints1.cc (1.4),
+	  tests/Polyhedron/minconstraints2.cc (1.5),
+	  tests/Polyhedron/minconstraints3.cc (1.4),
+	  tests/Polyhedron/minconstraints4.cc (1.4),
+	  tests/Polyhedron/mingenerators1.cc (1.4),
+	  tests/Polyhedron/mingenerators2.cc (1.5),
+	  tests/Polyhedron/mingenerators3.cc (1.4),
+	  tests/Polyhedron/onepoint.cc (1.5), tests/Polyhedron/permute.cc
+	  (1.4), tests/Polyhedron/polydifference1.cc (1.4),
+	  tests/Polyhedron/polydifference2.cc (1.4),
+	  tests/Polyhedron/polydifference3.cc (1.4),
+	  tests/Polyhedron/polydifference4.cc (1.5),
+	  tests/Polyhedron/polydifference5.cc (1.4),
+	  tests/Polyhedron/polydifference6.cc (1.4),
+	  tests/Polyhedron/polydifference7.cc (1.5),
+	  tests/Polyhedron/polydifference8.cc (1.4),
+	  tests/Polyhedron/polydifference9.cc (1.5),
+	  tests/Polyhedron/polyhull1.cc (1.4),
+	  tests/Polyhedron/polyhull10.cc (1.4),
+	  tests/Polyhedron/polyhull11.cc (1.4),
+	  tests/Polyhedron/polyhull2.cc (1.5),
+	  tests/Polyhedron/polyhull3.cc (1.5),
+	  tests/Polyhedron/polyhull4.cc (1.4),
+	  tests/Polyhedron/polyhull5.cc (1.5),
+	  tests/Polyhedron/polyhull6.cc (1.4),
+	  tests/Polyhedron/polyhull7.cc (1.4),
+	  tests/Polyhedron/polyhull8.cc (1.5),
+	  tests/Polyhedron/polyhull9.cc (1.5),
+	  tests/Polyhedron/polypowerset1.cc (1.4),
+	  tests/Polyhedron/randphull1.cc (1.5),
+	  tests/Polyhedron/randphull2.cc (1.6),
+	  tests/Polyhedron/relations1.cc (1.4),
+	  tests/Polyhedron/relations10.cc (1.4),
+	  tests/Polyhedron/relations11.cc (1.4),
+	  tests/Polyhedron/relations12.cc (1.4),
+	  tests/Polyhedron/relations13.cc (1.4),
+	  tests/Polyhedron/relations14.cc (1.4),
+	  tests/Polyhedron/relations15.cc (1.4),
+	  tests/Polyhedron/relations16.cc (1.4),
+	  tests/Polyhedron/relations17.cc (1.5),
+	  tests/Polyhedron/relations18.cc (1.4),
+	  tests/Polyhedron/relations19.cc (1.5),
+	  tests/Polyhedron/relations2.cc (1.5),
+	  tests/Polyhedron/relations3.cc (1.4),
+	  tests/Polyhedron/relations4.cc (1.4),
+	  tests/Polyhedron/relations5.cc (1.4),
+	  tests/Polyhedron/relations6.cc (1.5),
+	  tests/Polyhedron/relations7.cc (1.4),
+	  tests/Polyhedron/relations8.cc (1.4),
+	  tests/Polyhedron/relations9.cc (1.4),
+	  tests/Polyhedron/removespacedims1.cc (1.4),
+	  tests/Polyhedron/removespacedims10.cc (1.5),
+	  tests/Polyhedron/removespacedims2.cc (1.4),
+	  tests/Polyhedron/removespacedims3.cc (1.5),
+	  tests/Polyhedron/removespacedims4.cc (1.4),
+	  tests/Polyhedron/removespacedims5.cc (1.5),
+	  tests/Polyhedron/removespacedims6.cc (1.4),
+	  tests/Polyhedron/removespacedims7.cc (1.4),
+	  tests/Polyhedron/removespacedims8.cc (1.4),
+	  tests/Polyhedron/removespacedims9.cc (1.4),
+	  tests/Polyhedron/smm1.cc (1.4), tests/Polyhedron/timeelapse1.cc
+	  (1.4), tests/Polyhedron/timeelapse2.cc (1.5),
+	  tests/Polyhedron/timeelapse3.cc (1.4),
+	  tests/Polyhedron/timeelapse4.cc (1.4),
+	  tests/Polyhedron/timeelapse5.cc (1.5),
+	  tests/Polyhedron/timeelapse6.cc (1.4),
+	  tests/Polyhedron/timeelapse7.cc (1.5),
+	  tests/Polyhedron/timeelapse8.cc (1.5),
+	  tests/Polyhedron/timeelapse9.cc (1.5),
+	  tests/Polyhedron/topclosed1.cc (1.5),
+	  tests/Polyhedron/topclosed2.cc (1.5),
+	  tests/Polyhedron/topclosed3.cc (1.4),
+	  tests/Polyhedron/topclosure1.cc (1.4),
+	  tests/Polyhedron/topclosure2.cc (1.5),
+	  tests/Polyhedron/topclosure3.cc (1.4),
+	  tests/Polyhedron/topclosure4.cc (1.5),
+	  tests/Polyhedron/universe1.cc (1.4),
+	  tests/Polyhedron/universe2.cc (1.4),
+	  tests/Polyhedron/universe3.cc (1.4),
+	  tests/Polyhedron/universe4.cc (1.4),
+	  tests/Polyhedron/universe5.cc (1.4),
+	  tests/Polyhedron/universe6.cc (1.4),
+	  tests/Polyhedron/universe7.cc (1.4),
+	  tests/Polyhedron/watchdog1.cc (1.5),
+	  tests/Polyhedron/writeconsys1.cc (1.4),
+	  tests/Polyhedron/writegensys1.cc (1.4),
+	  tests/Polyhedron/writegensys2.cc (1.5),
+	  tests/Polyhedron/writegensys3.cc (1.4),
+	  tests/Polyhedron/writepolyhedron1.cc (1.4),
+	  tests/Polyhedron/writepolyhedron2.cc (1.4),
+	  tests/Polyhedron/writepolyhedron3.cc (1.4),
+	  tests/Polyhedron/writerelation1.cc (1.4),
+	  tests/Polyhedron/writevariable1.cc (1.4), utils/Makefile.am
+	  (1.3), utils/text2cxxarray (1.2), utils/timings.cc (1.4),
+	  utils/timings.hh (1.3): Address of the Free Software Foundation
+	  updated.
+
+2005-08-21 Sunday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.6): The --libs option has been removed
+	  (could not assign a decent semantics to it).
+
+2005-08-21 Sunday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.5): Completed the work announced in the
+	  previous commit.
+
+2005-08-21 Sunday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.4): Implemented the --interface option.
+	  Keywords are now case-insensitive.
+
+2005-08-21 Sunday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.3): Added the --coefficients option.
+
+2005-08-21 Sunday 01:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.2): Several improvements and new options.
+
+2005-08-20 Saturday 16:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.168), src/Makefile.am (1.114), src/ppl-config.cc
+	  (1.6), src/ppl-config.cc.in (1.1): A new implementation technique
+	  for `ppl-config' allows to deal with package relocations.
+
+2005-08-20 Saturday 00:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc (1.5): New option --banner.
+
+2005-08-20 Saturday 00:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc (1.4): Output format `raw' renamed `plain'.
+	  New output format `makefile'.
+
+2005-08-19 Friday 23:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.113), ppl-config.cc (1.3): Added support for
+	  the --prefix and the --exec-prefix options.
+
+2005-08-19 Friday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.167): Version number bumped.
+
+2005-08-19 Friday 13:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc (1.2): Added an option to print the `configure'
+	  options.
+
+2005-08-19 Friday 13:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.166): Keep track of the options with which
+	  `configure' was invoked.
+
+2005-08-19 Friday 11:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.112), ppl-config.cc (1.1): The ppl-config
+	  program allows to enquire about the configuration of the PPL and
+	  of the applications using it.
+
+2005-08-19 Friday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/text2cxxarray (1.1): Convert an ASCII text into the
+	  declaration of a C++ array.
+
+2005-08-18 Thursday 20:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, timeelapse1.cc (grids.[24,1]): Add
+	  timeelapse1.
+
+2005-08-18 Thursday 20:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.51): Enable method time_elapse_assign.
+
+2005-08-18 Thursday 20:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.25): Improve temporary comment.
+
+2005-08-18 Thursday 15:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.50): Check for points before adding
+	  lines in generalized_affine_image(lhs,rhs,m).
+
+2005-08-18 Thursday 15:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/griddifference1.cc (grids.3): Add test11, in which
+	  many 2-complements are added to the result.
+
+2005-08-18 Thursday 12:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/griddifference1.cc (grids.2): Add test10.
+
+2005-08-18 Thursday 12:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, generalizedaffinepreimage1.cc,
+	  generalizedaffinepreimage2.cc (grids.[23,1,1]): Add partial tests
+	  generalizedaffinepreimage1 and generalizedaffinepreimage2.
+
+2005-08-18 Thursday 12:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_public.cc (grids.[35,49]): Add the
+	  generalized_affine_preimage methods.
+
+2005-08-18 Thursday 12:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.19): Add a comment.
+
+2005-08-18 Thursday 12:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.14): Declare Linear_Expression a
+	  friend.
+
+2005-08-17 Wednesday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.50): Added
+	  -I$(SWI_PROLOG_INCLUDE_DIRECTORY) to AM_CPPFLAGS.
+
+2005-08-17 Wednesday 10:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.165): Use AC_CHECK_SWI_PROLOG to perform the
+	  checks for SWI Prolog.
+
+2005-08-17 Wednesday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.1): The new AC_CHECK_SWI_PROLOG
+	  function performs check for SWI Prolog by invoking the SWI-Prolog
+	  executable with `-dump-runtime-variables' option and interpreting
+	  the results.
+
+2005-08-17 Wednesday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.24): Added
+	  boundedaffinepreimage2, generalizedaffinepreimage3,
+	  nnc_boundedaffinepreimage2 and nnc_generalizedaffinepreimage3 to
+	  XFAIL_WITH_INT8.
+
+2005-08-16 Tuesday 20:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.49): Removed the "-goal
+	  main" options from the invocations of `plld'.
+
+2005-08-16 Tuesday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.132): Stray \endcode
+	  fixed.  Formatting improvements.
+
+2005-08-16 Tuesday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PFunction.cc (1.6): Code formatting improved.
+
+2005-08-16 Tuesday 14:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.157): Announced new methods for computing preimages.
+
+2005-08-16 Tuesday 14:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.57): Corrected error in the
+	  implementation of generalized_affine_(pre)image.
+
+2005-08-16 Tuesday 14:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.135), ppl_c.h.in (1.50): Interfaced
+	  new methods for computing affine preimages.
+
+2005-08-16 Tuesday 12:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.173): Had another try at explaining the
+	  shorthand notation for affine relations.
+
+2005-08-16 Tuesday 11:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, griddifference1.cc (grids.[22,1]): Add
+	  griddifference1.
+
+2005-08-16 Tuesday 11:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/: ppl_test.hh, print.hh (grids.[10,4]): Move dump_grids to
+	  print.hh.  Abort if the comparison in find_variation_template
+	  fails.
+
+2005-08-16 Tuesday 11:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
+	  (grids.[34,24,48]): Enable grid_difference_assign.  Add and
+	  improve a few comments.  Take out some old Polyhedron code.
+
+2005-08-16 Tuesday 11:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Linear_Expression.cc, Linear_Expression.defs.hh
+	  (grids.[1,3]): Add constructor Linear_Expression(cg).
+
+2005-08-16 Tuesday 10:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.23), affinepreimage11.cc (1.1),
+	  boundedaffineimage3.cc (1.1), boundedaffinepreimage1.cc (1.1),
+	  boundedaffinepreimage2.cc (1.1), boundedaffinepreimage3.cc (1.1),
+	  generalizedaffinepreimage1.cc (1.1),
+	  generalizedaffinepreimage2.cc (1.1),
+	  generalizedaffinepreimage3.cc (1.1),
+	  generalizedaffinepreimage4.cc (1.1): Added tests for new methods
+	  computing preimages of polyhedra.
+
+2005-08-16 Tuesday 10:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.273), Polyhedron_public.cc (1.56):
+	  Added methods generalized_affine_preimage() and
+	  bounded_affine_preimage().  A few improvements also in other
+	  affine images and preimages methods.
+
+2005-08-16 Tuesday 10:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.114): In map_space_dimensions,
+	  temporary constant declared const.
+
+2005-08-16 Tuesday 10:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (1.81): Remove spurious space.
+
+2005-08-16 Tuesday 10:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.cc (1.7): Avoid a too long line.
+
+2005-08-15 Monday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.20), src/BD_Shape.inlines.hh (1.51),
+	  src/Checked_Number.defs.hh (1.29), src/DB_Row.inlines.hh (1.6),
+	  tests/ppl_test.hh (1.23): Old kludges removed.
+
+2005-08-15 Monday 21:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.48): Use the "-goal main"
+	  option of `plld' instead of the more verbose (and obscure)
+	  "-pl-options,-g,main".
+
+2005-08-15 Monday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/bug2.cc (1.2): Be more verbose.
+
+2005-08-12 Friday 19:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.172), ppl.sty (1.19): Provided new
+	  description of affine transfer relations so as to also allow for
+	  preimages of (bounded or generalized) affine relations.
+
+2005-08-12 Friday 16:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/generalizedaffineimage2.cc (grids.2): Add test22.
+
+2005-08-11 Thursday 17:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, generalizedaffineimage2.cc
+	  (grids.[21,1]): Add generalizedaffineimage2.
+
+2005-08-11 Thursday 17:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/intersection2.cc (grids.3): Always call
+	  intersection_assign_and_minimize.  Only call find_variation after
+	  the operation.
+
+2005-08-11 Thursday 17:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/intersection1.cc (grids.2): In test8 leave
+	  minimization to intersection_assign.
+
+2005-08-11 Thursday 17:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.47): In intersection_assign,
+	  add_recycled_congruences_and_minimize and
+	  add_recycled_congruences correct the sense of the test for
+	  emptiness.
+
+	  Enable generalized_affine_image(lhs,rhs,modulus).
+
+2005-08-11 Thursday 17:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.33): Improve some descriptions.
+
+2005-08-09 Tuesday 16:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/mapspacedims1.cc (grids.7): Correct comment.
+
+2005-08-09 Tuesday 16:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.32): Markup parameters in the
+	  construct(gs,convert_rays_to_lines) description.
+
+2005-08-09 Tuesday 16:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/mapspacedims1.cc (grids.6): Add test9, which tests a
+	  minimized grid in which the point contains factors and the
+	  divisor is greater than one.	Dump the grids on failure.
+
+2005-08-09 Tuesday 16:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_nonpublic.cc
+	  (grids.[31,11,23]): Add a convert_rays_to_line parameter to
+	  Grid(gs) and construct(gs).
+
+	  In map_space_dimensions, when the number of dimensions changes:
+
+	    - ensure that points and rays remain constant under the
+	  generator
+	      normalization that occurs when the points and rays are
+	  created
+
+	    - skip converting rays to lines when creating the temporary new
+	      grid.
+
+2005-08-08 Monday 20:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, generalizedaffineimage1.cc
+	  (grids.[20,1]): Add generalizedaffineimage1.
+
+2005-08-08 Monday 19:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_public.cc (grids.[30,46]): Declare the
+	  generalized_affine_image methods.  Enable method
+	  generalized_affine_image(var,expr,denom,mod).  Clean some
+	  formatting.  Note where comments mention rays.
+
+2005-08-08 Monday 19:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.cc (grids.10): Call
+	  remove_invalid_lines_and_rays when grid is true.
+
+2005-08-03 Wednesday 20:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, foldspacedims1.cc (grids.[19,1]): Add
+	  foldspacedims1.
+
+2005-08-03 Wednesday 20:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/join1.cc (grids.5): Add test6 and test7, in which the
+	  generators are initially out of date.
+
+2005-08-03 Wednesday 20:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_chdims.cc, Grid_public.cc (grids.[14,45]): Enable
+	  fold_space_dimensions.  Invert the empty tests after updating in
+	  join_assign.
+
+2005-08-02 Tuesday 19:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/affineimage1.cc (grids.2): Format linear expressions
+	  consistently.
+
+2005-08-02 Tuesday 19:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, affinepreimage1.cc (grids.[18,1]): Add
+	  affinepreimage1.
+
+2005-08-02 Tuesday 19:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.44): Enable affine_preimage.
+
+2005-08-01 Monday 18:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, affineimage1.cc (grids.[17,1]): Add
+	  affineimage1.
+
+2005-08-01 Monday 18:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Linear_Row.cc, Linear_Row.defs.hh (grids.[3,3]): Add method
+	  ascii_dump().
+
+2005-08-01 Monday 18:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.22): In normalize_divisors(sys,
+	  divisor) only set the divisor for points.
+
+2005-08-01 Monday 18:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Generator.cc, Generator.defs.hh,
+	  Generator_System.cc, Generator_System.defs.hh, Grid_public.cc,
+	  Linear_Expression.defs.hh (grids.[18,2,5,9,3,43,2]): Enable
+	  Congruence_System::affine_preimage and Grid::affine_image.
+
+	  Add parameter check_normalization to Generator::OK, which
+	  determines if normalization is checked.  Add parameter
+	  check_normalization to Generator_System methods OK and insert,
+	  which is passed through to Generator::OK.  Skip the normalization
+	  checks for the Grid generator system.
+
+	  Add parameter grid to Generator_System::affine_image, which
+	  determines if strong_normalize and remove_invalid_lines_and_rays
+	  are called.
+
+	  In add_generator normalize the generator's divisor after the
+	  generator is inserted.
+
+	  Declare Grid and Congruence_System friends of Linear_Expression.
+
+2005-07-27 Wednesday 13:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/relations2.cc (grids.2): Add test4 to test8.
+
+2005-07-27 Wednesday 13:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.42): Update relation_with(cg) to handle
+	  any grid representation, instead of requiring a minimized
+	  representation.
+
+2005-07-24 Sunday 20:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.22): Added boundedaffineimage2
+	  and nnc_boundedaffineimage2 to XFAIL_WITH_INT8.
+
+2005-07-20 Wednesday 09:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.131):    Corrected
+	  documentation for the Prolog interface where the specifications
+	     for the predicates ppl_Polyhedron_contains_Polyhedron/2 and
+	     ppl_Polyhedron_strictly_contains_Polyhedron/2 referred to
+	  their arguments
+	     the wrong way round.
+
+2005-07-14 Thursday 20:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/expandspacedim1.cc (grids.2): Indent the copyright
+	  line.
+
+2005-07-14 Thursday 20:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, relations1.cc, relations2.cc
+	  (grids.[16,1,1]): Add relations1 and relations2.
+
+2005-07-14 Thursday 20:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_chdims.cc, Grid_public.cc
+	  (grids.[29,13,41]): Enable and convert relation_with(cg) and
+	  relation_with(g), adding an optional divisor argument to
+	  relations_with(g).
+
+2005-07-14 Thursday 20:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[17,12]): Add method insert_verbatim.
+
+2005-07-13 Wednesday 14:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, expandspacedim1.cc (grids.[15,1]): Add
+	  expandspacedim1.
+
+2005-07-13 Wednesday 14:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.12): Enable and convert
+	  expand_space_dimension.
+
+2005-07-12 Tuesday 16:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/boundedaffineimage1.cc (1.2): Corrected a typo
+	  in the expected result.
+
+2005-07-12 Tuesday 15:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.156): Announced new method
+	  Polyhedron::bounded_affine_image().
+
+2005-07-12 Tuesday 15:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: grid1.cc, grid2.cc (grids.[18,14]): Dump grids on
+	  failure.  Only use find_variation for the grid under test.
+	  Insert test9 to test12, test14 and test22, from the revised
+	  Chiara tests.
+
+2005-07-12 Tuesday 15:44  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/ppl_test.hh (grids.9): Add macro dump_grids.
+
+2005-07-12 Tuesday 13:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.171), interfaces/C/ppl_c.cc (1.134),
+	  interfaces/C/ppl_c.h.in (1.49),
+	  interfaces/Prolog/Prolog_interface.dox (1.130),
+	  interfaces/Prolog/ppl_prolog.icc (1.156),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.11),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.79),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.51),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.75),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.99),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.38),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.66),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.16),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.91), src/Polyhedron.defs.hh
+	  (1.272), src/Polyhedron_public.cc (1.55),
+	  tests/Polyhedron/Makefile.am (1.21),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.1),
+	  tests/Polyhedron/boundedaffineimage2.cc (1.1),
+	  tests/Polyhedron/exceptions1.cc (1.5): The new method
+	  Polyhedron::affine_bounds() renamed as
+	  Polyhedron::bounded_affine_image(), added to all available
+	  interfaces and documented. Added a few tests on its C++ version
+	  (no test added yet for Prolog).
+
+2005-07-12 Tuesday 12:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: grid1.cc, grid2.cc (grids.[17,13]): Match tests to
+	  revised Chiara algorithm tests.
+
+2005-07-11 Monday 17:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_minimize.cc, Grid_public.cc
+	  (grids.[28,16,40]): Replace both add_and_minimize methods with
+	  code in each caller.
+
+2005-07-11 Monday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile (1.5), config.guess (1.30), config.sub (1.29), depcomp
+	  (1.10), mkinstalldirs (1.9), missing (1.10), Watchdog/compile
+	  (1.5), Watchdog/config.guess (1.14), Watchdog/config.sub (1.14),
+	  Watchdog/depcomp (1.8), Watchdog/missing (1.6),
+	  Watchdog/mkinstalldirs (1.5): Updated from Automake 1.9.6.
+
+2005-07-08 Friday 20:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am, equals1.cc (grids.[14,1]): Add equals,
+	  which tests operator== and operator!=.
+
+2005-07-08 Friday 19:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/mapspacedims1.cc (grids.5): Correct test7 expected
+	  result.  Print test name from all tests.
+
+2005-07-08 Friday 19:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruencesystem2.cc (grids.5): Add another line test,
+	  and some temporary comments.
+
+2005-07-08 Friday 19:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addgenerator1.cc (grids.8): Correct test3 expected
+	  result.
+
+2005-07-08 Friday 19:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.16): In satisfies_all_congruences
+	  compare the entire scalar product to zero when the generator is a
+	  line.
+
+2005-07-07 Thursday 16:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/join1.cc (grids.4): Add test5, which requires divisor
+	  normalisation.  Call join_assign instead of
+	  join_assign_and_minimize in test4.
+
+2005-07-07 Thursday 16:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.39): Match the divisors of the two
+	  generator systems in join_assign.
+
+2005-07-06 Wednesday 20:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruencesystem2.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/removespacedims1.cc,
+	  src/Congruence_System.cc, src/Congruence_System.defs.hh,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc
+	  (grids.[4,16,12,4,15,11,21,38]): Normalize divisors after
+	  converting from rays to lines.  Use the system-wide divisor to
+	  calculate the factor used when normalizing parameters.  In
+	  satisfies_all_congruences multiply the modulus by the divisor to
+	  account for the divisor when comparing parameters.
+
+	  Correct Chiara function names in grid1.cc comments.  Correct the
+	  expected results in grid1.cc test13 and test14, grid2.cc test2
+	  and test10 and removespacedims1.cc test1.  Insert test16 (from
+	  the chiara water monitor example) into grid1.cc.
+
+2005-07-06 Wednesday 19:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.155): Mentioned the bug corrected in
+	  generalized_affine_image() and the renaming of enumeration
+	  Degenerate_Element.
+
+2005-07-06 Wednesday 17:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.147): Degenerate_Kind is now named Degenerate_Element and
+	  placed outside of class Polyhedron. Namespaces are documented in
+	  namespaces.hh.
+
+2005-07-06 Wednesday 17:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.155): No longer using
+	  Degenerate_Kind.
+
+2005-07-06 Wednesday 17:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.133): Do use Degenerate_Element instead
+	  of Degenerate_Kind.
+
+2005-07-06 Wednesday 17:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.55),
+	  devref-print.doxyconf-latex.in (1.55), devref.doxyconf-html.in
+	  (1.55): Also include namespaces.hh.
+
+2005-07-06 Wednesday 17:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/addspacedims3.cc (1.5),
+	  BD_Shape/addspacedims4.cc (1.5), BD_Shape/addspacedims5.cc (1.5),
+	  BD_Shape/addspacedims6.cc (1.5), BD_Shape/addspacedims7.cc (1.4),
+	  BD_Shape/cc76extrapolation4.cc (1.4), BD_Shape/cc76narrowing4.cc
+	  (1.4), BD_Shape/cc76narrowing5.cc (1.4),
+	  BD_Shape/ch78widening2.cc (1.4), BD_Shape/ch78widening5.cc (1.4),
+	  BD_Shape/concatenate2.cc (1.4), BD_Shape/concatenate5.cc (1.4),
+	  BD_Shape/constraints1.cc (1.5), BD_Shape/contains2.cc (1.5),
+	  BD_Shape/contains3.cc (1.5), BD_Shape/equality1.cc (1.5),
+	  BD_Shape/fromgensys1.cc (1.3),
+	  BD_Shape/generalizedaffineimage14.cc (1.4),
+	  BD_Shape/generalizedaffineimage3.cc (1.5),
+	  BD_Shape/intersection4.cc (1.5), BD_Shape/intersection5.cc (1.5),
+	  BD_Shape/limitedCC76extrapolation2.cc (1.4),
+	  BD_Shape/limitedCC76extrapolation3.cc (1.4),
+	  BD_Shape/mapspacedims2.cc (1.4), BD_Shape/polydifference1.cc
+	  (1.5), BD_Shape/polydifference5.cc (1.4), BD_Shape/relations1.cc
+	  (1.5), BD_Shape/relations5.cc (1.5), BD_Shape/removespacedims2.cc
+	  (1.4), BD_Shape/removespacedims3.cc (1.4),
+	  BD_Shape/timeelapse1.cc (1.4), BD_Shape/timeelapse5.cc (1.4),
+	  BD_Shape/writebdshape2.cc (1.2), Polyhedron/addconstraint2.cc
+	  (1.4), Polyhedron/addconstraints1.cc (1.4),
+	  Polyhedron/addconstraints10.cc (1.4),
+	  Polyhedron/addconstraints13.cc (1.4),
+	  Polyhedron/addconstraints3.cc (1.4),
+	  Polyhedron/addconstraints5.cc (1.4),
+	  Polyhedron/addconstraints7.cc (1.4),
+	  Polyhedron/addconstraints8.cc (1.4), Polyhedron/addgenerator1.cc
+	  (1.4), Polyhedron/addgenerator2.cc (1.4),
+	  Polyhedron/addgenerator4.cc (1.4), Polyhedron/addgenerator5.cc
+	  (1.4), Polyhedron/addgenerators1.cc (1.4),
+	  Polyhedron/addgenerators10.cc (1.4),
+	  Polyhedron/addgenerators11.cc (1.4),
+	  Polyhedron/addgenerators12.cc (1.4),
+	  Polyhedron/addgenerators13.cc (1.4), Polyhedron/addgenerators2.cc
+	  (1.4), Polyhedron/addgenerators6.cc (1.4),
+	  Polyhedron/addgenerators8.cc (1.4), Polyhedron/addspacedims1.cc
+	  (1.4), Polyhedron/addspacedims2.cc (1.4),
+	  Polyhedron/addspacedims3.cc (1.4), Polyhedron/addspacedims8.cc
+	  (1.4), Polyhedron/affineimage1.cc (1.4),
+	  Polyhedron/affineimage4.cc (1.4), Polyhedron/affineimage5.cc
+	  (1.4), Polyhedron/affineimage6.cc (1.4),
+	  Polyhedron/affinepreimage3.cc (1.4),
+	  Polyhedron/affinepreimage8.cc (1.4),
+	  Polyhedron/ascii_dump_load6.cc (1.4),
+	  Polyhedron/bgp99extrapolation1.cc (1.4),
+	  Polyhedron/bgp99extrapolation2.cc (1.4),
+	  Polyhedron/bhrz03widening10.cc (1.4),
+	  Polyhedron/bhrz03widening15.cc (1.4),
+	  Polyhedron/bhz03widening1.cc (1.4), Polyhedron/bhz03widening2.cc
+	  (1.4), Polyhedron/bhz03widening3.cc (1.4),
+	  Polyhedron/bhz03widening4.cc (1.4), Polyhedron/bhz03widening5.cc
+	  (1.4), Polyhedron/bhz03widening6.cc (1.4), Polyhedron/bounded1.cc
+	  (1.4), Polyhedron/boundedbhrz03extrapolation1.cc (1.2),
+	  Polyhedron/boundingbox1.cc (1.4), Polyhedron/boundingbox2.cc
+	  (1.4), Polyhedron/boundingbox3.cc (1.4),
+	  Polyhedron/boundingbox4.cc (1.4), Polyhedron/boundingbox5.cc
+	  (1.4), Polyhedron/bounds1.cc (1.4), Polyhedron/concatenate2.cc
+	  (1.4), Polyhedron/concatenate6.cc (1.4),
+	  Polyhedron/concatenate7.cc (1.2), Polyhedron/constraints2.cc
+	  (1.4), Polyhedron/constraints4.cc (1.4), Polyhedron/disjoint2.cc
+	  (1.4), Polyhedron/disjoint3.cc (1.4), Polyhedron/empty1.cc (1.4),
+	  Polyhedron/exceptions1.cc (1.4), Polyhedron/exceptions2.cc (1.4),
+	  Polyhedron/exceptions3.cc (1.5), Polyhedron/expandspacedim1.cc
+	  (1.4), Polyhedron/expandspacedim2.cc (1.4),
+	  Polyhedron/foldspacedims1.cc (1.4), Polyhedron/foldspacedims2.cc
+	  (1.4), Polyhedron/generalizedaffineimage1.cc (1.4),
+	  Polyhedron/generalizedaffineimage11.cc (1.4),
+	  Polyhedron/generalizedaffineimage13.cc (1.2),
+	  Polyhedron/generalizedaffineimage14.cc (1.2),
+	  Polyhedron/generalizedaffineimage2.cc (1.4),
+	  Polyhedron/generalizedaffineimage3.cc (1.4),
+	  Polyhedron/generalizedaffineimage4.cc (1.4),
+	  Polyhedron/generalizedaffineimage6.cc (1.4),
+	  Polyhedron/generalizedaffineimage7.cc (1.4),
+	  Polyhedron/generators3.cc (1.4), Polyhedron/generators4.cc (1.4),
+	  Polyhedron/generators6.cc (1.4), Polyhedron/generators7.cc (1.3),
+	  Polyhedron/geomcovers1.cc (1.4), Polyhedron/h79widening5.cc
+	  (1.4), Polyhedron/intersection10.cc (1.4),
+	  Polyhedron/intersection11.cc (1.4), Polyhedron/intersection4.cc
+	  (1.4), Polyhedron/intersection5.cc (1.4),
+	  Polyhedron/intersection6.cc (1.4), Polyhedron/intersection8.cc
+	  (1.4), Polyhedron/intersection9.cc (1.4),
+	  Polyhedron/limitedh79extrapolation4.cc (1.4),
+	  Polyhedron/linearpartition4.cc (1.4), Polyhedron/mapspacedims1.cc
+	  (1.4), Polyhedron/mc91.cc (1.4), Polyhedron/membytes1.cc (1.4),
+	  Polyhedron/minconstraints2.cc (1.4), Polyhedron/mingenerators2.cc
+	  (1.4), Polyhedron/onepoint.cc (1.4),
+	  Polyhedron/polydifference4.cc (1.4),
+	  Polyhedron/polydifference7.cc (1.4),
+	  Polyhedron/polydifference9.cc (1.4), Polyhedron/polyhull2.cc
+	  (1.4), Polyhedron/polyhull3.cc (1.4), Polyhedron/polyhull5.cc
+	  (1.4), Polyhedron/polyhull8.cc (1.4), Polyhedron/polyhull9.cc
+	  (1.4), Polyhedron/polypowerset1.cc (1.3),
+	  Polyhedron/randphull1.cc (1.4), Polyhedron/randphull2.cc (1.5),
+	  Polyhedron/relations17.cc (1.4), Polyhedron/relations19.cc (1.4),
+	  Polyhedron/relations2.cc (1.4), Polyhedron/relations6.cc (1.4),
+	  Polyhedron/removespacedims10.cc (1.4),
+	  Polyhedron/removespacedims3.cc (1.4),
+	  Polyhedron/removespacedims5.cc (1.4), Polyhedron/timeelapse2.cc
+	  (1.4), Polyhedron/timeelapse5.cc (1.4), Polyhedron/timeelapse7.cc
+	  (1.4), Polyhedron/timeelapse8.cc (1.4), Polyhedron/timeelapse9.cc
+	  (1.4), Polyhedron/topclosed1.cc (1.4), Polyhedron/topclosed2.cc
+	  (1.4), Polyhedron/topclosure2.cc (1.4), Polyhedron/topclosure4.cc
+	  (1.4), Polyhedron/writegensys2.cc (1.4): Using Degenerate_Element
+	  instead of Polyhedron::Degenerate_Kind.
+
+2005-07-06 Wednesday 17:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.19), BD_Shape.inlines.hh (1.50),
+	  C_Polyhedron.defs.hh (1.32), C_Polyhedron.inlines.hh (1.25),
+	  Determinate.defs.hh (1.54), Determinate.inlines.hh (1.47),
+	  Makefile.am (1.111), NNC_Polyhedron.defs.hh (1.34),
+	  NNC_Polyhedron.inlines.hh (1.28), Polyhedra_Powerset.defs.hh
+	  (1.15), Polyhedra_Powerset.inlines.hh (1.19), Polyhedron.defs.hh
+	  (1.271), Polyhedron.types.hh (1.15), Polyhedron_nonpublic.cc
+	  (1.47), algorithms.hh (1.40), globals.defs.hh (1.20),
+	  namespaces.hh (1.1): Doxygen documentation for namespaces moved
+	  into namespaces.hh.  Polyhedron::Degenerate_Kind renamed as
+	  Degenerate_Element and moved outside of class Polyhedron in
+	  globals.hh.
+
+2005-07-06 Wednesday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.5), utils/timings.cc (1.3):
+	  <sys/resource.h> should always be included after <time.h> and
+	  <sys/time.h> so as to make sure we have the definitions for,
+	  e.g., `ru_utime'.
+
+2005-07-06 Wednesday 14:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.54),
+	  devref-print.doxyconf-latex.in (1.54), devref.doxyconf-html.in
+	  (1.54), user-browse.doxyconf-latex.in (1.25),
+	  user-print.doxyconf-latex.in (1.25), user.doxyconf-html.in
+	  (1.27): Changed so as to reflect the fact that macro __P has been
+	  renamed PPL_PROTO.
+
+2005-07-06 Wednesday 10:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.22): Minor typo correction.
+
+2005-07-06 Wednesday 10:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.146), src/Powerset.defs.hh (1.12): One item in the huge
+	  list has gone.
+
+2005-07-06 Wednesday 09:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, NEWS, README, TODO, build_header, config.guess,
+	  config.sub, configure.ac, install-sh, ltmain.sh, ppl.spec.in,
+	  Watchdog/Handler.defs.hh, Watchdog/Handler.inlines.hh,
+	  Watchdog/Time.inlines.hh, Watchdog/config.guess,
+	  Watchdog/config.sub, Watchdog/install-sh, Watchdog/ltmain.sh,
+	  debian/.cvsignore, debian/changelog, debian/compat,
+	  debian/control, debian/libppl-c.dirs, debian/libppl-c.install,
+	  debian/libppl-c.links, debian/libppl-dev.dirs,
+	  debian/libppl-dev.doc-base, debian/libppl-dev.doc-base.user,
+	  debian/libppl-dev.docs, debian/libppl-dev.install,
+	  debian/libppl-dev.links, debian/libppl-gprolog.links,
+	  debian/libppl-pwl.copyright.in, debian/libppl-pwl.dirs,
+	  debian/libppl-pwl.docs, debian/libppl-pwl.install,
+	  debian/libppl-sicstus.links, debian/libppl-swi.links,
+	  debian/libppl-yap.links, debian/libppl.copyright.in,
+	  debian/libppl.dirs, debian/libppl.docs, debian/libppl.install,
+	  debian/rules, demos/ppl_lcdd/.cvsignore,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/README,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+	  demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+	  demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+	  demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+	  demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+	  doc/Makefile.am, doc/definitions.dox, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/check_script,
+	  interfaces/Prolog/tests/check_script2,
+	  interfaces/Prolog/tests/check_script2_int8,
+	  interfaces/Prolog/tests/expected2_int16,
+	  interfaces/Prolog/tests/expected2_int16_a,
+	  interfaces/Prolog/tests/expected2_int32,
+	  interfaces/Prolog/tests/expected2_int32_a,
+	  interfaces/Prolog/tests/expected2_int64,
+	  interfaces/Prolog/tests/expected2_int64_a,
+	  interfaces/Prolog/tests/expected2_int8,
+	  interfaces/Prolog/tests/expected2_int8_a,
+	  interfaces/Prolog/tests/expected2_mpz,
+	  interfaces/Prolog/tests/expected2_mpz_a,
+	  interfaces/Prolog/tests/expected3_int16,
+	  interfaces/Prolog/tests/expected3_int16_a,
+	  interfaces/Prolog/tests/expected3_int32,
+	  interfaces/Prolog/tests/expected3_int32_a,
+	  interfaces/Prolog/tests/expected3_int64,
+	  interfaces/Prolog/tests/expected3_int64_a,
+	  interfaces/Prolog/tests/expected3_int8,
+	  interfaces/Prolog/tests/expected3_int8_a,
+	  interfaces/Prolog/tests/expected3_mpz,
+	  interfaces/Prolog/tests/expected3_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int32,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int64,
+	  interfaces/Prolog/tests/expected_clpq2_int64_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq2_mpz,
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_clpq_int32,
+	  interfaces/Prolog/tests/expected_clpq_int32_a,
+	  interfaces/Prolog/tests/expected_clpq_int64,
+	  interfaces/Prolog/tests/expected_clpq_int64_a,
+	  interfaces/Prolog/tests/expected_clpq_int8,
+	  interfaces/Prolog/tests/expected_clpq_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_mpz,
+	  interfaces/Prolog/tests/expected_clpq_mpz_a,
+	  interfaces/Prolog/tests/expected_int16,
+	  interfaces/Prolog/tests/expected_int16_a,
+	  interfaces/Prolog/tests/expected_int32,
+	  interfaces/Prolog/tests/expected_int32_a,
+	  interfaces/Prolog/tests/expected_int64,
+	  interfaces/Prolog/tests/expected_int64_a,
+	  interfaces/Prolog/tests/expected_int8,
+	  interfaces/Prolog/tests/expected_int8_a,
+	  interfaces/Prolog/tests/expected_mpz,
+	  interfaces/Prolog/tests/expected_mpz_a,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/expected_pchk_mpz,
+	  interfaces/Prolog/tests/expected_pchk_mpz_a,
+	  interfaces/Prolog/tests/script_clpq,
+	  interfaces/Prolog/tests/script_clpq2,
+	  interfaces/Prolog/tests/script_clpq2_int8, src/.cvsignore,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/Bounding_Box.cc, src/Bounding_Box.defs.hh,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh, src/DB_Row.defs.hh,
+	  src/E_Rational.inlines.hh, src/Float.defs.hh,
+	  src/Float.inlines.hh, src/Generator.cc, src/Generator.defs.hh,
+	  src/Grid.defs.hh, src/Grid_Status.idefs.hh, src/Init.cc,
+	  src/Init.defs.hh, src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Makefile.am, src/Ph_Status.idefs.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Result.defs.hh, src/Rounding.defs.hh,
+	  src/Rounding.inlines.hh, src/checked.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_ext.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.defs.hh,
+	  src/globals.inlines.hh, src/ppl_header.bottom, src/ppl_header.hh,
+	  src/ppl_header.middle, src/ppl_header.top, tests/BBox.cc,
+	  tests/BBox.hh, tests/PFunction.cc, tests/PFunction.hh,
+	  tests/ehandlers.hh, tests/files.hh, tests/ppl_test.hh,
+	  tests/print.cc, tests/print.hh, tests/BD_Shape/.cvsignore,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addspacedims1.cc,
+	  tests/BD_Shape/addspacedims2.cc, tests/BD_Shape/addspacedims3.cc,
+	  tests/BD_Shape/addspacedims4.cc, tests/BD_Shape/addspacedims5.cc,
+	  tests/BD_Shape/addspacedims6.cc, tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+	  tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+	  tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/affinepreimage5.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/constraints2.cc, tests/BD_Shape/contains2.cc,
+	  tests/BD_Shape/contains3.cc, tests/BD_Shape/empty3.cc,
+	  tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+	  tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+	  tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage13.cc,
+	  tests/BD_Shape/generalizedaffineimage14.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+	  tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+	  tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/polydifference1.cc, tests/BD_Shape/relations1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/relations5.cc, tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/universe1.cc, tests/BD_Shape/writebdiffs1.cc,
+	  tests/BD_Shape/writebdiffs2.cc, tests/BD_Shape/writebdshape1.cc,
+	  tests/BD_Shape/writebdshape2.cc, tests/Polyhedron/.cvsignore,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/affinetrans.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/bug2.cc, tests/Polyhedron/bug2.dat,
+	  tests/Polyhedron/concatenate7.cc,
+	  tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/generalizedaffineimage13.cc,
+	  tests/Polyhedron/generalizedaffineimage14.cc,
+	  tests/Polyhedron/randphull2.cc, tests/Polyhedron/watchdog1.cc
+	  (grids.[1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,4,27,2,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, [...]
+	  First merge from main trunk.
+
+2005-07-04 Monday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.54): Corrected symmetric bug on the
+	  other flavor of method Polyhedron::generalized_affine_inage().
+
+2005-07-04 Monday 15:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.20),
+	  generalizedaffineimage14.cc (1.1): New test show symmetric bug on
+	  the other flavor of generalized_affine_image().
+
+2005-07-03 Sunday 23:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/: Makefile.am (1.4), check_script2_int8
+	  (1.2), script_clpq2_int8 (1.1): Distribution fixed.
+
+2005-07-03 Sunday 23:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.37): Link against libYap.
+
+2005-07-03 Sunday 23:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.129), XSB/Makefile.am
+	  (1.33), XSB/xsb_clpq.P (1.13), XSB/xsb_clpq2.P (1.11),
+	  XSB/xsb_pl_check.P (1.15): Updated to use new versions of XSB
+	  (older ones are too problematic).  Only XSB versions following
+	  2.7.1 and CVS HEAD versions starting from 2 July 2005 are now
+	  supported.
+
+2005-07-03 Sunday 23:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.36): Make the tests
+	  independent from one another.  Updated to use the new names of
+	  the test files.
+
+2005-07-03 Sunday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.145): We should not forget to update those bits of
+	  documentation that have proved to be not adequate.
+
+2005-07-03 Sunday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/: Makefile.am (1.46), gnu_pl_check.pl
+	  (1.5): Make the tests independent from one another.  Updated to
+	  use the new names of the test files.
+
+2005-07-03 Sunday 16:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.52), sp_pl_check.pl
+	  (1.3): Make the tests independent from one another.  Updated to
+	  use the new names of the test files.
+
+2005-07-03 Sunday 14:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.42): Make the tests
+	  independent from one another.  Updated to use the new names of
+	  the test files.
+
+2005-07-03 Sunday 14:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am (1.47), swi_pl_check.pl
+	  (1.4): Make the tests independent from one another.  Updated to
+	  use the new names of the test files.
+
+2005-07-03 Sunday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/: check_script (1.2), check_script2
+	  (1.2), expected2_int16 (1.5), expected2_int16_a (1.4),
+	  expected2_int32 (1.4), expected2_int32_a (1.3), expected2_int64
+	  (1.3), expected2_int64_a (1.3), expected2_int8 (1.3),
+	  expected2_int8_a (1.3), expected2_mpz (1.3), expected2_mpz_a
+	  (1.3), expected3_int16 (1.2), expected3_int16_a (1.2),
+	  expected3_int32 (1.2), expected3_int32_a (1.2), expected3_int64
+	  (1.3), expected3_int64_a (1.2), expected3_int8 (1.3),
+	  expected3_int8_a (1.2), expected3_mpz (1.2), expected3_mpz_a
+	  (1.2), expected_clpq2_int16 (1.1), expected_clpq2_int16_a (1.1),
+	  expected_clpq2_int32 (1.1), expected_clpq2_int32_a (1.1),
+	  expected_clpq2_int64 (1.1), expected_clpq2_int64_a (1.1),
+	  expected_clpq2_int8 (1.1), expected_clpq2_int8_a (1.1),
+	  expected_clpq2_mpz (1.1), expected_clpq2_mpz_a (1.1),
+	  expected_clpq_int16 (1.1), expected_clpq_int16_a (1.1),
+	  expected_clpq_int32 (1.1), expected_clpq_int32_a (1.1),
+	  expected_clpq_int64 (1.1), expected_clpq_int64_a (1.1),
+	  expected_clpq_int8 (1.1), expected_clpq_int8_a (1.1),
+	  expected_clpq_mpz (1.1), expected_clpq_mpz_a (1.1),
+	  expected_int16 (1.3), expected_int16_a (1.3), expected_int32
+	  (1.3), expected_int32_a (1.3), expected_int64 (1.3),
+	  expected_int64_a (1.3), expected_int8 (1.4), expected_int8_a
+	  (1.4), expected_mpz (1.3), expected_mpz_a (1.3),
+	  expected_pchk_int16 (1.1), expected_pchk_int16_a (1.1),
+	  expected_pchk_int32 (1.1), expected_pchk_int32_a (1.1),
+	  expected_pchk_int64 (1.1), expected_pchk_int64_a (1.1),
+	  expected_pchk_int8 (1.1), expected_pchk_int8_a (1.1),
+	  expected_pchk_mpz (1.1), expected_pchk_mpz_a (1.1), script_clpq
+	  (1.1), script_clpq2 (1.1): Use more sensible file names.
+
+2005-07-03 Sunday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.164): Version number bumped.
+
+2005-07-03 Sunday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.128), GNU/README
+	  (1.1): Specify how to obtain the only version of GNU Prolog that
+	  is known to work with the PPL's Prolog interface.
+
+2005-07-03 Sunday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.45): Always use $(CXX) to
+	  compile and link.
+
+2005-07-03 Sunday 10:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Polyhedron/Makefile.am (1.19), BD_Shape/Makefile.am
+	  (1.12): LDADD reordered so that libraries occur in dependence
+	  order (Cygwin seems to depend on this).
+
+2005-07-01 Friday 17:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_public.cc, Grid.defs.hh, Grid_nonpublic.cc
+	  (grids.[37,26,20]): Add back normalizing of divisors.  Take out
+	  two temporary comments, and add one.	Take some old Polyhedron
+	  code out of add_recycled_generators_and_minimize.
+
+2005-06-30 Thursday 19:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_conversion.cc, Grid_simplify.cc,
+	  Row.inlines.hh (grids.[25,17,27,1]): Add strong reduction.  Use
+	  negate(x) instead of -x.  Slightly improve some comments.
+
+2005-06-27 Monday 13:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: addspacedims2.cc, removespacedims1.cc,
+	  removespacedims2.cc (grids.[4,3,3]): Correct known_gr.
+
+2005-06-27 Monday 13:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Generator_System.cc, Generator_System.defs.hh,
+	  Grid.defs.hh, Grid_chdims.cc, Grid_conversion.cc,
+	  Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
+	  Grid_simplify.cc, Linear_Row.cc, Linear_Row.defs.hh,
+	  Linear_Row.inlines.hh, Congruence.cc, Congruence.defs.hh,
+	  Congruence.inlines.hh, Congruence_System.cc,
+	  Congruence_System.defs.hh, Generator.defs.hh,
+	  Generator.inlines.hh
+	  (grids.[8,2,24,11,16,15,19,36,26,2,2,2,7,13,9,14,10,3,2]): Update
+	  to new treatment of virtual rows.  Add ascii_dump() methods to
+	  Congruence, Congruence_System and Generator_System.  Add macro
+	  print_dim_kinds to Grid.defs.hh.
+
+2005-06-22 Wednesday 12:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.53): Corrected the bug in
+	  Polyhedron::generalized_affine_image() that was shown by test
+	  generalizedaffineimage13.cc. We should actually check for
+	  emptyness before adding lines to the polyhedron.
+
+2005-06-22 Wednesday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.18),
+	  generalizedaffineimage13.cc (1.1): Added a test program showing a
+	  bug in Polyhedron::generalized_affine_image().  The bug shows up
+	  (by throwing an exception) when the polyhedron is empty, but hte
+	  library hasn't yet detected emptyness.
+
+2005-06-21 Tuesday 18:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.270), Polyhedron_public.cc (1.52):
+	  Added new method Polyhedron::affine_bounds() to compute the
+	  effect of transfer functions providing upper and lower bound
+	  affine expressions for a dimension of the polyhedron.
+
+2005-06-18 Saturday 22:58  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.28), Checked_Number.inlines.hh
+	  (1.34), checked.defs.hh (1.20), checked_ext.inlines.hh (1.18),
+	  checked_float.inlines.hh (1.38), checked_int.inlines.hh (1.34),
+	  checked_mpq.inlines.hh (1.19), checked_mpz.inlines.hh (1.23):
+	  Added mul2exp and div2exp.
+
+2005-06-16 Thursday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.29): Typo fixed.
+
+2005-06-16 Thursday 15:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.17), bug1.cc (1.2), bug1.dat
+	  (1.2), concatenate7.cc (1.1): Program `concatenate7' exhibits the
+	  same bug exhinited by `bug1'.
+
+2005-06-16 Thursday 15:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.28): Corrected a bug in
+	  Polyhedron::concatenate_assign() whereby the produced result
+	  could have failed to satisfy the library invariants.
+
+2005-06-16 Thursday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.16), bug2.cc (1.1), bug2.dat
+	  (1.1): Program bug2.cc exhibits a misbehavior that, up to now,
+	  has only been observed on MacOs X.
+
+2005-06-16 Thursday 12:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.15), bug1.cc (1.1), bug1.dat
+	  (1.1): Program bug1.cc exhibits a bug in
+	  Polyhedron::concatenate_assign().
+
+2005-06-16 Thursday 11:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.154): Colon added.
+
+2005-06-16 Thursday 11:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.153), src/Constraint.cc (1.50), src/Constraint.defs.hh
+	  (1.103), src/Generator.cc (1.61), src/Generator.defs.hh (1.104):
+	  New output operators in namespace IO_Operators: std::ostream&
+	  operator<<(std::ostream&, const Constraint::Type&) and
+	  std::ostream& operator<<(std::ostream&, const Generator::Type&).
+
+2005-06-16 Thursday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.132): FIXME dealt with.
+
+2005-06-16 Thursday 11:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.cc (1.49), Generator.cc (1.60): Avoid
+	  unnecessary qualification.
+
+2005-06-16 Thursday 11:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/randphull2.cc (1.4): When NOISY, make noise in
+	  case of failure.
+
+2005-06-15 Wednesday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.41): Do not assume `.' is
+	  in the `PATH' environment variable.
+
+2005-06-14 Tuesday 15:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addgenerator1.cc (grids.7): Improve comment.
+
+2005-06-14 Tuesday 15:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/ppl_test.hh (grids.7): Print ASCII dump of a when loading
+	  it fails.
+
+2005-06-14 Tuesday 15:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_chdims.cc, Grid_conversion.cc,
+	  Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
+	  Grid_simplify.cc (grids.[23,10,15,14,18,35,25]): Add enum
+	  Dimension_Kind and type Dimension_Kinds.  Add attribute
+	  dim_kinds, pass it to the minimize, simplify and conversion
+	  methods, and fill it in the simplify methods.  Add macro
+	  trace_dim_kinds.  Dump and load dim_kinds in ascii_load and
+	  ascii_dump.  Check dim_kinds in OK.  Adjust dim_kinds in
+	  add_space_dimensions*.
+
+	  Add ascii_dump(), which writes to cerr.
+
+2005-06-14 Tuesday 15:12  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.27), Checked_Number.inlines.hh
+	  (1.33), Rounding.defs.hh (1.12): Moved default rounding mode in
+	  policy. Removed bogus Checked_Pair trick.
+
+2005-06-14 Tuesday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.16): Do not refer to
+	  `option_index' if HAVE_GETOPT_H is undefined.
+
+2005-06-14 Tuesday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BBox.hh (1.8): Avoid using directives in header files.
+
+2005-06-14 Tuesday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.49): Include "C_Polyhedron.defs.hh".
+
+2005-06-14 Tuesday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BBox.cc (1.9), BBox.hh (1.7), PFunction.cc (1.5),
+	  PFunction.hh (1.6), ehandlers.hh (1.11), files.hh (1.7),
+	  ppl_test.hh (1.22), print.cc (1.15), print.hh (1.19): Adjust
+	  inclusions so as to avoid multiple inclusion of ppl_install.hh.
+	  Besides speeding up the build, this works around a problem on
+	  Darwin.
+
+2005-06-14 Tuesday 10:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PFunction.hh (1.5): Multiple inclusion guard fixed.
+
+2005-06-14 Tuesday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.43): Fixes for systems that do not
+	  provide <getopt.h>.
+
+2005-06-14 Tuesday 09:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.15): Do not declare `option_index'
+	  when it is not needed.
+
+2005-06-14 Tuesday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BDS_Status.inlines.hh (1.4): Helper function get_field() is
+	  now declared inline.
+
+2005-06-14 Tuesday 07:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.14): Work also on systems that do
+	  not provide <getopt.h> and/or that do not provide a declaration
+	  for RLIMIT_AS.
+
+2005-06-14 Tuesday 07:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.163): Check also for the presence of
+	  <sys/time.h>.
+
+2005-06-14 Tuesday 07:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.13), expected_int16 (1.3),
+	  expected_int16_a (1.3), expected_int32 (1.4), expected_int32_a
+	  (1.4), expected_int64 (1.4), expected_int64_a (1.4),
+	  expected_int8 (1.3), expected_int8_a (1.2), expected_mpz (1.4),
+	  expected_mpz_a (1.4): Do not use long options for testing, since
+	  they may be unavailable on some platforms.
+
+2005-06-13 Monday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.162): Version number bumped.
+
+2005-06-13 Monday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.152), interfaces/C/ppl_c.h.in (1.48): Do not infringe on
+	  system name space as well as on user name space.
+
+2005-06-10 Friday 18:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.34): Improve comment.
+
+2005-06-10 Friday 18:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (grids.11): Add test14, which adds a
+	  congruence system having a row capacity larger than the row
+	  capacity of the grid's existing congruence system.
+
+2005-06-10 Friday 18:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.15): Take tracing out of test20.
+
+2005-06-10 Friday 18:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.13): Move bug1 to TESTS.
+
+2005-06-10 Friday 18:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/bug1.cc (grids.2): Add header comment, use nout
+	  instead of cerr.
+
+2005-06-10 Friday 18:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.14): Improve comment.
+
+2005-06-10 Friday 18:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Row.defs.hh (grids.3): Declare Congruence_System a friend
+	  when EXTRA_ROW_DEBUG.
+
+2005-06-10 Friday 18:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.24): In reduce_pc_with_pc add GCD
+	  tracing and use the ternary operator instead of !.
+
+2005-06-10 Friday 17:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.14): In generator to congruence
+	  conversion ensure that the resulting moduli and first element of
+	  the matrix are positive.
+
+2005-06-10 Friday 14:02  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (1.33): Avoided a warning.
+
+2005-06-10 Friday 11:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.23): In free_row in the congruence
+	  simplify, ensure that all the rows to have the same capacity.
+
+2005-06-10 Friday 11:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[13,9]): Add method add_row.
+
+2005-06-09 Thursday 20:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/exceptions3.cc (1.4): Avoid a compiler warning.
+
+2005-06-09 Thursday 17:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SWI/Makefile.am (grids.2): Revert last change.
+
+2005-06-09 Thursday 12:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_conversion.cc (grids.[22,13]): Move the
+	  grid multiplying code into two inline functions called
+	  multiply_grid.
+
+2005-06-08 Wednesday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.13): Add test20, which constructs from
+	  a generator system containing a ray.
+
+2005-06-08 Wednesday 16:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.17): In method construct convert
+	  rays to lines.
+
+2005-06-08 Wednesday 16:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.9): Use a temporary variable in
+	  add_space_dimensions.
+
+2005-06-08 Wednesday 07:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: concatenate1.cc (1.4), contains2.cc (1.4),
+	  contains3.cc (1.4), empty3.cc (1.4), equality1.cc (1.4),
+	  exceptions1.cc (1.4), exceptions2.cc (1.4), intersection3.cc
+	  (1.4), intersection4.cc (1.4), intersection5.cc (1.4),
+	  intersection6.cc (1.4), intersection7.cc (1.4), intersection8.cc
+	  (1.4), mapspacedims4.cc (1.4), relations1.cc (1.4), relations2.cc
+	  (1.5), removespacedims1.cc (1.4), universe1.cc (1.4): Avoid
+	  unused variable warnings.
+
+2005-06-07 Tuesday 19:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Row.defs.hh (grids.2): Only befriend Grid when
+	  EXTRA_ROW_DEBUG.  Take out declaration of operator==(gr,gr) as a
+	  friend.
+
+2005-06-07 Tuesday 18:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.21): Include
+	  Constraint_Systems.inlines.hh.
+
+2005-06-07 Tuesday 17:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/.cvsignore (1.2), tests/Polyhedron/.cvsignore
+	  (1.5): Updated.
+
+2005-06-07 Tuesday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/.cvsignore (1.1), src/.cvsignore (1.8),
+	  tests/BD_Shape/.cvsignore (1.3), tests/Polyhedron/.cvsignore
+	  (1.3), tests/Polyhedron/.cvsignore (1.4): Updated.
+
+2005-06-07 Tuesday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.cc (1.2): Indentation fixed.
+
+2005-06-07 Tuesday 16:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SWI/Makefile.am (grids.1): Link against pl in
+	  rule ppl_pl$(EXEEXT).
+
+2005-06-07 Tuesday 12:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Row.defs.hh (grids.1): Temporarily befriend operator==(gr,gr)
+	  and Grid, and make method capacity public, for tracing.
+
+2005-06-07 Tuesday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh (1.6): Temporary kludge for Darwin that
+	  may turn out to be the right thing to do on any system.
+
+2005-06-07 Tuesday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.161): Version number bumped.
+
+2005-06-07 Tuesday 11:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh (1.19): Include "compiler.hh".
+
+2005-06-01 Wednesday 20:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_nonpublic.cc,
+	  Grid_public.cc (grids.[20,10,16,33]): Take out method
+	  add_low_level_congruences.
+
+2005-06-01 Wednesday 20:25  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.cc (grids.7): Update comments.  Re-enable
+	  the ascii_load comparison between actual and declared types.
+
+2005-06-01 Wednesday 20:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[12,8]): Update comments.  In OK add a message for the
+	  number of columns check and take out an old test.
+
+2005-06-01 Wednesday 20:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh
+	  (grids.[6,12,8]): Update comments.  Add a modulus method that
+	  returns a writable reference.
+
+2005-06-01 Wednesday 18:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.19): Make most of the constructors
+	  explicit.
+
+2005-06-01 Wednesday 17:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_minimize.cc, Grid_public.cc
+	  (grids.[18,13,32]): Take out the add_and_minimize\3 methods.
+	  Update some comments.  In the add_and_minimize\2 methods add all
+	  the given rows to the system, instead of looking for duplicates.
+	  Convert rays to lines in all generator-adding methods, for now.
+
+2005-06-01 Wednesday 13:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.31): In add_generators add rays as
+	  lines, for now.
+
+2005-06-01 Wednesday 13:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/join1.cc (grids.3): Add more interesting generators in
+	  test3.  Add test4, in which a ray is inserted.
+
+2005-05-28 Saturday 13:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/bug1.dat, src/Generator_System.cc (grids.[2,6]): In
+	  Generator_System::asci_load leave the stream read position at the
+	  end of the dump.
+
+2005-05-27 Friday 21:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: Makefile.am, bug1.cc, bug1.dat (grids.[12,1,1]): The
+	  program `bug1' exhibits a bug triggered by an invocation of (to
+	  be renamed) Grid::add_congruences_and_minimize(const
+	  Constraint_System&).
+
+2005-05-27 Friday 21:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.12): Improve a comment.
+
+2005-05-27 Friday 21:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (grids.10): Revert last change.
+
+2005-05-27 Friday 20:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (grids.9): Improve a comment.
+
+2005-05-27 Friday 20:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_minimize.cc, Grid_nonpublic.cc,
+	  Grid_public.cc (grids.[17,12,15,30]): Take out methods
+	  normalize_divisors and parameterize.	In the construct methods
+	  leave the system as given (instead of simplifying it).  Always
+	  clear the pending rows flag of an added generator system.  Set
+	  the sorted flag in the generator construct method.  Neaten some
+	  formatting.
+
+2005-05-27 Friday 14:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/ppl_test.hh, tests/Grid/addgenerator1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/congruencesystem2.cc,
+	  tests/Grid/writecongruencesystem.cc, src/Congruence.cc,
+	  src/Congruence_System.cc, src/Generator_System.cc,
+	  src/Grid.inlines.hh, src/Grid_chdims.cc, src/Grid_conversion.cc,
+	  src/Grid_minimize.cc, src/Grid_nonpublic.cc, src/Grid_public.cc,
+	  src/Grid_simplify.cc
+	  (grids.[6,6,7,3,3,5,11,5,9,8,12,11,14,29,22]): Use `!' instead of
+	  comparing to `false'.
+
+2005-05-27 Friday 14:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.11): Make zero_dim_false and
+	  zero_dim_integrality public.
+
+2005-05-26 Thursday 20:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/join2.cc (grids.2): Add test2 which joins with both
+	  grids universe.
+
+2005-05-26 Thursday 20:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/join1.cc (grids.2): Add test2 and test3 which join
+	  with both and one grids universe.
+
+2005-05-26 Thursday 20:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.28): Rename adjust_space_dimension to
+	  increase_space_dimension.
+
+2005-05-26 Thursday 20:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh,
+	  Congruence_System.inlines.hh (grids.[10,7,5]): Rename
+	  adjust_space_dimension to increase_space_dimension, and
+	  num_non_equalities to num_proper_congruences.  Only count proper
+	  congruences in num_proper_congruences.  Take out method
+	  saturates_all_congruences.  Make the member access permissions
+	  more sensible.  Enable the definition of zero_dim_empty.
+
+2005-05-26 Thursday 20:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.defs.hh, Congruence.inlines.hh,
+	  Grid_conversion.cc, Grid_simplify.cc (grids.[10,7,11,21]): Make
+	  the Congruence normalize methods protected and flag setting
+	  methods private.  In Congruence rename is_congruence to
+	  is_proper_congruence, and add method zero_dim_false.
+
+2005-05-26 Thursday 20:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: congruence1.cc, congruencesystem1.cc,
+	  congruencesystem2.cc (grids.[4,5,2]): Wrap the class under test,
+	  instead of requiring all methods to be public.
+
+2005-05-26 Thursday 17:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addcongruence1.cc (grids.2): Add test2, which adds to
+	  an empty grid.
+
+2005-05-26 Thursday 17:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addgenerator1.cc (grids.5): Add test7, which adds a
+	  generator to a universe grid.
+
+2005-05-26 Thursday 17:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.20): Improve a variable name, and a
+	  comment.
+
+2005-05-26 Thursday 16:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_public.cc (grids.[16,27]): Restore the
+	  declaration of add_congruence(c), and add a new declaration for
+	  add_congruences_and_minimize(cs).  Take out the
+	  add_congruence_and_minimize(cs) declaration.	Improve the
+	  ordering of the public definitions.  Define add_congruence(c) and
+	  add_congruence_and_minimize(c).
+
+2005-05-26 Thursday 16:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh,
+	  Congruence_System.inlines.hh (grids.[9,6,4]): Call num_columns
+	  later in adjust_space_dimension.  Add insert(c).  Take out an old
+	  constraint comment.  Take out pending row code, old
+	  constraint_system code, and method
+	  satisfies_all_congruences(g,ref).  Clean up ascii_dump and some
+	  of ascii_load.  Correct the names in the Congruence_System(c)
+	  declaration.
+
+2005-05-26 Thursday 16:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh
+	  (grids.[4,9,6]): Take out throw_invalid_modulus.  Update some
+	  temporary comments.  In Congruence(c) throw an exception if the
+	  constraint is a relation, and set the modulus to 0 instead of 1.
+
+2005-05-26 Thursday 13:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.26): In add_generator also clear the
+	  congruences up-to-date flag when adding to an empty grid.
+
+2005-05-26 Thursday 12:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addspacedims2.cc (grids.3): Add test6, which add
+	  dimensions only to the grid's generator system.
+
+2005-05-26 Thursday 12:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addspacedims1.cc (grids.6): Improve comment.
+
+2005-05-25 Wednesday 21:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.25): In OK, take the extra copy of the
+	  generator system out of the minimized test, Use "generators"
+	  instead of "parameters", and print the minimized congruence
+	  system (instead of the original) in the congruence minimized
+	  test.
+
+2005-05-25 Wednesday 20:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.11): Add test addcongruence1.
+
+2005-05-25 Wednesday 20:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addcongruence1.cc (grids.1): Initial revision.
+
+2005-05-25 Wednesday 20:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addgenerator1.cc (grids.4): Add test6, which tests
+	  add_generator_and_minimize.
+
+2005-05-25 Wednesday 19:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addgenerator1.cc (grids.3): Add tests 2 to 5.
+
+2005-05-25 Wednesday 14:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (grids.8): Start from the universe when
+	  constructing grids from congruences.
+
+2005-05-25 Wednesday 14:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.24): Take the extra temporary
+	  congruence system out of the OK minimize test.  Modify
+	  add_recycled_congruences and
+	  add_recycled_congruences_and_minimize to update the congruences
+	  before adding new ones.  Also improve the empty handling in both
+	  these methods.
+
+2005-05-25 Wednesday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.29), config.sub (1.28), install-sh (1.14),
+	  ltmain.sh (1.24), Watchdog/config.guess (1.13),
+	  Watchdog/config.sub (1.13), Watchdog/install-sh (1.11),
+	  Watchdog/ltmain.sh (1.13): Updated from Libtool 1.5.18.
+
+2005-05-25 Wednesday 07:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.28), config.sub (1.27), ltmain.sh (1.23),
+	  Watchdog/config.guess (1.12), Watchdog/config.sub (1.12),
+	  Watchdog/ltmain.sh (1.12): Updated from Libtool 1.5.16.
+
+2005-05-25 Wednesday 07:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.144): Added one issue to be checked before releasing PPL
+	  0.8.
+
+2005-05-25 Wednesday 07:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.46): The `libppl_swiprolog'
+	  library must be linked also with `libpwl'.
+
+2005-05-24 Tuesday 21:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_chdims.cc,
+	  Grid_nonpublic.cc, Grid_public.cc (grids.[15,8,7,13,23]): Take
+	  out all code for handling pending rows.  Add a check for pending
+	  rows to method OK.
+
+2005-05-24 Tuesday 21:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.19): Use unset_pending_rows instead
+	  of clearing the pending rows manually.
+
+2005-05-24 Tuesday 19:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.22): Always adjust the space dimension
+	  of con_sys in constructor Grid(num_dimensions, kind).  Clean a
+	  comment.
+
+2005-05-24 Tuesday 18:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_minimize.cc (grids.10): Take out tracing.
+
+2005-05-24 Tuesday 18:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh, tests/Grid/addgenerator1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/addspacedims2.cc,
+	  tests/Grid/grid1.cc, tests/Grid/grid2.cc,
+	  tests/Grid/intersection2.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/mapspacedims1.cc, tests/Grid/removespacedims2.cc
+	  (grids.[14,2,5,2,11,7,2,2,4,2]): In constructor
+	  Grid(num_dimensions, kind) kind is UNIVERSE if only
+	  num_dimensions if given.
+
+2005-05-24 Tuesday 17:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.21): Output "true" from operator<< if
+	  the grid is universe.
+
+2005-05-24 Tuesday 17:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addspacedims1.cc (grids.4): Add test5, where
+	  dimensions are only added to the congruence system.
+
+2005-05-24 Tuesday 16:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.10): Add test addgenerator1.
+
+2005-05-24 Tuesday 16:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addgenerator1.cc (grids.1): Initial revision.
+
+2005-05-24 Tuesday 16:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/mapspacedims1.cc (grids.3): Add test6 (maps additional
+	  dimensions to themselves), test7 (maps over existing dimensions)
+	  and test8 (maps away a dimension in an empty grid).
+
+2005-05-24 Tuesday 16:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.20): Set congruences up to date in
+	  add_congruence.  Implement the rest of add_generator.
+
+2005-05-23 Monday 19:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (grids.19):
+	  Grid::add_congruences_and_minimize(const Constraint_System& cs)
+	  fixed.
+
+2005-05-23 Monday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (grids.18): In
+	  Grid::add_congruences_and_minimize(const Constraint_System& cs),
+	  non equality constraints that may be present in `cs' are simply
+	  ignored.
+
+2005-05-23 Monday 18:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.17): Implement some of add_generator.
+	  Modify add_congruences_and_minimize to match the dimension of the
+	  congruence system being constructed to the given constraint
+	  system.  Correct a doxygen comment.
+
+2005-05-23 Monday 15:57  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/mapspacedims1.cc (grids.2): Add test5.
+
+2005-05-23 Monday 15:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.18): Adjust the system's row capacity
+	  after inserting or erasing rows.
+
+2005-05-23 Monday 15:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.6): In add_space_dimensions_and_embed
+	  correct the clearing of the minimize flags and the loop that adds
+	  virtual rows.  Take some pending code out of concatenate_assign.
+
+2005-05-20 Friday 09:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.9): Add test mapspacedims1.
+
+2005-05-20 Friday 09:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/mapspacedims1.cc (grids.1): Initial revision.
+
+2005-05-20 Friday 09:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (grids.7): Enable and implement method
+	  map_space_dimensions.
+
+2005-05-19 Thursday 09:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.16): Take out some of the pending code.
+	  Add the definition of add_congruences_and_minimize.
+
+2005-05-19 Thursday 09:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.13): Temporarily add
+	  add_congruences_and_minimize and erroneously rename
+	  add_congruences to add_congruences_and_minimize.
+
+2005-05-19 Thursday 09:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.17): Rename pivot_num to pivot_index.
+	  In the congruence reduction swap the current row with a newly
+	  accessed pivot instead of with the original reference to the
+	  pivot.  Also decrement the pivot_index in macro free_row.
+
+2005-05-18 Wednesday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/.cvsignore (grids.1): Put under CVS control.
+
+2005-05-18 Wednesday 17:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.10): Always define
+	  is_upper_triangular and is_lower_triangular.	Add some tracing.
+
+2005-05-18 Wednesday 17:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.12): Always declare is_upper_triangular
+	  and is_lower_triangular
+
+2005-05-18 Wednesday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.in (grids.2): Makefile.in is a generated file
+	  and should not be put under CVS.
+
+2005-05-18 Wednesday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (grids.3): Improvements to the section on
+	  rational grids.
+
+2005-05-17 Tuesday 22:06  Abramo Bagnara
+
+	* src/checked.inlines.hh (1.18): abs may legitimately fail with
+	  overflow.
+
+2005-05-17 Tuesday 19:31  Abramo Bagnara
+
+	* src/Init.cc (1.17): Fixed include file.
+
+2005-05-15 Sunday 20:03  Abramo Bagnara
+
+	* tests/ppl_test.hh (1.21): Moved rounding mode handling to a lower
+	  level. Converted some method to functions.
+
+2005-05-15 Sunday 18:13  Abramo Bagnara
+
+	* src/: Init.cc (1.16), Init.defs.hh (1.12), Makefile.am (1.110),
+	  Rounding.defs.hh (1.11), Rounding.inlines.hh (1.8),
+	  checked.defs.hh (1.19), checked.inlines.hh (1.17),
+	  checked_float.inlines.hh (1.37), checked_int.inlines.hh (1.32),
+	  checked_mpz.inlines.hh (1.22), fpu-none.inlines.hh (1.1): Moved
+	  rounding mode handling to a lower level.
+
+2005-05-15 Sunday 18:11  Abramo Bagnara
+
+	* src/: BD_Shape.inlines.hh (1.48), Checked_Number.defs.hh (1.26),
+	  Checked_Number.inlines.hh (1.32): Converted many Checked_Number
+	  method in functions.
+
+2005-05-15 Sunday 10:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.8): Add test concatenate1.
+
+2005-05-15 Sunday 10:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/concatenate1.cc (grids.1): Initial revision.
+
+2005-05-15 Sunday 10:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/removespacedims1.cc (grids.2): Take out trace dumping.
+
+2005-05-15 Sunday 10:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addspacedims1.cc (grids.3): Shorten comments.
+
+2005-05-15 Sunday 10:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.16): In the congruence reduction,
+	  after erasing rows set the row capacity of the system from the
+	  first row.
+
+2005-05-15 Sunday 10:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.15): Add loading of the minimize flag
+	  to ascii_load.
+
+2005-05-15 Sunday 10:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.5): Enable and implement
+	  concatenate_assign.
+
+2005-05-15 Sunday 10:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.cc (grids.4): In method ascii_load, turn off
+	  the type check (for now), and correctly handle reading in the
+	  virtual flag.
+
+2005-05-15 Sunday 10:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.8): In operator== decrement the
+	  row count before the comparing the elements.
+
+2005-05-15 Sunday 10:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/ppl_test.hh (grids.5): In find_variation, dump the ASCII of
+	  `a' before loading it into `b', and print an error and exit if
+	  the load fails.
+
+2005-05-12 Thursday 18:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.7): Add test removespacedims1.
+
+2005-05-12 Thursday 18:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/removespacedims1.cc (grids.1): Initial revision.
+
+2005-05-12 Thursday 18:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.12): Clean comments and take out
+	  tracing in normalize_divisors.
+
+2005-05-12 Thursday 18:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.4): Enable and implement
+	  add_space_dimensions.
+
+2005-05-12 Thursday 18:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.11): Integrate a too-deeply nested
+	  doxygen sublist into the parent item.  Correct parameter names in
+	  some method descriptions.
+
+2005-05-12 Thursday 16:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.8): Take doxygen \p's out of maths
+	  environments.
+
+2005-05-12 Thursday 14:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.7): Escape %'s in maths
+	  environments.
+
+2005-05-12 Thursday 14:13  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.14): In OK declare limit the scope of
+	  variable num_columns, instead of jumping into that scope.  Add
+	  the state of minimization to the ascii_dump output.
+
+2005-05-12 Thursday 13:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Makefile.am (grids.3): Add Congruence, Congruence_System and
+	  Grid files to DOC_FILES.
+
+2005-05-12 Thursday 13:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/: devref-browse.doxyconf-latex.in,
+	  devref-print.doxyconf-latex.in (grids.[1,1]): Add files for
+	  Congruence, Congruence_System and Grid to INPUT.
+
+2005-05-12 Thursday 09:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (grids.2): Several small improvements to the
+	  new documentation on grids.
+
+2005-05-11 Wednesday 20:18  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.6): Add test removespacedims2.
+
+2005-05-11 Wednesday 20:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/removespacedims2.cc (grids.1): Initial revision.
+
+2005-05-11 Wednesday 20:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.11): Enable
+	  remove_pending_to_obtain_generators.
+
+2005-05-11 Wednesday 20:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.3): Update
+	  add_space_dimensions_and_project to clear the generator system if
+	  the grid is empty.  Enable and implement method
+	  remove_higher_space_dimensions.
+
+2005-05-11 Wednesday 17:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.5): Add tests isuniverse1 and
+	  addspacedims2.
+
+2005-05-11 Wednesday 17:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addspacedims1.cc (grids.2): Improve the file
+	  description.	Take out excess variable declarations.	Add a check
+	  that the grid is the universe to test3.
+
+2005-05-11 Wednesday 17:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: addspacedims2.cc, isuniverse1.cc (grids.[1,1]):
+	  Initial revision.
+
+2005-05-11 Wednesday 17:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.13): Enable and finish off is_universe.
+
+2005-05-11 Wednesday 17:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_chdims.cc (grids.[10,2]): Add method
+	  add_space_dimensions(cgs, gs dims).  Declare the original
+	  add_space_dimensions inline.	Update the space dimension
+	  adjusting functions to set the created generators to lines via
+	  flags (instead of explicit calls to the respective methods).
+	  Implement add_space_dimensions_and_project.  Improve some
+	  comments.
+
+2005-05-11 Wednesday 12:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox, ppl.sty (grids.[1,1]): Introductory
+	  documentation for grids and draft specifications of most of the
+	  main operations to be implemented.
+
+2005-05-09 Monday 12:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.4): Add tests addspacedims1,
+	  intersection1, intersection2, join1 and join2.
+
+2005-05-09 Monday 12:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/addspacedims1.cc (grids.1): Initial revision.
+
+2005-05-09 Monday 12:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: grid3.cc, intersection1.cc, intersection2.cc,
+	  join1.cc, join2.cc (grids.[3,1,1,1,1]): Move operation tests to
+	  per-operation files.	Add various tests of the
+	  intersection_assign methods.
+
+2005-05-09 Monday 12:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (grids.6): Add test13 (an empty grid
+	  constructed with congruences).
+
+2005-05-09 Monday 12:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.10): Add test19 (a generator system
+	  with only a line).
+
+2005-05-09 Monday 12:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: congruence1.cc, congruencesystem1.cc (grids.[3,4]):
+	  Use C++ style single line comments.  Take out some duplicate
+	  Variables.
+
+2005-05-09 Monday 12:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/print.hh (grids.2): Declare nout and vnout static.
+
+2005-05-09 Monday 12:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Makefile.am (grids.2): Add Grid_chdims.cc to
+	  libppl_la_SOURCES.
+
+2005-05-09 Monday 12:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (grids.1): Initial revision, with methods
+	  add_space_dimensions and add_space_dimensions_and_embed enabled.
+
+2005-05-09 Monday 12:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_public.cc, Grid_simplify.cc
+	  (grids.[9,12,15]): Add method add_space_dimensions.  Change the
+	  type of the reduce_equality_with_equality arguments to
+	  Congruence.  Rename reduce_line_with_parameter to
+	  reduce_parameter_with_line.  Rename
+	  reduce_equality_with_congruence to
+	  reduce_congruence_with_equality.  Enable the definition of method
+	  contains.  Update comments.  Take out some tracing.  Correct the
+	  asserts in two of the reduce functions.
+
+2005-05-09 Monday 12:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.10): Take out some tracing.  Update
+	  comments left from Polyhedron.
+
+2005-05-09 Monday 12:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[7,5]): Take out a line of tracing and the declaration of
+	  method insert(const Constraint&).  Update a comment.
+
+2005-05-06 Friday 11:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.9): Correct method name typo.
+
+2005-05-06 Friday 11:39  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid3.cc (grids.2): Use A instead of C in test1.  Add
+	  test2, test3 and test4, which test
+	  intersection_assign_and_minimize, join_assign and
+	  join_assign_and_minimize.
+
+2005-05-06 Friday 11:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_conversion.cc, Grid_simplify.cc (grids.[8,14]): Use
+	  new method Congruence_System::is_congruence.	Update parameter
+	  reduction to make all following rows virtual if the first row
+	  turns out to be virtual or a line.  Update congruence reduction
+	  to make the first row the integrality congruence if the resulting
+	  grid is empty.
+
+2005-05-06 Friday 11:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.11): Enable and implement
+	  intersection_assign_and_minimize, join_assign and
+	  join_assign_and_minimize.
+
+2005-05-06 Friday 11:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.9): Normalise moduli before
+	  simplifying in construct.  Correct some comments.
+
+2005-05-06 Friday 11:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_minimize.cc (grids.9): Reorder method definitions.  Add
+	  some temporary comments.
+
+2005-05-06 Friday 11:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.defs.hh, Congruence.inlines.hh,
+	  Congruence_System.cc (grids.[6,5,6]): Add method is_congruence.
+	  Adjust normalize_moduli to loop through all the rows when
+	  calculating the LCM.
+
+2005-05-05 Thursday 10:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.3): Add grid3_SOURCES and add grid3
+	  to TESTS.
+
+2005-05-05 Thursday 10:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid3.cc (grids.1): Initial revision.
+
+2005-05-05 Thursday 10:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.13): Rename function
+	  trailing_rows_are_zero to rows_are_zero, and modify it to also
+	  take the last row (instead of just checking to the end).  Update
+	  the call of this function in the congruence simplify to correctly
+	  check the rows at the beginning of the matrix.
+
+	  In the congruence simplify decrement orig_row_num in macro
+	  free_row, to match it to the new number of rows.
+
+2005-05-05 Thursday 10:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.10): Simplify instead of processing
+	  pending, in is_universe.  Enable processing of pending generators
+	  in add_congruence.  Enable and implement intersection_assign.
+
+2005-05-05 Thursday 10:36  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.8): Minimize instead of simplifying
+	  in the process_pending methods.  Update a comment.
+
+2005-05-05 Thursday 10:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_minimize.cc (grids.8): Take out tracing, add a comment.
+
+2005-05-05 Thursday 10:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[5,4]): Add void method add_rows(const
+	  Congruence_System&).
+
+2005-05-05 Thursday 10:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: grid1.cc, grid2.cc (grids.[9,5]): Convert comments
+	  to C++ style.
+
+2005-05-04 Wednesday 15:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_conversion.cc,
+	  Grid_nonpublic.cc, Grid_public.cc, Grid_simplify.cc
+	  (grids.[8,6,7,7,9,12]): Rename constructor parameters from cgs to
+	  const_gs, and from cs to cgs.  Add static methods
+	  lower_triangular and upper_triangular, and use them in OK.  Use
+	  these and new function identity as pre-conversion assertions.
+	  Take out the congruence-related and Grid versions of
+	  throw_topology_incompatible, and the old Polyhedron constructor
+	  definitions.	Clean up the topology checking in general.  Comment
+	  out the parameter name in add_low_level_congruences to work
+	  around a compiler warning.  Clean some argument spacing and
+	  update some comments.  Update construct to convert a given NNC
+	  generator system to NC.
+
+2005-05-03 Tuesday 15:20  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.11): Only throw the "type match" run
+	  time errors when assertions are enabled.
+
+2005-05-03 Tuesday 15:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: grid1.cc, grid2.cc (grids.[8,4]): Neaten tracing
+	  headers.  Use the single argument Grid constructor, instead of
+	  explicitly passing kind as EMPTY.  Create known grids using the
+	  copy constructor.  Add the known grid check to test15.  Add
+	  test16, test17 and test18, which test universe grids of one, many
+	  and zero dimensions.
+
+2005-05-03 Tuesday 15:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.10): Turn off tracing.
+
+2005-05-03 Tuesday 15:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.8): Ensure that dimensions given to the
+	  constructor are small enough.  Implement method is_universe.
+	  Enable, clean up and improve the OK method.  Add operator= (moved
+	  from Grid_nonpublic.cc).
+
+2005-05-03 Tuesday 14:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (grids.6): Take out operator= (moved to
+	  Grid_public.cc).  Enable and update process_pending_congruences
+	  and process_pending_generators.  Enable the pending processing in
+	  minimize().  Drop the topol argument from calls to
+	  throw_space_dimension_overflow.
+
+2005-05-03 Tuesday 14:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_minimize.cc (grids.7): Simplify before initialising the
+	  destination in the minimize functions.  Improve the loops that
+	  create identity matrices.
+
+2005-05-03 Tuesday 14:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.6): Update some comments.  Add and
+	  use macro ctrace_dump.  Only throw the "type match" run time
+	  errors when assertions are enabled.  Move source_diag init out of
+	  the row-processing loop in the parameter to congruence
+	  conversion.
+
+2005-05-03 Tuesday 14:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[7,5]): Improve some
+	  comments.  Revert the miscellaneous methods to private.  Drop
+	  throw_space_dimension_overflow's topol argument.  Take out the
+	  bounding box method definitions.  Enable method process_pending.
+
+2005-05-03 Tuesday 14:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruencesystem1.cc (grids.3): Neaten test7.
+
+2005-04-28 Thursday 18:50  Abramo Bagnara
+
+	* src/: Float.defs.hh (1.7), checked_float.inlines.hh (1.36): Avoid
+	  some compiler warnings.
+
+2005-04-27 Wednesday 21:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_conversion.cc,
+	  Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
+	  Grid_simplify.cc (grids.[6,4,5,6,5,7,9]): Take out all saturation
+	  matrix code, polyhedron method descriptions, some tracing, the
+	  polyhedron related parts of exception messages, and the methods
+	  obtain_sorted_congruences, obtain_sorted_generators,
+	  obtain_sorted_congruences_with_sat_c and
+	  obtain_sorted_generators_with_sat_g.
+
+	  Only pass the source and destination systems to the conversion
+	  and simplify methods.  Revert some of the temporarily public
+	  methods to private.  Clean up the minimize methods and enclose
+	  them in a namespace block.
+
+	  Conversion
+
+	    Enclose the method definitions in a namespace block.  Improve
+	    comments and initial asserts.  Skip multiplying the destination
+	  grid
+	    by the multiplier when the multiplier is one.  Use temporary
+	    variables better in the parameter to congruence version.
+
+	  Reduction
+
+	    Neaten the reduce_line_with_line description, and some variable
+	    names in the reduce methods.  Only define
+	  trailing_rows_are_zero
+	    when assertions are enabled.
+
+2005-04-27 Wednesday 21:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.inlines.hh (grids.3): Take old comment out
+	  of resize_no_copy.
+
+2005-04-26 Tuesday 20:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.8): Use the new is_virtual and
+	  set_is_virtual methods instead of the old virtual row functions.
+	  Clean up many of the temporary comments and some of the others.
+	  Improve variable names.  Take out some of the trace printing.
+	  Improve the loop used to iterate through the preceding rows in
+	  the congruence reduction.  Move the congruence reduction OK
+	  assertion so that is is called in every return case.	Save doing
+	  one of the comparisons in the empty grid check at the end of the
+	  congruence reduction.
+
+2005-04-26 Tuesday 20:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_minimize.cc (grids.5): Add an assertion that there are
+	  rows to the 4 parameter congruence to generator minimize method.
+	  Take the Polhedron assertion comment out of both of the 4
+	  parameter minimize methods.
+
+2005-04-26 Tuesday 20:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Generator_System.cc, Grid_conversion.cc, Grid_nonpublic.cc
+	  (grids.[3,4,4]): Use new is_virtual and set_is_virtual methods
+	  instead of the old virtual row functions.
+
+2005-04-26 Tuesday 20:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[5,3]): Take out the
+	  virtual row functions (replace with methods in the Generator and
+	  Congruence classes).
+
+2005-04-26 Tuesday 20:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Generator.defs.hh, Generator.inlines.hh (grids.[2,1]): Add
+	  is_virtual.
+
+2005-04-26 Tuesday 20:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.defs.hh (grids.3): Correct comment.
+
+2005-04-26 Tuesday 20:26  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.defs.hh, Congruence.inlines.hh (grids.[5,4]):
+	  Add methods is_virtual and set_is_virtual.  Assert that there are
+	  elements in methods modulus and set_is_equality.
+
+2005-04-26 Tuesday 11:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.7): Add test15, which tests
+	  reduce_line_with_line.  Neaten the generator system definition in
+	  test9.
+
+2005-04-25 Monday 19:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid_simplify.cc (grids.[4,7]): Use
+	  strace_dump in the congruence system reduction.
+
+	  The previous log message should have been:
+
+	  Improve comments.  Split le_le_reduce into
+	  reduce_equality_with_equality and reduce_line_with_line.  Improve
+	  the names, arguments and variables of all the reduce functions.
+	  Also consider the divisor in reduce_line_with_line.  Use
+	  Coefficient_traits::const_reference in the reduce functions.
+	  Correct the assertions.  Add and use macro strace_dump and
+	  temporary tracing stream strace.
+
+2005-04-25 Monday 18:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.6): In
+	  add_recycled_congruences_and_minimize use the add_and_minimize
+	  return directly, instead of using a variable.
+
+2005-04-25 Monday 18:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.6): In
+	  add_recycled_congruences_and_minimize use the add_and_minimize
+	  return directly, instead of using a variable.
+
+2005-04-25 Monday 18:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_conversion.cc (grids.3): Rename the trace stream ctrace.
+
+2005-04-25 Monday 18:42  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/GMP_Integer.defs.hh (grids.2): Improve comment.
+
+2005-04-25 Monday 13:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (grids.3): Add general tests test11 and
+	  test12, which have more and fewer rows than columns,
+	  respectively.
+
+2005-04-22 Friday 11:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (grids.2): Add general test cong_test4.
+
+2005-04-21 Thursday 12:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.2): Add grid2_SOURCES, and add
+	  grid2 to TESTS.
+
+2005-04-21 Thursday 12:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid2.cc (grids.1): Initial revision.
+
+2005-04-21 Thursday 12:28  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.6): Always compare the grid and known
+	  grid in the same order.  Match the test names in the comments to
+	  the new Chiara names.
+
+2005-04-21 Thursday 12:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.5): Update
+	  add_recycled_congruences_and_minimize to clear the empty flag and
+	  set the congruences up-to-date.  Take out the polyhedra comments
+	  in operator==, and neaten operator<<.
+
+2005-04-21 Thursday 12:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_minimize.cc, Grid_nonpublic.cc, Grid_simplify.cc
+	  (grids.[4,3,5]): Return a bool from the update_congruences and
+	  simplify methods to indicate whether the grid is empty.  Pass
+	  this return on in the minimize and add_and_minimize methods which
+	  call simplify.  Assert an equal number of columns in source1 and
+	  source2 in add_and_minimize\5 (congruence to generator).
+
+	  In update_congruences and update_generators set the grid empty
+	  according to the minimize return.
+
+	  In both simplifys use the row number instead of the row to test
+	  if the original row and pivot must be swapped.  In the congruence
+	  simplify when adding the top row, search for a valid modulus and
+	  set the diagonal (and modulus) to the result of the search.
+
+2005-04-21 Thursday 11:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (grids.3): Return a bool from update_congruences
+	  and simplify to indicate whether the grid is empty.  Pass this
+	  return on in the minimize and add_and_minimize methods which call
+	  simplify.  Assert an equal number of columns in the sources in
+	  the congruence to generator add_and_minimize\5.
+
+2005-04-21 Thursday 11:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.cc (grids.2): In operator<< increment the
+	  iterator after the virtual row check, and loop with a single
+	  comparison.
+
+2005-04-21 Thursday 11:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.4): Take out normalize_moduli
+	  tracing.  Add satisfies_all_cgs tracing.  Update normalize_moduli
+	  to consider only positive moduli.  Make adjust_space_dimension
+	  move the moduli to the new last column.  Neaten the operator<<
+	  loop.
+
+2005-04-19 Tuesday 19:08  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.5): Add test14 which uses larger
+	  numbers than the existing tests.
+
+2005-04-19 Tuesday 14:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.4): Add test11-13 which test with an
+	  empty grid in one, an empty grid in many dimensions and a grid in
+	  which the values are larger than in the existing tests.
+
+2005-04-19 Tuesday 14:17  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Linear_Row.cc (grids.1): Note the virtual row in
+	  Flags::ascii_dump.
+
+2005-04-19 Tuesday 14:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.4): Include the divisor in the
+	  parameter version of le_pc_reduce.  In the congruence version
+	  consider every row (instead of leaving out the last row) and skip
+	  modifying virtual rows.
+
+2005-04-19 Tuesday 14:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid_minimize.cc, Grid_public.cc (grids.[3,4]): Take out
+	  the pending row tracing.
+
+2005-04-17 Sunday 19:38  Abramo Bagnara
+
+	* src/: fpu-c99.inlines.hh (1.5), fpu-ia32.inlines.hh (1.6),
+	  fpu.defs.hh (1.4): Code cleaning. Added
+	  fpu_set_rounding_direction.
+
+2005-04-15 Friday 18:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.3): Take out tracing.  Enable
+	  comparison to known grid in test1.
+
+2005-04-15 Friday 18:51  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/ppl_test.hh (grids.4): ASCII dump `a'.
+
+2005-04-15 Friday 18:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (grids.3): When the first row must be added,
+	  add an empty congruence or point instead of a virtual row.
+
+2005-04-15 Friday 17:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (grids.1): Initial revision.
+
+2005-04-15 Friday 15:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.inlines.hh (grids.3): Take out tracing.
+
+2005-04-15 Friday 15:23  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.4): Take out inclusion of test
+	  file.
+
+2005-04-15 Friday 12:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/grid1.cc (grids.2): Add test7 to test10, and update
+	  all tests to test reduction and conversion.
+
+2005-04-15 Friday 12:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruencesystem1.cc (grids.2): Add test7, which
+	  includes an all-zero congruence and an equality.
+
+2005-04-15 Friday 12:07  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Linear_Row.defs.hh, Linear_Row.inlines.hh (grids.[1,1]):
+	  Add a virtual flag and methods is_virtual and set_is_virtual.
+
+2005-04-15 Friday 12:06  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_conversion.cc,
+	  Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
+	  Grid_simplify.cc (grids.[2,2,2,2,2,3,2]): Add much tracing.
+	  Neaten whitespace.  Improve comments.  Change the parameter
+	  system type to Generator_System in methods minimize and simplify.
+	   Rename convert to conversion (to match Polyhedron).	Temporarily
+	  make some private methods public (for testing).  Change
+	  parameterize to return the generator system and add the ability
+	  to pass a reference point to parameterize.  Add static methods
+	  virtual_row and mark_virtual.
+
+	  Adjust is_included_in to the parameter system.
+
+	  Move the definition of construct to Grid_nonpublic.cc.  Enable
+	  operator!=.
+
+	  Add conversion from parameter system to congruence system, and
+	  get both conversion methods working.	Add a trace stream.
+
+	  Update the minimize and add_and_minimize methods.  In all of
+	  these include negative values in the check for an empty grid
+	  after conversion, and always set the destination generators and
+	  generator system necessarily closed.
+
+	  Direct out some of the saturation matrix code.  Correct the empty
+	  flag handling after adding congruences to the grid.  In
+	  Grid(num_dimensions,kind) change the initial generator system
+	  topology to necessarily closed and set the congruences to
+	  minimized directly via status when the grid is empty.
+
+	  Update reduction (the simplify methods).
+
+2005-04-15 Friday 11:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.cc (grids.1): Add virtual_rows to loading
+	  and dumping.
+
+2005-04-15 Friday 10:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh,
+	  Congruence_System.inlines.hh (grids.[3,2,2]): Add method
+	  resize_no_copy and a version of satisfies_all_congruences that
+	  accepts a parameter.	In operator== substitute a local
+	  implementation for the Matrix::operator== call.  Leave out
+	  equalities in normalize_moduli.  In both
+	  satisfies_all_congruences compare the scalar product with zero
+	  for equalities.
+
+2005-04-15 Friday 10:41  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh
+	  (grids.[3,3,2]): Add versions of reduced_scalar_product_assign
+	  and scalar_product_assign which accept parameters.  Add method
+	  set_is_equality.  In normalize set the inhomogeneous term to the
+	  modulus when the coefficients are all zero.  Correct the loading
+	  of the "m" in ascii_load.
+
+2005-04-15 Friday 10:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/ppl_test.hh (grids.3): In find_variation_template neaten
+	  the failure output, take out the tracing output, and note that
+	  `a' must be up to date.
+
+2005-04-11 Monday 00:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Time.inlines.hh (1.3): Fixed a bug in
+	  Time::operator+=(const Time&).
+
+2005-04-10 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.47), tests/BD_Shape/affineimage8.cc
+	  (1.2), tests/BD_Shape/affineimage9.cc (1.2),
+	  tests/BD_Shape/affinepreimage5.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage14.cc (1.3): Improved
+	  methods BD_Shape::affine_image(Variable, const
+	  Linear_Expression&, Coefficient_traits::const_reference),
+	  BD_Shape::affine_preimage(Variable, const Linear_Expression&,
+	  Coefficient_traits::const_reference), and
+	  BD_Shape::generalized_affine_image(Variable, Relation_Symbol,
+	  const Linear_Expression&, Coefficient_traits::const_reference).
+
+2005-04-06 Wednesday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.20): Added negate_round_up().
+
+2005-04-03 Sunday 17:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.51): Wrong indentation corrected.
+
+2005-04-03 Sunday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.36): Sentence fixed.
+
+2005-04-02 Saturday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.18), BD_Shape.inlines.hh (1.46): Added
+	  method Constraint_System BD_Shape<T>::minimized_constraints()
+	  const.
+
+2005-03-31 Thursday 12:14  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/Makefile.am (1.34): Keep TXT_LICENSES in LICENSES.  Use
+	  specific licence variables in ALL_TARGETS, instead of LICENSES.
+
+2005-03-31 Thursday 12:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* demos/ppl_lcdd/examples/README (1.3): Make "example" plural.
+
+2005-03-31 Thursday 12:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/: libppl.dirs (1.2), libppl.install (1.3), rules (1.4):
+	  Add ppl_lcdd to the libppl package.  Extract the PPL version
+	  string from configure.ac instead of from one of the documentation
+	  files.  Make the PWL.  Install the PWL and Debian changelog to
+	  libppl-pwl.  Copy the Debian changelog to libppl correctly.
+
+2005-03-31 Thursday 12:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/: libppl-pwl.dirs (1.1), libppl-pwl.docs (1.1),
+	  libppl-pwl.install (1.1): Initial revision.
+
+2005-03-31 Thursday 12:02  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/control (1.7): For the PWL package, correct long and short
+	  descriptions and take out the libppl dependency.
+
+2005-03-31 Thursday 11:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* configure.ac (1.160): Add Debian copyright files to
+	  AC_CONFIG_FILES.  Clean some whitespace.
+
+2005-03-31 Thursday 11:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl-pwl.links (1.2): Use libppl-pwl.docs instead of a
+	  symlink.
+
+2005-03-31 Thursday 11:56  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl.copyright (1.2): Move to libppl.copyright.in.
+
+2005-03-31 Thursday 11:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl.copyright.in (1.1): Initial revision (moved here
+	  from libppl.copyright).
+
+2005-03-31 Thursday 11:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl-pwl.copyright.in (1.1): Initial revision.
+
+2005-03-29 Tuesday 23:22  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.25), Checked_Number.inlines.hh
+	  (1.31), Float.defs.hh (1.6), Float.inlines.hh (1.8), Makefile.am
+	  (1.109), checked.cc (1.1), checked.defs.hh (1.18),
+	  checked.inlines.hh (1.16), checked_ext.defs.hh (1.7),
+	  checked_ext.inlines.hh (1.17), checked_float.inlines.hh (1.35),
+	  checked_int.inlines.hh (1.31), checked_mpq.inlines.hh (1.18),
+	  checked_mpz.inlines.hh (1.21): New implementation of standardized
+	  input of checked numbers. Added mpq to float conversion.
+
+2005-03-29 Tuesday 16:40  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/README.doc (1.4): Revert accidental previous commit.
+
+2005-03-29 Tuesday 16:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/: README.doc (1.3), Makefile.am (1.33): Preserve text
+	  licences across the clean rules by making CLEANFILES and
+	  ALL_TARGETS only refer to files that can be built.  Take
+	  duplicate text files out of EXTRA_DIST.  Take out the dist-hook
+	  rule.
+
+2005-03-29 Tuesday 16:29  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/rules (1.3): For the config.status rule add a Watchdog
+	  configure command and take out the dependency on configure.
+
+2005-03-29 Tuesday 12:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/rules (1.2): Add configure flags assignment suggested in
+	  Debian autotools-dev README.	Change DOC_DIR to libppl-dev (user
+	  manual moved to package libppl-dev).	Update comment.
+
+2005-03-29 Tuesday 11:50  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl.doc-base (1.2): Moved to libppl-dev.doc-base.user
+	  (user manual moved to package libppl-dev).
+
+2005-03-29 Tuesday 11:47  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl-dev.doc-base.user (1.1): Initial revision.
+
+2005-03-29 Tuesday 11:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl-dev.doc-base (1.2): Make the fields in the first
+	  section contiguous.  Update HTML directory name.
+
+2005-03-29 Tuesday 11:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/control (1.6): Add automake1.4 build conflict.  Update
+	  interface short descriptions.  As per Developers Reference: take
+	  leading "The"'s out of short descriptions, add homepage field to
+	  long descriptions, take mention of Free Software out of the long
+	  descriptions.
+
+2005-03-26 Saturday 10:45  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.24), checked.defs.hh (1.17),
+	  checked_ext.inlines.hh (1.16), checked_float.inlines.hh (1.34),
+	  checked_int.inlines.hh (1.30): Cosmetic fix to conform to usual
+	  C++ guidelines.
+
+2005-03-26 Saturday 10:24  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.23), Checked_Number.inlines.hh
+	  (1.30), checked.defs.hh (1.16), checked_ext.inlines.hh (1.15),
+	  checked_float.inlines.hh (1.33), checked_int.inlines.hh (1.29),
+	  checked_mpq.inlines.hh (1.17), checked_mpz.inlines.hh (1.20):
+	  Fixed assignments from infinities.
+
+2005-03-25 Friday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.17), BD_Shape.inlines.hh (1.45): Pass
+	  arguments of type Coefficient using
+	  Coefficient_traits::const_reference instead of plain const
+	  reference.
+
+2005-03-25 Friday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.16), BD_Shape.inlines.hh (1.44): Some
+	  unwanted const qualifiers have been removed.	Some desirable
+	  const qualifiers have been added.
+
+2005-03-25 Friday 12:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.43): Use the proper constructor when
+	  building a BDS from a polyhedron.
+
+2005-03-25 Friday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/exceptions3.cc (1.6): Reflect the recent changes
+	  in the behavior of BDS methods for affine images and preimages.
+
+2005-03-25 Friday 10:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.15): The documentation of
+	  generalized_affine_image(const Linear_Expression&, const
+	  Relation_Symbol, const Linear_Expression&) is now consistent with
+	  the implementation.
+
+2005-03-25 Friday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.42): Comments of
+	  generalized_affine_image(Variable, Relation_Symbol,
+	  Linear_Expression&, const Coefficient&) somewhat cleaned up.
+
+2005-03-25 Friday 10:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.14): The documentation of
+	  generalized_affine_image(Variable, Relation_Symbol,
+	  Linear_Expression&, const Coefficient&); is now consistent with
+	  the documentation.
+
+2005-03-25 Friday 09:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.41): Comments of
+	  affine_preimage(Variable, Linear_Expression&, const Coefficient&)
+	  somewhat cleaned up.
+
+2005-03-25 Friday 09:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.13): The documentation of
+	  affine_preimage(Variable, Linear_Expression&, const Coefficient&)
+	  is now consistent with the documentation.
+
+2005-03-25 Friday 09:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.40): Comments of
+	  affine_image(Variable, Linear_Expression&, const Coefficient&)
+	  somewhat cleaned up.
+
+2005-03-25 Friday 09:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.12): File comment fixed.  The
+	  documentation of affine_image(Variable, Linear_Expression&, const
+	  Coefficient&) is now consistent with the documentation.
+
+2005-03-24 Thursday 11:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.127): Comments
+	  concerning the widening and extrapolation predicates changed so
+	  as to state explicitly that the polyhedron referenced by the 1st
+	  handle must contain the polyhedron referenced by the second
+	  handle.
+
+2005-03-24 Thursday 09:48  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.22), Checked_Number.inlines.hh
+	  (1.29), Rounding.defs.hh (1.10): Permit rounding default
+	  direction different from CURRENT. Added Checked_Number methods to
+	  save/restore rounding mode.
+
+2005-03-23 Wednesday 19:21  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.21), Checked_Number.inlines.hh
+	  (1.28), checked_float.inlines.hh (1.32), checked_int.inlines.hh
+	  (1.28), checked_mpq.inlines.hh (1.16), checked_mpz.inlines.hh
+	  (1.19), checked_numeric_limits.hh (1.3): Added explicit 'signed'
+	  to integral types. Fixed set_special for mpz and mpq. Use always
+	  extended assignment for Checked_Number.
+
+2005-03-22 Tuesday 20:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.14): Programs
+	  boundedh79extrapolation1 and nnc_boundedh79extrapolation1 removed
+	  from XFAIL_WITH_INT8 and added to XFAIL_WITH_INT8_A.
+
+2005-03-22 Tuesday 14:36  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.20), Checked_Number.inlines.hh
+	  (1.27), Result.defs.hh (1.9), checked.defs.hh (1.15),
+	  checked_ext.inlines.hh (1.14), checked_float.inlines.hh (1.31),
+	  checked_int.inlines.hh (1.27), checked_mpq.inlines.hh (1.15),
+	  checked_mpz.inlines.hh (1.18): Removed unused pred/succ. Don't
+	  return special result for representable values.
+
+2005-03-22 Tuesday 13:01  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* STANDARDS (grids.2): Take out the paragraph about the check_dump
+	  function.
+
+2005-03-22 Tuesday 13:00  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/writecongruencesystem.cc (grids.2): Take out the dump
+	  comparisons.	Add find_variation checks.  Use endl instead of
+	  '\n'.
+
+2005-03-22 Tuesday 12:58  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/congruence1.cc (grids.2): Take out all dump
+	  comparisons.	Use find_variation instead of check_ok.  Print
+	  fewer NOISY tracing messages.  Add dumps to the NOISY test
+	  failure messages.
+
+2005-03-22 Tuesday 12:55  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/ppl_test.hh (grids.2): Take out check_dump.  Create the
+	  comparison object in find_variation_template with a copy
+	  constructor.
+
+2005-03-22 Tuesday 12:54  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (grids.2): Define the copy constructor.
+
+2005-03-22 Tuesday 12:53  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (grids.2): Use Congruence::ascii_load.
+
+2005-03-22 Tuesday 12:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh (grids.[2,2]): Add method
+	  ascii_load.
+
+2005-03-21 Monday 20:12  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Matrix.cc, Matrix.defs.hh (grids.[1,1]): Declare Grid and
+	  an operator== as friends.  Add method add_row.
+
+2005-03-21 Monday 20:03  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* doc/devref.doxyconf-html.in (grids.1): Add Grid, Congruence and
+	  Congruence_System files to INPUT.
+
+2005-03-21 Monday 19:59  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Row.defs.hh (1.93): Take out dot following \brief.
+
+2005-03-21 Monday 19:52  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Makefile.am (grids.1): Add Grid, Congruence and
+	  Congruence_System files to INCLUDE_FILES and libppl_la_SOURCES.
+
+2005-03-21 Monday 19:49  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Linear_Expression.defs.hh, Linear_Expression.inlines.hh
+	  (grids.[1,1]): Declare Congruence, two operator%='s and
+	  swap(Linear_Expression&, Linear_Expression&) as friends.  Add
+	  copy constructor which takes size and capacity.
+
+2005-03-21 Monday 19:35  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator_System.defs.hh (grids.1): Declare Grid friendship.
+
+2005-03-21 Monday 19:34  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Generator.defs.hh (grids.1): Declare Grid and
+	  Congruence_System as friends.
+
+2005-03-21 Monday 19:33  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Constraint.defs.hh (grids.1): Declare Congruence a friend.
+
+2005-03-21 Monday 19:32  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+	  Congruence.types.hh, Congruence_System.cc,
+	  Congruence_System.defs.hh, Congruence_System.inlines.hh,
+	  Congruence_System.types.hh (grids.[1,1,1,1,1,1,1,1]): Initial
+	  revision.
+
+2005-03-21 Monday 19:30  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: GMP_Integer.defs.hh, GMP_Integer.inlines.hh (grids.[1,1]):
+	  Add gcdext_assign.
+
+2005-03-21 Monday 19:27  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/ppl_test.hh (grids.1): Include the std and PPL namespaces.
+	  Define macro stringify, function checkdump and template
+	  find_variation_template.
+
+2005-03-21 Monday 19:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/print.hh (grids.1): Set NOISY and VERY_NOISY from the
+	  associated directives.  Create the nout and vnout streams.
+
+2005-03-21 Monday 19:22  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Makefile.am (grids.1): Add Grid to SUBDIRS.
+
+2005-03-21 Monday 19:21  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.in, congruence1.cc, congruencesystem1.cc,
+	  congruencesystem2.cc, grid1.cc, writecongruencesystem.cc
+	  (grids.[1,1,1,1,1,1]): Initial revision.
+
+2005-03-21 Monday 19:15  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid.types.hh,
+	  Grid_Status.cc, Grid_Status.idefs.hh, Grid_Status.inlines.hh,
+	  Grid_conversion.cc, Grid_minimize.cc, Grid_nonpublic.cc,
+	  Grid_public.cc, Grid_simplify.cc (grids.[1,1,1,1,1,1,1,1,1,1,1]):
+	  Initial, partial, rough revision.
+
+2005-03-21 Monday 19:11  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* configure.ac (grids.1): Add tests/Grid/Makefile to
+	  AC_CONFIG_FILES.
+
+2005-03-21 Monday 19:09  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* STANDARDS (grids.1): Add "Standards for the Test Programs"
+	  section.
+
+2005-03-16 Wednesday 21:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.13): Added
+	  `boundedbhrz03extrapolation1' and
+	  `nnc_boundedbhrz03extrapolation1' to `XFAIL_WITH_INT8'.
+
+2005-03-16 Wednesday 07:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.44): The limited widening methods
+	  now immediately fall back to their non-limited counterparts when
+	  given an empty constraint system.
+
+2005-03-14 Monday 10:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.108): Added `ppl_include_files.hh' to
+	  `noinst_HEADERS' and `BUILT_SOURCES'.
+
+2005-03-13 Sunday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.11), BD_Shape.inlines.hh (1.39):
+	  BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape&) now has
+	  its stop-points stored in a local, static array..
+
+2005-03-13 Sunday 20:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.107): Added `fpu-c99.inlines.hh' to
+	  `INCLUDE_FILES'.
+
+2005-03-13 Sunday 20:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.29): Added `build_header' to `EXTRA_DIST'.
+
+2005-03-13 Sunday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: addspacedims1.cc (1.4), addspacedims2.cc (1.4),
+	  addspacedims4.cc (1.4), addspacedims5.cc (1.4), addspacedims6.cc
+	  (1.4): Unused variables removed or commented out.
+
+2005-03-13 Sunday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.hh (1.2): Include "version.hh".
+
+2005-03-13 Sunday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/addspacedims3.cc (1.4): Useless variable removed.
+
+2005-03-13 Sunday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.143), build_header (1.1), src/BDS_Status.idefs.hh (1.6),
+	  src/BD_Shape.defs.hh (1.10), src/DB_Row.defs.hh (1.6),
+	  src/E_Rational.inlines.hh (1.7), src/Float.inlines.hh (1.7),
+	  src/Makefile.am (1.106), src/Ph_Status.idefs.hh (1.9),
+	  src/Polyhedron.defs.hh (1.269), src/checked_int.inlines.hh
+	  (1.26), src/ppl_header.bottom (1.7), src/ppl_header.hh (1.1),
+	  src/ppl_header.middle (1.6), src/ppl_header.top (1.9),
+	  tests/ppl_test.hh (1.19): New, simpler and less problematic
+	  machinery to build ppl_install.hh.  (The `build_header' script
+	  has been written by Abramo Bagnara.)
+
+2005-03-11 Friday 21:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffineimage14.cc (1.2): Copyright years
+	  fixed.
+
+2005-03-11 Friday 20:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.11), constraints2.cc (1.4),
+	  exceptions3.cc (1.5), generalizedaffineimage2.cc (1.4),
+	  generalizedaffineimage3.cc (1.4), polydifference1.cc (1.4),
+	  relations2.cc (1.4), relations3.cc (1.4), relations5.cc (1.4),
+	  writebdiffs1.cc (1.4), writebdiffs2.cc (1.4), writebdshape1.cc
+	  (1.1), writebdshape2.cc (1.1): We no longer call them "bounded
+	  differences": we call them "bounded difference shapes" or "BDS"
+	  instead.
+
+2005-03-11 Friday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.38),
+	  tests/BD_Shape/generalizedaffineimage10.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage7.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage8.cc (1.4): Fixed a bug in
+	  BD_Shape<T>::generalized_affine_image(Variable, const
+	  Relation_Symbol, const Linear_Expression&, const Coefficient&).
+
+2005-03-09 Wednesday 17:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl.docs (1.2): TODO is currently for internal use.
+
+2005-03-09 Wednesday 12:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/copyright (1.2): Move to libppl.copyright.
+
+2005-03-09 Wednesday 12:24  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/: libppl-c.dirs (1.1), libppl-c.install (1.1),
+	  libppl-c.links (1.1), libppl-dev.doc-base (1.1), libppl-dev.docs
+	  (1.1), libppl-dev.links (1.1), libppl-gprolog.links (1.1),
+	  libppl-pwl.links (1.1), libppl-sicstus.links (1.1),
+	  libppl-swi.links (1.1), libppl-yap.links (1.1), libppl.copyright
+	  (1.1), libppl.doc-base (1.1), libppl.docs (1.1): Initial
+	  revisions.
+
+2005-03-09 Wednesday 11:46  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl.install (1.2): Only install the main library
+	  (others now installed in interface packages).
+
+2005-03-09 Wednesday 11:45  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/libppl-dev.dirs (1.2): Replace package specific doc dir
+	  with the general libppl doc dir.  Take out usr/lib/pkgconfig.
+
+2005-03-09 Wednesday 11:43  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/control (1.5): Rename to libppl.  Add a source section
+	  name.  Depend on graphviz and debhelper version of 4 or higher.
+	  Drop libppl-c-dev.  Complete the entries for the interface
+	  packages.
+
+2005-03-09 Wednesday 11:38  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* debian/: changelog (1.1), rules (1.1): Initial revision.
+
+2005-03-05 Saturday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.12),
+	  boundedbhrz03extrapolation1.cc (1.1): A new, very interesting,
+	  test program showing an analysis of linear invariants divided
+	  into phases: a first propagation phase (without widening),
+	  followed by a widening phase employing the "widening up to"
+	  technique and further preserving interval constraints.  Notice
+	  that neither the H79 nor the BHRZ03 limited extrapolations (used
+	  as widenings here) allow to obtain the desired postfixpoint for
+	  this example (since they lose the crucial constraint `k <= 1').
+	  Both the H79 and the BHRZ03 bounded extrapolation operators do
+	  achieve this result.
+
+2005-03-05 Saturday 13:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.43): Internal implementation class
+	  BW_Box was no longer used: removed.
+
+2005-03-05 Saturday 13:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.42),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.4):
+	  Polyhedron::bounded_BHRZ03_extrapolation_assign() and
+	  Polyhedron::bounded_H79_extrapolation_assign() now use
+	  Bounding_Box::CC76_widening_assign() to make sure the interval
+	  constraints that are preserved do not cause termination problems.
+	  Test program boundedh79extrapolation1.cc (it was testing nothing
+	  anyway).
+
+2005-03-05 Saturday 13:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.10), generalizedaffineimage14.cc
+	  (1.1): New test for BD_Shape::generalized_affine_image().
+
+2005-03-05 Saturday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bounding_Box.cc (1.6), Bounding_Box.defs.hh (1.6): New
+	  method Constraint_System Bounding_Box::constraints() const.
+
+2005-03-05 Saturday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bounding_Box.cc (1.5): Fixed
+	  Bounding_Box::CC76_widening_assign(const Bounding_Box& y,
+	  Iterator first, Iterator last).
+
+2005-03-05 Saturday 00:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bounding_Box.cc (1.4), Bounding_Box.defs.hh (1.5): Added
+	  Bounding_Box::CC76_widening_assign(const Bounding_Box& y) and
+	  template <typename Iterator>
+	  Bounding_Box::CC76_widening_assign(const Bounding_Box& y,
+	  Iterator first, Iterator last).
+
+2005-03-05 Saturday 00:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.22), Interval.inlines.hh (1.21): Added
+	  non-const versions of accessors.
+
+2005-03-04 Friday 21:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.9): Comments for
+	  CC76_extrapolation_assign(const BD_Shape& y) and
+	  CC76_extrapolation_assign(const BD_Shape& y, Iterator first,
+	  Iterator last) revised.
+
+2005-03-04 Friday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.268): Misleading variable name changed
+	  in the Polyhedron class documentation.
+
+2005-03-03 Thursday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/control (1.4): Now libppl-dev depends on libppl.
+
+2005-03-03 Thursday 15:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.37):
+	  BD_Shape::generalized_affine_image(const Linear_Expression&,
+	  const Relation_Symbol, const Linear_Expression&) improved.
+
+2005-03-03 Thursday 12:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/: libppl-dev.dirs (1.1), libppl-dev.install (1.1),
+	  libppl.dirs (1.1), libppl.install (1.1): Directories and
+	  installed files for packages libppl and libppl-dev.
+
+2005-03-03 Thursday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/control (1.3): Packages named `libppl*' instead of `ppl*'.
+	  Dependency from g++ fixed.
+
+2005-03-03 Thursday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.170): Some headings properly capitalized.
+
+2005-03-02 Wednesday 15:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.36): Simplified the logic of
+	  BD_Shape<T>::BD_Shape(const Polyhedron&, Complexity_Class).
+
+2005-03-02 Wednesday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.267): Befriend template <typename T>
+	  class BD_Shape.
+
+2005-03-02 Wednesday 13:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.113): Use of simplex temporarily
+	  disabled in Polyhedron::shrink_bounding_box() until we have an
+	  efficient way to compute the topological closure of a constraint
+	  system.
+
+2005-03-02 Wednesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.35): Added an initial, very rough
+	  implementation of BD_Shape<T>::BD_Shape(const Polyhedron&,
+	  Complexity_Class).
+
+2005-03-01 Tuesday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/affinetrans.cc (1.4): Misleading variable name
+	  changed.
+
+2005-03-01 Tuesday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage1.cc (1.4), affineimage2.cc (1.4),
+	  affineimage3.cc (1.4), affineimage4.cc (1.4), affineimage5.cc
+	  (1.4), affineimage6.cc (1.4), affineimage7.cc (1.4),
+	  affinepreimage1.cc (1.4), affinepreimage2.cc (1.4),
+	  affinepreimage3.cc (1.4), affinepreimage4.cc (1.4),
+	  exceptions3.cc (1.4): Avoid declaring variables when a temporary
+	  would do the same thing more clearly.
+
+2005-03-01 Tuesday 20:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.34), tests/BD_Shape/Makefile.am (1.9),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage13.cc (1.1),
+	  tests/BD_Shape/generalizedaffineimage4.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage5.cc (1.4):
+	  BD_Shape<T>::generalized_affine_image() can now handle any
+	  expression.
+
+2005-03-01 Tuesday 11:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.33), tests/BD_Shape/Makefile.am (1.8),
+	  tests/BD_Shape/affinepreimage5.cc (1.1):
+	  BD_Shape<T>::affine_preimage() can now handle any expression.
+
+2005-03-01 Tuesday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.32), tests/BD_Shape/Makefile.am (1.7),
+	  tests/BD_Shape/affineimage8.cc (1.1),
+	  tests/BD_Shape/affineimage9.cc (1.1): BD_Shape<T>::affine_image()
+	  can now handle any expression.
+
+2005-03-01 Tuesday 10:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.26): Wrong dependency fixed.
+
+2005-03-01 Tuesday 07:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/control (1.2): Dependencies changed so as to depend on g++
+	  == 3.4.  Added autoconf, automake1.9, libtool and doxygen to
+	  Build-Depends.  (Thanks to Michael Tautschnig.)
+
+2005-02-28 Monday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/: compat (1.1), control (1.1), copyright (1.1): Initial
+	  drafts put under CVS control.
+
+2005-02-28 Monday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.25): URL for the source fixed.
+
+2005-02-27 Sunday 22:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/watchdog1.cc (1.4): Empty throw specification
+	  added to ~Timeout().
+
+2005-02-27 Sunday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.112): Slight simplification in
+	  Polyhedron::shrink_bounding_box(Box&, Complexity_Class).
+
+2005-02-27 Sunday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.8): Added declaration for BD_Shape(const
+	  Polyhedron&, Complexity_Class).
+
+2005-02-27 Sunday 16:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.defs.hh (1.19), globals.inlines.hh (1.9): Class
+	  Throwable was missing a virtual destructor: added.
+
+2005-02-27 Sunday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.111):
+	  Polyhedron::shrink_bounding_box(Box&, Complexity_Class) improved.
+
+2005-02-27 Sunday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Handler.defs.hh (1.4), Handler.inlines.hh (1.3): Class
+	  Handler was missing a virtual destructor: added.
+
+2005-02-27 Sunday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.7): Imprecisions in the comments for
+	  BD_Shape(const Generator_System&) corrected.
+
+2005-02-27 Sunday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.31): On exit from
+	  BD_Shape<T>::BD_Shape(const Generator_System&), the DBM is always
+	  transitively closed.
+
+2005-02-27 Sunday 11:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.30): No longer print spurious newlines
+	  in operator<<(std::ostream&, const BD_Shape<T>&).
+
+2005-02-27 Sunday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.110): Useless temporary removed and
+	  scope of one variable reduced in
+	  Polyhedron::shrink_bounding_box().
+
+2005-02-27 Sunday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.142): Added one more thing to do.
+
+2005-02-27 Sunday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/constraints1.cc (1.4): Needlessly long comment
+	  shortened.
+
+2005-02-27 Sunday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/fromgensys1.cc (1.2): Be quiet.
+
+2005-02-27 Sunday 10:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.6), fromgensys1.cc (1.1): New
+	  test program for BD_Shape::BD_Shape(const Generator_System&).
+
+2005-02-27 Sunday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.29): BD_Shape::BD_Shape(const
+	  Generator_System&) implemented.
+
+2005-02-26 Saturday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.6): Added declaration for
+	  BD_Shape::BD_Shape(const Generator_System& gs).  Comments for
+	  BD_Shape::BD_Shape(const Constraint_System& cs) further improved.
+
+2005-02-26 Saturday 17:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.5): Comments for BD_Shape::BD_Shape(const
+	  Constraint_System& cs) improved.
+
+2005-02-24 Thursday 19:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/: Generator.defs.hh (1.103), Linear_System.cc (1.18): Correct
+	  comment typo.
+
+2005-02-24 Thursday 19:05  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Constraint_System.defs.hh (1.9): Correct comment typos and
+	  clip off trailing whitespace.
+
+2005-02-22 Tuesday 20:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BHRZ03_Certificate.inlines.hh (1.5): Removed a pair of
+	  redundant parentheses.
+
+2005-02-18 Friday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.6): Include <climits>.
+
+2005-02-18 Friday 21:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.2): Added more attributes to the
+	  specializations of std::numeric_limits for "checked" integer
+	  types.
+
+2005-02-18 Friday 18:55  Abramo Bagnara
+
+	* src/: Float.inlines.hh (1.5), checked_int.inlines.hh (1.25):
+	  Added U to make explicit unsignedness for constants.
+
+2005-02-18 Friday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.131): Useless type qualifiers removed.
+
+2005-02-18 Friday 15:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Saturation_Matrix.cc (1.3), Saturation_Row.cc (1.6),
+	  Saturation_Row.defs.hh (1.5), Saturation_Row.inlines.hh (1.5),
+	  conversion.cc (1.68): Several methods speeded up.  Now bit
+	  positions are represented by means of unsigned longs and the
+	  invalid position is represented by ULONG_MAX.
+
+2005-02-18 Friday 15:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.105): Added checked_numeric_limits.hh to
+	  INCLUDE_FILES.
+
+2005-02-18 Friday 13:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/empty5.cc (1.3): Allow for every definition of
+	  Coefficient.
+
+2005-02-18 Friday 13:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.1): Specializations of
+	  std::numeric_limits for "checked" types (still incomplete as far
+	  as `round_style' is concerned).
+
+2005-02-17 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.28): BD_Shape<T>::contains() improved.
+
+2005-02-17 Thursday 19:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.27): BD_Shape<T>::poly_hull_assign()
+	  improved.
+
+2005-02-17 Thursday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.26):
+	  BD_Shape<T>::poly_difference_assign() improved.
+
+2005-02-17 Thursday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.25):
+	  BD_Shape<T>::CC76_extrapolation_assign() improved.
+
+2005-02-17 Thursday 19:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.24):
+	  BD_Shape<T>::CH78_widening_assign() improved.
+
+2005-02-17 Thursday 18:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.23):
+	  BD_Shape<T>::limited_CH78_extrapolation_assign() improved.
+
+2005-02-17 Thursday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.22):
+	  BD_Shape<T>::intersection_assign() improved.
+
+2005-02-17 Thursday 18:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.21):
+	  BD_Shape<T>::CC76_narrowing_assign() improved.
+
+2005-02-17 Thursday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.20):
+	  BD_Shape<T>::add_space_dimensions_and_embed() improved.
+
+2005-02-17 Thursday 15:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.19):
+	  BD_Shape<T>::add_space_dimensions_and_project() improved.
+
+2005-02-17 Thursday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.18): BD_Shape<T>::relation_with(const
+	  Constraint&) improved.
+
+2005-02-17 Thursday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.17): BD_Shape<T>::relation_with()
+	  improved.
+
+2005-02-16 Wednesday 17:34  Abramo Bagnara
+
+	* src/: Float.defs.hh (1.5), Float.inlines.hh (1.4),
+	  checked_float.inlines.hh (1.30), checked_mpz.inlines.hh (1.17):
+	  Added support for assignment from mpz to floating type.
+
+2005-02-16 Wednesday 17:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.16): Improved
+	  BD_Shape<T>::add_constraint().
+
+2005-02-16 Wednesday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.15): Variables renamed in
+	  BD_Shape<T>::contains().
+
+2005-02-16 Wednesday 16:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.14): Variables renamed in
+	  BD_Shape<T>::concatenate_assign().
+
+2005-02-16 Wednesday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.13): Variable renamed in
+	  BD_Shape<T>::is_empty().
+
+2005-02-16 Wednesday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.12): Variable renamed in
+	  BD_Shape<T>::is_universe().
+
+2005-02-16 Wednesday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.11): Fixed
+	  BD_Shape<T>::limited_CC76_extrapolation_assign().
+
+2005-02-16 Wednesday 12:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.10): Removed redundant declaration
+	  from BD_Shape<T>::add_constraint().
+
+2005-02-16 Wednesday 12:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.9):
+	  BD_Shape<T>::limited_CC76_extrapolation_assign() cleaned up.
+
+2005-02-15 Tuesday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.80), src/Row.defs.hh (1.92), src/Row.inlines.hh
+	  (1.60), tests/ppl_test.hh (1.18), tests/BD_Shape/Makefile.am
+	  (1.5), tests/BD_Shape/addconstraints1.cc (1.3),
+	  tests/BD_Shape/addspacedims1.cc (1.3),
+	  tests/BD_Shape/addspacedims2.cc (1.3),
+	  tests/BD_Shape/addspacedims3.cc (1.3),
+	  tests/BD_Shape/addspacedims4.cc (1.3),
+	  tests/BD_Shape/addspacedims5.cc (1.3),
+	  tests/BD_Shape/addspacedims6.cc (1.3),
+	  tests/BD_Shape/addspacedims7.cc (1.3),
+	  tests/BD_Shape/affineimage1.cc (1.3),
+	  tests/BD_Shape/affineimage2.cc (1.3),
+	  tests/BD_Shape/affineimage3.cc (1.3),
+	  tests/BD_Shape/affineimage4.cc (1.3),
+	  tests/BD_Shape/affineimage5.cc (1.3),
+	  tests/BD_Shape/affineimage6.cc (1.3),
+	  tests/BD_Shape/affineimage7.cc (1.3),
+	  tests/BD_Shape/affinepreimage1.cc (1.3),
+	  tests/BD_Shape/affinepreimage2.cc (1.3),
+	  tests/BD_Shape/affinepreimage3.cc (1.3),
+	  tests/BD_Shape/affinepreimage4.cc (1.3),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.5),
+	  tests/BD_Shape/ascii_dump_load2.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation2.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation3.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation4.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation5.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation6.cc (1.3),
+	  tests/BD_Shape/cc76narrowing1.cc (1.3),
+	  tests/BD_Shape/cc76narrowing2.cc (1.3),
+	  tests/BD_Shape/cc76narrowing3.cc (1.3),
+	  tests/BD_Shape/cc76narrowing4.cc (1.3),
+	  tests/BD_Shape/cc76narrowing5.cc (1.3),
+	  tests/BD_Shape/ch78widening1.cc (1.3),
+	  tests/BD_Shape/ch78widening2.cc (1.3),
+	  tests/BD_Shape/ch78widening3.cc (1.3),
+	  tests/BD_Shape/ch78widening4.cc (1.3),
+	  tests/BD_Shape/ch78widening5.cc (1.3),
+	  tests/BD_Shape/ch78widening6.cc (1.3),
+	  tests/BD_Shape/ch78widening7.cc (1.3),
+	  tests/BD_Shape/ch78widening8.cc (1.3),
+	  tests/BD_Shape/concatenate1.cc (1.3),
+	  tests/BD_Shape/concatenate2.cc (1.3),
+	  tests/BD_Shape/concatenate3.cc (1.3),
+	  tests/BD_Shape/concatenate4.cc (1.3),
+	  tests/BD_Shape/concatenate5.cc (1.3),
+	  tests/BD_Shape/constraints1.cc (1.3),
+	  tests/BD_Shape/constraints2.cc (1.3), tests/BD_Shape/contains1.cc
+	  (1.3), tests/BD_Shape/contains2.cc (1.3),
+	  tests/BD_Shape/contains3.cc (1.3), tests/BD_Shape/empty1.cc
+	  (1.3), tests/BD_Shape/empty2.cc (1.3), tests/BD_Shape/empty3.cc
+	  (1.3), tests/BD_Shape/empty4.cc (1.3), tests/BD_Shape/empty5.cc
+	  (1.2), tests/BD_Shape/equality1.cc (1.3),
+	  tests/BD_Shape/exceptions1.cc (1.3),
+	  tests/BD_Shape/exceptions2.cc (1.3),
+	  tests/BD_Shape/exceptions3.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage10.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage11.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage12.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage3.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage4.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage5.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage6.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage7.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage8.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage9.cc (1.3),
+	  tests/BD_Shape/h79widening1.cc (1.3),
+	  tests/BD_Shape/intersection1.cc (1.3),
+	  tests/BD_Shape/intersection2.cc (1.3),
+	  tests/BD_Shape/intersection3.cc (1.3),
+	  tests/BD_Shape/intersection4.cc (1.3),
+	  tests/BD_Shape/intersection5.cc (1.3),
+	  tests/BD_Shape/intersection6.cc (1.3),
+	  tests/BD_Shape/intersection7.cc (1.3),
+	  tests/BD_Shape/intersection8.cc (1.3),
+	  tests/BD_Shape/limitedCC76extrapolation1.cc (1.3),
+	  tests/BD_Shape/limitedCC76extrapolation2.cc (1.3),
+	  tests/BD_Shape/limitedCC76extrapolation3.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation1.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation2.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation3.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation4.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation5.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation6.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation7.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation8.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation9.cc (1.3),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.3),
+	  tests/BD_Shape/mapspacedims1.cc (1.3),
+	  tests/BD_Shape/mapspacedims2.cc (1.3),
+	  tests/BD_Shape/mapspacedims3.cc (1.3),
+	  tests/BD_Shape/mapspacedims4.cc (1.3),
+	  tests/BD_Shape/maxspacedim.cc (1.4),
+	  tests/BD_Shape/polydifference1.cc (1.3),
+	  tests/BD_Shape/polydifference2.cc (1.3),
+	  tests/BD_Shape/polydifference3.cc (1.3),
+	  tests/BD_Shape/polydifference4.cc (1.3),
+	  tests/BD_Shape/polydifference5.cc (1.3),
+	  tests/BD_Shape/polydifference6.cc (1.3),
+	  tests/BD_Shape/polyhull1.cc (1.3), tests/BD_Shape/polyhull2.cc
+	  (1.3), tests/BD_Shape/polyhull3.cc (1.3),
+	  tests/BD_Shape/polyhull4.cc (1.3),
+	  tests/BD_Shape/removespacedims1.cc (1.3),
+	  tests/BD_Shape/removespacedims2.cc (1.3),
+	  tests/BD_Shape/removespacedims3.cc (1.3),
+	  tests/BD_Shape/timeelapse1.cc (1.3),
+	  tests/BD_Shape/timeelapse2.cc (1.3),
+	  tests/BD_Shape/timeelapse3.cc (1.3),
+	  tests/BD_Shape/timeelapse4.cc (1.3),
+	  tests/BD_Shape/timeelapse5.cc (1.3), tests/BD_Shape/universe1.cc
+	  (1.3), tests/BD_Shape/writebdiffs1.cc (1.3),
+	  tests/BD_Shape/writebdiffs2.cc (1.3), tests/Polyhedron/memory2.cc
+	  (1.8), tests/Polyhedron/polypowerset1.cc (1.2): Copyright years
+	  updated.
+
+2005-02-15 Tuesday 19:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.8): BD_Shape<T>::is_empty() fixed:
+	  add_round_down() was used instead of add_round_up().
+
+2005-02-15 Tuesday 19:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.4), empty5.cc (1.1): New test
+	  triggering a bug in BD_Shape<T>::is_empty().
+
+2005-02-15 Tuesday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator_System.cc (1.6): Spurious redeclaration removed
+	  from Generator_System::ascii_load().
+
+2005-02-15 Tuesday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.inlines.hh (1.16): Make sure inline methods
+	  Linear_System::num_pending_rows() and
+	  Linear_System::unset_pending_rows() are defined before being
+	  invoked.
+
+2005-02-15 Tuesday 18:16  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/BDS_Status.idefs.hh (1.5): Correct a typo.
+
+2005-02-14 Monday 21:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.169), interfaces/C/ppl_c.h.in (1.47),
+	  src/BDS_Status.idefs.hh (1.4), src/BD_Shape.inlines.hh (1.7),
+	  src/BHRZ03_Certificate.defs.hh (1.10), src/Bounding_Box.defs.hh
+	  (1.4), src/Checked_Number.cc (1.6), src/Checked_Number.defs.hh
+	  (1.19), src/Constraint.cc (1.48), src/DB_Matrix.defs.hh (1.4),
+	  src/DB_Row.defs.hh (1.5), src/Generator.cc (1.59),
+	  src/Generator.defs.hh (1.102), src/Limits.hh (1.6),
+	  src/Linear_Row.defs.hh (1.8), src/Linear_System.cc (1.17),
+	  src/Linear_System.inlines.hh (1.15), src/Makefile.am (1.104),
+	  src/Native_Integer.defs.hh (1.10), src/Ph_Status.idefs.hh (1.8),
+	  src/Poly_Con_Relation.defs.hh (1.26),
+	  src/Poly_Gen_Relation.defs.hh (1.24),
+	  src/Polyhedra_Powerset.inlines.hh (1.18), src/Polyhedron.defs.hh
+	  (1.266), src/Polyhedron_widenings.cc (1.41), src/Powerset.defs.hh
+	  (1.11), src/Result.defs.hh (1.8), src/Saturation_Row.defs.hh
+	  (1.4), src/checked.inlines.hh (1.15), src/checked_int.inlines.hh
+	  (1.24), src/conversion.cc (1.67), src/globals.defs.hh (1.18):
+	  Fixed several spelling mistakes.
+
+2005-02-14 Monday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Saturation_Row.cc (1.5), Saturation_Row.inlines.hh (1.4):
+	  Saturation_Row::operator[](), operator==(const Saturation_Row&,
+	  const Saturation_Row&) and operator!=(const Saturation_Row&,
+	  const Saturation_Row&) speeded up.
+
+2005-02-14 Monday 17:19  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* src/Linear_System.inlines.hh (1.14): Improve comment.
+
+2005-02-14 Monday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.inlines.hh (1.5): Define HIJACK_FPU only if it is
+	  not already defined.
+
+2005-02-14 Monday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.6): Do not use assignment with
+	  unspecified rounding mode.
+
+2005-02-14 Monday 14:49  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.29): Added rounding functions.
+	  Treat specially negative zero representation.
+
+2005-02-13 Sunday 08:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.7), compile (1.4), config.guess (1.27), config.sub
+	  (1.26), depcomp (1.9), missing (1.9), mkinstalldirs (1.8),
+	  Watchdog/INSTALL (1.4), Watchdog/compile (1.4),
+	  Watchdog/config.guess (1.11), Watchdog/config.sub (1.11),
+	  Watchdog/depcomp (1.7), Watchdog/missing (1.5),
+	  Watchdog/mkinstalldirs (1.4): Updated from Automake 1.9.5.
+
+2005-02-12 Saturday 18:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.50): Little comment improvements.
+
+2005-02-12 Saturday 17:53  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.28): Fixed cut and paste typo.
+
+2005-02-12 Saturday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: E_Rational.defs.hh (1.4), E_Rational.inlines.hh (1.6):
+	  Alternative interface functions added to make a comparison with
+	  new code possible.
+
+2005-02-12 Saturday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/E_NIT.inlines.hh (1.9): Formatting change.
+
+2005-02-12 Saturday 15:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.22), Watchdog/ltmain.sh (1.11): Updated from Libtool
+	  1.5.14.
+
+2005-02-11 Friday 18:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_System.cc (1.16), Linear_System.defs.hh (1.13),
+	  Linear_System.inlines.hh (1.13), Polyhedron_nonpublic.cc (1.46),
+	  Polyhedron_public.cc (1.49): Pending rows in a linear (constraint
+	  or generator) system make sense only when the system is part of a
+	  polyhedron.  The ordinary copy constructor and assignment
+	  operator now turn pending rows into non-pending ones.  A full
+	  copy constructor and pseudo-assignment are now provided for those
+	  cases where the copy and assignment must preserve the pending
+	  status of pending rows.  These changes fix the bug exhibited by
+	  tests/Polyhedron/constraints5.cc and
+	  tests/Polyhedron/generators7.cc.
+
+2005-02-11 Friday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh (1.17): Comment reformatted.
+
+2005-02-11 Friday 16:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/generators7.cc (1.2): Fixed and made silent.
+
+2005-02-11 Friday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/ascii_dump_load1.cc (1.4),
+	  Polyhedron/constraints5.cc (1.2): Be quiet.
+
+2005-02-11 Friday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint_System.cc (1.6), Constraint_System.inlines.hh
+	  (1.3), Generator_System.cc (1.5), Generator_System.inlines.hh
+	  (1.3), Linear_System.cc (1.15): Missing assertions added.  Code
+	  formatting improved.
+
+2005-02-10 Thursday 22:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.11), generators7.cc (1.1): New
+	  test triggering a bug in Generator_System::insert(const
+	  Generator&).
+
+2005-02-10 Thursday 22:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.10), constraints5.cc (1.1): New
+	  test triggering a bug in Constraint_System::insert(const
+	  Constraint&).
+
+2005-02-10 Thursday 21:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh (1.4): Code reformatted as per our coding
+	  standards.
+
+2005-02-10 Thursday 21:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sicstus_cfli.ic (1.11):
+	  Prolog_put_ulong() fixed.
+
+2005-02-10 Thursday 16:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: compiler.hh (1.4), fpu-ia32.inlines.hh (1.4): Code
+	  reformatted as per our coding standards.
+
+2005-02-10 Thursday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh (1.14): Missing "used declaration" added.
+
+2005-02-10 Thursday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.cc (1.5): Useless break removed.
+
+2005-02-10 Thursday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.9): Missing std:: qualifier added.
+
+2005-02-10 Thursday 16:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.27): Declare strtof() and
+	  strtod() if they are not declared by <cstdlib>.
+
+2005-02-10 Thursday 16:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.159): Check for the declaration of strtof() and
+	  strtod().
+
+2005-02-10 Thursday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.cc (1.4): All *.cc files must include
+	  <config.h> first.
+
+2005-02-10 Thursday 16:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.26): Declare strtold() if this is
+	  not declared by <cstdlib>.
+
+2005-02-10 Thursday 16:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.158): Check for the declaration of strtold().
+
+2005-02-08 Tuesday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.sub (1.25), install-sh (1.13), Watchdog/config.sub (1.10),
+	  Watchdog/install-sh (1.10): Updated.
+
+2005-02-08 Tuesday 20:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.21), Watchdog/ltmain.sh (1.10): Updated from Libtool
+	  1.5.12.
+
+2005-02-08 Tuesday 12:01  Abramo Bagnara
+
+	* tests/ppl_test.hh (1.17): Fixed use of native types.
+
+2005-02-08 Tuesday 11:49  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (1.18), src/Checked_Number.inlines.hh
+	  (1.26), tests/ppl_test.hh (1.16): Allow rounding direction
+	  save/restore for both Checked_Number and native types.
+
+2005-02-08 Tuesday 11:10  Abramo Bagnara
+
+	* src/: checked.inlines.hh (1.13), checked_int.inlines.hh (1.23),
+	  checked_mpz.inlines.hh (1.16): Pushed rounding to a lowest level.
+
+2005-02-03 Thursday 10:02  Abramo Bagnara
+
+	* tests/ppl_test.hh (1.15): Added inline keyword.
+
+2005-01-31 Monday 22:33  Abramo Bagnara
+
+	* tests/ppl_test.hh (1.14): Fixed two typos.
+
+2005-01-31 Monday 22:30  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.42), interfaces/C/ppl_c.cc (1.130),
+	  interfaces/Prolog/ppl_prolog.icc (1.154),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.31),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.27),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.74),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.98),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.65),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.90),
+	  src/Checked_Number.defs.hh (1.17), src/Checked_Number.inlines.hh
+	  (1.25), src/E_NIT.inlines.hh (1.8), src/E_Rational.inlines.hh
+	  (1.5), src/Interval.inlines.hh (1.20),
+	  src/Polyhedron_nonpublic.cc (1.45), src/Rounding.defs.hh (1.9),
+	  src/Rounding.inlines.hh (1.7), src/checked.defs.hh (1.14),
+	  src/checked.inlines.hh (1.12), src/checked_ext.defs.hh (1.6),
+	  src/checked_ext.inlines.hh (1.13), src/checked_float.inlines.hh
+	  (1.25), src/checked_int.inlines.hh (1.22),
+	  src/checked_mpq.inlines.hh (1.14), src/checked_mpz.inlines.hh
+	  (1.15), tests/ppl_test.hh (1.13): Better efficiency for
+	  Checked_Number.
+
+2005-01-29 Saturday 09:38  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (1.16), src/Checked_Number.inlines.hh
+	  (1.24), src/checked_ext.inlines.hh (1.12),
+	  src/checked_float.inlines.hh (1.24), tests/ppl_test.hh (1.12):
+	  More work to improve performance on extended numbers.
+
+2005-01-28 Friday 12:24  Abramo Bagnara
+
+	* src/: checked.defs.hh (1.13), checked.inlines.hh (1.11),
+	  checked_ext.inlines.hh (1.11), checked_int.inlines.hh (1.21),
+	  checked_mpq.inlines.hh (1.13), checked_mpz.inlines.hh (1.14):
+	  Attempt to improve performance of extended numbers.
+
+2005-01-28 Friday 11:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.9): Removed ascii_dump_load4 from
+	  XFAIL_WITH_INT8_A.
+
+2005-01-27 Thursday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/E_NIT.inlines.hh (1.7): Fixed exact_neg(E_NIT<T>& to, const
+	  E_NIT<T>& x).
+
+2005-01-27 Thursday 21:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: E_NIT.defs.hh (1.4), E_NIT.inlines.hh (1.6): Added
+	  constructor and assignment operator from Plus_Infinity.
+
+2005-01-27 Thursday 20:25  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.15), Checked_Number.inlines.hh
+	  (1.23): Added constructors for special values. Added functors to
+	  return special values.
+
+2005-01-27 Thursday 17:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/E_NIT.inlines.hh (1.5), tests/ppl_test.hh (1.11): Temporarily
+	  added a modified interface for E_NIT.
+
+2005-01-27 Thursday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.103): Include the declaration and definition
+	  of E_NIT and E_Rational into ppl.hh.
+
+2005-01-27 Thursday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.8), memory2.cc (1.7): Now
+	  memory2 fails only if a memory leak is detected.  Check for
+	  possible memory leaks caused by any type of exception.
+
+2005-01-27 Thursday 00:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.7), memory2.cc (1.6): Added
+	  much more serious tests to guard against the introduction of
+	  memory leaks.
+
+2005-01-26 Wednesday 19:13  Abramo Bagnara
+
+	* src/: Checked_Number.inlines.hh (1.22), checked_ext.inlines.hh
+	  (1.10), checked_mpq.inlines.hh (1.12), checked_mpz.inlines.hh
+	  (1.13): Bug fixes for checked numbers I/O.
+
+2005-01-26 Wednesday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory2.cc (1.5): Corrected and generalized.
+
+2005-01-26 Wednesday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/ascii_dump_load1.cc (1.3): Be noisy so as to show
+	  that things are not working as expected.
+
+2005-01-26 Wednesday 16:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.5): Use the function is_nonnegative()
+	  instead of the method is_nonnegative().
+
+2005-01-26 Wednesday 15:45  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.14), Checked_Number.inlines.hh
+	  (1.21), checked.defs.hh (1.12), checked.inlines.hh (1.10),
+	  checked_ext.defs.hh (1.5), checked_ext.inlines.hh (1.9),
+	  checked_float.inlines.hh (1.23), checked_int.inlines.hh (1.20),
+	  checked_mpq.inlines.hh (1.11), checked_mpz.inlines.hh (1.12): New
+	  string based I/O implementation for checked numbers.
+
+2005-01-26 Wednesday 09:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.10): Added void
+	  negate_round_down(Checked_Number<T, Policy>& to, const
+	  Checked_Number<T, Policy>& x).
+
+2005-01-26 Wednesday 09:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.9): Added bool is_nonnegative(const
+	  Checked_Number<T, Policy>&).
+
+2005-01-26 Wednesday 08:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.18): Added void print_constraints(const
+	  BD_Shape<T>&, const string&, ostream&).
+
+2005-01-25 Tuesday 23:23  Abramo Bagnara
+
+	* tests/ppl_test.hh (1.8): Fixed compilation for mpz coefficients.
+
+2005-01-25 Tuesday 23:22  Abramo Bagnara
+
+	* src/Makefile.am (1.102): Checked_* include files are now needed.
+
+2005-01-25 Tuesday 18:25  Abramo Bagnara
+
+	* src/BD_Shape.inlines.hh (1.4), src/DB_Row.inlines.hh (1.5),
+	  tests/ppl_test.hh (1.7), tests/BD_Shape/maxspacedim.cc (1.3): Use
+	  new templatic implementation for extended numbers.
+
+2005-01-25 Tuesday 18:22  Abramo Bagnara
+
+	* src/checked_ext.inlines.hh (1.8): Fixed +inf text representation.
+
+2005-01-25 Tuesday 18:22  Abramo Bagnara
+
+	* src/: Rounding.defs.hh (1.8), Rounding.inlines.hh (1.6): Faster
+	  versions for use inside library.
+
+2005-01-25 Tuesday 18:21  Abramo Bagnara
+
+	* src/: Checked_Number.cc (1.3), Checked_Number.defs.hh (1.13),
+	  Checked_Number.inlines.hh (1.20): Better support for extended
+	  numbers.
+
+2005-01-25 Tuesday 11:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory2.cc (1.4): Be quiet.
+
+2005-01-24 Monday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.22): Temporary workaround to
+	  allow compilation on systems not providing fma(), fmaf() or
+	  fmal().
+
+2005-01-24 Monday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.13): No longer use GLPK's obsolete
+	  functions lpx_get_obj_c0() and lpx_get_col_coef().
+
+2005-01-23 Sunday 22:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.141), demos/ppl_lpsol/examples/README (1.1): Added a
+	  README file in demos/ppl_lpsol/examples explaining the origin of
+	  the examples there contained.
+
+2005-01-23 Sunday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.157): Check for the availability of fma(), fmaf()
+	  and fmal() in C++.
+
+2005-01-13 Thursday 15:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.151): Mentioned the correction of the exception-safety
+	  bug.
+
+2005-01-13 Thursday 14:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.265): Typo fixed.
+
+2005-01-13 Thursday 14:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Matrix.inlines.hh (1.4), DB_Row.defs.hh (1.4),
+	  DB_Row.inlines.hh (1.4), DB_Row.types.hh (1.4): Corrected an
+	  exception-safety bug in class DB_Row. Methods resize_no_copy()
+	  and grow_no_copy() have been replaced by method
+	  expand_within_capacity().
+
+2005-01-13 Thursday 14:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.inlines.hh (1.59): For clarity, explicitly invoke
+	  Row_Impl_Handler constructor in the Row constructors.
+
+2005-01-13 Thursday 14:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.91): Documentation fixed: `impl' is a member,
+	  not a method.
+
+2005-01-13 Thursday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.264): Fixed a couple of sentences.
+
+2005-01-13 Thursday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.140): One more item added.
+
+2005-01-13 Thursday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.139): Two items added.
+
+2005-01-13 Thursday 09:26  Abramo Bagnara
+
+	* src/Rounding.defs.hh (1.7): Removed old declarations.
+
+2005-01-12 Wednesday 22:05  Abramo Bagnara
+
+	* src/Rounding.defs.hh (1.6): save & restore are public methods.
+
+2005-01-12 Wednesday 18:37  Abramo Bagnara
+
+	* src/: E_NIT.inlines.hh (1.4), E_Rational.inlines.hh (1.4),
+	  Interval.inlines.hh (1.19), Polyhedron_nonpublic.cc (1.44): Use
+	  constructor implicitly.
+
+2005-01-12 Wednesday 18:36  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.12), Checked_Number.inlines.hh
+	  (1.19), Rounding.defs.hh (1.5), Rounding.inlines.hh (1.5): Given
+	  access to rounding via Checked_Number class.
+
+2005-01-12 Wednesday 14:39  Abramo Bagnara
+
+	* src/: Checked_Number.cc (1.2), Checked_Number.defs.hh (1.11),
+	  Checked_Number.inlines.hh (1.18), Checked_Number.types.hh (1.5),
+	  Makefile.am (1.101): Moved result handler in policy.
+
+2005-01-12 Wednesday 10:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/memory2.cc (1.3): The memory leak should be
+	  fixed.
+
+2005-01-12 Wednesday 10:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Row.cc (1.79), Row.inlines.hh (1.58): Fixed a couple of
+	  stupid typos.
+
+2005-01-11 Tuesday 17:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.150), src/Row.cc (1.78), src/Row.defs.hh (1.90),
+	  src/Row.inlines.hh (1.57), src/Row.types.hh (1.9): Class Row now
+	  provately inherits from Row_Impl_Handler instead of having a
+	  member of class Row::Impl_Handler. Corrected the handling of the
+	  capacity_ member of Row_Impl_Handler, so as to have a clean make
+	  check when enabling more assertions. The handling of Row
+	  implementation made a bit more elegant by introducing the
+	  function allocate().
+
+2005-01-11 Tuesday 08:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.1): Added tests to guard
+	  against reintroduction of recently corrected errors in
+	  Polyhedra_Powerset constructors.
+
+2005-01-10 Monday 10:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.cc (1.77), src/Row.defs.hh (1.89), src/Row.inlines.hh
+	  (1.56), tests/Polyhedron/Makefile.am (1.6): Provided a quick fix
+	  for the potential memory leak error.
+
+2005-01-07 Friday 23:39  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.10), Checked_Number.inlines.hh
+	  (1.17), Makefile.am (1.100), Rounding.inlines.hh (1.4),
+	  checked.defs.hh (1.11), checked.inlines.hh (1.9),
+	  checked_ext.inlines.hh (1.7): Allows Checked_Number to handle
+	  extended values via appropriate policy.
+
+2005-01-06 Thursday 21:28  Abramo Bagnara
+
+	* src/: Float.defs.hh (1.4), checked_int.inlines.hh (1.19),
+	  checked_float.inlines.hh (1.21): White spaces fix.
+
+2005-01-06 Thursday 21:27  Abramo Bagnara
+
+	* src/: Extended_Number.defs.hh (1.5), Extended_Number.inlines.hh
+	  (1.7), Extended_Number.types.hh (1.4): Removed files.
+
+2005-01-02 Sunday 08:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory2.cc (1.2): Force failure everywhere until
+	  the bug is fixed.
+
+2005-01-01 Saturday 23:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.5), memory2.cc (1.1): Another
+	  program to test the allocation error recovery facility of the
+	  library.
+
+2005-01-01 Saturday 23:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.4): Comment added to help decipher
+	  a #else.
+
+2005-01-01 Saturday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.8): The first_phase() function now returns a
+	  Simplex_Status().
+
+2005-01-01 Saturday 14:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.129): Fixed
+	  ppl_Constraint_System_minimize() (thanks to Andrea Cimino).
+
+2005-01-01 Saturday 12:24  Abramo Bagnara
+
+	* src/: checked.inlines.hh (1.8), checked_float.inlines.hh (1.20),
+	  checked_int.inlines.hh (1.18), checked_mpq.inlines.hh (1.10),
+	  checked_mpz.inlines.hh (1.11): Renamed mod to more appropriate
+	  rem.
+
+2005-01-01 Saturday 12:10  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.9), Checked_Number.inlines.hh
+	  (1.16), Extended_Number.defs.hh (1.4), Extended_Number.inlines.hh
+	  (1.6), checked.defs.hh (1.10), checked.inlines.hh (1.7),
+	  checked_ext.defs.hh (1.4), checked_ext.inlines.hh (1.6),
+	  checked_float.inlines.hh (1.19), checked_int.inlines.hh (1.17),
+	  checked_mpq.inlines.hh (1.9), checked_mpz.inlines.hh (1.10):
+	  Renamed mod to more appropriate rem.
+
+2005-01-01 Saturday 00:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.28), README (1.35), README.configure (1.13),
+	  configure.ac (1.156), Watchdog/Doubly_Linked_Object.defs.hh
+	  (1.2), Watchdog/Doubly_Linked_Object.inlines.hh (1.2),
+	  Watchdog/Doubly_Linked_Object.types.hh (1.2),
+	  Watchdog/EList.defs.hh (1.4), Watchdog/EList.inlines.hh (1.3),
+	  Watchdog/EList.types.hh (1.2), Watchdog/EList_Iterator.defs.hh
+	  (1.2), Watchdog/EList_Iterator.inlines.hh (1.3),
+	  Watchdog/EList_Iterator.types.hh (1.2), Watchdog/Handler.defs.hh
+	  (1.3), Watchdog/Handler.inlines.hh (1.2),
+	  Watchdog/Handler.types.hh (1.2), Watchdog/Makefile.am (1.18),
+	  Watchdog/Pending_Element.cc (1.2),
+	  Watchdog/Pending_Element.defs.hh (1.2),
+	  Watchdog/Pending_Element.inlines.hh (1.2),
+	  Watchdog/Pending_Element.types.hh (1.2), Watchdog/Pending_List.cc
+	  (1.2), Watchdog/Pending_List.defs.hh (1.2),
+	  Watchdog/Pending_List.inlines.hh (1.2),
+	  Watchdog/Pending_List.types.hh (1.2), Watchdog/README (1.10),
+	  Watchdog/Time.cc (1.2), Watchdog/Time.defs.hh (1.2),
+	  Watchdog/Time.inlines.hh (1.2), Watchdog/Time.types.hh (1.2),
+	  Watchdog/Watchdog.cc (1.19), Watchdog/Watchdog.defs.hh (1.15),
+	  Watchdog/Watchdog.inlines.hh (1.12), Watchdog/Watchdog.types.hh
+	  (1.6), Watchdog/configure.ac (1.25), Watchdog/pwl_header.top
+	  (1.6), demos/Makefile.am (1.6), demos/ppl_lcdd/Makefile.am
+	  (1.19), demos/ppl_lcdd/ppl_lcdd.cc (1.41),
+	  demos/ppl_lcdd/examples/Makefile.am (1.4),
+	  demos/ppl_lpsol/Makefile.am (1.12), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.12), demos/ppl_lpsol/examples/Makefile.am (1.3),
+	  doc/Makefile.am (1.32), doc/README.doc (1.2), doc/definitions.dox
+	  (1.168), doc/devref.tex (1.17), doc/ppl.sty (1.18), doc/user.tex
+	  (1.18), interfaces/Makefile.am (1.10), interfaces/C/Makefile.am
+	  (1.18), interfaces/C/ppl_c.cc (1.128), interfaces/C/ppl_c.h.in
+	  (1.46), interfaces/OCaml/Makefile.am (1.9),
+	  interfaces/Prolog/Makefile.am (1.27),
+	  interfaces/Prolog/Prolog_interface.dox (1.126),
+	  interfaces/Prolog/exceptions.hh (1.15),
+	  interfaces/Prolog/ppl_prolog.icc (1.153),
+	  interfaces/Prolog/track_allocation.hh (1.16),
+	  interfaces/Prolog/Ciao/Makefile.am (1.40),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.14),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.10),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.10),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.30),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.78),
+	  interfaces/Prolog/GNU/Makefile.am (1.44),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.4),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.8),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.50),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.26),
+	  interfaces/Prolog/SICStus/Makefile.am (1.51),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.24),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.73),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.4),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.5),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.10),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.11),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.2),
+	  interfaces/Prolog/SWI/Makefile.am (1.45),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.8),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.7),
+	  interfaces/Prolog/SWI/ppl_pl.cc (1.8),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.97),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.4),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.3),
+	  interfaces/Prolog/XSB/Makefile.am (1.32),
+	  interfaces/Prolog/XSB/expected2_int16 (1.4),
+	  interfaces/Prolog/XSB/expected2_int16_a (1.3),
+	  interfaces/Prolog/XSB/expected2_int32 (1.3),
+	  interfaces/Prolog/XSB/expected2_int32_a (1.2),
+	  interfaces/Prolog/XSB/expected2_int64 (1.2),
+	  interfaces/Prolog/XSB/expected2_int64_a (1.2),
+	  interfaces/Prolog/XSB/expected2_int8 (1.2),
+	  interfaces/Prolog/XSB/expected2_int8_a (1.2),
+	  interfaces/Prolog/XSB/expected2_mpz (1.2),
+	  interfaces/Prolog/XSB/expected2_mpz_a (1.2),
+	  interfaces/Prolog/XSB/expected_int16 (1.2),
+	  interfaces/Prolog/XSB/expected_int16_a (1.2),
+	  interfaces/Prolog/XSB/expected_int32 (1.2),
+	  interfaces/Prolog/XSB/expected_int32_a (1.2),
+	  interfaces/Prolog/XSB/expected_int64 (1.2),
+	  interfaces/Prolog/XSB/expected_int64_a (1.2),
+	  interfaces/Prolog/XSB/expected_int8 (1.3),
+	  interfaces/Prolog/XSB/expected_int8_a (1.3),
+	  interfaces/Prolog/XSB/expected_mpz (1.2),
+	  interfaces/Prolog/XSB/expected_mpz_a (1.2),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.37),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.64),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.12),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.10),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.14),
+	  interfaces/Prolog/YAP/Makefile.am (1.35),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.89),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.8),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.9),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.5),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.7),
+	  interfaces/Prolog/tests/Makefile.am (1.3),
+	  interfaces/Prolog/tests/clpq.pl (1.5),
+	  interfaces/Prolog/tests/clpq2.pl (1.5),
+	  interfaces/Prolog/tests/expected2_int16 (1.4),
+	  interfaces/Prolog/tests/expected2_int16_a (1.3),
+	  interfaces/Prolog/tests/expected2_int32 (1.3),
+	  interfaces/Prolog/tests/expected2_int32_a (1.2),
+	  interfaces/Prolog/tests/expected2_int64 (1.2),
+	  interfaces/Prolog/tests/expected2_int64_a (1.2),
+	  interfaces/Prolog/tests/expected2_int8 (1.2),
+	  interfaces/Prolog/tests/expected2_int8_a (1.2),
+	  interfaces/Prolog/tests/expected2_mpz (1.2),
+	  interfaces/Prolog/tests/expected2_mpz_a (1.2),
+	  interfaces/Prolog/tests/expected_int16 (1.2),
+	  interfaces/Prolog/tests/expected_int16_a (1.2),
+	  interfaces/Prolog/tests/expected_int32 (1.2),
+	  interfaces/Prolog/tests/expected_int32_a (1.2),
+	  interfaces/Prolog/tests/expected_int64 (1.2),
+	  interfaces/Prolog/tests/expected_int64_a (1.2),
+	  interfaces/Prolog/tests/expected_int8 (1.3),
+	  interfaces/Prolog/tests/expected_int8_a (1.3),
+	  interfaces/Prolog/tests/expected_mpz (1.2),
+	  interfaces/Prolog/tests/expected_mpz_a (1.2),
+	  interfaces/Prolog/tests/pl_check.pl (1.7), m4/Makefile.am (1.12),
+	  m4/ac_check_gmp.m4 (1.20), m4/ac_cxx_attribute_weak.m4 (1.4),
+	  m4/ac_cxx_double_is_iec_559.m4 (1.2),
+	  m4/ac_cxx_flexible_arrays.m4 (1.9), m4/ac_cxx_float_is_iec_559.m4
+	  (1.2), m4/ac_cxx_long_double.m4 (1.3),
+	  m4/ac_cxx_long_double_is_iec_559.m4 (1.2), m4/ac_cxx_long_long.m4
+	  (1.2), src/Ask_Tell.defs.hh (1.4), src/Ask_Tell.inlines.hh (1.4),
+	  src/Ask_Tell.types.hh (1.2), src/BDS_Status.idefs.hh (1.3),
+	  src/BDS_Status.inlines.hh (1.3), src/BD_Shape.defs.hh (1.4),
+	  src/BD_Shape.inlines.hh (1.3), src/BD_Shape.types.hh (1.3),
+	  src/BHRZ03_Certificate.cc (1.7), src/BHRZ03_Certificate.defs.hh
+	  (1.9), src/BHRZ03_Certificate.inlines.hh (1.4),
+	  src/BHRZ03_Certificate.types.hh (1.2), src/Bounding_Box.cc (1.3),
+	  src/Bounding_Box.defs.hh (1.3), src/Bounding_Box.inlines.hh
+	  (1.3), src/Bounding_Box.types.hh (1.2), src/C_Polyhedron.cc
+	  (1.14), src/C_Polyhedron.defs.hh (1.31),
+	  src/C_Polyhedron.inlines.hh (1.24), src/C_Polyhedron.types.hh
+	  (1.8), src/Checked_Number.defs.hh (1.8),
+	  src/Checked_Number.inlines.hh (1.15), src/Checked_Number.types.hh
+	  (1.4), src/Coefficient.cc (1.2), src/Coefficient.defs.hh (1.2),
+	  src/Coefficient.inlines.hh (1.2), src/Coefficient.types.hh (1.6),
+	  src/Coefficient_traits_template.hh (1.3), src/Constraint.cc
+	  (1.47), src/Constraint.defs.hh (1.102), src/Constraint.inlines.hh
+	  (1.59), src/Constraint.types.hh (1.8), src/Constraint_System.cc
+	  (1.5), src/Constraint_System.defs.hh (1.8),
+	  src/Constraint_System.inlines.hh (1.2),
+	  src/Constraint_System.types.hh (1.2), src/DB_Matrix.defs.hh
+	  (1.3), src/DB_Matrix.inlines.hh (1.3), src/DB_Matrix.types.hh
+	  (1.3), src/DB_Row.defs.hh (1.3), src/DB_Row.inlines.hh (1.3),
+	  src/DB_Row.types.hh (1.3), src/Determinate.defs.hh (1.53),
+	  src/Determinate.inlines.hh (1.46), src/Determinate.types.hh
+	  (1.6), src/E_NIT.defs.hh (1.3), src/E_NIT.inlines.hh (1.3),
+	  src/E_NIT.types.hh (1.3), src/E_Rational.defs.hh (1.3),
+	  src/E_Rational.inlines.hh (1.3), src/E_Rational.types.hh (1.3),
+	  src/Extended_Number.defs.hh (1.3), src/Extended_Number.inlines.hh
+	  (1.5), src/Extended_Number.types.hh (1.3), src/Float.defs.hh
+	  (1.3), src/Float.inlines.hh (1.3), src/GMP_Integer.defs.hh (1.5),
+	  src/GMP_Integer.inlines.hh (1.4), src/GMP_Integer.types.hh (1.7),
+	  src/Generator.cc (1.58), src/Generator.defs.hh (1.101),
+	  src/Generator.inlines.hh (1.54), src/Generator.types.hh (1.8),
+	  src/Generator_System.cc (1.4), src/Generator_System.defs.hh
+	  (1.7), src/Generator_System.inlines.hh (1.2),
+	  src/Generator_System.types.hh (1.2), src/H79_Certificate.cc
+	  (1.6), src/H79_Certificate.defs.hh (1.9),
+	  src/H79_Certificate.inlines.hh (1.4),
+	  src/H79_Certificate.types.hh (1.2), src/Init.cc (1.15),
+	  src/Init.defs.hh (1.11), src/Init.types.hh (1.7), src/Interval.cc
+	  (1.10), src/Interval.defs.hh (1.21), src/Interval.inlines.hh
+	  (1.18), src/Interval.types.hh (1.8), src/Limits.hh (1.5),
+	  src/Linear_Expression.cc (1.4), src/Linear_Expression.defs.hh
+	  (1.8), src/Linear_Expression.inlines.hh (1.4),
+	  src/Linear_Expression.types.hh (1.2), src/Linear_Row.cc (1.5),
+	  src/Linear_Row.defs.hh (1.7), src/Linear_Row.inlines.hh (1.7),
+	  src/Linear_Row.types.hh (1.2), src/Linear_System.cc (1.14),
+	  src/Linear_System.defs.hh (1.12), src/Linear_System.inlines.hh
+	  (1.12), src/Linear_System.types.hh (1.2), src/Makefile.am (1.99),
+	  src/Matrix.cc (1.80), src/Matrix.defs.hh (1.68),
+	  src/Matrix.inlines.hh (1.43), src/Matrix.types.hh (1.8),
+	  src/NNC_Polyhedron.cc (1.13), src/NNC_Polyhedron.defs.hh (1.33),
+	  src/NNC_Polyhedron.inlines.hh (1.27), src/NNC_Polyhedron.types.hh
+	  (1.8), src/Native_Integer.defs.hh (1.9),
+	  src/Native_Integer.inlines.hh (1.9), src/Native_Integer.types.hh
+	  (1.7), src/Numeric_Format.defs.hh (1.3), src/Ph_Status.cc (1.6),
+	  src/Ph_Status.idefs.hh (1.7), src/Ph_Status.inlines.hh (1.5),
+	  src/Poly_Con_Relation.cc (1.9), src/Poly_Con_Relation.defs.hh
+	  (1.25), src/Poly_Con_Relation.inlines.hh (1.12),
+	  src/Poly_Con_Relation.types.hh (1.7), src/Poly_Gen_Relation.cc
+	  (1.9), src/Poly_Gen_Relation.defs.hh (1.23),
+	  src/Poly_Gen_Relation.inlines.hh (1.12),
+	  src/Poly_Gen_Relation.types.hh (1.7),
+	  src/Polyhedra_Powerset.defs.hh (1.14),
+	  src/Polyhedra_Powerset.inlines.hh (1.17),
+	  src/Polyhedra_Powerset.types.hh (1.2), src/Polyhedron.defs.hh
+	  (1.263), src/Polyhedron.inlines.hh (1.109),
+	  src/Polyhedron.types.hh (1.14), src/Polyhedron_chdims.cc (1.27),
+	  src/Polyhedron_nonpublic.cc (1.43), src/Polyhedron_public.cc
+	  (1.48), src/Polyhedron_widenings.cc (1.40), src/Powerset.defs.hh
+	  (1.10), src/Powerset.inlines.hh (1.9), src/Powerset.types.hh
+	  (1.2), src/Ptr_Iterator.defs.hh (1.3),
+	  src/Ptr_Iterator.inlines.hh (1.3), src/Ptr_Iterator.types.hh
+	  (1.3), src/Result.defs.hh (1.7), src/Result.inlines.hh (1.5),
+	  src/Rounding.defs.hh (1.4), src/Rounding.inlines.hh (1.3),
+	  src/Rounding.types.hh (1.3), src/Row.cc (1.76), src/Row.defs.hh
+	  (1.88), src/Row.inlines.hh (1.55), src/Row.types.hh (1.8),
+	  src/Saturation_Matrix.cc (1.2), src/Saturation_Matrix.defs.hh
+	  (1.2), src/Saturation_Matrix.inlines.hh (1.3),
+	  src/Saturation_Matrix.types.hh (1.2), src/Saturation_Row.cc
+	  (1.4), src/Saturation_Row.defs.hh (1.3),
+	  src/Saturation_Row.inlines.hh (1.3), src/Saturation_Row.types.hh
+	  (1.2), src/Topology.hh (1.10), src/Variable.cc (1.18),
+	  src/Variable.defs.hh (1.45), src/Variable.inlines.hh (1.21),
+	  src/Variable.types.hh (1.8), src/Widening_Function.defs.hh
+	  (1.10), src/Widening_Function.inlines.hh (1.9),
+	  src/Widening_Function.types.hh (1.2), src/algorithms.hh (1.39),
+	  src/checked.defs.hh (1.9), src/checked.inlines.hh (1.6),
+	  src/checked_ext.defs.hh (1.3), src/checked_ext.inlines.hh (1.5),
+	  src/checked_float.inlines.hh (1.18), src/checked_int.inlines.hh
+	  (1.16), src/checked_mpq.inlines.hh (1.8),
+	  src/checked_mpz.inlines.hh (1.9), src/compiler.hh (1.3),
+	  src/conversion.cc (1.66), src/float.types.hh (1.7),
+	  src/fpu-c99.inlines.hh (1.3), src/fpu-ia32.inlines.hh (1.3),
+	  src/fpu.defs.hh (1.3), src/globals.cc (1.20), src/globals.defs.hh
+	  (1.16), src/globals.inlines.hh (1.8), src/initializer.hh (1.10),
+	  src/max_space_dimension.hh (1.5), src/minimize.cc (1.40),
+	  src/ppl_header.top (1.8), src/simplex.cc (1.7), src/simplify.cc
+	  (1.42), src/swapping_sort.icc (1.8), src/version.cc (1.5),
+	  src/version.hh.in (1.10), tests/BBox.cc (1.8), tests/BBox.hh
+	  (1.6), tests/Makefile.am (1.242), tests/PFunction.cc (1.4),
+	  tests/PFunction.hh (1.4), tests/ehandlers.cc (1.6),
+	  tests/ehandlers.hh (1.10), tests/files.cc (1.6), tests/files.hh
+	  (1.6), tests/ppl_test.hh (1.6), tests/print.cc (1.14),
+	  tests/print.hh (1.17), tests/BD_Shape/relations1.cc (1.3),
+	  tests/BD_Shape/relations2.cc (1.3), tests/BD_Shape/relations3.cc
+	  (1.3), tests/BD_Shape/relations4.cc (1.3),
+	  tests/BD_Shape/relations5.cc (1.3),
+	  tests/Polyhedron/CbecomesNNC1.cc (1.3),
+	  tests/Polyhedron/Makefile.am (1.4),
+	  tests/Polyhedron/NNCbecomesC1.cc (1.3),
+	  tests/Polyhedron/NNCminimize1.cc (1.3),
+	  tests/Polyhedron/NNCminimize2.cc (1.3),
+	  tests/Polyhedron/NNCminimize3.cc (1.3),
+	  tests/Polyhedron/NNCminimize4.cc (1.3),
+	  tests/Polyhedron/NNCminimize5.cc (1.3),
+	  tests/Polyhedron/NNCminimize6.cc (1.3), tests/Polyhedron/README
+	  (1.3), tests/Polyhedron/addconstraint1.cc (1.3),
+	  tests/Polyhedron/addconstraint2.cc (1.3),
+	  tests/Polyhedron/addconstraint3.cc (1.3),
+	  tests/Polyhedron/addconstraints1.cc (1.3),
+	  tests/Polyhedron/addconstraints10.cc (1.3),
+	  tests/Polyhedron/addconstraints11.cc (1.3),
+	  tests/Polyhedron/addconstraints12.cc (1.3),
+	  tests/Polyhedron/addconstraints13.cc (1.3),
+	  tests/Polyhedron/addconstraints2.cc (1.3),
+	  tests/Polyhedron/addconstraints3.cc (1.3),
+	  tests/Polyhedron/addconstraints4.cc (1.3),
+	  tests/Polyhedron/addconstraints5.cc (1.3),
+	  tests/Polyhedron/addconstraints6.cc (1.3),
+	  tests/Polyhedron/addconstraints7.cc (1.3),
+	  tests/Polyhedron/addconstraints8.cc (1.3),
+	  tests/Polyhedron/addconstraints9.cc (1.3),
+	  tests/Polyhedron/addgenerator1.cc (1.3),
+	  tests/Polyhedron/addgenerator2.cc (1.3),
+	  tests/Polyhedron/addgenerator3.cc (1.3),
+	  tests/Polyhedron/addgenerator4.cc (1.3),
+	  tests/Polyhedron/addgenerator5.cc (1.3),
+	  tests/Polyhedron/addgenerators1.cc (1.3),
+	  tests/Polyhedron/addgenerators10.cc (1.3),
+	  tests/Polyhedron/addgenerators11.cc (1.3),
+	  tests/Polyhedron/addgenerators12.cc (1.3),
+	  tests/Polyhedron/addgenerators13.cc (1.3),
+	  tests/Polyhedron/addgenerators2.cc (1.3),
+	  tests/Polyhedron/addgenerators3.cc (1.3),
+	  tests/Polyhedron/addgenerators4.cc (1.3),
+	  tests/Polyhedron/addgenerators5.cc (1.3),
+	  tests/Polyhedron/addgenerators6.cc (1.3),
+	  tests/Polyhedron/addgenerators7.cc (1.3),
+	  tests/Polyhedron/addgenerators8.cc (1.3),
+	  tests/Polyhedron/addgenerators9.cc (1.3),
+	  tests/Polyhedron/addspacedims1.cc (1.3),
+	  tests/Polyhedron/addspacedims10.cc (1.3),
+	  tests/Polyhedron/addspacedims11.cc (1.3),
+	  tests/Polyhedron/addspacedims12.cc (1.3),
+	  tests/Polyhedron/addspacedims13.cc (1.3),
+	  tests/Polyhedron/addspacedims2.cc (1.3),
+	  tests/Polyhedron/addspacedims3.cc (1.3),
+	  tests/Polyhedron/addspacedims4.cc (1.3),
+	  tests/Polyhedron/addspacedims5.cc (1.3),
+	  tests/Polyhedron/addspacedims6.cc (1.3),
+	  tests/Polyhedron/addspacedims7.cc (1.3),
+	  tests/Polyhedron/addspacedims8.cc (1.3),
+	  tests/Polyhedron/addspacedims9.cc (1.3),
+	  tests/Polyhedron/affineimage1.cc (1.3),
+	  tests/Polyhedron/affineimage2.cc (1.3),
+	  tests/Polyhedron/affineimage3.cc (1.3),
+	  tests/Polyhedron/affineimage4.cc (1.3),
+	  tests/Polyhedron/affineimage5.cc (1.3),
+	  tests/Polyhedron/affineimage6.cc (1.3),
+	  tests/Polyhedron/affineimage7.cc (1.3),
+	  tests/Polyhedron/affineimage8.cc (1.3),
+	  tests/Polyhedron/affineimage9.cc (1.3),
+	  tests/Polyhedron/affinepreimage1.cc (1.3),
+	  tests/Polyhedron/affinepreimage10.cc (1.3),
+	  tests/Polyhedron/affinepreimage2.cc (1.3),
+	  tests/Polyhedron/affinepreimage3.cc (1.3),
+	  tests/Polyhedron/affinepreimage4.cc (1.3),
+	  tests/Polyhedron/affinepreimage5.cc (1.3),
+	  tests/Polyhedron/affinepreimage6.cc (1.3),
+	  tests/Polyhedron/affinepreimage7.cc (1.3),
+	  tests/Polyhedron/affinepreimage8.cc (1.3),
+	  tests/Polyhedron/affinepreimage9.cc (1.3),
+	  tests/Polyhedron/affinetrans.cc (1.3),
+	  tests/Polyhedron/append1.cc (1.3), tests/Polyhedron/append2.cc
+	  (1.3), tests/Polyhedron/ascii_dump_load1.cc (1.3),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.3),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.3),
+	  tests/Polyhedron/ascii_dump_load4.cc (1.3),
+	  tests/Polyhedron/ascii_dump_load5.cc (1.3),
+	  tests/Polyhedron/ascii_dump_load6.cc (1.3),
+	  tests/Polyhedron/ascii_dump_load7.cc (1.3),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.3),
+	  tests/Polyhedron/bgp99extrapolation2.cc (1.3),
+	  tests/Polyhedron/bhrz03widening1.cc (1.3),
+	  tests/Polyhedron/bhrz03widening10.cc (1.3),
+	  tests/Polyhedron/bhrz03widening11.cc (1.3),
+	  tests/Polyhedron/bhrz03widening12.cc (1.3),
+	  tests/Polyhedron/bhrz03widening13.cc (1.3),
+	  tests/Polyhedron/bhrz03widening14.cc (1.3),
+	  tests/Polyhedron/bhrz03widening15.cc (1.3),
+	  tests/Polyhedron/bhrz03widening16.cc (1.3),
+	  tests/Polyhedron/bhrz03widening17.cc (1.3),
+	  tests/Polyhedron/bhrz03widening18.cc (1.3),
+	  tests/Polyhedron/bhrz03widening19.cc (1.3),
+	  tests/Polyhedron/bhrz03widening2.cc (1.3),
+	  tests/Polyhedron/bhrz03widening3.cc (1.3),
+	  tests/Polyhedron/bhrz03widening4.cc (1.3),
+	  tests/Polyhedron/bhrz03widening5.cc (1.3),
+	  tests/Polyhedron/bhrz03widening6.cc (1.3),
+	  tests/Polyhedron/bhrz03widening7.cc (1.3),
+	  tests/Polyhedron/bhrz03widening8.cc (1.3),
+	  tests/Polyhedron/bhrz03widening9.cc (1.3),
+	  tests/Polyhedron/bhz03widening1.cc (1.3),
+	  tests/Polyhedron/bhz03widening2.cc (1.3),
+	  tests/Polyhedron/bhz03widening3.cc (1.3),
+	  tests/Polyhedron/bhz03widening4.cc (1.3),
+	  tests/Polyhedron/bhz03widening5.cc (1.3),
+	  tests/Polyhedron/bhz03widening6.cc (1.3),
+	  tests/Polyhedron/bounded1.cc (1.3),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.3),
+	  tests/Polyhedron/boundingbox1.cc (1.3),
+	  tests/Polyhedron/boundingbox2.cc (1.3),
+	  tests/Polyhedron/boundingbox3.cc (1.3),
+	  tests/Polyhedron/boundingbox4.cc (1.3),
+	  tests/Polyhedron/boundingbox5.cc (1.3),
+	  tests/Polyhedron/bounds1.cc (1.3), tests/Polyhedron/bounds2.cc
+	  (1.3), tests/Polyhedron/concatenate1.cc (1.3),
+	  tests/Polyhedron/concatenate2.cc (1.3),
+	  tests/Polyhedron/concatenate3.cc (1.3),
+	  tests/Polyhedron/concatenate4.cc (1.3),
+	  tests/Polyhedron/concatenate5.cc (1.3),
+	  tests/Polyhedron/concatenate6.cc (1.3),
+	  tests/Polyhedron/constraints1.cc (1.3),
+	  tests/Polyhedron/constraints2.cc (1.3),
+	  tests/Polyhedron/constraints3.cc (1.3),
+	  tests/Polyhedron/constraints4.cc (1.3),
+	  tests/Polyhedron/contains1.cc (1.3),
+	  tests/Polyhedron/contains2.cc (1.3),
+	  tests/Polyhedron/contains3.cc (1.3),
+	  tests/Polyhedron/contains4.cc (1.3),
+	  tests/Polyhedron/contains5.cc (1.3),
+	  tests/Polyhedron/disjoint1.cc (1.3),
+	  tests/Polyhedron/disjoint2.cc (1.3),
+	  tests/Polyhedron/disjoint3.cc (1.3),
+	  tests/Polyhedron/dualhypercubes.cc (1.3),
+	  tests/Polyhedron/empty1.cc (1.3), tests/Polyhedron/equals1.cc
+	  (1.3), tests/Polyhedron/exceptions1.cc (1.3),
+	  tests/Polyhedron/exceptions2.cc (1.3),
+	  tests/Polyhedron/exceptions3.cc (1.3),
+	  tests/Polyhedron/expandspacedim1.cc (1.3),
+	  tests/Polyhedron/expandspacedim2.cc (1.3),
+	  tests/Polyhedron/foldspacedims1.cc (1.3),
+	  tests/Polyhedron/foldspacedims2.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage10.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage11.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage12.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage3.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage4.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage5.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage6.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage7.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage8.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage9.cc (1.3),
+	  tests/Polyhedron/generators1.cc (1.3),
+	  tests/Polyhedron/generators2.cc (1.3),
+	  tests/Polyhedron/generators3.cc (1.3),
+	  tests/Polyhedron/generators4.cc (1.3),
+	  tests/Polyhedron/generators5.cc (1.3),
+	  tests/Polyhedron/generators6.cc (1.3),
+	  tests/Polyhedron/geomcovers1.cc (1.3),
+	  tests/Polyhedron/h79widening1.cc (1.3),
+	  tests/Polyhedron/h79widening2.cc (1.3),
+	  tests/Polyhedron/h79widening3.cc (1.3),
+	  tests/Polyhedron/h79widening4.cc (1.3),
+	  tests/Polyhedron/h79widening5.cc (1.3),
+	  tests/Polyhedron/h79widening6.cc (1.3),
+	  tests/Polyhedron/h79widening7.cc (1.3),
+	  tests/Polyhedron/h79widening8.cc (1.3),
+	  tests/Polyhedron/intersection1.cc (1.3),
+	  tests/Polyhedron/intersection10.cc (1.3),
+	  tests/Polyhedron/intersection11.cc (1.3),
+	  tests/Polyhedron/intersection2.cc (1.3),
+	  tests/Polyhedron/intersection3.cc (1.3),
+	  tests/Polyhedron/intersection4.cc (1.3),
+	  tests/Polyhedron/intersection5.cc (1.3),
+	  tests/Polyhedron/intersection6.cc (1.3),
+	  tests/Polyhedron/intersection7.cc (1.3),
+	  tests/Polyhedron/intersection8.cc (1.3),
+	  tests/Polyhedron/intersection9.cc (1.3),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.3),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.3),
+	  tests/Polyhedron/limitedh79extrapolation2.cc (1.3),
+	  tests/Polyhedron/limitedh79extrapolation3.cc (1.3),
+	  tests/Polyhedron/limitedh79extrapolation4.cc (1.3),
+	  tests/Polyhedron/linearpartition1.cc (1.3),
+	  tests/Polyhedron/linearpartition2.cc (1.3),
+	  tests/Polyhedron/linearpartition3.cc (1.3),
+	  tests/Polyhedron/linearpartition4.cc (1.3),
+	  tests/Polyhedron/linexpression1.cc (1.3),
+	  tests/Polyhedron/mapspacedims1.cc (1.3),
+	  tests/Polyhedron/mapspacedims2.cc (1.3),
+	  tests/Polyhedron/mapspacedims3.cc (1.3),
+	  tests/Polyhedron/mapspacedims4.cc (1.3),
+	  tests/Polyhedron/max_min1.cc (1.3), tests/Polyhedron/max_min2.cc
+	  (1.3), tests/Polyhedron/maxspacedim1.cc (1.3),
+	  tests/Polyhedron/mc91.cc (1.3), tests/Polyhedron/membytes1.cc
+	  (1.3), tests/Polyhedron/membytes2.cc (1.3),
+	  tests/Polyhedron/memory1.cc (1.3),
+	  tests/Polyhedron/minconstraints1.cc (1.3),
+	  tests/Polyhedron/minconstraints2.cc (1.3),
+	  tests/Polyhedron/minconstraints3.cc (1.3),
+	  tests/Polyhedron/minconstraints4.cc (1.3),
+	  tests/Polyhedron/mingenerators1.cc (1.3),
+	  tests/Polyhedron/mingenerators2.cc (1.3),
+	  tests/Polyhedron/mingenerators3.cc (1.3),
+	  tests/Polyhedron/onepoint.cc (1.3), tests/Polyhedron/permute.cc
+	  (1.3), tests/Polyhedron/polydifference1.cc (1.3),
+	  tests/Polyhedron/polydifference2.cc (1.3),
+	  tests/Polyhedron/polydifference3.cc (1.3),
+	  tests/Polyhedron/polydifference4.cc (1.3),
+	  tests/Polyhedron/polydifference5.cc (1.3),
+	  tests/Polyhedron/polydifference6.cc (1.3),
+	  tests/Polyhedron/polydifference7.cc (1.3),
+	  tests/Polyhedron/polydifference8.cc (1.3),
+	  tests/Polyhedron/polydifference9.cc (1.3),
+	  tests/Polyhedron/polyhull1.cc (1.3),
+	  tests/Polyhedron/polyhull10.cc (1.3),
+	  tests/Polyhedron/polyhull11.cc (1.3),
+	  tests/Polyhedron/polyhull2.cc (1.3),
+	  tests/Polyhedron/polyhull3.cc (1.3),
+	  tests/Polyhedron/polyhull4.cc (1.3),
+	  tests/Polyhedron/polyhull5.cc (1.3),
+	  tests/Polyhedron/polyhull6.cc (1.3),
+	  tests/Polyhedron/polyhull7.cc (1.3),
+	  tests/Polyhedron/polyhull8.cc (1.3),
+	  tests/Polyhedron/polyhull9.cc (1.3),
+	  tests/Polyhedron/randphull1.cc (1.3),
+	  tests/Polyhedron/randphull2.cc (1.3),
+	  tests/Polyhedron/relations1.cc (1.3),
+	  tests/Polyhedron/relations10.cc (1.3),
+	  tests/Polyhedron/relations11.cc (1.3),
+	  tests/Polyhedron/relations12.cc (1.3),
+	  tests/Polyhedron/relations13.cc (1.3),
+	  tests/Polyhedron/relations14.cc (1.3),
+	  tests/Polyhedron/relations15.cc (1.3),
+	  tests/Polyhedron/relations16.cc (1.3),
+	  tests/Polyhedron/relations17.cc (1.3),
+	  tests/Polyhedron/relations18.cc (1.3),
+	  tests/Polyhedron/relations19.cc (1.3),
+	  tests/Polyhedron/relations2.cc (1.3),
+	  tests/Polyhedron/relations3.cc (1.3),
+	  tests/Polyhedron/relations4.cc (1.3),
+	  tests/Polyhedron/relations5.cc (1.3),
+	  tests/Polyhedron/relations6.cc (1.3),
+	  tests/Polyhedron/relations7.cc (1.3),
+	  tests/Polyhedron/relations8.cc (1.3),
+	  tests/Polyhedron/relations9.cc (1.3),
+	  tests/Polyhedron/removespacedims1.cc (1.3),
+	  tests/Polyhedron/removespacedims10.cc (1.3),
+	  tests/Polyhedron/removespacedims2.cc (1.3),
+	  tests/Polyhedron/removespacedims3.cc (1.3),
+	  tests/Polyhedron/removespacedims4.cc (1.3),
+	  tests/Polyhedron/removespacedims5.cc (1.3),
+	  tests/Polyhedron/removespacedims6.cc (1.3),
+	  tests/Polyhedron/removespacedims7.cc (1.3),
+	  tests/Polyhedron/removespacedims8.cc (1.3),
+	  tests/Polyhedron/removespacedims9.cc (1.3),
+	  tests/Polyhedron/smm1.cc (1.3), tests/Polyhedron/timeelapse1.cc
+	  (1.3), tests/Polyhedron/timeelapse2.cc (1.3),
+	  tests/Polyhedron/timeelapse3.cc (1.3),
+	  tests/Polyhedron/timeelapse4.cc (1.3),
+	  tests/Polyhedron/timeelapse5.cc (1.3),
+	  tests/Polyhedron/timeelapse6.cc (1.3),
+	  tests/Polyhedron/timeelapse7.cc (1.3),
+	  tests/Polyhedron/timeelapse8.cc (1.3),
+	  tests/Polyhedron/timeelapse9.cc (1.3),
+	  tests/Polyhedron/topclosed1.cc (1.3),
+	  tests/Polyhedron/topclosed2.cc (1.3),
+	  tests/Polyhedron/topclosed3.cc (1.3),
+	  tests/Polyhedron/topclosure1.cc (1.3),
+	  tests/Polyhedron/topclosure2.cc (1.3),
+	  tests/Polyhedron/topclosure3.cc (1.3),
+	  tests/Polyhedron/topclosure4.cc (1.3),
+	  tests/Polyhedron/universe1.cc (1.3),
+	  tests/Polyhedron/universe2.cc (1.3),
+	  tests/Polyhedron/universe3.cc (1.3),
+	  tests/Polyhedron/universe4.cc (1.3),
+	  tests/Polyhedron/universe5.cc (1.3),
+	  tests/Polyhedron/universe6.cc (1.3),
+	  tests/Polyhedron/universe7.cc (1.3),
+	  tests/Polyhedron/watchdog1.cc (1.3),
+	  tests/Polyhedron/writeconsys1.cc (1.3),
+	  tests/Polyhedron/writegensys1.cc (1.3),
+	  tests/Polyhedron/writegensys2.cc (1.3),
+	  tests/Polyhedron/writegensys3.cc (1.3),
+	  tests/Polyhedron/writepolyhedron1.cc (1.3),
+	  tests/Polyhedron/writepolyhedron2.cc (1.3),
+	  tests/Polyhedron/writepolyhedron3.cc (1.3),
+	  tests/Polyhedron/writerelation1.cc (1.3),
+	  tests/Polyhedron/writevariable1.cc (1.3), utils/Makefile.am
+	  (1.2), utils/timings.cc (1.2), utils/timings.hh (1.2): Copyright
+	  years extended.
+
+2004-12-31 Friday 23:36  Abramo Bagnara
+
+	* src/: Extended_Number.inlines.hh (1.4), checked_ext.inlines.hh
+	  (1.4), checked_float.inlines.hh (1.17): Added comparison and
+	  arithmetic binary operators.
+
+2004-12-31 Friday 23:36  Abramo Bagnara
+
+	* src/Result.defs.hh (1.6): Added V_INF_DIV_INF.
+
+2004-12-31 Friday 19:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.3): Added membytes2 to
+	  XFAIL_WITH_INT8_A.
+
+2004-12-31 Friday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.6): ConSys renamed to Constraint_System in
+	  comments and error messages.
+
+2004-12-31 Friday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_int16_a (1.2), expected_int32 (1.3),
+	  expected_int32_a (1.3), expected_int64 (1.3), expected_int64_a
+	  (1.3): Adapted to recent changes in ppl_lpsol.
+
+2004-12-31 Friday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_int8 (1.2), tests/expected_int8
+	  (1.2): Adapted to the recent changes in the implementation of
+	  checked numbers.
+
+2004-12-31 Friday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected2_int16_a (1.2),
+	  XSB/expected_int8_a (1.2), tests/expected2_int16_a (1.2),
+	  tests/expected_int8_a (1.2): Adapted to the recent changes in the
+	  implementation of checked numbers.
+
+2004-12-31 Friday 13:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected2_int16 (1.3): Adapted to the
+	  recent changes in the implementation of checked numbers.
+
+2004-12-31 Friday 13:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected2_int16 (1.3): Adapted to the
+	  recent changes in the implementation of checked numbers.
+
+2004-12-31 Friday 13:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.39),
+	  interfaces/Prolog/GNU/Makefile.am (1.43),
+	  interfaces/Prolog/SICStus/Makefile.am (1.50),
+	  interfaces/Prolog/SWI/Makefile.am (1.44),
+	  interfaces/Prolog/XSB/Makefile.am (1.31),
+	  demos/ppl_lcdd/Makefile.am (1.18), demos/ppl_lpsol/Makefile.am
+	  (1.11), interfaces/Prolog/YAP/Makefile.am (1.34): When checking
+	  for differences between the obtained and the expected output, use
+	  `diff -u' instead of `diff -q'.
+
+2004-12-31 Friday 13:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.5): Comment fixed.
+
+2004-12-31 Friday 09:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.4): Variable-length automatic arrays are not
+	  (yet) standard in C++: use vectors instead.
+
+2004-12-31 Friday 08:57  Abramo Bagnara
+
+	* src/: Checked_Number.inlines.hh (1.14),
+	  Extended_Number.inlines.hh (1.3), Result.defs.hh (1.5),
+	  Result.inlines.hh (1.4), checked_ext.inlines.hh (1.3),
+	  checked_float.inlines.hh (1.16), checked_int.inlines.hh (1.15),
+	  checked_mpq.inlines.hh (1.7), checked_mpz.inlines.hh (1.8):
+	  Discriminate between special values sources.
+
+2004-12-30 Thursday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz_a (1.3): Adapted to the recent
+	  changes to ppl_lpsol.
+
+2004-12-30 Thursday 16:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.100): Avoid a couple of long lines.
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.138), demos/ppl_lpsol/Makefile.am (1.10),
+	  demos/ppl_lpsol/examples/Makefile.am (1.2),
+	  demos/ppl_lpsol/examples/adlittle.mps (1.1),
+	  demos/ppl_lpsol/examples/blend.mps (1.1),
+	  demos/ppl_lpsol/examples/boeing1.mps (1.1),
+	  demos/ppl_lpsol/examples/boeing2.mps (1.1),
+	  demos/ppl_lpsol/examples/kb2.mps (1.1),
+	  demos/ppl_lpsol/examples/mip.mps (1.1),
+	  demos/ppl_lpsol/examples/sc105.mps (1.1),
+	  demos/ppl_lpsol/examples/sc50a.mps (1.1),
+	  demos/ppl_lpsol/examples/sc50b.mps (1.1),
+	  demos/ppl_lpsol/examples/ship08l.mps (1.1): New examples to test
+	  the simplex solver.
+
+2004-12-30 Thursday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.11), interfaces/C/ppl_c.cc
+	  (1.127), src/Constraint_System.defs.hh (1.7), src/simplex.cc
+	  (1.3): The simplex solver now returns a Simplex_Status instead of
+	  a bool.
+
+2004-12-30 Thursday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.108): In
+	  Polyhedron::map_space_dimensions(const Partial_Function& pfunc)
+	  we no longer completely trust the (user-provided) partial
+	  function `pfunc'.  Compiler warning silenced.
+
+2004-12-30 Thursday 15:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.152): Fixed
+	  term_to_Coefficient(Prolog_term_ref t).
+
+2004-12-30 Thursday 15:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.52), Determinate.inlines.hh (1.45):
+	  All methods that are specific to the Polyhedra tempplate
+	  parameter have been dropped. If needed, they can still be invoked
+	  through element().
+
+2004-12-30 Thursday 15:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.inlines.hh (1.53): Minor documentation improvement.
+
+2004-12-30 Thursday 15:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.16): Use element() to access
+	  those methods that are specific to the Polyhedron class.
+
+2004-12-30 Thursday 15:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Powerset.defs.hh (1.9): Minor documentation improvements.
+
+2004-12-30 Thursday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.107): Error messages fixed.
+
+2004-12-30 Thursday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Powerset.defs.hh (1.8), Powerset.inlines.hh (1.8): Added
+	  mixed comparison operators for iterator and const_iterator.
+	  Drafted some documentation with an iterator's usage example.
+
+2004-12-30 Thursday 11:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.126), ppl_c.h.in (1.45): Added support
+	  for simplex solver status to the C interface.
+
+2004-12-30 Thursday 09:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh (1.15): New enum Simplex_Status to represent
+	  the possible outcomes of a simplex solver.
+
+2004-12-30 Thursday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.10): Redundant print statement
+	  removed.
+
+2004-12-30 Thursday 08:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz (1.3): The objective function is now
+	  printed even if the problem is unfeasible.
+
+2004-12-29 Wednesday 21:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.defs.hh (1.13),
+	  Polyhedra_Powerset.inlines.hh (1.15), Powerset.defs.hh (1.7),
+	  Powerset.inlines.hh (1.7), algorithms.hh (1.38): Added support
+	  for the consident use of bidirectional iterators (iterator,
+	  const_iterator, reverse_iterator, const_reverse_iterator) for the
+	  class Powerset. The new iterators replace the low-level ones on
+	  the sequence of disjuncts, which are now protected and were not
+	  enforcing the consistency of the reduced flag. All the new
+	  iterators only provide read-only access to the disjuncts in a
+	  Powerset element.  It is possible to drop elements form the
+	  sequence (but not to directly modify them) by using `iterator' in
+	  conjunction with Powerset<CS> methods drop_disjunct(),
+	  drop_disjuncts() and clear().
+
+2004-12-29 Wednesday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.9): Optionally use the simplex
+	  method.
+
+2004-12-29 Wednesday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.137), interfaces/C/ppl_c.cc (1.125),
+	  interfaces/C/ppl_c.h.in (1.44): Temporary interfaces to our new
+	  simplex method added.
+
+2004-12-29 Wednesday 21:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.149): Announced the recent changes to Constraint and
+	  Generator.
+
+2004-12-29 Wednesday 21:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Result.defs.hh (1.4), Rounding.defs.hh (1.3): Avoid
+	  trailing commas: they are non standard.
+
+2004-12-29 Wednesday 18:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.2): Include "Constraint_System.inlines.hh".
+
+2004-12-29 Wednesday 17:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint_System.defs.hh (1.6), Makefile.am (1.98),
+	  Matrix.defs.hh (1.67), simplex.cc (1.1): Several methods of
+	  Matrix are now public instead of protected.  Added a first, very
+	  rough implementation of Constraint_System::primal_simplex().
+
+2004-12-29 Wednesday 16:45  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (1.14): Prefer esplicit overflow
+	  result.
+
+2004-12-29 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.17): Added Maximiliano Marchesi and Andrea Cimino.
+	  Updated the contribution of Abramo.  Other minor improvements.
+
+2004-12-29 Wednesday 14:47  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.13): Don't throw exception when
+	  exactness of result is not checked.
+
+2004-12-29 Wednesday 14:45  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (1.13): Return overflow Result when
+	  Rounding direction is IGNORE.
+
+2004-12-29 Wednesday 11:06  Abramo Bagnara
+
+	* src/: checked.defs.hh (1.8), checked_int.inlines.hh (1.12),
+	  checked_mpz.inlines.hh (1.7): Don't compute relation with exact
+	  result if choosen rounding direction is IGNORE
+
+2004-12-29 Wednesday 08:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Result.inlines.hh (1.3): Comment fixed.  Indentation fixed.
+	  Use assert(false) instead of assert(0).  Include <cassert>.
+
+2004-12-29 Wednesday 08:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Result.defs.hh (1.3): Comment fixed.
+
+2004-12-29 Wednesday 08:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.3): Added ascii_dump_load1.dat and
+	  ascii_dump_load2.dat to MOSTLYCLEANFILES.
+
+2004-12-29 Wednesday 08:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.3): Typo fixed.
+
+2004-12-29 Wednesday 00:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (altnum.3): Typos fixed.
+
+2004-12-28 Tuesday 23:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.12): Reflect the fact that the `gmp' option
+	  for `--enable-coefficients' has been renamed `mpz'.
+
+2004-12-28 Tuesday 23:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.148): Mention the fact that one of the possible values
+	  for the configuration option `--enable-coefficients' has been
+	  renamed from `gmp' to `mpz'.
+
+2004-12-28 Tuesday 22:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.16), configure.ac (1.155), demos/ppl_lcdd/ppl_lcdd.cc
+	  (1.40), interfaces/C/ppl_c.cc (1.124),
+	  interfaces/Prolog/ppl_prolog.icc (1.151),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.29),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.25),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.72),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.96),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.63),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.88), src/BDS_Status.idefs.hh
+	  (1.2), src/BDS_Status.inlines.hh (1.2), src/BD_Shape.defs.hh
+	  (1.2), src/BD_Shape.inlines.hh (1.2), src/BD_Shape.types.hh
+	  (1.2), src/Checked_Number.defs.hh (1.7),
+	  src/Checked_Number.inlines.hh (1.12), src/DB_Matrix.defs.hh
+	  (1.2), src/DB_Matrix.inlines.hh (1.2), src/DB_Matrix.types.hh
+	  (1.2), src/DB_Row.defs.hh (1.2), src/DB_Row.inlines.hh (1.2),
+	  src/DB_Row.types.hh (1.2), src/E_NIT.defs.hh (1.2),
+	  src/E_NIT.inlines.hh (1.2), src/E_NIT.types.hh (1.2),
+	  src/E_Rational.defs.hh (1.2), src/E_Rational.inlines.hh (1.2),
+	  src/E_Rational.types.hh (1.2), src/Extended_Number.defs.hh (1.2),
+	  src/Extended_Number.inlines.hh (1.2),
+	  src/Extended_Number.types.hh (1.2), src/Float.defs.hh (1.2),
+	  src/Float.inlines.hh (1.2), src/Interval.inlines.hh (1.17),
+	  src/Limits.hh (1.4), src/Makefile.am (1.97),
+	  src/Numeric_Format.defs.hh (1.2), src/Polyhedron_nonpublic.cc
+	  (1.42), src/Ptr_Iterator.defs.hh (1.2),
+	  src/Ptr_Iterator.inlines.hh (1.2), src/Ptr_Iterator.types.hh
+	  (1.2), src/Result.defs.hh (1.2), src/Result.inlines.hh (1.2),
+	  src/Rounding.defs.hh (1.2), src/Rounding.inlines.hh (1.2),
+	  src/Rounding.types.hh (1.2), src/checked.defs.hh (1.7),
+	  src/checked.inlines.hh (1.5), src/checked_ext.defs.hh (1.2),
+	  src/checked_ext.inlines.hh (1.2), src/checked_float.inlines.hh
+	  (1.15), src/checked_int.inlines.hh (1.11),
+	  src/checked_mpq.inlines.hh (1.6), src/checked_mpz.inlines.hh
+	  (1.6), src/compiler.hh (1.2), src/float.types.hh (1.6),
+	  src/fpu-c99.inlines.hh (1.2), src/fpu-ia32.inlines.hh (1.2),
+	  src/fpu.defs.hh (1.2), src/globals.defs.hh (1.14),
+	  src/globals.inlines.hh (1.7), tests/.cvsignore (1.11),
+	  tests/CbecomesNNC1.cc (1.7), tests/Makefile.am (1.241),
+	  tests/NNCbecomesC1.cc (1.2), tests/NNCminimize1.cc (1.13),
+	  tests/NNCminimize2.cc (1.13), tests/NNCminimize3.cc (1.13),
+	  tests/NNCminimize4.cc (1.14), tests/NNCminimize5.cc (1.13),
+	  tests/NNCminimize6.cc (1.13), tests/README (1.3),
+	  tests/addconstraint1.cc (1.8), tests/addconstraint2.cc (1.5),
+	  tests/addconstraint3.cc (1.5), tests/addconstraints1.cc (1.14),
+	  tests/addconstraints10.cc (1.12), tests/addconstraints11.cc
+	  (1.13), tests/addconstraints12.cc (1.6),
+	  tests/addconstraints13.cc (1.8), tests/addconstraints2.cc (1.21),
+	  tests/addconstraints3.cc (1.12), tests/addconstraints4.cc (1.13),
+	  tests/addconstraints5.cc (1.14), tests/addconstraints6.cc (1.15),
+	  tests/addconstraints7.cc (1.14), tests/addconstraints8.cc (1.15),
+	  tests/addconstraints9.cc (1.16), tests/addgenerator1.cc (1.10),
+	  tests/addgenerator2.cc (1.10), tests/addgenerator3.cc (1.6),
+	  tests/addgenerator4.cc (1.8), tests/addgenerator5.cc (1.3),
+	  tests/addgenerators1.cc (1.14), tests/addgenerators10.cc (1.6),
+	  tests/addgenerators11.cc (1.11), tests/addgenerators12.cc (1.8),
+	  tests/addgenerators13.cc (1.4), tests/addgenerators2.cc (1.14),
+	  tests/addgenerators3.cc (1.14), tests/addgenerators4.cc (1.14),
+	  tests/addgenerators5.cc (1.14), tests/addgenerators6.cc (1.14),
+	  tests/addgenerators7.cc (1.11), tests/addgenerators8.cc (1.9),
+	  tests/addgenerators9.cc (1.8), tests/addspacedims1.cc (1.3),
+	  tests/addspacedims10.cc (1.4), tests/addspacedims11.cc (1.3),
+	  tests/addspacedims12.cc (1.2), tests/addspacedims13.cc (1.2),
+	  tests/addspacedims2.cc (1.2), tests/addspacedims3.cc (1.4),
+	  tests/addspacedims4.cc (1.3), tests/addspacedims5.cc (1.3),
+	  tests/addspacedims6.cc (1.3), tests/addspacedims7.cc (1.3),
+	  tests/addspacedims8.cc (1.2), tests/addspacedims9.cc (1.3),
+	  tests/affineimage1.cc (1.13), tests/affineimage2.cc (1.12),
+	  tests/affineimage3.cc (1.6), tests/affineimage4.cc (1.5),
+	  tests/affineimage5.cc (1.6), tests/affineimage6.cc (1.5),
+	  tests/affineimage7.cc (1.6), tests/affineimage8.cc (1.9),
+	  tests/affineimage9.cc (1.3), tests/affinepreimage1.cc (1.13),
+	  tests/affinepreimage10.cc (1.9), tests/affinepreimage2.cc (1.12),
+	  tests/affinepreimage3.cc (1.12), tests/affinepreimage4.cc (1.14),
+	  tests/affinepreimage5.cc (1.5), tests/affinepreimage6.cc (1.6),
+	  tests/affinepreimage7.cc (1.6), tests/affinepreimage8.cc (1.5),
+	  tests/affinepreimage9.cc (1.6), tests/affinetrans.cc (1.17),
+	  tests/append1.cc (1.24), tests/append2.cc (1.24),
+	  tests/ascii_dump_load1.cc (1.14), tests/ascii_dump_load2.cc
+	  (1.12), tests/ascii_dump_load3.cc (1.15),
+	  tests/ascii_dump_load4.cc (1.16), tests/ascii_dump_load5.cc
+	  (1.11), tests/ascii_dump_load6.cc (1.8),
+	  tests/ascii_dump_load7.cc (1.9), tests/bgp99extrapolation1.cc
+	  (1.8), tests/bgp99extrapolation2.cc (1.9),
+	  tests/bhrz03widening1.cc (1.6), tests/bhrz03widening10.cc (1.5),
+	  tests/bhrz03widening11.cc (1.5), tests/bhrz03widening12.cc (1.6),
+	  tests/bhrz03widening13.cc (1.7), tests/bhrz03widening14.cc (1.9),
+	  tests/bhrz03widening15.cc (1.10), tests/bhrz03widening16.cc
+	  (1.6), tests/bhrz03widening17.cc (1.6), tests/bhrz03widening18.cc
+	  (1.6), tests/bhrz03widening19.cc (1.6), tests/bhrz03widening2.cc
+	  (1.8), tests/bhrz03widening3.cc (1.7), tests/bhrz03widening4.cc
+	  (1.5), tests/bhrz03widening5.cc (1.5), tests/bhrz03widening6.cc
+	  (1.7), tests/bhrz03widening7.cc (1.7), tests/bhrz03widening8.cc
+	  (1.6), tests/bhrz03widening9.cc (1.9), tests/bhz03widening1.cc
+	  (1.9), tests/bhz03widening2.cc (1.11), tests/bhz03widening3.cc
+	  (1.10), tests/bhz03widening4.cc (1.7), tests/bhz03widening5.cc
+	  (1.8), tests/bhz03widening6.cc (1.9), tests/bounded1.cc (1.15),
+	  tests/boundedh79extrapolation1.cc (1.3), tests/boundingbox1.cc
+	  (1.40), tests/boundingbox2.cc (1.24), tests/boundingbox3.cc
+	  (1.16), tests/boundingbox4.cc (1.13), tests/boundingbox5.cc
+	  (1.3), tests/bounds1.cc (1.8), tests/bounds2.cc (1.7),
+	  tests/concatenate1.cc (1.11), tests/concatenate2.cc (1.10),
+	  tests/concatenate3.cc (1.9), tests/concatenate4.cc (1.8),
+	  tests/concatenate5.cc (1.5), tests/concatenate6.cc (1.7),
+	  tests/constraints1.cc (1.8), tests/constraints2.cc (1.8),
+	  tests/constraints3.cc (1.9), tests/constraints4.cc (1.8),
+	  tests/contains1.cc (1.6), tests/contains2.cc (1.5),
+	  tests/contains3.cc (1.5), tests/contains4.cc (1.4),
+	  tests/contains5.cc (1.4), tests/disjoint1.cc (1.8),
+	  tests/disjoint2.cc (1.11), tests/disjoint3.cc (1.11),
+	  tests/dualhypercubes.cc (1.10), tests/empty1.cc (1.16),
+	  tests/equals1.cc (1.2), tests/exceptions1.cc (1.44),
+	  tests/exceptions2.cc (1.38), tests/exceptions3.cc (1.6),
+	  tests/expandspacedim1.cc (1.4), tests/expandspacedim2.cc (1.2),
+	  tests/foldspacedims1.cc (1.3), tests/foldspacedims2.cc (1.3),
+	  tests/generalizedaffineimage1.cc (1.9),
+	  tests/generalizedaffineimage10.cc (1.8),
+	  tests/generalizedaffineimage11.cc (1.7),
+	  tests/generalizedaffineimage12.cc (1.6),
+	  tests/generalizedaffineimage2.cc (1.8),
+	  tests/generalizedaffineimage3.cc (1.9),
+	  tests/generalizedaffineimage4.cc (1.7),
+	  tests/generalizedaffineimage5.cc (1.7),
+	  tests/generalizedaffineimage6.cc (1.7),
+	  tests/generalizedaffineimage7.cc (1.9),
+	  tests/generalizedaffineimage8.cc (1.7),
+	  tests/generalizedaffineimage9.cc (1.9), tests/generators1.cc
+	  (1.17), tests/generators2.cc (1.13), tests/generators3.cc (1.7),
+	  tests/generators4.cc (1.8), tests/generators5.cc (1.7),
+	  tests/generators6.cc (1.8), tests/geomcovers1.cc (1.3),
+	  tests/h79widening1.cc (1.7), tests/h79widening2.cc (1.8),
+	  tests/h79widening3.cc (1.8), tests/h79widening4.cc (1.6),
+	  tests/h79widening5.cc (1.6), tests/h79widening6.cc (1.8),
+	  tests/h79widening7.cc (1.4), tests/h79widening8.cc (1.3),
+	  tests/intersection1.cc (1.7), tests/intersection10.cc (1.7),
+	  tests/intersection11.cc (1.7), tests/intersection2.cc (1.13),
+	  tests/intersection3.cc (1.8), tests/intersection4.cc (1.9),
+	  tests/intersection5.cc (1.8), tests/intersection6.cc (1.9),
+	  tests/intersection7.cc (1.7), tests/intersection8.cc (1.6),
+	  tests/intersection9.cc (1.6),
+	  tests/limitedbhrz03extrapolation1.cc (1.6),
+	  tests/limitedh79extrapolation1.cc (1.5),
+	  tests/limitedh79extrapolation2.cc (1.5),
+	  tests/limitedh79extrapolation3.cc (1.6),
+	  tests/limitedh79extrapolation4.cc (1.6),
+	  tests/linearpartition1.cc (1.16), tests/linearpartition2.cc
+	  (1.16), tests/linearpartition3.cc (1.16),
+	  tests/linearpartition4.cc (1.4), tests/linexpression1.cc (1.6),
+	  tests/mapspacedims1.cc (1.3), tests/mapspacedims2.cc (1.2),
+	  tests/mapspacedims3.cc (1.2), tests/mapspacedims4.cc (1.2),
+	  tests/max_min1.cc (1.7), tests/max_min2.cc (1.7),
+	  tests/maxspacedim1.cc (1.6), tests/mc91.cc (1.16),
+	  tests/membytes1.cc (1.8), tests/membytes2.cc (1.4),
+	  tests/memory1.cc (1.24), tests/minconstraints1.cc (1.7),
+	  tests/minconstraints2.cc (1.7), tests/minconstraints3.cc (1.6),
+	  tests/minconstraints4.cc (1.10), tests/mingenerators1.cc (1.7),
+	  tests/mingenerators2.cc (1.6), tests/mingenerators3.cc (1.6),
+	  tests/onepoint.cc (1.11), tests/permute.cc (1.33),
+	  tests/polydifference1.cc (1.11), tests/polydifference2.cc (1.12),
+	  tests/polydifference3.cc (1.7), tests/polydifference4.cc (1.6),
+	  tests/polydifference5.cc (1.7), tests/polydifference6.cc (1.7),
+	  tests/polydifference7.cc (1.6), tests/polydifference8.cc (1.5),
+	  tests/polydifference9.cc (1.7), tests/polyhull1.cc (1.10),
+	  tests/polyhull10.cc (1.6), tests/polyhull11.cc (1.3),
+	  tests/polyhull2.cc (1.9), tests/polyhull3.cc (1.8),
+	  tests/polyhull4.cc (1.7), tests/polyhull5.cc (1.6),
+	  tests/polyhull6.cc (1.6), tests/polyhull7.cc (1.6),
+	  tests/polyhull8.cc (1.6), tests/polyhull9.cc (1.7),
+	  tests/ppl_test.hh (1.5), tests/randphull1.cc (1.14),
+	  tests/randphull2.cc (1.11), tests/relations1.cc (1.12),
+	  tests/relations10.cc (1.7), tests/relations11.cc (1.7),
+	  tests/relations12.cc (1.7), tests/relations13.cc (1.6),
+	  tests/relations14.cc (1.6), tests/relations15.cc (1.7),
+	  tests/relations16.cc (1.7), tests/relations17.cc (1.10),
+	  tests/relations18.cc (1.6), tests/relations19.cc (1.7),
+	  tests/relations2.cc (1.12), tests/relations3.cc (1.12),
+	  tests/relations4.cc (1.13), tests/relations5.cc (1.13),
+	  tests/relations6.cc (1.11), tests/relations7.cc (1.12),
+	  tests/relations8.cc (1.12), tests/relations9.cc (1.15),
+	  tests/removespacedims1.cc (1.3), tests/removespacedims10.cc
+	  (1.2), tests/removespacedims2.cc (1.4), tests/removespacedims3.cc
+	  (1.2), tests/removespacedims4.cc (1.3), tests/removespacedims5.cc
+	  (1.2), tests/removespacedims6.cc (1.2), tests/removespacedims7.cc
+	  (1.2), tests/removespacedims8.cc (1.3), tests/removespacedims9.cc
+	  (1.2), tests/smm1.cc (1.18), tests/timeelapse1.cc (1.10),
+	  tests/timeelapse2.cc (1.9), tests/timeelapse3.cc (1.11),
+	  tests/timeelapse4.cc (1.10), tests/timeelapse5.cc (1.10),
+	  tests/timeelapse6.cc (1.6), tests/timeelapse7.cc (1.5),
+	  tests/timeelapse8.cc (1.6), tests/timeelapse9.cc (1.2),
+	  tests/topclosed1.cc (1.8), tests/topclosed2.cc (1.8),
+	  tests/topclosed3.cc (1.10), tests/topclosure1.cc (1.9),
+	  tests/topclosure2.cc (1.5), tests/topclosure3.cc (1.5),
+	  tests/topclosure4.cc (1.7), tests/universe1.cc (1.11),
+	  tests/universe2.cc (1.12), tests/universe3.cc (1.13),
+	  tests/universe4.cc (1.13), tests/universe5.cc (1.13),
+	  tests/universe6.cc (1.12), tests/universe7.cc (1.3),
+	  tests/valgrind_suppressions (1.2), tests/watchdog1.cc (1.22),
+	  tests/writeconsys1.cc (1.10), tests/writegensys1.cc (1.10),
+	  tests/writegensys2.cc (1.10), tests/writegensys3.cc (1.10),
+	  tests/writepolyhedron1.cc (1.8), tests/writepolyhedron2.cc (1.9),
+	  tests/writepolyhedron3.cc (1.8), tests/writerelation1.cc (1.8),
+	  tests/writevariable1.cc (1.11), tests/BD_Shape/.cvsignore (1.2),
+	  tests/BD_Shape/Makefile.am (1.2),
+	  tests/BD_Shape/addconstraints1.cc (1.2),
+	  tests/BD_Shape/addspacedims1.cc (1.2),
+	  tests/BD_Shape/addspacedims2.cc (1.2),
+	  tests/BD_Shape/addspacedims3.cc (1.2),
+	  tests/BD_Shape/addspacedims4.cc (1.2),
+	  tests/BD_Shape/addspacedims5.cc (1.2),
+	  tests/BD_Shape/addspacedims6.cc (1.2),
+	  tests/BD_Shape/addspacedims7.cc (1.2),
+	  tests/BD_Shape/affineimage1.cc (1.2),
+	  tests/BD_Shape/affineimage2.cc (1.2),
+	  tests/BD_Shape/affineimage3.cc (1.2),
+	  tests/BD_Shape/affineimage4.cc (1.2),
+	  tests/BD_Shape/affineimage5.cc (1.2),
+	  tests/BD_Shape/affineimage6.cc (1.2),
+	  tests/BD_Shape/affineimage7.cc (1.2),
+	  tests/BD_Shape/affinepreimage1.cc (1.2),
+	  tests/BD_Shape/affinepreimage2.cc (1.2),
+	  tests/BD_Shape/affinepreimage3.cc (1.2),
+	  tests/BD_Shape/affinepreimage4.cc (1.2),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.2),
+	  tests/BD_Shape/ascii_dump_load2.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation2.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation3.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation4.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation5.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation6.cc (1.2),
+	  tests/BD_Shape/cc76narrowing1.cc (1.2),
+	  tests/BD_Shape/cc76narrowing2.cc (1.2),
+	  tests/BD_Shape/cc76narrowing3.cc (1.2),
+	  tests/BD_Shape/cc76narrowing4.cc (1.2),
+	  tests/BD_Shape/cc76narrowing5.cc (1.2),
+	  tests/BD_Shape/ch78widening1.cc (1.2),
+	  tests/BD_Shape/ch78widening2.cc (1.2),
+	  tests/BD_Shape/ch78widening3.cc (1.2),
+	  tests/BD_Shape/ch78widening4.cc (1.2),
+	  tests/BD_Shape/ch78widening5.cc (1.2),
+	  tests/BD_Shape/ch78widening6.cc (1.2),
+	  tests/BD_Shape/ch78widening7.cc (1.2),
+	  tests/BD_Shape/ch78widening8.cc (1.2),
+	  tests/BD_Shape/concatenate1.cc (1.2),
+	  tests/BD_Shape/concatenate2.cc (1.2),
+	  tests/BD_Shape/concatenate3.cc (1.2),
+	  tests/BD_Shape/concatenate4.cc (1.2),
+	  tests/BD_Shape/concatenate5.cc (1.2),
+	  tests/BD_Shape/constraints1.cc (1.2),
+	  tests/BD_Shape/constraints2.cc (1.2), tests/BD_Shape/contains1.cc
+	  (1.2), tests/BD_Shape/contains2.cc (1.2),
+	  tests/BD_Shape/contains3.cc (1.2), tests/BD_Shape/empty1.cc
+	  (1.2), tests/BD_Shape/empty2.cc (1.2), tests/BD_Shape/empty3.cc
+	  (1.2), tests/BD_Shape/empty4.cc (1.2),
+	  tests/BD_Shape/equality1.cc (1.2), tests/BD_Shape/exceptions1.cc
+	  (1.2), tests/BD_Shape/exceptions2.cc (1.2),
+	  tests/BD_Shape/exceptions3.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage10.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage11.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage12.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage3.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage4.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage5.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage6.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage7.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage8.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage9.cc (1.2),
+	  tests/BD_Shape/h79widening1.cc (1.2),
+	  tests/BD_Shape/intersection1.cc (1.2),
+	  tests/BD_Shape/intersection2.cc (1.2),
+	  tests/BD_Shape/intersection3.cc (1.2),
+	  tests/BD_Shape/intersection4.cc (1.2),
+	  tests/BD_Shape/intersection5.cc (1.2),
+	  tests/BD_Shape/intersection6.cc (1.2),
+	  tests/BD_Shape/intersection7.cc (1.2),
+	  tests/BD_Shape/intersection8.cc (1.2),
+	  tests/BD_Shape/limitedCC76extrapolation1.cc (1.2),
+	  tests/BD_Shape/limitedCC76extrapolation2.cc (1.2),
+	  tests/BD_Shape/limitedCC76extrapolation3.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation1.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation2.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation3.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation4.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation5.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation6.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation7.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation8.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation9.cc (1.2),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.2),
+	  tests/BD_Shape/mapspacedims1.cc (1.2),
+	  tests/BD_Shape/mapspacedims2.cc (1.2),
+	  tests/BD_Shape/mapspacedims3.cc (1.2),
+	  tests/BD_Shape/mapspacedims4.cc (1.2),
+	  tests/BD_Shape/maxspacedim.cc (1.2),
+	  tests/BD_Shape/polydifference1.cc (1.2),
+	  tests/BD_Shape/polydifference2.cc (1.2),
+	  tests/BD_Shape/polydifference3.cc (1.2),
+	  tests/BD_Shape/polydifference4.cc (1.2),
+	  tests/BD_Shape/polydifference5.cc (1.2),
+	  tests/BD_Shape/polydifference6.cc (1.2),
+	  tests/BD_Shape/polyhull1.cc (1.2), tests/BD_Shape/polyhull2.cc
+	  (1.2), tests/BD_Shape/polyhull3.cc (1.2),
+	  tests/BD_Shape/polyhull4.cc (1.2), tests/BD_Shape/relations1.cc
+	  (1.2), tests/BD_Shape/relations2.cc (1.2),
+	  tests/BD_Shape/relations3.cc (1.2), tests/BD_Shape/relations4.cc
+	  (1.2), tests/BD_Shape/relations5.cc (1.2),
+	  tests/BD_Shape/removespacedims1.cc (1.2),
+	  tests/BD_Shape/removespacedims2.cc (1.2),
+	  tests/BD_Shape/removespacedims3.cc (1.2),
+	  tests/BD_Shape/timeelapse1.cc (1.2),
+	  tests/BD_Shape/timeelapse2.cc (1.2),
+	  tests/BD_Shape/timeelapse3.cc (1.2),
+	  tests/BD_Shape/timeelapse4.cc (1.2),
+	  tests/BD_Shape/timeelapse5.cc (1.2), tests/BD_Shape/universe1.cc
+	  (1.2), tests/BD_Shape/writebdiffs1.cc (1.2),
+	  tests/BD_Shape/writebdiffs2.cc (1.2), tests/Polyhedron/.cvsignore
+	  (1.2), tests/Polyhedron/CbecomesNNC1.cc (1.2),
+	  tests/Polyhedron/Makefile.am (1.2),
+	  tests/Polyhedron/NNCbecomesC1.cc (1.2),
+	  tests/Polyhedron/NNCminimize1.cc (1.2),
+	  tests/Polyhedron/NNCminimize2.cc (1.2),
+	  tests/Polyhedron/NNCminimize3.cc (1.2),
+	  tests/Polyhedron/NNCminimize4.cc (1.2),
+	  tests/Polyhedron/NNCminimize5.cc (1.2),
+	  tests/Polyhedron/NNCminimize6.cc (1.2), tests/Polyhedron/README
+	  (1.2), tests/Polyhedron/addconstraint1.cc (1.2),
+	  tests/Polyhedron/addconstraint2.cc (1.2),
+	  tests/Polyhedron/addconstraint3.cc (1.2),
+	  tests/Polyhedron/addconstraints1.cc (1.2),
+	  tests/Polyhedron/addconstraints10.cc (1.2),
+	  tests/Polyhedron/addconstraints11.cc (1.2),
+	  tests/Polyhedron/addconstraints12.cc (1.2),
+	  tests/Polyhedron/addconstraints13.cc (1.2),
+	  tests/Polyhedron/addconstraints2.cc (1.2),
+	  tests/Polyhedron/addconstraints3.cc (1.2),
+	  tests/Polyhedron/addconstraints4.cc (1.2),
+	  tests/Polyhedron/addconstraints5.cc (1.2),
+	  tests/Polyhedron/addconstraints6.cc (1.2),
+	  tests/Polyhedron/addconstraints7.cc (1.2),
+	  tests/Polyhedron/addconstraints8.cc (1.2),
+	  tests/Polyhedron/addconstraints9.cc (1.2),
+	  tests/Polyhedron/addgenerator1.cc (1.2),
+	  tests/Polyhedron/addgenerator2.cc (1.2),
+	  tests/Polyhedron/addgenerator3.cc (1.2),
+	  tests/Polyhedron/addgenerator4.cc (1.2),
+	  tests/Polyhedron/addgenerator5.cc (1.2),
+	  tests/Polyhedron/addgenerators1.cc (1.2),
+	  tests/Polyhedron/addgenerators10.cc (1.2),
+	  tests/Polyhedron/addgenerators11.cc (1.2),
+	  tests/Polyhedron/addgenerators12.cc (1.2),
+	  tests/Polyhedron/addgenerators13.cc (1.2),
+	  tests/Polyhedron/addgenerators2.cc (1.2),
+	  tests/Polyhedron/addgenerators3.cc (1.2),
+	  tests/Polyhedron/addgenerators4.cc (1.2),
+	  tests/Polyhedron/addgenerators5.cc (1.2),
+	  tests/Polyhedron/addgenerators6.cc (1.2),
+	  tests/Polyhedron/addgenerators7.cc (1.2),
+	  tests/Polyhedron/addgenerators8.cc (1.2),
+	  tests/Polyhedron/addgenerators9.cc (1.2),
+	  tests/Polyhedron/addspacedims1.cc (1.2),
+	  tests/Polyhedron/addspacedims10.cc (1.2),
+	  tests/Polyhedron/addspacedims11.cc (1.2),
+	  tests/Polyhedron/addspacedims12.cc (1.2),
+	  tests/Polyhedron/addspacedims13.cc (1.2),
+	  tests/Polyhedron/addspacedims2.cc (1.2),
+	  tests/Polyhedron/addspacedims3.cc (1.2),
+	  tests/Polyhedron/addspacedims4.cc (1.2),
+	  tests/Polyhedron/addspacedims5.cc (1.2),
+	  tests/Polyhedron/addspacedims6.cc (1.2),
+	  tests/Polyhedron/addspacedims7.cc (1.2),
+	  tests/Polyhedron/addspacedims8.cc (1.2),
+	  tests/Polyhedron/addspacedims9.cc (1.2),
+	  tests/Polyhedron/affineimage1.cc (1.2),
+	  tests/Polyhedron/affineimage2.cc (1.2),
+	  tests/Polyhedron/affineimage3.cc (1.2),
+	  tests/Polyhedron/affineimage4.cc (1.2),
+	  tests/Polyhedron/affineimage5.cc (1.2),
+	  tests/Polyhedron/affineimage6.cc (1.2),
+	  tests/Polyhedron/affineimage7.cc (1.2),
+	  tests/Polyhedron/affineimage8.cc (1.2),
+	  tests/Polyhedron/affineimage9.cc (1.2),
+	  tests/Polyhedron/affinepreimage1.cc (1.2),
+	  tests/Polyhedron/affinepreimage10.cc (1.2),
+	  tests/Polyhedron/affinepreimage2.cc (1.2),
+	  tests/Polyhedron/affinepreimage3.cc (1.2),
+	  tests/Polyhedron/affinepreimage4.cc (1.2),
+	  tests/Polyhedron/affinepreimage5.cc (1.2),
+	  tests/Polyhedron/affinepreimage6.cc (1.2),
+	  tests/Polyhedron/affinepreimage7.cc (1.2),
+	  tests/Polyhedron/affinepreimage8.cc (1.2),
+	  tests/Polyhedron/affinepreimage9.cc (1.2),
+	  tests/Polyhedron/affinetrans.cc (1.2),
+	  tests/Polyhedron/append1.cc (1.2), tests/Polyhedron/append2.cc
+	  (1.2), tests/Polyhedron/ascii_dump_load1.cc (1.2),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.2),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.2),
+	  tests/Polyhedron/ascii_dump_load4.cc (1.2),
+	  tests/Polyhedron/ascii_dump_load5.cc (1.2),
+	  tests/Polyhedron/ascii_dump_load6.cc (1.2),
+	  tests/Polyhedron/ascii_dump_load7.cc (1.2),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.2),
+	  tests/Polyhedron/bgp99extrapolation2.cc (1.2),
+	  tests/Polyhedron/bhrz03widening1.cc (1.2),
+	  tests/Polyhedron/bhrz03widening10.cc (1.2),
+	  tests/Polyhedron/bhrz03widening11.cc (1.2),
+	  tests/Polyhedron/bhrz03widening12.cc (1.2),
+	  tests/Polyhedron/bhrz03widening13.cc (1.2),
+	  tests/Polyhedron/bhrz03widening14.cc (1.2),
+	  tests/Polyhedron/bhrz03widening15.cc (1.2),
+	  tests/Polyhedron/bhrz03widening16.cc (1.2),
+	  tests/Polyhedron/bhrz03widening17.cc (1.2),
+	  tests/Polyhedron/bhrz03widening18.cc (1.2),
+	  tests/Polyhedron/bhrz03widening19.cc (1.2),
+	  tests/Polyhedron/bhrz03widening2.cc (1.2),
+	  tests/Polyhedron/bhrz03widening3.cc (1.2),
+	  tests/Polyhedron/bhrz03widening4.cc (1.2),
+	  tests/Polyhedron/bhrz03widening5.cc (1.2),
+	  tests/Polyhedron/bhrz03widening6.cc (1.2),
+	  tests/Polyhedron/bhrz03widening7.cc (1.2),
+	  tests/Polyhedron/bhrz03widening8.cc (1.2),
+	  tests/Polyhedron/bhrz03widening9.cc (1.2),
+	  tests/Polyhedron/bhz03widening1.cc (1.2),
+	  tests/Polyhedron/bhz03widening2.cc (1.2),
+	  tests/Polyhedron/bhz03widening3.cc (1.2),
+	  tests/Polyhedron/bhz03widening4.cc (1.2),
+	  tests/Polyhedron/bhz03widening5.cc (1.2),
+	  tests/Polyhedron/bhz03widening6.cc (1.2),
+	  tests/Polyhedron/bounded1.cc (1.2),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.2),
+	  tests/Polyhedron/boundingbox1.cc (1.2),
+	  tests/Polyhedron/boundingbox2.cc (1.2),
+	  tests/Polyhedron/boundingbox3.cc (1.2),
+	  tests/Polyhedron/boundingbox4.cc (1.2),
+	  tests/Polyhedron/boundingbox5.cc (1.2),
+	  tests/Polyhedron/bounds1.cc (1.2), tests/Polyhedron/bounds2.cc
+	  (1.2), tests/Polyhedron/concatenate1.cc (1.2),
+	  tests/Polyhedron/concatenate2.cc (1.2),
+	  tests/Polyhedron/concatenate3.cc (1.2),
+	  tests/Polyhedron/concatenate4.cc (1.2),
+	  tests/Polyhedron/concatenate5.cc (1.2),
+	  tests/Polyhedron/concatenate6.cc (1.2),
+	  tests/Polyhedron/constraints1.cc (1.2),
+	  tests/Polyhedron/constraints2.cc (1.2),
+	  tests/Polyhedron/constraints3.cc (1.2),
+	  tests/Polyhedron/constraints4.cc (1.2),
+	  tests/Polyhedron/contains1.cc (1.2),
+	  tests/Polyhedron/contains2.cc (1.2),
+	  tests/Polyhedron/contains3.cc (1.2),
+	  tests/Polyhedron/contains4.cc (1.2),
+	  tests/Polyhedron/contains5.cc (1.2),
+	  tests/Polyhedron/disjoint1.cc (1.2),
+	  tests/Polyhedron/disjoint2.cc (1.2),
+	  tests/Polyhedron/disjoint3.cc (1.2),
+	  tests/Polyhedron/dualhypercubes.cc (1.2),
+	  tests/Polyhedron/empty1.cc (1.2), tests/Polyhedron/equals1.cc
+	  (1.2), tests/Polyhedron/exceptions1.cc (1.2),
+	  tests/Polyhedron/exceptions2.cc (1.2),
+	  tests/Polyhedron/exceptions3.cc (1.2),
+	  tests/Polyhedron/expandspacedim1.cc (1.2),
+	  tests/Polyhedron/expandspacedim2.cc (1.2),
+	  tests/Polyhedron/foldspacedims1.cc (1.2),
+	  tests/Polyhedron/foldspacedims2.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage10.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage11.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage12.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage3.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage4.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage5.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage6.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage7.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage8.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage9.cc (1.2),
+	  tests/Polyhedron/generators1.cc (1.2),
+	  tests/Polyhedron/generators2.cc (1.2),
+	  tests/Polyhedron/generators3.cc (1.2),
+	  tests/Polyhedron/generators4.cc (1.2),
+	  tests/Polyhedron/generators5.cc (1.2),
+	  tests/Polyhedron/generators6.cc (1.2),
+	  tests/Polyhedron/geomcovers1.cc (1.2),
+	  tests/Polyhedron/h79widening1.cc (1.2),
+	  tests/Polyhedron/h79widening2.cc (1.2),
+	  tests/Polyhedron/h79widening3.cc (1.2),
+	  tests/Polyhedron/h79widening4.cc (1.2),
+	  tests/Polyhedron/h79widening5.cc (1.2),
+	  tests/Polyhedron/h79widening6.cc (1.2),
+	  tests/Polyhedron/h79widening7.cc (1.2),
+	  tests/Polyhedron/h79widening8.cc (1.2),
+	  tests/Polyhedron/intersection1.cc (1.2),
+	  tests/Polyhedron/intersection10.cc (1.2),
+	  tests/Polyhedron/intersection11.cc (1.2),
+	  tests/Polyhedron/intersection2.cc (1.2),
+	  tests/Polyhedron/intersection3.cc (1.2),
+	  tests/Polyhedron/intersection4.cc (1.2),
+	  tests/Polyhedron/intersection5.cc (1.2),
+	  tests/Polyhedron/intersection6.cc (1.2),
+	  tests/Polyhedron/intersection7.cc (1.2),
+	  tests/Polyhedron/intersection8.cc (1.2),
+	  tests/Polyhedron/intersection9.cc (1.2),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.2),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.2),
+	  tests/Polyhedron/limitedh79extrapolation2.cc (1.2),
+	  tests/Polyhedron/limitedh79extrapolation3.cc (1.2),
+	  tests/Polyhedron/limitedh79extrapolation4.cc (1.2),
+	  tests/Polyhedron/linearpartition1.cc (1.2),
+	  tests/Polyhedron/linearpartition2.cc (1.2),
+	  tests/Polyhedron/linearpartition3.cc (1.2),
+	  tests/Polyhedron/linearpartition4.cc (1.2),
+	  tests/Polyhedron/linexpression1.cc (1.2),
+	  tests/Polyhedron/mapspacedims1.cc (1.2),
+	  tests/Polyhedron/mapspacedims2.cc (1.2),
+	  tests/Polyhedron/mapspacedims3.cc (1.2),
+	  tests/Polyhedron/mapspacedims4.cc (1.2),
+	  tests/Polyhedron/max_min1.cc (1.2), tests/Polyhedron/max_min2.cc
+	  (1.2), tests/Polyhedron/maxspacedim1.cc (1.2),
+	  tests/Polyhedron/mc91.cc (1.2), tests/Polyhedron/membytes1.cc
+	  (1.2), tests/Polyhedron/membytes2.cc (1.2),
+	  tests/Polyhedron/memory1.cc (1.2),
+	  tests/Polyhedron/minconstraints1.cc (1.2),
+	  tests/Polyhedron/minconstraints2.cc (1.2),
+	  tests/Polyhedron/minconstraints3.cc (1.2),
+	  tests/Polyhedron/minconstraints4.cc (1.2),
+	  tests/Polyhedron/mingenerators1.cc (1.2),
+	  tests/Polyhedron/mingenerators2.cc (1.2),
+	  tests/Polyhedron/mingenerators3.cc (1.2),
+	  tests/Polyhedron/onepoint.cc (1.2), tests/Polyhedron/permute.cc
+	  (1.2), tests/Polyhedron/polydifference1.cc (1.2),
+	  tests/Polyhedron/polydifference2.cc (1.2),
+	  tests/Polyhedron/polydifference3.cc (1.2),
+	  tests/Polyhedron/polydifference4.cc (1.2),
+	  tests/Polyhedron/polydifference5.cc (1.2),
+	  tests/Polyhedron/polydifference6.cc (1.2),
+	  tests/Polyhedron/polydifference7.cc (1.2),
+	  tests/Polyhedron/polydifference8.cc (1.2),
+	  tests/Polyhedron/polydifference9.cc (1.2),
+	  tests/Polyhedron/polyhull1.cc (1.2),
+	  tests/Polyhedron/polyhull10.cc (1.2),
+	  tests/Polyhedron/polyhull11.cc (1.2),
+	  tests/Polyhedron/polyhull2.cc (1.2),
+	  tests/Polyhedron/polyhull3.cc (1.2),
+	  tests/Polyhedron/polyhull4.cc (1.2),
+	  tests/Polyhedron/polyhull5.cc (1.2),
+	  tests/Polyhedron/polyhull6.cc (1.2),
+	  tests/Polyhedron/polyhull7.cc (1.2),
+	  tests/Polyhedron/polyhull8.cc (1.2),
+	  tests/Polyhedron/polyhull9.cc (1.2),
+	  tests/Polyhedron/randphull1.cc (1.2),
+	  tests/Polyhedron/randphull2.cc (1.2),
+	  tests/Polyhedron/relations1.cc (1.2),
+	  tests/Polyhedron/relations10.cc (1.2),
+	  tests/Polyhedron/relations11.cc (1.2),
+	  tests/Polyhedron/relations12.cc (1.2),
+	  tests/Polyhedron/relations13.cc (1.2),
+	  tests/Polyhedron/relations14.cc (1.2),
+	  tests/Polyhedron/relations15.cc (1.2),
+	  tests/Polyhedron/relations16.cc (1.2),
+	  tests/Polyhedron/relations17.cc (1.2),
+	  tests/Polyhedron/relations18.cc (1.2),
+	  tests/Polyhedron/relations19.cc (1.2),
+	  tests/Polyhedron/relations2.cc (1.2),
+	  tests/Polyhedron/relations3.cc (1.2),
+	  tests/Polyhedron/relations4.cc (1.2),
+	  tests/Polyhedron/relations5.cc (1.2),
+	  tests/Polyhedron/relations6.cc (1.2),
+	  tests/Polyhedron/relations7.cc (1.2),
+	  tests/Polyhedron/relations8.cc (1.2),
+	  tests/Polyhedron/relations9.cc (1.2),
+	  tests/Polyhedron/removespacedims1.cc (1.2),
+	  tests/Polyhedron/removespacedims10.cc (1.2),
+	  tests/Polyhedron/removespacedims2.cc (1.2),
+	  tests/Polyhedron/removespacedims3.cc (1.2),
+	  tests/Polyhedron/removespacedims4.cc (1.2),
+	  tests/Polyhedron/removespacedims5.cc (1.2),
+	  tests/Polyhedron/removespacedims6.cc (1.2),
+	  tests/Polyhedron/removespacedims7.cc (1.2),
+	  tests/Polyhedron/removespacedims8.cc (1.2),
+	  tests/Polyhedron/removespacedims9.cc (1.2),
+	  tests/Polyhedron/smm1.cc (1.2), tests/Polyhedron/timeelapse1.cc
+	  (1.2), tests/Polyhedron/timeelapse2.cc (1.2),
+	  tests/Polyhedron/timeelapse3.cc (1.2),
+	  tests/Polyhedron/timeelapse4.cc (1.2),
+	  tests/Polyhedron/timeelapse5.cc (1.2),
+	  tests/Polyhedron/timeelapse6.cc (1.2),
+	  tests/Polyhedron/timeelapse7.cc (1.2),
+	  tests/Polyhedron/timeelapse8.cc (1.2),
+	  tests/Polyhedron/timeelapse9.cc (1.2),
+	  tests/Polyhedron/topclosed1.cc (1.2),
+	  tests/Polyhedron/topclosed2.cc (1.2),
+	  tests/Polyhedron/topclosed3.cc (1.2),
+	  tests/Polyhedron/topclosure1.cc (1.2),
+	  tests/Polyhedron/topclosure2.cc (1.2),
+	  tests/Polyhedron/topclosure3.cc (1.2),
+	  tests/Polyhedron/topclosure4.cc (1.2),
+	  tests/Polyhedron/universe1.cc (1.2),
+	  tests/Polyhedron/universe2.cc (1.2),
+	  tests/Polyhedron/universe3.cc (1.2),
+	  tests/Polyhedron/universe4.cc (1.2),
+	  tests/Polyhedron/universe5.cc (1.2),
+	  tests/Polyhedron/universe6.cc (1.2),
+	  tests/Polyhedron/universe7.cc (1.2),
+	  tests/Polyhedron/valgrind_suppressions (1.2),
+	  tests/Polyhedron/watchdog1.cc (1.2),
+	  tests/Polyhedron/writeconsys1.cc (1.2),
+	  tests/Polyhedron/writegensys1.cc (1.2),
+	  tests/Polyhedron/writegensys2.cc (1.2),
+	  tests/Polyhedron/writegensys3.cc (1.2),
+	  tests/Polyhedron/writepolyhedron1.cc (1.2),
+	  tests/Polyhedron/writepolyhedron2.cc (1.2),
+	  tests/Polyhedron/writepolyhedron3.cc (1.2),
+	  tests/Polyhedron/writerelation1.cc (1.2),
+	  tests/Polyhedron/writevariable1.cc (1.2): Second merge from the
+	  `altnum' branch.
+
+2004-12-28 Tuesday 20:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.21): Anonymous namespaces hve to do with visibility
+	  of names, not linkage.
+
+2004-12-28 Tuesday 20:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: track_allocation.hh (1.15), Ciao/ppl_ciao.cc
+	  (1.28), GNU/ppl_gprolog_sd.cc (1.24), SICStus/ppl_sicstus_sd.cc
+	  (1.71), SWI/ppl_swiprolog.cc (1.95), XSB/ppl_xsb.cc (1.62),
+	  YAP/ppl_yap.cc (1.87): Use anonymous namespaces instead of
+	  keyword "static" to hide functions and variables from the eyes of
+	  other translation units.
+
+2004-12-28 Tuesday 19:39  Abramo Bagnara
+
+	* src/: Extended_Number.defs.hh, Extended_Number.inlines.hh,
+	  Extended_Number.types.hh (altnum.[1,1,1]): Added preliminary
+	  Extended_Number implementation.
+
+2004-12-28 Tuesday 19:36  Abramo Bagnara
+
+	* src/: E_Rational.inlines.hh, Interval.inlines.hh,
+	  Polyhedron_nonpublic.cc (altnum.[2,9,12]): Fixed some
+	  Checked::assign use.
+
+2004-12-28 Tuesday 18:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: exceptions2.cc, exceptions3.cc (altnum.[3,3]):
+	  Refer to `Coefficient' instead of `Integer'.
+
+2004-12-28 Tuesday 18:35  Abramo Bagnara
+
+	* src/checked.defs.hh (altnum.25): Fixed incomplete change of
+	  return type for set_special.
+
+2004-12-28 Tuesday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/.cvsignore (altnum.1): Put under CVS control.
+
+2004-12-28 Tuesday 18:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.20): Added guideline for the specification of
+	  internal linkage functions and variables.
+
+2004-12-28 Tuesday 18:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: NNCbecomesC1.cc, addconstraints13.cc,
+	  addgenerators12.cc, affineimage8.cc, affinepreimage10.cc,
+	  affinepreimage9.cc, append1.cc, append2.cc, ascii_dump_load1.cc,
+	  ascii_dump_load2.cc, ascii_dump_load3.cc, ascii_dump_load4.cc,
+	  ascii_dump_load5.cc, ascii_dump_load6.cc, ascii_dump_load7.cc,
+	  bhrz03widening1.cc, bhrz03widening12.cc, bhrz03widening13.cc,
+	  bhrz03widening14.cc, bhrz03widening15.cc, bhrz03widening9.cc,
+	  bhz03widening6.cc, boundingbox1.cc, boundingbox2.cc,
+	  boundingbox3.cc, boundingbox4.cc, concatenate6.cc,
+	  constraints4.cc, contains5.cc, disjoint2.cc, disjoint3.cc,
+	  exceptions1.cc, exceptions2.cc, exceptions3.cc,
+	  expandspacedim1.cc, expandspacedim2.cc, foldspacedims1.cc,
+	  foldspacedims2.cc, generalizedaffineimage10.cc,
+	  generalizedaffineimage11.cc, generalizedaffineimage7.cc,
+	  generalizedaffineimage9.cc, generators6.cc, h79widening1.cc,
+	  intersection10.cc, intersection11.cc, intersection2.cc,
+	  intersection7.cc, limitedh79extrapolation4.cc,
+	  linearpartition1.cc, linearpartition2.cc, linearpartition3.cc,
+	  mapspacedims1.cc, mapspacedims2.cc, mapspacedims3.cc,
+	  mapspacedims4.cc, membytes1.cc, membytes2.cc, memory1.cc,
+	  permute.cc, polydifference7.cc, polydifference9.cc, polyhull4.cc,
+	  polyhull8.cc, polyhull9.cc, randphull1.cc, randphull2.cc,
+	  relations17.cc, relations19.cc, relations9.cc, smm1.cc,
+	  topclosure4.cc, watchdog1.cc, writeconsys1.cc, writegensys1.cc,
+	  writegensys2.cc, writegensys3.cc, writepolyhedron1.cc,
+	  writepolyhedron2.cc, writepolyhedron3.cc, writerelation1.cc,
+	  writevariable1.cc
+	  (altnum.[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,3,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2]):
+	  Prefer using anonymous namespace to specify internal linkage.
+
+2004-12-28 Tuesday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (altnum.3): New implementation for
+	  BD_Shape<T>::relation_with(const Generator& g).
+
+2004-12-28 Tuesday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/affinepreimage1.cc (altnum.3): Typo fixed.
+
+2004-12-28 Tuesday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.defs.hh, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+	  tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/addspacedims7.cc, tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+	  tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+	  tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation3.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/cc76extrapolation5.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc,
+	  tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+	  tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+	  tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+	  tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/concatenate2.cc,
+	  tests/BD_Shape/concatenate3.cc, tests/BD_Shape/concatenate4.cc,
+	  tests/BD_Shape/concatenate5.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/constraints2.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/contains2.cc, tests/BD_Shape/contains3.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/empty2.cc,
+	  tests/BD_Shape/empty3.cc, tests/BD_Shape/empty4.cc,
+	  tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+	  tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage11.cc,
+	  tests/BD_Shape/generalizedaffineimage12.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage6.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/generalizedaffineimage9.cc,
+	  tests/BD_Shape/h79widening1.cc, tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/intersection2.cc, tests/BD_Shape/intersection3.cc,
+	  tests/BD_Shape/intersection4.cc, tests/BD_Shape/intersection5.cc,
+	  tests/BD_Shape/intersection6.cc, tests/BD_Shape/intersection7.cc,
+	  tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/limitedCC76extrapolation1.cc,
+	  tests/BD_Shape/limitedCC76extrapolation2.cc,
+	  tests/BD_Shape/limitedCC76extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation1.cc,
+	  tests/BD_Shape/limitedCH78extrapolation2.cc,
+	  tests/BD_Shape/limitedCH78extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation4.cc,
+	  tests/BD_Shape/limitedCH78extrapolation5.cc,
+	  tests/BD_Shape/limitedCH78extrapolation6.cc,
+	  tests/BD_Shape/limitedCH78extrapolation7.cc,
+	  tests/BD_Shape/limitedCH78extrapolation8.cc,
+	  tests/BD_Shape/limitedCH78extrapolation9.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+	  tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/polydifference1.cc,
+	  tests/BD_Shape/polydifference2.cc,
+	  tests/BD_Shape/polydifference3.cc,
+	  tests/BD_Shape/polydifference4.cc,
+	  tests/BD_Shape/polydifference5.cc,
+	  tests/BD_Shape/polydifference6.cc, tests/BD_Shape/polyhull1.cc,
+	  tests/BD_Shape/polyhull2.cc, tests/BD_Shape/polyhull3.cc,
+	  tests/BD_Shape/polyhull4.cc, tests/BD_Shape/relations1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/relations4.cc, tests/BD_Shape/relations5.cc,
+	  tests/BD_Shape/universe1.cc, tests/BD_Shape/writebdiffs1.cc,
+	  tests/BD_Shape/writebdiffs2.cc
+	  (altnum.[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+	  No longer mention `BDiffs'.
+
+2004-12-28 Tuesday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.21): Deal correctly with nested include
+	  files.
+
+2004-12-28 Tuesday 17:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (altnum.2): Added the required template
+	  function min_assign(T& x, const T& y).
+
+2004-12-28 Tuesday 16:51  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked_ext.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[24,3,16,25,18,21]): Changed lowlevel set_special to
+	  return Result info.
+
+2004-12-28 Tuesday 16:28  Abramo Bagnara
+
+	* src/E_NIT.inlines.hh (altnum.3): Added missing rounding argument.
+
+2004-12-28 Tuesday 16:21  Abramo Bagnara
+
+	* src/checked.defs.hh (altnum.23): Documentation fix.
+
+2004-12-28 Tuesday 16:19  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[16,17]): Transformed helper function in static method.
+
+2004-12-28 Tuesday 16:18  Abramo Bagnara
+
+	* src/checked_ext.inlines.hh (altnum.2): Removed useless function.
+
+2004-12-28 Tuesday 16:17  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.24): Added policy dependance
+	  to special values.
+
+2004-12-28 Tuesday 16:16  Abramo Bagnara
+
+	* configure.ac (altnum.18): Renamed gmp option value to mpz
+
+2004-12-28 Tuesday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/E_NIT.inlines.hh (altnum.2): Failed attempt to fix a problem
+	  with E_NIT (the build is still broken).
+
+2004-12-28 Tuesday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (altnum.17): Configure the `tests/BD_Shape'
+	  directory.
+
+2004-12-28 Tuesday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, ppl_test.hh, BD_Shape/Makefile.am,
+	  BD_Shape/addconstraints1.cc, BD_Shape/addspacedims1.cc,
+	  BD_Shape/addspacedims2.cc, BD_Shape/addspacedims3.cc,
+	  BD_Shape/addspacedims4.cc, BD_Shape/addspacedims5.cc,
+	  BD_Shape/addspacedims6.cc, BD_Shape/addspacedims7.cc,
+	  BD_Shape/affineimage1.cc, BD_Shape/affineimage2.cc,
+	  BD_Shape/affineimage3.cc, BD_Shape/affineimage4.cc,
+	  BD_Shape/affineimage5.cc, BD_Shape/affineimage6.cc,
+	  BD_Shape/affineimage7.cc, BD_Shape/affinepreimage1.cc,
+	  BD_Shape/affinepreimage2.cc, BD_Shape/affinepreimage3.cc,
+	  BD_Shape/affinepreimage4.cc, BD_Shape/ascii_dump_load1.cc,
+	  BD_Shape/ascii_dump_load2.cc, BD_Shape/cc76extrapolation1.cc,
+	  BD_Shape/cc76extrapolation2.cc, BD_Shape/cc76extrapolation3.cc,
+	  BD_Shape/cc76extrapolation4.cc, BD_Shape/cc76extrapolation5.cc,
+	  BD_Shape/cc76extrapolation6.cc, BD_Shape/cc76narrowing1.cc,
+	  BD_Shape/cc76narrowing2.cc, BD_Shape/cc76narrowing3.cc,
+	  BD_Shape/cc76narrowing4.cc, BD_Shape/cc76narrowing5.cc,
+	  BD_Shape/ch78widening1.cc, BD_Shape/ch78widening2.cc,
+	  BD_Shape/ch78widening3.cc, BD_Shape/ch78widening4.cc,
+	  BD_Shape/ch78widening5.cc, BD_Shape/ch78widening6.cc,
+	  BD_Shape/ch78widening7.cc, BD_Shape/ch78widening8.cc,
+	  BD_Shape/concatenate1.cc, BD_Shape/concatenate2.cc,
+	  BD_Shape/concatenate3.cc, BD_Shape/concatenate4.cc,
+	  BD_Shape/concatenate5.cc, BD_Shape/constraints1.cc,
+	  BD_Shape/constraints2.cc, BD_Shape/contains1.cc,
+	  BD_Shape/contains2.cc, BD_Shape/contains3.cc, BD_Shape/empty1.cc,
+	  BD_Shape/empty2.cc, BD_Shape/empty3.cc, BD_Shape/empty4.cc,
+	  BD_Shape/equality1.cc, BD_Shape/exceptions1.cc,
+	  BD_Shape/exceptions2.cc, BD_Shape/exceptions3.cc,
+	  BD_Shape/generalizedaffineimage1.cc,
+	  BD_Shape/generalizedaffineimage10.cc,
+	  BD_Shape/generalizedaffineimage11.cc,
+	  BD_Shape/generalizedaffineimage12.cc,
+	  BD_Shape/generalizedaffineimage2.cc,
+	  BD_Shape/generalizedaffineimage3.cc,
+	  BD_Shape/generalizedaffineimage4.cc,
+	  BD_Shape/generalizedaffineimage5.cc,
+	  BD_Shape/generalizedaffineimage6.cc,
+	  BD_Shape/generalizedaffineimage7.cc,
+	  BD_Shape/generalizedaffineimage8.cc,
+	  BD_Shape/generalizedaffineimage9.cc, BD_Shape/h79widening1.cc,
+	  BD_Shape/intersection1.cc, BD_Shape/intersection2.cc,
+	  BD_Shape/intersection3.cc, BD_Shape/intersection4.cc,
+	  BD_Shape/intersection5.cc, BD_Shape/intersection6.cc,
+	  BD_Shape/intersection7.cc, BD_Shape/intersection8.cc,
+	  BD_Shape/limitedCC76extrapolation1.cc,
+	  BD_Shape/limitedCC76extrapolation2.cc,
+	  BD_Shape/limitedCC76extrapolation3.cc,
+	  BD_Shape/limitedCH78extrapolation1.cc,
+	  BD_Shape/limitedCH78extrapolation2.cc,
+	  BD_Shape/limitedCH78extrapolation3.cc,
+	  BD_Shape/limitedCH78extrapolation4.cc,
+	  BD_Shape/limitedCH78extrapolation5.cc,
+	  BD_Shape/limitedCH78extrapolation6.cc,
+	  BD_Shape/limitedCH78extrapolation7.cc,
+	  BD_Shape/limitedCH78extrapolation8.cc,
+	  BD_Shape/limitedCH78extrapolation9.cc,
+	  BD_Shape/limitedh79extrapolation1.cc, BD_Shape/mapspacedims1.cc,
+	  BD_Shape/mapspacedims2.cc, BD_Shape/mapspacedims3.cc,
+	  BD_Shape/mapspacedims4.cc, BD_Shape/maxspacedim.cc,
+	  BD_Shape/polydifference1.cc, BD_Shape/polydifference2.cc,
+	  BD_Shape/polydifference3.cc, BD_Shape/polydifference4.cc,
+	  BD_Shape/polydifference5.cc, BD_Shape/polydifference6.cc,
+	  BD_Shape/polyhull1.cc, BD_Shape/polyhull2.cc,
+	  BD_Shape/polyhull3.cc, BD_Shape/polyhull4.cc,
+	  BD_Shape/relations1.cc, BD_Shape/relations2.cc,
+	  BD_Shape/relations3.cc, BD_Shape/relations4.cc,
+	  BD_Shape/relations5.cc, BD_Shape/removespacedims1.cc,
+	  BD_Shape/removespacedims2.cc, BD_Shape/removespacedims3.cc,
+	  BD_Shape/timeelapse1.cc, BD_Shape/timeelapse2.cc,
+	  BD_Shape/timeelapse3.cc, BD_Shape/timeelapse4.cc,
+	  BD_Shape/timeelapse5.cc, BD_Shape/universe1.cc,
+	  BD_Shape/writebdiffs1.cc, BD_Shape/writebdiffs2.cc
+	  (altnum.[9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Tests for the BD_Shape class.
+
+2004-12-28 Tuesday 14:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.14): Fixed the indentation of a
+	  few comments.
+
+2004-12-28 Tuesday 14:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint_System.defs.hh (1.5), Generator_System.defs.hh
+	  (1.6): Header file inclusions fixed.
+
+2004-12-28 Tuesday 13:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint_System.cc (1.4): Avoid recomputing the same
+	  expression more than once.
+
+2004-12-28 Tuesday 11:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.19): Documented the new policy about swap method and
+	  std::swap specialization.
+
+2004-12-28 Tuesday 11:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.46), Constraint.defs.hh (1.101),
+	  Constraint.inlines.hh (1.58), Constraint_System.cc (1.3),
+	  Constraint_System.defs.hh (1.4), Generator.cc (1.57),
+	  Generator.defs.hh (1.99), Generator.inlines.hh (1.52),
+	  Generator_System.defs.hh (1.5), Linear_Expression.defs.hh (1.7),
+	  Polyhedron.inlines.hh (1.106), Polyhedron_nonpublic.cc (1.41),
+	  Polyhedron_public.cc (1.47), Polyhedron_widenings.cc (1.39):
+	  Classes Constraint and Generator now have comparison operators ==
+	  and !=, checking for semantic equivalence.  Class constraint has
+	  publicly available methods is_tautological() and
+	  is_inconsistent(), replacing the preovate methods
+	  is_trivial_true() and is_trivial_false().  The swap methods of
+	  classes Constraint, Generator, Linear_Expression,
+	  Constraint_System and Generator_System are now publicly
+	  available.  Corrected a minor efficiency bug in
+	  Polyhedron::shrink_bounding_box().
+
+2004-12-28 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.136): Two important items added.
+
+2004-12-26 Sunday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.100): Useless explicit qualification
+	  removed.
+
+2004-12-26 Sunday 18:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.99): FIXME added: we do not seem to
+	  have strong reason to let Polyhedron be a friend of Constraint.
+
+2004-12-25 Saturday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, ChangeLog, NEWS, README, README.configure, STANDARDS,
+	  TODO, config.guess, config.rpath, config.sub, configure.ac,
+	  install-sh, ppl.lsm.in, ppl.spec.in, Watchdog/ChangeLog,
+	  Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+	  Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/configure.ac, Watchdog/install-sh,
+	  Watchdog/pwl_filter_doxygen.sed, Watchdog/pwl_filter_install.sed,
+	  Watchdog/pwl_header.bottom, Watchdog/pwl_header.middle,
+	  Watchdog/pwl_header.top, demos/ppl_lcdd/Makefile.am,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/dummy.cc, demos/ppl_lpsol/ppl_lpsol.c,
+	  doc/Makefile.am, doc/README, doc/README.doc, doc/definitions.dox,
+	  doc/devref.tex, doc/user.tex, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  m4/ac_cxx_double_is_iec_559.m4, m4/ac_cxx_float_is_iec_559.m4,
+	  m4/ac_cxx_long_double_is_iec_559.m4, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Coefficient.types.hh,
+	  src/Coefficient_traits_template.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.types.hh, src/Generator_System.defs.hh,
+	  src/Interval.defs.hh, src/Interval.inlines.hh, src/Limits.hh,
+	  src/Linear_Expression.defs.hh, src/Linear_Row.cc,
+	  src/Linear_System.cc, src/Linear_System.defs.hh,
+	  src/Linear_System.inlines.hh, src/Makefile.am,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Native_Integer.types.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Saturation_Row.cc, src/Saturation_Row.inlines.hh,
+	  src/Widening_Function.defs.hh, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_int.inlines.hh,
+	  src/globals.defs.hh, src/initializer.hh, src/ppl_header.bottom,
+	  src/ppl_header.middle, src/swapping_sort.icc, tests/BBox.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/watchdog1.cc
+	  (altnum.[5,2,7,3,3,3,7,4,1,3,16,4,2,2,2,5,2,2,4,3,3,4,1,1,1,1,1,6,10,4,1,5,3,2,1,7,3,3,8,5,7,2,9,1,5,2,3,3,5,4,1,3,5,7,5,8,1,4,3,8,2,2,3,4,8,2,2,3,1,1,1,15,16,2,2,6,5,7,4,2,5,8,4,2,3,4,4,4,20,8,8,4,5,5,8,11,8,3,3,2,2,5,22,15,23,9,1,1,1,3,3,3,2,2,2,2,2,2,2,2,2,2,1,2]):
+	  Seventh merge from main trunk.
+
+2004-12-25 Saturday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.147), README (1.34), configure.ac (1.154),
+	  src/Makefile.am (1.96): Updated for PPL 0.8.
+
+2004-12-24 Friday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_7-branch.1): Update version.
+
+2004-12-24 Friday 16:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_7-branch.[1,1]): Mark
+	  ChangeLog.
+
+2004-12-24 Friday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.20), Watchdog/ChangeLog (1.10): Updated.
+
+2004-12-24 Friday 15:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.33), Watchdog/README (1.9): Updated.
+
+2004-12-24 Friday 14:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/user-browse.doxyconf-latex.in (1.24),
+	  doc/user-print.doxyconf-latex.in (1.24),
+	  doc/user.doxyconf-html.in (1.26), src/Coefficient.types.hh (1.5),
+	  src/GMP_Integer.types.hh (1.6), src/Makefile.am (1.95),
+	  src/Native_Integer.defs.hh (1.8), src/Native_Integer.types.hh
+	  (1.6): On a second thought, the user shouldn't care much about
+	  coefficient traits: the corresponding documentation now occurs in
+	  the devref manual only.
+
+2004-12-24 Friday 12:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.13): Typo fixed.
+
+2004-12-24 Friday 12:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/user-browse.doxyconf-latex.in (1.23),
+	  doc/user-print.doxyconf-latex.in (1.23),
+	  doc/user.doxyconf-html.in (1.25), src/Checked_Number.defs.hh
+	  (1.6), src/Coefficient.types.hh (1.4),
+	  src/Coefficient_traits_template.hh (1.2),
+	  src/GMP_Integer.types.hh (1.5), src/Linear_System.inlines.hh
+	  (1.11), src/Makefile.am (1.94), src/Native_Integer.defs.hh (1.7),
+	  src/Native_Integer.types.hh (1.5), src/checked.defs.hh (1.6),
+	  src/globals.defs.hh (1.13): Minor improvements to the
+	  documentation.
+
+2004-12-24 Friday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.38), ciao_clpq.pl (1.13),
+	  ciao_clpq2.pl (1.9), ciao_pl_check.pl (1.9): Fixed for the case
+	  where the source and the build directories coincide.
+
+2004-12-24 Friday 12:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/.cvsignore (1.10): Updated.
+
+2004-12-24 Friday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.17): No longer mention erased files.
+
+2004-12-24 Friday 11:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.bottom (1.6): The preprocessor symbol
+	  PPL_FLEXIBLE_ARRAY is no longer used.
+
+2004-12-24 Friday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: pwl_header.bottom (1.2), pwl_header.top (1.5):
+	  Handling of NDEBUG improved.
+
+2004-12-24 Friday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/pwl_header.middle (1.3): We no longer support GCC
+	  versions prior to 3.
+
+2004-12-24 Friday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.24): Require Autoconf 2.59.
+
+2004-12-24 Friday 11:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/README (1.8): Version number bumped.
+
+2004-12-24 Friday 11:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.16), pwl_filter_doxygen.sed (1.2),
+	  pwl_filter_install.sed (1.2): Obsolete filters removed.  Shared
+	  library version info updated.
+
+2004-12-24 Friday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.24): Sentence fixed.
+
+2004-12-24 Friday 10:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.rpath (1.3): Updated.
+
+2004-12-24 Friday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.146), README.configure (1.11), TODO (1.135): Minor
+	  improvements.
+
+2004-12-24 Friday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.15): AIDA project credited.
+
+2004-12-24 Friday 10:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Checked_Number.inlines.hh (1.11), Native_Integer.inlines.hh
+	  (1.8), checked.defs.hh (1.5): Added some \relates doxygen
+	  commands.
+
+2004-12-24 Friday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.15), Watchdog/configure.ac (1.23),
+	  interfaces/Prolog/YAP/Makefile.am (1.33): Enable the creation of
+	  DLLs under Cygwin.
+
+2004-12-24 Friday 08:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.134): More checking of the documentation should be done.
+
+2004-12-24 Friday 08:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Generator_System.defs.hh (1.4), Linear_Expression.defs.hh
+	  (1.6), Polyhedra_Powerset.defs.hh (1.12), Polyhedron.defs.hh
+	  (1.262), Powerset.defs.hh (1.6): Several small improvements to
+	  the documantation.
+
+2004-12-23 Thursday 22:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.145): Added quotes.
+
+2004-12-23 Thursday 22:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.144): Mentioned the new configuration option
+	  --enable-coefficients.
+
+2004-12-23 Thursday 21:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README (1.32), src/Checked_Number.defs.hh (1.5),
+	  src/Coefficient.types.hh (1.3), src/GMP_Integer.defs.hh (1.4),
+	  src/GMP_Integer.types.hh (1.4), src/Makefile.am (1.93),
+	  src/Native_Integer.defs.hh (1.6), src/Native_Integer.types.hh
+	  (1.4): Drafted the doxygen documentation for Coefficient,
+	  GMP_Integer, Checked_Number and Native_Integer, as well as
+	  corresponding traits.  Corrected a minor error in the README
+	  file.
+
+2004-12-23 Thursday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.31), interfaces/Prolog/SWI/Makefile.am (1.43),
+	  src/globals.defs.hh (1.12): Redundant inline declarations
+	  removed.
+
+2004-12-23 Thursday 14:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.42): Let `plld' use the C++
+	  compiler to perform linking.
+
+2004-12-23 Thursday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.23), doc/README (1.5), doc/README.doc (1.1): The
+	  file doc/README has been renamed README.doc so as not to conflict
+	  with the library's main README file.
+
+2004-12-23 Thursday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.22): Updated.
+
+2004-12-23 Thursday 11:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.153), src/Makefile.am (1.92): Allow the creation
+	  of a PPL DLL under Cygwin.
+
+2004-12-23 Thursday 11:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README.configure (1.10): Small improvement.
+
+2004-12-23 Thursday 10:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.9): Updated.
+
+2004-12-23 Thursday 10:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.14): Make sure
+	  Polyhedra_Powerset<PH>::space_dimension() is defined before being
+	  used.
+
+2004-12-23 Thursday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/float.types.hh (1.5): Never include <config.h> from a header
+	  file.
+
+2004-12-22 Wednesday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BBox.cc (1.7): Avoid repeating the inclusion of
+	  "ppl_install.hh".
+
+2004-12-22 Wednesday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/initializer.hh (1.9): Multiple inclusion guard fixed.
+
+2004-12-22 Wednesday 19:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.8): Added a section on enabling the use of
+	  alternative coefficient types.
+
+2004-12-22 Wednesday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.9), dummy.cc (1.1): Force using
+	  the C++ compiler for linking.
+
+2004-12-22 Wednesday 19:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.37), GNU/Makefile.am
+	  (1.42), SICStus/Makefile.am (1.49), SWI/Makefile.am (1.41),
+	  XSB/Makefile.am (1.30), YAP/Makefile.am (1.32): Do not use the
+	  `-no-undefined' Libtool option to build the dynamically loadable
+	  modules.
+
+2004-12-22 Wednesday 16:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.167):	Changed  "of" to "on"  in:
+
+	   Note that all the documented operators automatically
+	  perform reductions on their arguments, when needed or
+	  appropriate.
+
+2004-12-22 Wednesday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.133): The remaining item postponed to version 0.8 or
+	  later.
+
+2004-12-22 Wednesday 16:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.132), doc/definitions.dox (1.166),
+	  src/Determinate.defs.hh (1.51): Added a note about lazy
+	  Omega-reduction in the documentation of the powerset domain.
+	  Avoid underscore when providing the name of operators, unless
+	  inside a <CODE> tag.
+
+2004-12-22 Wednesday 16:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Powerset.defs.hh (1.5): Added a reference to the description
+	  of the powerset domain in definitions.dox.  Documented the
+	  methods begin() and end() returning a const_iterator.
+
+2004-12-22 Wednesday 14:39  Abramo Bagnara
+
+	* src/float.types.hh (1.4): Added IEC559 conformance conditional
+	  for larger types.
+
+2004-12-22 Wednesday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.123): Better support for different
+	  definitions of `size_t'.
+
+2004-12-22 Wednesday 14:19  Abramo Bagnara
+
+	* src/float.types.hh (1.3): Added support for iec559 types
+	  detection.
+
+2004-12-22 Wednesday 14:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Powerset.inlines.hh (1.6): Added a couple of inline
+	  declarations.
+
+2004-12-22 Wednesday 13:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.152), demos/ppl_lcdd/Makefile.am (1.17): On
+	  Darwin, the `md5sum' program does not support the `-t' option and
+	  compilation is best done with the `-Wno-long-double' option.
+
+2004-12-22 Wednesday 13:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.131): Added an item saying that we should reconsider the
+	  "with_token" predicates in the Prolog interface.
+
+2004-12-22 Wednesday 11:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.16): Fixed the way `md5sum' is
+	  invoked.
+
+2004-12-22 Wednesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.6): Updated with new authors and new size of the
+	  archive.
+
+2004-12-22 Wednesday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.151): Version number bumped.
+
+2004-12-22 Wednesday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.130): Updated.
+
+2004-12-22 Wednesday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.18): The requirement of keeping source lines short
+	  has been softened.
+
+2004-12-22 Wednesday 10:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.129), interfaces/Prolog/Prolog_interface.dox (1.125),
+	  interfaces/Prolog/exceptions.hh (1.14),
+	  interfaces/Prolog/ppl_prolog.icc (1.150),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.77),
+	  interfaces/Prolog/tests/pl_check.pl (1.6): In the Prolog
+	  interface, exceptions now always thrown if input values (other
+	  than lists) are invalid.
+
+	  Tests for these new exceptions added to the pl_check.pl test
+	  file.
+
+	  Corrected bug in Prolog interface in the case when a list was
+	  expected but a non-list was input.
+
+	  The interface needs to be changed so that it throws an exception
+	  for non-lists (instead of just Prolog failure) when a list is
+	  expected; this job has been added to the TODO file.
+
+2004-12-22 Wednesday 00:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.240), timeelapse9.cc (1.1): Added a new
+	  test, experimenting method
+	  Polyhedra_Powerset::time_elapse_assign() as well as the new
+	  (corrected) implementation of the equality test for class
+	  Powerset.
+
+2004-12-22 Wednesday 00:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.defs.hh (1.11),
+	  Polyhedra_Powerset.inlines.hh (1.13): Added methods
+	  intersection_assign() and time_elapse_assign(), exploiting the
+	  generic function Powerset::pairwise_apply_assign().  A lot of
+	  simple operators declared inline.
+
+2004-12-22 Wednesday 00:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Powerset.defs.hh (1.4), Powerset.inlines.hh (1.5): Member
+	  omega_reduce() made (temporarily) publicly available.  Added a
+	  generic method pairwise_apply_assign() to apply a binary operator
+	  to all pairs drawn from two powersets.  A lot of simple operators
+	  declared inline.
+
+2004-12-21 Tuesday 23:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.150), m4/ac_cxx_double_is_iec_559.m4 (1.1),
+	  m4/ac_cxx_float_is_iec_559.m4 (1.1),
+	  m4/ac_cxx_long_double_is_iec_559.m4 (1.1): New tests to check
+	  whether C++ floats, doubles and long doubles comply to IEC 559.
+
+2004-12-21 Tuesday 23:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.149): Detect the sizes of float, double and long
+	  double.
+
+2004-12-21 Tuesday 22:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.50), Determinate.inlines.hh (1.44):
+	  Added a function object adapter to lift any "apply_and_assign"
+	  function object defined on PH so as to obtain the corresponding
+	  function object working on Determinate<PH>.
+
+2004-12-21 Tuesday 22:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Widening_Function.defs.hh (1.9): Unary constructor made
+	  explicit.
+
+2004-12-21 Tuesday 22:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.17): std::swap_iter() ===> std::iter_swap().
+
+2004-12-21 Tuesday 08:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.165), src/Polyhedron.defs.hh (1.261):
+	  Spelling and similar corrections to the documentation.
+
+2004-12-21 Tuesday 08:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_c.h.in (1.43): Spelling and similar corrections
+	  to documentation.
+
+2004-12-20 Monday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Row.cc (1.4): Unused, duplicated code removed.
+
+2004-12-20 Monday 21:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.10): The Comeau and Intel C++
+	  compilers are actually right: if check_result() has internal
+	  linkage (is declared static) then, according to section 14.6.4.2
+	  of the C++ standard (Candidate Functions), it is not a candidate
+	  function and thus it is not found by the name lookup mechanism.
+
+2004-12-20 Monday 14:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/polydifference9.cc (1.6): Comment corrected.
+
+2004-12-20 Monday 11:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.122): Previous change corrected again.
+
+2004-12-20 Monday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.121): Previous change completed.
+
+2004-12-20 Monday 10:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.120): Support definitions for `size_t'
+	  different from `unsigned'.
+
+2004-12-20 Monday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.148): Detect the size of more C types.
+
+2004-12-20 Monday 07:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.10): Fixed an instance of LONG_MAX
+	  that should instead be ULONG_MAX.
+
+2004-12-19 Sunday 12:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.22), configure.ac (1.147): Version
+	  number bumped.
+
+2004-12-19 Sunday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.31): Updated.
+
+2004-12-19 Sunday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.143), Watchdog/NEWS (1.5): The tentative release date for
+	  PPL 0.7 is December 24, 2004.
+
+2004-12-19 Sunday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/swapping_sort.icc (1.7): Make sure emacs recognizes this file
+	  as C++.
+
+2004-12-19 Sunday 09:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.16), interfaces/C/ppl_c.cc (1.119),
+	  interfaces/Prolog/track_allocation.hh (1.14),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.76),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.3),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.2),
+	  interfaces/Prolog/tests/clpq.pl (1.4),
+	  interfaces/Prolog/tests/clpq2.pl (1.4),
+	  interfaces/Prolog/tests/pl_check.pl (1.5), src/Interval.defs.hh
+	  (1.20), src/Interval.inlines.hh (1.16), src/swapping_sort.icc
+	  (1.6), tests/bhz03widening2.cc (1.10), tests/bhz03widening3.cc
+	  (1.9), tests/bhz03widening5.cc (1.7), tests/bhz03widening6.cc
+	  (1.8), tests/expandspacedim1.cc (1.3), tests/foldspacedims1.cc
+	  (1.2), tests/foldspacedims2.cc (1.2), tests/watchdog1.cc (1.21):
+	  Avoid "baStudlyCaps" identifiers everywhere.
+
+2004-12-19 Sunday 09:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.9): Workaround for the Comeau
+	  and Intel C++ compilers: they do not like the use of `static' in
+	  a particular context.
+
+2004-12-19 Sunday 07:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.19), Watchdog/ChangeLog (1.9): Updated.
+
+2004-12-19 Sunday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.26), config.sub (1.24), Watchdog/config.guess
+	  (1.10), Watchdog/config.sub (1.9): Updated.
+
+2004-12-19 Sunday 07:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* install-sh (1.12), Watchdog/install-sh (1.9): Updated from
+	  Automake 1.9.4.
+
+2004-12-18 Saturday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.29): Erase the *.xwam files
+	  so as to force XSB to recompile.
+
+2004-12-18 Saturday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.142): One entry slightly improved.
+
+2004-12-18 Saturday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.149): No longer support unary
+	  plus in linear expressions.  Avoid long source lines.
+
+2004-12-17 Friday 18:59  Abramo Bagnara
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc, XSB/ppl_xsb.cc,
+	  YAP/ppl_yap.cc (altnum.[6,7,7]): Added missing colons.
+
+2004-12-17 Friday 18:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (altnum.15): Created tests/Polyhedron/Makefile.
+
+2004-12-17 Friday 18:20  Abramo Bagnara
+
+	* configure.ac, demos/ppl_lcdd/ppl_lcdd.cc, interfaces/C/ppl_c.cc,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Interval.inlines.hh,
+	  src/Polyhedron_nonpublic.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh
+	  (altnum.[14,9,7,8,5,4,6,7,6,6,14,15,7,10,21,14,15,22,17,20]):
+	  Added rounding support to checked functions.
+
+2004-12-17 Friday 18:18  Abramo Bagnara
+
+	* src/Makefile.am (altnum.19): Added new files.
+
+2004-12-17 Friday 18:17  Abramo Bagnara
+
+	* src/: Limits.hh, float.types.hh (altnum.[3,4]): More portable
+	  code.
+
+2004-12-17 Friday 18:17  Abramo Bagnara
+
+	* src/: Float.defs.hh, Float.inlines.hh (altnum.[1,1]): Better
+	  place for IEC559 format related functions.
+
+2004-12-17 Friday 18:16  Abramo Bagnara
+
+	* src/Numeric_Format.defs.hh (altnum.1): Initial empty
+	  Numeric_Format definition.
+
+2004-12-17 Friday 18:15  Abramo Bagnara
+
+	* src/: Result.defs.hh, Result.inlines.hh (altnum.[1,1]): Better
+	  place for Result.
+
+2004-12-17 Friday 18:15  Abramo Bagnara
+
+	* src/: fpu-c99.inlines.hh, fpu-ia32.inlines.hh, fpu.defs.hh
+	  (altnum.[1,1,1]): FPU manipulation functions.
+
+2004-12-17 Friday 18:14  Abramo Bagnara
+
+	* src/: checked_ext.defs.hh, checked_ext.inlines.hh (altnum.[1,1]):
+	  Better place for new extended numbers functions.
+
+2004-12-17 Friday 18:13  Abramo Bagnara
+
+	* src/: Rounding.defs.hh, Rounding.inlines.hh, Rounding.types.hh
+	  (altnum.[1,1,1]): Rounding mode support.
+
+2004-12-17 Friday 18:11  Abramo Bagnara
+
+	* src/: compiler.hh, globals.defs.hh (altnum.[1,8]): Moved used
+	  helper to better place.
+
+2004-12-17 Friday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.18): Do not mention DB_Shape.cc.
+
+2004-12-17 Friday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.17): Do not mention DB_Matrix.cc.
+
+2004-12-17 Friday 16:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.16): Do not mention DB_Row.cc.
+
+2004-12-17 Friday 12:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.141), interfaces/Prolog/Prolog_interface.dox (1.124): As
+	  it is not in standard Prolog, the unary "+" is not supported in
+	  the Prolog interface.
+
+2004-12-16 Thursday 19:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.128): Dealt with one item of the list.
+
+2004-12-16 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.118): Fixed a problem whereby
+	  ppl_set_error_handler() could have (depending on the compiler
+	  employed) C++ linkage instead of C linkage.
+
+2004-12-16 Thursday 19:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.8): Define a dummy
+	  set_GMP_memory_allocation_functions(), if the C++ compiler does
+	  not support __attribute__((weak)).
+
+2004-12-16 Thursday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.146), demos/ppl_lcdd/ppl_lcdd.cc (1.39): Do not
+	  use C++-style comments in config.h.
+
+2004-12-16 Thursday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.61): Unused variable
+	  `a_throw' removed.
+
+2004-12-16 Thursday 18:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.145), src/Coefficient.types.hh (1.2),
+	  src/ppl_header.middle (1.5): Problem with Comeau C/C++ and the
+	  definition of `int64_t' solved in a better way.  Always link with
+	  the `libm' library.
+
+2004-12-16 Thursday 14:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: addgenerator1.cc (1.9), addgenerator2.cc (1.9): Tests
+	  corrected: they were just calling generators(), yet relying on
+	  the fact that a non-redundant description would have been
+	  obtained.
+
+2004-12-16 Thursday 14:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.46): Added a preprocessing flag to
+	  control whether we insist on returning sorted descriptions.
+	  Currently the flag is unset and we only order the generator
+	  systems of NNC polyhedra, if these are known to be in minimal
+	  form.
+
+2004-12-16 Thursday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.cc (1.13): Corrected a bug in method
+	  add_rows(); the sortedness flag was not handled correctly when
+	  the arguemnt was not sorted or had pending rows. This bug was
+	  hidden by some unnecessary sorting done before calling the
+	  method.
+
+2004-12-16 Thursday 12:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.12): We were relying on a
+	  GCC bug concerning name-lookup.
+
+2004-12-16 Thursday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.middle (1.4): // In order for the definition of
+	  `int64_t' to be seen by Comeau C/C++, // we must make sure
+	  <stdint.h> is included before <sys/types.hh> is // (even
+	  indirectly) included.  #include <stdint.h>
+
+2004-12-16 Thursday 09:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.123): Some errors
+	  corrected. The token C_unsigned now used to name a C unsigned
+	  integer.
+
+2004-12-16 Thursday 08:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.140), interfaces/Prolog/Prolog_interface.dox (1.122),
+	  interfaces/Prolog/ppl_prolog.icc (1.148),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.12),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.8),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.8),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.75),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.49),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.70),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.94),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.36),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.60),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.11),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.9),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.13),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.86),
+	  interfaces/Prolog/tests/clpq.pl (1.3),
+	  interfaces/Prolog/tests/clpq2.pl (1.3),
+	  interfaces/Prolog/tests/pl_check.pl (1.4): In the Prolog
+	  interface, the predicates
+	  ppl_new_polyhedron_universe_from_space_dimension/3 and
+	  ppl_new_polyhedron_empty_from_space_dimension/3 have been
+	  replaced by	 a single predicate
+	  ppl_new_polyhedron_from_space_dimension/4 where the (extra) third
+	  argument    indicates whether the polyhedron to be created should
+	  be the    universe or the empty polyhedron.  NEWS has been
+	  revised accordingly.
+
+2004-12-15 Wednesday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.9): Declare strtoll() and
+	  strtoull() if they are not already declared.
+
+2004-12-15 Wednesday 23:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.12): Fixed the return value of
+	  template <typename Policy, typename T> Result succ_float(T&).
+
+2004-12-15 Wednesday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.inlines.hh (1.10): Fixed
+	  Linear_System::With_Saturation_Matrix_iterator::operator->().
+
+2004-12-15 Wednesday 23:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Saturation_Row.cc (1.3), Saturation_Row.inlines.hh (1.2):
+	  Depend on HAVE_DECL_FFS instead of HAS_FFS.
+
+2004-12-15 Wednesday 23:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.144): Checks for the availability of ffs, strtoll
+	  and strtoull in C++.
+
+2004-12-15 Wednesday 23:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.defs.hh (1.11): Use
+	  std::iterator_traits<Iter1>::attribute instead of
+	  Iter1::attribute.
+
+2004-12-15 Wednesday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Limits.hh (1.3), checked_float.inlines.hh (1.11),
+	  checked_int.inlines.hh (1.8): Moved the declaration of LLONG_MIN,
+	  LLONG_MAX and ULLONG_MAX to Limits.hh.  Refer to C99 standard
+	  types uint*_t instead of u_int*_t.  Include <climits> and
+	  <cstdlib> instead of <limits.h> and <stdlib.h>.
+
+2004-12-15 Wednesday 18:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.7): Define ULLONG_MAX, if it is not
+	  already defined.  Use ULLONG_MAX instead of ULONG_LONG_MAX, since
+	  the latter is GCC-specific.
+
+2004-12-15 Wednesday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.91): Explicitly pass CPPFLAGS when invoking
+	  CXXCPP explicitly.
+
+2004-12-15 Wednesday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.143): Added a check for the size of long long.
+	  Fixed a couple of comments.
+
+2004-12-14 Tuesday 13:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.139), interfaces/Prolog/Prolog_interface.dox (1.121),
+	  interfaces/Prolog/ppl_prolog.icc (1.147),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.11),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.7),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.7),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.74),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.48),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.69),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.93),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.35),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.59),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.10),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.8),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.12),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.85),
+	  interfaces/Prolog/tests/clpq.pl (1.2),
+	  interfaces/Prolog/tests/clpq2.pl (1.2),
+	  interfaces/Prolog/tests/pl_check.pl (1.3): In the Prolog
+	  interface, the predicate    ppl_new_polyhedron_from_dimension/3
+	  has been renamed
+	  ppl_new_polyhedron_universe_from_space_dimension/3	and the
+	  predicate    ppl_new_polyhedron_empty_from_dimension/3 has been
+	  renamed    ppl_new_polyhedron_empty_from_space_dimension/3.  NEWS
+	  updated to include this information.
+
+2004-12-14 Tuesday 11:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.120): Replace the date
+	  type "Integer" used in the syntax specification by
+	  "Dimension_Type", "Coefficient", "C_int", or "Token_Flag" as
+	  appropriate.	Some other small improvements and corrections also
+	  done.
+
+2004-12-14 Tuesday 10:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.42): Reverted previous change, since
+	  it was hiding a doxygen bug, which is the actual source of the
+	  undefined reference.
+
+2004-12-13 Monday 15:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.41): Avoid autolink generation for
+	  ppl_c.h.
+
+2004-12-13 Monday 15:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.tex (1.16), user.tex (1.17): Also thank the new
+	  COFIN project.
+
+2004-12-13 Monday 15:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron_nonpublic.cc (1.40), Polyhedron_public.cc
+	  (1.45): Minor documentation changes; use const where appropriate.
+
+2004-12-13 Monday 08:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.127): The sorting routines have been completely
+	  rewritten.CVS:
+	  ----------------------------------------------------------------------
+
+2004-12-12 Sunday 18:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.types.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Matrix.types.hh,
+	  src/DB_Row.defs.hh, src/DB_Row.inlines.hh, src/DB_Row.types.hh,
+	  src/E_NIT.defs.hh, src/E_NIT.inlines.hh, src/E_NIT.types.hh,
+	  src/E_Rational.defs.hh, src/E_Rational.inlines.hh,
+	  src/E_Rational.types.hh, src/Makefile.am,
+	  src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+	  src/Ptr_Iterator.types.hh, src/globals.defs.hh,
+	  src/globals.inlines.hh
+	  (altnum.[4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,1,1,1,7,4]):
+	  Added a draft implementation of bounded differences.
+
+2004-12-12 Sunday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (altnum.2): The `BBox' class
+	  implementation is now contained in the convenience library
+	  `libppl_tests'.
+
+2004-12-12 Sunday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, tests/.cvsignore, tests/CbecomesNNC1.cc,
+	  tests/Makefile.am, tests/NNCbecomesC1.cc, tests/NNCminimize1.cc,
+	  tests/NNCminimize2.cc, tests/NNCminimize3.cc,
+	  tests/NNCminimize4.cc, tests/NNCminimize5.cc,
+	  tests/NNCminimize6.cc, tests/README, tests/addconstraint1.cc,
+	  tests/addconstraint2.cc, tests/addconstraint3.cc,
+	  tests/addconstraints1.cc, tests/addconstraints10.cc,
+	  tests/addconstraints11.cc, tests/addconstraints12.cc,
+	  tests/addconstraints13.cc, tests/addconstraints2.cc,
+	  tests/addconstraints3.cc, tests/addconstraints4.cc,
+	  tests/addconstraints5.cc, tests/addconstraints6.cc,
+	  tests/addconstraints7.cc, tests/addconstraints8.cc,
+	  tests/addconstraints9.cc, tests/addgenerator1.cc,
+	  tests/addgenerator2.cc, tests/addgenerator3.cc,
+	  tests/addgenerator4.cc, tests/addgenerator5.cc,
+	  tests/addgenerators1.cc, tests/addgenerators10.cc,
+	  tests/addgenerators11.cc, tests/addgenerators12.cc,
+	  tests/addgenerators13.cc, tests/addgenerators2.cc,
+	  tests/addgenerators3.cc, tests/addgenerators4.cc,
+	  tests/addgenerators5.cc, tests/addgenerators6.cc,
+	  tests/addgenerators7.cc, tests/addgenerators8.cc,
+	  tests/addgenerators9.cc, tests/addspacedims1.cc,
+	  tests/addspacedims10.cc, tests/addspacedims11.cc,
+	  tests/addspacedims12.cc, tests/addspacedims13.cc,
+	  tests/addspacedims2.cc, tests/addspacedims3.cc,
+	  tests/addspacedims4.cc, tests/addspacedims5.cc,
+	  tests/addspacedims6.cc, tests/addspacedims7.cc,
+	  tests/addspacedims8.cc, tests/addspacedims9.cc,
+	  tests/affineimage1.cc, tests/affineimage2.cc,
+	  tests/affineimage3.cc, tests/affineimage4.cc,
+	  tests/affineimage5.cc, tests/affineimage6.cc,
+	  tests/affineimage7.cc, tests/affineimage8.cc,
+	  tests/affineimage9.cc, tests/affinepreimage1.cc,
+	  tests/affinepreimage10.cc, tests/affinepreimage2.cc,
+	  tests/affinepreimage3.cc, tests/affinepreimage4.cc,
+	  tests/affinepreimage5.cc, tests/affinepreimage6.cc,
+	  tests/affinepreimage7.cc, tests/affinepreimage8.cc,
+	  tests/affinepreimage9.cc, tests/affinetrans.cc, tests/append1.cc,
+	  tests/append2.cc, tests/ascii_dump_load1.cc,
+	  tests/ascii_dump_load2.cc, tests/ascii_dump_load3.cc,
+	  tests/ascii_dump_load4.cc, tests/ascii_dump_load5.cc,
+	  tests/ascii_dump_load6.cc, tests/ascii_dump_load7.cc,
+	  tests/bgp99extrapolation1.cc, tests/bgp99extrapolation2.cc,
+	  tests/bhrz03widening1.cc, tests/bhrz03widening10.cc,
+	  tests/bhrz03widening11.cc, tests/bhrz03widening12.cc,
+	  tests/bhrz03widening13.cc, tests/bhrz03widening14.cc,
+	  tests/bhrz03widening15.cc, tests/bhrz03widening16.cc,
+	  tests/bhrz03widening17.cc, tests/bhrz03widening18.cc,
+	  tests/bhrz03widening19.cc, tests/bhrz03widening2.cc,
+	  tests/bhrz03widening3.cc, tests/bhrz03widening4.cc,
+	  tests/bhrz03widening5.cc, tests/bhrz03widening6.cc,
+	  tests/bhrz03widening7.cc, tests/bhrz03widening8.cc,
+	  tests/bhrz03widening9.cc, tests/bhz03widening1.cc,
+	  tests/bhz03widening2.cc, tests/bhz03widening3.cc,
+	  tests/bhz03widening4.cc, tests/bhz03widening5.cc,
+	  tests/bhz03widening6.cc, tests/bounded1.cc,
+	  tests/boundedh79extrapolation1.cc, tests/boundingbox1.cc,
+	  tests/boundingbox2.cc, tests/boundingbox3.cc,
+	  tests/boundingbox4.cc, tests/boundingbox5.cc, tests/bounds1.cc,
+	  tests/bounds2.cc, tests/concatenate1.cc, tests/concatenate2.cc,
+	  tests/concatenate3.cc, tests/concatenate4.cc,
+	  tests/concatenate5.cc, tests/concatenate6.cc,
+	  tests/constraints1.cc, tests/constraints2.cc,
+	  tests/constraints3.cc, tests/constraints4.cc, tests/contains1.cc,
+	  tests/contains2.cc, tests/contains3.cc, tests/contains4.cc,
+	  tests/contains5.cc, tests/disjoint1.cc, tests/disjoint2.cc,
+	  tests/disjoint3.cc, tests/dualhypercubes.cc, tests/empty1.cc,
+	  tests/equals1.cc, tests/exceptions1.cc, tests/exceptions2.cc,
+	  tests/exceptions3.cc, tests/expandspacedim1.cc,
+	  tests/expandspacedim2.cc, tests/foldspacedims1.cc,
+	  tests/foldspacedims2.cc, tests/generalizedaffineimage1.cc,
+	  tests/generalizedaffineimage10.cc,
+	  tests/generalizedaffineimage11.cc,
+	  tests/generalizedaffineimage12.cc,
+	  tests/generalizedaffineimage2.cc,
+	  tests/generalizedaffineimage3.cc,
+	  tests/generalizedaffineimage4.cc,
+	  tests/generalizedaffineimage5.cc,
+	  tests/generalizedaffineimage6.cc,
+	  tests/generalizedaffineimage7.cc,
+	  tests/generalizedaffineimage8.cc,
+	  tests/generalizedaffineimage9.cc, tests/generators1.cc,
+	  tests/generators2.cc, tests/generators3.cc, tests/generators4.cc,
+	  tests/generators5.cc, tests/generators6.cc, tests/geomcovers1.cc,
+	  tests/h79widening1.cc, tests/h79widening2.cc,
+	  tests/h79widening3.cc, tests/h79widening4.cc,
+	  tests/h79widening5.cc, tests/h79widening6.cc,
+	  tests/h79widening7.cc, tests/h79widening8.cc,
+	  tests/intersection1.cc, tests/intersection10.cc,
+	  tests/intersection11.cc, tests/intersection2.cc,
+	  tests/intersection3.cc, tests/intersection4.cc,
+	  tests/intersection5.cc, tests/intersection6.cc,
+	  tests/intersection7.cc, tests/intersection8.cc,
+	  tests/intersection9.cc, tests/limitedbhrz03extrapolation1.cc,
+	  tests/limitedh79extrapolation1.cc,
+	  tests/limitedh79extrapolation2.cc,
+	  tests/limitedh79extrapolation3.cc,
+	  tests/limitedh79extrapolation4.cc, tests/linearpartition1.cc,
+	  tests/linearpartition2.cc, tests/linearpartition3.cc,
+	  tests/linearpartition4.cc, tests/linexpression1.cc,
+	  tests/mapspacedims1.cc, tests/mapspacedims2.cc,
+	  tests/mapspacedims3.cc, tests/mapspacedims4.cc,
+	  tests/max_min1.cc, tests/max_min2.cc, tests/maxspacedim1.cc,
+	  tests/mc91.cc, tests/membytes1.cc, tests/membytes2.cc,
+	  tests/memory1.cc, tests/minconstraints1.cc,
+	  tests/minconstraints2.cc, tests/minconstraints3.cc,
+	  tests/minconstraints4.cc, tests/mingenerators1.cc,
+	  tests/mingenerators2.cc, tests/mingenerators3.cc,
+	  tests/onepoint.cc, tests/permute.cc, tests/polydifference1.cc,
+	  tests/polydifference2.cc, tests/polydifference3.cc,
+	  tests/polydifference4.cc, tests/polydifference5.cc,
+	  tests/polydifference6.cc, tests/polydifference7.cc,
+	  tests/polydifference8.cc, tests/polydifference9.cc,
+	  tests/polyhull1.cc, tests/polyhull10.cc, tests/polyhull11.cc,
+	  tests/polyhull2.cc, tests/polyhull3.cc, tests/polyhull4.cc,
+	  tests/polyhull5.cc, tests/polyhull6.cc, tests/polyhull7.cc,
+	  tests/polyhull8.cc, tests/polyhull9.cc, tests/randphull1.cc,
+	  tests/randphull2.cc, tests/relations1.cc, tests/relations10.cc,
+	  tests/relations11.cc, tests/relations12.cc, tests/relations13.cc,
+	  tests/relations14.cc, tests/relations15.cc, tests/relations16.cc,
+	  tests/relations17.cc, tests/relations18.cc, tests/relations19.cc,
+	  tests/relations2.cc, tests/relations3.cc, tests/relations4.cc,
+	  tests/relations5.cc, tests/relations6.cc, tests/relations7.cc,
+	  tests/relations8.cc, tests/relations9.cc,
+	  tests/removespacedims1.cc, tests/removespacedims10.cc,
+	  tests/removespacedims2.cc, tests/removespacedims3.cc,
+	  tests/removespacedims4.cc, tests/removespacedims5.cc,
+	  tests/removespacedims6.cc, tests/removespacedims7.cc,
+	  tests/removespacedims8.cc, tests/removespacedims9.cc,
+	  tests/smm1.cc, tests/timeelapse1.cc, tests/timeelapse2.cc,
+	  tests/timeelapse3.cc, tests/timeelapse4.cc, tests/timeelapse5.cc,
+	  tests/timeelapse6.cc, tests/timeelapse7.cc, tests/timeelapse8.cc,
+	  tests/topclosed1.cc, tests/topclosed2.cc, tests/topclosed3.cc,
+	  tests/topclosure1.cc, tests/topclosure2.cc, tests/topclosure3.cc,
+	  tests/topclosure4.cc, tests/universe1.cc, tests/universe2.cc,
+	  tests/universe3.cc, tests/universe4.cc, tests/universe5.cc,
+	  tests/universe6.cc, tests/universe7.cc,
+	  tests/valgrind_suppressions, tests/watchdog1.cc,
+	  tests/writeconsys1.cc, tests/writegensys1.cc,
+	  tests/writegensys2.cc, tests/writegensys3.cc,
+	  tests/writepolyhedron1.cc, tests/writepolyhedron2.cc,
+	  tests/writepolyhedron3.cc, tests/writerelation1.cc,
+	  tests/writevariable1.cc, tests/Polyhedron/.cvsignore,
+	  tests/Polyhedron/CbecomesNNC1.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/NNCbecomesC1.cc,
+	  tests/Polyhedron/NNCminimize1.cc,
+	  tests/Polyhedron/NNCminimize2.cc,
+	  tests/Polyhedron/NNCminimize3.cc,
+	  tests/Polyhedron/NNCminimize4.cc,
+	  tests/Polyhedron/NNCminimize5.cc,
+	  tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraint2.cc,
+	  tests/Polyhedron/addconstraint3.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints10.cc,
+	  tests/Polyhedron/addconstraints11.cc,
+	  tests/Polyhedron/addconstraints12.cc,
+	  tests/Polyhedron/addconstraints13.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addconstraints3.cc,
+	  tests/Polyhedron/addconstraints4.cc,
+	  tests/Polyhedron/addconstraints5.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/addconstraints7.cc,
+	  tests/Polyhedron/addconstraints8.cc,
+	  tests/Polyhedron/addconstraints9.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerator3.cc,
+	  tests/Polyhedron/addgenerator4.cc,
+	  tests/Polyhedron/addgenerator5.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators10.cc,
+	  tests/Polyhedron/addgenerators11.cc,
+	  tests/Polyhedron/addgenerators12.cc,
+	  tests/Polyhedron/addgenerators13.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addgenerators3.cc,
+	  tests/Polyhedron/addgenerators4.cc,
+	  tests/Polyhedron/addgenerators5.cc,
+	  tests/Polyhedron/addgenerators6.cc,
+	  tests/Polyhedron/addgenerators7.cc,
+	  tests/Polyhedron/addgenerators8.cc,
+	  tests/Polyhedron/addgenerators9.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims10.cc,
+	  tests/Polyhedron/addspacedims11.cc,
+	  tests/Polyhedron/addspacedims12.cc,
+	  tests/Polyhedron/addspacedims13.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/addspacedims4.cc,
+	  tests/Polyhedron/addspacedims5.cc,
+	  tests/Polyhedron/addspacedims6.cc,
+	  tests/Polyhedron/addspacedims7.cc,
+	  tests/Polyhedron/addspacedims8.cc,
+	  tests/Polyhedron/addspacedims9.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affineimage3.cc,
+	  tests/Polyhedron/affineimage4.cc,
+	  tests/Polyhedron/affineimage5.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/affineimage7.cc,
+	  tests/Polyhedron/affineimage8.cc,
+	  tests/Polyhedron/affineimage9.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinepreimage10.cc,
+	  tests/Polyhedron/affinepreimage2.cc,
+	  tests/Polyhedron/affinepreimage3.cc,
+	  tests/Polyhedron/affinepreimage4.cc,
+	  tests/Polyhedron/affinepreimage5.cc,
+	  tests/Polyhedron/affinepreimage6.cc,
+	  tests/Polyhedron/affinepreimage7.cc,
+	  tests/Polyhedron/affinepreimage8.cc,
+	  tests/Polyhedron/affinepreimage9.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/ascii_dump_load4.cc,
+	  tests/Polyhedron/ascii_dump_load5.cc,
+	  tests/Polyhedron/ascii_dump_load6.cc,
+	  tests/Polyhedron/ascii_dump_load7.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening10.cc,
+	  tests/Polyhedron/bhrz03widening11.cc,
+	  tests/Polyhedron/bhrz03widening12.cc,
+	  tests/Polyhedron/bhrz03widening13.cc,
+	  tests/Polyhedron/bhrz03widening14.cc,
+	  tests/Polyhedron/bhrz03widening15.cc,
+	  tests/Polyhedron/bhrz03widening16.cc,
+	  tests/Polyhedron/bhrz03widening17.cc,
+	  tests/Polyhedron/bhrz03widening18.cc,
+	  tests/Polyhedron/bhrz03widening19.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhrz03widening4.cc,
+	  tests/Polyhedron/bhrz03widening5.cc,
+	  tests/Polyhedron/bhrz03widening6.cc,
+	  tests/Polyhedron/bhrz03widening7.cc,
+	  tests/Polyhedron/bhrz03widening8.cc,
+	  tests/Polyhedron/bhrz03widening9.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening4.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc,
+	  tests/Polyhedron/boundingbox4.cc,
+	  tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/bounds2.cc, tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/concatenate2.cc,
+	  tests/Polyhedron/concatenate3.cc,
+	  tests/Polyhedron/concatenate4.cc,
+	  tests/Polyhedron/concatenate5.cc,
+	  tests/Polyhedron/concatenate6.cc,
+	  tests/Polyhedron/constraints1.cc,
+	  tests/Polyhedron/constraints2.cc,
+	  tests/Polyhedron/constraints3.cc,
+	  tests/Polyhedron/constraints4.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+	  tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/disjoint3.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage10.cc,
+	  tests/Polyhedron/generalizedaffineimage11.cc,
+	  tests/Polyhedron/generalizedaffineimage12.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffineimage3.cc,
+	  tests/Polyhedron/generalizedaffineimage4.cc,
+	  tests/Polyhedron/generalizedaffineimage5.cc,
+	  tests/Polyhedron/generalizedaffineimage6.cc,
+	  tests/Polyhedron/generalizedaffineimage7.cc,
+	  tests/Polyhedron/generalizedaffineimage8.cc,
+	  tests/Polyhedron/generalizedaffineimage9.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+	  tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+	  tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+	  tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc,
+	  tests/Polyhedron/h79widening3.cc,
+	  tests/Polyhedron/h79widening4.cc,
+	  tests/Polyhedron/h79widening5.cc,
+	  tests/Polyhedron/h79widening6.cc,
+	  tests/Polyhedron/h79widening7.cc,
+	  tests/Polyhedron/h79widening8.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/intersection10.cc,
+	  tests/Polyhedron/intersection11.cc,
+	  tests/Polyhedron/intersection2.cc,
+	  tests/Polyhedron/intersection3.cc,
+	  tests/Polyhedron/intersection4.cc,
+	  tests/Polyhedron/intersection5.cc,
+	  tests/Polyhedron/intersection6.cc,
+	  tests/Polyhedron/intersection7.cc,
+	  tests/Polyhedron/intersection8.cc,
+	  tests/Polyhedron/intersection9.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation2.cc,
+	  tests/Polyhedron/limitedh79extrapolation3.cc,
+	  tests/Polyhedron/limitedh79extrapolation4.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearpartition2.cc,
+	  tests/Polyhedron/linearpartition3.cc,
+	  tests/Polyhedron/linearpartition4.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/mapspacedims1.cc,
+	  tests/Polyhedron/mapspacedims2.cc,
+	  tests/Polyhedron/mapspacedims3.cc,
+	  tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/max_min1.cc,
+	  tests/Polyhedron/max_min2.cc, tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+	  tests/Polyhedron/membytes2.cc, tests/Polyhedron/memory1.cc,
+	  tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/minconstraints3.cc,
+	  tests/Polyhedron/minconstraints4.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/mingenerators3.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polydifference3.cc,
+	  tests/Polyhedron/polydifference4.cc,
+	  tests/Polyhedron/polydifference5.cc,
+	  tests/Polyhedron/polydifference6.cc,
+	  tests/Polyhedron/polydifference7.cc,
+	  tests/Polyhedron/polydifference8.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+	  tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+	  tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+	  tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+	  tests/Polyhedron/polyhull9.cc, tests/Polyhedron/randphull1.cc,
+	  tests/Polyhedron/randphull2.cc, tests/Polyhedron/relations1.cc,
+	  tests/Polyhedron/relations10.cc, tests/Polyhedron/relations11.cc,
+	  tests/Polyhedron/relations12.cc, tests/Polyhedron/relations13.cc,
+	  tests/Polyhedron/relations14.cc, tests/Polyhedron/relations15.cc,
+	  tests/Polyhedron/relations16.cc, tests/Polyhedron/relations17.cc,
+	  tests/Polyhedron/relations18.cc, tests/Polyhedron/relations19.cc,
+	  tests/Polyhedron/relations2.cc, tests/Polyhedron/relations3.cc,
+	  tests/Polyhedron/relations4.cc, tests/Polyhedron/relations5.cc,
+	  tests/Polyhedron/relations6.cc, tests/Polyhedron/relations7.cc,
+	  tests/Polyhedron/relations8.cc, tests/Polyhedron/relations9.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims10.cc,
+	  tests/Polyhedron/removespacedims2.cc,
+	  tests/Polyhedron/removespacedims3.cc,
+	  tests/Polyhedron/removespacedims4.cc,
+	  tests/Polyhedron/removespacedims5.cc,
+	  tests/Polyhedron/removespacedims6.cc,
+	  tests/Polyhedron/removespacedims7.cc,
+	  tests/Polyhedron/removespacedims8.cc,
+	  tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+	  tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+	  tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+	  tests/Polyhedron/topclosed1.cc, tests/Polyhedron/topclosed2.cc,
+	  tests/Polyhedron/topclosed3.cc, tests/Polyhedron/topclosure1.cc,
+	  tests/Polyhedron/topclosure2.cc, tests/Polyhedron/topclosure3.cc,
+	  tests/Polyhedron/topclosure4.cc, tests/Polyhedron/universe1.cc,
+	  tests/Polyhedron/universe2.cc, tests/Polyhedron/universe3.cc,
+	  tests/Polyhedron/universe4.cc, tests/Polyhedron/universe5.cc,
+	  tests/Polyhedron/universe6.cc, tests/Polyhedron/universe7.cc,
+	  tests/Polyhedron/valgrind_suppressions,
+	  tests/Polyhedron/watchdog1.cc, tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writegensys2.cc,
+	  tests/Polyhedron/writegensys3.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writepolyhedron3.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc
+	  (altnum.[13,2,2,8,2,2,2,2,2,3,2,2,3,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,3,3,2,2,4,2,2,2,2,2,2,2,2,2,2,3,4,3,2,2,2,3,3,3,3,3,2,3,1,1,2,1,1,1,2,1,3,2,1,1,1,2,1,1,2,1,1,2,2,2,1,1,1,2,1,1,2,5,4,2,1,1,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,3,5,4,5,5,4,4,2,2,6,4,3,3,2,2,1,3,2,2,2,1,1,2,2,2,2,1,2,2,2,2,1,2,2,3,2,2,3,4,5,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,3,3,2,3,2,2,3,1,1,1,2,1,2,1,2,1,1,1,2,1,2,1,2,1,1,1,2,2,2,3,2,3,3,3,3,2,3,2,2,2,2,2,3,2,3,2,1,2,2,2,2,2,2,2,1,2,3,2,2,1,1,1,1,3,4,2,2,2,2,1,1,1,1,2,1,1 [...]
+	  Tests for the polyhedra classes are now in `tests/Polyhedron'.
+
+2004-12-12 Sunday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.inlines.hh (1.7): Added the implementation of
+	  constructors from native floating-point types.
+
+2004-12-11 Saturday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, README, STANDARDS, TODO, configure.ac,
+	  Watchdog/EList_Iterator.inlines.hh, Watchdog/Handler.defs.hh,
+	  Watchdog/Makefile.am, Watchdog/Watchdog.defs.hh,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/allzero.ine,
+	  demos/ppl_lcdd/examples/ccc4.ext,
+	  demos/ppl_lcdd/examples/ccp4.ext,
+	  demos/ppl_lcdd/examples/cp4.ext, demos/ppl_lcdd/examples/cp4.ine,
+	  demos/ppl_lcdd/examples/cp5.ine, demos/ppl_lcdd/examples/cp6.ine,
+	  demos/ppl_lcdd/examples/cp7.ext,
+	  demos/ppl_lcdd/examples/cross10.ine,
+	  demos/ppl_lcdd/examples/cross12.ine,
+	  demos/ppl_lcdd/examples/cross4.ine,
+	  demos/ppl_lcdd/examples/cross6.ine,
+	  demos/ppl_lcdd/examples/cross8.ine,
+	  demos/ppl_lcdd/examples/cube.ext,
+	  demos/ppl_lcdd/examples/cubetop.ine,
+	  demos/ppl_lcdd/examples/cubocta.ine,
+	  demos/ppl_lcdd/examples/cut16_11.ext,
+	  demos/ppl_lcdd/examples/cut32_16.ext,
+	  demos/ppl_lcdd/examples/cyc.ine,
+	  demos/ppl_lcdd/examples/cyclic16-10.ext,
+	  demos/ppl_lcdd/examples/cyclic25_13.ext,
+	  demos/ppl_lcdd/examples/ex1.ine,
+	  demos/ppl_lcdd/examples/grcubocta.ine,
+	  demos/ppl_lcdd/examples/in0.ine, demos/ppl_lcdd/examples/in1.ine,
+	  demos/ppl_lcdd/examples/in2.ine, demos/ppl_lcdd/examples/in3.ine,
+	  demos/ppl_lcdd/examples/in4.ine, demos/ppl_lcdd/examples/in5.ine,
+	  demos/ppl_lcdd/examples/in6.ine, demos/ppl_lcdd/examples/in7.ine,
+	  demos/ppl_lcdd/examples/integralpoints.ine,
+	  demos/ppl_lcdd/examples/irbox20-4.ext,
+	  demos/ppl_lcdd/examples/irbox200-4.ext,
+	  demos/ppl_lcdd/examples/kkd18_4.ine,
+	  demos/ppl_lcdd/examples/kkd27_5.ine,
+	  demos/ppl_lcdd/examples/kkd38_6.ine,
+	  demos/ppl_lcdd/examples/kq20_11_m.ine,
+	  demos/ppl_lcdd/examples/metric40_11.ine,
+	  demos/ppl_lcdd/examples/metric80_16.ine,
+	  demos/ppl_lcdd/examples/mit.ine,
+	  demos/ppl_lcdd/examples/mit288-281.ine,
+	  demos/ppl_lcdd/examples/mit31-20.ine,
+	  demos/ppl_lcdd/examples/mit41-16.ine,
+	  demos/ppl_lcdd/examples/mit708-9.ine,
+	  demos/ppl_lcdd/examples/mit71-61.ine,
+	  demos/ppl_lcdd/examples/mit90-86.ine,
+	  demos/ppl_lcdd/examples/mp5.ext, demos/ppl_lcdd/examples/mp5.ine,
+	  demos/ppl_lcdd/examples/mp5a.ine,
+	  demos/ppl_lcdd/examples/mp6.ine,
+	  demos/ppl_lcdd/examples/origin.ine,
+	  demos/ppl_lcdd/examples/project2res.ine,
+	  demos/ppl_lcdd/examples/rcubocta.ine,
+	  demos/ppl_lcdd/examples/reg24-5.ext,
+	  demos/ppl_lcdd/examples/reg24-5.ine,
+	  demos/ppl_lcdd/examples/sampleh1.ine,
+	  demos/ppl_lcdd/examples/sampleh3.ine,
+	  demos/ppl_lcdd/examples/sampleh4.ine,
+	  demos/ppl_lcdd/examples/sampleh6.ine,
+	  demos/ppl_lcdd/examples/sampleh7.ine,
+	  demos/ppl_lcdd/examples/sampleh8.ine,
+	  demos/ppl_lcdd/examples/samplev1.ext,
+	  demos/ppl_lcdd/examples/samplev3.ext,
+	  demos/ppl_lcdd/examples/trunc10.ine,
+	  demos/ppl_lcdd/examples/trunc7.ine,
+	  demos/ppl_lcdd/examples/tsp5.ext,
+	  demos/ppl_lcdd/examples/tsp5.ine, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+	  demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+	  demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+	  demos/ppl_lpsol/ppl_lpsol.c, doc/Makefile.am,
+	  doc/definitions.dox, doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/fdl.tex, doc/user-browse.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/tests/pl_check.pl, src/AskTell.defs.hh,
+	  src/AskTell.inlines.hh, src/AskTell.types.hh,
+	  src/Ask_Tell.defs.hh, src/Ask_Tell.inlines.hh,
+	  src/Ask_Tell.types.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh, src/BoundingBox.cc,
+	  src/BoundingBox.defs.hh, src/BoundingBox.inlines.hh,
+	  src/BoundingBox.types.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+	  src/Bounding_Box.types.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Checked_Number.inlines.hh, src/Coefficient.cc,
+	  src/Coefficient.defs.hh, src/Coefficient.inlines.hh,
+	  src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+	  src/ConSys.cc, src/ConSys.defs.hh, src/ConSys.inlines.hh,
+	  src/ConSys.types.hh, src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Constraint_System.cc,
+	  src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	  src/Constraint_System.types.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GMP_Integer.types.hh,
+	  src/GenSys.cc, src/GenSys.defs.hh, src/GenSys.inlines.hh,
+	  src/GenSys.types.hh, src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	  src/Generator_System.types.hh, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/Integer.cc, src/Integer.defs.hh,
+	  src/Integer.inlines.hh, src/Integer.types.hh,
+	  src/Integer_macros.hh, src/Integer_traits_template.hh,
+	  src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/LinExpression.cc, src/LinExpression.defs.hh,
+	  src/LinExpression.inlines.hh, src/LinExpression.types.hh,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Linear_Expression.inlines.hh, src/Linear_Expression.types.hh,
+	  src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	  src/Linear_Row.inlines.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/Makefile.am, src/Matrix.defs.hh, src/Matrix.inlines.hh,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Native_Integer.types.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh, src/Row.cc,
+	  src/Row.defs.hh, src/Row.inlines.hh, src/SatMatrix.cc,
+	  src/SatMatrix.defs.hh, src/SatMatrix.inlines.hh,
+	  src/SatMatrix.types.hh, src/SatRow.cc, src/SatRow.defs.hh,
+	  src/SatRow.inlines.hh, src/SatRow.types.hh,
+	  src/Saturation_Matrix.cc, src/Saturation_Matrix.defs.hh,
+	  src/Saturation_Matrix.inlines.hh, src/Saturation_Matrix.types.hh,
+	  src/Saturation_Row.cc, src/Saturation_Row.defs.hh,
+	  src/Saturation_Row.inlines.hh, src/Saturation_Row.types.hh,
+	  src/Variable.cc, src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Widening_Function.defs.hh, src/Widening_Function.inlines.hh,
+	  src/algorithms.hh, src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/conversion.cc, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh, src/minimize.cc,
+	  src/simplify.cc, src/swapping_sort.icc, tests/BBox.cc,
+	  tests/BBox.hh, tests/Makefile.am, tests/NNCminimize1.cc,
+	  tests/NNCminimize2.cc, tests/NNCminimize3.cc,
+	  tests/NNCminimize4.cc, tests/NNCminimize5.cc,
+	  tests/NNCminimize6.cc, tests/addconstraint1.cc,
+	  tests/addconstraints1.cc, tests/addconstraints10.cc,
+	  tests/addconstraints11.cc, tests/addconstraints12.cc,
+	  tests/addconstraints13.cc, tests/addconstraints2.cc,
+	  tests/addconstraints3.cc, tests/addconstraints4.cc,
+	  tests/addconstraints5.cc, tests/addconstraints6.cc,
+	  tests/addconstraints7.cc, tests/addconstraints8.cc,
+	  tests/addconstraints9.cc, tests/addgenerator1.cc,
+	  tests/addgenerator2.cc, tests/addgenerator3.cc,
+	  tests/addgenerator4.cc, tests/addgenerator5.cc,
+	  tests/addgenerators1.cc, tests/addgenerators10.cc,
+	  tests/addgenerators11.cc, tests/addgenerators12.cc,
+	  tests/addgenerators13.cc, tests/addgenerators2.cc,
+	  tests/addgenerators3.cc, tests/addgenerators4.cc,
+	  tests/addgenerators5.cc, tests/addgenerators6.cc,
+	  tests/addgenerators7.cc, tests/addgenerators8.cc,
+	  tests/addgenerators9.cc, tests/addspacedims1.cc,
+	  tests/addspacedims10.cc, tests/addspacedims11.cc,
+	  tests/addspacedims3.cc, tests/addspacedims4.cc,
+	  tests/addspacedims5.cc, tests/addspacedims6.cc,
+	  tests/addspacedims7.cc, tests/addspacedims9.cc,
+	  tests/affineimage3.cc, tests/affineimage7.cc,
+	  tests/affinepreimage1.cc, tests/affinepreimage4.cc,
+	  tests/affinepreimage7.cc, tests/affinetrans.cc,
+	  tests/ascii_dump_load4.cc, tests/ascii_dump_load7.cc,
+	  tests/bgp99extrapolation1.cc, tests/bhrz03widening1.cc,
+	  tests/bhrz03widening12.cc, tests/bhrz03widening13.cc,
+	  tests/bhrz03widening14.cc, tests/bhrz03widening15.cc,
+	  tests/bhrz03widening16.cc, tests/bhrz03widening17.cc,
+	  tests/bhrz03widening18.cc, tests/bhrz03widening19.cc,
+	  tests/bhrz03widening2.cc, tests/bhrz03widening6.cc,
+	  tests/bhrz03widening7.cc, tests/bhrz03widening8.cc,
+	  tests/bhrz03widening9.cc, tests/bhz03widening1.cc,
+	  tests/bhz03widening3.cc, tests/bhz03widening4.cc,
+	  tests/bounded1.cc, tests/boundedh79extrapolation1.cc,
+	  tests/boundingbox1.cc, tests/boundingbox2.cc,
+	  tests/boundingbox3.cc, tests/boundingbox4.cc, tests/bounds1.cc,
+	  tests/concatenate1.cc, tests/concatenate2.cc,
+	  tests/concatenate3.cc, tests/concatenate4.cc,
+	  tests/constraints1.cc, tests/constraints2.cc,
+	  tests/constraints3.cc, tests/constraints4.cc, tests/contains2.cc,
+	  tests/contains3.cc, tests/contains4.cc, tests/contains5.cc,
+	  tests/disjoint2.cc, tests/disjoint3.cc, tests/dualhypercubes.cc,
+	  tests/empty1.cc, tests/exceptions1.cc, tests/exceptions2.cc,
+	  tests/exceptions3.cc, tests/expandspacedim1.cc,
+	  tests/generalizedaffineimage9.cc, tests/generators1.cc,
+	  tests/generators2.cc, tests/generators3.cc, tests/generators4.cc,
+	  tests/generators5.cc, tests/generators6.cc, tests/geomcovers1.cc,
+	  tests/h79widening4.cc, tests/intersection2.cc,
+	  tests/intersection4.cc, tests/intersection6.cc,
+	  tests/limitedbhrz03extrapolation1.cc,
+	  tests/limitedh79extrapolation1.cc,
+	  tests/limitedh79extrapolation2.cc,
+	  tests/limitedh79extrapolation3.cc,
+	  tests/limitedh79extrapolation4.cc, tests/linexpression1.cc,
+	  tests/mapspacedims1.cc, tests/max_min1.cc, tests/max_min2.cc,
+	  tests/maxspacedim1.cc, tests/membytes1.cc, tests/membytes2.cc,
+	  tests/minconstraints1.cc, tests/minconstraints2.cc,
+	  tests/minconstraints3.cc, tests/minconstraints4.cc,
+	  tests/mingenerators1.cc, tests/mingenerators2.cc,
+	  tests/mingenerators3.cc, tests/polydifference1.cc,
+	  tests/polydifference2.cc, tests/polydifference3.cc,
+	  tests/polydifference8.cc, tests/polydifference9.cc,
+	  tests/polyhull1.cc, tests/polyhull2.cc, tests/polyhull7.cc,
+	  tests/print.cc, tests/print.hh, tests/randphull1.cc,
+	  tests/randphull2.cc, tests/relations1.cc, tests/relations12.cc,
+	  tests/relations15.cc, tests/relations16.cc, tests/relations17.cc,
+	  tests/relations4.cc, tests/relations5.cc, tests/relations7.cc,
+	  tests/relations8.cc, tests/relations9.cc,
+	  tests/removespacedims1.cc, tests/removespacedims2.cc,
+	  tests/removespacedims4.cc, tests/removespacedims8.cc,
+	  tests/smm1.cc, tests/timeelapse1.cc, tests/timeelapse3.cc,
+	  tests/timeelapse4.cc, tests/timeelapse6.cc, tests/topclosed2.cc,
+	  tests/topclosed3.cc, tests/topclosure1.cc, tests/universe3.cc,
+	  tests/universe4.cc, tests/universe6.cc, tests/universe7.cc,
+	  tests/writeconsys1.cc, tests/writegensys1.cc,
+	  tests/writegensys2.cc, tests/writegensys3.cc
+	  (altnum.[6,2,2,6,12,2,2,4,2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,4,2,6,5,5,5,1,3,3,3,6,4,6,1,7,2,4,4,3,4,5,1,4,6,5,5,2,5,3,1,1,1,1,3,4,2,4,4,1,1,1,1,1,3,5,4,14,1,1,1,1,1,5,7,4,1,3,7,5,1,1,1,1,5,4,3,6,7,3,1,5,7,5,1,1,1,1,4,4,1,6,2,6,2,3,4,6,3,5,3,1,1,1,1,1,2,3,3,3,3,3,14,5,3,4,4,7,7,3,4,4,7,7,2,5,9,7,5,2,2,5,6,5,4,4,3,1,10,4,3,1,1,1,1,1,1,1,1,1,1,4,2,4,4,3,20,13,21,16,19,6 [...]
+	  Sixth merge from main trunk.
+
+2004-12-11 Saturday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.138), STANDARDS (1.15), TODO (1.126),
+	  Watchdog/EList_Iterator.inlines.hh (1.2),
+	  Watchdog/Handler.defs.hh (1.2), Watchdog/Makefile.am (1.14),
+	  Watchdog/Watchdog.defs.hh (1.14), demos/ppl_lcdd/ppl_lcdd.cc
+	  (1.38), demos/ppl_lcdd/examples/allzero.ine (1.2),
+	  demos/ppl_lcdd/examples/ccc4.ext (1.2),
+	  demos/ppl_lcdd/examples/ccp4.ext (1.2),
+	  demos/ppl_lcdd/examples/cp4.ext (1.2),
+	  demos/ppl_lcdd/examples/cp4.ine (1.2),
+	  demos/ppl_lcdd/examples/cp5.ine (1.2),
+	  demos/ppl_lcdd/examples/cp6.ine (1.2),
+	  demos/ppl_lcdd/examples/cp7.ext (1.2),
+	  demos/ppl_lcdd/examples/cross10.ine (1.2),
+	  demos/ppl_lcdd/examples/cross12.ine (1.2),
+	  demos/ppl_lcdd/examples/cross4.ine (1.2),
+	  demos/ppl_lcdd/examples/cross6.ine (1.2),
+	  demos/ppl_lcdd/examples/cross8.ine (1.2),
+	  demos/ppl_lcdd/examples/cube.ext (1.2),
+	  demos/ppl_lcdd/examples/cubetop.ine (1.2),
+	  demos/ppl_lcdd/examples/cubocta.ine (1.2),
+	  demos/ppl_lcdd/examples/cut16_11.ext (1.2),
+	  demos/ppl_lcdd/examples/cut32_16.ext (1.2),
+	  demos/ppl_lcdd/examples/cyc.ine (1.2),
+	  demos/ppl_lcdd/examples/cyclic16-10.ext (1.2),
+	  demos/ppl_lcdd/examples/cyclic25_13.ext (1.2),
+	  demos/ppl_lcdd/examples/ex1.ine (1.2),
+	  demos/ppl_lcdd/examples/grcubocta.ine (1.2),
+	  demos/ppl_lcdd/examples/in0.ine (1.2),
+	  demos/ppl_lcdd/examples/in1.ine (1.2),
+	  demos/ppl_lcdd/examples/in2.ine (1.2),
+	  demos/ppl_lcdd/examples/in3.ine (1.2),
+	  demos/ppl_lcdd/examples/in4.ine (1.2),
+	  demos/ppl_lcdd/examples/in5.ine (1.2),
+	  demos/ppl_lcdd/examples/in6.ine (1.2),
+	  demos/ppl_lcdd/examples/in7.ine (1.2),
+	  demos/ppl_lcdd/examples/integralpoints.ine (1.2),
+	  demos/ppl_lcdd/examples/irbox20-4.ext (1.2),
+	  demos/ppl_lcdd/examples/irbox200-4.ext (1.2),
+	  demos/ppl_lcdd/examples/kkd18_4.ine (1.2),
+	  demos/ppl_lcdd/examples/kkd27_5.ine (1.2),
+	  demos/ppl_lcdd/examples/kkd38_6.ine (1.2),
+	  demos/ppl_lcdd/examples/kq20_11_m.ine (1.2),
+	  demos/ppl_lcdd/examples/metric40_11.ine (1.2),
+	  demos/ppl_lcdd/examples/metric80_16.ine (1.2),
+	  demos/ppl_lcdd/examples/mit.ine (1.2),
+	  demos/ppl_lcdd/examples/mit288-281.ine (1.2),
+	  demos/ppl_lcdd/examples/mit31-20.ine (1.2),
+	  demos/ppl_lcdd/examples/mit41-16.ine (1.2),
+	  demos/ppl_lcdd/examples/mit708-9.ine (1.2),
+	  demos/ppl_lcdd/examples/mit71-61.ine (1.2),
+	  demos/ppl_lcdd/examples/mit90-86.ine (1.2),
+	  demos/ppl_lcdd/examples/mp5.ext (1.2),
+	  demos/ppl_lcdd/examples/mp5.ine (1.2),
+	  demos/ppl_lcdd/examples/mp5a.ine (1.2),
+	  demos/ppl_lcdd/examples/mp6.ine (1.2),
+	  demos/ppl_lcdd/examples/origin.ine (1.2),
+	  demos/ppl_lcdd/examples/project2res.ine (1.2),
+	  demos/ppl_lcdd/examples/rcubocta.ine (1.2),
+	  demos/ppl_lcdd/examples/reg24-5.ext (1.2),
+	  demos/ppl_lcdd/examples/reg24-5.ine (1.2),
+	  demos/ppl_lcdd/examples/sampleh1.ine (1.2),
+	  demos/ppl_lcdd/examples/sampleh3.ine (1.2),
+	  demos/ppl_lcdd/examples/sampleh4.ine (1.2),
+	  demos/ppl_lcdd/examples/sampleh6.ine (1.2),
+	  demos/ppl_lcdd/examples/sampleh7.ine (1.2),
+	  demos/ppl_lcdd/examples/sampleh8.ine (1.2),
+	  demos/ppl_lcdd/examples/samplev1.ext (1.2),
+	  demos/ppl_lcdd/examples/samplev3.ext (1.2),
+	  demos/ppl_lcdd/examples/trunc10.ine (1.2),
+	  demos/ppl_lcdd/examples/trunc7.ine (1.2),
+	  demos/ppl_lcdd/examples/tsp5.ext (1.2),
+	  demos/ppl_lcdd/examples/tsp5.ine (1.2), doc/Makefile.am (1.30),
+	  doc/definitions.dox (1.164), doc/devref-browse.doxyconf-latex.in
+	  (1.53), doc/devref-print.doxyconf-latex.in (1.53),
+	  doc/devref.doxyconf-html.in (1.53), doc/fdl.tex (1.3),
+	  doc/user-browse.doxyconf-latex.in (1.22),
+	  doc/user-print.doxyconf-latex.in (1.22),
+	  doc/user.doxyconf-html.in (1.24), interfaces/C/ppl_c.h.in (1.40),
+	  interfaces/Prolog/Prolog_interface.dox (1.119),
+	  interfaces/Prolog/exceptions.hh (1.13),
+	  interfaces/Prolog/ppl_prolog.icc (1.146),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.6),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.73),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.23),
+	  interfaces/Prolog/SICStus/Makefile.am (1.48),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.68),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.9),
+	  interfaces/Prolog/SWI/Makefile.am (1.40),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.92),
+	  interfaces/Prolog/tests/pl_check.pl (1.2), src/Ask_Tell.defs.hh
+	  (1.3), src/Ask_Tell.inlines.hh (1.3), src/BHRZ03_Certificate.cc
+	  (1.6), src/BHRZ03_Certificate.defs.hh (1.8),
+	  src/Checked_Number.inlines.hh (1.8), src/Constraint.defs.hh
+	  (1.98), src/Constraint.inlines.hh (1.57),
+	  src/Constraint_System.defs.hh (1.3), src/Generator.defs.hh
+	  (1.98), src/Generator.inlines.hh (1.51), src/Generator_System.cc
+	  (1.3), src/Generator_System.defs.hh (1.3),
+	  src/H79_Certificate.defs.hh (1.8), src/Interval.defs.hh (1.19),
+	  src/Interval.inlines.hh (1.15), src/Linear_Expression.cc (1.3),
+	  src/Linear_Expression.defs.hh (1.5),
+	  src/Linear_Expression.inlines.hh (1.3), src/Linear_Row.cc (1.3),
+	  src/Linear_Row.inlines.hh (1.6), src/Linear_System.cc (1.12),
+	  src/Linear_System.defs.hh (1.10), src/Linear_System.inlines.hh
+	  (1.9), src/Matrix.inlines.hh (1.42),
+	  src/Native_Integer.inlines.hh (1.6),
+	  src/Polyhedra_Powerset.defs.hh (1.10),
+	  src/Polyhedra_Powerset.inlines.hh (1.11), src/Polyhedron.defs.hh
+	  (1.260), src/Polyhedron.inlines.hh (1.105),
+	  src/Polyhedron_chdims.cc (1.26), src/Polyhedron_nonpublic.cc
+	  (1.39), src/Polyhedron_public.cc (1.44),
+	  src/Polyhedron_widenings.cc (1.38), src/Row.cc (1.75),
+	  src/Row.defs.hh (1.87), src/Row.inlines.hh (1.54),
+	  src/Saturation_Matrix.inlines.hh (1.2), src/Saturation_Row.cc
+	  (1.2), src/Saturation_Row.defs.hh (1.2),
+	  src/Widening_Function.defs.hh (1.8),
+	  src/Widening_Function.inlines.hh (1.8), src/checked.defs.hh
+	  (1.4), src/checked.inlines.hh (1.4), src/checked_float.inlines.hh
+	  (1.10), src/checked_int.inlines.hh (1.6),
+	  src/checked_mpq.inlines.hh (1.5), src/checked_mpz.inlines.hh
+	  (1.5), src/globals.defs.hh (1.11), src/globals.inlines.hh (1.6),
+	  src/swapping_sort.icc (1.5), tests/Makefile.am (1.239),
+	  tests/addspacedims9.cc (1.2), tests/bgp99extrapolation1.cc (1.7),
+	  tests/bhz03widening1.cc (1.8), tests/bhz03widening3.cc (1.8),
+	  tests/bhz03widening4.cc (1.6), tests/boundingbox1.cc (1.39),
+	  tests/boundingbox3.cc (1.15), tests/boundingbox4.cc (1.12),
+	  tests/disjoint3.cc (1.10), tests/dualhypercubes.cc (1.9),
+	  tests/expandspacedim1.cc (1.2), tests/generalizedaffineimage9.cc
+	  (1.8), tests/polydifference1.cc (1.10), tests/polydifference8.cc
+	  (1.4), tests/polydifference9.cc (1.5), tests/print.cc (1.13): Try
+	  to avoid very long lines.
+
+2004-12-11 Saturday 21:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.125): Postponed a couple of items.
+
+2004-12-11 Saturday 20:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.137), README (1.30), TODO (1.124),
+	  demos/ppl_lcdd/ppl_lcdd.cc (1.37),
+	  doc/devref-browse.doxyconf-latex.in (1.52),
+	  doc/devref-print.doxyconf-latex.in (1.52),
+	  doc/devref.doxyconf-html.in (1.52), interfaces/C/ppl_c.cc
+	  (1.117), interfaces/Prolog/Prolog_interface.dox (1.118),
+	  interfaces/Prolog/exceptions.hh (1.12),
+	  interfaces/Prolog/ppl_prolog.icc (1.145),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.27),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.22),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.67),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.91),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.58),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.84), src/Bounding_Box.cc
+	  (1.2), src/Bounding_Box.defs.hh (1.2),
+	  src/Bounding_Box.inlines.hh (1.2), src/Coefficient.cc (1.1),
+	  src/Coefficient.defs.hh (1.1), src/Coefficient.inlines.hh (1.1),
+	  src/Coefficient.types.hh (1.1),
+	  src/Coefficient_traits_template.hh (1.1), src/Constraint.cc
+	  (1.45), src/Constraint.defs.hh (1.97), src/Constraint.inlines.hh
+	  (1.56), src/Constraint_System.cc (1.2),
+	  src/Constraint_System.defs.hh (1.2), src/GMP_Integer.types.hh
+	  (1.3), src/Generator.cc (1.56), src/Generator.defs.hh (1.97),
+	  src/Generator.inlines.hh (1.50), src/Generator_System.cc (1.2),
+	  src/Generator_System.defs.hh (1.2), src/Integer.cc (1.5),
+	  src/Integer.defs.hh (1.15), src/Integer.inlines.hh (1.14),
+	  src/Integer.types.hh (1.10), src/Integer_macros.hh (1.3),
+	  src/Integer_traits_template.hh (1.3), src/Interval.defs.hh
+	  (1.18), src/Interval.inlines.hh (1.14), src/Linear_Expression.cc
+	  (1.2), src/Linear_Expression.defs.hh (1.4),
+	  src/Linear_Expression.inlines.hh (1.2), src/Linear_Row.cc (1.2),
+	  src/Linear_Row.defs.hh (1.6), src/Linear_Row.inlines.hh (1.5),
+	  src/Linear_System.cc (1.11), src/Makefile.am (1.90),
+	  src/Matrix.defs.hh (1.66), src/Native_Integer.defs.hh (1.5),
+	  src/Native_Integer.types.hh (1.3), src/Polyhedron.defs.hh
+	  (1.259), src/Polyhedron.inlines.hh (1.104),
+	  src/Polyhedron_nonpublic.cc (1.38), src/Polyhedron_public.cc
+	  (1.43), src/Polyhedron_widenings.cc (1.37), src/Row.cc (1.74),
+	  src/Row.defs.hh (1.86), src/Row.inlines.hh (1.53),
+	  src/conversion.cc (1.65), src/globals.cc (1.19),
+	  src/globals.defs.hh (1.10), src/globals.inlines.hh (1.5),
+	  tests/BBox.cc (1.6), tests/BBox.hh (1.5),
+	  tests/bhrz03widening13.cc (1.6), tests/bhrz03widening14.cc (1.8),
+	  tests/dualhypercubes.cc (1.8), tests/exceptions1.cc (1.43),
+	  tests/intersection2.cc (1.12), tests/max_min1.cc (1.6),
+	  tests/max_min2.cc (1.6), tests/randphull1.cc (1.13),
+	  tests/randphull2.cc (1.10): The type Integer has been renamed
+	  Coefficient.
+
+2004-12-11 Saturday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.37): Useless inclusions removed.
+
+2004-12-11 Saturday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.136), README (1.29), TODO (1.123),
+	  demos/ppl_lcdd/ppl_lcdd.cc (1.36), doc/definitions.dox (1.163),
+	  doc/devref-browse.doxyconf-latex.in (1.51),
+	  doc/devref-print.doxyconf-latex.in (1.51),
+	  doc/devref.doxyconf-html.in (1.51), interfaces/C/ppl_c.cc
+	  (1.116), interfaces/C/ppl_c.h.in (1.39),
+	  interfaces/Prolog/ppl_prolog.icc (1.144),
+	  src/BHRZ03_Certificate.cc (1.5), src/C_Polyhedron.defs.hh (1.30),
+	  src/C_Polyhedron.inlines.hh (1.23), src/Constraint.defs.hh
+	  (1.96), src/GenSys.cc (1.102), src/GenSys.defs.hh (1.107),
+	  src/GenSys.inlines.hh (1.38), src/GenSys.types.hh (1.8),
+	  src/Generator.defs.hh (1.96), src/Generator_System.cc (1.1),
+	  src/Generator_System.defs.hh (1.1),
+	  src/Generator_System.inlines.hh (1.1),
+	  src/Generator_System.types.hh (1.1),
+	  src/Linear_Expression.defs.hh (1.3), src/Linear_System.defs.hh
+	  (1.9), src/Makefile.am (1.89), src/Matrix.defs.hh (1.65),
+	  src/NNC_Polyhedron.defs.hh (1.32), src/NNC_Polyhedron.inlines.hh
+	  (1.26), src/Polyhedron.defs.hh (1.258), src/Polyhedron.inlines.hh
+	  (1.103), src/Polyhedron_nonpublic.cc (1.37),
+	  src/Polyhedron_public.cc (1.42), src/Polyhedron_widenings.cc
+	  (1.36), tests/NNCminimize1.cc (1.12), tests/NNCminimize2.cc
+	  (1.12), tests/NNCminimize3.cc (1.12), tests/NNCminimize4.cc
+	  (1.13), tests/NNCminimize5.cc (1.12), tests/addconstraints9.cc
+	  (1.15), tests/addgenerator1.cc (1.8), tests/addgenerator2.cc
+	  (1.8), tests/addgenerator3.cc (1.5), tests/addgenerator4.cc
+	  (1.7), tests/addgenerator5.cc (1.2), tests/addgenerators1.cc
+	  (1.13), tests/addgenerators10.cc (1.5), tests/addgenerators11.cc
+	  (1.10), tests/addgenerators12.cc (1.7), tests/addgenerators13.cc
+	  (1.3), tests/addgenerators2.cc (1.13), tests/addgenerators3.cc
+	  (1.13), tests/addgenerators4.cc (1.13), tests/addgenerators5.cc
+	  (1.13), tests/addgenerators6.cc (1.13), tests/addgenerators7.cc
+	  (1.10), tests/addgenerators8.cc (1.8), tests/addgenerators9.cc
+	  (1.7), tests/addspacedims1.cc (1.2), tests/addspacedims10.cc
+	  (1.3), tests/addspacedims11.cc (1.2), tests/addspacedims3.cc
+	  (1.3), tests/addspacedims6.cc (1.2), tests/addspacedims7.cc
+	  (1.2), tests/affineimage3.cc (1.5), tests/affineimage7.cc (1.5),
+	  tests/affinepreimage1.cc (1.12), tests/affinepreimage4.cc (1.13),
+	  tests/affinepreimage7.cc (1.5), tests/affinetrans.cc (1.16),
+	  tests/ascii_dump_load7.cc (1.8), tests/bhrz03widening1.cc (1.5),
+	  tests/bhrz03widening12.cc (1.5), tests/bhrz03widening13.cc (1.5),
+	  tests/bhrz03widening14.cc (1.7), tests/bhrz03widening15.cc (1.9),
+	  tests/bhrz03widening16.cc (1.5), tests/bhrz03widening17.cc (1.5),
+	  tests/bhrz03widening18.cc (1.5), tests/bhrz03widening19.cc (1.5),
+	  tests/bhrz03widening2.cc (1.7), tests/bhrz03widening6.cc (1.6),
+	  tests/bhrz03widening7.cc (1.6), tests/bhrz03widening8.cc (1.5),
+	  tests/bhrz03widening9.cc (1.8), tests/concatenate4.cc (1.7),
+	  tests/contains2.cc (1.4), tests/contains3.cc (1.4),
+	  tests/contains4.cc (1.3), tests/disjoint2.cc (1.10),
+	  tests/disjoint3.cc (1.9), tests/dualhypercubes.cc (1.7),
+	  tests/empty1.cc (1.15), tests/exceptions1.cc (1.42),
+	  tests/exceptions2.cc (1.37), tests/generators1.cc (1.16),
+	  tests/generators2.cc (1.12), tests/generators3.cc (1.6),
+	  tests/generators4.cc (1.7), tests/generators5.cc (1.6),
+	  tests/generators6.cc (1.7), tests/h79widening4.cc (1.5),
+	  tests/intersection2.cc (1.11), tests/intersection6.cc (1.8),
+	  tests/limitedbhrz03extrapolation1.cc (1.5),
+	  tests/mapspacedims1.cc (1.2), tests/maxspacedim1.cc (1.5),
+	  tests/membytes1.cc (1.7), tests/mingenerators1.cc (1.6),
+	  tests/mingenerators2.cc (1.5), tests/mingenerators3.cc (1.5),
+	  tests/polydifference1.cc (1.9), tests/polydifference2.cc (1.11),
+	  tests/polydifference8.cc (1.3), tests/polyhull1.cc (1.9),
+	  tests/polyhull2.cc (1.8), tests/polyhull7.cc (1.5),
+	  tests/print.cc (1.12), tests/print.hh (1.16), tests/randphull1.cc
+	  (1.12), tests/randphull2.cc (1.9), tests/relations12.cc (1.6),
+	  tests/relations15.cc (1.6), tests/relations16.cc (1.6),
+	  tests/relations17.cc (1.9), tests/relations4.cc (1.12),
+	  tests/relations5.cc (1.12), tests/removespacedims1.cc (1.2),
+	  tests/removespacedims2.cc (1.3), tests/removespacedims4.cc (1.2),
+	  tests/removespacedims8.cc (1.2), tests/smm1.cc (1.17),
+	  tests/timeelapse1.cc (1.9), tests/timeelapse3.cc (1.10),
+	  tests/timeelapse4.cc (1.9), tests/timeelapse6.cc (1.5),
+	  tests/topclosed2.cc (1.7), tests/topclosed3.cc (1.9),
+	  tests/topclosure1.cc (1.8), tests/universe7.cc (1.2),
+	  tests/writegensys1.cc (1.9), tests/writegensys2.cc (1.9),
+	  tests/writegensys3.cc (1.9): The class GenSys has been renamed
+	  Generator_System.
+
+2004-12-11 Saturday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.135), README (1.28), TODO (1.122),
+	  demos/ppl_lcdd/ppl_lcdd.cc (1.35), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.7), doc/definitions.dox (1.162),
+	  doc/devref-browse.doxyconf-latex.in (1.50),
+	  doc/devref-print.doxyconf-latex.in (1.50),
+	  doc/devref.doxyconf-html.in (1.50), interfaces/C/ppl_c.cc
+	  (1.115), interfaces/C/ppl_c.h.in (1.38),
+	  interfaces/Prolog/ppl_prolog.icc (1.143), src/Ask_Tell.defs.hh
+	  (1.2), src/Ask_Tell.inlines.hh (1.2), src/BHRZ03_Certificate.cc
+	  (1.4), src/C_Polyhedron.cc (1.13), src/C_Polyhedron.defs.hh
+	  (1.29), src/C_Polyhedron.inlines.hh (1.22), src/ConSys.cc (1.76),
+	  src/ConSys.defs.hh (1.93), src/ConSys.inlines.hh (1.37),
+	  src/ConSys.types.hh (1.8), src/Constraint.defs.hh (1.95),
+	  src/Constraint_System.cc (1.1), src/Constraint_System.defs.hh
+	  (1.1), src/Constraint_System.inlines.hh (1.1),
+	  src/Constraint_System.types.hh (1.1), src/Determinate.defs.hh
+	  (1.49), src/Determinate.inlines.hh (1.43), src/GenSys.inlines.hh
+	  (1.37), src/Generator.defs.hh (1.95), src/H79_Certificate.cc
+	  (1.5), src/Linear_Expression.defs.hh (1.2),
+	  src/Linear_System.defs.hh (1.8), src/Makefile.am (1.88),
+	  src/Matrix.defs.hh (1.64), src/NNC_Polyhedron.defs.hh (1.31),
+	  src/NNC_Polyhedron.inlines.hh (1.25),
+	  src/Polyhedra_Powerset.defs.hh (1.9),
+	  src/Polyhedra_Powerset.inlines.hh (1.10), src/Polyhedron.defs.hh
+	  (1.257), src/Polyhedron.inlines.hh (1.102),
+	  src/Polyhedron.types.hh (1.13), src/Polyhedron_chdims.cc (1.25),
+	  src/Polyhedron_nonpublic.cc (1.36), src/Polyhedron_public.cc
+	  (1.41), src/Polyhedron_widenings.cc (1.35),
+	  src/Widening_Function.defs.hh (1.7),
+	  src/Widening_Function.inlines.hh (1.7), src/algorithms.hh (1.36),
+	  tests/NNCminimize1.cc (1.11), tests/NNCminimize2.cc (1.11),
+	  tests/NNCminimize3.cc (1.11), tests/NNCminimize5.cc (1.11),
+	  tests/NNCminimize6.cc (1.12), tests/addconstraint1.cc (1.7),
+	  tests/addconstraints1.cc (1.13), tests/addconstraints10.cc
+	  (1.11), tests/addconstraints11.cc (1.12),
+	  tests/addconstraints12.cc (1.5), tests/addconstraints13.cc (1.7),
+	  tests/addconstraints2.cc (1.20), tests/addconstraints3.cc (1.11),
+	  tests/addconstraints4.cc (1.12), tests/addconstraints5.cc (1.13),
+	  tests/addconstraints6.cc (1.14), tests/addconstraints7.cc (1.13),
+	  tests/addconstraints8.cc (1.14), tests/addconstraints9.cc (1.14),
+	  tests/addspacedims3.cc (1.2), tests/addspacedims4.cc (1.2),
+	  tests/addspacedims5.cc (1.2), tests/ascii_dump_load4.cc (1.15),
+	  tests/boundedh79extrapolation1.cc (1.2), tests/boundingbox1.cc
+	  (1.38), tests/boundingbox3.cc (1.14), tests/concatenate1.cc
+	  (1.10), tests/concatenate2.cc (1.9), tests/concatenate3.cc (1.8),
+	  tests/constraints1.cc (1.7), tests/constraints2.cc (1.7),
+	  tests/constraints3.cc (1.8), tests/constraints4.cc (1.7),
+	  tests/contains2.cc (1.3), tests/contains3.cc (1.3),
+	  tests/contains5.cc (1.3), tests/exceptions1.cc (1.41),
+	  tests/exceptions2.cc (1.36), tests/generators1.cc (1.15),
+	  tests/generators2.cc (1.11), tests/geomcovers1.cc (1.2),
+	  tests/intersection4.cc (1.8),
+	  tests/limitedbhrz03extrapolation1.cc (1.4),
+	  tests/limitedh79extrapolation1.cc (1.4),
+	  tests/limitedh79extrapolation2.cc (1.4),
+	  tests/limitedh79extrapolation3.cc (1.5),
+	  tests/limitedh79extrapolation4.cc (1.5), tests/maxspacedim1.cc
+	  (1.4), tests/membytes1.cc (1.6), tests/minconstraints1.cc (1.6),
+	  tests/minconstraints2.cc (1.6), tests/minconstraints3.cc (1.5),
+	  tests/minconstraints4.cc (1.9), tests/polydifference2.cc (1.10),
+	  tests/polydifference3.cc (1.6), tests/polydifference8.cc (1.2),
+	  tests/print.cc (1.11), tests/print.hh (1.15), tests/randphull2.cc
+	  (1.8), tests/relations1.cc (1.11), tests/relations8.cc (1.11),
+	  tests/relations9.cc (1.14), tests/smm1.cc (1.16),
+	  tests/timeelapse3.cc (1.9), tests/universe3.cc (1.12),
+	  tests/universe4.cc (1.12), tests/universe6.cc (1.11),
+	  tests/writeconsys1.cc (1.9): The class ConSys has been renamed
+	  Constraint_System.
+
+2004-12-11 Saturday 09:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.134), README (1.27), TODO (1.121), configure.ac (1.142),
+	  demos/ppl_lcdd/ppl_lcdd.cc (1.34), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.6), doc/devref-browse.doxyconf-latex.in (1.49),
+	  doc/devref-print.doxyconf-latex.in (1.49),
+	  doc/devref.doxyconf-html.in (1.49), interfaces/C/ppl_c.cc
+	  (1.114), interfaces/C/ppl_c.h.in (1.37),
+	  interfaces/Prolog/ppl_prolog.icc (1.142),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.72), src/C_Polyhedron.cc
+	  (1.12), src/ConSys.cc (1.75), src/ConSys.defs.hh (1.92),
+	  src/Constraint.cc (1.44), src/Constraint.defs.hh (1.94),
+	  src/Constraint.inlines.hh (1.55), src/GenSys.cc (1.101),
+	  src/GenSys.defs.hh (1.106), src/Generator.cc (1.55),
+	  src/Generator.defs.hh (1.94), src/Generator.inlines.hh (1.49),
+	  src/LinExpression.cc (1.25), src/LinExpression.defs.hh (1.73),
+	  src/LinExpression.inlines.hh (1.34), src/LinExpression.types.hh
+	  (1.8), src/Linear_Expression.cc (1.1),
+	  src/Linear_Expression.defs.hh (1.1),
+	  src/Linear_Expression.inlines.hh (1.1),
+	  src/Linear_Expression.types.hh (1.1), src/Linear_Row.defs.hh
+	  (1.5), src/Linear_System.cc (1.10), src/Makefile.am (1.87),
+	  src/Polyhedra_Powerset.inlines.hh (1.9), src/Polyhedron.defs.hh
+	  (1.256), src/Polyhedron.inlines.hh (1.101),
+	  src/Polyhedron_chdims.cc (1.24), src/Polyhedron_nonpublic.cc
+	  (1.35), src/Polyhedron_public.cc (1.40),
+	  src/Polyhedron_widenings.cc (1.34), src/Variable.defs.hh (1.44),
+	  src/algorithms.hh (1.35), tests/addconstraints1.cc (1.12),
+	  tests/addconstraints3.cc (1.10), tests/addconstraints8.cc (1.13),
+	  tests/affinetrans.cc (1.15), tests/bhrz03widening14.cc (1.6),
+	  tests/bhrz03widening15.cc (1.8), tests/bounded1.cc (1.14),
+	  tests/bounds1.cc (1.7), tests/constraints3.cc (1.7),
+	  tests/disjoint2.cc (1.9), tests/disjoint3.cc (1.8),
+	  tests/dualhypercubes.cc (1.6), tests/exceptions1.cc (1.40),
+	  tests/exceptions2.cc (1.35), tests/exceptions3.cc (1.5),
+	  tests/generalizedaffineimage9.cc (1.7),
+	  tests/limitedh79extrapolation4.cc (1.4), tests/linexpression1.cc
+	  (1.5), tests/max_min1.cc (1.5), tests/max_min2.cc (1.5),
+	  tests/maxspacedim1.cc (1.3), tests/membytes1.cc (1.5),
+	  tests/polydifference3.cc (1.5), tests/randphull2.cc (1.7),
+	  tests/relations7.cc (1.11), tests/relations9.cc (1.13),
+	  tests/removespacedims2.cc (1.2), tests/universe6.cc (1.10),
+	  tests/writeconsys1.cc (1.8), tests/writegensys3.cc (1.8): The
+	  class LinExpression has been renamed Linear_Expression.
+
+2004-12-11 Saturday 09:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz_a (1.2): Adapted to the recent
+	  changes in the precision of ppl_lpsol's output.
+
+2004-12-09 Thursday 17:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/swapping_sort.icc (1.4): The swapping sort procedure
+	  rewritten from scratch (it was buggy).
+
+2004-12-08 Wednesday 11:12  Abramo Bagnara
+
+	* src/globals.defs.hh (altnum.5): Added used() function useful to
+	  suppress compiler warning.
+
+2004-12-08 Wednesday 09:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.7): Do not name an unused
+	  parameter.
+
+2004-12-07 Tuesday 19:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_int16 (1.2), expected_int32 (1.2),
+	  expected_int32_a (1.2), expected_int64 (1.2), expected_int64_a
+	  (1.2), expected_mpz (1.2), ppl_lpsol.c (1.5): Print optimum value
+	  and location with the format "%.10g" instead of "%g".
+
+2004-12-07 Tuesday 13:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.133), README (1.26), TODO (1.120),
+	  doc/devref-browse.doxyconf-latex.in (1.48),
+	  doc/devref-print.doxyconf-latex.in (1.48),
+	  doc/devref.doxyconf-html.in (1.48), src/AskTell.defs.hh (1.28),
+	  src/AskTell.inlines.hh (1.24), src/AskTell.types.hh (1.7),
+	  src/Linear_System.cc (1.9), src/Linear_System.defs.hh (1.7),
+	  src/Linear_System.inlines.hh (1.8), src/Makefile.am (1.86),
+	  src/Matrix.defs.hh (1.63), src/Polyhedron.defs.hh (1.255),
+	  src/Polyhedron_chdims.cc (1.23), src/Polyhedron_nonpublic.cc
+	  (1.34), src/Polyhedron_public.cc (1.39),
+	  src/Polyhedron_widenings.cc (1.33), src/SatMatrix.cc (1.35),
+	  src/SatMatrix.defs.hh (1.39), src/SatMatrix.inlines.hh (1.27),
+	  src/SatMatrix.types.hh (1.8), src/SatRow.cc (1.31),
+	  src/SatRow.defs.hh (1.37), src/SatRow.inlines.hh (1.31),
+	  src/SatRow.types.hh (1.8), src/Saturation_Matrix.cc (1.1),
+	  src/Saturation_Matrix.defs.hh (1.1),
+	  src/Saturation_Matrix.inlines.hh (1.1),
+	  src/Saturation_Matrix.types.hh (1.1), src/Saturation_Row.cc
+	  (1.1), src/Saturation_Row.defs.hh (1.1),
+	  src/Saturation_Row.inlines.hh (1.1), src/Saturation_Row.types.hh
+	  (1.1), src/conversion.cc (1.64), src/minimize.cc (1.39),
+	  src/simplify.cc (1.41), src/swapping_sort.icc (1.3): The class
+	  SatRow has been renamed Saturation_Row.  The class SatMatrix has
+	  been renamed Saturation_Matrix.
+
+2004-12-07 Tuesday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.132), README (1.25), TODO (1.119),
+	  doc/devref-browse.doxyconf-latex.in (1.47),
+	  doc/devref-print.doxyconf-latex.in (1.47),
+	  doc/devref.doxyconf-html.in (1.47),
+	  interfaces/Prolog/ppl_prolog.icc (1.141), src/BoundingBox.cc
+	  (1.10), src/BoundingBox.defs.hh (1.15),
+	  src/BoundingBox.inlines.hh (1.14), src/BoundingBox.types.hh
+	  (1.7), src/Bounding_Box.cc (1.1), src/Bounding_Box.defs.hh (1.1),
+	  src/Bounding_Box.inlines.hh (1.1), src/Bounding_Box.types.hh
+	  (1.1), src/Makefile.am (1.85), tests/boundingbox2.cc (1.23),
+	  tests/boundingbox3.cc (1.13), tests/boundingbox4.cc (1.11): The
+	  class BoundingBox has been renamed Bounding_Box.
+
+2004-12-06 Monday 22:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.238): Added nnc_membytes2 to
+	  XFAIL_WITH_INT8_A.
+
+2004-12-06 Monday 18:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.131), README (1.24), TODO (1.118), src/Ask_Tell.defs.hh
+	  (1.1), src/Ask_Tell.inlines.hh (1.1), src/Ask_Tell.types.hh
+	  (1.1): The class AskTell has been renamed Ask_Tell.
+
+2004-12-06 Monday 18:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.130), src/Polyhedra_Powerset.defs.hh (1.8),
+	  src/Polyhedra_Powerset.inlines.hh (1.8), tests/membytes2.cc
+	  (1.3): New explicit constructor
+	  Polyhedra_Powerset<CS>::Polyhedra_Powerset(const PH& ph):  if
+	  `ph' is not empty, builds a powerset containing only `ph';
+	  builds the empty powerset otherwise.	Constructor
+	  Polyhedra_Powerset<PH>::Polyhedra_Powerset(const ConSys& cs) made
+	  explicit as well.
+
+2004-12-06 Monday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.129), src/Powerset.defs.hh (1.3), src/Powerset.inlines.hh
+	  (1.4): New explicit constructor Powerset<CS>::Powerset(const CS&
+	  d):  if `d' is not bottom, builds a powerset containing only `d';
+	  builds the empty powerset otherwise.
+
+2004-12-06 Monday 17:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.128): Restored an item erased by mistake.
+
+2004-12-06 Monday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.127): Improved.
+
+2004-12-06 Monday 17:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.126), TODO (1.117), src/C_Polyhedron.defs.hh (1.28),
+	  src/C_Polyhedron.inlines.hh (1.21), src/NNC_Polyhedron.defs.hh
+	  (1.30), src/NNC_Polyhedron.inlines.hh (1.24): New methods
+	  C_Polyhedron& C_Polyhedron::operator=(const NNC_Polyhedron& y)
+	  and NNC_Polyhedron& NNC_Polyhedron::operator=(const C_Polyhedron&
+	  y).
+
+2004-12-06 Monday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Polyhedron.cc (1.11): Efficiency bug fixed in
+	  C_Polyhedron::C_Polyhedron(const NNC_Polyhedron&).
+
+2004-12-06 Monday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.116): All the public classes of the library have been
+	  endowed with methods total_memory_in_bytes() and
+	  external_memory_in_bytes().
+
+2004-12-06 Monday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.72), Variable.defs.hh (1.43):
+	  Comments fixed/improved.
+
+2004-12-06 Monday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.defs.hh (1.7),
+	  src/Polyhedra_Powerset.inlines.hh (1.7), src/Powerset.defs.hh
+	  (1.2), src/Powerset.inlines.hh (1.3), tests/membytes2.cc (1.2):
+	  Added methods Powerset<CS>::external_memory_in_bytes() and
+	  Powerset<CS>::total_memory_in_bytes().  Added methods
+	  Polyhedra_Powerset<PH>::external_memory_in_bytes() and
+	  Polyhedra_Powerset<PH>::total_memory_in_bytes().
+
+2004-12-06 Monday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.48), src/Determinate.inlines.hh
+	  (1.42), tests/Makefile.am (1.237), tests/membytes2.cc (1.1):
+	  Added methods Determinate<PH>::external_memory_in_bytes() and
+	  Determinate<PH>::total_memory_in_bytes().
+
+2004-12-06 Monday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.47): Useless declarations removed.
+
+2004-12-05 Sunday 22:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Variable.cc (1.17), Variable.defs.hh (1.42): New method
+	  Variable::OK().
+
+2004-12-05 Sunday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LinExpression.cc (1.24), LinExpression.defs.hh (1.71): New
+	  method LinExpression::OK().
+
+2004-12-05 Sunday 21:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.93), src/Generator.inlines.hh (1.48),
+	  src/LinExpression.defs.hh (1.70), src/LinExpression.inlines.hh
+	  (1.33), src/Variable.defs.hh (1.41), src/Variable.inlines.hh
+	  (1.20), tests/membytes1.cc (1.4): Added
+	  Variable::total_memory_in_bytes() and
+	  Variable::external_memory_in_bytes().  Added
+	  Generator::total_memory_in_bytes() and
+	  Generator::external_memory_in_bytes().  Added
+	  LinExpression::total_memory_in_bytes() and
+	  LinExpression::external_memory_in_bytes().
+
+2004-12-05 Sunday 07:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/membytes1.cc (1.3): Avoid compiler warnings.
+
+2004-12-05 Sunday 07:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.115), interfaces/Prolog/Prolog_interface.dox (1.117): We
+	  now explain to the GNU Prolog user that GNU Prolog must be
+	  configured using the `--disable-regs' option, if it has to work
+	  with _any_ foreign code (not just the PPL).
+
+2004-11-28 Sunday 14:35  Abramo Bagnara
+
+	* configure.ac, src/checked_float.inlines.hh (altnum.[11,14]):
+	  Fixed cygwin support.
+
+2004-11-28 Sunday 14:34  Abramo Bagnara
+
+	* configure.ac (1.141), src/checked_float.inlines.hh (1.9): Fixed
+	  cygwin support
+
+2004-11-27 Saturday 19:32  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.20): Use signed explicitly.
+
+2004-11-27 Saturday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL, NEWS, TODO, compile, config.guess, configure.ac,
+	  install-sh, Watchdog/INSTALL, Watchdog/Makefile.am,
+	  Watchdog/compile, Watchdog/config.guess, Watchdog/configure.ac,
+	  Watchdog/install-sh, demos/Makefile.am,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/expected_int8,
+	  demos/ppl_lcdd/expected_int8_a, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/expected, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+	  demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+	  demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+	  demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+	  demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+	  doc/definitions.dox, doc/ppl.sty,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/YAP/Makefile.am, m4/Makefile.am,
+	  m4/ac_cxx_long_double.m4, m4/ac_cxx_long_long.m4,
+	  src/AskTell.defs.hh, src/AskTell.inlines.hh,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Checked_Number.types.hh, src/ConSys.defs.hh,
+	  src/ConSys.inlines.hh, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/GenSys.defs.hh,
+	  src/GenSys.inlines.hh, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/LinExpression.defs.hh,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_System.cc, src/Linear_System.defs.hh,
+	  src/Linear_System.inlines.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/SatMatrix.cc, src/SatMatrix.defs.hh,
+	  src/SatMatrix.inlines.hh, src/SatRow.cc, src/SatRow.defs.hh,
+	  src/SatRow.inlines.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/globals.defs.hh, src/simplify.cc,
+	  src/swapping_sort.icc, tests/Makefile.am, tests/affineimage9.cc,
+	  tests/bgp99extrapolation1.cc, tests/bgp99extrapolation2.cc,
+	  tests/bhz03widening1.cc, tests/bhz03widening2.cc,
+	  tests/bhz03widening3.cc, tests/bhz03widening4.cc,
+	  tests/bhz03widening5.cc, tests/bhz03widening6.cc,
+	  tests/equals1.cc, tests/exceptions3.cc, tests/mapspacedims4.cc,
+	  tests/maxspacedim1.cc, tests/membytes1.cc, tests/universe7.cc,
+	  tests/valgrind_suppressions
+	  (altnum.[1,5,5,2,3,10,3,1,3,2,3,2,3,2,5,2,2,3,3,1,1,1,1,1,1,1,1,1,1,3,5,3,5,6,4,3,3,3,3,3,1,1,1,4,2,4,3,13,13,4,6,3,6,4,4,3,6,6,6,2,6,4,4,2,2,2,2,2,13,5,4,2,3,3,6,6,3,3,6,6,4,8,6,4,5,4,3,3,2,9,3,2,3,3,19,12,13,19,15,18,4,4,1,6,2,3,3,3,3,3,3,3,3,1,3,1,1,1,1,1]):
+	  Fifth number from main repository.
+
+2004-11-27 Saturday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.4): Little memory leaks fixed.
+
+2004-11-27 Saturday 15:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.inlines.hh (1.20), NNC_Polyhedron.inlines.hh
+	  (1.23), Polyhedron.defs.hh (1.254), Polyhedron_chdims.cc (1.22),
+	  Polyhedron_nonpublic.cc (1.33): Private exception thrower method
+	  Polyhedron::throw_space_dimension_overflow() made static, as it
+	  is often called inside constructors (before actually constructing
+	  the polyhedron object).
+
+2004-11-27 Saturday 14:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.236), valgrind_suppressions (1.1): Added a
+	  minimal infrastructure to perform regression testing using
+	  `valgrind'.
+
+2004-11-26 Friday 07:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected_int8_a (1.2): Fixed.
+
+2004-11-25 Thursday 08:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.235): Added `ascii_dump_load4' to
+	  `XFAIL_WITH_INT8_A'.	iCVS:
+	  ----------------------------------------------------------------------
+
+2004-11-23 Tuesday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.140): Version number bumped.
+
+2004-11-23 Tuesday 22:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.30): The methods SatRow::last() and the
+	  functions compare(const SatRow&, const SatRow&),
+	  subset_or_equal(const SatRow&, const SatRow&),
+	  subset_or_equal(const SatRow&, const SatRow&, bool&) and
+	  strict_subset(const SatRow&, const SatRow&) have been simplified
+	  and optimized.
+
+2004-11-23 Tuesday 13:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/membytes1.cc (1.2): Be quiet.
+
+2004-11-23 Tuesday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatRow.cc (1.29), SatRow.defs.hh (1.36), simplify.cc
+	  (1.40): New function bool subset_or_equal(const SatRow& x, const
+	  SatRow& y, bool& strict_subset) allows a simple optimization of
+	  Polyhedron::simplify().  The function bool strict_subset(const
+	  SatRow& x, const SatRow& y) is currently unused but left in
+	  place: it may be needed and, moreover, when all what matters is
+	  strict inclusion, `strict_subset(x, y)' is faster than
+	  `subset_or_equal(x, y, s) && s'.
+
+2004-11-22 Monday 19:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.cc (1.8): The assertion at the beginning of
+	  add_pending_rows() made stronger: we assume that rows to be added
+	  have the same size.
+
+2004-11-22 Monday 06:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.15), demos/ppl_lpsol/Makefile.am
+	  (1.8), interfaces/Prolog/Ciao/Makefile.am (1.36),
+	  interfaces/Prolog/GNU/Makefile.am (1.41),
+	  interfaces/Prolog/SICStus/Makefile.am (1.47),
+	  interfaces/Prolog/SWI/Makefile.am (1.39),
+	  interfaces/Prolog/XSB/Makefile.am (1.28),
+	  interfaces/Prolog/YAP/Makefile.am (1.31): Do not depend on the
+	  current locale.
+
+2004-11-22 Monday 06:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.114): Postpone one item to PPL 0.8.
+
+2004-11-21 Sunday 15:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_Row.defs.hh (1.4), Linear_Row.inlines.hh (1.4):
+	  Removed useless constructor for Linear_Row::Flags objects.
+
+2004-11-20 Saturday 08:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.21): Define the PROFILING symbol when
+	  compiling for profiling.
+
+2004-11-15 Monday 16:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.139): Version number bumped.
+
+2004-11-15 Monday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.73): Method Row::Impl::shrink() fixed: it was
+	  horribly broken on October 30, 2004 with the result that no
+	  memory could ever be deallocated.
+
+2004-11-15 Monday 15:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_System.cc (1.7), Linear_System.defs.hh (1.6),
+	  Linear_System.inlines.hh (1.7), SatMatrix.cc (1.34),
+	  SatMatrix.defs.hh (1.38), SatMatrix.inlines.hh (1.26),
+	  swapping_sort.icc (1.2): Function objects *LessThan() renamed as
+	  *_Less_Than.	Rewritten the sorting routine based on iter_swap's.
+
+2004-11-15 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.138): Version number bumped.
+
+2004-11-15 Monday 09:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.125), TODO (1.113), src/Checked_Number.defs.hh (1.4),
+	  src/Checked_Number.inlines.hh (1.6), src/ConSys.defs.hh (1.91),
+	  src/ConSys.inlines.hh (1.36), src/Constraint.defs.hh (1.93),
+	  src/Constraint.inlines.hh (1.54), src/GMP_Integer.defs.hh (1.3),
+	  src/GMP_Integer.inlines.hh (1.3), src/GenSys.defs.hh (1.105),
+	  src/GenSys.inlines.hh (1.36), src/Linear_System.defs.hh (1.5),
+	  src/Linear_System.inlines.hh (1.6), src/Matrix.cc (1.79),
+	  src/Matrix.defs.hh (1.62), src/Matrix.inlines.hh (1.41),
+	  src/Native_Integer.defs.hh (1.4), src/Native_Integer.inlines.hh
+	  (1.5), src/Polyhedron.defs.hh (1.253), src/Polyhedron.inlines.hh
+	  (1.100), src/Polyhedron_public.cc (1.38), src/Row.cc (1.72),
+	  src/Row.defs.hh (1.85), src/Row.inlines.hh (1.52),
+	  src/SatMatrix.cc (1.33), src/SatMatrix.defs.hh (1.37),
+	  src/SatMatrix.inlines.hh (1.25), src/SatRow.defs.hh (1.35),
+	  src/SatRow.inlines.hh (1.30), src/globals.defs.hh (1.9),
+	  tests/Makefile.am (1.234), tests/membytes1.cc (1.1): Most of the
+	  public classes of the library have been endowed with methods
+	  `memory_size_type total_memory_in_bytes() const' and
+	  `memory_size_type external_memory_in_bytes() const' returning
+	  (lower bounds for) the total size in bytes of the memory occupied
+	  by *this and of the memory managed by *this, respectively.  The
+	  type `memory_size_type' is a newly added unsigned integral type
+	  suitable to the representation of such information.
+
+2004-11-11 Thursday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.defs.hh (1.6): Powerset::omega_reduce()
+	  made available to users of class Polyhedra_Powerset.
+
+2004-11-11 Thursday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.137): Version number bumped.
+
+2004-11-10 Wednesday 11:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.124), src/Polyhedra_Powerset.defs.hh (1.5),
+	  src/Widening_Function.defs.hh (1.6),
+	  src/Widening_Function.inlines.hh (1.6),
+	  tests/bgp99extrapolation1.cc (1.6), tests/bgp99extrapolation2.cc
+	  (1.8), tests/bhz03widening1.cc (1.7), tests/bhz03widening2.cc
+	  (1.9), tests/bhz03widening3.cc (1.7), tests/bhz03widening4.cc
+	  (1.5), tests/bhz03widening5.cc (1.6), tests/bhz03widening6.cc
+	  (1.7): The helper function widen_fun has been renamed
+	  widen_fun_ref.
+
+2004-11-08 Monday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.7): Distribute all the expected*
+	  files.
+
+2004-11-08 Monday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.140): Handle
+	  std::length_error exceptions.
+
+2004-11-08 Monday 21:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.84): Concatenation order for ppl_install.hh
+	  fixed.
+
+2004-11-08 Monday 18:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.112), src/AskTell.defs.hh (1.27), src/AskTell.inlines.hh
+	  (1.23), src/Determinate.defs.hh (1.46),
+	  src/Determinate.inlines.hh (1.41), src/Polyhedra_Powerset.defs.hh
+	  (1.4), src/Polyhedra_Powerset.inlines.hh (1.6),
+	  src/Polyhedron.defs.hh (1.252), src/Polyhedron.inlines.hh (1.99):
+	  `PartialFunction' renamed `Partial_Function'.
+
+2004-11-08 Monday 17:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.123), src/Polyhedron_public.cc (1.37): The bug shown by
+	  universe7.cc, affecting method Polyhedron::is_universe(), is now
+	  corrected.
+
+2004-11-08 Monday 17:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.233), universe7.cc (1.1): New test shows a
+	  bug in method Polyhedron::is_universe().
+
+2004-11-08 Monday 17:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: SatMatrix.cc (1.32), SatMatrix.inlines.hh (1.24):
+	  Reimplemented SatMatrix::sorted_contains() usiong binary search
+	  (instead of linear-search).
+
+2004-11-08 Monday 14:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_System.cc (1.6), Linear_System.defs.hh (1.4),
+	  Linear_System.inlines.hh (1.5), Makefile.am (1.83), SatMatrix.cc
+	  (1.31), SatMatrix.defs.hh (1.36), SatMatrix.inlines.hh (1.23),
+	  swapping_sort.icc (1.1): Added a simplified version of the STL
+	  sorting algorithm that avoids (almost all) copies of objects by
+	  performing more swaps.  The new algorithm is used when sorting
+	  Linear_System and SatMatrix objects.	The same algorithm is also
+	  used to provide a new implementation of method
+	  Linear_System::sort_and_remove_with_sat(SatMatrix& sat); by
+	  defining an iterator on Linear_System that mimics on the
+	  SatMatrix all the swaps made on the Linear_System.
+
+2004-11-08 Monday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.6), expected_int16_a (1.1),
+	  expected_int32_a (1.1), expected_int64_a (1.1), expected_int8_a
+	  (1.1), expected_mpz_a (1.1): Not all the examples can be tested
+	  with assertions enabled.
+
+2004-11-08 Monday 11:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.14): Logic simplified.
+
+2004-11-08 Monday 07:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.136): In Cygwin, /usr/include/mingw contains
+	  header files that conflict with those in /usr/include: cannot add
+	  the former to the include path list.
+
+2004-11-08 Monday 07:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.8): Previous change reverted.
+
+2004-11-08 Monday 00:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.135), src/checked_float.inlines.hh (1.7): Support
+	  for Cygwin improved.
+
+2004-11-07 Sunday 17:59  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.6): Dirty tricks due to
+	  ppl_install.hh generation weirdness.
+
+2004-11-07 Sunday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.35): Erase the right
+	  temporary file.
+
+2004-11-07 Sunday 16:10  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.5): Added support for non C99
+	  conformant Cygwin.
+
+2004-11-07 Sunday 15:55  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.4): Avoided endian.h inclusion.
+
+2004-11-07 Sunday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: ppl_lcdd/expected_int8 (1.2), ppl_lpsol/expected_int8
+	  (1.2): Adapted to the fixed output of 8-bits integers.
+
+2004-11-07 Sunday 11:09  Abramo Bagnara
+
+	* src/: Checked_Number.inlines.hh (1.5), checked.defs.hh (1.3),
+	  checked.inlines.hh (1.3), checked_float.inlines.hh (1.3),
+	  checked_int.inlines.hh (1.5), checked_mpq.inlines.hh (1.4),
+	  checked_mpz.inlines.hh (1.4): Added support for I/O
+	  specialization.
+
+2004-11-06 Saturday 21:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.5), expected (1.3): The
+	  `expected' file is now obsolete.
+
+2004-11-06 Saturday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.27): Distribute all the
+	  expected* files.
+
+2004-11-06 Saturday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.134): Bumped version number.
+
+2004-11-06 Saturday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.122): Mention the bug fixed in
+	  Polyhedron::map_space_dimensions().
+
+2004-11-06 Saturday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.inlines.hh (1.4), tests/Makefile.am (1.232),
+	  tests/mapspacedims4.cc (1.1): After the permutation of columns, a
+	  linear system must be sign-normalized.  The new test program
+	  mapspacedims4 shows this phenomenon.
+
+2004-11-06 Saturday 14:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_System.cc (1.5), Linear_System.defs.hh (1.3): New
+	  method Linear_System::sign_normalize().
+
+2004-11-06 Saturday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.4), expected_int16 (1.1),
+	  expected_int32 (1.1), expected_int64 (1.1), expected_int8 (1.1),
+	  expected_mpz (1.1): Added expected results for the various
+	  coeffcient types.
+
+2004-11-06 Saturday 10:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Polyhedron.defs.hh (1.27), src/NNC_Polyhedron.defs.hh
+	  (1.29), TODO (1.111): Documented the std::length exceptions that
+	  can be thrown by constructors.
+
+2004-11-04 Thursday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/Makefile.am (1.5): Re-add `ppl_lpsol' to `SUBDIRS'.
+
+2004-11-04 Thursday 13:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.13): Distribute the expected_*
+	  files.
+
+2004-11-04 Thursday 10:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.110), doc/definitions.dox (1.161), doc/ppl.sty (1.17),
+	  interfaces/Prolog/Prolog_interface.dox (1.116): Explained the
+	  order of arguments in widening applications.	Better explained
+	  the reason for having C_Polyhedron and NNC_Polyhedron.
+
+2004-11-02 Tuesday 17:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/exceptions3.cc (1.4): Checking the detection of space
+	  dimension overflows in methods changing teh dimension of a
+	  polyhedron.
+
+2004-11-02 Tuesday 17:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/maxspacedim1.cc (1.2): Testing the max_space_dimension()
+	  methods on Constraint and Generator.
+
+2004-11-02 Tuesday 17:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.21): Corrected exception message.
+
+2004-11-02 Tuesday 17:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.92), Constraint.inlines.hh (1.53),
+	  Generator.defs.hh (1.92), Generator.inlines.hh (1.47): Added
+	  static method max_space_dimension() to classes Constraint and
+	  Generator.
+
+2004-11-02 Tuesday 15:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.inlines.hh (1.4): Added several constructors.
+
+2004-11-02 Tuesday 15:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/affineimage9.cc (1.2): A spurious dot resulted into an
+	  unknown floating point constant: fixed.
+
+2004-11-02 Tuesday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.4): Include <cstdlib> for strtol(),
+	  strtoul(), strtoll() and strtoull().
+
+2004-11-02 Tuesday 12:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.133), m4/ac_cxx_long_double.m4 (1.2): Amended to
+	  check whether the C++ compiler provides long double numbers that
+	  have bigger range or precision than double.
+
+2004-11-02 Tuesday 12:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Native_Integer.defs.hh (1.3), Native_Integer.inlines.hh
+	  (1.3): Reorganized.  All friend declarations removed.
+
+2004-11-02 Tuesday 12:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.3), Checked_Number.inlines.hh
+	  (1.4), Checked_Number.types.hh (1.3): Minor changes to adhere to
+	  our coding conventions.  Added declarations for template
+	  <typename T, typename Policy> const T& raw_value(const
+	  Checked_Number<T, Policy>& x) and template <typename T, typename
+	  Policy> T& raw_value(Checked_Number<T, Policy>& x).
+
+2004-11-02 Tuesday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.231): The programs equals1 and nnc_equals1
+	  fail also with 32-bits integers.
+
+2004-11-01 Monday 20:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.132), m4/Makefile.am (1.11),
+	  m4/ac_cxx_long_double.m4 (1.1), m4/ac_cxx_long_long.m4 (1.1): New
+	  Autoconf tests to check whether the C++ compiler supports long
+	  long integers and long double numbers.
+
+2004-11-01 Monday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.230), equals1.cc (1.1): Test
+	  operator==(const Polyhedron&, const Polyhedron&).
+
+2004-11-01 Monday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.6), compile (1.3), config.guess (1.25), install-sh
+	  (1.11), Watchdog/INSTALL (1.3), Watchdog/compile (1.3),
+	  Watchdog/config.guess (1.9), Watchdog/install-sh (1.8): Updated
+	  from Automake 1.9.3.
+
+2004-11-01 Monday 11:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.4): Fixed a problem introduced with the
+	  previous commit.
+
+2004-11-01 Monday 10:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.3): Two FIXMEs dealt with.
+
+2004-11-01 Monday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.defs.hh (1.61): FIXME added.
+
+2004-10-30 Saturday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.71), Row.inlines.hh (1.51): Fixed a bug in
+	  Row::shrink() that could bite (but not with the current code)
+	  when using compilers not supporting flexible arrays.
+
+2004-10-30 Saturday 12:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.131): Check for endianness.
+
+2004-10-29 Friday 19:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.229), maxspacedim1.cc (1.1): Test the
+	  *::max_space_dimension() methods.
+
+2004-10-29 Friday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked_mpq.inlines.hh (1.3), checked_mpz.inlines.hh (1.3):
+	  Spurious semicolons removed.
+
+2004-10-29 Friday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.inlines.hh (1.3): Make sure
+	  Linear_System::is_sorted() and Linear_System::set_sorted() are
+	  defined before being used.
+
+2004-10-29 Friday 18:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.69): Meaningless type qualifier
+	  removed.
+
+2004-10-29 Friday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.13), demos/ppl_lcdd/Makefile.am (1.12),
+	  demos/ppl_lpsol/Makefile.am (1.3),
+	  interfaces/Prolog/Ciao/Makefile.am (1.34),
+	  interfaces/Prolog/GNU/Makefile.am (1.40),
+	  interfaces/Prolog/SICStus/Makefile.am (1.46),
+	  interfaces/Prolog/XSB/Makefile.am (1.26),
+	  interfaces/Prolog/YAP/Makefile.am (1.30), tests/Makefile.am
+	  (1.228): Always specify the condition which is closed by an
+	  Automake's `end',
+
+2004-10-29 Friday 17:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.11): Run `ppl_lcdd' in the local
+	  directory, not some other executable with the same name.
+
+2004-10-28 Thursday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, TODO, configure.ac, demos/ppl_lcdd/Makefile.am,
+	  demos/ppl_lcdd/expected, demos/ppl_lcdd/expected_int16,
+	  demos/ppl_lcdd/expected_int16_a, demos/ppl_lcdd/expected_int32,
+	  demos/ppl_lcdd/expected_int32_a, demos/ppl_lcdd/expected_int64,
+	  demos/ppl_lcdd/expected_int64_a, demos/ppl_lcdd/expected_int8,
+	  demos/ppl_lcdd/expected_int8_a, demos/ppl_lcdd/expected_mpz,
+	  demos/ppl_lcdd/expected_mpz_a, demos/ppl_lcdd/ppl_lcdd.cc,
+	  doc/definitions.dox, doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/devref.tex, doc/user.tex, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/ack.clpq, interfaces/Prolog/ackn.clpq,
+	  interfaces/Prolog/check_script, interfaces/Prolog/check_script2,
+	  interfaces/Prolog/clpq.pl, interfaces/Prolog/clpq2.pl,
+	  interfaces/Prolog/expected, interfaces/Prolog/expected2,
+	  interfaces/Prolog/expected3, interfaces/Prolog/fib.clpq,
+	  interfaces/Prolog/mc91.clpq, interfaces/Prolog/pl_check.pl,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/schedule.clpq, interfaces/Prolog/smm.clpq,
+	  interfaces/Prolog/smmdiff.clpq, interfaces/Prolog/sumto.clpq,
+	  interfaces/Prolog/tak.clpq, interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected, interfaces/Prolog/XSB/expected2,
+	  interfaces/Prolog/XSB/expected2_int16,
+	  interfaces/Prolog/XSB/expected2_int16_a,
+	  interfaces/Prolog/XSB/expected2_int32,
+	  interfaces/Prolog/XSB/expected2_int32_a,
+	  interfaces/Prolog/XSB/expected2_int64,
+	  interfaces/Prolog/XSB/expected2_int64_a,
+	  interfaces/Prolog/XSB/expected2_int8,
+	  interfaces/Prolog/XSB/expected2_int8_a,
+	  interfaces/Prolog/XSB/expected2_mpz,
+	  interfaces/Prolog/XSB/expected2_mpz_a,
+	  interfaces/Prolog/XSB/expected3_int16,
+	  interfaces/Prolog/XSB/expected3_int16_a,
+	  interfaces/Prolog/XSB/expected3_int32,
+	  interfaces/Prolog/XSB/expected3_int32_a,
+	  interfaces/Prolog/XSB/expected3_int64,
+	  interfaces/Prolog/XSB/expected3_int64_a,
+	  interfaces/Prolog/XSB/expected3_int8,
+	  interfaces/Prolog/XSB/expected3_int8_a,
+	  interfaces/Prolog/XSB/expected3_mpz,
+	  interfaces/Prolog/XSB/expected3_mpz_a,
+	  interfaces/Prolog/XSB/expected_int16,
+	  interfaces/Prolog/XSB/expected_int16_a,
+	  interfaces/Prolog/XSB/expected_int32,
+	  interfaces/Prolog/XSB/expected_int32_a,
+	  interfaces/Prolog/XSB/expected_int64,
+	  interfaces/Prolog/XSB/expected_int64_a,
+	  interfaces/Prolog/XSB/expected_int8,
+	  interfaces/Prolog/XSB/expected_int8_a,
+	  interfaces/Prolog/XSB/expected_mpz,
+	  interfaces/Prolog/XSB/expected_mpz_a,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/.cvsignore,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/ack.clpq,
+	  interfaces/Prolog/tests/ackn.clpq,
+	  interfaces/Prolog/tests/check_script,
+	  interfaces/Prolog/tests/check_script2,
+	  interfaces/Prolog/tests/check_script2_int8,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected2_int16,
+	  interfaces/Prolog/tests/expected2_int16_a,
+	  interfaces/Prolog/tests/expected2_int32,
+	  interfaces/Prolog/tests/expected2_int32_a,
+	  interfaces/Prolog/tests/expected2_int64,
+	  interfaces/Prolog/tests/expected2_int64_a,
+	  interfaces/Prolog/tests/expected2_int8,
+	  interfaces/Prolog/tests/expected2_int8_a,
+	  interfaces/Prolog/tests/expected2_mpz,
+	  interfaces/Prolog/tests/expected2_mpz_a,
+	  interfaces/Prolog/tests/expected3_int16,
+	  interfaces/Prolog/tests/expected3_int16_a,
+	  interfaces/Prolog/tests/expected3_int32,
+	  interfaces/Prolog/tests/expected3_int32_a,
+	  interfaces/Prolog/tests/expected3_int64,
+	  interfaces/Prolog/tests/expected3_int64_a,
+	  interfaces/Prolog/tests/expected3_int8,
+	  interfaces/Prolog/tests/expected3_int8_a,
+	  interfaces/Prolog/tests/expected3_mpz,
+	  interfaces/Prolog/tests/expected3_mpz_a,
+	  interfaces/Prolog/tests/expected_int16,
+	  interfaces/Prolog/tests/expected_int16_a,
+	  interfaces/Prolog/tests/expected_int32,
+	  interfaces/Prolog/tests/expected_int32_a,
+	  interfaces/Prolog/tests/expected_int64,
+	  interfaces/Prolog/tests/expected_int64_a,
+	  interfaces/Prolog/tests/expected_int8,
+	  interfaces/Prolog/tests/expected_int8_a,
+	  interfaces/Prolog/tests/expected_mpz,
+	  interfaces/Prolog/tests/expected_mpz_a,
+	  interfaces/Prolog/tests/fib.clpq,
+	  interfaces/Prolog/tests/mc91.clpq,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/schedule.clpq,
+	  interfaces/Prolog/tests/smm.clpq,
+	  interfaces/Prolog/tests/smmdiff.clpq,
+	  interfaces/Prolog/tests/sumto.clpq,
+	  interfaces/Prolog/tests/tak.clpq, m4/ac_check_gmp.m4,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/ConSys.cc, src/ConSys.defs.hh, src/ConSys.inlines.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+	  src/GenSys.inlines.hh, src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/LinExpression.cc,
+	  src/LinExpression.defs.hh, src/LinExpression.inlines.hh,
+	  src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	  src/Linear_Row.inlines.hh, src/Linear_Row.types.hh,
+	  src/Linear_System.cc, src/Linear_System.defs.hh,
+	  src/Linear_System.inlines.hh, src/Linear_System.types.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/Matrix.inlines.hh, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/Ph_Status.cc,
+	  src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Row.cc, src/Row.defs.hh,
+	  src/Row.inlines.hh, src/SatMatrix.cc, src/SatMatrix.defs.hh,
+	  src/SatMatrix.inlines.hh, src/Variable.defs.hh,
+	  src/Variable.inlines.hh, src/conversion.cc, src/globals.defs.hh,
+	  src/globals.inlines.hh, src/max_space_dimension.hh,
+	  src/minimize.cc, src/simplify.cc, tests/Makefile.am,
+	  tests/addgenerator1.cc, tests/addgenerator2.cc,
+	  tests/addgenerator5.cc, tests/addgenerators11.cc,
+	  tests/addspacedims10.cc, tests/affineimage9.cc,
+	  tests/bhrz03widening9.cc, tests/ehandlers.hh,
+	  tests/exceptions2.cc, tests/exceptions3.cc, tests/generators2.cc,
+	  tests/geomcovers1.cc, tests/polyhull10.cc, tests/polyhull11.cc,
+	  tests/randphull1.cc
+	  (altnum.[4,4,9,4,3,1,1,1,1,1,1,1,1,1,1,7,4,4,4,4,2,2,5,3,1,4,1,1,1,1,2,2,2,2,1,1,1,3,5,1,1,1,1,1,3,3,3,2,2,4,1,2,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,2,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,4,5,2,2,5,3,5,5,1,4,5,3,2,3,2,1,1,1,1,1,1,1,1,12,4,3,1,2,2,1,5,5,3,7,5,3,4,3,2,2,1,3,1,5,3,2,2,3,3,5,2,2,1,2,2,1,1,1,2,2,1,1,1,1,1]):
+	  Fourth merge from main trunk.
+
+2004-10-28 Thursday 18:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.defs.hh (1.8), globals.inlines.hh (1.4):
+	  Implementation of not_a_dimension() and maybe_abandon() moved to
+	  global.inlines.hh.
+
+2004-10-28 Thursday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.defs.hh (1.7), globals.inlines.hh (1.3):
+	  Implementation of compute_capacity() moved to global.inlines.hh.
+
+2004-10-28 Thursday 17:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_System.cc (1.2), Matrix.cc (1.78), Matrix.inlines.hh
+	  (1.40), Row.cc (1.70), Row.inlines.hh (1.50), SatMatrix.cc
+	  (1.30), SatMatrix.defs.hh (1.35), SatMatrix.inlines.hh (1.22),
+	  globals.defs.hh (1.6): Avoid overflows when computing capacities
+	  for speculative memory allocations.  Added missing assertions on
+	  (user-unavailable) methods creating or extending data structures.
+
+2004-10-28 Thursday 08:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.19): Simplified the detection of
+	  sizeof(mp_limb_t): this works with Autoconf version 2.50 or
+	  higher (we already require 2.59 or higher).
+
+2004-10-28 Thursday 08:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.18): Second test program improved.
+
+2004-10-28 Thursday 07:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.121), configure.ac (1.130), interfaces/C/ppl_c.h.in
+	  (1.36), m4/ac_check_gmp.m4 (1.17): We now require GMP 4.1.3 or
+	  higher.
+
+2004-10-27 Wednesday 16:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.68), Variable.defs.hh (1.40): The
+	  new exceptions thrown by Variable and LinExpression are now
+	  mentioned in the documentation.
+
+2004-10-27 Wednesday 12:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.inlines.hh (1.35), GenSys.inlines.hh (1.35),
+	  Linear_System.defs.hh (1.2), Linear_System.inlines.hh (1.2):
+	  Added static method Linear_System::max_space_dimension().
+	  Corresponding methods of ConSys and GenSys are now implemented
+	  using this one.
+
+2004-10-27 Wednesday 12:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.43), Constraint.inlines.hh (1.52),
+	  Generator.cc (1.54), Generator.inlines.hh (1.46),
+	  Polyhedron.defs.hh (1.251), Polyhedron_chdims.cc (1.20),
+	  Polyhedron_nonpublic.cc (1.32), Polyhedron_public.cc (1.36):
+	  Exploit the availability of Variable::space_dimension().
+
+2004-10-27 Wednesday 12:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_Row.defs.hh (1.3), Linear_Row.inlines.hh (1.3):
+	  Implemented method max_space_dimension().
+
+2004-10-27 Wednesday 12:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/exceptions3.cc (1.3): Now also checking for exceptions
+	  thrown by Variable and LinExpression when exceeding the maximum
+	  space dimension.
+
+2004-10-27 Wednesday 12:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.cc (1.23), LinExpression.defs.hh (1.67),
+	  LinExpression.inlines.hh (1.32): Added method
+	  max_space_dimension(). Checking for space dimension overflows
+	  when building a LinExpression.
+
+2004-10-27 Wednesday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Variable.defs.hh (1.39), Variable.inlines.hh (1.19): Added
+	  methods space_dimension() and max_space_dimension() to class
+	  Variable.  The constructor now checks for space dimension
+	  overflows.
+
+2004-10-26 Tuesday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.227): Take into account that some tests with
+	  checked-int8 fail only when assertions are enabled.
+
+2004-10-26 Tuesday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ehandlers.hh (1.9): Treat std::overflow_error specially.
+
+2004-10-26 Tuesday 18:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.115): Information about
+	  system-dependent features for the Prolog interface updated.
+
+2004-10-26 Tuesday 18:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.74), GenSys.cc (1.100): Try to correctly deal
+	  with systems having no rows and possibly 0 columns.
+
+2004-10-26 Tuesday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/Makefile.am (1.39), tests/Makefile.am
+	  (1.2), tests/check_script2_int8 (1.1): Temporary kludge to avoid
+	  GNU Prolog's syntax errors when using clpq2 with checked-int8
+	  coefficients.
+
+2004-10-26 Tuesday 14:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SWI/pl_clpq.pl (1.6): Temporary work-around to
+	  avoid a problem with the Prolog prompt whenusing SWI-Prolog.
+
+2004-10-26 Tuesday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.tex (1.15), user.tex (1.16): Use
+	  \renewcommand{\footrulewidth}{0.4pt} instead of
+	  \setlength{\footrulewidth}{0.4pt}.
+
+2004-10-26 Tuesday 10:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.109): The last XFAILS has been dealt with (the only
+	  XFAILS remaining are those related to checked integers).
+
+2004-10-26 Tuesday 10:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.160): Typo corrected. Also stressed that
+	  NNC polyhedra have to be used only when actually needed.
+
+2004-10-26 Tuesday 10:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.120), tests/Makefile.am (1.226), tests/addgenerators11.cc
+	  (1.9), tests/exceptions2.cc (1.34): Test addgenerators11 is no
+	  longer in the XFAIL list.  Modified test2() in exceptions2.cc so
+	  as to no longer guard against an unwanted exception.	While at
+	  it, reordered the tests in Makefile.am so as to follow the
+	  alphabetical order.  The corrected bug announced in the NEWS
+	  file.
+
+2004-10-26 Tuesday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.99), GenSys.defs.hh (1.104): Private mathod
+	  bool GenSys::has_closure_points() const; now behaves assuming the
+	  point of view of the user, i.e., disregarding those closure
+	  points that are matched by corresponding points.  Fixed a bug in
+	  private method   void
+	  GenSys::adjust_topology_and_space_dimension(...); whereby an
+	  unwanted exception was thrown when converting an NNC generator
+	  system into a C generator system. This correction also makes test
+	  addgenerators11 behave correctly (i.e., no longer XFAILS).
+
+2004-10-25 Monday 17:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected3_mpz (1.1): New and revised
+	  expectations.
+
+2004-10-25 Monday 17:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.33): Pathname fixed.
+
+2004-10-25 Monday 14:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.119), TODO (1.108), src/C_Polyhedron.defs.hh (1.26),
+	  src/ConSys.defs.hh (1.90), src/GenSys.defs.hh (1.103),
+	  src/NNC_Polyhedron.defs.hh (1.28), tests/bhrz03widening9.cc
+	  (1.7): Avoid implicit constructors (except in very special
+	  cases).
+
+2004-10-25 Monday 13:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.107): Added another item related to non-explicit
+	  constructors.
+
+2004-10-25 Monday 10:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected_int16 (1.1),
+	  interfaces/Prolog/XSB/expected2_int16 (1.2),
+	  interfaces/Prolog/XSB/expected3_int16 (1.1),
+	  interfaces/Prolog/tests/expected2_int16 (1.2): New and revised
+	  expectations.
+
+2004-10-25 Monday 10:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected_int8 (1.1),
+	  interfaces/Prolog/XSB/expected3_int8 (1.1),
+	  interfaces/Prolog/tests/expected3_int8 (1.2): New and revised
+	  expectations.
+
+2004-10-25 Monday 10:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected_int64 (1.1),
+	  interfaces/Prolog/XSB/expected2_int32 (1.2),
+	  interfaces/Prolog/XSB/expected3_int32 (1.1),
+	  interfaces/Prolog/XSB/expected3_int64 (1.1),
+	  interfaces/Prolog/tests/expected2_int32 (1.2),
+	  interfaces/Prolog/tests/expected3_int64 (1.2): New and revised
+	  expectations.
+
+2004-10-25 Monday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.129), interfaces/Prolog/Makefile.am (1.26),
+	  interfaces/Prolog/ack.clpq (1.2), interfaces/Prolog/ackn.clpq
+	  (1.2), interfaces/Prolog/check_script (1.4),
+	  interfaces/Prolog/check_script2 (1.3), interfaces/Prolog/clpq.pl
+	  (1.18), interfaces/Prolog/clpq2.pl (1.29),
+	  interfaces/Prolog/expected2_int16 (1.2),
+	  interfaces/Prolog/expected2_int32 (1.2),
+	  interfaces/Prolog/expected2_int64 (1.2),
+	  interfaces/Prolog/expected2_int8 (1.2),
+	  interfaces/Prolog/expected2_mpz (1.2),
+	  interfaces/Prolog/expected3_int16 (1.2),
+	  interfaces/Prolog/expected3_int32 (1.2),
+	  interfaces/Prolog/expected3_int64 (1.2),
+	  interfaces/Prolog/expected3_int8 (1.3),
+	  interfaces/Prolog/expected3_mpz (1.2),
+	  interfaces/Prolog/expected_int16 (1.2),
+	  interfaces/Prolog/expected_int32 (1.2),
+	  interfaces/Prolog/expected_int64 (1.2),
+	  interfaces/Prolog/expected_int8 (1.2),
+	  interfaces/Prolog/expected_mpz (1.2), interfaces/Prolog/fib.clpq
+	  (1.2), interfaces/Prolog/mc91.clpq (1.2),
+	  interfaces/Prolog/pl_check.pl (1.103),
+	  interfaces/Prolog/schedule.clpq (1.4), interfaces/Prolog/smm.clpq
+	  (1.2), interfaces/Prolog/smmdiff.clpq (1.2),
+	  interfaces/Prolog/sumto.clpq (1.2), interfaces/Prolog/tak.clpq
+	  (1.2), interfaces/Prolog/Ciao/Makefile.am (1.32),
+	  interfaces/Prolog/GNU/Makefile.am (1.38),
+	  interfaces/Prolog/SICStus/Makefile.am (1.45),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.10),
+	  interfaces/Prolog/SWI/Makefile.am (1.38),
+	  interfaces/Prolog/XSB/Makefile.am (1.25),
+	  interfaces/Prolog/XSB/expected2_int16_a (1.1),
+	  interfaces/Prolog/XSB/expected2_int32_a (1.1),
+	  interfaces/Prolog/XSB/expected2_int64_a (1.1),
+	  interfaces/Prolog/XSB/expected2_int8_a (1.1),
+	  interfaces/Prolog/XSB/expected2_mpz_a (1.1),
+	  interfaces/Prolog/XSB/expected3_int16_a (1.1),
+	  interfaces/Prolog/XSB/expected3_int32_a (1.1),
+	  interfaces/Prolog/XSB/expected3_int64_a (1.1),
+	  interfaces/Prolog/XSB/expected3_int8_a (1.1),
+	  interfaces/Prolog/XSB/expected3_mpz_a (1.1),
+	  interfaces/Prolog/XSB/expected_int16_a (1.1),
+	  interfaces/Prolog/XSB/expected_int32_a (1.1),
+	  interfaces/Prolog/XSB/expected_int64_a (1.1),
+	  interfaces/Prolog/XSB/expected_int8_a (1.1),
+	  interfaces/Prolog/XSB/expected_mpz_a (1.1),
+	  interfaces/Prolog/YAP/Makefile.am (1.29),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.8),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.4),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.6),
+	  interfaces/Prolog/tests/.cvsignore (1.1),
+	  interfaces/Prolog/tests/Makefile.am (1.1),
+	  interfaces/Prolog/tests/ack.clpq (1.1),
+	  interfaces/Prolog/tests/ackn.clpq (1.1),
+	  interfaces/Prolog/tests/check_script (1.1),
+	  interfaces/Prolog/tests/check_script2 (1.1),
+	  interfaces/Prolog/tests/clpq.pl (1.1),
+	  interfaces/Prolog/tests/clpq2.pl (1.1),
+	  interfaces/Prolog/tests/expected2_int16 (1.1),
+	  interfaces/Prolog/tests/expected2_int16_a (1.1),
+	  interfaces/Prolog/tests/expected2_int32 (1.1),
+	  interfaces/Prolog/tests/expected2_int32_a (1.1),
+	  interfaces/Prolog/tests/expected2_int64 (1.1),
+	  interfaces/Prolog/tests/expected2_int64_a (1.1),
+	  interfaces/Prolog/tests/expected2_int8 (1.1),
+	  interfaces/Prolog/tests/expected2_int8_a (1.1),
+	  interfaces/Prolog/tests/expected2_mpz (1.1),
+	  interfaces/Prolog/tests/expected2_mpz_a (1.1),
+	  interfaces/Prolog/tests/expected3_int16 (1.1),
+	  interfaces/Prolog/tests/expected3_int16_a (1.1),
+	  interfaces/Prolog/tests/expected3_int32 (1.1),
+	  interfaces/Prolog/tests/expected3_int32_a (1.1),
+	  interfaces/Prolog/tests/expected3_int64 (1.1),
+	  interfaces/Prolog/tests/expected3_int64_a (1.1),
+	  interfaces/Prolog/tests/expected3_int8 (1.1),
+	  interfaces/Prolog/tests/expected3_int8_a (1.1),
+	  interfaces/Prolog/tests/expected3_mpz (1.1),
+	  interfaces/Prolog/tests/expected3_mpz_a (1.1),
+	  interfaces/Prolog/tests/expected_int16 (1.1),
+	  interfaces/Prolog/tests/expected_int16_a (1.1),
+	  interfaces/Prolog/tests/expected_int32 (1.1),
+	  interfaces/Prolog/tests/expected_int32_a (1.1),
+	  interfaces/Prolog/tests/expected_int64 (1.1),
+	  interfaces/Prolog/tests/expected_int64_a (1.1),
+	  interfaces/Prolog/tests/expected_int8 (1.1),
+	  interfaces/Prolog/tests/expected_int8_a (1.1),
+	  interfaces/Prolog/tests/expected_mpz (1.1),
+	  interfaces/Prolog/tests/expected_mpz_a (1.1),
+	  interfaces/Prolog/tests/fib.clpq (1.1),
+	  interfaces/Prolog/tests/mc91.clpq (1.1),
+	  interfaces/Prolog/tests/pl_check.pl (1.1),
+	  interfaces/Prolog/tests/schedule.clpq (1.1),
+	  interfaces/Prolog/tests/smm.clpq (1.1),
+	  interfaces/Prolog/tests/smmdiff.clpq (1.1),
+	  interfaces/Prolog/tests/sumto.clpq (1.1),
+	  interfaces/Prolog/tests/tak.clpq (1.1): Prolog tests reorganized.
+
+2004-10-24 Sunday 22:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.128), demos/ppl_lcdd/Makefile.am (1.10),
+	  demos/ppl_lcdd/expected (1.4), demos/ppl_lcdd/expected_a (1.2),
+	  demos/ppl_lcdd/expected_int16_a (1.1),
+	  demos/ppl_lcdd/expected_int32 (1.1),
+	  demos/ppl_lcdd/expected_int32_a (1.1),
+	  demos/ppl_lcdd/expected_int64_a (1.1),
+	  demos/ppl_lcdd/expected_int8_a (1.1), demos/ppl_lcdd/expected_mpz
+	  (1.1), demos/ppl_lcdd/expected_mpz_a (1.1),
+	  interfaces/Prolog/Makefile.am (1.25), interfaces/Prolog/expected
+	  (1.8), interfaces/Prolog/expected2 (1.13),
+	  interfaces/Prolog/expected2_int16 (1.1),
+	  interfaces/Prolog/expected2_int32 (1.1),
+	  interfaces/Prolog/expected2_int64 (1.1),
+	  interfaces/Prolog/expected2_mpz (1.1),
+	  interfaces/Prolog/expected3 (1.2),
+	  interfaces/Prolog/expected3_int16 (1.1),
+	  interfaces/Prolog/expected3_int32 (1.1),
+	  interfaces/Prolog/expected3_int64 (1.1),
+	  interfaces/Prolog/expected3_mpz (1.1),
+	  interfaces/Prolog/expected_int16 (1.1),
+	  interfaces/Prolog/expected_int32 (1.1),
+	  interfaces/Prolog/expected_int64 (1.1),
+	  interfaces/Prolog/expected_mpz (1.1),
+	  interfaces/Prolog/Ciao/Makefile.am (1.31),
+	  interfaces/Prolog/GNU/Makefile.am (1.37),
+	  interfaces/Prolog/SICStus/Makefile.am (1.44),
+	  interfaces/Prolog/SWI/Makefile.am (1.37),
+	  interfaces/Prolog/XSB/Makefile.am (1.24),
+	  interfaces/Prolog/XSB/expected (1.9),
+	  interfaces/Prolog/XSB/expected2 (1.11),
+	  interfaces/Prolog/XSB/expected2_int16 (1.1),
+	  interfaces/Prolog/XSB/expected2_int32 (1.1),
+	  interfaces/Prolog/XSB/expected2_int64 (1.1),
+	  interfaces/Prolog/XSB/expected2_mpz (1.1),
+	  interfaces/Prolog/XSB/expected_int16 (1.1),
+	  interfaces/Prolog/XSB/expected_int32 (1.1),
+	  interfaces/Prolog/XSB/expected_int64 (1.1),
+	  interfaces/Prolog/XSB/expected_mpz (1.1),
+	  interfaces/Prolog/YAP/Makefile.am (1.28): Another step toward the
+	  generalization of the regression testing mechanisms.
+
+2004-10-24 Sunday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.33): Print more about which kind of
+	  arithmetic overflow occurred.
+
+2004-10-24 Sunday 16:38  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.3): Generate overflow exception
+	  instead of inappropriate domain one.
+
+2004-10-24 Sunday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: expected3_int8 (1.2), SWI/Makefile.am (1.36),
+	  XSB/Makefile.am (1.23), XSB/expected2_int8 (1.1),
+	  XSB/expected_int8 (1.1): More infrastructure to conditionalize
+	  our expectations about the tests outcome on the kind of
+	  coefficients we use.
+
+2004-10-24 Sunday 12:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.102): Catch all exceptions.
+
+2004-10-24 Sunday 12:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.66):
+	  Integer_to_integer_term() fixed.
+
+2004-10-24 Sunday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.101): Variable name clash
+	  removed: this was causing XSB to crash (due to one of its many
+	  bugs).
+
+2004-10-24 Sunday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.127), interfaces/Prolog/expected2_int8 (1.1),
+	  interfaces/Prolog/expected3_int8 (1.1),
+	  interfaces/Prolog/expected_int8 (1.1),
+	  interfaces/Prolog/Ciao/Makefile.am (1.30),
+	  interfaces/Prolog/GNU/Makefile.am (1.36),
+	  interfaces/Prolog/SICStus/Makefile.am (1.43),
+	  interfaces/Prolog/YAP/Makefile.am (1.27): Started adding some
+	  infrastructure so as to conditionalize our expectations about the
+	  tests outcome on the kind of coefficients used.
+
+2004-10-24 Sunday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.225), geomcovers1.cc (1.1): New test for
+	  Polyhedra_Powerset<PH>::geometrically_covers().
+
+2004-10-24 Sunday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.106): Added a new item.
+
+2004-10-23 Saturday 23:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.28): Fail gracefully in those cases
+	  where an overflow exception or other PPL exception is thrown.
+
+2004-10-23 Saturday 23:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq.pl (1.17): Fail gracefully in those cases
+	  where an overflow exception or other PPL exception is thrown.
+
+2004-10-23 Saturday 23:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.139): Handle
+	  std::overflow_error.
+
+2004-10-21 Thursday 20:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.23): Be quiet.
+
+2004-10-21 Thursday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.224): The definition of XFAIL_TESTS now
+	  takes into account the type of coefficients being used.
+
+2004-10-21 Thursday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.126): Introduced new Automake variables that
+	  allow to keep track of the type of coefficients being used.
+
+2004-10-21 Thursday 13:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/randphull1.cc (1.11): Fixed to allow for generic
+	  coefficients.
+
+2004-10-21 Thursday 11:59  Abramo Bagnara
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.26): Generalized string
+	  conversion.
+
+2004-10-20 Wednesday 20:00  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (1.3): Use signed explicitly.
+
+2004-10-20 Wednesday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/: Makefile.am (1.9), expected_a (1.1): Exclude
+	  examples that are too heavy when assertions are enabled.
+
+2004-10-20 Wednesday 18:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.125): Introduced new Automake conditional
+	  ASSERTIONS_ENABLED.
+
+2004-10-20 Wednesday 16:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.105): We now allow the specification of alternative
+	  coefficient implementations.
+
+2004-10-20 Wednesday 15:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.104): The bug concerning empty generator systems has been
+	  fixed.
+
+2004-10-20 Wednesday 13:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.223): Added nnc_randphull1 and
+	  nnc_randphull2 to DERIVED_TESTS.
+
+2004-10-19 Tuesday 22:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.14), configure.ac (1.124), demos/Makefile.am (1.4),
+	  demos/ppl_lcdd/ppl_lcdd.cc (1.32),
+	  doc/devref-browse.doxyconf-latex.in (1.46),
+	  doc/devref-print.doxyconf-latex.in (1.46),
+	  doc/devref.doxyconf-html.in (1.46), interfaces/C/ppl_c.cc
+	  (1.113), interfaces/Prolog/ppl_prolog.icc (1.138),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.25),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.21),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.65),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.90),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.57),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.83), src/BoundingBox.defs.hh
+	  (1.14), src/BoundingBox.inlines.hh (1.13),
+	  src/Checked_Number.defs.hh (1.2), src/Checked_Number.inlines.hh
+	  (1.2), src/Checked_Number.types.hh (1.2), src/ConSys.cc (1.73),
+	  src/ConSys.defs.hh (1.89), src/Constraint.defs.hh (1.91),
+	  src/Constraint.inlines.hh (1.51), src/GMP_Integer.defs.hh (1.2),
+	  src/GMP_Integer.inlines.hh (1.2), src/GMP_Integer.types.hh (1.2),
+	  src/GenSys.cc (1.98), src/GenSys.defs.hh (1.102),
+	  src/Generator.cc (1.53), src/Generator.defs.hh (1.91),
+	  src/Generator.inlines.hh (1.45), src/Integer.defs.hh (1.14),
+	  src/Integer.inlines.hh (1.13), src/Integer.types.hh (1.9),
+	  src/Integer_macros.hh (1.2), src/Integer_traits_template.hh
+	  (1.2), src/Interval.defs.hh (1.17), src/Interval.inlines.hh
+	  (1.13), src/Limits.hh (1.2), src/LinExpression.cc (1.22),
+	  src/LinExpression.defs.hh (1.66), src/LinExpression.inlines.hh
+	  (1.31), src/Linear_Row.defs.hh (1.2), src/Linear_Row.inlines.hh
+	  (1.2), src/Makefile.am (1.82), src/Native_Integer.defs.hh (1.2),
+	  src/Native_Integer.inlines.hh (1.2), src/Native_Integer.types.hh
+	  (1.2), src/Polyhedron.defs.hh (1.250), src/Polyhedron.inlines.hh
+	  (1.98), src/Polyhedron_nonpublic.cc (1.31),
+	  src/Polyhedron_public.cc (1.35), src/Polyhedron_widenings.cc
+	  (1.32), src/Row.defs.hh (1.84), src/Row.inlines.hh (1.49),
+	  src/checked.defs.hh (1.2), src/checked.inlines.hh (1.2),
+	  src/checked_float.inlines.hh (1.2), src/checked_int.inlines.hh
+	  (1.2), src/checked_mpq.inlines.hh (1.2),
+	  src/checked_mpz.inlines.hh (1.2), src/conversion.cc (1.63),
+	  src/float.types.hh (1.2), src/globals.defs.hh (1.5),
+	  tests/BBox.cc (1.5), tests/BBox.hh (1.4), tests/Makefile.am
+	  (1.222), tests/dualhypercubes.cc (1.5): First merge from the
+	  `altnum' branch.
+
+2004-10-19 Tuesday 22:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.100), Ciao/ppl_ciao.pl (1.71):
+	  Correction to ciao interface so it now allows for prolog failure
+	  for ppl_Polyhedron_map_space_dimensions/2 and
+	  ppl_Polyhedron_fold_dimensions/3.
+
+	  Negative tests for ppl_Polyhedron_map_space_dimensions/2 that
+	  caused make check when using pl_check.pl to fail have now been
+	  restored.  Now these tests pass with all the Prolog systems.
+
+2004-10-19 Tuesday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.31),
+	  doc/devref-browse.doxyconf-latex.in (1.45),
+	  doc/devref-print.doxyconf-latex.in (1.45),
+	  doc/devref.doxyconf-html.in (1.45), src/ConSys.cc (1.72),
+	  src/ConSys.defs.hh (1.88), src/ConSys.inlines.hh (1.34),
+	  src/Constraint.cc (1.42), src/Constraint.defs.hh (1.90),
+	  src/Constraint.inlines.hh (1.50), src/GenSys.cc (1.97),
+	  src/GenSys.defs.hh (1.101), src/GenSys.inlines.hh (1.34),
+	  src/Generator.cc (1.52), src/Generator.defs.hh (1.90),
+	  src/Generator.inlines.hh (1.44), src/LinExpression.cc (1.21),
+	  src/LinExpression.defs.hh (1.65), src/LinExpression.inlines.hh
+	  (1.30), src/Linear_Row.cc (1.1), src/Linear_Row.defs.hh (1.1),
+	  src/Linear_Row.inlines.hh (1.1), src/Linear_Row.types.hh (1.1),
+	  src/Linear_System.cc (1.1), src/Linear_System.defs.hh (1.1),
+	  src/Linear_System.inlines.hh (1.1), src/Linear_System.types.hh
+	  (1.1), src/Makefile.am (1.81), src/Matrix.cc (1.77),
+	  src/Matrix.defs.hh (1.60), src/Matrix.inlines.hh (1.39),
+	  src/Ph_Status.cc (1.5), src/Polyhedron.defs.hh (1.249),
+	  src/Polyhedron_chdims.cc (1.19), src/Polyhedron_nonpublic.cc
+	  (1.30), src/Polyhedron_public.cc (1.34), src/Row.cc (1.69),
+	  src/Row.defs.hh (1.83), src/Row.inlines.hh (1.48),
+	  src/conversion.cc (1.62), src/globals.defs.hh (1.4),
+	  src/globals.inlines.hh (1.2), src/minimize.cc (1.38),
+	  src/simplify.cc (1.39): The class Matrix now represents a simple
+	  matrix of coefficients that is organized in rows, represented by
+	  the class Row.  Matrix and Row take care of all the memory
+	  allocation details and little more.  They are specialized by
+	  classes Linear_Row and Linear_System that, in turn constitute the
+	  basis upon which constraints, generators and systems thereof are
+	  built upon.  Several methods that were no longer needed have been
+	  removed.  Several methods have been given more sensible names and
+	  interfaces.
+
+2004-10-19 Tuesday 16:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.99): Tests causing "make check"
+	  to fail in Ciao and GNU Prolog temporarily disabled.	Now "make
+	  check" in all the prolog interfaces succeeds.
+
+2004-10-19 Tuesday 11:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.98): More tests added so as to
+	  test the Prolog interface more exhaustively.
+
+	  However, because of the more thorough testing, bugs in the Ciao
+	  Prolog and GNU Prolog interfaces have been exposed; as a result
+	  the  "make check" for Ciao Prolog and GNU Prolog now fails.
+
+2004-10-17 Sunday 21:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.112): Fixed a couple of indentation
+	  glitches.
+
+2004-10-17 Sunday 18:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.inlines.hh (1.19), NNC_Polyhedron.inlines.hh
+	  (1.22): Simplified all constructors that need to check for
+	  dimension overflows removing, at the same time, the previous
+	  requirement imposed on the BoundingBox template concerning the
+	  availability of a default constructor.
+
+2004-10-16 Saturday 23:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.118): Explain why functions in the C interface that
+	  compute (space) dimensions no longer return their result.
+
+2004-10-16 Saturday 23:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.117): Mention the bug fixed in
+	  ppl_new_LinExpression_with_dimension().
+
+2004-10-16 Saturday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.111): Fixed a bug in
+	  ppl_new_LinExpression_with_dimension() reported by Pedro
+	  Vasconcelos.
+
+2004-10-15 Friday 08:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.25), C_Polyhedron.inlines.hh
+	  (1.18), NNC_Polyhedron.defs.hh (1.27), NNC_Polyhedron.inlines.hh
+	  (1.21), Polyhedron.defs.hh (1.248), Polyhedron.inlines.hh (1.97),
+	  Polyhedron_chdims.cc (1.18), Polyhedron_nonpublic.cc (1.29),
+	  max_space_dimension.hh (1.4): Removed
+	  C_Polyhedron::max_space_dimension() and
+	  NNC_Polyehdron::max_space_dimension(): the method
+	  Polyhedron::max_space_dimension() no longer uses them and it is
+	  not hided by them. Changed all places where we check for
+	  dimensions overflows accordingly.  Exception throwers made
+	  protected to allow calling them from subclasses.  The BoundingBox
+	  template is now required to have a default constructor.
+
+2004-10-13 Wednesday 14:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/addspacedims10.cc (1.2): Comment corrected.
+
+2004-10-13 Wednesday 12:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.116), TODO (1.103): Corrected the bug shown by
+	  generators2.cc.
+
+2004-10-13 Wednesday 11:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.17), tests/addgenerator1.cc (1.7),
+	  tests/addgenerator2.cc (1.7), tests/memory1.cc (1.22): Small
+	  adjustments in comments.
+
+2004-10-13 Wednesday 11:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.33): Method generators() now
+	  correctly sets the space dimension of the generator system
+	  representing an empty polyhedron (thereby correcting the bug
+	  shown by test generators2.cc).
+
+2004-10-13 Wednesday 11:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.28): Constructors now correctly
+	  deal with empty systems of constraints/generators having a
+	  positive space dimension.
+
+2004-10-13 Wednesday 11:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.71), GenSys.cc (1.96): Now methods
+	  adjust_topology_and_space_dimension() allow for empty systems
+	  having a positive space dimension.
+
+2004-10-13 Wednesday 11:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.76), Matrix.inlines.hh (1.38): No longer
+	  enforcing the Matrix invariant   num_rows() == 0   ==>
+	  num_columns() == 0.
+
+2004-10-13 Wednesday 09:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.102): Documentation of affine dimension is now in the
+	  user manual.
+
+2004-10-11 Monday 11:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.221), addgenerator5.cc (1.1),
+	  generators2.cc (1.10): Tests generators2 and addgenerator5 show a
+	  bug in the handling of space dimensions for a generator system
+	  corresponding to an empty polyhedron.
+
+2004-10-07 Thursday 15:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.220), affineimage9.cc (1.1): New test for
+	  Polyhedron::affine_image().
+
+2004-10-07 Thursday 14:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/polyhull11.cc (1.2): Small correction.
+
+2004-10-07 Thursday 12:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.219), polyhull11.cc (1.1): New test for
+	  Polyhedron::poly_hull_assign_and_minimize().
+
+2004-10-07 Thursday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/polyhull10.cc (1.5): Completed.
+
+2004-10-03 Sunday 15:33  Abramo Bagnara
+
+	* src/: Makefile.am, checked.defs.hh, checked.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[11,18,11,12,18,17]): Transformed
+	  implicit default implementation in esplicit specializations using
+	  generic implementation.
+
+2004-10-03 Sunday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.defs.hh (altnum.17): Comment improved.
+
+2004-10-03 Sunday 00:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.24): Started implementing
+	  bidirectional communication of bignums.
+
+2004-10-02 Saturday 19:23  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.17): Fixed 64 bit
+	  architecture.
+
+2004-10-02 Saturday 19:18  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.16): Better architecture
+	  support for Larger.
+
+2004-10-02 Saturday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.defs.hh (altnum.16): Comments improved.
+
+2004-10-02 Saturday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in,
+	  devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+	  (altnum.[3,3,3]): Add the new implementation files to the lists
+	  Doxygen uses to produce the developer's reference manual.
+
+2004-10-02 Saturday 18:03  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.15): Better name for Larger
+	  struct.
+
+2004-10-02 Saturday 17:59  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (altnum.16): Use GMP specific type for
+	  MP size.
+
+2004-10-02 Saturday 17:56  Abramo Bagnara
+
+	* src/checked.defs.hh (altnum.15): Use distinct policies for ext
+	  functions.
+
+2004-10-02 Saturday 17:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.27): Implemented another exception
+	  thrower.
+
+2004-10-02 Saturday 17:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/NNC_Polyhedron.inlines.hh (1.20): Previous commit undone, as
+	  it was breaking the build.
+
+2004-10-02 Saturday 16:22  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.10): Use distinct policies for ext
+	  functions.
+
+2004-10-02 Saturday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Limits.hh, checked.defs.hh, checked.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[2,14,9,11,14,14,15]): Started enforcing some of our
+	  coding conventions.
+
+2004-10-02 Saturday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/float.types.hh (altnum.3): Initial comment fixed.
+
+2004-10-02 Saturday 13:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc, XSB/ppl_xsb.cc,
+	  YAP/ppl_yap.cc (altnum.[2,3,3]): Use checked numbers to detect
+	  overflows.
+
+2004-10-02 Saturday 13:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/NNC_Polyhedron.inlines.hh (1.19): Using the exception thrower
+	  instead of directly throwing the exception.
+
+2004-10-02 Saturday 13:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.247), Polyhedron_chdims.cc (1.16):
+	  Modified all the methods augmenting the space dimension of a
+	  polyhedron so as to throw std::length_error if the new vector
+	  space exceeds the maximum allowed space dimension.
+
+2004-10-02 Saturday 13:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.115): Announced the new behavior of the
+	  H79_widening_assign() operator.  Formally, it is a bugfix since
+	  we were already promising the new behavior in the user manual.
+
+2004-10-02 Saturday 12:11  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.13): Removed unused code.
+
+2004-10-02 Saturday 10:42  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[13,12,13,14]): Use a typedef for pointer to C strings.
+
+2004-10-02 Saturday 08:42  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  checked_int.inlines.hh, checked_mpq.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[12,12,11,12,13]): Added
+	  constructors from char *.
+
+2004-10-02 Saturday 08:41  Abramo Bagnara
+
+	* interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (altnum.3): Attempt
+	  to fix compilation.
+
+2004-10-01 Friday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, TODO, compile, config.guess, config.sub, configure.ac,
+	  install-sh, ltmain.sh, missing, Watchdog/compile,
+	  Watchdog/config.guess, Watchdog/config.sub, Watchdog/install-sh,
+	  Watchdog/ltmain.sh, Watchdog/missing, demos/ppl_lcdd/Makefile.am,
+	  demos/ppl_lcdd/expected, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/Makefile.am,
+	  demos/ppl_lcdd/examples/README,
+	  demos/ppl_lcdd/examples/dcube10.ext,
+	  demos/ppl_lcdd/examples/dcube12.ext,
+	  demos/ppl_lcdd/examples/dcube3.ext,
+	  demos/ppl_lcdd/examples/dcube6.ext,
+	  demos/ppl_lcdd/examples/dcube8.ext, doc/README,
+	  doc/definitions.dox, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/clpq.pl, interfaces/Prolog/clpq2.pl,
+	  interfaces/Prolog/expected, interfaces/Prolog/expected2,
+	  interfaces/Prolog/pl_check.pl, interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/expected, interfaces/Prolog/XSB/expected2,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+	  src/AskTell.inlines.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh, src/BoundingBox.defs.hh,
+	  src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh, src/ConSys.cc,
+	  src/ConSys.defs.hh, src/Constraint.defs.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/GenSys.cc, src/GenSys.defs.hh, src/Generator.defs.hh,
+	  src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+	  src/H79_Certificate.inlines.hh, src/LinExpression.defs.hh,
+	  src/Matrix.defs.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Variable.defs.hh,
+	  src/conversion.cc, src/globals.defs.hh, src/minimize.cc,
+	  src/simplify.cc, tests/CbecomesNNC1.cc, tests/Makefile.am,
+	  tests/NNCbecomesC1.cc, tests/README, tests/adddimensions1.cc,
+	  tests/adddimensions10.cc, tests/adddimensions11.cc,
+	  tests/adddimensions12.cc, tests/adddimensions13.cc,
+	  tests/adddimensions2.cc, tests/adddimensions3.cc,
+	  tests/adddimensions4.cc, tests/adddimensions5.cc,
+	  tests/adddimensions6.cc, tests/adddimensions7.cc,
+	  tests/adddimensions8.cc, tests/adddimensions9.cc,
+	  tests/addgenerators11.cc, tests/addspacedims1.cc,
+	  tests/addspacedims10.cc, tests/addspacedims11.cc,
+	  tests/addspacedims12.cc, tests/addspacedims13.cc,
+	  tests/addspacedims2.cc, tests/addspacedims3.cc,
+	  tests/addspacedims4.cc, tests/addspacedims5.cc,
+	  tests/addspacedims6.cc, tests/addspacedims7.cc,
+	  tests/addspacedims8.cc, tests/addspacedims9.cc, tests/append1.cc,
+	  tests/append2.cc, tests/boundingbox1.cc, tests/boundingbox2.cc,
+	  tests/concatenate1.cc, tests/exceptions1.cc,
+	  tests/exceptions2.cc, tests/expanddim1.cc, tests/expanddim2.cc,
+	  tests/expandspacedim1.cc, tests/expandspacedim2.cc,
+	  tests/folddims1.cc, tests/folddims2.cc, tests/foldspacedims1.cc,
+	  tests/foldspacedims2.cc, tests/generators1.cc,
+	  tests/generators4.cc, tests/limitedh79extrapolation3.cc,
+	  tests/mapdim1.cc, tests/mapdim2.cc, tests/mapdim3.cc,
+	  tests/mapspacedims1.cc, tests/mapspacedims2.cc,
+	  tests/mapspacedims3.cc, tests/permute.cc,
+	  tests/polydifference1.cc, tests/polydifference9.cc,
+	  tests/removedim1.cc, tests/removedim10.cc, tests/removedim2.cc,
+	  tests/removedim3.cc, tests/removedim4.cc, tests/removedim5.cc,
+	  tests/removedim6.cc, tests/removedim7.cc, tests/removedim8.cc,
+	  tests/removedim9.cc, tests/removespacedims1.cc,
+	  tests/removespacedims10.cc, tests/removespacedims2.cc,
+	  tests/removespacedims3.cc, tests/removespacedims4.cc,
+	  tests/removespacedims5.cc, tests/removespacedims6.cc,
+	  tests/removespacedims7.cc, tests/removespacedims8.cc,
+	  tests/removespacedims9.cc
+	  (altnum.[3,3,1,2,2,8,2,2,1,1,2,2,2,2,1,3,2,6,2,2,1,1,1,1,1,1,3,4,2,3,1,1,1,1,2,4,1,1,2,2,2,2,5,1,1,2,2,1,1,2,2,3,1,2,3,2,3,2,2,3,4,4,3,2,4,4,4,3,3,2,2,2,2,2,4,4,2,6,4,4,2,4,2,2,2,1,4,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,2,1,1,1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Third merge from main trunk.
+
+2004-09-30 Thursday 18:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.101): Added another thing not to be forgotten.
+
+2004-09-30 Thursday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.100): Added another item not to be forgotten.
+
+2004-09-30 Thursday 17:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Makefile.am (1.218), addgenerators11.cc (1.8): Restored
+	  previous version of test as that change wrongly destroyed the
+	  intention of the test.  Added this test to the XFAIL_TESTS list
+	  in Makefile.am.
+
+2004-09-30 Thursday 13:30  Abramo Bagnara
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (altnum.2): Added needed
+	  #include's.
+
+2004-09-30 Thursday 13:23  Abramo Bagnara
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (altnum.4): Include only
+	  the needed file.
+
+2004-09-30 Thursday 09:09  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[11,11]): Removed test #define.
+
+2004-09-30 Thursday 09:07  Abramo Bagnara
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (altnum.1): Fixes for
+	  generalized Integers.
+
+2004-09-29 Wednesday 21:46  Abramo Bagnara
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (altnum.1): Fixed compilation.
+
+2004-09-29 Wednesday 14:00  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, src/Checked_Number.defs.hh,
+	  src/checked.defs.hh (altnum.[5,10,12]): Fixed compilation for GMP
+	  Integers.
+
+2004-09-29 Wednesday 09:52  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, interfaces/C/ppl_c.cc,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	  src/Interval.inlines.hh, src/Native_Integer.defs.hh,
+	  src/Native_Integer.inlines.hh, src/Polyhedron_nonpublic.cc,
+	  src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_int.inlines.hh
+	  (altnum.[4,3,3,3,9,10,5,5,5,5,5,5,11,8,10]): Fixed compilation
+	  for different types of Integers.
+
+2004-09-29 Wednesday 08:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.97): More tests added and
+	  improved structure for the tests for
+	  ppl_Polyhedron_topological_closure_assign/1.
+
+2004-09-28 Tuesday 17:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.114), TODO (1.99), doc/definitions.dox (1.159): Announced
+	  the renaming of methods changing space dimensions.  Added to the
+	  user manual the notion of affine independence, which is used to
+	  define the affine dimension of a polyhedron.	Small reordering to
+	  the devref part of definitions.dox.
+
+2004-09-28 Tuesday 17:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.31), tests/Makefile.am (1.217),
+	  tests/limitedh79extrapolation3.cc (1.4): The implementation of
+	  select_H79_constraints() changed so as to ignore trivially true
+	  constraints coming from homogenization or epsilon-polyhedra
+	  encoding. Thus, the H79 widening is now applied to the polyhedra
+	  and not their homogenized polyehdral cones. The known result of
+	  the test limitedh79extrapolation3 has been changed accordingly.
+
+2004-09-28 Tuesday 15:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Makefile.am (1.216), addgenerators11.cc (1.7),
+	  polydifference1.cc (1.8): Changes to tests so that
+	  addgenerators11, polydifference1 and nnc_polydifference1 tests
+	  succeed.  The tests addgenerators11 and nnc_polydifference1 are
+	  no longer named as failing tests by Makefile.
+
+2004-09-27 Monday 22:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.70): Added missing
+	  definition for ppl_Polyhedron_affine_dimension/2.
+
+2004-09-27 Monday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: xsb_clpq.P (1.9), xsb_clpq2.P (1.7),
+	  xsb_pl_check.P (1.11): The names of all the methods changing the
+	  space dimension of a polyhedron now contain "space_dimension" as
+	  a substring, therefore avoiding ambiguity with the concept of
+	  affine dimension.
+
+2004-09-27 Monday 17:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.158), interfaces/C/ppl_c.cc (1.110),
+	  interfaces/C/ppl_c.h.in (1.35),
+	  interfaces/Prolog/Prolog_interface.dox (1.114),
+	  interfaces/Prolog/clpq.pl (1.16), interfaces/Prolog/clpq2.pl
+	  (1.27), interfaces/Prolog/pl_check.pl (1.96),
+	  interfaces/Prolog/ppl_prolog.icc (1.137),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.10),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.5),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.6),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.69),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.47),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.64),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.89),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.34),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.56),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.10),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.82), src/AskTell.defs.hh
+	  (1.26), src/AskTell.inlines.hh (1.22), src/BHRZ03_Certificate.cc
+	  (1.3), src/BHRZ03_Certificate.defs.hh (1.7),
+	  src/BHRZ03_Certificate.inlines.hh (1.3), src/BoundingBox.defs.hh
+	  (1.13), src/ConSys.cc (1.70), src/ConSys.defs.hh (1.87),
+	  src/Constraint.defs.hh (1.89), src/Determinate.defs.hh (1.45),
+	  src/Determinate.inlines.hh (1.40), src/GenSys.cc (1.95),
+	  src/GenSys.defs.hh (1.100), src/Generator.defs.hh (1.89),
+	  src/H79_Certificate.cc (1.4), src/H79_Certificate.defs.hh (1.7),
+	  src/H79_Certificate.inlines.hh (1.3), src/LinExpression.defs.hh
+	  (1.64), src/Matrix.defs.hh (1.59), src/Polyhedra_Powerset.defs.hh
+	  (1.3), src/Polyhedra_Powerset.inlines.hh (1.5),
+	  src/Polyhedron.defs.hh (1.246), src/Polyhedron.inlines.hh (1.96),
+	  src/Polyhedron_chdims.cc (1.15), src/Polyhedron_nonpublic.cc
+	  (1.26), src/Polyhedron_public.cc (1.32), src/Variable.defs.hh
+	  (1.38), tests/Makefile.am (1.215), tests/adddimensions1.cc
+	  (1.15), tests/adddimensions10.cc (1.8), tests/adddimensions11.cc
+	  (1.7), tests/adddimensions12.cc (1.5), tests/adddimensions13.cc
+	  (1.4), tests/adddimensions2.cc (1.11), tests/adddimensions3.cc
+	  (1.13), tests/adddimensions4.cc (1.11), tests/adddimensions5.cc
+	  (1.9), tests/adddimensions6.cc (1.9), tests/adddimensions7.cc
+	  (1.9), tests/adddimensions8.cc (1.7), tests/adddimensions9.cc
+	  (1.8), tests/addspacedims1.cc (1.1), tests/addspacedims10.cc
+	  (1.1), tests/addspacedims11.cc (1.1), tests/addspacedims12.cc
+	  (1.1), tests/addspacedims13.cc (1.1), tests/addspacedims2.cc
+	  (1.1), tests/addspacedims3.cc (1.1), tests/addspacedims4.cc
+	  (1.1), tests/addspacedims5.cc (1.1), tests/addspacedims6.cc
+	  (1.1), tests/addspacedims7.cc (1.1), tests/addspacedims8.cc
+	  (1.1), tests/addspacedims9.cc (1.1), tests/append1.cc (1.23),
+	  tests/append2.cc (1.23), tests/concatenate1.cc (1.9),
+	  tests/exceptions1.cc (1.39), tests/expanddim1.cc (1.8),
+	  tests/expanddim2.cc (1.2), tests/expandspacedim1.cc (1.1),
+	  tests/expandspacedim2.cc (1.1), tests/folddims1.cc (1.3),
+	  tests/folddims2.cc (1.3), tests/foldspacedims1.cc (1.1),
+	  tests/foldspacedims2.cc (1.1), tests/mapdim1.cc (1.3),
+	  tests/mapdim2.cc (1.3), tests/mapdim3.cc (1.2),
+	  tests/mapspacedims1.cc (1.1), tests/mapspacedims2.cc (1.1),
+	  tests/mapspacedims3.cc (1.1), tests/permute.cc (1.32),
+	  tests/polydifference9.cc (1.4), tests/removedim1.cc (1.12),
+	  tests/removedim10.cc (1.4), tests/removedim2.cc (1.16),
+	  tests/removedim3.cc (1.12), tests/removedim4.cc (1.13),
+	  tests/removedim5.cc (1.11), tests/removedim6.cc (1.14),
+	  tests/removedim7.cc (1.10), tests/removedim8.cc (1.7),
+	  tests/removedim9.cc (1.7), tests/removespacedims1.cc (1.1),
+	  tests/removespacedims10.cc (1.1), tests/removespacedims2.cc
+	  (1.1), tests/removespacedims3.cc (1.1), tests/removespacedims4.cc
+	  (1.1), tests/removespacedims5.cc (1.1), tests/removespacedims6.cc
+	  (1.1), tests/removespacedims7.cc (1.1), tests/removespacedims8.cc
+	  (1.1), tests/removespacedims9.cc (1.1): The method
+	  Polyhedron::dimension() is now named
+	  Polyhedron::affine_dimension().  The names of all the methods
+	  changing the space dimension of a polyhedron now contain
+	  "space_dimension" as a substring, therefore avoiding ambiguity
+	  with the concept of affine dimension.  All the foreign interfaces
+	  changed accordingly.	Also tried to be consistent in the
+	  documentation.  All the tests related to methods changing space
+	  dimensions now follow a common naming scheme (***spacedim(s)*).
+
+2004-09-27 Monday 17:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.61): Improved the detailed documentation in
+	  a couple of places.  Using a reference to avoid multiple access
+	  to dest[num_lines_or_equalities].
+
+2004-09-27 Monday 09:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatRow.cc, SatRow.defs.hh, SatRow.inlines.hh
+	  (altnum.[8,2,1]): Updated from the main trunk.
+
+2004-09-26 Sunday 22:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.28): SatRow::first() and SatRow::next() speeded
+	  up.
+
+2004-09-26 Sunday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.27): SatRow::last() and SatRow::prev() speeded
+	  up.
+
+2004-09-26 Sunday 19:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.98): Added a set of possible renamings we may decide to
+	  perform before releasing PPL 0.7.
+
+2004-09-26 Sunday 15:44  Abramo Bagnara
+
+	* src/: checked_int.inlines.hh, checked_mpz.inlines.hh,
+	  checked_mpq.inlines.hh (altnum.[9,12,11]): Reorganizing
+	  specializations.
+
+2004-09-26 Sunday 15:44  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (altnum.10): Removed trailing
+	  semicolons.
+
+2004-09-26 Sunday 15:44  Abramo Bagnara
+
+	* src/checked.defs.hh (altnum.10): Removed trailing semicolon.
+
+2004-09-26 Sunday 15:43  Abramo Bagnara
+
+	* src/: Interval.inlines.hh, Polyhedron_nonpublic.cc
+	  (altnum.[4,4]): Call proper constructors.
+
+2004-09-26 Sunday 15:43  Abramo Bagnara
+
+	* src/Checked_Number.types.hh (altnum.3): Renamed default policy.
+
+2004-09-26 Sunday 15:42  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[8,9]): Make Checked_Number optionally implicitly
+	  convertible to base type.
+
+2004-09-26 Sunday 15:41  Abramo Bagnara
+
+	* interfaces/Prolog/: ppl_prolog.icc, SWI/ppl_swiprolog.cc
+	  (altnum.[2,2]): Preliminary step on generalization path.
+
+2004-09-26 Sunday 15:40  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (altnum.3): Call proper constructor.
+
+2004-09-26 Sunday 14:44  Abramo Bagnara
+
+	* src/SatRow.cc (altnum.7): Fixed thinko. Added assertion for bogus
+	  call to last.
+
+2004-09-26 Sunday 13:47  Abramo Bagnara
+
+	* src/SatRow.cc (altnum.6): Trivial bug fixes.
+
+2004-09-26 Sunday 11:24  Abramo Bagnara
+
+	* src/SatRow.cc (altnum.5): Further optimizations.
+
+2004-09-26 Sunday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.113), interfaces/C/ppl_c.cc (1.109),
+	  interfaces/Prolog/ppl_prolog.icc (1.136), src/Polyhedron.defs.hh
+	  (1.245), src/Polyhedron.inlines.hh (1.95),
+	  src/Polyhedron_widenings.cc (1.30), src/globals.defs.hh (1.3),
+	  tests/boundingbox1.cc (1.37), tests/boundingbox2.cc (1.22): The
+	  enumeration values of enum Complexity_Class have been renamed
+	  POLYNOMIAL_COMPLEXITY, SIMPLEX_COMPLEXITY and ANY_COMPLEXITY.
+
+2004-09-26 Sunday 09:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatRow.cc (1.26), SatRow.inlines.hh (1.29): Use ffs(3) when
+	  possible.
+
+2004-09-26 Sunday 09:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.123): Added a check to determine sizeof(int).
+
+2004-09-26 Sunday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.25): Function strict_subset() speeded up
+	  further.
+
+2004-09-26 Sunday 00:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.122): Check whether the ffs(3) function is
+	  available.
+
+2004-09-25 Saturday 23:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.defs.hh (1.34): Fix two completely bogus comments.
+
+2004-09-25 Saturday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.24): Function strict_subset() speeded up.
+
+2004-09-25 Saturday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.23): Function subset_or_equal() speeded up.
+
+2004-09-25 Saturday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (altnum.4): Avoid a useless asymmetry.	All the
+	  other things being equal, prefer pre-increment and pre-decrement
+	  to post-increment and post-decrement.
+
+2004-09-25 Saturday 10:25  Abramo Bagnara
+
+	* src/SatRow.cc (altnum.3): Minor residual optimization.
+
+2004-09-25 Saturday 10:23  Abramo Bagnara
+
+	* src/SatRow.cc (altnum.2): Optimization second attempt.
+
+2004-09-25 Saturday 10:15  Abramo Bagnara
+
+	* src/SatRow.cc (altnum.1): Optimization first attempt.
+
+2004-09-22 Wednesday 18:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (altnum.2): Activate the Prolog
+	  interfaces.
+
+2004-09-22 Wednesday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected (1.3): Updated to reflect the fact that
+	  we are not sorting constraints before returning them.
+
+2004-09-22 Wednesday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: expected (1.7), expected2 (1.12),
+	  XSB/expected (1.8), XSB/expected2 (1.10): Updated to reflect the
+	  fact that we are not sorting constraints before returning them.
+
+2004-09-22 Wednesday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, configure.ac, src/Checked_Integer.defs.hh,
+	  src/Checked_Integer.inlines.hh, src/Checked_Integer.types.hh,
+	  src/Integer.defs.hh, src/Integer.types.hh, src/Makefile.am
+	  (altnum.[3,7,6,7,3,5,5,10]): Commit to the new implementation of
+	  checked numbers.
+
+2004-09-22 Wednesday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (altnum.2): Temporary kludge to make things
+	  work until we generalize the interface.
+
+2004-09-22 Wednesday 16:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh, GMP_Integer.inlines.hh (altnum.[4,4]):
+	  Added add_mul_assign() and sub_mul_assign().
+
+2004-09-22 Wednesday 16:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.31): No longer sorting constraints in
+	  Polyhedron::constraints().  Two FIXMEs added so as not to forget
+	  to reconsider the situation when we will have better sorting
+	  methods.
+
+2004-09-22 Wednesday 12:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.86), GenSys.defs.hh (1.99): Added a
+	  couple of missing \relates.
+
+2004-09-22 Wednesday 10:18  Abramo Bagnara
+
+	* src/: checked.inlines.hh, checked_float.inlines.hh
+	  (altnum.[7,9]): Separated approximated arithmentic add/sub.
+
+2004-09-20 Monday 17:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.113): Added
+	  documentation for ppl_Polyhedron_dimension/2.
+
+2004-09-20 Monday 15:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, interfaces/Makefile.am (altnum.[4,1]): Activate the
+	  C interface (this breaks the build).
+
+2004-09-20 Monday 13:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/boundingbox1.cc (altnum.3): Quiet again.
+
+2004-09-20 Monday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.inlines.hh, Interval.defs.hh,
+	  Interval.inlines.hh, Polyhedron.inlines.hh (altnum.[3,3,3,3]):
+	  Temporary hacks to avoid failures with checked 64-bits integers.
+
+2004-09-20 Monday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile (1.2), install-sh (1.10), missing (1.8), Watchdog/compile
+	  (1.2), Watchdog/install-sh (1.7), Watchdog/missing (1.4): Updated
+	  from Automake 1.9.2.
+
+2004-09-20 Monday 09:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/boundingbox1.cc (altnum.2): Made noisy so as to make
+	  visible how test2() is failing.
+
+2004-09-19 Sunday 22:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, NEWS, README.configure, TODO, configure.ac,
+	  Watchdog/Makefile.am, Watchdog/Watchdog.cc,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/expected,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/README,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected,
+	  demos/ppl_lpsol/ppl_lpsol.c, doc/definitions.dox,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/ppl.sty, doc/user-browse.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/YAP/Makefile.am, src/AskTell.defs.hh,
+	  src/BHRZ03_Certificate.cc, src/BHRZ03_Certificate.defs.hh,
+	  src/BoundingBox.defs.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/ConSys.cc, src/ConSys.defs.hh,
+	  src/Constraint.defs.hh, src/Determinate.defs.hh, src/GenSys.cc,
+	  src/GenSys.defs.hh, src/Generator.cc, src/Generator.defs.hh,
+	  src/H79_Certificate.cc, src/H79_Certificate.defs.hh, src/Init.cc,
+	  src/Makefile.am, src/Matrix.cc, src/Polyhedra_PowerSet.defs.hh,
+	  src/Polyhedra_PowerSet.inlines.hh,
+	  src/Polyhedra_PowerSet.types.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/PowerSet.defs.hh,
+	  src/PowerSet.inlines.hh, src/PowerSet.types.hh,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Powerset.types.hh, src/Row.cc, src/Row.defs.hh,
+	  src/Row.inlines.hh, src/SatMatrix.cc, src/SatRow.defs.hh,
+	  src/Variable.defs.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/algorithms.hh,
+	  src/checked.inlines.hh, src/conversion.cc, src/globals.cc,
+	  src/globals.defs.hh, src/globals.hh, src/globals.inlines.hh,
+	  src/max_space_dimension.hh, tests/Makefile.am,
+	  tests/NNCminimize5.cc, tests/addconstraint1.cc,
+	  tests/addgenerator1.cc, tests/addgenerator2.cc,
+	  tests/addgenerator4.cc, tests/bgp99extrapolation1.cc,
+	  tests/bgp99extrapolation2.cc, tests/bhz03widening1.cc,
+	  tests/bhz03widening2.cc, tests/bhz03widening3.cc,
+	  tests/bhz03widening4.cc, tests/bhz03widening5.cc,
+	  tests/bhz03widening6.cc, tests/h79widening8.cc,
+	  tests/linearpartition1.cc, tests/linearpartition2.cc,
+	  tests/linearpartition3.cc, tests/linearpartition4.cc,
+	  tests/mc91.cc, tests/polydifference9.cc, tests/relations17.cc,
+	  tests/timings.cc, tests/timings.hh, utils/.cvsignore,
+	  utils/Makefile.am, utils/timings.cc, utils/timings.hh
+	  (altnum.[3,2,2,2,6,2,2,2,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,1,2,2,7,8,2,3,3,2,3,3,3,3,2,2,2,9,3,2,2,1,1,1,1,3,3,3,3,2,2,1,1,1,1,2,3,2,1,1,1,2,2,2,6,3,3,1,3,1,1,3,1,1,1,1,1,2,2,2,2,2,2,2,2,1,2,2,2,2,1,1,1,1,1,1,1,1,1]):
+	  Second merge from main trunk.
+
+2004-09-19 Sunday 21:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.95), Ciao/ciao_pl_check.pl
+	  (1.5), GNU/ppl_gprolog.pl (1.46): Added tests for the Prolog
+	  interface predicate ppl_Polyhedron_dimension/2.  Updated
+	  interface files to correct obvious bugs for this predicate.
+
+2004-09-19 Sunday 21:28  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[9,5,8,8,10,11]): Better names for policy fields. Added
+	  add_assign_mul and sub_assign_mul. Enriched Result return codes.
+
+2004-09-19 Sunday 21:25  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[6,7]): Better names for policy fields. Added
+	  add_assign_mul and sub_assign_nul.
+
+2004-09-19 Sunday 21:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplify.cc (1.38): Comments revised so as not to refer to
+	  (no longer existing) comparison operators between rows of the
+	  saturation matrices.
+
+2004-09-19 Sunday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/examples/: Makefile.am (1.3), README (1.2),
+	  dcube10.ext (1.1), dcube12.ext (1.1), dcube3.ext (1.1),
+	  dcube6.ext (1.1), dcube8.ext (1.1): New examples with V
+	  representations of dual hypercubes.
+
+2004-09-19 Sunday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.24), config.sub (1.23), Watchdog/config.guess
+	  (1.8), Watchdog/config.sub (1.8): Updated.
+
+2004-09-19 Sunday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.20), Watchdog/ltmain.sh (1.9): Updated from Libtool
+	  1.5.10.
+
+2004-09-19 Sunday 09:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/README (1.2): Improved the text.
+
+2004-09-19 Sunday 09:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected (1.2): Updated to reflect the fact that
+	  we no longer sort generators for closed polyhedra.
+
+2004-09-19 Sunday 08:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.97): Two new important things to do.
+
+2004-09-19 Sunday 08:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.112): Significant efficiency improvements have been
+	  achieved in the case of closed polyhedra.
+
+2004-09-19 Sunday 08:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.68): Similar lines are now
+	  commented out in the same way.
+
+2004-09-19 Sunday 08:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README (1.4): Copyright notice added.
+
+2004-09-19 Sunday 08:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh (1.2): Added code to experiment with an
+	  alternative way of dealing with temporaries.
+
+2004-09-19 Sunday 08:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: minimize.cc (1.37), simplify.cc (1.37): Small improvements.
+
+2004-09-19 Sunday 08:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.30): In Polyhedron::generators(), we
+	  no longer insist in returning a sorted system of generators in
+	  the case of a closed polyhedron.
+
+2004-09-19 Sunday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.4): Use the new constructor
+	  C_Polyhedron::C_Polyhedron(const NNC_Polyhedron&).
+
+2004-09-19 Sunday 00:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.30): Added some comments to explain
+	  what we are doing.  Enahnced the function write_polyehdron() to
+	  also apply to Polka and PolyLib polyhedra objects.
+
+2004-09-18 Saturday 16:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.29): With Polka, do not try to
+	  print the "frames" of an empty polyhedron.
+
+2004-09-18 Saturday 16:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.28): Increase the magic parameter
+	  of polka_initialize() to 25000: with 22500 Polka 2.0.2 dies on
+	  mit31-20.ine with the error "Chernikova: out of table space".
+
+2004-09-18 Saturday 16:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/: Makefile.am (1.8), ppl_lcdd.cc (1.27): A first,
+	  rough attempt at obtaining an `lcdd' clone that works also with
+	  (New) Polka and PolyLib.
+
+2004-09-17 Friday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.96), interfaces/Prolog/ppl_prolog.icc (1.135),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.67),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.63),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.88),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.33),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.55),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.81): Polyhedron::dimension()
+	  is now available in all the interfaces.
+
+2004-09-17 Friday 15:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.111), interfaces/C/ppl_c.cc (1.108),
+	  interfaces/C/ppl_c.h.in (1.34): Functions in the C interface that
+	  compute (space) dimensions no longer return their result.  The
+	  caller is now required to pass, as an extra argument, a pointer
+	  to a memory area where the result will be written.
+
+2004-09-17 Friday 15:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.107), ppl_c.h.in (1.33): New function
+	  int ppl_Polyhedron_dimension(ppl_const_Polyhedron_t ph).
+
+2004-09-17 Friday 10:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.26): Remove support for the
+	  "project" command: it was undocumented and its usefulness is
+	  highly questionable.
+
+2004-09-17 Friday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.110), TODO (1.95), demos/ppl_lcdd/ppl_lcdd.cc (1.25): The
+	  `ppl_lcdd' demo is now able to parse problems produced by lrs,
+	  i.e., where the number of rows of the matrix is omitted and
+	  replaced by "*****" (five asterisks).
+
+2004-09-17 Friday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.94): Typo fixed.
+
+2004-09-16 Thursday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.93), tests/README (1.1): New README file explains how a
+	  program in our test suite can be used for a quick hands-on PPL.
+
+2004-09-16 Thursday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: CbecomesNNC1.cc (1.6), exceptions1.cc (1.38),
+	  exceptions2.cc (1.33), generators1.cc (1.14), generators4.cc
+	  (1.6): Replace "built" by "build" wherever appropriate.
+
+2004-09-16 Thursday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.109), TODO (1.92), src/C_Polyhedron.cc (1.10),
+	  src/C_Polyhedron.defs.hh (1.24), tests/Makefile.am (1.214),
+	  tests/NNCbecomesC1.cc (1.1), tests/exceptions2.cc (1.32): The
+	  constructor C_Polyhedron(const NNC_Polyhedron& y) no longer
+	  throws an exception if `y' is not topologically closed.  Rather,
+	  it constructs a C_Polyhedron representing the topological closure
+	  of `y'.
+
+2004-09-16 Thursday 17:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.108), src/Polyhedra_Powerset.defs.hh (1.2),
+	  src/Polyhedra_Powerset.inlines.hh (1.3): The constructors
+	  allowing to obtain a Polyhedra_Powerset<NNC_Polyhedron> from a
+	  Polyhedra_Powerset<C_Polyhedron> and the other way around are now
+	  explicit.
+
+2004-09-16 Thursday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BoundingBox.cc (1.9): Include <config.h>.
+
+2004-09-16 Thursday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/adddimensions11.cc (1.6): Inconsistency fixed.
+
+2004-09-16 Thursday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.18), src/Powerset.inlines.hh (1.2),
+	  src/algorithms.hh (1.34): Simplified the progrma logic in a few
+	  places where we remove elements from a container by using the
+	  return value of method erase().
+
+2004-09-15 Wednesday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/linearpartition4.cc (1.3): Be quiet.
+
+2004-09-15 Wednesday 20:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/polydifference9.cc (1.3): Completed and made quiet.
+
+2004-09-15 Wednesday 19:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BHRZ03_Certificate.cc (1.2), src/ConSys.defs.hh (1.85),
+	  src/GenSys.defs.hh (1.98), src/H79_Certificate.cc (1.3),
+	  src/Matrix.cc (1.75), src/Polyhedra_Powerset.inlines.hh (1.2),
+	  src/Polyhedron_widenings.cc (1.29), tests/NNCminimize5.cc (1.10),
+	  tests/addconstraint1.cc (1.6), tests/addgenerator1.cc (1.6),
+	  tests/addgenerator2.cc (1.6), tests/addgenerator4.cc (1.6),
+	  tests/relations17.cc (1.8): Try to be consistent in the choice of
+	  variable names.
+
+2004-09-15 Wednesday 19:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.107): Announce the bug just fixed.
+
+2004-09-15 Wednesday 18:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.106), TODO (1.91), doc/devref-browse.doxyconf-latex.in
+	  (1.44), doc/devref-print.doxyconf-latex.in (1.44),
+	  doc/devref.doxyconf-html.in (1.44), src/Makefile.am (1.80),
+	  src/Polyhedra_PowerSet.defs.hh (1.36),
+	  src/Polyhedra_PowerSet.inlines.hh (1.42),
+	  src/Polyhedra_PowerSet.types.hh (1.3),
+	  src/Polyhedra_Powerset.defs.hh (1.1),
+	  src/Polyhedra_Powerset.inlines.hh (1.1),
+	  src/Polyhedra_Powerset.types.hh (1.1), src/PowerSet.defs.hh
+	  (1.49), src/PowerSet.inlines.hh (1.59), src/PowerSet.types.hh
+	  (1.7), src/Powerset.defs.hh (1.1), src/Powerset.inlines.hh (1.1),
+	  src/Powerset.types.hh (1.1), src/Widening_Function.defs.hh (1.5),
+	  src/Widening_Function.inlines.hh (1.5), src/algorithms.hh (1.33),
+	  src/max_space_dimension.hh (1.3), tests/bgp99extrapolation1.cc
+	  (1.5), tests/bgp99extrapolation2.cc (1.7),
+	  tests/bhz03widening1.cc (1.6), tests/bhz03widening2.cc (1.8),
+	  tests/bhz03widening3.cc (1.6), tests/bhz03widening4.cc (1.4),
+	  tests/bhz03widening5.cc (1.5), tests/bhz03widening6.cc (1.6),
+	  tests/linearpartition1.cc (1.15), tests/linearpartition2.cc
+	  (1.15), tests/linearpartition3.cc (1.15),
+	  tests/linearpartition4.cc (1.2), tests/mc91.cc (1.15),
+	  tests/polydifference9.cc (1.2): The classes PowerSet and
+	  Polyhedra_PowerSet have been renamed Powerset and
+	  Polyhedra_Powerset, respectively.
+
+2004-09-15 Wednesday 18:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/algorithms.hh (1.32): Corrected a bug in check_containment().
+	  The bug was affecting method geometrically_contains().
+
+2004-09-15 Wednesday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.90): Polyhedra_PowerSet::poly_difference_assign() has
+	  been implemented.
+
+2004-09-15 Wednesday 16:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.29): (Not well thought) FIXME
+	  removed.
+
+2004-09-15 Wednesday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.89): Several new things to do.
+
+2004-09-15 Wednesday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.213), polydifference9.cc (1.1): Test
+	  Polyhedra_PowerSet<PH>::poly_difference_assign().  (It presently
+	  fails, apparently due to a bug in
+	  Polyhedra_PowerSet<PH>::geometrically_equals().)
+
+2004-09-15 Wednesday 14:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.31): The linear_partition() template
+	  function is now in Polyhedra_PowerSet.*.hh.
+
+2004-09-15 Wednesday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.105), src/Polyhedra_PowerSet.defs.hh (1.35),
+	  src/Polyhedra_PowerSet.inlines.hh (1.41): New constructors and
+	  assignment operators allowing to obtain a
+	  Polyhedra_PowerSet<NNC_Polyhedron> from a
+	  Polyhedra_PowerSet<C_Polyhedron> and the other way around.  In
+	  the latter case, the topological clusure of the element polyhedra
+	  is computed.	New method
+	  Polyhedra_PowerSet::poly_difference_assign(const
+	  Polyhedra_PowerSet& y) assigns to `*this' the poly-difference of
+	  `*this' and `y'.
+
+2004-09-15 Wednesday 14:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.48), PowerSet.inlines.hh (1.58): New
+	  method PowerSet<CS>::clear().
+
+2004-09-15 Wednesday 09:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.104), TODO (1.88), src/Polyhedron.defs.hh (1.244),
+	  src/Polyhedron_public.cc (1.28): Added a first, draft
+	  implementation of method dimension_type Polyhedron::dimension():
+	  it returns the dimension of *this (not to be confused with the
+	  dimension of its enclosing vector space) or 0, if *this is empty.
+
+2004-09-13 Monday 07:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.103): Mentioned the bug just corrected.
+
+2004-09-12 Sunday 18:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.212): Use h79widening8.cc also with NNC
+	  polyhedra.
+
+2004-09-08 Wednesday 17:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (ppl-0_6-branch.1): Corrected a bug reported by
+	  Sriram.
+
+2004-09-08 Wednesday 16:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/h79widening8.cc (1.2): Made silent.
+
+2004-09-08 Wednesday 16:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.94): Corrected a bug in
+	  GenSys::satisfied_by_all_generators(), which was revealed by the
+	  test h79widening8.cc.
+
+2004-09-08 Wednesday 16:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.211), h79widening8.cc (1.1): Added a test
+	  showing a bug in H79_widening_assign().
+
+2004-09-03 Friday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.7): Inclusion directive fixed.
+
+2004-09-03 Friday 10:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.87), demos/ppl_lcdd/ppl_lcdd.cc (1.24): Added support for
+	  printing timing information (on std::cerr).
+
+2004-09-02 Thursday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.102), demos/ppl_lpsol/expected (1.2),
+	  demos/ppl_lpsol/ppl_lpsol.c (1.3): Fixed a bug in the `ppl_lpsol'
+	  demo (thanks to Andrea Cimino).
+
+2004-09-02 Thursday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.12), src/Makefile.am (1.79): Prepared for
+	  PPL 0.7.
+
+2004-08-31 Tuesday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.210): Search for header files also in the
+	  `utils' directory.
+
+2004-08-31 Tuesday 16:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.27), configure.ac (1.121),
+	  demos/ppl_lcdd/Makefile.am (1.6), tests/Makefile.am (1.209),
+	  tests/timings.cc (1.5), tests/timings.hh (1.5), utils/.cvsignore
+	  (1.1), utils/Makefile.am (1.1), utils/timings.cc (1.1),
+	  utils/timings.hh (1.1): The timings functions are now included in
+	  a `ppl_utils' convenience library, which is contained in the
+	  newly created `utils' directory.
+
+2004-08-30 Monday 23:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.86): Three more things to do.
+
+2004-08-30 Monday 23:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.85): Added several new things to be done.
+
+2004-08-30 Monday 21:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/examples/README (1.1): Explain and give pointers
+	  to the origins of these examples.
+
+2004-08-30 Monday 16:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.43),
+	  devref-print.doxyconf-latex.in (1.43), devref.doxyconf-html.in
+	  (1.43), user-browse.doxyconf-latex.in (1.21),
+	  user-print.doxyconf-latex.in (1.21), user.doxyconf-html.in
+	  (1.23): Updated to the latest doxygen version (1.3.8).
+
+2004-08-28 Saturday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.42),
+	  devref-print.doxyconf-latex.in (1.42), devref.doxyconf-html.in
+	  (1.42): Replaced globals.hh with globals.defs.hh and
+	  globals.inlines.hh.
+
+2004-08-27 Friday 09:23  Abramo Bagnara
+
+	* src/: checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[9,10]): Added support for special values.
+
+2004-08-27 Friday 09:23  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.7): Added implementation of
+	  extended integers
+
+2004-08-27 Friday 09:22  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (altnum.7): Better implementation of
+	  pred/succ.
+
+2004-08-27 Friday 09:21  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.4): Added extended functions.
+
+2004-08-26 Thursday 23:54  Abramo Bagnara
+
+	* src/Makefile.am (altnum.8): Fixed concatenation order.
+
+2004-08-26 Thursday 23:53  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (altnum.6): Use Checked::functions
+
+2004-08-26 Thursday 23:52  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, checked.defs.hh (altnum.[5,8]):
+	  Added some policy fields. Better specialization infrastructure.
+
+2004-08-23 Monday 20:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.243), Polyhedron_widenings.cc (1.28):
+	  Removed the no-longer used function is_BHRZ03_stabilizing(),
+	  which has been superseded by the use of BHRZ03_Certificate.
+
+2004-08-23 Monday 16:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/algorithms.hh (1.30): Documented (for the developers) the
+	  function check_containment() and linear_partition_aux().
+
+2004-08-23 Monday 12:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.69), Matrix.cc (1.74): Use add_mul_assign()
+	  and sub_mul_assign() when possible.
+
+2004-08-23 Monday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron_nonpublic.cc (1.25), Row.cc (1.68), Row.defs.hh
+	  (1.82), Row.inlines.hh (1.47): New funcions void
+	  homogeneous_scalar_product_assign(Integer& z, const Row& x, const
+	  Row& y) and int homogeneous_scalar_product_sign(const Row& x,
+	  const Row& y).
+
+2004-08-23 Monday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GenSys.cc (1.93): Last change completed.
+
+2004-08-23 Monday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GenSys.cc (1.92): Use scalar_product_assign() instead of
+	  replicating code..
+
+2004-08-23 Monday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.25), BHRZ03_Certificate.defs.hh (1.6),
+	  BoundingBox.defs.hh (1.12), Determinate.defs.hh (1.44),
+	  H79_Certificate.defs.hh (1.6), Init.cc (1.14), Makefile.am
+	  (1.78), Matrix.cc (1.73), Polyhedra_PowerSet.defs.hh (1.34),
+	  Polyhedron.defs.hh (1.242), Row.cc (1.67), Row.defs.hh (1.81),
+	  Row.inlines.hh (1.46), SatMatrix.cc (1.29), SatRow.defs.hh
+	  (1.33), Variable.defs.hh (1.37), conversion.cc (1.60), globals.cc
+	  (1.18), globals.defs.hh (1.1), globals.hh (1.42): Header file
+	  globals.hh renamed globals.defs.hh.
+
+2004-08-23 Monday 09:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.77), Row.cc (1.66), conversion.cc (1.59),
+	  globals.hh (1.41), globals.inlines.hh (1.1): New function void
+	  normalize2(const Integer& x, const Integer& y, Integer& nx,
+	  Integer& ny).  Start moving inline implementations of globals in
+	  globals.inlines.hh.
+
+2004-08-23 Monday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.65), conversion.cc (1.58): Avoid using some
+	  temporaries.	Avoid calling the same function twice.
+
+2004-08-22 Sunday 23:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.91), Integer.defs.hh (1.13),
+	  Integer.inlines.hh (1.12), Matrix.cc (1.72),
+	  Polyhedron_nonpublic.cc (1.24), Polyhedron_widenings.cc (1.27),
+	  Row.cc (1.64): New function void sub_mul_assign(Integer& x, const
+	  Integer& y, const Integer& z) to efficiently compute x -= y*z.
+
+	  Use add_mul_assign() and sub_mul_assign() when possible.
+
+2004-08-22 Sunday 23:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.43): Spurious friend declarations
+	  removed.
+
+2004-08-22 Sunday 23:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.88), GenSys.cc (1.90),
+	  Generator.defs.hh (1.88), Polyhedron_nonpublic.cc (1.23),
+	  Polyhedron_public.cc (1.27), Polyhedron_widenings.cc (1.26),
+	  globals.cc (1.17), globals.hh (1.40): Functions const Integer&
+	  operator*(const Constraint& c, const Generator& g) and const
+	  Integer& reduced_scalar_product(const Constraint& c, const
+	  Generator& g) removed.  Used void scalar_product_assign(Integer&
+	  z, const Row& x, const Row& y) and void
+	  reduced_scalar_product_assign(Integer& z, const Row& x, const
+	  Row& y) instead.
+
+	  Use void scalar_product_sign(const Row& x, const Row& y) and void
+	  reduced_scalar_product_sign(const Row& x, const Row& y) wherever
+	  possible.
+
+2004-08-22 Sunday 19:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.68), GenSys.cc (1.89), Integer.defs.hh (1.12),
+	  Integer.inlines.hh (1.11), Matrix.cc (1.71), Polyhedron_public.cc
+	  (1.26), Polyhedron_widenings.cc (1.25), Row.cc (1.63),
+	  Row.defs.hh (1.80), Row.inlines.hh (1.45), conversion.cc (1.57):
+	  Functions const Integer& operator*(const Row& x, const Row& y)
+	  and const Integer& reduced_scalar_product(const Row& x, const
+	  Row& y) removed.  New functions void
+	  scalar_product_assign(Integer& z, const Row& x, const Row& y) and
+	  void reduced_scalar_product_assign(Integer& z, const Row& x,
+	  const Row& y) provide the same functionality, but without
+	  (explicitely) using temporaries.
+
+	  New functions int scalar_product_sign(const Row& x, const Row& y)
+	  and int reduced_scalar_product_sign(const Row& x, const Row& y)
+	  return the sign of the (reduced) scalar product of the given
+	  arguments.
+
+	  New function void add_mul_assign(Integer& x, const Integer& y,
+	  const Integer& z) to efficiently compute x += y*z.
+
+2004-08-22 Sunday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.88), Generator.cc (1.51), Init.cc (1.13),
+	  Matrix.cc (1.70), Polyhedron_nonpublic.cc (1.22),
+	  Polyhedron_widenings.cc (1.24), Row.cc (1.62), conversion.cc
+	  (1.56), globals.cc (1.16), globals.hh (1.39): Old code for the
+	  handling of temporary coefficients removed.
+
+2004-08-22 Sunday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.87), Generator.cc (1.50), Init.cc (1.12),
+	  Matrix.cc (1.69), Polyhedron_nonpublic.cc (1.21),
+	  Polyhedron_widenings.cc (1.23), Row.cc (1.61), conversion.cc
+	  (1.55), globals.cc (1.15), globals.hh (1.38): Draft new code for
+	  the handling of temporary coefficients.
+
+2004-08-22 Sunday 08:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Widening_Function.inlines.hh (1.4): Added \relates doxygen
+	  command to function definition.
+
+2004-08-21 Saturday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.11), demos/ppl_lpsol/Makefile.am (1.2),
+	  interfaces/Prolog/Ciao/Makefile.am (1.29),
+	  interfaces/Prolog/GNU/Makefile.am (1.35),
+	  interfaces/Prolog/SICStus/Makefile.am (1.42),
+	  interfaces/Prolog/SWI/Makefile.am (1.35),
+	  interfaces/Prolog/XSB/Makefile.am (1.22),
+	  interfaces/Prolog/YAP/Makefile.am (1.26), tests/Makefile.am
+	  (1.208): Match every `endif' with the corresponding `if'
+	  condition.
+
+2004-08-21 Saturday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.5): Add `expected' to the list of
+	  files to be distributed.
+
+2004-08-21 Saturday 10:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.101): Now `make check' runs a number of tests with
+	  `ppl_lcdd', comparing the results to expected ones.
+
+2004-08-21 Saturday 10:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/: Makefile.am (1.4), expected (1.1): Use
+	  `ppl_lcdd' to perform regression testing.
+
+2004-08-20 Friday 22:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.120): Check for md5sum.
+
+2004-08-20 Friday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.26): Option `--with-cxxflags=-Wno-deprecated'
+	  removed from `DISTCHECK_CONFIGURE_FLAGS'.
+
+2004-08-20 Friday 19:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_6-branch.3): Update version.
+
+2004-08-20 Friday 19:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_6-branch.[3,5]): Mark
+	  ChangeLog.
+
+2004-08-20 Friday 19:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_6-branch.4): Updated.
+
+2004-08-20 Friday 19:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (ppl-0_6-branch.2): Glitch fixed.
+
+2004-08-20 Friday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_6-branch.3): Updated.
+
+2004-08-20 Friday 18:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.41),
+	  devref-print.doxyconf-latex.in (1.41), devref.doxyconf-html.in
+	  (1.41): Include certificates in the developer's reference.
+
+2004-08-20 Friday 18:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/H79_Certificate.defs.hh (1.5): Spurious comments removed.
+
+2004-08-20 Friday 18:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in,
+	  devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+	  (ppl-0_6-branch.[3,3,4]): Include certificates in the developer's
+	  reference.
+
+2004-08-20 Friday 18:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/H79_Certificate.defs.hh (ppl-0_6-branch.2): Spurious comments
+	  removed.
+
+2004-08-20 Friday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, Watchdog/ChangeLog (ppl-0_6-branch.[2,2]): Updated.
+
+2004-08-20 Friday 17:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox, doc/ppl.sty,
+	  interfaces/Prolog/Prolog_interface.dox (ppl-0_6-branch.[1,1,1]):
+	  Merge from the main trunk.
+
+2004-08-20 Friday 17:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.157): Minor English improvement.
+
+2004-08-20 Friday 17:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (ppl-0_6-branch.3): The
+	  documentation of BHZ03_widening_assign made shorter by referring
+	  to the new section in the introduction.  The comment on
+	  concatenate_assign() made shorter (as suggested by Pat).
+
+2004-08-20 Friday 17:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.156): Link error corrected.
+
+2004-08-20 Friday 17:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.155): Added a paragraph on the BGP99
+	  extrapolation operator.
+
+2004-08-20 Friday 17:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.154): After doing the meet on elements of
+	  the powerset domain elementwise, omega reduction is needed.
+
+2004-08-20 Friday 16:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.153): Small improvements.
+
+2004-08-20 Friday 16:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.33): The comment on
+	  concatenate_assign() made shorter (as suggested by Pat).
+
+2004-08-20 Friday 16:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.32): The documentation of
+	  BHZ03_widening_assign made shorter by referring to the new
+	  section in the introduction.
+
+2004-08-20 Friday 16:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (ppl-0_6-branch.1): Ready for the release of PPL 0.6.1.
+
+2004-08-20 Friday 16:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.152): A couple of corrections.
+
+2004-08-20 Friday 16:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.151): Added a section on certificate-based
+	  widenings.
+
+2004-08-20 Friday 16:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.31): Corrected two comments.
+
+2004-08-20 Friday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: ppl_lcdd/ppl_lcdd.cc, ppl_lpsol/ppl_lpsol.c
+	  (ppl-0_6-branch.[1,1]): Do not try to use RLIMIT_AS unless the
+	  configure script has determined its availability.
+
+2004-08-20 Friday 15:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: ppl_lcdd/ppl_lcdd.cc (1.23), ppl_lpsol/ppl_lpsol.c (1.2):
+	  Do not try to use RLIMIT_AS unless the configure script has
+	  determined its availability.
+
+2004-08-20 Friday 15:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.150): Some improvements for the section on
+	  polyhedra powersets.
+
+2004-08-20 Friday 15:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.149): In the section about add_disjuct,
+	  \cS_1 ==> \cS.
+
+2004-08-20 Friday 15:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.112): Update cross
+	  reference.
+
+2004-08-20 Friday 15:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox (1.148), ppl.sty (1.16): Added a short
+	  (incomplete) section on the polyhedral powerset domain and
+	  revised the description of the generic powerset meet operation.
+
+2004-08-20 Friday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/NEWS (ppl-0_6-branch.1): Updated for the release of PPL
+	  0.6.1.
+
+2004-08-20 Friday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh,
+	  src/Polyhedra_PowerSet.inlines.hh, tests/bgp99extrapolation2.cc,
+	  tests/bhz03widening2.cc, tests/bhz03widening3.cc,
+	  tests/bhz03widening5.cc, tests/bhz03widening6.cc
+	  (ppl-0_6-branch.[2,1,1,1,1,1,1]): The methods
+	  Polyhedra_PowerSet::semantically_contains(const
+	  Polyhedra_PowerSet&) and
+	  Polyhedra_PowerSet::semantically_equals(const
+	  Polyhedra_PowerSet&) have been renamed
+	  Polyhedra_PowerSet::geometrically_covers(const
+	  Polyhedra_PowerSet&) and
+	  Polyhedra_PowerSet::geometrically_equals(const
+	  Polyhedra_PowerSet& y), respectively.
+
+2004-08-20 Friday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_6-branch.1): Completed for 0.6.1.
+
+2004-08-20 Friday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (ppl-0_6-branch.2): Formatting glitch fixed.
+
+2004-08-20 Friday 14:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_6-branch.2): Version number bumped.
+
+2004-08-20 Friday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.100): Completed for 0.6.1.
+
+2004-08-20 Friday 14:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.7): Formatting glitch fixed.
+
+2004-08-20 Friday 14:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.147): Small improvements to section 1.6.
+
+2004-08-20 Friday 14:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.146): Some polyhedra where wrongly named P
+	  instead of \cP.  Replaced a couple of = signs by \defeq.  A first
+	  pass on Section 1.5 (PowerSet) to correct minor typos.
+
+2004-08-20 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.99), src/Polyhedra_PowerSet.defs.hh (1.30),
+	  src/Polyhedra_PowerSet.inlines.hh (1.40),
+	  tests/bgp99extrapolation2.cc (1.6), tests/bhz03widening2.cc
+	  (1.7), tests/bhz03widening3.cc (1.5), tests/bhz03widening5.cc
+	  (1.4), tests/bhz03widening6.cc (1.5): The methods
+	  Polyhedra_PowerSet::semantically_contains(const
+	  Polyhedra_PowerSet&) and
+	  Polyhedra_PowerSet::semantically_equals(const
+	  Polyhedra_PowerSet&) have been renamed
+	  Polyhedra_PowerSet::geometrically_covers(const
+	  Polyhedra_PowerSet&) and
+	  Polyhedra_PowerSet::geometrically_equals(const
+	  Polyhedra_PowerSet& y), respectively.
+
+2004-08-20 Friday 14:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (ppl-0_6-branch.1): Documented
+	  function pairwise_reduce().
+
+2004-08-20 Friday 13:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.145): Some stuff (lazy/eager operators and
+	  polymorphism disclaimer) moved into section 1.6 (Using the
+	  Library).
+
+2004-08-20 Friday 13:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.144): Bug fixed.
+
+2004-08-20 Friday 13:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.29): Documented method
+	  pairwise_reduce().
+
+2004-08-20 Friday 13:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox (1.143), ppl.sty (1.15): First draft of
+	  description of the powerset construction added.
+
+2004-08-20 Friday 11:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README.configure (ppl-0_6-branch.1): Spurious indentation fixed.
+
+2004-08-20 Friday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BHRZ03_Certificate.defs.hh, H79_Certificate.defs.hh
+	  (ppl-0_6-branch.[1,1]): In the Doxygen comments: lgo --> limited
+	  growth ordering.
+
+2004-08-20 Friday 11:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README.configure (1.6): A spurious indentation fixed.
+
+2004-08-20 Friday 11:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BHRZ03_Certificate.defs.hh (1.5), H79_Certificate.defs.hh
+	  (1.4): In the Doxygen comment: lgo --> limited growth ordering
+
+2004-08-19 Thursday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS, CREDITS, ChangeLog, Makefile.am, NEWS, README,
+	  README.configure, STANDARDS, TODO, config.guess, config.sub,
+	  configure.ac, depcomp, install-sh, ltmain.sh, ppl.lsm.in,
+	  ppl.spec.in, Watchdog/ChangeLog,
+	  Watchdog/Doubly_Linked_Object.defs.hh,
+	  Watchdog/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/Doubly_Linked_Object.types.hh, Watchdog/EList.defs.hh,
+	  Watchdog/EList.inlines.hh, Watchdog/EList.types.hh,
+	  Watchdog/EList_Iterator.defs.hh,
+	  Watchdog/EList_Iterator.inlines.hh,
+	  Watchdog/EList_Iterator.types.hh, Watchdog/Handler.defs.hh,
+	  Watchdog/Handler.inlines.hh, Watchdog/Handler.types.hh,
+	  Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/Pending_Element.cc,
+	  Watchdog/Pending_Element.defs.hh,
+	  Watchdog/Pending_Element.inlines.hh,
+	  Watchdog/Pending_Element.types.hh, Watchdog/Pending_List.cc,
+	  Watchdog/Pending_List.defs.hh, Watchdog/Pending_List.inlines.hh,
+	  Watchdog/Pending_List.types.hh, Watchdog/README,
+	  Watchdog/Time.cc, Watchdog/Time.defs.hh,
+	  Watchdog/Time.inlines.hh, Watchdog/Time.types.hh,
+	  Watchdog/Watchdog.cc, Watchdog/Watchdog.defs.hh,
+	  Watchdog/Watchdog.inlines.hh, Watchdog/config.guess,
+	  Watchdog/config.sub, Watchdog/configure.ac, Watchdog/depcomp,
+	  Watchdog/install-sh, Watchdog/ltmain.sh, demos/Makefile.am,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/.cvsignore,
+	  demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/.cvsignore,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected,
+	  demos/ppl_lpsol/ppl_lpsol.c, demos/ppl_lpsol/examples/.cvsignore,
+	  demos/ppl_lpsol/examples/Makefile.am,
+	  demos/ppl_lpsol/examples/afiro.mps,
+	  demos/ppl_lpsol/examples/bgprtr.mps,
+	  demos/ppl_lpsol/examples/ex1.mps,
+	  demos/ppl_lpsol/examples/sample.mps,
+	  demos/ppl_lpsol/examples/unboundedmin.mps, doc/Makefile.am,
+	  doc/definitions.dox, doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/devref.tex, doc/fdl.txt, doc/gpl.txt, doc/ppl.sty,
+	  doc/user-browse.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  doc/user.tex, interfaces/C/Makefile.am, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/pl_check.pl, interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/.cvsignore,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh, src/BoundingBox.inlines.hh,
+	  src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	  src/C_Polyhedron.inlines.hh, src/ConSys.defs.hh,
+	  src/ConSys.inlines.hh, src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+	  src/H79_Certificate.types.hh, src/Init.cc, src/Makefile.am,
+	  src/Matrix.defs.hh, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/Ph_Status.idefs.hh,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.defs.hh,
+	  src/Polyhedra_PowerSet.defs.hh,
+	  src/Polyhedra_PowerSet.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/PowerSet.defs.hh, src/PowerSet.inlines.hh, src/Row.defs.hh,
+	  src/SatMatrix.defs.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	  src/algorithms.hh, src/conversion.cc, src/globals.cc,
+	  src/globals.hh, src/minimize.cc, src/simplify.cc,
+	  src/statistics.hh, src/version.hh.in, tests/.cvsignore,
+	  tests/Makefile.am, tests/bgp99extrapolation1.cc,
+	  tests/bgp99extrapolation2.cc, tests/bhz03widening1.cc,
+	  tests/bhz03widening2.cc, tests/bhz03widening3.cc,
+	  tests/bhz03widening4.cc, tests/bhz03widening5.cc,
+	  tests/bhz03widening6.cc, tests/boundingbox1.cc,
+	  tests/boundingbox2.cc, tests/boundingbox3.cc,
+	  tests/boundingbox4.cc, tests/boundingbox5.cc,
+	  tests/exceptions3.cc, tests/expanddim1.cc, tests/expanddim2.cc,
+	  tests/folddims1.cc, tests/folddims2.cc, tests/h79widening6.cc,
+	  tests/linearpartition1.cc, tests/linearpartition2.cc,
+	  tests/linearpartition3.cc, tests/linearpartition4.cc,
+	  tests/polydifference8.cc, tests/watchdog1.cc
+	  (altnum.[1,2,1,2,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,2,2,1,1,2,2,2,2,2,1,1,1,1,1,7,1,1,1,1,1,1,1,1,2,2,1,1,2,2,2,1,1,2,1,1,1,1,1,2,2,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  First merge from main trunk.
+
+2004-08-19 Thursday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.207), linearpartition4.cc (1.1): New test
+	  for linear_partition() (still to be completed).
+
+2004-08-19 Thursday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.119): Version number bumped.
+
+2004-08-19 Thursday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.18): Updated.
+
+2004-08-19 Thursday 15:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.142): This is a start in revising the
+	  introductory sections to the manual so as to allow for the
+	  inclusion of domains other than that of convex polyhedra.
+
+2004-08-19 Thursday 14:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in,
+	  devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+	  (ppl-0_6-branch.[2,2,3]), devref-browse.doxyconf-latex.in (1.40),
+	  devref-print.doxyconf-latex.in (1.40), devref.doxyconf-html.in
+	  (1.40): AskTell should not appear in the develper's reference.
+
+2004-08-19 Thursday 14:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Widening_Function.defs.hh (ppl-0_6-branch.1): Avoided a
+	  warning in the devref documentation.
+
+2004-08-19 Thursday 14:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Widening_Function.defs.hh (1.4): Avoided a warning in the
+	  devref documentation.
+
+2004-08-19 Thursday 13:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (ppl-0_6-branch.2), AskTell.defs.hh (1.24):
+	  Previous change reverted.
+
+2004-08-19 Thursday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.39),
+	  devref-print.doxyconf-latex.in (1.39), devref.doxyconf-html.in
+	  (1.39): Widening_Function and Polyhedra_PowerSet should appear in
+	  all the devref manuals.
+
+2004-08-19 Thursday 12:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/AskTell.defs.hh (1.23): AskTell should not appear in the user
+	  documentation until working.
+
+2004-08-19 Thursday 12:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in,
+	  devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+	  (ppl-0_6-branch.[1,1,2]): Widening_Function should appear in the
+	  devref manuals.
+
+2004-08-19 Thursday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in (ppl-0_6-branch.1):
+	  Polyhedra_PowerSet has to also appear in the developers manual.
+
+2004-08-19 Thursday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/AskTell.defs.hh (ppl-0_6-branch.1): AskTell construction
+	  should not appear in the user manuals.
+
+2004-08-18 Wednesday 23:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (ppl-0_6-branch.1), Makefile.am (1.76): AskTell
+	  is unfinished and not working: it should not be distributed.
+
+2004-08-18 Wednesday 22:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: configure.ac (ppl-0_6-branch.1), ChangeLog (1.8),
+	  configure.ac (1.20): Version number bumped.
+
+2004-08-18 Wednesday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_6-branch.1): Update version.
+
+2004-08-18 Wednesday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_6-branch.[1,1]): Mark
+	  ChangeLog.
+
+2004-08-18 Wednesday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.21): Distribute more documentation.
+
+2004-08-18 Wednesday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.38),
+	  devref-print.doxyconf-latex.in (1.38): The Polyhedra_PowerSet
+	  documentation has to appear in the devref manual too.
+
+2004-08-18 Wednesday 14:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Widening_Function.defs.hh (1.3), algorithms.hh (1.29):
+	  Applied the Doxygen \relates command in a couple of places.
+
+2004-08-18 Wednesday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bgp99extrapolation1.cc (1.4), bgp99extrapolation2.cc
+	  (1.5), bhz03widening1.cc (1.5), bhz03widening2.cc (1.6),
+	  bhz03widening3.cc (1.4), bhz03widening6.cc (1.4): Modified to
+	  comply with the new interface.
+
+2004-08-18 Wednesday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.28),
+	  Polyhedra_PowerSet.inlines.hh (1.39): Added doxygen
+	  documentation.  Removed some methods that are now subsumed by the
+	  generic ones.
+
+2004-08-18 Wednesday 13:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README (1.3): Last change reverted.
+
+2004-08-18 Wednesday 13:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.23): Ready for the release.
+
+2004-08-18 Wednesday 13:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/README (1.2): Revised.
+
+2004-08-18 Wednesday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.29): Installation of the documentation now
+	  works both for distribution archives and for CVS versions.
+
+2004-08-18 Wednesday 11:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.38): Include
+	  "Widening_Function.defs.hh" instead of
+	  "Widening_Function.types.hh".
+
+2004-08-18 Wednesday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.84): Ready for the release.
+
+2004-08-18 Wednesday 09:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bhz03widening4.cc (1.3), bhz03widening5.cc (1.3):
+	  Exploiting helper functions widen_fun().
+
+2004-08-18 Wednesday 09:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.37): Exploiting helper
+	  function widen_fun().
+
+2004-08-18 Wednesday 09:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: GenSys.cc (1.86), Polyhedron.types.hh (1.12),
+	  Polyhedron_widenings.cc (1.22), conversion.cc (1.54), simplify.cc
+	  (1.36): Comments improved.
+
+2004-08-18 Wednesday 09:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.106), interfaces/C/ppl_c.h.in (1.32),
+	  src/C_Polyhedron.defs.hh (1.23), src/C_Polyhedron.inlines.hh
+	  (1.17), src/NNC_Polyhedron.defs.hh (1.26),
+	  src/NNC_Polyhedron.inlines.hh (1.18), tests/Makefile.am (1.206),
+	  tests/exceptions3.cc (1.2): Start dealing with requests to build
+	  "over-sized" objects.
+
+2004-08-18 Wednesday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Widening_Function.defs.hh (1.2),
+	  Widening_Function.inlines.hh (1.3): Added helper function
+	  widen_fun() to simplify the creation of widening function
+	  objects. Added brief documentation.
+
+2004-08-18 Wednesday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: linearpartition2.cc (1.14), linearpartition3.cc (1.14):
+	  Fixed.
+
+2004-08-18 Wednesday 09:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: AskTell.defs.hh (1.22), ConSys.defs.hh (1.84),
+	  Determinate.defs.hh (1.42), GenSys.defs.hh (1.97),
+	  Polyhedra_PowerSet.defs.hh (1.27), Polyhedron.defs.hh (1.241),
+	  Polyhedron.inlines.hh (1.94): Comments improved.
+
+2004-08-18 Wednesday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/linearpartition1.cc (1.14): Fixed.
+
+2004-08-17 Tuesday 23:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Widening_Function.inlines.hh (1.2):
+	  Limited_Widening_Function::operator() fixed.
+
+2004-08-17 Tuesday 23:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.28): Install documentation in text format.
+
+2004-08-17 Tuesday 21:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bhz03widening4.cc (1.2), bhz03widening5.cc (1.2):
+	  Corrected to work with the new implementation.
+
+2004-08-17 Tuesday 21:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Makefile.am (1.75), Polyhedra_PowerSet.defs.hh (1.26),
+	  Polyhedra_PowerSet.inlines.hh (1.36), Widening_Function.defs.hh
+	  (1.1), Widening_Function.inlines.hh (1.1),
+	  Widening_Function.types.hh (1.1): Factorized a lot of code
+	  related to widenings of powersets by using function objects
+	  instead of method pointers.
+
+2004-08-17 Tuesday 21:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.41), Determinate.inlines.hh (1.39),
+	  algorithms.hh (1.28): Improved a little bit the docuemntation for
+	  the Determinate construction.  Removed a few seemingly useless
+	  methods. The polyhedron() methods renamed as element().
+
+2004-08-17 Tuesday 19:43  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (altnum.8): Fixed unhandled native
+	  integer type behaviour.
+
+2004-08-17 Tuesday 19:39  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (altnum.9): Fixed unhandled native
+	  integer type behaviour.
+
+2004-08-17 Tuesday 19:33  Abramo Bagnara
+
+	* src/Makefile.am (altnum.6): Added Limits.hh
+
+2004-08-17 Tuesday 19:33  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (altnum.6): Fixed float96_t format
+	  oddities. Cleaned code.
+
+2004-08-17 Tuesday 19:31  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  Limits.hh, checked.defs.hh, checked_int.inlines.hh
+	  (altnum.[4,5,1,7,6]): Fixed unhandled native integer type
+	  behaviour.
+
+2004-08-17 Tuesday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/gpl.txt (1.2): Spacing fixed.
+
+2004-08-17 Tuesday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.25): Distribute also README.configure.
+
+2004-08-17 Tuesday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.83): One less thing to do.
+
+2004-08-17 Tuesday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS (1.4), CREDITS (1.13): Formatted.
+
+2004-08-17 Tuesday 14:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README.configure (1.5): Corrected a typo and improved the
+	  English.
+
+2004-08-17 Tuesday 13:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* BUGS (1.3), CREDITS (1.12), STANDARDS (1.14): English
+	  improvements made.
+
+2004-08-17 Tuesday 12:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.40), Determinate.inlines.hh (1.38),
+	  PowerSet.defs.hh (1.47), PowerSet.inlines.hh (1.57):
+	  Determinate::operator+(), Determinate::operator*(),
+	  PowerSet::operator+() and PowerSet::operator*() removed.
+
+2004-08-17 Tuesday 12:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.11): Small English improvement.
+
+2004-08-17 Tuesday 11:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/bhz03widening2.cc (1.5): Redundant code removed.
+
+2004-08-17 Tuesday 11:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.39), Determinate.inlines.hh (1.37):
+	  The methods grouped according to constness and space-dim
+	  preservation, as done for the class Polyhedron.  Two inline
+	  directives moved from *.defs.hh into *.inlines.hh.
+
+2004-08-17 Tuesday 10:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.94): Tests for adding and
+	  removing dimensions now include cases where no dimensions are
+	  added or removed and also when all the dimensions are removed.
+
+2004-08-17 Tuesday 10:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.141): The descriptions of the add and
+	  remove dimensions operators improved.  The description of the
+	  concatenate operation moved to just before the description of the
+	  add dimensions operators.
+
+2004-08-17 Tuesday 10:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.98), configure.ac (1.118), doc/Makefile.am (1.27): The
+	  documentation for users, in PostScript, PDF and HTML formats, is
+	  now installed in a standard place by `make install'.
+
+2004-08-17 Tuesday 09:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.38): Small improvements.
+
+2004-08-17 Tuesday 09:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.140): Added a section on constructions on
+	  polyhedra.
+
+2004-08-17 Tuesday 09:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.25): Started documenting the
+	  widening operators.
+
+2004-08-17 Tuesday 09:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BHRZ03_Certificate.defs.hh (1.4),
+	  BHRZ03_Certificate.inlines.hh (1.2), H79_Certificate.cc (1.2),
+	  H79_Certificate.defs.hh (1.3), H79_Certificate.inlines.hh (1.2):
+	  H79_Certificate simplified by removing useless methods. The
+	  documentation of BHRZ03_Certificate method is_stabilizing() now
+	  only appears in the developers manual. Both classes now appear in
+	  the user manual, as they provide documentation of the method
+	  needed by any new certificate.
+
+2004-08-17 Tuesday 09:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.111): Several minor
+	  "English" corrections and some cross references improved or
+	  added.
+
+2004-08-17 Tuesday 09:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.139): An anchor has been added and minor
+	  English improvement.
+
+2004-08-17 Tuesday 08:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: bhz03widening3.cc (1.3), bhz03widening6.cc (1.3),
+	  boundingbox2.cc (1.21), boundingbox4.cc (1.10): Comments revised
+	  in boundinbox2.cc and boundingbox4.cc.  Known result in
+	  bhz03widening3.cc added and checked.	New test added to
+	  bhz03widening6.cc for the case when the multiset ordering wrt the
+	  lgo is converging.
+
+2004-08-17 Tuesday 00:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bgp99extrapolation2.cc (1.4): Be quiet.
+
+2004-08-17 Tuesday 00:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/folddims2.cc (1.2): Removed test that was already made in
+	  folddims1.cc.  Comment revised.
+
+2004-08-17 Tuesday 00:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.205): Spurious backslash removed.
+
+2004-08-17 Tuesday 00:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bgp99extrapolation2.cc (1.3): Completed (and made more
+	  interesting).
+
+2004-08-16 Monday 21:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Makefile.am (1.204), folddims2.cc (1.1): Tests for NNC
+	  polyhedra added.
+
+2004-08-16 Monday 21:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/bgp99extrapolation2.cc (1.2): Comment corrected.
+
+2004-08-16 Monday 20:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/h79widening6.cc (1.7): An example taken from CH78.
+
+2004-08-16 Monday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.203), bgp99extrapolation2.cc (1.1),
+	  h79widening6.cc (1.6): Test program h79widening6.cc renamed
+	  bgp99extrapolation2.cc.
+
+2004-08-16 Monday 19:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.20): Added the `ppl_lcdd' program to the main
+	  package.  Require gcc-c++ to be exactly version 3.4.1.
+
+2004-08-16 Monday 19:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.3): The `ppl_lcdd' program will be
+	  installed in `bindir'.
+
+2004-08-16 Monday 18:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.5), ppl.spec.in (1.19): Updated.
+
+2004-08-16 Monday 18:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.138): Definition of the folding operation
+	  improved.
+
+2004-08-16 Monday 18:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.82): Some items postponed.  Main points of PPL 0.7
+	  drafted.
+
+2004-08-16 Monday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.22): Typo fixed.
+
+2004-08-16 Monday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/README (1.7): Updated.
+
+2004-08-16 Monday 18:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BHRZ03_Certificate.defs.hh (1.3), H79_Certificate.defs.hh
+	  (1.2): Fixed the documentation of the certificates (for now, this
+	  will only appear in the developer manual).
+
+2004-08-16 Monday 18:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.24),
+	  Polyhedra_PowerSet.inlines.hh (1.35): Fixed header inclusions.
+
+2004-08-16 Monday 18:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.37), src/Polyhedron.defs.hh (1.240),
+	  doc/definitions.dox (1.137): Added a section about concatenation
+	  of polyhedra to the introduction of the user manual. Now the
+	  documentation of concatenate_assign() refers to it.
+
+2004-08-16 Monday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.54): Prolog_raise_exception()
+	  implemented.
+
+2004-08-16 Monday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.10): Specify that Andrea is with the University of
+	  Parma.  Email address omitted.
+
+2004-08-16 Monday 17:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.21): Formatting changes.
+
+2004-08-16 Monday 17:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.93): This test file now checks
+	  correctly that the exceptions do work ok.
+
+2004-08-16 Monday 17:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.20): Updated.
+
+2004-08-16 Monday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.4): Added instructions about the use of
+	  Comeau C/C++ 4.3.3.
+
+2004-08-16 Monday 16:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.97): Announce the new README.configure file.
+
+2004-08-16 Monday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.96): Drafted an announcement for the new Determinate,
+	  PowerSet and Polyhedra_PowerSet classes.
+
+2004-08-16 Monday 16:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ConSys.inlines.hh (1.33): Fixed
+	  ConSys::max_space_dimension().
+
+2004-08-16 Monday 14:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/bhz03widening6.cc (1.2): Comments added.
+
+2004-08-16 Monday 14:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Makefile.am (1.202), bhz03widening6.cc (1.1): dded more
+	  tests.
+
+2004-08-16 Monday 12:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.81): Some items postponed.  Main points of PPL 0.7
+	  drafted.
+
+2004-08-16 Monday 12:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.95): Announce the new "expand" and "fold" operations.
+
+2004-08-16 Monday 12:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.201), bhz03widening4.cc (1.1),
+	  bhz03widening5.cc (1.1): New tests are the same as
+	  bhz03widening1.cc and bhz03widening2.cc, but use the
+	  H79_Certificate instead of BHRZ03_Certificate.
+
+2004-08-16 Monday 12:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: H79_Certificate.cc (1.1), H79_Certificate.defs.hh (1.1),
+	  H79_Certificate.inlines.hh (1.1), H79_Certificate.types.hh (1.1),
+	  Makefile.am (1.74), Polyhedra_PowerSet.defs.hh (1.23),
+	  Polyhedra_PowerSet.inlines.hh (1.34), Polyhedron.defs.hh (1.239):
+	  Added the H79 widening certificate.  The certificate-based
+	  widening methods for the Polyhedra_Powerset domain made generic
+	  by parameterizing the certificate used. The instance using the
+	  BHRZ03_Certificate still have the old name (so as old code still
+	  works).
+
+2004-08-16 Monday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.94), Watchdog/NEWS (1.4): Our tentative release date is
+	  August 18, 2004.
+
+2004-08-16 Monday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.17), Watchdog/ChangeLog (1.7): Updated.
+
+2004-08-16 Monday 08:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.14): In
+	  Polyhedron::fold_dimensions(const Variables_Set&, Variable)
+	  correctly handle the case where the set is empty.
+
+2004-08-15 Sunday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.105), ppl_c.h.in (1.31): New C
+	  interface functions ppl_Polyhedron_expand_dimension() and
+	  ppl_Polyhedron_fold_dimensions().
+
+2004-08-15 Sunday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.13): Polyhedron::fold_dimensions()
+	  now checks its interface invariants.
+
+2004-08-15 Sunday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.238): Completed the documentation of
+	  Polyhedron::fold_dimensions().
+
+2004-08-15 Sunday 19:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.136): Set-cardinality notation explained.
+
+2004-08-15 Sunday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.22): Do not mix extern "C" pointers
+	  and extern "C++" pointers: they are different types.
+
+2004-08-15 Sunday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.135): Drafted a formal definition of the
+	  "fold_dimensions" operation.
+
+2004-08-15 Sunday 17:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.sty (1.14): Added the definition of the set-cardinality
+	  operator `\card'.
+
+2004-08-15 Sunday 11:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.134), src/Polyhedron.defs.hh (1.237):
+	  Added placeholder and reference to the (yet to be written)
+	  section on folding dimensions.
+
+2004-08-15 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: boundingbox1.cc (1.36), boundingbox3.cc (1.12),
+	  boundingbox4.cc (1.9): Comments corrected/revised.
+
+2004-08-15 Sunday 10:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.110): Documentation for
+	  the ppl_Polyhedron_expand_dimension/3 and
+	  ppl_Polyhedron_fold_dimensions/3 predicates, added.
+
+2004-08-15 Sunday 10:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.92): A bug has been fixed.  The
+	  tests for the bounding box predicates improved.
+
+2004-08-15 Sunday 10:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: boundingbox1.cc (1.35), boundingbox2.cc (1.20),
+	  boundingbox3.cc (1.11), boundingbox4.cc (1.8): The tests for
+	  shrink_bounding_box() and building polyhedra from boxes have been
+	  revised.
+
+2004-08-15 Sunday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.21): Catch and handle the
+	  exceptions that may be raised.
+
+2004-08-15 Sunday 08:44  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (altnum.8): Added conversion from mpz
+	  to int.
+
+2004-08-15 Sunday 00:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.20): Missing include files added.
+	  Reduced the scope of some variables in set_alarm_on_cpu_time().
+
+2004-08-14 Saturday 23:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.3): Added instructions on how to use the
+	  Intel C/C++ compiler.
+
+2004-08-14 Saturday 23:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.117): Version number bumped.	Require Autoconf
+	  2.59 or later.
+
+2004-08-14 Saturday 23:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/boundingbox5.cc (1.2): Be quiet.
+
+2004-08-14 Saturday 23:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ph_Status.idefs.hh (1.6): Inclusion guard added.
+
+2004-08-14 Saturday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Integer.defs.hh (altnum.5): Friend declarations
+	  fixed.
+
+2004-08-14 Saturday 10:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Integer.inlines.hh (altnum.6): Horrible kludge to fix
+	  a bug in Checked_Integer<T>::Checked_Integer(U), where U is some
+	  native integral type.
+
+2004-08-14 Saturday 10:11  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (altnum.7): Fixed unsigned/signed
+	  typo.
+
+2004-08-14 Saturday 10:10  Abramo Bagnara
+
+	* src/: Checked_Integer.inlines.hh, Checked_Number.inlines.hh,
+	  checked.defs.hh, checked_float.inlines.hh, checked_mpq.inlines.hh
+	  (altnum.[5,4,6,5,7]): Fixed code formatting.
+
+2004-08-14 Saturday 08:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.5): Include the contents of
+	  Integer.inlines.hh in ppl_install.hh.
+
+2004-08-14 Saturday 00:04  Abramo Bagnara
+
+	* src/: checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[6,6]): Fixed signed/unsigned conversion.
+
+2004-08-13 Friday 19:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bhz03widening3.cc (1.2): Be quiet.
+
+2004-08-13 Friday 19:21  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked_mpq.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[5,5,5]): Always pass 'from'
+	  arguments by reference in inline helper functions
+
+2004-08-13 Friday 18:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[4,4]): Qualified name is not allowed in namespace member
+	  declaration.
+
+2004-08-13 Friday 18:05  Abramo Bagnara
+
+	* configure.ac (altnum.4): Added AM_CONDITIONAL for new checked
+	  code.
+
+2004-08-13 Friday 18:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.10), src/Makefile.am (1.73): Version info
+	  updated for the libtool libraries.
+
+2004-08-13 Friday 17:29  Abramo Bagnara
+
+	* src/checked.defs.hh (altnum.4): More explicit name for function
+	  container
+
+2004-08-13 Friday 17:20  Abramo Bagnara
+
+	* src/float.types.hh (altnum.2): Renamed float basic type.
+
+2004-08-13 Friday 17:19  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked.inlines.hh,
+	  checked_int.inlines.hh, checked_mpq.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[3,3,5,3,3]): Added many const.
+	  Renamed float basic type.
+
+2004-08-13 Friday 17:19  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (altnum.4): Added pred/succ.
+
+2004-08-13 Friday 17:17  Abramo Bagnara
+
+	* src/Makefile.am (altnum.4): Adjusted for use of new checked code.
+
+2004-08-13 Friday 17:17  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  Checked_Number.types.hh (altnum.[3,3,2]): Added policy to
+	  Checked_Numbers. Added operator from basic types.
+
+2004-08-13 Friday 17:07  Abramo Bagnara
+
+	* src/Checked_Number.cc (altnum.2): Removed empty file.
+
+2004-08-13 Friday 17:06  Abramo Bagnara
+
+	* src/: Checked_Integer.defs.hh, Checked_Integer.inlines.hh,
+	  GMP_Integer.defs.hh, GMP_Integer.inlines.hh, Integer.defs.hh,
+	  Integer.inlines.hh, Integer.types.hh, Native_Integer.defs.hh,
+	  Native_Integer.inlines.hh (altnum.[4,4,3,3,4,1,4,4,4]): Shared
+	  definitions and declarations Integer_{zero,one}.
+
+2004-08-13 Friday 16:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.9), doc/devref.tex (1.14), doc/user.tex (1.15):
+	  Authors lists adapted to reality.
+
+2004-08-13 Friday 16:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.116): Version number bumped.
+
+2004-08-13 Friday 16:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.13): Slightly modified the policy for the list of
+	  parameters: for increased flexibility, detailed comments may
+	  occur both before and after the list.
+
+2004-08-13 Friday 16:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.21), C_Polyhedron.defs.hh (1.22),
+	  ConSys.defs.hh (1.83), Determinate.defs.hh (1.36), GenSys.defs.hh
+	  (1.96), Generator.defs.hh (1.87), Matrix.defs.hh (1.58),
+	  NNC_Polyhedron.defs.hh (1.25), Polyhedra_PowerSet.defs.hh (1.22),
+	  Polyhedron.defs.hh (1.236), Row.defs.hh (1.79), SatMatrix.defs.hh
+	  (1.34), conversion.cc (1.53), globals.hh (1.37), minimize.cc
+	  (1.36), simplify.cc (1.35): All parameter lists formatted
+	  according to the new policy in STANDARDS.
+
+2004-08-13 Friday 16:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/.cvsignore (1.6), tests/.cvsignore (1.9):
+	  Updated.
+
+2004-08-13 Friday 15:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.91): Tests for
+	  ppl_new_Polyhedron_from_bounding_box/3 that use the empty box as
+	  input have been added.  Unwanted code removed.
+
+2004-08-13 Friday 14:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.93), interfaces/Prolog/ppl_prolog.icc (1.134): Fixed a
+	  bug in the Prolog interface predicate
+	  ppl_new_Polyhedron_from_bounding_box/3 whereby the predicate was
+	  failing when given an empty bounding box.
+
+2004-08-13 Friday 14:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.90): Improved documentation and
+	  tests.
+
+2004-08-13 Friday 12:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.235), Polyhedron_nonpublic.cc (1.20):
+	  Some parameters renamed so as to be more consistent with the rest
+	  of the code.
+
+2004-08-13 Friday 12:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.80): Updated.
+
+2004-08-13 Friday 12:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/version.hh.in (1.9): Split the brief and detailed parts of a
+	  couple of doxygen comments.
+
+2004-08-13 Friday 12:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.30): Split a few brief comments where
+	  seemingly appropriate.  Started applying the new formatting
+	  policy for doxygen lists of parameters.
+
+2004-08-13 Friday 12:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.12): Drafted a policy for the formatting of
+	  parameter lists in doxygen comments.
+
+2004-08-13 Friday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.72): ppl.hh and ppl_install.hh also depend on
+	  version.hh.
+
+2004-08-13 Friday 11:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.92): Fixed a bug in the Prolog interface predicate
+	  ppl_Polyhedron_get_bounding_box/3 whereby a wrong result was
+	  sometimes computed in the case of an empty polyhedron.
+
+2004-08-13 Friday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BoundingBox.inlines.hh (1.12): BoundingBox::set_empty() now
+	  empties all the intervals.
+
+2004-08-13 Friday 11:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: boundingbox1.cc (1.34), boundingbox2.cc (1.19),
+	  boundingbox3.cc (1.10), boundingbox4.cc (1.7): Comments fixed.
+
+2004-08-13 Friday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.200), boundingbox5.cc (1.1): New test for
+	  Polyhedron::shrink_bounding_box().
+
+2004-08-13 Friday 10:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.89): Improved comments and
+	  better sequence of tests for the widening and extrapolation
+	  operators.
+
+2004-08-13 Friday 08:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.37),
+	  devref-print.doxyconf-latex.in (1.37), devref.doxyconf-html.in
+	  (1.38), user-browse.doxyconf-latex.in (1.20),
+	  user-print.doxyconf-latex.in (1.20), user.doxyconf-html.in
+	  (1.22): Use the `:=' operator to PREDEFINE __P: this prevents the
+	  definition to be undefined by `#undef'.
+
+2004-08-13 Friday 08:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.88): Added simpler test defined
+	  by predicate boundingbox_test/0 to show bug in
+	  ppl_Polyhedron_get_bounding_box/3 predicate when the polyhedron
+	  is empty. Test can be run using check_noisy/0.
+
+2004-08-13 Friday 00:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.19), doc/devref-browse.doxyconf-latex.in (1.36),
+	  doc/devref-print.doxyconf-latex.in (1.36),
+	  doc/devref.doxyconf-html.in (1.37): The file statistics.hh has
+	  been removed.
+
+2004-08-13 Friday 00:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.79): Harmonization of methods Polyhedron::throw_*() dealt
+	  with.
+
+2004-08-13 Friday 00:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.9), Constraint.cc (1.41),
+	  Constraint.defs.hh (1.87), Constraint.inlines.hh (1.49),
+	  Generator.cc (1.49), Generator.defs.hh (1.86),
+	  Generator.inlines.hh (1.43), Matrix.defs.hh (1.57),
+	  Ph_Status.idefs.hh (1.5), Poly_Con_Relation.defs.hh (1.24),
+	  Poly_Gen_Relation.defs.hh (1.22), Polyhedron.defs.hh (1.234),
+	  Polyhedron.inlines.hh (1.93), Polyhedron_chdims.cc (1.12),
+	  Polyhedron_nonpublic.cc (1.19), Polyhedron_public.cc (1.25),
+	  Polyhedron_widenings.cc (1.21), Row.defs.hh (1.78): The various
+	  methods throw_incompatible_*() made more consistent with each
+	  other, as well as the way they are called.  When closing a
+	  doxygen comment group with @}, made clear the group closed.
+
+2004-08-12 Thursday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.91): Mention that a bug has been fixed in
+	  Polyhedron::poly_difference_assign(const Polyhedron&).
+
+2004-08-12 Thursday 18:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.87), ppl_prolog.icc (1.133),
+	  Ciao/ciao_pl_check.pl (1.4), Ciao/ppl_ciao.pl (1.66),
+	  GNU/ppl_gprolog.pl (1.45), SICStus/ppl_sicstus_sd.cc (1.62),
+	  SWI/ppl_swiprolog.cc (1.87), XSB/ppl_xsb.H (1.32), XSB/ppl_xsb.cc
+	  (1.53), XSB/xsb_pl_check.P (1.9), YAP/ppl_yap.cc (1.80): Added
+	  interface predicate for fold_dimensions().  Added test for this
+	  predicate.
+
+2004-08-12 Thursday 17:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.86): Bugs introduced by adding
+	  full stops corrected.
+
+2004-08-12 Thursday 17:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.24): The patch for poly-difference
+	  operator seems to be the right solution: CHECKME removed.
+
+2004-08-12 Thursday 17:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.133), src/Polyhedron.defs.hh (1.233):
+	  Pedantic correction to the explanation of poly-difference.
+
+2004-08-12 Thursday 17:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.29): Simplified comments about
+	  poly-hull operators.	For the poly-difference, added reference to
+	  appropriate section of the manual.
+
+2004-08-12 Thursday 16:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.2), TODO (1.78): Explained the basics about
+	  configuring GMP and the PPL, as far as selecting the right
+	  version of GPM is concerned.
+
+2004-08-12 Thursday 15:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.77), doc/definitions.dox (1.132): Added a paragraph
+	  explaining that PPL types should not be used polymorphically.
+	  This is at the beginning of section 7 (The library), since it is
+	  specific of the C++ language.
+
+2004-08-12 Thursday 15:14  Abramo Bagnara
+
+	* src/Integer.defs.hh (altnum.3): Fixed typos including new files.
+
+2004-08-12 Thursday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, src/Integer.defs.hh, src/Integer.types.hh
+	  (altnum.[3,2,3]): First go at a setup that allows to test the new
+	  checked code against the old one.  The configure option
+	  `--enable-new-checked-code' does what is expected.
+
+2004-08-12 Thursday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.76), doc/definitions.dox (1.131): Small improvement to
+	  the discussion about the use of iterators and references.
+
+2004-08-12 Thursday 11:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.28): Corrected two doxygen comments:
+	  "const iterator system" --> "const iterator".
+
+2004-08-12 Thursday 11:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.130): Drafted a section providing a
+	  warning about the possible invalidation of references and
+	  iterators.
+
+2004-08-12 Thursday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, src/Integer.types.hh, src/Makefile.am
+	  (altnum.[2,2,3]): Do not use C types like char, short, long and
+	  long long.  Use the fixed width types int8_t, int16_t, int32_t
+	  and int64_t instead.
+
+2004-08-12 Thursday 10:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/folddims1.cc (1.2): A number of different tests for
+	  fold_dimensions() added.
+
+2004-08-12 Thursday 10:20  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.4): Added preliminary
+	  optimizations.
+
+2004-08-12 Thursday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (altnum.3): Parenthesis moved
+	  outside #if/#endif block.
+
+2004-08-12 Thursday 09:49  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.2): Missing file from previous
+	  commit (policy addition).
+
+2004-08-12 Thursday 09:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.23): Added a comment to the
+	  implementation of Polyhedron::poly_difference_assign().
+
+2004-08-12 Thursday 09:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.85): Given a proper reference to
+	  the work of Gopan et al.  Comments terminated by a full-stop.
+
+2004-08-12 Thursday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.132): Indentation fixed.
+
+2004-08-12 Thursday 09:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.199), expanddim1.cc (1.7), expanddim2.cc
+	  (1.1): Tests that are specific to NNC polyhedra must go in
+	  separate files: expanddim2.cc cut out from expanddim1.cc.
+
+2004-08-12 Thursday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/expanddim1.cc (1.6): Biobliographic reference fixed.
+
+2004-08-12 Thursday 08:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.84): Added another (simple) test
+	  for the poly difference predicate; Added a test for the
+	  expand_dimension predicate based on that in the TACAS04 paper on
+	  page 519.
+
+2004-08-12 Thursday 08:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/expanddim1.cc (1.5): Added test corresponding to example in
+	  the TACAS04 paper on page 519.
+
+2004-08-12 Thursday 08:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/expanddim1.cc (1.4): We always terminate sentences with a
+	  full stop.
+
+2004-08-11 Wednesday 23:49  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.3): Changed approach to
+	  checked add/sub to avoid undefined behaviour caused by out of
+	  range expressions.
+
+2004-08-11 Wednesday 22:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.83): Test for
+	  ppl_Polyhedron_poly_difference_assign corrected.
+
+2004-08-11 Wednesday 21:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.82), ppl_prolog.icc (1.131),
+	  Ciao/ciao_pl_check.pl (1.3), Ciao/ppl_ciao.pl (1.65),
+	  GNU/ppl_gprolog.pl (1.44), SICStus/ppl_sicstus_sd.cc (1.61),
+	  SWI/ppl_swiprolog.cc (1.86), XSB/ppl_xsb.H (1.31), XSB/ppl_xsb.cc
+	  (1.52), XSB/xsb_pl_check.P (1.8), YAP/ppl_yap.cc (1.79): Prolog
+	  interface predicate added for expand_dimension().  Test for new
+	  predicate added to pl_check.pl.
+
+2004-08-11 Wednesday 21:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/expanddim1.cc (1.3): More tests added for testing
+	  expand_dimensions().
+
+2004-08-11 Wednesday 19:25  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  Result_Info.defs.hh, checked.defs.hh, checked_float.cc,
+	  checked_float.defs.hh, checked_float.inlines.hh, checked_int.cc,
+	  checked_int.defs.hh, checked_int.inlines.hh, checked_mpq.cc,
+	  checked_mpq.defs.hh, checked_mpq.inlines.hh, checked_mpz.cc,
+	  checked_mpz.defs.hh, checked_mpz.inlines.hh
+	  (altnum.[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]): Added policy to
+	  checked functions. Deleted useless files. Confined checked
+	  functions and helper class to Checked namespace.
+
+2004-08-11 Wednesday 18:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.22): Drafted a patch to correct bug
+	  shown by polydifference8.cc.
+
+2004-08-11 Wednesday 18:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.198), bhz03widening3.cc (1.1),
+	  polydifference8.cc (1.1): New test polydifference8.cc (extracted
+	  from bhz03wodening3.cc) shows a bug in method
+	  Polyhedron::poly_difference_assign().
+
+2004-08-11 Wednesday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.197), folddims1.cc (1.1): Use folddims1.cc
+	  for testing Polyhedron::fold_dimensions().
+
+2004-08-11 Wednesday 16:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.21),
+	  Polyhedra_PowerSet.inlines.hh (1.33): Use BHRZ03_Certificate
+	  instead of BHRZ03_info. First step towards generalizing the BHZ03
+	  widening to arbitrary certificates.
+
+2004-08-11 Wednesday 16:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.232), Polyhedron.inlines.hh (1.92),
+	  Polyhedron_widenings.cc (1.20): Got rid of all the stuff related
+	  to Polyhedron::BHRZ03_info, superseded by the class
+	  BHRZ03_Certificate.
+
+2004-08-11 Wednesday 16:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BHRZ03_Certificate.defs.hh (1.2): The comparison function is
+	  now provided with a brief and a detailed doxygen descriptions.
+
+2004-08-11 Wednesday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/expanddim1.cc (1.2): Two new tests sketched.
+
+2004-08-11 Wednesday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.11): Fixed a bug in
+	  Polyhedron::expand_dimension().  Polyhedron::fold_dimensions()
+	  drafted.
+
+2004-08-11 Wednesday 12:03  Abramo Bagnara
+
+	* src/: Checked_Number.cc, Checked_Number.defs.hh,
+	  Checked_Number.inlines.hh, Checked_Number.types.hh
+	  (altnum.[1,1,1,1]): Replacement for Checked_Integer and more
+
+2004-08-11 Wednesday 12:03  Abramo Bagnara
+
+	* src/float.types.hh (altnum.1): Native float type declaration
+
+2004-08-11 Wednesday 12:02  Abramo Bagnara
+
+	* src/Result_Info.defs.hh (altnum.1): Result info for checked
+	  functions
+
+2004-08-11 Wednesday 12:02  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked.inlines.hh, checked_float.cc,
+	  checked_float.defs.hh, checked_float.inlines.hh, checked_int.cc,
+	  checked_int.defs.hh, checked_int.inlines.hh, checked_mpq.cc,
+	  checked_mpq.defs.hh, checked_mpq.inlines.hh, checked_mpz.cc,
+	  checked_mpz.defs.hh, checked_mpz.inlines.hh
+	  (altnum.[1,1,1,1,1,1,1,1,1,1,1,1,1,1]): Checked functions for
+	  int, float, mpz and mpq
+
+2004-08-11 Wednesday 10:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.10), tests/Makefile.am (1.196),
+	  tests/expanddim1.cc (1.1): Added a prototype implementation of
+	  Polyhedron::expand_dimension(Variable var, dimension_type m).
+
+2004-08-09 Monday 23:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.18): Started revision for the PPL 0.6 release.
+
+2004-08-09 Monday 22:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.75): Section on portability migrated to README.configure.
+	  Section on constructions on polyhedra revised.
+
+2004-08-09 Monday 22:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.1): New file describing the PPL-specific
+	  aspects of configuration, compilation and installation of the
+	  library.
+
+2004-08-09 Monday 20:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.26), fdl.txt (1.1), gpl.txt (1.1): We now
+	  distribute the GPL and the FDL also in text format (so as not to
+	  assume that users have Doxygen and/or LaTeX and/or a
+	  PostScript/PDF viewer).
+
+2004-08-09 Monday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Init.cc (1.11), Makefile.am (1.71), Polyhedron_widenings.cc
+	  (1.19), statistics.hh (1.4): Dealt with all the stuff needed to
+	  collect statistics about the BHRZ03 widening operator.
+
+2004-08-09 Monday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.74), src/Polyhedron.defs.hh (1.231),
+	  src/Polyhedron.inlines.hh (1.91): In
+	  Polyhedron::map_dimensions(const PartialFunction&), the method
+	  PartialFunction::maps() is now called at most `n' times, where
+	  `n' is the dimension of the vector space enclosing the
+	  polyhedron.
+
+2004-08-09 Monday 08:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.90), TODO (1.73), interfaces/Prolog/ppl_prolog.icc
+	  (1.130), src/Polyhedra_PowerSet.inlines.hh (1.32),
+	  src/PowerSet.inlines.hh (1.56), src/conversion.cc (1.52),
+	  src/globals.cc (1.14), src/globals.hh (1.36), tests/watchdog1.cc
+	  (1.20): The variable `abandon_exponential_computations' has been
+	  renamed `abandon_expensive_computations'.  Its documentation has
+	  also been revised.
+
+2004-08-08 Sunday 21:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.18): Two FIXMEs dealt with.
+
+2004-08-08 Sunday 19:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.89), demos/ppl_lcdd/ppl_lcdd.cc (1.19), src/version.hh.in
+	  (1.8): New macro PPL_VERSION expands to the version string of the
+	  library.
+
+2004-08-08 Sunday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.88), Watchdog/Makefile.am (1.9), Watchdog/Watchdog.cc
+	  (1.17), Watchdog/Watchdog.defs.hh (1.13),
+	  Watchdog/Watchdog.inlines.hh (1.11),
+	  interfaces/Prolog/ppl_prolog.icc (1.129), tests/watchdog1.cc
+	  (1.19): Watchdog library completely reorganized.  Deadlock bug
+	  fixed in the process.
+
+2004-08-08 Sunday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/examples/Makefile.am (1.2): Distribute the
+	  examples.
+
+2004-08-08 Sunday 19:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.types.hh (1.11): Namespace closing brace
+	  commented.
+
+2004-08-08 Sunday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Handler.defs.hh (1.1), Handler.inlines.hh (1.1),
+	  Handler.types.hh (1.1): Classes for handlers of the watchdog
+	  events.
+
+2004-08-08 Sunday 18:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.129): Corrected a typo.
+
+2004-08-08 Sunday 12:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.230): Documentation on map_dimensions
+	  wrt the specification of pfunc revised.
+
+2004-08-08 Sunday 10:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.229): Added to documentation of
+	  map_dimensions, in the specification of the partial function
+	  pfunc/2, an indication of the number of times the different
+	  methods will be called.
+
+2004-08-07 Saturday 19:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.19), Watchdog/ltmain.sh (1.8): Updated from Libtool
+	  1.5.8.
+
+2004-08-07 Saturday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Pending_List.cc (1.1), Pending_List.defs.hh (1.1),
+	  Pending_List.inlines.hh (1.1), Pending_List.types.hh (1.1): An
+	  ordered list for recording pending watchdog events.
+
+2004-08-07 Saturday 08:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: EList.defs.hh (1.3), EList.inlines.hh (1.2): The
+	  clear() method has been removed.  The destructor now destructs
+	  also the elements in the list.
+
+2004-08-06 Friday 19:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Pending_Element.cc (1.1), Pending_Element.defs.hh
+	  (1.1), Pending_Element.inlines.hh (1.1), Pending_Element.types.hh
+	  (1.1): A class for pending watchdog events with embedded links.
+
+2004-08-06 Friday 18:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Doubly_Linked_Object.defs.hh (1.1),
+	  Doubly_Linked_Object.inlines.hh (1.1),
+	  Doubly_Linked_Object.types.hh (1.1): A (base) class for doubly
+	  linked objects.
+
+2004-08-06 Friday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: EList_Iterator.defs.hh (1.1),
+	  EList_Iterator.inlines.hh (1.1), EList_Iterator.types.hh (1.1): A
+	  class providing iterators for embedded lists.
+
+2004-08-06 Friday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/EList.defs.hh (1.2): Class comment revised.
+
+2004-08-06 Friday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: EList.defs.hh (1.1), EList.inlines.hh (1.1),
+	  EList.types.hh (1.1): A list of doubly linked objects (where the
+	  links are embedded in the objects themselves).
+
+2004-08-06 Friday 18:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Time.cc (1.1), Time.defs.hh (1.1), Time.inlines.hh
+	  (1.1), Time.types.hh (1.1): A class for representing and
+	  manipulating positive time intervals.
+
+2004-08-05 Thursday 08:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.72): ppl_Polyhedron_maximize,
+	  ppl_Polyhedron_maximize_with_point, and ppl_Polyhedron_minimize,
+	  ppl_Polyhedron_minimize_with_point have been added to the Prolog
+	  interface with corresponding additions to the documentation and
+	  pl_check.pl.	Todo item on this removed.
+
+2004-08-05 Thursday 07:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Integer.defs.hh, Checked_Integer.inlines.hh,
+	  Checked_Integer.types.hh, GMP_Integer.defs.hh,
+	  GMP_Integer.inlines.hh, GMP_Integer.types.hh,
+	  Integer_traits_template.hh, Native_Integer.defs.hh,
+	  Native_Integer.inlines.hh, Native_Integer.types.hh
+	  (altnum.[3,3,2,2,2,2,2,3,3,2]): Copyright years updated.
+
+2004-08-04 Wednesday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* depcomp (1.8), install-sh (1.9), Watchdog/depcomp (1.6),
+	  Watchdog/install-sh (1.6): Updated from Automake 1.9.
+
+2004-08-04 Wednesday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.87), configure.ac (1.115), demos/Makefile.am (1.3),
+	  demos/ppl_lcdd/Makefile.am (1.2),
+	  demos/ppl_lcdd/examples/.cvsignore (1.1),
+	  demos/ppl_lcdd/examples/Makefile.am (1.1),
+	  demos/ppl_lpsol/.cvsignore (1.1), demos/ppl_lpsol/Makefile.am
+	  (1.1), demos/ppl_lpsol/expected (1.1),
+	  demos/ppl_lpsol/ppl_lpsol.c (1.1),
+	  demos/ppl_lpsol/examples/.cvsignore (1.1),
+	  demos/ppl_lpsol/examples/Makefile.am (1.1),
+	  demos/ppl_lpsol/examples/afiro.mps (1.1),
+	  demos/ppl_lpsol/examples/bgprtr.mps (1.1),
+	  demos/ppl_lpsol/examples/ex1.mps (1.1),
+	  demos/ppl_lpsol/examples/sample.mps (1.1),
+	  demos/ppl_lpsol/examples/unboundedmin.mps (1.1),
+	  interfaces/C/Makefile.am (1.17): All demos are now under the
+	  `demos' directory.
+
+2004-08-04 Wednesday 21:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.28): The source
+	  `fake_mail.pl' has gone long time ago.
+
+2004-08-04 Wednesday 20:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.23), config.sub (1.22), Watchdog/config.guess
+	  (1.7), Watchdog/config.sub (1.7): Updated.
+
+2004-08-04 Wednesday 20:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.71): The Polyhedron::*recycled*() methods do not make
+	  sense for the Prolog interface.
+
+2004-08-04 Wednesday 16:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: adddimensions11.cc, dualhypercubes.cc (altnum.[1,1]): The
+	  main program must catch exceptions.
+
+2004-08-04 Wednesday 16:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.70): Some things to do will only be done in PPL 0.7 or
+	  later version.
+
+2004-08-04 Wednesday 15:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Interval.defs.hh, Interval.inlines.hh (altnum.[2,2]):
+	  Returning by const reference when appropriate. (numerator and
+	  denominator).
+
+2004-08-04 Wednesday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Integer.defs.hh, Checked_Integer.inlines.hh,
+	  Native_Integer.defs.hh, Native_Integer.inlines.hh
+	  (altnum.[2,2,2,2]): Use Integer_macros.hh to declare and define
+	  all the required functions.
+
+2004-08-04 Wednesday 15:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (altnum.2): Wrongly-named variable references
+	  fixed.
+
+2004-08-04 Wednesday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Integer_macros.hh, Makefile.am (altnum.[1,2]): Helper
+	  macros for the implementation of Native_Integer and
+	  Checked_Integer.
+
+2004-08-04 Wednesday 15:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (altnum.1): Temporarily disable the `interfaces'
+	  directory.
+
+2004-08-04 Wednesday 13:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, configure.ac, src/BoundingBox.cc,
+	  src/BoundingBox.defs.hh, src/BoundingBox.inlines.hh,
+	  src/Checked_Integer.defs.hh, src/Checked_Integer.inlines.hh,
+	  src/Checked_Integer.types.hh, src/ConSys.cc, src/ConSys.defs.hh,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	  src/GMP_Integer.types.hh, src/GenSys.cc, src/GenSys.defs.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Integer.defs.hh,
+	  src/Integer.types.hh, src/Integer_traits_template.hh,
+	  src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/LinExpression.cc, src/LinExpression.defs.hh,
+	  src/LinExpression.inlines.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Native_Integer.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/conversion.cc, src/globals.cc, src/globals.hh, tests/BBox.cc,
+	  tests/BBox.hh, tests/Makefile.am
+	  (altnum.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Imported, with changes, from the `altnum' branch of the students'
+	  repository.  As the Purenum project seems dead, support for
+	  Purenum has been evicted.  Notice that both native and checked
+	  integers do not currently work due to the absence of some
+	  relational operators.
+
+2004-07-15 Thursday 18:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.18): Option `-c' (`--check')
+	  implemented.
+
+2004-07-15 Thursday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/examples/: 1d.ine (1.1), 1da.ine (1.1), cp4.ext
+	  (1.1), cp4.ine (1.1), cp5.ext (1.1), cp5.ine (1.1), cp6.ext
+	  (1.1), cp6.ine (1.1), cp7.ext (1.1), cross4.ine (1.1), cube.ext
+	  (1.1), cube.ine (1.1), cubetop.ine (1.1), cut16_11.ext (1.1),
+	  cut32_16.ext (1.1), cyc.ine (1.1), cyclic17_8.ine (1.1),
+	  cyclic25_13.ext (1.1), diamond.ine (1.1), in0.ine (1.1), in1.ine
+	  (1.1), in2.ine (1.1), in3.ine (1.1), in4.ine (1.1), in5.ine
+	  (1.1), in6.ine (1.1), in7.ine (1.1), kq20_11_m.ine (1.1),
+	  metric40_11.ine (1.1), metric80_16.ine (1.1), mit.ine (1.1),
+	  mit288-281.ine (1.1), mit31-20.ine (1.1), mit41-16.ine (1.1),
+	  mit708-9.ine (1.1), mit71-61.ine (1.1), mit90-86.ine (1.1),
+	  mp5.ext (1.1), mp5.ine (1.1), mp5a.ine (1.1), mp6.ine (1.1),
+	  trunc10.ine (1.1), trunc7.ine (1.1), tsp5.ext (1.1), tsp5.ine
+	  (1.1): Borrowed, with some minor changes, from lrslib 042.
+
+2004-07-15 Thursday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/examples/: allzero.ine (1.1), ccc4.ext (1.1),
+	  ccc5.ext (1.1), ccc6.ext (1.1), ccp4.ext (1.1), ccp5.ext (1.1),
+	  ccp6.ext (1.1), cross10.ine (1.1), cross12.ine (1.1), cross6.ine
+	  (1.1), cross8.ine (1.1), cube10.ine (1.1), cube12.ine (1.1),
+	  cube3.ine (1.1), cube6.ine (1.1), cube8.ine (1.1), cubocta.ine
+	  (1.1), cyclic10-4.ext (1.1), cyclic12-6.ext (1.1), cyclic14-8.ext
+	  (1.1), cyclic16-10.ext (1.1), dodeca_m.ine (1.1), ex1.ine (1.1),
+	  grcubocta.ine (1.1), hexocta.ine (1.1), icododeca_m.ine (1.1),
+	  infeas.ine (1.1), integralpoints.ine (1.1), irbox20-4.ext (1.1),
+	  irbox200-4.ext (1.1), kkd18_4.ine (1.1), kkd27_5.ine (1.1),
+	  kkd38_6.ine (1.1), nonfull.ine (1.1), origin.ine (1.1),
+	  prodst62.ext (1.1), project1_m.ine (1.1), project1res.ine (1.1),
+	  project2_m.ine (1.1), project2res.ine (1.1), rcubocta.ine (1.1),
+	  redcheck.ext (1.1), reg24-5.ext (1.1), reg24-5.ine (1.1),
+	  reg600-5_m.ext (1.1), rhomtria_m.ine (1.1), sample.ine (1.1),
+	  sampleh1.ine (1.1), sampleh2.ine (1.1), sampleh3.ine (1.1),
+	  sampleh4.ine (1.1), sampleh5.ine (1.1), sampleh6.ine (1.1),
+	  sampleh7.ine (1.1), sampleh8.ine (1.1), samplev1.ext (1.1),
+	  samplev2.ext (1.1), samplev3.ext (1.1): Borrowed, with some minor
+	  changes, from cddlib 093c.
+
+2004-07-11 Sunday 15:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.17): Append to the output file,
+	  instead of truncating it.
+
+2004-07-11 Sunday 15:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.16): Error messages fixed.
+
+2004-07-10 Saturday 19:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.15): Fixed the handling of equality
+	  constraints in read_polyhedron().
+
+2004-07-10 Saturday 17:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.14): Corrected input and output of
+	  H-representations (a couple of sign errors).	When outputting
+	  rational coefficients, print 0 instead of 0/<denominator>.
+
+2004-07-10 Saturday 16:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.13): Bug fixed in function
+	  normalize().
+
+2004-07-10 Saturday 14:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.12): Initial implementation of the
+	  `project' command (which seems to be unimplemented in the real
+	  lcdd).
+
+2004-07-10 Saturday 10:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.11): Started adding a new option to
+	  check the result.  Bugs fixed in set_input() and set_output().
+	  Reject the `linearity' command when it does not appear before
+	  `begin'.
+
+2004-07-10 Saturday 01:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.10): Output made watertight.
+
+2004-07-09 Friday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.9): Several bugs fixed.  Formal
+	  parameters tightened.
+
+2004-07-09 Friday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.8): Obey the `-o' option.
+
+2004-07-09 Friday 21:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.7): Make sure every non-empty
+	  generator system we create has at least one point.
+
+2004-07-09 Friday 18:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.6): Input made more robust.
+
+2004-07-09 Friday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.5): Make sure points are created
+	  with the right denominator.
+
+2004-07-09 Friday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.4): Bug fixed in
+	  write_polyhedron().
+
+2004-07-09 Friday 15:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.3): Input/output rewritten.
+
+2004-07-09 Friday 09:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.81): Some reorganisation of test
+	  predicates to match order of tests.  Improved handling of
+	  deletion of polyhedra in the exception tests.
+
+2004-07-09 Friday 08:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.2): Started drafting the output
+	  function.  Several other improvements.
+
+2004-07-09 Friday 08:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/.cvsignore (1.3): Put under CVS control.
+
+2004-07-09 Friday 08:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.114), demos/.cvsignore (1.2), demos/Makefile.am
+	  (1.2), demos/ppl_lcdd.cc (1.2), demos/ppl_lcdd/.cvsignore (1.1),
+	  demos/ppl_lcdd/Makefile.am (1.1), demos/ppl_lcdd/ppl_lcdd.cc
+	  (1.1): The `ppl_lcdd' demo has now its own subdirectory.
+
+2004-07-08 Thursday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.16): Spacing fixed.
+
+2004-07-08 Thursday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.113): Added checks for getopt.h and signal.h.
+	  Added demos/Makefile to the output list.
+
+2004-07-08 Thursday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.24): Added `demos' to `SUBDIR'.
+
+2004-07-08 Thursday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: .cvsignore (1.1), Makefile.am (1.1), ppl_lcdd.cc (1.1):
+	  `ppl_lcdd' is a sort of clone of the cddlib test program `lcdd'.
+
+2004-07-08 Thursday 16:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.109): Brief
+	  descriptions of the new interface predicates are added.
+
+2004-07-08 Thursday 12:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.108): New Prolog
+	  interface predicates recently added have been added to the PPL
+	  Predicate List in the documentation for this interface.
+
+2004-05-26 Wednesday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.228): Fixed examples involving
+	  ConSys::insert() and GenSys::insert().
+
+2004-05-26 Wednesday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.86): Mention the documentation improvements.
+
+2004-05-21 Friday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.112): Tests reordered so that an invalid
+	  combination of compiler options is detected earlier and diagnosed
+	  in an intelligible way.
+
+2004-05-09 Sunday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.15): Anachronisms removed.
+
+2004-05-09 Sunday 14:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.11), src/Polyhedra_PowerSet.inlines.hh (1.31),
+	  src/Polyhedron_public.cc (1.21), src/Polyhedron_widenings.cc
+	  (1.17), src/simplify.cc (1.34), tests/bhrz03widening14.cc (1.5),
+	  tests/bhrz03widening15.cc (1.7): All other things being equal,
+	  always prefer preincrement and predecrement to postincrement and
+	  postdecrement.
+
+2004-05-09 Sunday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.9): Redundant test avoided.
+
+2004-05-08 Saturday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.68), Matrix.defs.hh (1.56),
+	  Polyhedron.inlines.hh (1.90): New declaration and implementation
+	  of Matrix::permute_columns().  Implementation of
+	  Polyhedron::map_dimensions() improved.
+
+2004-05-08 Saturday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.21): Missing dependency
+	  added.
+
+2004-05-07 Friday 21:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.7): Code reordered.
+
+2004-05-07 Friday 21:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.51):
+	  Integer_to_integer_term() fixed.
+
+2004-05-07 Friday 21:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/.cvsignore (1.5): Updated.
+
+2004-05-07 Friday 19:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.6): Small improvement to
+	  a comment.
+
+2004-05-07 Friday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.5): Kludge to to test the
+	  Prolog interface exceptions when converting PPL integers to XSB
+	  Prolog integer terms.
+
+2004-05-07 Friday 19:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BHRZ03_Certificate.cc (1.1), BHRZ03_Certificate.defs.hh
+	  (1.1), BHRZ03_Certificate.inlines.hh (1.1),
+	  BHRZ03_Certificate.types.hh (1.1): Put under CVS control.
+
+2004-05-07 Friday 19:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Makefile.am (1.70), Polyhedron.defs.hh (1.227),
+	  Polyhedron_widenings.cc (1.16): Changed to use the new
+	  BHRZ03_Certificate class.  Current implementation for NNC
+	  polyhedra is an inefficient kludge, but should be correct. It
+	  will become efficient as soon as we implement lazy procedures for
+	  eps-minimization of NNC polyhedra.
+
+2004-05-07 Friday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.20): Avoid code
+	  duplication: Integer_to_integer_term() now uses
+	  Prolog_put_long().
+
+2004-05-07 Friday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/.cvsignore (1.5), SICStus/.cvsignore
+	  (1.5), SWI/.cvsignore (1.5), XSB/.cvsignore (1.4), YAP/.cvsignore
+	  (1.5): Updated.
+
+2004-05-07 Friday 18:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/fake_main.pl (1.2): This is not necessary
+	  with new versions of Ciao Prolog.
+
+2004-05-07 Friday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.27): The previous change
+	  did not take into account that `ciaoc' always writes the object
+	  file in the same directory where the sources reside.	Copies
+	  restored, but now the copies are written in the right place.
+
+2004-05-07 Friday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/.cvsignore (1.3), src/.cvsignore (1.7),
+	  tests/.cvsignore (1.8): Updated.
+
+2004-05-07 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.26), ciao_clpq.pl (1.9),
+	  ciao_clpq2.pl (1.4), ciao_pl_check.pl (1.2): New versions of Ciao
+	  Prolog no longer require the sources to be copied.
+
+2004-05-07 Friday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.25), SICStus/Makefile.am
+	  (1.41), SWI/Makefile.am (1.34): Clean things up after `make
+	  check'.
+
+2004-05-07 Friday 10:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.80): Additional tests for system
+	  dependent exceptions when the integer values are max, max+1, min,
+	  or min-1.
+
+2004-05-07 Friday 10:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.79): More and improved tests for
+	  exceptions.  Code better commented and additional predicates for
+	  i/o etc reorganised.
+
+2004-05-07 Friday 10:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.4): Corrected typo.
+
+2004-05-07 Friday 10:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.3): Added a definition
+	  for current_prolog_flag/3.
+
+2004-05-07 Friday 09:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.19):
+	  Integer_to_integer_term() fixed.
+
+2004-05-06 Thursday 10:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.78): More tests for ppl Prolog
+	  interface exceptions added.
+
+2004-05-05 Wednesday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am (1.33), swi_pl_check.pl
+	  (1.1): Use also pl_check.pl to test the SWI-Prolog interface.
+
+2004-05-05 Wednesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.40), sp_pl_check.pl
+	  (1.1): Use also pl_check.pl to test the SICStus-Prolog interface.
+
+2004-05-05 Wednesday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.24), ciao_pl_check.pl
+	  (1.1): Use also pl_check.pl to test the Ciao-Prolog interface.
+
+2004-05-05 Wednesday 10:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.77): Comment added explaining
+	  new code for exceptions tests
+
+2004-05-05 Wednesday 10:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.76): New tests for checking some
+	  possible exceptions in the C++ and Prolog interface added.
+
+2004-05-04 Tuesday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.226): Documentation for
+	  Polyhedron::expand_dimension() improved.  New method void
+	  Polyhedron::void fold_dimensions(const Variables_Set&
+	  to_be_folded, Variable var) declared: documentation still to be
+	  written.
+
+2004-05-04 Tuesday 21:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.128), src/Polyhedron.defs.hh (1.225): New
+	  declaration and documentation for void
+	  Polyhedron::expand_dimension(Variable var, dimension_type m).
+
+2004-05-04 Tuesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.127): Added a section on the new
+	  `expand_dimension' operation.
+
+2004-05-04 Tuesday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.126): Additions to the bibliography.
+
+2004-05-04 Tuesday 14:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.125): Definition of `map_dimensions'
+	  improved.
+
+2004-04-30 Friday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.11), ppl_prolog.icc (1.128),
+	  Ciao/ppl_ciao.cc (1.23), GNU/ppl_gprolog_sd.cc (1.18),
+	  SICStus/ppl_sicstus_sd.cc (1.60), SWI/ppl_swiprolog.cc (1.85),
+	  XSB/ppl_xsb.cc (1.50), YAP/ppl_yap.cc (1.78): Deal with different
+	  representations for integers in Prolog and C++ code.
+
+2004-04-30 Friday 19:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.104): Handle std::overflow_error.
+
+2004-04-30 Friday 17:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.103), ppl_c.h.in (1.27): Missing
+	  try/catch blocks added.  Interface changed for
+	  ppl_version_major(), ppl_version_minor(), ppl_version_revision(),
+	  ppl_version_beta(), ppl_version() and ppl_banner().
+
+2004-04-30 Friday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.102): CATCH_ALL fixed: was translating
+	  std::exception to PPL_ERROR_INTERNAL_ERROR instead of
+	  PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION.
+
+2004-04-27 Tuesday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.111), interfaces/OCaml/.cvsignore (1.3),
+	  interfaces/OCaml/Makefile.am (1.8), interfaces/OCaml/gmp.h (1.2),
+	  interfaces/OCaml/ppl_ocaml_c.swg (1.3): Our OCaml interface will
+	  not be based on SWIG.
+
+2004-04-26 Monday 23:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_pl_check.pl (1.5): Previous change
+	  reverted.
+
+2004-04-26 Monday 22:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/YAP/yap_pl_check.pl (1.4): Paths to pl_check.pl
+	  and yap_pl_check.pl need to allow for working in a separate build
+	  directory.
+
+2004-04-26 Monday 22:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.75): Bug fixed in
+	  "format_banner" code.  Definitions of "make_noisy" and
+	  "make_quiet" corrected.  Added a new top-level predicate
+	  "check_noisy/0" since "check_all" is now forced to be quiet.	A
+	  redundant temporary test removed.
+
+2004-04-26 Monday 22:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.127): Removed unwanted line
+	  in ..._relations_with_constraints procedure.	Modified
+	  .._relations_with_generator procedure to be in line with changes
+	  to ..._relations_with_constraints procedure.
+
+2004-04-26 Monday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.126): Do not call any
+	  Prolog_put_*() function on a destination term that does not
+	  represent a free variable.
+
+2004-04-26 Monday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.20): Infrastructure for
+	  automatic testing with pl_check.pl completed.
+
+2004-04-26 Monday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.2): Initial goal fixed.
+
+2004-04-26 Monday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: Makefile.am (1.19), xsb_pl_check.P (1.1):
+	  Use also pl_check.pl when testing the XSB interface.
+
+2004-04-26 Monday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.49): Some assertion fixed: we
+	  cannot assume XSB's TRUE evaluates to C++'s true.
+
+2004-04-26 Monday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.74): A predicate is either
+	  static or dynamic (noisy/1).	The predicate retractall/1 is
+	  non-standard: do not use it.
+
+2004-04-25 Sunday 22:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.10), ppl_prolog.icc (1.125):
+	  New error handling code completed.
+
+2004-04-25 Sunday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* depcomp (1.7), install-sh (1.8), mkinstalldirs (1.7),
+	  Watchdog/depcomp (1.5), Watchdog/install-sh (1.5),
+	  Watchdog/mkinstalldirs (1.3): Updated from Automake 1.8.4.
+
+2004-04-25 Sunday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.124): Previous changes
+	  reverted.  Rewritten a good part of the error handling code.
+	  Several bugs fixed.
+
+2004-04-25 Sunday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/exceptions.hh (1.9): Exception classes revised.
+
+2004-04-25 Sunday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.84): Prolog_put_long()
+	  and Integer_to_integer_term() implemented properly.  Added
+	  Prolog_put_ulong().
+
+2004-04-25 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.59): The wrong
+	  exception was thrown by integer_term_to_Integer(): fixed.
+
+2004-04-25 Sunday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sicstus_cfli.ic (1.8): Added
+	  Prolog_put_ulong().
+
+2004-04-25 Sunday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.48): Added a temporary, buggy
+	  version of Prolog_put_ulong().  All the XSB c2p_*() functions
+	  require that the second argument is an unbound variable:
+	  assertions added to check that we abide by this rule.
+
+2004-04-25 Sunday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.22),
+	  GNU/ppl_gprolog_sd.cc (1.17), YAP/ppl_yap.cc (1.77): Added a
+	  temporary, buggy version of Prolog_put_ulong().
+
+2004-04-25 Sunday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.73): Previous changes reverted.
+
+2004-04-25 Sunday 11:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.72), ppl_prolog.icc (1.123):
+	  Bug in an interface predicate
+	  (ppl_Polyhedron_relation_with_constraints) that only caused an
+	  error with the XSB interface now fixed.  pl_check revised to
+	  avoid warning messages with XSB compiler.
+
+2004-04-24 Saturday 23:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.83): SWI Prolog does
+	  not support unlimited precision integers.
+
+2004-04-24 Saturday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.21): If GMP does not support exceptions this
+	  test is pointless.
+
+2004-04-24 Saturday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.69): Flags for ICC changed.
+
+2004-04-24 Saturday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.34): Use the C++ compiler to
+	  compile and link.  Do not mention -lstcd++.
+
+2004-04-24 Saturday 10:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.16): Work around
+	  gprolog.h namespace pollution.
+
+2004-04-24 Saturday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.122): Include
+	  "max_space_dimension.hh".
+
+2004-04-24 Saturday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.101): Include "max_space_dimension.hh".
+
+2004-04-24 Saturday 10:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.85): Explain the changes concerning the
+	  max_space_dimension() functions.
+
+2004-04-24 Saturday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.inlines.hh (1.16), max_space_dimension.hh
+	  (1.2): C_Polyhedron::max_space_dimension() fixed.
+
+2004-04-24 Saturday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.defs.hh (1.95), GenSys.inlines.hh (1.33): New
+	  function GenSys::max_space_dimension().
+
+2004-04-24 Saturday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.82), ConSys.inlines.hh (1.32): New
+	  function ConSys::max_space_dimension().
+
+2004-04-24 Saturday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.inlines.hh (1.44): Spurious newline removed.
+
+2004-04-24 Saturday 09:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.55), Matrix.inlines.hh (1.37): New
+	  functions Matrix::max_num_rows() and Matrix::max_num_columns().
+
+2004-04-24 Saturday 09:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.defs.hh (1.77), Row.inlines.hh (1.43): New functions
+	  Row::Impl::max_size() and Row::max_size().
+
+2004-04-24 Saturday 08:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.21), C_Polyhedron.inlines.hh
+	  (1.15), Makefile.am (1.69), NNC_Polyhedron.defs.hh (1.24),
+	  NNC_Polyhedron.inlines.hh (1.17), Polyhedra_PowerSet.defs.hh
+	  (1.20), Polyhedra_PowerSet.inlines.hh (1.30), Polyhedron.defs.hh
+	  (1.224), algorithms.hh (1.27), globals.hh (1.35),
+	  max_space_dimension.hh (1.1): The function
+	  Parma_Polyhedra_Library::max_space_dimension() has been given a
+	  new semantics and destiny: it returns the maximum space dimension
+	  that _all_ the abstractions provided by the library can handle.
+	  Each individual abstraction provides its versions of this
+	  function.  Thus, e.g., NNC_Polyhedron::max_space_dimension()
+	  gives the maximum space dimensions an NNC_Polyhedron can handle.
+
+2004-04-24 Saturday 08:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.inlines.hh (1.12), Topology.hh (1.9),
+	  initializer.hh (1.8): Comment added.
+
+2004-04-24 Saturday 00:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.32): Pass the C and C++
+	  compilers to plld.
+
+2004-04-23 Friday 18:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.71), ppl_prolog.icc (1.121),
+	  Ciao/ppl_ciao.pl (1.64), GNU/ppl_gprolog.pl (1.43),
+	  SICStus/ppl_sicstus_sd.cc (1.58), SWI/ppl_swiprolog.cc (1.82),
+	  XSB/ppl_xsb.H (1.30), XSB/ppl_xsb.cc (1.47), YAP/ppl_yap.cc
+	  (1.76): Minimize and maximize with generator point predicates
+	  added.
+
+2004-04-23 Friday 16:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.63): Interface definitions
+	  for the banner predicate corrected.
+
+2004-04-23 Friday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.46): Temporary, kludgy
+	  definitions for `bool Prolog_has_unbounded_integers' and `long
+	  Prolog_max_integer'.	Comments added.
+
+2004-04-23 Friday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.21),
+	  GNU/ppl_gprolog_sd.cc (1.15), SICStus/ppl_sicstus_sd.cc (1.57),
+	  SWI/ppl_swiprolog.cc (1.81), YAP/ppl_yap.cc (1.75): Define `bool
+	  Prolog_has_unbounded_integers' and `long Prolog_max_integer'.
+	  Comments added.
+
+2004-04-23 Friday 11:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.70), ppl_prolog.icc (1.120),
+	  Ciao/ppl_ciao.pl (1.62), GNU/ppl_gprolog.pl (1.42),
+	  SICStus/ppl_sicstus_sd.cc (1.56), SWI/ppl_swiprolog.cc (1.80),
+	  XSB/ppl_xsb.H (1.29), XSB/ppl_xsb.cc (1.45), YAP/ppl_yap.cc
+	  (1.74): ppl_banner added. pl_check revised so that check_all
+	  calls for checks on all recently added predicates.
+
+2004-04-23 Friday 09:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.119), Ciao/Makefile.am
+	  (1.23), GNU/Makefile.am (1.33), SICStus/Makefile.am (1.39),
+	  SWI/Makefile.am (1.31), XSB/Makefile.am (1.18), YAP/Makefile.am
+	  (1.25): Follow our programming conventions concerning code
+	  formatting.  Do not include "version.hh.in": include "version.hh"
+	  instead.
+
+2004-04-23 Friday 07:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.61): Ciao interface for the
+	  additional ppl predicates corrected.
+
+2004-04-22 Thursday 12:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.69), ppl_prolog.icc (1.118),
+	  Ciao/ppl_ciao.pl (1.60), GNU/ppl_gprolog.pl (1.41),
+	  SICStus/ppl_sicstus_sd.cc (1.55), SWI/ppl_swiprolog.cc (1.79),
+	  XSB/ppl_xsb.H (1.28), XSB/ppl_xsb.cc (1.44), YAP/ppl_yap.cc
+	  (1.73): Added version predicates and maximum dimension predicate.
+
+2004-04-22 Thursday 07:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.68), ppl_prolog.icc (1.117),
+	  Ciao/ppl_ciao.pl (1.59), GNU/ppl_gprolog.pl (1.40),
+	  SICStus/ppl_sicstus_sd.cc (1.54), SWI/ppl_swiprolog.cc (1.78),
+	  XSB/ppl_xsb.H (1.27), XSB/ppl_xsb.cc (1.43), YAP/ppl_yap.cc
+	  (1.72): Added predicates ppl_Polyhedron_maximize/5 and
+	  ppl_Polyhedron_minimize/5.  A second version of the same
+	  predicates with 6 arguments is still needed.
+
+2004-04-21 Wednesday 15:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.37), exceptions2.cc (1.31): We were not
+	  flagging as errors the cases where an exception that must be
+	  thrown is not thrown.
+
+2004-04-21 Wednesday 14:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.68): Remember to explain how to use the Intel C/C++
+	  compiler.
+
+2004-04-21 Wednesday 14:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.195), exceptions3.cc (1.1): New test
+	  program: this shows that we are not checking against attempts of
+	  building polyhedra with a dimension greater than
+	  max_space_dimension() (which results in violated assertions and
+	  who knows what other nasty things).
+
+2004-04-21 Wednesday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.36), exceptions2.cc (1.30): Comment
+	  improved.
+
+2004-04-21 Wednesday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: bgp99extrapolation1.cc (1.3), bhz03widening1.cc (1.4),
+	  bhz03widening2.cc (1.4), dualhypercubes.cc (1.4): Avoid defining
+	  things in the global namespace.
+
+2004-04-21 Wednesday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.26): The function check_containment(const
+	  PH&, const Polyhedra_PowerSet<PH>&s) is now declared before being
+	  defined.
+
+2004-04-21 Wednesday 08:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.100): Use the `%u' conversion specifier
+	  (not `%d') for the conversion of an object of type
+	  ppl_dimension_type.
+
+2004-04-21 Wednesday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.26): Unused SWIG stuff removed.
+
+2004-04-19 Monday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.67): Fixed Matrix::permute_columns().
+
+2004-04-19 Monday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.89): Avoid useless parentheses.
+
+2004-04-19 Monday 14:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.194), mapdim3.cc (1.1): New test for
+	  Polyhedron::map_dimensions().
+
+2004-04-19 Monday 08:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.88): Comment improved.
+
+2004-04-19 Monday 08:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/mapdim2.cc (1.2): Add some variety in the tested
+	  conditions.
+
+2004-04-19 Monday 08:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.84), src/Polyhedron.inlines.hh (1.87): The method
+	  Polyhedron::map_dimensions(const PartialFunction& pfunc) has been
+	  significantly optimized for the case when `pfunc' is a
+	  permutation.	A simple "renaming" of the dimensions is now
+	  extremely cheap.
+
+2004-04-18 Sunday 21:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.66), Matrix.defs.hh (1.54): Added
+	  Matrix::permute_columns().
+
+2004-04-18 Sunday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.18): Spacing fixes in comments.
+
+2004-04-18 Sunday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.20): Two messages fixed in
+	  Polyhedron::OK().
+
+2004-04-17 Saturday 23:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.65): Matrix::swap_columns() improved.  Be
+	  consistent in variable names.
+
+2004-04-17 Saturday 20:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.defs.hh (1.76): Mathematical objects whose name is more
+	  than one character long are typeset in Roman.
+
+2004-04-17 Saturday 19:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.124): Mathematical objects whose name is
+	  more than one character long are typeset in Roman.  Fixed two
+	  other font mistakes.
+
+2004-04-17 Saturday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.193): Put more things in the convenience
+	  library `libppl_tests'.
+
+2004-04-17 Saturday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.192), mapdim2.cc (1.1): New test for
+	  Polyhedron::map_dimensions().
+
+2004-04-16 Friday 16:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.191), boundedh79extrapolation1.cc (1.1):
+	  Test Polyhedron::bounded_H79_extrapolation_assign().
+
+2004-04-06 Tuesday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.22), config.sub (1.21), ltmain.sh (1.18),
+	  Watchdog/config.guess (1.6), Watchdog/config.sub (1.6),
+	  Watchdog/ltmain.sh (1.7): Updated from libtool-1.5.4.
+
+2004-03-06 Saturday 09:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.67), src/ConSys.defs.hh (1.81), src/GenSys.defs.hh
+	  (1.94), src/LinExpression.defs.hh (1.63), src/Matrix.defs.hh
+	  (1.53): Matrix::ascii_dump(), Matrix::ascii_load(),
+	  LinExpression::~LinExpression(), Matrix::~Matrix(),
+	  ConSys::~ConSys(), GenSys::~GenSys() and
+	  ConSys::const_iterator::~const_iterator() are no longer virtual.
+
+2004-03-04 Thursday 07:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.86):
+	  Constraint::Constraint(LinExpression& e) made explicit.
+
+2004-02-25 Wednesday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.66): Added a (monster) configure command line to compile
+	  with Comeau C/C++ compiler.
+
+2004-02-25 Wednesday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.65): Started adding instructions on how to compile with
+	  other C++ compilers.
+
+2004-02-24 Tuesday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.25): Fixed the comments for
+	  ppl_Polyhedron_minimize() and ppl_Polyhedron_maximize().
+
+2004-02-22 Sunday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.20), AskTell.inlines.hh (1.21):
+	  AskTell<CS>::add_constraints() now takes a ConSys by const
+	  reference.
+
+2004-02-22 Sunday 18:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.29): Avoid making
+	  unnecessary copies.
+
+2004-02-22 Sunday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron_public.cc (1.19), Polyhedron_widenings.cc
+	  (1.15): Use the add_recycled_*() methods whenever necessary or
+	  desirable.
+
+2004-02-22 Sunday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.8), NNC_Polyhedron.cc (1.12),
+	  Polyhedra_PowerSet.inlines.hh (1.28), Polyhedron_public.cc
+	  (1.18), Polyhedron_widenings.cc (1.14): Use the add_recycled_*()
+	  methods whenever necessary or desirable.
+
+2004-02-22 Sunday 17:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.99): The function snprintf() is not in
+	  standard C++: use sprintf() instead, but play safely anyway.
+
+2004-02-22 Sunday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.24): Non-standard trailing comma
+	  removed from enumeration.
+
+2004-02-22 Sunday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.98): Meaningless type qualifiers
+	  removed.
+
+2004-02-22 Sunday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.83), TODO (1.64), interfaces/C/ppl_c.cc (1.97),
+	  interfaces/C/ppl_c.h.in (1.23), src/Polyhedron.defs.hh (1.223),
+	  src/Polyhedron_public.cc (1.17): The methods void
+	  Polyhedron::add_constraints(ConSys& cs), void
+	  Polyhedron::add_generators(GenSys& gs), bool
+	  Polyhedron::add_constraints_and_minimize(ConSys& cs), and bool
+	  Polyhedron::add_generators_and_minimize(GenSys& gs) have been
+	  renamed void Polyhedron::add_recycled_constraints(ConSys& cs),
+	  void Polyhedron::add_recycled_generators(GenSys& gs), bool
+	  Polyhedron::add_recycled_constraints_and_minimize(ConSys& cs),
+	  and bool Polyhedron::add_recycled_generators_and_minimize(GenSys&
+	  gs), respectively. At the same time, the methods void
+	  Polyhedron::add_constraints(const ConSys& cs), void
+	  Polyhedron::add_generators(const GenSys& gs), bool
+	  Polyhedron::add_constraints_and_minimize(const ConSys& cs), and
+	  bool Polyhedron::add_generators_and_minimize(const GenSys& gs)
+	  have been added. Corresponding changes have been made to the C
+	  interface.
+
+2004-02-22 Sunday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.rpath (1.2): Support Comeau's C/C++ compiler.
+
+2004-02-16 Monday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.defs.hh (1.75): Comments fixed.
+
+2004-02-12 Thursday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.52), Matrix.inlines.hh (1.36): Do not put
+	  code into files named *.defs.hh.
+
+2004-02-09 Monday 08:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.27): All names that are not
+	  dependent on template parameters are bound to their present
+	  definitions when parsing a template function or class: make sure
+	  elements of the base class are correctly referred to.
+
+2004-02-08 Sunday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.110): Fixed some error messages.
+
+2004-02-08 Sunday 21:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/AskTell.inlines.hh (1.20): Missing `typename' added.
+
+2004-02-06 Friday 11:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.109): Disable the interface/OCaml directory, for
+	  the time being.
+
+2004-02-05 Thursday 22:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.9): Ignore the OCaml subdirectory, for
+	  the time being.
+
+2004-02-05 Thursday 22:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.108): Version number bumped.
+
+2004-02-05 Thursday 21:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.96): Output functions fixed.
+
+2004-02-05 Thursday 21:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.95), ppl_c.h.in (1.22): New functions
+	  ppl_io_print_variable() and ppl_io_fprint_variable().
+
+2004-02-05 Thursday 21:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.82), interfaces/C/ppl_c.cc (1.94), src/Variable.cc
+	  (1.16), src/Variable.defs.hh (1.36), src/Variable.inlines.hh
+	  (1.18), tests/writevariable1.cc (1.10):
+	  Variable::Output_Function_Type renamed
+	  Variable::output_function_type.
+
+2004-02-05 Thursday 20:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.93): cxx_Variable_output_function()
+	  partly fixed.
+
+2004-02-05 Thursday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variable.defs.hh (1.35): Comment corrected.
+
+2004-02-05 Thursday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.92), ppl_c.h.in (1.21): New functions
+	  ppl_io_set_variable_output_function() and
+	  ppl_io_get_variable_output_function().
+
+2004-02-05 Thursday 19:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.91): Implemented most of the machinery
+	  allowing the user to select its preferred output function for
+	  Variable objects,
+
+2004-02-05 Thursday 16:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.20): Make Doxygen comments uniformly
+	  brief.
+
+2004-02-05 Thursday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.7): Add `-I../C' to
+	  libppl_ocaml_c_la_CPPFLAGS.
+
+2004-02-05 Thursday 14:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.90), ppl_c.h.in (1.19): Documentation
+	  improvements.
+
+2004-02-05 Thursday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: user-browse.doxyconf-latex.in (1.19),
+	  user-print.doxyconf-latex.in (1.19), user.doxyconf-html.in
+	  (1.21): Add PPL_DECLARE_PRINT_FUNCTIONS to EXPAND_AS_DEFINED.
+
+2004-02-05 Thursday 14:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.18): Make sure not to leave
+	  unnecessary preprocessor symbols behind.
+
+2004-02-05 Thursday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.89), ppl_c.h.in (1.17): A first,
+	  tentative implementation of the new print functions.	New error
+	  codes PPL_STDIO_ERROR and PPL_ARITHMETIC_OVERFLOW.
+
+2004-02-05 Thursday 09:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.16): Added a kludge to make the
+	  documentation on how to use the C interface easier to find.
+
+2004-02-04 Wednesday 18:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.15): A couple of corrections to the
+	  usage instructions.
+
+2004-02-04 Wednesday 18:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_c.h.in (1.14): Corrections to the explanation on
+	  using the C interface done.
+
+2004-02-04 Wednesday 18:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.13): Two minor fixes.
+
+2004-02-04 Wednesday 16:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_c.h.in (1.12): The comment on how to use the C
+	  interface revised.
+
+2004-02-04 Wednesday 14:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.11): Documentation on how to use the C
+	  interface finished (for the time being, at least).
+
+2004-02-04 Wednesday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.10): Finished the section on linking.
+
+2004-02-04 Wednesday 12:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.9): Started explaining how to link.
+
+2004-02-04 Wednesday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.8): Better explained how to use the -I
+	  (or similar) compiler option.
+
+2004-02-04 Wednesday 11:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.7): Finished dealing with version
+	  checking.
+
+2004-02-03 Tuesday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.6): Fix thinko in Doxygen's comments.
+
+2004-02-03 Tuesday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/version.cc (1.4): Put new functions into the PPL namespace.
+
+2004-02-03 Tuesday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.88), ppl_c.h.in (1.5): New functions:
+	  ppl_version_major(), ppl_version_minor(), ppl_version_revision(),
+	  and ppl_version_beta().
+
+2004-02-03 Tuesday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: version.cc (1.3), version.hh.in (1.7): New functions:
+	  version_major(), version_minor(), version_revision(), and
+	  version_beta().
+
+2004-02-03 Tuesday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.107): Some vertical space added.
+
+2004-02-03 Tuesday 14:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.4): New macro PPL_VERSION added.
+
+2004-02-03 Tuesday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.3): Started dealing with version
+	  checking.
+
+2004-02-03 Tuesday 09:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: Makefile.am (1.16), ppl_c.cc (1.87), ppl_c.h.in
+	  (1.2): New C interface functions ppl_version() and ppl_banner().
+
+2004-02-03 Tuesday 09:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/version.hh.in (1.6): Tell emacs that this is C++.
+
+2004-02-03 Tuesday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.106), doc/Makefile.am (1.25),
+	  doc/devref-browse.doxyconf-latex.in (1.35),
+	  doc/devref-print.doxyconf-latex.in (1.35),
+	  doc/devref.doxyconf-html.in (1.36),
+	  doc/user-browse.doxyconf-latex.in (1.18),
+	  doc/user-print.doxyconf-latex.in (1.18),
+	  doc/user.doxyconf-html.in (1.20), interfaces/C/ppl_c.h (1.100),
+	  interfaces/C/ppl_c.h.in (1.1), interfaces/OCaml/Makefile.am
+	  (1.6): The C interface's header file `ppl_c.h' is now generated
+	  at configuration time from `ppl_c.h.in' so as to carry the proper
+	  version information.
+
+2004-02-02 Monday 18:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.86), ppl_c.h (1.99): Now
+	  ppl_initialize() and ppl_finalize() return
+	  PPL_ERROR_INVALID_ARGUMENT if called when they should not.
+
+2004-02-02 Monday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.98): Explain initialization and
+	  finalization in the C interface.
+
+2004-02-02 Monday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.97): Explained what to do in case
+	  `#include <ppl_c.h>' seems not to work.  Explained what opaque
+	  data types are and why we use them.
+
+2004-02-01 Sunday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.96): Explain the usage of the header file
+	  for the C interface and its name space.
+
+2004-02-01 Sunday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: gpl.dox (1.6), gpl.tex (1.2): Avoid excessive
+	  capitalization.
+
+2004-02-01 Sunday 09:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.tex (1.13), fdl.dox (1.6), fdl.tex (1.2), user.tex
+	  (1.14): The documentation is now distributed under the terms of
+	  version 1.2 of the GNU Free Documentation License.
+
+2004-01-28 Wednesday 18:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/.cvsignore (1.2): Updated.
+
+2004-01-28 Wednesday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.5): Seriously hacked so that
+	  files are created in the right places.
+
+2004-01-28 Wednesday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/gmp.h (1.1): Hacked version of the main C header
+	  file of GMP 4.1.2.  This is to get around some bugs and
+	  limitations of SWIG 1.3.21.
+
+2004-01-28 Wednesday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.8), Watchdog/README (1.6),
+	  Watchdog/Watchdog.cc (1.14), Watchdog/Watchdog.defs.hh (1.12),
+	  Watchdog/Watchdog.inlines.hh (1.10), Watchdog/Watchdog.types.hh
+	  (1.5), Watchdog/configure.ac (1.19), Watchdog/pwl_header.top
+	  (1.4), doc/devref.tex (1.12), doc/ppl.sty (1.13), doc/user.tex
+	  (1.13), interfaces/Prolog/XSB/ppl_xsb.H (1.26),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.42): Update copyright years.
+
+2004-01-27 Tuesday 23:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.23), README (1.17), configure.ac (1.105),
+	  doc/Makefile.am (1.24), doc/definitions.dox (1.123),
+	  interfaces/Makefile.am (1.8), interfaces/C/Makefile.am (1.15),
+	  interfaces/C/ppl_c.cc (1.85), interfaces/C/ppl_c.h (1.95),
+	  interfaces/OCaml/Makefile.am (1.4),
+	  interfaces/OCaml/ppl_ocaml_c.swg (1.2),
+	  interfaces/Prolog/Makefile.am (1.24),
+	  interfaces/Prolog/Prolog_interface.dox (1.107),
+	  interfaces/Prolog/clpq.pl (1.15), interfaces/Prolog/clpq2.pl
+	  (1.26), interfaces/Prolog/exceptions.hh (1.8),
+	  interfaces/Prolog/expected (1.6), interfaces/Prolog/expected2
+	  (1.11), interfaces/Prolog/pl_check.pl (1.67),
+	  interfaces/Prolog/ppl_prolog.icc (1.116),
+	  interfaces/Prolog/track_allocation.hh (1.13),
+	  interfaces/Prolog/Ciao/Makefile.am (1.22),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.8),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.3),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.20),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.58),
+	  interfaces/Prolog/GNU/Makefile.am (1.32),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.2),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.7),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.39),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.14),
+	  interfaces/Prolog/SICStus/Makefile.am (1.38),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.23),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.53),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.3),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.4),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.7),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.9),
+	  interfaces/Prolog/SWI/Makefile.am (1.30),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.7),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.5),
+	  interfaces/Prolog/SWI/ppl_pl.cc (1.7),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.77),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.3),
+	  interfaces/Prolog/XSB/Makefile.am (1.17),
+	  interfaces/Prolog/XSB/expected (1.7),
+	  interfaces/Prolog/XSB/expected2 (1.9),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.41),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.8),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.6),
+	  interfaces/Prolog/YAP/Makefile.am (1.24),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.71),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.7),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.7),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.3),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.3), m4/Makefile.am
+	  (1.10), m4/ac_check_gmp.m4 (1.16), m4/ac_cxx_attribute_weak.m4
+	  (1.3), m4/ac_cxx_flexible_arrays.m4 (1.8), src/AskTell.defs.hh
+	  (1.19), src/AskTell.inlines.hh (1.19), src/AskTell.types.hh
+	  (1.6), src/BoundingBox.cc (1.8), src/BoundingBox.defs.hh (1.11),
+	  src/BoundingBox.inlines.hh (1.11), src/BoundingBox.types.hh
+	  (1.6), src/C_Polyhedron.cc (1.7), src/C_Polyhedron.defs.hh
+	  (1.20), src/C_Polyhedron.inlines.hh (1.14),
+	  src/C_Polyhedron.types.hh (1.7), src/ConSys.cc (1.67),
+	  src/ConSys.defs.hh (1.80), src/ConSys.inlines.hh (1.31),
+	  src/ConSys.types.hh (1.7), src/Constraint.cc (1.40),
+	  src/Constraint.defs.hh (1.85), src/Constraint.inlines.hh (1.48),
+	  src/Constraint.types.hh (1.7), src/Determinate.defs.hh (1.35),
+	  src/Determinate.inlines.hh (1.36), src/Determinate.types.hh
+	  (1.5), src/GenSys.cc (1.85), src/GenSys.defs.hh (1.93),
+	  src/GenSys.inlines.hh (1.32), src/GenSys.types.hh (1.7),
+	  src/Generator.cc (1.48), src/Generator.defs.hh (1.85),
+	  src/Generator.inlines.hh (1.42), src/Generator.types.hh (1.7),
+	  src/Init.cc (1.10), src/Init.defs.hh (1.10), src/Init.types.hh
+	  (1.6), src/Integer.cc (1.4), src/Integer.defs.hh (1.11),
+	  src/Integer.inlines.hh (1.10), src/Integer.types.hh (1.8),
+	  src/Interval.cc (1.9), src/Interval.defs.hh (1.16),
+	  src/Interval.inlines.hh (1.11), src/Interval.types.hh (1.7),
+	  src/LinExpression.cc (1.20), src/LinExpression.defs.hh (1.62),
+	  src/LinExpression.inlines.hh (1.29), src/LinExpression.types.hh
+	  (1.7), src/Makefile.am (1.68), src/Matrix.cc (1.64),
+	  src/Matrix.defs.hh (1.51), src/Matrix.inlines.hh (1.35),
+	  src/Matrix.types.hh (1.7), src/NNC_Polyhedron.cc (1.11),
+	  src/NNC_Polyhedron.defs.hh (1.23), src/NNC_Polyhedron.inlines.hh
+	  (1.16), src/NNC_Polyhedron.types.hh (1.7), src/Ph_Status.cc
+	  (1.4), src/Ph_Status.idefs.hh (1.4), src/Ph_Status.inlines.hh
+	  (1.4), src/Poly_Con_Relation.cc (1.8),
+	  src/Poly_Con_Relation.defs.hh (1.23),
+	  src/Poly_Con_Relation.inlines.hh (1.11),
+	  src/Poly_Con_Relation.types.hh (1.6), src/Poly_Gen_Relation.cc
+	  (1.8), src/Poly_Gen_Relation.defs.hh (1.21),
+	  src/Poly_Gen_Relation.inlines.hh (1.11),
+	  src/Poly_Gen_Relation.types.hh (1.6),
+	  src/Polyhedra_PowerSet.defs.hh (1.19),
+	  src/Polyhedra_PowerSet.inlines.hh (1.26),
+	  src/Polyhedra_PowerSet.types.hh (1.2), src/Polyhedron.defs.hh
+	  (1.222), src/Polyhedron.inlines.hh (1.86),
+	  src/Polyhedron.types.hh (1.10), src/Polyhedron_chdims.cc (1.8),
+	  src/Polyhedron_nonpublic.cc (1.17), src/Polyhedron_public.cc
+	  (1.16), src/Polyhedron_widenings.cc (1.13), src/PowerSet.defs.hh
+	  (1.46), src/PowerSet.inlines.hh (1.55), src/PowerSet.types.hh
+	  (1.6), src/Row.cc (1.60), src/Row.defs.hh (1.74),
+	  src/Row.inlines.hh (1.42), src/Row.types.hh (1.7),
+	  src/SatMatrix.cc (1.28), src/SatMatrix.defs.hh (1.33),
+	  src/SatMatrix.inlines.hh (1.21), src/SatMatrix.types.hh (1.7),
+	  src/SatRow.cc (1.22), src/SatRow.defs.hh (1.32),
+	  src/SatRow.inlines.hh (1.28), src/SatRow.types.hh (1.7),
+	  src/Topology.hh (1.8), src/Variable.cc (1.15),
+	  src/Variable.defs.hh (1.34), src/Variable.inlines.hh (1.17),
+	  src/Variable.types.hh (1.7), src/algorithms.hh (1.25),
+	  src/conversion.cc (1.51), src/globals.cc (1.13), src/globals.hh
+	  (1.34), src/initializer.hh (1.7), src/minimize.cc (1.35),
+	  src/ppl_header.top (1.7), src/simplify.cc (1.33),
+	  src/statistics.hh (1.3), src/version.cc (1.2), src/version.hh.in
+	  (1.5), tests/BBox.cc (1.4), tests/BBox.hh (1.3),
+	  tests/CbecomesNNC1.cc (1.5), tests/Makefile.am (1.190),
+	  tests/NNCminimize1.cc (1.10), tests/NNCminimize2.cc (1.10),
+	  tests/NNCminimize3.cc (1.10), tests/NNCminimize4.cc (1.12),
+	  tests/NNCminimize5.cc (1.9), tests/NNCminimize6.cc (1.11),
+	  tests/PFunction.cc (1.3), tests/PFunction.hh (1.3),
+	  tests/addconstraint1.cc (1.5), tests/addconstraint2.cc (1.4),
+	  tests/addconstraint3.cc (1.4), tests/addconstraints1.cc (1.11),
+	  tests/addconstraints10.cc (1.10), tests/addconstraints11.cc
+	  (1.11), tests/addconstraints12.cc (1.4),
+	  tests/addconstraints13.cc (1.6), tests/addconstraints2.cc (1.19),
+	  tests/addconstraints3.cc (1.9), tests/addconstraints4.cc (1.11),
+	  tests/addconstraints5.cc (1.12), tests/addconstraints6.cc (1.13),
+	  tests/addconstraints7.cc (1.12), tests/addconstraints8.cc (1.12),
+	  tests/addconstraints9.cc (1.13), tests/adddimensions1.cc (1.14),
+	  tests/adddimensions10.cc (1.7), tests/adddimensions11.cc (1.5),
+	  tests/adddimensions12.cc (1.4), tests/adddimensions13.cc (1.3),
+	  tests/adddimensions2.cc (1.10), tests/adddimensions3.cc (1.12),
+	  tests/adddimensions4.cc (1.10), tests/adddimensions5.cc (1.8),
+	  tests/adddimensions6.cc (1.8), tests/adddimensions7.cc (1.8),
+	  tests/adddimensions8.cc (1.6), tests/adddimensions9.cc (1.7),
+	  tests/addgenerator1.cc (1.5), tests/addgenerator2.cc (1.5),
+	  tests/addgenerator3.cc (1.4), tests/addgenerator4.cc (1.5),
+	  tests/addgenerators1.cc (1.12), tests/addgenerators10.cc (1.4),
+	  tests/addgenerators11.cc (1.6), tests/addgenerators12.cc (1.6),
+	  tests/addgenerators13.cc (1.2), tests/addgenerators2.cc (1.12),
+	  tests/addgenerators3.cc (1.12), tests/addgenerators4.cc (1.12),
+	  tests/addgenerators5.cc (1.12), tests/addgenerators6.cc (1.12),
+	  tests/addgenerators7.cc (1.9), tests/addgenerators8.cc (1.7),
+	  tests/addgenerators9.cc (1.6), tests/affineimage1.cc (1.12),
+	  tests/affineimage2.cc (1.11), tests/affineimage3.cc (1.4),
+	  tests/affineimage4.cc (1.4), tests/affineimage5.cc (1.5),
+	  tests/affineimage6.cc (1.4), tests/affineimage7.cc (1.4),
+	  tests/affineimage8.cc (1.8), tests/affinepreimage1.cc (1.11),
+	  tests/affinepreimage10.cc (1.8), tests/affinepreimage2.cc (1.11),
+	  tests/affinepreimage3.cc (1.11), tests/affinepreimage4.cc (1.12),
+	  tests/affinepreimage5.cc (1.4), tests/affinepreimage6.cc (1.5),
+	  tests/affinepreimage7.cc (1.4), tests/affinepreimage8.cc (1.4),
+	  tests/affinepreimage9.cc (1.5), tests/affinetrans.cc (1.14),
+	  tests/append1.cc (1.22), tests/append2.cc (1.22),
+	  tests/ascii_dump_load1.cc (1.13), tests/ascii_dump_load2.cc
+	  (1.11), tests/ascii_dump_load3.cc (1.14),
+	  tests/ascii_dump_load4.cc (1.14), tests/ascii_dump_load5.cc
+	  (1.10), tests/ascii_dump_load6.cc (1.7),
+	  tests/ascii_dump_load7.cc (1.7), tests/bgp99extrapolation1.cc
+	  (1.2), tests/bhrz03widening1.cc (1.4), tests/bhrz03widening10.cc
+	  (1.4), tests/bhrz03widening11.cc (1.4), tests/bhrz03widening12.cc
+	  (1.4), tests/bhrz03widening13.cc (1.4), tests/bhrz03widening14.cc
+	  (1.4), tests/bhrz03widening15.cc (1.6), tests/bhrz03widening16.cc
+	  (1.4), tests/bhrz03widening17.cc (1.4), tests/bhrz03widening18.cc
+	  (1.4), tests/bhrz03widening19.cc (1.4), tests/bhrz03widening2.cc
+	  (1.6), tests/bhrz03widening3.cc (1.6), tests/bhrz03widening4.cc
+	  (1.4), tests/bhrz03widening5.cc (1.4), tests/bhrz03widening6.cc
+	  (1.5), tests/bhrz03widening7.cc (1.5), tests/bhrz03widening8.cc
+	  (1.4), tests/bhrz03widening9.cc (1.6), tests/bhz03widening1.cc
+	  (1.3), tests/bhz03widening2.cc (1.3), tests/bounded1.cc (1.13),
+	  tests/boundingbox1.cc (1.33), tests/boundingbox2.cc (1.18),
+	  tests/boundingbox3.cc (1.9), tests/boundingbox4.cc (1.6),
+	  tests/bounds1.cc (1.6), tests/bounds2.cc (1.6),
+	  tests/concatenate1.cc (1.8), tests/concatenate2.cc (1.8),
+	  tests/concatenate3.cc (1.7), tests/concatenate4.cc (1.6),
+	  tests/concatenate5.cc (1.4), tests/concatenate6.cc (1.6),
+	  tests/constraints1.cc (1.6), tests/constraints2.cc (1.6),
+	  tests/constraints3.cc (1.6), tests/constraints4.cc (1.6),
+	  tests/contains1.cc (1.5), tests/contains2.cc (1.2),
+	  tests/contains3.cc (1.2), tests/contains4.cc (1.2),
+	  tests/contains5.cc (1.2), tests/disjoint1.cc (1.7),
+	  tests/disjoint2.cc (1.8), tests/disjoint3.cc (1.7),
+	  tests/dualhypercubes.cc (1.3), tests/ehandlers.cc (1.5),
+	  tests/ehandlers.hh (1.8), tests/empty1.cc (1.14),
+	  tests/exceptions1.cc (1.35), tests/exceptions2.cc (1.29),
+	  tests/files.cc (1.5), tests/files.hh (1.5),
+	  tests/generalizedaffineimage1.cc (1.8),
+	  tests/generalizedaffineimage10.cc (1.7),
+	  tests/generalizedaffineimage11.cc (1.6),
+	  tests/generalizedaffineimage12.cc (1.5),
+	  tests/generalizedaffineimage2.cc (1.7),
+	  tests/generalizedaffineimage3.cc (1.8),
+	  tests/generalizedaffineimage4.cc (1.6),
+	  tests/generalizedaffineimage5.cc (1.6),
+	  tests/generalizedaffineimage6.cc (1.6),
+	  tests/generalizedaffineimage7.cc (1.8),
+	  tests/generalizedaffineimage8.cc (1.6),
+	  tests/generalizedaffineimage9.cc (1.6), tests/generators1.cc
+	  (1.13), tests/generators2.cc (1.9), tests/generators3.cc (1.5),
+	  tests/generators4.cc (1.5), tests/generators5.cc (1.5),
+	  tests/generators6.cc (1.6), tests/h79widening1.cc (1.6),
+	  tests/h79widening2.cc (1.7), tests/h79widening3.cc (1.7),
+	  tests/h79widening4.cc (1.4), tests/h79widening5.cc (1.5),
+	  tests/h79widening6.cc (1.5), tests/h79widening7.cc (1.3),
+	  tests/intersection1.cc (1.6), tests/intersection10.cc (1.6),
+	  tests/intersection11.cc (1.6), tests/intersection2.cc (1.10),
+	  tests/intersection3.cc (1.7), tests/intersection4.cc (1.7),
+	  tests/intersection5.cc (1.7), tests/intersection6.cc (1.7),
+	  tests/intersection7.cc (1.6), tests/intersection8.cc (1.5),
+	  tests/intersection9.cc (1.5),
+	  tests/limitedbhrz03extrapolation1.cc (1.3),
+	  tests/limitedh79extrapolation1.cc (1.3),
+	  tests/limitedh79extrapolation2.cc (1.3),
+	  tests/limitedh79extrapolation3.cc (1.3),
+	  tests/limitedh79extrapolation4.cc (1.3),
+	  tests/linearpartition1.cc (1.13), tests/linearpartition2.cc
+	  (1.13), tests/linearpartition3.cc (1.13), tests/linexpression1.cc
+	  (1.4), tests/mapdim1.cc (1.2), tests/max_min1.cc (1.4),
+	  tests/max_min2.cc (1.4), tests/mc91.cc (1.14), tests/memory1.cc
+	  (1.20), tests/minconstraints1.cc (1.5), tests/minconstraints2.cc
+	  (1.5), tests/minconstraints3.cc (1.4), tests/minconstraints4.cc
+	  (1.8), tests/mingenerators1.cc (1.5), tests/mingenerators2.cc
+	  (1.4), tests/mingenerators3.cc (1.4), tests/onepoint.cc (1.10),
+	  tests/permute.cc (1.31), tests/polydifference1.cc (1.7),
+	  tests/polydifference2.cc (1.9), tests/polydifference3.cc (1.4),
+	  tests/polydifference4.cc (1.5), tests/polydifference5.cc (1.6),
+	  tests/polydifference6.cc (1.6), tests/polydifference7.cc (1.5),
+	  tests/polyhull1.cc (1.8), tests/polyhull10.cc (1.4),
+	  tests/polyhull2.cc (1.7), tests/polyhull3.cc (1.7),
+	  tests/polyhull4.cc (1.6), tests/polyhull5.cc (1.5),
+	  tests/polyhull6.cc (1.5), tests/polyhull7.cc (1.4),
+	  tests/polyhull8.cc (1.5), tests/polyhull9.cc (1.6),
+	  tests/ppl_test.hh (1.4), tests/print.cc (1.10), tests/print.hh
+	  (1.14), tests/randphull1.cc (1.10), tests/randphull2.cc (1.6),
+	  tests/relations1.cc (1.10), tests/relations10.cc (1.6),
+	  tests/relations11.cc (1.6), tests/relations12.cc (1.5),
+	  tests/relations13.cc (1.5), tests/relations14.cc (1.5),
+	  tests/relations15.cc (1.5), tests/relations16.cc (1.5),
+	  tests/relations17.cc (1.7), tests/relations18.cc (1.5),
+	  tests/relations19.cc (1.6), tests/relations2.cc (1.11),
+	  tests/relations3.cc (1.11), tests/relations4.cc (1.11),
+	  tests/relations5.cc (1.11), tests/relations6.cc (1.10),
+	  tests/relations7.cc (1.10), tests/relations8.cc (1.10),
+	  tests/relations9.cc (1.12), tests/removedim1.cc (1.11),
+	  tests/removedim10.cc (1.3), tests/removedim2.cc (1.15),
+	  tests/removedim3.cc (1.11), tests/removedim4.cc (1.12),
+	  tests/removedim5.cc (1.10), tests/removedim6.cc (1.13),
+	  tests/removedim7.cc (1.9), tests/removedim8.cc (1.6),
+	  tests/removedim9.cc (1.6), tests/smm1.cc (1.15),
+	  tests/timeelapse1.cc (1.8), tests/timeelapse2.cc (1.8),
+	  tests/timeelapse3.cc (1.8), tests/timeelapse4.cc (1.8),
+	  tests/timeelapse5.cc (1.9), tests/timeelapse6.cc (1.4),
+	  tests/timeelapse7.cc (1.4), tests/timeelapse8.cc (1.5),
+	  tests/timings.cc (1.4), tests/timings.hh (1.4),
+	  tests/topclosed1.cc (1.7), tests/topclosed2.cc (1.6),
+	  tests/topclosed3.cc (1.8), tests/topclosure1.cc (1.7),
+	  tests/topclosure2.cc (1.4), tests/topclosure3.cc (1.4),
+	  tests/topclosure4.cc (1.6), tests/universe1.cc (1.10),
+	  tests/universe2.cc (1.11), tests/universe3.cc (1.11),
+	  tests/universe4.cc (1.11), tests/universe5.cc (1.12),
+	  tests/universe6.cc (1.9), tests/watchdog1.cc (1.18),
+	  tests/writeconsys1.cc (1.7), tests/writegensys1.cc (1.8),
+	  tests/writegensys2.cc (1.8), tests/writegensys3.cc (1.7),
+	  tests/writepolyhedron1.cc (1.7), tests/writepolyhedron2.cc (1.8),
+	  tests/writepolyhedron3.cc (1.7), tests/writerelation1.cc (1.7),
+	  tests/writevariable1.cc (1.9): Update copyright years.
+
+2004-01-27 Tuesday 23:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.3): Some little progress.
+
+2004-01-27 Tuesday 23:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_c.swg (1.2), ppl_ocaml_c.swg (1.1):
+	  Renamed.
+
+2004-01-27 Tuesday 17:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile (1.1), Watchdog/compile (1.1): Added from Automake 1.8.2.
+
+2004-01-26 Monday 19:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.2): Avoid running swig multiple
+	  times.
+
+2004-01-26 Monday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.104), interfaces/Makefile.am (1.7),
+	  interfaces/OCaml/.cvsignore (1.1), interfaces/OCaml/Makefile.am
+	  (1.1): Directory `interfaces/OCaml' activated.
+
+2004-01-26 Monday 16:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.23): It is no longer necessary to specify `-d
+	  Validate' on the Doxygen's command line.
+
+2004-01-26 Monday 09:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.94): Temporarily avoid splitting
+	  preprocessor directives across multiple lines.  This is to get
+	  around a bug in SWIG 1.3.21.
+
+2004-01-26 Monday 08:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.93): Spacing fixed.
+
+2004-01-25 Sunday 23:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_c.swg (1.1): SWIG module declaration for the
+	  OCaml interface to the C interface.
+
+2004-01-25 Sunday 23:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.92): Explain to SWIG how to convert an
+	  OCaml array to a C array plus length.
+
+2004-01-25 Sunday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.67): Avoid repeating the name of the target
+	  file.
+
+2004-01-25 Sunday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* depcomp (1.6), install-sh (1.7), missing (1.7), mkinstalldirs
+	  (1.6), Watchdog/depcomp (1.4), Watchdog/install-sh (1.4),
+	  Watchdog/missing (1.3), Watchdog/mkinstalldirs (1.2): Update from
+	  Automake.
+
+2004-01-25 Sunday 22:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.103): Check for SWIG added.
+
+2004-01-25 Sunday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.21), config.sub (1.20), Watchdog/config.guess
+	  (1.5), Watchdog/config.sub (1.5): Updated from config.
+
+2004-01-25 Sunday 22:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.17), Watchdog/ltmain.sh (1.6): Updated from Libtool
+	  1.5.2.
+
+2004-01-23 Friday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.221): Implement a new method to
+	  differentiate between the inclusion of Ph_Status.idefs.hh and the
+	  inclusion of all other header files.	This gets around a bug in
+	  doxygen.
+
+2004-01-23 Friday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.220): Documentation for
+	  Polyhedron::max_min() fixed.
+
+2004-01-21 Wednesday 13:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/dualhypercubes.cc (1.2): Corrected an error and made
+	  silent.
+
+2004-01-20 Tuesday 08:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.189), dualhypercubes.cc (1.1): Put under
+	  CVS control.
+
+2003-12-19 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ppl_header.bottom (1.5), ppl_header.top (1.6): Include
+	  <cassert> after restoring the status of NDEBUG: this should
+	  finally solve the NDEBUG problem.
+
+2003-12-17 Wednesday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.middle (1.3): GCC versions prior to 3.0 are no
+	  longer supported.
+
+2003-12-15 Monday 23:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.63): See if we can provide some guarantee on the maximum
+	  number of times we are calling the methods of the argument of
+	  Polyhedron::map_dimensions(const PartialFunction&).
+
+2003-12-05 Friday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.13): Do not use the ITIMER_PROF timer
+	  when profiling.
+
+2003-12-05 Friday 11:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.102): Define the symbol `PROFILING' when
+	  profiling is enabled.
+
+2003-12-04 Thursday 10:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.34),
+	  devref-print.doxyconf-latex.in (1.34), devref.doxyconf-html.in
+	  (1.35): The source files for the Status class are now called
+	  Ph_Status.*.
+
+2003-12-02 Tuesday 21:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: lib-ld.m4 (1.2), lib-prefix.m4 (1.2): Updated from gettext
+	  0.13.
+
+2003-11-19 Wednesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.62): Remember to implement void
+	  Polyhedron::envelope_assign(const Polyhedron& y).
+
+2003-11-12 Wednesday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.22), acinclude.m4 (1.6): Implement a much simpler
+	  way of telling aclocal where to look for `.m4' files (in
+	  addition, `sinclude', which we used in `acinclude.m4', is an
+	  obsolete name for `m4_include').
+
+2003-11-09 Sunday 00:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.hh (1.33): Comment for compute_capacity() improved.
+	  Added an alternative implementation (commented out) characterized
+	  a speculation factor of 1.5.
+
+2003-11-07 Friday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.defs.hh (1.73): Including Integer.types.hh is not enough:
+	  include Integer.defs.hh.
+
+2003-11-04 Tuesday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.20), config.sub (1.19), Watchdog/config.guess
+	  (1.4), Watchdog/config.sub (1.4): Updated.
+
+2003-10-30 Thursday 21:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ph_Status.cc (1.3), Polyhedron_public.cc (1.15): OK()
+	  methods must print their own error messages (unless NDEBUG is
+	  defined).
+
+2003-10-29 Wednesday 06:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.15): In case libgmp and libgmpxx are
+	  installed in the same location, allow to specify the prefix for
+	  either one, the other being set automatically.
+
+2003-10-29 Wednesday 06:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_attribute_weak.m4 (1.2), ac_cxx_flexible_arrays.m4
+	  (1.7): Preserve CPPFLAGS.
+
+2003-10-28 Tuesday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.101), interfaces/C/Makefile.am (1.14),
+	  interfaces/Prolog/Ciao/Makefile.am (1.21),
+	  interfaces/Prolog/GNU/Makefile.am (1.31),
+	  interfaces/Prolog/SICStus/Makefile.am (1.37),
+	  interfaces/Prolog/SWI/Makefile.am (1.29),
+	  interfaces/Prolog/XSB/Makefile.am (1.16),
+	  interfaces/Prolog/YAP/Makefile.am (1.23), src/Makefile.am (1.66),
+	  tests/Makefile.am (1.188): Got rid of extra_cpp_flags (was used
+	  nowhere).
+
+2003-10-27 Monday 22:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.8), NEWS (1.81), TODO (1.61), acinclude.m4 (1.5),
+	  config.rpath (1.1), m4/ac_check_gmp.m4 (1.14), m4/lib-ld.m4
+	  (1.1), m4/lib-link.m4 (1.1), m4/lib-prefix.m4 (1.1): Thanks to
+	  Bruno Haible, it is now possible to use versions of the GMP
+	  library installed into nonstandard places.
+
+2003-10-27 Monday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ph_Status.idefs.hh (1.3), Ph_Status.inlines.hh (1.3): Some
+	  useless code removed.
+
+2003-10-27 Monday 09:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ph_Status.cc (1.2), Ph_Status.idefs.hh (1.2),
+	  Ph_Status.inlines.hh (1.2): Comments fixed.
+
+2003-10-27 Monday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.65), Ph_Status.cc (1.1), Ph_Status.idefs.hh
+	  (1.1), Ph_Status.inlines.hh (1.1), Polyhedron.defs.hh (1.219),
+	  Status.cc (1.22), Status.defs.hh (1.30), Status.inlines.hh
+	  (1.15), Status.types.hh (1.7): The Status class is now a private
+	  member of class Polyhedron.
+
+2003-10-26 Sunday 18:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Status.defs.hh (1.29), Status.inlines.hh (1.14): Pass
+	  objects of type Status by value.
+
+2003-10-16 Thursday 17:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/polyhull1.cc (1.7): Debug message improved.
+
+2003-10-13 Monday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.59): Comment fixed.
+
+2003-10-06 Monday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.60), tests/h79widening6.cc (1.4): h79widening6.cc
+	  temporarily fixed, but must be turned into a proper test.
+
+2003-10-04 Saturday 22:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.58): Revert previous change.
+
+2003-10-04 Saturday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.57): Avoid including <iostream>.
+
+2003-10-03 Friday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.7), Watchdog/.cvsignore (1.4): Ignore config.h.in.
+
+2003-10-03 Friday 09:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.26), Watchdog/config.h.in (1.4): These should not
+	  be in the repository, since they are automatically generated.
+
+2003-09-23 Tuesday 10:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.33),
+	  devref-print.doxyconf-latex.in (1.33), devref.doxyconf-html.in
+	  (1.34), user-browse.doxyconf-latex.in (1.17),
+	  user-print.doxyconf-latex.in (1.17), user.doxyconf-html.in
+	  (1.19): Updated for Doxygen 1.3.4.
+
+2003-09-10 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.19), config.h.in (1.25), config.sub (1.18),
+	  depcomp (1.5), install-sh (1.6), missing (1.6),
+	  Watchdog/config.guess (1.3), Watchdog/config.sub (1.3),
+	  Watchdog/depcomp (1.3), Watchdog/install-sh (1.3),
+	  Watchdog/missing (1.2): Updated.
+
+2003-09-10 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Variable.cc (1.14), Variable.defs.hh (1.33): Pass variables
+	  by const reference for uniformity.
+
+2003-09-01 Monday 23:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.54):
+	  PowerSet<CS>::check_omega_reduced() fixed: now it return false if
+	  a bottom element is encountered (even in a singleton).
+
+2003-09-01 Monday 23:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.53): Modified
+	  PowerSet<CS>::omega_reduce() so that all bottom elements are
+	  removed first.
+
+2003-09-01 Monday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.24): Use Polyhedra_PowerSet<PH>::empty()
+	  instead of Polyhedra_PowerSet<PH>::is_bottom().
+
+2003-09-01 Monday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.18): Useless using declarations
+	  removed.
+
+2003-09-01 Monday 20:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.45), PowerSet.inlines.hh (1.52): Method
+	  bool PowerSet<CS>::empty() const added.  Useless using
+	  declarations removed.  Added a bool argument to
+	  PowerSet<CS>::OK() to decide whether bottom is or not allowed
+	  into the powerset.
+
+2003-09-01 Monday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.17),
+	  Polyhedra_PowerSet.inlines.hh (1.25): Methods
+	  Polyhedra_PowerSet<PH>::add_constraint() and
+	  Polyhedra_PowerSet<PH>::add_constraints() made lazy.	Methods
+	  Polyhedra_PowerSet<PH>::add_constraint_and_minimize() and
+	  Polyhedra_PowerSet<PH>::add_constraints_and_minimize() added.
+
+2003-08-31 Sunday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.51): Correct a mistake in previous
+	  change.
+
+2003-08-31 Sunday 23:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.50): PowerSet<CS>::collapse(iterator
+	  sink) improved.
+
+2003-08-30 Saturday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bhz03widening2.cc (1.2): Be quiet.
+
+2003-08-30 Saturday 12:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.24): Corrected a bug in
+	  pairwise_reduce(), whereby we were marking the wrong polyhedra in
+	  the sequence.  Corrected a bug in BHZ03_widening_assign(),
+	  whereby we were calling BGP99_extrapolation_assign() instead of
+	  BGP99_heuristics_assign (the latter does not pairwise-reduce nor
+	  collapse the sequence of polyhedra).	In the implementation of
+	  BGP99_heuristics_assign(), we now take a copy of polyhedron `pi'
+	  before computing the base-level widening.
+
+2003-08-30 Saturday 12:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.49): In function collapse(const
+	  unsigned max_disjuncts), removed the never used iterators sbegin
+	  and send.
+
+2003-08-30 Saturday 00:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.187), bhz03widening2.cc (1.1): New test
+	  for Polyhedra_Powerset<PH>::BHZ03_widening_assign().
+
+2003-08-29 Friday 17:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.59): The name of the `abandon_exponential_computations'
+	  variable is now misleading, as we use it also to abandon
+	  polynomial computations in the PowerSet domains.
+
+2003-08-29 Friday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.44), PowerSet.inlines.hh (1.48): Method
+	  PowerSet::collapse() added.  It provides the same functionality
+	  as the project() function, which has been removed.
+
+2003-08-29 Friday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.16),
+	  Polyhedra_PowerSet.inlines.hh (1.23), PowerSet.defs.hh (1.43),
+	  PowerSet.inlines.hh (1.47): Method collapse() reimplemented
+	  generically in the PowerSet class.  Methods
+	  PowerSet<CS>::omega_reduce() and
+	  Polyhedra_PowerSet<PH>::concatenate_assign() (which have
+	  quadratic complexity) now test the
+	  `abandon_exponential_computations' variable and hurry up (giving
+	  up precision) if necessary.
+
+2003-08-28 Thursday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.23): Function check_containment() fixed and
+	  silenced.
+
+2003-08-27 Wednesday 23:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.22): Fixed a couple of bugs in
+	  check_containment().	Print statements added to the same function
+	  in order to help debugging it (it still does not work).
+
+2003-08-27 Wednesday 23:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.15),
+	  Polyhedra_PowerSet.inlines.hh (1.22): New methods `bool
+	  semantically_contains(const Polyhedra_PowerSet&) const' and `bool
+	  semantically_equals(const Polyhedra_PowerSet&) const'.  Fixed
+	  methods ascii_dump() and ascii_load().
+
+2003-08-27 Wednesday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.14),
+	  Polyhedra_PowerSet.inlines.hh (1.21): Methods `void
+	  Polyhedra_PowerSet<PH>::ascii_dump(std::ostream&) const' and
+	  `bool Polyhedra_PowerSet<PH>::ascii_load(std::istream&)' added.
+
+2003-08-27 Wednesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.58), src/Init.cc (1.9): New mechanism to allow the user
+	  to redefine the GMP memory allocation functions being 100% sure
+	  that all GMP objects are allocated and deallocated by the same
+	  functions (nasty things happen if this is not the case).
+
+2003-08-27 Wednesday 18:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* acinclude.m4 (1.4), config.h.in (1.24), configure.ac (1.100),
+	  m4/ac_cxx_attribute_weak.m4 (1.1): Check whether the C++ compiler
+	  supports __attribute__ ((weak)).
+
+2003-08-26 Tuesday 22:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.18), AskTell.inlines.hh (1.18),
+	  Determinate.defs.hh (1.34), Determinate.inlines.hh (1.35),
+	  Polyhedra_PowerSet.defs.hh (1.13), Polyhedra_PowerSet.inlines.hh
+	  (1.20), PowerSet.defs.hh (1.42), PowerSet.inlines.hh (1.46):
+	  Added the swap() method and the specialization of std::swap().
+
+2003-08-26 Tuesday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.21): Added a first version of the
+	  "check_containment" algorithm described in Srivastava93.
+	  Multiple inclusion guard added.
+
+2003-08-26 Tuesday 08:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.12),
+	  Polyhedra_PowerSet.inlines.hh (1.19): Added
+	  Polyhedra_PowerSet<PH>::limited_BHZ03_widening_assign().
+
+2003-08-26 Tuesday 08:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.18): TODO comment revised.
+	  Variable declaration turned into a constant declaration.
+
+2003-08-25 Monday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bhz03widening1.cc (1.2): Ensure the widening is always
+	  called properly.
+
+2003-08-25 Monday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.186), bhz03widening1.cc (1.1): Test
+	  Polyhedra_Powerset<PH>::BHZ03_widening_assign().
+
+2003-08-25 Monday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.11),
+	  Polyhedra_PowerSet.inlines.hh (1.17): Method
+	  new_widening_assign() renamed BHZ03_widening_assign() and
+	  modified to accept a widening method on the underlying polyhedra
+	  domain.
+
+2003-08-25 Monday 18:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.16): In BGP99 extrapolation,
+	  do pairwise reduction before collapsing.
+
+2003-08-25 Monday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.10),
+	  src/Polyhedra_PowerSet.inlines.hh (1.15), tests/Makefile.am
+	  (1.185), tests/bgp99extrapolation1.cc (1.1),
+	  tests/powersetwidening1.cc (1.8): Cleaned and simplified the code
+	  for the "simple powerset widening", now more appropriately called
+	  "BGP99 extrapolation".
+
+2003-08-25 Monday 00:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.99): Version number bumped.
+
+2003-08-25 Monday 00:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.16): Avoid two compiler warnings.
+
+2003-08-24 Sunday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.7): 20 iterations are enough.
+
+2003-08-24 Sunday 17:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.6): Corrected the affine image
+	  transformation.  Made the test silent.
+
+2003-08-24 Sunday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.84), ppl_c.h (1.91): Revised interface
+	  for ppl_Polyhedron_maximize() and ppl_Polyhedron_minimize().
+
+2003-08-24 Sunday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.218), src/Polyhedron.inlines.hh (1.85),
+	  src/Polyhedron_nonpublic.cc (1.15), tests/max_min1.cc (1.3),
+	  tests/max_min2.cc (1.3): Revised interface for
+	  Polyhedron::maximize() and Polyhedron::minimize().
+
+2003-08-24 Sunday 13:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.80): Section on bugfixes added for PPL 0.6.
+
+2003-08-24 Sunday 13:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.79), src/LinExpression.cc (1.19),
+	  src/LinExpression.defs.hh (1.61): New output operator in
+	  namespace IO_Operators: std::ostream& operator<<(std::ostream&,
+	  const LinExpression&).
+
+2003-08-23 Saturday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.14): The applicability test
+	  asserted in Polyhedra_PowerSet<PH>::widening_assign() was
+	  reversed: fixed.
+
+2003-08-23 Saturday 18:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.83): Fixed indentation.
+
+2003-08-23 Saturday 18:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.5): Counter-example for the simple
+	  powerset widening is now working as expected.
+
+2003-08-23 Saturday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.4): Fixed an output statement.
+	  Avoid computing S(n) multiple times.
+
+2003-08-23 Saturday 16:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.3): For readability, use an
+	  alternate output function for variables.
+
+2003-08-23 Saturday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.13): In
+	  Polyhedra_PowerSet<PH>::widening_assign(const Polyhedra_PowerSet&
+	  y, ...) assert that `*this' definitely entails `y'.
+
+2003-08-23 Saturday 16:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.2): Started turning this program
+	  into an implementation of Enea's counterexample for the simple
+	  powerset widening.
+
+2003-08-22 Friday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: max_min1.cc (1.2), max_min2.cc (1.2): Be quiet.
+
+2003-08-22 Friday 19:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.98): Version number bumped.
+
+2003-08-22 Friday 19:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.78): Announce Polyhedron::maximize() and
+	  Polyhedron::minimize().
+
+2003-08-22 Friday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.57): New things to do before releasing PPL 0.6.
+
+2003-08-22 Friday 19:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.82), ppl_c.h (1.90): Added
+	  ppl_Polyhedron_maximize() and ppl_Polyhedron_minimize().
+
+2003-08-22 Friday 19:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.217): Documentation for
+	  Polyhedron::maximize(const LinExpression&, ...) and
+	  Polyhedron::minimize(const LinExpression&, ...) revised.
+
+2003-08-22 Friday 18:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.184), max_min1.cc (1.1), max_min2.cc
+	  (1.1): Test Polyhedron::maximize(const LinExpression&, ...) and
+	  Polyhedron::minimize(const LinExpression&, ...).
+
+2003-08-22 Friday 18:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.14): Method Polyhedron::max_min()
+	  implemented.
+
+2003-08-22 Friday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.13): Avoid useless iterations in
+	  Polyhedron::bounds().
+
+2003-08-22 Friday 13:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.216), Polyhedron.inlines.hh (1.84),
+	  Polyhedron_nonpublic.cc (1.12): Revised specification for the new
+	  methods Polyhedron::maximize(const LinExpression&, ...) and
+	  Polyhedron::minimize(const LinExpression&, ...).  Implementation
+	  work started.
+
+2003-08-22 Friday 12:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.cc (1.47): Avoid useless calls to std::ostream&
+	  std::operator<<(std::ostream& s, ...).
+
+2003-08-20 Wednesday 21:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.215): First tentative declaration for
+	  the new maximization and minimization methods.
+
+2003-08-20 Wednesday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.56): We must explain very well that iterators can be
+	  invalidated by several (actually, almost all) operations, and
+	  that use of an invalidated iterator causes undefined behavior.
+
+2003-08-20 Wednesday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (ppl-0_5-branch.1): Fixed constructor
+	  `PIFunc::PIFunc(dimension_type* v, size_t n)': it was not
+	  initializing the `empty' member.  (Thanks to Axel Simon.)
+
+2003-08-20 Wednesday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.81): Fixed constructor
+	  `PIFunc::PIFunc(dimension_type* v, size_t n)': it was not
+	  initializing the `empty' member.  (Thanks to Axel Simon.)
+
+2003-08-19 Tuesday 09:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.inlines.hh (1.12), PowerSet.defs.hh
+	  (1.41), PowerSet.inlines.hh (1.45): Lazy, much more efficient
+	  implementation of powersets.
+
+2003-08-18 Monday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.77), src/Variable.cc (1.13), src/Variable.defs.hh (1.32),
+	  tests/writevariable1.cc (1.8): The type of output functions for
+	  the class Variable, Variable::Output_Function_Type, is now
+	  defined as void Output_Function_Type(std::ostream& s, const
+	  Variable& v).  In other words, `v' is now passed by const
+	  reference and not by value.
+
+2003-08-10 Sunday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.11): Removed the final
+	  pairwise-reduction step from the 4th case of the new widening.
+
+2003-08-10 Sunday 12:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.10): Added a new case to the
+	  definition of the new widening for powerset polyhedra.
+
+2003-08-08 Friday 16:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.9): Corrected the
+	  implementation of the new widening so that we now check for `y'
+	  not being a singleton before computing its multiset lgo
+	  information.
+
+2003-08-07 Thursday 12:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.1): Put under CVS control.
+
+2003-08-06 Wednesday 14:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.9),
+	  src/Polyhedra_PowerSet.inlines.hh (1.8), src/Polyhedron.defs.hh
+	  (1.214), src/Polyhedron.inlines.hh (1.83),
+	  src/Polyhedron_widenings.cc (1.12), tests/Makefile.am (1.183):
+	  Added a (rough) draft for the new widening on Polyhedra_PowerSet,
+	  using the BHRZ03 widening and based on the lgo relation induced
+	  by the BHRZ03 lgo.
+
+2003-08-06 Wednesday 08:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.97), Watchdog/configure.ac (1.18): Allow for
+	  `mild', -O1 optimization.
+
+2003-08-04 Monday 16:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.8): Let the PPL compile.
+
+2003-08-04 Monday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.7),
+	  Polyhedra_PowerSet.inlines.hh (1.7), PowerSet.defs.hh (1.40),
+	  PowerSet.inlines.hh (1.44): Currect, greedy implementation of the
+	  powerset construction and of its specialization on polyhedra.
+	  (Will be replaced by a lazy implementation ASAP.)
+
+2003-08-04 Monday 14:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.6),
+	  Polyhedra_PowerSet.inlines.hh (1.6), Polyhedron.defs.hh (1.213),
+	  Polyhedron.inlines.hh (1.82), Polyhedron_widenings.cc (1.11):
+	  Drafted functions to compute multiset lgo for the powerset
+	  domain.
+
+2003-08-02 Saturday 17:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.21): Alternative implementation for
+	  SatRow::next() added in a comment.
+
+2003-07-30 Wednesday 22:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.18): Build an RPM package also for the PWL.  The
+	  Prolog interfaces depend on the PWL.
+
+2003-07-30 Wednesday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: xsb_clpq.P (1.7), xsb_clpq2.P (1.5): XSB
+	  version 2.6 still does not offer read_term/2.
+
+2003-07-30 Wednesday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.106), XSB/.cvsignore
+	  (1.3), XSB/Makefile.am (1.15), XSB/ppl_xsb.cc (1.40): Removed
+	  most of the kludges we had for supporting old versions of XSB.
+	  We now only support XSB version 2.6 and following.
+
+2003-07-28 Monday 08:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/fdl.dox (1.5), doc/gpl.dox (1.5),
+	  interfaces/Prolog/Prolog_interface.dox (1.105): No longer using
+	  Doxygen sectioning commands inside normal documentation blocks
+	  (they only work inside \page and \mainpage blocks). Instead, now
+	  using \anchor and unnumbered section headings.
+
+2003-07-22 Tuesday 13:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.5): Ensure omega reductions
+	  in the widening and extrapolation methods.
+
+2003-07-22 Tuesday 13:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.43): PowerSet::is_top() now asserts
+	  this->is_omega_reduced().
+
+2003-07-21 Monday 22:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.5),
+	  Polyhedra_PowerSet.inlines.hh (1.4): Limited extrapolation
+	  operators added.
+
+2003-07-20 Sunday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.18), config.sub (1.17): Updated.
+
+2003-07-18 Friday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.122): Citations fixed.
+
+2003-07-18 Friday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.17), AskTell.inlines.hh (1.17): Entry
+	  point for AskTell<CS>::H79_extrapolation_assign() added.
+
+2003-07-18 Friday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.20): poly_hull_assign_if_exact() improved.
+
+2003-07-18 Friday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.3):
+	  Polyhedra_PowerSet<PH>::collapse() improved.
+
+2003-07-16 Wednesday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/h79widening7.cc (1.2): Make sure the outcome is as
+	  expected.
+
+2003-07-16 Wednesday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/h79widening6.cc (1.3): Made silent.
+
+2003-07-16 Wednesday 15:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.63), Polyhedron_widenings.cc (1.10): Corrected
+	  a bug in H79_widening_assign() and BHRZ03_combining_constraints()
+	  whereby we could have created an illegal constraint system (the
+	  bug was showing up when running the test h79widening6 with
+	  assertions enabled).	Also added an assertion to the
+	  corresponding constructor of Matrix.
+
+2003-07-16 Wednesday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.121): Updated.
+
+2003-07-16 Wednesday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.4): Comment fixed.
+
+2003-07-16 Wednesday 09:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.182), h79widening7.cc (1.1):
+	  h79widening7.cc shows there is a bug somewhere.
+
+2003-07-15 Tuesday 22:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: h79widening6.cc (1.2), mc91.cc (1.13): Brought up-to-date
+	  with respect to the rest of the library.
+
+2003-07-15 Tuesday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.3): Initial fix for the problem
+	  concerning dependent names.
+
+2003-07-15 Tuesday 11:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.96), m4/ac_check_gmp.m4 (1.13): Separated the
+	  check for the existence of the GMP library from the check that it
+	  has been compiled with the C++ interface enabled. Changed error
+	  messages accordingly, to avoid the user getting confused.
+
+2003-07-14 Monday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh (1.34): Fixed two copy-and-paste
+	  errors.
+
+2003-07-14 Monday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.inlines.hh (1.2), PowerSet.defs.hh
+	  (1.39), PowerSet.inlines.hh (1.42): Lots of improvements and bug
+	  fixes.
+
+2003-07-14 Monday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh (1.33): Exploit pointer equality to
+	  optimize equality and containment tests.
+
+2003-07-14 Monday 17:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.16), AskTell.inlines.hh (1.16): Several
+	  improvements.
+
+2003-07-13 Sunday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.15), AskTell.inlines.hh (1.15),
+	  Polyhedra_PowerSet.defs.hh (1.2): Fixed a few glitches.
+
+2003-07-13 Sunday 11:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.19): Several functions moved (as methods) to
+	  the Polyhedra_PowerSet class.
+
+2003-07-13 Sunday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.64), Polyhedra_PowerSet.defs.hh (1.1),
+	  Polyhedra_PowerSet.inlines.hh (1.1), Polyhedra_PowerSet.types.hh
+	  (1.1): The powerset construction instantiated on PPL polyhedra.
+
+2003-07-13 Sunday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.38), PowerSet.inlines.hh (1.41):
+	  Rewritten so as to be truly generic.
+
+2003-07-13 Sunday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.14), AskTell.inlines.hh (1.14): Includes
+	  fixed.  Comment added.
+
+2003-07-10 Thursday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.181), h79widening6.cc (1.1): Test the
+	  simple powerset widening.
+
+2003-07-10 Thursday 17:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.18): Includes fixed.  Simple powerset
+	  widening reimplemented.
+
+2003-07-10 Thursday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.14): Wrong call to
+	  Polyhedron::throw_topology_incompatible() replaced with call to
+	  Polyhedron::throw_dimension_incompatible().
+
+2003-07-10 Thursday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.63): Obsolete stuff out, AskTell class in.
+
+2003-07-10 Thursday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.33), Determinate.inlines.hh (1.32):
+	  Big exception-safety bug fixed.  Some obsolete stuff removed.
+
+2003-07-10 Thursday 17:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.37), PowerSet.inlines.hh (1.40),
+	  PowerSet.types.hh (1.5): Several improvements.
+
+2003-07-10 Thursday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.13), AskTell.inlines.hh (1.13),
+	  AskTell.types.hh (1.5), LCompare.defs.hh (1.6),
+	  LCompare.inlines.hh (1.5), LCompare.types.hh (1.5): Started
+	  reimplementing the AskTell class from scratch.
+
+2003-07-10 Thursday 17:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.55): We must not forget to harmonize all the methods void
+	  PPL::Polyhedron::throw_...(): now they build error messages
+	  according to (confusingly) different styles.
+
+2003-07-05 Saturday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/mc91.cc (1.12): Call PowerSet:add_disjunct() instead of the
+	  no longer existing PowerSet::inject().
+
+2003-07-05 Saturday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.12): Delete statement uncommented.
+
+2003-07-05 Saturday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.17): Added simple widening on powersets of
+	  polyhedra.  They are based on the extrapolation operators but
+	  enforce a maximum number of polyhedra in the destination
+	  powerset.
+
+2003-07-05 Saturday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.36), PowerSet.inlines.hh (1.39): Added
+	  template <typename CS> void PowerSet<CS>::pop_back().
+
+2003-07-01 Tuesday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.35), PowerSet.inlines.hh (1.38),
+	  algorithms.hh (1.16): PowerSet::inject() renamed
+	  PowerSet::add_disjunct().
+
+2003-07-01 Tuesday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.12), AskTell.inlines.hh (1.12):
+	  AskTell::inject() renamed AskTell::add_pair().
+
+2003-07-01 Tuesday 09:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.inlines.hh (1.81), PowerSet.defs.hh (1.34):
+	  Corrected minor typo.  Renamed PowerSet::add_disjunct as
+	  PowerSet::inject.
+
+2003-06-17 Tuesday 23:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh, Polyhedron_widenings.cc
+	  (alt_lgo.[1,1]): Initial support for the "facing constraints"
+	  technique, as provided by Pat.
+
+2003-06-17 Tuesday 23:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.defs.hh (1.33): Comments revised.  Some cleaning.
+
+2003-05-24 Saturday 21:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* install-sh (1.5): Updated.
+
+2003-05-15 Thursday 07:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.54): Started drafting a list of enhancements for PPL 0.6.
+
+2003-05-07 Wednesday 21:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/algorithms.hh (ppl-0_5-branch.1): Functon linear_partition()
+	  excluded from the user manual version 0.5.
+
+2003-05-07 Wednesday 21:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh, PowerSet.defs.hh
+	  (ppl-0_5-branch.[1,1]): Determinate and PowerSet template classes
+	  excluded from the user manual of version 0.5.
+
+2003-05-04 Sunday 19:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.10), doc/devref-browse.doxyconf-latex.in (1.32),
+	  doc/devref-print.doxyconf-latex.in (1.32),
+	  doc/devref.doxyconf-html.in (1.33), src/Determinate.defs.hh
+	  (1.32), src/Determinate.inlines.hh (1.31), src/PowerSet.defs.hh
+	  (1.32), src/PowerSet.inlines.hh (1.37): In the STANDARDS,
+	  explained how the Doxygen documentation of a non-member method
+	  has to be related to a templatic class.  Added or improved the
+	  documentation of Determinate and PowerSet. Let these files be
+	  included in the devref manual (they were already in the user
+	  manual).
+
+2003-05-01 Thursday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/fdl.dox (ppl-0_5-branch.1): \ingroup replaced by \addtogroup,
+	  since otherwise the documentation page is not included in the
+	  produced manuals.
+
+2003-05-01 Thursday 11:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/fdl.dox (1.4): \ingroup replaced by \addtogroup, since
+	  otherwise the documentation page is not included in the produced
+	  manuals.
+
+2003-05-01 Thursday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in,
+	  devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+	  (ppl-0_5-branch.[1,1,1]): List CATCH_ALL in EXPAND_AS_DEFINED.
+	  This is a temporary kludge to get around a bug in Doxygen whereby
+	  occurrences of CATCH_ALL are otherwise interpreted as namespace
+	  declarations.
+
+2003-05-01 Thursday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.31),
+	  devref-print.doxyconf-latex.in (1.31), devref.doxyconf-html.in
+	  (1.32): List CATCH_ALL in EXPAND_AS_DEFINED.	This is a temporary
+	  kludge to get around a bug in Doxygen whereby occurrences of
+	  CATCH_ALL are otherwise interpreted as namespace declarations.
+
+2003-04-30 Wednesday 21:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (ppl-0_5-branch.1), Matrix.defs.hh (1.50):
+	  Use \genfrac instead of \atop, since the latter causes problems
+	  with the amsmath package.
+
+2003-04-30 Wednesday 20:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (ppl-0_5-branch.1), Polyhedron.defs.hh
+	  (1.212): Name the parameters of conversion() in a consistent way.
+
+2003-04-30 Wednesday 19:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.95): Version number bumped.
+
+2003-04-27 Sunday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, Watchdog/ChangeLog, Watchdog/NEWS, Watchdog/README,
+	  Watchdog/configure.ac (ppl-0_5-branch.[2,2,1,1,1]): Synchronize
+	  with the main trunk.
+
+2003-04-27 Sunday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_5-branch.1): Update version.
+
+2003-04-27 Sunday 21:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_5-branch.[1,1]): Mark
+	  ChangeLog.
+
+2003-04-27 Sunday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.16), Watchdog/ChangeLog (1.6): Updated.
+
+2003-04-27 Sunday 21:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.17): Version number bumped.
+
+2003-04-27 Sunday 21:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.15), Watchdog/ChangeLog (1.5): Updated.
+
+2003-04-27 Sunday 21:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: ChangeLog (1.4), NEWS (1.3), README (1.5): Updated for
+	  release 0.2.
+
+2003-04-27 Sunday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.53), ChangeLog (1.14): Updated.
+
+2003-04-27 Sunday 20:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.13): Updated.
+
+2003-04-27 Sunday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.76): Reorganized.
+
+2003-04-27 Sunday 16:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BoundingBox.cc (1.7), BoundingBox.defs.hh (1.10),
+	  BoundingBox.inlines.hh (1.10), Polyhedron.inlines.hh (1.80):
+	  Added Doxygen comments for class BoundingBox.  Method
+	  Polyehdron::shrink_bounding_box() adapted to the lack of default
+	  constructors for LBoundary and UBoundary.
+
+2003-04-27 Sunday 16:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Interval.cc (1.8), Interval.defs.hh (1.15),
+	  Interval.inlines.hh (1.10): Added Doxygen comments to classes
+	  ERational, Boundary, LBoundary, UBoundary, Interval. Removed all
+	  the comparison operators that are not currently used in the
+	  sources. Removed the default constructors for LBoundary and
+	  UBoundary.  Made explicit that the Interval class, as it is
+	  defined, can only manipulate standard (i.e., non-extended)
+	  rational intervals.
+
+2003-04-27 Sunday 16:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.72): Added a scary comment to Row::assign(),
+	  since its improper use may cause memory leaks.
+
+2003-04-27 Sunday 16:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.211): In the documentation of
+	  shrink_bounding_box, we now state that we will always call
+	  raise_lower_bound and lower_upper_bound with fractions in
+	  canonical form.
+
+2003-04-27 Sunday 16:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.30),
+	  devref-print.doxyconf-latex.in (1.30), devref.doxyconf-html.in
+	  (1.31): Added files Interval.* and BoundingBox.* to the
+	  documentation of the developers.
+
+2003-04-27 Sunday 12:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/writevariable1.cc (1.7): Pass objects of type `Variable' by
+	  value.
+
+2003-04-27 Sunday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LinExpression.cc (1.18), LinExpression.defs.hh (1.60),
+	  LinExpression.inlines.hh (1.28), Polyhedron.defs.hh (1.210),
+	  Polyhedron_public.cc (1.13), Variable.cc (1.12), Variable.defs.hh
+	  (1.31), Variable.inlines.hh (1.16): Be consistent: always pass
+	  objects of type `Variable' by value.
+
+2003-04-27 Sunday 11:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.cc (1.6), BoundingBox.inlines.hh (1.9),
+	  ConSys.cc (1.66), ConSys.inlines.hh (1.30), Constraint.cc (1.39),
+	  Constraint.inlines.hh (1.47), GenSys.cc (1.84), GenSys.inlines.hh
+	  (1.31), Generator.cc (1.46), Generator.inlines.hh (1.41): Declare
+	  variables `const' whenever possible or desirable.  Other little
+	  improvements.
+
+2003-04-27 Sunday 10:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (1.62): Fixed a typo in a comment.
+
+2003-04-27 Sunday 09:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.9): Avoid unnecessary explicit
+	  initialization of vectors.
+
+2003-04-27 Sunday 09:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.8): Some debugging output removed.
+
+2003-04-27 Sunday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.7): Declare variables `const'
+	  whenever possible or desirable.
+
+2003-04-26 Saturday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.12): Declare variables `const'
+	  whenever possible or desirable.
+
+2003-04-26 Saturday 19:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.11): Declare variables `const'
+	  whenever possible or desirable.
+
+2003-04-26 Saturday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.16): Updated.
+
+2003-04-26 Saturday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.75): Tentative release date for PPL 0.5 is April 28,
+	  2003.
+
+2003-04-26 Saturday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatMatrix.cc (1.27), SatMatrix.inlines.hh (1.20): Declare
+	  variables `const' whenever possible or desirable.
+
+2003-04-26 Saturday 15:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatRow.cc (1.20), SatRow.inlines.hh (1.27): Declare
+	  variables `const' whenever possible or desirable.
+
+2003-04-26 Saturday 14:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (1.61): Added comments to Matrix::sort_rows(first,
+	  last).
+
+2003-04-26 Saturday 14:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.74), TODO (1.52): Widening with tokens announced in the
+	  NEWS file.
+
+2003-04-26 Saturday 07:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.80), ppl_c.h (1.89): Stick to the C89
+	  standard.
+
+2003-04-26 Saturday 07:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.51): We must announce widening with tokens in the NEWS
+	  file.
+
+2003-04-25 Friday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.15): Changes made elsewhere (removal of the
+	  comparison operators over polyhedra and introduction of widenings
+	  with tokens) now reflected here.
+
+2003-04-25 Friday 21:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.50): All the functionalities are available in all
+	  interfaces.  The documentation for Polyhedron::map_dimensions()
+	  and its wrappers for all the interfaces is OK.
+
+2003-04-24 Thursday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.73), TODO (1.49), doc/definitions.dox (1.120),
+	  interfaces/C/ppl_c.cc (1.79), interfaces/C/ppl_c.h (1.88),
+	  interfaces/Prolog/Prolog_interface.dox (1.104),
+	  interfaces/Prolog/pl_check.pl (1.66),
+	  interfaces/Prolog/ppl_prolog.icc (1.115),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.57),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.38),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.52),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.76),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.25),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.39),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.70), src/Determinate.defs.hh
+	  (1.31), src/Determinate.inlines.hh (1.30), src/Polyhedron.defs.hh
+	  (1.209), src/Polyhedron.inlines.hh (1.79), src/PowerSet.defs.hh
+	  (1.31), src/PowerSet.inlines.hh (1.36), tests/Makefile.am
+	  (1.180), tests/mapdim1.cc (1.1), tests/remapdim1.cc (1.3): The
+	  "remap_dimensions" operation is now called "map_dimensions".
+
+2003-04-23 Wednesday 14:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.103), pl_check.pl
+	  (1.65): Improved grammar specification for Prolog interface.
+	  Amended remap test so that it does not refer to unused
+	  (singleton) variable D.
+
+2003-04-22 Tuesday 18:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: conversion.cc (1.50), minimize.cc (1.34), simplify.cc
+	  (1.32): Declare variables `const' whenever possible or desirable.
+
+2003-04-22 Tuesday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron_chdims.cc (1.7), Polyhedron_nonpublic.cc (1.10),
+	  Polyhedron_public.cc (1.11), Polyhedron_widenings.cc (1.6):
+	  Consistently use `space_dim' instead of `space_dimension()' from
+	  within the Polyhedron class.
+
+2003-04-22 Tuesday 08:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.60), Matrix.inlines.hh (1.34), Row.cc (1.56),
+	  Row.inlines.hh (1.41): Declare variables `const' whenever
+	  possible or desirable.
+
+2003-04-20 Sunday 11:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.87),
+	  interfaces/Prolog/Prolog_interface.dox (1.102),
+	  interfaces/Prolog/pl_check.pl (1.64),
+	  interfaces/Prolog/ppl_prolog.icc (1.114), src/Polyhedron.defs.hh
+	  (1.208), src/Polyhedron.inlines.hh (1.78), tests/remapdim1.cc
+	  (1.2): Changed the documentation of the remapping operator to
+	  refer to the specification provided in doc/definitions.dox;
+	  changed the tests to avoid experimenting with cases when the
+	  behavior is undefined; no longer insisting that the partial
+	  function is injective (since this is required but it is not
+	  enough to obtain a well-defined behavior).
+
+2003-04-19 Saturday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.179), remapdim1.cc (1.1), renamedim1.cc
+	  (1.3): Test program renamedim1.cc renamed remapdim1.cc.
+
+2003-04-18 Friday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.119), doc/devref-browse.doxyconf-latex.in
+	  (1.29), doc/devref-print.doxyconf-latex.in (1.29),
+	  doc/devref.doxyconf-html.in (1.30),
+	  doc/user-browse.doxyconf-latex.in (1.16),
+	  doc/user-print.doxyconf-latex.in (1.16),
+	  doc/user.doxyconf-html.in (1.18), interfaces/C/ppl_c.cc (1.78),
+	  interfaces/C/ppl_c.h (1.86),
+	  interfaces/Prolog/Prolog_interface.dox (1.101),
+	  interfaces/Prolog/pl_check.pl (1.63),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.7),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.19),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.56),
+	  interfaces/Prolog/GNU/Makefile.am (1.30),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.13),
+	  interfaces/Prolog/SICStus/Makefile.am (1.36),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.6),
+	  interfaces/Prolog/SWI/Makefile.am (1.28),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.75),
+	  interfaces/Prolog/XSB/Makefile.am (1.14),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.38),
+	  interfaces/Prolog/YAP/Makefile.am (1.22),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.69), m4/Makefile.am (1.9),
+	  m4/ac_check_gmp.m4 (1.12), m4/ac_cxx_flexible_arrays.m4 (1.6),
+	  src/ConSys.cc (1.65), src/GenSys.cc (1.83), src/GenSys.defs.hh
+	  (1.92), src/Generator.defs.hh (1.84), src/Matrix.cc (1.59),
+	  src/Matrix.defs.hh (1.49), src/NNC_Polyhedron.defs.hh (1.22),
+	  src/Poly_Con_Relation.defs.hh (1.22), src/Polyhedron.defs.hh
+	  (1.207), src/Polyhedron.inlines.hh (1.77),
+	  src/Polyhedron_chdims.cc (1.6), src/Polyhedron_nonpublic.cc
+	  (1.9), src/Polyhedron_public.cc (1.10),
+	  src/Polyhedron_widenings.cc (1.5), src/PowerSet.inlines.hh
+	  (1.35), src/Row.cc (1.55), src/Row.defs.hh (1.71),
+	  src/SatMatrix.cc (1.26), src/SatMatrix.defs.hh (1.32),
+	  src/SatRow.cc (1.19), src/SatRow.defs.hh (1.31), src/Status.cc
+	  (1.21), src/conversion.cc (1.49), src/minimize.cc (1.33),
+	  src/simplify.cc (1.31): Trailing blanks removed.
+
+2003-04-18 Friday 19:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.72), TODO (1.48), interfaces/C/ppl_c.cc (1.77),
+	  interfaces/C/ppl_c.h (1.85),
+	  interfaces/Prolog/Prolog_interface.dox (1.100),
+	  interfaces/Prolog/pl_check.pl (1.62),
+	  interfaces/Prolog/ppl_prolog.icc (1.113),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.55),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.37),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.51),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.74),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.24),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.37),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.68), src/Determinate.defs.hh
+	  (1.30), src/Determinate.inlines.hh (1.29), src/Polyhedron.defs.hh
+	  (1.206), src/Polyhedron.inlines.hh (1.76), src/PowerSet.defs.hh
+	  (1.30), src/PowerSet.inlines.hh (1.34), tests/renamedim1.cc
+	  (1.2): The "rename_dimensions" operation is now called
+	  "remap_dimensions".
+
+2003-04-18 Friday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.118): Section about "Remapping the
+	  Dimension of the Vector Space" rewritten.
+
+2003-04-18 Friday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.sty (1.12): New macro \pard[3] to typeset the signature
+	  of a partial function.
+
+2003-04-17 Thursday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.117), src/ConSys.cc (1.64),
+	  src/Matrix.defs.hh (1.48), src/Polyhedron_nonpublic.cc (1.8):
+	  Prefer "zeroes" to "zeros".
+
+2003-04-17 Thursday 22:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.112): The Boundary_Kind enum
+	  is now confined into the anonymous namespace.
+
+2003-04-17 Thursday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.11), interfaces/Prolog/ppl_prolog.icc
+	  (1.111): Prefer anonymous namespaces to static declarations.
+
+2003-04-17 Thursday 22:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.110),
+	  src/BoundingBox.inlines.hh (1.8), src/Interval.cc (1.7),
+	  src/Interval.defs.hh (1.14), src/Interval.inlines.hh (1.9),
+	  src/Interval.types.hh (1.6), src/Polyhedron.inlines.hh (1.75):
+	  Class `ExtendedRational' renamed `ERational'.
+
+2003-04-17 Thursday 19:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.47), src/Matrix.defs.hh (1.47), src/Matrix.inlines.hh
+	  (1.33): Fixed the comments of the following methods of Matrix:
+	  void grow(dimension_type new_n_rows, dimension_type
+	  new_n_columns); void resize_no_copy(dimension_type new_n_rows,
+	  void add_rows_and_columns(dimension_type n).
+
+2003-04-17 Thursday 19:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.94): Version number bumped.
+
+2003-04-17 Thursday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.21): Target `check-local'
+	  fixed.
+
+2003-04-17 Thursday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.20): Remove ciao_clpq and
+	  ciao_clpq2 when cleaning.
+
+2003-04-17 Thursday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.29): Remove check_script3
+	  when cleaning.
+
+2003-04-17 Thursday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.20): Distribute also
+	  yap_pl_check.pl.
+
+2003-04-17 Thursday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.28): Distribute also
+	  gnu_pl_check.pl.
+
+2003-04-16 Wednesday 07:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.99): Small corrections
+	  made.
+
+2003-04-16 Wednesday 05:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.23): Distribute expected3.
+
+2003-04-15 Tuesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.22): Distribute also
+	  pl_check.pl.
+
+2003-04-15 Tuesday 19:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.71), TODO (1.46), interfaces/C/ppl_c.cc (1.76),
+	  interfaces/C/ppl_c.h (1.84),
+	  interfaces/Prolog/Prolog_interface.dox (1.98),
+	  interfaces/Prolog/pl_check.pl (1.61),
+	  interfaces/Prolog/ppl_prolog.icc (1.109),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.54),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.36),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.50),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.73),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.23),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.36),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.67), src/C_Polyhedron.cc
+	  (1.6), src/Determinate.inlines.hh (1.28), src/Polyhedron.defs.hh
+	  (1.205), src/Polyhedron.inlines.hh (1.74),
+	  src/Polyhedron_public.cc (1.9), tests/bounded1.cc (1.12),
+	  tests/disjoint1.cc (1.6), tests/disjoint2.cc (1.7),
+	  tests/disjoint3.cc (1.6), tests/empty1.cc (1.13),
+	  tests/intersection2.cc (1.9), tests/linearpartition1.cc (1.12),
+	  tests/linearpartition2.cc (1.12), tests/linearpartition3.cc
+	  (1.12), tests/randphull1.cc (1.9), tests/smm1.cc (1.14),
+	  tests/timeelapse5.cc (1.8), tests/topclosed1.cc (1.6),
+	  tests/topclosed2.cc (1.5), tests/topclosed3.cc (1.7),
+	  tests/universe1.cc (1.9), tests/universe2.cc (1.10),
+	  tests/universe3.cc (1.10), tests/universe4.cc (1.10),
+	  tests/universe5.cc (1.11), tests/universe6.cc (1.8): The methods
+	  Polyhedron::check_empty() and Polyhedron::check_universe() have
+	  been renamed is_empty() and is_universe(), respectively.  The
+	  function check_disjoint(const Polyhedron&, const Polyhedron&) had
+	  been replaced by method Polyhedron::is_disjoint_from(const
+	  Polyhedron&).  The methods Polyhedron::check_bounded() and
+	  Polyhedron::check_topologically_closed() have been renamed
+	  is_bounded() and is_topologically_closed(), respectively.
+
+2003-04-15 Tuesday 19:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.19): Distribute also
+	  ciao_clpq2.pl.
+
+2003-04-15 Tuesday 13:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.204), Polyhedron.inlines.hh (1.73),
+	  Polyhedron_chdims.cc (1.5), Polyhedron_nonpublic.cc (1.7),
+	  Polyhedron_public.cc (1.8), Polyhedron_widenings.cc (1.4):
+	  Polyhedron::is_empty() renamed Polyhedron::marked_empty().
+
+2003-04-15 Tuesday 13:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.16), Watchdog/ltmain.sh (1.5): Updated.
+
+2003-04-15 Tuesday 09:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.70), interfaces/C/ppl_c.cc (1.75),
+	  interfaces/Prolog/ppl_prolog.icc (1.108), src/ConSys.defs.hh
+	  (1.79), src/GenSys.defs.hh (1.91), src/Generator.defs.hh (1.83),
+	  src/Polyhedron.defs.hh (1.203), src/Polyhedron.inlines.hh (1.72),
+	  src/Polyhedron_public.cc (1.7), src/Polyhedron_widenings.cc
+	  (1.3), tests/Makefile.am (1.178), tests/NNCinclusion1.cc (1.7),
+	  tests/contains1.cc (1.4), tests/contains2.cc (1.1),
+	  tests/contains3.cc (1.1), tests/contains4.cc (1.1),
+	  tests/contains5.cc (1.1), tests/exceptions1.cc (1.34),
+	  tests/exceptions2.cc (1.28), tests/inclusion1.cc (1.7),
+	  tests/inclusion2.cc (1.4), tests/linearpartition1.cc (1.11),
+	  tests/linearpartition2.cc (1.11), tests/linearpartition3.cc
+	  (1.11), tests/operator1.cc (1.5): The functions
+	  Polyhedron::operator<=(const Polyhedron&, const Polyhedron&),
+	  Polyhedron::operator>=(const Polyhedron&, const Polyhedron&),
+	  Polyhedron::operator<(const Polyhedron&, const Polyhedron&), and
+	  Polyhedron::operator>(const Polyhedron&, const Polyhedron&) have
+	  been removed.  The methods Polyhedron::contains(const
+	  Polyhedron&) and Polyhedron::strictly_contains(const Polyhedron&)
+	  provide the same functionality.
+
+2003-04-14 Monday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.202), Polyhedron_nonpublic.cc (1.6),
+	  Polyhedron_public.cc (1.6): Polyhedron::is_included(const
+	  Polyhedron&) renamed Polyhedron::is_included_in(const
+	  Polyhedron&).
+
+2003-04-14 Monday 12:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.60), Ciao/ppl_ciao.pl (1.53):
+	  The ciao system now allows for
+	  ppl_Polyhedron_generalized_affine_image to fail.  This is now
+	  tested in pl_check.
+
+2003-04-14 Monday 11:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.59), Ciao/ppl_ciao.pl (1.52):
+	  This allows for failure in ciao for timeout_exception_atom when
+	  the atom given does not unify with the current value and also for
+	  the new_Polyhedron predicates when unifying the new handle with
+	  the input value.  In order to test this, the tests in pl_check
+	  assume that unifying a new handle with value 0 will fail.
+
+2003-04-13 Sunday 21:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected2 (1.8): Adapted to strong
+	  normalization.
+
+2003-04-13 Sunday 13:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.63), GenSys.cc (1.82), Matrix.cc (1.58),
+	  Matrix.defs.hh (1.46), Row.cc (1.54), Row.defs.hh (1.70),
+	  simplify.cc (1.30): Added a boolean parameter to Matrix::OK() to
+	  control whether or not we also want to check for strong
+	  normalization of the rows in the matrix.  Strong normalization is
+	  now checked when this might be useful, i.e., avoiding bare
+	  repetitions of the same check.  Also added a method
+	  Row::check_strongly_normalized() with the obvious semantics.
+
+2003-04-13 Sunday 09:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.18): Do not use the
+	  GLOBALSTKSIZE kludge for testing with clpq2.pl.
+
+2003-04-13 Sunday 09:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.51): Indentation fixed.
+
+2003-04-12 Saturday 20:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/expected2 (1.10): Updated according to the
+	  enforcing of strong-normalization.
+
+2003-04-12 Saturday 20:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplify.cc (1.29): Method Polyhedron::simplify(mat, sat)
+	  takes as 1st input argument a well-formed Matrix mat.  When a
+	  ray-point-inequality is transformed into a line-equality,
+	  sign_normalization is applied to enforce strong-normalization.
+	  Well-formedness of mat also asserted on exit.
+
+2003-04-12 Saturday 20:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (1.57): Methods Matrix::gauss() and
+	  Matrix::back_substitute() are applied to well-formed matrices and
+	  will return well-formed matrices.  Corrected a bug in the
+	  handling of the sortedness flag in back_substitute().  Method
+	  Matrix::OK() now also checks strong normalization of rows.
+
+2003-04-12 Saturday 20:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Row.cc (1.53), Row.defs.hh (1.69), Row.inlines.hh (1.40):
+	  Strong normalization of rows made inline and implemented by
+	  calling Row::normalize() and Row::sign_normalize().
+
+2003-04-11 Friday 08:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.62), GenSys.cc (1.81): Fixed a couple of
+	  comments.
+
+2003-04-11 Friday 08:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.15), Watchdog/ltmain.sh (1.4): Updated.
+
+2003-04-11 Friday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.61), Constraint.cc (1.38),
+	  Constraint.inlines.hh (1.46), GenSys.cc (1.80), Generator.cc
+	  (1.45), Matrix.cc (1.56), Matrix.inlines.hh (1.32), Row.cc
+	  (1.52), Row.defs.hh (1.68), conversion.cc (1.48), simplify.cc
+	  (1.28): Commit to EXTRA_NORMALIZATION=1.
+
+2003-04-10 Thursday 14:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.60), GenSys.cc (1.79), Polyhedron_widenings.cc
+	  (1.2), conversion.cc (1.47): Strong normalization of rows called
+	  when EXTRA_NORMALIZATION is set; otherwise use (simple)
+	  normalization.
+
+2003-04-10 Thursday 12:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.59), GenSys.cc (1.78), Matrix.defs.hh (1.45),
+	  Matrix.inlines.hh (1.31), Polyhedron_chdims.cc (1.4): Added
+	  method Matrix::remove_columns(dimension_type new_n_columns) with
+	  the expected semantics. The method ensures that the resulting
+	  matrix is in normal form, thus correcting the bug shown by
+	  removedim10.cc.  The new method is now used everywhere we remove
+	  columns from a matrix.
+
+2003-04-10 Thursday 11:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/removedim10.cc (1.2): Corrected the known result.
+
+2003-04-10 Thursday 10:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.177), removedim10.cc (1.1): New test
+	  showing a bug whereby rows of matrices are not re-normalized
+	  after the removal of some columns.
+
+2003-04-10 Thursday 10:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/removedim9.cc (1.5): Indentation fixed.
+
+2003-04-09 Wednesday 09:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.9): Improved the section about the production of
+	  Doxygen documentation.
+
+2003-04-09 Wednesday 09:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.58): Changed the way variables
+	  are bound to dimension names.  This avoids a problem due to a bug
+	  in XSB.
+
+2003-04-08 Tuesday 19:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.45): For the moment, it is convenient to have
+	  Matrix::set_sorted(bool value) instead of, say,
+	  Matrix::set_sorted() and Matrix::set_unsorted().  Sortedness will
+	  have to be dealt with at a more fundamental level anyway.
+
+2003-04-08 Tuesday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.4): Updated.
+
+2003-04-08 Tuesday 19:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.44): Section on "Constructions on Polyhedra" revised.
+	  Minor fix in the section about "Cutting-Plane Methods".
+
+2003-04-08 Tuesday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.43): Remove the section about designing and
+	  implementating strict weak orderings on polyhedra.
+
+2003-04-08 Tuesday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.15): Updated.
+
+2003-04-08 Tuesday 18:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.5): Copyright symbol added.
+
+2003-04-08 Tuesday 18:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.12): Updated.
+
+2003-04-08 Tuesday 18:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.7): Minor correction.
+
+2003-04-08 Tuesday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.97): Information on how
+	  to use the XSB interface added.
+
+2003-04-08 Tuesday 16:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/SatMatrix.defs.hh (1.31): Added short Doxygen description and
+	  improved the long one for SatMatrix.
+
+2003-04-08 Tuesday 13:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.49): Added missing
+	  definitions for
+	  ppl_Polyhedron_limited_H79_extrapolation_assign_with_token and
+	  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token.
+
+2003-04-08 Tuesday 13:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.322): Implementation file Polyhedron.cc has
+	  been split in 4 chunks: - Polyhedron_widenings.cc contains the
+	  definitions of (non-inline) functions   related to widening and
+	  extrapolation operators; - Polyhedron_chdims.cc contains the
+	  definitions of (non-inline) functions   that change the space
+	  dimensions; - Polyhedron_public.cc contains the definitions of
+	  all the other public	 (non-inline) functions -
+	  Polyhedron_nonpublic.cc contains the definitions of all the other
+	  non-public (i.e., private or protected) (non-inline) functions.
+
+2003-04-08 Tuesday 13:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron_chdims.cc (1.3), Polyhedron_nonpublic.cc (1.5),
+	  Row.defs.hh (1.67), statistics.hh (1.2): Added Doxygen
+	  documentation for a few #define's.
+
+2003-04-08 Tuesday 10:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.57), Ciao/ppl_ciao.pl (1.50):
+	  Added code and test to allow for Prolog failure in the
+	  ppl_Polyhedron_generalized_affine_image_lhs_rhs/4 predicate.
+
+2003-04-08 Tuesday 09:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.56): Added tests for Prolog
+	  failure for the "with_token" predicates.  Some reorganisation of
+	  the widening/extrapolation tests.
+
+2003-04-08 Tuesday 09:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.49): Modified the
+	  "with_token" predicates to allow for Prolog failure.
+
+2003-04-08 Tuesday 08:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.29), PowerSet.inlines.hh (1.33): Added
+	  \relates command for functions working on class template
+	  PowerSet.
+
+2003-04-08 Tuesday 08:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.66): Improved the detailed Doxygen description
+	  of class Row.
+
+2003-04-08 Tuesday 08:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.29), Determinate.inlines.hh (1.27):
+	  Added a few \relates commands, which however show a bug in the
+	  handling of template specializations by Doxygen.
+
+2003-04-08 Tuesday 08:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.cc (1.17): Added missing \relates Doxygen
+	  commands.
+
+2003-04-07 Monday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.14), Watchdog/ltmain.sh (1.3): Updated.
+
+2003-04-07 Monday 08:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.48): The local definition
+	  of many of the ppl predicates changed to allow for Prolog
+	  failure.  Some missing predicates added.
+
+2003-04-07 Monday 08:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.55): Tests have been improved
+	  and extended to check negation and Prolog failure.  Some
+	  reorganisation done.
+
+2003-04-07 Monday 07:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.35):
+	  ppl_Polyhedron_limited_H79_extrapolation_assign_with_token was
+	  missing - is now added.
+
+2003-04-06 Sunday 18:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.84), Constraint.inlines.hh (1.45),
+	  Generator.defs.hh (1.82), Generator.inlines.hh (1.40),
+	  LinExpression.defs.hh (1.59), LinExpression.inlines.hh (1.27),
+	  Polyhedron_public.cc (1.5): Adding a few missing \relates Doxygen
+	  commands.  Avoid adding Doxygen blocks near to *friend*
+	  declarations: comment the very function declarations instead.
+
+2003-04-06 Sunday 18:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Poly_Con_Relation.defs.hh (1.21),
+	  Poly_Con_Relation.inlines.hh (1.10), Poly_Gen_Relation.defs.hh
+	  (1.20), Poly_Gen_Relation.inlines.hh (1.10), SatRow.inlines.hh
+	  (1.26), Status.defs.hh (1.28), Status.inlines.hh (1.13): Adding a
+	  few missing \relates Doxygen commands.  Avoid adding Doxygen
+	  blocks near to *friend* declarations: comment the very function
+	  declarations instead.
+
+2003-04-06 Sunday 18:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/SatRow.defs.hh (1.30): Removed declared but unimplemented
+	  member function unsigned int size().
+
+2003-04-06 Sunday 12:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.65): Upgraded the detailed documentation of
+	  class Row to also describe the representation of NNC row objects.
+
+2003-04-05 Saturday 09:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Status.defs.hh (1.27): Modified class documentation to also
+	  consider the flags about pending constraints and generators.
+	  Moved Doxygen comments from friend declaration to the real
+	  function declaration. Avoid using preproc flag PPL_DOXYGEN_HYDE_
+	  IMPLEMENTATION_DETAILS when useless, i.e., when we are inside a
+	  class whose documentation is already hidden.
+
+2003-04-05 Saturday 09:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.55), Matrix.defs.hh (1.44): Adjusted a couple
+	  of Doxygen and code comments.
+
+2003-04-01 Tuesday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.93): Fixed a bug whereby building of the SICStus
+	  Prolog interface was attempted even if deemed to fail because the
+	  sicstus.h include could not be found.
+
+2003-04-01 Tuesday 12:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron_public.cc (1.4), SatRow.cc (1.18): Added four
+	  \relates Doxygen commands to correctly match declaration and
+	  definition of functions in the devref manual.
+
+2003-03-31 Monday 10:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.83): Missing inline qualification added.
+
+2003-03-31 Monday 10:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.13): Updated.
+
+2003-03-28 Friday 10:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.92): When checking for the presence of source
+	  files, avoid testing for `Polyhedron.cc', who is going to be
+	  removed from the repository.
+
+2003-03-27 Thursday 14:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.42): New items to be checked.
+
+2003-03-27 Thursday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.54): Comments of Matrix::operator=(const Matrix&
+	  y) made more precise.
+
+2003-03-27 Thursday 14:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.inlines.hh (1.39): Indentation of preprocessing
+	  directives fixed.
+
+2003-03-27 Thursday 14:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.51): Row::Impl::copy_construct() slightly improved.
+
+2003-03-27 Thursday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.inlines.hh (1.30): Spacing adjusted.
+
+2003-03-25 Tuesday 18:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.96), pl_check.pl
+	  (1.54): The documentation for the relations_with predicates
+	  corrected.  The tests for the relations_with predicates improved.
+
+2003-03-25 Tuesday 11:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.71): Inline functions should be
+	  *defined* before they are used.
+
+2003-03-19 Wednesday 09:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.53): All tests now test both c
+	  and nnc polyhedra.  Some more checks on the interface
+	  incorporated into these tests.
+
+2003-03-19 Wednesday 08:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/permute.cc (1.30): Avoid unnecessary calls to
+	  append_size_rel.
+
+2003-03-19 Wednesday 07:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/permute.cc (1.29): Bug fixed
+
+2003-03-18 Tuesday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/SatRow.defs.hh (1.29): Added Doxygen comment to class SatRow.
+	  Avoiding commenting friend declarations.
+
+2003-03-18 Tuesday 15:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.64): Added doxygen comment to class Row::Impl.
+
+2003-03-18 Tuesday 12:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.28),
+	  devref-print.doxyconf-latex.in (1.28), devref.doxyconf-html.in
+	  (1.29): Added input file version.hh.
+
+2003-03-18 Tuesday 11:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh (1.44), Row.cc (1.50), Row.defs.hh
+	  (1.63), Row.inlines.hh (1.38), SatMatrix.defs.hh (1.30),
+	  SatMatrix.inlines.hh (1.19), SatRow.defs.hh (1.28),
+	  SatRow.inlines.hh (1.25): As suggested in our STANDARDS file, let
+	  all Doxygen comments be centralized before methods declarations
+	  in file *.defs.hh.  In class Row, be careful to use the same
+	  parameter naming in declarations and definitions.  For Row and
+	  SatRow, let std::iter_swap be declared in *.defs.hh.
+
+2003-03-18 Tuesday 11:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.107), Ciao/ppl_ciao.pl
+	  (1.47): Be more general with respect to different ways of raising
+	  Prolog exceptions in C code.
+
+2003-03-18 Tuesday 10:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.95): Bug in comment for
+	  ppl_Polyhedron_OK fixed.
+
+2003-03-18 Tuesday 10:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.34): Repeated declaration
+	  removed.
+
+2003-03-18 Tuesday 08:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.94): Bug fixed in
+	  documentation of ppl_Polyhedron_OK.
+
+2003-03-18 Tuesday 08:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.33): Bug fixed.
+
+2003-03-18 Tuesday 08:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.93), pl_check.pl
+	  (1.52), ppl_prolog.icc (1.106), Ciao/ppl_ciao.pl (1.46),
+	  GNU/ppl_gprolog.pl (1.35), SICStus/ppl_sicstus_sd.cc (1.48),
+	  SWI/ppl_swiprolog.cc (1.72), XSB/ppl_xsb.H (1.22), XSB/ppl_xsb.cc
+	  (1.32), YAP/ppl_yap.cc (1.66): The "with_token" predicates added
+	  for the extrapolation operators.  The ppl_Polyhedron_OK predicate
+	  added.  The documentation predicates reorganised to match the
+	  standard ordering.  Tests added for the new predicates.
+
+2003-03-17 Monday 09:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.82): Comments fixed.
+
+2003-03-17 Monday 09:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.51): Many improvements and extra
+	  tests added.
+
+2003-03-16 Sunday 22:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.105): Default arguments are
+	  only permitted on functions.
+
+2003-03-16 Sunday 22:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.104): Prefer anonymous
+	  namespaces to static linkage.
+
+2003-03-16 Sunday 14:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.inlines.hh (1.70), Polyhedron_chdims.cc (1.2),
+	  Polyhedron_nonpublic.cc (1.4), Polyhedron_public.cc (1.3): A few
+	  harmless FIXME's replaced by TODO.
+
+2003-03-16 Sunday 10:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.2): In affine_image(), added a
+	  comment explaining why in one case we can leave work correctly
+	  with a DD pair having pending rows.
+
+2003-03-16 Sunday 10:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.3): Preferred unset_pending_rows()
+	  wrt set_index_first_pending_row().
+
+2003-03-16 Sunday 10:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplify.cc (1.27): Preferring unset_pending_rows() wrt
+	  set_index_first_pending_row().
+
+2003-03-16 Sunday 10:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.46): Dealt with a FIXME. Preferring the use
+	  of unset_pending_rows() wrt the use of set_index_first_pending(),
+	  since the first is more intuitive.
+
+2003-03-16 Sunday 10:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.77): Dealt with the CHECK ME in
+	  remove_invalid_rays_and_lines().
+
+2003-03-16 Sunday 10:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (1.58): Added a needed comment.
+
+2003-03-15 Saturday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.103): Some code duplication
+	  avoided.
+
+2003-03-15 Saturday 13:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.78), GenSys.defs.hh (1.90): Corrected
+	  typos in comments.
+
+2003-03-15 Saturday 13:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.69): Small corrections in
+	  rename_dimensions().
+
+2003-03-15 Saturday 13:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.h (1.81), ppl_c.cc (1.74): Added the
+	  equality test for polyhedra to the C interface.
+
+2003-03-14 Friday 21:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref-browse.doxyconf-latex.in (1.27),
+	  doc/devref-print.doxyconf-latex.in (1.27),
+	  doc/devref.doxyconf-html.in (1.28), interfaces/C/ppl_c.h (1.80),
+	  interfaces/Prolog/Prolog_interface.dox (1.92),
+	  interfaces/Prolog/ppl_prolog.icc (1.102),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.45),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.34),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.47),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.71),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.21),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.31),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.65), src/Polyhedron.defs.hh
+	  (1.201), src/Polyhedron.inlines.hh (1.68),
+	  src/Polyhedron_nonpublic.cc (1.2): Reordered the functions and
+	  their documentation in all the interfaces to follow the
+	  reorganization done in Polyhedron.defs.hh.  Adjusted Doxygen
+	  configuration files for the devref manuals to get their input
+	  from the new .cc files of class Polyhedron.
+
+2003-03-14 Friday 13:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.69), TODO (1.41), interfaces/C/ppl_c.cc (1.73),
+	  interfaces/C/ppl_c.h (1.79),
+	  interfaces/Prolog/Prolog_interface.dox (1.91),
+	  interfaces/Prolog/pl_check.pl (1.50),
+	  interfaces/Prolog/ppl_prolog.icc (1.101),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.44),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.33),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.46),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.70),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.20),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.30),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.64): Interfaces changed to
+	  match method name changes (check_bound, check_topolo- giaclly
+	  close and check_disjoint). Change reported in the NEWS.
+
+2003-03-14 Friday 13:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bounded1.cc (1.11), disjoint1.cc (1.5), disjoint2.cc
+	  (1.6), disjoint3.cc (1.5), linearpartition1.cc (1.10),
+	  linearpartition2.cc (1.10), linearpartition3.cc (1.10),
+	  topclosed1.cc (1.5), topclosed2.cc (1.4), topclosed3.cc (1.6):
+	  Tests changed according to method renaming.
+
+2003-03-14 Friday 13:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.5), Makefile.am (1.62), Polyhedron.cc
+	  (1.321), Polyhedron.defs.hh (1.200), Polyhedron.inlines.hh
+	  (1.67), Polyhedron_chdims.cc (1.1), Polyhedron_nonpublic.cc
+	  (1.1), Polyhedron_public.cc (1.1), Polyhedron_widenings.cc (1.1):
+	  Split file Polyhedron.cc into several files.	Methods
+	  is_bounded(), is_topologically_closed() and are_disjoint()
+	  renamed to check_bounded(), check_topologically_closed() and
+	  check_disjoint().  Documentation reorganized to match more
+	  closely the order in the introduction of the user manual, also
+	  grouping related methods.  Added exception thrower
+	  throw_runtime_error().  In the documentation, all examples using
+	  class `Polyhedron' changed to use the user-accessible class
+	  `C_Polyhedron'.
+
+2003-03-14 Friday 12:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.43), Poly_Con_Relation.defs.hh (1.20),
+	  Poly_Gen_Relation.defs.hh (1.19), Row.defs.hh (1.62),
+	  SatRow.defs.hh (1.27), Status.defs.hh (1.26): In Doxygen
+	  documentation, replaced `@name' by `\name'.
+
+2003-03-14 Friday 09:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.17): Corrected for clpq2.pl
+	  checks
+
+2003-03-13 Thursday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/: Makefile.am (1.27), gnu_pl_check.pl
+	  (1.1): Test all predicates with GNU Prolog.
+
+2003-03-13 Thursday 08:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_pl_check.pl (1.2): Comment corrected.
+
+2003-03-13 Thursday 08:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.19): Dependencies fixed.
+
+2003-03-12 Wednesday 19:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.116): Another attempt at specifying the
+	  space-dimensions remapping operator.
+
+2003-03-12 Wednesday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: expected3 (1.1), YAP/Makefile.am (1.18),
+	  YAP/yap_pl_check.pl (1.1): A first attempt at integrating
+	  `pl_check.pl' into the regression testing mechanism.
+
+2003-03-12 Wednesday 19:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user-browse.doxyconf-latex.in (1.15),
+	  user-print.doxyconf-latex.in (1.15), user.doxyconf-html.in
+	  (1.17): Hide the listing of friend compounds in the user
+	  documentation.
+
+2003-03-12 Wednesday 16:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.49): Removed the "and_minimize"
+	  from the code for the "checks" predicate.
+
+2003-03-12 Wednesday 13:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.320): Corrected a bug in
+	  Polyhedron::add_genrators() whereby a generator system was
+	  wrongly declared sorted after the inclusion of pending rows.
+
+2003-03-12 Wednesday 10:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/GNU/ppl_gprolog.pl (1.32): Added missing
+	  definitions and corrected a bug.
+
+2003-03-12 Wednesday 08:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.176), addgenerators13.cc (1.1): New test
+	  exhibiting a bug triggered by an invocation to
+	  Polyhedron::add_generators()..
+
+2003-03-12 Wednesday 08:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.48): In many cases, predicates
+	  that are intended to cause Prolog failure in certain specified
+	  situations now tested more thoroughly.  Unnecessary uses of
+	  "and_minimize" removed.  Other general improvements.
+
+2003-03-11 Tuesday 20:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.90): Mention that we
+	  support only YAP version 4.4 or later and Ciao Prolog 1.9 #44 or
+	  later.
+
+2003-03-11 Tuesday 19:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.100): Now all the
+	  *_and_minimize/2 predicates fail if the resulting polyhedron is
+	  empty.
+
+2003-03-11 Tuesday 17:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.99): Indentation fixed.
+
+2003-03-11 Tuesday 15:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.47), ppl_prolog.icc (1.98),
+	  Ciao/ppl_ciao.pl (1.43), GNU/ppl_gprolog.pl (1.31),
+	  SICStus/ppl_sicstus_sd.cc (1.45), SWI/ppl_swiprolog.cc (1.69),
+	  XSB/ppl_xsb.H (1.19), XSB/ppl_xsb.cc (1.29), YAP/ppl_yap.cc
+	  (1.63): The "..with_tokens" predicates are now "..with_token".
+	  The predicate ppl_Polyhedron_bounded_H79_extrapolation_assign/3
+	  added to Ciao, GNU, SICStus, XSB, and Yap.
+
+2003-03-11 Tuesday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: ciao_clpq.pl (1.6), ciao_clpq2.pl (1.2):
+	  Import as few predicates as possible.
+
+2003-03-11 Tuesday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.42): Complete declarations
+	  for ppl_Polyhedron_H79_widening_assign_with_tokens/3.
+
+2003-03-11 Tuesday 11:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.46), Ciao/ppl_ciao.pl (1.41),
+	  GNU/ppl_gprolog.pl (1.30), SICStus/ppl_sicstus_sd.cc (1.44),
+	  SWI/ppl_swiprolog.cc (1.68), XSB/ppl_xsb.H (1.18), XSB/ppl_xsb.cc
+	  (1.28), YAP/ppl_yap.cc (1.62): Tests for new interface predicates
+	  added.
+
+2003-03-11 Tuesday 10:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.97): Translate std::bad_alloc
+	  into a usable Prolog exception.
+
+2003-03-11 Tuesday 10:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.96):
+	  PIFunc::max_in_codomain() fixed.
+
+2003-03-11 Tuesday 09:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.89): Descriptions of
+	  "with_token" predicates improved.
+
+2003-03-10 Monday 19:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.16), ciao_clpq.pl (1.5),
+	  ciao_clpq2.pl (1.1), ppl_ciao.cc (1.18), ppl_ciao.pl (1.40): Ciao
+	  Prolog interface fixed and now part of the regression testing
+	  mechanism.
+
+2003-03-10 Monday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.68): The Prolog interface now supports also Ciao Prolog
+	  and XSB.
+
+2003-03-10 Monday 18:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.115): First attempt at describing the
+	  operator remapping dimensions.
+
+2003-03-10 Monday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.114): Changed a bit the description about
+	  widenings to better clarify what has been done and we are still
+	  doing for NNC polyhedra.
+
+2003-03-10 Monday 11:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.72), ppl_c.h (1.78): Modified the C
+	  interface to support the widening-with-tokens technique for all
+	  widening and extrapolation operators.
+
+2003-03-10 Monday 10:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.88): Descriptions for
+	  the bounded_..._extrapolation_assign predicates corrected.
+
+2003-03-10 Monday 10:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.87): Added
+	  documentation for the with_token versions of the widening
+	  predicates and for the bounded versions of the extrapolation
+	  predicates.
+
+2003-03-10 Monday 09:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.86): Prolog interface
+	  documentation reorganised with a summary list of all predicates.
+
+2003-03-09 Sunday 22:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.95): Started factorizing the
+	  implementation of the Prolog interface using pointers to members.
+
+2003-03-09 Sunday 21:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.94), Ciao/ppl_ciao.pl
+	  (1.39), GNU/ppl_gprolog.pl (1.29), SICStus/ppl_sicstus_sd.cc
+	  (1.43), SWI/ppl_swiprolog.cc (1.67), XSB/ppl_xsb.H (1.17),
+	  XSB/ppl_xsb.cc (1.27), YAP/ppl_yap.cc (1.61): New predicate
+	  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3.
+
+2003-03-09 Sunday 21:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.93), Ciao/ppl_ciao.pl
+	  (1.38), GNU/ppl_gprolog.pl (1.28), SICStus/ppl_sicstus_sd.cc
+	  (1.42), SWI/ppl_swiprolog.cc (1.66), XSB/ppl_xsb.H (1.16),
+	  XSB/ppl_xsb.cc (1.26), YAP/ppl_yap.cc (1.60): New predicate
+	  ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/3.
+
+2003-03-09 Sunday 21:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.71), ppl_c.h (1.77): New function
+	  ppl_Polyhedron_BHRZ03_widening_assign_with_tokens().	Some
+	  hyperlinks added.
+
+2003-03-09 Sunday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.23): Updated.
+
+2003-03-09 Sunday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.91): Check whether the C compiler supports the
+	  `inline' keyword.
+
+2003-03-09 Sunday 19:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.40), src/Interval.defs.hh (1.13): The Interval class has
+	  been documented.
+
+2003-03-09 Sunday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.199): Polyhedron::OK() only prints
+	  something if run-time assertions are enabled.
+
+2003-03-09 Sunday 11:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.39), src/Polyhedron.types.hh (1.9): Explained PPL's I/O
+	  operators and how to deal with the IO_Operators namespace.
+
+2003-03-09 Sunday 08:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.38): It should now be clear how to build the
+	  documentation.
+
+2003-03-09 Sunday 08:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.90): Version number bumped.
+
+2003-03-09 Sunday 08:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/adddimensions13.cc (1.2): Comments improved.
+
+2003-03-09 Sunday 08:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.53): Explain the necessity of the guard against
+	  auto-assignments in Matrix::operator=(const Matrix&).
+
+2003-03-08 Saturday 22:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (1.52): Corrected Matrix::operator= to avoid the
+	  bug shown by tests adddimensions13.
+
+2003-03-08 Saturday 22:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.175), adddimensions13.cc (1.1): Added test
+	  showing a bug in teh assignment operator of Matrix. Bug is only
+	  visible when configuring with --enable-more-assertions.
+
+2003-03-08 Saturday 22:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.113): Removed wrong capitalization.
+
+2003-03-08 Saturday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.tex (1.11), user.tex (1.12): Apparently, CoVer is a
+	  MURST project.
+
+2003-03-08 Saturday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.70), ppl_c.h (1.76): New functions
+	  ppl_add_LinExpression_to_LinExpression(),
+	  ppl_subtract_LinExpression_from_LinExpression() and
+	  ppl_multiply_LinExpression_by_Coefficient().
+
+2003-03-08 Saturday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variable.defs.hh (1.30): Variable::Compare commented.
+
+2003-03-08 Saturday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.6), TODO (1.37): CREDITS updated.
+
+2003-03-08 Saturday 11:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README (1.1): Explain how to get (more) PPL documentation.
+
+2003-03-08 Saturday 09:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.69), ppl_c.h (1.75): Typos fixed.
+
+2003-03-08 Saturday 09:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: adddimensions9.cc (1.6), affineimage8.cc (1.7),
+	  affinepreimage10.cc (1.7), bounded1.cc (1.10), concatenate2.cc
+	  (1.7), disjoint1.cc (1.4), exceptions1.cc (1.33), exceptions2.cc
+	  (1.27), intersection10.cc (1.5), removedim7.cc (1.8): Typos
+	  fixed.
+
+2003-03-08 Saturday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.83), GenSys.cc (1.76), Polyhedron.cc
+	  (1.319), Polyhedron.defs.hh (1.198), Polyhedron.inlines.hh
+	  (1.66), SatRow.defs.hh (1.26), Status.cc (1.20), conversion.cc
+	  (1.45), minimize.cc (1.32), simplify.cc (1.26): Typos fixed.
+
+2003-03-07 Friday 19:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.32), exceptions2.cc (1.26),
+	  generalizedaffineimage1.cc (1.7), generalizedaffineimage10.cc
+	  (1.6), generalizedaffineimage11.cc (1.5),
+	  generalizedaffineimage12.cc (1.4), generalizedaffineimage2.cc
+	  (1.6), generalizedaffineimage3.cc (1.7),
+	  generalizedaffineimage4.cc (1.5), generalizedaffineimage5.cc
+	  (1.5), generalizedaffineimage6.cc (1.5),
+	  generalizedaffineimage7.cc (1.7), generalizedaffineimage8.cc
+	  (1.5), generalizedaffineimage9.cc (1.5): Reflect the changes to
+	  the enumerate Relation_Symbol.
+
+2003-03-07 Friday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.68), ppl_c.h (1.74): New functions
+	  ppl_LinExpression_coefficient() and
+	  ppl_LinExpression_inhomogeneous_term().
+
+2003-03-07 Friday 17:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.73): Reorganized the C interface
+	  documentation using Doxygen member grouping and trying to use
+	  brief comments when possible.
+
+2003-03-07 Friday 15:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.61): Old stuff removed.
+
+2003-03-07 Friday 15:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.67), doc/definitions.dox (1.112), doc/ppl.sty (1.11),
+	  interfaces/C/ppl_c.cc (1.67), interfaces/C/ppl_c.h (1.72),
+	  interfaces/Prolog/Prolog_interface.dox (1.85),
+	  interfaces/Prolog/ppl_prolog.icc (1.92), src/Constraint.defs.hh
+	  (1.82), src/LinExpression.defs.hh (1.58), src/Polyhedron.cc
+	  (1.318), src/Polyhedron.defs.hh (1.197), src/globals.hh (1.32):
+	  We now speak of "relation symbols", not of "relation operators"
+	  or "relational operators".
+
+2003-03-07 Friday 14:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.111),
+	  interfaces/Prolog/Prolog_interface.dox (1.84): The discussion
+	  about eager methods moved from the prolog interface to the
+	  introduction (just before the bibliography).
+
+2003-03-07 Friday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.66), TODO (1.36), interfaces/C/ppl_c.cc (1.66),
+	  interfaces/C/ppl_c.h (1.71),
+	  interfaces/Prolog/Prolog_interface.dox (1.83),
+	  interfaces/Prolog/pl_check.pl (1.45),
+	  interfaces/Prolog/ppl_prolog.icc (1.91),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.37),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.27),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.41),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.65),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.15),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.25),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.59), src/Determinate.defs.hh
+	  (1.28), src/Determinate.inlines.hh (1.26), src/Polyhedron.defs.hh
+	  (1.196), src/Polyhedron.inlines.hh (1.65), src/PowerSet.defs.hh
+	  (1.28), src/PowerSet.inlines.hh (1.32), tests/Makefile.am
+	  (1.174), tests/renamedim1.cc (1.1), tests/shuffledim1.cc (1.11):
+	  We rename dimensions, we do not shuffle them.
+
+2003-03-07 Friday 11:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.110), devref-browse.doxyconf-latex.in
+	  (1.26), devref-print.doxyconf-latex.in (1.26),
+	  devref.doxyconf-html.in (1.27), user-browse.doxyconf-latex.in
+	  (1.14), user-print.doxyconf-latex.in (1.14),
+	  user.doxyconf-html.in (1.16): Updated Doxygen configuration files
+	  to version 1.3-rc3-20030223.	Small typo fixed in
+	  definitions.dox.
+
+2003-03-07 Friday 11:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.90): Predicate
+	  ppl_Polyhedron_shuffle_dimensions/2 now fails when given a
+	  non-injective function.
+
+2003-03-07 Friday 09:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: CbecomesNNC1.cc (1.4), NNCinclusion1.cc (1.6),
+	  NNCminimize1.cc (1.9), NNCminimize2.cc (1.9), NNCminimize3.cc
+	  (1.9), NNCminimize4.cc (1.11), NNCminimize5.cc (1.8),
+	  NNCminimize6.cc (1.10), addconstraint1.cc (1.4),
+	  addconstraint2.cc (1.3), addconstraint3.cc (1.3),
+	  addconstraints1.cc (1.10), addconstraints10.cc (1.9),
+	  addconstraints11.cc (1.10), addconstraints12.cc (1.3),
+	  addconstraints13.cc (1.5), addconstraints2.cc (1.18),
+	  addconstraints3.cc (1.8), addconstraints4.cc (1.10),
+	  addconstraints5.cc (1.11), addconstraints6.cc (1.12),
+	  addconstraints7.cc (1.11), addconstraints8.cc (1.11),
+	  addconstraints9.cc (1.12), adddimensions1.cc (1.13),
+	  adddimensions10.cc (1.6), adddimensions11.cc (1.4),
+	  adddimensions12.cc (1.3), adddimensions2.cc (1.9),
+	  adddimensions3.cc (1.11), adddimensions4.cc (1.9),
+	  adddimensions5.cc (1.7), adddimensions6.cc (1.7),
+	  adddimensions7.cc (1.7), adddimensions8.cc (1.5),
+	  adddimensions9.cc (1.5), addgenerator1.cc (1.4), addgenerator2.cc
+	  (1.4), addgenerator3.cc (1.3), addgenerator4.cc (1.4),
+	  addgenerators1.cc (1.11), addgenerators10.cc (1.3),
+	  addgenerators11.cc (1.5), addgenerators12.cc (1.5),
+	  addgenerators2.cc (1.11), addgenerators3.cc (1.11),
+	  addgenerators4.cc (1.11), addgenerators5.cc (1.11),
+	  addgenerators6.cc (1.11), addgenerators7.cc (1.8),
+	  addgenerators8.cc (1.6), addgenerators9.cc (1.5), affineimage1.cc
+	  (1.11), affineimage2.cc (1.10), affineimage3.cc (1.3),
+	  affineimage4.cc (1.3), affineimage5.cc (1.4), affineimage6.cc
+	  (1.3), affineimage7.cc (1.3), affineimage8.cc (1.6),
+	  affinepreimage1.cc (1.10), affinepreimage10.cc (1.6),
+	  affinepreimage2.cc (1.10), affinepreimage3.cc (1.10),
+	  affinepreimage4.cc (1.11), affinepreimage5.cc (1.3),
+	  affinepreimage6.cc (1.4), affinepreimage7.cc (1.3),
+	  affinepreimage8.cc (1.3), affinepreimage9.cc (1.4),
+	  affinetrans.cc (1.13), append1.cc (1.21), append2.cc (1.21),
+	  ascii_dump_load1.cc (1.12), ascii_dump_load2.cc (1.10),
+	  ascii_dump_load3.cc (1.13), ascii_dump_load4.cc (1.13),
+	  ascii_dump_load5.cc (1.9), ascii_dump_load6.cc (1.6),
+	  ascii_dump_load7.cc (1.6), bhrz03widening1.cc (1.3),
+	  bhrz03widening10.cc (1.3), bhrz03widening11.cc (1.3),
+	  bhrz03widening12.cc (1.3), bhrz03widening13.cc (1.3),
+	  bhrz03widening14.cc (1.3), bhrz03widening15.cc (1.5),
+	  bhrz03widening16.cc (1.3), bhrz03widening17.cc (1.3),
+	  bhrz03widening18.cc (1.3), bhrz03widening19.cc (1.3),
+	  bhrz03widening2.cc (1.5), bhrz03widening3.cc (1.5),
+	  bhrz03widening4.cc (1.3), bhrz03widening5.cc (1.3),
+	  bhrz03widening6.cc (1.4), bhrz03widening7.cc (1.4),
+	  bhrz03widening8.cc (1.3), bhrz03widening9.cc (1.5), bounded1.cc
+	  (1.9), boundingbox1.cc (1.32), boundingbox2.cc (1.17),
+	  boundingbox3.cc (1.8), boundingbox4.cc (1.5), bounds1.cc (1.5),
+	  bounds2.cc (1.5), concatenate1.cc (1.7), concatenate2.cc (1.6),
+	  concatenate3.cc (1.6), concatenate4.cc (1.5), concatenate5.cc
+	  (1.3), concatenate6.cc (1.5), constraints1.cc (1.5),
+	  constraints2.cc (1.5), constraints3.cc (1.5), constraints4.cc
+	  (1.5), contains1.cc (1.3), disjoint1.cc (1.3), disjoint2.cc
+	  (1.5), disjoint3.cc (1.4), ehandlers.hh (1.7), empty1.cc (1.12),
+	  exceptions1.cc (1.31), exceptions2.cc (1.25),
+	  generalizedaffineimage1.cc (1.6), generalizedaffineimage10.cc
+	  (1.5), generalizedaffineimage11.cc (1.4),
+	  generalizedaffineimage12.cc (1.3), generalizedaffineimage2.cc
+	  (1.5), generalizedaffineimage3.cc (1.6),
+	  generalizedaffineimage4.cc (1.4), generalizedaffineimage5.cc
+	  (1.4), generalizedaffineimage6.cc (1.4),
+	  generalizedaffineimage7.cc (1.6), generalizedaffineimage8.cc
+	  (1.4), generalizedaffineimage9.cc (1.4), generators1.cc (1.12),
+	  generators2.cc (1.8), generators3.cc (1.4), generators4.cc (1.4),
+	  generators5.cc (1.4), generators6.cc (1.5), h79widening1.cc
+	  (1.5), h79widening2.cc (1.6), h79widening3.cc (1.6),
+	  h79widening4.cc (1.3), h79widening5.cc (1.4), inclusion1.cc
+	  (1.6), inclusion2.cc (1.3), intersection1.cc (1.5),
+	  intersection10.cc (1.4), intersection11.cc (1.5),
+	  intersection2.cc (1.8), intersection3.cc (1.6), intersection4.cc
+	  (1.6), intersection5.cc (1.6), intersection6.cc (1.6),
+	  intersection7.cc (1.5), intersection8.cc (1.4), intersection9.cc
+	  (1.4), limitedbhrz03extrapolation1.cc (1.2),
+	  limitedh79extrapolation1.cc (1.2), limitedh79extrapolation2.cc
+	  (1.2), limitedh79extrapolation3.cc (1.2),
+	  limitedh79extrapolation4.cc (1.2), linearpartition1.cc (1.9),
+	  linearpartition2.cc (1.9), linearpartition3.cc (1.9),
+	  linexpression1.cc (1.3), mc91.cc (1.11), memory1.cc (1.19),
+	  minconstraints1.cc (1.4), minconstraints2.cc (1.4),
+	  minconstraints3.cc (1.3), minconstraints4.cc (1.7),
+	  mingenerators1.cc (1.4), mingenerators2.cc (1.3),
+	  mingenerators3.cc (1.3), onepoint.cc (1.9), operator1.cc (1.4),
+	  permute.cc (1.28), polydifference1.cc (1.6), polydifference2.cc
+	  (1.8), polydifference3.cc (1.3), polydifference4.cc (1.4),
+	  polydifference5.cc (1.5), polydifference6.cc (1.5),
+	  polydifference7.cc (1.4), polyhull1.cc (1.6), polyhull10.cc
+	  (1.3), polyhull2.cc (1.6), polyhull3.cc (1.6), polyhull4.cc
+	  (1.5), polyhull5.cc (1.4), polyhull6.cc (1.4), polyhull7.cc
+	  (1.3), polyhull8.cc (1.4), polyhull9.cc (1.5), randphull1.cc
+	  (1.8), randphull2.cc (1.5), relations1.cc (1.9), relations10.cc
+	  (1.5), relations11.cc (1.5), relations12.cc (1.4), relations13.cc
+	  (1.4), relations14.cc (1.4), relations15.cc (1.4), relations16.cc
+	  (1.4), relations17.cc (1.6), relations18.cc (1.4), relations19.cc
+	  (1.5), relations2.cc (1.10), relations3.cc (1.10), relations4.cc
+	  (1.10), relations5.cc (1.10), relations6.cc (1.9), relations7.cc
+	  (1.9), relations8.cc (1.9), relations9.cc (1.11), removedim1.cc
+	  (1.10), removedim2.cc (1.14), removedim3.cc (1.10), removedim4.cc
+	  (1.11), removedim5.cc (1.9), removedim6.cc (1.12), removedim7.cc
+	  (1.7), removedim8.cc (1.5), removedim9.cc (1.4), shuffledim1.cc
+	  (1.10), smm1.cc (1.13), timeelapse1.cc (1.7), timeelapse2.cc
+	  (1.7), timeelapse3.cc (1.7), timeelapse4.cc (1.7), timeelapse5.cc
+	  (1.7), timeelapse6.cc (1.3), timeelapse7.cc (1.3), timeelapse8.cc
+	  (1.4), topclosed1.cc (1.4), topclosed2.cc (1.3), topclosed3.cc
+	  (1.5), topclosure1.cc (1.6), topclosure2.cc (1.3), topclosure3.cc
+	  (1.3), topclosure4.cc (1.5), universe1.cc (1.8), universe2.cc
+	  (1.9), universe3.cc (1.9), universe4.cc (1.9), universe5.cc
+	  (1.10), universe6.cc (1.7), watchdog1.cc (1.17), writeconsys1.cc
+	  (1.6), writegensys1.cc (1.7), writegensys2.cc (1.7),
+	  writegensys3.cc (1.6), writepolyhedron1.cc (1.6),
+	  writepolyhedron2.cc (1.7), writepolyhedron3.cc (1.6),
+	  writerelation1.cc (1.6), writevariable1.cc (1.6): Treatment of
+	  exceptions harmonized.  Some stylistic improvements.
+
+2003-03-07 Friday 09:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.82), pl_check.pl
+	  (1.44): Added documentation and tests for the new Prolog
+	  interface predicates ppl_Polyhedron_generalized_affine_image/5
+	  and ppl_Polyhedron_generalized_affine_image_lhs_rhs/4.
+
+2003-03-06 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: append1.cc (1.20), permute.cc (1.27), shuffledim1.cc
+	  (1.9): Return 1 on failure.
+
+2003-03-06 Thursday 21:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.70): Avoid using `//' comments, since
+	  they are not in C89.	Let the multiple inclusion guard be
+	  external to everything.
+
+2003-03-06 Thursday 21:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.89), Ciao/ppl_ciao.pl
+	  (1.36), GNU/ppl_gprolog.pl (1.26), SICStus/ppl_sicstus_sd.cc
+	  (1.40), SWI/ppl_swiprolog.cc (1.64), XSB/ppl_xsb.H (1.14),
+	  XSB/ppl_xsb.cc (1.24), YAP/ppl_yap.cc (1.58): New predicates
+	  ppl_Polyhedron_generalized_affine_image/5 and
+	  ppl_Polyhedron_generalized_affine_image_lhs_rhs/4.
+
+2003-03-06 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/version.hh.in (1.4): Specify that the beta number is zero for
+	  official releases and nonzero for development snapshots.
+
+2003-03-06 Thursday 12:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.81): Improved
+	  discussion about *_and_minimize predicates.
+
+2003-03-06 Thursday 11:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/version.hh.in (1.3): Small correction of module heading.
+
+2003-03-06 Thursday 11:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.109), doc/fdl.dox (1.3), doc/gpl.dox
+	  (1.4), interfaces/C/ppl_c.h (1.69),
+	  interfaces/Prolog/Prolog_interface.dox (1.80): Let the licence
+	  pages and the documentation of foreign language interfaces be
+	  grouped into ``modules'', so as to avoid spreading information in
+	  too many places of the user manual. We no longer have a ``PPL
+	  pages'' index.
+
+2003-03-06 Thursday 09:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.43): Updated the predicate
+	  testing the PPL watchdog predicates to use ppl_Polyhedron_swap/2.
+
+2003-03-06 Thursday 09:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.79), pl_check.pl
+	  (1.42): Added the ppl_Polyhedron_time_elapse_assign/2 to the
+	  Prolog documentation and to the tests in pl_check.pl.
+
+2003-03-05 Wednesday 23:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/version.hh.in (1.2): Library defines with version info put
+	  inside a \defgroup block to have them appear in the user
+	  documentation.
+
+2003-03-05 Wednesday 18:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: append1.cc (1.19), append2.cc (1.20), concatenate1.cc
+	  (1.6), permute.cc (1.26): Do not use the obsolete
+	  operator>>(const Constraint&, unsigned int).
+
+2003-03-05 Wednesday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.88), Ciao/ppl_ciao.pl
+	  (1.35), GNU/ppl_gprolog.pl (1.25), SICStus/ppl_sicstus_sd.cc
+	  (1.39), SWI/ppl_swiprolog.cc (1.63), XSB/ppl_xsb.H (1.13),
+	  XSB/ppl_xsb.cc (1.23), YAP/ppl_yap.cc (1.57): New predicate
+	  ppl_Polyhedron_time_elapse_assign/2.
+
+2003-03-05 Wednesday 17:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.64), tests/shuffledim1.cc (1.8):
+	  Corrected implementation of shuffle_dimensions() and the known
+	  result in the last test of shuffledim1.
+
+2003-03-05 Wednesday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.317): Avoid useless abbreviations.
+
+2003-03-05 Wednesday 15:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.41): Call to polydiff_assign_min
+	  removed from check_all.
+
+2003-03-05 Wednesday 15:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.78), pl_check.pl
+	  (1.40): Added ppl_Polyhedron_swap/2.	Shuffle_Map syntax added
+	  and ppl_Polyhedron_shuffle_dimensions/2 documentation header
+	  added.
+
+2003-03-05 Wednesday 14:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.65), interfaces/C/ppl_c.cc (1.65), interfaces/C/ppl_c.h
+	  (1.68), interfaces/Prolog/Prolog_interface.dox (1.77),
+	  interfaces/Prolog/pl_check.pl (1.39),
+	  interfaces/Prolog/ppl_prolog.icc (1.87),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.34),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.24),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.38),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.62),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.12),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.22),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.56), src/Polyhedron.cc
+	  (1.316), src/Polyhedron.defs.hh (1.195), tests/polydifference6.cc
+	  (1.4): The method
+	  Polyhedron::poly_difference_assign_and_minimize(const
+	  Polyhedron&) has been removed.
+
+2003-03-05 Wednesday 14:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.86), Ciao/ppl_ciao.pl
+	  (1.33), GNU/ppl_gprolog.pl (1.23), SICStus/ppl_sicstus_sd.cc
+	  (1.37), SWI/ppl_swiprolog.cc (1.61), XSB/ppl_xsb.H (1.11),
+	  XSB/ppl_xsb.cc (1.21), YAP/ppl_yap.cc (1.55): New predicate
+	  ppl_Polyhedron_swap/2.
+
+2003-03-05 Wednesday 14:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.315), Polyhedron.defs.hh (1.194): The
+	  (dis-)equality boolean functions operator== and operator!= on
+	  objects of the class Polyhedron no longer require topological-
+	  and dimension-consistency. Inconsistent objects are not
+	  equivalent.
+
+2003-03-05 Wednesday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.64), configure.ac (1.89), src/Makefile.am (1.60),
+	  src/version.cc (1.1), src/version.hh.in (1.1): New macros
+	  PPL_VERSION_MAJOR, PPL_VERSION_MINOR, PPL_VERSION_REVISION, and
+	  PPL_VERSION_BETA allow the client application to adapt to
+	  different versions of the library.
+
+	  New function const char* version() returns a character string
+	  containing the PPL version.
+
+	  New function const char* banner() returns a character string
+	  containing information about the PPL version, the licensing, the
+	  lack of any warranty whatsoever, the C++ compiler used to build
+	  the library, where to report bugs and where to look for further
+	  information.
+
+2003-03-05 Wednesday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.63): News item concerning the new
+	  Polyhedron::generalized_affine_image() operators revised.
+
+2003-03-05 Wednesday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/shuffledim1.cc (1.7): Added a test showing a bug in
+	  Polyhedron::shuffle_dimensions().
+
+2003-03-05 Wednesday 10:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.62): Improved the synthetic description of methods
+	  generalized_affine_image().
+
+2003-03-04 Tuesday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.88): Require GMP version 4.1.2 or following.
+
+2003-03-04 Tuesday 18:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.61): The C and Prolog interfaces have been extended so as
+	  to make more of the library's functionality available to Prolog
+	  and C users.
+
+2003-03-04 Tuesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.67): Comments fixed.
+
+2003-03-04 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.64), ppl_c.h (1.66): New functions
+	  ppl_ConSys_clear() and ppl_GenSys_clear().
+
+2003-03-04 Tuesday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.85): Predicate
+	  ppl_Polyhedron_shuffle_dimensions(Ph, PFun) now fails if the
+	  domain of PFun is not contained in the space dimension of Ph.
+
+2003-03-04 Tuesday 17:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.60): Added the new Polyhedron::generalized_affine_image()
+	  method.
+
+2003-03-04 Tuesday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.59), src/Constraint.cc (1.37), src/Constraint.defs.hh
+	  (1.81): The operator Constraint operator>>(const Constraint&,
+	  dimension_type) has been removed.
+
+2003-03-04 Tuesday 15:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.108), src/Polyhedron.defs.hh (1.193):
+	  Reordered the sections in the final part of definitions.dox;
+	  added a section on extrapolation operators, describing the
+	  limited and bounded extrapolation operators.	Corrected
+	  capitalization of a doxygen reference.
+
+2003-03-04 Tuesday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.63), ppl_c.h (1.65): New functions
+	  ppl_Polyhedron_generalized_affine_image() and
+	  ppl_Polyhedron_generalized_affine_image_lhs_rhs().
+
+2003-03-04 Tuesday 08:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.38): Bug corrected.
+
+2003-03-04 Tuesday 08:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.37): Improved tests for widenig
+	  operators.  Added tests for ...shuffle_dimensions.
+
+2003-03-04 Tuesday 06:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.17): We require GMP at least 4.1.2.
+
+2003-03-03 Monday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.64): For some reason, GMP up to and
+	  including version 4.1.2 requires <stdio.h> to be included before
+	  <gmp.h>.
+
+2003-03-03 Monday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.62), ppl_c.h (1.63): The `var'
+	  argument of ppl_Constraint_coefficient() and
+	  ppl_Generator_coefficient() is of type ppl_dimension_type.
+
+2003-03-03 Monday 21:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.62): FIXME added.
+
+2003-03-03 Monday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.61): Do not worry about versions of GMP
+	  prior to 4.1.2 since they are not supported anyway.
+
+2003-03-03 Monday 21:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.61), ppl_c.h (1.60): New function
+	  ppl_Polyhedron_time_elapse_assign().
+
+2003-03-03 Monday 21:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.60), ppl_c.h (1.59): Added
+	  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign() and
+	  ppl_Polyhedron_bounded_H79_extrapolation_assign().  Comments of
+	  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign() and
+	  ppl_Polyhedron_limited_H79_extrapolation_assign() fixed.
+
+2003-03-03 Monday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* depcomp (1.4), install-sh (1.4), Watchdog/depcomp (1.2),
+	  Watchdog/install-sh (1.2): Updated.
+
+2003-03-03 Monday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.87), Watchdog/configure.ac (1.16): Require
+	  Autoconf 2.57 or following and Automake 1.7.3 or following.
+
+2003-03-03 Monday 20:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.27), PowerSet.inlines.hh (1.31): The
+	  method PowerSet<CS>::limited_H79_extrapolation_assign() takes a
+	  constant constraint system.
+
+2003-03-03 Monday 19:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.59), ppl_c.h (1.58):
+	  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign() and
+	  ppl_Polyhedron_limited_H79_extrapolation_assign() take a constant
+	  constraint system.
+
+2003-03-03 Monday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.12), Watchdog/COPYING (1.2), Watchdog/ChangeLog
+	  (1.3), Watchdog/INSTALL (1.2), Watchdog/NEWS (1.2),
+	  Watchdog/config.guess (1.2), Watchdog/config.sub (1.2),
+	  Watchdog/ltmain.sh (1.2): Updated.
+
+2003-03-03 Monday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.7): Update version info.
+
+2003-03-03 Monday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.13), src/Makefile.am (1.59): AGE must
+	  be reset to 0 since we removed some interfaces.
+
+2003-03-03 Monday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.30), exceptions2.cc (1.24): Refer the
+	  new extrapolation operators.
+
+2003-03-03 Monday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.58), interfaces/C/ppl_c.cc (1.58), interfaces/C/ppl_c.h
+	  (1.57), interfaces/Prolog/Prolog_interface.dox (1.76),
+	  interfaces/Prolog/pl_check.pl (1.36),
+	  interfaces/Prolog/ppl_prolog.icc (1.84),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.32),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.22),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.36),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.60),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.10),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.20),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.54), src/Determinate.defs.hh
+	  (1.27), src/Determinate.inlines.hh (1.25), src/Polyhedron.cc
+	  (1.314), src/Polyhedron.defs.hh (1.192), src/PowerSet.defs.hh
+	  (1.26), src/PowerSet.inlines.hh (1.30), src/algorithms.hh (1.14),
+	  tests/Makefile.am (1.173), tests/limitedbhrz03extrapolation1.cc
+	  (1.1), tests/limitedbhrz03widening1.cc (1.5),
+	  tests/limitedh79extrapolation1.cc (1.1),
+	  tests/limitedh79extrapolation2.cc (1.1),
+	  tests/limitedh79extrapolation3.cc (1.1),
+	  tests/limitedh79extrapolation4.cc (1.1),
+	  tests/limitedh79widening1.cc (1.6), tests/limitedh79widening2.cc
+	  (1.7), tests/limitedh79widening3.cc (1.4),
+	  tests/limitedh79widening4.cc (1.4): From now on, the name
+	  `widening' is reserved for operators that come with a convergence
+	  guarantee (i.e., with the ability of turning infinite chains to
+	  finite ones).  Upper bound operators without such a guarantee
+	  contain the word `extrapolation' in their name.
+
+2003-03-03 Monday 16:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.57): Confine implementation classes into
+	  anonymous namespaces.
+
+2003-03-03 Monday 16:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.57): News item for Polyhedron::shrink_bounding_box()
+	  completed.
+
+2003-03-03 Monday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.56): News item concerning
+	  Polyhedron::shuffle_dimensions() completed.
+
+2003-03-03 Monday 16:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.56), ppl_c.h (1.56): New function int
+	  ppl_Polyhedron_shuffle_dimensions().
+
+2003-03-03 Monday 15:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.191): Another reorganization for better
+	  documentation.
+
+2003-03-03 Monday 14:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.190): Let all the methods
+	  <method>_and_minimize be declared after the corresponding methods
+	  <method>, so that a less disordered documentation is produced.
+
+2003-03-03 Monday 12:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.313), Polyhedron.defs.hh (1.189): Now the
+	  constraint system parameter of methods bounded_*_widening_assign
+	  and limited_*_widening_assign is a const parameter.
+
+2003-03-03 Monday 11:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.55), ppl_c.h (1.55): New function int
+	  ppl_not_a_dimension(ppl_dimension_type*).
+
+2003-03-03 Monday 11:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.83), Ciao/ppl_ciao.pl
+	  (1.31), GNU/ppl_gprolog.pl (1.21), SICStus/ppl_sicstus_sd.cc
+	  (1.35), SWI/ppl_swiprolog.cc (1.59), XSB/ppl_xsb.H (1.9),
+	  XSB/ppl_xsb.cc (1.19), YAP/ppl_yap.cc (1.53): New predicate
+	  ppl_Polyhedron_shuffle_dimensions/2.
+
+2003-03-03 Monday 11:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.55), src/globals.hh (1.31): New function dimension_type
+	  not_a_dimension(): returns a value that does not designate a
+	  valid dimension.
+
+2003-03-03 Monday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.35): We must explain to the users of CVS versions how to
+	  build the documentation.
+
+2003-03-02 Sunday 20:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.34): Make sure all the functionalities are available in
+	  all interfaces.
+
+2003-03-02 Sunday 20:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.33), src/Polyhedron.defs.hh (1.188),
+	  src/Polyhedron.inlines.hh (1.63): Documentation of
+	  Polyhedron::shuffle_dimensions() improved.
+
+2003-03-02 Sunday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.32): More things that should not be forgotten.
+
+2003-03-02 Sunday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.54): News items added, others improved, reorganized.
+
+2003-03-02 Sunday 19:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.11): Updated.
+
+2003-03-01 Saturday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.312): Full stop added.
+
+2003-03-01 Saturday 07:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sicstus_cfli.ic (1.5): Include
+	  assert.h.
+
+2003-03-01 Saturday 07:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.34): Includes
+	  reordered.
+
+2003-03-01 Saturday 07:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.86): Enable shared the libraries by default.
+
+2003-03-01 Saturday 07:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.17), config.sub (1.16), ltmain.sh (1.11):
+	  Updated.
+
+2003-02-24 Monday 18:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-browse.doxyconf-latex.in (1.25),
+	  doc/devref-print.doxyconf-latex.in (1.25),
+	  doc/devref.doxyconf-html.in (1.26), src/Init.cc (1.8),
+	  src/Makefile.am (1.58), src/Polyhedron.cc (1.311),
+	  src/Statistics.hh (1.2), src/statistics.hh (1.1): Statistics.hh
+	  improved, added to the documentation for developers, and renamed
+	  statistics.hh.
+
+2003-02-24 Monday 16:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Init.cc (1.7), Makefile.am (1.57), Polyhedron.cc (1.310),
+	  Statistics.hh (1.1), globals.cc (1.12), globals.hh (1.30):
+	  Removed from globals.hh and globals.cc all the stuff related to
+	  statistics and placed into Statistics.hh; modified Polyhedron.cc
+	  and Init.cc accordingly.
+
+2003-02-23 Sunday 21:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bhrz03widening2.cc (1.4), limitedbhrz03widening1.cc
+	  (1.4): Restored expected result after correction on evolving
+	  points technique.
+
+2003-02-23 Sunday 20:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.309), tests/Makefile.am (1.172),
+	  tests/bhrz03widening3.cc (1.4): Improved is_BHRZ03_stabilizing to
+	  always avoid considering the low-level constraints when comparing
+	  the number of constraints. As a consequence, changed back the
+	  known result of test bhrz03widening3.
+
+2003-02-23 Sunday 16:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.31): Remember to comment uncommented classes.
+
+2003-02-23 Sunday 09:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.tex (1.10), user.tex (1.11): Thank the CoVer
+	  project.
+
+2003-02-22 Saturday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.44): Two FIXMEs dealt with and removed.
+
+2003-02-22 Saturday 21:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.inlines.hh (1.37), SatRow.inlines.hh (1.24): Redundant
+	  comment removed.
+
+2003-02-22 Saturday 21:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.inlines.hh (1.36), SatRow.inlines.hh (1.23): FIXMEs
+	  related to Doxygen's bugs removed.
+
+2003-02-22 Saturday 21:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.defs.hh (1.61): FIXME dealt with and removed.
+
+2003-02-22 Saturday 21:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.171), bhrz03widening2.cc (1.3),
+	  bhrz03widening3.cc (1.3), limitedbhrz03widening1.cc (1.3):
+	  Expected results adjusted.
+
+2003-02-22 Saturday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.308): Commit to
+	  BHRZ03_EP_DELAY_INTERSECTION.
+
+2003-02-22 Saturday 09:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PowerSet.defs.hh (1.25): Fixed a parameter name mismatch in
+	  the documentation.
+
+2003-02-21 Friday 19:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.80): Doxygen documentation fix: "<" and
+	  ">" should not be escaped by "\" when occurring inside a \code
+	  ... \endcode section.
+
+2003-02-21 Friday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.107): Bibliography and bibliographic
+	  references improved.
+
+2003-02-21 Friday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/bib2html2.sed (1.3): Provide text for the \ref link commands.
+
+2003-02-21 Friday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: bib2dox (1.3), bib2html2.sed (1.2): Produce
+	  cross-references that work well with any Doxygen output.
+
+2003-02-21 Friday 16:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.106), src/Polyhedron.defs.hh (1.187): In
+	  the documentation, added explanation for the BHRZ03 widening and
+	  the widening with tokens technique.  Broken <a name=...> links
+	  replaced by \ref and \anchor.
+
+2003-02-21 Friday 11:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.10): Updated.
+
+2003-02-21 Friday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.85): Version number bumped.
+
+2003-02-21 Friday 10:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.307), Polyhedron.defs.hh (1.186): The
+	  widening-with-tokens delay technique is now also available for
+	  the standard widening as well as the ``limited'' and ``bounded''
+	  variants.
+
+2003-02-21 Friday 09:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.30): Items dealt with removed.
+
+2003-02-21 Friday 09:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.75), pl_check.pl
+	  (1.35): Prolog_interface.dox:   Added simple descriptions for the
+	  timeout predicates.	 Atom added to the syntax of the language
+	  specification.  pl_check.pl	Several small improvements.
+
+2003-02-21 Friday 08:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.306), Polyhedron.defs.hh (1.185): In
+	  Polyhedron::BHRZ03_widening_assign(), pass the number of tokens
+	  as `unsigned', not `long'.
+
+2003-02-20 Thursday 16:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Init.cc (1.6), Polyhedron.cc (1.305), Polyhedron.defs.hh
+	  (1.184), globals.hh (1.29): The averaging_constraints technique
+	  is now called combining_constraints.	Added optional pointer
+	  argument to BHRZ03_widening_assign to implement the
+	  ``widening-with-tokens'' technique.
+
+2003-02-19 Wednesday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/track_allocation.hh (1.12): Declaration fixed.
+
+2003-02-16 Sunday 14:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.9): Updated.
+
+2003-02-16 Sunday 14:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: bhrz03widening15.cc (1.4), bhrz03widening6.cc (1.3),
+	  bhrz03widening7.cc (1.3): Expected results fixed.
+
+2003-02-11 Tuesday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.304): Commit to
+	  BHRZ03_AC_CHECKS_H79_BOUNDARY=1.
+
+2003-02-11 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.303): Commit to BHRZ03_AC_IS_SUM=1.
+
+2003-02-11 Tuesday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.302): Commit to BHRZ03_ER_CWQ=1.
+
+2003-02-09 Sunday 18:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.301): New candidate techniques for the
+	  implementation of BRHZ03.
+
+2003-02-07 Friday 20:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.300): Let an assertion in
+	  select_H79_constraints be satisfied.
+
+2003-02-07 Friday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.299): Unreachable statements removed.
+
+2003-02-07 Friday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.62): Make sure inline functions are
+	  defined before being used.
+
+2003-02-07 Friday 11:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.298): Added new preproc flag BHRZ03_EP_P1_P2
+	  to be experimented with.
+
+2003-02-07 Friday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.10): Throw std::runtime_error instead of
+	  calling abort().
+
+2003-02-07 Friday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.inlines.hh (1.9): Throw std::invalid_argument
+	  if a Watchdog constructor is called with a non-positive number of
+	  time units.
+
+2003-02-06 Thursday 18:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.297): Added preprocessing flag
+	  BHRZ03_EP_DELAY_INTERSECTION, enabling a different implementation
+	  of the evolving points technique to be experimented with.
+
+2003-02-06 Thursday 10:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.296): Make BHRZ03_AC_IS_SUM and
+	  BHRZ03_AC_CHECKS_H79_BOUNDARY default to 1.
+
+2003-02-05 Wednesday 16:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.295), tests/limitedh79widening2.cc (1.6):
+	  Corrected the implementation of limited_H79_widening_assign to
+	  match its specification; the same for
+	  limited_BHRZ03_widening_assign.  Corrected the known result of
+	  test limitedh79widening2, which was computed according to a
+	  flawed specification.
+
+2003-02-05 Wednesday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.294): Both BHRZ03_AC_IS_SUM and
+	  BHRZ03_AC_CHECKS_H79_BOUNDARY default to 0.
+
+2003-02-05 Wednesday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.293), Polyhedron.defs.hh (1.183): A first,
+	  totally untested implementation of
+	  Polyhedron::bounded_H79_widening_assign() and
+	  Polyhedron::bounded_BHRZ03_widening_assign().
+
+2003-02-05 Wednesday 11:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.182): Improved the Doxygen comments for
+	  the two limited widening operators.
+
+2003-02-05 Wednesday 10:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.181): Give more guarantees to the user
+	  of Polyhedron::shrink_bounding_box().
+
+2003-02-05 Wednesday 10:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.292): Added preprocessing flags to control
+	  whether or not, in the technique BHRZ03_averaging_constraints, we
+	  actually compute averages or just sum the constraints and whether
+	  the selected point can lie on the boundary of H79.
+
+2003-02-04 Tuesday 21:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.16), config.sub (1.15): Updated.
+
+2003-02-04 Tuesday 20:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.291): Spurious newline removed.
+
+2003-02-04 Tuesday 19:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.290): Avoiding equality check in
+	  is_BHRZ03_stabilizing, which is called more than once, and
+	  computing it just once inside BHRZ03_widening_assign.
+
+2003-02-04 Tuesday 11:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.289): Corrected a bug in
+	  H79_widening_assign, whereby we were relying on the number of
+	  columns of a constraint system that was not up-to-date.
+
+2003-02-04 Tuesday 09:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.288), Polyhedron.inlines.hh (1.61): When
+	  declaring constraints (generators) no longer up-to-date, also
+	  clearing the pending constraints (generators) flag.  In
+	  H79_widening_assign, avoiding the creation of polyhedra having
+	  the wrong dimension.
+
+2003-02-03 Monday 15:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.287), Polyhedron.defs.hh (1.180): The
+	  quick equivalence check is now a provate method of Polyhedron and
+	  it is called also by the inclusion test operator<=.  Improved the
+	  computation of the H79widening operator by resorting to CH78 when
+	  polyhedra x and y have the same dimension.
+
+2003-02-01 Saturday 15:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.286): Commented out conditionals removed.
+
+2003-02-01 Saturday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.51): Old garbage removed.
+
+2003-01-31 Friday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.50): Fixed a very serious performance bug in
+	  Matrix::add_pending_rows() whereby adding one row to a matrix
+	  with `n' rows had complexity O(n) instead of amortized constant.
+
+2003-01-27 Monday 13:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: expected (1.6), expected2 (1.7): Adapted
+	  to the new normal form.
+
+2003-01-27 Monday 11:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.84), interfaces/Prolog/expected (1.5),
+	  interfaces/Prolog/expected2 (1.9), src/Row.cc (1.49),
+	  src/Row.defs.hh (1.60): Modified strong normalization of rows, so
+	  that the first *homogeneous* coefficient is required to be
+	  positive.
+
+2003-01-27 Monday 10:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.285): Removed no longer used preprocessing
+	  flag.
+
+2003-01-27 Monday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.49), Matrix.defs.hh (1.42): Added private
+	  method Matrix::gram_shmidt() to orthogonalize a matrix so that
+	  its rays/points/inequalities have a unique representation.
+
+2003-01-27 Monday 10:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: conversion.cc (1.43), minimize.cc (1.31), simplify.cc
+	  (1.25): Adjusted a few comments that became outdated after the
+	  merge with the lazy branch. Removed a couple of FIXME's.
+
+2003-01-26 Sunday 22:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.9): Ported to Cygwin (it only supports
+	  ITIMER_REAL).  Robustness increased.	Throw std:runtime_error
+	  exceptions instead of calling exit().
+
+2003-01-24 Friday 18:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.77), GenSys.defs.hh (1.89), Polyhedron.cc
+	  (1.284), Polyhedron.defs.hh (1.179), Polyhedron.inlines.hh
+	  (1.60): Equality test between polyhedra improved to first perform
+	  a few fast-fail checks, including a complete test for
+	  representations in normal form.
+
+2003-01-24 Friday 10:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.283), Polyhedron.defs.hh (1.178): Added
+	  private method  void select_CH78_constraints(const Polyhedron& y,
+	  ConSys& cs) const; performing a constraint selection from
+	  y.con_sys according to the definition of the widening as reported
+	  in Cousot&Halbwachs78.
+
+2003-01-24 Friday 10:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.79), GenSys.cc (1.75), GenSys.defs.hh
+	  (1.88): Added private method bool
+	  GenSys::satisfied_by_all_generators(const Constraint& c) const.
+
+2003-01-21 Tuesday 11:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.34): Test for time out
+	  predicates improved.
+
+2003-01-21 Tuesday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.82): Make sure that the
+	  timeout is reset when caught.
+
+2003-01-21 Tuesday 09:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.74), pl_check.pl
+	  (1.33), ppl_prolog.icc (1.81): Restored deleted text.
+
+2003-01-20 Monday 15:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/expected (1.4), interfaces/Prolog/expected2
+	  (1.8), interfaces/Prolog/XSB/expected (1.5),
+	  interfaces/Prolog/XSB/expected2 (1.6), tests/bhrz03widening15.cc
+	  (1.3), tests/bhrz03widening9.cc (1.4): Applying some semantically
+	  preserving syntactic changes to the expected results in order to
+	  match what is obtained after modification to methods
+	  Matrix::gauss() and Matrix::back_substitute().  The changes are
+	  also semantic for the known results of bhrz03widening9/15.
+
+2003-01-20 Monday 09:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.282), Polyhedron.defs.hh (1.177):
+	  Rewritten methods related to the computation of the BHRZ03
+	  widening, which are no longer static and now take the polyhedron
+	  corresponding to the H79 widening as a parameter.
+
+2003-01-20 Monday 09:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.48), Row.cc (1.48), Row.defs.hh (1.59),
+	  minimize.cc (1.30), simplify.cc (1.24): Strong normalization of
+	  Row objects now enforce the first non-zero coefficient to be
+	  positive.  When creating a matrix having n copies of the same
+	  row, the matrix is now declared to be sorted (since sortedness by
+	  itself does not implies that it has no duplicates); this also
+	  includes the case of empty matrices.	Some improvements in
+	  methods Matrix::gauss() and Matrix::back_substitute().
+
+2003-01-18 Saturday 16:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.36), Constraint.inlines.hh (1.43),
+	  Generator.cc (1.44), Matrix.cc (1.47), Polyhedron.cc (1.281),
+	  minimize.cc (1.29), simplify.cc (1.23): Implemented changes
+	  required to make the library compile cleanly and pass `make
+	  check' when the flag EXTRA_NORMALIZATION is set to 1 (the default
+	  being still 0).
+
+2003-01-18 Saturday 12:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.170): The `libppl_tests.a' library should
+	  not be built until the `make check' command is run.
+
+2003-01-18 Saturday 11:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.280): Corrected a bug in
+	  poly_hull_assign_and_minimize().
+
+2003-01-15 Wednesday 14:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README (1.14), doc/devref-browse.doxyconf-latex.in (1.24),
+	  doc/devref-print.doxyconf-latex.in (1.24),
+	  doc/devref.doxyconf-html.in (1.25), src/Init.inlines.hh (1.8): No
+	  longer using file Init.inlines.hh.
+
+2003-01-15 Wednesday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.279): After applying each of the techniques
+	  of the BHRZ03 widening, check whether we have obtained a
+	  polyhedron strictly smaller than that one obtainable using the
+	  H79 widening.
+
+2003-01-15 Wednesday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Init.cc (1.5), Init.defs.hh (1.9), Makefile.am (1.56):
+	  Initialization and finalization of the library are no longer
+	  inlined.
+
+2003-01-13 Monday 23:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.278): Many improvements in the code and
+	  comments of method averaging_constraints().
+
+2003-01-12 Sunday 23:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.59): Try to avoid minimization in
+	  method check_empty().
+
+2003-01-12 Sunday 23:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.277): In add_generators_and_minimize(), an
+	  odd use of method check_empty() replaced by correct use of method
+	  minimize().
+
+2003-01-12 Sunday 23:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.defs.hh (1.41): Fixed documentation of method
+	  index_first_pending().
+
+2003-01-12 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.169), bug1.cc (1.4), bug1.dat (1.3):
+	  Obsolete bug witness removed.
+
+2003-01-12 Sunday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.168): No longer lie to automake.
+
+2003-01-12 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.defs.hh (1.11): Spurious, illegal qualification
+	  removed.
+
+2003-01-12 Sunday 00:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.276): In check_universe(), try to avoid
+	  minimization as much as possible.
+
+2003-01-11 Saturday 22:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.275): Got rid of preprocessing flag
+	  NEW_LIMITED_GROWTH_ORDERING: now always using the new lgo in
+	  is_BHRZ03_stabilizing().  Added preprocessing flag
+	  EVOLVING_RAYS_SATURATORS for testing purposes on the evolving
+	  rays technique of BHRZ03_widening_assign().  Some improvements in
+	  the variable names and comments of the evolving rays technique.
+	  No longer testing for stabilization after applying H79 (unless
+	  assertions are turned on).
+
+2003-01-10 Friday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.15), config.sub (1.14): Updated.
+
+2003-01-10 Friday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.80): Paranoid robustness
+	  improvements.
+
+2003-01-10 Friday 09:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.79): Avoid leaking memory on
+	  exit and in the case of multiple calls to ppl_set_timeout/1 not
+	  intermixed to calls to ppl_reset_timeout/0.
+
+2003-01-10 Friday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.53), interfaces/Prolog/ppl_prolog.icc (1.78),
+	  interfaces/Prolog/Ciao/Makefile.am (1.15),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.30),
+	  interfaces/Prolog/GNU/Makefile.am (1.26),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.20),
+	  interfaces/Prolog/SICStus/Makefile.am (1.35),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.33),
+	  interfaces/Prolog/SWI/Makefile.am (1.27),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.58),
+	  interfaces/Prolog/XSB/Makefile.am (1.13),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.8),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.18),
+	  interfaces/Prolog/YAP/Makefile.am (1.17),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.52), src/Init.cc (1.4):
+	  Timeout computation facilities have been added to the Prolog
+	  interfaces: new predicates ppl_set_timeout_exception_atom/1,
+	  ppl_timeout_exception_atom/1, ppl_set_timeout/1,
+	  ppl_reset_timeout/0.
+
+2003-01-10 Friday 09:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.29): More urgent things to do.
+
+2003-01-10 Friday 09:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/watchdog1.cc (1.16): Do not explicitly initialize the Parma
+	  Watchdog Library.
+
+2003-01-10 Friday 09:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.cc (1.8), Watchdog.defs.hh (1.10),
+	  Watchdog.inlines.hh (1.8), Watchdog.types.hh (1.4): New "nifty
+	  counter" implementation of library's initialization and
+	  finalization.  Explicit initialization and finalization is no
+	  longer necessary nor possible.
+
+2003-01-10 Friday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: expected (1.4), expected2 (1.5): Update
+	  copyright years.
+
+2003-01-09 Thursday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.83), Watchdog/configure.ac (1.15): Building the
+	  Parma Watchdog Library is now enabled by default.
+
+2003-01-09 Thursday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.77): Added a new class
+	  `timeout_exception'.
+
+2003-01-07 Tuesday 16:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.73), pl_check.pl
+	  (1.32): A typo in the Prolog_interface,dox corrected and
+	  ppl_Polyhedron_is_disjoint_from_Polyhedron/2 documentation added.
+	  Many improvements to pl_check.pl and some bugs fixed.
+
+2003-01-07 Tuesday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.82): Bump version number.
+
+2003-01-07 Tuesday 15:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: expected (1.3), expected2 (1.4): Update
+	  copyright years.
+
+2003-01-07 Tuesday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.52), configure.ac (1.81): We now require GMP 4.1.2 or
+	  higher.
+
+2003-01-07 Tuesday 15:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* CREDITS (1.5): Typo corrected.
+
+2003-01-07 Tuesday 15:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* CREDITS (1.4), doc/devref.tex (1.9), doc/user.tex (1.10): The
+	  MURST project COFIN01 credited.
+
+2003-01-07 Tuesday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.12), Interval.inlines.hh (1.8): Old
+	  kludges removed.
+
+2003-01-07 Tuesday 12:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/bhrz03widening9.cc (1.3): Updated the known result to match
+	  the output according to the new limited growth ordering
+	  convergence criterion.
+
+2003-01-07 Tuesday 12:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.hh (1.28): Do not output statistics by default.
+
+2003-01-01 Wednesday 02:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.21), README (1.13), configure.ac (1.80),
+	  Watchdog/Makefile.am (1.6), Watchdog/README (1.4),
+	  Watchdog/Watchdog.cc (1.7), Watchdog/Watchdog.defs.hh (1.9),
+	  Watchdog/Watchdog.inlines.hh (1.7), Watchdog/Watchdog.types.hh
+	  (1.3), Watchdog/configure.ac (1.14), Watchdog/pwl_header.top
+	  (1.3), doc/Makefile.am (1.22), doc/definitions.dox (1.105),
+	  doc/devref.tex (1.8), doc/user.tex (1.9), interfaces/Makefile.am
+	  (1.6), interfaces/C/Makefile.am (1.12), interfaces/C/ppl_c.cc
+	  (1.54), interfaces/C/ppl_c.h (1.54),
+	  interfaces/Prolog/Makefile.am (1.21),
+	  interfaces/Prolog/Prolog_interface.dox (1.72),
+	  interfaces/Prolog/clpq.pl (1.14), interfaces/Prolog/clpq2.pl
+	  (1.25), interfaces/Prolog/exceptions.hh (1.7),
+	  interfaces/Prolog/expected (1.3), interfaces/Prolog/expected2
+	  (1.7), interfaces/Prolog/pl_check.pl (1.31),
+	  interfaces/Prolog/ppl_prolog.icc (1.76),
+	  interfaces/Prolog/track_allocation.hh (1.11),
+	  interfaces/Prolog/Ciao/Makefile.am (1.14),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.4),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.17),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.29),
+	  interfaces/Prolog/GNU/Makefile.am (1.25),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.6),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.19),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.12),
+	  interfaces/Prolog/SICStus/Makefile.am (1.34),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.22),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.32),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.2),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.3),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.4),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.8),
+	  interfaces/Prolog/SWI/Makefile.am (1.26),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.6),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.4),
+	  interfaces/Prolog/SWI/ppl_pl.cc (1.6),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.57),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.2),
+	  interfaces/Prolog/XSB/Makefile.am (1.12),
+	  interfaces/Prolog/XSB/expected (1.2),
+	  interfaces/Prolog/XSB/expected2 (1.3),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.17),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.6),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.4),
+	  interfaces/Prolog/YAP/Makefile.am (1.16),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.51),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.6),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.6),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.2), m4/Makefile.am (1.8),
+	  m4/ac_check_gmp.m4 (1.11), m4/ac_cxx_flexible_arrays.m4 (1.5),
+	  src/AskTell.defs.hh (1.11), src/AskTell.inlines.hh (1.11),
+	  src/AskTell.types.hh (1.4), src/BoundingBox.cc (1.5),
+	  src/BoundingBox.defs.hh (1.9), src/BoundingBox.inlines.hh (1.7),
+	  src/BoundingBox.types.hh (1.5), src/C_Polyhedron.cc (1.4),
+	  src/C_Polyhedron.defs.hh (1.19), src/C_Polyhedron.inlines.hh
+	  (1.13), src/C_Polyhedron.types.hh (1.6), src/ConSys.cc (1.57),
+	  src/ConSys.defs.hh (1.76), src/ConSys.inlines.hh (1.29),
+	  src/ConSys.types.hh (1.6), src/Constraint.cc (1.35),
+	  src/Constraint.defs.hh (1.78), src/Constraint.inlines.hh (1.42),
+	  src/Constraint.types.hh (1.6), src/Determinate.defs.hh (1.26),
+	  src/Determinate.inlines.hh (1.24), src/Determinate.types.hh
+	  (1.4), src/GenSys.cc (1.74), src/GenSys.defs.hh (1.87),
+	  src/GenSys.inlines.hh (1.30), src/GenSys.types.hh (1.6),
+	  src/Generator.cc (1.43), src/Generator.defs.hh (1.81),
+	  src/Generator.inlines.hh (1.39), src/Generator.types.hh (1.6),
+	  src/Init.cc (1.3), src/Init.defs.hh (1.8), src/Init.inlines.hh
+	  (1.7), src/Init.types.hh (1.5), src/Integer.cc (1.3),
+	  src/Integer.defs.hh (1.10), src/Integer.inlines.hh (1.9),
+	  src/Integer.types.hh (1.7), src/Interval.cc (1.6),
+	  src/Interval.defs.hh (1.11), src/Interval.inlines.hh (1.7),
+	  src/Interval.types.hh (1.5), src/LCompare.defs.hh (1.5),
+	  src/LCompare.inlines.hh (1.4), src/LCompare.types.hh (1.4),
+	  src/LinExpression.cc (1.16), src/LinExpression.defs.hh (1.57),
+	  src/LinExpression.inlines.hh (1.26), src/LinExpression.types.hh
+	  (1.6), src/Makefile.am (1.55), src/Matrix.cc (1.46),
+	  src/Matrix.defs.hh (1.40), src/Matrix.inlines.hh (1.29),
+	  src/Matrix.types.hh (1.6), src/NNC_Polyhedron.cc (1.10),
+	  src/NNC_Polyhedron.defs.hh (1.21), src/NNC_Polyhedron.inlines.hh
+	  (1.15), src/NNC_Polyhedron.types.hh (1.6),
+	  src/Poly_Con_Relation.cc (1.7), src/Poly_Con_Relation.defs.hh
+	  (1.19), src/Poly_Con_Relation.inlines.hh (1.9),
+	  src/Poly_Con_Relation.types.hh (1.5), src/Poly_Gen_Relation.cc
+	  (1.7), src/Poly_Gen_Relation.defs.hh (1.18),
+	  src/Poly_Gen_Relation.inlines.hh (1.9),
+	  src/Poly_Gen_Relation.types.hh (1.5), src/Polyhedron.cc (1.274),
+	  src/Polyhedron.defs.hh (1.176), src/Polyhedron.inlines.hh (1.58),
+	  src/Polyhedron.types.hh (1.8), src/PowerSet.defs.hh (1.24),
+	  src/PowerSet.inlines.hh (1.29), src/PowerSet.types.hh (1.4),
+	  src/Row.cc (1.47), src/Row.defs.hh (1.58), src/Row.inlines.hh
+	  (1.35), src/Row.types.hh (1.6), src/SatMatrix.cc (1.25),
+	  src/SatMatrix.defs.hh (1.29), src/SatMatrix.inlines.hh (1.18),
+	  src/SatMatrix.types.hh (1.6), src/SatRow.cc (1.17),
+	  src/SatRow.defs.hh (1.25), src/SatRow.inlines.hh (1.22),
+	  src/SatRow.types.hh (1.6), src/Status.cc (1.19),
+	  src/Status.defs.hh (1.25), src/Status.inlines.hh (1.12),
+	  src/Status.types.hh (1.6), src/Topology.hh (1.7), src/Variable.cc
+	  (1.11), src/Variable.defs.hh (1.29), src/Variable.inlines.hh
+	  (1.15), src/Variable.types.hh (1.6), src/algorithms.hh (1.13),
+	  src/conversion.cc (1.42), src/globals.cc (1.11), src/globals.hh
+	  (1.27), src/initializer.hh (1.6), src/minimize.cc (1.28),
+	  src/ppl_header.top (1.5), src/simplify.cc (1.22), tests/BBox.cc
+	  (1.3), tests/BBox.hh (1.2), tests/CbecomesNNC1.cc (1.3),
+	  tests/Makefile.am (1.167), tests/NNCinclusion1.cc (1.5),
+	  tests/NNCminimize1.cc (1.8), tests/NNCminimize2.cc (1.8),
+	  tests/NNCminimize3.cc (1.8), tests/NNCminimize4.cc (1.10),
+	  tests/NNCminimize5.cc (1.7), tests/NNCminimize6.cc (1.9),
+	  tests/PFunction.cc (1.2), tests/PFunction.hh (1.2),
+	  tests/addconstraint1.cc (1.3), tests/addconstraint2.cc (1.2),
+	  tests/addconstraint3.cc (1.2), tests/addconstraints1.cc (1.9),
+	  tests/addconstraints10.cc (1.8), tests/addconstraints11.cc (1.9),
+	  tests/addconstraints12.cc (1.2), tests/addconstraints13.cc (1.4),
+	  tests/addconstraints2.cc (1.17), tests/addconstraints3.cc (1.7),
+	  tests/addconstraints4.cc (1.9), tests/addconstraints5.cc (1.10),
+	  tests/addconstraints6.cc (1.11), tests/addconstraints7.cc (1.10),
+	  tests/addconstraints8.cc (1.10), tests/addconstraints9.cc (1.11),
+	  tests/adddimensions1.cc (1.12), tests/adddimensions10.cc (1.5),
+	  tests/adddimensions11.cc (1.3), tests/adddimensions12.cc (1.2),
+	  tests/adddimensions2.cc (1.8), tests/adddimensions3.cc (1.10),
+	  tests/adddimensions4.cc (1.8), tests/adddimensions5.cc (1.6),
+	  tests/adddimensions6.cc (1.6), tests/adddimensions7.cc (1.6),
+	  tests/adddimensions8.cc (1.4), tests/adddimensions9.cc (1.4),
+	  tests/addgenerator1.cc (1.3), tests/addgenerator2.cc (1.3),
+	  tests/addgenerator3.cc (1.2), tests/addgenerator4.cc (1.3),
+	  tests/addgenerators1.cc (1.10), tests/addgenerators10.cc (1.2),
+	  tests/addgenerators11.cc (1.4), tests/addgenerators12.cc (1.4),
+	  tests/addgenerators2.cc (1.10), tests/addgenerators3.cc (1.10),
+	  tests/addgenerators4.cc (1.10), tests/addgenerators5.cc (1.10),
+	  tests/addgenerators6.cc (1.10), tests/addgenerators7.cc (1.7),
+	  tests/addgenerators8.cc (1.5), tests/addgenerators9.cc (1.4),
+	  tests/affineimage1.cc (1.10), tests/affineimage2.cc (1.9),
+	  tests/affineimage3.cc (1.2), tests/affineimage4.cc (1.2),
+	  tests/affineimage5.cc (1.3), tests/affineimage6.cc (1.2),
+	  tests/affineimage7.cc (1.2), tests/affineimage8.cc (1.5),
+	  tests/affinepreimage1.cc (1.9), tests/affinepreimage10.cc (1.5),
+	  tests/affinepreimage2.cc (1.9), tests/affinepreimage3.cc (1.9),
+	  tests/affinepreimage4.cc (1.10), tests/affinepreimage5.cc (1.2),
+	  tests/affinepreimage6.cc (1.3), tests/affinepreimage7.cc (1.2),
+	  tests/affinepreimage8.cc (1.2), tests/affinepreimage9.cc (1.3),
+	  tests/affinetrans.cc (1.12), tests/append1.cc (1.18),
+	  tests/append2.cc (1.19), tests/ascii_dump_load1.cc (1.11),
+	  tests/ascii_dump_load2.cc (1.9), tests/ascii_dump_load3.cc
+	  (1.12), tests/ascii_dump_load4.cc (1.12),
+	  tests/ascii_dump_load5.cc (1.8), tests/ascii_dump_load6.cc (1.5),
+	  tests/ascii_dump_load7.cc (1.5), tests/bhrz03widening1.cc (1.2),
+	  tests/bhrz03widening10.cc (1.2), tests/bhrz03widening11.cc (1.2),
+	  tests/bhrz03widening12.cc (1.2), tests/bhrz03widening13.cc (1.2),
+	  tests/bhrz03widening14.cc (1.2), tests/bhrz03widening15.cc (1.2),
+	  tests/bhrz03widening16.cc (1.2), tests/bhrz03widening17.cc (1.2),
+	  tests/bhrz03widening18.cc (1.2), tests/bhrz03widening19.cc (1.2),
+	  tests/bhrz03widening2.cc (1.2), tests/bhrz03widening3.cc (1.2),
+	  tests/bhrz03widening4.cc (1.2), tests/bhrz03widening5.cc (1.2),
+	  tests/bhrz03widening6.cc (1.2), tests/bhrz03widening7.cc (1.2),
+	  tests/bhrz03widening8.cc (1.2), tests/bhrz03widening9.cc (1.2),
+	  tests/bounded1.cc (1.8), tests/boundingbox1.cc (1.31),
+	  tests/boundingbox2.cc (1.16), tests/boundingbox3.cc (1.7),
+	  tests/boundingbox4.cc (1.4), tests/bounds1.cc (1.4),
+	  tests/bounds2.cc (1.4), tests/concatenate1.cc (1.5),
+	  tests/concatenate2.cc (1.5), tests/concatenate3.cc (1.5),
+	  tests/concatenate4.cc (1.4), tests/concatenate5.cc (1.2),
+	  tests/concatenate6.cc (1.4), tests/constraints1.cc (1.4),
+	  tests/constraints2.cc (1.4), tests/constraints3.cc (1.4),
+	  tests/constraints4.cc (1.4), tests/contains1.cc (1.2),
+	  tests/disjoint1.cc (1.2), tests/disjoint2.cc (1.4),
+	  tests/disjoint3.cc (1.3), tests/ehandlers.cc (1.4),
+	  tests/ehandlers.hh (1.6), tests/empty1.cc (1.11),
+	  tests/exceptions1.cc (1.29), tests/exceptions2.cc (1.23),
+	  tests/files.cc (1.4), tests/files.hh (1.4),
+	  tests/generalizedaffineimage1.cc (1.5),
+	  tests/generalizedaffineimage10.cc (1.4),
+	  tests/generalizedaffineimage11.cc (1.3),
+	  tests/generalizedaffineimage12.cc (1.2),
+	  tests/generalizedaffineimage2.cc (1.4),
+	  tests/generalizedaffineimage3.cc (1.5),
+	  tests/generalizedaffineimage4.cc (1.3),
+	  tests/generalizedaffineimage5.cc (1.3),
+	  tests/generalizedaffineimage6.cc (1.3),
+	  tests/generalizedaffineimage7.cc (1.5),
+	  tests/generalizedaffineimage8.cc (1.3),
+	  tests/generalizedaffineimage9.cc (1.3), tests/generators1.cc
+	  (1.11), tests/generators2.cc (1.7), tests/generators3.cc (1.3),
+	  tests/generators4.cc (1.3), tests/generators5.cc (1.3),
+	  tests/generators6.cc (1.4), tests/h79widening1.cc (1.4),
+	  tests/h79widening2.cc (1.5), tests/h79widening3.cc (1.5),
+	  tests/h79widening4.cc (1.2), tests/h79widening5.cc (1.3),
+	  tests/inclusion1.cc (1.5), tests/inclusion2.cc (1.2),
+	  tests/intersection1.cc (1.4), tests/intersection10.cc (1.3),
+	  tests/intersection11.cc (1.4), tests/intersection2.cc (1.7),
+	  tests/intersection3.cc (1.5), tests/intersection4.cc (1.5),
+	  tests/intersection5.cc (1.5), tests/intersection6.cc (1.5),
+	  tests/intersection7.cc (1.4), tests/intersection8.cc (1.3),
+	  tests/intersection9.cc (1.3), tests/limitedbhrz03widening1.cc
+	  (1.2), tests/limitedh79widening1.cc (1.5),
+	  tests/limitedh79widening2.cc (1.5), tests/limitedh79widening3.cc
+	  (1.3), tests/limitedh79widening4.cc (1.3),
+	  tests/linearpartition1.cc (1.8), tests/linearpartition2.cc (1.8),
+	  tests/linearpartition3.cc (1.8), tests/linexpression1.cc (1.2),
+	  tests/mc91.cc (1.10), tests/memory1.cc (1.18),
+	  tests/minconstraints1.cc (1.3), tests/minconstraints2.cc (1.3),
+	  tests/minconstraints3.cc (1.2), tests/minconstraints4.cc (1.6),
+	  tests/mingenerators1.cc (1.3), tests/mingenerators2.cc (1.2),
+	  tests/mingenerators3.cc (1.2), tests/onepoint.cc (1.8),
+	  tests/operator1.cc (1.3), tests/permute.cc (1.25),
+	  tests/polydifference1.cc (1.5), tests/polydifference2.cc (1.7),
+	  tests/polydifference3.cc (1.2), tests/polydifference4.cc (1.3),
+	  tests/polydifference5.cc (1.4), tests/polydifference6.cc (1.3),
+	  tests/polydifference7.cc (1.3), tests/polyhull1.cc (1.5),
+	  tests/polyhull10.cc (1.2), tests/polyhull2.cc (1.5),
+	  tests/polyhull3.cc (1.5), tests/polyhull4.cc (1.4),
+	  tests/polyhull5.cc (1.3), tests/polyhull6.cc (1.3),
+	  tests/polyhull7.cc (1.2), tests/polyhull8.cc (1.3),
+	  tests/polyhull9.cc (1.4), tests/ppl_test.hh (1.3), tests/print.cc
+	  (1.9), tests/print.hh (1.13), tests/randphull1.cc (1.7),
+	  tests/randphull2.cc (1.4), tests/relations1.cc (1.8),
+	  tests/relations10.cc (1.4), tests/relations11.cc (1.4),
+	  tests/relations12.cc (1.3), tests/relations13.cc (1.3),
+	  tests/relations14.cc (1.3), tests/relations15.cc (1.3),
+	  tests/relations16.cc (1.3), tests/relations17.cc (1.5),
+	  tests/relations18.cc (1.3), tests/relations19.cc (1.4),
+	  tests/relations2.cc (1.9), tests/relations3.cc (1.9),
+	  tests/relations4.cc (1.9), tests/relations5.cc (1.9),
+	  tests/relations6.cc (1.8), tests/relations7.cc (1.8),
+	  tests/relations8.cc (1.8), tests/relations9.cc (1.10),
+	  tests/removedim1.cc (1.9), tests/removedim2.cc (1.13),
+	  tests/removedim3.cc (1.9), tests/removedim4.cc (1.10),
+	  tests/removedim5.cc (1.8), tests/removedim6.cc (1.11),
+	  tests/removedim7.cc (1.6), tests/removedim8.cc (1.4),
+	  tests/removedim9.cc (1.3), tests/shuffledim1.cc (1.6),
+	  tests/smm1.cc (1.12), tests/timeelapse1.cc (1.6),
+	  tests/timeelapse2.cc (1.6), tests/timeelapse3.cc (1.6),
+	  tests/timeelapse4.cc (1.6), tests/timeelapse5.cc (1.6),
+	  tests/timeelapse6.cc (1.2), tests/timeelapse7.cc (1.2),
+	  tests/timeelapse8.cc (1.3), tests/timings.cc (1.3),
+	  tests/timings.hh (1.3), tests/topclosed1.cc (1.3),
+	  tests/topclosed2.cc (1.2), tests/topclosed3.cc (1.4),
+	  tests/topclosure1.cc (1.5), tests/topclosure2.cc (1.2),
+	  tests/topclosure3.cc (1.2), tests/topclosure4.cc (1.4),
+	  tests/universe1.cc (1.7), tests/universe2.cc (1.8),
+	  tests/universe3.cc (1.8), tests/universe4.cc (1.8),
+	  tests/universe5.cc (1.9), tests/universe6.cc (1.6),
+	  tests/watchdog1.cc (1.15), tests/writeconsys1.cc (1.5),
+	  tests/writegensys1.cc (1.6), tests/writegensys2.cc (1.6),
+	  tests/writegensys3.cc (1.5), tests/writepolyhedron1.cc (1.5),
+	  tests/writepolyhedron2.cc (1.6), tests/writepolyhedron3.cc (1.5),
+	  tests/writerelation1.cc (1.5), tests/writevariable1.cc (1.5):
+	  Update copyright years.
+
+2002-12-31 Tuesday 17:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.273), Polyhedron.defs.hh (1.175): The
+	  three different techniques making up BHRZ03_widening_assign() are
+	  now isolated into corresponding members, to ease further
+	  experimentation.  Keeping track of the convergence reason and of
+	  the successful technique in order to later output statistics
+	  about it.
+
+2002-12-31 Tuesday 17:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Init.inlines.hh (1.6), globals.cc (1.10), globals.hh
+	  (1.26): Added a global struct to keep statistics about BHRZ03
+	  when the pre-proc flag PPL_STATISTICS is set (now set by
+	  default). Statistics are outputted during the library
+	  finalization.
+
+2002-12-30 Monday 19:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.272): In the NEW_LIMITED_GROWTH_ORDERING
+	  case of method is_BHRZ03_stabilizing(), when we have the same
+	  number of constraints for x and y, we now also check if the same
+	  number is obtained when disregarding the positivity constraint.
+
+2002-12-30 Monday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.271): Wrong reference to `abort()' corrected
+	  into a call.
+
+2002-12-30 Monday 09:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.270): Added preproc flag
+	  NEW_LIMITED_GROWTH_ORDERING to test the new convergence criterion
+	  for bhrz03. The new stabilization test now prints a '*' on
+	  std::cerr each time we miss an opportunity of applying the new
+	  widening techniques due to the new convergence criterion.
+
+2002-12-26 Thursday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.75), Ciao/ppl_ciao.cc
+	  (1.16), GNU/ppl_gprolog_sd.cc (1.11), SICStus/sicstus_cfli.ic
+	  (1.3), SWI/ppl_swiprolog.cc (1.56), XSB/ppl_xsb.cc (1.16),
+	  YAP/ppl_yap.cc (1.50): Transition to C: avoid references.
+
+2002-12-26 Thursday 11:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.15),
+	  GNU/ppl_gprolog_sd.cc (1.10), SICStus/sicstus_cfli.h (1.2),
+	  SICStus/sicstus_cfli.ic (1.2), SWI/ppl_swiprolog.cc (1.55),
+	  XSB/ppl_xsb.cc (1.15), YAP/ppl_yap.cc (1.49): Transition to C:
+	  avoid `bool'.
+
+2002-12-26 Thursday 11:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.33), ppl_sicstus_sd.cc
+	  (1.31), sicstus_cfli.cc (1.1), sicstus_cfli.h (1.1),
+	  sicstus_cfli.ic (1.1): Started carving the new Common Foreign
+	  Language Interface.
+
+2002-12-25 Wednesday 19:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.74): Spurious element removed
+	  from the `prolog_atoms' array.
+
+2002-12-22 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.51): Mention the bug fixed in
+	  Polyhedron::minimized_constraints().
+
+2002-12-22 Sunday 08:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.79): Version number bumped.
+
+2002-12-21 Saturday 20:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.269), tests/topclosure1.cc (1.4): Corrected
+	  the bug pointed out by topclosure1.cc.
+
+2002-12-21 Saturday 20:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.73): In add_corresponding_points(), iteration
+	  now goes upward to insert the new points in a partially ordered
+	  sequence.
+
+2002-12-21 Saturday 19:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.cc (1.8): Consistently follow "true" and "false" by a
+	  full stop.
+
+2002-12-21 Saturday 16:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: print.cc (1.7), print.hh (1.12): Removal of easy_print()
+	  completed.
+
+2002-12-21 Saturday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.53), src/Status.cc (1.18),
+	  src/initializer.hh (1.5), tests/ehandlers.cc (1.3): Prefer
+	  anonymous namespaces to static declarations.
+
+2002-12-21 Saturday 13:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.cc (1.6): The functions print_constraints() and
+	  print_generators() were ignoring the `intro' argument.
+
+2002-12-20 Friday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/topclosure1.cc (1.3): Temporarily force NOISY to 1.
+
+2002-12-20 Friday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.cc (1.5): Avoid excess minimizations when printing
+	  constraints or generators.
+
+2002-12-20 Friday 15:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/boundingbox1.cc (1.30): Minor adjustments to expression
+	  spacing; cutted away a few commented stmts.
+
+2002-12-20 Friday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BBox.cc (1.2): Output functions greatly improved.
+
+2002-12-19 Thursday 07:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.78): Version number bumped.
+
+2002-12-18 Wednesday 20:10  Elisa Ricci
+
+	* src/conversion.cc (1.41): The bug witnessed by the `polyhull10'
+	  test program has been fixed: under some circumstances we were not
+	  indicating that the matrix no longer had pending rows.
+
+2002-12-17 Tuesday 19:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.166), polyhull10.cc (1.1): New test
+	  showing a bug in the current version of the library.
+
+2002-12-16 Monday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.21): Production of the documentation depends
+	  also on ppl.sty.
+
+2002-12-15 Sunday 20:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.165): The -lm flag for *randphull2 is in
+	  addition to the other LDFLAGS.
+
+2002-12-15 Sunday 19:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.164): The randphull2 and nnc_randphull2 test
+	  programs need to be linked against the math library.
+
+2002-12-15 Sunday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/shuffledim1.cc (1.5): Define print_function() only when
+	  noisy.
+
+2002-12-15 Sunday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/randphull2.cc (1.3): Define M_PI unless it is already
+	  defined.
+
+2002-12-14 Saturday 21:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: limitedbbrz02widening1.cc (1.4),
+	  limitedbhrz03widening1.cc (1.1): The new widening is now
+	  nicknamed BHRZ03.
+
+2002-12-14 Saturday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: affineimage8.cc (1.4), affinepreimage10.cc (1.4): Use the
+	  NOISY flag to control noisiness.
+
+2002-12-14 Saturday 20:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: addconstraints13.cc (1.3), addgenerators12.cc (1.3),
+	  affineimage8.cc (1.3), affinepreimage10.cc (1.3), boundingbox1.cc
+	  (1.29), concatenate6.cc (1.3), constraints4.cc (1.3),
+	  generators6.cc (1.3), intersection11.cc (1.3), polyhull9.cc
+	  (1.3), relations19.cc (1.3), shuffledim1.cc (1.4), topclosure4.cc
+	  (1.3): Use internal linkage when possible.
+
+2002-12-14 Saturday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variable.cc (1.10): Variable::default_output_function()
+	  improved.
+
+2002-12-14 Saturday 18:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.50), doc/definitions.dox (1.104), interfaces/C/ppl_c.cc
+	  (1.52), interfaces/C/ppl_c.h (1.53),
+	  interfaces/Prolog/Prolog_interface.dox (1.71),
+	  interfaces/Prolog/pl_check.pl (1.30),
+	  interfaces/Prolog/ppl_prolog.icc (1.73),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.28),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.30),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.54),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.7),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.14),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.48), src/Polyhedron.cc
+	  (1.268), src/Polyhedron.defs.hh (1.174), src/algorithms.hh
+	  (1.12), tests/Makefile.am (1.163), tests/bbrz02widening1.cc
+	  (1.5), tests/bbrz02widening10.cc (1.2), tests/bbrz02widening11.cc
+	  (1.2), tests/bbrz02widening12.cc (1.4), tests/bbrz02widening13.cc
+	  (1.7), tests/bbrz02widening14.cc (1.8), tests/bbrz02widening15.cc
+	  (1.7), tests/bbrz02widening16.cc (1.2), tests/bbrz02widening17.cc
+	  (1.2), tests/bbrz02widening18.cc (1.2), tests/bbrz02widening19.cc
+	  (1.2), tests/bbrz02widening2.cc (1.3), tests/bbrz02widening3.cc
+	  (1.3), tests/bbrz02widening4.cc (1.2), tests/bbrz02widening5.cc
+	  (1.2), tests/bbrz02widening6.cc (1.4), tests/bbrz02widening7.cc
+	  (1.4), tests/bbrz02widening8.cc (1.3), tests/bbrz02widening9.cc
+	  (1.7), tests/bhrz03widening1.cc (1.1), tests/bhrz03widening10.cc
+	  (1.1), tests/bhrz03widening11.cc (1.1), tests/bhrz03widening12.cc
+	  (1.1), tests/bhrz03widening13.cc (1.1), tests/bhrz03widening14.cc
+	  (1.1), tests/bhrz03widening15.cc (1.1), tests/bhrz03widening16.cc
+	  (1.1), tests/bhrz03widening17.cc (1.1), tests/bhrz03widening18.cc
+	  (1.1), tests/bhrz03widening19.cc (1.1), tests/bhrz03widening2.cc
+	  (1.1), tests/bhrz03widening3.cc (1.1), tests/bhrz03widening4.cc
+	  (1.1), tests/bhrz03widening5.cc (1.1), tests/bhrz03widening6.cc
+	  (1.1), tests/bhrz03widening7.cc (1.1), tests/bhrz03widening8.cc
+	  (1.1), tests/bhrz03widening9.cc (1.1), tests/exceptions1.cc
+	  (1.28), tests/exceptions2.cc (1.22),
+	  tests/limitedbbrz02widening1.cc (1.3): The new widening is now
+	  nicknamed BHRZ03.
+
+2002-12-06 Friday 07:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.57): Avoid totally useless
+	  parentheses.	Make sure inline methods and functions are defined
+	  before being used.
+
+2002-12-05 Thursday 21:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.14), config.sub (1.13): Updated.
+
+2002-12-05 Thursday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.77): Bump version number.
+
+2002-12-05 Thursday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/minconstraints4.cc (1.5): Original testcase restored.
+
+2002-12-05 Thursday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: append1.cc (1.17), append2.cc (1.18), exceptions1.cc
+	  (1.27), minconstraints4.cc (1.4), permute.cc (1.24),
+	  removedim1.cc (1.8), removedim2.cc (1.12), removedim3.cc (1.8),
+	  removedim6.cc (1.10), removedim7.cc (1.5), removedim8.cc (1.3):
+	  Use PPL::Variables_Set instead of std::set<Variable>.
+
+2002-12-05 Thursday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.25), Determinate.inlines.hh (1.23),
+	  Polyhedron.cc (1.267), Polyhedron.defs.hh (1.173),
+	  PowerSet.defs.hh (1.23), PowerSet.inlines.hh (1.28),
+	  Variable.defs.hh (1.28), Variable.inlines.hh (1.14): The function
+	  bool operator<(const Variable&, const Variable&) has been
+	  substituted by bool less(const Variable&, const Variable&).  New
+	  predicate Variable::Compare useful for defining associative
+	  containers of variables.  New typedef Variables_Set standing for
+	  std::set<Variable, Variable::Compare>.  Use PPL::Variables_Set
+	  instead of std::set<Variable>.
+
+2002-12-05 Thursday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/ppl_c.cc (1.51), Prolog/ppl_prolog.icc (1.72): Use
+	  PPL::Variables_Set instead of std::set<Variable>.
+
+2002-12-05 Thursday 12:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.28): Added an item about strong minimization.
+
+2002-12-05 Thursday 12:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.266): In
+	  Polyhedron::strongly_minimize_constraints(), corrected the bug
+	  spotted by test minconstraints4.cc.
+
+2002-12-05 Thursday 12:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/minconstraints4.cc (1.3): Further simplified the test
+	  showing the bug.
+
+2002-12-05 Thursday 10:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/minconstraints4.cc (1.2): Simplified the test showing the
+	  bug in the strong minimization of constraints.
+
+2002-12-05 Thursday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.162), minconstraints4.cc (1.1): New test
+	  showing a bug triggered by an invocation of
+	  Polyhedron::minimized_constraints().
+
+2002-12-03 Tuesday 20:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ConSys.cc (1.56), src/ConSys.defs.hh (1.75),
+	  src/ConSys.inlines.hh (1.28), src/GenSys.cc (1.72),
+	  src/GenSys.defs.hh (1.86), src/GenSys.inlines.hh (1.29),
+	  src/Matrix.cc (1.45), src/Matrix.defs.hh (1.39),
+	  src/Matrix.inlines.hh (1.28), src/Polyhedron.cc (1.265),
+	  src/Polyhedron.defs.hh (1.172), src/Polyhedron.inlines.hh (1.56),
+	  src/Status.cc (1.17), src/Status.defs.hh (1.24),
+	  src/Status.inlines.hh (1.11), src/conversion.cc (1.40),
+	  src/minimize.cc (1.27), src/simplify.cc (1.21), tests/Makefile.am
+	  (1.161), tests/addconstraints13.cc (1.2),
+	  tests/addgenerators12.cc (1.2), tests/affineimage8.cc (1.2),
+	  tests/affinepreimage10.cc (1.2), tests/boundingbox1.cc (1.28),
+	  tests/bug1.cc (1.3), tests/bug1.dat (1.2), tests/concatenate6.cc
+	  (1.2), tests/constraints4.cc (1.2), tests/generators6.cc (1.2),
+	  tests/intersection11.cc (1.2), tests/polyhull9.cc (1.2),
+	  tests/relations19.cc (1.2), tests/timeelapse8.cc (1.2),
+	  tests/topclosure4.cc (1.2): The `lazy' branch has been merged.
+
+2002-12-03 Tuesday 11:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.264): Fixed a couple of comments.
+
+2002-12-02 Monday 18:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc, Polyhedron.inlines.hh (lazy.[12,12]): A
+	  whole pass on the code of the class, trying to use the new
+	  methods defined for the handling of pending rows; also tried to
+	  provide more uniform comments and to avoid useless reordering of
+	  rows when invoking add_and_minimize().
+
+2002-12-02 Monday 18:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (lazy.4): Modified methods
+	  add_corresponding_points() and add_corr_closure_points() to rely
+	  on the caller for the management of pending rows.
+
+2002-12-02 Monday 18:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (lazy.3): Modified method
+	  adjust_topology_and_dimensions() to rely on the caller for the
+	  management of pending rows.
+
+2002-12-02 Monday 18:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh, minimize.cc (lazy.[7,4]): Provided
+	  slightly better names for methods dealing with pending rows.
+	  Modified the assertions for the two methods named
+	  add_and_minimize(...) and added new documentation.
+
+2002-12-02 Monday 18:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (lazy.8): No longer using flag
+	  KEEP_SOURCE_SORTEDNESS.
+
+2002-12-02 Monday 18:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (lazy.10): Corrected a typo in
+	  add_pending_rows(const Matrix&).  Removed an ill-placed
+	  well-formedness check.  Adjusted a few assertions.
+
+2002-12-02 Monday 09:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
+	  (lazy.[9,7,3]): Added new method unset_pending_rows() that sets
+	  the index_first_pending_row equal to the number of rows of the
+	  matrix.  Added new methods add_rows(const Matrix&) and
+	  add_pending_rows(const Matrix&) to add a set of rows with one
+	  matrix reallocation at most.	Adjusted a few comments.  Factored
+	  some common code in the sorting methods.
+
+2002-11-30 Saturday 11:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_clpq.pl (1.3): No longer use the
+	  debug package: use the debugger library instead.  Added
+	  use_module(library(prolog_sys)) in order to use statistics/0.
+
+2002-11-29 Friday 20:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.39): Committed to preserving the sortedness
+	  of `source', but changed the name of the new index, now using
+	  `source_num_redundant'.  Using a reference instead of evaluating
+	  source[k] many times.
+
+2002-11-29 Friday 11:51  Elisa Ricci
+
+	* src/: Matrix.cc, Matrix.defs.hh, Polyhedron.cc,
+	  Polyhedron.defs.hh, Polyhedron.inlines.hh, conversion.cc,
+	  minimize.cc (lazy.[8,6,11,6,11,7,3]): Added
+	  Matrix::sort_rows(dimension_type first_row, dimension_type
+	  last_row) that sorts the the part of the matrix that is between
+	  `first_row' and `last_row'. Added also
+	  Matrix::sort_pending_and_remove_duplicates() that sorts the
+	  pending part of the matrix and remove the pending rows that are
+	  also in the upper part of the matrix.  Added
+	  Polyhedron::remove_pending_constraints_and_minimize() and
+	  Polyhedron::remove_pending_generators_and_minimize() that remove
+	  pending constraints/generators and minimize the polyhedron: now
+	  Polyhedron::remove_pending_and_minimze() only calls the two added
+	  methods.  Added also Polyhedron::add_and_minimize(bool, Matrix&,
+	  Matrix&, SatMatrix&) to obtain a polyhedron in minimal form
+	  defined by the system composed by the non-pending rows and by the
+	  pending rows of the first matrix.  This new method is called by
+	  Polyhedron::add_and_minimize(bool, Matrix&, Matrix&, SatMatrix&,
+	  const Matrix&) after We have added the row of the constant matrix
+	  to the first matrix.	Changed conversion so that when we swap the
+	  rows of source we set a flag and at the end we verify if the
+	  matrix is really sorted or not.
+
+2002-11-29 Friday 11:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.27): We should not forget to document
+	  Polyhedron::shuffle_dimensions().
+
+2002-11-29 Friday 10:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (lazy.6): The management of flag
+	  KEEP_SOURCE_SORTEDNESS reported into the branch lazy.
+
+2002-11-29 Friday 10:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.38): Implemented a more efficient way to
+	  keep the sortedness of Matric `source', requiring max
+	  source_num_rows - 1 swaps of the rows in source.  The new code is
+	  controlled by pre-proc flag KEEP_SOURCE_SORTEDNESS, which is now
+	  set to 0 (i.e., still using old code).
+
+2002-11-28 Thursday 18:22  Elisa Ricci
+
+	* src/: SatMatrix.cc (1.24), SatMatrix.defs.hh (1.28), minimize.cc
+	  (1.26): Restored SatMatrix::transpose() and used it in
+	  add_and_minimize(), where it is possible, instead of
+	  SatMatrix::transpose_assign().  When we use add_row(), it sets
+	  correctly if the changed matrix is sorted or not: so we have not
+	  to say in add_and_minimize() that the changed matrix is not
+	  sorted.  In add_and_minimize(), after adding the new rows to the
+	  matrix `source1', we resize the saturation matrix `sat' instead
+	  of built a temporary saturation matrix.
+
+2002-11-28 Thursday 14:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.37): Added (a preprocessing controlled and
+	  now disabled) alternative code for the removal of rows in Matrix
+	  `source' that are found to be redundant.  The alternative code
+	  does keep the sortedness of `source'.
+
+2002-11-28 Thursday 14:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (lazy.5): Added (a preprocessing controlled and
+	  now disabled) alternative code for the removal of rows in Matrix
+	  source that are found to be redundant.  The alternative code does
+	  keep the sortedness of source.
+
+2002-11-27 Wednesday 19:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.cc (1.42), Poly_Con_Relation.cc (1.6),
+	  Poly_Gen_Relation.cc (1.6): Added missing \relates needed by
+	  Doxygen.
+
+2002-11-27 Wednesday 18:10  Elisa Ricci
+
+	* src/conversion.cc (lazy.4): Improve the last part of conversion:
+	  now we check if the sorted matrix `dest' is really sorted and
+	  then we update `index_first_pending' of `dest'.
+
+2002-11-27 Wednesday 16:19  Elisa Ricci
+
+	* src/conversion.cc (lazy.3): Improved the part in which we update
+	  `index_first_pending' of `dest'.
+
+2002-11-27 Wednesday 13:15  Elisa Ricci
+
+	* src/: Matrix.defs.hh, Matrix.cc, conversion.cc (lazy.[5,7,2]):
+	  Now we have Matrix::add_pending_row(Row::Type type) instead of
+	  Matrix::add_row(Row::Type type). This new method does not change
+	  `index_first_pending' and does not verify the sortedness of the
+	  matrix.  Used this new method in conversion.	At the end of
+	  conversion, we update the sortedness of `dest' and its
+	  `index_first_pending'.
+
+2002-11-27 Wednesday 11:45  Elisa Ricci
+
+	* src/minimize.cc (lazy.2): When we use add_row(), it sets
+	  correctly if the changed matrix is sorted or not: so we do not
+	  say in add_and_minimize() that then the vhanged matrix is not
+	  sorted.  In add_and_minimize(), after adding the new rows to the
+	  matrix `source1', we resize the saturation matrix `sat' instead
+	  of built a temporary saturation matrix.  In add_and_minimize(),
+	  also used SatMatrix::transpose() where it is possible instead of
+	  SatMatrix::transpose_assign().
+
+2002-11-27 Wednesday 11:21  Elisa Ricci
+
+	* tests/shuffledim1.cc (1.3): Added a test to verify
+	  Polyhedron::shuffle_dimensions() in the case that the polyhedron
+	  is zero-dimensional.
+
+2002-11-26 Tuesday 17:51  Elisa Ricci
+
+	* tests/shuffledim1.cc (1.2): Added void print_function() that is
+	  used to print a function in this test.  Added also other tests to
+	  verify Polyhedron::shuffle_dimensions().
+
+2002-11-26 Tuesday 17:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.cc (1.4): Fixed a bug whereby universe polyhedra were
+	  sometimes wrongly printed.
+
+2002-11-26 Tuesday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.160), PFunction.cc (1.1), PFunction.hh
+	  (1.1), shuffledim1.cc (1.1): To test
+	  Polyhedron::shuffle_dimensions().
+
+2002-11-26 Tuesday 16:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.263), SatRow.cc (1.16), SatRow.defs.hh
+	  (1.24), SatRow.inlines.hh (1.21), conversion.cc (1.36),
+	  simplify.cc (1.20): New functions bool subset_or_equal(const
+	  SatRow&, const SatRow&) and bool strict_subset(const SatRow&,
+	  const SatRow&) replace the misleading overloadings of the
+	  comparison operators `<', `<=', `>' and `>=' on SatRow's.
+
+2002-11-26 Tuesday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (lazy.1): From the main trunk: fixed int
+	  compare(const SatRow&, const SatRow&), bool operator<=(const
+	  SatRow&, const SatRow&), and bool operator<(const SatRow&, const
+	  SatRow&).
+
+2002-11-26 Tuesday 10:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.15): Fixed int compare(const SatRow& x, const
+	  SatRow& y), bool operator<=(const SatRow& x, const SatRow& y),
+	  and bool operator<(const SatRow& x, const SatRow& y): they were
+	  completely broken.
+
+2002-11-25 Monday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (lazy.6): Fixed a bug in Matrix::grow() whereby,
+	  depending on the relations between the new rows' size and the old
+	  row's capacity, index_first_pending could erroneously be set to
+	  zero.
+
+2002-11-25 Monday 11:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.32): Properly install
+	  ppl_sicstus.so.
+
+2002-11-25 Monday 09:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh, GenSys.defs.hh, Matrix.defs.hh
+	  (lazy.[3,4,4]): Added more details in the documentation for the
+	  split constructors.
+
+2002-11-25 Monday 09:25  Elisa Ricci
+
+	* src/: Matrix.cc, Polyhedron.cc (lazy.[5,10]): Corrected the bug
+	  in Matrix::ascii_load: we used "nrows" instead of "index", when
+	  we set the "index_first_pending".  In Matrix::add_row, erased in
+	  a condition of an "if" erased the check about the number of
+	  pending rows, because we use this method only when the matrix has
+	  no pending rows.  In Polyhedron::Polyhedron(Topology topol,
+	  ConSys& cs) and Polyhedron::Polyhedron(Topology topol, const
+	  ConSys& cs) erased an "if" that is repeated twice.
+
+2002-11-24 Sunday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug1.cc, bug1.dat (lazy.[4,1,1]): New test
+	  program (with input data) meant to witness the existence of a bug
+	  in Polyhedron::concatenate_assign().	Unfortunately, it shows
+	  that there are also problems in Polyhedron::ascii_dump() and/or
+	  Polyhedron::ascii_load().
+
+2002-11-24 Sunday 14:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc, Polyhedron.defs.hh (lazy.[9,5]): Using the
+	  new split constructor to implement remove_pending_and_minimize().
+
+2002-11-24 Sunday 14:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh, ConSys.inlines.hh, GenSys.defs.hh,
+	  GenSys.inlines.hh, Matrix.cc, Matrix.defs.hh
+	  (lazy.[2,1,3,1,4,3]): Added split constructors for Matrix, ConSys
+	  and GenSys.
+
+2002-11-23 Saturday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.31): Use libtool
+	  whenever possible.
+
+2002-11-23 Saturday 09:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.52): Include <stdio.h> before <gmp.h> so
+	  as to avoid warnings about the implicit declaration of all the
+	  I/O functions.
+
+2002-11-22 Friday 17:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/disjoint2.cc (1.3): Be quiet.
+
+2002-11-22 Friday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.11): Practice information hiding.
+
+2002-11-22 Friday 12:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: affinepreimage9.cc (1.2), append1.cc (1.16), append2.cc
+	  (1.17), ascii_dump_load1.cc (1.10), ascii_dump_load2.cc (1.8),
+	  ascii_dump_load3.cc (1.11), ascii_dump_load4.cc (1.11),
+	  ascii_dump_load5.cc (1.7), ascii_dump_load6.cc (1.4),
+	  ascii_dump_load7.cc (1.4), bbrz02widening1.cc (1.4),
+	  bbrz02widening12.cc (1.3), bbrz02widening13.cc (1.6),
+	  bbrz02widening14.cc (1.7), bbrz02widening15.cc (1.6),
+	  bbrz02widening9.cc (1.6), boundingbox1.cc (1.27), boundingbox2.cc
+	  (1.15), boundingbox3.cc (1.6), boundingbox4.cc (1.3),
+	  disjoint2.cc (1.2), disjoint3.cc (1.2), exceptions1.cc (1.26),
+	  exceptions2.cc (1.21), files.cc (1.3),
+	  generalizedaffineimage10.cc (1.3), generalizedaffineimage11.cc
+	  (1.2), generalizedaffineimage7.cc (1.4),
+	  generalizedaffineimage9.cc (1.2), intersection10.cc (1.2),
+	  intersection2.cc (1.6), limitedh79widening4.cc (1.2),
+	  linearpartition1.cc (1.7), linearpartition2.cc (1.7),
+	  linearpartition3.cc (1.7), memory1.cc (1.17), operator1.cc (1.2),
+	  permute.cc (1.23), polydifference7.cc (1.2), polyhull8.cc (1.2),
+	  randphull1.cc (1.6), randphull2.cc (1.2), relations17.cc (1.4),
+	  relations9.cc (1.9), smm1.cc (1.11), watchdog1.cc (1.14),
+	  writeconsys1.cc (1.4), writegensys1.cc (1.5), writegensys2.cc
+	  (1.5), writegensys3.cc (1.4), writepolyhedron1.cc (1.4),
+	  writepolyhedron2.cc (1.5), writepolyhedron3.cc (1.4),
+	  writerelation1.cc (1.4), writevariable1.cc (1.4): Consistency
+	  improvements.
+
+2002-11-22 Friday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/files.hh (1.3): Include <iostream> instead of <iosfwd>.
+
+2002-11-22 Friday 11:54  Elisa Ricci
+
+	* src/Matrix.inlines.hh (lazy.2): Added the assertion
+	  "assert(num_rows() >= first_pending_row())" in
+	  Matrix::num_pending_rows().
+
+2002-11-22 Friday 10:23  Elisa Ricci
+
+	* src/: ConSys.cc, GenSys.cc, Matrix.cc, Polyhedron.cc,
+	  Polyhedron.inlines.hh (lazy.[2,3,3,8,10]): Added some comments to
+	  explain the case in which the polyhedron has something pending.
+	  Added some assertions to verify that a method is not used in
+	  wrong cases.
+
+2002-11-22 Friday 10:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.24): Teo declarations uncommented.
+
+2002-11-22 Friday 09:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.51): Declarations of ppl_ConSys_begin()
+	  and ppl_ConSys_end() fixed.
+
+2002-11-22 Friday 09:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.2): Copyright notice added.
+
+2002-11-22 Friday 09:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ehandlers.cc (1.2): Include ehandlers.hh.
+
+2002-11-22 Friday 09:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.76): Bump version number.
+
+2002-11-21 Thursday 18:18  Elisa Ricci
+
+	* src/: ConSys.cc, ConSys.defs.hh, GenSys.cc, GenSys.defs.hh,
+	  Matrix.cc, Matrix.defs.hh, Polyhedron.cc, Polyhedron.defs.hh,
+	  Polyhedron.inlines.hh, conversion.cc, minimize.cc, simplify.cc
+	  (lazy.[1,1,2,2,2,2,7,4,9,1,1,1]): Added the methods
+	  Matrix::add_pending_row(), Matrix::insert_pending(),
+	  GenSys::insert_pending() and ConSys::insert_pending().  Erased
+	  the matrices `pending_cs' and `pending_gs' from polyhedron: now
+	  if the polyhedron has pending constraints/generators, they are in
+	  con_sys/gen_sys.  Modified the methods of Polyhedron, ConSys,
+	  GenSys and Matrix so that they always consider if the polyhedron
+	  contains something pending or if the matrix has some pending
+	  rows.
+
+2002-11-20 Wednesday 12:38  Elisa Ricci
+
+	* tests/: Makefile.am (1.159), disjoint2.cc (1.1), disjoint3.cc
+	  (1.1): Added new tests to verify are_disjoint(const Polyhedron&
+	  x, const Polyhedron& y).
+
+2002-11-15 Friday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.158), intersection2.cc (1.5),
+	  randphull1.cc (1.5), randphull2.cc (1.1): New test computing
+	  random polytopes by generating points on the surface of an
+	  n-dimensional sphere.
+
+2002-11-15 Friday 12:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.29), ppl_prolog.icc (1.71):
+	  Bug in term_to_complexity_class/2 corrected (a_empty changed to
+	  a_any).  Tests for ppl_Polyhedron_get_bounding_box/3 added to
+	  pl_check.pl.
+
+2002-11-15 Friday 12:31  Elisa Ricci
+
+	* src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
+	  (lazy.[1,1,1]): Started to insert the pending system into the
+	  matrix.
+
+2002-11-15 Friday 09:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.70): Added
+	  documentation for the complexity classes allowed in
+	  ppl_Polyhedron_get_bounding_box/3
+
+2002-11-14 Thursday 10:30  Elisa Ricci
+
+	* src/Polyhedron.inlines.hh (lazy.8): Erased a repeated comment.
+
+2002-11-14 Thursday 10:14  Elisa Ricci
+
+	* src/Polyhedron.cc, tests/topclosure4.cc (lazy.[6,2]): Improved
+	  Polyhedron::topological_closure_assign() in the case that the
+	  polyhedron has pending constraints.  Typo fixed in the test.
+
+2002-11-14 Thursday 09:43  Elisa Ricci
+
+	* src/Polyhedron.inlines.hh, tests/boundingbox1.cc (lazy.[7,1]):
+	  Corrected an error in Polyhedron::shrink_bounding_box(Box& box,
+	  Complexity_Class complexity).  Added two tests to verify this
+	  method. In boundingbox1.cc, corrected also test10 that did not
+	  verify if the resulting box computed using POLYNOMIAL were equal
+	  to the "known_pbox".
+
+2002-11-13 Wednesday 18:51  Elisa Ricci
+
+	* tests/: Makefile.am, topclosure4.cc (lazy.[3,1]): Added a new
+	  test to verify Polyhedron::topological_closure_assign().
+
+2002-11-13 Wednesday 18:50  Elisa Ricci
+
+	* src/: Polyhedron.cc, Polyhedron.inlines.hh (lazy.[5,6]): Improved
+	  Polyhedron::intersection_assign(),
+	  Polyhedron::poly_hull_assign(), Polyhedron::add_generator(),
+	  Polyhedron::add_constraint(), Polyhedron::concatenate_assign(),
+	  Polyhedron::add_constraints(), Polyhedron::add_generators() and
+	  modified Polyhedron::topological_closure_assign() and
+	  Polyhedron::shrink_bounding_box(Box& box, Complexity_Class
+	  complexity) in the case in which the polyhedra can have something
+	  pending.
+
+2002-11-13 Wednesday 18:43  Elisa Ricci
+
+	* src/: GenSys.cc, GenSys.defs.hh (lazy.[1,1]): Added the method
+	  add_corresponding_points(const GenSys& gs) that add to *this the
+	  "corresponding point of the closure points of "gs" and of *this".
+
+2002-11-13 Wednesday 10:58  Elisa Ricci
+
+	* tests/: Makefile.am, addconstraints13.cc, addgenerators12.cc,
+	  affineimage8.cc, affinepreimage10.cc, relations19.cc,
+	  timeelapse8.cc (lazy.[2,2,1,1,1,1,1]): Added some other tests
+	  that verify the methods Polyhedron::add_generators(),
+	  Polyhedron::add_generators_and_minimize(),
+	  Polyhedron::affine_image(), Polyhedron::affine_preimage(),
+	  Polyhedron::relation_with() and Polyhedron::time_elapse_assign()
+	  in the case in which the polyhedra can have something pending.
+
+2002-11-13 Wednesday 10:49  Elisa Ricci
+
+	* src/Polyhedron.cc (lazy.4): Improved Polyhedron::is_bounded() and
+	  Polyhedron::bounds().  Corrected
+	  Polyhedron::is_topologically_closed().
+
+2002-11-13 Wednesday 09:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.28): pl_check.pl now avoids
+	  unifying terms with constraint and generator systems.
+
+2002-11-12 Tuesday 17:32  Elisa Ricci
+
+	* tests/: Makefile.am, addconstraints13.cc, concatenate6.cc,
+	  constraints4.cc, generators6.cc, intersection11.cc, polyhull9.cc
+	  (lazy.[1,1,1,1,1,1,1]): Added some new tests that verify the case
+	  in which the polyhedron can have something pending.
+
+2002-11-12 Tuesday 17:30  Elisa Ricci
+
+	* src/: Polyhedron.cc, Polyhedron.inlines.hh (lazy.[3,5]): Improved
+	  operator<=(x, y) and Polyhedron::concatenate_assign(y) in the
+	  case that the polyhedra have something pending.
+
+2002-11-12 Tuesday 16:21  Elisa Ricci
+
+	* src/Polyhedron.inlines.hh (lazy.4): Considered the case of a
+	  polyhedron that has something pending in
+	  Polyhedron::shrink_bounding_box(Box& box, Complexity_Class
+	  complexity) and in Polyhedron::shuffle_dimensions(const
+	  PartialFunction& pfunc).
+
+2002-11-12 Tuesday 11:52  Elisa Ricci
+
+	* src/: Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh
+	  (lazy.[2,3,3]): Improved the case of pending system in
+	  Polyhedron::generators() and Polyhedron::minimize() and
+	  Polyhedron::intersection_assign().  Corrected operator<= in the
+	  case that one of the two polyhedra have something pending.  Added
+	  the method Polyhedron::can_have_something_pending().	Considered
+	  the case of pending constraints or pending generators in
+	  concatenate_assign(), poly_hull_assign(),
+	  poly_hull_assign()_and_minimize, add_dimension_and_embed(),
+	  add_dimensions_and_project, remove_dimensions()
+	  remove_higher_dimensions, in all the methods that are used to add
+	  constraints and generators, in affine_image() and
+	  affine_preimage, in time_elapse_assign(), in check_universe(), in
+	  is_bounded() and bounds(), in is_topologically_closed() and in
+	  topological_closure_assign(), in Polyhedron::swap() and in
+	  Polyhedron(Topology topol, const Box& box).
+
+2002-11-12 Tuesday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.26): Revised the section on urgent things to do.
+
+2002-11-12 Tuesday 10:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.69), pl_check.pl
+	  (1.27), ppl_prolog.icc (1.70), Ciao/ppl_ciao.pl (1.27),
+	  SICStus/ppl_sicstus_sd.cc (1.29), SWI/ppl_swiprolog.cc (1.53),
+	  XSB/ppl_xsb.H (1.6), XSB/ppl_xsb.cc (1.13), YAP/ppl_yap.cc
+	  (1.47): Implemented ppl_Polyhedron_get_bounding_box/3.
+
+2002-11-10 Sunday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.16): Do not try to run the real test on
+	  Cygwin since the implementation of setrlimit() there is a dummy
+	  one.
+
+2002-11-10 Sunday 11:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.11): Allow to build in the
+	  sources' directory.
+
+2002-11-10 Sunday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/.cvsignore (1.4), tests/.cvsignore (1.7):
+	  Ignore more generated files.
+
+2002-11-09 Saturday 22:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.15): The LIMIT macro has been fixed.
+
+2002-11-08 Friday 18:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.13), ciao_clpq.pl (1.2):
+	  Completed.
+
+2002-11-08 Friday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.14): Fixed two critical
+	  bugs.
+
+2002-11-08 Friday 12:20  Elisa Ricci
+
+	* src/: Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh
+	  (lazy.[1,2,2]): Added to a polyhedron the system of pending
+	  constraints and the system of pending generators.  Added the
+	  methods that set the flags used for the pending systems and
+	  Polyhedron::remove_pending_and_minimize(),
+	  Polyhedron::remove_pending_to_obtain_constraints() and
+	  Polyhedron::remove_pending_to_obtain_generators().  Started to
+	  consider the pending systems and in particular used them
+	  operator<=(x, y), Polyhedron::intersection_assign_and_minimize(y)
+	  and Polyhedron::intersection_assign(y).
+
+2002-11-08 Friday 12:13  Elisa Ricci
+
+	* src/Status.cc (lazy.2): Modified Status::OK() so that it also
+	  verify if the polyhedron has both pending constraints and pending
+	  generators.
+
+2002-11-08 Friday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.12): Added missing patterns
+	  to MOSTLYCLEANFILES.
+
+2002-11-08 Friday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ascii_dump_load3.cc (1.10), ascii_dump_load4.cc (1.10),
+	  ascii_dump_load5.cc (1.6), ascii_dump_load6.cc (1.3): Be noisy
+	  when NOISY.
+
+2002-11-08 Friday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ascii_dump_load7.cc (1.3): Comment fixed.
+
+2002-11-08 Friday 10:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.11): Add fake_main.pl and
+	  ciao_clpq.pl to EXTRA_DIST.
+
+2002-11-07 Thursday 18:32  Elisa Ricci
+
+	* src/: Polyhedron.defs.hh, Polyhedron.inlines.hh, Status.cc,
+	  Status.defs.hh, Status.inlines.hh (lazy.[1,1,1,1,1]): Added in
+	  the Status the flags that say if the polyhedron has something
+	  pending. Added the methods that check these flags.
+
+2002-11-07 Thursday 16:45  Elisa Ricci
+
+	* src/: SatMatrix.cc (1.23), SatMatrix.defs.hh (1.27),
+	  SatMatrix.inlines.hh (1.17): Erased SatMatrix::transpose(),
+	  operator==(const SatMatrix& x, const SatMatrix& y) and
+	  operator!=(const SatMatrix& x, const SatMatrix& y), because they
+	  were never used.
+
+2002-11-07 Thursday 16:04  Elisa Ricci
+
+	* src/Polyhedron.cc (1.262): Corrected the bug: we printed "sat_c"
+	  twice instead of "sat_c" and "sat_g".
+
+2002-11-07 Thursday 15:41  Elisa Ricci
+
+	* tests/ascii_dump_load7.cc (1.2): Simplify the test that shows the
+	  bug.
+
+2002-11-07 Thursday 15:35  Elisa Ricci
+
+	* tests/: Makefile.am (1.157), ascii_dump_load7.cc (1.1): This test
+	  shows a bug: we have a polyhedron with sat_g up-to-date but sat_g
+	  is dimensional incompatible with con_sys.
+
+2002-11-07 Thursday 15:20  Elisa Ricci
+
+	* tests/ascii_dump_load6.cc (1.2): Added two other tests to verify
+	  Status::ascii_dump() and Status::ascii_load().
+
+2002-11-06 Wednesday 19:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ascii_dump_load3.cc (1.9), ascii_dump_load4.cc (1.9):
+	  Added missing calls to seekp() where input was immediately
+	  followed by output on a stream open in read/write mode.
+
+2002-11-06 Wednesday 07:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.25): Added a few things to do rather urgently.
+
+2002-11-05 Tuesday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/watchdog1.cc (1.13): Missing return statement added.
+
+2002-11-05 Tuesday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.14): Missing return statement added.
+
+2002-11-05 Tuesday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.10): Detection of sizeof(mp_limb_t) fixed.
+
+2002-11-05 Tuesday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.13): The custom allocation functions must
+	  have C linkage.
+
+2002-11-05 Tuesday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/mc91.cc (1.9): Do not refer to the AskTell class.
+
+2002-11-05 Tuesday 14:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.23), PowerSet.defs.hh (1.22),
+	  PowerSet.inlines.hh (1.27): Include the required files.
+
+2002-11-05 Tuesday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.54): The AskTell constraint system class is
+	  nowhere near maturity: will not be distributed for the time
+	  being.
+
+2002-11-05 Tuesday 12:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.75): Check whether the C++ compiler supports
+	  flexible array only after having set CXXFLAGS.
+
+2002-11-05 Tuesday 12:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_check_gmp.m4 (1.9), ac_cxx_flexible_arrays.m4 (1.4): More
+	  quoting where needed.
+
+2002-11-05 Tuesday 11:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.cc (1.6), Watchdog.defs.hh (1.8): Standard
+	  conformance fixes.
+
+2002-11-05 Tuesday 10:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.8): Updated.
+
+2002-11-05 Tuesday 10:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.13): Work around a bug in AC_CHECK_FUNCS
+	  as implemented in autoconf 2.54c and previous versions.  For more
+	  information, see
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2002-November/002929.html.
+
+2002-11-05 Tuesday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.74), Watchdog/configure.ac (1.12),
+	  m4/ac_check_gmp.m4 (1.8), m4/ac_cxx_flexible_arrays.m4 (1.3):
+	  Avoid using obsolete macros.
+
+2002-11-05 Tuesday 09:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.73), m4/ac_check_gmp.m4 (1.7),
+	  m4/ac_cxx_flexible_arrays.m4 (1.2): Avoid using obsolete macros.
+
+2002-11-05 Tuesday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.12): Warning avoided, FIXME
+	  added.
+
+2002-11-05 Tuesday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/smm1.cc (1.10): Extend the Parma_Polyhedra_Library
+	  namespace with the output operators before using STL stream
+	  iterators.
+
+2002-11-05 Tuesday 00:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.55), ConSys.defs.hh (1.74), ConSys.inlines.hh
+	  (1.27), GenSys.cc (1.71), GenSys.defs.hh (1.85), Matrix.defs.hh
+	  (1.38): We were violating the C++ standard by referring to
+	  unaccessible base classes.
+
+2002-11-04 Monday 17:28  Elisa Ricci
+
+	* tests/: Makefile.am (1.156), affineimage7.cc (1.1),
+	  affinepreimage9.cc (1.1), ascii_dump_load4.cc (1.8),
+	  ascii_dump_load5.cc (1.5), ascii_dump_load6.cc (1.1): Added tests
+	  to verify ascii_dump() and ascii_load() of SatMatrix and of
+	  Status and to verify Polyhedron::affine_image() and
+	  Polyhedron::affine_preimage() with a negative denominator.
+
+2002-11-04 Monday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.55): Reposition a declaration that
+	  was moved by mistake.
+
+2002-11-04 Monday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.10), ciao_clpq.pl (1.1):
+	  Little progress in the Ciao-Prolog interface.
+
+2002-11-04 Monday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.54): Improved comments for
+	  Polyhedron::shrink_bounding_box().
+
+2002-11-04 Monday 11:36  Elisa Ricci
+
+	* src/Polyhedron.inlines.hh (1.53): In
+	  Polyhedron::shrink_bounding_box() added the comment that explains
+	  why we change the sign of `n' when we built the ExtendedRational
+	  `r`.
+
+2002-11-04 Monday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.52): Avoid taking references to
+	  temporary GMP expressions.  FIXME about a missing comment added.
+
+2002-11-04 Monday 09:34  Elisa Ricci
+
+	* tests/: boundingbox3.cc (1.5), boundingbox4.cc (1.2): Modified
+	  these tests so that they also verify
+	  Polyhedron::shrink_bounding_box(box, POLYNOMIAL).
+
+2002-11-04 Monday 08:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.261): Avoid some useless copies.
+
+2002-11-03 Sunday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.260): Avoid taking references to temporary
+	  GMP expressions.
+
+2002-11-03 Sunday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.155), ascii_dump_load1.cc (1.9),
+	  ascii_dump_load2.cc (1.7), ascii_dump_load3.cc (1.8),
+	  ascii_dump_load4.cc (1.7), ascii_dump_load5.cc (1.4): Be
+	  consistent in naming files.
+
+2002-11-03 Sunday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.46), Row.inlines.hh (1.34): Progress in
+	  supporting compilers that do not provide flexible arrays.
+
+2002-11-03 Sunday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.68),
+	  interfaces/Prolog/GNU/Makefile.am (1.24), m4/ac_check_gmp.m4
+	  (1.6): For the sake of not very smart linkers, link with `-lgmpxx
+	  -lgmp' instead of the other way around.
+
+2002-11-03 Sunday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ascii_dump_load1.cc (1.8), ascii_dump_load2.cc (1.6),
+	  ascii_dump_load3.cc (1.7), ascii_dump_load4.cc (1.6),
+	  ascii_dump_load5.cc (1.3), linearpartition1.cc (1.6),
+	  linearpartition2.cc (1.6), linearpartition3.cc (1.6), memory1.cc
+	  (1.12), writeconsys1.cc (1.3), writegensys1.cc (1.4),
+	  writegensys2.cc (1.4), writegensys3.cc (1.3), writepolyhedron1.cc
+	  (1.3), writepolyhedron2.cc (1.4), writepolyhedron3.cc (1.3),
+	  writerelation1.cc (1.3), writevariable1.cc (1.3): Be consistent
+	  as far as inclusions are concerned.
+
+2002-11-03 Sunday 11:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/pwl_header.middle (1.2): Include sys/time.h, if
+	  available.
+
+2002-11-03 Sunday 10:56  Elisa Ricci
+
+	* tests/: Makefile.am (1.154), boundingbox3.cc (1.4),
+	  boundingbox4.cc (1.1): Erased form boundingbox3.cc the flags
+	  "C_TESTS" and "NNC_TESTS".  boundingbox3.cc now contains only
+	  tests with C_Polyhedron; the tests that were in boundingbox3.cc
+	  and that contain polyhedron described by strict inequalities now
+	  are in boundingbox4.cc.
+
+2002-11-03 Sunday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.10): Always use the current
+	  C++ compiler, not simply `g++'.
+
+2002-11-03 Sunday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.defs.hh (1.7), Watchdog.inlines.hh (1.6):
+	  Little cleaning.
+
+2002-11-03 Sunday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: config.h.in (1.3), configure.ac (1.11): Get rid of
+	  AC_C_INLINE: we do not use inlines in C code and it was doing
+	  harm with some compilers.
+
+2002-11-02 Saturday 23:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.50), ppl_c.h (1.50): The function
+	  ppl_Polyhedron_shrink_bounding_box() has now a parameter allowing
+	  the selection of the desired complexity class.
+
+2002-11-02 Saturday 23:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.hh (1.25): Spurious line removed.
+
+2002-11-02 Saturday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.9): Can now compile the
+	  Ciao-Prolog interface.
+
+2002-11-02 Saturday 20:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.26): Properly declare all
+	  the predicates.
+
+2002-11-02 Saturday 20:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.11): Uninitialized variable
+	  bug fixed.
+
+2002-11-02 Saturday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.10): Buggy conditional fixed.
+
+2002-11-02 Saturday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: adddimensions11.cc (1.2), addgenerators11.cc (1.3),
+	  exceptions1.cc (1.25), exceptions2.cc (1.20): Avoid inventing
+	  non-existing standard exceptions.
+
+2002-11-02 Saturday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.171), src/Polyhedron.inlines.hh (1.51),
+	  src/globals.hh (1.24), tests/boundingbox1.cc (1.26),
+	  tests/boundingbox2.cc (1.14): New enum Complexity_Class to
+	  represent complexity classes.  Polyhedron::shrink_bounding_box()
+	  now takes a complexity class, defaulting to ANY, instead of a
+	  bool.
+
+2002-11-02 Saturday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.49): Mention the bug fixed in operator-=(LinExpression&,
+	  const LinExpression&).
+
+2002-11-02 Saturday 09:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.22), configure.ac (1.72): Get rid of AC_C_INLINE:
+	  we do not use inlines in C code and it was doing harm with some
+	  compilers.
+
+2002-11-01 Friday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.21), configure.ac (1.71), m4/ac_check_gmp.m4
+	  (1.5): Much improved detection of the size of GMP's mp_limb_t.
+
+2002-11-01 Friday 18:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatRow.cc (1.14), SatRow.defs.hh (1.23): Got rid of
+	  operator<<(std::ostream&, const SatRow&).
+
+2002-11-01 Friday 18:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.73), Constraint.defs.hh (1.77),
+	  GenSys.defs.hh (1.84), Generator.defs.hh (1.80),
+	  Poly_Con_Relation.defs.hh (1.18), Poly_Gen_Relation.defs.hh
+	  (1.17), Polyhedron.defs.hh (1.170), Variable.defs.hh (1.27):
+	  Correctly relate the output operators to the corresponding
+	  classes.
+
+2002-11-01 Friday 18:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.24): There must be a more efficient way to implement bool
+	  are_disjoint(const Polyhedron&, const Polyhedron&).
+
+2002-11-01 Friday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: NNCminimize1.cc (1.7), NNCminimize2.cc (1.7),
+	  NNCminimize3.cc (1.7), NNCminimize5.cc (1.6), ascii_dump_load3.cc
+	  (1.6), ascii_dump_load4.cc (1.5), bbrz02widening13.cc (1.5),
+	  bbrz02widening14.cc (1.6), bbrz02widening15.cc (1.5),
+	  bbrz02widening9.cc (1.5), concatenate1.cc (1.4), exceptions1.cc
+	  (1.24), generators1.cc (1.10), generators2.cc (1.6),
+	  linearpartition1.cc (1.5), linearpartition2.cc (1.5),
+	  linearpartition3.cc (1.5), memory1.cc (1.11), smm1.cc (1.9),
+	  watchdog1.cc (1.12): It is pointless to say `using namespace std'
+	  and `std::' at the same time.
+
+2002-11-01 Friday 18:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.48), src/AskTell.defs.hh (1.10), src/AskTell.inlines.hh
+	  (1.10), src/BoundingBox.cc (1.4), src/BoundingBox.defs.hh (1.8),
+	  src/ConSys.cc (1.54), src/ConSys.defs.hh (1.72),
+	  src/Constraint.cc (1.34), src/Constraint.defs.hh (1.76),
+	  src/Determinate.defs.hh (1.22), src/Determinate.inlines.hh
+	  (1.22), src/GenSys.cc (1.70), src/GenSys.defs.hh (1.83),
+	  src/Generator.cc (1.41), src/Generator.defs.hh (1.79),
+	  src/Interval.cc (1.5), src/Interval.defs.hh (1.10),
+	  src/Poly_Con_Relation.cc (1.5), src/Poly_Con_Relation.defs.hh
+	  (1.17), src/Poly_Gen_Relation.cc (1.5),
+	  src/Poly_Gen_Relation.defs.hh (1.16), src/Polyhedron.cc (1.259),
+	  src/Polyhedron.defs.hh (1.169), src/Polyhedron.types.hh (1.7),
+	  src/PowerSet.defs.hh (1.21), src/PowerSet.inlines.hh (1.26),
+	  src/SatRow.cc (1.13), src/SatRow.defs.hh (1.22), src/Variable.cc
+	  (1.9), src/Variable.defs.hh (1.26), tests/NNCminimize4.cc (1.9),
+	  tests/NNCminimize6.cc (1.8), tests/bbrz02widening13.cc (1.4),
+	  tests/bbrz02widening14.cc (1.5), tests/bbrz02widening15.cc (1.4),
+	  tests/bbrz02widening9.cc (1.4), tests/boundingbox1.cc (1.25),
+	  tests/boundingbox2.cc (1.13), tests/linearpartition1.cc (1.4),
+	  tests/linearpartition2.cc (1.4), tests/linearpartition3.cc (1.4),
+	  tests/mc91.cc (1.8), tests/print.cc (1.3), tests/relations1.cc
+	  (1.7), tests/relations10.cc (1.3), tests/relations11.cc (1.3),
+	  tests/relations12.cc (1.2), tests/relations13.cc (1.2),
+	  tests/relations14.cc (1.2), tests/relations15.cc (1.2),
+	  tests/relations16.cc (1.2), tests/relations17.cc (1.3),
+	  tests/relations18.cc (1.2), tests/relations2.cc (1.8),
+	  tests/relations3.cc (1.8), tests/relations4.cc (1.8),
+	  tests/relations5.cc (1.8), tests/relations6.cc (1.7),
+	  tests/relations7.cc (1.7), tests/relations8.cc (1.7),
+	  tests/relations9.cc (1.8), tests/smm1.cc (1.8),
+	  tests/writeconsys1.cc (1.2), tests/writegensys1.cc (1.3),
+	  tests/writegensys2.cc (1.3), tests/writegensys3.cc (1.2),
+	  tests/writepolyhedron1.cc (1.2), tests/writepolyhedron2.cc (1.3),
+	  tests/writepolyhedron3.cc (1.2), tests/writerelation1.cc (1.2),
+	  tests/writevariable1.cc (1.2): All the input/output operators
+	  have been confined into namespace
+	  Parma_Polyhedra_Library::IO_Operators.  This way they do not
+	  conflict with the operators the user might want to define.
+
+2002-11-01 Friday 14:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.53): Exclude Topology.hh from the generation
+	  of user's documentation.
+
+2002-11-01 Friday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BBox.cc (1.1), BBox.hh (1.1), Makefile.am (1.153),
+	  boundingbox1.cc (1.24), boundingbox2.cc (1.12), boundingbox3.cc
+	  (1.3): Avoid code duplication and some spaghetti-code.
+
+2002-11-01 Friday 12:03  Elisa Ricci
+
+	* tests/: boundingbox1.cc (1.23), boundingbox3.cc (1.2): Added
+	  operator<=(const BInterval& x, const BInterval& y) and
+	  operator<=(const BBox& x, const BBox& y).  In the tests, now we
+	  verify also if nbox <= pbox.
+
+2002-11-01 Friday 10:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.cc (1.4): Always include <iostream>.
+
+2002-10-31 Thursday 18:08  Elisa Ricci
+
+	* tests/: Makefile.am (1.152), boundingbox1.cc (1.22),
+	  boundingbox3.cc (1.1): Modified the test boundingbox1.cc to use
+	  only necessarily closed polyhedron and to test also
+	  Polyhedron::shrink_bounding_box(Box& box, bool polynomial) when
+	  polynomial is "true".  Put the tests with not necessarily closed
+	  polyhedra into boundingbox3.cc.
+
+2002-10-31 Thursday 18:02  Elisa Ricci
+
+	* src/: Interval.cc (1.3), Interval.defs.hh (1.9),
+	  Interval.inlines.hh (1.6), Polyhedron.inlines.hh (1.50): Added
+	  :operator<<(std::ostream& s, const ExtendedRational& x).  In
+	  ExtendedRational(const Integer& num, const Integer& den) we
+	  temporary use `canonicalize()'.  Added the part that we use if
+	  the bounding box must be shrunk in polynomial time (if the
+	  generator system of the polyhedron is not up-to-date).
+
+2002-10-30 Wednesday 21:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.49): Two problems with the current
+	  implementation of Polyhedron::shrink_bounding_box() flagged.
+
+2002-10-30 Wednesday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.47), src/Polyhedron.defs.hh (1.168),
+	  src/Polyhedron.inlines.hh (1.48): New boolean parameter for
+	  template <typename Box> void Polyhedron::shrink_bounding_box(Box&
+	  box, bool polynomial) const: when true it specifies the bounding
+	  box must be shrunk in polynomial time.
+
+2002-10-30 Wednesday 17:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc, src/Polyhedron.defs.hh, tests/Makefile.am,
+	  tests/stronglyminimize1.cc, tests/stronglyminimize2.cc,
+	  tests/stronglyminimize3.cc (alt_nnc.[26,10,8,4,4,4]): Got rid of
+	  Polyhedron::strongly_minimize().
+
+2002-10-30 Wednesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.258), src/Polyhedron.defs.hh (1.167),
+	  tests/Makefile.am (1.151), tests/stronglyminimize1.cc (1.2),
+	  tests/stronglyminimize2.cc (1.2), tests/stronglyminimize3.cc
+	  (1.2): Got rid of Polyhedron::strongly_minimize().
+
+2002-10-30 Wednesday 17:24  Elisa Ricci
+
+	* tests/: NNCminimize5.cc (1.5), NNCminimize6.cc (1.7),
+	  addconstraints3.cc (1.6), generators1.cc (1.9), h79widening2.cc
+	  (1.4), h79widening3.cc (1.4): Now these tests verify if the used
+	  methods do the right thing.
+
+2002-10-30 Wednesday 17:18  Elisa Ricci
+
+	* tests/: Makefile.am (1.150), ascii_dump1.cc (1.2), operator1.cc
+	  (1.1), writerelation1.cc (1.1): The test ascii_dump1.cc now is
+	  called writerealtion1.cc, because it verifies operator<< of
+	  Poly_Gen_Relation and Poly_Con_Relation.  In operator1.cc put the
+	  tests to verify operator>=(const Polyhedron& x, const Polyhedron&
+	  y), operator>(const Polyhedron& x, const Polyhedron& y),
+	  operator!=(const Polyhedron& x, const Polyhedron& y) and
+	  operator<(const Polyhedron& x, const Polyhedron& y).
+
+2002-10-30 Wednesday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variable.defs.hh (1.25): Duplicate `public' specification
+	  removed.
+
+2002-10-30 Wednesday 10:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.25): extra_linker_opts/1
+	  directive added.
+
+2002-10-30 Wednesday 09:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.149), writegensys4.cc (1.2),
+	  writevariable1.cc (1.1): Properly test operator<<(std::ostream&
+	  s, const Variable& v) and the related machinery.
+
+2002-10-29 Tuesday 18:35  Elisa Ricci
+
+	* tests/: Makefile.am (1.148), writegensys4.cc (1.1): Added a test
+	  to print a variable with id > 26.
+
+2002-10-29 Tuesday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.45), Row.defs.hh (1.57): Removed
+	  operator<<(std::ostream&, const Row&).
+
+2002-10-29 Tuesday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.7): Updated.
+
+2002-10-29 Tuesday 14:49  Elisa Ricci
+
+	* tests/: Makefile.am (1.147), ascii_dump1.cc (1.1),
+	  ascii_dump_load1.cc (1.7), ascii_dump_load2.cc (1.5),
+	  ascii_dump_load3.cc (1.5), ascii_dump_load4.cc (1.4),
+	  ascii_dump_load5.cc (1.2): Added some tests to verify
+	  Poly_Gen_Relation::ascii_dump(), Poly_Gen_Relation::OK(),
+	  Poly_Con_Relation::ascii_dump() and Poly_Con_Relation::OK().
+	  Corrected the comment of the tests ascii_dump_load1.cc,
+	  ascii_dump_load2.cc, ascii_dump_load3.cc, ascii_dump_load4.cc,
+	  ascii_dump_load5.cc.
+
+2002-10-28 Monday 08:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LinExpression.cc (ppl-0_4-branch.1): Fixed a bug in
+	  LinExpression::operator-=().
+
+2002-10-28 Monday 08:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, linexpression1.cc (ppl-0_4-branch.[5,1]):
+	  This test shows a bug in LinExpression::operator-=().
+
+2002-10-26 Saturday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.70): Bump version number.
+
+2002-10-25 Friday 20:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (alt_nnc.8): Definitions of num_cons()
+	  and num_gens().
+
+2002-10-25 Friday 19:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, tests/hypercubes.cc (alt_nnc.[9,10]):
+	  Added methods for printing sizes of (low-level) con_sys and
+	  gen_sys.
+
+2002-10-25 Friday 18:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.25): n strong minimization of
+	  constraints, force all strict inequalities to have the same
+	  epsilon coefficient.
+
+2002-10-25 Friday 18:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/hypercubes.cc (alt_nnc.9): Test exploiting smf's.
+
+2002-10-25 Friday 12:42  Elisa Ricci
+
+	* tests/: Makefile.am (1.146), ascii_dump_load4.cc (1.3),
+	  ascii_dump_load5.cc (1.1): Added some new test to verify
+	  ascii_dump() and ascii_load().
+
+2002-10-24 Thursday 18:07  Elisa Ricci
+
+	* tests/: Makefile.am (1.145), ascii_dump_load4.cc (1.2),
+	  writegensys3.cc (1.1): Added a new test to verify
+	  operator<<(std::ostream&, const GenSys&).  Erased form
+	  ascii_dump_load4.cc an unused const char*.
+
+2002-10-24 Thursday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Init.defs.hh (1.7): Useless file inclusion removed.
+
+2002-10-24 Thursday 15:45  Elisa Ricci
+
+	* src/LinExpression.cc (1.15): Corrected the bug in
+	  operator-=(LinExpression& e1, const LinExpression& e2): if
+	  e1.size() < e2.size(), we compute a copy e of e1 with the
+	  dimension of e2 and then we compute e - e2.
+
+2002-10-24 Thursday 15:09  Elisa Ricci
+
+	* tests/: Makefile.am (1.144), addgenerator4.cc (1.2),
+	  linexpression1.cc (1.1): Now, the test addgenerator4.cc verifies
+	  only Polyhedron::add_generator(g).  The bug of
+	  operator-=(LinExpression& e1, const LinExpression& e2) is now
+	  reported in the test linexpression1.cc.
+
+2002-10-24 Thursday 14:37  Elisa Ricci
+
+	* tests/: Makefile.am (1.143), addgenerator4.cc (1.1): Added a test
+	  for Polyhedron::add_generator(g). This test shows a bug in
+	  operator-=(LinExpression& e1, const LinExpression& e2) if
+	  e1.size() < e2.size().
+
+2002-10-23 Wednesday 12:19  Elisa Ricci
+
+	* src/Polyhedron.cc (alt_nnc.24): Corrected a problem in
+	  Polyhedron::is_BBRZ02_stabilizing(x, y): the vector `x_num_rays'
+	  must have `x.gen_sys.num_columns() - 1' elements and not
+	  `x.space_dimension()'. We have done the same change for the
+	  vector `y_num_rays'.
+
+2002-10-23 Wednesday 10:09  Elisa Ricci
+
+	* src/Polyhedron.cc (alt_nnc.23): Modified
+	  Polyhedron::is_BBRZ02_stabilizing(x, y) so that if `x' and `y'
+	  are not necessarily closed we compute the number of their points
+	  and closure points and not only the number of their closure
+	  points.
+
+2002-10-21 Monday 07:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am, smfintersection.cc, smfpolyhull.cc
+	  (alt_nnc.[7,1,2]): Trying to better exploit smf's.
+
+2002-10-21 Monday 07:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.22): Disregarding the minusepsray when
+	  performing strong minimization of consys.
+
+2002-10-19 Saturday 00:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* mkinstalldirs (1.5): Updated.
+
+2002-10-19 Saturday 00:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: config.guess (1.1), config.sub (1.1), depcomp (1.1),
+	  install-sh (1.1), ltmain.sh (1.1), missing (1.1), mkinstalldirs
+	  (1.1): Missing files added.
+
+2002-10-18 Friday 17:02  Elisa Ricci
+
+	* src/: ConSys.cc (1.53), ConSys.defs.hh (1.71): Modified
+	  ConSys:OK(): now we verify also if every row in the matrix is a
+	  valid constraint.
+
+2002-10-18 Friday 16:46  Elisa Ricci
+
+	* tests/: Makefile.am (1.142), ascii_dump_load1.cc (1.6),
+	  exceptions1.cc (1.23), writeconsys1.cc (1.1): The writeconsys1.cc
+	  test verifies operator<<(s, cs).  Added tests in exceptions1.cc
+	  to verify Generator::coefficient() and Constraint::coefficient().
+	  In ascii_dump_load1.cc erased an unused variable.
+
+2002-10-18 Friday 16:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/smfpolyhull.cc (alt_nnc.1): Put under CVS control.
+
+2002-10-18 Friday 10:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.21): Modified the widening operators
+	  to also add the non-strict inequality corresponding to each
+	  strict inequality added.
+
+2002-10-17 Thursday 18:33  Elisa Ricci
+
+	* tests/: exceptions1.cc (1.22), exceptions2.cc (1.19),
+	  writegensys1.cc (1.2): Added some tests to verify
+	  Generator::ray(), Generator::line(), Generator::closure_point(),
+	  Generator::coefficient(), Generator::divisor() and operator<<(s,
+	  g).
+
+2002-10-17 Thursday 18:30  Elisa Ricci
+
+	* src/Polyhedron.cc (1.257): In
+	  Polyhedron::BBRZ02_widening_assign() and
+	  Polyhedron::is_BBRZ02_stabilizing() debugging-purpose output made
+	  silent.  Modified Polyhedron::select_H79_constraints(y, cs) so
+	  that when we use it the system of constraints has the right
+	  topology.
+
+2002-10-17 Thursday 17:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/hypercubes.cc (alt_nnc.8): Now committed the right file I
+	  was playing with.
+
+2002-10-17 Thursday 17:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am, hypercubes.cc (alt_nnc.[6,7]): Playing with
+	  hypercubes and strong minimization.
+
+2002-10-17 Thursday 17:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.20): Debugging-purpose output made
+	  silent.
+
+2002-10-17 Thursday 15:39  Elisa Ricci
+
+	* tests/: Makefile.am (1.141), ascii_dump_load4.cc (1.1),
+	  relations18.cc (1.1), writepolyhedron3.cc (1.1): The
+	  ascii_dump_load4.cc test verifies some particular cases of
+	  ConSys::ascii_dump(s) and ConSys::ascii_load(s).  The
+	  relations18.cc test verifies Polyhedron::relation_with(g), where
+	  "g" is a closure point and the system of constraints of the
+	  polyhedron contains equalities.  The writepolyhedron3.cc test
+	  verifies operator<<(std::ostream&, const Polyhedron&) with an
+	  universe polyhedron.
+
+2002-10-17 Thursday 11:20  Elisa Ricci
+
+	* tests/: ascii_dump_load1.cc (1.5), relations17.cc (1.2): Added
+	  new tests and modified other tests to verify some other methods
+	  of the class GenSys.
+
+2002-10-16 Wednesday 19:02  Elisa Ricci
+
+	* tests/writegensys2.cc (1.2): Now we print the system of
+	  generators of an empty polyhedron.
+
+2002-10-16 Wednesday 19:00  Elisa Ricci
+
+	* tests/: Makefile.am (1.140), limitedbbrz02widening1.cc (1.2),
+	  relations17.cc (1.1), writegensys1.cc (1.1), writegensys2.cc
+	  (1.1): Added new tests for the methods of the class GenSys.
+	  limitedbbrz02widening1.cc is now silent.  Now we do not test
+	  nnc_bbrz02widening4.cc and nnc_bbrz02widening7.cc because they
+	  contains NNC polyhedra.
+
+2002-10-16 Wednesday 17:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.256): Fixed a topology problem in
+	  select_H79_constraints().
+
+2002-10-16 Wednesday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/writepolyhedron2.cc (1.2): Inconsistent spacing fixed.
+
+2002-10-16 Wednesday 14:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.255), Polyhedron.defs.hh (1.166),
+	  Polyhedron.inlines.hh (1.47): Added static member
+	  add_low_level_constraints(ConSys&) to factorize common code
+	  adding either the positivity or the epsilon-bound constraints.
+
+2002-10-16 Wednesday 14:36  Elisa Ricci
+
+	* tests/: Makefile.am (1.139), bbrz02widening19.cc (1.1),
+	  limitedbbrz02widening1.cc (1.1), writepolyhedron2.cc (1.1): Added
+	  new tests to verify some methods of the class Polyhedron.
+
+2002-10-16 Wednesday 09:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/hypercubes.cc (alt_nnc.6): Experimenting with closed
+	  hypercubes from which we cut vertices using strict inequalities
+	  and open duals of hypercubes to which we add (relatively open)
+	  facets by adding points.
+
+2002-10-16 Wednesday 07:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.69): Handle unary plus:
+	  previously, `+A = 1' could not be valid syntax for a constraint.
+
+2002-10-16 Wednesday 07:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.69): Version number bumped.
+
+2002-10-15 Tuesday 18:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.254): Debugging code in
+	  Polyhedron::check_universe() fixed.
+
+2002-10-15 Tuesday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.138), writepolyhedron1.cc (1.1): Test
+	  operator<<(std::ostream&, const Polyhedron&).
+
+2002-10-15 Tuesday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.46), src/LinExpression.defs.hh (1.56),
+	  src/LinExpression.inlines.hh (1.25): New function LinExpression
+	  operator+(const LinExpression&): previously an expressions like
+	  `+x2-x3-x4 <= 0' could not constitute valid syntax for a
+	  constraint.
+
+2002-10-15 Tuesday 17:55  Elisa Ricci
+
+	* src/Polyhedron.cc (1.253): Modified Polyhedron::check_univers():
+	  if we are considering a not necessarily closed polyhedron and if
+	  its system of constraints contains only two rows that are not
+	  equalities, we are sure that they are epsilon constraints.
+
+2002-10-15 Tuesday 17:48  Elisa Ricci
+
+	* tests/: Makefile.am (1.137), topclosure3.cc (1.1): Added a test
+	  to verify Polyhedron::topological_closure_assign().
+
+2002-10-15 Tuesday 15:27  Elisa Ricci
+
+	* tests/: Makefile.am (1.136), adddimensions12.cc (1.1),
+	  affineimage6.cc (1.1), affinepreimage8.cc (1.1), disjoint1.cc
+	  (1.1), generalizedaffineimage11.cc (1.1),
+	  generalizedaffineimage12.cc (1.1), limitedh79widening4.cc (1.1):
+	  Added new tests for some methods of the class Polyhedron.
+
+2002-10-15 Tuesday 15:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, NEWS, STANDARDS, config.guess, config.h.in,
+	  config.sub, configure.ac, ltmain.sh, ppl.spec.in,
+	  doc/Makefile.am, doc/bib2dox, doc/bib2html1.sed,
+	  doc/bib2html2.sed, doc/definitions.dox,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/fdl.dox, doc/gpl.dox, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/clpq2.pl, interfaces/Prolog/pl_check.pl,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+	  src/BoundingBox.defs.hh, src/C_Polyhedron.defs.hh, src/ConSys.cc,
+	  src/ConSys.defs.hh, src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/GenSys.cc, src/GenSys.defs.hh, src/Integer.defs.hh,
+	  src/Integer.inlines.hh, src/LinExpression.cc,
+	  src/LinExpression.defs.hh, src/LinExpression.inlines.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/NNC_Polyhedron.defs.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Polyhedron.cc,
+	  src/Polyhedron.defs.hh, src/PowerSet.defs.hh,
+	  src/PowerSet.inlines.hh, src/Row.cc, src/Row.defs.hh,
+	  src/SatMatrix.cc, src/SatMatrix.defs.hh, src/SatRow.cc,
+	  src/SatRow.defs.hh, src/Status.cc, src/Status.defs.hh,
+	  src/algorithms.hh, src/conversion.cc, src/globals.hh,
+	  src/minimize.cc, src/simplify.cc, tests/Makefile.am,
+	  tests/addconstraint2.cc, tests/addconstraint3.cc,
+	  tests/addconstraints10.cc, tests/addconstraints11.cc,
+	  tests/addconstraints12.cc, tests/adddimensions11.cc,
+	  tests/addgenerator3.cc, tests/addgenerators11.cc,
+	  tests/affineimage3.cc, tests/affineimage4.cc,
+	  tests/affineimage5.cc, tests/affinepreimage5.cc,
+	  tests/affinepreimage6.cc, tests/affinepreimage7.cc,
+	  tests/ascii_dump_load1.cc, tests/ascii_dump_load2.cc,
+	  tests/ascii_dump_load3.cc, tests/bbrz02widening1.cc,
+	  tests/bbrz02widening10.cc, tests/bbrz02widening11.cc,
+	  tests/bbrz02widening12.cc, tests/bbrz02widening13.cc,
+	  tests/bbrz02widening14.cc, tests/bbrz02widening15.cc,
+	  tests/bbrz02widening16.cc, tests/bbrz02widening17.cc,
+	  tests/bbrz02widening18.cc, tests/bbrz02widening6.cc,
+	  tests/bbrz02widening7.cc, tests/bbrz02widening9.cc,
+	  tests/concatenate5.cc, tests/contains1.cc, tests/exceptions1.cc,
+	  tests/exceptions2.cc, tests/files.cc, tests/files.hh,
+	  tests/generalizedaffineimage1.cc,
+	  tests/generalizedaffineimage10.cc,
+	  tests/generalizedaffineimage2.cc,
+	  tests/generalizedaffineimage3.cc,
+	  tests/generalizedaffineimage4.cc,
+	  tests/generalizedaffineimage5.cc,
+	  tests/generalizedaffineimage6.cc,
+	  tests/generalizedaffineimage7.cc,
+	  tests/generalizedaffineimage8.cc,
+	  tests/generalizedaffineimage9.cc, tests/h79widening5.cc,
+	  tests/intersection10.cc, tests/linearpartition1.cc,
+	  tests/linearpartition2.cc, tests/linearpartition3.cc,
+	  tests/mc91.cc, tests/memory1.cc, tests/minconstraints2.cc,
+	  tests/minconstraints3.cc, tests/mingenerators2.cc,
+	  tests/mingenerators3.cc, tests/polydifference7.cc,
+	  tests/polyhull7.cc, tests/polyhull8.cc, tests/relations10.cc,
+	  tests/relations11.cc, tests/relations12.cc, tests/relations13.cc,
+	  tests/relations14.cc, tests/relations15.cc, tests/relations16.cc,
+	  tests/stronglyminimize1.cc, tests/stronglyminimize2.cc,
+	  tests/stronglyminimize3.cc, tests/timeelapse6.cc,
+	  tests/timeelapse7.cc, tests/topclosed3.cc, tests/topclosure2.cc
+	  (alt_nnc.[3,6,4,3,5,3,5,3,3,3,3,3,3,4,3,3,3,3,3,6,6,4,4,4,5,4,4,3,4,4,4,4,4,5,5,5,8,7,7,7,7,7,10,7,4,4,4,5,5,4,4,5,5,4,5,4,5,19,8,6,6,4,5,4,5,3,5,4,5,3,4,5,5,4,5,3,3,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,3,4,4,4,3,3,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]):
+	  Merged the changes on the main trunk within the tags
+	  third_merge_to_alt_nnc and fourth_merge_to_alt_nnc.
+
+2002-10-15 Tuesday 14:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, NEWS, STANDARDS, config.guess, config.h.in,
+	  config.sub, configure.ac, ltmain.sh, ppl.spec.in,
+	  doc/Makefile.am, doc/bib2dox, doc/bib2html1.sed,
+	  doc/bib2html2.sed, doc/definitions.dox,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/fdl.dox, doc/gpl.dox, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/clpq2.pl, interfaces/Prolog/pl_check.pl,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+	  src/BoundingBox.defs.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/ConSys.cc, src/ConSys.defs.hh,
+	  src/ConSys.inlines.hh, src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Integer.defs.hh,
+	  src/Integer.inlines.hh, src/LinExpression.cc,
+	  src/LinExpression.defs.hh, src/LinExpression.inlines.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/NNC_Polyhedron.defs.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Polyhedron.cc,
+	  src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	  src/PowerSet.defs.hh, src/PowerSet.inlines.hh, src/Row.cc,
+	  src/Row.defs.hh, src/SatMatrix.cc, src/SatMatrix.defs.hh,
+	  src/SatRow.cc, src/SatRow.defs.hh, src/Status.cc,
+	  src/Status.defs.hh, src/algorithms.hh, src/conversion.cc,
+	  src/globals.hh, src/minimize.cc, src/simplify.cc,
+	  tests/Makefile.am, tests/addconstraint2.cc,
+	  tests/addconstraint3.cc, tests/addconstraints10.cc,
+	  tests/addconstraints11.cc, tests/addconstraints12.cc,
+	  tests/adddimensions11.cc, tests/addgenerator3.cc,
+	  tests/addgenerators11.cc, tests/affineimage3.cc,
+	  tests/affineimage4.cc, tests/affineimage5.cc,
+	  tests/affinepreimage5.cc, tests/affinepreimage6.cc,
+	  tests/affinepreimage7.cc, tests/ascii_dump_load1.cc,
+	  tests/ascii_dump_load2.cc, tests/ascii_dump_load3.cc,
+	  tests/bbrz02widening1.cc, tests/bbrz02widening10.cc,
+	  tests/bbrz02widening11.cc, tests/bbrz02widening12.cc,
+	  tests/bbrz02widening13.cc, tests/bbrz02widening14.cc,
+	  tests/bbrz02widening15.cc, tests/bbrz02widening16.cc,
+	  tests/bbrz02widening17.cc, tests/bbrz02widening18.cc,
+	  tests/bbrz02widening6.cc, tests/bbrz02widening7.cc,
+	  tests/bbrz02widening9.cc, tests/boundingbox2.cc,
+	  tests/concatenate5.cc, tests/contains1.cc, tests/exceptions1.cc,
+	  tests/exceptions2.cc, tests/files.cc, tests/files.hh,
+	  tests/generalizedaffineimage1.cc,
+	  tests/generalizedaffineimage10.cc,
+	  tests/generalizedaffineimage2.cc,
+	  tests/generalizedaffineimage3.cc,
+	  tests/generalizedaffineimage4.cc,
+	  tests/generalizedaffineimage5.cc,
+	  tests/generalizedaffineimage6.cc,
+	  tests/generalizedaffineimage7.cc,
+	  tests/generalizedaffineimage8.cc,
+	  tests/generalizedaffineimage9.cc, tests/h79widening5.cc,
+	  tests/hypercubes.cc, tests/intersection10.cc,
+	  tests/linearpartition1.cc, tests/linearpartition2.cc,
+	  tests/linearpartition3.cc, tests/mc91.cc, tests/memory1.cc,
+	  tests/minconstraints2.cc, tests/minconstraints3.cc,
+	  tests/mingenerators2.cc, tests/mingenerators3.cc,
+	  tests/polydifference7.cc, tests/polyhull7.cc, tests/polyhull8.cc,
+	  tests/relations10.cc, tests/relations11.cc, tests/relations12.cc,
+	  tests/relations13.cc, tests/relations14.cc, tests/relations15.cc,
+	  tests/relations16.cc, tests/stronglyminimize1.cc,
+	  tests/stronglyminimize2.cc, tests/stronglyminimize3.cc,
+	  tests/timeelapse6.cc, tests/timeelapse7.cc, tests/topclosed3.cc,
+	  tests/topclosure2.cc
+	  (alt_nnc.[2,5,3,2,4,2,4,2,2,2,2,2,2,3,2,2,2,2,2,5,5,3,3,3,4,3,3,2,3,3,3,3,3,4,4,3,4,7,6,5,6,6,5,6,6,9,6,7,7,5,3,3,3,4,4,3,3,4,4,3,4,3,4,18,7,7,5,5,3,4,3,4,2,4,3,4,2,3,4,4,3,4,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,3,3,3,5,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,5,2,2,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+	  Erroneous merge undone.
+
+2002-10-15 Tuesday 12:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.67): Documentation for
+	  ppl_Polyhedron_add_constraint_and_minimize ppl_Polyhedron_and
+	  add_generator_and_minimize added.
+
+2002-10-15 Tuesday 12:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.10): Bug introduced in previous change
+	  fixed.
+
+2002-10-15 Tuesday 10:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.20), configure.ac (1.68), tests/memory1.cc (1.10):
+	  Portability improvements for memory-guarded programs.  Mac OS X
+	  is now supported.  Operating systems not providing any mechanism
+	  to limit memory usage are also supported.
+
+2002-10-15 Tuesday 09:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.252): Greatly simplified the
+	  strongly_minimize() procedure.
+
+2002-10-15 Tuesday 08:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.30): Specify -lstdc++ in
+	  splfr command invocation (this seems to help on Mac OS X).
+
+2002-10-15 Tuesday 08:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.9): Use
+	  Polyhedron::add_constraint_and_minimize().
+
+2002-10-14 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, NEWS, STANDARDS, config.guess, config.h.in,
+	  config.sub, configure.ac, ltmain.sh, ppl.spec.in,
+	  doc/Makefile.am, doc/bib2dox, doc/bib2html1.sed,
+	  doc/bib2html2.sed, doc/definitions.dox,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/fdl.dox, doc/gpl.dox, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/clpq2.pl, interfaces/Prolog/pl_check.pl,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+	  src/BoundingBox.defs.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/ConSys.cc, src/ConSys.defs.hh,
+	  src/ConSys.inlines.hh, src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Integer.defs.hh,
+	  src/Integer.inlines.hh, src/LinExpression.cc,
+	  src/LinExpression.defs.hh, src/LinExpression.inlines.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/NNC_Polyhedron.defs.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Polyhedron.cc,
+	  src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	  src/PowerSet.defs.hh, src/PowerSet.inlines.hh, src/Row.cc,
+	  src/Row.defs.hh, src/SatMatrix.cc, src/SatMatrix.defs.hh,
+	  src/SatRow.cc, src/SatRow.defs.hh, src/Status.cc,
+	  src/Status.defs.hh, src/algorithms.hh, src/conversion.cc,
+	  src/globals.hh, src/minimize.cc, src/simplify.cc,
+	  tests/Makefile.am, tests/addconstraint2.cc,
+	  tests/addconstraint3.cc, tests/addconstraints10.cc,
+	  tests/addconstraints11.cc, tests/addconstraints12.cc,
+	  tests/adddimensions11.cc, tests/addgenerator3.cc,
+	  tests/addgenerators11.cc, tests/affineimage3.cc,
+	  tests/affineimage4.cc, tests/affineimage5.cc,
+	  tests/affinepreimage5.cc, tests/affinepreimage6.cc,
+	  tests/affinepreimage7.cc, tests/ascii_dump_load1.cc,
+	  tests/ascii_dump_load2.cc, tests/ascii_dump_load3.cc,
+	  tests/bbrz02widening1.cc, tests/bbrz02widening10.cc,
+	  tests/bbrz02widening11.cc, tests/bbrz02widening12.cc,
+	  tests/bbrz02widening13.cc, tests/bbrz02widening14.cc,
+	  tests/bbrz02widening15.cc, tests/bbrz02widening16.cc,
+	  tests/bbrz02widening17.cc, tests/bbrz02widening18.cc,
+	  tests/bbrz02widening6.cc, tests/bbrz02widening7.cc,
+	  tests/bbrz02widening9.cc, tests/boundingbox2.cc,
+	  tests/concatenate5.cc, tests/contains1.cc, tests/exceptions1.cc,
+	  tests/exceptions2.cc, tests/files.cc, tests/files.hh,
+	  tests/generalizedaffineimage1.cc,
+	  tests/generalizedaffineimage10.cc,
+	  tests/generalizedaffineimage2.cc,
+	  tests/generalizedaffineimage3.cc,
+	  tests/generalizedaffineimage4.cc,
+	  tests/generalizedaffineimage5.cc,
+	  tests/generalizedaffineimage6.cc,
+	  tests/generalizedaffineimage7.cc,
+	  tests/generalizedaffineimage8.cc,
+	  tests/generalizedaffineimage9.cc, tests/h79widening5.cc,
+	  tests/hypercubes.cc, tests/intersection10.cc,
+	  tests/linearpartition1.cc, tests/linearpartition2.cc,
+	  tests/linearpartition3.cc, tests/mc91.cc, tests/memory1.cc,
+	  tests/minconstraints2.cc, tests/minconstraints3.cc,
+	  tests/mingenerators2.cc, tests/mingenerators3.cc,
+	  tests/polydifference7.cc, tests/polyhull7.cc, tests/polyhull8.cc,
+	  tests/relations10.cc, tests/relations11.cc, tests/relations12.cc,
+	  tests/relations13.cc, tests/relations14.cc, tests/relations15.cc,
+	  tests/relations16.cc, tests/stronglyminimize1.cc,
+	  tests/stronglyminimize2.cc, tests/stronglyminimize3.cc,
+	  tests/timeelapse6.cc, tests/timeelapse7.cc, tests/topclosed3.cc,
+	  tests/topclosure2.cc
+	  (alt_nnc.[1,4,2,1,3,1,3,1,1,1,1,1,1,2,1,1,1,1,1,4,4,2,2,2,3,2,2,1,2,2,2,2,2,3,3,2,3,6,5,4,5,5,4,5,5,8,5,6,6,4,2,2,2,3,3,2,2,3,3,2,3,2,3,17,6,6,4,4,2,3,2,3,1,3,2,3,1,2,3,3,2,3,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,2,2,4,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Fourth merge from main trunk.
+
+2002-10-14 Monday 17:09  Elisa Ricci
+
+	* tests/: Makefile.am (1.135), addconstraint3.cc (1.1),
+	  addgenerator3.cc (1.1): Added a test for
+	  Polyhedron::add_constraint_and_minimize(c) and a test for
+	  Polyhedron::add_generator_and_minimize(g).
+
+2002-10-14 Monday 16:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.45), interfaces/C/ppl_c.cc (1.49), interfaces/C/ppl_c.h
+	  (1.49), interfaces/Prolog/pl_check.pl (1.26),
+	  interfaces/Prolog/ppl_prolog.icc (1.68),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.24),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.28),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.52),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.5),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.10),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.46), src/Polyhedron.cc
+	  (1.251), src/Polyhedron.defs.hh (1.165): New methods bool
+	  Polyhedron::add_constraint_and_minimize(const Constraint&) and
+	  bool Polyhedron::add_generator_and_minimize(const Generator&) to
+	  add a constraint or a generator and minimizing the result at the
+	  same time.
+
+2002-10-14 Monday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.44), interfaces/C/ppl_c.cc (1.48), interfaces/C/ppl_c.h
+	  (1.48), interfaces/Prolog/Prolog_interface.dox (1.66),
+	  interfaces/Prolog/pl_check.pl (1.25),
+	  interfaces/Prolog/ppl_prolog.icc (1.67),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.23),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.27),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.51),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.4),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.9),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.45), src/Polyhedron.cc
+	  (1.250), src/Polyhedron.defs.hh (1.164): New method void
+	  Polyhedron::BBRZ02_limited_widening_assign(const Polyhedron&,
+	  ConSys&).  Both this and void
+	  Polyhedron::BBRZ02_widening_assign(const Polyhedron&) are now
+	  available through all the interfaces.
+
+2002-10-14 Monday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.67): We now require autoconf (at least) 2.54 and
+	  automake (at least) 1.7.
+
+2002-10-14 Monday 12:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.66), interfaces/Prolog/SICStus/Makefile.am
+	  (1.29): An hack that was necessary to build the SICStus Prolog
+	  interface with SICStus 3.9.0 has been removed, since it prevented
+	  us to build on Darwin.  Consequently, we now require SICStus
+	  3.9.1 or later version.
+
+2002-10-14 Monday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.65): Bump version number.
+
+2002-10-13 Sunday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.6): Update to the latest version of libtool.
+
+2002-10-13 Sunday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.8): Bug fixed in widening_assign().
+
+2002-10-13 Sunday 16:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.75): We were too eager in converting
+	  "<" and ">" to "\<" and "\>" in Doxygen comments: this should not
+	  be done within LaTeX formulas.
+
+2002-10-12 Saturday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.35): Comment fixed for Doxygen.
+
+2002-10-12 Saturday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.9): Much improved portability.
+
+2002-10-12 Saturday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.19), configure.ac (1.64): Check for declarations
+	  of RLIMIT_DATA, RLIMIT_RSS, RLIMIT_VMEM, RLIMIT_AS in
+	  <sys/resource.h>.
+
+2002-10-12 Saturday 20:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.7): Two serious bugs have been fixed.  Other
+	  improvements.
+
+2002-10-12 Saturday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.21), Determinate.inlines.hh (1.21),
+	  PowerSet.defs.hh (1.20), PowerSet.inlines.hh (1.25): New default
+	  constructor.
+
+2002-10-12 Saturday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.103), src/AskTell.defs.hh (1.9),
+	  src/C_Polyhedron.defs.hh (1.18), src/Constraint.defs.hh (1.74),
+	  src/Determinate.defs.hh (1.20), src/NNC_Polyhedron.defs.hh
+	  (1.20): Fix all but one of the problems reported by the new
+	  version of Doxygen.
+
+2002-10-12 Saturday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/fdl.dox (1.2), doc/gpl.dox (1.3),
+	  interfaces/Prolog/Prolog_interface.dox (1.65): Sectioning fixed.
+
+2002-10-12 Saturday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: bib2dox (1.2), bib2html1.sed (1.1), bib2html2.sed (1.1),
+	  bib2html2dox.sed (1.2), definitions.dox (1.102): Improvements to
+	  the machinery we use to build the bibliography section of the
+	  documentation.
+
+2002-10-11 Friday 18:41  Elisa Ricci
+
+	* tests/: Makefile.am (1.134), stronglyminimize1.cc (1.1),
+	  stronglyminimize2.cc (1.1), stronglyminimize3.cc (1.1): Added
+	  three tests for Polyhedron::strongly_minimize().
+
+2002-10-11 Friday 18:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.44): Use the new C interface
+	  provided by YAP.
+
+2002-10-11 Friday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.64): Mention other
+	  problems we had with the GNU Prolog interface.
+
+2002-10-11 Friday 12:53  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.163): Polyhedron::strongly_minimize()
+	  is now public, but the user can not see its documentation.
+
+2002-10-11 Friday 11:49  Elisa Ricci
+
+	* tests/: Makefile.am (1.133), addconstraint2.cc (1.1),
+	  concatenate5.cc (1.1), intersection10.cc (1.1),
+	  polydifference7.cc (1.1), polyhull8.cc (1.1): Added these tests
+	  to verify some methods of the class Polyhedron in the case of
+	  empty or zero dimensional polyhedron.
+
+2002-10-11 Friday 11:46  Elisa Ricci
+
+	* tests/generalizedaffineimage10.cc (1.2): Added two tests to
+	  verify Polyhedron::generalized_affine_image(lhs, r, rhs) when the
+	  set of variables of left hand side and the set of the variable of
+	  the right hand side are disjoint.
+
+2002-10-10 Thursday 17:47  Elisa Ricci
+
+	* tests/: Makefile.am (1.132), generalizedaffineimage10.cc (1.1):
+	  Added a new test for Polyhedron::generalized_affine_image(lhs, r,
+	  rhs).
+
+2002-10-10 Thursday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.249): Do not use vector<bool>.
+
+2002-10-10 Thursday 11:20  Elisa Ricci
+
+	* src/Polyhedron.cc (1.248): Some improvements to the third
+	  technique of Polyhedron::BBRZ02_widening_assign(): - the test
+	  y.relation_with(x_g) == Poly_Gen_Relation::nothing() is done
+	  after testing if x_g is a ray; - corrected the test of the
+	  elements of the vector "considered"; - now we use a const
+	  reference x_g (for x.gen_sys[i]) to find how it evolved since a
+	  ray of "y" and a copy of "x_g" to built the new ray.	Use
+	  "H79_con_sys" instead of "common_con_sys" in
+	  Polyhedron::BBRZ02_widening_assign() and in
+	  Polyhedron::H79_widening_assign().
+
+2002-10-10 Thursday 10:35  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.247), Polyhedron.defs.hh (1.162): Improved
+	  the messages of the exceptions.
+
+2002-10-09 Wednesday 20:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/addgenerators11.cc (1.2): Be quiet.
+
+2002-10-09 Wednesday 17:59  Elisa Ricci
+
+	* tests/: bbrz02widening13.cc (1.3), bbrz02widening14.cc (1.4),
+	  bbrz02widening15.cc (1.3), bbrz02widening9.cc (1.3): Added the
+	  "known_result" to verify if the resulting polyhedron is equal to
+	  the polyhedron that we want to have.
+
+2002-10-09 Wednesday 14:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.24): Problem due to bug in GNU
+	  Prolog now avoided by delaying as much as possible any reference
+	  to variables that are intended to be bound to polyhedral handles.
+
+2002-10-09 Wednesday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/algorithms.hh (1.6): poly_hull_assign_if_exact(p,q) now
+	  return true if the poly-hull is exact.
+
+2002-10-09 Wednesday 10:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.73), Polyhedron.defs.hh (1.161):
+	  Escaped a few ">" and "<" occurring inside HTML tags.
+
+2002-10-09 Wednesday 10:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.101): "<" and ">" inside HTMK tags have to
+	  be escaped by "\".
+
+2002-10-09 Wednesday 09:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.131), bbrz02widening18.cc (1.1): New test
+	  for bbrz02widening18, showing that we fall back to H79 when we
+	  may have obtained more precise results by combining H79 and the
+	  bbrz02 heuristics.
+
+2002-10-09 Wednesday 09:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.20): Use the `-d Validate' option of doxygen
+	  (and see the resulting disaster).
+
+2002-10-08 Tuesday 12:29  Elisa Ricci
+
+	* src/Polyhedron.cc (1.246), tests/Makefile.am (1.130),
+	  tests/bbrz02widening16.cc (1.1), tests/bbrz02widening17.cc (1.1):
+	  Improved the third technique: the rays that we want to add are
+	  modified so that they satisfy the constraints of
+	  "common_con_sys".  Added to test to verify these changes.
+
+2002-10-08 Tuesday 09:24  Elisa Ricci
+
+	* src/Polyhedron.cc (1.245): Modified
+	  Polyhedron::is_BBRZ02_stabilizing(): if the number of points (or
+	  closure points) of `y' is smaller than the number of points of
+	  `x', the chain is not stabilizing.
+
+2002-10-07 Monday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.129), ascii_dump_load1.cc (1.4),
+	  ascii_dump_load2.cc (1.4), ascii_dump_load3.cc (1.4): Write files
+	  in the current directory.  Make sure the current directory is
+	  also properly cleaned afterwards.
+
+2002-10-07 Monday 17:16  Elisa Ricci
+
+	* src/Polyhedron.cc (1.244): Made a little improvement to the third
+	  technique of Polyhedron::BBRZ02_widening_assign(): we built a
+	  temporary system of generators and then we use
+	  Polyhedron::add_generators_and_minimize() to add this system to
+	  the polyhedron `x'.
+
+2002-10-07 Monday 16:07  Elisa Ricci
+
+	* src/Polyhedron.cc (1.243): Corrected an error in the second
+	  technique of Polyhedron::BBRZ02_widening_assign(): we add the
+	  system of generators `valid_rays' if the new ray has all
+	  homogeneous coefficients equal to zero or if adding only a ray
+	  there is not stabilization.
+
+2002-10-07 Monday 14:38  Elisa Ricci
+
+	* src/Polyhedron.cc (1.242): Modified the second technique of
+	  Polyhedron::BBRZ02_widening_assign() so that before we add only
+	  the averaged ray and if the result is not stabilizing we add all
+	  the rays of `valid_rays'.
+
+2002-10-07 Monday 12:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.241): In is_BBRZ02_stabilizing(), corrected
+	  a bug in the test on stabilization based on number of rays.
+
+2002-10-07 Monday 11:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.24), ppl_prolog.icc (1.66),
+	  Ciao/ppl_ciao.pl (1.22), GNU/ppl_gprolog.pl (1.18),
+	  SICStus/ppl_sicstus_sd.cc (1.26), SWI/ppl_swiprolog.cc (1.50),
+	  XSB/ppl_xsb.H (1.3), XSB/ppl_xsb.cc (1.8), YAP/ppl_yap.cc (1.43):
+	  Added ppl_Polyhedron_is_disjoint_from_Polyhedron/2 to Prolog
+	  interface.  Tests for this added to pl_check.pl
+
+2002-10-07 Monday 11:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.240): Modified method
+	  Polyhedron::is_BBRZ02_stabilizing(x, y) so that:  - we check for
+	  a decreasing number of rays lying inside the faces	of an
+	  orthant.   - we check whether x and y do happens to be the same
+	  polyhedron.  Modified method
+	  Polyhedron::BBRZ02_widening_assign(y) to apply, as a last resort,
+	  the widening H79.
+
+2002-10-07 Monday 11:19  Elisa Ricci
+
+	* tests/: ascii_dump_load3.cc (1.3), bbrz02widening1.cc (1.3),
+	  bbrz02widening12.cc (1.2), exceptions1.cc (1.21), exceptions2.cc
+	  (1.18): Modified these tests so that there is only a
+	  `set_handlers()' for each test.
+
+2002-10-07 Monday 10:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.160): In the Doxygen documentation of
+	  affine (pre)-image operators, fixed a couple of mismatches in the
+	  naming of parameters.
+
+2002-10-07 Monday 07:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh (1.20): PH&
+	  Determinate<PH>::polyhedron() fixed: it was not calling mutate().
+
+2002-10-06 Sunday 22:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.5): Added a tentative, inefficient
+	  implementation for template <typename PH> bool
+	  poly_hull_assign_if_exact(PH& p, const PH& q): if the poly-hull
+	  of `p' and `q' is exact, assigns it to `p' and returns `true'; it
+	  returns false otherwise.
+
+	  Added a tentative implementation for template <typename PH> void
+	  complete_reduction(PowerSet<Determinate<PH> >& p): it collapses
+	  all the elements of `p' that can be poly-hulled without loss of
+	  precision.
+
+	  Added tentative implementations of template <typename PH> void
+	  H79_widening_assign(PowerSet<Determinate<PH> >& r, const
+	  PowerSet<Determinate<PH> >& q) and template <typename PH> void
+	  BBRZ02_widening_assign(PowerSet<Determinate<PH> >& r, const
+	  PowerSet<Determinate<PH> >& q): they are meant to generalize the
+	  widenings on polyhedra to sets of polyhedra.
+
+2002-10-06 Sunday 22:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.19), Determinate.inlines.hh (1.19):
+	  Added PH& polyhedron().
+
+2002-10-06 Sunday 22:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: linearpartition1.cc (1.3), linearpartition2.cc (1.3),
+	  linearpartition3.cc (1.3): Reduce the scope of declarations.
+
+2002-10-06 Sunday 20:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: linearpartition2.cc (1.2), linearpartition3.cc (1.2):
+	  Made quiet.
+
+2002-10-06 Sunday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.128), linearpartition2.cc (1.1),
+	  linearpartition3.cc (1.1): Test linear_partition() with two
+	  disjoint polyhedra and with two telescopic polyhedra.
+
+2002-10-06 Sunday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.4): Relax the limitations of
+	  linear_partition().
+
+2002-10-06 Sunday 18:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.239): Many (small) improvements in the
+	  implementation of the 2nd technique of BBRZ02_widening_assign().
+
+2002-10-06 Sunday 10:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.100): Bibliography added (perhaps not at
+	  the right place).
+
+2002-10-06 Sunday 10:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: bib2dox (1.1), bib2html2dox.sed (1.1): A tool to convert a
+	  BibTeX file into something suitable for inclusion into the
+	  Doxygen documentation.
+
+2002-10-06 Sunday 09:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.3): Comment slightly improved.
+
+2002-10-06 Sunday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.23),
+	  devref-print.doxyconf-latex.in (1.23), devref.doxyconf-html.in
+	  (1.24): Include `algorithms.hh' in the sources used to create the
+	  developer's reference manual.
+
+2002-10-06 Sunday 09:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.99): Use the condition
+	  `Include_Implementation_Details' instead of
+	  `Implementation_Info'.
+
+2002-10-06 Sunday 09:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.8): A few minor improvements.
+
+2002-10-05 Saturday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.2): Include implementation details for
+	  linear_partition().
+
+2002-10-05 Saturday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/linearpartition1.cc (1.2): Be quiet.
+
+2002-10-05 Saturday 22:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bbrz02widening13.cc (1.2), bbrz02widening14.cc (1.3):
+	  Made silent.
+
+2002-10-05 Saturday 22:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.238), Polyhedron.defs.hh (1.159): Added
+	  new private method void Polyhedron::select_H79_constraints(const
+	  Polyhedron& y,					ConSys&
+	  cs_selection) const; that selects the common constraints of *this
+	  and y (into cs_selection) according to H79.  Used the method both
+	  in H79_widening and in BBRZ02_widening.  Modified the second
+	  technique of BBRZ02 to have more chances that it will produce a
+	  stabilizing sequence of polyhedra.  Added a few outputs for the
+	  debugging of BBRZ02_widening.
+
+2002-10-05 Saturday 20:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.52), src/algorithms.hh (1.1),
+	  tests/Makefile.am (1.127), tests/linearpartition1.cc (1.1): New
+	  function template <typename PH> std::pair<PH,
+	  PowerSet<Determinate<NNC_Polyhedron> > > linear_partition(const
+	  PH& p, const PH& q) computing a partition of `q' with respect to
+	  `p'.
+
+2002-10-05 Saturday 20:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.18), Determinate.inlines.hh (1.18):
+	  Added const PH& polyhedron() const.
+
+2002-10-05 Saturday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.47), ppl_c.h (1.47): The function int
+	  ppl_Polyhedron_is_disjoint_from_Polyhedron() makes the
+	  disjointness test for polyhedra available to the C interface.
+
+2002-10-05 Saturday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.43), src/Polyhedron.cc (1.237), src/Polyhedron.defs.hh
+	  (1.158): New function bool are_disjoint(const Polyhedron&, const
+	  Polyhedron&) returning true if and only if the two polyhedra are
+	  disjoint.
+
+2002-10-05 Saturday 18:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.157): All the relational operators on
+	  polyhedra are now commented the same way.
+
+2002-10-05 Saturday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.19), PowerSet.inlines.hh (1.24): The
+	  default constructor now builds an empty (bottom) PowerSet.
+
+2002-10-05 Saturday 16:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BoundingBox.defs.hh (1.7), ConSys.cc (1.52), ConSys.defs.hh
+	  (1.70), Constraint.cc (1.33), Constraint.defs.hh (1.72),
+	  Determinate.defs.hh (1.17), GenSys.cc (1.69), GenSys.defs.hh
+	  (1.82), Generator.cc (1.40), Generator.defs.hh (1.78),
+	  Matrix.defs.hh (1.37), Poly_Con_Relation.defs.hh (1.16),
+	  Poly_Gen_Relation.defs.hh (1.15), Polyhedron.cc (1.236),
+	  Polyhedron.defs.hh (1.156), PowerSet.defs.hh (1.18), Row.cc
+	  (1.44), Row.defs.hh (1.56), SatMatrix.cc (1.22),
+	  SatMatrix.defs.hh (1.26), SatRow.cc (1.12), SatRow.defs.hh
+	  (1.21), Status.cc (1.16), Status.defs.hh (1.23), conversion.cc
+	  (1.34), minimize.cc (1.25), simplify.cc (1.19): Started enforcing
+	  STANDARDS rules as far as the doxygen documentation is concerned:
+	  - added a \brief declaration where needed;  - cut detailed
+	  doxygen comments from *.cc files and pasted in *.defs.hh    files
+	  (with the exceptions of conversion, minimize and simplify);  -
+	  started using the conditional section
+	  Include_Implementation_Details;  - avoided using \fn declaration
+	  where it is not needed (it was also	 causing problems since it
+	  does not support line breaks);  - fixed some problems with the
+	  naming of doxygen documentation groups.
+
+2002-10-05 Saturday 12:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/mc91.cc (1.7): Fixed and made quiet.
+
+2002-10-05 Saturday 12:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.23): Fixed a couple of bugs concerning
+	  space dimensions.
+
+2002-10-05 Saturday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.17), PowerSet.inlines.hh (1.22): The
+	  default constructor for PowerSet now takes the dimension of the
+	  enclosing space as an optional parameter, defaulting to zero.
+
+2002-10-05 Saturday 10:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.68), Polyhedron.cc (1.235): Added missing
+	  \relates doxygen declarations.
+
+2002-10-05 Saturday 10:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.33): Added a missing namespace qualification
+	  in the doxygen comment.
+
+2002-10-05 Saturday 10:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.51), ConSys.defs.hh (1.69): According to
+	  STANDARDS, moved doxygen documentation in the header file.  Added
+	  a missing \relates declaration to avoid a doxygen warning.
+
+2002-10-05 Saturday 10:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.22),
+	  devref-print.doxyconf-latex.in (1.22), devref.doxyconf-html.in
+	  (1.23): Added Include_Implementation_Details in the
+	  ENABLED_SECTIONS of the developer reference.
+
+2002-10-05 Saturday 10:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.7): Added specification on how to integrate an
+	  end-user comment block with further comments for the developer
+	  only.
+
+2002-10-04 Friday 23:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.42): Notified new function for manipulation
+	  LinExpression's.
+
+2002-10-04 Friday 23:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bbrz02widening14.cc (1.2), bbrz02widening15.cc (1.2):
+	  Tests made silent.
+
+2002-10-04 Friday 22:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.98): Cut away previous spurious commit on
+	  the specification of generalized affine image. Added a missing
+	  transposition sign.
+
+2002-10-04 Friday 22:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.63): Typo corrected:
+	  closure-point ==> closure_point.
+
+2002-10-04 Friday 19:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.10): Updated.
+
+2002-10-04 Friday 19:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.41): Report the news for PPL 0.4.2.
+
+2002-10-04 Friday 18:53  Elisa Ricci
+
+	* src/Polyhedron.cc (1.234): Modified the second technique of
+	  Polyhedron::BBRZ02_widening_assign(): we add all the chosen rays
+	  that satisfy the system of constraints `common_con_sys' to the
+	  system of generators of `x'.
+
+2002-10-04 Friday 18:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.126), bbrz02widening14.cc (1.1),
+	  bbrz02widening15.cc (1.1): Added two new tests. The first one is
+	  similar to bbrz02widening13, but this time the limit of the chain
+	  of polyhedra is a bounded polyhedron.  The second one is similar
+	  to the first one, but it is based on a chain of polyhedral cones.
+
+2002-10-04 Friday 18:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.cc (1.14), LinExpression.defs.hh (1.55):
+	  Added new function   LinExpression& operator*=(LinExpression& e,
+	  const Integer& n); to multiply (in place) a given expression by
+	  an Integer constant.
+
+2002-10-04 Friday 15:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.97), tests/Makefile.am (1.125),
+	  tests/bbrz02widening13.cc (1.1): Added a new test for the bbrz02
+	  widening.
+
+2002-10-04 Friday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_4-branch.[3,7]): Mark
+	  ChangeLog.
+
+2002-10-04 Friday 11:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_4-branch.6): Updated.
+
+2002-10-04 Friday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.16): Require GCC 3.2 or later, require GMP 4.1 or
+	  later version.
+
+2002-10-04 Friday 10:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_4-branch.1): Require GCC 3.2 or later version.
+
+2002-10-04 Friday 09:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_4-branch.5): Updated.
+
+2002-10-04 Friday 09:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_4-branch.4): Version number bumped.
+
+2002-10-04 Friday 09:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_4-branch.7): Try to release today.
+
+2002-10-03 Thursday 17:58  Elisa Ricci
+
+	* tests/: Makefile.am (1.124), exceptions1.cc (1.20),
+	  exceptions2.cc (1.17), generalizedaffineimage9.cc (1.1): Added
+	  some new tests for Polyhedron::generalized_affine_image(lhs, r,
+	  rhs).
+
+2002-10-03 Thursday 15:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.123), ascii_dump_load1.cc (1.3),
+	  ascii_dump_load2.cc (1.3), files.cc (1.2), files.hh (1.2):
+	  Several improvements.
+
+2002-10-03 Thursday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.122), ascii_dump_load3.cc (1.2), files.cc
+	  (1.1), files.hh (1.1): Avoid spaghetti-coding.
+
+2002-10-03 Thursday 15:01  Elisa Ricci
+
+	* tests/generalizedaffineimage7.cc (1.3): Corrected the test: we
+	  want "return 1" if there is at least a test that exits with
+	  "return 1".
+
+2002-10-03 Thursday 12:23  Elisa Ricci
+
+	* tests/: Makefile.am (1.121), ascii_dump_load2.cc (1.2),
+	  ascii_dump_load3.cc (1.1): Added a new test for
+	  Polyhedron::ascii_dump() and Polyhedron::ascii_load().  Corrected
+	  an error in the comment of ascii_dump_load2.cc.
+
+2002-10-03 Thursday 12:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.233), src/Polyhedron.defs.hh (1.155),
+	  tests/generalizedaffineimage1.cc (1.4),
+	  tests/generalizedaffineimage7.cc (1.2): When the lhs of the
+	  generalized affine image is an arbitrary LinExpression, there is
+	  no need of having a denominator for the rhs.
+
+2002-10-03 Thursday 12:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.96): Added missing transposition signs in
+	  documentation of affine images.  Improved comment of generalized
+	  affine images.
+
+2002-10-03 Thursday 11:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.40): Reported the bug on minimization of
+	  zero-dim-universe NNC polyhedra.
+
+2002-10-03 Thursday 11:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (1.50): Fixed a couple of comments.
+
+2002-10-03 Thursday 10:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS, doc/definitions.dox, src/ConSys.cc, src/Polyhedron.cc,
+	  tests/Makefile.am, tests/minconstraints1.cc,
+	  tests/minconstraints2.cc, tests/minconstraints3.cc,
+	  tests/mingenerators1.cc, tests/mingenerators2.cc,
+	  tests/mingenerators3.cc (ppl-0_4-branch.[6,1,4,7,4,1,1,1,1,1,1]):
+	  Reported on the branch a couple of bugfixes and corresponding
+	  tests.
+
+2002-10-03 Thursday 09:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.95): Corrected the definition of affine
+	  preimage.
+
+2002-10-03 Thursday 04:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.13), config.sub (1.12): Updated.
+
+2002-10-02 Wednesday 17:32  Elisa Ricci
+
+	* tests/: Makefile.am (1.120), ascii_dump_load2.cc (1.1): Added a
+	  new test to verify Polyhedron::ascii_load() and
+	  Polyhedron::ascii_dump().
+
+2002-10-02 Wednesday 16:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.232): Fixed a typo in a comment.
+
+2002-10-02 Wednesday 16:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.231): The implementation of
+	  generalized_affine_image(lhs, rel, rhs, denom) now handles some
+	  special cases in a more efficient way.
+
+2002-10-02 Wednesday 16:14  Elisa Ricci
+
+	* src/Polyhedron.cc (1.230): In
+	  Polyhedron::strongly_minimize_constraints() and
+	  Polyhedron::strongly_minimize_generators() corrected the bug
+	  shown by minconstraints3.cc and mingenerators3.cc: now we verify
+	  if the polyhedron is not empty and zero-dimensional.
+
+2002-10-02 Wednesday 16:10  Elisa Ricci
+
+	* tests/: Makefile.am (1.119), minconstraints3.cc (1.1),
+	  mingenerators3.cc (1.1): The test minconstraints3.cc shows a bug
+	  in Polyhedron::strongly_minimize_constraints().  The test
+	  mingenerators3.cc shows a bug in
+	  Polyhedron::strongly_minimize_generators().
+
+2002-10-02 Wednesday 15:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.118): Expect addgenerators11 to fail.
+
+2002-10-02 Wednesday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/exceptions1.cc (1.19): Fixed a few comments on tests about
+	  generalized_affine_image.
+
+2002-10-02 Wednesday 14:40  Elisa Ricci
+
+	* tests/generalizedaffineimage8.cc (1.2): Corrected an error in the
+	  comment of the test: the relation is `>' and not `<'.
+
+2002-10-02 Wednesday 14:39  Elisa Ricci
+
+	* tests/: Makefile.am (1.117), generalizedaffineimage8.cc (1.1):
+	  Added a new test for Polyhedron::generalized_affine_image(v, r,
+	  e, d) in the case of non necessarily closed polyhedron and the
+	  relation `>'.
+
+2002-10-02 Wednesday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.18), exceptions2.cc (1.16): Adapted to
+	  the new interface of Polyhedron::generalized_affine_image().
+
+2002-10-02 Wednesday 14:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.116), generalizedaffineimage3.cc (1.4),
+	  generalizedaffineimage7.cc (1.1): Added a new test for method
+	  Polyhedron::generalized_affine_image(lhs, relop, rhs, denum)
+	  checking that, when lhs has a single variable, the current
+	  implementation does have the same behavior of
+	  Polyhedron::generalized_affine_image(var, relop, rhs, denum).
+
+2002-10-02 Wednesday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.115): Specify the source for
+	  addgenerators11.
+
+2002-10-02 Wednesday 14:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.114), addgenerators11.cc (1.1): New test
+	  for Polyhedron::add_generators_and_minimize().
+
+2002-10-02 Wednesday 12:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.229), src/Polyhedron.defs.hh (1.154),
+	  src/globals.hh (1.23), tests/generalizedaffineimage1.cc (1.3),
+	  tests/generalizedaffineimage2.cc (1.3),
+	  tests/generalizedaffineimage3.cc (1.3),
+	  tests/generalizedaffineimage4.cc (1.2),
+	  tests/generalizedaffineimage5.cc (1.2),
+	  tests/generalizedaffineimage6.cc (1.2): Added enumeration
+	  Relation_Operator to encode the operator <, <=, ==, >=, >.  Used
+	  the enumeration to specify the relation operator of methods
+	  Polyhedron::generalized_affine_image().  Patched the tests to use
+	  the enumeration instead of string encodings.
+
+2002-10-02 Wednesday 12:05  Elisa Ricci
+
+	* src/ConSys.cc (1.49): Modified
+	  ConSys::adjust_topology_and_dimension() so that if the system of
+	  constraints was sorted, does not contains strict inequalities and
+	  is not necessarily closed and if the new topology is
+	  NECESSARILY_CLOSED, we sort the system again.
+
+2002-10-02 Wednesday 11:20  Elisa Ricci
+
+	* src/ConSys.cc (1.48), tests/Makefile.am (1.113),
+	  tests/addconstraints12.cc (1.1): Corrected an error in
+	  ConSys::adjust_topology_and_dimension: now we erase the
+	  constraints 0 <= \epsilon <= 1 if the system of constraints does
+	  not contains strict inequalities and is not necessarily closed
+	  and the new topology is NECESSARILY_CLOSED.  Added a test to
+	  verify this function.
+
+2002-10-02 Wednesday 10:19  Elisa Ricci
+
+	* tests/topclosed3.cc (1.3): Added the comment to explain what this
+	  test does.
+
+2002-10-02 Wednesday 09:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/topclosed3.cc (1.2): New test made silent.
+
+2002-10-02 Wednesday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.112), topclosed3.cc (1.1): Added a new
+	  test on the topological closure check.  It shows that an
+	  unmatched closure point lying on the same line of a point, after
+	  performing minimization, is converted by back_substitute() into
+	  the corresponding matched closure point: this property is needed
+	  to ensure the correctness of the current implementation.
+
+2002-10-01 Tuesday 21:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.228), tests/Makefile.am (1.111),
+	  tests/generalizedaffineimage6.cc (1.1): Added a first draft
+	  implementation for method
+	  Polyhedron::generalized_affine_image(const LinExpression& lhs,
+					       const char* relation,
+					     const LinExpression& rhs,
+					   const Integer& denominator);
+	  Added a first test to check if it works.
+
+2002-10-01 Tuesday 14:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.94), src/Polyhedron.cc (1.227),
+	  src/Polyhedron.defs.hh (1.153): The specification of the
+	  generalized affine image operator further generalized to allow
+	  for an arbitrary affine expression in the lhs.  Added the
+	  declaration of this generalization (with a void implementation).
+
+2002-10-01 Tuesday 11:56  Elisa Ricci
+
+	* tests/: bbrz02widening6.cc (1.3), bbrz02widening7.cc (1.3):
+	  Modified the polyhedron `known_result' according to the changes
+	  of Polyhedron::BBRZ02_widening_assign().
+
+2002-10-01 Tuesday 11:22  Elisa Ricci
+
+	* src/Polyhedron.cc (1.226), tests/Makefile.am (1.110),
+	  tests/generalizedaffineimage5.cc (1.1): Corrected an error in
+	  Polyhedron::generalized_affine_image().  Added a test to verify
+	  this function.
+
+2002-09-30 Monday 11:32  Elisa Ricci
+
+	* tests/: Makefile.am (1.109), affinepreimage6.cc (1.2),
+	  affinepreimage7.cc (1.1), exceptions1.cc (1.17), exceptions2.cc
+	  (1.15), polyhull7.cc (1.1): Added new tests for some methods of
+	  the class Polyhedron.  Corrected a comment in the test
+	  affinepreimage6.cc.
+
+2002-09-29 Sunday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ConSys.cc (1.47), src/ConSys.defs.hh (1.68), src/GenSys.cc
+	  (1.67), src/GenSys.defs.hh (1.81), src/Matrix.cc (1.44),
+	  src/Matrix.defs.hh (1.36), src/Poly_Con_Relation.cc (1.4),
+	  src/Poly_Con_Relation.defs.hh (1.15), src/Poly_Gen_Relation.cc
+	  (1.4), src/Poly_Gen_Relation.defs.hh (1.14), src/Polyhedron.cc
+	  (1.225), src/Polyhedron.defs.hh (1.152), src/SatMatrix.cc (1.21),
+	  src/SatMatrix.defs.hh (1.25), src/Status.cc (1.15),
+	  src/Status.defs.hh (1.22), tests/ascii_dump_load1.cc (1.2): The
+	  ASCII_dump() and ASCII_load() methods have been renamed
+	  ascii_dump() and ascii_load().
+
+2002-09-29 Sunday 11:16  Elisa Ricci
+
+	* src/Status.cc (1.14), tests/Makefile.am (1.108),
+	  tests/ascii_dump_load1.cc (1.1): Corrected an error in
+	  Status::ASCII_load(std::istream& s).	Added a test to verify
+	  Polyhedron::ASCII_dump(std::ostream& s) and
+	  Polyhedron::ASCII_load(std::istream& s).
+
+2002-09-27 Friday 20:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.39), tests/affineimage5.cc (1.2): Test affineimage5 made
+	  silent.  The bug affecting affine_image() could have produced
+	  wrong results (not just violate a library invariant).
+
+2002-09-27 Friday 20:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS, src/ConSys.cc, src/GenSys.cc, src/Polyhedron.cc,
+	  tests/Makefile.am, tests/affineimage4.cc, tests/affineimage5.cc
+	  (ppl-0_4-branch.[5,3,3,6,3,1,1]): The correction of the bug
+	  affecting Polyhedron::affine_image() and
+	  Polyhedron::affine_preimage() reported on ppl-0_4-branch.
+
+2002-09-27 Friday 15:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.93), src/Polyhedron.defs.hh (1.151): Fixed
+	  documentation reference for the generalized_affine_image
+	  operator.
+
+2002-09-27 Friday 15:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.224): Methods Polyhedron::affine_image() and
+	  Polyhedron::affine_preimage() now only call
+	  ConSys::affine_preimage() and GenSys::affine_image() with a
+	  strictly positive denominator.  Added draft implementation of
+	  generalized_affine_image() for the case of a strict relation
+	  operator (only for NNC polyhedra).
+
+2002-09-27 Friday 15:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.46), GenSys.cc (1.66): Private methods
+	  ConSys::affine_preimage() and GenSys::affine_image() now assume
+	  that the third argument is a _positive_ Integer.
+
+2002-09-27 Friday 15:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.107), affineimage5.cc (1.1),
+	  generalizedaffineimage1.cc (1.2), generalizedaffineimage2.cc
+	  (1.2), generalizedaffineimage3.cc (1.2),
+	  generalizedaffineimage4.cc (1.1): Added new tests and adjusted
+	  the known_results of generalizedaffineimage* to match the
+	  specification.
+
+2002-09-27 Friday 09:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.92), src/Polyhedron.cc (1.223),
+	  src/Polyhedron.defs.hh (1.150): Method generalized_affine_image()
+	  reimplemented to match its specification.  The doxygen
+	  specification improved.
+
+2002-09-27 Friday 09:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.38): Reported the bugfix for Polyhedron::affine_image().
+
+2002-09-27 Friday 09:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.65): Corrected a bug in GenSys::affine_image()
+	  whereby we were creating points having a negative divisor when
+	  the denominator of the affine transformation was negative.
+
+2002-09-27 Friday 09:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.106), affineimage4.cc (1.1): New test
+	  showing a bug in Polyhedron::affine_image() when the divisor is
+	  negative.
+
+2002-09-26 Thursday 15:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.222): The draft implementation of
+	  Polyhedron::generalized_affine_image() extended to work with NNC
+	  polyhedra.
+
+2002-09-26 Thursday 13:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.105), generalizedaffineimage3.cc (1.1):
+	  Added a test for generalized_affine_image where the points of the
+	  polyhedron have non-integral coordinates.
+
+2002-09-26 Thursday 12:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.104), generalizedaffineimage1.cc (1.1),
+	  generalizedaffineimage2.cc (1.1): Added a couple of tests for the
+	  new generalized_affine_image operator.
+
+2002-09-26 Thursday 12:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.91): Added draft specification of the
+	  generalized affine image operator.
+
+2002-09-26 Thursday 12:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.221), Polyhedron.defs.hh (1.149): Added a
+	  first draft implementation of the generalized_affine_image
+	  operator.  Current implementation should work correctly for
+	  C_Polyhedron.
+
+2002-09-26 Thursday 12:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.54), LinExpression.inlines.hh
+	  (1.24): Added methods to provide read-only access to the
+	  coefficients and the inhomogeneous term of a LinExpression.
+
+2002-09-25 Wednesday 18:25  Elisa Ricci
+
+	* src/Polyhedron.cc (1.220), tests/Makefile.am (1.103),
+	  tests/bbrz02widening12.cc (1.1): Corrected an improved the third
+	  technique of Polyhedron::BBRZ02_widening_assign().  Added a test
+	  to verify this technique.
+
+2002-09-25 Wednesday 16:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.90): Greatly improved the matrix in the
+	  explanation of affine images and preimages.
+
+2002-09-25 Wednesday 14:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.37): Removed a few repetitions in the list of bugfixes.
+
+2002-09-25 Wednesday 10:12  Elisa Ricci
+
+	* src/: Integer.defs.hh (1.9), Integer.inlines.hh (1.8),
+	  Polyhedron.cc (1.219): Added the functions void
+	  sqrt_assign(Integer& x) and void sqrt_assign(Integer& x, const
+	  Integer& y) in Integer to compute he truncated integer part of
+	  the root of an Integer.  Used the function sqrt_assign(Integer&)
+	  in the first technique of BBRZ02_widening_assign().
+
+2002-09-24 Tuesday 19:05  Elisa Ricci
+
+	* src/: Integer.defs.hh (1.8), Integer.inlines.hh (1.7),
+	  Polyhedron.cc (1.218): Added the functions lcm_assign(Integer& x,
+	  const Integer& y) and lcm_assign(Integer& x, const Integer& y,
+	  const Integer& z) in Integer.  Modified the function
+	  Polyhedron::BBRZ02_widening_assing() so that in the first
+	  technique we choose the constraints to add in the right system
+	  and we normalize the vectors using a bad approximation of the
+	  norm; corrected also an error in the third technique in the case
+	  of rays with negative coefficients.
+
+2002-09-24 Tuesday 15:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS, src/GenSys.cc, src/Polyhedron.cc (ppl-0_4-branch.[4,2,5]):
+	  Reported to the ppl-0_4-branch the corrections to a couple of
+	  bugs affecting methods GenSys::insert(const Generator& ) and
+	  Polyhedron::add_generator(const Generator& ).
+
+2002-09-24 Tuesday 10:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc, tests/Makefile.am, tests/relations14.cc
+	  (ppl-0_4-branch.[2,2,1]): Added the test showing a bug when
+	  invoking method   Polyhedron::relation_with(const Generator& ).
+	  Implemented the correction in method
+	  ConSys::satisfies_all_constraints(const Generator& ).
+
+2002-09-23 Monday 17:15  Elisa Ricci
+
+	* tests/: Makefile.am (1.102), relations11.cc (1.2), relations15.cc
+	  (1.1), relations16.cc (1.1): Added two tests for the methods of
+	  the class GenSys and corrected an error in the comment of the
+	  test relations11.cc.
+
+2002-09-23 Monday 12:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.36), src/ConSys.cc (1.45): Corrected a bug in
+	  ConSys::satisfies_all_constraints(const Generator& ) which was
+	  affecting the public method	Polyhedron::relation_with(const
+	  Generator& ).  The bug reported on the NEWS file.
+
+2002-09-23 Monday 11:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.101), relations13.cc (1.1), relations14.cc
+	  (1.1): A couple of new tests. relations14 shows a bug in the
+	  implementation of ConSys::satisfies_all_constraints(const
+	  Generator& g) const.
+
+2002-09-20 Friday 11:54  Elisa Ricci
+
+	* tests/: Makefile.am (1.100), addconstraints11.cc (1.8),
+	  affinepreimage6.cc (1.1), relations10.cc (1.2), relations12.cc
+	  (1.1): Added other tests for some methods of the classes ConSys
+	  and GenSys.  Corrected the comment of the test in relations10.cc.
+
+2002-09-19 Thursday 17:16  Elisa Ricci
+
+	* tests/: Makefile.am (1.99), affineimage3.cc (1.1),
+	  affinepreimage5.cc (1.1), relations10.cc (1.1), relations11.cc
+	  (1.1): Added some tests for the methods of the classes
+	  Polyhedron, ConSys and GenSys.
+
+2002-09-18 Wednesday 11:54  Elisa Ricci
+
+	* tests/: Makefile.am (1.98), adddimensions11.cc (1.1),
+	  exceptions2.cc (1.14): Added two other tests to verify the
+	  methods of the class Polyhedron.
+
+2002-09-18 Wednesday 10:27  Elisa Ricci
+
+	* src/Polyhedron.cc (1.217): Made some little improvements to the
+	  function Polyhedron::BBRZ02_widenin_assign().  Improved also some
+	  comments of this function.
+
+2002-09-17 Tuesday 18:44  Elisa Ricci
+
+	* tests/: Makefile.am (1.97), contains1.cc (1.1), exceptions2.cc
+	  (1.13), h79widening5.cc (1.2), minconstraints2.cc (1.2): Improved
+	  some tests and added other tests to verify some methods of
+	  Polyhedron.cc and C_Polyhedron.cc.
+
+2002-09-17 Tuesday 11:29  Elisa Ricci
+
+	* tests/: Makefile.am (1.96), addconstraints10.cc (1.7),
+	  bbrz02widening10.cc (1.1), bbrz02widening11.cc (1.1),
+	  h79widening5.cc (1.1), minconstraints2.cc (1.1),
+	  mingenerators2.cc (1.1), timeelapse7.cc (1.1), topclosure2.cc
+	  (1.1): Added other tests to verify some methods of Polyhedron.cc.
+
+2002-09-12 Thursday 18:17  Elisa Ricci
+
+	* tests/: Makefile.am (1.95), timeelapse6.cc (1.1): Added a new
+	  test for the function Polyhedron::time_elapse_assign().
+
+2002-09-12 Thursday 16:30  Elisa Ricci
+
+	* src/Polyhedron.cc (1.216): Corrected an error in
+	  Polyhedron::BBRZ02_widening_assign(): the new generator was added
+	  to the polyhedron x instead of the polyhedron x2.
+
+2002-09-12 Thursday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.51): Try to fix a long-standing problem in the
+	  generation of ppl_install.hh.
+
+2002-09-11 Wednesday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, STANDARDS, acinclude.m4, config.h.in, configure.ac,
+	  doc/definitions.dox, interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h,
+	  interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/clpq.pl, interfaces/Prolog/clpq2.pl,
+	  interfaces/Prolog/pl_check.pl, interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc, m4/Makefile.am,
+	  m4/ac_cxx_flexible_arrays.m4, src/AskTell.defs.hh,
+	  src/AskTell.inlines.hh, src/BoundingBox.cc,
+	  src/BoundingBox.defs.hh, src/BoundingBox.inlines.hh,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/ConSys.cc, src/ConSys.defs.hh, src/ConSys.inlines.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+	  src/GenSys.inlines.hh, src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Init.cc, src/Init.defs.hh,
+	  src/Init.inlines.hh, src/Interval.defs.hh, src/LCompare.defs.hh,
+	  src/LinExpression.cc, src/LinExpression.defs.hh,
+	  src/LinExpression.inlines.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/Poly_Con_Relation.cc, src/Poly_Con_Relation.defs.hh,
+	  src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation.defs.hh,
+	  src/Polyhedron.cc, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/PowerSet.defs.hh,
+	  src/PowerSet.inlines.hh, src/Row.cc, src/Row.defs.hh,
+	  src/Row.inlines.hh, src/SatMatrix.cc, src/SatMatrix.defs.hh,
+	  src/SatMatrix.inlines.hh, src/SatRow.defs.hh,
+	  src/SatRow.inlines.hh, src/Status.cc, src/Status.defs.hh,
+	  src/Variable.cc, src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/conversion.cc, src/globals.cc, src/globals.hh,
+	  src/initializer.hh, src/minimize.cc, src/ppl_header.middle,
+	  src/simplify.cc, tests/CbecomesNNC1.cc, tests/Makefile.am,
+	  tests/addconstraint1.cc, tests/addconstraints2.cc,
+	  tests/addconstraints4.cc, tests/addconstraints5.cc,
+	  tests/addconstraints6.cc, tests/addconstraints7.cc,
+	  tests/addconstraints8.cc, tests/addconstraints9.cc,
+	  tests/adddimensions1.cc, tests/adddimensions10.cc,
+	  tests/adddimensions2.cc, tests/adddimensions3.cc,
+	  tests/adddimensions4.cc, tests/adddimensions5.cc,
+	  tests/adddimensions6.cc, tests/adddimensions7.cc,
+	  tests/adddimensions8.cc, tests/adddimensions9.cc,
+	  tests/addgenerator1.cc, tests/addgenerator2.cc,
+	  tests/addgenerators10.cc, tests/addgenerators3.cc,
+	  tests/addgenerators4.cc, tests/addgenerators5.cc,
+	  tests/addgenerators6.cc, tests/addgenerators7.cc,
+	  tests/addgenerators9.cc, tests/affineimage1.cc,
+	  tests/affineimage2.cc, tests/affinepreimage1.cc,
+	  tests/affinepreimage2.cc, tests/affinepreimage3.cc,
+	  tests/affinepreimage4.cc, tests/append1.cc, tests/append2.cc,
+	  tests/bbrz02widening1.cc, tests/bbrz02widening2.cc,
+	  tests/bbrz02widening3.cc, tests/bbrz02widening4.cc,
+	  tests/bbrz02widening5.cc, tests/bbrz02widening6.cc,
+	  tests/bbrz02widening7.cc, tests/bbrz02widening8.cc,
+	  tests/bbrz02widening9.cc, tests/bounded1.cc,
+	  tests/boundingbox1.cc, tests/boundingbox2.cc, tests/bounds1.cc,
+	  tests/bounds2.cc, tests/concatenate2.cc, tests/concatenate3.cc,
+	  tests/concatenate4.cc, tests/constraints1.cc,
+	  tests/constraints2.cc, tests/constraints3.cc, tests/empty1.cc,
+	  tests/exceptions1.cc, tests/exceptions2.cc, tests/generators3.cc,
+	  tests/generators4.cc, tests/generators5.cc,
+	  tests/h79widening4.cc, tests/inclusion2.cc,
+	  tests/intersection2.cc, tests/intersection3.cc,
+	  tests/intersection4.cc, tests/intersection5.cc,
+	  tests/intersection6.cc, tests/intersection8.cc,
+	  tests/intersection9.cc, tests/limitedh79widening1.cc,
+	  tests/limitedh79widening2.cc, tests/limitedh79widening3.cc,
+	  tests/memory1.cc, tests/minconstraints1.cc,
+	  tests/mingenerators1.cc, tests/permute.cc,
+	  tests/polydifference1.cc, tests/polydifference2.cc,
+	  tests/polydifference3.cc, tests/polydifference4.cc,
+	  tests/polydifference5.cc, tests/polydifference6.cc,
+	  tests/polyhull1.cc, tests/polyhull2.cc, tests/polyhull3.cc,
+	  tests/polyhull5.cc, tests/polyhull6.cc, tests/relations1.cc,
+	  tests/relations2.cc, tests/relations3.cc, tests/relations4.cc,
+	  tests/relations5.cc, tests/relations6.cc, tests/relations7.cc,
+	  tests/relations8.cc, tests/relations9.cc, tests/removedim4.cc,
+	  tests/removedim5.cc, tests/removedim6.cc, tests/removedim7.cc,
+	  tests/removedim8.cc, tests/removedim9.cc, tests/timeelapse1.cc,
+	  tests/timeelapse2.cc, tests/timeelapse3.cc, tests/timeelapse4.cc,
+	  tests/timeelapse5.cc, tests/topclosed1.cc, tests/topclosed2.cc,
+	  tests/topclosure1.cc, tests/universe1.cc, tests/universe2.cc,
+	  tests/universe3.cc, tests/universe4.cc, tests/universe5.cc,
+	  tests/universe6.cc, tests/watchdog1.cc
+	  (alt_nnc.[3,1,1,2,2,1,3,3,1,1,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,5,4,3,4,4,3,4,4,7,4,2,5,5,3,1,2,2,2,2,1,2,2,1,1,2,2,2,2,1,2,1,2,16,5,5,3,3,1,2,2,1,2,2,2,2,1,2,1,2,2,1,1,2,2,2,1,1,1,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,3,1,1,2,2,1,1,1,1,2,2,2,1,1,1,1,1,2,2,2,2,2,1,1,2,2,1,2,1,1,2,2,2,1,1,1,1,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2]):
+	  Merged changes in main trunk between tags
+	  "second_merge_to_alt_nnc" and "third_merge_to_alt_nnc".
+
+2002-09-11 Wednesday 19:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.63): Fixed a bug whereby the configuration
+	  options --enable-assertions and --enable-more-assertions were not
+	  working properly.
+
+2002-09-11 Wednesday 14:51  Elisa Ricci
+
+	* tests/bbrz02widening9.cc (1.2): Corrected this test: to built the
+	  increasing chain q_i we must do the widening between q_i_minus_1
+	  and the poly_hull of q_i_minus_1 and p_i (and not the widening
+	  between p_i and the poly_hull of q_i_minus_1 and p_i).
+
+2002-09-11 Wednesday 12:55  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.215), Polyhedron.defs.hh (1.148): Added
+	  the function static bool is_BBRZ02_stabilizing(const Polyhedron&
+	  x, const Polyhedron& y).  Used this new function in
+	  Polyhedron::BBRZ02_widening_assign().
+
+2002-09-10 Tuesday 23:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.214): A couple of comments adjusted in
+	  add_generator() and bbrz_widening_assign().
+
+2002-09-10 Tuesday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.35), doc/definitions.dox (1.89),
+	  interfaces/Prolog/Makefile.am (1.20),
+	  interfaces/Prolog/Prolog_interface.dox (1.62),
+	  interfaces/Prolog/clpq.pl (1.13), interfaces/Prolog/clpq2.pl
+	  (1.23), interfaces/Prolog/pl_check.pl (1.23),
+	  interfaces/Prolog/ppl_prolog.icc (1.65),
+	  interfaces/Prolog/track_allocation.hh (1.10),
+	  src/AskTell.inlines.hh (1.9), src/C_Polyhedron.defs.hh (1.17),
+	  src/ConSys.defs.hh (1.67), src/Constraint.cc (1.32),
+	  src/Constraint.defs.hh (1.71), src/conversion.cc (1.32),
+	  tests/addconstraints2.cc (1.16), tests/adddimensions10.cc (1.4),
+	  tests/adddimensions5.cc (1.5), tests/adddimensions6.cc (1.5),
+	  tests/adddimensions7.cc (1.5), tests/adddimensions8.cc (1.3),
+	  tests/adddimensions9.cc (1.3), tests/addgenerator1.cc (1.2),
+	  tests/addgenerator2.cc (1.2), tests/addgenerators7.cc (1.6),
+	  tests/addgenerators9.cc (1.3), tests/bbrz02widening1.cc (1.2),
+	  tests/bbrz02widening2.cc (1.2), tests/bbrz02widening3.cc (1.2),
+	  tests/bbrz02widening6.cc (1.2), tests/bbrz02widening7.cc (1.2),
+	  tests/bbrz02widening8.cc (1.2), tests/bounded1.cc (1.7),
+	  tests/boundingbox1.cc (1.21), tests/boundingbox2.cc (1.11),
+	  tests/bounds1.cc (1.3), tests/concatenate4.cc (1.3),
+	  tests/constraints1.cc (1.3), tests/constraints2.cc (1.3),
+	  tests/constraints3.cc (1.3): Lots of trailing blanks removed.
+
+2002-09-10 Tuesday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/topclosed1.cc (1.2): Indentation improvements.
+
+2002-09-10 Tuesday 18:05  Elisa Ricci
+
+	* src/Polyhedron.cc (1.213): Simplify the function
+	  `Polyhedron::add_generator(g)' in the case of a necessarily
+	  closed empty polyhedron and of a non-necessarily closed
+	  generator.
+
+2002-09-10 Tuesday 18:00  Elisa Ricci
+
+	* tests/: Makefile.am (1.94), topclosed1.cc (1.1), topclosed2.cc
+	  (1.1): Added two tests for the method
+	  `Polyhedron::is_topologically_closed()'.
+
+2002-09-10 Tuesday 17:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.15): The correction of the bug on
+	  Polyhedron::operator<=() reported on the alt_nnc branch.
+
+2002-09-10 Tuesday 16:46  Elisa Ricci
+
+	* tests/: Makefile.am (1.93), addgenerator1.cc (1.1),
+	  addgenerator2.cc (1.1), addgenerators10.cc (1.1), exceptions1.cc
+	  (1.16), exceptions2.cc (1.12), h79widening4.cc (1.1): Added some
+	  other tests to verify the functions of Polyhedron.cc.
+
+2002-09-10 Tuesday 14:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (ppl-0_4-branch.4):
+	  Parma_Polyhedra_Library::dimension_type is undefined in PPL
+	  0.4.x.
+
+2002-09-10 Tuesday 14:48  Elisa Ricci
+
+	* tests/: bounds2.cc (1.3), polydifference5.cc (1.3),
+	  polydifference6.cc (1.2), polyhull5.cc (1.2), polyhull6.cc (1.2),
+	  removedim8.cc (1.2), removedim9.cc (1.2), topclosure1.cc (1.2):
+	  Added some explanations of what these tests do and improved the
+	  `return' of the test bounds2.
+
+2002-09-10 Tuesday 13:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (ppl-0_4-branch.3), NEWS (1.34): The correction
+	  of the bug affecting Polyhedron::operator<=() reported on the
+	  ppl_0_4-branch. Bug correction notified in the NEWS.
+
+2002-09-10 Tuesday 12:33  Elisa Ricci
+
+	* tests/: CbecomesNNC1.cc (1.2), Makefile.am (1.92),
+	  addconstraint1.cc (1.2), addconstraints2.cc (1.15),
+	  adddimensions10.cc (1.3), adddimensions8.cc (1.2),
+	  adddimensions9.cc (1.2), addgenerators9.cc (1.2), bounds1.cc
+	  (1.2), bounds2.cc (1.2), concatenate4.cc (1.2), constraints1.cc
+	  (1.2), constraints2.cc (1.2), constraints3.cc (1.2),
+	  generators3.cc (1.2), generators4.cc (1.2), generators5.cc (1.2),
+	  intersection8.cc (1.2), intersection9.cc (1.2),
+	  minconstraints1.cc (1.2), mingenerators1.cc (1.2),
+	  polydifference4.cc (1.2), polydifference5.cc (1.2): Improved some
+	  tests.
+
+2002-09-10 Tuesday 12:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/adddimensions10.cc (1.2): The old `known_result' was wrong.
+	  This was masking the bug in Polyhedron::operator<=().
+
+2002-09-10 Tuesday 12:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.212): Correcting the bug in operator<=()
+	  pointed out by test inclusion2.cc.
+
+2002-09-10 Tuesday 11:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.91), inclusion2.cc (1.1): New test showing
+	  a bug in Polyhedron::operator<=().
+
+2002-09-09 Monday 18:00  Elisa Ricci
+
+	* tests/: CbecomesNNC1.cc (1.1), Makefile.am (1.90),
+	  addconstraint1.cc (1.1), addconstraints2.cc (1.14),
+	  adddimensions10.cc (1.1), adddimensions8.cc (1.1),
+	  adddimensions9.cc (1.1), addgenerators9.cc (1.1), bounds1.cc
+	  (1.1), bounds2.cc (1.1), concatenate4.cc (1.1), constraints1.cc
+	  (1.1), constraints2.cc (1.1), constraints3.cc (1.1),
+	  exceptions1.cc (1.15), exceptions2.cc (1.11), generators3.cc
+	  (1.1), generators4.cc (1.1), generators5.cc (1.1),
+	  intersection8.cc (1.1), intersection9.cc (1.1),
+	  minconstraints1.cc (1.1), mingenerators1.cc (1.1),
+	  polydifference3.cc (1.1), polydifference4.cc (1.1),
+	  polydifference5.cc (1.1), polydifference6.cc (1.1), polyhull5.cc
+	  (1.1), polyhull6.cc (1.1), removedim8.cc (1.1), removedim9.cc
+	  (1.1), topclosure1.cc (1.1): Added tests to verify some methods
+	  of Polyhedron.cc and NNC_Polyhedron.cc.
+
+2002-09-09 Monday 17:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.211), src/Polyhedron.defs.hh (1.147),
+	  tests/Makefile.am (1.89), tests/bbrz02widening1.cc (1.1),
+	  tests/bbrz02widening2.cc (1.1), tests/bbrz02widening3.cc (1.1),
+	  tests/bbrz02widening4.cc (1.1), tests/bbrz02widening5.cc (1.1),
+	  tests/bbrz02widening6.cc (1.1), tests/bbrz02widening7.cc (1.1),
+	  tests/bbrz02widening8.cc (1.1), tests/bbrz02widening9.cc (1.1):
+	  Initial implementation of the new widening.
+
+2002-09-04 Wednesday 20:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.43), Row.inlines.hh (1.33): Changes to support
+	  C++ compilers not providing flexible arrays.
+
+2002-09-04 Wednesday 12:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.210): Method OK() adjusted to behave
+	  correctly on an empty polyhedron having a single trivially false
+	  constraint.
+
+2002-09-03 Tuesday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* acinclude.m4 (1.3), config.h.in (1.18), configure.ac (1.62),
+	  m4/Makefile.am (1.7), m4/ac_cxx_flexible_arrays.m4 (1.1),
+	  src/Row.defs.hh (1.55), src/Row.inlines.hh (1.32): Initial
+	  support for compilers not providing flexible arrays.	(Flexible
+	  arrays are standard in C99 but not in the current C++ standard.)
+
+2002-09-03 Tuesday 19:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.17), configure.ac (1.61): New configuration option
+	  --enable-more-assertions: for the time being it enables more
+	  complete debugging of the class Row by defining EXTRA_ROW_DEBUG.
+
+2002-09-03 Tuesday 18:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/hypercubes.cc (alt_nnc.3): Computing also the constraints
+	  for the dual of hypercubes.
+
+2002-09-02 Monday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.16), configure.ac (1.60), src/ppl_header.middle
+	  (1.2): Some portability enhancements.
+
+2002-09-02 Monday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.16): Friend declaration fixed.
+
+2002-09-02 Monday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LCompare.defs.hh (1.4): Use public inheritance.
+
+2002-09-02 Monday 17:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.33), interfaces/C/ppl_c.cc (1.46), interfaces/C/ppl_c.h
+	  (1.46), src/initializer.hh (1.4): Identifiers containing a double
+	  underscore ("__") are reserved: we no longer use them.
+
+2002-09-02 Monday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.defs.hh (1.77), LinExpression.defs.hh (1.53):
+	  Illegal friend function declarations removed and substituted with
+	  (still unsatisfactory) friend class declarations.
+
+2002-09-02 Monday 16:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.inlines.hh (1.31): Fixed typo in comment.
+
+2002-09-01 Sunday 19:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.9): Encode addresses
+	  with terms of the form `$address'(High, Low) instead of
+	  [High|Low].
+
+2002-09-01 Sunday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.6), interfaces/C/ppl_c.cc (1.45),
+	  interfaces/C/ppl_c.h (1.45), interfaces/Prolog/ppl_prolog.icc
+	  (1.64), interfaces/Prolog/track_allocation.hh (1.9),
+	  src/AskTell.defs.hh (1.8), src/BoundingBox.defs.hh (1.6),
+	  src/C_Polyhedron.inlines.hh (1.12), src/ConSys.defs.hh (1.66),
+	  src/ConSys.inlines.hh (1.26), src/Constraint.defs.hh (1.70),
+	  src/Determinate.defs.hh (1.15), src/Determinate.inlines.hh
+	  (1.17), src/GenSys.defs.hh (1.80), src/GenSys.inlines.hh (1.28),
+	  src/Generator.cc (1.39), src/Generator.defs.hh (1.76),
+	  src/Interval.defs.hh (1.8), src/Matrix.cc (1.43),
+	  src/Matrix.defs.hh (1.35), src/NNC_Polyhedron.inlines.hh (1.14),
+	  src/Poly_Con_Relation.defs.hh (1.14),
+	  src/Poly_Gen_Relation.defs.hh (1.13), src/Polyhedron.cc (1.209),
+	  src/Polyhedron.defs.hh (1.146), src/SatMatrix.cc (1.20),
+	  src/conversion.cc (1.31), src/minimize.cc (1.24), src/simplify.cc
+	  (1.18), tests/append1.cc (1.15), tests/append2.cc (1.16),
+	  tests/empty1.cc (1.10), tests/exceptions1.cc (1.14),
+	  tests/permute.cc (1.22): Avoid source lines longer than 78
+	  characters.
+
+2002-09-01 Sunday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatRow.cc (1.11), SatRow.defs.hh (1.20), SatRow.inlines.hh
+	  (1.20): Use the right integral types.  Avoid source lines longer
+	  than 78 characters.
+
+2002-09-01 Sunday 15:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.44), GenSys.cc (1.64), Generator.defs.hh
+	  (1.75), LinExpression.defs.hh (1.52): Minor formatting changes.
+
+2002-09-01 Sunday 15:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.46): Make sure inlines are defined
+	  before they are used.
+
+2002-09-01 Sunday 13:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.32), configure.ac (1.59), interfaces/C/ppl_c.cc (1.44),
+	  interfaces/C/ppl_c.h (1.44), interfaces/Prolog/ppl_prolog.icc
+	  (1.63), interfaces/Prolog/track_allocation.hh (1.8),
+	  src/BoundingBox.cc (1.3), src/BoundingBox.defs.hh (1.5),
+	  src/BoundingBox.inlines.hh (1.6), src/C_Polyhedron.defs.hh
+	  (1.16), src/C_Polyhedron.inlines.hh (1.11), src/ConSys.cc (1.43),
+	  src/ConSys.defs.hh (1.65), src/ConSys.inlines.hh (1.25),
+	  src/Constraint.cc (1.31), src/Constraint.defs.hh (1.69),
+	  src/Constraint.inlines.hh (1.41), src/Determinate.defs.hh (1.14),
+	  src/Determinate.inlines.hh (1.16), src/GenSys.cc (1.63),
+	  src/GenSys.defs.hh (1.79), src/GenSys.inlines.hh (1.27),
+	  src/Generator.cc (1.38), src/Generator.defs.hh (1.74),
+	  src/Generator.inlines.hh (1.38), src/Init.cc (1.2),
+	  src/Init.defs.hh (1.6), src/LinExpression.cc (1.13),
+	  src/LinExpression.defs.hh (1.51), src/LinExpression.inlines.hh
+	  (1.23), src/Makefile.am (1.50), src/Matrix.cc (1.42),
+	  src/Matrix.defs.hh (1.34), src/Matrix.inlines.hh (1.27),
+	  src/NNC_Polyhedron.defs.hh (1.19), src/NNC_Polyhedron.inlines.hh
+	  (1.13), src/Polyhedron.cc (1.208), src/Polyhedron.defs.hh
+	  (1.145), src/Polyhedron.inlines.hh (1.45), src/PowerSet.defs.hh
+	  (1.16), src/PowerSet.inlines.hh (1.21), src/Row.cc (1.42),
+	  src/Row.defs.hh (1.54), src/Row.inlines.hh (1.30),
+	  src/SatMatrix.cc (1.19), src/SatMatrix.defs.hh (1.24),
+	  src/SatMatrix.inlines.hh (1.16), src/SatRow.cc (1.10),
+	  src/SatRow.defs.hh (1.19), src/SatRow.inlines.hh (1.19),
+	  src/Variable.cc (1.8), src/Variable.defs.hh (1.24),
+	  src/Variable.inlines.hh (1.13), src/conversion.cc (1.30),
+	  src/globals.cc (1.9), src/globals.hh (1.22), src/minimize.cc
+	  (1.23), src/simplify.cc (1.17), tests/append1.cc (1.14),
+	  tests/append2.cc (1.15), tests/boundingbox1.cc (1.20),
+	  tests/intersection2.cc (1.4), tests/memory1.cc (1.8),
+	  tests/permute.cc (1.21), tests/watchdog1.cc (1.11): No longer
+	  abuse `size_t'.  The new type `dimension_type' is an unsigned
+	  integral type for representing space dimensions.  The new
+	  function dimension_type max_space_dimension() returns the maximum
+	  space dimension this library can handle.
+
+2002-08-22 Thursday 15:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.61), pl_check.pl
+	  (1.22): Updated for concatenate_assign.
+
+2002-08-22 Thursday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.20): PowerSet<CS>::add_constraint()
+	  and PowerSet<CS>::add_constraints() fixed.
+
+2002-08-22 Thursday 01:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/hypercubes.cc (alt_nnc.2): Some more tests.
+
+2002-08-20 Tuesday 17:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.19): Several corrections.
+
+2002-08-19 Monday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.144): Avoid unnecessary qualification.
+
+2002-08-19 Monday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.42), ConSys.defs.hh (1.64), GenSys.cc (1.62),
+	  GenSys.defs.hh (1.78), Matrix.cc (1.41), Matrix.defs.hh (1.33),
+	  Poly_Con_Relation.cc (1.3), Poly_Con_Relation.defs.hh (1.13),
+	  Poly_Gen_Relation.cc (1.3), Poly_Gen_Relation.defs.hh (1.12),
+	  Polyhedron.cc (1.207), SatMatrix.cc (1.18), SatMatrix.defs.hh
+	  (1.23), Status.cc (1.13): Rewriting of all input/output functions
+	  and operators completed.
+
+2002-08-19 Monday 16:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.206), Status.cc (1.12), Status.defs.hh
+	  (1.21): The input and output operators on Status have been
+	  replaced by methods void ASCII_dump(std::ostream&) const and bool
+	  ASCII_load(std::istream&).
+
+2002-08-19 Monday 16:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.143): Comment corrected.
+
+2002-08-19 Monday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.205), Polyhedron.defs.hh (1.142): The
+	  historical operators operator<<(std::ostream&, const Polyhedron&)
+	  and oprator>>(std::istream&, Polyhedron&) have been replaced by
+	  (internal) methods Polyhedron::ASCII_dump(std::ostream& s) and
+	  ASCII_load(std::istream& s).	New version of
+	  operator<<(std::ostream& s, const Polyhedron& ph): writes a
+	  textual representation of \p ph on \p s: "false" is written if
+	  `ph' is an empty polyhedron; "true" is written if `ph' is a
+	  universe polyhedron; a minimized system of constraints defining
+	  `ph' is written otherwise, all constraints in one row separated
+	  by ", ".
+
+2002-08-19 Monday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.inlines.hh (1.5), Makefile.am (1.49), Variable.cc
+	  (1.7), Variable.defs.hh (1.23), Variable.inlines.hh (1.12): Allow
+	  the user to change the output function for Variable objects by
+	  calling Variable::set_output_function().  Allow the user to
+	  obtain a pointer to the current output function by calling
+	  Variable::get_output_function().
+
+2002-08-19 Monday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.hh (1.21): Obey the indentation rules.
+
+2002-08-18 Sunday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.88): We know nnc_limitedh79widening3 should
+	  fail (for the time being).
+
+2002-08-18 Sunday 22:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: addconstraints4.cc (1.8), addconstraints5.cc (1.9),
+	  addconstraints6.cc (1.10), addconstraints7.cc (1.9),
+	  addconstraints8.cc (1.9), addconstraints9.cc (1.10),
+	  adddimensions1.cc (1.11), adddimensions2.cc (1.7),
+	  adddimensions3.cc (1.9), adddimensions4.cc (1.7),
+	  adddimensions5.cc (1.4), adddimensions6.cc (1.4),
+	  adddimensions7.cc (1.4), addgenerators3.cc (1.9),
+	  addgenerators4.cc (1.9), addgenerators5.cc (1.9),
+	  addgenerators6.cc (1.9), addgenerators7.cc (1.5), affineimage1.cc
+	  (1.9), affineimage2.cc (1.8), affinepreimage1.cc (1.8),
+	  affinepreimage2.cc (1.8), affinepreimage3.cc (1.8),
+	  affinepreimage4.cc (1.9), bounded1.cc (1.6), boundingbox1.cc
+	  (1.19), boundingbox2.cc (1.10), concatenate2.cc (1.4),
+	  concatenate3.cc (1.4), intersection3.cc (1.4), intersection4.cc
+	  (1.4), intersection5.cc (1.4), intersection6.cc (1.4),
+	  limitedh79widening1.cc (1.4), limitedh79widening2.cc (1.4),
+	  limitedh79widening3.cc (1.2), polydifference1.cc (1.4),
+	  polydifference2.cc (1.6), polyhull1.cc (1.4), polyhull2.cc (1.4),
+	  polyhull3.cc (1.4), relations1.cc (1.6), relations2.cc (1.7),
+	  relations3.cc (1.7), relations4.cc (1.7), relations5.cc (1.7),
+	  relations6.cc (1.6), relations7.cc (1.6), relations8.cc (1.6),
+	  relations9.cc (1.7), removedim4.cc (1.9), removedim5.cc (1.7),
+	  removedim6.cc (1.9), removedim7.cc (1.4), timeelapse1.cc (1.5),
+	  timeelapse2.cc (1.5), timeelapse3.cc (1.5), timeelapse4.cc (1.5),
+	  timeelapse5.cc (1.5), universe1.cc (1.6), universe2.cc (1.7),
+	  universe3.cc (1.7), universe4.cc (1.7), universe5.cc (1.8),
+	  universe6.cc (1.5): Comments corrected.
+
+2002-08-18 Sunday 18:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.14): Adjusted new constructors to
+	  produce the new epsilon representations.
+
+2002-08-18 Sunday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.87), limitedh79widening3.cc (1.1): New
+	  test showing an incongruence in the behavior of the limited
+	  widening operations in C and NNC polyhedra, respectively.
+
+2002-08-17 Saturday 18:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.41): Properly terminate messages.
+
+2002-08-17 Saturday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.15), PowerSet.inlines.hh (1.18): Define
+	  `reverse_iterator' and `const_reverse_iterator'.  New methods
+	  rbegin() and rend().	New method definitely_contains(const CS&).
+	  First prototype of method limited_H79_widening_assign(const
+	  PowerSet&, ConSys&).
+
+2002-08-17 Saturday 18:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.13), Determinate.inlines.hh (1.15):
+	  New method is_definitely_equivalent_to(const Determinate&).
+
+2002-08-17 Saturday 17:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.inlines.hh (1.14), PowerSet.inlines.hh (1.17):
+	  PowerSet<CS>::omega_reduction() properly implemented.
+	  operator<<(std::ostream&, const Determinate<PH>&) implemented so
+	  as to obtain something readable.
+
+2002-08-17 Saturday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, config.h.in, configure.ac, Watchdog/Watchdog.defs.hh,
+	  Watchdog/Watchdog.inlines.hh, Watchdog/Watchdog.types.hh,
+	  Watchdog/pwl_header.top, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h, interfaces/Prolog/track_allocation.hh,
+	  src/AskTell.defs.hh, src/AskTell.inlines.hh,
+	  src/AskTell.types.hh, src/BoundingBox.defs.hh,
+	  src/BoundingBox.inlines.hh, src/BoundingBox.types.hh,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/C_Polyhedron.types.hh, src/ConSys.defs.hh,
+	  src/ConSys.inlines.hh, src/ConSys.types.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint.types.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/Determinate.types.hh,
+	  src/GenSys.defs.hh, src/GenSys.inlines.hh, src/GenSys.types.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator.types.hh,
+	  src/Init.defs.hh, src/Init.inlines.hh, src/Init.types.hh,
+	  src/Integer.defs.hh, src/Integer.inlines.hh,
+	  src/Integer.types.hh, src/Interval.defs.hh,
+	  src/Interval.inlines.hh, src/Interval.types.hh,
+	  src/LCompare.defs.hh, src/LCompare.inlines.hh,
+	  src/LCompare.types.hh, src/LinExpression.defs.hh,
+	  src/LinExpression.inlines.hh, src/LinExpression.types.hh,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh, src/Matrix.types.hh,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/NNC_Polyhedron.types.hh, src/Poly_Con_Relation.defs.hh,
+	  src/Poly_Con_Relation.inlines.hh, src/Poly_Con_Relation.types.hh,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Poly_Gen_Relation.types.hh, src/Polyhedron.cc,
+	  src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	  src/Polyhedron.types.hh, src/PowerSet.defs.hh,
+	  src/PowerSet.inlines.hh, src/PowerSet.types.hh, src/Row.defs.hh,
+	  src/Row.inlines.hh, src/Row.types.hh, src/SatMatrix.defs.hh,
+	  src/SatMatrix.inlines.hh, src/SatMatrix.types.hh,
+	  src/SatRow.defs.hh, src/SatRow.inlines.hh, src/SatRow.types.hh,
+	  src/Status.defs.hh, src/Status.inlines.hh, src/Status.types.hh,
+	  src/Topology.hh, src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Variable.types.hh, src/globals.hh, src/initializer.hh,
+	  src/ppl_header.top, tests/ehandlers.hh, tests/mc91.cc,
+	  tests/print.hh, tests/timings.hh
+	  (alt_nnc.[2,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,3,2,1,3,3,2,1,3,3,1,3,1,1,4,4,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13,4,4,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1]):
+	  Merge changes from the trunk between tags `merge_to_alt_nnc' and
+	  `second_merge_to_alt_nnc'.
+
+2002-08-17 Saturday 13:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.16):
+	  PowerSet<CS>::concatenate_assign() fixed.
+
+2002-08-17 Saturday 11:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.12): In method
+	  add_dimensions_and_project(), now adding the minus_epsilon_ray
+	  instead of the zero_dim_closure_point.
+
+2002-08-17 Saturday 10:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh, Polyhedron.inlines.hh (alt_nnc.[3,3]):
+	  Method shuffle_dimensions(...) implemented in tha alt_nnc branch
+	  too.
+
+2002-08-16 Friday 22:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.31), interfaces/C/ppl_c.cc (1.43), interfaces/C/ppl_c.h
+	  (1.43): The functions taking non-const arguments named
+	  ppl_new_<T>_from_<S> have been renamed ppl_new_<T>_recycle_<S>,
+	  where <T> is either "C" or "NNC", and <S> is either "ConSys" or
+	  "GenSys".  The old names have been given to the new const
+	  functions.
+
+2002-08-16 Friday 22:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.12), src/Determinate.inlines.hh
+	  (1.13), src/PowerSet.defs.hh (1.14), src/PowerSet.inlines.hh
+	  (1.15), tests/mc91.cc (1.6): Another bit of Determinate and
+	  PowerSet implementation written.
+
+2002-08-16 Friday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.30): Updated.
+
+2002-08-16 Friday 22:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.cc (1.30), Generator.cc (1.37): Exception
+	  messages improved.
+
+2002-08-16 Friday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.15), C_Polyhedron.inlines.hh
+	  (1.10), NNC_Polyhedron.defs.hh (1.18), NNC_Polyhedron.inlines.hh
+	  (1.12), Polyhedron.cc (1.204), Polyhedron.defs.hh (1.141): New
+	  constructors to build polyhedra from read-only constraint and
+	  generator systems: C_Polyhedron(const ConSys&),
+	  C_Polyhedron(const GenSys&), NNC_Polyhedron(const ConSys&), and
+	  NNC_Polyhedron(const GenSys&).  Some comments improved.  Poorly
+	  chosen variable name changed.  Exception messages improved.
+
+2002-08-16 Friday 16:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh, Determinate.inlines.hh
+	  (alt_nnc.[2,2]): Chnages needed to let China compile (taken from
+	  the main trunk).
+
+2002-08-16 Friday 16:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.11): Widening operators now should
+	  work with the NER.
+
+2002-08-16 Friday 10:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.10): Corrected a comment.
+
+2002-08-16 Friday 10:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (alt_nnc.6): Corrected method
+	  adjust_topology_and_dimension(), which could have introduced an
+	  illegal (all zero's) ray when mapping a NNC to a C gensys.
+
+2002-08-16 Friday 10:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Polyhedron.cc (alt_nnc.1): Constructor
+	  C_Polyhedron::C_Polyhedron(const NNC_Polyhedron& y) now is
+	  implemented using generators (using constraints is not safe wrt
+	  NER).
+
+2002-08-16 Friday 10:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.15), configure.ac (1.58),
+	  Watchdog/Watchdog.defs.hh (1.6), Watchdog/Watchdog.inlines.hh
+	  (1.5), Watchdog/Watchdog.types.hh (1.2), Watchdog/pwl_header.top
+	  (1.2), interfaces/C/ppl_c.h (1.42),
+	  interfaces/Prolog/track_allocation.hh (1.7), src/AskTell.defs.hh
+	  (1.7), src/AskTell.inlines.hh (1.8), src/AskTell.types.hh (1.3),
+	  src/BoundingBox.defs.hh (1.4), src/BoundingBox.inlines.hh (1.5),
+	  src/BoundingBox.types.hh (1.4), src/C_Polyhedron.defs.hh (1.14),
+	  src/C_Polyhedron.inlines.hh (1.9), src/C_Polyhedron.types.hh
+	  (1.5), src/ConSys.defs.hh (1.63), src/ConSys.inlines.hh (1.24),
+	  src/ConSys.types.hh (1.5), src/Constraint.defs.hh (1.68),
+	  src/Constraint.inlines.hh (1.40), src/Constraint.types.hh (1.5),
+	  src/Determinate.defs.hh (1.11), src/Determinate.inlines.hh
+	  (1.12), src/Determinate.types.hh (1.3), src/GenSys.defs.hh
+	  (1.77), src/GenSys.inlines.hh (1.26), src/GenSys.types.hh (1.5),
+	  src/Generator.defs.hh (1.73), src/Generator.inlines.hh (1.37),
+	  src/Generator.types.hh (1.5), src/Init.defs.hh (1.5),
+	  src/Init.inlines.hh (1.4), src/Init.types.hh (1.4),
+	  src/Integer.defs.hh (1.7), src/Integer.inlines.hh (1.6),
+	  src/Integer.types.hh (1.6), src/Interval.defs.hh (1.7),
+	  src/Interval.inlines.hh (1.5), src/Interval.types.hh (1.4),
+	  src/LCompare.defs.hh (1.3), src/LCompare.inlines.hh (1.3),
+	  src/LCompare.types.hh (1.3), src/LinExpression.defs.hh (1.50),
+	  src/LinExpression.inlines.hh (1.22), src/LinExpression.types.hh
+	  (1.5), src/Matrix.defs.hh (1.32), src/Matrix.inlines.hh (1.26),
+	  src/Matrix.types.hh (1.5), src/NNC_Polyhedron.defs.hh (1.17),
+	  src/NNC_Polyhedron.inlines.hh (1.11), src/NNC_Polyhedron.types.hh
+	  (1.5), src/Poly_Con_Relation.defs.hh (1.12),
+	  src/Poly_Con_Relation.inlines.hh (1.8),
+	  src/Poly_Con_Relation.types.hh (1.4),
+	  src/Poly_Gen_Relation.defs.hh (1.11),
+	  src/Poly_Gen_Relation.inlines.hh (1.8),
+	  src/Poly_Gen_Relation.types.hh (1.4), src/Polyhedron.defs.hh
+	  (1.140), src/Polyhedron.inlines.hh (1.44),
+	  src/Polyhedron.types.hh (1.6), src/PowerSet.defs.hh (1.13),
+	  src/PowerSet.inlines.hh (1.14), src/PowerSet.types.hh (1.3),
+	  src/Row.defs.hh (1.53), src/Row.inlines.hh (1.29),
+	  src/Row.types.hh (1.5), src/SatMatrix.defs.hh (1.22),
+	  src/SatMatrix.inlines.hh (1.15), src/SatMatrix.types.hh (1.5),
+	  src/SatRow.defs.hh (1.18), src/SatRow.inlines.hh (1.18),
+	  src/SatRow.types.hh (1.5), src/Status.defs.hh (1.20),
+	  src/Status.inlines.hh (1.10), src/Status.types.hh (1.5),
+	  src/Topology.hh (1.6), src/Variable.defs.hh (1.22),
+	  src/Variable.inlines.hh (1.11), src/Variable.types.hh (1.5),
+	  src/globals.hh (1.20), src/initializer.hh (1.3),
+	  src/ppl_header.top (1.4), tests/ehandlers.hh (1.5),
+	  tests/print.hh (1.11), tests/timings.hh (1.2): According to the
+	  C++ standard (Section 17.4), every name that starts with an
+	  underscore is reserved to the implementation.  All the multiple
+	  inclusion guards have been renamed (some missing ones have been
+	  added).
+
+2002-08-15 Thursday 11:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc, GenSys.defs.hh, Generator.cc, Generator.defs.hh
+	  (alt_nnc.[5,2,3,3]): Removed useless methods
+	  Generator::is_matching_closure_point() and
+	  GenSys::add_corresponding_points().
+
+2002-08-15 Thursday 11:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.9): Corrected trivial errors in
+	  is_topologically_closed() and topological_closure_assign().
+
+2002-08-15 Thursday 11:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.10), Determinate.inlines.hh (1.11):
+	  Implemented the functionality required for testing with China.
+
+2002-08-15 Thursday 11:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.203), Polyhedron.defs.hh (1.139),
+	  Polyhedron.inlines.hh (1.43): Added template <typename
+	  PartialFunction> void Polyhedron::shuffle_dimensions(const
+	  PartialFunction& pfunc).
+
+2002-08-14 Wednesday 18:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.8): Comments of
+	  Polyhedron::concatenate_assign() improved.
+
+2002-08-14 Wednesday 18:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.202): Polyhedron::concatenate_assign()
+	  improved.
+
+2002-08-14 Wednesday 18:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.7): Rewritten methods
+	  is_topologically_closed() and topological_closure_assign().
+
+2002-08-14 Wednesday 16:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.6): Some improvements to
+	  concatenate_assign().
+
+2002-08-14 Wednesday 16:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (alt_nnc.4): Corrected method has_points(), which
+	  was returning true even when finding the minus_epsilon ray.
+
+2002-08-14 Wednesday 15:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.41): Documentation of
+	  ppl_Polyhedron_concatenate_assign() corrected.
+
+2002-08-14 Wednesday 14:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/hypercubes.cc (alt_nnc.1): Put under CVS control. It is not
+	  (yet) built and executed by `make check', because we should find
+	  the right performance tradeoff.
+
+2002-08-14 Wednesday 14:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/ConSys.cc,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/GenSys.cc, src/Polyhedron.cc, src/Polyhedron.defs.hh,
+	  src/PowerSet.defs.hh, src/PowerSet.inlines.hh, tests/Makefile.am,
+	  tests/NNCinclusion1.cc, tests/NNCminimize1.cc,
+	  tests/NNCminimize2.cc, tests/NNCminimize3.cc,
+	  tests/NNCminimize4.cc, tests/NNCminimize5.cc,
+	  tests/NNCminimize6.cc, tests/addconstraints1.cc,
+	  tests/addconstraints10.cc, tests/addconstraints11.cc,
+	  tests/addconstraints2.cc, tests/addconstraints3.cc,
+	  tests/addconstraints4.cc, tests/addconstraints5.cc,
+	  tests/addconstraints6.cc, tests/addconstraints7.cc,
+	  tests/addconstraints8.cc, tests/addconstraints9.cc,
+	  tests/adddimensions1.cc, tests/adddimensions2.cc,
+	  tests/adddimensions3.cc, tests/adddimensions4.cc,
+	  tests/adddimensions5.cc, tests/adddimensions6.cc,
+	  tests/adddimensions7.cc, tests/addgenerators1.cc,
+	  tests/addgenerators2.cc, tests/addgenerators3.cc,
+	  tests/addgenerators4.cc, tests/addgenerators5.cc,
+	  tests/addgenerators6.cc, tests/addgenerators7.cc,
+	  tests/addgenerators8.cc, tests/affineimage1.cc,
+	  tests/affineimage2.cc, tests/affinepreimage1.cc,
+	  tests/affinepreimage2.cc, tests/affinepreimage3.cc,
+	  tests/affinepreimage4.cc, tests/affinetrans.cc, tests/append1.cc,
+	  tests/append2.cc, tests/bounded1.cc, tests/boundingbox1.cc,
+	  tests/boundingbox2.cc, tests/concatenate1.cc,
+	  tests/concatenate2.cc, tests/concatenate3.cc, tests/empty1.cc,
+	  tests/exceptions1.cc, tests/exceptions2.cc, tests/generators1.cc,
+	  tests/generators2.cc, tests/h79widening1.cc,
+	  tests/h79widening2.cc, tests/h79widening3.cc,
+	  tests/inclusion1.cc, tests/inters1.cc, tests/inters2.cc,
+	  tests/inters3.cc, tests/inters4.cc, tests/inters5.cc,
+	  tests/inters6.cc, tests/inters7.cc, tests/intersection1.cc,
+	  tests/intersection2.cc, tests/intersection3.cc,
+	  tests/intersection4.cc, tests/intersection5.cc,
+	  tests/intersection6.cc, tests/intersection7.cc,
+	  tests/limitedh79widening1.cc, tests/limitedh79widening2.cc,
+	  tests/mc91.cc, tests/memory1.cc, tests/onepoint.cc,
+	  tests/permute.cc, tests/polydifference1.cc,
+	  tests/polydifference2.cc, tests/polyhull1.cc, tests/polyhull2.cc,
+	  tests/polyhull3.cc, tests/polyhull4.cc, tests/ppl_test.hh,
+	  tests/randphull1.cc, tests/relations1.cc, tests/relations2.cc,
+	  tests/relations3.cc, tests/relations4.cc, tests/relations5.cc,
+	  tests/relations6.cc, tests/relations7.cc, tests/relations8.cc,
+	  tests/relations9.cc, tests/removedim1.cc, tests/removedim2.cc,
+	  tests/removedim3.cc, tests/removedim4.cc, tests/removedim5.cc,
+	  tests/removedim6.cc, tests/removedim7.cc, tests/smm1.cc,
+	  tests/timeelapse1.cc, tests/timeelapse2.cc, tests/timeelapse3.cc,
+	  tests/timeelapse4.cc, tests/timeelapse5.cc, tests/universe1.cc,
+	  tests/universe2.cc, tests/universe3.cc, tests/universe4.cc,
+	  tests/universe5.cc, tests/universe6.cc, tests/watchdog1.cc
+	  (alt_nnc.[1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,3,5,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Merge changes from the trunk between tags `alt_nnc_root' and
+	  `merge_to_alt_nnc'.
+
+2002-08-14 Wednesday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: NNCinclusion1.cc (1.4), NNCminimize1.cc (1.6),
+	  NNCminimize2.cc (1.6), NNCminimize3.cc (1.6), NNCminimize4.cc
+	  (1.8), NNCminimize5.cc (1.4), NNCminimize6.cc (1.6),
+	  addconstraints1.cc (1.8), addconstraints3.cc (1.5),
+	  addconstraints4.cc (1.7), addconstraints5.cc (1.8),
+	  addconstraints6.cc (1.9), addconstraints7.cc (1.8),
+	  addconstraints8.cc (1.8), addconstraints9.cc (1.9),
+	  adddimensions1.cc (1.10), adddimensions2.cc (1.6),
+	  adddimensions3.cc (1.8), adddimensions4.cc (1.6),
+	  adddimensions5.cc (1.3), adddimensions6.cc (1.3),
+	  adddimensions7.cc (1.3), addgenerators1.cc (1.9),
+	  addgenerators2.cc (1.9), addgenerators3.cc (1.8),
+	  addgenerators4.cc (1.8), addgenerators5.cc (1.8),
+	  addgenerators6.cc (1.8), addgenerators7.cc (1.4),
+	  addgenerators8.cc (1.4), affineimage1.cc (1.8), affineimage2.cc
+	  (1.7), affinepreimage1.cc (1.7), affinepreimage2.cc (1.7),
+	  affinepreimage3.cc (1.7), affinepreimage4.cc (1.8),
+	  affinetrans.cc (1.11), append1.cc (1.13), append2.cc (1.14),
+	  bounded1.cc (1.5), boundingbox1.cc (1.18), boundingbox2.cc (1.9),
+	  concatenate1.cc (1.3), concatenate2.cc (1.3), concatenate3.cc
+	  (1.3), empty1.cc (1.9), exceptions1.cc (1.13), exceptions2.cc
+	  (1.10), generators1.cc (1.8), generators2.cc (1.5),
+	  h79widening1.cc (1.3), h79widening2.cc (1.3), h79widening3.cc
+	  (1.3), inclusion1.cc (1.4), intersection1.cc (1.3),
+	  intersection2.cc (1.3), intersection3.cc (1.3), intersection4.cc
+	  (1.3), intersection5.cc (1.3), intersection6.cc (1.3),
+	  intersection7.cc (1.3), limitedh79widening1.cc (1.3),
+	  limitedh79widening2.cc (1.3), mc91.cc (1.5), memory1.cc (1.7),
+	  onepoint.cc (1.7), permute.cc (1.20), polydifference1.cc (1.3),
+	  polydifference2.cc (1.5), polyhull1.cc (1.3), polyhull2.cc (1.3),
+	  polyhull3.cc (1.3), polyhull4.cc (1.3), randphull1.cc (1.4),
+	  relations1.cc (1.5), relations2.cc (1.6), relations3.cc (1.6),
+	  relations4.cc (1.6), relations5.cc (1.6), relations6.cc (1.5),
+	  relations7.cc (1.5), relations8.cc (1.5), relations9.cc (1.6),
+	  removedim1.cc (1.7), removedim2.cc (1.11), removedim3.cc (1.7),
+	  removedim4.cc (1.8), removedim5.cc (1.6), removedim6.cc (1.8),
+	  removedim7.cc (1.3), smm1.cc (1.7), timeelapse1.cc (1.4),
+	  timeelapse2.cc (1.4), timeelapse3.cc (1.4), timeelapse4.cc (1.4),
+	  timeelapse5.cc (1.4), universe1.cc (1.5), universe2.cc (1.6),
+	  universe3.cc (1.6), universe4.cc (1.6), universe5.cc (1.7),
+	  universe6.cc (1.4), watchdog1.cc (1.10): Minor improvements.
+
+2002-08-14 Wednesday 12:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.86): The test nnc_polydifference1 must fail.
+
+2002-08-14 Wednesday 12:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc, Generator.cc, Generator.defs.hh
+	  (alt_nnc.[2,2,2]): The skip_forward() method now only skips the
+	  minus_epsilon_ray.
+
+2002-08-14 Wednesday 12:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (alt_nnc.3): In the skip_forward() method, avoid
+	  useless computations for necessarily closed constraint systems.
+
+2002-08-14 Wednesday 12:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.85), NNCinclusion1.cc (1.3),
+	  NNCminimize1.cc (1.5), NNCminimize2.cc (1.5), NNCminimize3.cc
+	  (1.5), NNCminimize4.cc (1.7), NNCminimize5.cc (1.3),
+	  NNCminimize6.cc (1.5), addconstraints1.cc (1.7),
+	  addconstraints3.cc (1.4), addconstraints4.cc (1.6),
+	  addconstraints5.cc (1.7), addconstraints6.cc (1.8),
+	  addconstraints7.cc (1.7), addconstraints8.cc (1.7),
+	  addconstraints9.cc (1.8), adddimensions1.cc (1.9),
+	  adddimensions2.cc (1.5), adddimensions3.cc (1.7),
+	  adddimensions4.cc (1.5), adddimensions5.cc (1.2),
+	  adddimensions6.cc (1.2), adddimensions7.cc (1.2),
+	  addgenerators1.cc (1.8), addgenerators2.cc (1.8),
+	  addgenerators3.cc (1.7), addgenerators4.cc (1.7),
+	  addgenerators5.cc (1.7), addgenerators6.cc (1.7),
+	  addgenerators7.cc (1.3), addgenerators8.cc (1.3), affineimage1.cc
+	  (1.7), affineimage2.cc (1.6), affinepreimage1.cc (1.6),
+	  affinepreimage2.cc (1.6), affinepreimage3.cc (1.6),
+	  affinepreimage4.cc (1.7), affinetrans.cc (1.10), append1.cc
+	  (1.12), append2.cc (1.13), bounded1.cc (1.4), boundingbox1.cc
+	  (1.17), boundingbox2.cc (1.8), concatenate1.cc (1.2),
+	  concatenate2.cc (1.2), concatenate3.cc (1.2), empty1.cc (1.8),
+	  exceptions1.cc (1.12), exceptions2.cc (1.9), generators1.cc
+	  (1.7), generators2.cc (1.4), h79widening1.cc (1.2),
+	  h79widening2.cc (1.2), h79widening3.cc (1.2), inclusion1.cc
+	  (1.3), intersection1.cc (1.2), intersection2.cc (1.2),
+	  intersection3.cc (1.2), intersection4.cc (1.2), intersection5.cc
+	  (1.2), intersection6.cc (1.2), intersection7.cc (1.2),
+	  limitedh79widening1.cc (1.2), limitedh79widening2.cc (1.2),
+	  mc91.cc (1.4), memory1.cc (1.6), onepoint.cc (1.6), permute.cc
+	  (1.19), polydifference1.cc (1.2), polydifference2.cc (1.4),
+	  polyhull1.cc (1.2), polyhull2.cc (1.2), polyhull3.cc (1.2),
+	  polyhull4.cc (1.2), ppl_test.hh (1.1), randphull1.cc (1.3),
+	  relations1.cc (1.4), relations2.cc (1.5), relations3.cc (1.5),
+	  relations4.cc (1.5), relations5.cc (1.5), relations6.cc (1.4),
+	  relations7.cc (1.4), relations8.cc (1.4), relations9.cc (1.5),
+	  removedim1.cc (1.6), removedim2.cc (1.10), removedim3.cc (1.6),
+	  removedim4.cc (1.7), removedim5.cc (1.5), removedim6.cc (1.7),
+	  removedim7.cc (1.2), smm1.cc (1.6), timeelapse1.cc (1.3),
+	  timeelapse2.cc (1.3), timeelapse3.cc (1.3), timeelapse4.cc (1.3),
+	  timeelapse5.cc (1.3), universe1.cc (1.4), universe2.cc (1.5),
+	  universe3.cc (1.5), universe4.cc (1.5), universe5.cc (1.6),
+	  universe6.cc (1.3), watchdog1.cc (1.9): Most of the test programs
+	  are now used to test both closed and not necessarily closed
+	  polyhedra.
+
+2002-08-14 Wednesday 11:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, ConSys.defs.hh, ConSys.inlines.hh,
+	  Constraint.cc, Constraint.defs.hh (alt_nnc.[2,2,1,2,2]): Now the
+	  iterators on constraint systems do skip the next constraint when
+	  the current one is a strict inequality and the next one is a
+	  non-strict inequality matching the current one (we still skip
+	  trivial-true constraints).
+
+2002-08-14 Wednesday 08:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.29): Updated.
+
+2002-08-14 Wednesday 08:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.201): Polyhedron::concatenate_assign()
+	  improved.
+
+2002-08-13 Tuesday 22:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.84), inters1.cc (1.11), inters2.cc (1.14),
+	  inters3.cc (1.7), inters4.cc (1.6), inters5.cc (1.8), inters6.cc
+	  (1.7), inters7.cc (1.4), intersection1.cc (1.1), intersection2.cc
+	  (1.1), intersection3.cc (1.1), intersection4.cc (1.1),
+	  intersection5.cc (1.1), intersection6.cc (1.1), intersection7.cc
+	  (1.1): Renamed intersN.cc to intersectionN.cc, for N = 1, ..., 7.
+
+2002-08-13 Tuesday 21:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: xsb_clpq.P (1.5), xsb_clpq2.P (1.3):
+	  Import as little as possible.
+
+2002-08-13 Tuesday 21:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.4): add_constraints_and_minimize()
+	  should now be ok for the new NNC repr.  Added a couple of FIXME's
+	  to mark methods that still need to be adjusted.
+
+2002-08-13 Tuesday 21:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc, GenSys.defs.hh (alt_nnc.[1,1]): Removed method
+	  add_corresponding_closure_points().
+
+2002-08-13 Tuesday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.42), interfaces/C/ppl_c.h (1.40),
+	  interfaces/Prolog/ppl_prolog.icc (1.62),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.21),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.17),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.25),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.49),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.2),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.7),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.4),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.2),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.42), src/Determinate.defs.hh
+	  (1.9), src/Determinate.inlines.hh (1.10), src/Polyhedron.cc
+	  (1.200), src/Polyhedron.defs.hh (1.138), src/PowerSet.defs.hh
+	  (1.12), src/PowerSet.inlines.hh (1.13), tests/Makefile.am (1.83),
+	  tests/addconstraints10.cc (1.6), tests/addconstraints11.cc (1.7),
+	  tests/addconstraints2.cc (1.13), tests/concatenate1.cc (1.1),
+	  tests/concatenate2.cc (1.1), tests/concatenate3.cc (1.1),
+	  tests/exceptions2.cc (1.8): The method
+	  Polyhedron::add_dimensions_and_constraints(ConSys&) has gone.  A
+	  similar functionality is provided by the new method
+	  Polyhedron::concatenate_assign(const Polyhedron&).
+
+2002-08-13 Tuesday 18:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (alt_nnc.2): Fixed method	template
+	  <typename Box>   Polyhedron::Polyhedron(Topology topol, const
+	  Box& box) to work correctly with the new NNC representation.
+
+2002-08-13 Tuesday 18:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/boundingbox2.cc (alt_nnc.1): Some strange formatting fixed.
+
+2002-08-13 Tuesday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.8), Determinate.inlines.hh (1.9):
+	  Default constructor replaced with a generalized constructor.	New
+	  method Determinate::concatenate_assign(const Determinate& y).
+
+2002-08-13 Tuesday 16:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.3): Most methods now correctly use the
+	  new NNC representation (notable exceptions: the wideinings and
+	  the boundingbox operators).
+
+2002-08-13 Tuesday 16:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/minimize.cc (alt_nnc.1): When con_to_gen is false, no longer
+	  checking for the presence of the positivity constraint (C) or the
+	  presence of eps_geq_zero (NNC).
+
+2002-08-13 Tuesday 16:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc, Generator.defs.hh, Generator.inlines.hh
+	  (alt_nnc.[1,1,1]): Added method for getting the
+	  minus_epsilon_ray, needed for the new NNC representation;
+	  adjusted the OK() method so that it will no longer complain when
+	  finding a ray with a non-zero epsilon coefficient.
+
+2002-08-13 Tuesday 16:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, ConSys.defs.hh (alt_nnc.[1,1]): Added method
+	  add_corresponding_nonstrict_inequalities().
+
+2002-08-13 Tuesday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.11), PowerSet.inlines.hh (1.12): Added
+	  a `space_dim' private member and its usual public accessor:
+	  space_dimension().
+
+2002-08-13 Tuesday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.7), Determinate.inlines.hh (1.8):
+	  Method space_dimension() added.  Added template <typename PH>
+	  bool operator==(const Determinate<PH>& x, const Determinate<PH>&
+	  y) and template <typename PH> bool operator!=(const
+	  Determinate<PH>& x, const Determinate<PH>& y).  Added several
+	  assertions.  Default constructor made public (it was left private
+	  by mistake).	Prepare for some cleanup.
+
+2002-08-13 Tuesday 11:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.2): Started converting
+	  H-representations into P-representations.  The build is
+	  (obviously) broken.
+
+2002-08-13 Tuesday 10:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc, Constraint.defs.hh, Constraint.inlines.hh,
+	  Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh
+	  (alt_nnc.[1,1,1,1,1,1]): Getting rid of the epsilon_geq_zero()
+	  constraint.  Added the static function
+	  Polyhedron::add_low_level_constraints(ConSys&) to centralize the
+	  issues related to the positivity and the epsilon_leq_one()
+	  low-level constraints.
+
+2002-08-13 Tuesday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.41), GenSys.cc (1.61): In methods
+	  ConSys::insert() and GenSys::insert(), when the systems are empty
+	  and NNC, computing the new size of the constraint/generators in a
+	  cleaner way.
+
+2002-08-12 Monday 20:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.60): Patched the method insert(const
+	  Generator&), which was doing nasty things when trying to insert a
+	  generator into an empty generator system that was declared to be
+	  NNC.
+
+2002-08-12 Monday 20:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/addgenerators8.cc (1.2): No longer NOISY.
+
+2002-08-12 Monday 20:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.199): Corrected a bug in add_generator(const
+	  Generator&) whereby we were not adding the corresponding closure
+	  point when adding a point to an empty NNC polyhedron.
+
+2002-08-12 Monday 20:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.137): Removed a /*! that was inside the
+	  scope of another /*!.
+
+2002-08-12 Monday 20:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.82), addgenerators8.cc (1.1): The new test
+	  addgenerators8 shows a bug when trying to insert a point into an
+	  empty NNC polyhedron using add_generator(const Generator&).
+
+2002-08-12 Monday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.6), Determinate.inlines.hh (1.7),
+	  PowerSet.defs.hh (1.10), PowerSet.inlines.hh (1.11): Classes
+	  Determinate and PowerSet equipped with initial implementations of
+	  methods add_constraint(), add_constraints(), and
+	  add_dimensions_and_constraints().
+
+2002-08-12 Monday 09:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.136): The documentation of
+	  Polyhedron::add_dimensions_and_constraints() has been made
+	  consistent with that of the other methods.
+
+2002-08-12 Monday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.22), interfaces/Prolog/expected2
+	  (1.6), interfaces/Prolog/XSB/expected2 (1.2), src/ConSys.cc
+	  (1.40), src/Constraint.cc (1.29), src/Constraint.inlines.hh
+	  (1.39), src/GenSys.cc (1.59), src/Generator.cc (1.36),
+	  src/Generator.inlines.hh (1.36), src/Matrix.cc (1.40),
+	  src/Matrix.defs.hh (1.31), src/Polyhedron.cc (1.198),
+	  src/Polyhedron.inlines.hh (1.42), src/minimize.cc (1.22): Avoid
+	  using LaTeX commands in ordinary C++ comments.
+
+2002-08-12 Monday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.197): Properly comment a couple of
+	  preprocessor directives.
+
+2002-08-11 Sunday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.61), src/C_Polyhedron.defs.hh
+	  (1.13), src/C_Polyhedron.inlines.hh (1.8),
+	  src/NNC_Polyhedron.defs.hh (1.16), src/NNC_Polyhedron.inlines.hh
+	  (1.10), src/Polyhedron.defs.hh (1.135), src/Polyhedron.inlines.hh
+	  (1.41), src/PowerSet.defs.hh (1.9), src/PowerSet.inlines.hh
+	  (1.10): The syntax `template <class T>' is an anachronism: use
+	  `template <typename T>' instead.
+
+2002-08-11 Sunday 16:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.types.hh (1.3), C_Polyhedron.types.hh (1.4),
+	  ConSys.types.hh (1.4), Constraint.types.hh (1.4), GenSys.types.hh
+	  (1.4), Generator.types.hh (1.4), Init.types.hh (1.3),
+	  Integer.types.hh (1.5), Interval.types.hh (1.3),
+	  LinExpression.types.hh (1.4), Matrix.types.hh (1.4),
+	  NNC_Polyhedron.types.hh (1.4), Poly_Con_Relation.types.hh (1.3),
+	  Poly_Gen_Relation.types.hh (1.3), Polyhedron.types.hh (1.5),
+	  Row.types.hh (1.4), SatMatrix.types.hh (1.4), SatRow.types.hh
+	  (1.4), Status.types.hh (1.4), Variable.types.hh (1.4): Obey our
+	  standard about namespace-level indentation.
+
+2002-08-11 Sunday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.6), AskTell.inlines.hh (1.7),
+	  AskTell.types.hh (1.2), BoundingBox.defs.hh (1.3),
+	  BoundingBox.inlines.hh (1.4), BoundingBox.types.hh (1.2),
+	  C_Polyhedron.defs.hh (1.12), C_Polyhedron.inlines.hh (1.7),
+	  C_Polyhedron.types.hh (1.3), ConSys.defs.hh (1.62),
+	  ConSys.inlines.hh (1.23), ConSys.types.hh (1.3),
+	  Constraint.defs.hh (1.67), Constraint.inlines.hh (1.38),
+	  Constraint.types.hh (1.3), Determinate.defs.hh (1.5),
+	  Determinate.inlines.hh (1.6), Determinate.types.hh (1.2),
+	  GenSys.defs.hh (1.76), GenSys.inlines.hh (1.25), GenSys.types.hh
+	  (1.3), Generator.defs.hh (1.72), Generator.inlines.hh (1.35),
+	  Generator.types.hh (1.3), Init.defs.hh (1.4), Init.inlines.hh
+	  (1.3), Init.types.hh (1.2), Integer.defs.hh (1.6),
+	  Integer.inlines.hh (1.5), Integer.types.hh (1.4),
+	  Interval.defs.hh (1.6), Interval.types.hh (1.2), LCompare.defs.hh
+	  (1.2), LCompare.inlines.hh (1.2), LCompare.types.hh (1.2),
+	  LinExpression.defs.hh (1.49), LinExpression.inlines.hh (1.21),
+	  LinExpression.types.hh (1.3), Matrix.defs.hh (1.30),
+	  Matrix.inlines.hh (1.25), Matrix.types.hh (1.3),
+	  NNC_Polyhedron.defs.hh (1.15), NNC_Polyhedron.inlines.hh (1.9),
+	  NNC_Polyhedron.types.hh (1.3), Poly_Con_Relation.defs.hh (1.11),
+	  Poly_Con_Relation.inlines.hh (1.7), Poly_Con_Relation.types.hh
+	  (1.2), Poly_Gen_Relation.defs.hh (1.10),
+	  Poly_Gen_Relation.inlines.hh (1.7), Poly_Gen_Relation.types.hh
+	  (1.2), Polyhedron.defs.hh (1.134), Polyhedron.inlines.hh (1.40),
+	  Polyhedron.types.hh (1.4), PowerSet.defs.hh (1.8),
+	  PowerSet.inlines.hh (1.9), PowerSet.types.hh (1.2), Row.defs.hh
+	  (1.52), Row.inlines.hh (1.28), Row.types.hh (1.3),
+	  SatMatrix.defs.hh (1.21), SatMatrix.inlines.hh (1.14),
+	  SatMatrix.types.hh (1.3), SatRow.defs.hh (1.17),
+	  SatRow.inlines.hh (1.17), SatRow.types.hh (1.3), Status.defs.hh
+	  (1.19), Status.inlines.hh (1.9), Status.types.hh (1.3),
+	  Variable.defs.hh (1.21), Variable.inlines.hh (1.10),
+	  Variable.types.hh (1.3): Multiple inclusion guards properly
+	  commented.
+
+2002-08-11 Sunday 15:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/ppl_c.h (1.39), Prolog/XSB/ppl_xsb.cc (1.6),
+	  Prolog/YAP/ppl_yap.cc (1.41): Comment the closing brace of
+	  `extern "C"' blocks.
+
+2002-08-11 Sunday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.61), Constraint.defs.hh (1.66),
+	  GenSys.defs.hh (1.75), Generator.defs.hh (1.71), Integer.defs.hh
+	  (1.5), Interval.defs.hh (1.5), LinExpression.defs.hh (1.48),
+	  Matrix.defs.hh (1.29), Poly_Con_Relation.defs.hh (1.10),
+	  Poly_Gen_Relation.defs.hh (1.9), Polyhedron.defs.hh (1.133),
+	  Row.defs.hh (1.51), SatMatrix.defs.hh (1.20), SatRow.defs.hh
+	  (1.16), Status.defs.hh (1.18), Variable.defs.hh (1.20):
+	  Namespace-level indentation fixed.
+
+2002-08-11 Sunday 15:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.5): Add rules concerning block closures and
+	  namespace indentation.
+
+2002-08-11 Sunday 11:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.4), Determinate.inlines.hh (1.5),
+	  PowerSet.defs.hh (1.7), PowerSet.inlines.hh (1.8): Added methods
+	  add_dimensions_and_project(), add_dimensions_and_embed(),
+	  remove_dimensions(), and remove_higher_dimensions().
+
+2002-08-10 Saturday 19:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.57), interfaces/C/Makefile.am (1.11),
+	  src/Makefile.am (1.48): Bump version numbers.
+
+2002-08-10 Saturday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/.cvsignore (1.2): For those building in the sources
+	  directory.
+
+2002-08-10 Saturday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.9): Allow building in any
+	  directory (included the one containing the sources).
+
+2002-08-09 Friday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.8): Distribute also expected
+	  and expected2.
+
+2002-08-09 Friday 21:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.19), devref-browse.doxyconf-latex.in (1.21),
+	  devref-print.doxyconf-latex.in (1.21), devref.doxyconf-html.in
+	  (1.22), user-browse.doxyconf-latex.in (1.13),
+	  user-print.doxyconf-latex.in (1.13), user.doxyconf-html.in
+	  (1.15): Transition to Doxygen 1.2.17 completed.
+
+2002-08-08 Thursday 08:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/.cvsignore (1.6): Ignore also the newly added tests.
+
+2002-08-07 Wednesday 23:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: .cvsignore (1.2), Makefile.am (1.7):
+	  Support building in the sources' directory.
+
+2002-08-07 Wednesday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: Makefile.am (1.6), expected2 (1.1): XSB
+	  interface now fully operational.
+
+2002-08-07 Wednesday 19:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: Makefile.am (1.5), expected (1.1),
+	  ppl_xsb.cc (1.5), xsb_clpq.P (1.3), xsb_clpq2.P (1.1): Bug fixed.
+	  Tests with clpq.pl now working.
+
+2002-08-07 Wednesday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.4): Improve the `make check'
+	  mechanism.
+
+2002-08-07 Wednesday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.3): MOSTLYCLEANFILES
+	  integrated.
+
+2002-08-07 Wednesday 11:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_clpq.P (1.2): Unneeded parentheses
+	  removed.
+
+2002-08-07 Wednesday 11:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: Makefile.am (1.2), xsb_clpq.P (1.1):
+	  Towards a working XSB interface.
+
+2002-08-06 Tuesday 19:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.38): Better comment for the closing
+	  #endif of the multiple inclusion guard.
+
+2002-08-06 Tuesday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.4): Wrong initializations
+	  fixed.
+
+2002-08-06 Tuesday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.3): Try to get around bugs in
+	  XSB 2.5 foreign language interface (several foreign language
+	  interface functions do not properly dereference their arguments).
+
+2002-08-05 Monday 17:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.5), AskTell.inlines.hh (1.6),
+	  PowerSet.inlines.hh (1.7): Some cleaning.
+
+2002-08-04 Sunday 18:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.4), AskTell.inlines.hh (1.5),
+	  Determinate.defs.hh (1.3), Determinate.inlines.hh (1.4),
+	  PowerSet.defs.hh (1.6), PowerSet.inlines.hh (1.6): All the
+	  entails() functions became definitely_entails() methods.  More
+	  cleaning.
+
+2002-08-04 Sunday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.3), AskTell.inlines.hh (1.4),
+	  PowerSet.defs.hh (1.5), PowerSet.inlines.hh (1.5): More cleaning.
+
+2002-08-04 Sunday 13:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/AskTell.inlines.hh (1.3), src/Determinate.defs.hh (1.2),
+	  src/Determinate.inlines.hh (1.3), src/PowerSet.defs.hh (1.4),
+	  src/PowerSet.inlines.hh (1.4), tests/mc91.cc (1.3):
+	  CS::operator*=() renamed CS::meet_assign().  CS::operator+=()
+	  renamed CS::upper_bound_assign().
+
+2002-08-04 Sunday 13:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.47), PowerSet.defs.hh (1.3),
+	  PowerSet.inlines.hh (1.3): Use the new classes also for the
+	  documentation.  The PowerSet construction is now implemented
+	  using a sequence.  PowerSet::omega_reduction() reimplemented.
+
+2002-08-03 Saturday 21:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.2), PowerSet.inlines.hh (1.2): Complete
+	  redesign started.
+
+2002-08-02 Friday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/AskTell.defs.hh (1.2), src/AskTell.inlines.hh (1.2),
+	  tests/mc91.cc (1.2): Move all code to AskTell.inlines.hh.  Minor
+	  improvements.
+
+2002-08-02 Friday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.11), exceptions2.cc (1.7), print.hh
+	  (1.10), randphull1.cc (1.2): Include <iostream>.
+
+2002-08-02 Friday 09:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.56): Check whether the Mercury compiler is
+	  installed.
+
+2002-08-01 Thursday 18:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.81), mc91.cc (1.1): Test the constraint
+	  systems' constructions with McCarthy's 91 function.
+
+2002-08-01 Thursday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.46): Activate the new constraint systems'
+	  files.
+
+2002-08-01 Thursday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh (1.2): Inclusion guard comment fixed.
+
+2002-08-01 Thursday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.1), PowerSet.inlines.hh (1.1),
+	  PowerSet.types.hh (1.1): Initial implementation for the class
+	  `PowerSet': the powerset construction on constraint systems.
+
+2002-08-01 Thursday 17:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.1), AskTell.inlines.hh (1.1),
+	  AskTell.types.hh (1.1): Initial implementation for the class
+	  `AskTell': the ask and tell construction on constraint systems.
+
+2002-08-01 Thursday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LCompare.defs.hh (1.1), LCompare.inlines.hh (1.1),
+	  LCompare.types.hh (1.1): Initial implementation for the class
+	  `LCompare': a function object for lexical comparison.
+
+2002-08-01 Thursday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.1), Determinate.inlines.hh (1.1),
+	  Determinate.types.hh (1.1): Initial implementation for the class
+	  `Determinate': it wraps a polyhedron class into a determinate
+	  constraint system interface.
+
+2002-07-30 Tuesday 11:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_4-branch.3): Update version.
+
+2002-07-30 Tuesday 11:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_4-branch.[2,4]): Mark
+	  ChangeLog.
+
+2002-07-30 Tuesday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_4-branch.3): Updated.
+
+2002-07-29 Monday 20:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING (1.2), INSTALL (1.4), config.guess (1.12), config.sub
+	  (1.11), depcomp (1.3), install-sh (1.3), missing (1.5),
+	  mkinstalldirs (1.4): Updated to the respective latest versions.
+
+2002-07-29 Monday 10:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.196): Added an assertions to
+	  add_constraints(ConSys& cs).	Also added a test for emptyness, to
+	  avoid adding constraints to a polyhedron already known to be
+	  empty.
+
+2002-07-29 Monday 07:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.21): Comment removed.
+
+2002-07-29 Monday 07:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (ppl-0_4-branch.1): Comment
+	  removed.
+
+2002-07-29 Monday 07:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_4-branch.3): Mention the fixes to
+	  Polyhedron::check_universe() and
+	  NNC_Polyhedron::NNC_Polyhedron(ConSys& cs).
+
+2002-07-29 Monday 01:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc, src/GenSys.cc, tests/universe6.cc,
+	  src/Polyhedron.cc (ppl-0_4-branch.[1,1,1,2]): The following
+	  corrections made on HEAD are now reported in the ppl-0_4-branch:
+	  - fixed a bug in ConSys/GenSys.adjust_topology_and_dimension()  -
+	  fixed a bug in Polyhedron::check_universe().
+
+2002-07-29 Monday 00:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.195): Fixed a bug in check_universe(), which
+	  was returning the wrong result when called by a zero-dim universe
+	  polyhedron.
+
+2002-07-29 Monday 00:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.39), GenSys.cc (1.58): Methods
+	  adjust_topology_and_dimension() now behave properly even on
+	  constraint/generator systems having no rows.
+
+2002-07-29 Monday 00:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/universe6.cc (1.2): Added a new test, showing two bugs:  -
+	  the first bug has to do with an invariant that was not fullfilled
+	  when creating an NNC polyehdron starting from an empty
+	  constraint system;	this bug was only visible when compiling
+	  with assertions turned on.   - the second bug was due to the fact
+	  that check_universe() returns     the wrong result when applied
+	  to a zero-dim-universe polyhedron.
+
+2002-07-28 Sunday 20:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/.cvsignore (1.1): Put under CVS control.
+
+2002-07-28 Sunday 20:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.20): Properly initialize and
+	  finalize the library.
+
+2002-07-28 Sunday 19:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.13),
+	  GNU/ppl_gprolog_sd.cc (1.8), SICStus/ppl_sicstus_sd.cc (1.24),
+	  SWI/ppl_swiprolog.cc (1.48), YAP/ppl_yap.cc (1.40): Fixed some
+	  comments and assertions.
+
+2002-07-28 Sunday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.2): Several bugs fixed.
+
+2002-07-28 Sunday 12:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_4-branch.2): Updated.
+
+2002-07-28 Sunday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (ppl-0_4-branch.1): Updated for version 0.4.1.
+
+2002-07-28 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_4-branch.2): Add news for version 0.4.1.
+
+2002-07-28 Sunday 11:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_4-branch.2): Bump version number.
+
+2002-07-28 Sunday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Integer.types.hh, Makefile.am (ppl-0_4-branch.[1,1]):
+	  Document the fact that Parma_Polyhedra_Library::Integer is a
+	  synonym for GMP's mpz_class.
+
+2002-07-24 Wednesday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.8): Ciao Prolog library
+	  renamed.
+
+2002-07-24 Wednesday 14:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Integer.types.hh (1.3), Makefile.am (1.45): Document the
+	  fact that Parma_Polyhedra_Library::Integer is a synonym for GMP's
+	  mpz_class.
+
+2002-07-23 Tuesday 18:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.70): Corrected doxygen comments to
+	  shorthands functions line, ray, point.
+
+2002-07-23 Tuesday 18:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.88): Small correction in the example of
+	  the use of an extended generator system.
+
+2002-07-22 Monday 15:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.12),
+	  GNU/ppl_gprolog_sd.cc (1.7), SICStus/ppl_sicstus_sd.cc (1.23),
+	  SWI/ppl_swiprolog.cc (1.47), YAP/ppl_yap.cc (1.39): Comments
+	  fixed.  Avoid macros with unused parameters.
+
+2002-07-22 Monday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.55), interfaces/Prolog/Makefile.am (1.19),
+	  interfaces/Prolog/XSB/Makefile.am (1.1),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.1),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.1): New Prolog interface.
+
+2002-07-22 Monday 14:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc, tests/Makefile.am, tests/polydifference2.cc
+	  (ppl-0_4-branch.[1,1,1]): The corrections of the bug identified
+	  in revisions 1.193 and 1.194 of the HEAD branch are now reported
+	  in the ppl-0_4-branch.  The same for the test that outlighted the
+	  bug.
+
+2002-07-10 Wednesday 12:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/polydifference2.cc (1.3): Don't be noisy.
+
+2002-07-10 Wednesday 12:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.194): Corrected a bug in
+	  poly_difference_assign(const Polyhedron& y).	No longer ignoring
+	  the equality constraints of `y' (the bug was affecting both C and
+	  NNC computations).
+
+2002-07-10 Wednesday 12:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/polydifference2.cc (1.2): Output improved.
+
+2002-07-10 Wednesday 11:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.193): Corrected a bug in
+	  Polyhedron::operator=(...).  When assigning to *this a polyhedron
+	  declared to be empty, we now call set_empty() to also clear the
+	  constraint and generator systems, therefore enforcing the
+	  corresponding invariant.
+
+2002-07-10 Wednesday 11:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.80), polydifference2.cc (1.1): Added a new
+	  test showing two bugs:  - the assignment operator on Polyhedron
+	  breaks the invariant saying that    an empty polyhedron has a
+	  constraint system with either no rows or    a single
+	  unsatisfiable constraint;  - the current implementation of
+	  poly_difference_assign() is wrong in	  that it disregards
+	  equality constraints.
+
+2002-07-03 Wednesday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: fake_main.pl (1.1), ppl_ciao.pl (1.20):
+	  Wrong declarations fixed (thanks to Jose Morales).  The file
+	  fake_main.pl is a kludge to convince ciaoc to produce object code
+	  (the `-c' option is broken in Ciao Prolog 1.8 #2).  Missing
+	  predicate declarations have been added.
+
+2002-07-02 Tuesday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.19): Some bugs have been
+	  fixed.
+
+2002-07-02 Tuesday 22:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.54): Version bumped: we are now in the 0.5 era.
+
+2002-07-02 Tuesday 22:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.53), interfaces/Prolog/Makefile.am (1.18): The
+	  Ciao Prolog interface has been re-enabled.
+
+2002-07-02 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.52), Watchdog/configure.ac (1.9): Shared
+	  libraries are again turned off by default.
+
+2002-07-02 Tuesday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_4-branch.1), NEWS (1.28): Cut and paste error fixed.
+
+2002-07-01 Monday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_4-branch.1): Update version.
+
+2002-07-01 Monday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_4-branch.[1,1]): Mark
+	  ChangeLog.
+
+2002-07-01 Monday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.9): Updated.
+
+2002-07-01 Monday 16:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.11), config.sub (1.10), ltmain.sh (1.5): Updated.
+
+2002-07-01 Monday 08:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.27): Updated.
+
+2002-06-30 Sunday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.4): Use the same form of headings.
+
+2002-06-30 Sunday 22:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.12): Mention the support for NNC polyhedra.  Updated
+	  for PPL 0.4.	Organization of source distributions updated.
+
+2002-06-30 Sunday 22:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/GNU/ppl_gprolog.pl (1.16): Bug fixed in
+	  limited_H79_widening_assign.
+
+2002-06-30 Sunday 21:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.15): Mention not necessarily closed convex
+	  polyhedra in the main %description.
+
+2002-06-30 Sunday 20:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: check_script (1.3), expected (1.2): Test
+	  ack.clpq with the easier query `?- ack(2, 1, Z).'.
+
+2002-06-30 Sunday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.defs.hh (1.5), Watchdog.inlines.hh (1.4):
+	  Implementation of inline functions moved to Watchdog.inlines.hh.
+
+2002-06-30 Sunday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog (1.2): This file will no longer be empty.
+
+2002-06-30 Sunday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.51), Watchdog/configure.ac (1.8): Invocations to
+	  AC_PROG_* macros repositioned.
+
+2002-06-30 Sunday 15:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.69): Friend declaration split
+	  differently.
+
+2002-06-30 Sunday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.defs.hh (1.4), Watchdog.inlines.hh (1.3): Use
+	  methods instead of friends for binary operators over Time.
+
+2002-06-30 Sunday 12:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/.cvsignore (1.4), SICStus/.cvsignore
+	  (1.4), SWI/.cvsignore (1.4), YAP/.cvsignore (1.4): Added files to
+	  be ignored.
+
+2002-06-30 Sunday 12:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/.cvsignore (1.3), GNU/.cvsignore (1.3),
+	  SICStus/.cvsignore (1.3), YAP/.cvsignore (1.3): For those
+	  building in the sources' directory.
+
+2002-06-30 Sunday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.50): Make building shared libraries the default.
+
+2002-06-29 Saturday 21:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.60), ppl_prolog.icc
+	  (1.60), Ciao/ppl_ciao.pl (1.18), GNU/ppl_gprolog.pl (1.15),
+	  SICStus/ppl_sicstus_sd.cc (1.22), SWI/ppl_swiprolog.cc (1.46),
+	  YAP/ppl_yap.cc (1.38): Added documentation for Prolog interface
+	  predicates bounds from above/below and moved definitions to
+	  follow that of is_bounded.
+
+2002-06-29 Saturday 14:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.19), ppl_prolog.icc (1.59),
+	  Ciao/ppl_ciao.pl (1.17), GNU/ppl_gprolog.pl (1.14),
+	  SICStus/ppl_sicstus_sd.cc (1.21), SWI/ppl_swiprolog.cc (1.45),
+	  YAP/ppl_yap.cc (1.37): Predicates for bounds_from_above/below
+	  added to Prolog interface.
+
+2002-06-29 Saturday 08:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.41), ppl_c.h (1.37): Added
+	  ppl_Polyhedron_bounds_from_above() and
+	  ppl_Polyhedron_bounds_from_below().
+
+2002-06-29 Saturday 08:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.192), Polyhedron.defs.hh (1.132),
+	  Polyhedron.inlines.hh (1.39): Added bool bounds_from_above(const
+	  LinExpression&) const and bool bounds_from_below(const
+	  LinExpression&) const: both are implemented in terms of the new
+	  bool bounds(const LinExpression& expr, bool from_above) const.
+
+2002-06-28 Friday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.191): Polyhedron::is_bounded() improved.
+
+2002-06-28 Friday 22:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: clpq2.pl (1.21), expected2 (1.5): Undo the
+	  changes corresponding to the last two commits of clpq2.pl and to
+	  the last commit of expected2.
+
+2002-06-28 Friday 17:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: clpq2.pl (1.20), expected2 (1.4): Updated the
+	  expected2 file to match current clpq2.pl clpq2.pl has a minor bug
+	  fixed when writing equality bindings that were not included as
+	  constraints (this does not affect the results of the
+	  check_script2).
+
+2002-06-28 Friday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: memory1.cc (1.5), timings.cc (1.2): Improved error
+	  handling.
+
+2002-06-28 Friday 09:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.4): Cleaned and improved error handling.
+
+2002-06-27 Thursday 09:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.defs.hh (1.60), src/ConSys.inlines.hh (1.22),
+	  src/GenSys.defs.hh (1.74), src/GenSys.inlines.hh (1.24),
+	  tests/NNCminimize1.cc (1.4), tests/NNCminimize2.cc (1.4),
+	  tests/NNCminimize3.cc (1.4), tests/NNCminimize4.cc (1.6): Added
+	  public method clear() to ConSys and GenSys.  Added a FIXME
+	  comment to NNCminimize* tests.
+
+2002-06-27 Thursday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.59), ConSys.inlines.hh (1.21),
+	  Constraint.defs.hh (1.65), Constraint.inlines.hh (1.37),
+	  GenSys.defs.hh (1.73), GenSys.inlines.hh (1.23),
+	  Generator.defs.hh (1.68), Generator.inlines.hh (1.34),
+	  LinExpression.defs.hh (1.47), LinExpression.inlines.hh (1.20):
+	  Added several versions of swap() to cope with the private
+	  inheritance problems caused by the departure of PPL_HIDDEN.
+
+2002-06-27 Thursday 08:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.inlines.hh (1.33): Avoid redefinition of default
+	  arguments.
+
+2002-06-26 Wednesday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.57), GenSys.defs.hh (1.72): Added
+	  std::ostream& operator<<(std::ostream&, const GenSys&) and
+	  std::istream& operator>>(std::istream&, GenSys&).
+
+2002-06-26 Wednesday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.38), ConSys.defs.hh (1.58), Matrix.cc (1.39):
+	  Added std::ostream& operator<<(std::ostream&, const ConSys&) and
+	  std::istream& operator>>(std::istream&, ConSys&).
+
+2002-06-26 Wednesday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-browse.doxyconf-latex.in (1.20),
+	  doc/devref-print.doxyconf-latex.in (1.20),
+	  doc/devref.doxyconf-html.in (1.21), interfaces/C/Makefile.am
+	  (1.10), interfaces/C/ppl_c.cc (1.40),
+	  interfaces/Prolog/Ciao/Makefile.am (1.7),
+	  interfaces/Prolog/GNU/Makefile.am (1.23),
+	  interfaces/Prolog/SICStus/Makefile.am (1.28),
+	  interfaces/Prolog/SWI/Makefile.am (1.25),
+	  interfaces/Prolog/YAP/Makefile.am (1.15), src/ConSys.defs.hh
+	  (1.57), src/Constraint.defs.hh (1.64), src/GenSys.defs.hh (1.71),
+	  src/Generator.defs.hh (1.67), src/LinExpression.defs.hh (1.46),
+	  src/Makefile.am (1.44), src/Poly_Con_Relation.defs.hh (1.9),
+	  src/Poly_Gen_Relation.defs.hh (1.8), src/ppl_filter_doxygen.sed
+	  (1.3), src/ppl_filter_install.sed (1.3): PPL_HIDDEN has gone.
+
+2002-06-26 Wednesday 18:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: ConSys.defs.hh (1.56), Constraint.defs.hh (1.63),
+	  GenSys.defs.hh (1.70): Minor improvements to comments (just
+	  English).
+
+2002-06-26 Wednesday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.defs.hh (1.66), Generator.inlines.hh (1.32),
+	  Makefile.am (1.43): Added new shorthand non-member functions for
+	  creting generators: Generator line(const LinExpression&),
+	  Generator ray(const LinExpression&), Generator point(const
+	  LinExpression&, const Integer&), Generator closure_point(const
+	  LinExpression&, const Integer&).
+
+2002-06-26 Wednesday 18:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/ppl_c.cc (1.39), Prolog/ppl_prolog.icc (1.58): Use
+	  the new static members of Generator to construct generatos.
+
+2002-06-26 Wednesday 15:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.45): Removed spurious duplicated
+	  declaration (was already commented out).
+
+2002-06-26 Wednesday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.40), Row.defs.hh (1.50), globals.cc (1.8),
+	  globals.hh (1.19): const Integer& operator*(const Constraint&,
+	  const Generator&) and const Integer& reduced_scalar_product(const
+	  Constraint&, const Generator&) moved from Row.* to globals.*.
+
+2002-06-26 Wednesday 14:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.62), Generator.cc (1.35),
+	  Generator.defs.hh (1.65), LinExpression.defs.hh (1.44),
+	  Makefile.am (1.42), Polyhedron.cc (1.190), Row.cc (1.39),
+	  Row.defs.hh (1.49): Started getting rid of preprocessing flag
+	  PPL_HIDDEN (work still in progress - build broken).
+
+2002-06-26 Wednesday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.55), GenSys.defs.hh (1.69): Input and
+	  output operator for Polyhedron made friends of ConSys and GenSys.
+
+2002-06-26 Wednesday 14:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (1.37): Comment alignment fixed.
+
+2002-06-26 Wednesday 08:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.87): Improved and corrected affine image
+	  paragraph.
+
+2002-06-25 Tuesday 16:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.86): More improvements to paragraph on
+	  affine image operations.
+
+2002-06-25 Tuesday 16:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.85): For uniformity, using \cQ instead of
+	  \cP' in the section about widening.
+
+2002-06-25 Tuesday 16:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.84): Improved the section about
+	  addition/removal of space dimensions.
+
+2002-06-25 Tuesday 16:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.131): The documentation for the swap
+	  function on Polyhedron objects now appears in the user manuals
+	  too.
+
+2002-06-25 Tuesday 15:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.types.hh (1.3): Added comments to `namespace std'.
+
+2002-06-25 Tuesday 15:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.83): Added more on an affine preimage.
+
+2002-06-25 Tuesday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/.cvsignore (1.3), src/.cvsignore (1.6), tests/.cvsignore
+	  (1.5): For those building in the sources' directory.
+
+2002-06-25 Tuesday 15:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.82): Added formal definition of the
+	  time-elapse operator.
+
+2002-06-25 Tuesday 14:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.81): Changed rows and columns round in the
+	  affine paragraph.
+
+2002-06-25 Tuesday 14:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.80), src/Polyhedron.defs.hh (1.130):
+	  Adding some references to the introduction to the documentation
+	  of operators.
+
+2002-06-25 Tuesday 14:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.19),
+	  devref-print.doxyconf-latex.in (1.19), devref.doxyconf-html.in
+	  (1.20): No longer including the second part of the introduction
+	  in the devref's manuals, since it is not up-to-date.
+
+2002-06-25 Tuesday 13:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.79): Examples added to explanation of
+	  affine image operator.
+
+2002-06-25 Tuesday 13:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.78): Started explaining the affine
+	  operators.
+
+2002-06-25 Tuesday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.77), src/Polyhedron.defs.hh (1.129): In
+	  the widening and poly-difference comments, using the \anchor
+	  doxygen command to link to a specific paragraph of the
+	  introduction.
+
+2002-06-25 Tuesday 11:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.128): A few docuemntation errors
+	  corrected.  Added a note about methods ending in _and_minimize(),
+	  to explain the menaing of their return value. From all of their
+	  brief doxygen comments, moved the corresponding sentence on their
+	  return value, which is now placed in the detailed doxygen
+	  comment, using the \return command.
+
+2002-06-25 Tuesday 11:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.76): Renamed variables in example in
+	  paragraph wrt adding dimensions.
+
+2002-06-25 Tuesday 11:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.19): Improved version of clpq2.pl:
+	  - Code formatting corrected;    - Unused predicate
+	  definitions removed;	       - Predicates renamed to match
+	  functionality;    - Much more efficient as it projects unwanted
+	  dimensions away;  - Allows input variables to bind to Herbrand
+	  terms;     - Allows integer expressions as input (eg fib(2,
+	  X+1)).
+
+2002-06-25 Tuesday 10:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.75): Added paragraphs on adding and
+	  removing dimensions.
+
+2002-06-25 Tuesday 08:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.18): More tidying of the tests.
+
+2002-06-25 Tuesday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.49): Version number bumped.
+
+2002-06-25 Tuesday 08:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: ConSys.cc (1.36), Generator.defs.hh (1.64), Polyhedron.cc
+	  (1.189), Polyhedron.defs.hh (1.127), conversion.cc (1.29): In all
+	  files, changed reference to Introduction to the relevant section.
+	  In Polyhedron.defs.hh:   - A few minor changes to English
+	  expressions.	 - An x_1 changed to y.
+
+2002-06-25 Tuesday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.26), doc/definitions.dox (1.74), interfaces/C/ppl_c.cc
+	  (1.38), interfaces/C/ppl_c.h (1.36),
+	  interfaces/Prolog/Prolog_interface.dox (1.59),
+	  interfaces/Prolog/pl_check.pl (1.17),
+	  interfaces/Prolog/ppl_prolog.icc (1.57),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.16),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.13),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.20),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.44),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.36), src/Polyhedron.cc
+	  (1.188), src/Polyhedron.defs.hh (1.126), tests/.cvsignore (1.4),
+	  tests/Makefile.am (1.79), tests/exceptions1.cc (1.10),
+	  tests/h79widening1.cc (1.1), tests/h79widening2.cc (1.1),
+	  tests/h79widening3.cc (1.1), tests/limitedh79widening1.cc (1.1),
+	  tests/limitedh79widening2.cc (1.1), tests/limitedwideningcc921.cc
+	  (1.2), tests/limitedwideningcc922.cc (1.2), tests/permute.cc
+	  (1.18), tests/wideningcc921.cc (1.3), tests/wideningcc922.cc
+	  (1.3), tests/wideningcc923.cc (1.2): The widening is now called
+	  H79 not to confuse the user.
+
+2002-06-25 Tuesday 06:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.14): %files section for gprolog package fixed.
+
+2002-06-24 Monday 23:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.13): %files section fixed for the yap package.
+
+2002-06-24 Monday 22:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.14): Do not forget
+	  yap_clpq2.pl.
+
+2002-06-24 Monday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.58): Should now contain
+	  all the information need to use the Prolog interface.
+
+2002-06-24 Monday 18:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.187), Polyhedron.defs.hh (1.125): The
+	  detailed comments about class Polyhedron improved.  Better
+	  marking the start of detailed doxygen sections in the
+	  documentation of Polyhedron methods (using /*! ... */ instead of
+	  multi-line //!).  Adjusted a couple of old comments saying that
+	  the return value of minimize() was `true' when the polyhedron is
+	  found to be empty.
+
+2002-06-24 Monday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.22): Added definitions for
+	  libppl_gprolog_la_LIBADD and libppl_gprolog_la_LDFLAGS.
+
+2002-06-24 Monday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.12): The %files sections of each package are now
+	  complete.
+
+2002-06-24 Monday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.57): Dealt with the
+	  issue of initialization and finalization.
+
+2002-06-24 Monday 17:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.21): Install also
+	  ppl_gprolog.pl.
+
+2002-06-24 Monday 17:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.56): Reorganization
+	  started.
+
+2002-06-24 Monday 15:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.25), STANDARDS (1.3): Minor spelling/grammar corrections.
+
+2002-06-24 Monday 15:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.124), Polyhedron.inlines.hh (1.38):
+	  Adding short doxygen comment to Polyhedron related functions.
+
+2002-06-24 Monday 14:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.2): Sketching the first rules to obtain a somewhat
+	  standard Doxygen documentation style.
+
+2002-06-24 Monday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.186): Polyhedron::remove_dimensions() fixed.
+
+2002-06-24 Monday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/removedim6.cc (1.6): This test was carefully written so as
+	  to cover a bug in the library: fixed.
+
+2002-06-24 Monday 13:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.18): Final delete_Polyhedron for Q
+	  now replaced by cleanup call and by adding polyhedron Q to list
+	  of used polyhedra in head of solve_query.
+
+2002-06-24 Monday 13:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.185), Polyhedron.defs.hh (1.123): Going on
+	  enforcing new rules on doxygen comments of class Polyhedron.
+
+2002-06-24 Monday 12:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.16): Improved layout and
+	  comments.  Simplified and renamed some tests while adding others.
+
+2002-06-24 Monday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.7): Fixed typo in a comment.
+
+2002-06-24 Monday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.48): Effectively disable the
+	  interface/Prolog/Ciao directory.
+
+2002-06-24 Monday 11:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.54), GenSys.defs.hh (1.68),
+	  Generator.defs.hh (1.63): Added examples to ConSys and GenSys
+	  documentation using strict inequalities and closure points.
+	  Improved terminology note point/vertex in Generator.
+
+2002-06-24 Monday 11:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Poly_Con_Relation.defs.hh (1.8): Missing full stop added.
+
+2002-06-24 Monday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.24): Distribute also
+	  ppl_swiprolog.pl.
+
+2002-06-24 Monday 00:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.184), Polyhedron.defs.hh (1.122),
+	  Polyhedron.inlines.hh (1.37): Started uniformizing doxygen
+	  comments of class Polyehdron according to new rules.
+
+2002-06-24 Monday 00:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.inlines.hh (1.20), GenSys.inlines.hh (1.22),
+	  LinExpression.inlines.hh (1.19), Row.inlines.hh (1.27),
+	  SatMatrix.inlines.hh (1.13), SatRow.inlines.hh (1.16): Relating
+	  std::swap functions to the corresponding classes.
+
+2002-06-23 Sunday 22:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.48): Surrounding the   #define
+	  EXTRA_NORMALIZATION 0 with   #ifndef EXTRA_NORMALIZATION.
+
+2002-06-23 Sunday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.55), ppl_prolog.icc
+	  (1.56), Ciao/ppl_ciao.cc (1.11), GNU/ppl_gprolog_sd.cc (1.6),
+	  SICStus/ppl_sicstus_sd.cc (1.19), SWI/Makefile.am (1.23),
+	  SWI/ppl_swiprolog.cc (1.43), SWI/ppl_swiprolog.pl (1.1),
+	  YAP/Makefile.am (1.13), YAP/ppl_yap.cc (1.35): Avoid unnecessary
+	  differences in the implementation of the various Prolog
+	  interfaces.  Hook ppl_Prolog_sysdep_deinit() added.
+
+2002-06-23 Sunday 22:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.35), ConSys.defs.hh (1.53), GenSys.cc (1.56),
+	  Matrix.cc (1.38), Matrix.defs.hh (1.28), Matrix.inlines.hh
+	  (1.24): Fixed doxygen comments in class Matrix.  Changed raw
+	  output methods get() and print() to also read/write information
+	  about topology. Changed the corresponding methods of ConSys and
+	  GenSys so that they no longer output this information.
+
+2002-06-23 Sunday 18:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.28), Generator.cc (1.34): Using flag
+	  EXTRA_NORMALIZATION instead of STRONG_NORMALIZATION.
+
+2002-06-23 Sunday 18:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Init.defs.hh (1.3): Added short doxygen comment to class
+	  Init.
+
+2002-06-23 Sunday 18:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.183), tests/timeelapse5.cc (1.2):
+	  Implementation of time_elapse corrected and cleaned.	The test
+	  timeelapse5 corrected according to the new specification.
+
+2002-06-23 Sunday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.17): The Ciao-Prolog interface
+	  will not be included in PPL 0.4.
+
+2002-06-23 Sunday 15:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: Makefile.am (1.12), ppl_yap.cc (1.34),
+	  yap_clpq.pl (1.5), yap_clpq2.pl (1.1): The YAP interface is now
+	  complete and running.
+
+2002-06-22 Saturday 11:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Topology.hh (1.5): Nothing (apart comments) should follow
+	  #endif.
+
+2002-06-22 Saturday 08:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.hh (1.18): Long comment for class Throwable improved.
+	  Function maybe_abandon() related to class Throwable.
+
+2002-06-22 Saturday 08:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Poly_Con_Relation.defs.hh (1.7), Poly_Gen_Relation.defs.hh
+	  (1.7): Comments of *_Relation classes adapted to new doxygen
+	  rules.
+
+2002-06-21 Friday 23:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.52), GenSys.defs.hh (1.67),
+	  Generator.defs.hh (1.62), Topology.hh (1.4): Adapted doxygen
+	  comments of classes ConSys and GenSys to the new style.  Added
+	  short description for the enumeration Topology (in the devref
+	  manual).
+
+2002-06-21 Friday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.35): No longer use __BEGIN_DECLS and
+	  __END_DECLS (so as not to provoke pollution).  Use a brief only
+	  description for the opaque pointers.	Undefine
+	  PPL_TYPE_DECLARATION as soon as we are done with it.
+	  Documentation for all the *_OK() functions improved: they do not
+	  always make noise (if the compilation was done with NDEBUG
+	  defined, they do not make any noise).
+
+2002-06-21 Friday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Polyhedron.defs.hh (1.11): Alignment fixed in a comment.
+
+2002-06-21 Friday 19:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.27), Constraint.defs.hh (1.61),
+	  Constraint.inlines.hh (1.36), Generator.defs.hh (1.61),
+	  LinExpression.defs.hh (1.43): Documentation of classes
+	  LinExpression, Constraint and Generator adapted to the new
+	  doxygen rules.
+
+2002-06-21 Friday 19:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.10), NNC_Polyhedron.defs.hh (1.14):
+	  Avoiding repetitions due to REPEAT_BRIEF = YES.
+
+2002-06-21 Friday 19:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.18),
+	  devref-print.doxyconf-latex.in (1.18), devref.doxyconf-html.in
+	  (1.19), user-browse.doxyconf-latex.in (1.12),
+	  user-print.doxyconf-latex.in (1.12), user.doxyconf-html.in
+	  (1.14): Changed doxygen configuration files so that brief
+	  comments are always repeated at the beginning of long comments
+	  (REPEAT_BRIEF = YES).
+
+2002-06-21 Friday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.9), NNC_Polyhedron.defs.hh (1.13):
+	  For classes C_Polyhedron and NNC_Polyhedron, adopting the new
+	  doxygen standards about brief/long comments.
+
+2002-06-21 Friday 15:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.27), Row.inlines.hh (1.26): Non-friend
+	  but related functions should have the \relates special doxygen
+	  command.
+
+2002-06-21 Friday 15:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/SatRow.cc (1.9): As things are now, doxygen comments to
+	  friend functions should not have the \relates special command.
+
+2002-06-21 Friday 09:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.47): Use C to test the presence and usability of
+	  <glpk.h>.  Use the new style AC_LANG(LANGUAGE) macro.
+
+2002-06-21 Friday 08:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.20): Additions
+	  MOSTLYCLEANFILES.
+
+2002-06-20 Thursday 22:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.54),
+	  track_allocation.hh (1.6): Prolog allocation tracking properly
+	  reimplemented.
+
+2002-06-20 Thursday 22:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.17): Singleton variable renamed so
+	  as to disable the corresponding warning.
+
+2002-06-20 Thursday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.cc (1.2): Do not redefine the default arguments.
+
+2002-06-20 Thursday 21:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.73): A few improvements in the first
+	  paragraph of the introduction.  Better explained what a preimage
+	  is and some chnages to the paragraph on the DD method.
+
+2002-06-20 Thursday 21:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Row.cc (1.38), Row.defs.hh (1.47), Row.inlines.hh (1.25),
+	  SatMatrix.cc (1.17), SatMatrix.defs.hh (1.19),
+	  SatMatrix.inlines.hh (1.12), SatRow.cc (1.8), SatRow.defs.hh
+	  (1.15), SatRow.inlines.hh (1.15), Status.defs.hh (1.17): Added
+	  \relates doxygen commands to match related function declarations
+	  and definitions.
+
+2002-06-20 Thursday 13:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.72): Reordered the bibliography to be
+	  alphabetical.  Changed the syntax in Bounded Polyhedra.  Moved
+	  Rational Polyhedra to end of section on representations (it needs
+	  the definition of constraint representation).  Comment in
+	  Generators Representation wrt this moved to the Rational one.
+	  Small change of wording to Points... paragraph.
+
+2002-06-20 Thursday 13:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.53): Corrected the
+	  grammar rules for Rational and made other changes related to
+	  this.
+
+2002-06-20 Thursday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.37): Functions dealing with closure
+	  points and strict inequalities were still commented out: fixed.
+
+2002-06-20 Thursday 12:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.52): Improvements to
+	  grammar rules.  List_of_Constraints and List_of_Generators now
+	  specified formally as Constraint_System and Generator_System.
+
+2002-06-20 Thursday 12:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.51): Improved
+	  description of "relation with" predicates.
+
+2002-06-20 Thursday 11:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.50): In the grammar
+	  rules Numerator and Denominator are non-terminals and should
+	  start with capitals.
+
+2002-06-20 Thursday 11:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.49): Many improvements,
+	  including: Where comments were repeated elswhere (ie
+	  compatibility rules) they have been removed.	Where possible,
+	  references to relevant sections in the introduction have been
+	  made.  Grammar rule for Relation added.
+
+2002-06-20 Thursday 11:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.71): Improved the paragraph on topological
+	  compatibility.
+
+2002-06-20 Thursday 09:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.16): Cleaned up previous changes.
+
+2002-06-20 Thursday 08:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.15): Revised the way unwanted
+	  polyhedron are removed.  It has not been checked yet for leaks.
+
+2002-06-20 Thursday 08:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.14): PPL is the right acronym in
+	  normal text.
+
+2002-06-20 Thursday 08:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/expected2 (1.3): Corrected with the right
+	  results.
+
+2002-06-20 Thursday 07:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.13): Bug fixed and I hope the
+	  variable ordering is now stable so that the constraints are
+	  presented uniformly in all Prologs.
+
+2002-06-19 Wednesday 23:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.60), Generator.defs.hh (1.60),
+	  Generator.inlines.hh (1.31), Variable.defs.hh (1.19): Using the
+	  \relates doxygen special command to have non-member and
+	  non-friend functions listed in the related classes.
+
+2002-06-19 Wednesday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.55), track_allocation.hh
+	  (1.5): Leave the responsibility of TRACK_ALLOCATION to
+	  track_allocation.hh.
+
+2002-06-19 Wednesday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.12): A couple of trivial formatting
+	  changes.
+
+2002-06-19 Wednesday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.20), STANDARDS (1.1): The `STANDARDS' file will
+	  contain a description of our coding standards.
+
+2002-06-19 Wednesday 20:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: clpq.pl (1.12), clpq2.pl (1.11): Use a
+	  uniform coding style.
+
+2002-06-19 Wednesday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.19): Use the 2nd CLP(Q)
+	  interpreter for regression testing.
+
+2002-06-19 Wednesday 18:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.22): Fixed the dependencies
+	  of the `check-local' target.
+
+2002-06-19 Wednesday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.10): Fixed calls meant to be to
+	  ppl_delete_Polyhedron/1.
+
+2002-06-19 Wednesday 18:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: expected2 (1.2), check_script2 (1.2):
+	  Trailing blank line removed.
+
+2002-06-19 Wednesday 17:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.48): Many ongoing
+	  changes.
+
+2002-06-19 Wednesday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.16): Distributes also
+	  check_script2 and expected2.
+
+2002-06-19 Wednesday 16:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.47): Corrected a typo
+	  in the first paragraph about the SICStus Prolog interface.
+
+2002-06-19 Wednesday 16:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.34): Corrected a typo in the
+	  documentation of PPL_CONSTRAINT_TYPE_GREATER_THAN.
+
+2002-06-19 Wednesday 16:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Variable.defs.hh (1.18): Adjusted comment about the
+	  constructor.
+
+2002-06-19 Wednesday 16:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.70): Improvements to the space dimension
+	  and the relation with paragraphs.
+
+2002-06-19 Wednesday 15:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.121), globals.hh (1.17): Added a
+	  short description for class Throwable.  Corrected a typo in
+	  comment for remove_dimensions.
+
+2002-06-19 Wednesday 15:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.69): Bounding box paragraph improved a
+	  little.
+
+2002-06-19 Wednesday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.68): Corrected spurious uses of the macro
+	  \mathord.  Some improvements in the paragraph on bounding boxes:
+	  the standard notation for the i-th vector of the canonical base
+	  is \vect{e}_i.
+
+2002-06-19 Wednesday 14:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.67): Changes to relation-wirh and widening
+	  paragraphs.
+
+2002-06-19 Wednesday 14:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sp_clpq.pl (1.7): Import append/3 and
+	  member/2 from library(lists).
+
+2002-06-19 Wednesday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.9): Avoid defining append/3 and
+	  member/2, since they are defined as built-ins or provided as
+	  library predicates by any supported Prolog implementation
+	  (SWI-Prolog seems to be annoyed if a user program tries to
+	  redefine them).
+
+2002-06-19 Wednesday 14:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.4): Upgraded from the CVS version of libtool.
+
+2002-06-19 Wednesday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.27), sp_clpq.pl (1.6):
+	  Use the 2nd CLP(Q) interpreter for regression testing.
+
+2002-06-19 Wednesday 14:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.15): Distribute also the tests
+	  for strict inequalities.
+
+2002-06-19 Wednesday 14:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.66): Changes in the paragraph on the
+	  relation-with operators.
+
+2002-06-19 Wednesday 13:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/Makefile.am (1.18), SWI/Makefile.am
+	  (1.21): Use the configured version of libtool.
+
+2002-06-19 Wednesday 11:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.46): Changed the
+	  description for the assignment predicates.
+
+2002-06-19 Wednesday 11:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.65): A first draft for a paragraph on the
+	  relation-with operators.
+
+2002-06-19 Wednesday 10:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.64): Using the macro \nonnegRset in the
+	  paragraph defiing extreme rays.
+
+2002-06-19 Wednesday 10:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.63), ppl.sty (1.10): Some improvements
+	  in the introduction. Redefined the command \vec following
+	  llncs.cls.
+
+2002-06-19 Wednesday 08:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.45), pl_check.pl
+	  (1.15), ppl_prolog.icc (1.54), Ciao/ppl_ciao.pl (1.15),
+	  GNU/ppl_gprolog.pl (1.12), SICStus/ppl_sicstus_sd.cc (1.18),
+	  SWI/ppl_swiprolog.cc (1.42), YAP/ppl_yap.cc (1.33): Predicates
+	  ppl_Polyhedron_topological_closure_assign and
+	  ppl_Polyhedron_is_topologically_closed added.
+
+2002-06-19 Wednesday 08:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.36), interfaces/C/ppl_c.h (1.33),
+	  src/Polyhedron.defs.hh (1.120): Added topological closure test
+	  and assignment to the C interface.
+
+2002-06-19 Wednesday 07:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/schedule.clpq (1.3): Use a uniform syntax.
+
+2002-06-19 Wednesday 07:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.11): Checking mechanism
+	  fixed (but still commented out).
+
+2002-06-19 Wednesday 07:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: check_script2 (1.1), expected2 (1.1),
+	  SWI/Makefile.am (1.20): Test also with clpq2.pl.
+
+2002-06-19 Wednesday 07:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: clpq.pl (1.11), clpq2.pl (1.8): Improved the
+	  query for more solutions.
+
+2002-06-18 Tuesday 18:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.14): Use
+	  use_foreign_library/1 instead of use_foreign_source/1.
+
+2002-06-18 Tuesday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.53): Indentation fixed.
+
+2002-06-18 Tuesday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.13): Declarations
+	  completed.
+
+2002-06-18 Tuesday 17:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.62): Corrected a typo in the definition of
+	  closed polyhedra.  Improved the paragraph on dimension
+	  compatibility to make it independent from th epolyhedra topology.
+
+2002-06-18 Tuesday 15:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.7): Just a little more robust in
+	  that it fails if there are variables in non-integer positions in
+	  a query rather than crashing.
+
+2002-06-18 Tuesday 15:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.14): Tidied the tests on
+	  bounding boxes.
+
+2002-06-18 Tuesday 14:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.44), pl_check.pl
+	  (1.13), ppl_prolog.icc (1.52), Ciao/ppl_ciao.pl (1.12),
+	  GNU/ppl_gprolog.pl (1.11), SICStus/ppl_sicstus_sd.cc (1.17),
+	  SWI/ppl_swiprolog.cc (1.41), YAP/ppl_yap.cc (1.32):
+	  ppl_new_Polyhedron_from_ConSys and ppl_new_Polyhedron_from_GenSys
+	  renamed ppl_new_Polyhedron_from_constraints and
+	  ppl_new_Polyhedron_from_generators, respectively.
+
+2002-06-18 Tuesday 12:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.61): Added a preamble based on the ppl
+	  home web page.
+
+2002-06-18 Tuesday 12:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.60): Reorganised the introductory
+	  sections.
+
+2002-06-18 Tuesday 11:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.inlines.hh (1.35): Corrected a trivial bug just
+	  introduced in   Constraint operator>(const LinExpression& e1,
+	  const LinExpression& e2).
+
+2002-06-18 Tuesday 10:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/schedule.clpq (1.2): Improved layout.
+
+2002-06-18 Tuesday 10:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: clpq2.pl (1.6), schedule.clpq (1.1): clpq2.pl
+	  now allows Herbrand terms as arguments including lists.
+	  schedule.clpq tests the strict inequalities in clpq2.pl
+
+2002-06-18 Tuesday 10:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.inlines.hh (1.34): Avoiding the creation of
+	  temporaries in   Constraint operator>(const LinExpression& e1,
+	  const LinExpression& e2)   Constraint operator>(const Integer& n,
+	  const LinExpression& e)   Constraint operator>(const
+	  LinExpression& e, const Integer& n).
+
+2002-06-18 Tuesday 08:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.59): Paragraph for widening improved.
+	  Paragraph for time-elapse added (just a reference to the 1997
+	  Halbwachs paper).
+
+2002-06-18 Tuesday 07:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.31): Code for testing YAP
+	  exceptions temporarily included.
+
+2002-06-18 Tuesday 00:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.182), Polyhedron.defs.hh (1.119): Private
+	  methods strongly_minimize* now return a boolean which is false if
+	  the result is an empty polyhedron (this is consistent with the
+	  behavior of private method minimize()).  Patched method
+	  widening_CC92_assign() to also work for NNC polyhedra.
+
+2002-06-17 Monday 23:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: Makefile.am (1.10), ppl_yap.pl (1.5),
+	  yap_clpq.pl (1.4): Some progress in the support for YAP.
+
+2002-06-17 Monday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.37), Row.defs.hh (1.46), Row.inlines.hh (1.24):
+	  The NDEBUG symbol no longer changes data layout.  Now, to obtain
+	  a version of Row where each object remembers its own capacity,
+	  the macro EXTRA_ROW_DEBUG must evaluate to true (whether this
+	  capacity is tested in run-time assertions or not depends, as
+	  usual, on the NDEBUG macro not being or being defined).
+
+2002-06-17 Monday 18:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.78), wideningcc921.cc (1.2),
+	  wideningcc922.cc (1.2), wideningcc923.cc (1.1): Added a new tests
+	  showing a bug in the current implementation of
+	  widening_CC92_assign, when the arguments are NNC polyhedra.
+	  Corrected the output of the other widening tests.
+
+2002-06-17 Monday 18:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh (1.33), LinExpression.cc (1.12),
+	  LinExpression.defs.hh (1.42), LinExpression.inlines.hh (1.18):
+	  Added LinExpression& operator-=(LinExpression& e1, const
+	  LinExpression& e2), LinExpression& operator-=(LinExpression& e,
+	  const Variable& v), and LinExpression& operator-=(LinExpression&
+	  e, const Integer& n).  Useless creation of a temporary avoided
+	  thanks to the second of those.
+
+2002-06-17 Monday 17:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.58),
+	  interfaces/Prolog/Prolog_interface.dox (1.43): Added the
+	  condition that the CC92-widening requires the polyhedra to have
+	  the same topology.
+
+2002-06-17 Monday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.23): We now have complete support for bounding boxes.
+	  List a couple of pending efficiency issues.
+
+2002-06-17 Monday 17:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.57), interfaces/C/ppl_c.h (1.32),
+	  interfaces/Prolog/Prolog_interface.dox (1.42), src/Polyhedron.cc
+	  (1.181), src/Polyhedron.defs.hh (1.118): Added a draft paragraph
+	  about widening (and CC92-widening) to definitions.dox.  Replaced
+	  "widening" by CC92-widening" in the comments about the widening
+	  operators.
+
+2002-06-17 Monday 16:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.55), Polyhedron.cc (1.180): All the FIXME's in
+	  Polyhedron.cc and GenSys.cc transformed into TODO's, since they
+	  were just place-holders for possible performance improvements.
+
+2002-06-17 Monday 16:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.35), ppl_c.h (1.31): Added interfaces
+	  function for the copy constructors of classes Constraint and
+	  Generators and for the constructors of a LinExpression from a
+	  Constraint/Generator.
+
+2002-06-17 Monday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog.pl (1.10): The two widening
+	  predicates have been renamed.
+
+2002-06-17 Monday 15:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.24), interfaces/C/ppl_c.cc (1.34), interfaces/C/ppl_c.h
+	  (1.30), interfaces/Prolog/Prolog_interface.dox (1.41),
+	  interfaces/Prolog/pl_check.pl (1.12),
+	  interfaces/Prolog/ppl_prolog.icc (1.51),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.11),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.16),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.40),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.30), src/Polyhedron.cc
+	  (1.179), src/Polyhedron.defs.hh (1.117), tests/.cvsignore (1.3),
+	  tests/Makefile.am (1.77), tests/exceptions1.cc (1.9),
+	  tests/limitedwidening1.cc (1.8), tests/limitedwidening2.cc (1.5),
+	  tests/limitedwideningcc921.cc (1.1),
+	  tests/limitedwideningcc922.cc (1.1), tests/permute.cc (1.17),
+	  tests/widening1.cc (1.5), tests/widening2.cc (1.3),
+	  tests/wideningcc921.cc (1.1), tests/wideningcc922.cc (1.1):
+	  Widening methods, functions and test programs renamed so as to
+	  make clear that (currently) our widenings are extensions of the
+	  one proposed in the PLILP'92 paper by Cousot & Cousot.
+
+2002-06-17 Monday 13:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.29): Added comment to functions building
+	  polyhedra from bounding boxes.
+
+2002-06-17 Monday 12:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq.pl (1.10): clpq.pl only uses C polyhedron
+	  again.
+
+2002-06-17 Monday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.8), NNC_Polyhedron.defs.hh (1.12),
+	  Polyhedron.defs.hh (1.116), globals.hh (1.16): Added
+	  documentation for constructor of C_ and NNC_ polyhedra out of a
+	  bounding box.  The comment on the C_Polyhedron destructor is now
+	  a proper doxygen comment.  Added a short description doc for
+	  struct FromBoundingBox to avoid cluttering the ``PPL Compound
+	  List'' page.
+
+2002-06-17 Monday 11:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.41): Corrected typo in documentation
+	  of   explicit LinExpression(const Generator& g);
+
+2002-06-17 Monday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.115): Improved documentation of
+	  poly_difference_assign* methods, stating that topological closure
+	  is enforced when *this is a C_Polyhedron.
+
+2002-06-17 Monday 10:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.40): Constructors of a LinExpression
+	  out of a Constraint/Generator made public.  Added a more detailed
+	  comment about the unicity of the built expression.
+
+2002-06-17 Monday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.inlines.hh (1.32): Removed FIXME's about the
+	  efficiency of row-type setting methods.
+
+2002-06-17 Monday 08:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.40), clpq.pl (1.9):
+	  clpq.pl is updated to allow for strict constraints.  Improved
+	  comments for new polyhedron predicates from consys, gensys and
+	  boxes.
+
+2002-06-17 Monday 08:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.56): Paragraphs on intervals and bounding
+	  boxes improved.
+
+2002-06-17 Monday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.cc (1.5), Watchdog.defs.hh (1.3): Use #ifdef
+	  to test configuration symbols that may be undefined or defined to
+	  1.
+
+2002-06-17 Monday 08:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.37): It is non-standard to omit the second
+	  argument of std::vector::iterator std::vector::insert(iterator
+	  position, const T& x).
+
+2002-06-17 Monday 07:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.inlines.hh (1.19), Constraint.cc (1.26),
+	  Constraint.inlines.hh (1.31), GenSys.inlines.hh (1.21),
+	  Generator.inlines.hh (1.30), LinExpression.inlines.hh (1.17),
+	  Row.defs.hh (1.45): Reduce our dependence on the PPL_HIDDEN
+	  trick.
+
+2002-06-16 Sunday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.28): Remove non-standard trailing comma.
+
+2002-06-16 Sunday 22:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh (1.30), Generator.inlines.hh (1.29),
+	  Matrix.inlines.hh (1.23), Polyhedron.inlines.hh (1.36),
+	  Row.inlines.hh (1.23): Make sure the first use of each inline
+	  function follows its definition.
+
+2002-06-16 Sunday 20:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.26): Modified SICStus
+	  interface makefile to find the ppl library even when this has not
+	  been installed yet.
+
+2002-06-16 Sunday 19:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.51), GenSys.defs.hh (1.66),
+	  LinExpression.defs.hh (1.39): Reposition friend declarations.
+	  Always put the public section before the protected one before the
+	  private one.
+
+2002-06-16 Sunday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.38): LinExpression(const
+	  Constraint&) and LinExpression(const Generator&) made private
+	  again, since they expose the library's internals.
+
+2002-06-16 Sunday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.54), Polyhedron.cc (1.178), minimize.cc
+	  (1.21), simplify.cc (1.16): No space before question mark in
+	  comments.
+
+2002-06-16 Sunday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: generators1.cc (1.6), generators2.cc (1.3): Include
+	  <stdexcept>.
+
+2002-06-16 Sunday 17:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.25), Constraint.inlines.hh (1.29),
+	  Polyhedron.cc (1.177): Removed CHECKME comments from a few
+	  methods of classes Constraint and Polyhedron. A few FIXME changed
+	  to CHECKME.
+
+2002-06-16 Sunday 17:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.cc (1.2): Replace `and' by `&&'.
+
+2002-06-16 Sunday 17:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.defs.hh (1.2), BoundingBox.inlines.hh (1.3),
+	  C_Polyhedron.defs.hh (1.7), ConSys.defs.hh (1.50),
+	  Constraint.defs.hh (1.59), GenSys.defs.hh (1.65),
+	  Generator.defs.hh (1.59), Init.defs.hh (1.2), Integer.defs.hh
+	  (1.4), Interval.defs.hh (1.4), LinExpression.defs.hh (1.37),
+	  Matrix.defs.hh (1.26), NNC_Polyhedron.defs.hh (1.11),
+	  Poly_Con_Relation.defs.hh (1.6), Poly_Gen_Relation.defs.hh (1.6),
+	  Polyhedron.defs.hh (1.114), Row.defs.hh (1.44), SatMatrix.defs.hh
+	  (1.18), SatRow.defs.hh (1.14), Status.defs.hh (1.16),
+	  Variable.defs.hh (1.17): Use uniform guards against multiple
+	  inclusion.  Include Interval.defs.hh in BoundingBox.defs.hh.
+
+2002-06-16 Sunday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.inlines.hh (1.22), SatRow.inlines.hh (1.14): Fully
+	  qualify `vector' as `std::vector'.
+
+2002-06-16 Sunday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Polyhedron.cc (1.3), interfaces/C/ppl_c.cc (1.33): Include
+	  <stdexcept>.
+
+2002-06-16 Sunday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.inlines.hh (1.28), Integer.inlines.hh (1.4),
+	  LinExpression.defs.hh (1.36), LinExpression.inlines.hh (1.16):
+	  Remove unnecessary include files and add some necessary one.
+
+2002-06-16 Sunday 16:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.inlines.hh (1.2), C_Polyhedron.inlines.hh
+	  (1.6), ConSys.inlines.hh (1.18), Constraint.inlines.hh (1.28),
+	  GenSys.inlines.hh (1.20), Generator.inlines.hh (1.27),
+	  Init.inlines.hh (1.2), Integer.inlines.hh (1.3),
+	  LinExpression.inlines.hh (1.15), Matrix.inlines.hh (1.22),
+	  NNC_Polyhedron.inlines.hh (1.8), Poly_Con_Relation.inlines.hh
+	  (1.6), Poly_Gen_Relation.inlines.hh (1.6), Polyhedron.inlines.hh
+	  (1.35), Row.inlines.hh (1.21), SatMatrix.inlines.hh (1.11),
+	  SatRow.inlines.hh (1.13), Status.inlines.hh (1.8),
+	  Variable.inlines.hh (1.9): Guard against multiple inclusion.
+
+2002-06-16 Sunday 16:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.49), GenSys.defs.hh (1.64),
+	  LinExpression.defs.hh (1.35), Matrix.defs.hh (1.25),
+	  Variable.defs.hh (1.16): Avoid being pedantic when commenting
+	  constructors.
+
+2002-06-16 Sunday 15:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.48), GenSys.defs.hh (1.63): All the OK()
+	  methods must be public.
+
+2002-06-16 Sunday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-browse.doxyconf-latex.in (1.17),
+	  doc/devref-print.doxyconf-latex.in (1.17),
+	  doc/devref.doxyconf-html.in (1.18), interfaces/C/Makefile.am
+	  (1.9), interfaces/Prolog/Ciao/Makefile.am (1.6),
+	  interfaces/Prolog/GNU/Makefile.am (1.17),
+	  interfaces/Prolog/SICStus/Makefile.am (1.25),
+	  interfaces/Prolog/SWI/Makefile.am (1.19),
+	  interfaces/Prolog/YAP/Makefile.am (1.9), src/ConSys.defs.hh
+	  (1.47), src/Constraint.defs.hh (1.58), src/GenSys.defs.hh (1.62),
+	  src/Generator.defs.hh (1.58), src/LinExpression.defs.hh (1.34),
+	  src/Makefile.am (1.41), src/Polyhedron.defs.hh (1.113),
+	  src/Row.defs.hh (1.43), src/ppl_filter_doxygen.sed (1.2),
+	  src/ppl_filter_install.sed (1.2): PPL_INTERNAL has gone: replaced
+	  with `private' everywhere.
+
+2002-06-16 Sunday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.24), sp_clpq.pl (1.5):
+	  Simplify `make check' in the SICStus directory and solve a `make
+	  distcheck' problem.
+
+2002-06-16 Sunday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.16): Generation of gp_clpq
+	  fixed.
+
+2002-06-16 Sunday 00:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.50), src/ConSys.cc (1.34),
+	  src/ConSys.defs.hh (1.46), src/ConSys.inlines.hh (1.17),
+	  src/Constraint.defs.hh (1.57), src/GenSys.cc (1.53),
+	  src/GenSys.defs.hh (1.61), src/GenSys.inlines.hh (1.19),
+	  src/Generator.defs.hh (1.57), src/LinExpression.defs.hh (1.33),
+	  src/Makefile.am (1.40), src/Polyhedron.defs.hh (1.112),
+	  src/Polyhedron.inlines.hh (1.34): Phasing out PPL_INTERNAL.
+
+2002-06-15 Saturday 18:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: memory1.cc (1.3), watchdog1.cc (1.8): Be quiet.
+
+2002-06-15 Saturday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.32), interfaces/Prolog/ppl_prolog.icc
+	  (1.49), src/C_Polyhedron.defs.hh (1.6),
+	  src/C_Polyhedron.inlines.hh (1.5), src/ConSys.defs.hh (1.45),
+	  src/Constraint.defs.hh (1.56), src/GenSys.defs.hh (1.60),
+	  src/NNC_Polyhedron.defs.hh (1.10), src/NNC_Polyhedron.inlines.hh
+	  (1.7), tests/boundingbox2.cc (1.7): Start replacing our ad hoc
+	  protection mechanisms with friendship.  Got around the GCC bug
+	  described in http://gcc.gnu.org/bugs.html#known by exchanging the
+	  order of arguments in the constructors from bounding boxes of
+	  C_Polyhedron and NNC_Polyhedron.  The test program
+	  boundingbox2.cc has been cleaned up consequently.
+
+2002-06-15 Saturday 17:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.3): Revert previous change: the CVS version of
+	  libtool causes more problems than it solves.
+
+2002-06-15 Saturday 17:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.76): Always distribute the sources for
+	  watchdog1.
+
+2002-06-15 Saturday 16:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.2), missing (1.4): Updated to the CVS version of
+	  libtool.
+
+2002-06-15 Saturday 14:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.6): For those building in the sources' directory.
+
+2002-06-15 Saturday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.5): dist-hook goes into the unconditional
+	  section.
+
+2002-06-15 Saturday 14:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.75): Always distribute $(watchdog1_SOURCES).
+
+2002-06-15 Saturday 14:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/.cvsignore (1.3), tests/.cvsignore (1.2):
+	  For those building in the sources' directory.
+
+2002-06-15 Saturday 13:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: NNC_Polyhedron.cc (1.9), NNC_Polyhedron.defs.hh (1.9),
+	  Polyhedron.cc (1.176): Corrected method
+	  Polyhedron::limited_widening_assign to work with NNC polyehdra.
+	  Removed the overriding method from NNC_Polyhedron.
+
+2002-06-15 Saturday 13:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.55): Added comment for
+	  construct_eps_geq_zero().
+
+2002-06-15 Saturday 12:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/.cvsignore (1.2), GNU/.cvsignore (1.2),
+	  SWI/.cvsignore (1.2), YAP/.cvsignore (1.2), YAP/ppl_yap.cc
+	  (1.29), YAP/yap_clpq.pl (1.3): Minor changes to YAP support.
+	  Changes for those building in the sources' directory.
+
+2002-06-15 Saturday 12:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.23): Removed
+	  ppl_sicstus.pl and sp_clpq.pl from MOSTLYCLEANFILES.
+
+2002-06-14 Friday 23:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.28): Support for YAP almost
+	  completed.
+
+2002-06-14 Friday 23:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.48): Include initializer.hh.
+
+2002-06-14 Friday 23:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/initializer.hh (1.2): Added the guard against multiple
+	  inclusion.  Include Init.defs.hh.
+
+2002-06-14 Friday 20:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.44), Constraint.defs.hh (1.54),
+	  GenSys.defs.hh (1.59): Temporary kludges removed.
+
+2002-06-14 Friday 19:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.47), Ciao/Makefile.am
+	  (1.5), Ciao/ppl_ciao.cc (1.10), GNU/Makefile.am (1.15),
+	  GNU/ppl_gprolog_sd.cc (1.5), SICStus/Makefile.am (1.22),
+	  SICStus/ppl_sicstus_sd.cc (1.15), SWI/Makefile.am (1.18),
+	  SWI/ppl_swiprolog.cc (1.39), YAP/Makefile.am (1.8),
+	  YAP/ppl_yap.cc (1.27): Include the true sources.
+
+2002-06-14 Friday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.26): Prolog_raise_exception()
+	  written.
+
+2002-06-14 Friday 18:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.3), Interval.inlines.hh (1.4): Provide
+	  a copy constructor and assignment operator for ExtendedRational.
+
+2002-06-14 Friday 18:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox1.cc (1.16): Made it quiet and corrected a
+	  comment.
+
+2002-06-14 Friday 18:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: boundingbox1.cc (1.15), boundingbox2.cc (1.6): Test file
+	  boundingbox1.cc tidied.  Small changes to comments in
+	  boundingbox2.cc.
+
+2002-06-14 Friday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.cc (1.2), BoundingBox.defs.hh (1.1),
+	  BoundingBox.hh (1.7), BoundingBox.inlines.hh (1.1),
+	  BoundingBox.types.hh (1.1), Interval.defs.hh (1.2),
+	  Interval.inlines.hh (1.3), Makefile.am (1.39),
+	  Polyhedron.inlines.hh (1.33): template <class Box> void
+	  Polyhedron::shrink_bounding_box(Box&) redesigned and simplified.
+	  Many other improvements in the code for dealing with bounding
+	  boxes.
+
+2002-06-14 Friday 17:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox2.cc (1.5): Made boundingbox2.cc quiet.
+
+2002-06-14 Friday 16:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox2.cc (1.4): Some tidying of the tests.
+
+2002-06-14 Friday 14:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.55), src/Polyhedron.cc (1.175),
+	  src/Polyhedron.defs.hh (1.111): Removed strange mixing of short
+	  and detailed style doxygen comments, that was causing a warning
+	  when building the documentation.  Improved the user introduction,
+	  adding definition of poly-differences.
+
+2002-06-14 Friday 12:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.46): Added to
+	  term_to_boundary checks that the input numerator and denominator
+	  are integers and that the denominator is positive.
+
+2002-06-14 Friday 10:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.45):
+	  ppl_new_Polyhedron_from_bounding_box() fixed and simplified.
+
+2002-06-14 Friday 10:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.39): Added a short
+	  description for new_Polyhedron_from_bounding_box.
+
+2002-06-14 Friday 09:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.11), ppl_prolog.icc (1.44):
+	  Some tidying of the code for
+	  ppl_new_Polyhedron_from_bounding_box.
+
+2002-06-14 Friday 08:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox2.cc (1.3): Some bugs fixed.
+
+2002-06-13 Thursday 22:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.43): Fixed two occurrences of
+	  assignment where a test for equality was intended.
+
+2002-06-13 Thursday 16:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.42): In
+	  ppl_new_Polyhedron_from_bounding_box it now fails (ie
+	  PROLOG_FAILURE is returned) if the list is not properly
+	  terminated or it is not a list.  A few comments added to the
+	  code.
+
+2002-06-13 Thursday 16:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.10), ppl_prolog.icc (1.41),
+	  Ciao/ppl_ciao.pl (1.10), GNU/ppl_gprolog.pl (1.9),
+	  SICStus/ppl_sicstus_sd.cc (1.14), YAP/ppl_yap.cc (1.25):
+	  Completed the code for ppl_new_Polyhedron_from_bounding_box/3.
+
+2002-06-13 Thursday 14:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.38): Prepare to explain
+	  the not-so-easy situation with GNU Prolog.
+
+2002-06-13 Thursday 13:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.cc (1.1), BoundingBox.hh (1.6): Start
+	  completing the BoundingBox class.
+
+2002-06-13 Thursday 12:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: boundingbox1.cc (1.14), boundingbox2.cc (1.2): More tests
+	  added.
+
+2002-06-13 Thursday 11:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.32), tests/Makefile.am (1.74),
+	  tests/boundingbox2.cc (1.1): A bug corrected in the constructor
+	  of a Polyhedron from a Box.  Added a new test boundingbox2.
+
+2002-06-13 Thursday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BoundingBox.hh (1.5): Fixed two bugs whereby call-by-value
+	  was used instead of call-by-reference.
+
+2002-06-12 Wednesday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.38):
+	  ppl_new_Polyhedron_from_bounding_box/3 added.
+
+2002-06-12 Wednesday 17:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.40): A start in completing
+	  ppl_new_Polyhedron_from_bounding_box.
+
+2002-06-12 Wednesday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: pl_clpq.cc (1.5), ppl_pl.cc (1.5),
+	  ppl_swiprolog.cc (1.37): Also uninstall() "returns" install_t.
+
+2002-06-12 Wednesday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: pl_clpq.cc (1.4), ppl_pl.cc (1.4),
+	  ppl_swiprolog.cc (1.36): Make sure the library is always
+	  uninstalled.
+
+2002-06-12 Wednesday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.11): Added file list for package gprolog.  Updated
+	  file list for package swi.
+
+2002-06-12 Wednesday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.17): Create dynamic
+	  libraries but link statically until we understand whether and if
+	  libtool can be made to interoperate with plld.
+
+2002-06-12 Wednesday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.14): Create dynamic
+	  libraries but link statically until we understand whether and if
+	  libtool can be made to interoperate with gplc.
+
+2002-06-12 Wednesday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.37): Started writing
+	  the documentation for the GNU Prolog interface.
+
+2002-06-12 Wednesday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.hh (1.15): Document struct From_Bounding_Box.
+
+2002-06-11 Tuesday 17:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.54): Added a few words on the double
+	  description method.  Adjusted capitalizations.
+
+2002-06-11 Tuesday 15:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.52), Polyhedron.cc (1.174): Enforcing
+	  normalization of constraints and generators in Polyhedron methods
+	  strongly_minimize_generators(), add_generator(),
+	  time_elapse_assign()	 and topological_closure_assign(); the same
+	  for method GenSys::add_corresponding_closure_points().
+
+2002-06-11 Tuesday 12:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.24), Constraint.defs.hh (1.53),
+	  Generator.cc (1.33): Added method Constraint::OK() to check for
+	  normalization of constraints.  Added the same check to method
+	  Generator::OK().
+
+2002-06-11 Tuesday 11:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.51), GenSys.defs.hh (1.58), GenSys.inlines.hh
+	  (1.18), Polyhedron.cc (1.173): Added method
+	  GenSys::const_iterator::skip_forward(): if the generator
+	  currently pointed is a closure point and the next generator is
+	  the point matching this closure point, then it skips to the next
+	  generator. This method is used to skip redundant closure points
+	  when iterating through strongly-minimized generator systems.
+	  Added note to Polyhedron::strongly_minimize_generators() stating
+	  that the approach is correct if the generator system is sorted.
+
+2002-06-11 Tuesday 11:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.defs.hh (1.43): Corrected comment to the method
+	  skip_forward().
+
+2002-06-11 Tuesday 11:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh (1.27), Generator.cc (1.32):
+	  Enforcing the normalization of constraints and generators.
+
+2002-06-11 Tuesday 09:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.53), ppl.sty (1.9): Better explaning
+	  affine transformations.
+
+2002-06-11 Tuesday 09:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.36), pl_check.pl
+	  (1.9): Grammar for boxes and description of
+	  ppl_Polyhedron_get_bounding_box improved.
+
+2002-06-11 Tuesday 08:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.52): Added a paragraph on topologies and
+	  topological compatibility.
+
+2002-06-10 Monday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.21): Fix packaging
+	  problem.
+
+2002-06-10 Monday 19:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/boundingbox1.cc (1.13): Updated so as to abide by the new
+	  interfaces.
+
+2002-06-10 Monday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.31), interfaces/C/ppl_c.h (1.27),
+	  src/BoundingBox.hh (1.4), src/ConSys.defs.hh (1.42),
+	  src/Polyhedron.defs.hh (1.110), src/Polyhedron.inlines.hh (1.31):
+	  This should be the final version of the interfaces for dealing
+	  with bounding boxes.
+
+2002-06-10 Monday 18:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.51): Several improvements and a few
+	  corrections.
+
+2002-06-10 Monday 17:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.109), Polyhedron.inlines.hh (1.30):
+	  Improvements to the documentation of template <class Box>
+	  Polyhedron::Polyhedron(Topology topol, const Box& box).
+
+2002-06-10 Monday 17:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.50): A first attempt to define intervals,
+	  boxes and bounding boxes.
+
+2002-06-10 Monday 16:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.108), Polyhedron.inlines.hh (1.29):
+	  Finished the implementation of constructor   template <class Box>
+	  Polyhedron(Topology topol, const Box& box); Changed comments to
+	  require that class Box provides a method   bool is_empty();
+
+2002-06-10 Monday 15:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.49): Minor improvements and bug fixed in
+	  paragraph on the generators representation.
+
+2002-06-10 Monday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.28): Avoid a couple of compiler's
+	  warnings.
+
+2002-06-10 Monday 13:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.35): Added grammar for
+	  intervals and description for ppl_Polyhedron_get_bounding_box/2
+
+2002-06-10 Monday 11:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox1.cc (1.12): Now it exits with return value 1 if
+	  the boxes are not as expected.
+
+2002-06-10 Monday 11:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.39), src/BoundingBox.hh
+	  (1.3), src/ConSys.defs.hh (1.41), src/Constraint.defs.hh (1.52),
+	  src/GenSys.defs.hh (1.57): ppl_new_Polyhedron_from_bounding_box/3
+	  sketched.  Class Parma_Polyhedra_Library::BoundingBox fixed.
+	  Inserted several temporary kludges related to the interaction of
+	  templates, access control, and the way we produce ppl_install.hh.
+
+2002-06-10 Monday 10:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.5): clpq2.pl now can handle strict
+	  constraints.
+
+2002-06-10 Monday 10:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BoundingBox.hh (1.2): Complete this implementation of
+	  bounding boxes.
+
+2002-06-10 Monday 10:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.107): Fix the comment fix.
+
+2002-06-10 Monday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.106): Comment fixed.
+
+2002-06-10 Monday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/boundingbox1.cc (1.11): Added operator==() and operator!=()
+	  for BInterval and BBox.
+
+2002-06-10 Monday 09:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.38): Formatting changes.
+
+2002-06-10 Monday 09:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox1.cc (1.10): Further small improvements to test
+	  file boundingbox1.cc
+
+2002-06-10 Monday 08:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.4), tests/boundingbox1.cc (1.9):
+	  boundingbox1.cc is improved but needs further testing.  clpq2.pl
+	  now works with changed interface predicates.
+
+2002-06-10 Monday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.9): Only declarations here.
+
+2002-06-09 Sunday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.105): Useless `explicit' qualification
+	  removed.
+
+2002-06-09 Sunday 19:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.14), ppl_prolog.pl (1.4),
+	  GNU/Makefile.am (1.13), GNU/ppl_gprolog.pl (1.8),
+	  GNU/ppl_gprolog_sd.pl (1.11), SICStus/Makefile.am (1.20),
+	  SICStus/ppl_sicstus.pl (1.21), SICStus/ppl_sicstus_sd.pl (1.3):
+	  Reorganization due to the fact that ppl_prolog.pl was obsolete.
+
+2002-06-09 Sunday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.30): Use the new bounding box
+	  constructors.
+
+2002-06-09 Sunday 19:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.5), C_Polyhedron.inlines.hh (1.4),
+	  NNC_Polyhedron.defs.hh (1.8), NNC_Polyhedron.inlines.hh (1.6),
+	  globals.hh (1.14): Differentiate the bounding box constructors
+	  for C_Polyhedron and NNC_Polyhedron from all the other
+	  constructors.
+
+2002-06-09 Sunday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.34), exceptions.hh
+	  (1.6), pl_check.pl (1.8), track_allocation.hh (1.4),
+	  Ciao/ppl_ciao.pl (1.9), GNU/gp_clpq.pl (1.5),
+	  GNU/ppl_gprolog_sd.pl (1.10), SICStus/ppl_sicstus_sd.pl (1.2),
+	  SICStus/sp_clpq.pl (1.4), SWI/pl_clpq.cc (1.3), SWI/pl_clpq.pl
+	  (1.3), SWI/ppl_pl.cc (1.3), YAP/ppl_yap.pl (1.4), YAP/yap_clpq.pl
+	  (1.2): Copyright and "no warranty" notices added.
+
+2002-06-09 Sunday 16:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.3): Updated.
+
+2002-06-09 Sunday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.4), configure.ac (1.6): Consistent
+	  spelling for Autoconf and Automake.
+
+2002-06-09 Sunday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.46): Set CFLAGS properly.  Quote systematically.
+
+2002-06-09 Sunday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.5): Set CFLAGS properly.  Check for
+	  header files and library functions only if we are building the
+	  library.
+
+2002-06-09 Sunday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.45), Watchdog/configure.ac (1.4): Be more
+	  friendly to compilers different from GCC.
+
+2002-06-09 Sunday 14:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.29), ppl_c.h (1.26): Added
+	  ppl_new_C_Polyhedron_from_bounding_box() and
+	  ppl_new_NNC_Polyhedron_from_bounding_box().
+
+2002-06-09 Sunday 14:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.4), C_Polyhedron.inlines.hh (1.3),
+	  NNC_Polyhedron.defs.hh (1.7), NNC_Polyhedron.inlines.hh (1.5),
+	  Polyhedron.defs.hh (1.104), Polyhedron.inlines.hh (1.27): Added
+	  template <class Box> C_Polyhedron::C_Polyhedron(const Box& box)
+	  and template <class Box> NNC_Polyhedron::NNC_Polyhedron(const
+	  Box& box).  Added the declaration and documentation and sketched
+	  the implementation of template <class Box>
+	  Polyhedron::Polyhedron(Topology topol, const Box& box): these
+	  constructor allow to builds a polyhedron out of a generic,
+	  interval-based bounding box.
+
+	  Documentation of Polyhedron::shrink_bounding_box(Box& box)
+	  revised: we now promise to communicate rational numbers using
+	  fractions in canonical form.	The fraction n/d is in canonical
+	  form if and only if n and d have no common factors and d is
+	  positive, 0/1 being the unique representation for zero.
+
+2002-06-09 Sunday 12:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.48): Added definitions of "minimized"
+	  constraints and generators.
+
+2002-06-09 Sunday 11:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.47): Further updating of the user manual
+	  to allow for NNC polyhedra.  Minkowski's and Weil's theorems and
+	  some definitions moved to the developers part.
+
+2002-06-09 Sunday 08:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.inlines.hh (1.2): Removed redundant and erroneous
+	  default argument specification.
+
+2002-06-08 Saturday 17:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Interval.hh (1.3), Makefile.am (1.13),
+	  ppl_prolog.icc (1.37): Use the new implementation of bounding
+	  boxes.
+
+2002-06-08 Saturday 17:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/addconstraints2.cc (1.12): Shut up if not noisy.
+
+2002-06-08 Saturday 17:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.hh (1.1), Interval.cc (1.1), Interval.defs.hh
+	  (1.1), Interval.inlines.hh (1.1), Interval.types.hh (1.1),
+	  Makefile.am (1.38): New implementation of bounding boxes.
+
+2002-06-08 Saturday 17:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.73), addconstraints2.cc (1.11),
+	  boundingbox1.cc (1.8), ehandlers.cc (1.1), ehandlers.hh (1.4),
+	  memory1.cc (1.2), print.cc (1.1), print.hh (1.8), smm1.cc (1.5),
+	  watchdog1.cc (1.7): Better implementation for auxiliary
+	  functions.  Some more cleaning.
+
+2002-06-08 Saturday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Interval.hh (1.2), ppl_prolog.icc (1.36),
+	  Ciao/ppl_ciao.cc (1.9), Ciao/ppl_ciao.pl (1.8), GNU/gp_clpq.pl
+	  (1.4), GNU/ppl_gprolog_sd.pl (1.9), SICStus/ppl_sicstus_sd.cc
+	  (1.13), SWI/ppl_swiprolog.cc (1.35), YAP/ppl_yap.cc (1.24):
+	  Initial implementation for ppl_Polyhedron_get_bounding_box/2.
+	  ppl_init/0 removed (was an inferior duplicate of
+	  ppl_initialize/0).
+
+2002-06-07 Friday 17:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.46): On-going reorganisation of
+	  introduction based on some of the items suggested by Enea.
+
+2002-06-07 Friday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.5), ppl_prolog.icc (1.35):
+	  The function term_to_polyhedron_handle() replaces
+	  get_ph_pointer().  The new function either return a plausible
+	  polyhedron handle or throws the `not_a_polyhedron_handle'
+	  exception.  All sites that used to call get_ph_pointer() have
+	  been consequently simplified.
+
+2002-06-07 Friday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.12): Stub
+	  declarations fixed.
+
+2002-06-07 Friday 14:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.172): Corrected a bug in
+	  strongly_minimize_constraints() whereby sat_c was declared
+	  up-to-date even if it was not the case.
+
+2002-06-07 Friday 13:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.45), ppl.sty (1.8): Some further step
+	  toward the reorganization of user-manual intro.
+
+2002-06-07 Friday 13:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.33): Documentation for
+	  the Prolog interface updated to allow for the change to more
+	  generic predicates.
+
+2002-06-07 Friday 13:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/exceptions2.cc (1.6): Typos fixed.
+
+2002-06-07 Friday 12:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: clpq.pl (1.8), pl_check.pl (1.7),
+	  ppl_prolog.icc (1.34), Ciao/ppl_ciao.pl (1.7),
+	  GNU/ppl_gprolog_sd.pl (1.8), SICStus/ppl_sicstus_sd.cc (1.11),
+	  SWI/ppl_swiprolog.cc (1.34), YAP/ppl_yap.cc (1.23): All
+	  predicates specific to C or NNC now removed and replaced by
+	  generic predicates. Documentation needs to be updated.
+
+2002-06-07 Friday 11:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.6), ppl_prolog.icc (1.33),
+	  SWI/ppl_swiprolog.cc (1.33): Predicates
+	  ppl_new_Polyhedron_from_Polyhedron/4,
+	  ppl_new_Polyhedron_from_ConSys/3, and
+	  ppl_new_Polyhedron_from_GenSys/3 added - just defined in SWI
+	  Prolog in this commit.
+
+2002-06-07 Friday 11:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.32): Explain how to
+	  enable polyhedra allocation tracking.
+
+2002-06-07 Friday 10:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.32): Creation and disposal of
+	  polyhedra is enabled only if explicitely requested.
+
+2002-06-07 Friday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.31): Remove useless inclusion
+	  and using namespace directives.
+
+2002-06-07 Friday 10:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.30): Avoid quoting for better
+	  output.
+
+2002-06-07 Friday 10:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.4), ppl_prolog.icc (1.29):
+	  New internal_exception: not_a_polyhedron_kind.  New function
+	  term_to_polyhedron_kind() replaces term_to_atom().
+
+2002-06-07 Friday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.28): `a_closed' renamed
+	  `a_c'.
+
+2002-06-07 Friday 08:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.27), Ciao/ppl_ciao.cc
+	  (1.8), GNU/ppl_gprolog_sd.cc (1.4), SICStus/ppl_sicstus_sd.cc
+	  (1.10), SWI/ppl_swiprolog.cc (1.32), YAP/ppl_yap.cc (1.22):
+	  Prolog_get_name_arity() renamed Prolog_get_compound_name_arity().
+
+2002-06-07 Friday 08:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.26), Ciao/ppl_ciao.cc
+	  (1.7), GNU/ppl_gprolog_sd.cc (1.3), SICStus/ppl_sicstus_sd.cc
+	  (1.9), SWI/ppl_swiprolog.cc (1.31), YAP/ppl_yap.cc (1.21):
+	  Prolog_get_atom_name() added.
+
+2002-06-07 Friday 07:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.6), Ciao/ppl_ciao.pl
+	  (1.6), GNU/ppl_gprolog_sd.cc (1.2), SICStus/ppl_sicstus_sd.cc
+	  (1.8), SWI/ppl_swiprolog.cc (1.30), YAP/ppl_yap.cc (1.20):
+	  Prolog_is_atom() added.
+
+2002-06-06 Thursday 18:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.5), ppl_prolog.icc (1.25),
+	  SWI/ppl_swiprolog.cc (1.29): Added 2 generic predicates
+	  ppl_new_Polyhedron_from_dimension/3 and
+	  ppl_new_Polyhedron_empty_from_dimension/3 where the 1st argument
+	  must be c or nnc.  The only Prolog system with interface changed
+	  is SWI.
+
+2002-06-06 Thursday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.10): The `swi' package has now its `%files'
+	  section.
+
+2002-06-06 Thursday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.44): Version number bumped.
+
+2002-06-06 Thursday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.31), SWI/Makefile.am
+	  (1.16), SWI/pl_clpq.cc (1.2), SWI/ppl_pl.cc (1.2),
+	  SWI/ppl_swiprolog.cc (1.28): Support for SWI-Prolog completed and
+	  documented.
+
+2002-06-06 Thursday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.44): Slowly progressing.
+
+2002-06-06 Thursday 12:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.43), ppl.sty (1.7): Started rewriting
+	  the introduction to the user manual.
+
+2002-06-06 Thursday 10:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.30): Explained how to
+	  use the library from SICStus Prolog.
+
+2002-06-06 Thursday 09:40  Elisa Ricci
+
+	* src/: ConSys.defs.hh (1.40), Constraint.defs.hh (1.51),
+	  Generator.defs.hh (1.56), LinExpression.defs.hh (1.32),
+	  Matrix.defs.hh (1.24), Polyhedron.defs.hh (1.103), Row.defs.hh
+	  (1.42), SatMatrix.defs.hh (1.17), SatRow.defs.hh (1.13),
+	  Status.defs.hh (1.15): Now, a Doxygen comment is separated by an
+	  empty line from the C++ item that precedes it.
+
+2002-06-05 Wednesday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am (1.15), ppl_pl.cc (1.1),
+	  pplpl.cc (1.2): Renamed pplpl.cc to ppl_pl.cc.
+
+2002-06-05 Wednesday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.9): We will build several RPM packages out of our
+	  source tree.
+
+2002-06-05 Wednesday 17:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.23): Added support for timeout-guarded operations.
+
+2002-06-05 Wednesday 17:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.72), timings.cc (1.1), timings.hh (1.1),
+	  watchdog1.cc (1.6): When NOISY, watchdog1 prints the time after
+	  which the timeout exception has been received.
+
+2002-06-05 Wednesday 17:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.29): Added
+	  documentation for the minimized_constraints and
+	  minimized_generators predicates.  Removed comments that SWI, GNU,
+	  YAP are not yet supported.
+
+2002-06-05 Wednesday 17:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.28), ppl_c.h (1.25): Added support for
+	  minimized_constraints() and minimized_generators() to the C
+	  interface.
+
+2002-06-05 Wednesday 16:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.24), Ciao/ppl_ciao.pl
+	  (1.5), GNU/ppl_gprolog_sd.pl (1.7), SICStus/ppl_sicstus_sd.cc
+	  (1.7), SWI/ppl_swiprolog.cc (1.27), YAP/ppl_yap.cc (1.19): All
+	  Prolog interfaces now have methods for accessing the minimized
+	  constraint and generator systems.
+
+2002-06-05 Wednesday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.hh (1.13): Simpler and more efficient implementation
+	  of Parma_Polyhedra_Library::maybe_abandon().
+
+2002-06-05 Wednesday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: conversion.cc (1.28), globals.hh (1.12): Documentation of
+	  `abandon_exponential_computations' changed: we now provide a
+	  quite strong guarantee, which is implemented in
+	  Polyhedron::conversion().
+
+2002-06-05 Wednesday 15:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.102), tests/NNCminimize1.cc (1.3),
+	  tests/NNCminimize2.cc (1.3), tests/NNCminimize3.cc (1.3),
+	  tests/NNCminimize4.cc (1.5), tests/NNCminimize6.cc (1.4): Methods
+	  strongly_minimize(), strongly_minimize_constraints() and
+	  strongly_minimize_generators() are now private; tests changed to
+	  call the public methods minimized_constraints() and
+	  minimized_generators(), instead.
+
+2002-06-05 Wednesday 15:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.22): More news.
+
+2002-06-05 Wednesday 14:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.21): News items added.  List sorted to match the
+	  (subjective) relative importance of the innovations.
+
+2002-06-05 Wednesday 12:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.22): Removed some obsolete entries.
+
+2002-06-05 Wednesday 12:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.20): Mention the addition of the time-elapse operation.
+
+2002-06-05 Wednesday 08:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.19), configure.ac (1.43), doc/Makefile.am (1.18),
+	  interfaces/Makefile.am (1.5), interfaces/C/Makefile.am (1.8),
+	  interfaces/Prolog/Makefile.am (1.12),
+	  interfaces/Prolog/Ciao/Makefile.am (1.4),
+	  interfaces/Prolog/GNU/Makefile.am (1.12),
+	  interfaces/Prolog/SICStus/Makefile.am (1.19),
+	  interfaces/Prolog/SWI/Makefile.am (1.14),
+	  interfaces/Prolog/YAP/Makefile.am (1.7), m4/Makefile.am (1.6),
+	  src/Makefile.am (1.37), tests/Makefile.am (1.71): File
+	  description improved.
+
+2002-06-05 Wednesday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.18): Improved formatting.
+
+2002-06-04 Tuesday 20:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.10), config.sub (1.9): Updated.
+
+2002-06-04 Tuesday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.3), ChangeLog (1.8): Updated.
+
+2002-06-04 Tuesday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.3): Updated.
+
+2002-06-04 Tuesday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS (1.2): Written.
+
+2002-06-04 Tuesday 15:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.13): Do not assume the
+	  library has already been installed.
+
+2002-06-04 Tuesday 15:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.11): Do not assume `.' is
+	  the first item of the current PATH.
+
+2002-06-04 Tuesday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.10): No longer require that
+	  the library is already installed for a successful `make check'.
+
+2002-05-31 Friday 11:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.14), configure.ac (1.42), interfaces/C/Makefile.am
+	  (1.7): Improvements in automatic configuration and make file
+	  generation.
+
+2002-05-31 Friday 11:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.70), memory1.cc (1.1): To test the
+	  allocation error recovery facility of the library.  Not yet
+	  operational.
+
+2002-05-31 Friday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/watchdog1.cc (1.5): Minor improvements.
+
+2002-05-30 Thursday 16:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.171): Modified methos strongly_minimize()
+	  according to the recent findings by Pat.
+
+2002-05-30 Thursday 15:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.170): In method
+	  strongly_minimize_constraints(), corrected handling of the sorted
+	  flag for the constraint system and of the changed boolean flag.
+
+2002-05-30 Thursday 15:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.169): In methods strongly_minimize_*(),
+	  keeping track of whether or not we modify the considered system.
+	  If there has been no changes, the dual system is not flagged as
+	  out-of-date at the end of the method.
+
+2002-05-30 Thursday 11:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.168): The method
+	  strongly_minimize_generators() now forces all point encodings to
+	  have the same epsilon-coordinate (which is 1).
+
+2002-05-29 Wednesday 18:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.28), pl_check.pl
+	  (1.4): Documentation now introduces the C and NNC polyhedra.	The
+	  grammar rules allow for strict inequalities and closure points.
+	  The test file has minor improvements; checking that redundant
+	  strict inequalities are ignored when creating a C polyhedron as a
+	  copy of an NNC polyhedra.
+
+2002-05-29 Wednesday 15:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: NNCminimize1.cc (1.2), NNCminimize2.cc (1.2),
+	  NNCminimize3.cc (1.2), NNCminimize4.cc (1.4), NNCminimize6.cc
+	  (1.3): Methods NNC_minimize* renamed as strongly_minimize*
+
+2002-05-29 Wednesday 15:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.167), Polyhedron.defs.hh (1.101): Methods
+	  NNC_minimize* renamed as strongly_minimize* and implemented
+	  (almost) according to the technical report Q286.  When strongly
+	  minimizing a constraint system, we now always remove any
+	  eps-upper-bound constraint and we later insert back the
+	  constraint eps-leq-one only if that is needed to obtain an
+	  epsilon-representation.
+
+2002-05-29 Wednesday 07:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: NNCinclusion1.cc (1.2), NNCminimize6.cc (1.2),
+	  boundingbox1.cc (1.7), watchdog1.cc (1.4), widening2.cc (1.2): Be
+	  quiet.
+
+2002-05-28 Tuesday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.166): Several simplifications in strong
+	  minmization of constraints and generators and in check for
+	  topological closure of a NNC polyhedron.
+
+2002-05-28 Tuesday 16:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc (1.31), Generator.defs.hh (1.55): Method
+	  is_corresponding_closure_point() renamed as
+	  is_matching_closure_point().
+
+2002-05-28 Tuesday 13:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.5), Watchdog/.cvsignore (1.2),
+	  interfaces/C/.cvsignore (1.2), interfaces/Prolog/ppl_prolog.icc
+	  (1.23), interfaces/Prolog/SICStus/.cvsignore (1.2): For those
+	  building in the sources' tree.
+
+2002-05-28 Tuesday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/watchdog1.cc (1.3): Adapted to the new version of the
+	  Watchdog library and "abandon" mechanism.
+
+2002-05-28 Tuesday 12:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.cc (1.7), globals.hh (1.11): Improved
+	  implementation of the "abandon" mechanism.
+
+2002-05-28 Tuesday 12:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.cc (1.4), Watchdog.defs.hh (1.2),
+	  Watchdog.inlines.hh (1.2): Better implementation using templates.
+
+2002-05-28 Tuesday 12:12  Elisa Ricci
+
+	* src/Polyhedron.cc (1.165): Corrected an error in
+	  Polyhedron::topological_closure_assign(): if we modify the system
+	  of constraints or of generators, it is no longer minimized.
+
+2002-05-27 Monday 17:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.3), ppl_prolog.icc (1.22): Bug
+	  in ppl_prolog.icc corrected.	Tests in pl_check.pl amended to use
+	  poly_hull and poly_difference instead of convex_hull and
+	  convex_difference.
+
+2002-05-27 Monday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/.cvsignore (1.5): For those that build in the source
+	  directory.
+
+2002-05-27 Monday 16:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.bottom (1.4): Undefine all autoconf macros.
+
+2002-05-27 Monday 16:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.6),
+	  interfaces/Prolog/Ciao/Makefile.am (1.3),
+	  interfaces/Prolog/GNU/Makefile.am (1.9),
+	  interfaces/Prolog/SICStus/Makefile.am (1.18),
+	  interfaces/Prolog/SWI/Makefile.am (1.12),
+	  interfaces/Prolog/YAP/Makefile.am (1.6), src/Makefile.am (1.36):
+	  INCLUDES is deprecated: use AM_CPPFLAGS instead.
+
+2002-05-27 Monday 16:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.69), watchdog1.cc (1.2): Stress test for
+	  the timeout facility.
+
+2002-05-27 Monday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.3), README (1.3), Timeout.hh (1.3),
+	  Watchdog.cc (1.3), Watchdog.defs.hh (1.1), Watchdog.hh (1.3),
+	  Watchdog.inlines.hh (1.1), Watchdog.types.hh (1.1), configure.ac
+	  (1.3), pwl_filter_doxygen.sed (1.1), pwl_filter_install.sed
+	  (1.1), pwl_header.bottom (1.1), pwl_header.middle (1.1),
+	  pwl_header.top (1.1): The Watchdog library is now complete.
+
+2002-05-27 Monday 13:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.27): Prolog interface
+	  predicates and their names in the documentation now agree with
+	  each other.
+
+2002-05-26 Sunday 14:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.164): Assertion fixed in
+	  time_elapse_assign().
+
+2002-05-26 Sunday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.163): Properly identify time_elapse_assign()
+	  when throwing an exception from there.
+
+2002-05-25 Saturday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.35), Row.cc (1.36), SatMatrix.cc (1.16),
+	  maxmin.hh (1.3): Baking our own versions of max() and min() was a
+	  bad idea.
+
+2002-05-25 Saturday 16:26  Elisa Ricci
+
+	* src/Polyhedron.cc (1.162), src/Polyhedron.defs.hh (1.100),
+	  tests/timeelapse1.cc (1.2), tests/timeelapse2.cc (1.2),
+	  tests/timeelapse3.cc (1.2), tests/timeelapse4.cc (1.2): Changed
+	  the function Polyhedron::time_elapse_assign() so that only
+	  polyhedra that are topology-compatible can be used and modified
+	  the tests so that the polyhedra satisfy this condition.
+
+2002-05-24 Friday 11:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.161): Corrected method
+	  topological_closure_assign(): inserting the constraint
+	  eps_leq_one after modifying the polyhedron to enforce the epsilon
+	  upper bound.
+
+2002-05-24 Friday 10:34  Elisa Ricci
+
+	* src/Constraint.cc (1.23): Corrected an error in the function
+	  Constraint::is_trivial_true(): a strict inequality such as `lhs -
+	  k > 0' can not be trivial true if `k' is a non negative integer.
+
+2002-05-24 Friday 07:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.41), tests/Makefile.am (1.68), tests/watchdog1.cc
+	  (1.1): Prepare for testing the timeout facility.
+
+2002-05-24 Friday 07:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.17): If we are building the Watchdog library, make
+	  sure it is built before entering the `tests' directory.
+
+2002-05-24 Friday 07:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.2), README (1.2), Timeout.hh (1.2),
+	  Watchdog.cc (1.2), Watchdog.hh (1.2), config.h.in (1.2),
+	  configure.ac (1.2): Several improvement (but still not
+	  operational).
+
+2002-05-24 Friday 07:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.26): Be more specific
+	  about how to use the library in SICStus Prolog.
+
+2002-05-23 Thursday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/widening2.cc (1.1): widening2.cc shows a precision problem
+	  in Polyhedron::widening_assign().
+
+2002-05-23 Thursday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.67): widening2.cc shows a precision problem
+	  in Polyhedron::widening_assign().
+
+2002-05-22 Wednesday 13:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.cc (1.6): Definition of
+	  abandon_exponential_computations fixed again.
+
+2002-05-22 Wednesday 13:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.27): Added a call to maybe_abandon(): this
+	  is supposed to be called on all the exponential paths within the
+	  library and, in such paths, invocations to it should be separated
+	  from one another by a distance that is bounded from above by a
+	  polynomial of the size of the input to conversion().
+
+2002-05-22 Wednesday 13:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.cc (1.5): Definition of
+	  abandon_exponential_computations fixed.
+
+2002-05-22 Wednesday 11:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: convexdifference1.cc (1.10), convexhull1.cc (1.7),
+	  convexhull2.cc (1.6), convexhull3.cc (1.6), convexhull4.cc (1.5),
+	  randchull1.cc (1.15): Removed and replaced by tests named
+	  "poly*".
+
+2002-05-22 Wednesday 11:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.66), NNCminimize5.cc (1.2), append1.cc
+	  (1.11), append2.cc (1.12), exceptions1.cc (1.8), permute.cc
+	  (1.16), polydifference1.cc (1.1), polyhull1.cc (1.1),
+	  polyhull2.cc (1.1), polyhull3.cc (1.1), polyhull4.cc (1.1),
+	  randchull1.cc (1.14), randphull1.cc (1.1), widening1.cc (1.4):
+	  Renaming convex-hull into poly-hull.
+
+2002-05-22 Wednesday 11:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.160), src/Polyhedron.defs.hh (1.99),
+	  interfaces/C/ppl_c.cc (1.27), interfaces/C/ppl_c.h (1.24),
+	  interfaces/Prolog/Prolog_interface.dox (1.25),
+	  interfaces/Prolog/pl_check.pl (1.2),
+	  interfaces/Prolog/ppl_prolog.icc (1.21),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.4),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.pl (1.6),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.6),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.26),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.18): Renamed convex-hull into
+	  poly-hull.
+
+2002-05-22 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.11): Build the SWI Prolog
+	  interface only if SWI Prolog is installed.
+
+2002-05-22 Wednesday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.16), configure.ac (1.40), Watchdog/.cvsignore
+	  (1.1), Watchdog/BUGS (1.1), Watchdog/COPYING (1.1),
+	  Watchdog/CREDITS (1.1), Watchdog/ChangeLog (1.1),
+	  Watchdog/INSTALL (1.1), Watchdog/Makefile.am (1.1), Watchdog/NEWS
+	  (1.1), Watchdog/README (1.1), Watchdog/Timeout.hh (1.1),
+	  Watchdog/Watchdog.cc (1.1), Watchdog/Watchdog.hh (1.1),
+	  Watchdog/config.h.in (1.1), Watchdog/configure.ac (1.1): Even
+	  though the Watchdog library is completely independent from the
+	  PPL, it will live with it, at least for a while.
+
+2002-05-22 Wednesday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.34), globals.cc (1.4), globals.hh (1.10):
+	  New timeout mechanisms.
+
+2002-05-22 Wednesday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.159): Typo fixed.
+
+2002-05-22 Wednesday 08:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GenSys.cc (1.50): Useless emphasis removed.
+
+2002-05-22 Wednesday 08:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.11), Ciao/Makefile.am (1.2):
+	  Compile also the Ciao Prolog interface, if Ciao Prolog is
+	  available.
+
+2002-05-22 Wednesday 08:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.16),
+	  devref-print.doxyconf-latex.in (1.16), devref.doxyconf-html.in
+	  (1.17): Fixes and additions for the developer's documentation of
+	  Prolog interfaces.
+
+2002-05-18 Saturday 16:56  Elisa Ricci
+
+	* src/Polyhedron.cc (1.158), src/Polyhedron.defs.hh (1.98),
+	  tests/Makefile.am (1.65), tests/exceptions1.cc (1.7),
+	  tests/timeelapse1.cc (1.1), tests/timeelapse2.cc (1.1),
+	  tests/timeelapse3.cc (1.1), tests/timeelapse4.cc (1.1),
+	  tests/timeelapse5.cc (1.1): Added the function void
+	  time_elapse_assign(const Polyhedron&) and some tests for it.
+
+2002-05-17 Friday 07:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.17): Commented out statement
+	  removed.
+
+2002-05-17 Friday 07:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: .cvsignore (1.1), Makefile.am (1.1),
+	  ppl_ciao.cc (1.5): Rewritten using the interface provided by Ciao
+	  Prolog 1.8 (still not operational).
+
+2002-05-14 Tuesday 09:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.1): pl_check.pl can be used to
+	  run all the interface predicates with simple tests.
+
+2002-05-14 Tuesday 09:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: clpq.pl (1.7), ppl_prolog.icc (1.20),
+	  GNU/ppl_gprolog_sd.pl (1.5), SICStus/ppl_sicstus_sd.cc (1.5),
+	  SWI/ppl_swiprolog.cc (1.25), YAP/ppl_yap.cc (1.16): All interface
+	  predicates now renamed and completed apart from
+	  shrink_bounding_box predicate.
+
+2002-05-13 Monday 18:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.19), GNU/ppl_gprolog_sd.pl
+	  (1.4), SICStus/ppl_sicstus_sd.cc (1.4), SWI/ppl_swiprolog.cc
+	  (1.24), YAP/ppl_yap.cc (1.15): Prolog interface predicates for
+	  removing dimensions renamed.
+
+2002-05-13 Monday 17:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.18), ppl_prolog.pl (1.3),
+	  GNU/ppl_gprolog_sd.pl (1.3), SICStus/ppl_sicstus_sd.cc (1.3),
+	  SWI/ppl_swiprolog.cc (1.23), YAP/ppl_yap.cc (1.14): The "add"
+	  predicates renamed or added to the Prolog interface.
+
+2002-05-13 Monday 15:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: clpq.pl (1.6), ppl_prolog.icc (1.17),
+	  GNU/ppl_gprolog_sd.pl (1.2), SICStus/ppl_sicstus_sd.cc (1.2),
+	  SWI/ppl_swiprolog.cc (1.22), YAP/ppl_yap.cc (1.13): More
+	  interface predicates updated for NNC polyhedra
+
+2002-05-13 Monday 10:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.15), configure.ac (1.39): Use --enable-shared when
+	  making distcheck.  Make sure we really have the Prolog systems.
+
+2002-05-13 Monday 10:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.10), ppl_prolog.icc (1.16):
+	  Always enter subdirectories.	Source file ppl_prolog.icc is a C++
+	  file.
+
+2002-05-13 Monday 10:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/: Makefile.am (1.8), ppl_gprolog.cc (1.13),
+	  ppl_gprolog.pl (1.7), ppl_gprolog_sd.cc (1.1), ppl_gprolog_sd.pl
+	  (1.1): Cleaned up.
+
+2002-05-13 Monday 10:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.17), ppl_sicstus.cc
+	  (1.54), ppl_sicstus.pl (1.20), ppl_sicstus_sd.cc (1.1),
+	  ppl_sicstus_sd.pl (1.1), sp_clpq.pl (1.3): Cleaned up: works both
+	  with static and dynamic linking.
+
+2002-05-13 Monday 10:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: Makefile.am (1.5), ppl_yap.cc (1.12),
+	  ppl_yap.pl (1.3): Cleaned up, but still not operational.
+
+2002-05-10 Friday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.38), interfaces/Prolog/SICStus/Makefile.am
+	  (1.16): Some Progress with the SICStus interface.
+
+2002-04-28 Sunday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.26): Formatting change.
+
+2002-04-24 Wednesday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.15): Fixed two declarations
+	  of std::ostringstream's.
+
+2002-04-20 Saturday 22:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.inlines.hh (1.25), tests/boundingbox1.cc (1.6):
+	  shrink_bounding_box now works for NNC polyhedra defined both with
+	  and without strict inequalites.  The test file boundingbox1.cc
+	  has been also updated to deal with NNC polyhedra.  Extra tests
+	  have been added to check the changes.
+
+2002-04-19 Friday 17:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.14): Now including the
+	  closure points in the list of generators is ok when creating new
+	  polyhedra from lists of generators in the Prolog interface.
+
+2002-04-19 Friday 16:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.13), GNU/ppl_gprolog.pl
+	  (1.6): Predicates for GNU Prolog brought in line with the Prolog
+	  interface.
+
+2002-04-19 Friday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.12): Now constraint_term()
+	  supports strict inequalities.
+
+2002-04-19 Friday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/inclusion1.cc (1.2): Be quiet.
+
+2002-04-19 Friday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.11): a_strictly_greater_than
+	  and a_strictly_less_than renamed a_greater_than and a_less_than.
+
+2002-04-19 Friday 14:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.10): Throw an exception
+	  instead of aborting in generator_term().
+
+2002-04-19 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.9), GNU/ppl_gprolog.cc
+	  (1.12), SICStus/ppl_sicstus.cc (1.53), SWI/ppl_swiprolog.cc
+	  (1.21), YAP/ppl_yap.cc (1.11): General cleanup.
+
+2002-04-19 Friday 13:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: clpq.pl (1.5), ppl_prolog.icc (1.8): The
+	  order of arguments in the revised predicates is input followed by
+	  output.  The ppl_prolog.icc now has code to handle strict
+	  inequalities and closure points.  clpq.pl has been updated to use
+	  the revised predicates.
+
+2002-04-19 Friday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.20):
+	  ppl_delete_polyhedron/2 renamed ppl_delete_Polyhedron/2.
+
+2002-04-19 Friday 11:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.7), SICStus/ppl_sicstus.cc
+	  (1.52), SWI/ppl_swiprolog.cc (1.19), YAP/ppl_yap.cc (1.10): The
+	  code for ppl_new_NNC_Polyhedron_from_GenSys uncommented.
+
+2002-04-19 Friday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.6), SICStus/ppl_sicstus.cc
+	  (1.51), SWI/ppl_swiprolog.cc (1.18): ppl_delete_polyhedron
+	  renamed ppl_delete_Polyhedron.  SP_STUB_0 macro fixed.
+
+2002-04-19 Friday 10:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.9): Added missing semicolons.
+
+2002-04-19 Friday 10:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.5): In the copy
+	  methods/predicates the arguments have been reversed to match the
+	  corresponding ones in the C interface.  Now the 1st argument
+	  unifies with a handle for the new polyhedron and the 2nd argument
+	  is the handle for the source/original polyhedron.  Predicates
+	  affected are: ppl_new_C_Polyhedron_from_C_Polyhedron,
+	  ppl_new_NNC_Polyhedron_from_NNC_Polyhedron,
+	  ppl_new_C_Polyhedron_from_NNC_Polyhedron,
+	  ppl_new_NNC_Polyhedron_from_C_Polyhedron.
+
+2002-04-19 Friday 10:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.4), SICStus/ppl_sicstus.cc
+	  (1.50), SWI/ppl_swiprolog.cc (1.17), YAP/ppl_yap.cc (1.8):
+	  Predicates: ppl_new_C_Polyhedron_from_ConSys,
+	  ppl_new_NNC_Polyhedron_from_ConSys,
+	  ppl_new_C_Polyhedron_from_GenSys added.
+
+2002-04-19 Friday 08:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.3), SICStus/ppl_sicstus.cc
+	  (1.49), SWI/ppl_swiprolog.cc (1.16), YAP/ppl_yap.cc (1.7): The
+	  new, new_empty and copy predicates have been replaced by ones
+	  that allow for C and NNC polyhedra to match the same methods in
+	  the C interface.  Propositions ppl_initialize and ppl_finalize
+	  added.
+
+2002-04-16 Tuesday 09:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.157): Test NNCminimize6 has shown that our
+	  check for topological closure was relying on a false invariant
+	  (namely, that in a weakly minimized constraint system any strict
+	  inequality can be made redundant by another strict inequality
+	  only).  Corrected the implementation of
+	  is_topologically_closed().
+
+2002-04-15 Monday 10:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (1.33): Corrected a memory allocation bug in
+	  ConSys::insert(const Constraint& c).	Now test NNCminimize6 shows
+	  that the strong minimization of constraints for NNC polyhedra
+	  does not fully minimize constraint systems, yet.
+
+2002-04-15 Monday 09:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.64), NNCminimize6.cc (1.1): Example
+	  NNCminimize6 shows a memory allocation bug in method
+	  ConSys::insert(const Constraint&).
+
+2002-04-14 Sunday 17:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.cc (1.30): Avoid redundant test.
+
+2002-04-14 Sunday 17:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.cc (1.22): Factorize some calls to
+	  operator<<(std::ostream&, ...).
+
+2002-04-13 Saturday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.24): Avoid shadowing in
+	  Polyhedron::shrink_bounding_box().
+
+2002-04-12 Friday 20:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.63), NNCminimize4.cc (1.3),
+	  NNCminimize5.cc (1.1): Test NNCminimize5 is a fake test showing
+	  that strong minimization problems can arise even when the user is
+	  only allowed to interact using constraint systems.
+
+2002-04-12 Friday 20:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.156): When performing strong minimization of
+	  constraints, no longer preventing the removal of the \esilon \leq
+	  1 constraint.  This modification is justified by the relaxation
+	  of the invariant on the class Generator, where we no longer
+	  require the coordinate of \epsilon to be \leq 1.
+
+2002-04-12 Friday 09:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.9), config.sub (1.8): Updated.
+
+2002-04-11 Thursday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Interval.hh (1.1), Makefile.am (1.9),
+	  ppl_prolog.icc (1.2): Progress in the implementation of
+	  ppl_get_bounding_box().
+
+2002-04-11 Thursday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.8), ppl_prolog.icc (1.1),
+	  ppl_prolog.outlines.hh (1.26), GNU/ppl_gprolog.cc (1.11),
+	  SICStus/ppl_sicstus.cc (1.48), SWI/ppl_swiprolog.cc (1.15),
+	  YAP/ppl_yap.cc (1.6): The file `ppl_prolog.outlines.hh' has been
+	  renamed `ppl_prolog.icc'.
+
+2002-04-10 Wednesday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.cc (1.29): The OK() function for Generator no
+	  longer checks that, for points, the epsilon coordinate is less
+	  than or equal to 1 (because strong minimization does not maintain
+	  this invariant).
+
+2002-04-10 Wednesday 10:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: SICStus/ppl_sicstus.cc (1.47),
+	  SWI/ppl_swiprolog.cc (1.14), YAP/ppl_yap.cc (1.5): Provided the
+	  ppl_Prolog_sysdep_init() hook for system-dependent
+	  initialization.
+
+2002-04-10 Wednesday 10:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog.cc (1.10):
+	  Prolog_raise_exception() implemented.  Provided the
+	  ppl_Prolog_sysdep_init() hook for system-dependent
+	  initialization.
+
+2002-04-10 Wednesday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.25): Started playing
+	  with the ppl_get_bounding_box() interface function.
+
+2002-04-09 Tuesday 18:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.155), Polyhedron.defs.hh (1.97): Added
+	  methods   const ConSys& Polyhedron::minimized_constraints()
+	  const;   const GenSys& Polyhedron::minimized_generators() const;
+	  together with the corresponding (unoptimized) implementations.
+
+2002-04-08 Monday 22:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.154): Typo fixed.
+
+2002-04-08 Monday 22:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.49), GenSys.defs.hh (1.56), Polyhedron.cc
+	  (1.153), Polyhedron.defs.hh (1.96): Added first draft for the
+	  method Polyhedron::topological_closure_assign().  Also added
+	  method GenSys::add_corresponding_points().
+
+2002-04-07 Sunday 15:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.26), ppl_c.h (1.23): Two bugs fixed.
+	  The swap functions have been removed.
+
+2002-04-07 Sunday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.152): Avoid an inconsistent mixture of
+	  useless emphasizers.
+
+2002-04-07 Sunday 13:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.62), inclusion1.cc (1.1): Test
+	  C_Polyhedron::operator<=().
+
+2002-04-07 Sunday 12:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.6), exceptions2.cc (1.5): Replace
+	  "impossible" with "illegal" when the latter was meant.
+
+2002-04-07 Sunday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.151): There is no such a thing as the
+	  reduced scalar product operator^.
+
+2002-04-06 Saturday 08:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.4): Fixed two instances of the use of an
+	  inexistent GMP assignment operator from `char*'.  These gave no
+	  error because of the C++ pointer to `bool' conversion feature and
+	  because GMP had an assignment operator from `bool'.
+
+2002-04-05 Friday 12:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox1.cc (1.5): Improved printed results: now says
+	  "none" when the denominator of the bound is 0.
+
+2002-04-05 Friday 12:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.inlines.hh (1.23), tests/boundingbox1.cc (1.4):
+	  The dimension() method removed from BBox.
+
+2002-04-05 Friday 10:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.inlines.hh (1.22), tests/boundingbox1.cc (1.3): In
+	  Polyhedron.inlines.hh:    shrink_bounding_box now handles the
+	  empty polyhedron correctly.
+
+	  In boundingbox1.cc:	 BBox and Interval improved and many tests
+	  added.
+
+2002-04-04 Thursday 14:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.inlines.hh (1.21): Initial implementation of
+	  Polyhedron::shrink_bounding_box().
+
+2002-04-04 Thursday 13:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.32), GenSys.cc (1.48), Polyhedron.cc (1.150),
+	  Row.cc (1.35), Row.defs.hh (1.41): PPL::operator^(const Row&,
+	  const Row&) renamed as "reduced_scalar_product".
+
+2002-04-04 Thursday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/boundingbox1.cc (1.2): Use a more concrete bounding-box
+	  class.
+
+2002-04-04 Thursday 11:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.15),
+	  devref-print.doxyconf-latex.in (1.15), devref.doxyconf-html.in
+	  (1.16): Configuration files updated after class names changes.
+
+2002-04-04 Thursday 11:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.types.hh (1.3): Forgot to remove this one.
+
+2002-04-04 Thursday 10:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: PolyBase.cc (1.25), PolyBase.defs.hh (1.17),
+	  PolyBase.inlines.hh (1.5): Getting rid of these old files.
+
+2002-04-04 Thursday 10:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.149), Polyhedron.defs.hh (1.95),
+	  Polyhedron.inlines.hh (1.20): All functions created to throw
+	  exceptions are now private methods of the class Polyhedron.
+	  Exception messages modified to reflect the changes in the names
+	  of the classes and in the names of methods (e.g., add_constraint
+	  instead of insert).  Added topology-compatibility test to method
+	  swap(Polyhedron& y).	In all public methods, we now first check
+	  for topology inconsistencies, then we check for dimension
+	  inconsistencies.
+
+2002-04-04 Thursday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.25), ppl_c.h (1.22): Add
+	  copy-conversion functions.
+
+2002-04-04 Thursday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.24), ppl_c.h (1.21): Basic interface
+	  for the NNC polyhedra.
+
+2002-04-03 Wednesday 19:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/ppl_c.cc (1.23), Prolog/ppl_prolog.outlines.hh
+	  (1.24): Allow the manipulation of closed polyhedra only (for the
+	  moment).
+
+2002-04-03 Wednesday 19:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.94): Make the destructor public (for
+	  the moment).
+
+2002-04-03 Wednesday 18:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.93): Modified doxygen comments to
+	  account for the possibility of exceptions caused by incompatible
+	  topologies.
+
+2002-04-03 Wednesday 17:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Polyhedron.types.hh (1.2): Cutted (redundant) brief
+	  namespace description to avoid a Doxygen warning.
+
+2002-04-03 Wednesday 17:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Row.defs.hh (1.40), Row.inlines.hh (1.20): Some cleaning in
+	  the Row::Type class:	- removed the useless static methods;  -
+	  the constants NNC and RPI are now tied to the Topology and
+	  Row::Kind    enumerations.
+
+2002-04-03 Wednesday 15:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.148), Polyhedron.defs.hh (1.92): All the
+	  assertions regarding topology compatibility (but those inside the
+	  non-public methods) replaced by run-time checks so that, When
+	  identifying a topology mismatch, we now throw an exception.
+
+	  Since wrapper classes C_Polyhedron and NNC_Polyhedron will not
+	  override the methods of base class Polyhedron (they will just
+	  inherit them), all implementation specific members of Polyhedron,
+	  apart from the constructors and assignment, are now declared
+	  "private" instead of "protected".
+
+2002-04-03 Wednesday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.61), boundingbox1.cc (1.1): To test
+	  Polyhedron::shrink_bounding_box().
+
+2002-04-03 Wednesday 12:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.3), NNC_Polyhedron.cc (1.8),
+	  NNC_Polyhedron.defs.hh (1.6), Polyhedron.cc (1.147),
+	  Polyhedron.defs.hh (1.91): The method   bool
+	  is_topologycally_closed() const; is now a method of the _base_
+	  class Polyhedron, trivially returning true if the polyhedron is
+	  necessarily closed.
+
+2002-04-03 Wednesday 11:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Polyhedron.cc (1.2), src/C_Polyhedron.defs.hh (1.2),
+	  src/C_Polyhedron.inlines.hh (1.2), src/Makefile.am (1.33),
+	  src/NNC_Polyhedron.cc (1.7), src/NNC_Polyhedron.defs.hh (1.5),
+	  src/NNC_Polyhedron.inlines.hh (1.4), src/Polyhedron.cc (1.146),
+	  src/Polyhedron.defs.hh (1.90), src/Polyhedron.inlines.hh (1.19),
+	  src/conversion.cc (1.26), src/minimize.cc (1.20), src/simplify.cc
+	  (1.15), tests/print.hh (1.7): Base class PolyBase renamed (back)
+	  as Polyhedron.
+
+2002-04-03 Wednesday 10:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.32), src/NNC_Polyhedron.cc (1.6),
+	  src/NNC_Polyhedron.defs.hh (1.4), tests/addconstraints1.cc (1.6),
+	  tests/addconstraints10.cc (1.5), tests/addconstraints11.cc (1.6),
+	  tests/addconstraints2.cc (1.10), tests/addconstraints3.cc (1.3),
+	  tests/addconstraints4.cc (1.5), tests/addconstraints5.cc (1.6),
+	  tests/addconstraints6.cc (1.7), tests/addconstraints7.cc (1.6),
+	  tests/addconstraints8.cc (1.6), tests/addconstraints9.cc (1.7),
+	  tests/adddimensions1.cc (1.8), tests/adddimensions2.cc (1.4),
+	  tests/adddimensions3.cc (1.6), tests/adddimensions4.cc (1.4),
+	  tests/addgenerators1.cc (1.7), tests/addgenerators2.cc (1.7),
+	  tests/addgenerators3.cc (1.6), tests/addgenerators4.cc (1.6),
+	  tests/addgenerators5.cc (1.6), tests/addgenerators6.cc (1.6),
+	  tests/addgenerators7.cc (1.2), tests/affineimage1.cc (1.6),
+	  tests/affineimage2.cc (1.5), tests/affinepreimage1.cc (1.5),
+	  tests/affinepreimage2.cc (1.5), tests/affinepreimage3.cc (1.5),
+	  tests/affinepreimage4.cc (1.6), tests/affinetrans.cc (1.9),
+	  tests/append1.cc (1.10), tests/append2.cc (1.11),
+	  tests/bounded1.cc (1.3), tests/convexdifference1.cc (1.9),
+	  tests/convexhull1.cc (1.6), tests/convexhull2.cc (1.5),
+	  tests/convexhull3.cc (1.5), tests/convexhull4.cc (1.4),
+	  tests/empty1.cc (1.7), tests/exceptions1.cc (1.5),
+	  tests/exceptions2.cc (1.4), tests/generators1.cc (1.5),
+	  tests/generators2.cc (1.2), tests/inters1.cc (1.10),
+	  tests/inters2.cc (1.13), tests/inters3.cc (1.6), tests/inters4.cc
+	  (1.5), tests/inters5.cc (1.7), tests/inters6.cc (1.6),
+	  tests/inters7.cc (1.3), tests/limitedwidening1.cc (1.7),
+	  tests/limitedwidening2.cc (1.4), tests/onepoint.cc (1.5),
+	  tests/permute.cc (1.15), tests/randchull1.cc (1.13),
+	  tests/relations1.cc (1.3), tests/relations2.cc (1.4),
+	  tests/relations3.cc (1.4), tests/relations4.cc (1.4),
+	  tests/relations5.cc (1.4), tests/relations6.cc (1.3),
+	  tests/relations7.cc (1.3), tests/relations8.cc (1.3),
+	  tests/relations9.cc (1.4), tests/removedim1.cc (1.5),
+	  tests/removedim2.cc (1.9), tests/removedim3.cc (1.5),
+	  tests/removedim4.cc (1.6), tests/removedim5.cc (1.4),
+	  tests/removedim6.cc (1.5), tests/smm1.cc (1.4),
+	  tests/universe1.cc (1.3), tests/universe2.cc (1.4),
+	  tests/universe3.cc (1.4), tests/universe4.cc (1.4),
+	  tests/universe5.cc (1.5), tests/widening1.cc (1.3): Wrapper class
+	  Polyhedron renamed as C_Polyhedron.  All test programs modified
+	  accordingly.
+
+2002-04-03 Wednesday 10:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.1), C_Polyhedron.defs.hh (1.1),
+	  C_Polyhedron.inlines.hh (1.1), C_Polyhedron.types.hh (1.1): Added
+	  wrapper class C_Polyhedron to implement necessarily closed
+	  polyhedra.
+
+2002-04-02 Tuesday 19:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (1.24), tests/addconstraints6.cc (1.6): Corrected
+	  stupid bugs related to a misinterpretation of the value returned
+	  by minimize().
+
+2002-04-02 Tuesday 18:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.22), ppl_c.h (1.20): All the
+	  *_and_minimize functions return a positive integer if the
+	  reulting polyhedron is non-empty; they return 0 if it is empty
+	  (and, as usual, return a negative number if an error occurred).
+
+2002-04-02 Tuesday 17:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.21): Dealt with the first item (the *_and_minimize one).
+
+2002-04-02 Tuesday 17:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: PolyBase.cc (1.23), PolyBase.defs.hh (1.16): All the public
+	  methods of PolyBase whose name ends in "_and_minimize" now return
+	  a boolean value (which is `false' iff the resulting polyhedron is
+	  empty).
+
+2002-04-02 Tuesday 16:48  Elisa Ricci
+
+	* tests/: Makefile.am (1.60), removedim7.cc (1.1), universe6.cc
+	  (1.1): Added a test for the functions remove_higher_dimensions()
+	  and remove_dimensions() and one for the function check_universe
+	  for NNC_Polyhedron.
+
+2002-04-02 Tuesday 16:43  Elisa Ricci
+
+	* tests/exceptions1.cc (1.4): Added a test to show when an
+	  exception is thrown in the function convex_difference_assign(ph).
+
+2002-04-02 Tuesday 12:08  Elisa Ricci
+
+	* tests/: Makefile.am (1.59), adddimensions5.cc (1.1),
+	  adddimensions6.cc (1.1), adddimensions7.cc (1.1): Added tests for
+	  the functions add_dimensions_and_embed and
+	  add_dimensions_and_project for NNC_Polyhedron.
+
+2002-04-02 Tuesday 09:43  Elisa Ricci
+
+	* tests/: Makefile.am (1.58), addgenerators7.cc (1.1), print.hh
+	  (1.6): Add a test for the function
+	  add_generators_and_minimize(gs) for a NNC_Polyhedron.  Changed
+	  the functions to print the polyhedra so that they can be used to
+	  print also for the NNC polyhedra.
+
+2002-04-02 Tuesday 08:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.22): Some nonsense removed from
+	  PolyBase::affine_image() and PolyBase::affine_preimage().
+
+2002-04-02 Tuesday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.21): PolyBase::limited_widening_assign()
+	  fixed: it was not checking the return value of
+	  PolyBase::update_generators().
+
+2002-03-31 Sunday 23:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.20), interfaces/C/Makefile.am (1.5),
+	  interfaces/C/ppl_c.cc (1.21),
+	  interfaces/Prolog/Prolog_interface.dox (1.24),
+	  interfaces/Prolog/ppl_prolog.outlines.hh (1.23),
+	  interfaces/Prolog/ppl_prolog.pl (1.2),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.4),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.3),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.5),
+	  interfaces/Prolog/SICStus/ppl_sicstus.cc (1.46),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.13),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.4), src/PolyBase.cc (1.20),
+	  src/PolyBase.defs.hh (1.15), tests/addconstraints11.cc (1.5),
+	  tests/addconstraints2.cc (1.9), tests/addconstraints4.cc (1.4),
+	  tests/addconstraints6.cc (1.5), tests/addconstraints7.cc (1.5),
+	  tests/addconstraints8.cc (1.5), tests/addconstraints9.cc (1.6),
+	  tests/adddimensions1.cc (1.7), tests/adddimensions3.cc (1.5),
+	  tests/addgenerators1.cc (1.6), tests/addgenerators2.cc (1.6),
+	  tests/addgenerators3.cc (1.5), tests/addgenerators4.cc (1.5),
+	  tests/addgenerators5.cc (1.5), tests/addgenerators6.cc (1.5),
+	  tests/affineimage1.cc (1.5), tests/affineimage2.cc (1.4),
+	  tests/affinepreimage2.cc (1.4), tests/affinepreimage3.cc (1.4),
+	  tests/affinepreimage4.cc (1.5), tests/append1.cc (1.9),
+	  tests/append2.cc (1.10), tests/bounded1.cc (1.2),
+	  tests/convexhull3.cc (1.4), tests/convexhull4.cc (1.3),
+	  tests/exceptions1.cc (1.3), tests/exceptions2.cc (1.3),
+	  tests/inters1.cc (1.9), tests/inters2.cc (1.12), tests/inters3.cc
+	  (1.5), tests/inters4.cc (1.4), tests/inters5.cc (1.6),
+	  tests/inters6.cc (1.5), tests/inters7.cc (1.2),
+	  tests/limitedwidening1.cc (1.6), tests/onepoint.cc (1.4),
+	  tests/permute.cc (1.14), tests/randchull1.cc (1.12),
+	  tests/relations9.cc (1.3), tests/removedim6.cc (1.4),
+	  tests/smm1.cc (1.3), tests/universe2.cc (1.3), tests/universe3.cc
+	  (1.3), tests/universe4.cc (1.3), tests/universe5.cc (1.4),
+	  tests/widening1.cc (1.2): Renamed Polyhedron::insert(const
+	  Constraint&) to Polyhedron::add_constraint(const Constraint&).
+	  Likewise, renamed Polyhedron::insert(const Generator&) to
+	  Polyhedron::add_generator(const Generator&).
+
+2002-03-31 Sunday 21:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.37), interfaces/C/Makefile.am (1.4): Added a
+	  first starting draft of `lpenum', a program to solve linear
+	  programming problems by vertex/point enumeration.  Just a toy to
+	  test the C interface of the library.
+
+2002-03-31 Sunday 20:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.cc (1.28), Matrix.cc (1.36), PolyBase.cc (1.19),
+	  Row.cc (1.34), SatMatrix.cc (1.15): All the OK() methods are now
+	  silent if the NDEBUG symbol is defined.
+
+2002-03-31 Sunday 19:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.18): Always provide default cases in switches.
+
+2002-03-31 Sunday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.39), ConSys.inlines.hh (1.16),
+	  Constraint.inlines.hh (1.26), GenSys.defs.hh (1.55),
+	  GenSys.inlines.hh (1.17), Generator.inlines.hh (1.26), Matrix.cc
+	  (1.35), Matrix.defs.hh (1.23), Matrix.inlines.hh (1.21),
+	  PolyBase.cc (1.17), PolyBase.defs.hh (1.14), Row.defs.hh (1.39),
+	  Row.inlines.hh (1.19): Do not shadow the members of *this.
+
+2002-03-31 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.16): Started exploiting the return value of
+	  PolyBase::minimize().
+
+2002-03-31 Sunday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.57), widening1.cc (1.1): Test
+	  Polyhedron::widening_assign() with empty polyhedra.
+
+2002-03-31 Sunday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.15):
+	  PolyBase::intersection_assign_and_minimize() fixed.
+
+2002-03-31 Sunday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.56), inters7.cc (1.1): Test
+	  Polyhedron::intersection_assign_and_minimize() with empty
+	  polyhedra (exposes bugs in the current implementation of that
+	  method).
+
+2002-03-31 Sunday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PolyBase.cc (1.14), PolyBase.defs.hh (1.13):
+	  PolyBase::minimize() now returns a Boolean: false if and only if
+	  *this turns out to be empty.	Handling of empty polyhedra fixed
+	  in PolyBase::convex_hull_assign_and_minimize().
+
+2002-03-31 Sunday 09:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/convexhull4.cc (1.2): Exercise
+	  PolyBase::convex_hull_assign_and_minimize() with empty polyhedra
+	  in all possible ways (exposes more bugs in the current PolyBase
+	  implementation).
+
+2002-03-31 Sunday 08:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.13):
+	  PolyBase::convex_hull_assign_and_minimize() fixed.
+
+2002-03-31 Sunday 00:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.55), convexhull4.cc (1.1): Test
+	  Polyhedron::convex_hull_assign_and_minimize() with an empty
+	  parameter polyhedron.
+
+2002-03-30 Saturday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.20), ppl_c.h (1.19): New interface
+	  functions.
+
+2002-03-30 Saturday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PolyBase.cc (1.12), PolyBase.defs.hh (1.12):
+	  PolyBase::generators() fixed: no longer ignoring the return value
+	  of PolyBase::update_generators().
+
+2002-03-30 Saturday 11:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (1.11): Corrected bugs in methods insert(g),
+	  add_generators(gs) and add_generators_and_minimize(gs): in the
+	  case of NNC topology, we were not adding the closure points
+	  corresponding to each added point.
+
+2002-03-30 Saturday 11:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.47), GenSys.defs.hh (1.54): Added method
+	  GenSys::add_corresponding_closure_points().
+
+2002-03-30 Saturday 11:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.19), ppl_c.h (1.18): Fixed
+	  ppl_assign_Coefficient_from_mpz_t() and ppl_Generator_type().
+
+2002-03-30 Saturday 10:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.18), ppl_c.h (1.17): More functions to
+	  deal with coefficients.  New function to get the type of a
+	  generator.
+
+2002-03-30 Saturday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.inlines.hh (1.4): Added an empty implementation for
+	  PolyBase::shrink_bounding_box().
+
+2002-03-30 Saturday 10:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.54), generators2.cc (1.1): New test
+	  computing the generators of an empty polyhedron.
+
+2002-03-30 Saturday 09:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.17), ppl_c.h (1.16): New functions and
+	  bug fixes.
+
+2002-03-29 Friday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (1.10), src/PolyBase.defs.hh (1.11),
+	  tests/NNCminimize4.cc (1.2): Added methods
+	  NNC_minimize_generators() and NNC_minimize_constraints(), which
+	  enforce NNC-minimization on only one system.	They have a common
+	  kernel, which might be factored out in a "generic"
+	  NNC-minimization function (something like the simplify() method).
+	  Now test NNCminimize4.cc uses the (more lazy)
+	  NNC_minimize_constraints() function.
+
+2002-03-29 Friday 10:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.53), NNCminimize4.cc (1.1): New test put
+	  under CVS control.
+
+2002-03-28 Thursday 22:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.16), ppl_c.h (1.15):
+	  ppl_Polyhedron_shrink_bounding_box() added to the C interface.
+
+2002-03-28 Thursday 20:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc (1.27), Generator.defs.hh (1.54), Matrix.cc
+	  (1.34), NNC_Polyhedron.cc (1.5), PolyBase.cc (1.9): Added method
+	   bool Generator::is_corresponding_closure_point(const Generator&)
+	  const; Methods NNC_Polyhedron::is_necessarily_closed() and
+	  PolyBase::NNC_minimize() updated to use the above method; this
+	  also corrects a bug in the previous implementations.
+
+	  Added a \param Doxygen command in Matrix.cc to avoid a warning.
+
+2002-03-28 Thursday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.defs.hh (1.10): Redeclared `shrink_bounding_box' as
+	  template <class Box> void shrink_bounding_box(Box& box) const;
+	  the previous declaration was too concrete.
+
+2002-03-28 Thursday 16:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.defs.hh (1.9): Added the declaration and
+	  documentation of template <class Interval> void
+	  shrink_bounding_box(std::vector<Interval>& box) const.
+
+2002-03-28 Thursday 15:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.52), NNCinclusion1.cc (1.1),
+	  NNCminimize1.cc (1.1), NNCminimize2.cc (1.1), NNCminimize3.cc
+	  (1.1): Added a test on the inclusion method for NNC_Polyhedron
+	  and three tests for the full minimization of NNC_Polyhedron.
+
+2002-03-28 Thursday 15:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: PolyBase.cc (1.8), PolyBase.defs.hh (1.8): Added method
+	  PolyBase::NNC_minimize() performing "full" minimization of
+	  constraint and generator systems of a NNC_Polyhedron.
+	  Temporarily public for testing and debugging purposes.
+
+2002-03-28 Thursday 15:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.cc (1.26): Printing closure points as c(lin-expr).
+
+2002-03-28 Thursday 09:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.31), GenSys.cc (1.46): Methods get() and
+	  print() of classes ConSys and GenSys modified in order to:  -
+	  read (and print) the new kinds of constraint/generators types;  -
+	  check for the correspondence between declared and actual row
+	  types    when reading them in;  - check for the well-formedness
+	  of the read ConSys/GenSys, using OK().
+
+2002-03-27 Wednesday 19:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.19), TODO (1.19): Updated.
+
+2002-03-27 Wednesday 19:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.18), interfaces/C/ppl_c.cc (1.15),
+	  interfaces/Prolog/ppl_prolog.outlines.hh (1.22),
+	  src/Constraint.defs.hh (1.50), src/Constraint.inlines.hh (1.25),
+	  src/Generator.inlines.hh (1.25), src/Row.defs.hh (1.38),
+	  src/Row.inlines.hh (1.18): Constraint::coefficient(void) and
+	  Row::coefficient(void) renamed to
+	  Constraint::inhomogeneous_term(void) and
+	  Row::inhomogeneous_term(void).
+
+2002-03-27 Wednesday 18:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.defs.hh (1.7): Documentation for PolyBase::OK()
+	  improved.
+
+2002-03-27 Wednesday 18:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.17), interfaces/C/ppl_c.cc (1.14), src/NNC_Polyhedron.cc
+	  (1.4), src/PolyBase.cc (1.7), src/PolyBase.defs.hh (1.6),
+	  src/Polyhedron.cc (1.145): Now the default for PolyBase::OK() is
+	  not to check for non-emptiness.  This is more consistent since
+	  OK() without arguments now checks for well-formedness only as all
+	  the other methods with the same name.  Use OK(true) if you want
+	  the extra service of non-emptiness checking.
+
+2002-03-27 Wednesday 18:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.30), ConSys.defs.hh (1.38), Constraint.cc
+	  (1.21), Constraint.defs.hh (1.49), Constraint.inlines.hh (1.24),
+	  GenSys.cc (1.45), GenSys.defs.hh (1.53), Generator.cc (1.25),
+	  LinExpression.defs.hh (1.31), Matrix.cc (1.33), Matrix.defs.hh
+	  (1.22), Matrix.inlines.hh (1.20), NNC_Polyhedron.cc (1.3),
+	  NNC_Polyhedron.inlines.hh (1.3), PolyBase.cc (1.6),
+	  PolyBase.defs.hh (1.5), Poly_Con_Relation.defs.hh (1.5),
+	  Poly_Gen_Relation.defs.hh (1.5), Row.defs.hh (1.37),
+	  Row.inlines.hh (1.17), Topology.hh (1.3): Replaced everywhere
+	  "non_necessarily_closed" by "not_necessarily_closed".  Improved
+	  the documentation of class Constraint to consider examples using
+	  strict inequalities. Added brief description for classes
+	  Poly_xxx_Relation and for the const_iterators of ConSys and
+	  GenSys.
+
+2002-03-27 Wednesday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.5): PolyBase::OK(bool check_not_empty) was
+	  disregarding its argument in some cases.  This bug was hiding two
+	  bogus assertions in PolyBase::add_constraints() and
+	  PolyBase::add_constraints_and_minimize().
+
+2002-03-27 Wednesday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/addconstraints1.cc (1.5): Unused variable removed.
+
+2002-03-27 Wednesday 16:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: NNC_Polyhedron.defs.hh (1.3), Polyhedron.defs.hh (1.89):
+	  Removed duplicate documentation stuff from Polyhedron.defs.hh.
+	  Documented constructors of classes Polyhedron and NNC_Polyhedron.
+	  Provided a brief explanation of the reason why we do have 2
+	  classes.
+
+2002-03-27 Wednesday 15:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.16): At a closer scrutiny, the <CODE> and </CODE> tags
+	  are actually superior to any other alternative.  Remove the TODO
+	  item that suggested not to use them.
+
+2002-03-27 Wednesday 12:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.37), GenSys.defs.hh (1.52),
+	  Generator.defs.hh (1.53), PolyBase.defs.hh (1.4), Row.cc (1.33):
+	  Started adjusting the documentation to made it aware of the new
+	  kind of constraints and generators.  Corrected a couple of
+	  docuementation problems causing Doxygen warnings.
+
+2002-03-27 Wednesday 10:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (1.4): One FIXME removed: was related to an
+	  efficiency concern where we really do not have any efficiency
+	  problem.
+
+2002-03-27 Wednesday 08:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.44), PolyBase.cc (1.3): Merged the changes
+	  made to the `strict' branch after yesterday's merge.
+
+2002-03-27 Wednesday 08:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.15), src/ConSys.defs.hh (1.36), src/ConSys.inlines.hh
+	  (1.15), src/Constraint.defs.hh (1.48), src/Constraint.inlines.hh
+	  (1.23), src/GenSys.defs.hh (1.51), src/GenSys.inlines.hh (1.16),
+	  src/Generator.defs.hh (1.52), src/Generator.inlines.hh (1.24),
+	  src/Integer.defs.hh (1.3), src/LinExpression.defs.hh (1.30),
+	  src/LinExpression.inlines.hh (1.14), src/Matrix.defs.hh (1.21),
+	  src/Matrix.inlines.hh (1.19), src/PolyBase.defs.hh (1.3),
+	  src/PolyBase.inlines.hh (1.3), src/Row.defs.hh (1.36),
+	  src/Row.inlines.hh (1.16), src/SatMatrix.defs.hh (1.16),
+	  src/SatMatrix.inlines.hh (1.10), src/SatRow.defs.hh (1.12),
+	  src/SatRow.inlines.hh (1.12): Added a specialization of the the
+	  std:swap() function for LinExpression.  Solved several
+	  documentation and stylistic issues concerning our specializations
+	  of std::swap().
+
+2002-03-27 Wednesday 08:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc, PolyBase.cc (strict.[13,31]): Method
+	  GenSys::relation_with(c) now supports all the possible
+	  combinations of topology and type for both *this and the
+	  constraint parameter c.
+
+2002-03-27 Wednesday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.14), src/Constraint.defs.hh (1.47), src/Generator.defs.hh
+	  (1.51): Avoid using \enum when it is not strictly necessary.
+
+2002-03-26 Tuesday 23:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-browse.doxyconf-latex.in (1.14),
+	  doc/devref-print.doxyconf-latex.in (1.14),
+	  doc/devref.doxyconf-html.in (1.15),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.4), src/ConSys.cc (1.29),
+	  src/ConSys.defs.hh (1.35), src/ConSys.inlines.hh (1.14),
+	  src/Constraint.cc (1.20), src/Constraint.defs.hh (1.46),
+	  src/Constraint.inlines.hh (1.22), src/GenSys.cc (1.43),
+	  src/GenSys.defs.hh (1.50), src/GenSys.inlines.hh (1.15),
+	  src/Generator.cc (1.24), src/Generator.defs.hh (1.50),
+	  src/Generator.inlines.hh (1.23), src/LinExpression.cc (1.11),
+	  src/LinExpression.defs.hh (1.29), src/LinExpression.inlines.hh
+	  (1.13), src/Makefile.am (1.31), src/Matrix.cc (1.32),
+	  src/Matrix.defs.hh (1.20), src/Matrix.inlines.hh (1.18),
+	  src/NNC_Polyhedron.cc (1.2), src/NNC_Polyhedron.defs.hh (1.2),
+	  src/NNC_Polyhedron.inlines.hh (1.2), src/NNC_Polyhedron.types.hh
+	  (1.2), src/PolyBase.cc (1.2), src/PolyBase.defs.hh (1.2),
+	  src/PolyBase.inlines.hh (1.2), src/PolyBase.types.hh (1.2),
+	  src/Polyhedron.cc (1.144), src/Polyhedron.defs.hh (1.88),
+	  src/Polyhedron.inlines.hh (1.18), src/Row.cc (1.32),
+	  src/Row.defs.hh (1.35), src/Row.inlines.hh (1.15),
+	  src/Topology.hh (1.2), src/conversion.cc (1.25), src/minimize.cc
+	  (1.19), src/simplify.cc (1.14), tests/Makefile.am (1.51),
+	  tests/exceptions2.cc (1.2), tests/relations9.cc (1.2): The
+	  `strict' branch has been merged.
+
+2002-03-26 Tuesday 21:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.13), ppl_c.h (1.14): Implemented the
+	  error handling and reporting mechanisms.  Many other
+	  improvements.
+
+2002-03-26 Tuesday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/minimize.cc (1.18): Throw `std::runtime_error' instead of
+	  `std::invalid_argument'.  Removed the inclusion of two unneeded
+	  header.
+
+2002-03-26 Tuesday 18:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: Makefile.am (1.3), ppl_c.cc (1.12), ppl_c.h
+	  (1.13): All the interface functions should be there now.
+
+2002-03-26 Tuesday 17:54  Elisa Ricci
+
+	* src/: GenSys.cc, Polyhedron.cc, Polyhedron.defs.hh, minimize.cc
+	  (positive.[2,6,4,12]): Some changes in the part controlled by
+	  "POSITIVE_TRANSFORMATION".
+
+2002-03-26 Tuesday 17:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (strict.12): Some progresses in the generalization
+	  of method GenSys::relation_with(c) to work with a NNC system of
+	  generators.
+
+2002-03-26 Tuesday 17:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.23): Refer to handles
+	  rather than addresses.
+
+2002-03-26 Tuesday 16:41  Elisa Ricci
+
+	* tests/exceptions2.cc (strict.3): Added other two tests to show
+	  when an exception is thrown.
+
+2002-03-26 Tuesday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.28): Friend declarations fixed.
+
+2002-03-26 Tuesday 16:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Poly_Con_Relation.inlines.hh (strict.1): Bug (related to
+	  operator precedence) corrected in method implies().
+
+2002-03-26 Tuesday 14:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am, relations9.cc (strict.[2,1]): Test
+	  relations9 calls method PolyBase::relation_with(c) when *this is
+	  a necessarily closed polyhedron and c is a strict inequality.
+
+2002-03-26 Tuesday 13:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc, PolyBase.cc (strict.[11,30]): Methods
+	  PolyBase::relation_with(c) and GenSys::relation_with(c) modified
+	  to work as expected when *this.topology() == NECESSARILY_CLOSED
+	  and the c.type() == STRICT_INEQUALITY.
+
+2002-03-26 Tuesday 11:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, GenSys.cc, PolyBase.cc, PolyBase.defs.hh
+	  (strict.[13,10,29,9]): Some cleaning in ConSys/GenSys methods
+	  adjust_topology_and_dimension().  Adjusted a few comments and
+	  removed a few FIXME and CHECKME notes.
+
+2002-03-26 Tuesday 11:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.13): More things to do after the `strict' merge.
+
+2002-03-26 Tuesday 11:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: GNU/ppl_gprolog.pl (1.3),
+	  SICStus/ppl_sicstus.cc (1.45), YAP/ppl_yap.cc (1.3): Update so
+	  that they are all consistent with each other and SWI
+
+2002-03-25 Monday 21:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: NNC_Polyhedron.cc, NNC_Polyhedron.defs.hh,
+	  PolyBase.defs.hh, Polyhedron.cc, Polyhedron.defs.hh
+	  (strict.[3,3,8,4,4]): Added explicit constructors (to be used as
+	  conversion functions) for building a Polyhedron starting from a
+	  NNC_Polyhedron, and viceversa.  Added method	 bool
+	  NNC_Polyhedron::is_topologucally_closed() used in the above
+	  constructor to check if the argument is legal.
+	  NNC_Polyhedron::limited_widening_assign() reimplemented using the
+	  new constructor functions.
+
+2002-03-25 Monday 21:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.28): Corrected a bug in the assignment
+	  operator, which was not clearing matrices when a zero-dim
+	  polyhedron was assigned.
+
+2002-03-25 Monday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.12): More things to do after the merge with the `strict'
+	  branch.
+
+2002-03-25 Monday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.11), ppl_c.h (1.12): More interface
+	  functions added.
+
+2002-03-25 Monday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.10), ppl_c.h (1.11): Widenings added.
+
+2002-03-25 Monday 17:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: NNC_Polyhedron.cc, NNC_Polyhedron.defs.hh (strict.[2,2]):
+	  Method limited_widening_assign() overridden in NNC_Polyhedron to
+	  avoid an annoying problem when testing with china.
+
+2002-03-25 Monday 17:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.27): When looping on constraints in
+	  widening_assign(), now going upward so as to avoid reversing the
+	  ordering of constraints.
+
+2002-03-25 Monday 16:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.9), ppl_c.h (1.10): Added an interface
+	  for the Polyhedron::relation_with() methods.
+
+2002-03-25 Monday 16:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.12): Predicate
+	  add_dimensions_and_constraints/2 added.
+
+2002-03-25 Monday 16:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (strict.12): Trivially true constraints (such as 1
+	  > 0, the eps_leq_one constraint) should not be considered by
+	  method "has_strict_inequalities()".
+
+2002-03-25 Monday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Poly_Gen_Relation.defs.hh (1.4),
+	  Poly_Gen_Relation.inlines.hh (1.5): Provide a hidden
+	  Poly_Gen_Relation::get_flags() method for use by the foreign
+	  language interfaces.
+
+2002-03-25 Monday 15:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Poly_Con_Relation.defs.hh (1.4),
+	  Poly_Con_Relation.inlines.hh (1.5): Provide a hidden
+	  Poly_Con_Relation::get_flags() method for use by the foreign
+	  language interfaces.
+
+2002-03-25 Monday 15:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.143), Polyhedron.defs.hh (1.87): Both
+	  Polyhedron::relation_with() methods were erroneously not declared
+	  const.
+
+2002-03-25 Monday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.8), ppl_c.h (1.9): Added more
+	  interface functions for ordinary polyhedra.
+
+2002-03-24 Sunday 21:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.26): Coorected trivial bug in
+	  check_universe().
+
+2002-03-24 Sunday 20:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.7), ppl_c.h (1.8): All the
+	  functionality provided by the C++ classes Constraint, ConSys,
+	  Generator and GenSys is now available to the C user.
+
+2002-03-24 Sunday 20:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.25): Method check_universe() is now
+	  correct for NNC polyhedra.  Try to exploit the boolean value
+	  returned by update_generators() to shorthen computations when
+	  possible.
+
+2002-03-24 Sunday 16:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: PolyBase.cc, PolyBase.defs.hh (strict.[24,7]): Methods
+	  obtain_sorted_constraints(), obtain_sorted_generators(),
+	  obtain_sorted_constraints_with_sat_c(),
+	  obtain_sorted_generators_with_sat_g() now declared const, since
+	  they do not logically modify the polyhedron.	As a consequence,
+	  simplified (by removing the const_cast's) the methods
+	  constraints(), generators(), intersection_assign(),
+	  convex_hull_assign(), convex_hull_assign_and_minimize().
+
+2002-03-24 Sunday 15:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.6), ppl_c.h (1.7): Added all the
+	  functions for the handling of generators and generators' systems.
+
+2002-03-24 Sunday 10:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.23): Patched method convex_hull_assign().
+	  The error (not correctly handling the sorting of gen_sys rows for
+	  the parameter y) was NOT related to the changes done in the
+	  strict branch.  Changed (detailed) doxygen comments for the
+	  methods obtain_sorted_constraints() and
+	  obtain_sorted_generators().
+
+2002-03-23 Saturday 19:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.5), ppl_c.h (1.6): Finished the
+	  implementation of const iterators for constraints.
+
+2002-03-23 Saturday 14:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.13), configure.ac (1.36): Support C compilers that
+	  do not support `const' and/or `inline'.
+
+2002-03-23 Saturday 14:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.4), ppl_c.h (1.5): Started interfacing
+	  ConSys::const_iterator.
+
+2002-03-23 Saturday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/: Makefile.am (1.7), gp_clpq.pl (1.3),
+	  ppl_gprolog.cc (1.9): The GNU Prolog interface is finally
+	  operational.	The problem was that a GNU Prolog integer is not
+	  wide enough to hold a memory address:  now memory addresses are
+	  represented by terms of the form `[u1|u2]' where `u1' and `u2'
+	  are GNU Prolog integers.
+
+2002-03-23 Saturday 13:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/track_allocation.hh (1.3): This was always
+	  commented out due to a typo.	Missing qualification added.
+
+2002-03-22 Friday 20:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (strict.11): Method satisfies_all_constraints(g)
+	  reimplemented to work with NNC polyhedra and to correctly deal
+	  with potential (legal) topology mismatches.  As a consequence,
+	  now PolyBase::relation_with(g) also works for NNC polyhedra
+	  and/or an NNC generator parameter g.
+
+2002-03-22 Friday 20:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.22): The inclusion operator<=
+	  re-implemented:  - using the new scalaro product operator ^ when
+	  appropriate;	- changed the order of the two nested loops to
+	  factor out some    tests that were repeated unnecessarily.
+
+2002-03-22 Friday 20:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Row.cc, Row.defs.hh (strict.[2,3]): Added the "strict"
+	  scalar product operator (PPL::operator^) computing the scalar
+	  product of two Row objects but ignoring the last coefficient of
+	  the first row.
+
+2002-03-22 Friday 15:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, GenSys.cc, PolyBase.cc (strict.[10,9,21]):
+	  Metods GenSys::affine_image(v, e, d) and
+	  ConSys::affine_preimage(v, e, d) no longer require the expression
+	  `e' to have the _same_ number of columns of the matrix; now they
+	  only require dimension compatibility.  This change, while
+	  allowing a correct implementation for NNC topology matrices, also
+	  turns out to be a potentially remarkable performance improvement.
+
+	  The corresponding methods of PolyBase changed accordingly:  - no
+	  longer performing the dangerous const_cast on the expression;  -
+	  missing assertion OK(false) placed on exit.
+
+2002-03-22 Friday 12:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.20): Cleaned the code trying to preserve
+	  the sortedness of matrices when swapping epsilon columns in
+	  methods add_dimensions*.  In operator<=, avoiding repeated tests
+	  on the generator kind when computing the scalar products for NNC
+	  polyhedra.
+
+2002-03-22 Friday 10:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.19): Corrected a bug in
+	  add_dimensions_and_constraint().  The OK() assertion at the end
+	  of limited_widening_assign() changed into OK(false), because the
+	  parameter cs may cause the polyhedron to become inconsistent. In
+	  widening_assign(), now adding the epsilon constraints (instead of
+	  the positivity one) when the topology requires them.
+
+2002-03-21 Thursday 18:08  Elisa Ricci
+
+	* src/: GenSys.cc, GenSys.defs.hh, Matrix.defs.hh, Polyhedron.cc,
+	  Polyhedron.defs.hh, conversion.cc, minimize.cc
+	  (positive.[1,1,2,5,3,6,11]): Started to implement the new method
+	  that use a transformation to compute the system of constraints of
+	  a positive polyhedron described by its system of generators: this
+	  method is controlled by the flag "POSITIVE_TRANSFORMATION".
+
+2002-03-21 Thursday 16:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.18): Corrected a bug in the constructor
+	  PolyBase(t, gs): we were breaking the correctenss of the
+	  sortedness flag.
+
+2002-03-21 Thursday 16:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.17): Added missing OK(bool) assertions on
+	  exit of constructors and methos operator<=,
+	  intersection_assign(ph), convex_difference_assign(ph), insert(g),
+	  insert(c), add_dimensions_and_constraints(),
+	  add_generators_and_minimize().
+
+	  Corrected \epsilon-swapping bugs in methods add_dimensions(...),
+	  add_dimensions_and_project(), add_dimensions_and_embed() and
+	  add_dimensions_and_constraints().
+
+	  Patched topology-related bug in limited_widening_assign().
+
+2002-03-21 Thursday 15:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, GenSys.cc (strict.[9,8]): Methods get() and
+	  print(), i.e., input/output operators >> and <<, now also handle
+	  topology information.
+
+2002-03-21 Thursday 10:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.22): Added a note to
+	  try and explain when the _and_minimize predicates should be used.
+
+2002-03-21 Thursday 09:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.21): Two bugs corrected
+	  in the description of the "relation_with" predicates.
+
+2002-03-20 Wednesday 19:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.16): Patched methods
+	  add_dimensions_and_embed(), add_dimensions_and_project() and
+	  add_dimensions() to properly handle the "sorted" flag of
+	  matrices.  Corrected a small bug in
+	  add_dimensions_and_constraints(), where we were trying to swap a
+	  column with itself.
+
+2002-03-20 Wednesday 17:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.15): In constructors for NNC polyhedra,
+	  add the \epsilon constraint in the order that is likely to
+	  preserve the sorted flag.
+
+2002-03-20 Wednesday 17:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh, Generator.cc (strict.[5,3]): Just a
+	  few spaces added for style.
+
+2002-03-20 Wednesday 17:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (strict.8): Corrected a bug in
+	  has_strict_inequalities() whereby we were returning "true" when
+	  finding the epsilon_geq_zero() constraint.
+
+2002-03-20 Wednesday 16:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh, PolyBase.cc (strict.[4,14]): A
+	  strict inequality has a _negative_ \epsilon coefficient
+	  (previously, we were testing for a _non-zero_ coefficient,
+	  causing a bug in method operator<=(PolyBase&, PolyBase&).
+
+2002-03-20 Wednesday 16:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.defs.hh (strict.6): Constructors of the base class
+	  PolyBase are now protected, so that the user _has_ to create
+	  objects of the derived classes Polyhedron and NNC_Polyhedron.
+
+2002-03-20 Wednesday 15:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.13): Corrected a bug in operator<= for
+	  the NNC case.
+
+2002-03-20 Wednesday 14:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.12): Implemented operator<= for NNC
+	  polyhedra.  Added a couple of missing assertions to
+	  add_generators().
+
+2002-03-20 Wednesday 13:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, GenSys.cc, Matrix.cc (strict.[7,7,8]): In
+	  Matrix::OK(), restored the test checking that num_columns() == 0
+	  whenever num_rows() == 0.  Added assertions to
+	  ConSys::adjust_topology_and_dimension() and
+	  GenSys::adjust_topology_and_dimension().
+
+2002-03-20 Wednesday 12:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
+	  (strict.[7,4,3]): Corrected bugs:  - set_necessarily_closed() and
+	  set_non_necessarily_closed() now also    set the right topology
+	  for all the rows in the matrix;  - grow(...) no longer asserts
+	  OK() on exit, because it may leave	the matrix in a state where
+	  num_rows() == 0 and num_columns() > 0;  - grow(...) was comparing
+	  the first row to be added with the last row	 in the matrix even
+	  when there were no rows in the matrix;  - insert(...) no longer
+	  swaps a coefficient with itself when	  num_columns() and
+	  row.size() do match.
+
+2002-03-20 Wednesday 11:20  Elisa Ricci
+
+	* tests/exceptions2.cc (strict.2): Added some other tests that show
+	  when an exception is thrown: one of them shows that there is
+	  still a problem with the function Matrix::grow().
+
+2002-03-19 Tuesday 19:02  Elisa Ricci
+
+	* tests/: Makefile.am, exceptions2.cc (strict.[1,1]): In
+	  "exceptions2.cc" put two tests that show that an exception is
+	  thrown if we want to built a Polyhedron starting from a system of
+	  constraints that contains strict-inequalities or a a system of
+	  generators that contains closure_points.
+
+2002-03-19 Tuesday 18:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.11): The method OK() improved to check
+	  invariants for both NC and NNC polyhedra.
+
+2002-03-19 Tuesday 18:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (strict.6): One of the new tests added to OK() was
+	  causing Matrix::grow() to fail.  Temporarily commented out.
+
+2002-03-19 Tuesday 16:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (strict.6): Method OK() now merely calls
+	  Matrix::OK(), since there are no other meaningful tests to
+	  perform. Overriding used just for better documenting this fact.
+
+2002-03-19 Tuesday 16:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (strict.5): In method OK(), added a check on
+	  matrices with no rows.
+
+2002-03-19 Tuesday 16:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (strict.6): In method OK(), no longer checking for
+	  topology mismatches between the systems and its generators (this
+	  is already done when calling Matrix::OK()).  No longer checking
+	  for the existence of a point, because points are only required if
+	  the GenSys is representing a polyhedron (check has to be
+	  performed by PolyBase::OK()).
+
+2002-03-19 Tuesday 15:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (strict.4): Method OK() now checks for topology
+	  mismatches between the matrix and its rows.  The check on the
+	  minimum number of columns updated to work correctly with NNC
+	  topology matrices.
+
+2002-03-19 Tuesday 15:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc, Generator.inlines.hh (strict.[2,4]): Method
+	  OK() updated to perform checks of invariants for generators
+	  defined on the NNC topology.
+
+2002-03-19 Tuesday 15:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.cc (strict.1): In method OK(), added a check on the
+	  minimum number of coefficients of a row (the minimum depends on
+	  the row topology).
+
+2002-03-19 Tuesday 13:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (strict.5): In function OK(), when checking for the
+	  existence of a point, we now use is_point() to (correctly)
+	  disregard closure points.  Also checking for topology mismatches
+	  between gen_sys and its elements.
+
+2002-03-19 Tuesday 11:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.10): Exploiting the new explicit
+	  conversions from Constraint/Generator to LinExpression in
+	  PolyBase methods   - insert(const Constraint&)   - insert(const
+	  Generator&)	- convex_difference_assign(const PolyBase&).
+
+2002-03-19 Tuesday 11:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.cc (strict.2): Corrected a bug in the newly
+	  introduced constructors.
+
+2002-03-19 Tuesday 11:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.cc, LinExpression.defs.hh (strict.[1,1]):
+	  Added explicit constructors taking a constraint/generator as
+	  parameter: they are PPL_INTERNAL and extract from the parameter a
+	  "necessarily closed" copy of the corresponding linear expression.
+
+2002-03-19 Tuesday 01:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  src/Makefile.am (strict.[1,1,1,3]): Added files NNC_Polyhedron.*
+	  and PolyBase_* to Makefile.am and to the INPUT_FILE flags for
+	  doxygen devref configuration files.
+
+2002-03-19 Tuesday 01:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.9): Consistency modification: all static
+	  functions defined to just throw an exception now print the class
+	  name of the invoking object (dirty kludge using the topology()
+	  accessor; may be improved).  Added a whole set of such functions
+	  for reporting topology clashes and illegal generator systems.
+	  Adjusted several comments.  In method remove_dimensions, the case
+	  when we remove _all_ dimensions captured earlier.  Provided a
+	  temporary patches for the methods PolyBase::insert(const
+	  Constraint&) and PolyBase::insert(const Generator&).	Added
+	  topology-inconsistency checks to add_generators(gs).
+
+2002-03-19 Tuesday 00:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (strict.4): Methods reordered according
+	  to Polyhedron.defs.hh.
+
+2002-03-19 Tuesday 00:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.defs.hh (strict.5): Method topology() made public.
+
+2002-03-19 Tuesday 00:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: NNC_Polyhedron.cc, NNC_Polyhedron.defs.hh,
+	  NNC_Polyhedron.inlines.hh, NNC_Polyhedron.types.hh
+	  (strict.[1,1,1,1]): Put under CVS control.
+
+2002-03-19 Tuesday 00:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (strict.3): Removed useless include
+	  directives (already included by PolyBase.defs.hh).
+
+2002-03-19 Tuesday 00:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/minimize.cc (strict.2): In both minimize(...) methods,
+	  modified the emptyness check after conversion in order to work
+	  for NNC Polyhedra too.
+
+2002-03-18 Monday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-browse.doxyconf-latex.in (1.11),
+	  doc/user-print.doxyconf-latex.in (1.11),
+	  doc/user.doxyconf-html.in (1.13), interfaces/C/ppl_c.cc (1.3),
+	  interfaces/C/ppl_c.h (1.4): Several improvements to the C
+	  interface.
+
+2002-03-18 Monday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.17), doc/devref-browse.doxyconf-latex.in
+	  (1.13), doc/devref-print.doxyconf-latex.in (1.13),
+	  doc/devref.doxyconf-html.in (1.14),
+	  doc/user-browse.doxyconf-latex.in (1.10),
+	  doc/user-print.doxyconf-latex.in (1.10),
+	  doc/user.doxyconf-html.in (1.12), interfaces/C/ppl_c.cc (1.2),
+	  interfaces/C/ppl_c.h (1.3), src/LinExpression.defs.hh (1.27):
+	  Started merging the new C interface.
+
+2002-03-18 Monday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.11): Another thing to remember.
+
+2002-03-18 Monday 15:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.8): Corrected a (just introduced) bug in
+	  add_dimensions_and_constraints(ConSys& cs).
+
+2002-03-18 Monday 14:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.10): More things we should not forget to do.
+
+2002-03-18 Monday 14:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.defs.hh, PolyBase.cc (strict.[4,7]): Patched method
+	  PolyBase::add_generators_and_minimize(gs).
+
+2002-03-18 Monday 14:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.6): Patched method
+	  PolyBase::add_dimensions_and_constraints(cs).
+
+2002-03-18 Monday 13:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.9): Things todo just after merging the `strict' branch.
+
+2002-03-18 Monday 11:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.5): Adding topology-compatibility checks
+	  where needed, throwing exceptions if necessary.  Consistently
+	  using the methods [ConSys/GenSys]::adjust_topology_and_dimension
+	  when building a new polyhedron (or augmenting an existing one)
+	  starting from a ConSys or a GenSys.  When building an NNC
+	  polyhedron using the constructor PolyBase(GenSys&), we now add a
+	  closure point for each point in the GenSys.  Patched the
+	  specification of convex_difference_assign() to work correctly for
+	  NNC polyhedra.  Patched the methods add_dimensions_and_* and
+	  remove*_dimensions() to work correctly for NNC polyhedra.  Added
+	  a few "placeholder" exceptions to point out places where the
+	  current implementation is still not correct.
+
+2002-03-18 Monday 11:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.defs.hh (strict.4): In doxygen comments, added
+	  specification for exceptions that should be thrown when
+	  identifying a topology-incompatibility.
+
+2002-03-18 Monday 11:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (strict.4): Using Matrix::swap_columns.  Corrected
+	  a bug in GenSys::insert(g).
+
+2002-03-18 Monday 11:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, ConSys.defs.hh (strict.[5,3]): Method
+	  contains_strict_inequalities() renamed as
+	  has_strict_inequalities().  Using Matrix::swap_columns(i, j)
+	  whene swapping the \epsilon coefficients after dimension changes.
+
+2002-03-18 Monday 11:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc, Matrix.defs.hh (strict.[3,3]): Added method
+	  Matrix::swap_columns(size_t i, size_t j) to factorize the several
+	  places where we swap the column of \epsilon coefficients.
+
+2002-03-18 Monday 11:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.defs.hh, Generator.cc, Generator.inlines.hh
+	  (strict.[2,1,3]): Implemented friend function closure_point(...)
+	  returning a closure point.  Added static method
+	  zero_dim_closure_point().
+
+2002-03-17 Sunday 14:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc, GenSys.defs.hh (strict.[3,3]): Added methods
+	  adjust_topology_and_dimensions(), has_closure_points() and
+	  has_points() to help checking for legality and automatically
+	  adjusting generator systems when building polyhedra.
+
+2002-03-17 Sunday 14:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (strict.4): Optimized the method
+	  contains_strict_inequalities() by factoring out the topology
+	  tests.
+
+2002-03-17 Sunday 11:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: Makefile.am (1.4), ppl_yap.cc (1.2),
+	  ppl_yap.pl (1.2): Slow and difficult progress on the YAP
+	  interface.
+
+2002-03-17 Sunday 11:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: definitions.dox (1.42), ppl.sty (1.6): Introcude the macro
+	  \cone.  Fix the macro \linspace.  Define commands using the
+	  \{new,renew,provide}command* form.
+
+2002-03-17 Sunday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.35): Configuration for producing dlopen modules
+	  and WIN32 dlls.
+
+2002-03-17 Sunday 08:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (strict.3): Add missing `inline'
+	  qualifiers.
+
+2002-03-17 Sunday 00:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: PolyBase.cc, PolyBase.defs.hh, PolyBase.inlines.hh
+	  (strict.[4,3,3]): The Topology parameter is now the first one in
+	  constructors.  Added the missing topology consistency assertion
+	  to limited_widening_assign.  Using the static Constraint members
+	  for adding the positivity and epsilon related constraints in the
+	  constructors.  Constructor PolyBase(Topology, ConSys) now
+	  automatically adjust the constraint system according to the first
+	  parameter, throwing an exception if we try to insert a strict
+	  inequality into a Polyhedron.
+
+2002-03-17 Sunday 00:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh
+	  (strict.[3,2,2]): Added the assignment operator. All methods are
+	  now inlined.
+
+2002-03-17 Sunday 00:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.defs.hh, GenSys.inlines.hh (strict.[2,3]): The
+	  Topology parameter is now the first one in constructors.
+
+2002-03-17 Sunday 00:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, ConSys.defs.hh, ConSys.inlines.hh
+	  (strict.[3,2,3]): Added methods adjust_topology_and_dimensions()
+	  and contains_strict_inequality() to help checking for legality
+	  and automatically adjusting constraint systems when building
+	  polyhedra.  Now the Topology parameter is the first one in
+	  constructors.
+
+2002-03-17 Sunday 00:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc, Constraint.defs.hh, Constraint.inlines.hh
+	  (strict.[3,2,3]): Added static methods to produce the two
+	  (zero-dim) epsilon constraints replacing the positivity
+	  constraint in NNC polyhedra (0 \leq \epsilon \leq 1).  Methods
+	  is_trivial_true() and is_trivial_false() modified to also work
+	  for strict inequalities.
+
+2002-03-16 Saturday 13:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, ConSys.defs.hh, ConSys.inlines.hh,
+	  Constraint.cc, Constraint.inlines.hh, GenSys.cc, GenSys.defs.hh,
+	  GenSys.inlines.hh, Generator.inlines.hh, Makefile.am, Matrix.cc,
+	  Matrix.defs.hh, Matrix.inlines.hh, PolyBase.cc, PolyBase.defs.hh,
+	  PolyBase.inlines.hh, Polyhedron.cc, Row.defs.hh, Row.inlines.hh,
+	  conversion.cc (strict.[2,1,2,2,2,2,1,2,2,2,2,2,2,3,2,2,2,2,3,3]):
+	  In constructors, now using an element of the enum Topology in
+	  order to control the kind of object created (instead of the
+	  previous boolean).  Started adding controls on Topology
+	  mismatches and automatic conversions of objects when needed.
+
+2002-03-16 Saturday 13:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Topology.hh (strict.1): Put under CVS control: new header
+	  file for the enumeration controlling the topological kind of Row,
+	  Matrix, Constraint, Generator, ConSys, GenSys and PolyBase
+	  objects.
+
+2002-03-15 Friday 11:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.inlines.hh (strict.2): Re-ordering the initializer in Row
+	  constrauctors to avoid the warnings.
+
+2002-03-15 Friday 10:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, ConSys.inlines.hh, Constraint.cc,
+	  Constraint.defs.hh, Constraint.inlines.hh, GenSys.cc,
+	  GenSys.inlines.hh, Generator.defs.hh, Generator.inlines.hh,
+	  LinExpression.inlines.hh, Matrix.cc, Matrix.defs.hh,
+	  Matrix.inlines.hh, Row.defs.hh, Row.inlines.hh, conversion.cc
+	  (strict.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2]): Removed enumeration
+	  Type from class Row: added enumerations PolyhedronKind and
+	  RowKind; they are merged into a single object using new class
+	  Row::Type.  Rows now rememberif they have or not the \epsilon
+	  coefficient.
+
+	  Constructors for Matrix now have a boolean flag indicating
+	  whether or not the matrix has the \epsilon coefficient. The flag
+	  is remembered in order to correctly set the type of new rows.
+
+	  Added support for creating constraints that are strict
+	  inequalities and generators that are closure points. Added
+	  support for adding these two new kind of objects to constraint
+	  systems and generator systems (with automatic detection and
+	  resizing if needed).
+
+	  Constraints, generators and the respective systems
+	  space-dimensions now depend on the Polyhedron kind of the
+	  corresponding rows.
+
+2002-03-15 Friday 08:55  Elisa Ricci
+
+	* doc/definitions.dox (1.41): Improved the proposition that is
+	  before the definition of the ray space: we were using an object
+	  that was not defined before.
+
+2002-03-14 Thursday 15:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.20): Draft descriptions
+	  for all the new predicates added.  A few other small improvements
+	  made.
+
+2002-03-14 Thursday 13:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.21): Improved
+	  ppl_affine_image and ppl_affine_preimage.
+
+2002-03-14 Thursday 12:22  Elisa Ricci
+
+	* doc/definitions.dox (1.40): Improved the definition of minimal
+	  proper face.
+
+2002-03-14 Thursday 10:56  Elisa Ricci
+
+	* doc/definitions.dox (1.39): Corrected two errors in the
+	  definition of minimal proper face: I have written "C" instead of
+	  "P".
+
+2002-03-14 Thursday 09:21  Elisa Ricci
+
+	* doc/definitions.dox (1.38): Improved the documentation about the
+	  faces of a polyhedron.
+
+2002-03-13 Wednesday 21:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.50), relations9.cc (1.1): New test.
+
+2002-03-13 Wednesday 20:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.20),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.2),
+	  interfaces/Prolog/SICStus/ppl_sicstus.cc (1.44),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.11),
+	  src/Poly_Con_Relation.defs.hh (1.3),
+	  src/Poly_Con_Relation.inlines.hh (1.4),
+	  src/Poly_Gen_Relation.defs.hh (1.3),
+	  src/Poly_Gen_Relation.inlines.hh (1.4):
+	  Poly_Con_Relation::implies() and Poly_Gen_Relation::implies()
+	  were wrong because of missing parentheses.
+	  Poly_Con_Relation::operator!() and Poly_Gen_Relation::operator!()
+	  were ill-designed: removed.  Added Poly_Con_Relation
+	  operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y)
+	  and the similar operator dealing with Poly_Gen_Relation.  Prolog
+	  interface functions ppl_relation_with_constraint/2 and
+	  ppl_relation_with_generator/2 changed accordingly.  New Prolog
+	  interface functions made available to GNU, SICStus, and SWI
+	  Prolog.
+
+2002-03-13 Wednesday 18:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.19): ppl_affine_image
+	  and ppl_affine_preimage corrected and
+	  ppl_add_domensions_and_constraints added.
+
+2002-03-13 Wednesday 17:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.2): When constructing a PolyBase, now we
+	  store the value of the newly introduced boolean flag in the
+	  corresponding private member.
+
+2002-03-13 Wednesday 17:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Makefile.am, PolyBase.cc, PolyBase.defs.hh,
+	  PolyBase.inlines.hh, PolyBase.types.hh, Polyhedron.cc,
+	  Polyhedron.defs.hh, Polyhedron.inlines.hh, conversion.cc,
+	  minimize.cc, simplify.cc (strict.[1,1,1,1,1,1,1,1,1,1,1]): Class
+	  Polyhedron renamed into PolyBase.  Added a private boolean flag
+	  "necessarily_closed_" and modified all constructors (but not the
+	  copy constructor) to also accept a boolean argument (which is
+	  ignored, for the moment).  Created a new class Polyhedron
+	  inheriting public-ly from PolyBase.  This will be the class
+	  defining "necessarily closed" polyhedra.
+
+2002-03-13 Wednesday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.18):
+	  ppl_relation_with_constraint/3 and ppl_relation_with_generator/3
+	  added.
+
+2002-03-13 Wednesday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Poly_Con_Relation.defs.hh (1.2),
+	  Poly_Con_Relation.inlines.hh (1.3), Poly_Gen_Relation.defs.hh
+	  (1.2), Poly_Gen_Relation.inlines.hh (1.3): The implies() methods
+	  were not qualified as const.	Poly_Con_Relation::operator!() and
+	  Poly_Gen_Relation::operator!() added.
+
+2002-03-13 Wednesday 16:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.17),
+	  SWI/ppl_swiprolog.cc (1.10): ppl_affine_image and
+	  ppl_affine_preimage added.
+
+2002-03-13 Wednesday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.43): Misspelled
+	  functions fixed.  ppl_polyhedron_strictly_included/2 added.
+
+2002-03-13 Wednesday 14:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.16): Definitions of
+	  equal, included_or_equal and strictly_included predicates
+	  corrected.
+
+2002-03-13 Wednesday 11:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.15),
+	  SWI/ppl_swiprolog.cc (1.9): Some corrections to some of the new
+	  predicates definitions.
+
+2002-03-13 Wednesday 07:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.10): Always build `pplpl'
+	  and `pl_clpq'.
+
+2002-03-13 Wednesday 07:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.14): Added new atoms
+	  for the relations of polyhedra with constraints and generators.
+
+2002-03-13 Wednesday 07:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.42): Missing
+	  semicolons added.
+
+2002-03-12 Tuesday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.41): Macro SP_STUB_3
+	  added and used for ppl_limited_widening_assign/3.
+
+2002-03-12 Tuesday 19:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.13),
+	  SICStus/ppl_sicstus.cc (1.40), SWI/ppl_swiprolog.cc (1.8): <=,
+	  ==, and < added as ppl predicates.  SWI and SICStus interfaces
+	  updated with <= and == predicates.
+
+2002-03-12 Tuesday 19:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.12),
+	  SICStus/ppl_sicstus.cc (1.39), SWI/ppl_swiprolog.cc (1.7): Added
+	  ppl_add_generators_and_minimize, ppl_check_universe, and
+	  ppl_is_bounded.  SICStus and SWI updated to use the new
+	  predicates.
+
+2002-03-12 Tuesday 18:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.11):
+	  ppl_add_generators_and_minimize added.
+
+2002-03-12 Tuesday 17:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.19): Restored comment
+	  for ppl_copy_polyhedron, small change to notation and added draft
+	  documentation for three predicates that were missing.
+
+2002-03-12 Tuesday 17:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.10): Code for
+	  ppl_limited_widening_assign, ppl_relation_with_constraint and
+	  ppl_relation_with_generator added.
+
+2002-03-12 Tuesday 15:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.18): Added a note on the change of terminology
+	  vertex/point.
+
+2002-03-12 Tuesday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.9),
+	  Ciao/ppl_ciao.cc (1.3): Using "point" instead of "vertex".
+
+2002-03-12 Tuesday 15:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: addconstraints9.cc (1.5), adddimensions1.cc (1.6),
+	  adddimensions3.cc (1.4), addgenerators1.cc (1.5),
+	  addgenerators2.cc (1.5), addgenerators3.cc (1.4),
+	  addgenerators4.cc (1.4), addgenerators5.cc (1.4),
+	  addgenerators6.cc (1.4), affineimage1.cc (1.4),
+	  affinepreimage1.cc (1.4), affinepreimage3.cc (1.3),
+	  affinepreimage4.cc (1.4), affinetrans.cc (1.8),
+	  convexdifference1.cc (1.8), convexhull1.cc (1.5), convexhull2.cc
+	  (1.4), convexhull3.cc (1.3), error1.cc (1.8), error10.cc (1.2),
+	  error11.cc (1.2), error12.cc (1.2), error13.cc (1.2), error14.cc
+	  (1.2), error15.cc (1.2), error16.cc (1.2), error17.cc (1.2),
+	  error18.cc (1.3), error19.cc (1.2), error2.cc (1.10), error20.cc
+	  (1.3), error21.cc (1.4), error22.cc (1.3), error23.cc (1.2),
+	  error24.cc (1.2), error25.cc (1.4), error26.cc (1.3), error27.cc
+	  (1.3), error28.cc (1.3), error29.cc (1.3), error3.cc (1.10),
+	  error4.cc (1.5), error5.cc (1.6), error6.cc (1.4), error7.cc
+	  (1.3), error8.cc (1.2), error9.cc (1.3), exceptions1.cc (1.2),
+	  generators1.cc (1.4), inters2.cc (1.11), inters5.cc (1.5),
+	  inters6.cc (1.4), onepoint.cc (1.3), randchull1.cc (1.11),
+	  relations2.cc (1.3), relations3.cc (1.3), relations4.cc (1.3),
+	  relations5.cc (1.3), removedim1.cc (1.4), removedim2.cc (1.8),
+	  removedim4.cc (1.5): In all the tests, now using "point" instead
+	  of "vertex".	Removed the old tests "errorN.cc", which are now
+	  all subsumed by the single test "exceptions1.cc".
+
+2002-03-12 Tuesday 15:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.28), Constraint.defs.hh (1.45),
+	  Constraint.inlines.hh (1.21), GenSys.cc (1.42), GenSys.defs.hh
+	  (1.49), GenSys.inlines.hh (1.14), Generator.cc (1.23),
+	  Generator.defs.hh (1.49), Generator.inlines.hh (1.22),
+	  LinExpression.defs.hh (1.26), Matrix.cc (1.31), Polyhedron.cc
+	  (1.142), Polyhedron.defs.hh (1.86), Row.cc (1.31), Row.defs.hh
+	  (1.34), Row.inlines.hh (1.14), conversion.cc (1.24), minimize.cc
+	  (1.17), simplify.cc (1.13): The term "vertex" replaced almost
+	  everywhere by "point": this is because these kind of generators
+	  are not necessarily vertices of the polyhedron.  All comments
+	  adjusted accordingly.
+
+2002-03-12 Tuesday 15:02  Elisa Ricci
+
+	* src/minimize.cc (positive.10): Some changes in the part
+	  controlled by the flag " POS_SIMPLEX_TRICK".
+
+2002-03-12 Tuesday 14:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.18): Description of
+	  some of the Prolog predicates improved.
+
+2002-03-12 Tuesday 13:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.141): Do not use the amsmath's \text{} macro
+	  in contexts like $a_\text{var}$.  Use $a_\mathrm{var}$ instead.
+
+2002-03-12 Tuesday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.30): Do not use the `-e' option of GNU grep
+	  (this solves a portability problem on Solaris).
+
+2002-03-12 Tuesday 11:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.44), Generator.defs.hh (1.48),
+	  Generator.inlines.hh (1.21): The method Constraint::type() and
+	  the corresponding enum Constraint::Type are now public.  Added
+	  new public type tests to Generator, is_ray() and is_vertex();
+	  also, the existing method is_line() is now public.
+
+2002-03-12 Tuesday 11:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc (1.22), Generator.defs.hh (1.47),
+	  Generator.inlines.hh (1.20): We were still throwing an exception
+	  from the inlined method divisor(); added a non-inline function
+	  for that purpose.
+
+2002-03-12 Tuesday 11:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/Makefile.am (1.6), SWI/Makefile.am (1.9),
+	  YAP/Makefile.am (1.3): More packaging glitches have been fixed.
+
+2002-03-12 Tuesday 09:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.7), GNU/Makefile.am (1.5),
+	  SICStus/Makefile.am (1.15), SWI/Makefile.am (1.8),
+	  YAP/Makefile.am (1.2): A first go at fixing the packaging
+	  problems.
+
+2002-03-11 Monday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.17), src/Polyhedron.defs.hh (1.85): Visibility bug fixed:
+	  Polyhedron::is_empty() must be private.
+
+2002-03-11 Monday 18:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.17): Fixed a severe performance bug
+	  in operator<(const Polyhedron& x, const Polyhedron& y).
+
+2002-03-11 Monday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.34), Constraint.defs.hh (1.43),
+	  GenSys.defs.hh (1.48), Generator.defs.hh (1.46), Matrix.defs.hh
+	  (1.19), Row.defs.hh (1.33): Added a few missing doxygen comments
+	  to avoid warnings.
+
+2002-03-11 Monday 14:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.inlines.hh (1.17): Fixed a \relates doxygen comment
+	  pointing to the wrong class.
+
+2002-03-11 Monday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Variable.defs.hh (1.15): Removed a redundant namespace
+	  qualification.
+
+2002-03-11 Monday 14:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.12),
+	  devref-print.doxyconf-latex.in (1.12), devref.doxyconf-html.in
+	  (1.13): Set the WARN_IF_UNDOCUMENTED flag to YES. This will have
+	  no effect until we will set EXTRACT_ALL to NO.  Added the
+	  *.types.hh files to the INPUT variable.
+
+2002-03-11 Monday 14:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.17): Documentation
+	  describing the PPL Prolog predicates revised.
+
+2002-03-11 Monday 12:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.16): Documentation for
+	  ppl_copy_polyhedron corrected.
+
+2002-03-11 Monday 12:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: clpq.pl (1.4), clpq2.pl (1.3): Now consulting
+	  'file' will try also 'file.pl' in case 'file' does not exist or
+	  is not readable.
+
+2002-03-11 Monday 01:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.19), Constraint.defs.hh (1.42),
+	  Generator.cc (1.21), Generator.defs.hh (1.45), Matrix.cc (1.30),
+	  Matrix.defs.hh (1.18), Matrix.inlines.hh (1.16), Polyhedron.cc
+	  (1.140), Polyhedron.defs.hh (1.84), Row.cc (1.30), Row.defs.hh
+	  (1.32), Row.inlines.hh (1.13), SatMatrix.cc (1.14),
+	  SatMatrix.defs.hh (1.15), SatRow.cc (1.7), SatRow.defs.hh (1.11),
+	  SatRow.inlines.hh (1.11), Status.cc (1.11), Status.defs.hh
+	  (1.14), Variable.cc (1.6), Variable.defs.hh (1.14),
+	  Variable.inlines.hh (1.8): Placing the doxygen \relates command
+	  before function definitions (instead of declarations) to avoid
+	  warnings for unmatched functions.
+
+2002-03-11 Monday 00:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.11),
+	  devref-print.doxyconf-latex.in (1.11), devref.doxyconf-html.in
+	  (1.12): Added the newer (and old ones too) source files to the
+	  INPUT tag.  Turned on the STRIP_CODE_COMMENTS flag, to avoid
+	  outputting dosygen comments in the devref detailed comments for
+	  enumerations (e.g., Generator::Type).
+
+2002-03-10 Sunday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.27), LinExpression.defs.hh (1.25),
+	  Polyhedron.cc (1.139): Just formatting.
+
+2002-03-10 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.29), Row.defs.hh (1.31): Avoid the creation of
+	  temporaries in operator*(const Row& x, const Row& y).  This
+	  results in a speedup of at least 3%.
+
+2002-03-10 Sunday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.26), GenSys.cc (1.41): Missing full-stops
+	  added.
+
+2002-03-10 Sunday 16:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.25), GenSys.cc (1.40):
+	  ConSys::affine_preimage() and GenSys::affine_image() shortened
+	  and slightly optimized.  Moreover, each contained a wrong
+	  assertion.
+
+2002-03-10 Sunday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ConSys.cc (1.24): Avoid a useless temporary in
+	  ConSys::affine_preimage().
+
+2002-03-10 Sunday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.23), ConSys.defs.hh (1.33), ConSys.inlines.hh
+	  (1.13), Constraint.defs.hh (1.41), Constraint.inlines.hh (1.20),
+	  GenSys.cc (1.39), GenSys.defs.hh (1.47), GenSys.inlines.hh
+	  (1.13), LinExpression.defs.hh (1.24), LinExpression.inlines.hh
+	  (1.12), Matrix.cc (1.29), Matrix.defs.hh (1.17), Polyhedron.cc
+	  (1.138), Row.defs.hh (1.30), Row.inlines.hh (1.12), SatMatrix.cc
+	  (1.13), SatMatrix.defs.hh (1.14), SatMatrix.inlines.hh (1.9),
+	  Variable.defs.hh (1.13), Variable.inlines.hh (1.7): Compile
+	  cleanly with gcc's -Wshadow.
+
+2002-03-10 Sunday 13:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.34): The configure options --with-cflags and
+	  --with-cxxflags now add more compiler options (as opposed to
+	  replace them).  In addition the --with-cflags options was simply
+	  broken.
+
+2002-03-10 Sunday 13:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.6): Assertion fixed.
+
+2002-03-10 Sunday 00:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.18), Generator.cc (1.20): Useless
+	  namespace qualification in argument was causing a doxygen
+	  warning.
+
+2002-03-10 Sunday 00:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.10),
+	  devref-print.doxyconf-latex.in (1.10), devref.doxyconf-html.in
+	  (1.11), user-browse.doxyconf-latex.in (1.9),
+	  user-print.doxyconf-latex.in (1.9), user.doxyconf-html.in (1.11):
+	  New configuration files obtained by using the -u options of
+	  doxygen 1.2.14 and a bit of manual editing.
+
+2002-03-09 Saturday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: Makefile.am (1.2), ppl_c.c (1.2), ppl_c.cc (1.1),
+	  ppl_c.h (1.2): Slow progress.  The C interface is implemented in
+	  C++ (of course).
+
+2002-03-09 Saturday 13:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.33), interfaces/Makefile.am (1.4),
+	  interfaces/C/.cvsignore (1.1), interfaces/C/Makefile.am (1.1),
+	  interfaces/C/ppl_c.c (1.1), interfaces/C/ppl_c.h (1.1): C
+	  interface started.
+
+2002-03-08 Friday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.8): More things to do.
+
+2002-03-08 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.32): The SICStus Prolog interface is only built
+	  if the user has SICStus Prolog 3.9.0 or a later version.
+
+2002-03-08 Friday 11:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/ppl_gprolog.cc (1.8),
+	  SICStus/ppl_sicstus.cc (1.38), SWI/ppl_swiprolog.cc (1.5): Minor
+	  improvements.
+
+2002-03-08 Friday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.31), interfaces/Prolog/YAP/.cvsignore (1.1),
+	  interfaces/Prolog/YAP/Makefile.am (1.1),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.1),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.1),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.1): YAP Prolog interface
+	  started.
+
+2002-03-08 Friday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: relations1.cc (1.2), relations2.cc (1.2), relations3.cc
+	  (1.2), relations4.cc (1.2), relations5.cc (1.2), relations6.cc
+	  (1.2), relations7.cc (1.2), relations8.cc (1.2): Tests updated to
+	  correctly use the new classes Poly_Con_Relation and
+	  Poly_Gen_Relation.
+
+2002-03-08 Friday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.38), GenSys.defs.hh (1.46), Polyhedron.cc
+	  (1.137), Polyhedron.defs.hh (1.83): Methods relation_with(...)
+	  updated to correctly use the new classes Poly_Con_Relation and
+	  Poly_Gen_Relation.
+
+2002-03-08 Friday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.32), ConSys.inlines.hh (1.12),
+	  Constraint.cc (1.17), Constraint.defs.hh (1.40),
+	  Constraint.inlines.hh (1.19), GenSys.defs.hh (1.45),
+	  GenSys.inlines.hh (1.12), Generator.cc (1.19), Generator.defs.hh
+	  (1.44), LinExpression.cc (1.10), LinExpression.defs.hh (1.23),
+	  LinExpression.inlines.hh (1.11), Matrix.cc (1.28), Matrix.defs.hh
+	  (1.16), Matrix.inlines.hh (1.15), Poly_Con_Relation.cc (1.2),
+	  Poly_Gen_Relation.cc (1.2), Polyhedron.cc (1.136),
+	  Polyhedron.defs.hh (1.82), Polyhedron.inlines.hh (1.16), Row.cc
+	  (1.28), Row.defs.hh (1.29), Row.inlines.hh (1.11), SatMatrix.cc
+	  (1.12), SatMatrix.defs.hh (1.13), SatMatrix.inlines.hh (1.8),
+	  SatRow.cc (1.6), SatRow.defs.hh (1.10), SatRow.inlines.hh (1.10),
+	  Status.cc (1.10), Status.defs.hh (1.13), Status.inlines.hh (1.7),
+	  Variable.cc (1.5), Variable.defs.hh (1.12), Variable.inlines.hh
+	  (1.6): For each operator name @ different from `new' and
+	  `delete', the syntax `operator@()' has to be preferred to
+	  `operator @'.
+
+2002-03-08 Friday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Poly_Con_Relation.inlines.hh (1.2),
+	  Poly_Gen_Relation.inlines.hh (1.2): Add missing `inline'
+	  qualifiers.
+
+2002-03-08 Friday 10:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.37), GenSys.defs.hh (1.44), Makefile.am
+	  (1.29), Poly_Con_Relation.cc (1.1), Poly_Con_Relation.defs.hh
+	  (1.1), Poly_Con_Relation.inlines.hh (1.1),
+	  Poly_Con_Relation.types.hh (1.1), Poly_Gen_Relation.cc (1.1),
+	  Poly_Gen_Relation.defs.hh (1.1), Poly_Gen_Relation.inlines.hh
+	  (1.1), Poly_Gen_Relation.types.hh (1.1), Polyhedron.cc (1.135),
+	  Polyhedron.defs.hh (1.81), relations.cc (1.2), relations.hh
+	  (1.3): New classes for polyhedron/constraint and
+	  polyhedron/generator relations.
+
+2002-03-08 Friday 09:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Status.defs.hh (1.12), Status.inlines.hh (1.6): Only
+	  esthetics.
+
+2002-03-07 Thursday 19:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/Makefile.am (1.4), GNU/gp_clpq.pl (1.2),
+	  GNU/ppl_gprolog.cc (1.7), SWI/Makefile.am (1.7): GNU Prolog
+	  CLP(Q) interpreter almost working (the ack.clpq test provokes a
+	  segmentation fault though).
+
+2002-03-07 Thursday 16:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.37): First part of Section 1.2 -
+	  Homogeneous Systems of the developer's manual, revised.
+
+2002-03-07 Thursday 14:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.7): Started adding the list of minor things to do.
+
+2002-03-07 Thursday 12:48  Elisa Ricci
+
+	* tests/: Makefile.am (1.49), includes1.cc (1.7), includes2.cc
+	  (1.6), includes3.cc (1.6), includes4.cc (1.6), relations1.cc
+	  (1.1), relations2.cc (1.1), relations3.cc (1.1), relations4.cc
+	  (1.1), relations5.cc (1.1), relations6.cc (1.1), relations7.cc
+	  (1.1), relations8.cc (1.1), satisfies1.cc (1.8), satisfies2.cc
+	  (1.6), satisfies3.cc (1.7), satisfies4.cc (1.5): The tests
+	  includes1, includes2, includes3, includes4 are now renamed
+	  relations1, relations2, relations3, relations4 and the tests
+	  satisfies1, satisfies2,satisfies3, satisfies4 are renamed
+	  relations5, relations6, relations7, relations8.
+
+2002-03-07 Thursday 12:24  Elisa Ricci
+
+	* tests/: Makefile.am (1.48), exceptions1.cc (1.1): All the tests
+	  for the exceptions are now put in this file.
+
+2002-03-07 Thursday 12:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: check_script (1.2), clpq.pl (1.3),
+	  SICStus/sp_clpq.pl (1.2), SWI/Makefile.am (1.6), SWI/pl_clpq.cc
+	  (1.1), SWI/pl_clpq.pl (1.2): The CLP(Q) interpreter now behaves
+	  the same under SICStus and SWI-Prolog.  The two version now
+	  implement the same `make check' procedure.
+
+2002-03-07 Thursday 11:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.16): Corrected a cut&paste error and added a note on the
+	  bug fixed in Polyhedron::add_constraints().
+
+2002-03-07 Thursday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.8),
+	  GNU/ppl_gprolog.cc (1.6), SICStus/ppl_sicstus.cc (1.37),
+	  SWI/Makefile.am (1.5), SWI/ppl_swiprolog.cc (1.4): Use the names
+	  Prolog_is_cons and Prolog_get_cons instead of the ambiguous
+	  Prolog_is_list and Prolog_get_list.  Bugs fixed.  The CLP(Q)
+	  interpreter now works also under SWI-Prolog.
+
+2002-03-07 Thursday 11:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.36): Adjusted a few comments in
+	  GenSys::relation_with(c). Also avoided using the boolean variable
+	  first_vertex_or_nonsaturating_ray when c is an equality
+	  constraint.
+
+2002-03-07 Thursday 10:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.35), tests/satisfies4.cc (1.4): Method
+	  Polyhedron::relation_with(c) corrected to work as expected when c
+	  is an equality. Test satisfies4, modified to test for the right
+	  thing, now is correctly handled.
+
+2002-03-07 Thursday 08:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.134): "steel" corrected to "steal".
+
+2002-03-06 Wednesday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.6), check_script (1.1),
+	  clpq.pl (1.2), clpq2.pl (1.2), expected (1.1), GNU/Makefile.am
+	  (1.3), GNU/gp_clpq.pl (1.1), GNU/ppl_gprolog.cc (1.5),
+	  SICStus/Makefile.am (1.14), SICStus/check_script (1.2),
+	  SICStus/expected (1.5), SWI/Makefile.am (1.4), SWI/pl_clpq.pl
+	  (1.1): Slow progress on the unified Prolog interfaces.
+
+2002-03-06 Wednesday 19:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.80), tests/error21.cc (1.3),
+	  tests/error22.cc (1.2), tests/includes1.cc (1.6),
+	  tests/includes2.cc (1.5), tests/includes3.cc (1.5),
+	  tests/includes4.cc (1.5): Small fix in a comment of
+	  Polyhedron.defs.hh.  Modified a few tests to let them compile
+	  after the API changes.
+
+2002-03-06 Wednesday 15:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.15), src/relations.hh (1.2): Small change in a comment to
+	  enum Relation_Poly_Con.  Added to NEWS information about the
+	  replacement of includes() and satisfies() by methods
+	  relation_with().
+
+2002-03-06 Wednesday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.34), src/GenSys.defs.hh (1.43), src/Makefile.am
+	  (1.28), src/Polyhedron.cc (1.133), src/Polyhedron.defs.hh (1.79),
+	  src/relations.cc (1.1), src/relations.hh (1.1),
+	  tests/satisfies1.cc (1.7), tests/satisfies2.cc (1.5),
+	  tests/satisfies3.cc (1.6), tests/satisfies4.cc (1.3): Put under
+	  CVS control.
+
+2002-03-06 Wednesday 15:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ack.clpq (1.1), ackn.clpq (1.1), clpq.pl
+	  (1.1), clpq2.pl (1.1), fib.clpq (1.1), mc91.clpq (1.1),
+	  ppl_prolog.pl (1.1), smm.clpq (1.1), smmdiff.clpq (1.1),
+	  sumto.clpq (1.1), tak.clpq (1.1), SICStus/Makefile.am (1.13),
+	  SICStus/ack.clpq (1.4), SICStus/ackn.clpq (1.2), SICStus/clpq.pl
+	  (1.28), SICStus/clpq2.pl (1.4), SICStus/fib.clpq (1.3),
+	  SICStus/mc91.clpq (1.2), SICStus/ppl_sicstus.pl (1.19),
+	  SICStus/smm.clpq (1.2), SICStus/smmdiff.clpq (1.3),
+	  SICStus/sp_clpq.pl (1.1), SICStus/sumto.clpq (1.2),
+	  SICStus/tak.clpq (1.2): Share as much sources as possible among
+	  all supported Prolog implementations.
+
+2002-03-06 Wednesday 13:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.7),
+	  track_allocation.hh (1.2), SICStus/ppl_sicstus.cc (1.36),
+	  SICStus/ppl_sicstus.pl (1.18): GNU Prolog, SICStus Prolog and
+	  SWI-Prolog interfaces now share most of the code.
+
+2002-03-06 Wednesday 11:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.33): In GenSys::affine_image(), rays and lines
+	  can be mapped into the origin only if the transformation is NOT
+	  invertible.
+
+2002-03-06 Wednesday 11:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.132): Invertible affine transformations
+	  preserve both the minimality and the saturation relations of
+	  constraints and generators.
+
+2002-03-06 Wednesday 08:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.3), ppl_prolog.outlines.hh
+	  (1.6), track_allocation.hh (1.1), GNU/ppl_gprolog.cc (1.4),
+	  SWI/ppl_swiprolog.cc (1.3): GNU Prolog interface fixed.  More
+	  common code between the GNU Prolog and the SWI Prolog interfaces.
+	  Allocation tracking implemented in a separate file.
+
+2002-03-05 Tuesday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog.cc (1.3): Work around a couple
+	  of bugs in GNU Prolog 1.2.8.
+
+2002-03-05 Tuesday 19:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.32): Now GenSys::satisfy() correctly handles the
+	  case when c is an equality.  Still have to check the case of c
+	  being an inequality.
+
+2002-03-05 Tuesday 16:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/satisfies4.cc (1.2): Corrected the test just inserted (and
+	  set NOISY = 0).
+
+2002-03-05 Tuesday 15:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.47), satisfies4.cc (1.1): The test
+	  satisfies4 shows a bug whereby we return SOME_SATISFY even when
+	  the considered equality constraint has an empty intersection with
+	  the polyhedron.
+
+2002-03-05 Tuesday 14:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.131): Corrected a bug in satisfies() for the
+	  case when *this is a zero-dim univ.  polyhedron. Now the test
+	  satisfies3 should pass.
+
+2002-03-05 Tuesday 14:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/satisfies3.cc (1.5): Test satisfies3 modified to check all
+	  the possibilities when calling Polyhedron::satisfies() on a
+	  zero-dim-universe polyhedron.  The old test was meaningless,
+	  since it was saying that the wrong result was ok. This new test
+	  shows a bug that I am going to correct.
+
+2002-03-05 Tuesday 12:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.39): A couple of spelling errors in
+	  comments fixed.
+
+2002-03-04 Monday 22:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.9),
+	  devref-print.doxyconf-latex.in (1.9), devref.doxyconf-html.in
+	  (1.10): Include the Prolog interfaces into the documentation for
+	  developers.
+
+2002-03-04 Monday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: SICStus/ppl_sicstus.cc (1.35),
+	  SWI/ppl_swiprolog.cc (1.2): Small improvements.
+
+2002-03-04 Monday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/: Makefile.am (1.2), ppl_gprolog.cc (1.2),
+	  ppl_gprolog.pl (1.1): GNU Prolog interface almost complete.
+
+2002-03-04 Monday 17:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplify.cc (1.12): Adjusted the comments in the part where
+	  we check the independence rule for inequalities.
+
+2002-03-04 Monday 17:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/.cvsignore (1.1), SWI/.cvsignore (1.1):
+	  Put under CVS control.
+
+2002-03-04 Monday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.30), interfaces/Prolog/GNU/Makefile.am (1.1),
+	  interfaces/Prolog/GNU/ppl_gprolog.cc (1.1): GNU Prolog interface
+	  started.
+
+2002-03-04 Monday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.12), ppl_sicstus.cc
+	  (1.34): Comment added.  Do not use the preprocessor to declare
+	  constants.
+
+2002-03-04 Monday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am (1.3), ppl_swi.cc (1.7),
+	  ppl_swiprolog.cc (1.1): Renamed.
+
+2002-03-04 Monday 17:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swi.cc (1.6): More interface functions
+	  added.
+
+2002-03-04 Monday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.2), src/Makefile.am (1.27):
+	  Comments fixed.
+
+2002-03-04 Monday 16:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.8): Updated.
+
+2002-03-04 Monday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.29), interfaces/Prolog/exceptions.hh (1.2),
+	  interfaces/Prolog/ppl_prolog.outlines.hh (1.5),
+	  interfaces/Prolog/SICStus/ppl_sicstus.cc (1.33),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.17),
+	  interfaces/Prolog/SWI/Makefile.am (1.1),
+	  interfaces/Prolog/SWI/ppl_swi.cc (1.5),
+	  interfaces/Prolog/SWI/pplpl.cc (1.1): SWI Prolog interface almost
+	  complete.
+
+2002-03-04 Monday 14:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.130): Since the Row::capacity() method is
+	  accessible only during debugging, we no longer swap rows in
+	  Polyhedron::add_constraints() (we always swap the coefficeints).
+
+2002-03-03 Sunday 11:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: minimize.cc (1.16), simplify.cc (1.11): Started polishing
+	  the comments, and also the code in a few places, for the function
+	  simplify(). Adjusted a few comments in minimize(), regarding the
+	  saturation matrix.
+
+2002-03-02 Saturday 17:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/exceptions.hh (1.1): Exceptions to be used by
+	  the Prolog interfaces.
+
+2002-03-02 Saturday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.4),
+	  SICStus/ppl_sicstus.cc (1.32), SICStus/ppl_sicstus.pl (1.16),
+	  SWI/ppl_swi.cc (1.4): Progress on the SWI and SICStus interfaces.
+	  More error checking added.
+
+2002-03-02 Saturday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.3),
+	  SICStus/ppl_sicstus.cc (1.31), SWI/ppl_swi.cc (1.3): SICStus and
+	  SWI interfaces reconciled.
+
+2002-03-02 Saturday 09:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.129): In add_constraints(), corrected a bug
+	  whereby we were mixing constraints having different row's
+	  capoacities into a single constraint system.
+
+2002-03-02 Saturday 09:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/minimize.cc (1.15): Small change in a comment.
+
+2002-03-02 Saturday 09:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.43): Added the right doxygen comments to
+	  enumeration Generator::Type.	The special command
+	  \hideinitializer allows to mask implementation details.
+
+2002-03-02 Saturday 07:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.2),
+	  SICStus/ppl_sicstus.cc (1.30), SWI/ppl_swi.cc (1.2): Some
+	  progress on the combined SICStus/SWI interface.
+
+2002-03-01 Friday 16:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.78), minimize.cc (1.14): Polished the
+	  function add_and_minimize(...).  No longer using variable
+	  `index', which was useless.  Some style changes to made the code
+	  more uniform wrt what is done in function minimize(...). Also,
+	  con_to_ray renamed into con_to_gen.
+
+2002-03-01 Friday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swi.cc (1.1): This will become the
+	  SWI-Prolog stub.
+
+2002-03-01 Friday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.29): Use
+	  ppl_prolog.outlines.hh.
+
+2002-03-01 Friday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.5), ppl_prolog.outlines.hh
+	  (1.1): Will try to derive as much Prolog interfaces as possible
+	  from this one.
+
+2002-03-01 Friday 14:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: ppl_ciao.cc (1.2), ppl_ciao.pl (1.2):
+	  Ciao only handles integer type `int'.  Added placeholders for
+	  linker and compiler options.
+
+2002-03-01 Friday 14:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: ppl_ciao.cc (1.1), ppl_ciao.pl (1.1):
+	  Put under CVS control.  The structure of ppl_ciao.pl is basically
+	  there, even if there still are gaps to be filled. ppl_ciao.cc,
+	  for the moment, is just a bare copy of the code written for
+	  SICStus.
+
+2002-03-01 Friday 12:42  Elisa Ricci
+
+	* src/: conversion.cc, minimize.cc (positive.[5,9]): Tried to
+	  implement a new method to compute the system of constraints of a
+	  positive polyhedron defined by its system of generators: it is
+	  controlled by the flag "POS_SIMPLEX_TRICK".
+
+2002-02-28 Thursday 17:08  Elisa Ricci
+
+	* src/conversion.cc, src/minimize.cc, src/simplify.cc,
+	  tests/Makefile.am, tests/bug7.cc, tests/bug7.dat
+	  (positive.[4,8,4,8,1,1]): We need the equalities that derived
+	  from the constraints of positivity of the variables: this
+	  resolves "bug6".  Added a test that still fails.
+
+2002-02-28 Thursday 12:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.6): Reference added.
+
+2002-02-28 Thursday 08:44  Elisa Ricci
+
+	* src/: Generator.defs.hh (1.42), Row.defs.hh (1.28): Changed the
+	  place of the comment about the inhomogeneous term of a vertex.
+
+2002-02-27 Wednesday 19:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.14): Better explanations.
+
+2002-02-27 Wednesday 19:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.8),
+	  devref-print.doxyconf-latex.in (1.8), devref.doxyconf-html.in
+	  (1.9): Predefine PPL_INTERNAL and PPL_HIDDEN.
+
+2002-02-27 Wednesday 18:26  Elisa Ricci
+
+	* NEWS (1.13), src/Polyhedron.cc (1.128), src/Polyhedron.defs.hh
+	  (1.77), tests/Makefile.am (1.46), tests/bounded1.cc (1.1): Added
+	  the function Polyhedron::is_bounded() that returns true if and
+	  only if the polyhedron is bounded.  Added a test for this
+	  function.
+
+2002-02-27 Wednesday 17:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/minimize.cc (1.13): In minimize(), added an assertion saying
+	  that matrix source is not empty.  Removed a FIXME and added a
+	  comment explaining why dest is initialized as what would be a
+	  non-legal generator matrix.
+
+2002-02-27 Wednesday 16:52  Elisa Ricci
+
+	* NEWS (1.12): Added the new feature that says that PPL does not
+	  call abort(), but we have an error message and the correction of
+	  the bug of the negative denominator of the vertex.
+
+2002-02-27 Wednesday 16:36  Elisa Ricci
+
+	* src/: Generator.cc (1.18), Generator.defs.hh (1.41),
+	  Polyhedron.cc (1.127): Considered the fact that a vertex must
+	  always have a positive denominator.
+
+2002-02-27 Wednesday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.5): Non-Necessarily-Closed Polyhedra.
+
+2002-02-27 Wednesday 14:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.4): Constructions on polyhedra.
+
+2002-02-27 Wednesday 13:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/generators1.cc (1.3): Print something only when NOISY.
+
+2002-02-27 Wednesday 13:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.3): Started with the definition of strict weak ordering
+	  and with a statement about why we need one or more of them.
+
+2002-02-27 Wednesday 11:16  Elisa Ricci
+
+	* src/minimize.cc (1.12), tests/generators1.cc (1.2): Used the
+	  exception instead of the abort() and modified the test.
+
+2002-02-27 Wednesday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.11), configure.ac (1.28), src/Makefile.am (1.26): We are
+	  now in the 0.4 era.
+
+2002-02-27 Wednesday 10:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/minimize.cc (1.11): Polishing the comments in function
+	  minimize().  Small changes to the code (no longer using the flag
+	  empty_or_illegal).
+
+2002-02-27 Wednesday 09:18  Elisa Ricci
+
+	* tests/: Makefile.am (1.45), generators1.cc (1.1): Added a test
+	  for a polyhedron built form a system of generators with a vertex
+	  with negative denominator.
+
+2002-02-26 Tuesday 14:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.27): Release number back to 0.3 i order to
+	  generate the Web pages' documentation.
+
+2002-02-26 Tuesday 12:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (ppl-0_3-branch.2), README (1.11): Fixed.
+
+2002-02-26 Tuesday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_3-branch.1), NEWS (1.10): Updated.
+
+2002-02-26 Tuesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.10): Updated.
+
+2002-02-26 Tuesday 12:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (ppl-0_3-branch.1): Updated.
+
+2002-02-26 Tuesday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.26): Bump version number: the main trunk is now
+	  in the 0.4 era.
+
+2002-02-26 Tuesday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_3-branch.1): Update version.
+
+2002-02-26 Tuesday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_3-branch.1): Mark ChangeLog.
+
+2002-02-26 Tuesday 11:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (ppl-0_3-branch.1),
+	  Makefile.am (1.11): Ignore all space when comparing results.
+
+2002-02-26 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.7): Updated.
+
+2002-02-26 Tuesday 11:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.9): Updated.
+
+2002-02-26 Tuesday 11:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.6), config.guess (1.8), doc/definitions.dox (1.36),
+	  interfaces/Prolog/SICStus/clpq.pl (1.27),
+	  interfaces/Prolog/SICStus/clpq2.pl (1.3),
+	  interfaces/Prolog/SICStus/expected (1.4),
+	  interfaces/Prolog/SICStus/fib.clpq (1.2),
+	  interfaces/Prolog/SICStus/smmdiff.clpq (1.2),
+	  src/Constraint.defs.hh (1.38), src/GenSys.cc (1.31),
+	  src/Polyhedron.cc (1.126), tests/addconstraints11.cc (1.4),
+	  tests/addconstraints5.cc (1.5), tests/adddimensions1.cc (1.5),
+	  tests/convexdifference1.cc (1.7), tests/error28.cc (1.2),
+	  tests/error29.cc (1.2), tests/universe5.cc (1.3): Trailing blanks
+	  removed.
+
+2002-02-26 Tuesday 10:34  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.76): Added the documentation for the
+	  exception thrown in the function Polyhedron::add_generators and
+	  Polyhedron::add_generators_and_minimize if the polyhedron is
+	  empty and the system of generators has no vertices.
+
+2002-02-26 Tuesday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.37): Simplified the example showing how
+	  to use the Constraint::coefficient() methods.
+
+2002-02-26 Tuesday 08:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.15):
+	  ppl_convex_difference_assign/2 mentioned.
+
+2002-02-26 Tuesday 02:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.23): Another big pass on all the comments,
+	  trying to uniformize the terminology.  Small changes in the code
+	  to avoid repeating tests that are useless under certain
+	  conditions.
+
+2002-02-25 Monday 22:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.36): Small changes in the
+	  documentation.
+
+2002-02-25 Monday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.14), configure.ac (1.25), doc/Makefile.am (1.16),
+	  interfaces/Makefile.am (1.3), interfaces/Prolog/Makefile.am
+	  (1.4), interfaces/Prolog/SICStus/Makefile.am (1.10),
+	  m4/Makefile.am (1.5), m4/ac_check_gmp.m4 (1.3), src/Makefile.am
+	  (1.25), tests/Makefile.am (1.44): Limit the exceptions to the
+	  GPL.
+
+2002-02-25 Monday 21:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.40): The example on the use of
+	  coefficient(v) modified to keep into account the divisor of the
+	  vertex and to actually check that g1 is a vertex.
+
+2002-02-25 Monday 18:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.35), Generator.defs.hh (1.39):
+	  Modified the example of the use of coefficient(v) for a
+	  generator.  Modified also the similar example for a constraint,
+	  now using the assignment operator.
+
+2002-02-25 Monday 17:28  Elisa Ricci
+
+	* tests/: Makefile.am (1.43), addconstraints10.cc (1.4),
+	  addconstraints11.cc (1.3), addconstraints2.cc (1.8),
+	  addconstraints4.cc (1.3), addconstraints5.cc (1.4),
+	  addconstraints6.cc (1.4), addconstraints7.cc (1.4),
+	  addconstraints8.cc (1.4), addconstraints9.cc (1.4),
+	  adddimensions1.cc (1.4), adddimensions2.cc (1.3),
+	  adddimensions3.cc (1.3), adddimensions4.cc (1.3),
+	  addgenerators1.cc (1.4), addgenerators2.cc (1.4),
+	  addgenerators3.cc (1.3), addgenerators4.cc (1.3),
+	  addgenerators5.cc (1.3), addgenerators6.cc (1.3), affineimage1.cc
+	  (1.3), affineimage2.cc (1.3), affinepreimage1.cc (1.3),
+	  affinepreimage2.cc (1.3), affinepreimage3.cc (1.2),
+	  affinepreimage4.cc (1.3), convexdifference1.cc (1.6),
+	  convexhull1.cc (1.4), convexhull2.cc (1.3), error28.cc (1.1),
+	  error29.cc (1.1), includes2.cc (1.4), includes3.cc (1.4),
+	  includes4.cc (1.4), inters3.cc (1.4), inters4.cc (1.3),
+	  inters5.cc (1.4), inters6.cc (1.3), limitedwidening1.cc (1.5),
+	  removedim2.cc (1.7), removedim3.cc (1.4), removedim4.cc (1.4),
+	  removedim5.cc (1.3), removedim6.cc (1.3), satisfies1.cc (1.6),
+	  satisfies2.cc (1.4), satisfies3.cc (1.4), universe1.cc (1.2),
+	  universe2.cc (1.2), universe3.cc (1.2), universe4.cc (1.2),
+	  universe5.cc (1.2): We use the functions of the file print.hh to
+	  print when it is possible.  Added two tests for the functions
+	  Polyhedron::add_generators() and
+	  Polyhedron::add_generators_and_minimize().
+
+2002-02-25 Monday 17:23  Elisa Ricci
+
+	* src/Polyhedron.cc (1.125): In functions
+	  Polyhedron::add_generators() and
+	  Polyhedron::add_generators_and_minimize, we throw an exception if
+	  we add a system of generators with no vertex to an empty
+	  polyhedron.
+
+2002-02-25 Monday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.hh (1.9): Qualified name is not allowed in namespace
+	  member declaration.
+
+2002-02-25 Monday 17:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.34), Constraint.inlines.hh (1.18),
+	  Generator.defs.hh (1.38), Generator.inlines.hh (1.19),
+	  Row.defs.hh (1.27), Row.inlines.hh (1.10): Assignments operators
+	  added for Constraint and Generator.  Some cleaning meanwhile.
+
+2002-02-25 Monday 15:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.33): Changed the example showing how to
+	  use method coefficient(v) and is_equality(). This shows that we
+	  probably miss a public method that is capable to set the
+	  relational operator of a constraint.
+
+2002-02-25 Monday 15:02  Elisa Ricci
+
+	* tests/: addconstraints1.cc (1.4), addconstraints10.cc (1.3),
+	  addconstraints5.cc (1.3), addconstraints6.cc (1.3),
+	  addconstraints7.cc (1.3), addconstraints8.cc (1.3),
+	  addconstraints9.cc (1.3), error25.cc (1.3), includes1.cc (1.5),
+	  includes2.cc (1.3), includes3.cc (1.3), includes4.cc (1.3),
+	  inters5.cc (1.3), satisfies2.cc (1.3), satisfies3.cc (1.3):
+	  Corrected some errors in the tests.
+
+2002-02-25 Monday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.16), Constraint.defs.hh (1.32),
+	  Constraint.inlines.hh (1.17), Generator.cc (1.17),
+	  Generator.defs.hh (1.37), Generator.inlines.hh (1.18): Added
+	  non-inlined methods that throw exceptions. These are now called
+	  by the inline methods coefficient(v).
+
+2002-02-25 Monday 14:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.7), config.sub (1.7): Updated.
+
+2002-02-25 Monday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.124), Row.cc (1.27), Row.defs.hh (1.26):
+	  Row::first(), Row::last(), Row::next() and Row::prev() are gone.
+
+2002-02-25 Monday 13:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.22): Started polishing comments. Avoided
+	  swapping rows with themselves.  A few other tiny improvements.
+
+2002-02-25 Monday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: addconstraints10.cc (1.2), addconstraints11.cc (1.2),
+	  addconstraints2.cc (1.7), addconstraints4.cc (1.2),
+	  addconstraints5.cc (1.2), addconstraints6.cc (1.2),
+	  addconstraints7.cc (1.2), addconstraints8.cc (1.2),
+	  addconstraints9.cc (1.2), adddimensions1.cc (1.3),
+	  adddimensions2.cc (1.2), adddimensions3.cc (1.2),
+	  adddimensions4.cc (1.2), addgenerators1.cc (1.3),
+	  addgenerators2.cc (1.3), addgenerators3.cc (1.2),
+	  addgenerators4.cc (1.2), addgenerators5.cc (1.2),
+	  addgenerators6.cc (1.2), affineimage2.cc (1.2),
+	  affinepreimage1.cc (1.2), affinepreimage2.cc (1.2),
+	  affinepreimage4.cc (1.2), affinetrans.cc (1.7),
+	  convexdifference1.cc (1.5), convexhull1.cc (1.3), convexhull2.cc
+	  (1.2), convexhull3.cc (1.2), error18.cc (1.2), error20.cc (1.2),
+	  error21.cc (1.2), error25.cc (1.2), error26.cc (1.2), error27.cc
+	  (1.2), error6.cc (1.3), error7.cc (1.2), error9.cc (1.2),
+	  includes1.cc (1.4), includes2.cc (1.2), includes3.cc (1.2),
+	  includes4.cc (1.2), inters3.cc (1.3), inters4.cc (1.2),
+	  inters5.cc (1.2), inters6.cc (1.2), permute.cc (1.13), print.hh
+	  (1.5), removedim3.cc (1.3), removedim4.cc (1.3), removedim5.cc
+	  (1.2), removedim6.cc (1.2), satisfies1.cc (1.5), satisfies2.cc
+	  (1.2), satisfies3.cc (1.2): Started putting some order in the way
+	  results are returned how objects are built, and how we print
+	  things in NOISY mode.  While at it, a zillion of trailing blanks
+	  have been removed.
+
+2002-02-25 Monday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.cc (1.15): Unwanted change retracted.
+
+2002-02-25 Monday 11:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.31), Constraint.cc (1.14),
+	  Constraint.defs.hh (1.31), GenSys.defs.hh (1.42),
+	  Generator.defs.hh (1.36), Makefile.am (1.24),
+	  ppl_filter_doxygen.sed (1.1), ppl_filter_install.sed (1.1): Now
+	  PPL_INTERNAL means `private' everywhere we are not compiling the
+	  library itself.  PPL_HIDDEN, instead, is `private' only to keep
+	  doxygen from including documentation that is not for the user.
+
+2002-02-25 Monday 10:02  Elisa Ricci
+
+	* tests/: Makefile.am (1.42), addconstraints10.cc (1.1),
+	  addconstraints11.cc (1.1), addconstraints4.cc (1.1),
+	  addconstraints5.cc (1.1), addconstraints6.cc (1.1),
+	  addconstraints7.cc (1.1), addconstraints8.cc (1.1),
+	  addconstraints9.cc (1.1), adddimensions2.cc (1.1),
+	  adddimensions3.cc (1.1), adddimensions4.cc (1.1),
+	  addgenerators3.cc (1.1), addgenerators4.cc (1.1),
+	  addgenerators5.cc (1.1), addgenerators6.cc (1.1), affineimage2.cc
+	  (1.1), affinepreimage1.cc (1.1), affinepreimage2.cc (1.1),
+	  affinepreimage3.cc (1.1), affinepreimage4.cc (1.1),
+	  convexhull2.cc (1.1), convexhull3.cc (1.1), error10.cc (1.1),
+	  error11.cc (1.1), error12.cc (1.1), error13.cc (1.1), error14.cc
+	  (1.1), error15.cc (1.1), error16.cc (1.1), error17.cc (1.1),
+	  error18.cc (1.1), error19.cc (1.1), error20.cc (1.1), error21.cc
+	  (1.1), error22.cc (1.1), error23.cc (1.1), error24.cc (1.1),
+	  error25.cc (1.1), error26.cc (1.1), error27.cc (1.1), error6.cc
+	  (1.2), error7.cc (1.1), error8.cc (1.1), error9.cc (1.1),
+	  includes2.cc (1.1), includes3.cc (1.1), includes4.cc (1.1),
+	  inters4.cc (1.1), inters5.cc (1.1), inters6.cc (1.1),
+	  removedim5.cc (1.1), removedim6.cc (1.1), satisfies2.cc (1.1),
+	  satisfies3.cc (1.1), universe1.cc (1.1), universe2.cc (1.1),
+	  universe3.cc (1.1), universe4.cc (1.1), universe5.cc (1.1): Added
+	  new tests for the functions of the Polyhedron class.
+
+2002-02-25 Monday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.21): Two kludges (with FIXME) to continue
+	  supporting GCC 2.96.
+
+2002-02-25 Monday 08:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.14): Minor typos fixed.
+
+2002-02-25 Monday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.13): Add CIAO Prolog to
+	  the list of (to be) supported systems and sort the list of
+	  prologs alphabetically.
+
+2002-02-25 Monday 01:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.30), Generator.defs.hh (1.35): Added
+	  examples on the use of methods coefficient(v), coefficient() and
+	  divisor(), as well as (en passant) the method Generator::type().
+
+2002-02-25 Monday 00:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.25): Added comments to methods first(),
+	  last(), next(...) and prev(...).
+
+2002-02-24 Sunday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: addconstraints2.cc (1.6), includes1.cc (1.3),
+	  satisfies1.cc (1.4): Do not use private methods.
+
+2002-02-24 Sunday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.1), Init.defs.hh (1.1), Init.inlines.hh (1.1),
+	  Init.types.hh (1.1), Makefile.am (1.23), Row.cc (1.26),
+	  conversion.cc (1.20), globals.cc (1.3), globals.hh (1.8),
+	  initializer.hh (1.1): New standard compliant mechanism for the
+	  library initialization and finalization.  New implementation for
+	  tmp_Integer (worth a speedup greater than 3%).
+
+2002-02-24 Sunday 19:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/SatRow.inlines.hh (1.9): Spurious space in comment removed.
+
+2002-02-24 Sunday 19:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.cc (1.16): Using function
+	  all_homogeneous_terms_are_zero() when building a ray or line to
+	  check their validity.
+
+2002-02-24 Sunday 19:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.inlines.hh (1.17): Throwing an exception if
+	  Generator::coefficient(v) is called with a variable beyond the
+	  space-dimension.
+
+2002-02-24 Sunday 19:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.inlines.hh (1.16): We now throw an exception if
+	  Constraint::coefficient(v) is called with a variable which is
+	  beyond the current space-dimension.
+
+2002-02-24 Sunday 19:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.123): Many comments adjusted. We now use the
+	  BE_LAZY flag in Polyhedron::operator<=, where we do not
+	  necessarily minimize given arguments.
+
+2002-02-24 Sunday 19:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.30): Using "satisfy" instead of "verify" when
+	  talking about the relation between a generator and a constraint.
+
+2002-02-24 Sunday 12:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.13), README (1.9), configure.ac (1.24),
+	  doc/Makefile.am (1.15), doc/definitions.dox (1.35),
+	  interfaces/Makefile.am (1.2), interfaces/Prolog/Makefile.am
+	  (1.3), interfaces/Prolog/SICStus/Makefile.am (1.9),
+	  interfaces/Prolog/SICStus/clpq.pl (1.26),
+	  interfaces/Prolog/SICStus/clpq2.pl (1.2),
+	  interfaces/Prolog/SICStus/expected (1.3), m4/Makefile.am (1.4),
+	  m4/ac_check_gmp.m4 (1.2), src/ConSys.cc (1.22),
+	  src/ConSys.defs.hh (1.30), src/ConSys.inlines.hh (1.11),
+	  src/ConSys.types.hh (1.2), src/Constraint.cc (1.13),
+	  src/Constraint.defs.hh (1.29), src/Constraint.inlines.hh (1.15),
+	  src/Constraint.types.hh (1.2), src/GenSys.cc (1.29),
+	  src/GenSys.defs.hh (1.41), src/GenSys.inlines.hh (1.11),
+	  src/GenSys.types.hh (1.2), src/Generator.cc (1.15),
+	  src/Generator.defs.hh (1.34), src/Generator.inlines.hh (1.16),
+	  src/Generator.types.hh (1.2), src/Integer.cc (1.2),
+	  src/Integer.defs.hh (1.2), src/Integer.inlines.hh (1.2),
+	  src/Integer.types.hh (1.2), src/LinExpression.cc (1.9),
+	  src/LinExpression.defs.hh (1.22), src/LinExpression.inlines.hh
+	  (1.10), src/LinExpression.types.hh (1.2), src/Makefile.am (1.22),
+	  src/Matrix.cc (1.27), src/Matrix.defs.hh (1.15),
+	  src/Matrix.inlines.hh (1.14), src/Matrix.types.hh (1.2),
+	  src/Polyhedron.cc (1.122), src/Polyhedron.defs.hh (1.75),
+	  src/Polyhedron.inlines.hh (1.15), src/Polyhedron.types.hh (1.2),
+	  src/Row.cc (1.25), src/Row.defs.hh (1.24), src/Row.inlines.hh
+	  (1.9), src/Row.types.hh (1.2), src/SatMatrix.cc (1.11),
+	  src/SatMatrix.defs.hh (1.12), src/SatMatrix.inlines.hh (1.7),
+	  src/SatMatrix.types.hh (1.2), src/SatRow.cc (1.5),
+	  src/SatRow.defs.hh (1.9), src/SatRow.inlines.hh (1.8),
+	  src/SatRow.types.hh (1.2), src/Status.cc (1.9),
+	  src/Status.defs.hh (1.11), src/Status.inlines.hh (1.5),
+	  src/Status.types.hh (1.2), src/Variable.cc (1.4),
+	  src/Variable.defs.hh (1.11), src/Variable.inlines.hh (1.5),
+	  src/Variable.types.hh (1.2), src/conversion.cc (1.19),
+	  src/globals.hh (1.7), src/minimize.cc (1.10), src/ppl_header.top
+	  (1.3), src/simplify.cc (1.10), tests/Makefile.am (1.41),
+	  tests/addconstraints1.cc (1.3), tests/addconstraints2.cc (1.5),
+	  tests/addconstraints3.cc (1.2), tests/adddimensions1.cc (1.2),
+	  tests/addgenerators1.cc (1.2), tests/addgenerators2.cc (1.2),
+	  tests/affineimage1.cc (1.2), tests/affinetrans.cc (1.6),
+	  tests/append1.cc (1.8), tests/append2.cc (1.9),
+	  tests/convexdifference1.cc (1.4), tests/convexhull1.cc (1.2),
+	  tests/ehandlers.hh (1.3), tests/empty1.cc (1.6), tests/error1.cc
+	  (1.7), tests/error2.cc (1.9), tests/error3.cc (1.9),
+	  tests/error4.cc (1.4), tests/error5.cc (1.5), tests/includes1.cc
+	  (1.2), tests/inters1.cc (1.8), tests/inters2.cc (1.10),
+	  tests/inters3.cc (1.2), tests/limitedwidening1.cc (1.4),
+	  tests/limitedwidening2.cc (1.3), tests/onepoint.cc (1.2),
+	  tests/permute.cc (1.12), tests/randchull1.cc (1.10),
+	  tests/removedim1.cc (1.3), tests/removedim2.cc (1.6),
+	  tests/removedim3.cc (1.2), tests/removedim4.cc (1.2),
+	  tests/satisfies1.cc (1.3), tests/smm1.cc (1.2), doc/devref.tex
+	  (1.7), doc/user.tex (1.8): Copyright year bumped.
+
+2002-02-23 Saturday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/convexdifference1.cc (1.3): Do not be noisy.
+
+2002-02-23 Saturday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.121), tests/convexdifference1.cc (1.2):
+	  Polyhedron::convex_difference_assign() fixed.
+
+2002-02-23 Saturday 16:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.120): Method
+	  Polyhedron::convex_diffrence_assign corrected.  The new version
+	  forces the result to be a _closed_ polyhedron.
+
+2002-02-23 Saturday 14:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.8), src/Polyhedron.cc (1.119), src/Polyhedron.defs.hh
+	  (1.74), tests/Makefile.am (1.40), tests/convexdifference1.cc
+	  (1.1): New methods Polyhedron::convex_difference_assign(const
+	  Polyhedron&) and
+	  Polyhedron::convex_difference_assign_and_minimize(const
+	  Polyhedron&).  They assigns to *this the convex hull of the
+	  set-theoretic difference of *this and the argument (possibly non
+	  minimized or minimized, respectively).
+	  Polyhedron::convex_hull_assign() was missing the final
+	  assert(OK()).
+
+2002-02-22 Friday 22:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.7), src/Polyhedron.cc (1.118), src/Polyhedron.defs.hh
+	  (1.73), tests/limitedwidening1.cc (1.3),
+	  tests/limitedwidening2.cc (1.2):
+	  Polyhedron::limited_widening_assign(const Polyhedron&, ConSys&)
+	  was erroneously returning a (random) boolean: it is now a void
+	  method.
+
+2002-02-22 Friday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.39), limitedwidening2.cc (1.1): New test
+	  to check that the case where the passed constraint system is
+	  inconsistent with respect to the widened polyhedron.	Note: it
+	  currently fails, since Polyhedron::limited_widening_assign() is
+	  buggy, as it is now.
+
+2002-02-22 Friday 19:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/limitedwidening1.cc (1.2): Improved: now we check also the
+	  returned boolean.
+
+2002-02-22 Friday 19:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.4): New functions to print the constraints and
+	  the generators.
+
+2002-02-22 Friday 19:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.117): Readability improvements to
+	  Polyhedron::limited_widening_assign().
+
+2002-02-22 Friday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.116): Slightly optimized operator <=(const
+	  Polyhedron& x, const Polyhedron& y).
+
+2002-02-22 Friday 08:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.6): Updated for release 0.3.
+
+2002-02-20 Wednesday 19:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.5): Updated.
+
+2002-02-20 Wednesday 13:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.115): In Polyhedron::add_constraints(ConSys&
+	  cs), turned on the BE_LAZY version which does not sort matrices
+	  and does not perform unnecessary copies.
+
+2002-02-17 Sunday 23:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/satisfies1.cc (1.2): Avoid a compiler warning when NOISY is
+	  0.
+
+2002-02-17 Sunday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* acinclude.m4 (1.2), configure.ac (1.23),
+	  interfaces/Prolog/SICStus/Makefile.am (1.8), m4/Makefile.am
+	  (1.3), m4/ac_check_gmp.m4 (1.1), m4/ac_check_gmp_exceptions.m4
+	  (1.3), m4/ac_check_have_gmp.m4 (1.3), tests/Makefile.am (1.38):
+	  GMP configuration machinery rewritten (this should help people
+	  trying to build the PPL under CygWin).
+
+2002-02-15 Friday 16:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bug6.dat (positive.2): This is the correct test data.
+
+2002-02-15 Friday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: bug1.cc, bug2.cc, bug3.cc, bug4.cc, bug5.cc, bug6.cc
+	  (positive.[3,2,2,2,2,2]): All the invocations of Polyhedron::OK()
+	  were misplaced.
+
+2002-02-15 Friday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug6.cc, bug6.dat (positive.[7,1,1]): bug6
+	  shows that problems minimizations problems persist.
+
+2002-02-14 Thursday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.22), src/Integer.cc (1.1), src/Integer.defs.hh
+	  (1.1), src/Integer.inlines.hh (1.1), src/Integer.types.hh (1.1),
+	  src/Makefile.am (1.21): Integer stuff moved up one level.
+
+2002-02-14 Thursday 13:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.37), affine_image1.cc (1.2),
+	  affineimage1.cc (1.1): For consistency, affine_image1.cc has been
+	  renamed affineimage1.cc.
+
+2002-02-14 Thursday 13:17  Elisa Ricci
+
+	* tests/: Makefile.am (1.36), adddimensions1.cc (1.1),
+	  convexhull1.cc (1.1), inters3.cc (1.1), limitedwidening1.cc
+	  (1.1), removedim4.cc (1.1): Added tests for the functions
+	  Polyhedron::add_dimensions_and_project(),
+	  Polyhedron::convex_hull_assign(),
+	  Polyhedron::intersection_assign(),
+	  Polyhedron::limited_widening_assign() and
+	  Polyhedron::remove_higher_dimensions().
+
+2002-02-14 Thursday 11:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.114): Added comments regarding the handling
+	  of the `sorted' flag in methods remove_dimensions and
+	  remove_higher_dimensions.
+
+2002-02-14 Thursday 11:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.28): In method remove_invalid_lines_and_rays(),
+	  we do not need to keep the generators sorted (this saves
+	  efficiency, since we were always calling it with a possibly
+	  non-sorted system).  Using remove_invalid_lines_and_rays() in
+	  affine_image.
+
+2002-02-14 Thursday 10:04  Elisa Ricci
+
+	* src/Generator.cc (1.14): Changed the error message and the
+	  comment in function Generator::OK().
+
+2002-02-14 Thursday 09:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.27), Polyhedron.cc (1.113): Avoiding all
+	  shadowing of the space_dim member of a Polyhedron.  Now using the
+	  accessor Polyhedron::space_dimension() only when needed.  Fixed a
+	  few comments.
+
+2002-02-14 Thursday 09:37  Elisa Ricci
+
+	* src/Polyhedron.cc (1.112), tests/Makefile.am (1.35),
+	  tests/includes1.cc (1.1): Erased the abort() at the end of
+	  function Polyhedron::includes(g) and added a test for this
+	  function.
+
+2002-02-13 Wednesday 23:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.21): Bump version number.
+
+2002-02-13 Wednesday 23:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.26), GenSys.defs.hh (1.40): Overload the
+	  output operator for GenSys_Con_Rel.
+
+2002-02-13 Wednesday 23:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.34), affine_image1.cc (1.1), satisfies1.cc
+	  (1.1): New test programs.
+
+2002-02-13 Wednesday 19:08  Elisa Ricci
+
+	* src/: GenSys.cc (1.25), Polyhedron.cc (1.111): Modified the
+	  function Polyhedron::satisfies(...).	In function
+	  GenSys::affine_image(...) we erase the rows that have all the
+	  terms equal to zero.
+
+2002-02-13 Wednesday 12:07  Elisa Ricci
+
+	* src/minimize.cc (positive.7): In functions minimize() and
+	  add_and_minimize(), to obtain the system of constraints in the
+	  case !con_to_gen now we use conversion().
+
+2002-02-12 Tuesday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug5.cc, bug5.dat (positive.[6,1,1]): bug5
+	  shows that we still have problems with minimization.
+
+2002-02-12 Tuesday 10:10  Elisa Ricci
+
+	* src/minimize.cc (positive.6): We must simplify also `dest' in
+	  function minimize to erase all redundant constraints in the case
+	  !con_to_gen.	In functions minimize() and add_and_minimize(), in
+	  the case !con_to_gen, there was an error when we choose the
+	  constraints to erase.
+
+2002-02-11 Monday 12:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug4.cc, bug4.dat (positive.[5,1,1]): bug4
+	  shows that we still have minimization problems.
+
+2002-02-11 Monday 11:49  Elisa Ricci
+
+	* src/minimize.cc (positive.5): In function add_and_minimize, we
+	  must simplify `dest' in the case !con_to_gen because it can
+	  contain redundant constraints.
+
+2002-02-11 Monday 10:57  Elisa Ricci
+
+	* src/: conversion.cc, minimize.cc, simplify.cc (positive.[3,4,3]):
+	  In function add_and_minimize and in the case of !con_to_gen, the
+	  system of constraints (that in this case is `dest') must contain
+	  the constraints of positivity of variables.  In minimize and
+	  add_and_minimize, we must erase the constraints that are a linear
+	  combination of an equality and a constraint of positivity of
+	  variables.
+
+2002-02-09 Saturday 07:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (positive.4): Error message made more specific.
+
+2002-02-07 Thursday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug3.cc, bug3.dat (positive.[4,1,1]): bug3
+	  shows that Polyhedron::minimize() does not minimize.
+
+2002-02-07 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatMatrix.cc, SatMatrix.inlines.hh (positive.[1,1]):
+	  SatMatrix::columns_erase_to_end() fixed (and no longer inline).
+
+2002-02-07 Thursday 12:25  Elisa Ricci
+
+	* src/: Row.cc, minimize.cc (positive.[3,3]): Corrected an error in
+	  the function Row::only_a_term_is_positive().	In minimize and in
+	  the case !con_to_gen we must call simplify() also for the `dest'
+	  because there is the possibility that constraints that are
+	  redundant with the constraints of positivity of variables are
+	  present in dest.
+
+2002-02-06 Wednesday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug2.cc, bug2.dat (positive.[3,1,1]): bug2
+	  shows another problem this time cropping up in
+	  SatMatrix::columns_erase_to_end().
+
+2002-02-06 Wednesday 08:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bug1.cc (positive.2): Assert that the input polyhedra are
+	  OK.
+
+2002-02-06 Wednesday 07:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.110): Error messages improved.
+
+2002-02-05 Tuesday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug1.cc, bug1.dat (positive.[2,1,1]): bug1
+	  shows a problem with
+	  Polyhedron::convex_hull_assign_and_minimize().
+
+2002-02-05 Tuesday 22:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (positive.3): The input operator now handles
+	  the `positive' flag.
+
+2002-02-05 Tuesday 16:02  Elisa Ricci
+
+	* src/Matrix.cc, src/Matrix.defs.hh, src/Polyhedron.cc,
+	  src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh, src/Row.cc,
+	  src/Row.defs.hh, src/conversion.cc, src/minimize.cc,
+	  src/simplify.cc, tests/Makefile.am, tests/addconstraints1.cc,
+	  tests/addconstraints2.cc, tests/addconstraints3.cc,
+	  tests/addgenerators1.cc, tests/addgenerators2.cc,
+	  tests/affinetrans.cc, tests/append1.cc, tests/append2.cc,
+	  tests/empty1.cc, tests/error2.cc, tests/error3.cc,
+	  tests/error4.cc, tests/error5.cc, tests/error6.cc,
+	  tests/inters1.cc, tests/inters2.cc, tests/onepoint.cc,
+	  tests/permute.cc, tests/randchull1.cc, tests/removedim1.cc,
+	  tests/removedim2.cc, tests/removedim3.cc, tests/smm1.cc
+	  (positive.[1,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Considered the case of a positive poited cone (i.e. a polyhedron
+	  composed by points that satisfies the constraints of positivity
+	  of all variables).  Added a test that shows that we can not add
+	  or insert a line in a positive pointed cone.	All the tests use
+	  positive pointed cones.
+
+2002-02-04 Monday 22:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.109): More concise usage of stringstreams.
+
+2002-02-03 Sunday 07:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.6), config.sub (1.6): Updated.
+
+2002-02-01 Friday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh,
+	  Row.cc, Row.defs.hh, conversion.cc, minimize.cc, simplify.cc
+	  (positive.[1,1,1,1,1,1,1,1]): The work on positive polyhedra is
+	  being moved onto the `positive' branch.  Phase 2: latest changes
+	  reapplied on the branch.
+
+2002-02-01 Friday 15:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.108), Polyhedron.defs.hh (1.72),
+	  Polyhedron.inlines.hh (1.14), Row.cc (1.24), Row.defs.hh (1.23),
+	  conversion.cc (1.18), minimize.cc (1.9), simplify.cc (1.9): The
+	  work on positive polyhedra is being moved onto the `positive'
+	  branch.  Phase 1: latest changes undone.
+
+2002-01-31 Thursday 08:35  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.107), Polyhedron.defs.hh (1.71),
+	  Polyhedron.inlines.hh (1.13), Row.cc (1.23), Row.defs.hh (1.22),
+	  conversion.cc (1.17), minimize.cc (1.8), simplify.cc (1.8):
+	  Started to consider the case of positive polyhedra: this part is
+	  controlled by POSITIVE.
+
+2002-01-29 Tuesday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.20): Tell the user how to configure GMP.
+
+2002-01-29 Tuesday 15:41  Elisa Ricci
+
+	* src/Polyhedron.cc (1.106): In function
+	  Polyhedron::remove_higher_dimensions, erased the command `size_t
+	  space_dim = space_dimension()' because it caused a problem.
+
+2002-01-29 Tuesday 11:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.19), interfaces/Prolog/SICStus/ppl_sicstus.cc
+	  (1.28), m4/ac_check_gmp_exceptions.m4 (1.2),
+	  m4/ac_check_have_gmp.m4 (1.2), src/Constraint.cc (1.12),
+	  src/Constraint.inlines.hh (1.14), src/Generator.cc (1.13),
+	  src/Generator.defs.hh (1.33), src/LinExpression.cc (1.8),
+	  src/LinExpression.inlines.hh (1.9), src/Matrix.cc (1.26),
+	  src/Matrix.inlines.hh (1.13), src/Polyhedron.defs.hh (1.70),
+	  src/Row.cc (1.22), src/Row.defs.hh (1.21), src/conversion.cc
+	  (1.16), src/globals.hh (1.6), tests/randchull1.cc (1.9): We now
+	  use the integer C++ class of GMP, instead of baking our own.
+	  Note: we now require GMP 4.0.1 or higher.
+
+2002-01-29 Tuesday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.20): Finish backing out the unwanted commit.
+
+2002-01-29 Tuesday 08:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.105): Better formatting for error messages.
+
+2002-01-29 Tuesday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.cc (1.11), Constraint.inlines.hh (1.13),
+	  Generator.cc (1.12), Generator.defs.hh (1.32), LinExpression.cc
+	  (1.7), LinExpression.inlines.hh (1.8), Matrix.cc (1.25),
+	  Matrix.defs.hh (1.14), Matrix.inlines.hh (1.12), Polyhedron.cc
+	  (1.104), Polyhedron.defs.hh (1.69), Row.cc (1.21), Row.defs.hh
+	  (1.20), conversion.cc (1.15), globals.hh (1.5): Back out previous
+	  commit.
+
+2002-01-29 Tuesday 08:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.cc (1.10), Constraint.inlines.hh (1.12),
+	  Generator.cc (1.11), Generator.defs.hh (1.31), LinExpression.cc
+	  (1.6), LinExpression.inlines.hh (1.7), Makefile.am (1.19),
+	  Matrix.cc (1.24), Matrix.defs.hh (1.13), Matrix.inlines.hh
+	  (1.11), Polyhedron.cc (1.103), Polyhedron.defs.hh (1.68), Row.cc
+	  (1.20), Row.defs.hh (1.19), conversion.cc (1.14), globals.hh
+	  (1.4): Better formatting for error messages.
+
+2002-01-29 Tuesday 07:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.27): Fix a couple of
+	  namespace and include file glitches.
+
+2002-01-27 Sunday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.18), ppl.spec.in (1.7), doc/Makefile.am (1.14),
+	  interfaces/Prolog/SICStus/Makefile.am (1.7), src/Makefile.am
+	  (1.18), tests/Makefile.am (1.33): The move to libtool is
+	  complete: we can now build and distribute (with, e.g., RPM)
+	  static and dynamic versions of the library.
+
+2002-01-27 Sunday 17:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.12), configure.ac (1.17), ltmain.sh (1.1): Start
+	  to migrate to libtool.
+
+2002-01-27 Sunday 15:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.28): Fixed a typo in a (documentation)
+	  comment.
+
+2002-01-19 Saturday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.29), ConSys.inlines.hh (1.10),
+	  GenSys.defs.hh (1.39), GenSys.inlines.hh (1.10): ConSys and
+	  GenSys were both missing the assignment operator.
+
+2002-01-14 Monday 08:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.5), config.sub (1.5): Updated.
+
+2001-12-23 Sunday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.19): Include maxmin.hh.
+
+2001-12-20 Thursday 09:21  Elisa Ricci
+
+	* src/Polyhedron.cc (1.102): Modified the part of function
+	  Polyhedron::add_constraints(cs) that is controlled by "#if 0":
+	  used Matrix::grow(size_t, size_t) instead of resize(size_t,
+	  size_t) and swap instead of "=", where it is possible.
+
+2001-12-15 Saturday 11:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.6): Distribute also
+	  clpq2.pl.
+
+2001-12-15 Saturday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.23), Polyhedron.cc (1.101), conversion.cc
+	  (1.13): Some comments fixed.
+
+2001-12-14 Friday 16:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/smmdiff.clpq (1.1): smmdiff.clpq is
+	  based on smm.clpq and solves the classic send-more-money problem
+	  so that each variable is bound to a unique number.
+
+2001-12-14 Friday 16:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq2.pl (1.1): clpq2.pl is an
+	  alternative meta-interpreter with some extra features, including
+	  disjunction.
+
+2001-12-13 Thursday 16:52  Elisa Ricci
+
+	* tests/: Makefile.am (1.32), addgenerators1.cc (1.1),
+	  addgenerators2.cc (1.1): Added a test for the function
+	  Polyhedron::add_generators_and_minimize(gs) and one for the
+	  function Polyhedron::add_generators(gs).
+
+2001-12-13 Thursday 16:50  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.100), Polyhedron.defs.hh (1.67): The
+	  function Polyhedron::add_generators(gs) now is called
+	  Polyhedron::add_generators_and_minimize(gs).	Added the function
+	  Polyhedron::add_generators(gs) that adds the system of generators
+	  "gs" to the polyhedron without minimizing the resulting
+	  polyhedron.
+
+2001-12-13 Thursday 11:35  Elisa Ricci
+
+	* src/Polyhedron.cc (1.99): In functions
+	  Polyhedron::add_constraints() and add_constraints_and_minimize()
+	  improved the comments for the case of a zero-dimensional
+	  polyhedron.
+
+2001-12-13 Thursday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.98): Some comments have been improved.
+
+2001-12-12 Wednesday 18:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.31), bug1.cc (1.2), bug2.cc (1.2):
+	  Obsolete bug witnesses removed.
+
+2001-12-12 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.30), addconstraints3.cc (1.1): New test.
+
+2001-12-12 Wednesday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.cc (1.10), Generator.defs.hh (1.30),
+	  LinExpression.defs.hh (1.21), Matrix.cc (1.22), Polyhedron.cc
+	  (1.97), Polyhedron.defs.hh (1.66), Polyhedron.inlines.hh (1.12),
+	  Row.cc (1.18), Row.defs.hh (1.18), conversion.cc (1.12),
+	  minimize.cc (1.7), simplify.cc (1.7): Kill trailing blanks.
+
+2001-12-12 Wednesday 18:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.17): The function compare(const Row& x, const Row&
+	  y) can now compare rows of different size.
+
+2001-12-12 Wednesday 17:16  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.96), Polyhedron.inlines.hh (1.11): The
+	  function Polyhedron::set_zero_dim_univ() is now in Polyhedron.cc
+	  (instead of Polyhedron.inlines.hh), says that a zero-dimensional
+	  polyhedron is in a 0-dimensional space and clears the system of
+	  the polyhedron.  Used "space_dim" instead of "space_dimension()"
+	  (where we call this function many times).
+
+2001-12-12 Wednesday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.95): Some minor improvements.
+
+2001-12-11 Tuesday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.94): Bad uses of the negation operator `!'
+	  have been fixed.  Some comments improved.
+
+2001-12-11 Tuesday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatMatrix.cc (1.10), SatMatrix.defs.hh (1.11): Wrong
+	  comments fixed.
+
+2001-12-11 Tuesday 19:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatMatrix.defs.hh (1.10): Spurious declarations removed: two
+	  methods were declared and never used nor implemented.
+
+2001-12-11 Tuesday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.12), Matrix.inlines.hh (1.10): Comments
+	  for Matrix::clear() adjusted.
+
+2001-12-11 Tuesday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatMatrix.cc (1.9), SatMatrix.defs.hh (1.9),
+	  SatMatrix.inlines.hh (1.6): SatMatrix::clear() was complete
+	  nonsense: rewritten.
+
+2001-12-11 Tuesday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.inlines.hh (1.9): Matrix::clear() now releases as much
+	  memory as possible.
+
+2001-12-11 Tuesday 16:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.tex (1.6), user.tex (1.7): People that are no longer
+	  contributing or willing to contribute take a back seat (will
+	  simplify the publication of the documentation as a technical
+	  report).
+
+2001-12-11 Tuesday 11:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.inlines.hh (1.7): Much more efficient (and concise)
+	  implementation for SatRow::clear_from().
+
+2001-12-11 Tuesday 10:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.93), Polyhedron.defs.hh (1.65): Comments
+	  added for Polyhedron::remove_higher_dimensions().
+
+2001-12-11 Tuesday 09:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.92): Polyhedron::Polyhedron(ConSys& cs)
+	  improved.
+
+2001-12-11 Tuesday 00:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.21), Matrix.defs.hh (1.11): Always compile
+	  Matrix::check_sorted().  Matrix::OK() fixed: the symbols `cerr'
+	  and `endl' live in the `std' namespace.
+
+2001-12-11 Tuesday 00:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.20), Matrix.inlines.hh (1.8), Polyhedron.cc
+	  (1.91): A default-constructed (empty) Matrix is now declared as
+	  sorted.  Matrix::grow() was not handling the `sorted' flag
+	  correctly: fixed.  Matrix::add_zero_columns() is now an inline
+	  method.  Matrix::OK() now checks that the `sorted' flag is set
+	  only if the matrix is actually sorted.
+	  Matrix::add_rows_and_columns() now asserts OK() before returning.
+	  Some comments fixed.
+
+2001-12-10 Monday 16:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatMatrix.cc (1.8): SatMatrix::resize() was not shrinking the
+	  matrix when requested to do so: fixed.
+
+2001-12-10 Monday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatMatrix.cc (1.7): Added speculative memory allocation for
+	  SatMatrix.
+
+2001-12-10 Monday 08:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.90), Row.defs.hh (1.17): Some comments
+	  have been fixed.
+
+2001-12-09 Sunday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.16): Bump version number so as to avoid
+	  confusion.
+
+2001-12-08 Saturday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/expected (1.2), src/Row.defs.hh (1.16):
+	  EXTRA_NORMALIZATION defaults to 0.  Expected outcome from the
+	  clpq test updated.
+
+2001-12-05 Wednesday 18:58  Elisa Ricci
+
+	* src/: ConSys.cc (1.21), GenSys.cc (1.24), Matrix.cc (1.19),
+	  Matrix.defs.hh (1.10), Polyhedron.cc (1.89), Row.cc (1.16),
+	  Row.defs.hh (1.15), conversion.cc (1.11): The method
+	  Row::normalize() has been restored so that it only ensures
+	  coefficients are mutually prime.  The new method
+	  Row::strong_normalize() also ensures that the first non-zero
+	  coefficient of lines and equalities is negative.  The new method
+	  Matrix::strong_normalize() that calls strongly normalizes each
+	  row.	Strong normalization is now used wherever it is guaranteed
+	  to be both safe and efficient.  The "EXTRA_NORMALIZATION" flag is
+	  used to decide whether strong_normalization is also used in
+	  Row::libear_combine() (since in this case strong normalization
+	  can incur performance penalties).
+
+2001-12-03 Monday 09:16  Elisa Ricci
+
+	* src/Row.cc (1.15): Changed the function Row::normalize() so that
+	  the first coefficient different from zero is negative (and not
+	  positive).
+
+2001-12-02 Sunday 16:09  Elisa Ricci
+
+	* src/: Matrix.cc (1.18), Polyhedron.cc (1.88), Row.cc (1.14): In
+	  Polyhedron::intersection_assign_and_minimize added the assertion
+	  to verify if the resulting polyhedron is OK.	In function
+	  Row::normalize() if we normalize an equality or a line, we decide
+	  that the first element of the corresponding row is positive.	In
+	  function Matrix::back_substitute(), if we call linear_combine
+	  with an equality and an inequality, we must change the
+	  coefficients of the equality so that the coefficient of the
+	  inequality in the linear combination is non-negative.
+
+2001-11-26 Monday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.4), config.sub (1.4): Updated.
+
+2001-11-26 Monday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.26): Typo fixed.
+
+2001-11-21 Wednesday 19:26  Elisa Ricci
+
+	* src/Polyhedron.cc (1.87): Changed the message of some exceptions:
+	  where it is possible we use the functions
+	  `throw_different_dimensions' and `throw_dimension_incompatible'.
+
+2001-11-20 Tuesday 20:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.25): End-of-line characters
+	  left behind be read_term/2 are now eaten.
+
+2001-11-13 Tuesday 21:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.4): Updated.
+
+2001-11-13 Tuesday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.5): Mention that we have greatly improved the
+	  documentation.
+
+2001-11-13 Tuesday 21:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.3): Updated.
+
+2001-11-13 Tuesday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.12): Use `| ?-'
+	  everywhere a goal is introduced.
+
+2001-11-13 Tuesday 21:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.11): `E.g.' and `i.e.'
+	  must always be followed by comma.  There are no exceptions to
+	  this rule.
+
+2001-11-13 Tuesday 18:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.10): Documentation for
+	  ppl_add_consraints_and _minimize and for ppl_copy_polyhedron
+	  added.  Two examples for ppl_insert_constraints added that
+	  compare with examples for those for
+	  ppl_add_consraints_and_minimize.  Introductory sentence added.
+	  "To be written"  replaced by "Support for XXX ...future release."
+
+2001-11-13 Tuesday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.8): Updated for release 0.2.
+
+2001-11-13 Tuesday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.15): Version number bumped to 0.2.
+
+2001-11-13 Tuesday 17:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.4): PPL 0.2 will be released on November 14, 2001.
+
+2001-11-13 Tuesday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.5): Packaging issues
+	  solved.
+
+2001-11-13 Tuesday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.4), check_script
+	  (1.1), expected (1.1): Use the meta-interpreter for `make check'.
+
+2001-11-13 Tuesday 15:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.24): reconsult(File) command
+	  fixed.
+
+2001-11-13 Tuesday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_check.pl (1.7): Gone, at last.
+
+2001-11-13 Tuesday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.23): Legalese added.
+
+2001-11-13 Tuesday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.22): Better support for
+	  debugging.  Now the `spy' command works as expected by most
+	  Prolog users.
+
+2001-11-13 Tuesday 09:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/tak.clpq (1.1): New test program.
+
+2001-11-13 Tuesday 09:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ack.clpq (1.3), ackn.clpq (1.1):
+	  ack.clpq is the original version whereas ackn.clpq is the
+	  normalized version.
+
+2001-11-12 Monday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.21): Fixed a bug whereby
+	  original_goal_variables/1 was not retracted in some cases.
+	  Multiple clauses for original_goal_variables/1 were causing the
+	  use of already discarded polyhedra.
+
+2001-11-12 Monday 22:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.25): When compiled
+	  with run-time assertions switched on, the interface now checks
+	  that the Prolog caller is not messing around with Polyhedron's
+	  addresses.
+
+2001-11-12 Monday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.20): Use
+	  ppl_add_constraints_and_minimize/2 instead of adding one
+	  constraint at a time and then checking for emptiness.
+
+2001-11-12 Monday 17:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.24), ppl_sicstus.pl
+	  (1.15): New interface predicate
+	  ppl_add_constraints_and_minimize/2.
+
+2001-11-12 Monday 16:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.19): Fixed bug in
+	  read_clauses/1: now unit clauses are read correctly.
+
+2001-11-12 Monday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.18): The meta-interpreter
+	  core has been rewritten.  Computed answer constraints are also
+	  output in a readable way with variables named as in the original
+	  goal.
+
+2001-11-12 Monday 16:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.9): General
+	  improvements throughout the file.
+
+2001-11-12 Monday 09:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.8): A linear expression
+	  for defining constraints or generators can only have integer
+	  coefficients.  Therefore division by a number is not allowed and
+	  option removed from the grammar rules.  Also a number can
+	  multiply a PPL variable but not an arbitrary linear expression.
+
+2001-11-11 Sunday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.3), config.sub (1.3): Updated.
+
+2001-11-11 Sunday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.3): Missing dependency
+	  added: pplsp depends on the library.	Do not assume `.' is in
+	  PATH.
+
+2001-11-11 Sunday 17:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.27), Constraint.inlines.hh (1.11),
+	  Generator.defs.hh (1.29), Generator.inlines.hh (1.15),
+	  Row.defs.hh (1.14): std::swap() specialized both for Constraint
+	  and Generator.  Less verbose comments for such a simple
+	  operation.
+
+2001-11-11 Sunday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GenSys.cc (1.23): Spurious assertions removed.
+
+2001-11-11 Sunday 17:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.28), ConSys.inlines.hh (1.9), GenSys.cc
+	  (1.22), GenSys.defs.hh (1.38), GenSys.inlines.hh (1.9):
+	  ConSys::swap() and GenSys::swap() removed: they are inherited
+	  from Matrix.	GenSys::remove_invalid_lines_and_rays()
+	  implemented.
+
+2001-11-11 Sunday 16:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.21), GenSys.defs.hh (1.37), Polyhedron.cc
+	  (1.86): Use Constraint::trivial_true() and
+	  Constraint::trivial_false().	Prepare to remove invalid line and
+	  rays from a GenSys.  This is necessary in the
+	  Polyhedron::remove_...() methods.
+
+2001-11-11 Sunday 16:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ConSys.cc (1.20): Use Constraint::is_trivial_true().
+
+2001-11-11 Sunday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.cc (1.9), Generator.defs.hh (1.28): Added `bool
+	  Generator::OK() const'.
+
+2001-11-11 Sunday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.cc (1.9), Constraint.defs.hh (1.26):
+	  Constraint::is_trivial() renamed is_trivial_true().
+	  Constraint::is_unsatisfiable() renamed is_trivial_false().  Both
+	  now use Row::all_homogeneous_terms_are_zero().
+
+2001-11-11 Sunday 15:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.13), Row.defs.hh (1.13): Added `bool
+	  Row::all_homogeneous_terms_are_zero() const'.
+
+2001-11-11 Sunday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.85): All other things being equal, prefer
+	  pre-increment/decrement to post-increment/decrement.
+
+2001-11-10 Saturday 20:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: append1.cc (1.7), append2.cc (1.8), permute.cc (1.11):
+	  Infamous relops are already neutralized in ppl_install.hh.
+
+2001-11-09 Friday 19:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.29), smm1.cc (1.1): New test program.
+
+2001-11-09 Friday 18:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.17): Now clpq.pl does not
+	  require the lists module.
+
+2001-11-09 Friday 17:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.16): Now a vertex is
+	  inserted before any lines or rays.  This avoids a bug when
+	  inserting generators into the empty polyhedron.
+
+2001-11-09 Friday 16:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.15): Now the interpreter
+	  answers "yes" or "no".  The listing/0 command has been improved.
+
+2001-11-09 Friday 15:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.17), Matrix.defs.hh (1.9), Polyhedron.cc
+	  (1.84), Row.cc (1.12), Row.defs.hh (1.12), conversion.cc (1.10):
+	  Another go at smart memory allocation.
+
+2001-11-09 Friday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/addconstraints2.cc (1.4): Catch standard exceptions.
+
+2001-11-09 Friday 14:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.7): Corrections and
+	  improvements as suggested by Enea implemented.  Other corrections
+	  done and examples added.
+
+2001-11-09 Friday 13:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.14): Now there are no calls
+	  to the ppl_convex_hull_assign operation.  This version keeps the
+	  list of generators and uses that to recover from failure paths.
+
+2001-11-09 Friday 08:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.13): Now many of the
+	  unwanted temporary copies of polyhedra are deleted earlier.
+
+2001-11-08 Thursday 22:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.6): More detailed
+	  specification of the interface predicates with many examples
+	  added.  Introduction includes grammar rules and list of some
+	  important issues wrt using the PPL in Prolog.
+
+2001-11-08 Thursday 17:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.12): Each constraint output
+	  on a new line.
+
+2001-11-08 Thursday 15:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.pl (1.14): Comment
+	  containing documentation removed.
+
+2001-11-08 Thursday 15:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.11): The main polyhedron is
+	  now deleted when solve(goal) fails.
+
+2001-11-08 Thursday 12:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.10): Unwanted polyhedra are
+	  deleted now when calls to solve/7 fail.
+
+2001-11-08 Thursday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.16): Matrix::resize_no_copy() now deals with the
+	  case where the vector of rows must be reallocated.
+
+2001-11-08 Thursday 10:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.5): Detailed predicate
+	  descriptions drafted for SICStus Prolog.
+
+2001-11-08 Thursday 08:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.9): Some improvements to the
+	  efficiency by replacing calls to member/2 by member_check/2 and
+	  by reducing the number of calls to ppl_check_empty.  Also,
+	  numbervars/3 replaced by numvars/3 defined within clpq.pl.
+
+2001-11-07 Wednesday 13:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.pl (1.13): First draft of
+	  documentation for ppl_sicstus.pl the interface for Prolog.
+
+2001-11-07 Wednesday 11:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.8): This version tries to
+	  reduce the amount of memory leakage between requests for more
+	  solutions and between tests.
+
+2001-11-06 Tuesday 16:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.7): More small improvements
+	  made.
+
+2001-11-06 Tuesday 16:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/: ack.clpq (1.2), clpq.pl (1.6):
+	  clpq.pl: The comments have been corrected and 	 some
+	  simplifications to the code.	ack.clpq: A bug in the second
+	  clause corrected.
+
+2001-11-06 Tuesday 15:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.5): Temporary version. This
+	  is working but needs commenting and further checking.
+
+2001-11-05 Monday 11:36  Elisa Ricci
+
+	* src/ConSys.cc (1.19), src/ConSys.defs.hh (1.27), src/GenSys.cc
+	  (1.20), src/GenSys.defs.hh (1.36), src/Polyhedron.cc (1.83),
+	  src/Polyhedron.defs.hh (1.64), tests/affinetrans.cc (1.5),
+	  tests/error2.cc (1.8): Changed the name of some functions:
+	  Polyhedron::assign_variable --> Polyhedron::affine_image
+	  Polyhedron::substitute_variable --> Polyhedron::affine_preimage
+	  GenSys::assign_variable --> GenSys::affine_image
+	  ConSys::substitute_variable --> ConSys::affine_preimage The new
+	  names are used in the examples and in the tests.
+
+2001-11-05 Monday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/smm.clpq (1.1): A new example program.
+
+2001-11-05 Monday 09:57  Elisa Ricci
+
+	* src/Polyhedron.cc (1.82): At the end of the functions
+	  Polyhedron::add_dimensions_and_project and
+	  Polyhedron::add_dimensions_and_constraints, we can have an empty
+	  polyhedron without the flag EMPTY sets: so, the assertion OK() is
+	  modified not to verify if the system of constraints is
+	  satisfiable.
+
+2001-11-05 Monday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ack.clpq (1.1), fib.clpq (1.1),
+	  mc91.clpq (1.1), sumto.clpq (1.1): Small programs to test
+	  clpq.pl.
+
+2001-11-05 Monday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.81): The final OK() assertion of
+	  Polyhedron::add_dimensions_and_embed() has been modified so as to
+	  allow for empty polyhedra.  Needs checking.  A similar analysis
+	  must be conducted on Polyhedron::add_dimensions_and_project().
+
+2001-11-05 Monday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.4): Let `.clpq' be the
+	  default extension.
+
+2001-11-05 Monday 07:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.17), Matrix.cc (1.15), Matrix.inlines.hh
+	  (1.7), Row.defs.hh (1.11), Row.inlines.hh (1.8), globals.hh
+	  (1.3): Speculative memory allocation is now completely
+	  implemented.	The function `size_t compute_capacity(size_t
+	  requested_size)' is now in namespace scope, since it is used both
+	  for Row's and for Matrix columns.  Its current implementation
+	  (2*(requested_size+1)) is to be considered experimental.
+
+2001-11-04 Sunday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.34): Doxygen no longer causes a spurious
+	  string of characters in the user manual.
+
+2001-11-04 Sunday 22:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.14): In Matrix(const Matrix& y) the right
+	  row-capacity is computed for the copy.
+
+2001-11-04 Sunday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.13): The methods Matrix::add_row(...) are now
+	  careful with respect to reallocation of the `rows' vector.  The
+	  stage is now ready for speculative memory allocation.
+
+2001-11-04 Sunday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.25), Constraint.inlines.hh (1.10),
+	  Polyhedron.cc (1.80): Added and used `const Constraint&
+	  Constraint::zero_dim_positivity()'.
+
+2001-11-04 Sunday 15:59  Elisa Ricci
+
+	* src/Polyhedron.cc (1.79): In functions
+	  Polyhedron::update_constraints and Polyhedron::update_generators
+	  we only have a saturation matrix up-to-date: so, we must say that
+	  the other is not up-to-date.	In function
+	  Polyhedron::assign_variable, if the transformation is not
+	  invertible, we must have the system of generators up-to-date, and
+	  then if the polyhedron is non-empty, we use the function
+	  GenSys::assign_variable to find the resulting polyhedron. so, we
+	  always modify the polyhedron (we do not modify the polyhedron if
+	  it is empty or if there are dimensional problems).
+
+2001-11-04 Sunday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.78): Polyhedron::remove_...() methods
+	  improved.
+
+2001-11-04 Sunday 12:56  Elisa Ricci
+
+	* src/Matrix.cc (1.12): A wrong comment erased: it is not true that
+	  the Row::linear_combine changes the flag `sorted' of the matrix.
+
+2001-11-04 Sunday 12:22  Elisa Ricci
+
+	* src/Polyhedron.cc (1.77): In functions
+	  Polyhedron::assign_variable and Polyhedron::substitute_variable
+	  we must clear the flags SAT_C_UP_TO_DATE and SAT_G_UP_TO_DATE,
+	  because after the operations the polyhedron is changed.
+
+2001-11-04 Sunday 12:01  Elisa Ricci
+
+	* src/Matrix.cc (1.11): In function Matrix::gauss(), we change a
+	  row without changing "changed" that indicates that the matrix is
+	  changed: so the flag "sorted" of the matrix was true even if the
+	  matrix was not sorted.
+
+2001-11-04 Sunday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.23):
+	  ppl_intersection_assign/2 calls
+	  Polyhedron::intersection_assign().
+
+2001-11-04 Sunday 09:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.18), GenSys.cc (1.19), Makefile.am (1.16),
+	  Matrix.cc (1.10), Matrix.defs.hh (1.8), Matrix.inlines.hh (1.6),
+	  Polyhedron.cc (1.76), Row.cc (1.11), Row.defs.hh (1.10),
+	  Row.inlines.hh (1.7), SatRow.inlines.hh (1.6), conversion.cc
+	  (1.9), globals.cc (1.2), globals.hh (1.2), minimize.cc (1.6):
+	  OK() methods changed to allow for ConSys and GenSys with a single
+	  column.
+
+	  Temporary Integer's now incapsulated into a function: the source
+	  globals.cc is no longer necessary.
+
+	  The funcionality of Matrix::compute_row_capacity() is now
+	  provided by Row::compute_capacity().
+
+	  Tracking of capacity improved (there are still several problems
+	  though).  Matrix::sort_rows() rewritten: the STL algorithms keep
+	  the freedom of making copies of rows and we cannot accept that.
+
+	  Temporaty kludges added to the Matrix::add_row() methods: if the
+	  rows vector must grow, the implementation will copy the rows
+	  changing their capacity.  A proper solution to this problem must
+	  be found.
+
+	  OK() safety checks added tp Polyhedron::remove_dimensions() and
+	  Polyhedron::remove_higher_dimensions().
+
+	  Polyhedron::remove_dimensions() and
+	  Polyhedron::remove_higher_dimensions() where not clearing the
+	  "generators are minimized" flag.  With this change the flag is
+	  cleared a bit too often.  A proper solution must be found.
+
+	  Polyhedron::remove_dimensions() and
+	  Polyhedron::remove_higher_dimensions() now use
+	  Matrix::resize_no_copy() instead of Matrix::resize() in order to
+	  shrink matrices.
+
+	  Row::OK() added and used.  When compiling with assertions each
+	  rows brings its own capacity in the capacity_ flag.  The
+	  consistency of this information is checked by Row::OK() which, in
+	  turn, is called by Matrix::OK() for each row of the matrix.  For
+	  internal use, the capacity_ field can be accessed by `size_t
+	  Row::capacity() const'.
+
+	  `void Row::assign(Row& y)' added to assign the implementation of
+	  y to *this.
+
+	  `std::iter_swap()' specialized both for vector<Row> and
+	  vector<SatRow>.
+
+2001-11-04 Sunday 08:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.28), bug2.cc (1.1): bug2.cc shows a
+	  problem whereby we do not correctly keep track of the status of
+	  saturation matrices.
+
+2001-11-04 Sunday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.27), bug1.cc (1.1): bug1.cc shows a
+	  problem with the tracking of matrix sortedness.
+
+2001-11-03 Saturday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/append1.cc (1.6): Two assertions added: they prove that
+	  Polyhedron::remove_dimensions() is broken.
+
+2001-11-03 Saturday 13:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.26), GenSys.defs.hh (1.35): "no guarantee
+	  at all" changed into "no guarantees" as suggested by Pat.
+
+2001-11-03 Saturday 10:45  Elisa Ricci
+
+	* src/Polyhedron.cc (1.75): In a comment correct an error: there
+	  was "systemo" instead of "system".
+
+2001-11-03 Saturday 10:40  Elisa Ricci
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.22),
+	  src/Polyhedron.cc (1.74), src/Polyhedron.defs.hh (1.63),
+	  tests/inters1.cc (1.7), tests/inters2.cc (1.9): The function
+	  Polyhedron::intersection_assign now is
+	  Polyhedron::intersection_assign_and_minimize.  Added a new
+	  function Polyhedron::intersection_assign that computes the
+	  intersection between x and y without minimizing the result.
+
+2001-11-02 Friday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.3): Use
+	  ppl_remove_higher_dimensions/2.
+
+2001-11-02 Friday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.21), ppl_sicstus.pl
+	  (1.12): Added ppl_remove_higher_dimensions/2.
+
+2001-11-02 Friday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.73), Polyhedron.defs.hh (1.62): New method
+	  drafted: void Polyhedron::remove_higher_dimensions(size_t
+	  new_dimension).
+
+2001-11-02 Friday 17:22  Elisa Ricci
+
+	* src/Polyhedron.cc (1.72), src/Polyhedron.defs.hh (1.61),
+	  tests/addconstraints1.cc (1.2), tests/append1.cc (1.5),
+	  tests/append2.cc (1.7), tests/error3.cc (1.8), tests/permute.cc
+	  (1.10): The Polyhedron::add_constraints now is
+	  Polyhedron::add_constraints_and_minimize, while
+	  Polyhedron::add_constraints_lazy now is only
+	  Polyhedron::add_constraints.	The Polyhedron::convex_hull_assign
+	  now is Polyhedron::convex_hull_assign_and_minimize, while
+	  Polyhedron::convex_hull_assign_lazy now is
+	  Polyhedron::convex_hull_assign.
+
+2001-11-02 Friday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.2): Some infrastructure
+	  added to simplify loading programs and trying them.
+
+2001-11-02 Friday 15:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.33), src/ConSys.defs.hh (1.25),
+	  src/Constraint.defs.hh (1.24), src/GenSys.defs.hh (1.34),
+	  src/Generator.defs.hh (1.27), src/LinExpression.defs.hh (1.20),
+	  src/Polyhedron.defs.hh (1.60): A further scan on almost all user
+	  documentation in order to better comment on space-dimensionality
+	  checks.
+
+2001-11-02 Friday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: clpq.pl (1.1), solve.pl (1.19):
+	  Renamed.
+
+2001-11-02 Friday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.9): Matrix::resize_no_copy() improved.  It now
+	  preserves the sortedness flag in the easy cases.
+
+2001-11-02 Friday 13:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.18): Comments added
+	  throughout.
+
+2001-11-02 Friday 09:01  Elisa Ricci
+
+	* src/Row.cc (1.10): In a comment of operator *(Row, Row) used
+	  "dimension-compatible", instead of "dimension-compatibility".
+
+2001-11-02 Friday 08:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.17): An improved version of
+	  the interpreter. This is a bit faster.
+
+2001-11-01 Thursday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.26): Link the GMP library after the PPL.
+
+2001-11-01 Thursday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.14): The --with-cc configure option has been
+	  fixed (it affected CXX instead of CC).
+
+2001-11-01 Thursday 18:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.16): Now only use the
+	  copied polyhedron when trying a clause.
+
+2001-11-01 Thursday 17:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.15): Bug is fixed and test
+	  added to check bug is dead.  Also, more care is taken to remove
+	  polyhedron that are no longer needed.
+
+2001-11-01 Thursday 15:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.14): Now, delete_polyhedron
+	  is used when the call to solve((A,B)...) fails as well as when it
+	  succeeds.
+
+2001-11-01 Thursday 15:36  Elisa Ricci
+
+	* src/: ConSys.cc (1.17), GenSys.cc (1.18), Row.cc (1.9),
+	  Row.defs.hh (1.9): Erased the function projected_scalar_prod(x,
+	  y) and used instead of it the operator * that it is changed to
+	  support also the case of x.size() < y.size (operator * so can be
+	  used in the case x.size <= y.size).  The functions
+	  GenSys::satisfy(Constraint) and
+	  ConSys::satisfies_all_constraints(Generator) are modified to use
+	  only the operator *.
+
+2001-11-01 Thursday 14:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.13): Names of terms made
+	  more descriptive.
+
+2001-11-01 Thursday 14:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.8), Matrix.inlines.hh (1.5),
+	  Polyhedron.inlines.hh (1.10), Row.cc (1.8), Row.defs.hh (1.8),
+	  SatMatrix.defs.hh (1.8), SatMatrix.inlines.hh (1.5),
+	  SatRow.defs.hh (1.8), SatRow.inlines.hh (1.5), Status.cc (1.8),
+	  Status.defs.hh (1.10), Status.inlines.hh (1.4),
+	  Variable.inlines.hh (1.4): Using the \related doxygen command
+	  everywhere appropriate (but not using it for specialization of
+	  std::swap functions).  All inline functions enclosed in namespace
+	  delimiters: removed redundant namespace qualifiers accordingly.
+
+2001-11-01 Thursday 13:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.12): Now temporary
+	  polyhedra are deleted when they are no longer needed.
+
+2001-11-01 Thursday 13:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.11): Old code for
+	  ppl_renew_polyhedron that does not use ppl_delete_polyhedron has
+	  been restored.
+
+2001-11-01 Thursday 11:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.10): Now all but the head
+	  variables are projected away.  Other general improvements and
+	  corrections done.
+
+2001-11-01 Thursday 10:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.7), Polyhedron.cc (1.71), Row.defs.hh
+	  (1.7), Row.inlines.hh (1.6): Using the \relates doxygen command
+	  for Row and Matrix.  Enclosing inline functions in the namespace
+	  delimiters.  Avoiding useless namespace qualifiers.
+
+2001-11-01 Thursday 07:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.3): Drafted.
+
+2001-10-31 Wednesday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.20): Removed
+	  false_constraint_term(): it is no longer needed.
+
+2001-10-31 Wednesday 22:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.19), ppl_sicstus.pl
+	  (1.11), solve.pl (1.9): ppl_copy_polyhedron/2 is now provided by
+	  the interface.
+
+2001-10-31 Wednesday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.18): In
+	  ppl_get_constraints/2, no longer treat empty polyhedra specially.
+	  get_generator() renamed generator_term().
+
+2001-10-31 Wednesday 21:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.17): In
+	  ppl_get_generators/2, no longer abort if the polyhedron is
+	  zero-dimensional.
+
+2001-10-31 Wednesday 21:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.23), Generator.defs.hh (1.26),
+	  Polyhedron.defs.hh (1.59), Variable.defs.hh (1.10): Exploiting
+	  the doxygen special command \relates to put the documentation of
+	  non-friend functions inside the documentation of the related
+	  class.
+
+2001-10-31 Wednesday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.16): All C++
+	  exceptions are now handled and translated into Prolog exceptions.
+
+2001-10-31 Wednesday 18:25  Elisa Ricci
+
+	* src/: Matrix.cc (1.7), Polyhedron.cc (1.70): Now, the function
+	  merge_row_assign resizes the second matrix if it is necessary: it
+	  means that in functions add_constraints_lazy and
+	  limited_widening_assign we do not resize the matrix cs.  In
+	  Polyhedron::OK the check of the number of columns is not
+	  necessary.
+
+2001-10-31 Wednesday 15:37  Elisa Ricci
+
+	* src/Polyhedron.cc (1.69): In function Polyhedron::OK() the case
+	  of is_empty == true is considered.
+
+2001-10-31 Wednesday 14:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.8): Now, backtracking works
+	  for some queries including fibonacci.  Also it works with a test
+	  that checks deeper backtracking.
+
+2001-10-31 Wednesday 14:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.68): In the checking function OK, we were
+	  forgetting return or jump to the appropriate code after having
+	  checked the correctness of a 0-space dim polyhedron.
+
+2001-10-31 Wednesday 12:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.67): A missing "return" added inside
+	  "add_dimensions_and_constraints".
+
+2001-10-31 Wednesday 12:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.58): Added specification for
+	  add_dimensions_and_constraints(ConSys& cs).
+
+2001-10-31 Wednesday 11:52  Elisa Ricci
+
+	* src/Polyhedron.cc (1.66): In functions
+	  Polyhedron::widening_assign and
+	  Polyhedron::limited_widening_assign considered the case of the
+	  polyhedra in a zero-dimensional space.  In function
+	  Polyhedron::limited_widening_assign considered the case of
+	  cs.space_dimension() < space_dimension().
+
+2001-10-31 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GenSys.defs.hh (1.33): Added an example where a system of
+	  generators is printed by using more features of the STL.
+
+2001-10-31 Wednesday 11:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.65): When the user invokes
+	  Polyhedron::constraints() on an empty polyhedron, we now return
+	  the inconsistent constraint of the right dimension.  This also
+	  implies that a polyhedron with the EMPTY flag set can still have
+	  a non-empty con_sys; therefore, we clear the con_sys whenever we
+	  change the dimension of an empty polyhedron.
+
+2001-10-31 Wednesday 10:28  Elisa Ricci
+
+	* src/: ConSys.cc (1.16), Polyhedron.cc (1.64): In functions
+	  Polyhedron::includes and ConSys::satisfies_all_constraints the
+	  cases of a polyhedron in a zero-dimensional space and of
+	  g.space_dimension < space_dimension are considered.
+
+2001-10-31 Wednesday 09:56  Elisa Ricci
+
+	* src/: GenSys.cc (1.17), Polyhedron.cc (1.63), Row.cc (1.7),
+	  Row.defs.hh (1.6): The function projected_scalar_prod() moved in
+	  `namespace Parma_Polyhedra_Library'.	The case of
+	  c.space_dimension < polyhedron.space_dimension is considered in
+	  functions Polyhedron::satisfies and GenSys::satisy.  In function
+	  Polyhedron::satisfies the cases of empty polyhedron and of the
+	  polyhedron is a zero-dimensional space are considered.
+
+2001-10-31 Wednesday 08:47  Elisa Ricci
+
+	* src/LinExpression.defs.hh (1.19): The copy-constructor of a
+	  linear expression with a specified dimension is PPL_INTERNAL and
+	  not public.
+
+2001-10-30 Tuesday 22:01  Elisa Ricci
+
+	* tests/affinetrans.cc (1.4): We can use the linear expression `x +
+	  4' instead of `x + 0*y + 4'.
+
+2001-10-30 Tuesday 21:57  Elisa Ricci
+
+	* src/: LinExpression.defs.hh (1.18), Polyhedron.cc (1.62): In
+	  functions Polyhedron::assign_variable and
+	  Polyhedron::substitutte_variable considered the cases of an empty
+	  polyhedron and of space_dimension of linear expression <
+	  space_dimension of polyhedron.  In LinExpression the
+	  copy-constructor with the size of the new linear expression is
+	  now public.
+
+2001-10-30 Tuesday 18:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.8), Constraint.defs.hh (1.22): Added
+	  PPL_INTERNAL method Constraint::is_unsatisfiable().
+
+2001-10-30 Tuesday 18:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.7): Now it allows for
+	  constants in the head.
+
+2001-10-30 Tuesday 17:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.6): The interpreter now
+	  accepts repeated variables in the head.
+
+2001-10-30 Tuesday 17:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.61), src/Polyhedron.defs.hh (1.57),
+	  tests/addconstraints2.cc (1.3): Method
+	  add_dimensions_and_constraints_lazy renamed as
+	  add_dimensions_and_constraints; signature changed (the argument
+	  is no longer const); in the implementation, we swap coefficients
+	  instead of copying them.
+
+2001-10-30 Tuesday 15:54  Elisa Ricci
+
+	* src/: Row.cc (1.6), Row.defs.hh (1.5): Added the function Integer
+	  projected_scalar_prod(const Row&, const Row&).
+
+2001-10-30 Tuesday 15:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.56): Spelling of "poject" to "project"
+	  changed.
+
+2001-10-30 Tuesday 15:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.60): Spelling error corrected in an output
+	  message; for consistency, try always to use the
+	  dimension-compatibility concept in error messages.
+
+2001-10-30 Tuesday 15:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.5): Adjusted to allow for =
+	  instead of == for equality.
+
+2001-10-30 Tuesday 14:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.17), LinExpression.inlines.hh
+	  (1.6): Added method space_dimension.
+
+2001-10-30 Tuesday 14:54  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.55): We do not have any exception if we
+	  use the function Polyhedron::constraints() with an empty
+	  polyhedron of the function Polyhedron::generators() with a
+	  zero-dimensional polyhedron.
+
+2001-10-30 Tuesday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.15): Use '='/2
+	  instead of '=='/2 to denote equality.  Fixed a bug whereby the
+	  sign of the inhomogeneous term of constraints was inverted.
+
+2001-10-30 Tuesday 14:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.59): Started using the methods
+	  space_dimension() of classes Constraint, Generator, ConSys and
+	  GenSys.
+
+2001-10-30 Tuesday 14:30  Elisa Ricci
+
+	* src/Polyhedron.cc (1.58): In functions Polyhedron::insert used
+	  the function space_dimension() (of a constraint or of a
+	  generator) instead of size() - 1.
+
+2001-10-30 Tuesday 13:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.4): More improvements.
+
+2001-10-30 Tuesday 12:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.24), ConSys.inlines.hh (1.8),
+	  GenSys.defs.hh (1.32), GenSys.inlines.hh (1.8): Added method
+	  space_dimension() to both ConSys and GenSys.
+
+2001-10-30 Tuesday 12:25  Elisa Ricci
+
+	* src/Polyhedron.cc (1.57): In function
+	  add_dimensions_and_constraints_lazy, if we are lazy we only say
+	  that the system of constraints is not sorted, otherwise we sort
+	  the system of constraints.
+
+2001-10-30 Tuesday 12:17  Elisa Ricci
+
+	* tests/addconstraints2.cc (1.2): Changed the second system of
+	  constraints (ConSys c2) to have a non-empty polyhedron.
+
+2001-10-30 Tuesday 12:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.56): insert(const Generator&) improved.
+
+2001-10-30 Tuesday 11:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.3): Now upgraded to accept
+	  user predicates as well as constraints.
+
+2001-10-30 Tuesday 11:47  Elisa Ricci
+
+	* tests/: Makefile.am (1.25), addconstraints2.cc (1.1): Added the
+	  test for the function add_dimensions_and_constraints_lazy.
+
+2001-10-30 Tuesday 11:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.55): In add_constraints, after adding NO
+	  constraints at all we still need to check for the emptyness of
+	  the polyhedron.  In insert(const Constraint&), adjusted
+	  assertions and added triviality check when inserting into a
+	  zero-dim space polyhedron.
+
+2001-10-30 Tuesday 11:29  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.54), Polyhedron.defs.hh (1.54): Added the
+	  function add_dimensions_and_constraints_lazy(const ConSys& cs).
+
+2001-10-30 Tuesday 11:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.53): In add_constraints(_lazy), if a
+	  zero-dim space polyhedron is considered, using ConSys iterators
+	  to see if an inconsistent polyhedron is created.
+
+2001-10-30 Tuesday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.24), addconstraints1.cc (1.1): Added test
+	  for the addition of consistent and inconsistent zero-dim
+	  constraints to a zero-dim space polyhedron.  Tests re-ordered
+	  alphabetically.
+
+2001-10-30 Tuesday 10:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.2): Some small bugs fixed.
+
+2001-10-30 Tuesday 10:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.23), removedim3.cc (1.1): Added simple
+	  test on the removal of dimensions from an empty polyhedron.
+
+2001-10-30 Tuesday 09:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.52), Polyhedron.defs.hh (1.53): BE_LAZY
+	  used also in Polyhedron::add_dimensions_and_project.	A couple of
+	  assertions added and old code (already commented out) removed.
+
+2001-10-30 Tuesday 09:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.1): A first start/attempt
+	  at a simple meta-interpreter for CLP(Q).  There is a bug to be
+	  fixed.
+
+2001-10-29 Monday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.51): Be lazy.
+
+2001-10-29 Monday 21:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: conversion.cc (1.8), minimize.cc (1.5), simplify.cc (1.6):
+	  Comments fixed: the class is called Polyhedron, not Poly.
+
+2001-10-29 Monday 18:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.14): Use
+	  Constraint/Generator::space_dimension() instead of the no longer
+	  existing last_variable().
+
+2001-10-29 Monday 16:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.21), Constraint.inlines.hh (1.9),
+	  Generator.defs.hh (1.25), Generator.inlines.hh (1.14): Removed
+	  methods last_variable() and added method space_dimension() to
+	  Constraint and Generator.
+
+2001-10-29 Monday 16:46  Elisa Ricci
+
+	* src/Polyhedron.cc (1.50): In Polyhedron(size_t num_dimensions,
+	  Degenerate_Kind kind) if we build an universe polyhedron the
+	  system of constraints is in the minimal form.  In the function
+	  insert(Constraint) added the comment that specify why when we
+	  insert the constraint the polyhedron is non-empty.
+
+2001-10-29 Monday 16:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.15), Constraint.cc (1.7), Constraint.defs.hh
+	  (1.20): Constraint::is_non_trivial() transformed into
+	  Constraint::is_trivial().  Btw, the old evrsion was still wrong.
+
+2001-10-29 Monday 16:26  Elisa Ricci
+
+	* src/Polyhedron.cc (1.49): In function add_constraints,
+	  add_constraints_lazy and add_generators the case of
+	  cs(gs)_num_columns == 1 && space_dimension() == 0 is considered.
+
+2001-10-29 Monday 16:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* missing (1.3): Updated.
+
+2001-10-29 Monday 14:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.cc (1.6): Constraint::is_nontrivial() fixed.
+
+2001-10-29 Monday 14:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.48): In add_dimensions_and_embed, when
+	  embedding a zero-dim universe polyhedron the creation of the
+	  system of generators is now guarded by pre-proc flag BE_LAZY.
+
+2001-10-29 Monday 13:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.16), GenSys.defs.hh (1.31), GenSys.inlines.hh
+	  (1.7), Polyhedron.cc (1.47): Added static member function
+	  GenSys::zero_dim_univ() to replace static member
+	  GenSys::zero_dim_univ. All inline functions enclosed in the
+	  namespace.
+
+2001-10-29 Monday 13:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc (1.8), Generator.defs.hh (1.24),
+	  Generator.inlines.hh (1.13): Added static member function
+	  Generator::zero_dim_vertex().  Functions vertex, ray and line are
+	  no longer inlined; for ray and line we now check that the
+	  argument does not represent the origin of the space.
+
+2001-10-29 Monday 13:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ConSys.defs.hh (1.23): Must include <iterator>.
+
+2001-10-29 Monday 12:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.14), ConSys.defs.hh (1.22), ConSys.inlines.hh
+	  (1.7), Polyhedron.cc (1.46): Added static member function
+	  ConSys::zero_dim_empty().
+
+2001-10-29 Monday 12:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.5), Constraint.defs.hh (1.19),
+	  Constraint.inlines.hh (1.8): Added static memebr function
+	  Constraint::zero_dim_false().  All inline functions enclosed in
+	  the namespace.
+
+2001-10-29 Monday 12:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.cc (1.5), LinExpression.defs.hh (1.16),
+	  LinExpression.inlines.hh (1.5): Added static member function
+	  LinExpression::zero() in place of static member LinExpression
+	  zero.  All inline functions enclosed in the scope of namespace.
+
+2001-10-29 Monday 11:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.45): Polyhedron::Polyhedron(GenSys& gs)
+	  improved.
+
+2001-10-29 Monday 10:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.13): Require autoconf 2.52e.
+
+2001-10-29 Monday 10:18  Elisa Ricci
+
+	* tests/: affinetrans.cc (1.3), append2.cc (1.6), empty1.cc (1.5),
+	  error1.cc (1.6), error2.cc (1.7), error3.cc (1.7), error4.cc
+	  (1.3), error5.cc (1.4), inters1.cc (1.6), inters2.cc (1.8),
+	  permute.cc (1.9), randchull1.cc (1.8), removedim1.cc (1.2),
+	  removedim2.cc (1.5): Added the comment to the tests, the
+	  inclusion of the file "ehandlers.hh", use the function
+	  set_handlers() and added some NOISY-print of the polyhedra (where
+	  they are necessary).
+
+2001-10-29 Monday 09:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Makefile.am (1.22): Committing Makefile.am was unwanted
+	  (error6 is a non-meaningful dummy test).
+
+2001-10-29 Monday 06:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.cc (1.7), Polyhedron.defs.hh (1.52),
+	  conversion.cc (1.7): The Integer constants 0 and 1 are now
+	  provided by the static methods Integer::zero() and
+	  Integer::one().
+
+2001-10-28 Sunday 21:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (1.13), src/ConSys.defs.hh (1.21),
+	  src/ConSys.inlines.hh (1.6), src/GenSys.cc (1.15),
+	  src/GenSys.defs.hh (1.30), src/GenSys.inlines.hh (1.6),
+	  src/Generator.defs.hh (1.23), src/Polyhedron.cc (1.44),
+	  tests/Makefile.am (1.21): Added static members denoting the
+	  zero-dim usatisfiable constraint, teh corresponding constraint
+	  system and the system of generators corresponding to the zero-dim
+	  universe.
+
+2001-10-28 Sunday 20:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.4), Constraint.defs.hh (1.18):
+	  is_non_trivial() now correctly handles inconsistent constraints,
+	  which should NOT be considered trivial.  Output operator now
+	  correctly prints inconsistent constraints.
+
+2001-10-28 Sunday 18:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.4),
+	  SICStus/ppl_sicstus.pl (1.10): Added ppl_insert_constraints/2 and
+	  ppl_insert_generators/2.
+
+2001-10-28 Sunday 18:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.3),
+	  SICStus/ppl_sicstus.cc (1.13), SICStus/ppl_sicstus.pl (1.9):
+	  Added ppl_add_dimensions_and_embed/2 and
+	  ppl_add_dimensions_and_project/2.
+
+2001-10-28 Sunday 18:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.2),
+	  SICStus/ppl_check.pl (1.6), SICStus/ppl_sicstus.cc (1.12),
+	  SICStus/ppl_sicstus.pl (1.8): ppl_remove_dimensions/2 added.
+
+2001-10-28 Sunday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.11), configure.ac (1.12),
+	  interfaces/Prolog/Makefile.am (1.2): Try not to bother people
+	  without the SICStus include file.
+
+2001-10-28 Sunday 14:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc (1.6), Generator.defs.hh (1.22),
+	  Generator.inlines.hh (1.12), LinExpression.cc (1.4),
+	  LinExpression.defs.hh (1.15): Now the friend function vertex(e,
+	  d) has also its first argument optional; calling vertex() creates
+	  the origin of the zero-dim vector space.  Added zero-dim checks
+	  to ray(e) and line(e).
+
+2001-10-28 Sunday 13:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.13), doc/devref-browse.doxyconf-latex.in
+	  (1.7), doc/devref-print.doxyconf-latex.in (1.7),
+	  doc/devref.doxyconf-html.in (1.8),
+	  doc/user-browse.doxyconf-latex.in (1.8),
+	  doc/user-print.doxyconf-latex.in (1.8), doc/user.doxyconf-html.in
+	  (1.10), interfaces/Prolog/Prolog_interface.dox (1.1): Provide a
+	  framework for the Prolog interface documentation.
+
+2001-10-28 Sunday 11:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/removedim2.cc (1.4): Moved creation of lin-expr
+	  infrastructure outside the loop.
+
+2001-10-28 Sunday 10:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_check.pl (1.5), ppl_sicstus.cc
+	  (1.11), ppl_sicstus.pl (1.7): Added ppl_get_constraints/2 and
+	  ppl_get_generators/2.
+
+2001-10-28 Sunday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.51): Do not create yet another Integer
+	  set to one to use as default parameter: use Integer::one instead.
+
+2001-10-28 Sunday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.17), Generator.defs.hh (1.21),
+	  Generator.inlines.hh (1.11): New methods of Generator:
+	  last_variable(), coefficient(), and divisor().  Harmonized with
+	  the ones of Constraint.  Do not create yet another Integer set to
+	  one to use as default parameter: use Integer::one instead.
+
+2001-10-28 Sunday 08:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.43): Corrected the error making test
+	  `randchull1' fail (I was forgetting to clear flags after
+	  insertion of the generator).
+
+2001-10-27 Saturday 22:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/onepoint.cc (1.1): New test on the creation of a one-point
+	  polyhedron.
+
+2001-10-27 Saturday 22:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.20), error1.cc (1.5), error2.cc (1.6),
+	  error3.cc (1.6), error4.cc (1.2), error5.cc (1.3), removedim.cc
+	  (1.3), removedim1.cc (1.1), removedim2.cc (1.3): Try to be
+	  consistent.
+
+2001-10-27 Saturday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.16), Constraint.inlines.hh (1.7): New
+	  Constraint methods: last_variable(), coefficient(Variable v) and
+	  coefficient() to return the last variable, the homogeneous and
+	  inhomogeneous coefficients.
+
+2001-10-27 Saturday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_check.pl (1.4), ppl_sicstus.cc
+	  (1.10), ppl_sicstus.pl (1.6): ppl_new_polyhedron/1 replaced with
+	  ppl_new_polyhedron/2 and ppl_new_empty_polyhedron/2.
+
+2001-10-27 Saturday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.32), src/Constraint.defs.hh (1.15),
+	  src/Constraint.inlines.hh (1.6), src/Generator.cc (1.5),
+	  src/Generator.defs.hh (1.20), src/Generator.inlines.hh (1.10),
+	  src/Polyhedron.cc (1.42), src/Polyhedron.defs.hh (1.50),
+	  src/Polyhedron.inlines.hh (1.9), src/Status.cc (1.7),
+	  src/Status.defs.hh (1.9), src/Status.inlines.hh (1.3),
+	  tests/Makefile.am (1.19), tests/affinetrans.cc (1.2),
+	  tests/append1.cc (1.4), tests/append2.cc (1.5), tests/empty1.cc
+	  (1.4), tests/error3.cc (1.5), tests/error5.cc (1.2),
+	  tests/inters2.cc (1.7), tests/permute.cc (1.8), tests/print.hh
+	  (1.3), tests/randchull1.cc (1.7), tests/removedim.cc (1.2),
+	  tests/removedim2.cc (1.2): All changes on the `space_dim' branch
+	  have been merged to the main trunk.
+
+2001-10-27 Saturday 15:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (space_dim.12): In Polyhedron::insert(const
+	  Generator&) added generator type check.
+
+2001-10-27 Saturday 15:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh, Constraint.inlines.hh, Polyhedron.cc,
+	  Polyhedron.defs.hh (space_dim.[1,1,11,6]): Default constructor
+	  for Constraint is now private and not implemented.  In
+	  Polyhedron::insert(const Generator&) we should check that the
+	  generator is a vertex if the polyhedron is empty (we cannot add
+	  just a ray or a line).
+
+2001-10-27 Saturday 15:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.9), ppl_sicstus.pl
+	  (1.5): ppl_widening_assign/2 added.
+
+2001-10-27 Saturday 15:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.8), ppl_sicstus.pl
+	  (1.4): ppl_intersection_assign/2 and ppl_convex_hull_assign/2
+	  added.  Try to be as const-correct as possible.
+
+2001-10-27 Saturday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_check.pl (1.3), ppl_sicstus.cc
+	  (1.7), ppl_sicstus.pl (1.3): ppl_check_empty/1 added.
+
+2001-10-27 Saturday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.6):
+	  SP_register_atom() and SP_unregister_atom() can fail.
+
+2001-10-27 Saturday 14:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_check.pl (1.2), ppl_sicstus.cc
+	  (1.5), ppl_sicstus.pl (1.2): ppl_insert_generator/2 added.
+
+2001-10-27 Saturday 12:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Status.cc, src/Status.defs.hh,
+	  src/Status.inlines.hh, tests/empty1.cc, tests/inters2.cc,
+	  tests/print.hh, tests/randchull1.cc
+	  (space_dim.[10,5,2,1,1,1,1,1,1,1]): The zero_dim flag (and
+	  methods) in Status changed into more meaningful "zero_dim_univ".
+	  A lot of small changes to have a consistent dimension-checking.
+	  Now there is one "default" constructor for Polyhedron having two
+	  optional arguments: the space dimension (default 0) and the
+	  degenerate kind (default UNIVERSE).  Tests adapted to use the new
+	  constructor and to avoid using the removed
+	  Polyhedron::is_zero_dim().
+
+2001-10-27 Saturday 12:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.31): Proposition after Minkowsky's theorem
+	  corrected (we can CHOOSE extreme rays so that they have rational
+	  coefficients).
+
+2001-10-27 Saturday 11:54  Elisa Ricci
+
+	* tests/: affinetrans.cc, error3.cc (space_dim.[2,2]): To build the
+	  polyhedron that we want using the system of generators, we must
+	  create the system of generators and then use Polyhedron ph(gs).
+	  (If we use Polyhedron ph(num_dim), we have the universe
+	  polyhedron and then when we add the generators we do not have our
+	  polyhedron but the universe one).
+
+2001-10-27 Saturday 11:49  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (space_dim.4): Added an example for the
+	  function remove_dimensions (the example 8).  In the examples when
+	  we build a polyhedron we must specify the dimension of the space
+	  if then we use the function Polyhedron::insert(Constraint).  We
+	  can not do the same thing if then we want to use the function
+	  Polyhedron::insert(Generator) In fact, in this case we build the
+	  universe polyhedron and then we add the generators. To build a
+	  polyhedron starting from the system of generators we must create
+	  the system of generators and then use Polyhedron ph(gs).
+
+2001-10-27 Saturday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.11): Version number bumped so as to avoid
+	  confusion: 0.2-pre1.
+
+2001-10-27 Saturday 10:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.10), interfaces/Prolog/SICStus/Makefile.am (1.2),
+	  interfaces/Prolog/SICStus/ppl_check.pl (1.1),
+	  interfaces/Prolog/SICStus/ppl_sicstus.cc (1.4),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.1): Check to see
+	  whether `sicstus' is installed: if it is, tests can be performed.
+	  Some progress in the interface itself.
+
+2001-10-27 Saturday 10:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.41): ConSys and GenSys do not yet provide a
+	  `bool empty() const' method.
+
+2001-10-27 Saturday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.15): Distribute ppl_header.middle.
+
+2001-10-26 Friday 21:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.3): Exception
+	  handling improved.
+
+2001-10-26 Friday 19:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc, tests/Makefile.am, tests/removedim2.cc
+	  (space_dim.[9,4,1]): Polyhedron::remove_dimensions(...) rewritten
+	  from scratch.  Added a new test to check its correctness.
+
+2001-10-26 Friday 18:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.2): Can now insert
+	  constraints into a polyhedron.
+
+2001-10-26 Friday 16:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am, ppl_header.middle (space_dim.[1,1]): Get
+	  around a bug in GCC versions prior to 3 whereby the <cassert>
+	  header is wrongly guarded against multiple inclusion.
+
+2001-10-26 Friday 16:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.12), config.h.in (1.10), configure.ac (1.9),
+	  interfaces/.cvsignore (1.1), interfaces/Makefile.am (1.1),
+	  interfaces/Prolog/.cvsignore (1.1), interfaces/Prolog/Makefile.am
+	  (1.1), interfaces/Prolog/SICStus/.cvsignore (1.1),
+	  interfaces/Prolog/SICStus/Makefile.am (1.1),
+	  interfaces/Prolog/SICStus/ppl_sicstus.cc (1.1): Start working on
+	  the Prolog interfaces.
+
+2001-10-26 Friday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.14): ppl_install.hh depends also on
+	  ppl_header.middle.
+
+2001-10-26 Friday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.13), ppl_header.middle (1.1): Get around a
+	  bug in GCC versions prior to 3 whereby the <cassert> header is
+	  wrongly guarded against multiple inclusion.
+
+2001-10-26 Friday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.40), Variable.defs.hh (1.9): Just
+	  formatting.
+
+2001-10-26 Friday 13:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (space_dim.8): A few trivial errors inside
+	  assertions fixed.
+
+2001-10-26 Friday 12:29  Elisa Ricci
+
+	* src/Polyhedron.cc (space_dim.7): In function add_generators we
+	  resize the matrix gs that we want to add if space_dimension() >
+	  num_columns() - 1.
+
+2001-10-26 Friday 12:14  Elisa Ricci
+
+	* src/Polyhedron.cc (space_dim.6): Added the dimension-consistency
+	  check in the function add_constraints_lazy and add_generators.
+	  In functions add_constraints and add_generators we use
+	  if(check_empty()) instead of	minimize() if(is_empty()) In
+	  functions add_constraints and add_constraints_lazy we resize the
+	  matrix of constraints that we add if	num_columns - 1 <
+	  space_dimension().
+
+2001-10-26 Friday 12:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.defs.hh, Generator.inlines.hh (space_dim.[1,1]):
+	  The default constructor for Generator is now private and
+	  unimplemented.
+
+2001-10-26 Friday 11:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am, error5.cc, removedim.cc (space_dim.[3,1,2]):
+	  New test for dimension-compatibility in
+	  Polyhedron::remove_dimensions.  The test still fails because
+	  objects of set<Variable> do not provide ordered access to their
+	  elements (yet).
+
+2001-10-26 Friday 10:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am, removedim.cc, remuvedim.cc
+	  (space_dim.[2,1,2]): Test file "remuvedim.cc" renamed.
+
+2001-10-26 Friday 10:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (space_dim.5): Using begin() instead of max()
+	  to select the highest dimension variable from a set of variables.
+
+2001-10-26 Friday 10:34  Elisa Ricci
+
+	* tests/: Makefile.am, remuvedim.cc (space_dim.[1,1]): Added a test
+	  for the function remuve_dimensions(...).
+
+2001-10-26 Friday 10:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (space_dim.4): Some comments improved. Added
+	  dimension-compatibility checks to
+	  Polyhedron::remove_dimensions(...).
+
+2001-10-25 Thursday 23:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc, tests/affinetrans.cc, tests/append1.cc,
+	  tests/append2.cc, tests/error3.cc, tests/permute.cc
+	  (space_dim.[3,1,1,1,1,2]): Going on ading the right
+	  dimension-compatibility checks.  Now the tests are all passed
+	  (some of them changed to declare polyhedra dimensions in the
+	  constructors, other changed by calling operator
+	  add_dimensions_and_embed).
+
+2001-10-25 Thursday 20:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.cc (space_dim.1): Strange code indentation fixed.
+
+2001-10-25 Thursday 20:36  Elisa Ricci
+
+	* src/Polyhedron.cc (space_dim.2): In operator <=(x,y) we only need
+	  the generators of x and the constraints of y.  In functions
+	  intersection_assign and convex_hull, we did two checks of the
+	  dimension of the space (one with space_dimension() and the other
+	  with num_columns()).	In functions add_dimensions_and_embed and
+	  add_dimensions_and_project we have both the system of constraints
+	  and the system of generators minimized when we add some
+	  dimensions to a polyhedron in a 0-dimensional space.
+
+2001-10-25 Thursday 16:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, tests/permute.cc
+	  (space_dim.[1,3,1,1]): Added private member
+	  Polyhedron::space_dim, which stores the number of dimensions of
+	  the enclosing space.	Public member Polyhedron::num_dimensions()
+	  renamed into Polyhedron::space_dimension() and now reads the
+	  member space_dim.  Started modifying methods of the class
+	  Polyhedron so that they consistently use space_dimension() and
+	  space_dim.  Started guarding methods by suitable
+	  dimension-compatibility checks.
+
+2001-10-25 Thursday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (space_dim.2): All comparison operators on
+	  Polyhedron throw an exception when the two polyhedra are
+	  dimension-incompatible.
+
+2001-10-25 Thursday 11:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox, src/Polyhedron.defs.hh (space_dim.[1,1]):
+	  Added an informal specification for dimension-compatibility.	The
+	  specification of Polyhedron::insert now says that an exception is
+	  thrown if the argument is dimension-incompatible with the
+	  polyhedron.
+
+2001-10-24 Wednesday 20:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.defs.hh (1.19), Polyhedron.cc (1.39),
+	  Polyhedron.defs.hh (1.49): Exceptions are thrown when polyhedra
+	  are dimension-incompatible.
+
+2001-10-24 Wednesday 20:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.30): Better explained the difference
+	  between the dimension of the polyhedron and the dimension of the
+	  enclosing space.  The terminology "dimension-consistent" added.
+	  Pointed out what seems to be a problem with empty polyhedrons
+	  (what is the dimensions of their enclosing space?)
+
+2001-10-24 Wednesday 14:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.29): A full scan on the user-manual
+	  portion of the introduction.	In particular: - added a
+	  proposition after Minkowsky's theorem for rational polyhedra; -
+	  preferring the use of \lambda wrt \mu for scalars; - yet another
+	  variation on the definition of extreme rays; - "non-negative"
+	  combinations are now "positive" combinations; - better explaining
+	  the border-line cases of the generators representation.
+
+2001-10-24 Wednesday 10:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.28): Doxygen does not accept "\f(" [and
+	  neither the potentially correct "\f\("] as a way to enter LaTeX
+	  mathematical environment.  Indexes of vectors goes from 0 to the
+	  dim-1.
+
+2001-10-23 Tuesday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.7): Ready for distribution.
+
+2001-10-23 Tuesday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.11): Distribute also the BUGS file.
+
+2001-10-23 Tuesday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.12): Produce and make available HTML
+	  documentation to be used off-line.
+
+2001-10-23 Tuesday 19:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS (1.1), NEWS (1.2), TODO (1.2): Initial versions of these
+	  files.
+
+2001-10-23 Tuesday 19:23  Elisa Ricci
+
+	* tests/: Makefile.am (1.18), affinetrans.cc (1.1): Added a test
+	  for the functions assign_variable and substitute_variable.
+
+2001-10-23 Tuesday 19:21  Elisa Ricci
+
+	* src/Polyhedron.cc (1.38): In function assign_variable and
+	  substitute_variable we must have size_t num_columns =
+	  x.num_dimensions() + 1 instead of size_t num_columns =
+	  x.con_sys(gen_sys).num_columns() because at this point we do not
+	  know which system we have.
+
+2001-10-23 Tuesday 18:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.27): A small improvement on the
+	  explanation of the representation by generators.
+
+2001-10-23 Tuesday 18:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.37), Polyhedron.defs.hh (1.48):
+	  Polyhedron::constraints() no longer throws an exception when
+	  *this is a zero-dimensional polyhedron (now it returns the empty
+	  system of constraints).  Polyhedron::generators() no longer
+	  throws an exception when *this is an empty polyhedron (now it
+	  returns the empty system of generators).
+
+2001-10-23 Tuesday 18:12  Elisa Ricci
+
+	* src/minimize.cc (1.4): We see the definitions in the Introduction
+	  and not in the file definition.dox.
+
+2001-10-23 Tuesday 18:09  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.47): Typo fixed.
+
+2001-10-23 Tuesday 18:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.17), error4.cc (1.1): Added a test on the
+	  exception thrown when building a polyhedron by using a non-empty
+	  system of generators with no vertices.
+
+2001-10-23 Tuesday 17:57  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.46): Added the explanation of why a
+	  parameter of a function is non-constant.
+
+2001-10-23 Tuesday 17:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.36): Exception messages now use the
+	  "function: message" convention.  The comment in
+	  PPL::Polyhedron::Polyhedron(GenSys& gs) related to the existence
+	  of a vertex improved.
+
+2001-10-23 Tuesday 17:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.26): In the proposition after the
+	  definition of rays, we need to consider a non-empty polyhedron
+	  and a non-zero vector \vect{r}.  It is NOT true that extreme rays
+	  define _all_ the directions in which an arbitrary polyhedron is
+	  infinite.  Definition of line simplified. A typo fixed in
+	  definition of Minkowsky's sum.
+
+2001-10-23 Tuesday 16:50  Elisa Ricci
+
+	* src/Polyhedron.cc (1.35): In function
+	  Polyhedron::insert(Constraint), if we add a constraint to an
+	  empty polyhedron it remains empty.
+
+2001-10-23 Tuesday 16:35  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.34), Polyhedron.defs.hh (1.45): When a
+	  polyhedron is built starting from a system of generators, this
+	  must have at least a vertex; otherwise an exception is thrown.
+
+2001-10-23 Tuesday 16:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.cc (1.4), Generator.inlines.hh (1.9),
+	  Polyhedron.cc (1.33), Polyhedron.inlines.hh (1.8): Inlining is no
+	  longer requested for functions that may throw.
+
+2001-10-23 Tuesday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.9), configure.ac (1.8), src/Makefile.am (1.12),
+	  src/Row.defs.hh (1.4), src/ppl_header.bottom (1.3),
+	  src/ppl_header.top (1.2): Better configuration and macro
+	  handling.
+
+2001-10-23 Tuesday 14:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.32): DLEVEL noise removed.
+
+2001-10-23 Tuesday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.8), configure.ac (1.7), src/ConSys.cc (1.12),
+	  src/ConSys.defs.hh (1.20), src/ConSys.inlines.hh (1.5),
+	  src/Constraint.cc (1.3), src/Constraint.defs.hh (1.14),
+	  src/Constraint.inlines.hh (1.5), src/GenSys.cc (1.14),
+	  src/GenSys.defs.hh (1.29), src/GenSys.inlines.hh (1.5),
+	  src/Generator.cc (1.3), src/Generator.defs.hh (1.18),
+	  src/Generator.inlines.hh (1.8), src/LinExpression.cc (1.3),
+	  src/LinExpression.defs.hh (1.14), src/LinExpression.inlines.hh
+	  (1.4), src/Makefile.am (1.11), src/Matrix.cc (1.6),
+	  src/Matrix.defs.hh (1.6), src/Matrix.inlines.hh (1.4),
+	  src/Polyhedron.cc (1.31), src/Polyhedron.defs.hh (1.44),
+	  src/Polyhedron.inlines.hh (1.7), src/Row.cc (1.5),
+	  src/Row.defs.hh (1.3), src/Row.inlines.hh (1.5), src/SatMatrix.cc
+	  (1.6), src/SatMatrix.defs.hh (1.7), src/SatMatrix.inlines.hh
+	  (1.4), src/SatRow.cc (1.4), src/SatRow.defs.hh (1.7),
+	  src/SatRow.inlines.hh (1.4), src/Status.cc (1.6),
+	  src/Status.defs.hh (1.8), src/Status.inlines.hh (1.2),
+	  src/Variable.cc (1.3), src/Variable.defs.hh (1.8),
+	  src/Variable.inlines.hh (1.3), src/ppl_header.bottom (1.2): The
+	  INLINE/OUTLINE mechanism has gone: it caused too many problems.
+
+2001-10-23 Tuesday 14:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.defs.hh (1.28), GenSys.inlines.hh (1.4): Inserting a
+	  generator in a GenSys automatically adjust the dimensions.
+	  Specialization of std:swap for GenSys's added.
+
+2001-10-23 Tuesday 14:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.19), ConSys.inlines.hh (1.4): Better
+	  documented the fact that, when inserting constraints in a ConSys,
+	  dimensions are automatically adjusted.  Added the specialization
+	  of function std:swap for ConSys's.
+
+2001-10-23 Tuesday 13:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox (1.25), ppl.sty (1.5): Changes to allow for
+	  a decomposition when there are no vertices.
+
+2001-10-23 Tuesday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.43): Brackets closing a namespace
+	  should be marked as in
+
+	  namespace Parma_Polyhedra_Library {	...  } // namespace
+	  Parma_Polyhedra_Library
+
+2001-10-23 Tuesday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatMatrix.inlines.hh (1.3): Must include <cassert>.
+
+2001-10-23 Tuesday 11:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/maxmin.hh (1.2): Put everything in our namespace.
+
+2001-10-23 Tuesday 10:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.24): Changes to user introduction to
+	  clarify why a polyhedron represented by a system of generators
+	  needs a vertex.  On-going improvements to the developer's guide
+	  including the removal of some repeated definitions.  Minor bugs
+	  fixed.
+
+2001-10-23 Tuesday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.16): INCLUDES now includes @extra_includes at .
+
+2001-10-23 Tuesday 09:53  Elisa Ricci
+
+	* src/: ConSys.cc (1.11), GenSys.cc (1.13), simplify.cc (1.5): For
+	  the definitions and the rules, we must see the Introduction
+	  instead of the file definitions.dox.	In the functions
+	  assign_variable and substitute_variable, the parameter "expr" is
+	  the "numerator" of affine expression.
+
+2001-10-23 Tuesday 09:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.10), Constraint.cc (1.2),
+	  Constraint.inlines.hh (1.4), GenSys.cc (1.12), LinExpression.cc
+	  (1.2), Matrix.cc (1.5), Matrix.inlines.hh (1.3), Row.cc (1.4),
+	  Row.inlines.hh (1.4), SatMatrix.cc (1.5): Do not request the
+	  inlining of functions containing loops.  Be consistent in the use
+	  of namespace names and aliases.
+
+2001-10-23 Tuesday 08:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.7), configure.ac (1.6),
+	  doc/user-browse.doxyconf-latex.in (1.7),
+	  doc/user-print.doxyconf-latex.in (1.7), doc/user.doxyconf-html.in
+	  (1.9), src/Makefile.am (1.10), src/Polyhedron.inlines.hh (1.6),
+	  src/ppl.cc (1.3), src/ppl_header.bottom (1.1), src/ppl_header.top
+	  (1.1), src/protect.sed (1.3), src/restore.sed (1.3),
+	  tests/append1.cc (1.3), tests/append2.cc (1.4), tests/empty1.cc
+	  (1.3), tests/error1.cc (1.4), tests/error2.cc (1.5),
+	  tests/error3.cc (1.4), tests/inters1.cc (1.5), tests/inters2.cc
+	  (1.6), tests/permute.cc (1.7), tests/print.hh (1.2),
+	  tests/randchull1.cc (1.6): The mechanism for automatically
+	  generating the header files has been rewritten from scratch.	We
+	  no longer depend on kcc: we use CXXCPP instead.  Avoid checking
+	  for header files we do not use.  Try to convince Doxygen not to
+	  sort things the way he wants, at least in user's documentation
+	  (SORT_MEMBER_DOCS = no).  Using std::invalid argument requires
+	  including <stdexcept>.  All tests should include the header file
+	  that will be installed (ppl_install.hh) so that we avoid checking
+	  against an already installed header (ppl.hh).
+
+2001-10-23 Tuesday 08:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Status.cc (1.5): Do not fight against emacs indentation
+	  rules.
+
+2001-10-22 Monday 19:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.18), GenSys.defs.hh (1.27): When using
+	  the doxygen command \code, indentation really matters and, for
+	  consistency, we should start with a 2-spaces indentation.
+
+2001-10-22 Monday 19:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.17): Example on how to build vertices
+	  split into two parts: the first one shows how to build a generic
+	  vertex and, in particular, the origin of the space; the second
+	  one shows how to use the optional denominator argument.
+
+2001-10-22 Monday 19:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Status.cc (1.4), Status.defs.hh (1.7): An annoying warning
+	  about an unused argument dealt with by exploiting pre-processing
+	  macro NDEBUG.
+
+2001-10-22 Monday 16:18  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.30), conversion.cc (1.6), simplify.cc
+	  (1.4): Used the notation of "vect{..}" for all the vectors that
+	  are in the comments.	The definitions and the rules must be seen
+	  in the "Introduction" instead of "definitions.dox" or
+	  "user_definitions.dox".
+
+2001-10-22 Monday 16:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.29), Polyhedron.defs.hh (1.42): Now the
+	  argument `denominator' for methods Polyhedron::assign_variable
+	  and Polyhedron::substitute_variable is a _const_ Integer&,
+	  optional and with a default value of 1.
+
+2001-10-22 Monday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.2): Updated.
+
+2001-10-22 Monday 15:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: error1.cc (1.3), error2.cc (1.4), error3.cc (1.3),
+	  inters2.cc (1.5), randchull1.cc (1.5): All tests updated to use
+	  the new functions line, ray and vertex.
+
+2001-10-22 Monday 15:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.9), ConSys.defs.hh (1.17), GenSys.cc (1.11),
+	  GenSys.defs.hh (1.26), Generator.defs.hh (1.16),
+	  Generator.inlines.hh (1.7), Polyhedron.defs.hh (1.41): Operators
+	  |, ^, /= have now been replaced by functions `line', 'ray' and
+	  'vertex'. Note that the function vertex has an _optional_ second
+	  argument (the denominator), with default value 1.  Hopefully, all
+	  the documentation has been changed accordingly (please check).
+	  In GenSys and ConSys, now the functions assign_variable and
+	  substitute_variable take a _const_ Integer& as their third
+	  argument.  The same change cannot be applied to the corresponding
+	  functions defined on Polyhedron, since we perform a swap on this
+	  argument, so that it cannot be const.  However, I am now seeing
+	  if it is possible to have also these as "optional" arguments,
+	  with a default value of 1. Alas, I need to read the C++ manual in
+	  order to see how I can define a default value for a non-const
+	  argument passed by reference.
+
+2001-10-22 Monday 15:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.6), configure.ac (1.5),
+	  doc/devref-browse.doxyconf-latex.in (1.6),
+	  doc/devref-print.doxyconf-latex.in (1.6),
+	  doc/devref.doxyconf-html.in (1.7), src/.cvsignore (1.4),
+	  src/Makefile.am (1.9), src/SatRow.cc (1.3), src/SatRow.defs.hh
+	  (1.6), src/SatRow.inlines.hh (1.3): SatRow reimplemented from
+	  scratch: we no longer depend on the BitSet class.
+
+2001-10-22 Monday 14:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.23): Changed \alpha in the definition of
+	  affine transformations to \lambda.  Added a comment after the
+	  definition of "Combinations" that the empty sum is the origin.
+
+2001-10-22 Monday 10:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.22): Changes to wording and restructuring
+	  of the definition of Polyhedra.  New headings added : Constraints
+	  representation and Rational polyheron.  Heading "Generators"
+	  replaced by "Generators representation".  Wording in this
+	  definition changed
+
+2001-10-22 Monday 10:02  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.40): In the comments, there was a
+	  system of constraints called "constraints" instead of "cs" and a
+	  variable called "var" instead of "v".
+
+2001-10-22 Monday 09:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Generator.defs.hh (1.15): Wording of comment on how to build
+	  a generator changed. Also minor changes to wording in the
+	  following examples.
+
+2001-10-22 Monday 09:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.21): I was wrong to remove the
+	  "^\transpose" in Weil's theorem - restored.
+
+2001-10-22 Monday 09:25  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.39): In two examples, erased the spaces
+	  between the factor and the variable.
+
+2001-10-22 Monday 09:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.20): Comment at the end of Weil's theorem
+	  had "convex" and "positive" and "rays" and "vertices" wrong way
+	  round.  Minor change to wording introducing the two theorems.  In
+	  final comment of user part, "blurb" removed.
+
+2001-10-22 Monday 08:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.19): Removed spurious ^\transpose (^T) in
+	  Weil's theorem.  Added "dual representation" as heading and
+	  emphasised in text at end of user definitions.
+
+2001-10-21 Sunday 15:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.16), GenSys.defs.hh (1.25),
+	  Generator.defs.hh (1.14), Generator.inlines.hh (1.6),
+	  LinExpression.defs.hh (1.13), LinExpression.inlines.hh (1.3),
+	  Polyhedron.defs.hh (1.38): Systems of constraints and generators
+	  do not define polyhedra; rather, they may "correspond to" a given
+	  polyhedron (the one that would be built by applying the adequate
+	  constructor).  A system of generator does not need to include a
+	  vertex, in general.  The vertex is needed if the system of
+	  generators is meant to correspond to a non-empty polyhedron.	The
+	  detailed description of class Generator changed to highlight that
+	  vertices, lines and rays are represented as a type plus a
+	  direction in the space.
+
+2001-10-21 Sunday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.10): CREDITS added to the distribution.
+
+2001-10-21 Sunday 13:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.13), Constraint.inlines.hh (1.3): In
+	  the documentation, used n to denote the dimension of the space.
+	  In the renaming operator >>, the parameter p renamed into offset,
+	  consistently with the comment.  In the examples, removed spaces
+	  between factor and variable when specifying a linear expression
+	  (e.g., "3 * x + 4 * y" now is written "3*x + 4*y").
+
+2001-10-21 Sunday 13:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.18): When specifying the coordinates of a
+	  point, indexes should range from 0 to n-1, if n is the dimension
+	  of the space.  This is to be consistent with definition of class
+	  Variable.  Change applied to the definitions of scalar-product,
+	  of polytope and to Weil's theorem.  Note: I do not like to say a
+	  polyhedron is "open" in one direction; I prefer the terminology
+	  "unbounded", so I changed it.
+
+2001-10-21 Sunday 12:09  Elisa Ricci
+
+	* doc/definitions.dox (1.17): Restored some mathematical changes
+	  and used the notation "\vect{..}" for all the vectors (also in
+	  the part that is not in the user manual).
+
+2001-10-21 Sunday 11:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.12), Generator.defs.hh (1.13),
+	  Polyhedron.defs.hh (1.37), Variable.cc (1.2), Variable.defs.hh
+	  (1.7): In the documentation of the namespace PPL, all non-friend
+	  operators are now grouped consistently. I do not like very much
+	  the current header of each group ("Non-friend operators on
+	  objects ..." is maybe too much implementation-aware), but in any
+	  case it is definitely better than the default grouping header
+	  ("Functions").
+
+2001-10-21 Sunday 11:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README (1.6): Now it is in sync with the home page of the www
+	  documentation.
+
+2001-10-21 Sunday 11:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.16), ppl.sty (1.4): The new macro \vect
+	  inserted in ppl.sty; now the macro simply uses the latex command
+	  \mathbf, but we can modify its meaning as we like.  Had a run on
+	  definitions.dox to consistently use the new macro: be careful, in
+	  the future, to use 0 when a scalar is meant, and \vect{0} when
+	  the origin of the space is meant.  Also made small, readability
+	  related changes to Minkowsky's and Weil's theorems.
+
+2001-10-20 Saturday 21:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.5): Equation -> equality.
+
+2001-10-20 Saturday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.4): Almost complete: only the directory structure is
+	  missing.
+
+2001-10-20 Saturday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.2): Just a formatting change.
+
+2001-10-20 Saturday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: definitions.dox (1.15), devref.tex (1.5), user.tex (1.6):
+	  Footers fixed.  Put the blame on Doxygen.
+
+2001-10-20 Saturday 16:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* AUTHORS (1.2), CREDITS (1.1): Renamed and completed.
+
+2001-10-20 Saturday 12:22  Elisa Ricci
+
+	* doc/definitions.dox (1.14), src/Polyhedron.defs.hh (1.36): Moved
+	  the definition of the universe polyhedron after the definition of
+	  the polyhedron.
+
+2001-10-20 Saturday 11:47  Elisa Ricci
+
+	* src/: GenSys.cc (1.10), GenSys.defs.hh (1.24), Polyhedron.cc
+	  (1.28), Polyhedron.defs.hh (1.35), Status.defs.hh (1.6),
+	  conversion.cc (1.5): Now, we always use `system of' instead of
+	  `set of' for GenSys and ConSys.  In the comment of polyhedron
+	  added the explanation of what an universal polyhedron is.  Some
+	  changes to the comment of the exception: we say that they "have
+	  different dimension" instead of that they "do not have the same
+	  dimension".
+
+2001-10-20 Saturday 10:26  Elisa Ricci
+
+	* src/LinExpression.defs.hh (1.12): In the second part of the
+	  example, we can use  LinExpression e = LinExpression(14) instead
+	  of   LinExpression e = LinExpression(Integer(14)).
+
+2001-10-19 Friday 20:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: user-browse.doxyconf-latex.in (1.6),
+	  user-print.doxyconf-latex.in (1.6), user.doxyconf-html.in (1.8):
+	  No INTERNAL_DOCS, no INHERIT_DOCS, no FILE_PATTERNS, and no
+	  EXCLUDE_PATTERNS.
+
+2001-10-19 Friday 19:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.15), GenSys.defs.hh (1.23): Use
+	  PPL_INTERNAL inheritance.
+
+2001-10-19 Friday 18:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.13): Generators and associated terminology
+	  now defined in the user section.  There is now some repetition of
+	  definitions in the developer's section.
+
+2001-10-19 Friday 17:27  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.27), Polyhedron.defs.hh (1.34),
+	  Polyhedron.inlines.hh (1.5): Simplified the comment to the
+	  function swap.  Used `v' instead of `var', `dim' instead of
+	  `add_dim'.  All the ConSys are called `cs' and all the GenSys are
+	  called `gs'.	Used the expression "thrown if" to introduce the
+	  comment to the exceptions.  The variable is "substituted" in the
+	  function substitute_variable.
+
+2001-10-19 Friday 17:19  Elisa Ricci
+
+	* src/: ConSys.cc (1.8), ConSys.defs.hh (1.14), GenSys.cc (1.9),
+	  GenSys.defs.hh (1.22): The Generator is called `g' instead of `r'
+	  and the number that indicates the variable is called `v' instead
+	  of 'var'.
+
+2001-10-19 Friday 17:12  Elisa Ricci
+
+	* src/: Constraint.defs.hh (1.11), Generator.defs.hh (1.12):
+	  Constraint and Generator are :: PPL_INTERNAL Row instead of ::
+	  public Row (like LinExpression).
+
+2001-10-19 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.9), depcomp (1.2), install-sh (1.2), ppl.spec.in
+	  (1.6), doc/Makefile.am (1.11), doc/definitions.dox (1.12),
+	  doc/devref-browse.doxyconf-latex.in (1.5),
+	  doc/devref-print.doxyconf-latex.in (1.5),
+	  doc/devref.doxyconf-html.in (1.6), doc/gpl.dox (1.2),
+	  doc/user-browse.doxyconf-latex.in (1.5),
+	  doc/user-print.doxyconf-latex.in (1.5), doc/user.doxyconf-html.in
+	  (1.7), src/ConSys.cc (1.7), src/ConSys.defs.hh (1.13),
+	  src/ConSys.inlines.hh (1.3), src/Constraint.defs.hh (1.10),
+	  src/GenSys.cc (1.8), src/GenSys.defs.hh (1.21),
+	  src/GenSys.inlines.hh (1.3), src/Generator.defs.hh (1.11),
+	  src/LinExpression.defs.hh (1.11), src/Makefile.am (1.8),
+	  src/Matrix.cc (1.4), src/Matrix.defs.hh (1.5),
+	  src/Matrix.inlines.hh (1.2), src/Polyhedron.cc (1.26),
+	  src/Polyhedron.defs.hh (1.33), src/Polyhedron.inlines.hh (1.4),
+	  src/Row.cc (1.3), src/Row.inlines.hh (1.3), src/SatMatrix.cc
+	  (1.4), src/SatMatrix.defs.hh (1.6), src/SatMatrix.inlines.hh
+	  (1.2), src/SatRow.defs.hh (1.5), src/SatRow.inlines.hh (1.2),
+	  src/Status.cc (1.3), src/Status.defs.hh (1.5), src/conversion.cc
+	  (1.4), src/minimize.cc (1.3), src/simplify.cc (1.3),
+	  tests/Makefile.am (1.15), tests/append2.cc (1.3), tests/error2.cc
+	  (1.3), tests/inters1.cc (1.4), tests/inters2.cc (1.4),
+	  tests/permute.cc (1.6): Annoying trailing blanks removed.
+
+2001-10-19 Friday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.10), LinExpression.inlines.hh
+	  (1.2): We now have only one sizing constructor, and it is
+	  private.
+
+2001-10-19 Friday 12:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: conversion.cc (1.3), minimize.cc (1.2), simplify.cc (1.2),
+	  Matrix.cc (1.3): Old junk removed.
+
+2001-10-19 Friday 12:15  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.25), Polyhedron.defs.hh (1.32): In
+	  functions widening_assign and limited_widening_assign considered
+	  the case of empty-polyhedron and the exception for the different
+	  dimension of the polyhedra and the matrix (this for the
+	  limited_widening); added some explanations for the parameters.
+	  In function assign_variable and substitute_variable considered
+	  the exceptions for the variable that is not inside the polyhedron
+	  and the expression that does not have the right dimension.
+
+2001-10-19 Friday 09:57  Elisa Ricci
+
+	* doc/definitions.dox (1.11): Some mathematical changes.
+
+2001-10-19 Friday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.5), configure.ac (1.4): Add checks to determine
+	  the size of ints and longs.
+
+2001-10-19 Friday 09:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.31): Examples 4 to 7 simplified.
+
+2001-10-19 Friday 08:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Polyhedron.defs.hh (1.30), Variable.defs.hh (1.6): Changes
+	  to English.
+
+2001-10-18 Thursday 18:51  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.24), Polyhedron.defs.hh (1.29),
+	  Polyhedron.inlines.hh (1.3): In function add_dimensions_and_embed
+	  and add_dimensions_and_project the case of "add_dim" = 0 and the
+	  case of the empty polyhedron are considered.	In functions
+	  add_constraints, add_constraints_lazy, add_generators, generators
+	  and constraints instead of some assertion some exceptions are
+	  added.
+
+2001-10-18 Thursday 15:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: GenSys.defs.hh (1.20), LinExpression.defs.hh (1.9),
+	  Polyhedron.defs.hh (1.28): More improvements to the English.
+
+2001-10-18 Thursday 15:29  Elisa Ricci
+
+	* src/GenSys.defs.hh (1.19): The real name of the function is
+	  GenSys_Con_Rel satisfy(const Constraint& c) const and not
+	  GenSys_Con_Rel satisfy_constraint(const Constraint& c) const.
+
+2001-10-18 Thursday 14:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/GenSys.defs.hh (1.18): Just "specify" changed to "specifies".
+
+2001-10-18 Thursday 13:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: ConSys.defs.hh (1.12), Constraint.defs.hh (1.9),
+	  GenSys.defs.hh (1.17), Generator.defs.hh (1.10): Changes to
+	  English.  In GenSys.defs.hh the explanation about a system of
+	  generators changed to:     An object of the class GenSys is a
+	  system of generators,     i.e. a container of objects of the
+	  class Generator     (lines, rays and vertices).      The set of
+	  generators must include at least one vertex.	    This is needed
+	  since a line or ray only specify a direction	    and a point is
+	  needed to indicate its position.
+
+2001-10-18 Thursday 12:40  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.23), Polyhedron.defs.hh (1.27): Now the
+	  function  GenSys_Con_Rel poly_satisfies_constraint(const
+	  Constraint& con) is called  GenSys_Con_Rel satisfies(const
+	  Constraint& c).  Added the exception for the functions
+	  convex_hull_lazy(), satisfies() and includes().
+
+2001-10-18 Thursday 12:37  Elisa Ricci
+
+	* src/: GenSys.cc (1.7), GenSys.defs.hh (1.16): Now the function
+	  PPL::GenSys::satisfy_constraint(const Constraint& c) const is
+	  called PPL::GenSys::satisfy(const Constraint& c) const.
+
+2001-10-18 Thursday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ehandlers.hh (1.2): Call exit(1) instead of abort().
+
+2001-10-18 Thursday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.14), append1.cc (1.2), ehandlers.hh (1.1):
+	  Set the handlers for unexpected and uncaught exceptions.
+
+2001-10-18 Thursday 09:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/GenSys.defs.hh (1.15): Small change to wording in
+	  GenSys_Con_Rel comment.
+
+2001-10-18 Thursday 09:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/permute.cc (1.5): Now the termination conditions are
+	  checked.
+
+2001-10-18 Thursday 08:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/permute.cc (1.4): Instead of giving the number of variables
+	  explicitly, it is obtained as needed using
+	  Polyhedron.num_dimensions.
+
+2001-10-18 Thursday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.10): Now `make world' also produces the
+	  licenses in various formats.
+
+2001-10-17 Wednesday 20:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.22): throw_different_dimensions() fixed.
+
+2001-10-17 Wednesday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.13), permute.cc (1.3): Made quiet.
+
+2001-10-17 Wednesday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/error3.cc (1.2): Fixed and made quiet.
+
+2001-10-17 Wednesday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/append.cc (1.4): Renamed append1.cc.
+
+2001-10-17 Wednesday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: append1.cc (1.1), append2.cc (1.2): Renamed.
+
+2001-10-17 Wednesday 19:37  Elisa Ricci
+
+	* tests/error3.cc (1.1): Tests whether convex_hull assign throws
+	  when it should.
+
+2001-10-17 Wednesday 19:33  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.21), Polyhedron.defs.hh (1.26):
+	  Polyhedron::intersection_assign() and
+	  Polyhedron::convex_hull_assign() now throw an exception if asked
+	  to operate on polyhedra of different dimensions.
+
+2001-10-17 Wednesday 16:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/permute.cc (1.2): We now use the intended constraints.
+	  Termination is guaranteed by using Polyhedron::widening_assign().
+
+2001-10-17 Wednesday 16:31  Elisa Ricci
+
+	* src/: ConSys.defs.hh (1.11), ConSys.inlines.hh (1.2),
+	  GenSys.defs.hh (1.14), GenSys.inlines.hh (1.2): Added the
+	  function swap for GenSys and ConSys.
+
+2001-10-17 Wednesday 16:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Makefile.am (1.12), append2.cc (1.1), my_append.cc (1.2),
+	  permute.cc (1.1): The file my_append.cc renamed to append2.cc A
+	  new test program permute.cc added.  Makefile.am updated to
+	  include these tests.
+
+2001-10-17 Wednesday 16:08  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.20), Polyhedron.defs.hh (1.25): Added
+	  comments of the parameters to some public functions of
+	  Polyhedron.
+
+2001-10-17 Wednesday 15:27  Elisa Ricci
+
+	* src/: ConSys.defs.hh (1.10), Constraint.defs.hh (1.8),
+	  GenSys.defs.hh (1.13), Polyhedron.defs.hh (1.24): Now, the
+	  definitions of the variables used in the examples are before the
+	  examples (they are not inside the examples).
+
+2001-10-17 Wednesday 15:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/my_append.cc (1.1): A modified version of append.cc where
+	  code is structured into two procedures, one for the initial
+	  polyhedra and one for the fix-point.
+
+2001-10-17 Wednesday 12:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.10): Definitions of linearly independent
+	  and affinely independent improved.
+
+2001-10-17 Wednesday 12:38  Elisa Ricci
+
+	* src/: Constraint.defs.hh (1.7), Generator.defs.hh (1.9),
+	  LinExpression.defs.hh (1.8): Now, "friend" mathods are inside the
+	  class documentation of these class.  In the "Detail Description"
+	  of the class LinExpression there is the paragraph "How to build a
+	  linear expression".
+
+2001-10-17 Wednesday 12:03  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.23): Used "check_not_empty" instead of
+	  "check_satisfiable" also in the comment of function
+	  Polyhedron::OK().
+
+2001-10-17 Wednesday 12:01  Elisa Ricci
+
+	* src/: ConSys.defs.hh (1.9), GenSys.defs.hh (1.12), Matrix.defs.hh
+	  (1.4), Polyhedron.cc (1.19), Polyhedron.defs.hh (1.22),
+	  SatMatrix.cc (1.3), SatMatrix.defs.hh (1.5), SatRow.defs.hh
+	  (1.4), Status.defs.hh (1.4): Changed the comments in the function
+	  OK().  In function Polyhedron::OK() used "check_not_empty"
+	  instead of "check_satisfiable".
+
+2001-10-17 Wednesday 11:05  Elisa Ricci
+
+	* src/: ConSys.cc (1.6), ConSys.defs.hh (1.8), GenSys.cc (1.6),
+	  GenSys.defs.hh (1.11), Polyhedron.cc (1.18), Polyhedron.defs.hh
+	  (1.21): In function assign_variable and substitute_variable and
+	  in their comments used "expr" instead of "coefficient".  Used the
+	  concatenation of two strings in the argument of
+	  std::invalid_argument(...).
+
+2001-10-17 Wednesday 11:03  Elisa Ricci
+
+	* src/Generator.inlines.hh (1.5): Used the concatenation of two
+	  strings in the argument of std::invalid_argument(...).
+
+2001-10-17 Wednesday 10:14  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.20): Erased the temporary debug
+	  constructor of a polyhedron.
+
+2001-10-17 Wednesday 09:19  Elisa Ricci
+
+	* src/: ConSys.cc (1.5), ConSys.defs.hh (1.7), GenSys.cc (1.5),
+	  GenSys.defs.hh (1.10), Matrix.cc (1.2), Matrix.defs.hh (1.3),
+	  Polyhedron.cc (1.17), Polyhedron.defs.hh (1.19), SatMatrix.cc
+	  (1.2), SatMatrix.defs.hh (1.4), SatRow.cc (1.2), SatRow.defs.hh
+	  (1.3), Status.cc (1.2), Status.defs.hh (1.3): Now, there is not
+	  NDEBUG before the function OK.
+
+2001-10-17 Wednesday 07:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.4), GenSys.cc (1.4), Generator.inlines.hh
+	  (1.4), Makefile.am (1.7), Polyhedron.cc (1.16), Row.cc (1.2),
+	  Row.inlines.hh (1.2): Now Integer and BitSet are in the PPL
+	  namespace.  Other namespace-related fixes.  Exception strings
+	  improved.
+
+2001-10-16 Tuesday 19:05  Elisa Ricci
+
+	* src/: Constraint.defs.hh (1.6), Generator.defs.hh (1.8): Changed
+	  the place of the paragraph "How to build ...".  In the comment of
+	  'Generator operator /=' used std::invalid_argument instead of
+	  invalid_argument.
+
+2001-10-16 Tuesday 18:59  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.18): Used std::invalid_argument instead
+	  of invalid_argument in the documentation of exception.
+
+2001-10-16 Tuesday 18:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox (1.9), ppl.sty (1.3): More definitions
+	  added to ppl.sty.
+
+	  New definitions used in definitions.dox.  Layout of formula in
+	  Minkowski's theorem improved.
+
+2001-10-16 Tuesday 18:23  Elisa Ricci
+
+	* src/: ConSys.defs.hh (1.6), GenSys.defs.hh (1.9), Polyhedron.cc
+	  (1.15), Polyhedron.defs.hh (1.17), Status.defs.hh (1.2),
+	  conversion.cc (1.2): Used "\Rset" instead of "\mathbb{R}".
+
+2001-10-16 Tuesday 18:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.5), LinExpression.defs.hh (1.7),
+	  Variable.defs.hh (1.5): Examples on the creation of linear
+	  expressions and constraints moved to the right place. Comment
+	  about variable names moved into the definition of the class
+	  Variable.
+
+2001-10-16 Tuesday 18:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.7): The examples on how to build
+	  generators moved to the right place.
+
+2001-10-16 Tuesday 17:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: error1.cc (1.2), error2.cc (1.2): There is no point in
+	  including print.hh.
+
+2001-10-16 Tuesday 17:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox (1.8), ppl.sty (1.2): Some logic notation
+	  and "things that hold by definition" added to ppl.sty \mathbb{R}
+	  replaced by \Rset in definitions.dox
+
+2001-10-16 Tuesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.14), src/Polyhedron.defs.hh (1.16),
+	  src/Variable.defs.hh (1.4), src/Variable.inlines.hh (1.2),
+	  tests/append.cc (1.3): The argument of
+	  Polyhedron::remove_dimensions() has changed again.  Now it is
+	  remove_dimensions(const std::set<Variable>& to_be_removed).
+
+2001-10-16 Tuesday 17:24  Elisa Ricci
+
+	* tests/: Makefile.am (1.11), error2.cc (1.1): Added a test for the
+	  expception of Polyhedron::assign_variable.
+
+2001-10-16 Tuesday 17:12  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.15): Commented the exception for the
+	  function assign_variable and substitute_variable.  Now, some
+	  important puclic function are in the user manual.
+
+2001-10-16 Tuesday 17:10  Elisa Ricci
+
+	* src/Generator.defs.hh (1.6): Commented the exception of the
+	  constructor of a vertex.
+
+2001-10-16 Tuesday 17:09  Elisa Ricci
+
+	* src/Generator.inlines.hh (1.3): A line has the inhomogeneus term
+	  equal to zero (like a ray).
+
+2001-10-16 Tuesday 16:40  Elisa Ricci
+
+	* src/GenSys.defs.hh (1.8): Added two examples that show that at
+	  least a vertex is necessary in a set of generators.
+
+2001-10-16 Tuesday 15:20  Elisa Ricci
+
+	* src/Polyhedron.cc (1.13): In functions assign_variable and
+	  substitute_variable tha case of denominator == 0 is considered.
+
+2001-10-16 Tuesday 15:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.6), Variable.defs.hh (1.3): No
+	  longer using modules (\ingroup, \addgroup, etc.).
+
+2001-10-16 Tuesday 12:26  Elisa Ricci
+
+	* src/Polyhedron.cc (1.12): Erased a print.
+
+2001-10-16 Tuesday 12:23  Elisa Ricci
+
+	* src/: ConSys.cc (1.3), ConSys.defs.hh (1.5), GenSys.cc (1.3),
+	  GenSys.defs.hh (1.7): Corrected my previous error.
+
+2001-10-16 Tuesday 12:09  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.11), Polyhedron.defs.hh (1.14): The
+	  functions assingn_variable and substitute_variable use a Variable
+	  instead od a size_t and a const LinExpression instead of a
+	  vector<Integer>.  In this functions, we use a copy of the `coeff'
+	  to find the inverse transformations.	Changed the example in
+	  according to these changes.
+
+2001-10-16 Tuesday 12:04  Elisa Ricci
+
+	* src/: ConSys.cc (1.2), ConSys.defs.hh (1.4): Now
+	  substitute_variable uses LinExpression instead of a
+	  vector<Integer>.
+
+2001-10-16 Tuesday 12:03  Elisa Ricci
+
+	* src/: GenSys.cc (1.2), GenSys.defs.hh (1.6): Now
+	  assign_variable(..) uses an LinExpression instead of a
+	  vector<Integer>.
+
+2001-10-16 Tuesday 11:59  Elisa Ricci
+
+	* src/LinExpression.defs.hh (1.5): Now LinExpression is
+	  PPL_INTERNAL Row, instead of private Row.
+
+2001-10-16 Tuesday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.inlines.hh (1.2), tests/Makefile.am (1.10),
+	  tests/error1.cc (1.1): Throw an invalid_argument exception if
+	  Generator operator /=(const LinExpression& e, const Integer& n)
+	  is called with n == 0.  New test program error1.cc to test
+	  whether this situation is correctly handled.
+
+2001-10-16 Tuesday 10:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.3): New incipit.
+
+2001-10-16 Tuesday 10:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.2), Row.defs.hh (1.2), SatMatrix.defs.hh
+	  (1.3), SatRow.defs.hh (1.2): All the specializations of the
+	  std::swap function related to implementation classes are now
+	  hidden from the user guide.
+
+2001-10-16 Tuesday 10:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.5): Summary changed.  Packager also changed in
+	  view of PGP signatures.
+
+2001-10-16 Tuesday 10:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.13): The parameter name of the
+	  "default" constructor for Polyhedron is `kind'.  Hal the comment
+	  was using a different parameter name (`full').
+
+2001-10-16 Tuesday 10:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.defs.hh (1.5): In the examples, replaced "\=" by "/=".
+
+2001-10-16 Tuesday 10:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.5): In the examples for defining
+	  vectors, all "\=" replaced by "/=".
+
+2001-10-16 Tuesday 08:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.2), src/Polyhedron.cc (1.10),
+	  src/Polyhedron.defs.hh (1.12), tests/append.cc (1.2): New
+	  interface for remove_dimensions(const std::vector<unsigned int>&
+	  to_be_removed).  Note: BitSet is an implementation detail that
+	  should not surface in the API.
+
+2001-10-16 Tuesday 07:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.4): First attempt at the LSM (Linux Software Map)
+	  entry form.
+
+2001-10-15 Monday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.9), append.cc (1.1): A first at the
+	  append's analysis test.
+
+2001-10-15 Monday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/randchull1.cc (1.4): Do less work.
+
+2001-10-15 Monday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/empty1.cc (1.2): Must return an int, not a bool.
+
+2001-10-15 Monday 18:35  Elisa Ricci
+
+	* src/Polyhedron.cc (1.9): Erased the "assert(OK())" from the
+	  function Polyhedron::insert(const Generator&): after an insertion
+	  of a generator the polyhedron can be not OK.
+
+2001-10-15 Monday 18:24  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.11): Added a new example to show the
+	  use of the function Polyhedron::insert(...).
+
+2001-10-15 Monday 18:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.8), src/Polyhedron.defs.hh (1.10),
+	  tests/Makefile.am (1.8), tests/empty1.cc (1.1): It is not
+	  possible to overload bool and unsigned int.  New enumeration
+	  Degenerate_Kind added with vales ZERO_DIMENSIONAL and EMPTY.	The
+	  constructor Polyhedron(Degenerate_Kind kind = ZERO_DIMENSIONAL)
+	  does the expected thing.  The program empty1.cc exemplifies two
+	  methods of obtaining an empty polyhedron.
+
+2001-10-15 Monday 18:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.9): ppl.sty must also be distributed.
+
+2001-10-15 Monday 17:14  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.7), Polyhedron.defs.hh (1.9): Now the
+	  default constructor of a polyhedron has a default argument.  If
+	  `full' is false, it builds an empty polyhedron (it has the flag
+	  set to empty); otherwise, if it has the default value (i.e.
+	  true), it bulids a zero-dimensional polyhedron.
+
+2001-10-15 Monday 16:44  Elisa Ricci
+
+	* src/Polyhedron.cc (1.6): If we build a polyhedron starting from a
+	  matrix of generators with no rows the polyhedron is empty.
+
+2001-10-15 Monday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.8): Use an absolute path for adding to
+	  TEXINPUTS.
+
+2001-10-15 Monday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/.cvsignore (1.3): Here is the Integer class again.
+
+2001-10-15 Monday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.2): Multiple inclusion guard added.
+
+2001-10-15 Monday 15:20  Elisa Ricci
+
+	* src/Polyhedron.cc (1.5): In the constructors of a polyhedron that
+	  use a system of constraints or a set of generators these matrices
+	  must be at least two columns.  In the function
+	  remove_dimensions(..) if the matrix of generators does not have
+	  at least two columns (i.e num_columns() <= 1) the polyhedron
+	  becomes zero-dimensional and so we clear the `con_sys' and
+	  `gen_sys'.  In function insert(const Constraint& c) if the
+	  polyhedron is zero-dimensional we add also the positivity
+	  constraint.  In functions insert(...) it is no longer necessary
+	  clear `con_sys' and `gen_sys' before adding a row if the
+	  polyhedron is zero-dimensional.  In function OK(), we verify if
+	  in a zero-dimensional polyhedron `con_sys' and `gen_sys' have no
+	  rows.
+
+2001-10-15 Monday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.7), devref-browse.doxyconf-latex.in (1.4),
+	  devref-print.doxyconf-latex.in (1.4), devref.doxyconf-html.in
+	  (1.5), devref.tex (1.4), ppl.sty (1.1),
+	  user-browse.doxyconf-latex.in (1.4), user-print.doxyconf-latex.in
+	  (1.4), user.doxyconf-html.in (1.6), user.tex (1.5): New LaTeX
+	  commands can now be defined in ppl.sty and then freely used in
+	  the doxygen and LaTeX sources.  This works also when producing
+	  HTML pages.
+
+2001-10-15 Monday 13:59  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.8): Rewrite a part of the brief
+	  description of the class Polyhedron.	Added some more expanation
+	  for the examples 5 and 6.
+
+2001-10-15 Monday 12:19  Elisa Ricci
+
+	* src/SatMatrix.defs.hh (1.2): Added a briefly description for the
+	  saturation matrix.
+
+2001-10-15 Monday 11:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.3): Now we build a relocatable package.
+
+2001-10-15 Monday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.2): A first cut at a working RPM spec file.
+
+2001-10-15 Monday 09:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.6): It is now possible for the build directory
+	  to be the same as the source directory.
+
+2001-10-14 Sunday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.2), missing (1.2), mkinstalldirs (1.3): Updated.
+
+2001-10-14 Sunday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.8), configure.ac (1.3), doc/Makefile.am (1.6),
+	  m4/Makefile.am (1.2), src/Makefile.am (1.5), tests/Makefile.am
+	  (1.7): Several packaging bugs have been fixed: now `make
+	  distcheck' is OK.
+
+2001-10-14 Sunday 21:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.3),
+	  devref-print.doxyconf-latex.in (1.3), devref.doxyconf-html.in
+	  (1.4), user-browse.doxyconf-latex.in (1.3),
+	  user-print.doxyconf-latex.in (1.3), user.doxyconf-html.in (1.5):
+	  The sysdep directory does not exist anymore.
+
+2001-10-14 Sunday 14:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.7), doc/Makefile.am (1.5), doc/definitions.dox
+	  (1.7), doc/devref-browse.doxyconf-latex.in (1.2),
+	  doc/devref-print.doxyconf-latex.in (1.2),
+	  doc/devref.doxyconf-html.in (1.3), doc/fdl.dox (1.1), doc/fdl.tex
+	  (1.1), doc/gfdl.dox (1.2), doc/gpl.tex (1.1), doc/gpl.texi (1.2),
+	  doc/gpl.texinfo (1.2), doc/texinfo.tex (1.2),
+	  doc/user-browse.doxyconf-latex.in (1.2),
+	  doc/user-print.doxyconf-latex.in (1.2), doc/user.doxyconf-html.in
+	  (1.4): Documentation reorganized.
+
+2001-10-14 Sunday 11:46  Elisa Ricci
+
+	* src/Polyhedron.cc (1.4): In functions Polyhedron::insert(const
+	  Constraint& c) e Polyhedron::insert(const Constraint& c) the case
+	  of a zero-dimensional polyhedron is considered.
+
+2001-10-13 Saturday 21:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Polyhedra.texinfo (1.3): Was never meant to be here.
+
+2001-10-13 Saturday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.4), configure.ac (1.2): Configuration fixed in
+	  various respects.
+
+	  Please note that:
+
+	  - debugging (-g) is ON by default; - standard optimization (-O2)
+	  is THE default; - run-time assertions are OFF by default.
+
+2001-10-13 Saturday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.4), ppl.cc (1.2), protect.sed (1.2),
+	  restore.sed (1.2): Generation of libppl.a and ppl.hh fixed.
+
+2001-10-13 Saturday 19:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.6), inters1.cc (1.3), inters2.cc (1.3),
+	  randchull1.cc (1.3): Programs using the PPL need only include
+	  ppl.hh.
+
+2001-10-13 Saturday 19:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.3), tests/randchull1.cc (1.2): It is now
+	  possible to insert a generator into an empty polyhedron.
+
+2001-10-13 Saturday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.6), acconfig.h (1.2), acinclude.m4 (1.1),
+	  config.guess (1.2), config.h.in (1.3), config.sub (1.2),
+	  configure.ac (1.1), configure.in (1.5), doc/Makefile.am (1.4),
+	  m4/.cvsignore (1.1), src/Makefile.am (1.3), tests/Makefile.am
+	  (1.5): Upgraded to newer versions of autoconf.  Use the new
+	  checks for detecting GMP.
+
+2001-10-13 Saturday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.5), m4/Makefile.am (1.1),
+	  m4/ac_check_gmp_exceptions.m4 (1.1), m4/ac_check_have_gmp.m4
+	  (1.1): New tests to check whether GMP is installed and, if so,
+	  whether it was compiled with -fexceptions.
+
+2001-10-13 Saturday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.4), Makefile.am (1.4), Makefile.in (1.4),
+	  aclocal.m4 (1.2), configure (1.5), stamp-h.in (1.2),
+	  doc/.cvsignore (1.1), doc/Makefile.am (1.3), doc/Makefile.in
+	  (1.3), src/.cvsignore (1.2), src/Makefile.in (1.3),
+	  tests/.cvsignore (1.1), tests/Makefile.in (1.5): Automatically
+	  generated  files should not be in the repository and their
+	  presence in the directory structure should be ignored.
+
+2001-10-12 Friday 22:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure (1.4), configure.in (1.4), doc/Makefile.am (1.2),
+	  doc/Makefile.in (1.2), doc/devref-browse.doxyconf-latex.in (1.1),
+	  doc/devref-print.doxyconf-latex.in (1.1),
+	  doc/devref.doxyconf-pdf.in (1.3), doc/devref.tex (1.3),
+	  doc/user-browse.doxyconf-latex.in (1.1),
+	  doc/user-print.doxyconf-latex.in (1.1), doc/user.doxyconf-pdf.in
+	  (1.4), doc/user.tex (1.4): Several improvements to the
+	  documentation.  We now produce docs for printing and docs for
+	  browsing
+
+2001-10-12 Friday 18:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.2), devref.doxyconf-pdf.in
+	  (1.2), user.doxyconf-html.in (1.3), user.doxyconf-pdf.in (1.3),
+	  user.tex (1.3): The project name is "Parma Polyhedra Library",
+	  "PPL" for short.
+
+2001-10-12 Friday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.4), Makefile.in (1.4), randchull1.cc
+	  (1.1): New test computing convex-hulls of random polytopes.
+
+2001-10-12 Friday 17:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.6): Title of document changed.  Sections
+	  changed so that there are two sections, an introduction to
+	  polyhedra and a more advanced section which talks about the PPL
+	  implementation.  Comment about vertices differing from rays only
+	  in the n+1'th  term moved to before "Valid linear inequalities"
+	  paragraph.
+
+2001-10-12 Friday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.2), Makefile.in (1.2): Header file ppl.hh is
+	  now guarded against multiple inclusion.
+
+2001-10-12 Friday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.cc (1.2): Bug fixed: a vertex in the origin was
+	  printed as "v()" instead of "v(0)".
+
+2001-10-12 Friday 16:51  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.2), Polyhedron.defs.hh (1.7): Added the
+	  function Polyhedron::insert(const Generator& g).
+
+2001-10-12 Friday 16:36  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.6): Added other two examples: one is
+	  for the use of assign_variable(...) and the other is for the use
+	  of substitute_variable(...).
+
+2001-10-12 Friday 15:44  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.5): Corrected a my error: to build a
+	  vertex "/=" is needed instead of "\=".
+
+2001-10-12 Friday 15:12  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.4): Added two examples to the comment:
+	  one to specify the use of add_dimensions_and_embed(..) and the
+	  other to specify the use of add_dimensions_and_project(...).
+	  Corrected an error in a formula: now in the comment of
+	  convex_hull(...) and convex_hull_lazy(..) there is \f$\cup\f$
+	  instead of \f$\union\f$ (that caused an error in Latex).
+
+2001-10-12 Friday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/inters2.cc (1.2): Fixed and extended.
+
+2001-10-12 Friday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.3), Makefile.in (1.3), inters1.cc (1.2),
+	  inters2.cc (1.1), print.hh (1.1): print.hh contains functions
+	  that are useful for printing polyhedra.  inters1.cc improved.
+	  New test inters2.cc computing the intersection of a pyramid with
+	  an half-space of variable height, then counting the number of
+	  vertices of the resulting polytope (the empty polyhedron, a
+	  proper frustum, or a singleton).
+
+2001-10-12 Friday 13:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.5): Section on the "equivalence of
+	  homogeneous and inhomogeneous systems" (up to the paragraph
+	  called "Valid linear inequalities") changed and reworded.  Title
+	  of section changed to "Homogeneous systems".
+
+2001-10-12 Friday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.2), doc/Polyhedra.texinfo (1.2), tests/Makefile.am
+	  (1.2), tests/Makefile.in (1.2): Bump copyright year.
+
+2001-10-12 Friday 09:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.3), Makefile.in (1.3), config.h.in (1.2),
+	  configure (1.3), configure.in (1.3), tests/Makefile.am (1.1),
+	  tests/Makefile.in (1.1), tests/inters1.cc (1.1): Infrastructure
+	  for the tests directory and `make check'.  inters1.cc is a first
+	  example of how test programs could be written.
+
+2001-10-11 Thursday 17:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.3): Added a backslash to mathbb in the
+	  second example.  Removing empty lines that were causing Examples
+	  1 and 2 to end prematurely.
+
+2001-10-11 Thursday 17:00  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.2): Added two examples to the comment:
+	  one is for the construction of a square using the constraints and
+	  the generators. The other is for the construction of an
+	  half-strip using the constraints and the generators.
+
+2001-10-11 Thursday 16:57  Elisa Ricci
+
+	* src/GenSys.defs.hh (1.4): Added another example for the
+	  construction of a set of generators (it builds an half-strip).
+
+2001-10-11 Thursday 16:56  Elisa Ricci
+
+	* src/ConSys.defs.hh (1.3): Added another example for the
+	  constraction of a system of constraints (it builds an
+	  half-strip).
+
+2001-10-11 Thursday 16:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.4): The paragraph "The Minkowski's
+	  theorem" renamed to	"Minkowski's theorem.  The condition
+	  "rank(A) = n" changed to   "where A is a matrix of rank n".  The
+	  note following the definition is reworded so that the
+	  conditions are not bracketed.  "Linear equalities and
+	  inequalities" has been   changed to "constraints".  "positive
+	  multiples of each inequality and ray" has been    changed to
+	  "positive multiples of each constraint and ray".  The word "the"
+	  inserted where necessary.
+
+	  The paragraph "The Weil's theorem" renamed to "Weil's theorem.
+
+2001-10-11 Thursday 16:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.4): In the examples, variable "cs"
+	  renamed into "inequal" and "equal".
+
+2001-10-11 Thursday 15:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.3): In the definition of rays:  P is
+	  defined before P_0;  A and b are defined;  inserted "any point"
+	  before r; The comment that a ray is the direction in which P is
+	  infinite, moved from within the statement of the proposition to
+	  before the proposition and reworded.
+
+	  In the definition of lines, wording improved.  Comment relating
+	  opposite rays with lines made into a separate paragraph. It is
+	  not part of the definition.
+
+2001-10-11 Thursday 14:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.4): In the first two examples,
+	  variable z now has index 2 (using index 5 was correct, but a bit
+	  misleading).
+
+2001-10-11 Thursday 14:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.4): IN the first example, variable "g"
+	  renamed as "line".
+
+2001-10-11 Thursday 14:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.3): Examples modified:  - using more
+	  meaningful names (line, ray and vertex) for Generator variables;
+	  - explained that the first argument of operators | and ^ is
+	  meaningless;	- explained how to use the second argument of /= to
+	  obtain vertices    with non-integral coefficients.
+
+2001-10-11 Thursday 14:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.defs.hh (1.3): In the first example, Variable y(0)
+	  changed in Variable y(1) to avoid dimension clash with Variable
+	  x(0).  In the second example, the computation of the past-the-end
+	  iterator moved outside the for-loop.
+
+2001-10-11 Thursday 13:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.2), Constraint.defs.hh (1.3),
+	  Constraint.inlines.hh (1.2): Friend members building a constraint
+	  using operators < and > removed.  Example changed accordingly.
+	  In the example on the use of iterators for ConSys, the
+	  past-the-end iterator is now computed only once before the
+	  for-loop.
+
+2001-10-11 Thursday 13:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: user.doxyconf-html.in (1.2), user.doxyconf-pdf.in (1.2): Do
+	  not show inheritance graphs or diagrams.  Do not show a thousands
+	  times that the only PPL header file is ppl.hh.
+
+2001-10-11 Thursday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.tex (1.2), user.tex (1.2): Tatiana's email address
+	  fixed.  Better titles.
+
+2001-10-11 Thursday 13:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.2): In the definition of the combinations,
+	  the p_1,...,p_k are changed to x_1,...,x_k.  In the definition of
+	  scalar product: "vector" is changed to "vectors".  In the
+	  definition of polyhedra there are a number of changes to
+	  notation, the definitions of the notation and to the wording.
+
+2001-10-11 Thursday 12:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.3), Variable.defs.hh (1.2): Some
+	  errors (just introduced by me) removed.  Methods of class
+	  Variable added to group LinExpression.
+
+2001-10-11 Thursday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.2): A few changes in the example.
+
+2001-10-11 Thursday 11:22  Elisa Ricci
+
+	* src/Generator.defs.hh (1.2): Added three examples: one for the
+	  construction of a line, one for the construction of a ray and the
+	  other for the construction of a vertex.
+
+2001-10-11 Thursday 11:19  Elisa Ricci
+
+	* src/GenSys.defs.hh (1.2): Added an example in the comment: it is
+	  useful to specify the construction of a set of generators.
+
+2001-10-11 Thursday 11:16  Elisa Ricci
+
+	* src/Constraint.defs.hh (1.2): Added two examples in the comment:
+	  one for the building of an inequality and the other for the
+	  building of an equality.
+
+2001-10-11 Thursday 08:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.2), Makefile.in (1.2), configure (1.2),
+	  configure.in (1.2): Disable the test directory.
+
+2001-10-11 Thursday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.3), src/.cvsignore (1.1): My mistake: BitSet and
+	  Integer are subdirectories of src.
+
+2001-10-11 Thursday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.2): Ignore the BitSet and Integer subdirectories:
+	  they must be here and must be ignored by CVS.
+
+2001-10-10 Wednesday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* mkinstalldirs (1.2): $Id tag removed.
+
+2001-10-10 Wednesday 21:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.1.1.1), AUTHORS (1.1.1.1), COPYING (1.1.1.1),
+	  ChangeLog (1.1.1.1), INSTALL (1.1.1.1), Makefile.am (1.1.1.1),
+	  Makefile.in (1.1.1.1), NEWS (1.1.1.1), README (1.1.1.1), TODO
+	  (1.1.1.1), acconfig.h (1.1.1.1), aclocal.m4 (1.1.1.1),
+	  config.guess (1.1.1.1), config.h.in (1.1.1.1), config.sub
+	  (1.1.1.1), configure (1.1.1.1), configure.in (1.1.1.1), depcomp
+	  (1.1.1.1), install-sh (1.1.1.1), missing (1.1.1.1), mkinstalldirs
+	  (1.1.1.1), ppl.lsm.in (1.1.1.1), ppl.spec.in (1.1.1.1),
+	  stamp-h.in (1.1.1.1), doc/Makefile.am (1.1.1.1), doc/Makefile.in
+	  (1.1.1.1), doc/Polyhedra.texinfo (1.1.1.1), doc/definitions.dox
+	  (1.1.1.1), doc/devref.doxyconf-html.in (1.1.1.1),
+	  doc/devref.doxyconf-pdf.in (1.1.1.1), doc/devref.tex (1.1.1.1),
+	  doc/gfdl.dox (1.1.1.1), doc/gpl.dox (1.1.1.1), doc/gpl.texi
+	  (1.1.1.1), doc/gpl.texinfo (1.1.1.1), doc/texinfo.tex (1.1.1.1),
+	  doc/user.doxyconf-html.in (1.1.1.1), doc/user.doxyconf-pdf.in
+	  (1.1.1.1), doc/user.tex (1.1.1.1), src/ConSys.cc (1.1.1.1),
+	  src/ConSys.defs.hh (1.1.1.1), src/ConSys.inlines.hh (1.1.1.1),
+	  src/ConSys.types.hh (1.1.1.1), src/Constraint.cc (1.1.1.1),
+	  src/Constraint.defs.hh (1.1.1.1), src/Constraint.inlines.hh
+	  (1.1.1.1), src/Constraint.types.hh (1.1.1.1), src/GenSys.cc
+	  (1.1.1.1), src/GenSys.defs.hh (1.1.1.1), src/GenSys.inlines.hh
+	  (1.1.1.1), src/GenSys.types.hh (1.1.1.1), src/Generator.cc
+	  (1.1.1.1), src/Generator.defs.hh (1.1.1.1),
+	  src/Generator.inlines.hh (1.1.1.1), src/Generator.types.hh
+	  (1.1.1.1), src/LinExpression.cc (1.1.1.1),
+	  src/LinExpression.defs.hh (1.1.1.1), src/LinExpression.inlines.hh
+	  (1.1.1.1), src/LinExpression.types.hh (1.1.1.1), src/Makefile.am
+	  (1.1.1.1), src/Makefile.in (1.1.1.1), src/Matrix.cc (1.1.1.1),
+	  src/Matrix.defs.hh (1.1.1.1), src/Matrix.inlines.hh (1.1.1.1),
+	  src/Matrix.types.hh (1.1.1.1), src/Polyhedron.cc (1.1.1.1),
+	  src/Polyhedron.defs.hh (1.1.1.1), src/Polyhedron.inlines.hh
+	  (1.1.1.1), src/Polyhedron.types.hh (1.1.1.1), src/Row.cc
+	  (1.1.1.1), src/Row.defs.hh (1.1.1.1), src/Row.inlines.hh
+	  (1.1.1.1), src/Row.types.hh (1.1.1.1), src/SatMatrix.cc
+	  (1.1.1.1), src/SatMatrix.defs.hh (1.1.1.1),
+	  src/SatMatrix.inlines.hh (1.1.1.1), src/SatMatrix.types.hh
+	  (1.1.1.1), src/SatRow.cc (1.1.1.1), src/SatRow.defs.hh (1.1.1.1),
+	  src/SatRow.inlines.hh (1.1.1.1), src/SatRow.types.hh (1.1.1.1),
+	  src/Status.cc (1.1.1.1), src/Status.defs.hh (1.1.1.1),
+	  src/Status.inlines.hh (1.1.1.1), src/Status.types.hh (1.1.1.1),
+	  src/Variable.cc (1.1.1.1), src/Variable.defs.hh (1.1.1.1),
+	  src/Variable.inlines.hh (1.1.1.1), src/Variable.types.hh
+	  (1.1.1.1), src/conversion.cc (1.1.1.1), src/globals.cc (1.1.1.1),
+	  src/globals.hh (1.1.1.1), src/maxmin.hh (1.1.1.1),
+	  src/minimize.cc (1.1.1.1), src/ppl.cc (1.1.1.1), src/protect.sed
+	  (1.1.1.1), src/restore.sed (1.1.1.1), src/simplify.cc (1.1.1.1):
+	  Imported into the new repository.
+
+2001-10-10 Wednesday 21:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.1), AUTHORS (1.1), COPYING (1.1), ChangeLog (1.1),
+	  INSTALL (1.1), Makefile.am (1.1), Makefile.in (1.1), NEWS (1.1),
+	  README (1.1), TODO (1.1), acconfig.h (1.1), aclocal.m4 (1.1),
+	  config.guess (1.1), config.h.in (1.1), config.sub (1.1),
+	  configure (1.1), configure.in (1.1), depcomp (1.1), install-sh
+	  (1.1), missing (1.1), mkinstalldirs (1.1), ppl.lsm.in (1.1),
+	  ppl.spec.in (1.1), stamp-h.in (1.1), doc/Makefile.am (1.1),
+	  doc/Makefile.in (1.1), doc/Polyhedra.texinfo (1.1),
+	  doc/definitions.dox (1.1), doc/devref.doxyconf-html.in (1.1),
+	  doc/devref.doxyconf-pdf.in (1.1), doc/devref.tex (1.1),
+	  doc/gfdl.dox (1.1), doc/gpl.dox (1.1), doc/gpl.texi (1.1),
+	  doc/gpl.texinfo (1.1), doc/texinfo.tex (1.1),
+	  doc/user.doxyconf-html.in (1.1), doc/user.doxyconf-pdf.in (1.1),
+	  doc/user.tex (1.1), src/ConSys.cc (1.1), src/ConSys.defs.hh
+	  (1.1), src/ConSys.inlines.hh (1.1), src/ConSys.types.hh (1.1),
+	  src/Constraint.cc (1.1), src/Constraint.defs.hh (1.1),
+	  src/Constraint.inlines.hh (1.1), src/Constraint.types.hh (1.1),
+	  src/GenSys.cc (1.1), src/GenSys.defs.hh (1.1),
+	  src/GenSys.inlines.hh (1.1), src/GenSys.types.hh (1.1),
+	  src/Generator.cc (1.1), src/Generator.defs.hh (1.1),
+	  src/Generator.inlines.hh (1.1), src/Generator.types.hh (1.1),
+	  src/LinExpression.cc (1.1), src/LinExpression.defs.hh (1.1),
+	  src/LinExpression.inlines.hh (1.1), src/LinExpression.types.hh
+	  (1.1), src/Makefile.am (1.1), src/Makefile.in (1.1),
+	  src/Matrix.cc (1.1), src/Matrix.defs.hh (1.1),
+	  src/Matrix.inlines.hh (1.1), src/Matrix.types.hh (1.1),
+	  src/Polyhedron.cc (1.1), src/Polyhedron.defs.hh (1.1),
+	  src/Polyhedron.inlines.hh (1.1), src/Polyhedron.types.hh (1.1),
+	  src/Row.cc (1.1), src/Row.defs.hh (1.1), src/Row.inlines.hh
+	  (1.1), src/Row.types.hh (1.1), src/SatMatrix.cc (1.1),
+	  src/SatMatrix.defs.hh (1.1), src/SatMatrix.inlines.hh (1.1),
+	  src/SatMatrix.types.hh (1.1), src/SatRow.cc (1.1),
+	  src/SatRow.defs.hh (1.1), src/SatRow.inlines.hh (1.1),
+	  src/SatRow.types.hh (1.1), src/Status.cc (1.1),
+	  src/Status.defs.hh (1.1), src/Status.inlines.hh (1.1),
+	  src/Status.types.hh (1.1), src/Variable.cc (1.1),
+	  src/Variable.defs.hh (1.1), src/Variable.inlines.hh (1.1),
+	  src/Variable.types.hh (1.1), src/conversion.cc (1.1),
+	  src/globals.cc (1.1), src/globals.hh (1.1), src/maxmin.hh (1.1),
+	  src/minimize.cc (1.1), src/ppl.cc (1.1), src/protect.sed (1.1),
+	  src/restore.sed (1.1), src/simplify.cc (1.1): Initial revision
+
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..56b077d
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,236 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
+Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+Some systems require unusual options for compilation or linking that the
+`configure' script does not know about.  Run `./configure --help' for
+details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory.  After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PREFIX'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PREFIX', the package will
+use PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+There may be some features `configure' cannot figure out automatically,
+but needs to determine by the type of machine the package will run on.
+Usually, assuming the package is built to be run on the _same_
+architectures, `configure' can figure that out, but if it prints a
+message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+If you want to set default values for `configure' scripts to share, you
+can create a site shell script called `config.site' that gives default
+values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).  Here is a another example:
+
+     /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
+configuration-related scripts to be executed by `/bin/bash'.
+
+`configure' Invocation
+======================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+     Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..9d7560e
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,42 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+# Tell aclocal where to find `.m4' files.
+ACLOCAL_AMFLAGS = -I m4
+
+DISTCHECK_CONFIGURE_FLAGS = \
+--enable-shared --enable-watchdog
+
+dist_noinst_SCRIPTS = \
+configure
+
+dist_noinst_HEADERS = \
+instchk.hh
+
+EXTRA_DIST = \
+ppl.lsm.in \
+ppl.spec.in \
+BUGS CREDITS README.configure STANDARDS
+
+ at SET_MAKE@
+
+SUBDIRS = utils src Watchdog tests interfaces demos doc m4 debian
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..0bfb79b
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,767 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = README $(am__configure_deps) $(dist_noinst_HEADERS) \
+	$(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
+	$(srcdir)/ppl.lsm.in $(srcdir)/ppl.spec.in \
+	$(top_srcdir)/configure COPYING ChangeLog INSTALL NEWS TODO \
+	compile config.guess config.rpath config.sub depcomp \
+	install-sh ltmain.sh missing mkinstalldirs
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = ppl.lsm ppl.spec
+SCRIPTS = $(dist_noinst_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+HEADERS = $(dist_noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d $(distdir) \
+    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+
+# Tell aclocal where to find `.m4' files.
+ACLOCAL_AMFLAGS = -I m4
+DISTCHECK_CONFIGURE_FLAGS = \
+--enable-shared --enable-watchdog
+
+dist_noinst_SCRIPTS = \
+configure
+
+dist_noinst_HEADERS = \
+instchk.hh
+
+EXTRA_DIST = \
+ppl.lsm.in \
+ppl.spec.in \
+BUGS CREDITS README.configure STANDARDS
+
+SUBDIRS = utils src Watchdog tests interfaces demos doc m4 debian
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+	      cd $(srcdir) && $(AUTOMAKE) --foreign  \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+	@if test ! -f $@; then \
+	  rm -f stamp-h1; \
+	  $(MAKE) stamp-h1; \
+	else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in:  $(am__configure_deps) 
+	cd $(top_srcdir) && $(AUTOHEADER)
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+ppl.lsm: $(top_builddir)/config.status $(srcdir)/ppl.lsm.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+ppl.spec: $(top_builddir)/config.status $(srcdir)/ppl.spec.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	mkdir $(distdir)
+	$(mkdir_p) $(distdir)/. $(distdir)/debian $(distdir)/doc $(distdir)/interfaces/C $(distdir)/m4 $(distdir)/src
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r $(distdir)
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && cd $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+	@cd $(distuninstallcheck_dir) \
+	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(SCRIPTS) $(HEADERS) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+	distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+	check-am clean clean-generic clean-libtool clean-recursive \
+	ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
+	dist-shar dist-tarZ dist-zip distcheck distclean \
+	distclean-generic distclean-hdr distclean-libtool \
+	distclean-recursive distclean-tags distcleancheck distdir \
+	distuninstallcheck dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	maintainer-clean-recursive mostlyclean mostlyclean-generic \
+	mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am uninstall-info-am
+
+
+ at SET_MAKE@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..83d1966
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,1116 @@
+
+Parma Polyhedra Library NEWS -- history of user-visible changes
+===============================================================
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.9  (released on March 12, 2006)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  The class Grid provides a complete implementation of the relational
+   domain of rational grids.  This can represent all sets that can
+   be expressed by the conjunction of a finite number of congruence
+   equations.  Operations provided include everything that is needed
+   in the field of static analysis and verification, including affine
+   images, preimages and their generalizations, grid-difference and
+   widening operators.  This is the first time such a complete domain
+   is made freely available to the community.
+
+o  Several important portability improvements.  Among other things,
+   it is now possible to build only the static libraries or only
+   the shared libraries.  (Notice that some interfaces depend on
+   the availability of the shared libraries: these will not be built
+   when shared libraries are disabled.)
+
+
+Bugfixes
+========
+
+o  Fixed a bug whereby the SICStus Prolog interface could not be built
+   on x86_64.
+
+o  Fixed a bug in an internal method that, under some circumstances,
+   could cause a wrong result to be computed.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.8  (released on January 20, 2006)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  The class template BD_Shape<T> provides an implementation of the
+   abstract domain of bounded difference shapes. The template type
+   parameter T specifies the basic type used for the inhomogeneous term
+   of bounded difference constraints; it can be instantiated to either
+   GMP's unbounded precision types (mpq_class, mpz_class), native
+   floating point types (float, double), or native integer types
+   (8, 16, 32 and 64 bits wide).
+
+o  New class LP_Problem provides an implementation of the
+   primal simplex algorithm using exact arithmetic.
+
+o  The new program `ppl-config' returns information about the
+   configuration and the installed components of the PPL.
+   This greatly simplifies the task of writing makefiles and
+   automatic configuration scripts.  A manual page for `ppl-config'
+   has also been added.
+
+o  New Autoconf function
+
+     AM_PATH_PPL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+
+   allows to test the existence and usability of particular versions of the
+   PPL, defining macros containing the required paths.  The simple addition
+   of, e.g.,
+
+     AM_PATH_PPL(0.8)
+
+   to an application's configure.ac file is all that is needed in most
+   cases.  Paths to the installed version of the PPL will be detected,
+   the version number will be checked to be at least the one
+   indicated, the variables PPL_CPPFLAGS and PPL_LDFLAGS will be set
+   accordingly and a quick sanity check of the PPL installation will
+   be performed.  For more complex tasks, the AM_PATH_PPL function
+   defines the `--with-ppl-prefix' and `--with-ppl-exec-prefix'
+   configure options (useful when the PPL is installed into a
+   non-standard place or when multiple versions of the PPL are
+   installed).  AM_PATH_PPL also defines the `--disable-ppltest'
+   configure option to disable the quick sanity check.  When something
+   fails, AM_PATH_PPL provides accurate indications about what went
+   wrong and how to fix it.  See the sources in m4/ppl.m4 for more
+   information.
+
+o  The browse and print versions of the PS and PDF formats of the user
+   manual have been merged into single documents: ppl-user-0.8.pdf and
+   ppl-user-0.8.ps.gz.  The equivalent developer reference documents
+   have also been merged.
+
+o  One of the possible values for the configuration option
+   `--enable-coefficients' has been renamed from `gmp' to `mpz'.
+
+o  New configuration option `--enable-interfaces' allows some or all of
+   the Prolog and C interfaces to be selectively enabled.
+
+o  Portability has been further improved.
+
+o  Added to C_Polyhedron (resp., NNC_Polyhedron) new method
+
+     bool poly_hull_assign_if_exact(const C_Polyhedron&)
+
+   (resp. bool poly_hull_assign_if_exact(const NNC_Polyhedron&))
+   and its synonym
+
+     bool upper_bound_assign_if_exact(const C_Polyhedron&)
+
+   (resp. bool upper_bound_assign_if_exact(const NNC_Polyhedron&)).
+
+o  Added new typedef `element_type' to template Polyhedra_Powerset,
+   which corresponds to the type of the underlying numeric domain.
+
+o  Output operators have been added for Generator::Type and
+   Constraint::Type.
+
+o  Class Bounding_Box has new method
+
+     Constraint_System Bounding_Box::constraints() const,
+
+   which returns the system of constraints.
+
+o  Class Bounding_Box has new widening methods
+
+     Bounding_Box::CC76_widening_assign(const Bounding_Box& y)
+
+   and
+
+     template <typename Iterator>
+     Bounding_Box::CC76_widening_assign(const Bounding_Box& y,
+                                        Iterator first,
+                                        Iterator last).
+
+o  All methods in class Determinate that are specific to the Polyhedra
+   template parameter have been dropped.  If needed, they can still be
+   invoked through element().
+
+o  Method
+
+     bool Constraint_System::has_strict_inequalities() const
+
+   is now publicly accessible.
+
+o  Added Polyhedron methods difference_assign() and join_assign(),
+   behaving as poly_difference_assign() and poly_hull_assign(),
+   so as to have more uniform interfaces.
+
+o  The helper function widen_fun_ref() building a limited widening
+   function is now templatic even on the second argument (i.e., the
+   limiting constraint system). The templatic widening method
+
+     Polyhedra_Powerset<PH>::BHZ03_widening_assign()
+
+   no longer has a default value for the certificate parameter.
+
+o  The signatures of Polyhedron methods maximize() and minimize()
+   have been greatly simplified.
+
+o  The function template
+
+     template <typename PH>
+     bool check_containment(const PH&, const Polyhedra_Powerset<PH>&)
+
+   now works whenever there exists a lossless conversion mapping an
+   object of type PH into an NNC_Polyhedron (e.g., when PH = BD_Shape).
+   The same holds for methods
+
+     bool Polyhedra_Powerset<PH>::geometrically_covers()
+
+   and
+
+     bool Polyhedra_Powerset<PH>::geometrically_equals().
+
+o  Disjuncts can be added to an instance of Polyhedra_Powerset with
+   the new method
+
+     void add_disjunct(const PH& ph).
+
+o  The two generalized_affine_image() methods of class Polyhedron
+   are now matched by corresponding methods for computing preimages
+   of affine relations.
+
+o  Added to class Polyhedron the method
+
+     void bounded_affine_image(Variable v,
+                               const Linear_Expression& lb,
+                               const Linear_Expression& ub,
+                               Coefficient_traits::const_reference d
+                                 = Coefficient_one())
+
+   computing the image of the polyhedron according to the
+   transfer relation lb/d <= v' <= ub/d.
+   Also added the corresponding method for computing preimages.
+
+o  The enumeration
+
+     Polyhedron::Degenerate_Kind
+
+   has been placed outside of class Polyhedron and renamed as
+
+     Degenerate_Element.
+
+o  New output operators in namespace IO_Operators:
+
+     std::ostream& operator<<(std::ostream&, const Constraint::Type&)
+
+   and
+
+     std::ostream& operator<<(std::ostream&, const Generator::Type&).
+
+o  Added to class Constraint the methods
+
+     bool is_tautological() const
+
+   and
+
+     bool is_inconsistent() const
+
+   returning true when the constraint is always or never satisfied,
+   respectively.
+
+o  Added to classes Constraint (resp., Generator) the method
+
+     bool is_equivalent_to(const Constraint& y) const
+
+   (resp., bool is_equivalent_to(const Generator& y) const)
+   which check for semantic equivalence of corresponding class
+   instances.  Also made available the (semantic) comparison operators
+   `==' and `!='.
+
+o  The swap() methods of classes Linear_Expression, Constraint, Generator,
+   Constraint_System and Generator_System are now publicly accessible.
+
+o  Added to classes Constraint and Generator the methods
+
+     void ascii_dump(std::ostream& s) const
+
+   and
+
+     void ascii_load(std::istream& s) const.
+
+o  In classes Poly_Con_Relation and Poly_Gen_Relation the methods
+
+     void ascii_dump(std::ostream& s) const
+
+   and
+
+     void ascii_load(std::istream& s) const
+
+   are now publicly accessible.
+
+o  All classes which provide the method
+
+     void ascii_dump(std::ostream& s) const
+
+   now also provide the methods
+
+     void ascii_dump() const
+
+   and
+
+     void print() const.
+
+   These methods print to std::cerr the textual and user-level
+   representation (resp.) of the given object.  This enables the
+   output of such object representations in GDB.
+
+o  New functions added to the C interface:
+
+     int ppl_Coefficient_is_bounded(void),
+     int ppl_Coefficient_min(mpz_t min),
+     int ppl_Coefficient_max(mpz_t max)
+
+   allow C applications to obtain information about the Coefficient
+   integer numerical type.
+
+   The new Prolog interface predicates ppl_Coeffient_is_bounded/0,
+   ppl_Coefficient_max/1 and ppl_Coefficient_min/1 provide the same
+   functionality.
+
+o  All predicates in the Prolog interface that require an input list
+   as an argument will now throw an exception if that argument is not
+   a list.  Before, some predicates, such as
+   ppl_Polyhedron_remove_space_dimensions/2, would fail.
+
+o  In the Prolog interface, the names and arities of the "with_token"
+   widening and extrapolation predicates have been revised to
+   "with_tokens" with an extra argument and the functionality has been
+   revised to match more closely the corresponding C++ interface
+   operators.
+
+o  In the Prolog interface, the names and arities of the predicates
+   that create handles for new polyhedra have been revised to match
+   more closely the corresponding C and C++ interface operators.  That
+   is, instead of having "c" and/or "nnc" as arguments to indicate the
+   topology of the polyhedron, the topologies are now part of the
+   names of the predicates.
+
+o  The SWI-Prolog interface allows now the exchange of unbounded numbers
+   between the PPL and Prolog applications.  This requires SWI-Prolog
+   version 5.6.0 or later version.  Previous versions of SWI-Prolog
+   are no longer supported.
+
+o  The YAP interface allows now the exchange of unbounded numbers
+   between the PPL and Prolog applications.  This requires YAP
+   version 5.1.0 or later version.  Previous versions of YAP
+   are no longer supported.
+
+o  The `ppl_lpsol' demo has now two more options: with `--enumerate' it
+   solves the given linear programming problem by vertex/point
+   enumeration; with `--simplex' (the default) it uses our simplex
+   implementation with exact arithmetic.  The `ppl_lpsol' program,
+   which is only built if a suitable version of GLPK is available, is
+   installed into the directory (selectable at configuration time) for
+   user executables.
+
+o  Manual pages have been added for the ppl_lpsol and ppl_lcdd
+   programs.
+
+o  The new class BD_Shape<T> as well as the "checked" native
+   coefficients selectable with the `--enable-coefficients' configure
+   options, are based on a very general and powerful notion of "number
+   family with a policy".  This is made available to the users of the
+   PPL via the wrapper template class Checked_Number<T, P>, where T is
+   the underlying numeric type (native integer or float of any width,
+   unbounded integer or rational) and `P' is a policy specifying
+   things such as whether to check for overflows and other
+   "exceptional" conditions and what to do in such cases.  The policy
+   also specifies whether T should be extended with representations
+   for infinities or NAN (Not A Number) and default rounding modes.
+   A complete set of arithmetic functions and operators are provided:
+   they either use the default rounding mode or accept a rounding mode
+   as an extra parameter and, depending on the policy, may return a result
+   that indicates the relation that exists between the true mathematical
+   result and the (possibly approximate) computed result. Input/output
+   functions with the same properties (controlled rounding and indications
+   of the approximations) are also provided.
+
+
+Bugfixes
+========
+
+o  Fixed a bug in Polyhedra_Powerset<PH>::concatenate_assign() whereby
+   a temporary Polyhedra_Powerset object was created with the wrong
+   dimension.
+
+o  Corrected a memory leak bug in the demo ppl_lpsol.
+
+o  Corrected a bug in method
+
+     NNC_Polyhedron::minimized_constraints()
+
+   whereby an internal assertion might have been violated.
+
+o  Fixed a bug whereby calling the methods
+
+     Polyhedron::generalized_affine_image()
+
+   on an empty polyhedron could have resulted in an exception thrown.
+
+o  Fixed a bug whereby the occurrence of an `out of memory' error during
+   the allocation of a row of integer coefficients could have resulted
+   in a memory leak.
+
+o  Fixed a bug affecting the specialized constructors
+
+     Polyhedra_Powerset<NNC_Polyhedron>::
+     Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
+
+   and
+
+     Polyhedra_Powerset<C_Polyhedron>::
+     Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
+
+   whereby the newly built Polyhedra_Powerset object could have been
+   flagged as non-redundant even though it was containing redundant
+   disjuncts. Fixed a similar bug in generic constructor
+
+     Polyhedra_Powerset(const Constraint_System& cs)
+
+   that manifests when `cs' is denoting an empty polyhedron.
+
+--------------------------------------------------------------------------
+NEWS for version 0.7  (released on December 24, 2004)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  The new configuration option `--enable-coefficients' allows for the
+   use of alternative (integral) coefficient types.  Besides GMP
+   integers, the user can now use checked native integers (8, 16, 32
+   or 64 bits wide).  The use of such native coefficients is
+   completely safe, since systematic (yet efficient) overflow
+   detection is performed and, in case of overflow, an exception is
+   raised.  GMP coefficients are used by default.
+
+o  Significant efficiency improvements have been achieved everywhere.
+
+o  We now require GMP 4.1.3 or higher.
+
+o  The following classes have been renamed as indicated:
+
+     AskTell            -> Ask_Tell
+     BoundingBox        -> Bounding_Box
+     ConSys             -> Constraint_System
+     GenSys             -> Generator_System
+     Integer            -> Coefficient
+     LinExpression      -> Linear_Expression
+     Polyhedra_PowerSet -> Polyhedra_Powerset
+     PowerSet           -> Powerset
+     SatMatrix          -> Saturation_Matrix
+     SatRow             -> Saturation_Row
+
+o  The helper function `widen_fun' has been renamed `widen_fun_ref'.
+
+o  New assignment operators allowing to obtain an NNC_Polyhedron from a
+   C_Polyhedron and the other way around.  In the latter case, the
+   topological closure of the argument polyhedron is computed.
+
+o  New explicit constructors and assignment operators allowing to obtain a
+   Polyhedra_Powerset<NNC_Polyhedron> from a Polyhedra_Powerset<C_Polyhedron>
+   and the other way around.  In the latter case, the topological closure
+   of the element polyhedra is computed.
+
+o  New explicit constructor Powerset<CS>::Powerset(const CS& d):  if `d'
+   is not bottom, builds a powerset containing only `d';  builds the empty
+   powerset otherwise.
+
+o  New explicit constructor
+   Polyhedra_Powerset<CS>::Polyhedra_Powerset(const PH& ph):  if `ph' is
+   not empty, builds a powerset containing only `ph';  builds the empty
+   powerset otherwise.
+
+o  New method
+
+     Polyhedra_Powerset::poly_difference_assign(const Polyhedra_Powerset& y)
+
+   assigns to `*this' the poly-difference of `*this' and `y'.
+
+o  All the public classes of the library have been endowed with methods
+
+     memory_size_type total_memory_in_bytes() const
+
+   and
+
+     memory_size_type external_memory_in_bytes() const
+
+   returning (lower bounds for) the total size in bytes of the memory
+   occupied by *this and of the memory managed by *this, respectively.
+   The type `memory_size_type' is a newly added unsigned integral type
+   suitable to the representation of such information.
+
+o  New method dimension_type Polyhedron::affine_dimension() returns
+   the affine dimension of *this (not to be confused with the dimension
+   of its enclosing vector space) or 0, if *this is empty.
+
+o  All the methods changing (i.e., adding, removing, mapping, etc.)
+   the dimensions of the vector space have been renamed so as to avoid
+   any possible ambiguity with the affine dimension of the modified object.
+   For instance,
+
+     Polyhedron::add_dimensions_and_embed(dimension_type m);
+
+   has been renamed as
+
+     Polyhedron::add_space_dimensions_and_embed(dimension_type m);
+
+o  The constructor C_Polyhedron(const NNC_Polyhedron& y) no longer
+   throws an exception if `y' is not topologically closed.  Rather,
+   it constructs a C_Polyhedron representing the topological closure
+   of `y'.
+
+o  The following constructors have been made explicit:
+
+     Constraint_System::Constraint_System(const Constraint& c),
+     Generator_System::Generator_System(const Generator& g),
+     C_Polyhedron::C_Polyhedron(const Constraint_System& cs),
+     C_Polyhedron::C_Polyhedron(const Generator_System& cs),
+     C_Polyhedron::C_Polyhedron(Constraint_System& cs),
+     C_Polyhedron::C_Polyhedron(Generator_System& cs),
+     NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs),
+     NNC_Polyhedron::NNC_Polyhedron(const Generator_System& cs),
+     NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs),
+     NNC_Polyhedron::NNC_Polyhedron(Generator_System& cs).
+     Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Constraint_System& cs).
+
+o  Functions in the C interface that compute (space) dimensions
+   no longer return their result.  The caller is now required to pass,
+   as an extra argument, a pointer to a memory area where the result
+   will be written.  All the C interface functions now use the return
+   value to signal the success or failure of the requested operation.
+
+o  Now `make check' runs a number of tests with `ppl_lcdd', comparing
+   the results to expected ones.
+
+o  The `ppl_lcdd' demo is now able to parse problems produced by lrs,
+   i.e., where the number of rows of the matrix is omitted and replaced
+   by "*****" (five asterisks).
+
+o  The enumeration values of enum Complexity_Class have been renamed
+   POLYNOMIAL_COMPLEXITY, SIMPLEX_COMPLEXITY and ANY_COMPLEXITY.
+
+o  In the Prolog interface, the predicates
+   ppl_new_polyhedron_from_dimension/3 and
+   ppl_new_polyhedron_empty_from_dimension/3 have been replaced by a
+   single predicate ppl_new_polyhedron_from_space_dimension/4 where
+   the (extra) third argument indicates whether the polyhedron to be
+   created should be the universe or the empty polyhedron.
+
+o  As the unary plus operator is not in standard Prolog, '+'/1 in linear
+   expressions is no longer supported by the Prolog interface.
+
+
+Bugfixes
+========
+
+o  Fixed a bug that was causing an unwanted exception to be thrown
+   when adding to a C_Polyhedron some generators obtained from an
+   NNC_Polyhedron (even though no closure point was being added).
+
+o  Fixed a bug in the handling of empty generator systems having
+   a strictly positive space dimension.
+
+o  Fixed a bug that was affecting Polyhedra_PowerSet::geometrically_covers()
+   and Polyhedra_PowerSet::geometrically_equals().
+
+o  Method C_Polyhedron::H79_widening_assign() now widens the polyhedron
+   itself instead of the homogenized polyhedral cone representing it.
+
+o  Fixed a bug that was affecting Polyhedron::H79_widening_assign()
+   as well as all the limited and bounded extrapolation operators.
+
+o  Fixed a bug in Polyhedron::map_space_dimensions() that could manifest
+   itself when used with a partial function encoding permutation.
+
+o  Fixed a bug in the C interface function
+   ppl_new_Linear_Expression_with_dimension().
+
+o  Fixed a bug in the `ppl_lpsol' demo.
+
+o  Fixed a bug in Polyhedron::is_universe() that could manifest itself
+   when the polyhedron is described by a generator system that is
+   not in minimal form.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.6.1  (released on August 20, 2004)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  Some packaging issues have been fixed.
+
+o  The documentation has been completed and improved.
+
+o  The methods
+
+     Polyhedra_PowerSet::semantically_contains(const Polyhedra_PowerSet&) and
+     Polyhedra_PowerSet::semantically_equals(const Polyhedra_PowerSet&)
+
+   have been renamed
+
+     Polyhedra_PowerSet::geometrically_covers(const Polyhedra_PowerSet&) and
+     Polyhedra_PowerSet::geometrically_equals(const Polyhedra_PowerSet& y),
+
+   respectively.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.6  (released on August 18, 2004)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  New templatic classes Determinate, PowerSet, and Polyhedra_PowerSet.
+   The first two classes realize, in a completely generic way, the
+   determinate and powerset constructions described by Roberto Bagnara
+   in his 1998, Science of Computer Programming paper.  The third class
+   is a specialization of the powerset construction on polyhedra.
+   The powerset construction comes with the generic widening technique
+   proposed by Roberto Bagnara, Patricia Hill and Enea Zaffanella
+   in their VMCAI 2004 paper.  Actually, the Polyhedra_PowerSet class
+   provides the first genuine, non-trivial widening ever proposed
+   (let alone made available) on a domain of sets of convex polyhedra.
+
+o  New methods
+
+     void Polyhedron::expand_dimension(Variable, dimension_type) and
+     void Polyhedron::fold_dimensions(const Variables_Set&, Variable)
+
+   allow the easy realization of summary dimensions as proposed
+   by Denis Gopan and colleagues in their TACAS 2004 paper.
+
+o  A new `demos' directory has been added.  In the `ppl_lcdd'
+   subdirectory, this contains a sort of clone of the cddlib test
+   program `lcdd', written using the PPL's C++ interface, together
+   with several example polyhedra in the formats that the program can
+   handle.  The `ppl_lpsol' subdirectory contains another demo program
+   that solves linear programming problems by vertex/point
+   enumeration.  This is written using the PPL's C interface and comes
+   with several example problems in the Mathematical Programming
+   System (MPS) format.  In order to read MPS files, `ppl_lpsol' uses
+   the GNU Linear Programming Kit (GLPK); thus `ppl_lpsol' is only compiled
+   if a suitable version of GLPK is available.
+
+o  New macro PPL_VERSION expands to the version string of the library.
+
+o  New file README.configure provides additional information about
+   the configuration and compilation of the library.
+
+o  The documentation has been improved in various ways.
+
+o  The documentation for users, in PostScript, PDF and HTML formats,
+   is now installed in a standard place by `make install'.
+
+o  The variable `abandon_exponential_computations' has been renamed
+   `abandon_expensive_computations'.
+
+o  The methods
+
+     void Polyhedron::add_constraints(ConSys& cs),
+     void Polyhedron::add_generators(GenSys& gs),
+     bool Polyhedron::add_constraints_and_minimize(ConSys& cs), and
+     bool Polyhedron::add_generators_and_minimize(GenSys& gs)
+
+   have been renamed
+
+     void Polyhedron::add_recycled_constraints(ConSys& cs),
+     void Polyhedron::add_recycled_generators(GenSys& gs),
+     bool Polyhedron::add_recycled_constraints_and_minimize(ConSys& cs), and
+     bool Polyhedron::add_recycled_generators_and_minimize(GenSys& gs),
+
+   respectively.  At the same time, the methods
+
+     void Polyhedron::add_constraints(const ConSys& cs),
+     void Polyhedron::add_generators(const GenSys& gs),
+     bool Polyhedron::add_constraints_and_minimize(const ConSys& cs), and
+     bool Polyhedron::add_generators_and_minimize(const GenSys& gs)
+
+   have been added.  Corresponding changes have been made to the C and
+   Prolog interfaces.
+
+o  New methods Polyhedron::maximize() and Polyhedron::minimize()
+   for maximizing and minimizing a linear expression subject to the
+   polyhedron.
+
+o  New output operator in namespace IO_Operators:
+   std::ostream& operator<<(std::ostream&, const LinExpression&).
+
+o  The method Polyhedron::map_dimensions(const PartialFunction& pfunc)
+   has been significantly optimized for the case when `pfunc' is a
+   permutation.  A simple "renaming" of the dimensions is now
+   extremely cheap.
+
+o  The function Parma_Polyhedra_Library::max_space_dimension() has been
+   given a new semantics and destiny: it returns the maximum space
+   dimension that _all_ the abstractions provided by the library can
+   handle.  Each individual abstraction provides its versions of this
+   function.  Thus, e.g., NNC_Polyhedron::max_space_dimension()
+   gives the maximum space dimensions an NNC_Polyhedron can handle.
+
+o  The type of output functions for the class Variable,
+   `Variable::Output_Function_Type', has been renamed
+   `Variable::output_function_type' and is now defined as
+   void output_function_type(std::ostream& s, const Variable& v).
+   In other words, `v' is now passed by const reference and not by value.
+
+o  Thanks to Bruno Haible, it is now possible to use versions of the
+   GMP library installed into nonstandard places.  The new configure
+   options --with-libgmp-prefix[=DIR] and --with-libgmpxx-prefix[=DIR]
+   substitute the old (and not really working) options
+   --with-gmp-includes=DIR and --with-gmp-dir=DIR.
+
+
+Bugfixes
+========
+
+o  Fixed a bug in the C interface function ppl_Polyhedron_map_dimensions()
+   whereby a wrong result was computed.
+
+o  Fixed a bug in Polyhedron::poly_difference_assign(const Polyhedron&)
+   whereby a wrong result was computed.
+
+o  Fixed a bug in the Prolog interface predicate
+   ppl_Polyhedron_get_bounding_box/3 whereby a wrong result was
+   sometimes computed in the case of an empty polyhedron.
+
+o  Fixed a bug in the Prolog interface predicate
+   ppl_new_Polyhedron_from_bounding_box/3 whereby the predicate was
+   failing when given an empty bounding box.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.5  (released on April 28, 2003)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  New methods Polyhedron::BHRZ03_widening_assign() and
+   Polyhedron::BHRZ03_limited_extrapolation_assign().  The BHRZ03 widening
+   is a novel widening that is always more precise than the one, by now
+   standard, we call H79.
+
+o  The novel "widening with tokens" technique improves on the good old
+   widening delay technique by refraining from widening only when
+   necessary.  Precision is thus increased still guaranteeing
+   convergence.  All widening operators can now be supplied with an
+   optional argument, recording the number of available tokens, which
+   is decremented when tokens are used.
+
+o  Two new methods have been defined that compute the image of
+   a polyhedron under an affine relation. The first method,
+   Polyhedron::generalized_affine_image(var, relsym, expr, denom),
+   generalizes the classical Polyhedron::affine_image() method by allowing
+   `relsym' to denote any of the relations <, <=, =, >=, >.
+   The second method, Polyhedron::generalized_affine_image(lhs, relsym, rhs),
+   is a variant where an arbitrary linear expression `lhs' is allowed to
+   occur on the left-hand side of the affine relation.
+
+o  New constructors to build polyhedra from read-only constraint and
+   generator systems: C_Polyhedron(const ConSys&),
+   C_Polyhedron(const GenSys&), NNC_Polyhedron(const ConSys&), and
+   NNC_Polyhedron(const GenSys&).  In the C interface the functions
+   taking non-const arguments named ppl_new_<T>_from_<S> have been
+   renamed ppl_new_<T>_recycle_<S>, where <T> is either "C" or "NNC",
+   and <S> is either "ConSys" or "GenSys".  The old names have been
+   given to the new const functions.
+
+o  New function LinExpression& operator*=(LinExpression&, const Integer&)
+   to multiply (in place) an expression by a scalar.
+
+o  The methods Polyhedron::check_empty() and Polyhedron::check_universe()
+   have been renamed is_empty() and is_universe(), respectively.
+
+o  New method bool Polyhedron::is_disjoint_from(const Polyhedron& y)
+   returning true if and only `*this' and `y' are disjoint.
+
+o  New methods bool Polyhedron::add_constraint_and_minimize(const
+   Constraint&) and bool Polyhedron::add_generator_and_minimize(const
+   Generator&) to add a constraint or a generator and minimizing the
+   result at the same time.
+
+o  New method: template <typename PartialFunction>
+   void Polyhedron::map_dimensions(const PartialFunction&).
+   This allows to rename the dimensions of a polyhedron according
+   to a partial function mapping dimensions to dimensions.
+
+o  New function LinExpression operator+(const LinExpression&): previously
+   an expressions like `+x2-x3-x4 <= 0' could not constitute valid syntax
+   for a constraint.
+
+o  New type `dimension_type': an unsigned integral type for representing
+   space dimensions.
+
+o  New function dimension_type max_space_dimension():
+   returns the maximum space dimension this library can handle.
+
+o  New function dimension_type not_a_dimension():
+   returns a value that does not designate a valid dimension.
+
+o  The method Polyhedron::add_dimensions_and_constraints(ConSys&)
+   has gone.  A similar functionality is provided by the new method
+   Polyhedron::concatenate_assign(const Polyhedron&).  The same change
+   has, of course, been performed on all the PPL interfaces.
+
+o  New macros PPL_VERSION_MAJOR, PPL_VERSION_MINOR, PPL_VERSION_REVISION,
+   and PPL_VERSION_BETA allow the client application to adapt to different
+   versions of the library.
+
+o  New function const char* version() returns a character string
+   containing the PPL version.
+
+o  New function const char* banner() returns a character string
+   containing information about the PPL version, the licensing,
+   the lack of any warranty whatsoever, the C++ compiler used
+   to build the library, where to report bugs and where to look
+   for further information.
+
+o  The Prolog interface now supports also Ciao Prolog and XSB.
+
+o  The C and Prolog interfaces have been extended so as to make more of
+   the library's functionality available to Prolog and C users.
+
+o  Timeout computation facilities have been added to the Prolog interfaces:
+   new predicates ppl_set_timeout_exception_atom/1,
+   ppl_timeout_exception_atom/1, ppl_set_timeout/1, ppl_reset_timeout/0.
+
+o  Many efficiency improvements have been achieved.  Part of these have
+   been obtained by increasing the degree of "lazyness" of the library.
+
+o  Many portability and standard-conformance improvements: the library
+   can now be compiled with GNU g++, Intel C++ Compiler 7.0 for Linux,
+   and Comeau C/C++ 4.3.0.1 Compiler Front-End; the library has also
+   been tested on a variety of platforms.
+
+o  The functions
+
+     Polyhedron::operator<=(const Polyhedron&, const Polyhedron&),
+     Polyhedron::operator>=(const Polyhedron&, const Polyhedron&),
+     Polyhedron::operator<(const Polyhedron&, const Polyhedron&), and
+     Polyhedron::operator>(const Polyhedron&, const Polyhedron&)
+
+   have been removed.  The methods
+
+     Polyhedron::contains(const Polyhedron&) and
+     Polyhedron::strictly_contains(const Polyhedron&)
+
+   provide the same functionality.
+
+o  The method Polyhedron::limited_H79_widening_assign() has been renamed
+   Polyhedron::limited_H79_extrapolation_assign().  From now on, the name
+   `widening' is reserved for operators that come with a convergence
+   guarantee (i.e., with the ability of turning infinite chains to finite
+   ones).  Upper bound operators without such a guarantee contain the word
+   `extrapolation' in their name.
+
+o  The renamed method Polyhedron::limited_H79_extrapolation_assign()
+   takes the constraint system argument by const reference (in the
+   old Polyhedron::limited_H79_widening_assign() that argument was
+   passed by non-const reference).
+
+o  We now require GMP 4.1.2 or higher.
+
+o  In conformance with the C++ standard [17.4.3.1.2], in all the
+   identifiers exported by the C interface, any occurrence
+   of "__" (double underscore) has been replaced by "_" (underscore).
+
+o  Added a parameter to Polyhedron::shrink_bounding_box(): this specifies
+   the complexity class of the algorithm to be used.
+
+o  All the input/output operators have been confined into namespace
+   Parma_Polyhedra_Library::IO_Operators.  This way they do not conflict
+   with the operators the user might want to define.
+
+o  The operator Constraint operator>>(const Constraint&, unsigned int)
+   has been removed.
+
+o  The method
+   Polyhedron::poly_difference_assign_and_minimize(const Polyhedron&)
+   has been removed.
+
+
+Bugfixes
+========
+
+o  Fixed a bug in operator-=(LinExpression&, const LinExpression&)
+   whereby we computed a wrong result in some circumstances.
+
+o  Fixed a bug in method Polyhedron::minimized_constraints() that,
+   under some circumstances, could cause a wrong result or a program
+   crash.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.4.2 (released on October 4, 2002)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o  Fixed a bug in method Polyhedron::add_generator(const Generator&)
+   whereby we were not adding the corresponding closure point when adding
+   a point to an empty NNC polyhedron.
+
+o  Fixed a bug in method GenSys::insert(const Generator&) whereby the
+   insertion of a generator into an empty generator system might be
+   mishandled.
+
+o  Fixed a bug in method Polyhedron::operator<=(const Polyhedron&)
+   whereby the lines of the polyhedron were handled improperly.
+
+o  Fixed a bug in a private method used to implement public method
+   Polyhedron::relation_with(const Generator& g),
+   whereby a wrong result was obtained when `g' was a line.
+
+o  Fixed a bug in methods Polyhedron::affine_image() and
+   Polyhedron::affine_preimage(), whereby a wrong result could be
+   obtained when using a negative denominator for the affine expression.
+
+o  Fixed a bug in methods Polyhedron::minimized_constraints() and
+   Polyhedron::minimized_generators(), whereby a library invariant
+   was violated when calling these methods on a zero-dimensional space
+   universe NNC polyhedron.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.4.1 (released on July 30, 2002)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o  Fixed a bug in Polyhedron::poly_difference_assign(const Polyhedron& y)
+   whereby the equality constraints of `y' were ignored (the bug was
+   affecting both C and NNC computations).
+
+o  Fixed a bug in Polyhedron::operator=(const Polyhedron& y).  This bug,
+   which is triggered in some cases when `y' is empty, should only affect
+   versions of the library obtained with the `--enable-assertions'
+   configuration flag.
+
+o  Fixed a bug in Polyhedron::check_universe(), which was returning
+   the wrong result when called on a zero-dim universe polyhedron.
+
+o  Fixed a bug in NNC_Polyhedron::NNC_Polyhedron(ConSys& cs) whereby
+   an invariant was violated in case `cs' was empty.  This bug
+   should only affect versions of the library obtained with the
+   `--enable-assertions' configuration flag.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.4 (released on July 1, 2002)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  Added full support for Not Necessarily Closed (NNC) polyhedra:
+   - creation of strict inequality constraints and mixed constraint
+     systems;
+   - creation of closure points and extended generator systems;
+   - added classes C_Polyhedron (for the representation of Closed
+     polyhedra) and NNC_Polyhedron (the user no longer can create
+     Polyhedron objects);
+   - added topology compatibility checks to avoid mixing objects of
+     the two kinds;
+   - added explicit constructors to create a polyhedron of a given
+     topology kind starting from a polyhedron of the other kind;
+   - added methods Polyhedron::is_topologically_closed() and
+     Polyhedron::topological_closure_assign();
+   - implemented methods Polyhedron::minimized_constraints() and
+     Polyhedron::minimized_generators() to obtain minimal
+     descriptions, both for closed and for NNC polyhedra.
+
+o  New method Polyhedron::time_elapse_assign(const Polyhedron&):
+   it computes the time-elapse operation defined in
+
+     N. Halbwachs, Y.-E. Proy, and P. Roumanoff.
+     Verification of real-time systems using linear relation analysis.
+     Formal Methods in System Design, 11(2):157-185, 1997.
+
+o  New method Polyhedron::is_bounded(): it returns true if and only
+   if the polyhedron is bounded, i.e., finite.
+
+o  New methods Polyhedron::bounds_from_above(const LinExpression& e)
+   and Polyhedron::bounds_from_below(const LinExpression& e): they
+   return true if and only if the linear expression `e' is bounded
+   from above/below in the polyhedron.
+
+o  New, complete C interface.  As a demo, a toy solver for pure linear
+   programming problems has been implemented using this interface.
+   Notice that solving linear programming problems is completely
+   outside the scope of the library.  As a consequence the toy provided
+   as a demo is only a toy provided as a demo.
+
+o  Revised and completed Prolog interface:
+   - now supporting GNU Prolog, SICStus Prolog, SWI Prolog and YAP.
+   - all predicates have been renamed to match their intended
+     semantics;
+   - arguments have been reordered where necessary so as to follow the
+     rule "input arguments before output arguments";
+   - predicates added so that all the public methods for Polyhedra in
+     the C++ library are available as Prolog predicates;
+   - the interface has been extended to allow for closed and not
+     necessarily closed polyhedra.
+
+o  Added support for timeout-guarded operations.  It is now possible
+   for client applications to safely interrupt any exponential
+   computation paths in the library and get control back in a time
+   that is a linear function of the space dimension of the object
+   (polyhedron, system of constraints or generators) of highest
+   dimension on which the library is operating upon.
+
+o  The methods named convex_hull_* and convex_difference_*
+   have been renamed poly_hull_* and poly_difference_*.
+
+o  All methods named *_and_minimize() now return a boolean
+   flag that is false if the result is empty.
+
+o  All method and variable names containing the word "vertex"
+   have been replaced by names containing the word "point"
+   (some previous uses of the word "vertex" were not formally correct).
+
+o  The methods Polyhedron::includes(const Generator&) and
+   Polyhedron::satisfies(const Constraint&) have been removed,
+   as well as the enumeration GenSys_Con_Rel.
+   They have been replaced by the new methods
+   Polyhedron::relation_with(const Generator&) and
+   Polyhedron::relation_with(const Constraint&),
+   which return values of the new enumeration types
+   Relation_Poly_Gen and Relation_Poly_Con, respectively.
+
+o  The method Constraint::coefficient(void) has been renamed
+   to Constraint::inhomogeneous_term(void).
+
+o  The methods Polyhedron::widening_assign() and
+   Polyhedron::limited_widening_assign() have been renamed
+   Polyhedron::H79_widening_assign() and
+   Polyhedron::limited_H79_widening_assign(), respectively.
+   This emphasizes the fact that they implement extensions
+   of the widenings introduced in
+
+     N. Halbwachs.
+     D�termination Automatique de Relations Lin�aires
+     V�rifi�es par les Variables d'un Programme.
+     Th�se de 3�me cicle d'informatique,
+     Universit� scientifique et m�dicale de Grenoble,
+     Grenoble, France, March 1979.
+
+   and described in
+
+     N. Halbwachs, Y.-E. Proy, and P. Roumanoff.
+     Verification of real-time systems using linear relation analysis.
+     Formal Methods in System Design, 11(2):157-185, 1997.
+
+o  The library no longer calls abort(): appropriate exceptions
+   are always thrown instead.
+
+
+Bugfixes
+========
+
+o  Fixed a bug whereby creating a point with a negative denominator
+   caused the library to misbehave.
+
+o  Fixed a bug in Polyhedron::add_constraints(ConSys&) whereby
+   we could have created constraint systems having rows with
+   different capacities.
+
+o  Several other bugs have been fixed.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.3 (released on February 26, 2002)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o  The library has been ported under libtool: it is now possible
+   to build dynamic libraries as well.
+
+o  We now use the integer C++ class of GMP to represent the
+   coefficients of constraints and generators, instead of our own
+   (very much inferior) Integer class.  The drawback is that we
+   now require GMP 4.0.1 or higher.
+
+o  New methods Polyhedron::convex_difference_assign(const Polyhedron&) and
+   Polyhedron::convex_difference_assign_and_minimize(const Polyhedron&).
+   They assign to `*this' the convex hull of the set-theoretic difference
+   of `*this' and the argument (possibly non minimized or minimized,
+   respectively).
+
+o  The method Polyhedron::add_generators(GenSys&) is now lazy,
+   i.e., no minimization is performed.  Adding generators and
+   minimizing at the same time is provided by the method
+   Polyhedron::add_generators_and_minimize(GenSys&).
+   These methods now throw an exception if the resulting
+   polyhedron would be illegal.
+
+o  Some performance improvements.
+
+o  Added more test programs.
+
+
+Bugfixes
+========
+
+o  Fixed Polyhedron::satisfies(const Constraint&) and
+   Polyhedron::affine_image().
+
+o  Polyhedron::limited_widening_assign(const Polyhedron&, ConSys&)
+   was erroneously returning a (random) boolean: it is now a void
+   method.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.2 (released on November 14, 2001)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o  Massive API changes.  This would not normally be called "a feature",
+   but the old API was very wrong in a number of ways.  More API changes
+   are to be expected for the next few releases.
+
+o  All user-accessible library methods are now guarded by suitable
+   sanity checks.  Exception are thrown whenever the library is not
+   called in the intended way.
+
+o  A SICStus Prolog interface is now available.  It comes with a somewhat
+   interesting demo: a toy CLP(Q) interpreter.
+
+o  Greatly improved documentation.
+
+
+Bugfixes
+========
+
+o  Many, many more than we would like to admit.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.1 (released on October 24, 2001)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o  The library has been released under the GNU General Public License.
diff --git a/README b/README
new file mode 100644
index 0000000..f4a9509
--- /dev/null
+++ b/README
@@ -0,0 +1,1052 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+See below for the copying conditions.
+
+
+Parma Polyhedra Library (Release 0.9)
+=====================================
+
+This is the release 0.9 of the Parma Polyhedra Library:
+a C++ library for (not necessarily closed) convex polyhedra
+and other numerical abstractions.
+
+To be more precise, the Parma Polyhedra Library (PPL) can handle:
+
+  + all the convex polyhedra that can be defined as the intersection
+    of a finite number of (open or closed) hyperspaces, each described
+    by an equality or a (strict or non-strict) inequality with rational
+    coefficients;
+
+  + convex polyhedra defined by systems of bounded differences with
+    a wide choice of integer, rational or floating point coefficients;
+
+  + all grids (or, equivalently, lattices); a grid is defined by a set
+    of congruence relations with rational coefficients and consists of
+    the set of all points that satisfy these relations;
+
+  + finite powersets of the above;
+
+  + linear programming problems, solved with an implementation of the
+    primal simplex algorithm using exact arithmetic.
+
+The Parma Polyhedra Library is:
+
+  + user friendly:
+      you write `x + 2*y + 5*z <= 7' when you mean it;
+
+  + fully dynamic:
+      available virtual memory is the only limitation to the dimension
+      of anything;
+
+  + written in standard C++:
+      meant to be portable;
+
+  + exception-safe:
+      never leaks resources or leaves invalid object fragments around;
+
+  + rather efficient:
+      and we hope to make it even more so;
+
+  + thoroughly documented:
+      perhaps not ``literate programming'' but close enough;
+
+  + free software:
+      distributed under the terms of the GNU General Public License.
+
+See the file COPYING for licensing information.
+See the file INSTALL for generic build and installation instructions.
+See the file README.configure for more specific configuration instructions.
+See the file NEWS for recent project news.
+See the file BUGS for known bugs and how to report new ones.
+See the file CREDITS for a list of people, projects and organizations
+that made the PPL a reality.
+See http://www.cs.unipr.it/ppl/ for more information on the PPL.
+For any additional questions you might have, please do not hesitate to
+write to ppl-devel at cs.unipr.it.
+
+Here is the contents of the PPL 0.9 source distribution
+(27 directories, 924 files):
+
+ppl-0.9
+|-- BUGS
+|-- COPYING
+|-- CREDITS
+|-- ChangeLog
+|-- INSTALL
+|-- Makefile.am
+|-- Makefile.in
+|-- NEWS
+|-- README
+|-- README.configure
+|-- STANDARDS
+|-- TODO
+|-- Watchdog
+|   |-- BUGS
+|   |-- COPYING
+|   |-- CREDITS
+|   |-- ChangeLog
+|   |-- INSTALL
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- NEWS
+|   |-- README
+|   |-- aclocal.m4
+|   |-- compile
+|   |-- config.guess
+|   |-- config.h.in
+|   |-- config.sub
+|   |-- configure
+|   |-- configure.ac
+|   |-- depcomp
+|   |-- install-sh
+|   |-- ltmain.sh
+|   |-- missing
+|   |-- mkinstalldirs
+|   |-- src
+|   |   |-- Doubly_Linked_Object.defs.hh
+|   |   |-- Doubly_Linked_Object.inlines.hh
+|   |   |-- Doubly_Linked_Object.types.hh
+|   |   |-- EList.defs.hh
+|   |   |-- EList.inlines.hh
+|   |   |-- EList.types.hh
+|   |   |-- EList_Iterator.defs.hh
+|   |   |-- EList_Iterator.inlines.hh
+|   |   |-- EList_Iterator.types.hh
+|   |   |-- Handler.defs.hh
+|   |   |-- Handler.inlines.hh
+|   |   |-- Handler.types.hh
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- Pending_Element.cc
+|   |   |-- Pending_Element.defs.hh
+|   |   |-- Pending_Element.inlines.hh
+|   |   |-- Pending_Element.types.hh
+|   |   |-- Pending_List.cc
+|   |   |-- Pending_List.defs.hh
+|   |   |-- Pending_List.inlines.hh
+|   |   |-- Pending_List.types.hh
+|   |   |-- Time.cc
+|   |   |-- Time.defs.hh
+|   |   |-- Time.inlines.hh
+|   |   |-- Time.types.hh
+|   |   |-- Watchdog.cc
+|   |   |-- Watchdog.defs.hh
+|   |   |-- Watchdog.inlines.hh
+|   |   |-- Watchdog.types.hh
+|   |   |-- pwl.hh.dist
+|   |   `-- pwl_header.hh
+|   `-- utils
+|       |-- Makefile.am
+|       |-- Makefile.in
+|       `-- build_header.in
+|-- aclocal.m4
+|-- compile
+|-- config.guess
+|-- config.h.in
+|-- config.rpath
+|-- config.sub
+|-- configure
+|-- configure.ac
+|-- debian
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- README
+|   |-- changelog
+|   |-- compat
+|   |-- control
+|   |-- libppl-c.dirs
+|   |-- libppl-c.install
+|   |-- libppl-c.links
+|   |-- libppl-dev.dirs
+|   |-- libppl-dev.doc-base
+|   |-- libppl-dev.doc-base.user
+|   |-- libppl-dev.docs
+|   |-- libppl-dev.install
+|   |-- libppl-dev.links
+|   |-- libppl-pwl.copyright.in
+|   |-- libppl-pwl.dirs
+|   |-- libppl-pwl.docs
+|   |-- libppl-pwl.install
+|   |-- libppl.copyright.in
+|   |-- libppl.dirs
+|   |-- libppl.docs
+|   |-- libppl.install
+|   `-- rules
+|-- demos
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- ppl_lcdd
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- examples
+|   |   |   |-- 1d.ine
+|   |   |   |-- 1da.ine
+|   |   |   |-- Makefile.am
+|   |   |   |-- Makefile.in
+|   |   |   |-- README
+|   |   |   |-- allzero.ine
+|   |   |   |-- ccc4.ext
+|   |   |   |-- ccc5.ext
+|   |   |   |-- ccc6.ext
+|   |   |   |-- ccp4.ext
+|   |   |   |-- ccp5.ext
+|   |   |   |-- ccp6.ext
+|   |   |   |-- cp4.ext
+|   |   |   |-- cp4.ine
+|   |   |   |-- cp5.ext
+|   |   |   |-- cp5.ine
+|   |   |   |-- cp6.ext
+|   |   |   |-- cp6.ine
+|   |   |   |-- cp7.ext
+|   |   |   |-- cross10.ine
+|   |   |   |-- cross12.ine
+|   |   |   |-- cross4.ine
+|   |   |   |-- cross6.ine
+|   |   |   |-- cross8.ine
+|   |   |   |-- cube.ext
+|   |   |   |-- cube.ine
+|   |   |   |-- cube10.ine
+|   |   |   |-- cube12.ine
+|   |   |   |-- cube3.ine
+|   |   |   |-- cube6.ine
+|   |   |   |-- cube8.ine
+|   |   |   |-- cubetop.ine
+|   |   |   |-- cubocta.ine
+|   |   |   |-- cut16_11.ext
+|   |   |   |-- cut32_16.ext
+|   |   |   |-- cyc.ine
+|   |   |   |-- cyclic10-4.ext
+|   |   |   |-- cyclic12-6.ext
+|   |   |   |-- cyclic14-8.ext
+|   |   |   |-- cyclic16-10.ext
+|   |   |   |-- cyclic17_8.ine
+|   |   |   |-- cyclic25_13.ext
+|   |   |   |-- dcube10.ext
+|   |   |   |-- dcube12.ext
+|   |   |   |-- dcube3.ext
+|   |   |   |-- dcube6.ext
+|   |   |   |-- dcube8.ext
+|   |   |   |-- diamond.ine
+|   |   |   |-- dodeca_m.ine
+|   |   |   |-- ex1.ine
+|   |   |   |-- grcubocta.ine
+|   |   |   |-- hexocta.ine
+|   |   |   |-- icododeca_m.ine
+|   |   |   |-- in0.ine
+|   |   |   |-- in1.ine
+|   |   |   |-- in2.ine
+|   |   |   |-- in3.ine
+|   |   |   |-- in4.ine
+|   |   |   |-- in5.ine
+|   |   |   |-- in6.ine
+|   |   |   |-- in7.ine
+|   |   |   |-- infeas.ine
+|   |   |   |-- integralpoints.ine
+|   |   |   |-- irbox20-4.ext
+|   |   |   |-- irbox200-4.ext
+|   |   |   |-- kkd18_4.ine
+|   |   |   |-- kkd27_5.ine
+|   |   |   |-- kkd38_6.ine
+|   |   |   |-- kq20_11_m.ine
+|   |   |   |-- metric40_11.ine
+|   |   |   |-- metric80_16.ine
+|   |   |   |-- mit.ine
+|   |   |   |-- mit288-281.ine
+|   |   |   |-- mit31-20.ine
+|   |   |   |-- mit41-16.ine
+|   |   |   |-- mit708-9.ine
+|   |   |   |-- mit71-61.ine
+|   |   |   |-- mit90-86.ine
+|   |   |   |-- mp5.ext
+|   |   |   |-- mp5.ine
+|   |   |   |-- mp5a.ine
+|   |   |   |-- mp6.ine
+|   |   |   |-- nonfull.ine
+|   |   |   |-- origin.ine
+|   |   |   |-- prodst62.ext
+|   |   |   |-- project1_m.ine
+|   |   |   |-- project1res.ine
+|   |   |   |-- project2_m.ine
+|   |   |   |-- project2res.ine
+|   |   |   |-- rcubocta.ine
+|   |   |   |-- redcheck.ext
+|   |   |   |-- reg24-5.ext
+|   |   |   |-- reg24-5.ine
+|   |   |   |-- reg600-5_m.ext
+|   |   |   |-- rhomtria_m.ine
+|   |   |   |-- sample.ine
+|   |   |   |-- sampleh1.ine
+|   |   |   |-- sampleh2.ine
+|   |   |   |-- sampleh3.ine
+|   |   |   |-- sampleh4.ine
+|   |   |   |-- sampleh5.ine
+|   |   |   |-- sampleh6.ine
+|   |   |   |-- sampleh7.ine
+|   |   |   |-- sampleh8.ine
+|   |   |   |-- samplev1.ext
+|   |   |   |-- samplev2.ext
+|   |   |   |-- samplev3.ext
+|   |   |   |-- trunc10.ine
+|   |   |   |-- trunc7.ine
+|   |   |   |-- tsp5.ext
+|   |   |   `-- tsp5.ine
+|   |   |-- expected_int16
+|   |   |-- expected_int16_a
+|   |   |-- expected_int32
+|   |   |-- expected_int32_a
+|   |   |-- expected_int64
+|   |   |-- expected_int64_a
+|   |   |-- expected_int8
+|   |   |-- expected_int8_a
+|   |   |-- expected_mpz
+|   |   |-- expected_mpz_a
+|   |   `-- ppl_lcdd.cc
+|   `-- ppl_lpsol
+|       |-- Makefile.am
+|       |-- Makefile.in
+|       |-- dummy.cc
+|       |-- examples
+|       |   |-- Makefile.am
+|       |   |-- Makefile.in
+|       |   |-- README
+|       |   |-- adlittle.mps
+|       |   |-- afiro.mps
+|       |   |-- bgprtr.mps
+|       |   |-- blend.mps
+|       |   |-- boeing1.mps
+|       |   |-- boeing2.mps
+|       |   |-- ex1.mps
+|       |   |-- kb2.mps
+|       |   |-- mip.mps
+|       |   |-- sample.mps
+|       |   |-- sc105.mps
+|       |   |-- sc50a.mps
+|       |   |-- sc50b.mps
+|       |   |-- ship08l.mps
+|       |   `-- unboundedmin.mps
+|       |-- expected_int16
+|       |-- expected_int16_a
+|       |-- expected_int32
+|       |-- expected_int32_a
+|       |-- expected_int64
+|       |-- expected_int64_a
+|       |-- expected_int8
+|       |-- expected_int8_a
+|       |-- expected_mpz
+|       |-- expected_mpz_a
+|       `-- ppl_lpsol.c
+|-- depcomp
+|-- doc
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- README.doc
+|   |-- definitions.dox
+|   |-- devref.doxyconf-html
+|   |-- devref.doxyconf-html.in
+|   |-- devref.doxyconf-latex
+|   |-- devref.doxyconf-latex.in
+|   |-- devref.tex
+|   |-- fdl.dox
+|   |-- fdl.pdf
+|   |-- fdl.ps.gz
+|   |-- fdl.tex
+|   |-- fdl.txt
+|   |-- gpl.dox
+|   |-- gpl.pdf
+|   |-- gpl.ps.gz
+|   |-- gpl.tex
+|   |-- gpl.txt
+|   |-- ppl-config.1
+|   |-- ppl-user-0.9-html.tar.gz
+|   |-- ppl-user-0.9.pdf
+|   |-- ppl-user-0.9.ps.gz
+|   |-- ppl.sty
+|   |-- ppl_lcdd.1
+|   |-- ppl_lpsol.1
+|   |-- user.doxyconf-html
+|   |-- user.doxyconf-html.in
+|   |-- user.doxyconf-latex
+|   |-- user.doxyconf-latex.in
+|   `-- user.tex
+|-- install-sh
+|-- instchk.hh
+|-- interfaces
+|   |-- C
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- ppl_c.cc
+|   |   |-- ppl_c.h
+|   |   `-- ppl_c.h.in
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   `-- Prolog
+|       |-- Ciao
+|       |   |-- Makefile.am
+|       |   |-- Makefile.in
+|       |   |-- ciao_clpq.pl
+|       |   |-- ciao_clpq2.pl
+|       |   |-- ciao_pl_check.pl
+|       |   |-- ppl_ciao.cc
+|       |   `-- ppl_ciao.pl
+|       |-- GNU
+|       |   |-- Makefile.am
+|       |   |-- Makefile.in
+|       |   |-- README
+|       |   |-- gnu_pl_check.pl
+|       |   |-- gp_clpq.pl
+|       |   |-- ppl_gprolog.pl
+|       |   `-- ppl_gprolog_sd.cc
+|       |-- Makefile.am
+|       |-- Makefile.in
+|       |-- Prolog_interface.dox
+|       |-- SICStus
+|       |   |-- Makefile.am
+|       |   |-- Makefile.in
+|       |   |-- ppl_sicstus.pl
+|       |   |-- ppl_sicstus_sd.cc
+|       |   |-- sicstus_cfli.cc
+|       |   |-- sicstus_cfli.h
+|       |   |-- sicstus_cfli.ic
+|       |   |-- sp_clpq.pl
+|       |   `-- sp_pl_check.pl
+|       |-- SWI
+|       |   |-- Makefile.am
+|       |   |-- Makefile.in
+|       |   |-- pl_clpq.cc
+|       |   |-- pl_clpq.pl
+|       |   |-- ppl_pl.cc
+|       |   |-- ppl_swiprolog.cc
+|       |   |-- ppl_swiprolog.pl
+|       |   `-- swi_pl_check.pl
+|       |-- XSB
+|       |   |-- Makefile.am
+|       |   |-- Makefile.in
+|       |   |-- expected_clpq2_int16
+|       |   |-- expected_clpq2_int16_a
+|       |   |-- expected_clpq2_int32
+|       |   |-- expected_clpq2_int32_a
+|       |   |-- expected_clpq2_int64
+|       |   |-- expected_clpq2_int64_a
+|       |   |-- expected_clpq2_int8
+|       |   |-- expected_clpq2_int8_a
+|       |   |-- expected_clpq2_mpz
+|       |   |-- expected_clpq2_mpz_a
+|       |   |-- expected_clpq_int16
+|       |   |-- expected_clpq_int16_a
+|       |   |-- expected_clpq_int32
+|       |   |-- expected_clpq_int32_a
+|       |   |-- expected_clpq_int64
+|       |   |-- expected_clpq_int64_a
+|       |   |-- expected_clpq_int8
+|       |   |-- expected_clpq_int8_a
+|       |   |-- expected_clpq_mpz
+|       |   |-- expected_clpq_mpz_a
+|       |   |-- expected_pchk_int16
+|       |   |-- expected_pchk_int16_a
+|       |   |-- expected_pchk_int32
+|       |   |-- expected_pchk_int32_a
+|       |   |-- expected_pchk_int64
+|       |   |-- expected_pchk_int64_a
+|       |   |-- expected_pchk_int8
+|       |   |-- expected_pchk_int8_a
+|       |   |-- expected_pchk_mpz
+|       |   |-- expected_pchk_mpz_a
+|       |   |-- ppl_xsb.H
+|       |   |-- ppl_xsb.cc
+|       |   |-- xsb_clpq.P
+|       |   |-- xsb_clpq2.P
+|       |   `-- xsb_pl_check.P
+|       |-- YAP
+|       |   |-- Makefile.am
+|       |   |-- Makefile.in
+|       |   |-- ppl_yap.cc
+|       |   |-- ppl_yap.pl
+|       |   |-- yap_clpq.pl
+|       |   |-- yap_clpq2.pl
+|       |   `-- yap_pl_check.pl
+|       |-- exceptions.hh
+|       |-- ppl_prolog.icc
+|       |-- tests
+|       |   |-- Makefile.am
+|       |   |-- Makefile.in
+|       |   |-- ack.clpq
+|       |   |-- ackn.clpq
+|       |   |-- clpq.pl
+|       |   |-- clpq2.pl
+|       |   |-- expected_clpq2_int16
+|       |   |-- expected_clpq2_int16_a
+|       |   |-- expected_clpq2_int32
+|       |   |-- expected_clpq2_int32_a
+|       |   |-- expected_clpq2_int64
+|       |   |-- expected_clpq2_int64_a
+|       |   |-- expected_clpq2_int8
+|       |   |-- expected_clpq2_int8_a
+|       |   |-- expected_clpq2_mpz
+|       |   |-- expected_clpq2_mpz_a
+|       |   |-- expected_clpq_int16
+|       |   |-- expected_clpq_int16_a
+|       |   |-- expected_clpq_int32
+|       |   |-- expected_clpq_int32_a
+|       |   |-- expected_clpq_int64
+|       |   |-- expected_clpq_int64_a
+|       |   |-- expected_clpq_int8
+|       |   |-- expected_clpq_int8_a
+|       |   |-- expected_clpq_mpz
+|       |   |-- expected_clpq_mpz_a
+|       |   |-- expected_pchk_int16
+|       |   |-- expected_pchk_int16_a
+|       |   |-- expected_pchk_int32
+|       |   |-- expected_pchk_int32_a
+|       |   |-- expected_pchk_int64
+|       |   |-- expected_pchk_int64_a
+|       |   |-- expected_pchk_int8
+|       |   |-- expected_pchk_int8_a
+|       |   |-- expected_pchk_mpz
+|       |   |-- expected_pchk_mpz_a
+|       |   |-- fib.clpq
+|       |   |-- mc91.clpq
+|       |   |-- pl_check.pl
+|       |   |-- schedule.clpq
+|       |   |-- script_clpq
+|       |   |-- script_clpq2
+|       |   |-- script_clpq2_int8
+|       |   |-- smm.clpq
+|       |   |-- sumto.clpq
+|       |   `-- tak.clpq
+|       `-- track_allocation.hh
+|-- ltmain.sh
+|-- m4
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- ac_check_fpu_control.m4
+|   |-- ac_check_gmp.m4
+|   |-- ac_check_sicstus_prolog.m4
+|   |-- ac_check_swi_prolog.m4
+|   |-- ac_check_xsb_prolog.m4
+|   |-- ac_cxx_attribute_weak.m4
+|   |-- ac_cxx_double_binary_format.m4
+|   |-- ac_cxx_flexible_arrays.m4
+|   |-- ac_cxx_float_binary_format.m4
+|   |-- ac_cxx_long_double_binary_format.m4
+|   |-- ac_text_md5sum.m4
+|   |-- lib-ld.m4
+|   |-- lib-link.m4
+|   |-- lib-prefix.m4
+|   `-- ppl.m4
+|-- missing
+|-- mkinstalldirs
+|-- ppl.lsm.in
+|-- ppl.spec.in
+|-- src
+|   |-- BDS_Status.idefs.hh
+|   |-- BDS_Status.inlines.hh
+|   |-- BD_Shape.cc
+|   |-- BD_Shape.defs.hh
+|   |-- BD_Shape.inlines.hh
+|   |-- BD_Shape.templates.hh
+|   |-- BD_Shape.types.hh
+|   |-- BHRZ03_Certificate.cc
+|   |-- BHRZ03_Certificate.defs.hh
+|   |-- BHRZ03_Certificate.inlines.hh
+|   |-- BHRZ03_Certificate.types.hh
+|   |-- BUGS.cc.dist
+|   |-- Bounding_Box.cc
+|   |-- Bounding_Box.defs.hh
+|   |-- Bounding_Box.inlines.hh
+|   |-- Bounding_Box.types.hh
+|   |-- COPYING.cc.dist
+|   |-- CREDITS.cc.dist
+|   |-- C_Polyhedron.cc
+|   |-- C_Polyhedron.defs.hh
+|   |-- C_Polyhedron.inlines.hh
+|   |-- C_Polyhedron.types.hh
+|   |-- Checked_Number.cc
+|   |-- Checked_Number.defs.hh
+|   |-- Checked_Number.inlines.hh
+|   |-- Checked_Number.types.hh
+|   |-- Coefficient.cc
+|   |-- Coefficient.defs.hh
+|   |-- Coefficient.inlines.hh
+|   |-- Coefficient.types.hh
+|   |-- Coefficient_traits_template.hh
+|   |-- Congruence.cc
+|   |-- Congruence.defs.hh
+|   |-- Congruence.inlines.hh
+|   |-- Congruence.types.hh
+|   |-- Congruence_System.cc
+|   |-- Congruence_System.defs.hh
+|   |-- Congruence_System.inlines.hh
+|   |-- Congruence_System.types.hh
+|   |-- Constraint.cc
+|   |-- Constraint.defs.hh
+|   |-- Constraint.inlines.hh
+|   |-- Constraint.types.hh
+|   |-- Constraint_System.cc
+|   |-- Constraint_System.defs.hh
+|   |-- Constraint_System.inlines.hh
+|   |-- Constraint_System.types.hh
+|   |-- DB_Matrix.defs.hh
+|   |-- DB_Matrix.inlines.hh
+|   |-- DB_Matrix.types.hh
+|   |-- DB_Row.defs.hh
+|   |-- DB_Row.inlines.hh
+|   |-- DB_Row.types.hh
+|   |-- Determinate.defs.hh
+|   |-- Determinate.inlines.hh
+|   |-- Determinate.types.hh
+|   |-- Float.cc
+|   |-- Float.defs.hh
+|   |-- Float.inlines.hh
+|   |-- GMP_Integer.defs.hh
+|   |-- GMP_Integer.inlines.hh
+|   |-- GMP_Integer.types.hh
+|   |-- Generator.cc
+|   |-- Generator.defs.hh
+|   |-- Generator.inlines.hh
+|   |-- Generator.types.hh
+|   |-- Generator_System.cc
+|   |-- Generator_System.defs.hh
+|   |-- Generator_System.inlines.hh
+|   |-- Generator_System.types.hh
+|   |-- Grid.defs.hh
+|   |-- Grid.inlines.hh
+|   |-- Grid.templates.hh
+|   |-- Grid.types.hh
+|   |-- Grid_Certificate.cc
+|   |-- Grid_Certificate.defs.hh
+|   |-- Grid_Certificate.inlines.hh
+|   |-- Grid_Certificate.types.hh
+|   |-- Grid_Generator.cc
+|   |-- Grid_Generator.defs.hh
+|   |-- Grid_Generator.inlines.hh
+|   |-- Grid_Generator.types.hh
+|   |-- Grid_Generator_System.cc
+|   |-- Grid_Generator_System.defs.hh
+|   |-- Grid_Generator_System.inlines.hh
+|   |-- Grid_Generator_System.types.hh
+|   |-- Grid_Status.cc
+|   |-- Grid_Status.idefs.hh
+|   |-- Grid_Status.inlines.hh
+|   |-- Grid_chdims.cc
+|   |-- Grid_conversion.cc
+|   |-- Grid_nonpublic.cc
+|   |-- Grid_public.cc
+|   |-- Grid_simplify.cc
+|   |-- Grid_widenings.cc
+|   |-- H79_Certificate.cc
+|   |-- H79_Certificate.defs.hh
+|   |-- H79_Certificate.inlines.hh
+|   |-- H79_Certificate.types.hh
+|   |-- Init.cc
+|   |-- Init.defs.hh
+|   |-- Init.types.hh
+|   |-- Interval.cc
+|   |-- Interval.defs.hh
+|   |-- Interval.inlines.hh
+|   |-- Interval.types.hh
+|   |-- LP_Problem.cc
+|   |-- LP_Problem.defs.hh
+|   |-- LP_Problem.inlines.hh
+|   |-- LP_Problem.types.hh
+|   |-- Limits.hh
+|   |-- Linear_Expression.cc
+|   |-- Linear_Expression.defs.hh
+|   |-- Linear_Expression.inlines.hh
+|   |-- Linear_Expression.types.hh
+|   |-- Linear_Row.cc
+|   |-- Linear_Row.defs.hh
+|   |-- Linear_Row.inlines.hh
+|   |-- Linear_Row.types.hh
+|   |-- Linear_System.cc
+|   |-- Linear_System.defs.hh
+|   |-- Linear_System.inlines.hh
+|   |-- Linear_System.types.hh
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- Matrix.cc
+|   |-- Matrix.defs.hh
+|   |-- Matrix.inlines.hh
+|   |-- Matrix.types.hh
+|   |-- NNC_Polyhedron.cc
+|   |-- NNC_Polyhedron.defs.hh
+|   |-- NNC_Polyhedron.inlines.hh
+|   |-- NNC_Polyhedron.types.hh
+|   |-- Numeric_Format.defs.hh
+|   |-- Ph_Status.cc
+|   |-- Ph_Status.idefs.hh
+|   |-- Ph_Status.inlines.hh
+|   |-- Poly_Con_Relation.cc
+|   |-- Poly_Con_Relation.defs.hh
+|   |-- Poly_Con_Relation.inlines.hh
+|   |-- Poly_Con_Relation.types.hh
+|   |-- Poly_Gen_Relation.cc
+|   |-- Poly_Gen_Relation.defs.hh
+|   |-- Poly_Gen_Relation.inlines.hh
+|   |-- Poly_Gen_Relation.types.hh
+|   |-- Polyhedra_Powerset.cc
+|   |-- Polyhedra_Powerset.defs.hh
+|   |-- Polyhedra_Powerset.inlines.hh
+|   |-- Polyhedra_Powerset.templates.hh
+|   |-- Polyhedra_Powerset.types.hh
+|   |-- Polyhedron.defs.hh
+|   |-- Polyhedron.inlines.hh
+|   |-- Polyhedron.templates.hh
+|   |-- Polyhedron.types.hh
+|   |-- Polyhedron_chdims.cc
+|   |-- Polyhedron_nonpublic.cc
+|   |-- Polyhedron_public.cc
+|   |-- Polyhedron_widenings.cc
+|   |-- Powerset.defs.hh
+|   |-- Powerset.inlines.hh
+|   |-- Powerset.templates.hh
+|   |-- Powerset.types.hh
+|   |-- Ptr_Iterator.defs.hh
+|   |-- Ptr_Iterator.inlines.hh
+|   |-- Ptr_Iterator.types.hh
+|   |-- Result.defs.hh
+|   |-- Result.inlines.hh
+|   |-- Rounding_Dir.defs.hh
+|   |-- Rounding_Dir.inlines.hh
+|   |-- Row.cc
+|   |-- Row.defs.hh
+|   |-- Row.inlines.hh
+|   |-- Row.types.hh
+|   |-- Saturation_Matrix.cc
+|   |-- Saturation_Matrix.defs.hh
+|   |-- Saturation_Matrix.inlines.hh
+|   |-- Saturation_Matrix.types.hh
+|   |-- Saturation_Row.cc
+|   |-- Saturation_Row.defs.hh
+|   |-- Saturation_Row.inlines.hh
+|   |-- Saturation_Row.types.hh
+|   |-- Scalar_Products.cc
+|   |-- Scalar_Products.defs.hh
+|   |-- Scalar_Products.inlines.hh
+|   |-- Scalar_Products.types.hh
+|   |-- Topology.hh
+|   |-- Variable.cc
+|   |-- Variable.defs.hh
+|   |-- Variable.inlines.hh
+|   |-- Variable.types.hh
+|   |-- Widening_Function.defs.hh
+|   |-- Widening_Function.inlines.hh
+|   |-- Widening_Function.types.hh
+|   |-- algorithms.hh
+|   |-- checked.cc
+|   |-- checked.defs.hh
+|   |-- checked.inlines.hh
+|   |-- checked_ext.inlines.hh
+|   |-- checked_float.inlines.hh
+|   |-- checked_int.inlines.hh
+|   |-- checked_mpq.inlines.hh
+|   |-- checked_mpz.inlines.hh
+|   |-- checked_numeric_limits.hh
+|   |-- compiler.hh
+|   |-- conversion.cc
+|   |-- fpu-c99.inlines.hh
+|   |-- fpu-ia32.inlines.hh
+|   |-- fpu-none.inlines.hh
+|   |-- fpu-sparc.inlines.hh
+|   |-- fpu.defs.hh
+|   |-- fpu.types.hh
+|   |-- globals.cc
+|   |-- globals.defs.hh
+|   |-- globals.inlines.hh
+|   |-- globals.types.hh
+|   |-- initializer.hh
+|   |-- max_space_dimension.hh
+|   |-- minimize.cc
+|   |-- mp_numeric_limits.hh
+|   |-- namespaces.hh
+|   |-- ppl-config.cc
+|   |-- ppl-config.cc.in
+|   |-- ppl.hh.dist
+|   |-- ppl_header.hh
+|   |-- simplify.cc
+|   |-- swapping_sort.icc
+|   |-- version.cc
+|   `-- version.hh.in
+|-- tests
+|   |-- BBox.cc
+|   |-- BBox.hh
+|   |-- BD_Shape
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- addconstraints1.cc
+|   |   |-- addspacedims1.cc
+|   |   |-- affinedimension1.cc
+|   |   |-- affineimage1.cc
+|   |   |-- affineimage2.cc
+|   |   |-- affinepreimage1.cc
+|   |   |-- affinepreimage2.cc
+|   |   |-- ascii_dump_load1.cc
+|   |   |-- bdsdifference1.cc
+|   |   |-- bdshull1.cc
+|   |   |-- bgp99extrapolation1.cc
+|   |   |-- bhmz05widening1.cc
+|   |   |-- bhz03widening1.cc
+|   |   |-- cc76extrapolation1.cc
+|   |   |-- cc76narrowing1.cc
+|   |   |-- closure1.cc
+|   |   |-- concatenate1.cc
+|   |   |-- constraints1.cc
+|   |   |-- contains1.cc
+|   |   |-- empty1.cc
+|   |   |-- equality1.cc
+|   |   |-- fromgensys1.cc
+|   |   |-- generalizedaffineimage1.cc
+|   |   |-- generalizedaffineimage2.cc
+|   |   |-- generalizedaffinepreimage1.cc
+|   |   |-- generalizedaffinepreimage2.cc
+|   |   |-- geomcovers1.cc
+|   |   |-- h79widening1.cc
+|   |   |-- intersection1.cc
+|   |   |-- limitedbhmz05extrapolation1.cc
+|   |   |-- limitedcc76extrapolation1.cc
+|   |   |-- limitedh79extrapolation1.cc
+|   |   |-- mapspacedims1.cc
+|   |   |-- maxspacedim.cc
+|   |   |-- minconstraints1.cc
+|   |   |-- relations1.cc
+|   |   |-- relations2.cc
+|   |   |-- relations3.cc
+|   |   |-- removespacedims1.cc
+|   |   |-- run_tests
+|   |   |-- timeelapse1.cc
+|   |   |-- universe1.cc
+|   |   `-- writebdshape1.cc
+|   |-- Grid
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- addcongruence1.cc
+|   |   |-- addcongruences1.cc
+|   |   |-- addconstraint1.cc
+|   |   |-- addconstraints1.cc
+|   |   |-- addgenerator1.cc
+|   |   |-- addgenerators1.cc
+|   |   |-- addspacedims1.cc
+|   |   |-- affinedim1.cc
+|   |   |-- affineimage1.cc
+|   |   |-- affineimage2.cc
+|   |   |-- affinepreimage1.cc
+|   |   |-- affinepreimage2.cc
+|   |   |-- asciidumpload1.cc
+|   |   |-- bhz03widening1.cc
+|   |   |-- bounded1.cc
+|   |   |-- boundingbox1.cc
+|   |   |-- boundingbox2.cc
+|   |   |-- bounds1.cc
+|   |   |-- certificate1.cc
+|   |   |-- concatenate1.cc
+|   |   |-- congruence1.cc
+|   |   |-- congruences1.cc
+|   |   |-- congruencesystem1.cc
+|   |   |-- contains1.cc
+|   |   |-- copyconstruct1.cc
+|   |   |-- coveringbox1.cc
+|   |   |-- coveringbox2.cc
+|   |   |-- discrete1.cc
+|   |   |-- disjoint1.cc
+|   |   |-- equals1.cc
+|   |   |-- expandspacedim1.cc
+|   |   |-- foldspacedims1.cc
+|   |   |-- generalizedaffineimage1.cc
+|   |   |-- generalizedaffineimage2.cc
+|   |   |-- generalizedaffinepreimage1.cc
+|   |   |-- generalizedaffinepreimage2.cc
+|   |   |-- generator1.cc
+|   |   |-- generators1.cc
+|   |   |-- grid1.cc
+|   |   |-- grid2.cc
+|   |   |-- grid3.cc
+|   |   |-- griddifference1.cc
+|   |   |-- intersection1.cc
+|   |   |-- isempty1.cc
+|   |   |-- isuniverse1.cc
+|   |   |-- join1.cc
+|   |   |-- join2.cc
+|   |   |-- limitedextrapolation1.cc
+|   |   |-- mapspacedims1.cc
+|   |   |-- maxmin1.cc
+|   |   |-- membytes1.cc
+|   |   |-- mincongruences1.cc
+|   |   |-- mingenerators1.cc
+|   |   |-- outputoperator1.cc
+|   |   |-- relations1.cc
+|   |   |-- relations2.cc
+|   |   |-- removespacedims1.cc
+|   |   |-- timeelapse1.cc
+|   |   |-- topclosed1.cc
+|   |   |-- topclosure1.cc
+|   |   |-- widening1.cc
+|   |   `-- writecongruencesystem.cc
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- Partial_Function.cc
+|   |-- Partial_Function.defs.hh
+|   |-- Partial_Function.inlines.hh
+|   |-- Partial_Function.types.hh
+|   |-- Polyhedron
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- README
+|   |   |-- addcongruence1.cc
+|   |   |-- addcongruences1.cc
+|   |   |-- addconstraint1.cc
+|   |   |-- addconstraints1.cc
+|   |   |-- addconstraints2.cc
+|   |   |-- addgenerator1.cc
+|   |   |-- addgenerator2.cc
+|   |   |-- addgenerators1.cc
+|   |   |-- addgenerators2.cc
+|   |   |-- addspacedims1.cc
+|   |   |-- addspacedims2.cc
+|   |   |-- affineimage1.cc
+|   |   |-- affineimage2.cc
+|   |   |-- affinepreimage1.cc
+|   |   |-- affinetrans.cc
+|   |   |-- append1.cc
+|   |   |-- append2.cc
+|   |   |-- ascii_dump_load1.cc
+|   |   |-- ascii_dump_load2.cc
+|   |   |-- ascii_dump_load3.cc
+|   |   |-- bgp99extrapolation1.cc
+|   |   |-- bhrz03widening1.cc
+|   |   |-- bhrz03widening2.cc
+|   |   |-- bhrz03widening3.cc
+|   |   |-- bhz03widening1.cc
+|   |   |-- bounded1.cc
+|   |   |-- boundedaffineimage1.cc
+|   |   |-- boundedaffinepreimage1.cc
+|   |   |-- boundedbhrz03extrapolation1.cc
+|   |   |-- boundedh79extrapolation1.cc
+|   |   |-- boundingbox1.cc
+|   |   |-- boundingbox2.cc
+|   |   |-- boundingbox3.cc
+|   |   |-- bounds1.cc
+|   |   |-- bug2.cc
+|   |   |-- cnncconversion1.cc
+|   |   |-- concatenate1.cc
+|   |   |-- congruences1.cc
+|   |   |-- constraints1.cc
+|   |   |-- contains1.cc
+|   |   |-- contains2.cc
+|   |   |-- disjoint1.cc
+|   |   |-- disjoint2.cc
+|   |   |-- dualhypercubes.cc
+|   |   |-- empty1.cc
+|   |   |-- equals1.cc
+|   |   |-- exceptions1.cc
+|   |   |-- exceptions2.cc
+|   |   |-- exceptions3.cc
+|   |   |-- expandspacedim1.cc
+|   |   |-- expandspacedim2.cc
+|   |   |-- foldspacedims1.cc
+|   |   |-- foldspacedims2.cc
+|   |   |-- generalizedaffineimage1.cc
+|   |   |-- generalizedaffineimage2.cc
+|   |   |-- generalizedaffinepreimage1.cc
+|   |   |-- generalizedaffinepreimage2.cc
+|   |   |-- generators1.cc
+|   |   |-- geomcovers1.cc
+|   |   |-- h79widening1.cc
+|   |   |-- h79widening2.cc
+|   |   |-- intersection1.cc
+|   |   |-- limitedbhrz03extrapolation1.cc
+|   |   |-- limitedh79extrapolation1.cc
+|   |   |-- linearpartition1.cc
+|   |   |-- linearsystem1.cc
+|   |   |-- linexpression1.cc
+|   |   |-- lpproblem1.cc
+|   |   |-- mapspacedims1.cc
+|   |   |-- matrix1.cc
+|   |   |-- max_min1.cc
+|   |   |-- maxspacedim1.cc
+|   |   |-- mc91.cc
+|   |   |-- membytes1.cc
+|   |   |-- membytes2.cc
+|   |   |-- memory1.cc
+|   |   |-- memory2.cc
+|   |   |-- minconstraints1.cc
+|   |   |-- minconstraints2.cc
+|   |   |-- mingenerators1.cc
+|   |   |-- mingenerators2.cc
+|   |   |-- nncminimize1.cc
+|   |   |-- nncminimize2.cc
+|   |   |-- numberinput1.cc
+|   |   |-- onepoint.cc
+|   |   |-- permute.cc
+|   |   |-- polydifference1.cc
+|   |   |-- polydifference2.cc
+|   |   |-- polyhull1.cc
+|   |   |-- polyhull2.cc
+|   |   |-- polypowerset1.cc
+|   |   |-- powerset1.cc
+|   |   |-- randphull1.cc
+|   |   |-- randphull2.cc
+|   |   |-- relations1.cc
+|   |   |-- relations2.cc
+|   |   |-- relations3.cc
+|   |   |-- removespacedims1.cc
+|   |   |-- removespacedims2.cc
+|   |   |-- smm1.cc
+|   |   |-- timeelapse1.cc
+|   |   |-- timeelapse2.cc
+|   |   |-- topclosed1.cc
+|   |   |-- topclosure1.cc
+|   |   |-- universe1.cc
+|   |   |-- universe2.cc
+|   |   |-- watchdog1.cc
+|   |   |-- writeconsys1.cc
+|   |   |-- writegensys1.cc
+|   |   |-- writepolyhedron1.cc
+|   |   |-- writepolyhedron2.cc
+|   |   |-- writerelation1.cc
+|   |   `-- writevariable1.cc
+|   |-- Random_Number_Generator.defs.hh
+|   |-- Random_Number_Generator.inlines.hh
+|   |-- Random_Number_Generator.types.hh
+|   |-- files.cc
+|   |-- files.hh
+|   |-- ppl_test.cc
+|   |-- ppl_test.hh
+|   |-- print.cc
+|   `-- print.hh
+`-- utils
+    |-- Makefile.am
+    |-- Makefile.in
+    |-- build_header.in
+    |-- text2cxxarray.in
+    |-- timings.cc
+    `-- timings.hh
+
+--------
+
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files called `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files called `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ .
diff --git a/README.configure b/README.configure
new file mode 100644
index 0000000..744cc4f
--- /dev/null
+++ b/README.configure
@@ -0,0 +1,217 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+See below for the copying conditions.
+
+
+Configuration of the Parma Polyhedra Library
+============================================
+
+In an ideal situation (i.e., on a more or less standard Un*x
+environment, with the right compilers, the GMP library installed in
+a standard place and provided the user is satisfied with all the
+options we chose as defaults), a source distribution of the Parma
+Polyhedra Library (PPL) can be unpacked, configured, built and
+installed with the following, well-known procedure:
+
+  $ tar jxf ppl-x.y.tar.bz2
+  $ ./configure
+  $ make
+  $ su
+  Password: <root password>
+  $ make install
+
+After successful completion of these steps the PPL is completely installed
+on the system and can be used as expected.
+
+On the other hand, the PPL `configure' shell script provides many
+options to adjust the build and installation process for customizing
+the PPL installation.  The `INSTALL' file gives a detailed description
+of the non PPL-specific aspects of the configuration, compilation and
+installation process and describes the basic options of the
+`configure' script.  For a compact summary of all the available
+configuration options, run the command
+
+  $ ./configure --help
+
+The PPL-specific aspects of the configuration, compilation and
+installation process are discussed in the following sections.
+
+
+Using the Right Version of GMP
+------------------------------
+
+In order to use this version of the PPL you must make sure that:
+
+(1) GMP version 4.1.3 or later is installed on your system;
+(2) that this version was compiled with the C++ interface enabled;
+(3) that this C++ interface was compiled with the same compiler
+    version with which you will compile the PPL;
+(4) that your C and C++ compilers and your linker will find _that_
+    version of GMP and not others that may be present in your system.
+
+Since the binary distributions of GMP most likely contain a version
+that was compiled with the C++ interface disabled, or compiled with
+a C++ compiler implementing a different ABI than the compiler you
+will use to compile the PPL, the only reliable solution to points
+(1), (2) and (3) above is to visit GMP's home page at
+
+  http://www.swox.com/gmp/
+
+and download the last available version.  Then decide where to install
+it and call this place in your file system <GMP prefix>.  Then, unless
+you have special needs, you can invoke the GMP's configure script with
+the options
+
+  --prefix=/usr/local --enable-cxx
+
+If the C++ compiler you will use to compile the PPL is not the default
+on your system then, in order to satisfy point (3) above, you should
+set the `CXX', `CXXFLAGS' and `CXXCPP' environment variables so as to
+use the intended compiler with the intended options.  See the file
+`INSTALL.autoconf' in the GMP distribution for more on this subject.
+
+If you want to use the PPL ability to recover from out-of-memory
+situations, you should use a version of GMP compiled with GCC (which
+implies you should then compile also the PPL with GCC) using the
+`-fexceptions' option.  To build such a version, you can use the
+`CPPFLAGS' environment variable, so that it contains (among possibly
+other compiler options) `-fexceptions'.  Again, see `INSTALL.autoconf'
+in the GMP distribution for more on using environment variables to
+influence the configure script.
+
+In order to achieve point (4) above, if the directory <GMP prefix>
+is not standard for your compiler and/or for your linker, you will
+have to make sure the configure script of the PPL is invoked with,
+among others, the option
+
+  --with-libgmpxx-prefix=<GMP prefix>
+
+If you use shared libraries, consult the documentation of your
+dynamic linker/loader (`man ld.so' will do on most Un*x-like systems)
+to see how to make sure that GMP's shared library will be found at
+runtime (setting the environment variable `LD_LIBRARY_PATH' to
+"<GMPprefix>/lib:$LD_LIBRARY_PATH" is the most commonly used solution).
+
+
+Using the Right C and C++ Compilers
+-----------------------------------
+
+The configure script of the PPL, as you can see by using its `--help'
+option, besides recognizing `CC', `CXX', `CFLAGS', `CXXFLAGS' and
+other environment variables, provides four switches with which you can
+select the compilers and compilers' options to use for building the
+library.  These switches are
+
+  --with-cc=XXX           use XXX as the C compiler
+  --with-cxx=XXX          use XXX as the C++ compiler
+  --with-cflags=XXX       add XXX to the options for the C compiler
+  --with-cxxflags=XXX     add XXX to the options for the C++ compiler
+
+Let us take the occasion to stress, once again, the fact that you
+_must_ use the same C++ compiler to compile the C++ interface of GMP,
+the PPL and your application, if you use the C++ interface of the PPL.
+
+Here is an example with the Intel C/C++ compiler version 8.1.  Assuming
+you have configured GMP with a command like
+
+  CC=icc CXX=icpc /path/to/gmp-4.1.4/configure --enable-cxx \
+    --prefix=/opt/intel_cc_80
+
+you can configure the PPL with a command like
+
+  /path/to/ppl-x.y/configure --with-cxx=icpc --with-cc=icc \
+    --with-cxxflags="-w2 -wd161,177,193,279,383,444,981,1188,1418" \
+    --with-libgmpxx-prefix=/opt/intel_cc_80
+
+Notice that the `--with-cxxflags' option is absolutely non-essential
+here and is only included to show how extra compiler options can be
+passed to the configure script.
+
+As another example, here is how you can compile the PPL with
+Comeau C/C++ 4.3.3.  First configure GMP with a command like
+
+  CXX=como /path/to/gmp-4.1.4/configure --enable-cxx \
+    --disable-shared --prefix=/usr/local/lib/como433/local
+
+Then you can configure the PPL with a command like
+
+  /path/to/ppl/configure --with-cc="como --c" --with-cxx=como \
+    --with-cxxflags="--remarks --strict --long_long \
+    --display_error_number --diag_suppress 193,236,340,401,679" \
+    --disable-shared --with-libgmpxx-prefix=/usr/local/lib/como433/local
+
+Notice the use of the option `--disable-shared' both in the configuration
+of GMP and the configuration of the PPL.  This is due to the fact that
+Comeau C/C++ 4.3.3 does not support shared libraries.
+
+
+Enabling the Use of Alternative Coefficient Types
+-------------------------------------------------
+
+When speed is important and the numerical coefficients involved are
+likely to be small, you can configure the PPL to use checked native
+integers (8, 16, 32 or 64 bits wide) for the representation of the
+coefficients.  This is a safe strategy since, when using checked
+native integers, the library also performs systematic (yet efficient)
+overflow detection and, in case of overflow, an exception is raised.
+To enable the use of various kinds of coefficients, you can use
+the configure option
+
+  --enable-coefficients=TYPE
+
+where TYPE is one of
+
+  mpz               use GMP unbounded integers (default)
+  checked-int8      use  8-bit checked integers
+  checked-int16     use 16-bit checked integers
+  checked-int32     use 32-bit checked integers
+  checked-int64     use 64-bit checked integers
+
+When using checked integers it is also wise to increase the
+optimization level, since their efficiency largely depends on
+the compiler and on the optimization options used.  Adding
+
+  --enable-optimization=speed
+
+to the command line is thus recommended (in later releases we will
+try to make the choice of the optimization options automatic).
+If you want to test the overhead of checked integers with respect
+to plain, unchecked native integers and you really know what you
+are doing, you may be interested in knowing that these additional
+choices for TYPE are available:
+
+  native-int8      use  8-bit *unchecked* integers
+  native-int16     use 16-bit *unchecked* integers
+  native-int32     use 32-bit *unchecked* integers
+  native-int64     use 64-bit *unchecked* integers
+
+--------
+
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files called `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files are called `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ .
diff --git a/STANDARDS b/STANDARDS
new file mode 100644
index 0000000..6e9c002
--- /dev/null
+++ b/STANDARDS
@@ -0,0 +1,489 @@
+
+Coding Standards for the Parma Polyhedra Library
+================================================
+
+Please read the first chapters of "Ada 95 Quality and Style:
+Guidelines for Professional Programmers" (you will find a link to it
+in the "Links" section of the PPL web site).
+
+
+Names
+-----
+
+Carefully choose names that clarify the nature or the intended use of
+the entity you are naming.  Do not be afraid of long identifiers, even
+though conciseness is always a good thing.  Do not use abbreviations
+when shorter synonyms exist.  Use underscores to separate words in a
+compound name.  By all means, avoid baStudlyCaps: write
+available_widening_tokens (if it is a variable) or
+Available_Widening_Tokens (if it is a class or enum); never write
+availableWideningTokens or AvailableWideningTokens.
+
+
+Pre and post increment and decrement operators
+----------------------------------------------
+
+All other things being equal, always prefer preincrement and
+predecrement to postincrement and postdecrement.
+
+
+Swap specialization
+-------------------
+
+All library types should provide a publicly available swap method.
+Whenever appropriate for ensuring efficiency, the generic std::swap
+algorithm should be specialized to use the swap method.
+
+
+Limiting the visibility of variables, functions, macros and so forth
+--------------------------------------------------------------------
+
+Avoid using the keyword "static" to specify that global variables or
+functions should be visible only inside the current translation unit;
+use the anonymous namespace, instead. The keyword "static" should
+only appear inside class definitions or function bodies. As an example,
+
+static const char* s = "Not accessible by other translation units";
+
+static void f() {
+  // ... function body ...
+}
+
+should be replaced by
+
+namespace {
+
+const char* s = "Not accessible by other translation units";
+
+void f() {
+  // ... function body ...
+}
+
+} // namespace
+
+However, do not use anonymous namespaces in a header file
+(any file that is meant to be included in other translation units).
+Instead, define and use a new non-anonymous namespace that should
+be placed inside the namespace
+
+    Parma_Polyhedra_Library::Implementation
+
+Concerning macros and the implementation languages (such as C and Prolog)
+that have a flat identifiers namespace, make sure the library limits
+its impact as much as possible by naming objects in a conspicuous way
+and by limiting as much as possible the scope of declarations.
+This means
+
+- all C and C++ macros should have names prefixed by "PPL_";
+  those that are not meant to be directly accessible by the user should
+  be #undef'ed as soon as possible in the source file they are defined in;
+- all functions and types declared by the C interface should have
+  names prefixed by "ppl_";
+- all Prolog predicates declared by the Prolog interfaces should have
+  names prefixed by "ppl_".
+
+
+Macros
+------
+
+Macros should be used only if really needed (in many cases, macros can
+be replaced by inline functions).
+
+
+Length of source lines
+----------------------
+
+Avoid, when possible, source lines longer than 78 characters.
+
+
+Trailing whitespace
+-------------------
+
+Always avoid trailing whitespace.
+If you use emacs, then all the trailing whitespace in the current
+buffer can be removed by using the command
+
+  M-x delete-trailing-whitespace
+
+If you keep inserting trailing whitespace when coding, then you may
+want to put the following two lines in your .emacs:
+
+;; Show trailing whitespace.
+(setq-default show-trailing-whitespace t)
+
+
+Block closures
+--------------
+
+Try to make clear what is being closed.  For example:
+
+1)
+
+namespace Parma_Polyhedra_Library {
+
+...
+
+} // namespace Parma_Polyhedra_Library
+
+2)
+
+extern "C" {
+
+...
+
+} // extern "C"
+
+3)
+
+#ifndef PPL_Class_defs_hh
+
+...
+
+#endif // !defined(PPL_Class_defs_hh)
+
+
+Namespace indentation
+---------------------
+
+The entire library is in its own namespace.  We sometimes specialize
+std::swap() and std::iter_swap().  Other namespaces may be involved
+but only in restricted contexts.  Therefore, we have unindented
+namespace-level declarations, thus saving some precious horizontal
+space.  For example:
+
+namespace Parma_Polyhedra_Library {
+
+non-empty lines here start at column 0;
+
+} // namespace Parma_Polyhedra_Library
+
+If you use emacs, you may want to put the following two lines in your
+.emacs:
+
+;; Disable indentation when in namespace blocks.
+(c-set-offset 'innamespace 0)
+
+
+Negation
+--------
+
+Use `!' to negate a value.
+
+For example, use
+
+	if (!ph.is_empty())
+	   std::cout << "ph contains at least one point" << endl;
+
+instead of
+
+	if (ph.is_empty() == false)
+	   std::cout << "ph contains at least one point" << endl;
+
+
+Comparison with zero
+--------------------
+
+Be explicit when comparing a value with zero in a conditional context.
+
+For example, use
+
+	assert(sys.num_rows() != 0);
+
+instead of
+
+	assert(sys.num_rows());
+
+
+Standards for Structuring the Source Code in Files
+==================================================
+
+Source code should be organized so as to ensure that:
+  - the contents of a file are strongly related;
+  - each file is of manageable size.
+
+As a rule of thumb, each type (class, struct, class template, etc.)
+named "Xtype" that is relevant on its own for the user or the
+developer of the library should be provided with a set of source files
+whose filenames start with "Xtype". The source files for such a type
+should be named and populated as follows:
+
+a) Xtype.types.hh
+Contains the forward declarations of type names (in particular, the
+one for "Xtype") and other useful typedef's.
+
+b) Xtype.defs.hh
+Contains the definition of the type, together with the declaration of
+any function that, even though not being formally part of the type, is
+nonetheless related to it and should therefore be considered part of
+its interface.
+
+c) Xtype.inlines.hh
+Contains the definitions of inline functions.
+
+d) Xtype.templates.hh
+Contains the non-inline definitions of all class template members and
+all (member or non-member) function templates that are not fully
+specialized.
+
+e) Xtype.cc
+Contains the definitions of non-inline functions, including non-inline
+full specializations of templates.
+
+f) When appropriate, further *.cc files can be used to split huge
+source files into more manageable components (e.g., see the files
+Polyhedron_public.cc, Polyhedron_nonpublic.cc, Polyhedron_chdims.cc
+and Polyhedron_widenings.cc, or even conversion.cc, minimize.cc, etc.).
+
+Note that:
+  - all interface functions should be declared in Xtype.defs.hh;
+  - no function definition should be placed in Xtype.defs.hh;
+  - bare declarations should not be declared inline (i.e., inline directives
+    should be placed only in front of the definition of the functions);
+  - inner classes are usually kept in the same files as the outer class;
+  - functions having the anonymous namespace scope can be (and usually are)
+    only declared and defined in file Xtype.cc, regardless of whether or not
+    the inline directive is specified.
+
+
+Standards for Documenting the Project with Doxygen
+==================================================
+
+1) All code entities (classes, structs, enums, variables, methods,
+   functions, etc.) should be provided with a brief Doxygen comment.
+   Brief comments are normally obtained as follows:
+
+     //! Brief comment for class C.
+     class C {
+       ...
+     };
+
+   If the comment is multi-line, then the following syntax should be adopted:
+
+     /*! \brief
+       A brief comment for class C, that is a bit too long
+       to be placed in a single line.
+     */
+     class C {
+       ...
+     };
+
+2) A *friend* declaration of a function should NOT be provided with
+   a Doxygen comment. Rather, it is the very declaration of the function
+   (which should be found outside of the class) that has to be documented.
+
+3) When needed or useful, brief comments should be followed by detailed
+   Doxygen comments. If the brief comment spans a single line of text, then
+   the following syntax can be adopted:
+
+     //! Brief comment for class C.
+     /*!
+       More details on class C.
+       Even more details.
+     */
+     class C {
+       ...
+     };
+
+   Otherwise, if the brief comment spans multiple lines of text, the
+   following syntax should be adopted, where the brief and the detailed
+   documentation are merged in a single multiline comment block:
+
+     /*! \brief
+       Brief comment for class C.
+
+       More details on class C.
+       Even more details.
+     */
+     class C {
+       ...
+     };
+
+   The first paragraph break (in this case, the empty line) marks the
+   separation between the brief and the detailed part. Note that
+   all the uses of \param, \result and \exception special commands
+   will automatically cause a paragraph break, therefore starting
+   the detailed part. This will happen even when using the //! style
+   documentation blocks.
+
+4) In the produced documentation, the brief comment will be
+   automatically repeated just before the detailed comment,
+   so that bare repetitions should be avoided.
+
+5) In the source files, detailed comments should be placed together
+   with the brief ones, so that all the documentation pertinent to a
+   code entity is kept in a single file (typically, the *.defs.hh file).
+
+6) Brief Doxygen comments should be brief (indeed).
+   If more than two lines are required, then the comment should be
+   split into a brief part and a detailed part.
+
+7) Code entities or details that should not be visible to the end-user
+   (but that are useful for the developers) should be surrounded by
+
+     #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+	//! ... doxygen comments ...
+     #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+   so that they will only appear in the developer's reference.
+   Note that the above preprocessing flags are not necessary
+   (and should therefore be avoided) when documenting:
+    - a private member of a class (because private members never
+      appear in the user manual);
+    - a public member of a class that is not documented
+      (because even the documented members of an undocumented
+      class are automatically filtered out of the user manual).
+
+8) Merging multiple comment blocks is not (fully) supported by Doxygen.
+   Thus, the technique described in point 4) above is useless
+   when we want an end-user comment block to be integrated,
+   in the developer's reference only, by further comments.
+   In such a case, a single comment block should be used as follows:
+
+     /*!
+       ... Doxygen comments for both user and developer ...
+       \if Include_Implementation_Details
+       ... Doxygen comments for developer only ...
+       \endif
+       ... Doxygen comments for both user and developer ...
+     */
+
+9) The documentation of those functions that are neither methods
+   nor friends of a given class, but are related in some way to that
+   class, should be made part of the documentation of the class.
+   This is obtained by using the Doxygen \relates special command
+   as follows:
+
+     /*! \relates Classname */
+
+   It seems that, in order to correctly match function declarations
+   and definitions, the \relates command should be placed in both places.
+   Typically, this will be the only kind of Doxygen command
+   occurring in *.inlines.hh and *.cc source files.
+
+   If Classname is a templatic class, the arguments of the template
+   (as well as the angle brackets) should be omitted.
+   The namespace qualification of the class can be omitted, provided
+   the comment block is included in the namespace scope.
+
+10)
+  If the \return or \param special commands are used, then these have to
+  be placed after the brief Doxygen comment.  The \return special
+  command, if present, should come before any \param command.  The
+  \exception special command, if present, should come after any \param
+  command. All the parameters of the function should be provided by the
+  corresponding \param command, respecting their textual order,
+  separating them with a blank line.  The documentation of each
+  parameter should start at the line immediately following the \param
+  command.  Typically, the list of parameters should be formatted as
+  follows, where the \return command is optional.
+
+  /*! \brief
+    The brief description.
+
+    The detailed description, if any.
+
+    \return
+    Documentation for the return value, if provided.
+
+    \param p1
+    Documentation for p1;
+
+    \param p2
+    Documentation for p2;
+    other documentation for p2;
+
+    \param p3
+    Documentation for p3.
+
+    \exception exception_type1
+    Documentation for the exceptions of type exception_type1;
+
+    \exception exception_type2
+    Documentation for the exceptions of type exception_type2.
+
+    Another piece of detailed description, if needed.
+  */
+  int foo(const bar& p1, const bar& p2, int p3);
+
+
+Standards for the Test Programs
+===============================
+
+o  Include the header file `ppl_test.hh' to include common declarations
+   for test code (see below).
+
+o  Place the test code in test functions that return a Boolean value.
+   Name the test functions test01, test02, etc.
+
+o  Each test program should contain no more than 20 test functions.
+
+o  The test functions should be written
+
+        // Comment describing the test...
+        bool
+          test10() {
+            // ... test code ...
+        }
+
+   where the 10 in "test10" indicates that it is the 10th test function
+   in the program.
+
+o  The test functions should return true if the test succeeds and false
+   if it fails.
+
+o  Following all the test functions, include:
+
+        BEGIN_MAIN
+          DO_TEST(test01);
+          DO_TEST(test02);
+          ...
+        END_MAIN
+
+   where every test function in the program is included in the list.
+
+o  Normally, test code should produce no output at all (independently from
+   whether the test succeeded or failed). Output is only meant to help
+   during debugging. In order to support for the coding of conditional
+   output, the header file `ppl_test.hh' defines the output streams `nout'
+   and `vnout'. By default, any output directed to these streams will be
+   simply discarded. For example,
+
+        nout << "A message when noisy." << endl;
+        vnout << "A message when very noisy." << endl;
+
+   will produce no output at all. By default, the helper print functions
+   (e.g., print_constraints, print_generators, etc.) are directed to
+   stream `nout', so that they will normally discard the output too.
+
+o  By defining the environment variables `PPL_NOISY_TESTS' and/or
+   `PPL_VERY_NOISY_TESTS' to any value, the streams `nout' and `vnout'
+   will be redirected to standard output and become noisy.
+
+o  On very weird platforms the above mechanism may not be supported.
+   In these rare cases, the same effect can be obtained by defining
+   the preprocessor variables NOISY and/or VERY_NOISY to any value other
+   than zero and recompiling the test program.  Thus, if some output is
+   (locally and temporarily) needed for debugging purposes, one option
+   is to add
+
+      #define NOISY 1
+      #define VERY_NOISY 1
+
+   as the very first line of the test source file and recompile it.
+
+o  To avoid repeated namespace qualifications, the header file `ppl_test.hh'
+   adds a using directive for the whole PPL namespace. It also adds a
+   using declaration for `std::endl'. All the other objects defined in
+   the namespace `std' should be explicitly qualified in the test files
+   (typically, by adding a corresponding using declaration).
+
+o  If PPL stream input and output is required, then an explicit using
+   directive for the Parma_Polyhedra_Library::IO_Operators namespace
+   should be added to the test file.
+
+o  Refer to the existing tests for examples. Many tests are written along
+   the following schema:
+     a) create a PPL object and perform some computations with it;
+     b) create a second object in a different (maybe simpler) way, having
+        as value the expected result of the computations done in point a);
+     c) check for equivalence of the two objects.
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..0254a33
--- /dev/null
+++ b/TODO
@@ -0,0 +1,68 @@
+
+Enhancements for PPL 0.10
+=========================
+
+- Develop a C and Prolog interfaces for all the supported domains.
+- Incorporate the domain of intervals.
+- Reduce the number of FIXMEs to no more than 20.
+- Complete the manual pages for ppl-config, ppl_lpsol and ppl_lcdd.
+- Write a manual page for ppl (3).
+- Ensure that the Grid tests cover all the code.
+- Provide a single, generic implementation to replace all our status
+  classes.
+- Clearly explain, in the documentation, how (not) to use
+  set_GMP_memory_allocation_functions().  More generally, explain how
+  to have memory-guarded computations.
+- Reconsider the handling of temporary coefficients.
+- Provide a generic implementation for the `widening with tokens'.
+- Transform LP_Problem into an incremental solver and add to it support
+  for abandoning costly computations.
+- Add a widening for grids using only generator representations.
+
+
+Enhancements for PPL 0.10 or later versions
+==========================================
+
+- Implement void Polyhedron::envelope_assign(const Polyhedron& y).
+- Implement the extrapolation operators defined in HenzingerH95
+  and HenzingerPW01.
+- See whether, using the techniques described in
+  ftp://ftp.ifor.math.ethz.ch/pub/fukuda/reports/polyunion001120.ps.gz
+  we can implement bool poly_hull_assign_if_exact(PH& p, const PH& q),
+  temporarily in algorithms.hh, more efficiently.
+- Provide optimized implementations of Polyhedron::expand_dimension()
+  Polyhedron::fold_dimensions().
+- Experiment with different compilation flags, such as GCC's
+  `-fno-threadsafe-statics'.
+- Reimplement the ask-and-tell generic construction.
+- Suppose we are only interested in integral solutions (as is the
+  case, e.g., in most termination analyses).  Then cutting-plane methods
+  (Gomory, Chv�tal, ...) allow to shrink polyhedra still not losing any
+  integral solution.
+  See http://www.cs.unipr.it/ppl/Documentation/bibliography#NemhauserW88
+
+
+Efficiency Issues
+=================
+
+- There must be a more efficient way to implement
+  bool Polyhedron::is_disjoint_from(const Polyhedron&).
+- There must be a more efficient way to compute convex
+  differences.
+- We are being rather careless about the creation of temporaries
+  as far as the classes Linear_Expression, Constraint and Generator
+  are concerned.
+
+
+Debian packaging
+================
+
+- Add an interface package for each Prolog as a suitable version of
+  that Prolog appears in Debian.  Control entries for these are in
+  control.prologs.
+- Find out if /usr/lib/pkgconfig entries are required in any packages.
+- libppl-dev is very large.  Consider moving the docs to libppl-doc
+  and the other files into libppl.
+- Verify the Build-Depends and Build-Depends-Indep settings, as per
+  the Debian Developers Reference section 5.10.1 point 1.
+- Consider renaming libppl-pwl to libpwl.
diff --git a/Watchdog/BUGS b/Watchdog/BUGS
new file mode 100644
index 0000000..4e96fe8
--- /dev/null
+++ b/Watchdog/BUGS
@@ -0,0 +1,2 @@
+
+Please report any bug you find to bagnara at cs.unipr.it.
diff --git a/Watchdog/COPYING b/Watchdog/COPYING
new file mode 100644
index 0000000..3912109
--- /dev/null
+++ b/Watchdog/COPYING
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, 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 or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+

+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+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 give any other recipients of the Program a copy of this License
+along with the Program.
+
+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 Program or any portion
+of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+

+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+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 Program, 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 Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) 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; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, 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 executable.  However, as a
+special exception, the source code 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.
+
+If distribution of executable or 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 counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+

+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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.
+
+  5. 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 Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program 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 to
+this License.
+
+  7. 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 Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program 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 Program.
+
+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.
+

+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program 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.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the 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 Program
+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 Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, 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
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), 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 Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  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.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Watchdog/CREDITS b/Watchdog/CREDITS
new file mode 100644
index 0000000..be59266
--- /dev/null
+++ b/Watchdog/CREDITS
@@ -0,0 +1,12 @@
+
+Authors
+=======
+
+The Parma Watchdog Library and its (non-existent) documentation have
+been designed, written, debugged and improved by Roberto Bagnara [1]
+<bagnara at cs.unipr.it>.
+
+
+--------
+
+ [1] http://www.cs.unipr.it/~bagnara/
diff --git a/Watchdog/ChangeLog b/Watchdog/ChangeLog
new file mode 100644
index 0000000..278f82e
--- /dev/null
+++ b/Watchdog/ChangeLog
@@ -0,0 +1,1024 @@
+2006-03-12  Release Manager
+
+	* PPL 0.9 Released.
+
+2006-03-10 Friday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.14): Updated.
+
+2006-03-05 Sunday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.20), config.sub (1.19): Updated.
+
+2006-02-18 Saturday 07:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.7): Do not distribute ppl_include_files.hh and
+	  pwl_include_files.hh.  Now ppl.hh and pwl.hh installation can be
+	  completely delegated to Automake.
+
+2006-02-11 Saturday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: .cvsignore (1.2), Makefile.am (1.6): We now directly create
+	  `pwl.hh': `pwl_install.hh' does not exist any longer.
+
+2006-02-11 Saturday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/.cvsignore (1.2): Ignore more built files and directories.
+
+2006-01-25 Wednesday 21:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.in (grids.4): Makefile.in is automatically
+	  generated: it should not be under CVS.
+
+2006-01-25 Wednesday 19:31  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* CREDITS, ChangeLog, NEWS, README (grids.[1,3,2,3]): Eighth and
+	  last merge from the main trunk.
+
+2006-01-20 Friday 09:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_8-branch.2): Mark ChangeLog.
+
+2006-01-20 Friday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_8-branch.1): Updated.
+
+2006-01-17 Tuesday 15:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* CREDITS (1.2): "inexistent" replaced by "non-existent".
+
+2006-01-17 Tuesday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.13): Updated.
+
+2006-01-16 Monday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.14): Updated.
+
+2006-01-16 Monday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.8): Release date decided.
+
+2006-01-16 Monday 02:10  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* ChangeLog, Makefile.am, NEWS, README, config.guess, config.sub,
+	  configure.ac, install-sh, ltmain.sh,
+	  src/Doubly_Linked_Object.defs.hh,
+	  src/Doubly_Linked_Object.inlines.hh,
+	  src/Doubly_Linked_Object.types.hh, src/EList.defs.hh,
+	  src/EList.inlines.hh, src/EList.types.hh,
+	  src/EList_Iterator.defs.hh, src/EList_Iterator.inlines.hh,
+	  src/EList_Iterator.types.hh, src/Handler.defs.hh,
+	  src/Handler.inlines.hh, src/Handler.types.hh, src/Makefile.am,
+	  src/Makefile.in, src/Pending_Element.cc,
+	  src/Pending_Element.defs.hh, src/Pending_Element.inlines.hh,
+	  src/Pending_Element.types.hh, src/Pending_List.cc,
+	  src/Pending_List.defs.hh, src/Pending_List.inlines.hh,
+	  src/Pending_List.types.hh, src/Time.cc, src/Time.defs.hh,
+	  src/Time.inlines.hh, src/Time.types.hh, src/Watchdog.cc,
+	  src/Watchdog.defs.hh, src/Watchdog.inlines.hh,
+	  src/Watchdog.types.hh, src/pwl_header.hh, utils/Makefile.am,
+	  utils/build_header.in
+	  (grids.[2,3,1,2,4,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2]):
+	  Seventh (last but one?) merge of the main trunk to the grids
+	  branch.
+
+2006-01-14 Saturday 15:48  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* NEWS (1.7): Add detail to the 0.5 Time entry.
+
+2006-01-14 Saturday 15:37  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* NEWS (1.6): Update 0.8 entries from ChangeLog.
+
+2006-01-10 Tuesday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.25), src/Makefile.am (1.5), utils/Makefile.am
+	  (1.6): Avoid providing default information that Automake does
+	  figure out by itself.
+
+2006-01-09 Monday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.19), config.sub (1.18): Updated.
+
+2006-01-09 Monday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.13): Updated.
+
+2006-01-06 Friday 21:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* ChangeLog, Makefile.am, README, config.guess, config.sub,
+	  configure.ac, install-sh, ltmain.sh,
+	  src/Doubly_Linked_Object.defs.hh,
+	  src/Doubly_Linked_Object.inlines.hh,
+	  src/Doubly_Linked_Object.types.hh, src/EList.defs.hh,
+	  src/EList.inlines.hh, src/EList.types.hh,
+	  src/EList_Iterator.defs.hh, src/EList_Iterator.inlines.hh,
+	  src/EList_Iterator.types.hh, src/Handler.defs.hh,
+	  src/Handler.inlines.hh, src/Handler.types.hh, src/Makefile.am,
+	  src/Pending_Element.cc, src/Pending_Element.defs.hh,
+	  src/Pending_Element.inlines.hh, src/Pending_Element.types.hh,
+	  src/Pending_List.cc, src/Pending_List.defs.hh,
+	  src/Pending_List.inlines.hh, src/Pending_List.types.hh,
+	  src/Time.cc, src/Time.defs.hh, src/Time.inlines.hh,
+	  src/Time.types.hh, src/Watchdog.cc, src/Watchdog.defs.hh,
+	  src/Watchdog.inlines.hh, src/Watchdog.types.hh,
+	  src/pwl_header.hh, utils/Makefile.am, utils/build_header.in
+	  (simplex.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  First merge from the main trunk.
+
+2006-01-01 Sunday 22:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: EList.defs.hh (1.3), Pending_List.defs.hh (1.3),
+	  Time.defs.hh (1.3): Do adopt the new format for multiline brief
+	  doxygen documentation.
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.24), README (1.12), configure.ac (1.33),
+	  src/Doubly_Linked_Object.defs.hh (1.2),
+	  src/Doubly_Linked_Object.inlines.hh (1.2),
+	  src/Doubly_Linked_Object.types.hh (1.2), src/EList.defs.hh (1.2),
+	  src/EList.inlines.hh (1.2), src/EList.types.hh (1.2),
+	  src/EList_Iterator.defs.hh (1.2), src/EList_Iterator.inlines.hh
+	  (1.2), src/EList_Iterator.types.hh (1.2), src/Handler.defs.hh
+	  (1.2), src/Handler.inlines.hh (1.2), src/Handler.types.hh (1.2),
+	  src/Makefile.am (1.4), src/Pending_Element.cc (1.2),
+	  src/Pending_Element.defs.hh (1.2), src/Pending_Element.inlines.hh
+	  (1.2), src/Pending_Element.types.hh (1.2), src/Pending_List.cc
+	  (1.2), src/Pending_List.defs.hh (1.2),
+	  src/Pending_List.inlines.hh (1.2), src/Pending_List.types.hh
+	  (1.2), src/Time.cc (1.2), src/Time.defs.hh (1.2),
+	  src/Time.inlines.hh (1.2), src/Time.types.hh (1.2),
+	  src/Watchdog.cc (1.2), src/Watchdog.defs.hh (1.2),
+	  src/Watchdog.inlines.hh (1.2), src/Watchdog.types.hh (1.2),
+	  src/pwl_header.hh (1.2), utils/Makefile.am (1.5),
+	  utils/build_header.in (1.3): Copyright years extended.
+
+2005-12-19 Monday 07:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.18), config.sub (1.17), install-sh (1.13),
+	  ltmain.sh (1.16): Updated from Libtool 1.5.22.
+
+2005-12-05 Monday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.12): Updated.
+
+2005-10-11 Tuesday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess, src/Makefile.am, src/Makefile.in, utils/Makefile.am
+	  (grids.[3,2,2,3]): Fifth merge from main trunk.
+
+2005-10-02 Sunday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.3): Definition of BUILT_SOURCES revised.
+
+2005-10-02 Sunday 11:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.17): Updated.
+
+2005-09-28 Wednesday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.2): A PPL distribution should now be
+	  compilable even on environments lacking Perl.
+
+2005-09-28 Wednesday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: .cvsignore, Doubly_Linked_Object.defs.hh,
+	  Doubly_Linked_Object.inlines.hh, Doubly_Linked_Object.types.hh,
+	  EList.defs.hh, EList.inlines.hh, EList.types.hh,
+	  EList_Iterator.defs.hh, EList_Iterator.inlines.hh,
+	  EList_Iterator.types.hh, Handler.defs.hh, Handler.inlines.hh,
+	  Handler.types.hh, Makefile.am, Makefile.in, Pending_Element.cc,
+	  Pending_Element.defs.hh, Pending_Element.inlines.hh,
+	  Pending_Element.types.hh, Pending_List.cc, Pending_List.defs.hh,
+	  Pending_List.inlines.hh, Pending_List.types.hh, Time.cc,
+	  Time.defs.hh, Time.inlines.hh, Time.types.hh, Watchdog.cc,
+	  Watchdog.defs.hh, Watchdog.inlines.hh, Watchdog.types.hh,
+	  pwl_header.hh
+	  (grids.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Files moved as in the main trunk.
+
+2005-09-28 Wednesday 21:04  Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+	* .cvsignore, ChangeLog, Doubly_Linked_Object.defs.hh,
+	  Doubly_Linked_Object.inlines.hh, Doubly_Linked_Object.types.hh,
+	  EList.defs.hh, EList.inlines.hh, EList.types.hh,
+	  EList_Iterator.defs.hh, EList_Iterator.inlines.hh,
+	  EList_Iterator.types.hh, Handler.defs.hh, Handler.inlines.hh,
+	  Handler.types.hh, Makefile.am, Pending_Element.cc,
+	  Pending_Element.defs.hh, Pending_Element.inlines.hh,
+	  Pending_Element.types.hh, Pending_List.cc, Pending_List.defs.hh,
+	  Pending_List.inlines.hh, Pending_List.types.hh, Time.cc,
+	  Time.defs.hh, Time.inlines.hh, Time.types.hh, Watchdog.cc,
+	  Watchdog.defs.hh, Watchdog.inlines.hh, Watchdog.types.hh,
+	  configure.ac, pwl_header.hh, utils/Makefile.am,
+	  utils/build_header, utils/build_header.in
+	  (grids.[1,1,2,2,1,2,2,1,2,2,1,3,3,1,2,2,2,2,1,2,2,2,1,2,2,3,1,2,2,2,1,2,2,2,2,1]):
+	  Fourth merge from the main trunk.
+
+2005-09-28 Wednesday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/Makefile.am (1.4): Make sure the scripts in the `utils'
+	  subdirectory are made also at distribution time, even if they are
+	  not distributed themselves.
+
+2005-09-23 Friday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.5): Updated.
+
+2005-09-23 Friday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Doubly_Linked_Object.defs.hh (1.4),
+	  Doubly_Linked_Object.inlines.hh (1.4),
+	  Doubly_Linked_Object.types.hh (1.3), EList.defs.hh (1.6),
+	  EList.inlines.hh (1.5), EList.types.hh (1.3),
+	  EList_Iterator.defs.hh (1.4), EList_Iterator.inlines.hh (1.5),
+	  EList_Iterator.types.hh (1.3), Handler.defs.hh (1.6),
+	  Handler.inlines.hh (1.5), Handler.types.hh (1.3), Makefile.am
+	  (1.23), Pending_Element.cc (1.4), Pending_Element.defs.hh (1.4),
+	  Pending_Element.inlines.hh (1.4), Pending_Element.types.hh (1.3),
+	  Pending_List.cc (1.4), Pending_List.defs.hh (1.4),
+	  Pending_List.inlines.hh (1.4), Pending_List.types.hh (1.3),
+	  Time.cc (1.4), Time.defs.hh (1.4), Time.inlines.hh (1.5),
+	  Time.types.hh (1.3), Watchdog.cc (1.21), Watchdog.defs.hh (1.17),
+	  Watchdog.inlines.hh (1.14), Watchdog.types.hh (1.7), configure.ac
+	  (1.32), pwl_header.hh (1.2), src/.cvsignore (1.1),
+	  src/Doubly_Linked_Object.defs.hh (1.1),
+	  src/Doubly_Linked_Object.inlines.hh (1.1),
+	  src/Doubly_Linked_Object.types.hh (1.1), src/EList.defs.hh (1.1),
+	  src/EList.inlines.hh (1.1), src/EList.types.hh (1.1),
+	  src/EList_Iterator.defs.hh (1.1), src/EList_Iterator.inlines.hh
+	  (1.1), src/EList_Iterator.types.hh (1.1), src/Handler.defs.hh
+	  (1.1), src/Handler.inlines.hh (1.1), src/Handler.types.hh (1.1),
+	  src/Makefile.am (1.1), src/Pending_Element.cc (1.1),
+	  src/Pending_Element.defs.hh (1.1), src/Pending_Element.inlines.hh
+	  (1.1), src/Pending_Element.types.hh (1.1), src/Pending_List.cc
+	  (1.1), src/Pending_List.defs.hh (1.1),
+	  src/Pending_List.inlines.hh (1.1), src/Pending_List.types.hh
+	  (1.1), src/Time.cc (1.1), src/Time.defs.hh (1.1),
+	  src/Time.inlines.hh (1.1), src/Time.types.hh (1.1),
+	  src/Watchdog.cc (1.1), src/Watchdog.defs.hh (1.1),
+	  src/Watchdog.inlines.hh (1.1), src/Watchdog.types.hh (1.1),
+	  src/pwl_header.hh (1.1): Restructured.
+
+2005-09-23 Friday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.31): Configure is no longer responsible for
+	  creating build_header.
+
+2005-09-23 Friday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/: Makefile.am (1.3), build_header.in (1.2): Generation of
+	  utility scripts fixed.
+
+2005-09-23 Friday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.22), configure.ac (1.30), utils/Makefile.am (1.2),
+	  utils/build_header (1.2), utils/build_header.in (1.1): Allow Perl
+	  to be installed into non-standard places.
+
+2005-09-23 Friday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.29): Check for Perl.
+
+2005-09-19 Monday 14:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.11): Updated.
+
+2005-09-08 Thursday 01:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.28): Allow the specification of
+	  --enable-optimization=zero to temporarily get around bugs such as
+	  the one affecting Intel C/C++ 9.0.25 under Fedora Core 4.
+
+2005-09-02 Friday 18:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING, Doubly_Linked_Object.defs.hh,
+	  Doubly_Linked_Object.inlines.hh, EList.defs.hh, EList.inlines.hh,
+	  EList_Iterator.defs.hh, EList_Iterator.inlines.hh,
+	  Handler.defs.hh, Handler.inlines.hh, Makefile.am,
+	  Pending_Element.cc, Pending_Element.defs.hh,
+	  Pending_Element.inlines.hh, Pending_List.cc,
+	  Pending_List.defs.hh, Pending_List.inlines.hh, README, Time.cc,
+	  Time.defs.hh, Time.inlines.hh, Watchdog.cc, Watchdog.defs.hh,
+	  Watchdog.inlines.hh, compile, config.guess, config.sub,
+	  configure.ac, depcomp, install-sh, ltmain.sh, missing,
+	  mkinstalldirs, pwl_header.bottom, pwl_header.hh,
+	  pwl_header.middle, pwl_header.top, utils/.cvsignore,
+	  utils/Makefile.am, utils/build_header
+	  (grids.[1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1]):
+	  Second merge from main trunk.
+
+2005-09-01 Thursday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* install-sh (1.12), ltmain.sh (1.15): Updated from Libtool 1.5.20.
+
+2005-08-28 Sunday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* missing (1.8): Broken comments restored.
+
+2005-08-27 Saturday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.21): The `configure' script is now listed in
+	  `dist_noinst_SCRIPTS' and no longer in `EXTRA_DIST'.
+
+2005-08-27 Saturday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.20), configure.ac (1.27), pwl_header.bottom (1.3),
+	  pwl_header.hh (1.1), pwl_header.middle (1.4), pwl_header.top
+	  (1.8), utils/.cvsignore (1.1), utils/Makefile.am (1.1),
+	  utils/build_header (1.1): Definitely switch to the new mechanism
+	  to build the library headers.  The `build_header' script belongs
+	  to the `utils' directories.
+
+2005-08-22 Monday 00:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.16), config.sub (1.16): Updated.
+
+2005-08-22 Monday 00:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING (1.3), Doubly_Linked_Object.defs.hh (1.3),
+	  Doubly_Linked_Object.inlines.hh (1.3), EList.defs.hh (1.5),
+	  EList.inlines.hh (1.4), EList_Iterator.defs.hh (1.3),
+	  EList_Iterator.inlines.hh (1.4), Handler.defs.hh (1.5),
+	  Handler.inlines.hh (1.4), Makefile.am (1.19), Pending_Element.cc
+	  (1.3), Pending_Element.defs.hh (1.3), Pending_Element.inlines.hh
+	  (1.3), Pending_List.cc (1.3), Pending_List.defs.hh (1.3),
+	  Pending_List.inlines.hh (1.3), README (1.11), Time.cc (1.3),
+	  Time.defs.hh (1.3), Time.inlines.hh (1.4), Watchdog.cc (1.20),
+	  Watchdog.defs.hh (1.16), Watchdog.inlines.hh (1.13), compile
+	  (1.6), config.guess (1.15), config.sub (1.15), configure.ac
+	  (1.26), depcomp (1.9), ltmain.sh (1.14), missing (1.7),
+	  pwl_header.top (1.7): Address of the Free Software Foundation
+	  updated.
+
+2005-07-11 Monday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile (1.5), config.guess (1.14), config.sub (1.14), depcomp
+	  (1.8), missing (1.6), mkinstalldirs (1.5): Updated from Automake
+	  1.9.6.
+
+2005-07-06 Wednesday 09:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Handler.defs.hh, Handler.inlines.hh, Time.inlines.hh,
+	  config.guess, config.sub, install-sh, ltmain.sh
+	  (grids.[1,1,1,1,1,1,1]): First merge from main trunk.
+
+2005-05-25 Wednesday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.13), config.sub (1.13), install-sh (1.11),
+	  ltmain.sh (1.13): Updated from Libtool 1.5.18.
+
+2005-05-25 Wednesday 07:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.12), config.sub (1.12), ltmain.sh (1.12): Updated
+	  from Libtool 1.5.16.
+
+2005-04-11 Monday 00:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Time.inlines.hh (1.3): Fixed a bug in Time::operator+=(const
+	  Time&).
+
+2005-02-27 Sunday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Handler.defs.hh (1.4), Handler.inlines.hh (1.3): Class Handler
+	  was missing a virtual destructor: added.
+
+2005-02-13 Sunday 08:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.4), compile (1.4), config.guess (1.11), config.sub
+	  (1.11), depcomp (1.7), missing (1.5), mkinstalldirs (1.4):
+	  Updated from Automake 1.9.5.
+
+2005-02-12 Saturday 15:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.11): Updated from Libtool 1.5.14.
+
+2005-02-08 Tuesday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.sub (1.10), install-sh (1.10): Updated.
+
+2005-02-08 Tuesday 20:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.10): Updated from Libtool 1.5.12.
+
+2005-01-01 Saturday 00:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Doubly_Linked_Object.defs.hh (1.2),
+	  Doubly_Linked_Object.inlines.hh (1.2),
+	  Doubly_Linked_Object.types.hh (1.2), EList.defs.hh (1.4),
+	  EList.inlines.hh (1.3), EList.types.hh (1.2),
+	  EList_Iterator.defs.hh (1.2), EList_Iterator.inlines.hh (1.3),
+	  EList_Iterator.types.hh (1.2), Handler.defs.hh (1.3),
+	  Handler.inlines.hh (1.2), Handler.types.hh (1.2), Makefile.am
+	  (1.18), Pending_Element.cc (1.2), Pending_Element.defs.hh (1.2),
+	  Pending_Element.inlines.hh (1.2), Pending_Element.types.hh (1.2),
+	  Pending_List.cc (1.2), Pending_List.defs.hh (1.2),
+	  Pending_List.inlines.hh (1.2), Pending_List.types.hh (1.2),
+	  README (1.10), Time.cc (1.2), Time.defs.hh (1.2), Time.inlines.hh
+	  (1.2), Time.types.hh (1.2), Watchdog.cc (1.19), Watchdog.defs.hh
+	  (1.15), Watchdog.inlines.hh (1.12), Watchdog.types.hh (1.6),
+	  configure.ac (1.25), pwl_header.top (1.6): Copyright years
+	  extended.
+
+2004-12-25 Saturday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, Makefile.am, NEWS, README, config.guess, config.sub,
+	  configure.ac, install-sh, pwl_filter_doxygen.sed,
+	  pwl_filter_install.sed, pwl_header.bottom, pwl_header.middle,
+	  pwl_header.top (altnum.[2,5,2,2,4,3,3,4,1,1,1,1,1]): Seventh
+	  merge from main trunk.
+
+2004-12-24 Friday 16:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_7-branch.1): Mark ChangeLog.
+
+2004-12-24 Friday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.10): Updated.
+
+2004-12-24 Friday 15:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.9): Updated.
+
+2004-12-24 Friday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.17): No longer mention erased files.
+
+2004-12-24 Friday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* pwl_header.bottom (1.2), pwl_header.top (1.5): Handling of NDEBUG
+	  improved.
+
+2004-12-24 Friday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* pwl_header.middle (1.3): We no longer support GCC versions prior
+	  to 3.
+
+2004-12-24 Friday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.24): Require Autoconf 2.59.
+
+2004-12-24 Friday 11:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.8): Version number bumped.
+
+2004-12-24 Friday 11:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.16), pwl_filter_doxygen.sed (1.2),
+	  pwl_filter_install.sed (1.2): Obsolete filters removed.  Shared
+	  library version info updated.
+
+2004-12-24 Friday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.15), configure.ac (1.23): Enable the creation of
+	  DLLs under Cygwin.
+
+2004-12-19 Sunday 12:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.22): Version number bumped.
+
+2004-12-19 Sunday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.5): The tentative release date for PPL 0.7 is December
+	  24, 2004.
+
+2004-12-19 Sunday 07:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.9): Updated.
+
+2004-12-19 Sunday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.10), config.sub (1.9): Updated.
+
+2004-12-19 Sunday 07:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* install-sh (1.9): Updated from Automake 1.9.4.
+
+2004-12-11 Saturday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* EList_Iterator.inlines.hh, Handler.defs.hh, Makefile.am,
+	  Watchdog.defs.hh (altnum.[2,2,4,2]): Sixth merge from main trunk.
+
+2004-12-11 Saturday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* EList_Iterator.inlines.hh (1.2), Handler.defs.hh (1.2),
+	  Makefile.am (1.14), Watchdog.defs.hh (1.14): Try to avoid very
+	  long lines.
+
+2004-11-27 Saturday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL, Makefile.am, compile, config.guess, configure.ac,
+	  install-sh (altnum.[1,3,2,3,2,3]): Fifth number from main
+	  repository.
+
+2004-11-20 Saturday 08:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.21): Define the PROFILING symbol when compiling
+	  for profiling.
+
+2004-11-01 Monday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.3), compile (1.3), config.guess (1.9), install-sh
+	  (1.8): Updated from Automake 1.9.3.
+
+2004-10-29 Friday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.13): Always specify the condition which is closed
+	  by an Automake's `end',
+
+2004-10-01 Friday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile, config.guess, config.sub, install-sh, ltmain.sh, missing
+	  (altnum.[1,2,2,2,2,1]): Third merge from main trunk.
+
+2004-09-20 Monday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile (1.2), install-sh (1.7), missing (1.4): Updated from
+	  Automake 1.9.2.
+
+2004-09-19 Sunday 22:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, Watchdog.cc (altnum.[2,2]): Second merge from main
+	  trunk.
+
+2004-09-19 Sunday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.8), config.sub (1.8): Updated.
+
+2004-09-19 Sunday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.9): Updated from Libtool 1.5.10.
+
+2004-09-16 Thursday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog.cc (1.18): Simplified the progrma logic in a few places
+	  where we remove elements from a container by using the return
+	  value of method erase().
+
+2004-09-02 Thursday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.12): Prepared for PPL 0.7.
+
+2004-08-21 Saturday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.11): Match every `endif' with the corresponding
+	  `if' condition.
+
+2004-08-20 Friday 19:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_6-branch.3): Mark ChangeLog.
+
+2004-08-20 Friday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_6-branch.2): Updated.
+
+2004-08-20 Friday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_6-branch.1): Updated for the release of PPL 0.6.1.
+
+2004-08-19 Thursday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, Doubly_Linked_Object.defs.hh,
+	  Doubly_Linked_Object.inlines.hh, Doubly_Linked_Object.types.hh,
+	  EList.defs.hh, EList.inlines.hh, EList.types.hh,
+	  EList_Iterator.defs.hh, EList_Iterator.inlines.hh,
+	  EList_Iterator.types.hh, Handler.defs.hh, Handler.inlines.hh,
+	  Handler.types.hh, Makefile.am, NEWS, Pending_Element.cc,
+	  Pending_Element.defs.hh, Pending_Element.inlines.hh,
+	  Pending_Element.types.hh, Pending_List.cc, Pending_List.defs.hh,
+	  Pending_List.inlines.hh, Pending_List.types.hh, README, Time.cc,
+	  Time.defs.hh, Time.inlines.hh, Time.types.hh, Watchdog.cc,
+	  Watchdog.defs.hh, Watchdog.inlines.hh, config.guess, config.sub,
+	  configure.ac, depcomp, install-sh, ltmain.sh
+	  (altnum.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  First merge from main trunk.
+
+2004-08-18 Wednesday 22:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_6-branch.1), ChangeLog (1.8), configure.ac
+	  (1.20): Version number bumped.
+
+2004-08-18 Wednesday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_6-branch.1): Mark ChangeLog.
+
+2004-08-16 Monday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.7): Updated.
+
+2004-08-16 Monday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.4): Our tentative release date is August 18, 2004.
+
+2004-08-16 Monday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.7): Updated.
+
+2004-08-13 Friday 18:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.10): Version info updated for the libtool
+	  libraries.
+
+2004-08-08 Sunday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.9), Watchdog.cc (1.17), Watchdog.defs.hh (1.13),
+	  Watchdog.inlines.hh (1.11): Watchdog library completely
+	  reorganized.	Deadlock bug fixed in the process.
+
+2004-08-08 Sunday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Handler.defs.hh (1.1), Handler.inlines.hh (1.1), Handler.types.hh
+	  (1.1): Classes for handlers of the watchdog events.
+
+2004-08-07 Saturday 19:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.8): Updated from Libtool 1.5.8.
+
+2004-08-07 Saturday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Pending_List.cc (1.1), Pending_List.defs.hh (1.1),
+	  Pending_List.inlines.hh (1.1), Pending_List.types.hh (1.1): An
+	  ordered list for recording pending watchdog events.
+
+2004-08-07 Saturday 08:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* EList.defs.hh (1.3), EList.inlines.hh (1.2): The clear() method
+	  has been removed.  The destructor now destructs also the elements
+	  in the list.
+
+2004-08-06 Friday 19:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Pending_Element.cc (1.1), Pending_Element.defs.hh (1.1),
+	  Pending_Element.inlines.hh (1.1), Pending_Element.types.hh (1.1):
+	  A class for pending watchdog events with embedded links.
+
+2004-08-06 Friday 18:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Doubly_Linked_Object.defs.hh (1.1),
+	  Doubly_Linked_Object.inlines.hh (1.1),
+	  Doubly_Linked_Object.types.hh (1.1): A (base) class for doubly
+	  linked objects.
+
+2004-08-06 Friday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* EList_Iterator.defs.hh (1.1), EList_Iterator.inlines.hh (1.1),
+	  EList_Iterator.types.hh (1.1): A class providing iterators for
+	  embedded lists.
+
+2004-08-06 Friday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* EList.defs.hh (1.2): Class comment revised.
+
+2004-08-06 Friday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* EList.defs.hh (1.1), EList.inlines.hh (1.1), EList.types.hh
+	  (1.1): A list of doubly linked objects (where the links are
+	  embedded in the objects themselves).
+
+2004-08-06 Friday 18:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Time.cc (1.1), Time.defs.hh (1.1), Time.inlines.hh (1.1),
+	  Time.types.hh (1.1): A class for representing and manipulating
+	  positive time intervals.
+
+2004-08-04 Wednesday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* depcomp (1.6), install-sh (1.6): Updated from Automake 1.9.
+
+2004-08-04 Wednesday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.7), config.sub (1.7): Updated.
+
+2004-07-08 Thursday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.cc (1.16): Spacing fixed.
+
+2004-05-09 Sunday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.cc (1.15): Anachronisms removed.
+
+2004-04-25 Sunday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* depcomp (1.5), install-sh (1.5), mkinstalldirs (1.3): Updated
+	  from Automake 1.8.4.
+
+2004-04-06 Tuesday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.6), config.sub (1.6), ltmain.sh (1.7): Updated
+	  from libtool-1.5.4.
+
+2004-01-28 Wednesday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.8), README (1.6), Watchdog.cc (1.14),
+	  Watchdog.defs.hh (1.12), Watchdog.inlines.hh (1.10),
+	  Watchdog.types.hh (1.5), configure.ac (1.19), pwl_header.top
+	  (1.4): Update copyright years.
+
+2004-01-27 Tuesday 17:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile (1.1): Added from Automake 1.8.2.
+
+2004-01-25 Sunday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* depcomp (1.4), install-sh (1.4), missing (1.3), mkinstalldirs
+	  (1.2): Update from Automake.
+
+2004-01-25 Sunday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.5), config.sub (1.5): Updated from config.
+
+2004-01-25 Sunday 22:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.6): Updated from Libtool 1.5.2.
+
+2003-12-05 Friday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.cc (1.13): Do not use the ITIMER_PROF timer when
+	  profiling.
+
+2003-11-04 Tuesday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.4), config.sub (1.4): Updated.
+
+2003-10-03 Friday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.4): Ignore config.h.in.
+
+2003-10-03 Friday 09:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.4): These should not be in the repository, since
+	  they are automatically generated.
+
+2003-09-10 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.3), config.sub (1.3), depcomp (1.3), install-sh
+	  (1.3), missing (1.2): Updated.
+
+2003-08-06 Wednesday 08:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.18): Allow for `mild', -O1 optimization.
+
+2003-07-05 Saturday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.cc (1.12): Delete statement uncommented.
+
+2003-04-27 Sunday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, NEWS, README, configure.ac (ppl-0_5-branch.[2,1,1,1]):
+	  Synchronize with the main trunk.
+
+2003-04-27 Sunday 21:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_5-branch.1): Mark ChangeLog.
+
+2003-04-27 Sunday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.6): Updated.
+
+2003-04-27 Sunday 21:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.17): Version number bumped.
+
+2003-04-27 Sunday 21:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.5): Updated.
+
+2003-04-27 Sunday 21:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.4), NEWS (1.3), README (1.5): Updated for release
+	  0.2.
+
+2003-04-17 Thursday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.cc (1.11): Prefer anonymous namespaces to static
+	  declarations.
+
+2003-04-15 Tuesday 13:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.5): Updated.
+
+2003-04-11 Friday 08:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.4): Updated.
+
+2003-04-07 Monday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.3): Updated.
+
+2003-03-03 Monday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* depcomp (1.2), install-sh (1.2): Updated.
+
+2003-03-03 Monday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.16): Require Autoconf 2.57 or following and
+	  Automake 1.7.3 or following.
+
+2003-03-03 Monday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING (1.2), ChangeLog (1.3), INSTALL (1.2), NEWS (1.2),
+	  config.guess (1.2), config.sub (1.2), ltmain.sh (1.2): Updated.
+
+2003-03-03 Monday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.7): Update version info.
+
+2003-02-07 Friday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.cc (1.10): Throw std::runtime_error instead of calling
+	  abort().
+
+2003-02-07 Friday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.inlines.hh (1.9): Throw std::invalid_argument if a
+	  Watchdog constructor is called with a non-positive number of time
+	  units.
+
+2003-01-26 Sunday 22:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.cc (1.9): Ported to Cygwin (it only supports
+	  ITIMER_REAL).  Robustness increased.	Throw std:runtime_error
+	  exceptions instead of calling exit().
+
+2003-01-12 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.defs.hh (1.11): Spurious, illegal qualification removed.
+
+2003-01-10 Friday 09:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.cc (1.8), Watchdog.defs.hh (1.10), Watchdog.inlines.hh
+	  (1.8), Watchdog.types.hh (1.4): New "nifty counter"
+	  implementation of library's initialization and finalization.
+	  Explicit initialization and finalization is no longer necessary
+	  nor possible.
+
+2003-01-09 Thursday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.15): Building the Parma Watchdog Library is now
+	  enabled by default.
+
+2003-01-01 Wednesday 02:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.6), README (1.4), Watchdog.cc (1.7),
+	  Watchdog.defs.hh (1.9), Watchdog.inlines.hh (1.7),
+	  Watchdog.types.hh (1.3), configure.ac (1.14), pwl_header.top
+	  (1.3): Update copyright years.
+
+2002-11-05 Tuesday 11:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.cc (1.6), Watchdog.defs.hh (1.8): Standard conformance
+	  fixes.
+
+2002-11-05 Tuesday 10:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.13): Work around a bug in AC_CHECK_FUNCS as
+	  implemented in autoconf 2.54c and previous versions.	For more
+	  information, see
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2002-November/002929.html.
+
+2002-11-05 Tuesday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.12): Avoid using obsolete macros.
+
+2002-11-03 Sunday 11:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* pwl_header.middle (1.2): Include sys/time.h, if available.
+
+2002-11-03 Sunday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.defs.hh (1.7), Watchdog.inlines.hh (1.6): Little
+	  cleaning.
+
+2002-11-03 Sunday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.3), configure.ac (1.11): Get rid of AC_C_INLINE:
+	  we do not use inlines in C code and it was doing harm with some
+	  compilers.
+
+2002-11-02 Saturday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.10): Buggy conditional fixed.
+
+2002-10-19 Saturday 00:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.1), config.sub (1.1), depcomp (1.1), install-sh
+	  (1.1), ltmain.sh (1.1), missing (1.1), mkinstalldirs (1.1):
+	  Missing files added.
+
+2002-10-04 Friday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_4-branch.3): Mark ChangeLog.
+
+2002-08-17 Saturday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.defs.hh, Watchdog.inlines.hh, Watchdog.types.hh,
+	  pwl_header.top (alt_nnc.[1,1,1,1]): Merge changes from the trunk
+	  between tags `merge_to_alt_nnc' and `second_merge_to_alt_nnc'.
+
+2002-08-16 Friday 10:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.defs.hh (1.6), Watchdog.inlines.hh (1.5),
+	  Watchdog.types.hh (1.2), pwl_header.top (1.2): According to the
+	  C++ standard (Section 17.4), every name that starts with an
+	  underscore is reserved to the implementation.  All the multiple
+	  inclusion guards have been renamed (some missing ones have been
+	  added).
+
+2002-07-30 Tuesday 11:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_4-branch.2): Mark ChangeLog.
+
+2002-07-02 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.9): Shared libraries are again turned off by
+	  default.
+
+2002-07-01 Monday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_4-branch.1): Mark ChangeLog.
+
+2002-06-30 Sunday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.defs.hh (1.5), Watchdog.inlines.hh (1.4): Implementation
+	  of inline functions moved to Watchdog.inlines.hh.
+
+2002-06-30 Sunday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.2): This file will no longer be empty.
+
+2002-06-30 Sunday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.8): Invocations to AC_PROG_* macros repositioned.
+
+2002-06-30 Sunday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.defs.hh (1.4), Watchdog.inlines.hh (1.3): Use methods
+	  instead of friends for binary operators over Time.
+
+2002-06-25 Tuesday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.3): For those building in the sources' directory.
+
+2002-06-24 Monday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.7): Fixed typo in a comment.
+
+2002-06-17 Monday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.cc (1.5), Watchdog.defs.hh (1.3): Use #ifdef to test
+	  configuration symbols that may be undefined or defined to 1.
+
+2002-06-15 Saturday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.5): dist-hook goes into the unconditional section.
+
+2002-06-09 Sunday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.4), configure.ac (1.6): Consistent spelling for
+	  Autoconf and Automake.
+
+2002-06-09 Sunday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.5): Set CFLAGS properly.  Check for header files
+	  and library functions only if we are building the library.
+
+2002-06-09 Sunday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.4): Be more friendly to compilers different from
+	  GCC.
+
+2002-05-28 Tuesday 13:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.2): For those building in the sources' tree.
+
+2002-05-28 Tuesday 12:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog.cc (1.4), Watchdog.defs.hh (1.2), Watchdog.inlines.hh
+	  (1.2): Better implementation using templates.
+
+2002-05-27 Monday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.3), README (1.3), Timeout.hh (1.3), Watchdog.cc
+	  (1.3), Watchdog.defs.hh (1.1), Watchdog.hh (1.3),
+	  Watchdog.inlines.hh (1.1), Watchdog.types.hh (1.1), configure.ac
+	  (1.3), pwl_filter_doxygen.sed (1.1), pwl_filter_install.sed
+	  (1.1), pwl_header.bottom (1.1), pwl_header.middle (1.1),
+	  pwl_header.top (1.1): The Watchdog library is now complete.
+
+2002-05-24 Friday 07:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.2), README (1.2), Timeout.hh (1.2), Watchdog.cc
+	  (1.2), Watchdog.hh (1.2), config.h.in (1.2), configure.ac (1.2):
+	  Several improvement (but still not operational).
+
+2002-05-22 Wednesday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.1), BUGS (1.1), COPYING (1.1), CREDITS (1.1),
+	  ChangeLog (1.1), INSTALL (1.1), Makefile.am (1.1), NEWS (1.1),
+	  README (1.1), Timeout.hh (1.1), Watchdog.cc (1.1), Watchdog.hh
+	  (1.1), config.h.in (1.1), configure.ac (1.1): Even though the
+	  Watchdog library is completely independent from the PPL, it will
+	  live with it, at least for a while.
+
diff --git a/Watchdog/INSTALL b/Watchdog/INSTALL
new file mode 100644
index 0000000..56b077d
--- /dev/null
+++ b/Watchdog/INSTALL
@@ -0,0 +1,236 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
+Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+Some systems require unusual options for compilation or linking that the
+`configure' script does not know about.  Run `./configure --help' for
+details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory.  After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PREFIX'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PREFIX', the package will
+use PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+There may be some features `configure' cannot figure out automatically,
+but needs to determine by the type of machine the package will run on.
+Usually, assuming the package is built to be run on the _same_
+architectures, `configure' can figure that out, but if it prints a
+message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+If you want to set default values for `configure' scripts to share, you
+can create a site shell script called `config.site' that gives default
+values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).  Here is a another example:
+
+     /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
+configuration-related scripts to be executed by `/bin/bash'.
+
+`configure' Invocation
+======================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+     Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
diff --git a/Watchdog/Makefile.am b/Watchdog/Makefile.am
new file mode 100644
index 0000000..56ff427
--- /dev/null
+++ b/Watchdog/Makefile.am
@@ -0,0 +1,30 @@
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+SUBDIRS = utils src
+
+dist_noinst_SCRIPTS = \
+configure
+
+EXTRA_DIST = \
+BUGS \
+CREDITS
diff --git a/Watchdog/Makefile.in b/Watchdog/Makefile.in
new file mode 100644
index 0000000..c07c4ce
--- /dev/null
+++ b/Watchdog/Makefile.in
@@ -0,0 +1,654 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = README $(am__configure_deps) $(dist_noinst_SCRIPTS) \
+	$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/config.h.in $(top_srcdir)/configure COPYING \
+	ChangeLog INSTALL NEWS compile config.guess config.sub depcomp \
+	install-sh ltmain.sh missing mkinstalldirs
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+SCRIPTS = $(dist_noinst_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d $(distdir) \
+    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+debug_flag = @debug_flag@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+SUBDIRS = utils src
+dist_noinst_SCRIPTS = \
+configure
+
+EXTRA_DIST = \
+BUGS \
+CREDITS
+
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+	      cd $(srcdir) && $(AUTOMAKE) --foreign  \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+	@if test ! -f $@; then \
+	  rm -f stamp-h1; \
+	  $(MAKE) stamp-h1; \
+	else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in:  $(am__configure_deps) 
+	cd $(top_srcdir) && $(AUTOHEADER)
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	mkdir $(distdir)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r $(distdir)
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && cd $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+	@cd $(distuninstallcheck_dir) \
+	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(SCRIPTS) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+	distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+	check-am clean clean-generic clean-libtool clean-recursive \
+	ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
+	dist-shar dist-tarZ dist-zip distcheck distclean \
+	distclean-generic distclean-hdr distclean-libtool \
+	distclean-recursive distclean-tags distcleancheck distdir \
+	distuninstallcheck dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	maintainer-clean-recursive mostlyclean mostlyclean-generic \
+	mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Watchdog/NEWS b/Watchdog/NEWS
new file mode 100644
index 0000000..ff70afd
--- /dev/null
+++ b/Watchdog/NEWS
@@ -0,0 +1,65 @@
+
+Parma Watchdog Library NEWS -- history of user-visible changes
+==============================================================
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.5  (released on January 20, 2006)
+--------------------------------------------------------------------------
+
+o  Portability has been improved.
+
+o  The configuration option --enable-optimization now accepts a value
+   of `zero'.
+
+
+Bugfixes
+========
+
+o  Fixed a bug in Time::operator+=(const Time&) where the resulting
+   number of microseconds was being erroneously set to the resulting
+   number of seconds.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.4  (released on December 24, 2004)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o  Fixed a bug that prevented profiling from functioning properly.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.3  (released on August 18, 2004)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o  Fixed a deadlock bug.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.2 (released on April 28, 2003)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o  Added implicit and automatic initialization and finalization of the
+   library.  Explicit initialization and finalization is no longer
+   necessary nor possible.
+
+o  Portability improvements.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.1 (released on July 1, 2002)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o  The library has been released under the GNU General Public License.
diff --git a/Watchdog/README b/Watchdog/README
new file mode 100644
index 0000000..16a7817
--- /dev/null
+++ b/Watchdog/README
@@ -0,0 +1,94 @@
+
+This is the release 0.5 of the Parma Watchdog Library:
+a C++ library for software timeouts.
+
+To be continued...
+
+See http://www.cs.unipr.it/Software/ for more information on the PWL.
+See the file COPYING for licensing information.
+See the file INSTALL for build and installation instructions.
+See the file NEWS for recent project news.
+See the file BUGS for known bugs and how to report new ones.
+See the file CREDITS for a list of people and organizations that
+contributed to the PWL.
+
+Here is the contents of the PWL 0.5 source distribution
+(2 directories, 56 files):
+
+Watchdog
+|-- BUGS
+|-- COPYING
+|-- CREDITS
+|-- ChangeLog
+|-- INSTALL
+|-- Makefile.am
+|-- Makefile.in
+|-- NEWS
+|-- README
+|-- aclocal.m4
+|-- compile
+|-- config.guess
+|-- config.h.in
+|-- config.sub
+|-- configure
+|-- configure.ac
+|-- depcomp
+|-- install-sh
+|-- ltmain.sh
+|-- missing
+|-- mkinstalldirs
+|-- src
+|   |-- Doubly_Linked_Object.defs.hh
+|   |-- Doubly_Linked_Object.inlines.hh
+|   |-- Doubly_Linked_Object.types.hh
+|   |-- EList.defs.hh
+|   |-- EList.inlines.hh
+|   |-- EList.types.hh
+|   |-- EList_Iterator.defs.hh
+|   |-- EList_Iterator.inlines.hh
+|   |-- EList_Iterator.types.hh
+|   |-- Handler.defs.hh
+|   |-- Handler.inlines.hh
+|   |-- Handler.types.hh
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- Pending_Element.cc
+|   |-- Pending_Element.defs.hh
+|   |-- Pending_Element.inlines.hh
+|   |-- Pending_Element.types.hh
+|   |-- Pending_List.cc
+|   |-- Pending_List.defs.hh
+|   |-- Pending_List.inlines.hh
+|   |-- Pending_List.types.hh
+|   |-- Time.cc
+|   |-- Time.defs.hh
+|   |-- Time.inlines.hh
+|   |-- Time.types.hh
+|   |-- Watchdog.cc
+|   |-- Watchdog.defs.hh
+|   |-- Watchdog.inlines.hh
+|   |-- Watchdog.types.hh
+|   |-- pwl.hh.dist
+|   `-- pwl_header.hh
+`-- utils
+    |-- Makefile.am
+    |-- Makefile.in
+    `-- build_header.in
+
+--------
+
+Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+The Parma Watchdog Library is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
diff --git a/Watchdog/aclocal.m4 b/Watchdog/aclocal.m4
new file mode 100644
index 0000000..4723f85
--- /dev/null
+++ b/Watchdog/aclocal.m4
@@ -0,0 +1,7227 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+
+# serial 48 AC_PROG_LIBTOOL
+
+
+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
+# -----------------------------------------------------------
+# If this macro is not defined by Autoconf, define it here.
+m4_ifdef([AC_PROVIDE_IFELSE],
+         [],
+         [m4_define([AC_PROVIDE_IFELSE],
+	         [m4_ifdef([AC_PROVIDE_$1],
+		           [$2], [$3])])])
+
+
+# AC_PROG_LIBTOOL
+# ---------------
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
+dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
+dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
+  AC_PROVIDE_IFELSE([AC_PROG_CXX],
+    [AC_LIBTOOL_CXX],
+    [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
+  ])])
+dnl And a similar setup for Fortran 77 support
+  AC_PROVIDE_IFELSE([AC_PROG_F77],
+    [AC_LIBTOOL_F77],
+    [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
+])])
+
+dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
+dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
+dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
+  AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+    [AC_LIBTOOL_GCJ],
+    [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+      [AC_LIBTOOL_GCJ],
+      [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
+	[AC_LIBTOOL_GCJ],
+      [ifdef([AC_PROG_GCJ],
+	     [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+       ifdef([A][M_PROG_GCJ],
+	     [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+       ifdef([LT_AC_PROG_GCJ],
+	     [define([LT_AC_PROG_GCJ],
+		defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
+])])# AC_PROG_LIBTOOL
+
+
+# _AC_PROG_LIBTOOL
+# ----------------
+AC_DEFUN([_AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])# _AC_PROG_LIBTOOL
+
+
+# AC_LIBTOOL_SETUP
+# ----------------
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.50)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+
+AC_LIBTOOL_SYS_MAX_CMD_LEN
+AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+AC_LIBTOOL_OBJDIR
+
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+_LT_AC_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
+
+# Same as above, but do not quote variable references.
+[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+AC_CHECK_TOOL(AR, ar, false)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    AC_PATH_MAGIC
+  fi
+  ;;
+esac
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE([libtool-lock],
+    [AC_HELP_STRING([--disable-libtool-lock],
+	[avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+AC_ARG_WITH([pic],
+    [AC_HELP_STRING([--with-pic],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [pic_mode="$withval"],
+    [pic_mode=default])
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+AC_LIBTOOL_LANG_C_CONFIG
+_LT_AC_TAGCONFIG
+])# AC_LIBTOOL_SETUP
+
+
+# _LT_AC_SYS_COMPILER
+# -------------------
+AC_DEFUN([_LT_AC_SYS_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_AC_SYS_COMPILER
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+AC_DEFUN([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+AC_DEFUN([_LT_COMPILER_BOILERPLATE],
+[ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+AC_DEFUN([_LT_LINKER_BOILERPLATE],
+[ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+])# _LT_LINKER_BOILERPLATE
+
+
+# _LT_AC_SYS_LIBPATH_AIX
+# ----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
+[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_AC_SYS_LIBPATH_AIX
+
+
+# _LT_AC_SHELL_INIT(ARG)
+# ----------------------
+AC_DEFUN([_LT_AC_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+	 [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_AC_SHELL_INIT
+
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[_LT_AC_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+  ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X[$]1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+[$]*
+EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+  for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+    if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+       echo_test_string=`eval $cmd` &&
+       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+    then
+      break
+    fi
+  done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+   test "X$echo_testing_string" = "X$echo_test_string"; then
+  :
+else
+  # The Solaris, AIX, and Digital Unix default echo programs unquote
+  # backslashes.  This makes it impossible to quote backslashes using
+  #   echo "$something" | sed 's/\\/\\\\/g'
+  #
+  # So, first we look for a working echo in the user's PATH.
+
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for dir in $PATH /usr/ucb; do
+    IFS="$lt_save_ifs"
+    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      echo="$dir/echo"
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+
+  if test "X$echo" = Xecho; then
+    # We didn't find a better echo, so look for alternatives.
+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      # This shell has a builtin print -r that does the trick.
+      echo='print -r'
+    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+	 test "X$CONFIG_SHELL" != X/bin/ksh; then
+      # If we have ksh, try running configure again with it.
+      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+      export ORIGINAL_CONFIG_SHELL
+      CONFIG_SHELL=/bin/ksh
+      export CONFIG_SHELL
+      exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+    else
+      # Try using printf.
+      echo='printf %s\n'
+      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+	 test "X$echo_testing_string" = "X$echo_test_string"; then
+	# Cool, printf works
+	:
+      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	export CONFIG_SHELL
+	SHELL="$CONFIG_SHELL"
+	export SHELL
+	echo="$CONFIG_SHELL [$]0 --fallback-echo"
+      elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	echo="$CONFIG_SHELL [$]0 --fallback-echo"
+      else
+	# maybe with a smaller string...
+	prev=:
+
+	for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+	  then
+	    break
+	  fi
+	  prev="$cmd"
+	done
+
+	if test "$prev" != 'sed 50q "[$]0"'; then
+	  echo_test_string=`eval $prev`
+	  export echo_test_string
+	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+	else
+	  # Oops.  We lost completely, so just stick with echo.
+	  echo=echo
+	fi
+      fi
+    fi
+  fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+   ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+])])# _LT_AC_PROG_ECHO_BACKSLASH
+
+
+# _LT_AC_LOCK
+# -----------
+AC_DEFUN([_LT_AC_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+    [AC_HELP_STRING([--disable-libtool-lock],
+	[avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *ELF-32*)
+      HPUX_IA64_MODE="32"
+      ;;
+    *ELF-64*)
+      HPUX_IA64_MODE="64"
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+   if test "$lt_cv_prog_gnu_ld" = yes; then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -melf32bsmip"
+      ;;
+    *N32*)
+      LD="${LD-ld} -melf32bmipn32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -melf64bmip"
+      ;;
+    esac
+   else
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -32"
+      ;;
+    *N32*)
+      LD="${LD-ld} -n32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -64"
+      ;;
+    esac
+   fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *32-bit*)
+      case $host in
+        x86_64-*linux*)
+          LD="${LD-ld} -m elf_i386"
+          ;;
+        ppc64-*linux*|powerpc64-*linux*)
+          LD="${LD-ld} -m elf32ppclinux"
+          ;;
+        s390x-*linux*)
+          LD="${LD-ld} -m elf_s390"
+          ;;
+        sparc64-*linux*)
+          LD="${LD-ld} -m elf32_sparc"
+          ;;
+      esac
+      ;;
+    *64-bit*)
+      case $host in
+        x86_64-*linux*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        ppc*-*linux*|powerpc*-*linux*)
+          LD="${LD-ld} -m elf64ppc"
+          ;;
+        s390*-*linux*)
+          LD="${LD-ld} -m elf64_s390"
+          ;;
+        sparc*-*linux*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)    LD="${LD-ld} -64" ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+  ])
+esac
+
+need_locks="$enable_libtool_lock"
+
+])# _LT_AC_LOCK
+
+
+# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+  ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $rm conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    ifelse([$5], , :, [$5])
+else
+    ifelse([$6], , :, [$6])
+fi
+])# AC_LIBTOOL_COMPILER_OPTION
+
+
+# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                          [ACTION-SUCCESS], [ACTION-FAILURE])
+# ------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
+[AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   printf "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $rm conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    ifelse([$4], , :, [$4])
+else
+    ifelse([$5], , :, [$5])
+fi
+])# AC_LIBTOOL_LINKER_OPTION
+
+
+# AC_LIBTOOL_SYS_MAX_CMD_LEN
+# --------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
+[# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ 	]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    # If test is not a shell built-in, we'll probably end up computing a
+    # maximum length that is only half of the actual maximum length, but
+    # we can't tell.
+    SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+    while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
+	       = "XX$teststring") >/dev/null 2>&1 &&
+	    new_result=`expr "X$teststring" : ".*" 2>&1` &&
+	    lt_cv_sys_max_cmd_len=$new_result &&
+	    test $i != 17 # 1/2 MB should be enough
+    do
+      i=`expr $i + 1`
+      teststring=$teststring$teststring
+    done
+    teststring=
+    # Add a significant safety factor because C++ compilers can tack on massive
+    # amounts of additional arguments before passing them to the linker.
+    # It appears as though 1/2 is a usable value.
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+])# AC_LIBTOOL_SYS_MAX_CMD_LEN
+
+
+# _LT_AC_CHECK_DLFCN
+# ------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)dnl
+])# _LT_AC_CHECK_DLFCN
+
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                           ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ---------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+    exit (status);
+}]
+EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_AC_TRY_DLOPEN_SELF
+
+
+# AC_LIBTOOL_DLOPEN_SELF
+# ----------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+   ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+   ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+   ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_AC_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+    	  lt_cv_dlopen_self_static, [dnl
+	  _LT_AC_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+])# AC_LIBTOOL_DLOPEN_SELF
+
+
+# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
+# ---------------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler
+AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+])
+])# AC_LIBTOOL_PROG_CC_C_O
+
+
+# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
+# -----------------------------------------
+# Check to see if we can do hard links to lock some files if needed
+AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
+[AC_REQUIRE([_LT_AC_LOCK])dnl
+
+hard_links="nottested"
+if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
+
+
+# AC_LIBTOOL_OBJDIR
+# -----------------
+AC_DEFUN([AC_LIBTOOL_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+])# AC_LIBTOOL_OBJDIR
+
+
+# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
+# ----------------------------------------------
+# Check hardcoding attributes.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_AC_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
+   test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
+   test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_AC_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_AC_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
+
+
+# AC_LIBTOOL_SYS_LIB_STRIP
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
+[striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+   darwin*)
+       if test -n "$STRIP" ; then
+         striplib="$STRIP -x"
+         AC_MSG_RESULT([yes])
+       else
+  AC_MSG_RESULT([no])
+fi
+       ;;
+   *)
+  AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+])# AC_LIBTOOL_SYS_LIB_STRIP
+
+
+# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
+[AC_MSG_CHECKING([dynamic linker characteristics])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+  if test "$GCC" = yes; then
+    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+  else
+    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+  fi
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+kfreebsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[123]]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  freebsd*) # from 4.6 on
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix3*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+knetbsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+
+
+# _LT_AC_TAGCONFIG
+# ----------------
+AC_DEFUN([_LT_AC_TAGCONFIG],
+[AC_ARG_WITH([tags],
+    [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
+        [include additional configurations @<:@automatic@:>@])],
+    [tagnames="$withval"])
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+  if test ! -f "${ofile}"; then
+    AC_MSG_WARN([output file `$ofile' does not exist])
+  fi
+
+  if test -z "$LTCC"; then
+    eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+    if test -z "$LTCC"; then
+      AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
+    else
+      AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
+    fi
+  fi
+  if test -z "$LTCFLAGS"; then
+    eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+  fi
+
+  # Extract list of available tagged configurations in $ofile.
+  # Note that this assumes the entire list is on one line.
+  available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+  lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+  for tagname in $tagnames; do
+    IFS="$lt_save_ifs"
+    # Check whether tagname contains only valid characters
+    case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
+    "") ;;
+    *)  AC_MSG_ERROR([invalid tag name: $tagname])
+	;;
+    esac
+
+    if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+    then
+      AC_MSG_ERROR([tag name \"$tagname\" already exists])
+    fi
+
+    # Update the list of available tags.
+    if test -n "$tagname"; then
+      echo appending configuration tag \"$tagname\" to $ofile
+
+      case $tagname in
+      CXX)
+	if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+	    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+	    (test "X$CXX" != "Xg++"))) ; then
+	  AC_LIBTOOL_LANG_CXX_CONFIG
+	else
+	  tagname=""
+	fi
+	;;
+
+      F77)
+	if test -n "$F77" && test "X$F77" != "Xno"; then
+	  AC_LIBTOOL_LANG_F77_CONFIG
+	else
+	  tagname=""
+	fi
+	;;
+
+      GCJ)
+	if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+	  AC_LIBTOOL_LANG_GCJ_CONFIG
+	else
+	  tagname=""
+	fi
+	;;
+
+      RC)
+	AC_LIBTOOL_LANG_RC_CONFIG
+	;;
+
+      *)
+	AC_MSG_ERROR([Unsupported tag name: $tagname])
+	;;
+      esac
+
+      # Append the new tag name to the list of available tags.
+      if test -n "$tagname" ; then
+      available_tags="$available_tags $tagname"
+    fi
+    fi
+  done
+  IFS="$lt_save_ifs"
+
+  # Now substitute the updated list of available tags.
+  if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+    mv "${ofile}T" "$ofile"
+    chmod +x "$ofile"
+  else
+    rm -f "${ofile}T"
+    AC_MSG_ERROR([unable to update list of available tagged configurations.])
+  fi
+fi
+])# _LT_AC_TAGCONFIG
+
+
+# AC_LIBTOOL_DLOPEN
+# -----------------
+# enable checks for dlopen support
+AC_DEFUN([AC_LIBTOOL_DLOPEN],
+ [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_DLOPEN
+
+
+# AC_LIBTOOL_WIN32_DLL
+# --------------------
+# declare package support for building win32 DLLs
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_WIN32_DLL
+
+
+# AC_ENABLE_SHARED([DEFAULT])
+# ---------------------------
+# implement the --enable-shared flag
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([shared],
+    [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]AC_ENABLE_SHARED_DEFAULT)
+])# AC_ENABLE_SHARED
+
+
+# AC_DISABLE_SHARED
+# -----------------
+# set the default shared flag to --disable-shared
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)
+])# AC_DISABLE_SHARED
+
+
+# AC_ENABLE_STATIC([DEFAULT])
+# ---------------------------
+# implement the --enable-static flag
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([static],
+    [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]AC_ENABLE_STATIC_DEFAULT)
+])# AC_ENABLE_STATIC
+
+
+# AC_DISABLE_STATIC
+# -----------------
+# set the default static flag to --disable-static
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)
+])# AC_DISABLE_STATIC
+
+
+# AC_ENABLE_FAST_INSTALL([DEFAULT])
+# ---------------------------------
+# implement the --enable-fast-install flag
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([fast-install],
+    [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT)
+])# AC_ENABLE_FAST_INSTALL
+
+
+# AC_DISABLE_FAST_INSTALL
+# -----------------------
+# set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)
+])# AC_DISABLE_FAST_INSTALL
+
+
+# AC_LIBTOOL_PICMODE([MODE])
+# --------------------------
+# implement the --with-pic flag
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)
+])# AC_LIBTOOL_PICMODE
+
+
+# AC_PROG_EGREP
+# -------------
+# This is predefined starting with Autoconf 2.54, so this conditional
+# definition can be removed once we require Autoconf 2.54 or later.
+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
+   [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+    then ac_cv_prog_egrep='grep -E'
+    else ac_cv_prog_egrep='egrep'
+    fi])
+ EGREP=$ac_cv_prog_egrep
+ AC_SUBST([EGREP])
+])])
+
+
+# AC_PATH_TOOL_PREFIX
+# -------------------
+# find a file program which can recognise shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="ifelse([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+])# AC_PATH_TOOL_PREFIX
+
+
+# AC_PATH_MAGIC
+# -------------
+# find a file program which can recognise a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# AC_PATH_MAGIC
+
+
+# AC_PROG_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([AC_PROG_LD],
+[AC_ARG_WITH([gnu-ld],
+    [AC_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])
+AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_PROG_LD_GNU
+])# AC_PROG_LD
+
+
+# AC_PROG_LD_GNU
+# --------------
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# AC_PROG_LD_GNU
+
+
+# AC_PROG_LD_RELOAD_FLAG
+# ----------------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+])# AC_PROG_LD_RELOAD_FLAG
+
+
+# AC_DEPLIBS_CHECK_METHOD
+# -----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognise dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump'.
+  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | kfreebsd*-gnu | dragonfly*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix3*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+nto-qnx*)
+  lt_cv_deplibs_check_method=unknown
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+])# AC_DEPLIBS_CHECK_METHOD
+
+
+# AC_PROG_NM
+# ----------
+# find the pathname to a BSD-compatible name lister
+AC_DEFUN([AC_PROG_NM],
+[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then 
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi])
+NM="$lt_cv_path_NM"
+])# AC_PROG_NM
+
+
+# AC_CHECK_LIBM
+# -------------
+# check for math library
+AC_DEFUN([AC_CHECK_LIBM],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+])# AC_CHECK_LIBM
+
+
+# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments.  Note that
+# AC_CONFIG_SUBDIRS is not called here.  If DIRECTORY is not provided,
+# it is assumed to be `libltdl'.  LIBLTDL will be prefixed with
+# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/'
+# (note the single quotes!).  If your package is not flat and you're not
+# using automake, define top_builddir and top_srcdir appropriately in
+# the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+  case $enable_ltdl_convenience in
+  no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+  "") enable_ltdl_convenience=yes
+      ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+  esac
+  LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+  LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+  # For backwards non-gettext consistent compatibility...
+  INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_CONVENIENCE
+
+
+# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl installable library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments.  Note that
+# AC_CONFIG_SUBDIRS is not called here.  If DIRECTORY is not provided,
+# and an installed libltdl is not found, it is assumed to be `libltdl'.
+# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with
+# '${top_srcdir}/' (note the single quotes!).  If your package is not
+# flat and you're not using automake, define top_builddir and top_srcdir
+# appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+  AC_CHECK_LIB(ltdl, lt_dlinit,
+  [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+  [if test x"$enable_ltdl_install" = xno; then
+     AC_MSG_WARN([libltdl not installed, but installation disabled])
+   else
+     enable_ltdl_install=yes
+   fi
+  ])
+  if test x"$enable_ltdl_install" = x"yes"; then
+    ac_configure_args="$ac_configure_args --enable-ltdl-install"
+    LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+    LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+  else
+    ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+    LIBLTDL="-lltdl"
+    LTDLINCL=
+  fi
+  # For backwards non-gettext consistent compatibility...
+  INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_INSTALLABLE
+
+
+# AC_LIBTOOL_CXX
+# --------------
+# enable support for C++ libraries
+AC_DEFUN([AC_LIBTOOL_CXX],
+[AC_REQUIRE([_LT_AC_LANG_CXX])
+])# AC_LIBTOOL_CXX
+
+
+# _LT_AC_LANG_CXX
+# ---------------
+AC_DEFUN([_LT_AC_LANG_CXX],
+[AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
+])# _LT_AC_LANG_CXX
+
+# _LT_AC_PROG_CXXCPP
+# ------------------
+AC_DEFUN([_LT_AC_PROG_CXXCPP],
+[
+AC_REQUIRE([AC_PROG_CXX])
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+fi
+])# _LT_AC_PROG_CXXCPP
+
+# AC_LIBTOOL_F77
+# --------------
+# enable support for Fortran 77 libraries
+AC_DEFUN([AC_LIBTOOL_F77],
+[AC_REQUIRE([_LT_AC_LANG_F77])
+])# AC_LIBTOOL_F77
+
+
+# _LT_AC_LANG_F77
+# ---------------
+AC_DEFUN([_LT_AC_LANG_F77],
+[AC_REQUIRE([AC_PROG_F77])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
+])# _LT_AC_LANG_F77
+
+
+# AC_LIBTOOL_GCJ
+# --------------
+# enable support for GCJ libraries
+AC_DEFUN([AC_LIBTOOL_GCJ],
+[AC_REQUIRE([_LT_AC_LANG_GCJ])
+])# AC_LIBTOOL_GCJ
+
+
+# _LT_AC_LANG_GCJ
+# ---------------
+AC_DEFUN([_LT_AC_LANG_GCJ],
+[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
+    [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
+      [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
+	 [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
+	   [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
+])# _LT_AC_LANG_GCJ
+
+
+# AC_LIBTOOL_RC
+# -------------
+# enable support for Windows resource files
+AC_DEFUN([AC_LIBTOOL_RC],
+[AC_REQUIRE([LT_AC_PROG_RC])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
+])# AC_LIBTOOL_RC
+
+
+# AC_LIBTOOL_LANG_C_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
+AC_DEFUN([_LT_AC_LANG_C_CONFIG],
+[lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF
+
+# Report which library types will actually be built
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+
+aix4* | aix5*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+    ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_C_CONFIG
+
+
+# AC_LIBTOOL_LANG_CXX_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
+AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
+[AC_LANG_PUSH(C++)
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Dependencies to place before and after the object being linked:
+_LT_AC_TAGVAR(predep_objects, $1)=
+_LT_AC_TAGVAR(postdep_objects, $1)=
+_LT_AC_TAGVAR(predeps, $1)=
+_LT_AC_TAGVAR(postdeps, $1)=
+_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+  lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+  $as_unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+  lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+  $as_unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+else
+  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+fi
+
+if test "$GXX" = yes; then
+  # Set up default GNU C++ configuration
+
+  AC_PROG_LD
+
+  # Check if GNU C++ uses GNU ld as the underlying linker, since the
+  # archiving commands below assume that GNU ld is being used.
+  if test "$with_gnu_ld" = yes; then
+    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+    #     investigate it a little bit more. (MM)
+    wlarc='${wl}'
+
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+	grep 'no-whole-archive' > /dev/null; then
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    with_gnu_ld=no
+    wlarc=
+
+    # A generic and very simple default shared library creation
+    # command for GNU C++ for the case where it uses the native
+    # linker, instead of GNU ld.  If possible, this setting should
+    # overridden to take advantage of the native linker features on
+    # the platform it is being used on.
+    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+  fi
+
+  # Commands to make compiler produce verbose output that lists
+  # what "hidden" libraries, object files and flags are used when
+  # linking a shared library.
+  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+  GXX=no
+  with_gnu_ld=no
+  wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+_LT_AC_TAGVAR(ld_shlibs, $1)=yes
+case $host_os in
+  aix3*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  aix4* | aix5*)
+    if test "$host_cpu" = ia64; then
+      # On IA64, the linker does run time linking by default, so we don't
+      # have to do anything special.
+      aix_use_runtimelinking=no
+      exp_sym_flag='-Bexport'
+      no_entry_flag=""
+    else
+      aix_use_runtimelinking=no
+
+      # Test if we are trying to use run time linking or normal
+      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+      # need to do runtime linking.
+      case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+	for ld_flag in $LDFLAGS; do
+	  case $ld_flag in
+	  *-brtl*)
+	    aix_use_runtimelinking=yes
+	    break
+	    ;;
+	  esac
+	done
+	;;
+      esac
+
+      exp_sym_flag='-bexport'
+      no_entry_flag='-bnoentry'
+    fi
+
+    # When large executables or shared objects are built, AIX ld can
+    # have problems creating the table of contents.  If linking a library
+    # or program results in "error TOC overflow" add -mminimal-toc to
+    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+    _LT_AC_TAGVAR(archive_cmds, $1)=''
+    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+    _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+    if test "$GXX" = yes; then
+      case $host_os in aix4.[[012]]|aix4.[[012]].*)
+      # We only want to do this on AIX 4.2 and lower, the check
+      # below for broken collect2 doesn't work under 4.3+
+	collect2name=`${CC} -print-prog-name=collect2`
+	if test -f "$collect2name" && \
+	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	then
+	  # We have reworked collect2
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+	else
+	  # We have old collect2
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+	fi
+	;;
+      esac
+      shared_flag='-shared'
+      if test "$aix_use_runtimelinking" = yes; then
+	shared_flag="$shared_flag "'${wl}-G'
+      fi
+    else
+      # not using gcc
+      if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	shared_flag='-G'
+      else
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag='${wl}-G'
+	else
+	  shared_flag='${wl}-bM:SRE'
+	fi
+      fi
+    fi
+
+    # It seems that -bexpall does not export symbols beginning with
+    # underscore (_), so it is better to generate a list of symbols to export.
+    _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+    if test "$aix_use_runtimelinking" = yes; then
+      # Warning - without using the other runtime loading flags (-brtl),
+      # -berok will link without error, but may produce a broken library.
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+      # Determine the default libpath from the value encoded in an empty executable.
+      _LT_AC_SYS_LIBPATH_AIX
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+     else
+      if test "$host_cpu" = ia64; then
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+      else
+	# Determine the default libpath from the value encoded in an empty executable.
+	_LT_AC_SYS_LIBPATH_AIX
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	# Warning - without using the other run time loading flags,
+	# -berok will link without error, but may produce a broken library.
+	_LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	# Exported symbols can be pulled into shared objects from archives
+	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+	# This is similar to how AIX traditionally builds its shared libraries.
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+      fi
+    fi
+    ;;
+
+  beos*)
+    if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+      # support --undefined.  This deserves some investigation.  FIXME
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    else
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    fi
+    ;;
+
+  chorus*)
+    case $cc_basename in
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+    # as there is no search path for DLLs.
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+    _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+    _LT_AC_TAGVAR(always_export_symbols, $1)=no
+    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+    if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      # If the export-symbols file already is a .def file (1st line
+      # is EXPORTS), use it as is; otherwise, prepend...
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	cp $export_symbols $output_objdir/$soname.def;
+      else
+	echo EXPORTS > $output_objdir/$soname.def;
+	cat $export_symbols >> $output_objdir/$soname.def;
+      fi~
+      $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+    else
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    fi
+  ;;
+      darwin* | rhapsody*)
+        case $host_os in
+        rhapsody* | darwin1.[[012]])
+         _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[[012]])
+               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+        esac
+      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_AC_TAGVAR(hardcode_direct, $1)=no
+      _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+    if test "$GXX" = yes ; then
+      lt_int_apple_cc_single_mod=no
+      output_verbose_link_cmd='echo'
+      if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
+       lt_int_apple_cc_single_mod=yes
+      fi
+      if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+       _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      else
+          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+        fi
+        _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+        # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+          if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+            _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          else
+            _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          fi
+            _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+          _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+          _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         _LT_AC_TAGVAR(ld_shlibs, $1)=no
+          ;;
+      esac
+      fi
+        ;;
+
+  dgux*)
+    case $cc_basename in
+      ec++*)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      ghcx*)
+	# Green Hills C++ Compiler
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  freebsd[[12]]*)
+    # C++ shared libraries reported to be fairly broken before switch to ELF
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  freebsd-elf*)
+    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+    ;;
+  freebsd* | kfreebsd*-gnu | dragonfly*)
+    # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+    # conventions
+    _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+    ;;
+  gnu*)
+    ;;
+  hpux9*)
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+    _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				# but as the default
+				# location of the library.
+
+    case $cc_basename in
+    CC*)
+      # FIXME: insert proper C++ library support
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    aCC*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      #
+      # There doesn't appear to be a way to prevent this compiler from
+      # explicitly linking system object files so we need to strip them
+      # from the output so that they don't get included in the library
+      # dependencies.
+      output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+      ;;
+    *)
+      if test "$GXX" = yes; then
+        _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+        # FIXME: insert proper C++ library support
+        _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+    ;;
+  hpux10*|hpux11*)
+    if test $with_gnu_ld = no; then
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+      case $host_cpu in
+      hppa*64*|ia64*)
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+        ;;
+      *)
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        ;;
+      esac
+    fi
+    case $host_cpu in
+    hppa*64*|ia64*)
+      _LT_AC_TAGVAR(hardcode_direct, $1)=no
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+    *)
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					      # but as the default
+					      # location of the library.
+      ;;
+    esac
+
+    case $cc_basename in
+      CC*)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      aCC*)
+	case $host_cpu in
+	hppa*64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	esac
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes; then
+	  if test $with_gnu_ld = no; then
+	    case $host_cpu in
+	    hppa*64*)
+	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    ia64*)
+	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    *)
+	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    esac
+	  fi
+	else
+	  # FIXME: insert proper C++ library support
+	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+    esac
+    ;;
+  interix3*)
+    _LT_AC_TAGVAR(hardcode_direct, $1)=no
+    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+    # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+    # Instead, shared libraries are loaded at an image base (0x10000000 by
+    # default) and relocated if they conflict, which is a slow very memory
+    # consuming and fragmenting process.  To avoid this, we pick a random,
+    # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+    # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+    ;;
+  irix5* | irix6*)
+    case $cc_basename in
+      CC*)
+	# SGI C++
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	# Archives containing C++ object files must be created using
+	# "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	# necessary to make sure instantiated templates are included
+	# in the archive.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	;;
+      *)
+	if test "$GXX" = yes; then
+	  if test "$with_gnu_ld" = no; then
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	  else
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+	  fi
+	fi
+	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+	;;
+    esac
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+    ;;
+  linux*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	# Archives containing C++ object files must be created using
+	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	;;
+      icpc*)
+	# Intel C++
+	with_gnu_ld=yes
+	# version 8.0 and above of icpc choke on multiply defined symbols
+	# if we add $predep_objects and $postdep_objects, however 7.1 and
+	# earlier do not add the objects themselves.
+	case `$CC -V 2>&1` in
+	*"Version 7."*)
+  	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+  	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  ;;
+	*)  # Version 8.0 or newer
+	  tmp_idyn=
+	  case $host_cpu in
+	    ia64*) tmp_idyn=' -i_dynamic';;
+	  esac
+  	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  ;;
+	esac
+	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	;;
+      pgCC*)
+        # Portland Group C++ compiler
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+  	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+        ;;
+      cxx*)
+	# Compaq C++
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	runpath_var=LD_RUN_PATH
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+    esac
+    ;;
+  lynxos*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  m88k*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  mvs*)
+    case $cc_basename in
+      cxx*)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+      wlarc=
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+    fi
+    # Workaround some broken pre-1.5 toolchains
+    output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+    ;;
+  openbsd2*)
+    # C++ shared libraries are fairly broken
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  openbsd*)
+    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    fi
+    output_verbose_link_cmd='echo'
+    ;;
+  osf3*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Archives containing C++ object files must be created using
+	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+
+	;;
+      RCC*)
+	# Rational C++ 2.4.1
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      cxx*)
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	  # Commands to make compiler produce verbose output that lists
+	  # what "hidden" libraries, object files and flags are used when
+	  # linking a shared library.
+	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+	else
+	  # FIXME: insert proper C++ library support
+	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+    esac
+    ;;
+  osf4* | osf5*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Archives containing C++ object files must be created using
+	# the KAI C++ compiler.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
+	;;
+      RCC*)
+	# Rational C++ 2.4.1
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      cxx*)
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	  echo "-hidden">> $lib.exp~
+	  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp  `test -n "$verstring" && echo -set_version	$verstring` -update_registry ${output_objdir}/so_locations -o $lib~
+	  $rm $lib.exp'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	 _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	  # Commands to make compiler produce verbose output that lists
+	  # what "hidden" libraries, object files and flags are used when
+	  # linking a shared library.
+	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+	else
+	  # FIXME: insert proper C++ library support
+	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+    esac
+    ;;
+  psos*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  sunos4*)
+    case $cc_basename in
+      CC*)
+	# Sun C++ 4.x
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      lcc*)
+	# Lucid
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  solaris*)
+    case $cc_basename in
+      CC*)
+	# Sun C++ 4.2, 5.x and Centerline C++
+        _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes
+	_LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	$CC -G${allow_undefined_flag}  ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+	case $host_os in
+	  solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	  *)
+	    # The C++ compiler is used as linker so we must use $wl
+	    # flag to pass the commands to the underlying system
+	    # linker. We must also pass each convience library through
+	    # to the system linker between allextract/defaultextract.
+	    # The C++ compiler will combine linker options so we
+	    # cannot just pass the convience library names through
+	    # without $wl.
+	    # Supported since Solaris 2.6 (maybe 2.5.1?)
+	    _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
+	    ;;
+	esac
+	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+	output_verbose_link_cmd='echo'
+
+	# Archives containing C++ object files must be created using
+	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	# necessary to make sure instantiated templates are included
+	# in the archive.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	;;
+      gcx*)
+	# Green Hills C++ Compiler
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	# The C++ compiler must be used to create the archive.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	;;
+      *)
+	# GNU C++ compiler with Solaris linker
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	  if $CC --version | grep -v '^2\.7' > /dev/null; then
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+	  else
+	    # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	    # platform.
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+	  fi
+
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	fi
+	;;
+    esac
+    ;;
+  sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+    _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+    runpath_var='LD_RUN_PATH'
+
+    case $cc_basename in
+      CC*)
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      *)
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+    esac
+    ;;
+  sysv5* | sco3.2v5* | sco5v6*)
+    # Note: We can NOT use -z defs as we might desire, because we do not
+    # link with -lc, and that would cause any symbols used from libc to
+    # always be unresolved, which means just about no library would
+    # ever link correctly.  If we're not using GNU ld we use -z text
+    # though, which does catch some bad symbols but isn't as heavy-handed
+    # as -z defs.
+    # For security reasons, it is highly recommended that you always
+    # use absolute paths for naming shared libraries, and exclude the
+    # DT_RUNPATH tag from executables and libraries.  But doing so
+    # requires that you compile everything twice, which is a pain.
+    # So that behaviour is only enabled if SCOABSPATH is set to a
+    # non-empty value in the environment.  Most likely only useful for
+    # creating official distributions of packages.
+    # This is a hack until libtool officially supports absolute path
+    # names for shared libraries.
+    _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+    _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+    _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+    runpath_var='LD_RUN_PATH'
+
+    case $cc_basename in
+      CC*)
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      *)
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+    esac
+    ;;
+  tandem*)
+    case $cc_basename in
+      NCC*)
+	# NonStop-UX NCC 3.20
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  vxworks*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  *)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+esac
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$GXX"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_POSTDEP_PREDEP($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+])# AC_LIBTOOL_LANG_CXX_CONFIG
+
+# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
+# ------------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
+int a;
+void foo (void) { a = 0; }
+EOF
+],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+EOF
+],[$1],[F77],[cat > conftest.$ac_ext <<EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+EOF
+],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  # The `*' in the case matches for architectures that use `case' in
+  # $output_verbose_cmd can trigger glob expansion during the loop
+  # eval without this substitution.
+  output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+  for p in `eval $output_verbose_link_cmd`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" \
+	  || test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_AC_TAGVAR(postdeps, $1)"; then
+	   _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_AC_TAGVAR(predep_objects, $1)"; then
+	   _LT_AC_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
+	   _LT_AC_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$rm -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+ifelse([$1],[CXX],
+[case $host_os in
+interix3*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_AC_TAGVAR(predep_objects,$1)=
+  _LT_AC_TAGVAR(postdep_objects,$1)=
+  _LT_AC_TAGVAR(postdeps,$1)=
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun'
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_AC_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+])# AC_LIBTOOL_POSTDEP_PREDEP
+
+# AC_LIBTOOL_LANG_F77_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
+AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
+[AC_REQUIRE([AC_PROG_F77])
+AC_LANG_PUSH(Fortran 77)
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="      subroutine t\n      return\n      end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="      program t\n      end\n"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+aix4* | aix5*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+  ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+_LT_AC_TAGVAR(GCC, $1)="$G77"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_F77_CONFIG
+
+
+# AC_LIBTOOL_LANG_GCJ_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
+AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_GCJ_CONFIG
+
+
+# AC_LIBTOOL_LANG_RC_CONFIG
+# -------------------------
+# Ensure that the configuration vars for the Windows resource compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
+AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_RC_CONFIG
+
+
+# AC_LIBTOOL_CONFIG([TAGNAME])
+# ----------------------------
+# If TAGNAME is not passed, then create an initial libtool script
+# with a default configuration from the untagged config vars.  Otherwise
+# add code to config.status for appending the configuration named by
+# TAGNAME from the matching tagged config vars.
+AC_DEFUN([AC_LIBTOOL_CONFIG],
+[# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    _LT_AC_TAGVAR(compiler, $1) \
+    _LT_AC_TAGVAR(CC, $1) \
+    _LT_AC_TAGVAR(LD, $1) \
+    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
+    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
+    _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
+    _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
+    _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
+    _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
+    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
+    _LT_AC_TAGVAR(old_archive_cmds, $1) \
+    _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
+    _LT_AC_TAGVAR(predep_objects, $1) \
+    _LT_AC_TAGVAR(postdep_objects, $1) \
+    _LT_AC_TAGVAR(predeps, $1) \
+    _LT_AC_TAGVAR(postdeps, $1) \
+    _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
+    _LT_AC_TAGVAR(archive_cmds, $1) \
+    _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
+    _LT_AC_TAGVAR(postinstall_cmds, $1) \
+    _LT_AC_TAGVAR(postuninstall_cmds, $1) \
+    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
+    _LT_AC_TAGVAR(allow_undefined_flag, $1) \
+    _LT_AC_TAGVAR(no_undefined_flag, $1) \
+    _LT_AC_TAGVAR(export_symbols_cmds, $1) \
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
+    _LT_AC_TAGVAR(hardcode_automatic, $1) \
+    _LT_AC_TAGVAR(module_cmds, $1) \
+    _LT_AC_TAGVAR(module_expsym_cmds, $1) \
+    _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
+    _LT_AC_TAGVAR(exclude_expsyms, $1) \
+    _LT_AC_TAGVAR(include_expsyms, $1); do
+
+    case $var in
+    _LT_AC_TAGVAR(old_archive_cmds, $1) | \
+    _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
+    _LT_AC_TAGVAR(archive_cmds, $1) | \
+    _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
+    _LT_AC_TAGVAR(module_cmds, $1) | \
+    _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
+    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
+    _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\[$]0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
+    ;;
+  esac
+
+ifelse([$1], [],
+  [cfgfile="${ofile}T"
+  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+  $rm -f "$cfgfile"
+  AC_MSG_NOTICE([creating $ofile])],
+  [cfgfile="$ofile"])
+
+  cat <<__EOF__ >> "$cfgfile"
+ifelse([$1], [],
+[#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG],
+[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
+
+# Is the compiler the GNU C compiler?
+with_gcc=$_LT_AC_TAGVAR(GCC, $1)
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
+archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
+module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1)
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
+
+# Symbols that must always be exported.
+include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
+
+ifelse([$1],[],
+[# ### END LIBTOOL CONFIG],
+[# ### END LIBTOOL TAG CONFIG: $tagname])
+
+__EOF__
+
+ifelse([$1],[], [
+  case $host_os in
+  aix3*)
+    cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+EOF
+    ;;
+  esac
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" || \
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+])
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+])# AC_LIBTOOL_CONFIG
+
+
+# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+
+_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+  AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
+
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*) # Its linker distinguishes data from code symbols
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+  lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  ;;
+linux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDGIRSTW]]'
+    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ 	]]\($symcode$symcode*\)[[ 	]][[ 	]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if grep ' nm_test_var$' "$nlist" >/dev/null; then
+	if grep ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+	  cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+lt_preloaded_symbols[[]] =
+{
+EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+	  cat <<\EOF >> conftest.$ac_ext
+  {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -f conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+
+
+# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
+# ---------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
+[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+ ifelse([$1],[CXX],[
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+      ;;
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | os2* | pw32*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    interix3*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	;;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix4* | aix5*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+       darwin*)
+         # PIC is the default on this platform
+         # Common symbols not allowed in MH_DYLIB files
+         case $cc_basename in
+           xlc*)
+           _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+           _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           ;;
+         esac
+       ;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | kfreebsd*-gnu | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  icpc* | ecpc*)
+	    # Intel C++
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC*)
+	    # Portland Group C++ compiler.
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+      ;;
+
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    interix3*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    *)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+      darwin*)
+        # PIC is the default on this platform
+        # Common symbols not allowed in MH_DYLIB files
+       case $cc_basename in
+         xlc*)
+         _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+         _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         ;;
+       esac
+       ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    newsos6)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    linux*)
+      case $cc_basename in
+      icc* | ecc*)
+	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      esac
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
+    _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
+    [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\"
+AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
+])
+
+
+# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
+# ------------------------------------
+# See if the linker supports building shared libraries.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
+[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ifelse([$1],[CXX],[
+  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix4* | aix5*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+  ;;
+  cygwin* | mingw*)
+    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  *)
+    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+],[
+  runpath_var=
+  _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+  _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_AC_TAGVAR(archive_cmds, $1)=
+  _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
+  _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+  _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_AC_TAGVAR(hardcode_direct, $1)=no
+  _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_AC_TAGVAR(hardcode_automatic, $1)=no
+  _LT_AC_TAGVAR(module_cmds, $1)=
+  _LT_AC_TAGVAR(module_expsym_cmds, $1)=
+  _LT_AC_TAGVAR(always_export_symbols, $1)=no
+  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_AC_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  extract_expsyms_cmds=
+  # Just being paranoid about ensuring that cc_basename is set.
+  _LT_CC_BASENAME([$compiler])
+  case $host_os in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+  	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>/dev/null` in
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+      fi
+      ;;
+
+    amigaos*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+
+      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can't use
+      # them.
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_AC_TAGVAR(always_export_symbols, $1)=no
+      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    interix3*)
+      _LT_AC_TAGVAR(hardcode_direct, $1)=no
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    linux*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	tmp_addflag=
+	case $cc_basename,$host_cpu in
+	pgcc*)				# Portland Group C compiler
+	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	esac
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+	if test $supports_anon_versioning = yes; then
+	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~
+  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+  $echo "local: *; };" >> $output_objdir/$libname.ver~
+	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	fi
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) 
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+	  else
+	    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+	  for ld_flag in $LDFLAGS; do
+  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+  	    aix_use_runtimelinking=yes
+  	    break
+  	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_AC_TAGVAR(archive_cmds, $1)=''
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" && \
+  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  then
+  	  # We have reworked collect2
+  	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+	  else
+  	  # We have old collect2
+  	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+  	  # It fails to find uninstalled libraries when the uninstalled
+  	  # path is not listed in the libpath.  Setting hardcode_minus_L
+  	  # to unsupported forces relinking
+  	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+  	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+  	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+  	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+       # Determine the default libpath from the value encoded in an empty executable.
+       _LT_AC_SYS_LIBPATH_AIX
+       _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+       else
+	if test "$host_cpu" = ia64; then
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an empty executable.
+	 _LT_AC_SYS_LIBPATH_AIX
+	 _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      # see comment about different semantics on the GNU ld section
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    bsdi[[45]]*)
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
+      # FIXME: Should let the user specify the lib program.
+      _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs'
+      _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    darwin* | rhapsody*)
+      case $host_os in
+        rhapsody* | darwin1.[[012]])
+         _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[[012]])
+               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+      esac
+      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_AC_TAGVAR(hardcode_direct, $1)=no
+      _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+    if test "$GCC" = yes ; then
+    	output_verbose_link_cmd='echo'
+        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+         _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+         _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+         _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         _LT_AC_TAGVAR(ld_shlibs, $1)=no
+          ;;
+      esac
+    fi
+      ;;
+
+    dgux*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    freebsd1*)
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | kfreebsd*-gnu | dragonfly*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	_LT_AC_TAGVAR(hardcode_direct, $1)=yes
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
+	  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    openbsd*)
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      else
+       case $host_os in
+	 openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	   _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	   _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	   ;;
+	 *)
+	   _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	   _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	   ;;
+       esac
+      fi
+      ;;
+
+    os2*)
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+      else
+	wlarc=''
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+ 	# The compiler driver will combine linker options so we
+ 	# cannot just pass the convience library names through
+ 	# without $wl, iff we do not link with $LD.
+ 	# Luckily, gcc supports the same syntax we need for Sun Studio.
+ 	# Supported since Solaris 2.6 (maybe 2.5.1?)
+ 	case $wlarc in
+ 	'')
+ 	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;;
+ 	*)
+ 	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ 	esac ;;
+      esac
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_AC_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*)
+      _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+  fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_AC_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+      $rm conftest*
+      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+	pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
+        _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+        if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+        then
+	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+        else
+	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+        fi
+        _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
+      ;;
+    esac
+  fi
+  ;;
+esac
+])# AC_LIBTOOL_PROG_LD_SHLIBS
+
+
+# _LT_AC_FILE_LTDLL_C
+# -------------------
+# Be careful that the start marker always follows a newline.
+AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# #  ifdef __CYGWIN32__
+# #    define __CYGWIN__ __CYGWIN32__
+# #  endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+#   __hDllInstance_base = hInst;
+#   return TRUE;
+# }
+# /* ltdll.c ends here */
+])# _LT_AC_FILE_LTDLL_C
+
+
+# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
+# ---------------------------------
+AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
+
+
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL],   [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED],  [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC],  [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD],        [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM],        [AC_PROG_NM])
+
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
+
+AC_DEFUN([LT_AC_PROG_GCJ],
+[AC_CHECK_TOOL(GCJ, gcj, no)
+  test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+  AC_SUBST(GCJFLAGS)
+])
+
+AC_DEFUN([LT_AC_PROG_RC],
+[AC_CHECK_TOOL(RC, windres, no)
+])
+
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+# LT_AC_PROG_SED
+# --------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+AC_DEFUN([LT_AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_MSG_RESULT([$SED])
+])
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+	 [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+	      		     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/Watchdog/compile b/Watchdog/compile
new file mode 100755
index 0000000..cd27e88
--- /dev/null
+++ b/Watchdog/compile
@@ -0,0 +1,142 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2005-05-14.22
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey at cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand `-c -o'.
+Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file `INSTALL'.
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+	# configure might choose to run compile as `compile cc -o foo foo.c'.
+	# So we strip `-o arg' only if arg is an object.
+	eat=1
+	case $2 in
+	  *.o | *.obj)
+	    ofile=$2
+	    ;;
+	  *)
+	    set x "$@" -o "$2"
+	    shift
+	    ;;
+	esac
+	;;
+      *.c)
+	cfile=$1
+	set x "$@" "$1"
+	shift
+	;;
+      *)
+	set x "$@" "$1"
+	shift
+	;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no `-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # `.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use `[/.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Watchdog/config.guess b/Watchdog/config.guess
new file mode 100755
index 0000000..ec46d18
--- /dev/null
+++ b/Watchdog/config.guess
@@ -0,0 +1,1498 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+#   Inc.
+
+timestamp='2006-02-27'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per at bothner.com>.
+# Please send patches to <config-patches at gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep __LP64__ >/dev/null
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:MSYS_NT-*:*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    x86:Interix*:[345]*)
+	echo i586-pc-interix${UNAME_RELEASE}
+	exit ;;
+    EM64T:Interix*:[345]*)
+	echo x86_64-unknown-interix${UNAME_RELEASE}
+	exit ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mipsel
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips64
+	#undef mips64el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mips64el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips64
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit ;;
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun)
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^LIBC/{
+		s: ::g
+		p
+	    }'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel at ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes at openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf at swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches at gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/Watchdog/config.h.in b/Watchdog/config.h.in
new file mode 100644
index 0000000..428cd43
--- /dev/null
+++ b/Watchdog/config.h.in
@@ -0,0 +1,70 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `setitimer' function. */
+#undef HAVE_SETITIMER
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Assertions are disabled when this is defined */
+#undef NDEBUG
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
diff --git a/Watchdog/config.sub b/Watchdog/config.sub
new file mode 100755
index 0000000..ab2c16c
--- /dev/null
+++ b/Watchdog/config.sub
@@ -0,0 +1,1609 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+#   Inc.
+
+timestamp='2006-02-27'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches at gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m32c)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	m32c-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+    c4x-* | tic4x-*)
+        os=-coff
+        ;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/Watchdog/configure b/Watchdog/configure
new file mode 100755
index 0000000..d14003f
--- /dev/null
+++ b/Watchdog/configure
@@ -0,0 +1,22264 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for the Parma Watchdog Library 0.4.
+#
+# Report bugs to <bagnara at cs.unipr.it>.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+  ;;
+esac
+
+echo=${ECHO-echo}
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+  for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+    if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+       echo_test_string=`eval $cmd` &&
+       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+    then
+      break
+    fi
+  done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+   test "X$echo_testing_string" = "X$echo_test_string"; then
+  :
+else
+  # The Solaris, AIX, and Digital Unix default echo programs unquote
+  # backslashes.  This makes it impossible to quote backslashes using
+  #   echo "$something" | sed 's/\\/\\\\/g'
+  #
+  # So, first we look for a working echo in the user's PATH.
+
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for dir in $PATH /usr/ucb; do
+    IFS="$lt_save_ifs"
+    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      echo="$dir/echo"
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+
+  if test "X$echo" = Xecho; then
+    # We didn't find a better echo, so look for alternatives.
+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      # This shell has a builtin print -r that does the trick.
+      echo='print -r'
+    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+	 test "X$CONFIG_SHELL" != X/bin/ksh; then
+      # If we have ksh, try running configure again with it.
+      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+      export ORIGINAL_CONFIG_SHELL
+      CONFIG_SHELL=/bin/ksh
+      export CONFIG_SHELL
+      exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+    else
+      # Try using printf.
+      echo='printf %s\n'
+      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+	 test "X$echo_testing_string" = "X$echo_test_string"; then
+	# Cool, printf works
+	:
+      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	export CONFIG_SHELL
+	SHELL="$CONFIG_SHELL"
+	export SHELL
+	echo="$CONFIG_SHELL $0 --fallback-echo"
+      elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	echo="$CONFIG_SHELL $0 --fallback-echo"
+      else
+	# maybe with a smaller string...
+	prev=:
+
+	for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+	  then
+	    break
+	  fi
+	  prev="$cmd"
+	done
+
+	if test "$prev" != 'sed 50q "$0"'; then
+	  echo_test_string=`eval $prev`
+	  export echo_test_string
+	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+	else
+	  # Oops.  We lost completely, so just stick with echo.
+	  echo=echo
+	fi
+      fi
+    fi
+  fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+   ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+
+tagnames=${tagnames+${tagnames},}CXX
+
+tagnames=${tagnames+${tagnames},}F77
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='the Parma Watchdog Library'
+PACKAGE_TARNAME='watchdog'
+PACKAGE_VERSION='0.4'
+PACKAGE_STRING='the Parma Watchdog Library 0.4'
+PACKAGE_BUGREPORT='bagnara at cs.unipr.it'
+
+ac_unique_file="src/Watchdog.cc"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INS [...]
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+	      localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_CXXCPP_set=${CXXCPP+set}
+ac_env_CXXCPP_value=$CXXCPP
+ac_cv_env_CXXCPP_set=${CXXCPP+set}
+ac_cv_env_CXXCPP_value=$CXXCPP
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+ac_env_F77_set=${F77+set}
+ac_env_F77_value=$F77
+ac_cv_env_F77_set=${F77+set}
+ac_cv_env_F77_value=$F77
+ac_env_FFLAGS_set=${FFLAGS+set}
+ac_env_FFLAGS_value=$FFLAGS
+ac_cv_env_FFLAGS_set=${FFLAGS+set}
+ac_cv_env_FFLAGS_value=$FFLAGS
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures the Parma Watchdog Library 0.4 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of the Parma Watchdog Library 0.4:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-debugging      compile with debugging information
+  --enable-profiling      compile for profiling
+  --enable-coverage       compile for test coverage
+  --enable-assertions     check run-time assertions
+  --enable-optimization   enable compiler optimizations
+  --enable-arch=arch      optimize for architecture arch
+  --enable-watchdog       build also the Parma Watchdog Library
+  --enable-shared[=PKGS]
+                          build shared libraries [default=yes]
+  --enable-static[=PKGS]
+                          build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-cc=xxx           use XXX as the C compiler
+  --with-cxx=xxx          use XXX as the C++ compiler
+  --with-cflags=xxx       add XXX to the options for the C compiler
+  --with-cxxflags=xxx     add XXX to the options for the C++ compiler
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-pic              try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-tags[=TAGS]
+                          include additional configurations [automatic]
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CXXCPP      C++ preprocessor
+  CPP         C preprocessor
+  F77         Fortran 77 compiler command
+  FFLAGS      Fortran 77 compiler flags
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <bagnara at cs.unipr.it>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+	   test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+the Parma Watchdog Library configure 0.4
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by the Parma Watchdog Library $as_me 0.4, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+	echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Minimum autoconf version required.
+
+
+# Make sure the sources are there.
+
+
+# Use Automake.
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+all:
+	@echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='watchdog'
+ VERSION='0.4'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  STRIP=$ac_ct_STRIP
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+
+# Generate a configuration header file.
+          ac_config_headers="$ac_config_headers config.h"
+
+
+# C compiler
+
+
+# Check whether --with-cc or --without-cc was given.
+if test "${with_cc+set}" = set; then
+  withval="$with_cc"
+  CC=$with_cc
+fi;
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Checks for typedefs, structures, and compiler characteristics.
+DEPDIR="${am__leading_dot}deps"
+
+          ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+	;;
+    conftest.$ac_ext )
+	# This is the source file.
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	# FIXME: I believe we export ac_cv_exeext for Libtool,
+	# but it would be cool to find out if it's true.  Does anybody
+	# maintain Libtool? --akim.
+	export ac_cv_exeext
+	break;;
+    * )
+	break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  export ac_cv_exeext
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset x;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *ccp;
+  char **p;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  ccp = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++ccp;
+  p = (char**) ccp;
+  ccp = (char const *const *) p;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+  }
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_const=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+
+# C++ compiler
+
+
+# Check whether --with-cxx or --without-cxx was given.
+if test "${with_cxx+set}" = set; then
+  withval="$with_cxx"
+  CXX=$with_cxx
+fi;
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+# Checks for programs.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+  CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+all:
+	@echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+# Check for Perl.
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PERL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PERL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no"
+  ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+
+if test -n "$PERL"; then
+  echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+
+
+if test x"$PERL" != xno; then
+  HAVE_PERL_TRUE=
+  HAVE_PERL_FALSE='#'
+else
+  HAVE_PERL_TRUE='#'
+  HAVE_PERL_FALSE=
+fi
+
+
+# Compilation flags
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+echo "$as_me:$LINENO: checking whether to compile with debug info" >&5
+echo $ECHO_N "checking whether to compile with debug info... $ECHO_C" >&6
+# Check whether --enable-debugging or --disable-debugging was given.
+if test "${enable_debugging+set}" = set; then
+  enableval="$enable_debugging"
+
+fi;
+case "${enableval}" in
+yes)
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  OPT_FLAGS="-g"
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to compile for profiling" >&5
+echo $ECHO_N "checking whether to compile for profiling... $ECHO_C" >&6
+# Check whether --enable-profiling or --disable-profiling was given.
+if test "${enable_profiling+set}" = set; then
+  enableval="$enable_profiling"
+
+fi;
+case "${enableval}" in
+yes)
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -pg -DPROFILING=1"
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to compile for test coverage" >&5
+echo $ECHO_N "checking whether to compile for test coverage... $ECHO_C" >&6
+# Check whether --enable-coverage or --disable-coverage was given.
+if test "${enable_coverage+set}" = set; then
+  enableval="$enable_coverage"
+
+fi;
+case "${enableval}" in
+yes)
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to enable checking of run-time assertions" >&5
+echo $ECHO_N "checking whether to enable checking of run-time assertions... $ECHO_C" >&6
+# Check whether --enable-assertions or --disable-assertions was given.
+if test "${enable_assertions+set}" = set; then
+  enableval="$enable_assertions"
+
+fi;
+case "${enableval}" in
+yes)
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cat >>confdefs.h <<\_ACEOF
+#define NDEBUG 1
+_ACEOF
+
+  debug_flag="-DNDEBUG=1"
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} --enable-assertions, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} --enable-assertions, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+arch=no
+enableval=standard
+echo "$as_me:$LINENO: checking whether to enable optimizations" >&5
+echo $ECHO_N "checking whether to enable optimizations... $ECHO_C" >&6
+# Check whether --enable-optimization or --disable-optimization was given.
+if test "${enable_optimization+set}" = set; then
+  enableval="$enable_optimization"
+
+fi;
+case "${enableval}" in
+sspeed)
+  echo "$as_me:$LINENO: result: sspeed" >&5
+echo "${ECHO_T}sspeed" >&6
+  OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
+  arch=yes
+  ;;
+speed)
+  echo "$as_me:$LINENO: result: speed" >&5
+echo "${ECHO_T}speed" >&6
+  OPT_FLAGS="$OPT_FLAGS -O3"
+  arch=yes
+  ;;
+size)
+  echo "$as_me:$LINENO: result: size" >&5
+echo "${ECHO_T}size" >&6
+  OPT_FLAGS="$OPT_FLAGS -Os"
+  arch=yes
+  ;;
+standard | yes)
+  echo "$as_me:$LINENO: result: standard" >&5
+echo "${ECHO_T}standard" >&6
+  OPT_FLAGS="$OPT_FLAGS -O2"
+  ;;
+mild)
+  echo "$as_me:$LINENO: result: mild" >&5
+echo "${ECHO_T}mild" >&6
+  OPT_FLAGS="$OPT_FLAGS -O1"
+  ;;
+zero)
+  echo "$as_me:$LINENO: result: zero" >&5
+echo "${ECHO_T}zero" >&6
+  OPT_FLAGS="$OPT_FLAGS -O0"
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=$arch
+echo "$as_me:$LINENO: checking for which architecture to optimize" >&5
+echo $ECHO_N "checking for which architecture to optimize... $ECHO_C" >&6
+# Check whether --enable-arch or --disable-arch was given.
+if test "${enable_arch+set}" = set; then
+  enableval="$enable_arch"
+
+fi;
+case "${enableval}" in
+yes)
+  m=`uname -m`
+  case $m in
+  i?86 | k6 | athlon)
+    echo "$as_me:$LINENO: result: $m" >&5
+echo "${ECHO_T}$m" >&6
+    OPT_FLAGS="$OPT_FLAGS -march=$m"
+    ;;
+  *)
+    echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6
+    ;;
+  esac
+  ;;
+no)
+  echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6
+  ;;
+*)
+  echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+  OPT_FLAGS="$OPT_FLAGS -march=$enableval"
+  ;;
+esac
+
+CFLAGS="$COMP_FLAGS $OPT_FLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS"
+
+# Allow additions to C and C++ compilation flags
+
+
+# Check whether --with-cflags or --without-cflags was given.
+if test "${with_cflags+set}" = set; then
+  withval="$with_cflags"
+  CFLAGS="$CFLAGS $with_cflags"
+fi;
+
+
+# Check whether --with-cxxflags or --without-cxxflags was given.
+if test "${with_cxxflags+set}" = set; then
+  withval="$with_cxxflags"
+  CXXFLAGS="$CXXFLAGS $with_cxxflags"
+fi;
+
+enableval=yes
+echo "$as_me:$LINENO: checking whether to build the Parma Watchdog Library" >&5
+echo $ECHO_N "checking whether to build the Parma Watchdog Library... $ECHO_C" >&6
+# Check whether --enable-watchdog or --disable-watchdog was given.
+if test "${enable_watchdog+set}" = set; then
+  enableval="$enable_watchdog"
+
+fi;
+case "${enableval}" in
+yes)
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} --enable-watchdog, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} --enable-watchdog, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+build_watchdog_library=$enableval
+
+
+if test x"$build_watchdog_library" = xyes; then
+  BUILD_WATCHDOG_LIBRARY_TRUE=
+  BUILD_WATCHDOG_LIBRARY_FALSE='#'
+else
+  BUILD_WATCHDOG_LIBRARY_TRUE='#'
+  BUILD_WATCHDOG_LIBRARY_FALSE=
+fi
+
+
+if test x"$build_watchdog_library" = xyes
+then
+  # Checks for header files.
+
+echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
+if test "${ac_cv_header_time+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_header_time=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_time=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define TIME_WITH_SYS_TIME 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+    then ac_cv_prog_egrep='grep -E'
+    else ac_cv_prog_egrep='egrep'
+    fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      exit(2);
+  exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in sys/time.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ---------------------------------- ##
+## Report this to bagnara at cs.unipr.it ##
+## ---------------------------------- ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+  # Checks for library fuctions.
+  # The following invocations of AC_LANG_PUSH(C) and AC_LANG_POP(C)
+  # are to work around a bug in AC_CHECK_FUNCS.  For more information,
+  # http://www.cs.unipr.it/pipermail/ppl-devel/2002-November/002929.html
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+for ac_func in setitimer
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+  { { echo "$as_me:$LINENO: error: CANNOT BUILD THE WATCHDOG LIBRARY
+*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION." >&5
+echo "$as_me: error: CANNOT BUILD THE WATCHDOG LIBRARY
+*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+done
+
+  ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+fi
+
+# Libtool.
+# Turn off shared libraries during beta-testing, since they
+# make debugging harder and the build process takes too long.
+#AC_DISABLE_SHARED
+
+
+
+
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+  enableval="$enable_shared"
+  p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi;
+
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+  enableval="$enable_static"
+  p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi;
+
+# Check whether --enable-fast-install or --disable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+  enableval="$enable_fast_install"
+  p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi;
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
+if test "${lt_cv_path_SED+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+
+fi
+
+SED=$lt_cv_path_SED
+echo "$as_me:$LINENO: result: $SED" >&5
+echo "${ECHO_T}$SED" >&6
+
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval="$with_gnu_ld"
+  test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi;
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
+echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
+if test "${lt_cv_path_NM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi
+fi
+echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+echo "${ECHO_T}$lt_cv_path_NM" >&6
+NM="$lt_cv_path_NM"
+
+echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
+echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump'.
+  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | kfreebsd*-gnu | dragonfly*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix3*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+nto-qnx*)
+  lt_cv_deplibs_check_method=unknown
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+  enableval="$enable_libtool_lock"
+
+fi;
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *ELF-32*)
+      HPUX_IA64_MODE="32"
+      ;;
+    *ELF-64*)
+      HPUX_IA64_MODE="64"
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line 6381 "configure"' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+   if test "$lt_cv_prog_gnu_ld" = yes; then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -melf32bsmip"
+      ;;
+    *N32*)
+      LD="${LD-ld} -melf32bmipn32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -melf64bmip"
+      ;;
+    esac
+   else
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -32"
+      ;;
+    *N32*)
+      LD="${LD-ld} -n32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -64"
+      ;;
+    esac
+   fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.o` in
+    *32-bit*)
+      case $host in
+        x86_64-*linux*)
+          LD="${LD-ld} -m elf_i386"
+          ;;
+        ppc64-*linux*|powerpc64-*linux*)
+          LD="${LD-ld} -m elf32ppclinux"
+          ;;
+        s390x-*linux*)
+          LD="${LD-ld} -m elf_s390"
+          ;;
+        sparc64-*linux*)
+          LD="${LD-ld} -m elf32_sparc"
+          ;;
+      esac
+      ;;
+    *64-bit*)
+      case $host in
+        x86_64-*linux*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        ppc*-*linux*|powerpc*-*linux*)
+          LD="${LD-ld} -m elf64ppc"
+          ;;
+        s390*-*linux*)
+          LD="${LD-ld} -m elf64_s390"
+          ;;
+        sparc*-*linux*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
+if test "${lt_cv_cc_needs_belf+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  lt_cv_cc_needs_belf=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+lt_cv_cc_needs_belf=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)    LD="${LD-ld} -64" ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_DLLTOOL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  echo "$as_me:$LINENO: result: $DLLTOOL" >&5
+echo "${ECHO_T}$DLLTOOL" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_DLLTOOL" && ac_cv_prog_ac_ct_DLLTOOL="false"
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5
+echo "${ECHO_T}$ac_ct_DLLTOOL" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  DLLTOOL=$ac_ct_DLLTOOL
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AS"; then
+  ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AS="${ac_tool_prefix}as"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AS=$ac_cv_prog_AS
+if test -n "$AS"; then
+  echo "$as_me:$LINENO: result: $AS" >&5
+echo "${ECHO_T}$AS" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AS"; then
+  ac_ct_AS=$AS
+  # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_AS"; then
+  ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AS="as"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_AS" && ac_cv_prog_ac_ct_AS="false"
+fi
+fi
+ac_ct_AS=$ac_cv_prog_ac_ct_AS
+if test -n "$ac_ct_AS"; then
+  echo "$as_me:$LINENO: result: $ac_ct_AS" >&5
+echo "${ECHO_T}$ac_ct_AS" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  AS=$ac_ct_AS
+else
+  AS="$ac_cv_prog_AS"
+fi
+
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_OBJDUMP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  echo "$as_me:$LINENO: result: $OBJDUMP" >&5
+echo "${ECHO_T}$OBJDUMP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_OBJDUMP" && ac_cv_prog_ac_ct_OBJDUMP="false"
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5
+echo "${ECHO_T}$ac_ct_OBJDUMP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  OBJDUMP=$ac_ct_OBJDUMP
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+  ;;
+
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+for ac_header in dlfcn.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ---------------------------------- ##
+## Report this to bagnara at cs.unipr.it ##
+## ---------------------------------- ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+fi
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$F77"; then
+  ac_cv_prog_F77="$F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+F77=$ac_cv_prog_F77
+if test -n "$F77"; then
+  echo "$as_me:$LINENO: result: $F77" >&5
+echo "${ECHO_T}$F77" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$F77" && break
+  done
+fi
+if test -z "$F77"; then
+  ac_ct_F77=$F77
+  for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_F77"; then
+  ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_F77="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_F77=$ac_cv_prog_ac_ct_F77
+if test -n "$ac_ct_F77"; then
+  echo "$as_me:$LINENO: result: $ac_ct_F77" >&5
+echo "${ECHO_T}$ac_ct_F77" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_F77" && break
+done
+
+  F77=$ac_ct_F77
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:7519:" \
+     "checking for Fortran 77 compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+rm -f a.out
+
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file.  (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6
+if test "${ac_cv_f77_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+      program main
+#ifndef __GNUC__
+       choke me
+#endif
+
+      end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_f77_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_f77_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6
+ac_ext=$ac_save_ext
+ac_test_FFLAGS=${FFLAGS+set}
+ac_save_FFLAGS=$FFLAGS
+FFLAGS=
+echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5
+echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_f77_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  FFLAGS=-g
+cat >conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_f77_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_f77_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_f77_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5
+echo "${ECHO_T}$ac_cv_prog_f77_g" >&6
+if test "$ac_test_FFLAGS" = set; then
+  FFLAGS=$ac_save_FFLAGS
+elif test $ac_cv_prog_f77_g = yes; then
+  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+    FFLAGS="-g -O2"
+  else
+    FFLAGS="-g"
+  fi
+else
+  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+    FFLAGS="-O2"
+  else
+    FFLAGS=
+  fi
+fi
+
+G77=`test $ac_compiler_gnu = yes && echo yes`
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+
+# find the maximum length of command line arguments
+echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ 	]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    # If test is not a shell built-in, we'll probably end up computing a
+    # maximum length that is only half of the actual maximum length, but
+    # we can't tell.
+    SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+    while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
+	       = "XX$teststring") >/dev/null 2>&1 &&
+	    new_result=`expr "X$teststring" : ".*" 2>&1` &&
+	    lt_cv_sys_max_cmd_len=$new_result &&
+	    test $i != 17 # 1/2 MB should be enough
+    do
+      i=`expr $i + 1`
+      teststring=$teststring$teststring
+    done
+    teststring=
+    # Add a significant safety factor because C++ compilers can tack on massive
+    # amounts of additional arguments before passing them to the linker.
+    # It appears as though 1/2 is a usable value.
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6
+else
+  echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+fi
+
+
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*) # Its linker distinguishes data from code symbols
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+  lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  ;;
+linux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDGIRSTW]'
+    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ 	]\($symcode$symcode*\)[ 	][ 	]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
+  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if grep ' nm_test_var$' "$nlist" >/dev/null; then
+	if grep ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+	  cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+	  cat <<\EOF >> conftest.$ac_ext
+  {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -f conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6
+else
+  echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+fi
+
+echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6
+if test "${lt_cv_objdir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+echo "${ECHO_T}$lt_cv_objdir" >&6
+objdir=$lt_cv_objdir
+
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="${ac_tool_prefix}ar"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="ar"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false"
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  AR=$ac_ct_AR
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  RANLIB=$ac_ct_RANLIB
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  STRIP=$ac_ct_STRIP
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+enable_dlopen=yes
+enable_win32_dll=yes
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+  enableval="$enable_libtool_lock"
+
+fi;
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+
+# Check whether --with-pic or --without-pic was given.
+if test "${with_pic+set}" = set; then
+  withval="$with_pic"
+  pic_mode="$withval"
+else
+  pic_mode=default
+fi;
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+  ac_outfile=conftest.$ac_objext
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:8582: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:8586: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+      ;;
+
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    interix3*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+      darwin*)
+        # PIC is the default on this platform
+        # Common symbols not allowed in MH_DYLIB files
+       case $cc_basename in
+         xlc*)
+         lt_prog_compiler_pic='-qnocommon'
+         lt_prog_compiler_wl='-Wl,'
+         ;;
+       esac
+       ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    linux*)
+      case $cc_basename in
+      icc* | ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      esac
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_pic_works=no
+  ac_outfile=conftest.$ac_objext
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:8850: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:8854: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_prog_compiler_pic_works=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6
+
+if test x"$lt_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   printf "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_prog_compiler_static_works=yes
+       fi
+     else
+       lt_prog_compiler_static_works=yes
+     fi
+   fi
+   $rm conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works" >&6
+
+if test x"$lt_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:8954: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:8958: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+  runpath_var=
+  allow_undefined_flag=
+  enable_shared_with_static_runtimes=no
+  archive_cmds=
+  archive_expsym_cmds=
+  old_archive_From_new_cmds=
+  old_archive_from_expsyms_cmds=
+  export_dynamic_flag_spec=
+  whole_archive_flag_spec=
+  thread_safe_flag_spec=
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_flag_spec_ld=
+  hardcode_libdir_separator=
+  hardcode_direct=no
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  link_all_deplibs=unknown
+  hardcode_automatic=no
+  module_cmds=
+  module_expsym_cmds=
+  always_export_symbols=no
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  extract_expsyms_cmds=
+  # Just being paranoid about ensuring that cc_basename is set.
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+  case $host_os in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+	whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+  	whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>/dev/null` in
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+
+      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can't use
+      # them.
+      ld_shlibs=no
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    interix3*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    linux*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	tmp_addflag=
+	case $cc_basename,$host_cpu in
+	pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	esac
+	archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+	if test $supports_anon_versioning = yes; then
+	  archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~
+  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+  $echo "local: *; };" >> $output_objdir/$libname.ver~
+	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+	  for ld_flag in $LDFLAGS; do
+  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+  	    aix_use_runtimelinking=yes
+  	    break
+  	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" && \
+  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  then
+  	  # We have reworked collect2
+  	  hardcode_direct=yes
+	  else
+  	  # We have old collect2
+  	  hardcode_direct=unsupported
+  	  # It fails to find uninstalled libraries when the uninstalled
+  	  # path is not listed in the libpath.  Setting hardcode_minus_L
+  	  # to unsupported forces relinking
+  	  hardcode_minus_L=yes
+  	  hardcode_libdir_flag_spec='-L$libdir'
+  	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+  	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+       # Determine the default libpath from the value encoded in an empty executable.
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+       hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+       else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an empty executable.
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec='$convenience'
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs=no
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      allow_undefined_flag=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_From_new_cmds='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    darwin* | rhapsody*)
+      case $host_os in
+        rhapsody* | darwin1.[012])
+         allow_undefined_flag='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[012])
+               allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+      esac
+      archive_cmds_need_lc=no
+      hardcode_direct=no
+      hardcode_automatic=yes
+      hardcode_shlibpath_var=unsupported
+      whole_archive_flag_spec=''
+      link_all_deplibs=yes
+    if test "$GCC" = yes ; then
+    	output_verbose_link_cmd='echo'
+        archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+      archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      module_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+         archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+         module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+         archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          module_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         ld_shlibs=no
+          ;;
+      esac
+    fi
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    freebsd1*)
+      ld_shlibs=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | kfreebsd*-gnu | dragonfly*)
+      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	hardcode_direct=yes
+	export_dynamic_flag_spec='${wl}-E'
+
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_libdir_flag_spec_ld='+b $libdir'
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_ld='-rpath $libdir'
+      fi
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      link_all_deplibs=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    openbsd*)
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec='${wl}-E'
+      else
+       case $host_os in
+	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	   archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	   hardcode_libdir_flag_spec='-R$libdir'
+	   ;;
+	 *)
+	   archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	   hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	   ;;
+       esac
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z text'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+      else
+	wlarc=''
+	archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+ 	# The compiler driver will combine linker options so we
+ 	# cannot just pass the convience library names through
+ 	# without $wl, iff we do not link with $LD.
+ 	# Luckily, gcc supports the same syntax we need for Sun Studio.
+ 	# Supported since Solaris 2.6 (maybe 2.5.1?)
+ 	case $wlarc in
+ 	'')
+ 	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+ 	*)
+ 	  whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ 	esac ;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+      $rm conftest*
+      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl
+	pic_flag=$lt_prog_compiler_pic
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag
+        allow_undefined_flag=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc=no
+        else
+	  archive_cmds_need_lc=yes
+        fi
+        allow_undefined_flag=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+echo "${ECHO_T}$archive_cmds_need_lc" >&6
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+  if test "$GCC" = yes; then
+    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+  else
+    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+  fi
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+kfreebsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  freebsd*) # from 4.6 on
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix3*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+knetbsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+   test -n "$runpath_var" || \
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6
+
+if test "$hardcode_action" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+striplib=
+old_striplib=
+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+   darwin*)
+       if test -n "$STRIP" ; then
+         striplib="$STRIP -x"
+         echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+       else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+       ;;
+   *)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+    ;;
+  esac
+fi
+
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+   ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+   ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_dl_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+   ;;
+
+  *)
+    echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+if test "${ac_cv_func_shl_load+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define shl_load innocuous_shl_load
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char shl_load (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef shl_load
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char shl_load ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+char (*f) () = shl_load;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != shl_load;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_shl_load=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+if test $ac_cv_func_shl_load = yes; then
+  lt_cv_dlopen="shl_load"
+else
+  echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char shl_load ();
+int
+main ()
+{
+shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_dld_shl_load=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+if test $ac_cv_lib_dld_shl_load = yes; then
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
+else
+  echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+if test "${ac_cv_func_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define dlopen innocuous_dlopen
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char dlopen (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef dlopen
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlopen ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+char (*f) () = dlopen;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != dlopen;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+if test $ac_cv_func_dlopen = yes; then
+  lt_cv_dlopen="dlopen"
+else
+  echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_dl_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_svld_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_svld_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+if test $ac_cv_lib_svld_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dld_link ();
+int
+main ()
+{
+dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_dld_dld_link=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_dld_link=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
+if test $ac_cv_lib_dld_dld_link = yes; then
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+#line 11299 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+    exit (status);
+}
+EOF
+  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+#line 11399 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+    exit (status);
+}
+EOF
+  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+# Report which library types will actually be built
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+
+aix4* | aix5*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+    ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler \
+    CC \
+    LD \
+    lt_prog_compiler_wl \
+    lt_prog_compiler_pic \
+    lt_prog_compiler_static \
+    lt_prog_compiler_no_builtin_flag \
+    export_dynamic_flag_spec \
+    thread_safe_flag_spec \
+    whole_archive_flag_spec \
+    enable_shared_with_static_runtimes \
+    old_archive_cmds \
+    old_archive_from_new_cmds \
+    predep_objects \
+    postdep_objects \
+    predeps \
+    postdeps \
+    compiler_lib_search_path \
+    archive_cmds \
+    archive_expsym_cmds \
+    postinstall_cmds \
+    postuninstall_cmds \
+    old_archive_from_expsyms_cmds \
+    allow_undefined_flag \
+    no_undefined_flag \
+    export_symbols_cmds \
+    hardcode_libdir_flag_spec \
+    hardcode_libdir_flag_spec_ld \
+    hardcode_libdir_separator \
+    hardcode_automatic \
+    module_cmds \
+    module_expsym_cmds \
+    lt_cv_prog_compiler_c_o \
+    exclude_expsyms \
+    include_expsyms; do
+
+    case $var in
+    old_archive_cmds | \
+    old_archive_from_new_cmds | \
+    archive_cmds | \
+    archive_expsym_cmds | \
+    module_cmds | \
+    module_expsym_cmds | \
+    old_archive_from_expsyms_cmds | \
+    export_symbols_cmds | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="${ofile}T"
+  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+  $rm -f "$cfgfile"
+  { echo "$as_me:$LINENO: creating $ofile" >&5
+echo "$as_me: creating $ofile" >&6;}
+
+  cat <<__EOF__ >> "$cfgfile"
+#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+
+  case $host_os in
+  aix3*)
+    cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+EOF
+    ;;
+  esac
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" || \
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+# Check whether --with-tags or --without-tags was given.
+if test "${with_tags+set}" = set; then
+  withval="$with_tags"
+  tagnames="$withval"
+fi;
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+  if test ! -f "${ofile}"; then
+    { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;}
+  fi
+
+  if test -z "$LTCC"; then
+    eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+    if test -z "$LTCC"; then
+      { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;}
+    else
+      { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5
+echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;}
+    fi
+  fi
+  if test -z "$LTCFLAGS"; then
+    eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+  fi
+
+  # Extract list of available tagged configurations in $ofile.
+  # Note that this assumes the entire list is on one line.
+  available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+  lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+  for tagname in $tagnames; do
+    IFS="$lt_save_ifs"
+    # Check whether tagname contains only valid characters
+    case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in
+    "") ;;
+    *)  { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5
+echo "$as_me: error: invalid tag name: $tagname" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+    esac
+
+    if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+    then
+      { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5
+echo "$as_me: error: tag name \"$tagname\" already exists" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+
+    # Update the list of available tags.
+    if test -n "$tagname"; then
+      echo appending configuration tag \"$tagname\" to $ofile
+
+      case $tagname in
+      CXX)
+	if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+	    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+	    (test "X$CXX" != "Xg++"))) ; then
+	  ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_flag_spec_ld_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+  lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+  $as_unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+  lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+  $as_unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+compiler_CXX=$CC
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+  lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+else
+  lt_prog_compiler_no_builtin_flag_CXX=
+fi
+
+if test "$GXX" = yes; then
+  # Set up default GNU C++ configuration
+
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval="$with_gnu_ld"
+  test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi;
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+  # Check if GNU C++ uses GNU ld as the underlying linker, since the
+  # archiving commands below assume that GNU ld is being used.
+  if test "$with_gnu_ld" = yes; then
+    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+    #     investigate it a little bit more. (MM)
+    wlarc='${wl}'
+
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+	grep 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec_CXX=
+    fi
+  else
+    with_gnu_ld=no
+    wlarc=
+
+    # A generic and very simple default shared library creation
+    # command for GNU C++ for the case where it uses the native
+    # linker, instead of GNU ld.  If possible, this setting should
+    # overridden to take advantage of the native linker features on
+    # the platform it is being used on.
+    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+  fi
+
+  # Commands to make compiler produce verbose output that lists
+  # what "hidden" libraries, object files and flags are used when
+  # linking a shared library.
+  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+  GXX=no
+  with_gnu_ld=no
+  wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+ld_shlibs_CXX=yes
+case $host_os in
+  aix3*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  aix4* | aix5*)
+    if test "$host_cpu" = ia64; then
+      # On IA64, the linker does run time linking by default, so we don't
+      # have to do anything special.
+      aix_use_runtimelinking=no
+      exp_sym_flag='-Bexport'
+      no_entry_flag=""
+    else
+      aix_use_runtimelinking=no
+
+      # Test if we are trying to use run time linking or normal
+      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+      # need to do runtime linking.
+      case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+	for ld_flag in $LDFLAGS; do
+	  case $ld_flag in
+	  *-brtl*)
+	    aix_use_runtimelinking=yes
+	    break
+	    ;;
+	  esac
+	done
+	;;
+      esac
+
+      exp_sym_flag='-bexport'
+      no_entry_flag='-bnoentry'
+    fi
+
+    # When large executables or shared objects are built, AIX ld can
+    # have problems creating the table of contents.  If linking a library
+    # or program results in "error TOC overflow" add -mminimal-toc to
+    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+    archive_cmds_CXX=''
+    hardcode_direct_CXX=yes
+    hardcode_libdir_separator_CXX=':'
+    link_all_deplibs_CXX=yes
+
+    if test "$GXX" = yes; then
+      case $host_os in aix4.[012]|aix4.[012].*)
+      # We only want to do this on AIX 4.2 and lower, the check
+      # below for broken collect2 doesn't work under 4.3+
+	collect2name=`${CC} -print-prog-name=collect2`
+	if test -f "$collect2name" && \
+	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	then
+	  # We have reworked collect2
+	  hardcode_direct_CXX=yes
+	else
+	  # We have old collect2
+	  hardcode_direct_CXX=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L_CXX=yes
+	  hardcode_libdir_flag_spec_CXX='-L$libdir'
+	  hardcode_libdir_separator_CXX=
+	fi
+	;;
+      esac
+      shared_flag='-shared'
+      if test "$aix_use_runtimelinking" = yes; then
+	shared_flag="$shared_flag "'${wl}-G'
+      fi
+    else
+      # not using gcc
+      if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	shared_flag='-G'
+      else
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag='${wl}-G'
+	else
+	  shared_flag='${wl}-bM:SRE'
+	fi
+      fi
+    fi
+
+    # It seems that -bexpall does not export symbols beginning with
+    # underscore (_), so it is better to generate a list of symbols to export.
+    always_export_symbols_CXX=yes
+    if test "$aix_use_runtimelinking" = yes; then
+      # Warning - without using the other runtime loading flags (-brtl),
+      # -berok will link without error, but may produce a broken library.
+      allow_undefined_flag_CXX='-berok'
+      # Determine the default libpath from the value encoded in an empty executable.
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+      hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+      archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+     else
+      if test "$host_cpu" = ia64; then
+	hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+	allow_undefined_flag_CXX="-z nodefs"
+	archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+      else
+	# Determine the default libpath from the value encoded in an empty executable.
+	cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	# Warning - without using the other run time loading flags,
+	# -berok will link without error, but may produce a broken library.
+	no_undefined_flag_CXX=' ${wl}-bernotok'
+	allow_undefined_flag_CXX=' ${wl}-berok'
+	# Exported symbols can be pulled into shared objects from archives
+	whole_archive_flag_spec_CXX='$convenience'
+	archive_cmds_need_lc_CXX=yes
+	# This is similar to how AIX traditionally builds its shared libraries.
+	archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+      fi
+    fi
+    ;;
+
+  beos*)
+    if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+      allow_undefined_flag_CXX=unsupported
+      # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+      # support --undefined.  This deserves some investigation.  FIXME
+      archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    else
+      ld_shlibs_CXX=no
+    fi
+    ;;
+
+  chorus*)
+    case $cc_basename in
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+    # as there is no search path for DLLs.
+    hardcode_libdir_flag_spec_CXX='-L$libdir'
+    allow_undefined_flag_CXX=unsupported
+    always_export_symbols_CXX=no
+    enable_shared_with_static_runtimes_CXX=yes
+
+    if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+      archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      # If the export-symbols file already is a .def file (1st line
+      # is EXPORTS), use it as is; otherwise, prepend...
+      archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	cp $export_symbols $output_objdir/$soname.def;
+      else
+	echo EXPORTS > $output_objdir/$soname.def;
+	cat $export_symbols >> $output_objdir/$soname.def;
+      fi~
+      $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+    else
+      ld_shlibs_CXX=no
+    fi
+  ;;
+      darwin* | rhapsody*)
+        case $host_os in
+        rhapsody* | darwin1.[012])
+         allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[012])
+               allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+        esac
+      archive_cmds_need_lc_CXX=no
+      hardcode_direct_CXX=no
+      hardcode_automatic_CXX=yes
+      hardcode_shlibpath_var_CXX=unsupported
+      whole_archive_flag_spec_CXX=''
+      link_all_deplibs_CXX=yes
+
+    if test "$GXX" = yes ; then
+      lt_int_apple_cc_single_mod=no
+      output_verbose_link_cmd='echo'
+      if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
+       lt_int_apple_cc_single_mod=yes
+      fi
+      if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+       archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      else
+          archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+        fi
+        module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+        # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+          if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+            archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          else
+            archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          fi
+            module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+          archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+          module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+          archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         ld_shlibs_CXX=no
+          ;;
+      esac
+      fi
+        ;;
+
+  dgux*)
+    case $cc_basename in
+      ec++*)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      ghcx*)
+	# Green Hills C++ Compiler
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+  freebsd[12]*)
+    # C++ shared libraries reported to be fairly broken before switch to ELF
+    ld_shlibs_CXX=no
+    ;;
+  freebsd-elf*)
+    archive_cmds_need_lc_CXX=no
+    ;;
+  freebsd* | kfreebsd*-gnu | dragonfly*)
+    # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+    # conventions
+    ld_shlibs_CXX=yes
+    ;;
+  gnu*)
+    ;;
+  hpux9*)
+    hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+    hardcode_libdir_separator_CXX=:
+    export_dynamic_flag_spec_CXX='${wl}-E'
+    hardcode_direct_CXX=yes
+    hardcode_minus_L_CXX=yes # Not in the search PATH,
+				# but as the default
+				# location of the library.
+
+    case $cc_basename in
+    CC*)
+      # FIXME: insert proper C++ library support
+      ld_shlibs_CXX=no
+      ;;
+    aCC*)
+      archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      #
+      # There doesn't appear to be a way to prevent this compiler from
+      # explicitly linking system object files so we need to strip them
+      # from the output so that they don't get included in the library
+      # dependencies.
+      output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+      ;;
+    *)
+      if test "$GXX" = yes; then
+        archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+      fi
+      ;;
+    esac
+    ;;
+  hpux10*|hpux11*)
+    if test $with_gnu_ld = no; then
+      hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator_CXX=:
+
+      case $host_cpu in
+      hppa*64*|ia64*)
+	hardcode_libdir_flag_spec_ld_CXX='+b $libdir'
+        ;;
+      *)
+	export_dynamic_flag_spec_CXX='${wl}-E'
+        ;;
+      esac
+    fi
+    case $host_cpu in
+    hppa*64*|ia64*)
+      hardcode_direct_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      ;;
+    *)
+      hardcode_direct_CXX=yes
+      hardcode_minus_L_CXX=yes # Not in the search PATH,
+					      # but as the default
+					      # location of the library.
+      ;;
+    esac
+
+    case $cc_basename in
+      CC*)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      aCC*)
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	esac
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes; then
+	  if test $with_gnu_ld = no; then
+	    case $host_cpu in
+	    hppa*64*)
+	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    ia64*)
+	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    *)
+	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    esac
+	  fi
+	else
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	fi
+	;;
+    esac
+    ;;
+  interix3*)
+    hardcode_direct_CXX=no
+    hardcode_shlibpath_var_CXX=no
+    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+    export_dynamic_flag_spec_CXX='${wl}-E'
+    # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+    # Instead, shared libraries are loaded at an image base (0x10000000 by
+    # default) and relocated if they conflict, which is a slow very memory
+    # consuming and fragmenting process.  To avoid this, we pick a random,
+    # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+    # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+    archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+    archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+    ;;
+  irix5* | irix6*)
+    case $cc_basename in
+      CC*)
+	# SGI C++
+	archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	# Archives containing C++ object files must be created using
+	# "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	# necessary to make sure instantiated templates are included
+	# in the archive.
+	old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	;;
+      *)
+	if test "$GXX" = yes; then
+	  if test "$with_gnu_ld" = no; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	  else
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+	  fi
+	fi
+	link_all_deplibs_CXX=yes
+	;;
+    esac
+    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator_CXX=:
+    ;;
+  linux*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+	hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir'
+	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+	# Archives containing C++ object files must be created using
+	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+	;;
+      icpc*)
+	# Intel C++
+	with_gnu_ld=yes
+	# version 8.0 and above of icpc choke on multiply defined symbols
+	# if we add $predep_objects and $postdep_objects, however 7.1 and
+	# earlier do not add the objects themselves.
+	case `$CC -V 2>&1` in
+	*"Version 7."*)
+  	  archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+  	  archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  ;;
+	*)  # Version 8.0 or newer
+	  tmp_idyn=
+	  case $host_cpu in
+	    ia64*) tmp_idyn=' -i_dynamic';;
+	  esac
+  	  archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  ;;
+	esac
+	archive_cmds_need_lc_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	;;
+      pgCC*)
+        # Portland Group C++ compiler
+	archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+  	archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+
+	hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+        ;;
+      cxx*)
+	# Compaq C++
+	archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	runpath_var=LD_RUN_PATH
+	hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+    esac
+    ;;
+  lynxos*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  m88k*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  mvs*)
+    case $cc_basename in
+      cxx*)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+      wlarc=
+      hardcode_libdir_flag_spec_CXX='-R$libdir'
+      hardcode_direct_CXX=yes
+      hardcode_shlibpath_var_CXX=no
+    fi
+    # Workaround some broken pre-1.5 toolchains
+    output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+    ;;
+  openbsd2*)
+    # C++ shared libraries are fairly broken
+    ld_shlibs_CXX=no
+    ;;
+  openbsd*)
+    hardcode_direct_CXX=yes
+    hardcode_shlibpath_var_CXX=no
+    archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+      export_dynamic_flag_spec_CXX='${wl}-E'
+      whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    fi
+    output_verbose_link_cmd='echo'
+    ;;
+  osf3*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Archives containing C++ object files must be created using
+	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+
+	;;
+      RCC*)
+	# Rational C++ 2.4.1
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      cxx*)
+	allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	  archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+	  hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+	  # Commands to make compiler produce verbose output that lists
+	  # what "hidden" libraries, object files and flags are used when
+	  # linking a shared library.
+	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+	else
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	fi
+	;;
+    esac
+    ;;
+  osf4* | osf5*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Archives containing C++ object files must be created using
+	# the KAI C++ compiler.
+	old_archive_cmds_CXX='$CC -o $oldlib $oldobjs'
+	;;
+      RCC*)
+	# Rational C++ 2.4.1
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      cxx*)
+	allow_undefined_flag_CXX=' -expect_unresolved \*'
+	archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	  echo "-hidden">> $lib.exp~
+	  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp  `test -n "$verstring" && echo -set_version	$verstring` -update_registry ${output_objdir}/so_locations -o $lib~
+	  $rm $lib.exp'
+
+	hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	 archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+	  hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+	  # Commands to make compiler produce verbose output that lists
+	  # what "hidden" libraries, object files and flags are used when
+	  # linking a shared library.
+	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+	else
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	fi
+	;;
+    esac
+    ;;
+  psos*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  sunos4*)
+    case $cc_basename in
+      CC*)
+	# Sun C++ 4.x
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      lcc*)
+	# Lucid
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+  solaris*)
+    case $cc_basename in
+      CC*)
+	# Sun C++ 4.2, 5.x and Centerline C++
+        archive_cmds_need_lc_CXX=yes
+	no_undefined_flag_CXX=' -zdefs'
+	archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	$CC -G${allow_undefined_flag}  ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	hardcode_libdir_flag_spec_CXX='-R$libdir'
+	hardcode_shlibpath_var_CXX=no
+	case $host_os in
+	  solaris2.[0-5] | solaris2.[0-5].*) ;;
+	  *)
+	    # The C++ compiler is used as linker so we must use $wl
+	    # flag to pass the commands to the underlying system
+	    # linker. We must also pass each convience library through
+	    # to the system linker between allextract/defaultextract.
+	    # The C++ compiler will combine linker options so we
+	    # cannot just pass the convience library names through
+	    # without $wl.
+	    # Supported since Solaris 2.6 (maybe 2.5.1?)
+	    whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
+	    ;;
+	esac
+	link_all_deplibs_CXX=yes
+
+	output_verbose_link_cmd='echo'
+
+	# Archives containing C++ object files must be created using
+	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	# necessary to make sure instantiated templates are included
+	# in the archive.
+	old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	;;
+      gcx*)
+	# Green Hills C++ Compiler
+	archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	# The C++ compiler must be used to create the archive.
+	old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	;;
+      *)
+	# GNU C++ compiler with Solaris linker
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+	  if $CC --version | grep -v '^2\.7' > /dev/null; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+	  else
+	    # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	    # platform.
+	    archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+	  fi
+
+	  hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+	fi
+	;;
+    esac
+    ;;
+  sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+    no_undefined_flag_CXX='${wl}-z,text'
+    archive_cmds_need_lc_CXX=no
+    hardcode_shlibpath_var_CXX=no
+    runpath_var='LD_RUN_PATH'
+
+    case $cc_basename in
+      CC*)
+	archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      *)
+	archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+    esac
+    ;;
+  sysv5* | sco3.2v5* | sco5v6*)
+    # Note: We can NOT use -z defs as we might desire, because we do not
+    # link with -lc, and that would cause any symbols used from libc to
+    # always be unresolved, which means just about no library would
+    # ever link correctly.  If we're not using GNU ld we use -z text
+    # though, which does catch some bad symbols but isn't as heavy-handed
+    # as -z defs.
+    # For security reasons, it is highly recommended that you always
+    # use absolute paths for naming shared libraries, and exclude the
+    # DT_RUNPATH tag from executables and libraries.  But doing so
+    # requires that you compile everything twice, which is a pain.
+    # So that behaviour is only enabled if SCOABSPATH is set to a
+    # non-empty value in the environment.  Most likely only useful for
+    # creating official distributions of packages.
+    # This is a hack until libtool officially supports absolute path
+    # names for shared libraries.
+    no_undefined_flag_CXX='${wl}-z,text'
+    allow_undefined_flag_CXX='${wl}-z,nodefs'
+    archive_cmds_need_lc_CXX=no
+    hardcode_shlibpath_var_CXX=no
+    hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+    hardcode_libdir_separator_CXX=':'
+    link_all_deplibs_CXX=yes
+    export_dynamic_flag_spec_CXX='${wl}-Bexport'
+    runpath_var='LD_RUN_PATH'
+
+    case $cc_basename in
+      CC*)
+	archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      *)
+	archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+    esac
+    ;;
+  tandem*)
+    case $cc_basename in
+      NCC*)
+	# NonStop-UX NCC 3.20
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+  vxworks*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  *)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+esac
+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+GCC_CXX="$GXX"
+LD_CXX="$LD"
+
+
+cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+EOF
+
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  # The `*' in the case matches for architectures that use `case' in
+  # $output_verbose_cmd can trigger glob expansion during the loop
+  # eval without this substitution.
+  output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+  for p in `eval $output_verbose_link_cmd`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" \
+	  || test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_CXX"; then
+	     compiler_lib_search_path_CXX="${prev}${p}"
+	   else
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_CXX"; then
+	   postdeps_CXX="${prev}${p}"
+	 else
+	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$predep_objects_CXX"; then
+	   predep_objects_CXX="$p"
+	 else
+	   predep_objects_CXX="$predep_objects_CXX $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_CXX"; then
+	   postdep_objects_CXX="$p"
+	 else
+	   postdep_objects_CXX="$postdep_objects_CXX $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$rm -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix3*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    postdeps_CXX='-lCstd -lCrun'
+    ;;
+  esac
+  ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+
+lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      ;;
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+      ;;
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | os2* | pw32*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    interix3*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	;;
+      *)
+	lt_prog_compiler_pic_CXX='-fPIC'
+	;;
+      esac
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix4* | aix5*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  lt_prog_compiler_static_CXX='-Bstatic'
+	else
+	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+       darwin*)
+         # PIC is the default on this platform
+         # Common symbols not allowed in MH_DYLIB files
+         case $cc_basename in
+           xlc*)
+           lt_prog_compiler_pic_CXX='-qnocommon'
+           lt_prog_compiler_wl_CXX='-Wl,'
+           ;;
+         esac
+       ;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | kfreebsd*-gnu | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      lt_prog_compiler_pic_CXX='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      lt_prog_compiler_pic_CXX='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    ;;
+	  icpc* | ecpc*)
+	    # Intel C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  pgCC*)
+	    # Portland Group C++ compiler.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fpic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    lt_prog_compiler_pic_CXX='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    lt_prog_compiler_wl_CXX='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    lt_prog_compiler_pic_CXX='-pic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	lt_prog_compiler_can_build_shared_CXX=no
+	;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_pic_works_CXX=no
+  ac_outfile=conftest.$ac_objext
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:13739: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:13743: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6
+
+if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_static_works_CXX=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   printf "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $rm conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6
+
+if test x"$lt_prog_compiler_static_works_CXX" = xyes; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:13843: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:13847: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix4* | aix5*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX="$ltdll_cmds"
+  ;;
+  cygwin* | mingw*)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+
+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+      $rm conftest*
+      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl_CXX
+	pic_flag=$lt_prog_compiler_pic_CXX
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+        allow_undefined_flag_CXX=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc_CXX=no
+        else
+	  archive_cmds_need_lc_CXX=yes
+        fi
+        allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+  if test "$GCC" = yes; then
+    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+  else
+    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+  fi
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+kfreebsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  freebsd*) # from 4.6 on
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix3*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+knetbsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" || \
+   test -n "$runpath_var_CXX" || \
+   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct_CXX" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+     test "$hardcode_minus_L_CXX" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5
+echo "${ECHO_T}$hardcode_action_CXX" >&6
+
+if test "$hardcode_action_CXX" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler_CXX \
+    CC_CXX \
+    LD_CXX \
+    lt_prog_compiler_wl_CXX \
+    lt_prog_compiler_pic_CXX \
+    lt_prog_compiler_static_CXX \
+    lt_prog_compiler_no_builtin_flag_CXX \
+    export_dynamic_flag_spec_CXX \
+    thread_safe_flag_spec_CXX \
+    whole_archive_flag_spec_CXX \
+    enable_shared_with_static_runtimes_CXX \
+    old_archive_cmds_CXX \
+    old_archive_from_new_cmds_CXX \
+    predep_objects_CXX \
+    postdep_objects_CXX \
+    predeps_CXX \
+    postdeps_CXX \
+    compiler_lib_search_path_CXX \
+    archive_cmds_CXX \
+    archive_expsym_cmds_CXX \
+    postinstall_cmds_CXX \
+    postuninstall_cmds_CXX \
+    old_archive_from_expsyms_cmds_CXX \
+    allow_undefined_flag_CXX \
+    no_undefined_flag_CXX \
+    export_symbols_cmds_CXX \
+    hardcode_libdir_flag_spec_CXX \
+    hardcode_libdir_flag_spec_ld_CXX \
+    hardcode_libdir_separator_CXX \
+    hardcode_automatic_CXX \
+    module_cmds_CXX \
+    module_expsym_cmds_CXX \
+    lt_cv_prog_compiler_c_o_CXX \
+    exclude_expsyms_CXX \
+    include_expsyms_CXX; do
+
+    case $var in
+    old_archive_cmds_CXX | \
+    old_archive_from_new_cmds_CXX | \
+    archive_cmds_CXX | \
+    archive_expsym_cmds_CXX | \
+    module_cmds_CXX | \
+    module_expsym_cmds_CXX | \
+    old_archive_from_expsyms_cmds_CXX | \
+    export_symbols_cmds_CXX | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="$ofile"
+
+  cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_CXX
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_CXX
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_CXX
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_CXX"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+
+	else
+	  tagname=""
+	fi
+	;;
+
+      F77)
+	if test -n "$F77" && test "X$F77" != "Xno"; then
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+
+archive_cmds_need_lc_F77=no
+allow_undefined_flag_F77=
+always_export_symbols_F77=no
+archive_expsym_cmds_F77=
+export_dynamic_flag_spec_F77=
+hardcode_direct_F77=no
+hardcode_libdir_flag_spec_F77=
+hardcode_libdir_flag_spec_ld_F77=
+hardcode_libdir_separator_F77=
+hardcode_minus_L_F77=no
+hardcode_automatic_F77=no
+module_cmds_F77=
+module_expsym_cmds_F77=
+link_all_deplibs_F77=unknown
+old_archive_cmds_F77=$old_archive_cmds
+no_undefined_flag_F77=
+whole_archive_flag_spec_F77=
+enable_shared_with_static_runtimes_F77=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+objext_F77=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="      subroutine t\n      return\n      end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="      program t\n      end\n"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+compiler_F77=$CC
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+aix4* | aix5*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+  ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+GCC_F77="$G77"
+LD_F77="$LD"
+
+lt_prog_compiler_wl_F77=
+lt_prog_compiler_pic_F77=
+lt_prog_compiler_static_F77=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl_F77='-Wl,'
+    lt_prog_compiler_static_F77='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_F77='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4'
+      ;;
+
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_F77='-fno-common'
+      ;;
+
+    interix3*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared_F77=no
+      enable_shared=no
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_F77=-Kconform_pic
+      fi
+      ;;
+
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_F77='-fPIC'
+	;;
+      esac
+      ;;
+
+    *)
+      lt_prog_compiler_pic_F77='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_F77='-Bstatic'
+      else
+	lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+      darwin*)
+        # PIC is the default on this platform
+        # Common symbols not allowed in MH_DYLIB files
+       case $cc_basename in
+         xlc*)
+         lt_prog_compiler_pic_F77='-qnocommon'
+         lt_prog_compiler_wl_F77='-Wl,'
+         ;;
+       esac
+       ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_F77='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static_F77='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    linux*)
+      case $cc_basename in
+      icc* | ecc*)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-KPIC'
+	lt_prog_compiler_static_F77='-static'
+        ;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-fpic'
+	lt_prog_compiler_static_F77='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl_F77='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static_F77='-non_shared'
+        ;;
+      esac
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl_F77='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl_F77='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl_F77='-Qoption ld '
+      lt_prog_compiler_pic_F77='-PIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic_F77='-Kconform_pic'
+	lt_prog_compiler_static_F77='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_can_build_shared_F77=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic_F77='-pic'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared_F77=no
+      ;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_F77"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_pic_works_F77=no
+  ac_outfile=conftest.$ac_objext
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_F77"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:15413: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:15417: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_prog_compiler_pic_works_F77=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6
+
+if test x"$lt_prog_compiler_pic_works_F77" = xyes; then
+    case $lt_prog_compiler_pic_F77 in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
+     esac
+else
+    lt_prog_compiler_pic_F77=
+     lt_prog_compiler_can_build_shared_F77=no
+fi
+
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_F77=
+    ;;
+  *)
+    lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_static_works_F77=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   printf "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_prog_compiler_static_works_F77=yes
+       fi
+     else
+       lt_prog_compiler_static_works_F77=yes
+     fi
+   fi
+   $rm conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6
+
+if test x"$lt_prog_compiler_static_works_F77" = xyes; then
+    :
+else
+    lt_prog_compiler_static_F77=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_F77=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:15517: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:15521: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_F77=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+  runpath_var=
+  allow_undefined_flag_F77=
+  enable_shared_with_static_runtimes_F77=no
+  archive_cmds_F77=
+  archive_expsym_cmds_F77=
+  old_archive_From_new_cmds_F77=
+  old_archive_from_expsyms_cmds_F77=
+  export_dynamic_flag_spec_F77=
+  whole_archive_flag_spec_F77=
+  thread_safe_flag_spec_F77=
+  hardcode_libdir_flag_spec_F77=
+  hardcode_libdir_flag_spec_ld_F77=
+  hardcode_libdir_separator_F77=
+  hardcode_direct_F77=no
+  hardcode_minus_L_F77=no
+  hardcode_shlibpath_var_F77=unsupported
+  link_all_deplibs_F77=unknown
+  hardcode_automatic_F77=no
+  module_cmds_F77=
+  module_expsym_cmds_F77=
+  always_export_symbols_F77=no
+  export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms_F77=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_"
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  extract_expsyms_cmds=
+  # Just being paranoid about ensuring that cc_basename is set.
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+  case $host_os in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs_F77=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec_F77='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+	whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+  	whole_archive_flag_spec_F77=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>/dev/null` in
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs_F77=no
+	cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_minus_L_F77=yes
+
+      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can't use
+      # them.
+      ld_shlibs_F77=no
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag_F77=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      allow_undefined_flag_F77=unsupported
+      always_export_symbols_F77=no
+      enable_shared_with_static_runtimes_F77=yes
+      export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    interix3*)
+      hardcode_direct_F77=no
+      hardcode_shlibpath_var_F77=no
+      hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec_F77='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    linux*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	tmp_addflag=
+	case $cc_basename,$host_cpu in
+	pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	esac
+	archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+	if test $supports_anon_versioning = yes; then
+	  archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~
+  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+  $echo "local: *; };" >> $output_objdir/$libname.ver~
+	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	fi
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+	ld_shlibs_F77=no
+	cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs_F77=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+	    archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+	    archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+	  else
+	    ld_shlibs_F77=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs_F77" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec_F77=
+      export_dynamic_flag_spec_F77=
+      whole_archive_flag_spec_F77=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag_F77=unsupported
+      always_export_symbols_F77=yes
+      archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L_F77=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct_F77=unsupported
+      fi
+      ;;
+
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+	  export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+	  for ld_flag in $LDFLAGS; do
+  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+  	    aix_use_runtimelinking=yes
+  	    break
+  	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds_F77=''
+      hardcode_direct_F77=yes
+      hardcode_libdir_separator_F77=':'
+      link_all_deplibs_F77=yes
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" && \
+  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  then
+  	  # We have reworked collect2
+  	  hardcode_direct_F77=yes
+	  else
+  	  # We have old collect2
+  	  hardcode_direct_F77=unsupported
+  	  # It fails to find uninstalled libraries when the uninstalled
+  	  # path is not listed in the libpath.  Setting hardcode_minus_L
+  	  # to unsupported forces relinking
+  	  hardcode_minus_L_F77=yes
+  	  hardcode_libdir_flag_spec_F77='-L$libdir'
+  	  hardcode_libdir_separator_F77=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+  	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols_F77=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag_F77='-berok'
+       # Determine the default libpath from the value encoded in an empty executable.
+       cat >conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_f77_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+       hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+	archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+       else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag_F77="-z nodefs"
+	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an empty executable.
+	 cat >conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_f77_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	 hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag_F77=' ${wl}-bernotok'
+	  allow_undefined_flag_F77=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec_F77='$convenience'
+	  archive_cmds_need_lc_F77=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_minus_L_F77=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs_F77=no
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec_F77=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec_F77=' '
+      allow_undefined_flag_F77=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_From_new_cmds_F77='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path_F77='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes_F77=yes
+      ;;
+
+    darwin* | rhapsody*)
+      case $host_os in
+        rhapsody* | darwin1.[012])
+         allow_undefined_flag_F77='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[012])
+               allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+      esac
+      archive_cmds_need_lc_F77=no
+      hardcode_direct_F77=no
+      hardcode_automatic_F77=yes
+      hardcode_shlibpath_var_F77=unsupported
+      whole_archive_flag_spec_F77=''
+      link_all_deplibs_F77=yes
+    if test "$GCC" = yes ; then
+    	output_verbose_link_cmd='echo'
+        archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+      archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+         archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+         module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+         archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         ld_shlibs_F77=no
+          ;;
+      esac
+    fi
+      ;;
+
+    dgux*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    freebsd1*)
+      ld_shlibs_F77=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_F77=yes
+      hardcode_minus_L_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | kfreebsd*-gnu | dragonfly*)
+      archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      hardcode_direct_F77=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L_F77=yes
+      export_dynamic_flag_spec_F77='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_F77=:
+
+	hardcode_direct_F77=yes
+	export_dynamic_flag_spec_F77='${wl}-E'
+
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L_F77=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_F77=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_libdir_flag_spec_ld_F77='+b $libdir'
+	  hardcode_direct_F77=no
+	  hardcode_shlibpath_var_F77=no
+	  ;;
+	*)
+	  hardcode_direct_F77=yes
+	  export_dynamic_flag_spec_F77='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L_F77=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_ld_F77='-rpath $libdir'
+      fi
+      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      link_all_deplibs_F77=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    newsos6)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_F77=yes
+      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    openbsd*)
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_F77='${wl}-E'
+      else
+       case $host_os in
+	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	   archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	   hardcode_libdir_flag_spec_F77='-R$libdir'
+	   ;;
+	 *)
+	   archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	   hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+	   ;;
+       esac
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_minus_L_F77=yes
+      allow_undefined_flag_F77=unsupported
+      archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag_F77=' -expect_unresolved \*'
+	archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag_F77=' -expect_unresolved \*'
+	archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec_F77='-rpath $libdir'
+      fi
+      hardcode_libdir_separator_F77=:
+      ;;
+
+    solaris*)
+      no_undefined_flag_F77=' -z text'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+      else
+	wlarc=''
+	archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      fi
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_shlibpath_var_F77=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+ 	# The compiler driver will combine linker options so we
+ 	# cannot just pass the convience library names through
+ 	# without $wl, iff we do not link with $LD.
+ 	# Luckily, gcc supports the same syntax we need for Sun Studio.
+ 	# Supported since Solaris 2.6 (maybe 2.5.1?)
+ 	case $wlarc in
+ 	'')
+ 	  whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;;
+ 	*)
+ 	  whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ 	esac ;;
+      esac
+      link_all_deplibs_F77=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_direct_F77=yes
+      hardcode_minus_L_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_F77=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds_F77='$CC -r -o $output$reload_objs'
+	  hardcode_direct_F77=no
+        ;;
+	motorola)
+	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var_F77=no
+      export_dynamic_flag_spec_F77='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var_F77=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs_F77=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+      no_undefined_flag_F77='${wl}-z,text'
+      archive_cmds_need_lc_F77=no
+      hardcode_shlibpath_var_F77=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag_F77='${wl}-z,text'
+      allow_undefined_flag_F77='${wl}-z,nodefs'
+      archive_cmds_need_lc_F77=no
+      hardcode_shlibpath_var_F77=no
+      hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator_F77=':'
+      link_all_deplibs_F77=yes
+      export_dynamic_flag_spec_F77='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    *)
+      ld_shlibs_F77=no
+      ;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5
+echo "${ECHO_T}$ld_shlibs_F77" >&6
+test "$ld_shlibs_F77" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_F77" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_F77=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_F77 in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+      $rm conftest*
+      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl_F77
+	pic_flag=$lt_prog_compiler_pic_F77
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag_F77
+        allow_undefined_flag_F77=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc_F77=no
+        else
+	  archive_cmds_need_lc_F77=yes
+        fi
+        allow_undefined_flag_F77=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+  if test "$GCC" = yes; then
+    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+  else
+    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+  fi
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+kfreebsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  freebsd*) # from 4.6 on
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix3*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+knetbsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_F77=
+if test -n "$hardcode_libdir_flag_spec_F77" || \
+   test -n "$runpath_var_F77" || \
+   test "X$hardcode_automatic_F77" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct_F77" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no &&
+     test "$hardcode_minus_L_F77" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_F77=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_F77=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_F77=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5
+echo "${ECHO_T}$hardcode_action_F77" >&6
+
+if test "$hardcode_action_F77" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler_F77 \
+    CC_F77 \
+    LD_F77 \
+    lt_prog_compiler_wl_F77 \
+    lt_prog_compiler_pic_F77 \
+    lt_prog_compiler_static_F77 \
+    lt_prog_compiler_no_builtin_flag_F77 \
+    export_dynamic_flag_spec_F77 \
+    thread_safe_flag_spec_F77 \
+    whole_archive_flag_spec_F77 \
+    enable_shared_with_static_runtimes_F77 \
+    old_archive_cmds_F77 \
+    old_archive_from_new_cmds_F77 \
+    predep_objects_F77 \
+    postdep_objects_F77 \
+    predeps_F77 \
+    postdeps_F77 \
+    compiler_lib_search_path_F77 \
+    archive_cmds_F77 \
+    archive_expsym_cmds_F77 \
+    postinstall_cmds_F77 \
+    postuninstall_cmds_F77 \
+    old_archive_from_expsyms_cmds_F77 \
+    allow_undefined_flag_F77 \
+    no_undefined_flag_F77 \
+    export_symbols_cmds_F77 \
+    hardcode_libdir_flag_spec_F77 \
+    hardcode_libdir_flag_spec_ld_F77 \
+    hardcode_libdir_separator_F77 \
+    hardcode_automatic_F77 \
+    module_cmds_F77 \
+    module_expsym_cmds_F77 \
+    lt_cv_prog_compiler_c_o_F77 \
+    exclude_expsyms_F77 \
+    include_expsyms_F77; do
+
+    case $var in
+    old_archive_cmds_F77 | \
+    old_archive_from_new_cmds_F77 | \
+    archive_cmds_F77 | \
+    archive_expsym_cmds_F77 | \
+    module_cmds_F77 | \
+    module_expsym_cmds_F77 | \
+    old_archive_from_expsyms_cmds_F77 | \
+    export_symbols_cmds_F77 | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="$ofile"
+
+  cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_F77
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_F77
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_F77
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_F77
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_F77
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_F77
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_F77
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_F77
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_F77
+archive_expsym_cmds=$lt_archive_expsym_cmds_F77
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_F77
+module_expsym_cmds=$lt_module_expsym_cmds_F77
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_F77
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_F77
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_F77
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_F77
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_F77
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_F77
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_F77
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_F77
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_F77
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_F77
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_F77"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_F77
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_F77
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_F77
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_F77
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+	else
+	  tagname=""
+	fi
+	;;
+
+      GCJ)
+	if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+
+
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+objext_GCJ=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+compiler_GCJ=$CC
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+archive_cmds_need_lc_GCJ=no
+
+old_archive_cmds_GCJ=$old_archive_cmds
+
+
+lt_prog_compiler_no_builtin_flag_GCJ=
+
+if test "$GCC" = yes; then
+  lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+  ac_outfile=conftest.$ac_objext
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:17720: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:17724: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+lt_prog_compiler_wl_GCJ=
+lt_prog_compiler_pic_GCJ=
+lt_prog_compiler_static_GCJ=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl_GCJ='-Wl,'
+    lt_prog_compiler_static_GCJ='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_GCJ='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4'
+      ;;
+
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_GCJ='-fno-common'
+      ;;
+
+    interix3*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared_GCJ=no
+      enable_shared=no
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_GCJ=-Kconform_pic
+      fi
+      ;;
+
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_GCJ='-fPIC'
+	;;
+      esac
+      ;;
+
+    *)
+      lt_prog_compiler_pic_GCJ='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_GCJ='-Bstatic'
+      else
+	lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+      darwin*)
+        # PIC is the default on this platform
+        # Common symbols not allowed in MH_DYLIB files
+       case $cc_basename in
+         xlc*)
+         lt_prog_compiler_pic_GCJ='-qnocommon'
+         lt_prog_compiler_wl_GCJ='-Wl,'
+         ;;
+       esac
+       ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_GCJ='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static_GCJ='-non_shared'
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic_GCJ='-KPIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    linux*)
+      case $cc_basename in
+      icc* | ecc*)
+	lt_prog_compiler_wl_GCJ='-Wl,'
+	lt_prog_compiler_pic_GCJ='-KPIC'
+	lt_prog_compiler_static_GCJ='-static'
+        ;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl_GCJ='-Wl,'
+	lt_prog_compiler_pic_GCJ='-fpic'
+	lt_prog_compiler_static_GCJ='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl_GCJ='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static_GCJ='-non_shared'
+        ;;
+      esac
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static_GCJ='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic_GCJ='-KPIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl_GCJ='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl_GCJ='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl_GCJ='-Qoption ld '
+      lt_prog_compiler_pic_GCJ='-PIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      lt_prog_compiler_pic_GCJ='-KPIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic_GCJ='-Kconform_pic'
+	lt_prog_compiler_static_GCJ='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      lt_prog_compiler_pic_GCJ='-KPIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      lt_prog_compiler_can_build_shared_GCJ=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic_GCJ='-pic'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared_GCJ=no
+      ;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_GCJ"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_pic_works_GCJ=no
+  ac_outfile=conftest.$ac_objext
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_GCJ"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:17988: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:17992: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_prog_compiler_pic_works_GCJ=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6
+
+if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then
+    case $lt_prog_compiler_pic_GCJ in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;;
+     esac
+else
+    lt_prog_compiler_pic_GCJ=
+     lt_prog_compiler_can_build_shared_GCJ=no
+fi
+
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_GCJ=
+    ;;
+  *)
+    lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_static_works_GCJ=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   printf "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_prog_compiler_static_works_GCJ=yes
+       fi
+     else
+       lt_prog_compiler_static_works_GCJ=yes
+     fi
+   fi
+   $rm conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6
+
+if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then
+    :
+else
+    lt_prog_compiler_static_GCJ=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_GCJ=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:18092: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:18096: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_GCJ=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+  runpath_var=
+  allow_undefined_flag_GCJ=
+  enable_shared_with_static_runtimes_GCJ=no
+  archive_cmds_GCJ=
+  archive_expsym_cmds_GCJ=
+  old_archive_From_new_cmds_GCJ=
+  old_archive_from_expsyms_cmds_GCJ=
+  export_dynamic_flag_spec_GCJ=
+  whole_archive_flag_spec_GCJ=
+  thread_safe_flag_spec_GCJ=
+  hardcode_libdir_flag_spec_GCJ=
+  hardcode_libdir_flag_spec_ld_GCJ=
+  hardcode_libdir_separator_GCJ=
+  hardcode_direct_GCJ=no
+  hardcode_minus_L_GCJ=no
+  hardcode_shlibpath_var_GCJ=unsupported
+  link_all_deplibs_GCJ=unknown
+  hardcode_automatic_GCJ=no
+  module_cmds_GCJ=
+  module_expsym_cmds_GCJ=
+  always_export_symbols_GCJ=no
+  export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms_GCJ=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_"
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  extract_expsyms_cmds=
+  # Just being paranoid about ensuring that cc_basename is set.
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+  case $host_os in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs_GCJ=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec_GCJ='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+	whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+  	whole_archive_flag_spec_GCJ=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>/dev/null` in
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs_GCJ=no
+	cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_minus_L_GCJ=yes
+
+      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can't use
+      # them.
+      ld_shlibs_GCJ=no
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag_GCJ=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      allow_undefined_flag_GCJ=unsupported
+      always_export_symbols_GCJ=no
+      enable_shared_with_static_runtimes_GCJ=yes
+      export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    interix3*)
+      hardcode_direct_GCJ=no
+      hardcode_shlibpath_var_GCJ=no
+      hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec_GCJ='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    linux*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	tmp_addflag=
+	case $cc_basename,$host_cpu in
+	pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	esac
+	archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+	if test $supports_anon_versioning = yes; then
+	  archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~
+  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+  $echo "local: *; };" >> $output_objdir/$libname.ver~
+	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	fi
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+	ld_shlibs_GCJ=no
+	cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs_GCJ=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+	    archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+	    archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+	  else
+	    ld_shlibs_GCJ=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs_GCJ" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec_GCJ=
+      export_dynamic_flag_spec_GCJ=
+      whole_archive_flag_spec_GCJ=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag_GCJ=unsupported
+      always_export_symbols_GCJ=yes
+      archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L_GCJ=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct_GCJ=unsupported
+      fi
+      ;;
+
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+	  export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+	  for ld_flag in $LDFLAGS; do
+  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+  	    aix_use_runtimelinking=yes
+  	    break
+  	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds_GCJ=''
+      hardcode_direct_GCJ=yes
+      hardcode_libdir_separator_GCJ=':'
+      link_all_deplibs_GCJ=yes
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" && \
+  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  then
+  	  # We have reworked collect2
+  	  hardcode_direct_GCJ=yes
+	  else
+  	  # We have old collect2
+  	  hardcode_direct_GCJ=unsupported
+  	  # It fails to find uninstalled libraries when the uninstalled
+  	  # path is not listed in the libpath.  Setting hardcode_minus_L
+  	  # to unsupported forces relinking
+  	  hardcode_minus_L_GCJ=yes
+  	  hardcode_libdir_flag_spec_GCJ='-L$libdir'
+  	  hardcode_libdir_separator_GCJ=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+  	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols_GCJ=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag_GCJ='-berok'
+       # Determine the default libpath from the value encoded in an empty executable.
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+       hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+	archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+       else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag_GCJ="-z nodefs"
+	  archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an empty executable.
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	 hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag_GCJ=' ${wl}-bernotok'
+	  allow_undefined_flag_GCJ=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec_GCJ='$convenience'
+	  archive_cmds_need_lc_GCJ=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_minus_L_GCJ=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs_GCJ=no
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec_GCJ=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec_GCJ=' '
+      allow_undefined_flag_GCJ=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_From_new_cmds_GCJ='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes_GCJ=yes
+      ;;
+
+    darwin* | rhapsody*)
+      case $host_os in
+        rhapsody* | darwin1.[012])
+         allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[012])
+               allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+      esac
+      archive_cmds_need_lc_GCJ=no
+      hardcode_direct_GCJ=no
+      hardcode_automatic_GCJ=yes
+      hardcode_shlibpath_var_GCJ=unsupported
+      whole_archive_flag_spec_GCJ=''
+      link_all_deplibs_GCJ=yes
+    if test "$GCC" = yes ; then
+    	output_verbose_link_cmd='echo'
+        archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+      archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+         archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+         module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+         archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         ld_shlibs_GCJ=no
+          ;;
+      esac
+    fi
+      ;;
+
+    dgux*)
+      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    freebsd1*)
+      ld_shlibs_GCJ=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec_GCJ='-R$libdir'
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_GCJ=yes
+      hardcode_minus_L_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | kfreebsd*-gnu | dragonfly*)
+      archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec_GCJ='-R$libdir'
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator_GCJ=:
+      hardcode_direct_GCJ=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L_GCJ=yes
+      export_dynamic_flag_spec_GCJ='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_GCJ=:
+
+	hardcode_direct_GCJ=yes
+	export_dynamic_flag_spec_GCJ='${wl}-E'
+
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L_GCJ=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_GCJ=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_libdir_flag_spec_ld_GCJ='+b $libdir'
+	  hardcode_direct_GCJ=no
+	  hardcode_shlibpath_var_GCJ=no
+	  ;;
+	*)
+	  hardcode_direct_GCJ=yes
+	  export_dynamic_flag_spec_GCJ='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L_GCJ=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir'
+      fi
+      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_GCJ=:
+      link_all_deplibs_GCJ=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec_GCJ='-R$libdir'
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    newsos6)
+      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_GCJ=yes
+      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_GCJ=:
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    openbsd*)
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_GCJ='${wl}-E'
+      else
+       case $host_os in
+	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	   archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	   hardcode_libdir_flag_spec_GCJ='-R$libdir'
+	   ;;
+	 *)
+	   archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	   hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+	   ;;
+       esac
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_minus_L_GCJ=yes
+      allow_undefined_flag_GCJ=unsupported
+      archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag_GCJ=' -expect_unresolved \*'
+	archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_GCJ=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag_GCJ=' -expect_unresolved \*'
+	archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec_GCJ='-rpath $libdir'
+      fi
+      hardcode_libdir_separator_GCJ=:
+      ;;
+
+    solaris*)
+      no_undefined_flag_GCJ=' -z text'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+      else
+	wlarc=''
+	archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      fi
+      hardcode_libdir_flag_spec_GCJ='-R$libdir'
+      hardcode_shlibpath_var_GCJ=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+ 	# The compiler driver will combine linker options so we
+ 	# cannot just pass the convience library names through
+ 	# without $wl, iff we do not link with $LD.
+ 	# Luckily, gcc supports the same syntax we need for Sun Studio.
+ 	# Supported since Solaris 2.6 (maybe 2.5.1?)
+ 	case $wlarc in
+ 	'')
+ 	  whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;;
+ 	*)
+ 	  whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ 	esac ;;
+      esac
+      link_all_deplibs_GCJ=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_direct_GCJ=yes
+      hardcode_minus_L_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_GCJ=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds_GCJ='$CC -r -o $output$reload_objs'
+	  hardcode_direct_GCJ=no
+        ;;
+	motorola)
+	  archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var_GCJ=no
+      export_dynamic_flag_spec_GCJ='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var_GCJ=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs_GCJ=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+      no_undefined_flag_GCJ='${wl}-z,text'
+      archive_cmds_need_lc_GCJ=no
+      hardcode_shlibpath_var_GCJ=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag_GCJ='${wl}-z,text'
+      allow_undefined_flag_GCJ='${wl}-z,nodefs'
+      archive_cmds_need_lc_GCJ=no
+      hardcode_shlibpath_var_GCJ=no
+      hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator_GCJ=':'
+      link_all_deplibs_GCJ=yes
+      export_dynamic_flag_spec_GCJ='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    *)
+      ld_shlibs_GCJ=no
+      ;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5
+echo "${ECHO_T}$ld_shlibs_GCJ" >&6
+test "$ld_shlibs_GCJ" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_GCJ" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_GCJ=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_GCJ in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+      $rm conftest*
+      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl_GCJ
+	pic_flag=$lt_prog_compiler_pic_GCJ
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ
+        allow_undefined_flag_GCJ=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc_GCJ=no
+        else
+	  archive_cmds_need_lc_GCJ=yes
+        fi
+        allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+  if test "$GCC" = yes; then
+    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+  else
+    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+  fi
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+kfreebsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  freebsd*) # from 4.6 on
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix3*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+knetbsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_GCJ=
+if test -n "$hardcode_libdir_flag_spec_GCJ" || \
+   test -n "$runpath_var_GCJ" || \
+   test "X$hardcode_automatic_GCJ" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct_GCJ" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no &&
+     test "$hardcode_minus_L_GCJ" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_GCJ=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_GCJ=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_GCJ=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5
+echo "${ECHO_T}$hardcode_action_GCJ" >&6
+
+if test "$hardcode_action_GCJ" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler_GCJ \
+    CC_GCJ \
+    LD_GCJ \
+    lt_prog_compiler_wl_GCJ \
+    lt_prog_compiler_pic_GCJ \
+    lt_prog_compiler_static_GCJ \
+    lt_prog_compiler_no_builtin_flag_GCJ \
+    export_dynamic_flag_spec_GCJ \
+    thread_safe_flag_spec_GCJ \
+    whole_archive_flag_spec_GCJ \
+    enable_shared_with_static_runtimes_GCJ \
+    old_archive_cmds_GCJ \
+    old_archive_from_new_cmds_GCJ \
+    predep_objects_GCJ \
+    postdep_objects_GCJ \
+    predeps_GCJ \
+    postdeps_GCJ \
+    compiler_lib_search_path_GCJ \
+    archive_cmds_GCJ \
+    archive_expsym_cmds_GCJ \
+    postinstall_cmds_GCJ \
+    postuninstall_cmds_GCJ \
+    old_archive_from_expsyms_cmds_GCJ \
+    allow_undefined_flag_GCJ \
+    no_undefined_flag_GCJ \
+    export_symbols_cmds_GCJ \
+    hardcode_libdir_flag_spec_GCJ \
+    hardcode_libdir_flag_spec_ld_GCJ \
+    hardcode_libdir_separator_GCJ \
+    hardcode_automatic_GCJ \
+    module_cmds_GCJ \
+    module_expsym_cmds_GCJ \
+    lt_cv_prog_compiler_c_o_GCJ \
+    exclude_expsyms_GCJ \
+    include_expsyms_GCJ; do
+
+    case $var in
+    old_archive_cmds_GCJ | \
+    old_archive_from_new_cmds_GCJ | \
+    archive_cmds_GCJ | \
+    archive_expsym_cmds_GCJ | \
+    module_cmds_GCJ | \
+    module_expsym_cmds_GCJ | \
+    old_archive_from_expsyms_cmds_GCJ | \
+    export_symbols_cmds_GCJ | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="$ofile"
+
+  cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_GCJ
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_GCJ
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_GCJ
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_GCJ
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_GCJ
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_GCJ
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_GCJ
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_GCJ
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_GCJ
+archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_GCJ
+module_expsym_cmds=$lt_module_expsym_cmds_GCJ
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_GCJ
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_GCJ
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_GCJ
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_GCJ
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_GCJ
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_GCJ
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_GCJ
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_GCJ
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_GCJ
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_GCJ"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_GCJ
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_GCJ
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_GCJ
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_GCJ
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+	else
+	  tagname=""
+	fi
+	;;
+
+      RC)
+
+
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+objext_RC=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+compiler_RC=$CC
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+lt_cv_prog_compiler_c_o_RC=yes
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler_RC \
+    CC_RC \
+    LD_RC \
+    lt_prog_compiler_wl_RC \
+    lt_prog_compiler_pic_RC \
+    lt_prog_compiler_static_RC \
+    lt_prog_compiler_no_builtin_flag_RC \
+    export_dynamic_flag_spec_RC \
+    thread_safe_flag_spec_RC \
+    whole_archive_flag_spec_RC \
+    enable_shared_with_static_runtimes_RC \
+    old_archive_cmds_RC \
+    old_archive_from_new_cmds_RC \
+    predep_objects_RC \
+    postdep_objects_RC \
+    predeps_RC \
+    postdeps_RC \
+    compiler_lib_search_path_RC \
+    archive_cmds_RC \
+    archive_expsym_cmds_RC \
+    postinstall_cmds_RC \
+    postuninstall_cmds_RC \
+    old_archive_from_expsyms_cmds_RC \
+    allow_undefined_flag_RC \
+    no_undefined_flag_RC \
+    export_symbols_cmds_RC \
+    hardcode_libdir_flag_spec_RC \
+    hardcode_libdir_flag_spec_ld_RC \
+    hardcode_libdir_separator_RC \
+    hardcode_automatic_RC \
+    module_cmds_RC \
+    module_expsym_cmds_RC \
+    lt_cv_prog_compiler_c_o_RC \
+    exclude_expsyms_RC \
+    include_expsyms_RC; do
+
+    case $var in
+    old_archive_cmds_RC | \
+    old_archive_from_new_cmds_RC | \
+    archive_cmds_RC | \
+    archive_expsym_cmds_RC | \
+    module_cmds_RC | \
+    module_expsym_cmds_RC | \
+    old_archive_from_expsyms_cmds_RC | \
+    export_symbols_cmds_RC | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="$ofile"
+
+  cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_RC
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_RC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_RC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_RC
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_RC
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_RC
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_RC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_RC
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_RC
+archive_expsym_cmds=$lt_archive_expsym_cmds_RC
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_RC
+module_expsym_cmds=$lt_module_expsym_cmds_RC
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_RC
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_RC
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_RC
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_RC
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_RC
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_RC
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_RC
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_RC
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_RC
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_RC
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_RC
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_RC"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_RC
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_RC
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_RC
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_RC
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+	;;
+
+      *)
+	{ { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5
+echo "$as_me: error: Unsupported tag name: $tagname" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+      esac
+
+      # Append the new tag name to the list of available tags.
+      if test -n "$tagname" ; then
+      available_tags="$available_tags $tagname"
+    fi
+    fi
+  done
+  IFS="$lt_save_ifs"
+
+  # Now substitute the updated list of available tags.
+  if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+    mv "${ofile}T" "$ofile"
+    chmod +x "$ofile"
+  else
+    rm -f "${ofile}T"
+    { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5
+echo "$as_me: error: unable to update list of available tagged configurations." >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+fi
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Prevent multiple expansion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If we are using GCC we want to compile with warnings enabled.
+if test x"$GCC" = xyes
+then
+  CFLAGS="$CFLAGS -W -Wall"
+fi
+if test x"$GXX" = xyes
+then
+  CXXFLAGS="$CXXFLAGS -W -Wall"
+fi
+
+# System-dependent adjustments.
+no_undefined=no
+
+case "${host_os}" in
+cygwin)
+  no_undefined=yes
+  ;;
+*)
+  ;;
+esac
+
+
+if test x$no_undefined = xyes; then
+  NO_UNDEFINED_TRUE=
+  NO_UNDEFINED_FALSE='#'
+else
+  NO_UNDEFINED_TRUE='#'
+  NO_UNDEFINED_FALSE=
+fi
+
+
+
+
+                              ac_config_files="$ac_config_files Makefile src/Makefile utils/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[	 ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[	 ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_PERL_TRUE}" && test -z "${HAVE_PERL_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_WATCHDOG_LIBRARY_TRUE}" && test -z "${BUILD_WATCHDOG_LIBRARY_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by the Parma Watchdog Library $as_me 0.4, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+		   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf at gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+the Parma Watchdog Library config.status 0.4
+configured by $0, generated by GNU Autoconf 2.59,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+  "utils/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
+  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s, at SHELL@,$SHELL,;t t
+s, at PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s, at PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s, at PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s, at PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s, at PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s, at PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s, at exec_prefix@,$exec_prefix,;t t
+s, at prefix@,$prefix,;t t
+s, at program_transform_name@,$program_transform_name,;t t
+s, at bindir@,$bindir,;t t
+s, at sbindir@,$sbindir,;t t
+s, at libexecdir@,$libexecdir,;t t
+s, at datadir@,$datadir,;t t
+s, at sysconfdir@,$sysconfdir,;t t
+s, at sharedstatedir@,$sharedstatedir,;t t
+s, at localstatedir@,$localstatedir,;t t
+s, at libdir@,$libdir,;t t
+s, at includedir@,$includedir,;t t
+s, at oldincludedir@,$oldincludedir,;t t
+s, at infodir@,$infodir,;t t
+s, at mandir@,$mandir,;t t
+s, at build_alias@,$build_alias,;t t
+s, at host_alias@,$host_alias,;t t
+s, at target_alias@,$target_alias,;t t
+s, at DEFS@,$DEFS,;t t
+s, at ECHO_C@,$ECHO_C,;t t
+s, at ECHO_N@,$ECHO_N,;t t
+s, at ECHO_T@,$ECHO_T,;t t
+s, at LIBS@,$LIBS,;t t
+s, at INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s, at INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s, at INSTALL_DATA@,$INSTALL_DATA,;t t
+s, at CYGPATH_W@,$CYGPATH_W,;t t
+s, at PACKAGE@,$PACKAGE,;t t
+s, at VERSION@,$VERSION,;t t
+s, at ACLOCAL@,$ACLOCAL,;t t
+s, at AUTOCONF@,$AUTOCONF,;t t
+s, at AUTOMAKE@,$AUTOMAKE,;t t
+s, at AUTOHEADER@,$AUTOHEADER,;t t
+s, at MAKEINFO@,$MAKEINFO,;t t
+s, at install_sh@,$install_sh,;t t
+s, at STRIP@,$STRIP,;t t
+s, at ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s, at INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s, at mkdir_p@,$mkdir_p,;t t
+s, at AWK@,$AWK,;t t
+s, at SET_MAKE@,$SET_MAKE,;t t
+s, at am__leading_dot@,$am__leading_dot,;t t
+s, at AMTAR@,$AMTAR,;t t
+s, at am__tar@,$am__tar,;t t
+s, at am__untar@,$am__untar,;t t
+s, at CC@,$CC,;t t
+s, at CFLAGS@,$CFLAGS,;t t
+s, at LDFLAGS@,$LDFLAGS,;t t
+s, at CPPFLAGS@,$CPPFLAGS,;t t
+s, at ac_ct_CC@,$ac_ct_CC,;t t
+s, at EXEEXT@,$EXEEXT,;t t
+s, at OBJEXT@,$OBJEXT,;t t
+s, at DEPDIR@,$DEPDIR,;t t
+s, at am__include@,$am__include,;t t
+s, at am__quote@,$am__quote,;t t
+s, at AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s, at AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s, at AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s, at CCDEPMODE@,$CCDEPMODE,;t t
+s, at am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s, at am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s, at CXX@,$CXX,;t t
+s, at CXXFLAGS@,$CXXFLAGS,;t t
+s, at ac_ct_CXX@,$ac_ct_CXX,;t t
+s, at CXXDEPMODE@,$CXXDEPMODE,;t t
+s, at am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s, at am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s, at CXXCPP@,$CXXCPP,;t t
+s, at PERL@,$PERL,;t t
+s, at HAVE_PERL_TRUE@,$HAVE_PERL_TRUE,;t t
+s, at HAVE_PERL_FALSE@,$HAVE_PERL_FALSE,;t t
+s, at BUILD_WATCHDOG_LIBRARY_TRUE@,$BUILD_WATCHDOG_LIBRARY_TRUE,;t t
+s, at BUILD_WATCHDOG_LIBRARY_FALSE@,$BUILD_WATCHDOG_LIBRARY_FALSE,;t t
+s, at EGREP@,$EGREP,;t t
+s, at build@,$build,;t t
+s, at build_cpu@,$build_cpu,;t t
+s, at build_vendor@,$build_vendor,;t t
+s, at build_os@,$build_os,;t t
+s, at host@,$host,;t t
+s, at host_cpu@,$host_cpu,;t t
+s, at host_vendor@,$host_vendor,;t t
+s, at host_os@,$host_os,;t t
+s, at LN_S@,$LN_S,;t t
+s, at ECHO@,$ECHO,;t t
+s, at AR@,$AR,;t t
+s, at ac_ct_AR@,$ac_ct_AR,;t t
+s, at RANLIB@,$RANLIB,;t t
+s, at ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s, at DLLTOOL@,$DLLTOOL,;t t
+s, at ac_ct_DLLTOOL@,$ac_ct_DLLTOOL,;t t
+s, at AS@,$AS,;t t
+s, at ac_ct_AS@,$ac_ct_AS,;t t
+s, at OBJDUMP@,$OBJDUMP,;t t
+s, at ac_ct_OBJDUMP@,$ac_ct_OBJDUMP,;t t
+s, at CPP@,$CPP,;t t
+s, at F77@,$F77,;t t
+s, at FFLAGS@,$FFLAGS,;t t
+s, at ac_ct_F77@,$ac_ct_F77,;t t
+s, at LIBTOOL@,$LIBTOOL,;t t
+s, at NO_UNDEFINED_TRUE@,$NO_UNDEFINED_TRUE,;t t
+s, at NO_UNDEFINED_FALSE@,$NO_UNDEFINED_FALSE,;t t
+s, at debug_flag@,$debug_flag,;t t
+s, at LIBOBJS@,$LIBOBJS,;t t
+s, at LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+				     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s, at configure_input@,$configure_input,;t t
+s, at srcdir@,$ac_srcdir,;t t
+s, at abs_srcdir@,$ac_abs_srcdir,;t t
+s, at top_srcdir@,$ac_top_srcdir,;t t
+s, at abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s, at builddir@,$ac_builddir,;t t
+s, at abs_builddir@,$ac_abs_builddir,;t t
+s, at top_builddir@,$ac_top_builddir,;t t
+s, at abs_top_builddir@,$ac_abs_top_builddir,;t t
+s, at INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
+ac_dB='[	 ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 # Do quote $f, to prevent DOS paths from being IFS'd.
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h.  The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status.  Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless.  Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo '  :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+  # Write a limited-size here document to $tmp/defines.sed.
+  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#define' lines.
+  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/defines.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo '  fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+  # Write a limited-size here document to $tmp/undefs.sed.
+  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#undef'
+  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+  rm -f conftest.undefs
+  mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated by configure.  */" >$tmp/config.h
+  else
+    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
+  fi
+  cat $tmp/in >>$tmp/config.h
+  rm -f $tmp/in
+  if test x"$ac_file" != x-; then
+    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+      { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+      rm -f $ac_file
+      mv $tmp/config.h $ac_file
+    fi
+  else
+    cat $tmp/config.h
+    rm -f $tmp/config.h
+  fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $ac_file | $ac_file:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X$ac_file : 'X\(//\)[^/]' \| \
+	 X$ac_file : 'X\(//\)$' \| \
+	 X$ac_file : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_dest" : 'X\(//\)[^/]' \| \
+	 X"$ac_dest" : 'X\(//\)$' \| \
+	 X"$ac_dest" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+  case $ac_dest in
+    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    { if $as_mkdir_p; then
+    mkdir -p $dirpart/$fdir
+  else
+    as_dir=$dirpart/$fdir
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+  esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/Watchdog/configure.ac b/Watchdog/configure.ac
new file mode 100644
index 0000000..12ff75a
--- /dev/null
+++ b/Watchdog/configure.ac
@@ -0,0 +1,299 @@
+# Autoconf source file for the Parma Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+# Process this file with autoconf to produce a configure script.
+
+# Every other copy of the package version number gets its value from here.
+AC_INIT([the Parma Watchdog Library],[0.4],[bagnara at cs.unipr.it],[watchdog])
+
+# Minimum autoconf version required.
+AC_PREREQ(2.59)
+
+# Make sure the sources are there.
+AC_CONFIG_SRCDIR(src/Watchdog.cc)
+
+# Use Automake.
+AM_INIT_AUTOMAKE([foreign dist-bzip2 dist-zip 1.7.3])
+AC_SUBST(VERSION)
+
+# Generate a configuration header file.
+AC_CONFIG_HEADER([config.h])
+
+# C compiler
+
+AC_ARG_WITH(cc,
+[  --with-cc=xxx           use XXX as the C compiler],
+CC=$with_cc)
+
+AC_LANG(C)
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+
+# C++ compiler
+
+AC_ARG_WITH(cxx,
+[  --with-cxx=xxx          use XXX as the C++ compiler],
+CXX=$with_cxx)
+
+AC_LANG(C++)
+
+# Checks for programs.
+AC_PROG_CC
+AC_PROG_CXX
+AC_PROG_CXXCPP
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+
+# Check for Perl.
+AC_PATH_PROG([PERL], perl, no)
+AC_SUBST([PERL])
+AM_CONDITIONAL(HAVE_PERL, test x"$PERL" != xno)
+
+# Compilation flags
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+AC_MSG_CHECKING([whether to compile with debug info])
+AC_ARG_ENABLE(debugging,
+[  --enable-debugging      compile with debugging information])
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  OPT_FLAGS="-g"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-debugging, needs yes or no])
+  ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether to compile for profiling])
+AC_ARG_ENABLE(profiling,
+[  --enable-profiling      compile for profiling])
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -pg -DPROFILING=1"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-profiling, needs yes or no])
+  ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether to compile for test coverage])
+AC_ARG_ENABLE(coverage,
+[  --enable-coverage       compile for test coverage])
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-coverage, needs yes or no])
+  ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether to enable checking of run-time assertions])
+AC_ARG_ENABLE(assertions,
+[  --enable-assertions     check run-time assertions])
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  AC_DEFINE(NDEBUG, 1, [Assertions are disabled when this is defined])
+  debug_flag="-DNDEBUG=1"
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} --enable-assertions, needs yes or no])
+  ;;
+esac
+
+arch=no
+enableval=standard
+AC_MSG_CHECKING([whether to enable optimizations])
+AC_ARG_ENABLE(optimization,
+[  --enable-optimization   enable compiler optimizations])
+case "${enableval}" in
+sspeed)
+  AC_MSG_RESULT(sspeed)
+  OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
+  arch=yes
+  ;;
+speed)
+  AC_MSG_RESULT(speed)
+  OPT_FLAGS="$OPT_FLAGS -O3"
+  arch=yes
+  ;;
+size)
+  AC_MSG_RESULT(size)
+  OPT_FLAGS="$OPT_FLAGS -Os"
+  arch=yes
+  ;;
+standard | yes)
+  AC_MSG_RESULT(standard)
+  OPT_FLAGS="$OPT_FLAGS -O2"
+  ;;
+mild)
+  AC_MSG_RESULT(mild)
+  OPT_FLAGS="$OPT_FLAGS -O1"
+  ;;
+zero)
+  AC_MSG_RESULT(zero)
+  OPT_FLAGS="$OPT_FLAGS -O0"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no])
+  ;;
+esac
+
+enableval=$arch
+AC_MSG_CHECKING([for which architecture to optimize])
+AC_ARG_ENABLE(arch,
+[  --enable-arch[=arch]      optimize for architecture arch])
+case "${enableval}" in
+yes)
+  m=`uname -m`
+  case $m in
+  i?86 | k6 | athlon)
+    AC_MSG_RESULT($m)
+    OPT_FLAGS="$OPT_FLAGS -march=$m"
+    ;;
+  *)
+    AC_MSG_RESULT(default)
+    ;;
+  esac
+  ;;
+no)
+  AC_MSG_RESULT(default)
+  ;;
+*)
+  AC_MSG_RESULT($enableval)
+  OPT_FLAGS="$OPT_FLAGS -march=$enableval"
+  ;;
+esac
+
+CFLAGS="$COMP_FLAGS $OPT_FLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS"
+
+# Allow additions to C and C++ compilation flags
+
+AC_ARG_WITH(cflags,
+[  --with-cflags=xxx       add XXX to the options for the C compiler],
+CFLAGS="$CFLAGS $with_cflags")
+
+AC_ARG_WITH(cxxflags,
+[  --with-cxxflags=xxx     add XXX to the options for the C++ compiler],
+CXXFLAGS="$CXXFLAGS $with_cxxflags")
+
+enableval=yes
+AC_MSG_CHECKING([whether to build the Parma Watchdog Library])
+AC_ARG_ENABLE(watchdog,
+[  --enable-watchdog       build also the Parma Watchdog Library])
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} --enable-watchdog, needs yes or no])
+  ;;
+esac
+build_watchdog_library=$enableval
+AM_CONDITIONAL(BUILD_WATCHDOG_LIBRARY, test x"$build_watchdog_library" = xyes)
+
+if test x"$build_watchdog_library" = xyes
+then
+  # Checks for header files.
+  AC_HEADER_TIME
+  AC_CHECK_HEADERS([sys/time.h])
+
+  # Checks for library fuctions.
+  # The following invocations of AC_LANG_PUSH(C) and AC_LANG_POP(C)
+  # are to work around a bug in AC_CHECK_FUNCS.  For more information,
+  # http://www.cs.unipr.it/pipermail/ppl-devel/2002-November/002929.html
+  AC_LANG_PUSH(C)
+  AC_CHECK_FUNCS([setitimer],
+                 [],
+                 AC_MSG_ERROR([CANNOT BUILD THE WATCHDOG LIBRARY
+*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION.]))
+  AC_LANG_POP(C)
+fi
+
+# Libtool.
+# Turn off shared libraries during beta-testing, since they
+# make debugging harder and the build process takes too long.
+#AC_DISABLE_SHARED
+AC_LIBTOOL_DLOPEN
+AC_LIBTOOL_WIN32_DLL
+AC_PROG_LIBTOOL
+
+# If we are using GCC we want to compile with warnings enabled.
+if test x"$GCC" = xyes
+then
+  CFLAGS="$CFLAGS -W -Wall"
+fi
+if test x"$GXX" = xyes
+then
+  CXXFLAGS="$CXXFLAGS -W -Wall"
+fi
+
+# System-dependent adjustments.
+no_undefined=no
+
+case "${host_os}" in
+cygwin)
+  no_undefined=yes
+  ;;
+*)
+  ;;
+esac
+AM_CONDITIONAL(NO_UNDEFINED, test x$no_undefined = xyes)
+
+AC_SUBST(debug_flag)
+
+AC_CONFIG_FILES(Makefile
+                src/Makefile
+                utils/Makefile)
+AC_OUTPUT
diff --git a/Watchdog/depcomp b/Watchdog/depcomp
new file mode 100755
index 0000000..011ebd9
--- /dev/null
+++ b/Watchdog/depcomp
@@ -0,0 +1,530 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2005-07-09.11
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva at dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputing dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> $depfile
+    echo >> $depfile
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> $depfile
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+  tmpdepfile="$stripped.u"
+  if test "$libtool" = yes; then
+    "$@" -Wc,-M
+  else
+    "$@" -M
+  fi
+  stat=$?
+
+  if test -f "$tmpdepfile"; then :
+  else
+    stripped=`echo "$stripped" | sed 's,^.*/,,'`
+    tmpdepfile="$stripped.u"
+  fi
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+
+  if test -f "$tmpdepfile"; then
+    outname="$stripped.o"
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mecanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no
+  for arg in "$@"; do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix="`echo $object | sed 's/^.*\././'`"
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  "$@" || exit $?
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+	set fnord "$@"
+	shift
+	shift
+	;;
+    *)
+	set fnord "$@" "$arg"
+	shift
+	shift
+	;;
+    esac
+  done
+  "$@" -E |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Watchdog/install-sh b/Watchdog/install-sh
new file mode 100755
index 0000000..0ae12c0
--- /dev/null
+++ b/Watchdog/install-sh
@@ -0,0 +1,401 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-11-07.23
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+posix_glob=
+posix_mkdir=
+
+# Symbolic mode for testing mkdir with directories.
+# It is the same as 755, but also tests that "u+" works.
+test_mode=u=rwx,g=rx,o=rx,u+wx
+
+# Desired mode of installed file.
+mode=0755
+
+# Desired mode of newly created intermediate directories.
+# It is empty if not known yet.
+intermediate_mode=
+
+chmodcmd=$chmodprog
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c         (ignored)
+-d         create directories instead of installing files.
+-g GROUP   $chgrpprog installed files to GROUP.
+-m MODE    $chmodprog installed files to MODE.
+-o USER    $chownprog installed files to USER.
+-s         $stripprog installed files.
+-t DIRECTORY  install into DIRECTORY.
+-T         report an error if DSTFILE is a directory.
+--help     display this help and exit.
+--version  display version info and exit.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+  case $1 in
+    -c) shift
+        continue;;
+
+    -d) dir_arg=true
+        shift
+        continue;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+        shift
+        shift
+        continue;;
+
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
+
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
+
+    -t) dstarg=$2
+	shift
+	shift
+	continue;;
+
+    -T) no_target_directory=true
+	shift
+	continue;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    *)  # When -d is used, all remaining arguments are directories to create.
+	# When -t is used, the destination is already specified.
+	test -n "$dir_arg$dstarg" && break
+        # Otherwise, the last argument is the destination.  Remove it from $@.
+	for arg
+	do
+          if test -n "$dstarg"; then
+	    # $@ is not empty: it contains at least $arg.
+	    set fnord "$@" "$dstarg"
+	    shift # fnord
+	  fi
+	  shift # arg
+	  dstarg=$arg
+	done
+	break;;
+  esac
+done
+
+if test -z "$1"; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+test -n "$dir_arg" || trap '(exit $?); exit' 1 2 13 15
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src ;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dstarg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dstarg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst ;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dstarg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| \
+	     .       : '\(.\)' 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+		  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+		  /^X\(\/\/\)$/{ s//\1/; q; }
+		  /^X\(\/\).*/{ s//\1/; q; }
+		  s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	posix_mkdir=false
+	if $mkdirprog -m $test_mode -p -- / >/dev/null 2>&1; then
+	  posix_mkdir=true
+	else
+	  # Remove any dirs left behind by ancient mkdir implementations.
+	  rmdir ./-m "$test_mode" ./-p ./-- 2>/dev/null
+	fi ;;
+    esac
+
+    if
+      $posix_mkdir && {
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, create it using the same intermediate mode that
+	# mkdir -p would use when creating intermediate directories.
+	# POSIX says that this mode is "$(umask -S),u+wx", so use that
+	# if umask -S works.
+
+	if test -n "$dir_arg"; then
+	  mkdir_mode=$mode
+	else
+	  case $intermediate_mode in
+	    '')
+	      if umask_S=`(umask -S) 2>/dev/null`; then
+		intermediate_mode=$umask_S,u+wx
+	      else
+		intermediate_mode=$test_mode
+	      fi ;;
+	  esac
+	  mkdir_mode=$intermediate_mode
+	fi
+
+	$mkdirprog -m "$mkdir_mode" -p -- "$dstdir"
+      }
+    then :
+    else
+
+      # mkdir does not conform to POSIX, or it failed possibly due to
+      # a race condition.  Create the directory the slow way, step by
+      # step, checking for races as we go.
+
+      case $dstdir in
+	/*) pathcomp=/ ;;
+	-*) pathcomp=./ ;;
+	*)  pathcomp= ;;
+      esac
+
+      case $posix_glob in
+        '')
+	  if (set -f) 2>/dev/null; then
+	    posix_glob=true
+	  else
+	    posix_glob=false
+	  fi ;;
+      esac
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob && set -f
+      set fnord $dstdir
+      shift
+      $posix_glob && set +f
+      IFS=$oIFS
+
+      for d
+      do
+	test "x$d" = x && continue
+
+	pathcomp=$pathcomp$d
+	if test ! -d "$pathcomp"; then
+	  $mkdirprog "$pathcomp"
+	  # Don't fail if two instances are running concurrently.
+	  test -d "$pathcomp" || exit 1
+	fi
+	pathcomp=$pathcomp/
+      done
+      obsolete_mkdir_used=true
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd "$mode" "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    $doit $cpprog "$src" "$dsttmp" &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$mode" "$dsttmp"; } &&
+
+    # Now rename the file to the real destination.
+    { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \
+      || {
+	   # The rename failed, perhaps because mv can't rename something else
+	   # to itself, or perhaps because mv is so ancient that it does not
+	   # support -f.
+
+	   # Now remove or move aside any old file at destination location.
+	   # We try this two ways since rm can't unlink itself on some
+	   # systems and the destination file might be busy for other
+	   # reasons.  In this case, the final cleanup might fail but the new
+	   # file should still install successfully.
+	   {
+	     if test -f "$dst"; then
+	       $doit $rmcmd -f "$dst" 2>/dev/null \
+	       || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \
+		     && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\
+	       || {
+		 echo "$0: cannot unlink or rename $dst" >&2
+		 (exit 1); exit 1
+	       }
+	     else
+	       :
+	     fi
+	   } &&
+
+	   # Now rename the file to the real destination.
+	   $doit $mvcmd "$dsttmp" "$dst"
+	 }
+    } || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Watchdog/ltmain.sh b/Watchdog/ltmain.sh
new file mode 100644
index 0000000..06823e0
--- /dev/null
+++ b/Watchdog/ltmain.sh
@@ -0,0 +1,6863 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+basename="s,^.*/,,g"
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+# The name of this program:
+progname=`echo "$progpath" | $SED $basename`
+modename="$progname"
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.5.22
+TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)"
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes.
+if test -n "${ZSH_VERSION+set}" ; then
+  setopt NO_GLOB_SUBST
+fi
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell, and then maybe $echo will work.
+  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit $EXIT_SUCCESS
+fi
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  SP2NL='tr \040 \012'
+  NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  SP2NL='tr \100 \n'
+  NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+  save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+  save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+  $echo "$modename: not configured to build any kind of library" 1>&2
+  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+  exit $EXIT_FAILURE
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+duplicate_deps=no
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+#####################################
+# Shell function definitions:
+# This seems to be the best place for them
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+	# Failing that, at least try and use $RANDOM to avoid a race
+	my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+	save_mktempdir_umask=`umask`
+	umask 0077
+	$mkdir "$my_tmpdir"
+	umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || {
+        $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2
+	exit $EXIT_FAILURE
+      }
+    fi
+
+    $echo "X$my_tmpdir" | $Xsed
+}
+
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid ()
+{
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
+      $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+      win32_nmres=`eval $NM -f posix -A $1 | \
+	$SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $echo $win32_libid_type
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	case $arg in
+	  *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	CC_quoted="$CC_quoted $arg"
+      done
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	    # Double-quote args containing other shell metacharacters.
+	    case $arg in
+	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	      arg="\"$arg\""
+	      ;;
+	    esac
+	    CC_quoted="$CC_quoted $arg"
+	  done
+	    case "$@ " in
+	      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  $echo "$modename: unable to infer tagged configuration"
+	  $echo "$modename: specify a tag with \`--tag'" 1>&2
+	  exit $EXIT_FAILURE
+#        else
+#          $echo "$modename: using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+
+    $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
+    $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
+      exit $EXIT_FAILURE
+    fi
+}
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+    my_status=""
+
+    $show "${rm}r $my_gentop"
+    $run ${rm}r "$my_gentop"
+    $show "$mkdir $my_gentop"
+    $run $mkdir "$my_gentop"
+    my_status=$?
+    if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then
+      exit $my_status
+    fi
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'`
+      my_xdir="$my_gentop/$my_xlib"
+
+      $show "${rm}r $my_xdir"
+      $run ${rm}r "$my_xdir"
+      $show "$mkdir $my_xdir"
+      $run $mkdir "$my_xdir"
+      exit_status=$?
+      if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then
+	exit $exit_status
+      fi
+      case $host in
+      *-darwin*)
+	$show "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	if test -z "$run"; then
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'`
+	  darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null`
+	  if test -n "$darwin_arches"; then 
+	    darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    $show "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+      ## Okay now we have a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+	      lipo -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    ${rm}r unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd "$darwin_orig_dir"
+ 	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	fi # $run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+        ;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+    done
+    func_extract_archives_result="$my_oldobjs"
+}
+# End of Shell function definitions
+#####################################
+
+# Darwin sucks
+eval std_shrext=\"$shrext_cmds\"
+
+disable_libs=no
+
+# Parse our command line options once, thoroughly.
+while test "$#" -gt 0
+do
+  arg="$1"
+  shift
+
+  case $arg in
+  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) optarg= ;;
+  esac
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$prev"; then
+    case $prev in
+    execute_dlfiles)
+      execute_dlfiles="$execute_dlfiles $arg"
+      ;;
+    tag)
+      tagname="$arg"
+      preserve_args="${preserve_args}=$arg"
+
+      # Check whether tagname contains only valid characters
+      case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+	$echo "$progname: invalid tag name: $tagname" 1>&2
+	exit $EXIT_FAILURE
+	;;
+      esac
+
+      case $tagname in
+      CC)
+	# Don't test for the "default" C tag, as we know, it's there, but
+	# not specially marked.
+	;;
+      *)
+	if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
+	  taglist="$taglist $tagname"
+	  # Evaluate the configuration.
+	  eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
+	else
+	  $echo "$progname: ignoring unknown tag $tagname" 1>&2
+	fi
+	;;
+      esac
+      ;;
+    *)
+      eval "$prev=\$arg"
+      ;;
+    esac
+
+    prev=
+    prevopt=
+    continue
+  fi
+
+  # Have we seen a non-optional argument yet?
+  case $arg in
+  --help)
+    show_help=yes
+    ;;
+
+  --version)
+    $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+    $echo
+    $echo "Copyright (C) 2005  Free Software Foundation, Inc."
+    $echo "This is free software; see the source for copying conditions.  There is NO"
+    $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+    exit $?
+    ;;
+
+  --config)
+    ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+    done
+    exit $?
+    ;;
+
+  --debug)
+    $echo "$progname: enabling shell trace mode"
+    set -x
+    preserve_args="$preserve_args $arg"
+    ;;
+
+  --dry-run | -n)
+    run=:
+    ;;
+
+  --features)
+    $echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      $echo "enable shared libraries"
+    else
+      $echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      $echo "enable static libraries"
+    else
+      $echo "disable static libraries"
+    fi
+    exit $?
+    ;;
+
+  --finish) mode="finish" ;;
+
+  --mode) prevopt="--mode" prev=mode ;;
+  --mode=*) mode="$optarg" ;;
+
+  --preserve-dup-deps) duplicate_deps="yes" ;;
+
+  --quiet | --silent)
+    show=:
+    preserve_args="$preserve_args $arg"
+    ;;
+
+  --tag)
+    prevopt="--tag"
+    prev=tag
+    preserve_args="$preserve_args --tag"
+    ;;
+  --tag=*)
+    set tag "$optarg" ${1+"$@"}
+    shift
+    prev=tag
+    preserve_args="$preserve_args --tag"
+    ;;
+
+  -dlopen)
+    prevopt="-dlopen"
+    prev=execute_dlfiles
+    ;;
+
+  -*)
+    $echo "$modename: unrecognized option \`$arg'" 1>&2
+    $echo "$help" 1>&2
+    exit $EXIT_FAILURE
+    ;;
+
+  *)
+    nonopt="$arg"
+    break
+    ;;
+  esac
+done
+
+if test -n "$prevopt"; then
+  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+  $echo "$help" 1>&2
+  exit $EXIT_FAILURE
+fi
+
+case $disable_libs in
+no) 
+  ;;
+shared)
+  build_libtool_libs=no
+  build_old_libs=yes
+  ;;
+static)
+  build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+  ;;
+esac
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+if test -z "$show_help"; then
+
+  # Infer the operation mode.
+  if test -z "$mode"; then
+    $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
+    $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2
+    case $nonopt in
+    *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
+      mode=link
+      for arg
+      do
+	case $arg in
+	-c)
+	   mode=compile
+	   break
+	   ;;
+	esac
+      done
+      ;;
+    *db | *dbx | *strace | *truss)
+      mode=execute
+      ;;
+    *install*|cp|mv)
+      mode=install
+      ;;
+    *rm)
+      mode=uninstall
+      ;;
+    *)
+      # If we have no mode, but dlfiles were specified, then do execute mode.
+      test -n "$execute_dlfiles" && mode=execute
+
+      # Just use the default operation mode.
+      if test -z "$mode"; then
+	if test -n "$nonopt"; then
+	  $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+	else
+	  $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+	fi
+      fi
+      ;;
+    esac
+  fi
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+    $echo "$help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$modename --help --mode=$mode' for more information."
+
+  # These modes are in order of execution frequency so that they run quickly.
+  case $mode in
+  # libtool compile mode
+  compile)
+    modename="$modename: compile"
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  if test -n "$libobj" ; then
+	    $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-static | -prefer-pic | -prefer-non-pic)
+	  later="$later $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+ 	  for arg in $args; do
+	    IFS="$save_ifs"
+
+	    # Double-quote args containing other shell metacharacters.
+	    # Many Bourne shells cannot handle close brackets correctly
+	    # in scan sets, so we specify it separately.
+	    case $arg in
+	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	      arg="\"$arg\""
+	      ;;
+	    esac
+	    lastarg="$lastarg $arg"
+	  done
+	  IFS="$save_ifs"
+	  lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+	  # Add the arguments to base_compile.
+	  base_compile="$base_compile $lastarg"
+	  continue
+	  ;;
+
+	* )
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+      case $lastarg in
+      # Double-quote args containing other shell metacharacters.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, and some SunOS ksh mistreat backslash-escaping
+      # in scan sets (worked around with variable expansion),
+      # and furthermore cannot handle '|' '&' '(' ')' in scan sets 
+      # at all, so we specify them separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	lastarg="\"$lastarg\""
+	;;
+      esac
+
+      base_compile="$base_compile $lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      $echo "$modename: you must specify an argument for -Xcompile"
+      exit $EXIT_FAILURE
+      ;;
+    target)
+      $echo "$modename: you must specify a target with \`-o'" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    *)
+      # Get the name of the library object.
+      [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    xform='[cCFSifmso]'
+    case $libobj in
+    *.ada) xform=ada ;;
+    *.adb) xform=adb ;;
+    *.ads) xform=ads ;;
+    *.asm) xform=asm ;;
+    *.c++) xform=c++ ;;
+    *.cc) xform=cc ;;
+    *.ii) xform=ii ;;
+    *.class) xform=class ;;
+    *.cpp) xform=cpp ;;
+    *.cxx) xform=cxx ;;
+    *.f90) xform=f90 ;;
+    *.for) xform=for ;;
+    *.java) xform=java ;;
+    esac
+
+    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+    case $libobj in
+    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+    *)
+      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -static)
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"`
+    case $qlibobj in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	qlibobj="\"$qlibobj\"" ;;
+    esac
+    test "X$libobj" != "X$qlibobj" \
+	&& $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' 	&()|`$[]' \
+	&& $echo "$modename: libobj name \`$libobj' may not contain shell special characters."
+    objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+    xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$xdir" = "X$obj"; then
+      xdir=
+    else
+      xdir=$xdir/
+    fi
+    lobj=${xdir}$objdir/$objname
+
+    if test -z "$base_compile"; then
+      $echo "$modename: you must specify a compilation command" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    $run $rm $removelist
+    trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+      removelist="$removelist $output_obj $lockfile"
+      trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $run ln "$progpath" "$lockfile" 2>/dev/null; do
+	$show "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+      $echo "$srcfile" > "$lockfile"
+    fi
+
+    if test -n "$fix_srcfile_path"; then
+      eval srcfile=\"$fix_srcfile_path\"
+    fi
+    qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"`
+    case $qsrcfile in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+      qsrcfile="\"$qsrcfile\"" ;;
+    esac
+
+    $run $rm "$libobj" "${libobj}T"
+
+    # Create a libtool object file (analogous to a ".la" file),
+    # but don't create it if we're doing a dry run.
+    test -z "$run" && cat > ${libobj}T <<EOF
+# $libobj - a libtool object file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+EOF
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      if test ! -d "${xdir}$objdir"; then
+	$show "$mkdir ${xdir}$objdir"
+	$run $mkdir ${xdir}$objdir
+	exit_status=$?
+	if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then
+	  exit $exit_status
+	fi
+      fi
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	command="$command -o $lobj"
+      fi
+
+      $run $rm "$lobj" "$output_obj"
+
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	test -n "$output_obj" && $run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	$show "$mv $output_obj $lobj"
+	if $run $mv $output_obj $lobj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Append the name of the PIC object to the libtool object file.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object='$objdir/$objname'
+
+EOF
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+        suppress_output=' >/dev/null 2>&1'
+      fi
+    else
+      # No PIC object so indicate it doesn't exist in the libtool
+      # object file.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object=none
+
+EOF
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	command="$command -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      $run $rm "$obj" "$output_obj"
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	$show "$mv $output_obj $obj"
+	if $run $mv $output_obj $obj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Append the name of the non-PIC object the libtool object file.
+      # Only append if the libtool object file exists.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object='$objname'
+
+EOF
+    else
+      # Append the name of the non-PIC object the libtool object file.
+      # Only append if the libtool object file exists.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object=none
+
+EOF
+    fi
+
+    $run $mv "${libobj}T" "${libobj}"
+
+    # Unlock the critical section if it was locked
+    if test "$need_locks" != no; then
+      $run $rm "$lockfile"
+    fi
+
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool link mode
+  link | relink)
+    modename="$modename: link"
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args="$nonopt"
+    base_compile="$nonopt $@"
+    compile_command="$nonopt"
+    finalize_command="$nonopt"
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    notinst_path= # paths that contain not-installed libtool libraries
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -all-static | -static)
+	if test "X$arg" = "X-all-static"; then
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	else
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	fi
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+	;;
+      *) qarg=$arg ;;
+      esac
+      libtool_args="$libtool_args $qarg"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  compile_command="$compile_command @OUTPUT@"
+	  finalize_command="$finalize_command @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    compile_command="$compile_command @SYMFILE@"
+	    finalize_command="$finalize_command @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  if test ! -f "$arg"; then
+	    $echo "$modename: symbol file \`$arg' does not exist"
+	    exit $EXIT_FAILURE
+	  fi
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat $save_arg`
+	    do
+#	      moreargs="$moreargs $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		# If there is no directory component, then add one.
+		case $arg in
+		*/* | *\\*) . $arg ;;
+		*) . ./$arg ;;
+		esac
+
+		if test -z "$pic_object" || \
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none && \
+		   test "$non_pic_object" = none; then
+		  $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+		  exit $EXIT_FAILURE
+		fi
+
+		# Extract subdirectory from the argument.
+		xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+		if test "X$xdir" = "X$arg"; then
+		  xdir=
+		else
+		  xdir="$xdir/"
+		fi
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      dlfiles="$dlfiles $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    dlprefiles="$dlprefiles $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  libobjs="$libobjs $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if test -z "$run"; then
+		  $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+		  exit $EXIT_FAILURE
+		else
+		  # Dry-run case.
+
+		  # Extract subdirectory from the argument.
+		  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+		  if test "X$xdir" = "X$arg"; then
+		    xdir=
+		  else
+		    xdir="$xdir/"
+		  fi
+
+		  pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+		  non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+		  libobjs="$libobjs $pic_object"
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		fi
+	      fi
+	    done
+	  else
+	    $echo "$modename: link input file \`$save_arg' does not exist"
+	    exit $EXIT_FAILURE
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    $echo "$modename: only absolute run-paths are allowed" 1>&2
+	    exit $EXIT_FAILURE
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  compile_command="$compile_command $qarg"
+	  finalize_command="$finalize_command $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  compile_command="$compile_command $wl$qarg"
+	  finalize_command="$finalize_command $wl$qarg"
+	  continue
+	  ;;
+	xcclinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  compile_command="$compile_command $qarg"
+	  finalize_command="$finalize_command $qarg"
+	  continue
+	  ;;
+	shrext)
+  	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	darwin_framework|darwin_framework_skip)
+	  test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg"
+	  compile_command="$compile_command $arg"
+	  finalize_command="$finalize_command $arg"
+	  prev=
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  compile_command="$compile_command $link_static_flag"
+	  finalize_command="$finalize_command $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+	continue
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  $echo "$modename: more than one -exported-symbols argument is not allowed"
+	  exit $EXIT_FAILURE
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework|-arch|-isysroot)
+	case " $CC " in
+	  *" ${arg} ${1} "* | *" ${arg}	${1} "*) 
+		prev=darwin_framework_skip ;;
+	  *) compiler_flags="$compiler_flags $arg"
+	     prev=darwin_framework ;;
+	esac
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  compile_command="$compile_command $arg"
+	  finalize_command="$finalize_command $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  if test -z "$absdir"; then
+	    $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+	    absdir="$dir"
+	    notinst_path="$notinst_path $dir"
+	  fi
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    deplibs="$deplibs -framework System"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	deplibs="$deplibs $arg"
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      -model)
+	compile_command="$compile_command $arg"
+	compiler_flags="$compiler_flags $arg"
+	finalize_command="$finalize_command $arg"
+	prev=xcompiler
+	continue
+	;;
+
+     -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+	compiler_flags="$compiler_flags $arg"
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+      # -r[0-9][0-9]* specifies the processor on the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+      # +DA*, +DD* enable 64-bit mode on the HP compiler
+      # -q* pass through compiler args for the IBM compiler
+      # -m* pass through architecture-specific compiler args for GCC
+      # -m*, -t[45]*, -txscale* pass through architecture-specific
+      # compiler args for GCC
+      # -pg pass through profiling flag for GCC
+      # @file GCC response files
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \
+      -t[45]*|-txscale*|@*)
+
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+        compile_command="$compile_command $arg"
+        finalize_command="$finalize_command $arg"
+        compiler_flags="$compiler_flags $arg"
+        continue
+        ;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # in order for the loader to find any dlls it needs.
+	  $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+	  $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  $echo "$modename: only absolute run-paths are allowed" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
+
+      -static)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -Wc,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Wl,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $wl$flag"
+	  linker_flags="$linker_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # Some other compiler flag.
+      -* | +*)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+
+      *.$objext)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  # If there is no directory component, then add one.
+	  case $arg in
+	  */* | *\\*) . $arg ;;
+	  *) . ./$arg ;;
+	  esac
+
+	  if test -z "$pic_object" || \
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none && \
+	     test "$non_pic_object" = none; then
+	    $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+	  if test "X$xdir" = "X$arg"; then
+	    xdir=
+ 	  else
+	    xdir="$xdir/"
+	  fi
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		dlfiles="$dlfiles $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      dlprefiles="$dlprefiles $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    libobjs="$libobjs $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if test -z "$run"; then
+	    $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+	    exit $EXIT_FAILURE
+	  else
+	    # Dry-run case.
+
+	    # Extract subdirectory from the argument.
+	    xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+	    if test "X$xdir" = "X$arg"; then
+	      xdir=
+	    else
+	      xdir="$xdir/"
+	    fi
+
+	    pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+	    non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+	    libobjs="$libobjs $pic_object"
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+      fi
+    done # argument parsing loop
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      compile_command="$compile_command $arg"
+      finalize_command="$finalize_command $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$output_objdir" = "X$output"; then
+      output_objdir="$objdir"
+    else
+      output_objdir="$output_objdir/$objdir"
+    fi
+    # Create the object directory.
+    if test ! -d "$output_objdir"; then
+      $show "$mkdir $output_objdir"
+      $run $mkdir $output_objdir
+      exit_status=$?
+      if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then
+	exit $exit_status
+      fi
+    fi
+
+    # Determine the type of output
+    case $output in
+    "")
+      $echo "$modename: you must specify an output file" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    case $host in
+    *cygwin* | *mingw* | *pw32*)
+      # don't eliminate duplications in $postdeps and $predeps
+      duplicate_compiler_generated_deps=yes
+      ;;
+    *)
+      duplicate_compiler_generated_deps=$duplicate_deps
+      ;;
+    esac
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if test "X$duplicate_deps" = "Xyes" ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	esac
+      fi
+      libs="$libs $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+	  esac
+	  pre_post_deps="$pre_post_deps $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    case $linkmode in
+    lib)
+	passes="conv link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+	    exit $EXIT_FAILURE
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+    for pass in $passes; do
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	esac
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    compiler_flags="$compiler_flags $deplib"
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
+	    continue
+	  fi
+	  name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+	  for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if (${SED} -e '2q' $lib |
+                    grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+		  library_names=
+		  old_library=
+		  case $lib in
+		  */* | *\\*) . $lib ;;
+		  *) . ./$lib ;;
+		  esac
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+		    test "X$ladir" = "X$lib" && ladir="."
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+	        ;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    ;;
+	  *)
+	    $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    valid_a_lib=no
+	    case $deplibs_check_method in
+	      match_pattern*)
+		set dummy $deplibs_check_method
+	        match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+		if eval $echo \"$deplib\" 2>/dev/null \
+		    | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		  valid_a_lib=yes
+		fi
+		;;
+	      pass_all)
+		valid_a_lib=yes
+		;;
+            esac
+	    if test "$valid_a_lib" != yes; then
+	      $echo
+	      $echo "*** Warning: Trying to link with static lib archive $deplib."
+	      $echo "*** I have the capability to make that library automatically link in when"
+	      $echo "*** you link to this library.  But I can only do this if you have a"
+	      $echo "*** shared version of the library, which you do not appear to have"
+	      $echo "*** because the file extensions .$libext of this argument makes me believe"
+	      $echo "*** that it is just a static archive that I should not used here."
+	    else
+	      $echo
+	      $echo "*** Warning: Linking the shared library $output against the"
+	      $echo "*** static library $deplib is not portable!"
+	      deplibs="$deplib $deplibs"
+	    fi
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      newdlprefiles="$newdlprefiles $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      newdlfiles="$newdlfiles $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$ladir" = "X$lib" && ladir="."
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	case $lib in
+	*/* | *\\*) . $lib ;;
+	*) . ./$lib ;;
+	esac
+
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	      exit $EXIT_FAILURE
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+              if test "X$duplicate_deps" = "Xyes" ; then
+	        case "$tmp_libs " in
+	        *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	        esac
+              fi
+	      tmp_libs="$tmp_libs $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    $echo "$modename: \`$lib' is not a convenience library" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+	if test -z "$linklib"; then
+	  $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  else
+	    newdlfiles="$newdlfiles $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    $echo "$modename: warning: library \`$lib' was moved." 1>&2
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$libdir"
+	    absdir="$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  fi
+	fi # $installed = yes
+	name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
+	  else
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
+	  fi
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if test "X$duplicate_deps" = "Xyes" ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath " in
+	      *" $dir "*) ;;
+	      *" $absdir "*) ;;
+	      *) temp_rpath="$temp_rpath $absdir" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes ; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  if test "$installed" = no; then
+	    notinst_deplibs="$notinst_deplibs $lib"
+	    need_relink=yes
+	  fi
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on
+	  # some systems (darwin)
+	  if test "$shouldnotlink" = yes && test "$pass" = link ; then
+	    $echo
+	    if test "$linkmode" = prog; then
+	      $echo "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $echo "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $echo "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    realname="$2"
+	    shift; shift
+	    libname=`eval \\$echo \"$libname_spec\"`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw*)
+		major=`expr $current - $age`
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
+	    newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      $show "extracting exported symbol list from \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      cmds=$extract_expsyms_cmds
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      $show "generating import library for \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      cmds=$old_archive_from_expsyms_cmds
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a module then we can not link against
+		    # it, someone is ignoring the new warnings I added
+		    if /usr/bin/file -L $add 2> /dev/null |
+                      $EGREP ": [^:]* bundle" >/dev/null ; then
+		      $echo "** Warning, lib $linklib is a module, not a shared library"
+		      if test -z "$old_library" ; then
+		        $echo
+		        $echo "** And there doesn't seem to be a static archive available"
+		        $echo "** The link will probably fail, sorry"
+		      else
+		        add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      $echo "$modename: configuration error: unsupported hardcode properties"
+	      exit $EXIT_FAILURE
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes && \
+		 test "$hardcode_minus_L" != yes && \
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+	        add="$inst_prefix_dir$libdir/$linklib"
+	      else
+	        add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    $echo
+	    $echo "*** Warning: This system can not link to static lib archive $lib."
+	    $echo "*** I have the capability to make that library automatically link in when"
+	    $echo "*** you link to this library.  But I can only do this if you have a"
+	    $echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      $echo "*** But as you try to build a module library, libtool will still create "
+	      $echo "*** a static module, that should work as long as the dlopening application"
+	      $echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		$echo
+		$echo "*** However, this would only work if libtool was able to extract symbol"
+		$echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		$echo "*** not find such a program.  So, this module is probably useless."
+		$echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    if test "X$duplicate_deps" = "Xyes" ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+		dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+		test "X$dir" = "X$deplib" && dir="."
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if grep "^installed=no" $deplib > /dev/null; then
+		  path="$absdir/$objdir"
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  if test -z "$libdir"; then
+		    $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		    exit $EXIT_FAILURE
+		  fi
+		  if test "$absdir" != "$libdir"; then
+		    $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+		  fi
+		  path="$absdir"
+		fi
+		depdepl=
+		case $host in
+		*-*-darwin*)
+		  # we do not want to link against static libs,
+		  # but need to link against shared
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$path/$depdepl" ; then
+		      depdepl="$path/$depdepl"
+		    fi
+		    # do not add paths which are already there
+		    case " $newlib_search_path " in
+		    *" $path "*) ;;
+		    *) newlib_search_path="$newlib_search_path $path";;
+		    esac
+		  fi
+		  path=""
+		  ;;
+		*)
+		  path="-L$path"
+		  ;;
+		esac
+		;;
+	      -l*)
+		case $host in
+		*-*-darwin*)
+		  # Again, we only want to link against shared libraries
+		  eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
+		  for tmp in $newlib_search_path ; do
+		    if test -f "$tmp/lib$tmp_libs.dylib" ; then
+		      eval depdepl="$tmp/lib$tmp_libs.dylib"
+		      break
+		    fi
+		  done
+		  path=""
+		  ;;
+		*) continue ;;
+		esac
+		;;
+	      *) continue ;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	      case " $deplibs " in
+	      *" $depdepl "*) ;;
+	      *) deplibs="$depdepl $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  tmp_libs="$tmp_libs $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	$echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+      fi
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	if test "$module" = no; then
+	  $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+	  exit $EXIT_FAILURE
+	else
+	  $echo
+	  $echo "*** Warning: Linking the shared library $output against the non-libtool"
+	  $echo "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
+      fi
+
+      if test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+      fi
+
+      set dummy $rpath
+      if test "$#" -gt 2; then
+	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+      fi
+      install_libdir="$2"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	if test -n "$vinfo"; then
+	  $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
+	fi
+
+	if test -n "$release"; then
+	  $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+	fi
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	IFS="$save_ifs"
+
+	if test -n "$8"; then
+	  $echo "$modename: too many parameters to \`-version-info'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$2"
+	  number_minor="$3"
+	  number_revision="$4"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  darwin|linux|osf|windows)
+	    current=`expr $number_major + $number_minor`
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    current=`expr $number_major + $number_minor - 1`
+	    age="$number_minor"
+	    revision="$number_minor"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$2"
+	  revision="$3"
+	  age="$4"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  minor_current=`expr $current + 1`
+	  verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current";
+	  ;;
+
+	irix | nonstopux)
+	  major=`expr $current - $age + 1`
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    iface=`expr $revision - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  major=.`expr $current - $age`
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    iface=`expr $current - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  major=`expr $current - $age`
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  $echo "$modename: unknown library version type \`$version_type'" 1>&2
+	  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+      fi
+
+      if test "$mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$echo "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+	         if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+	         then
+		   continue
+		 fi
+	       fi
+	       removelist="$removelist $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	if test -n "$removelist"; then
+	  $show "${rm}r $removelist"
+	  $run ${rm}r $removelist
+	fi
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      for path in $notinst_path; do
+	lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"`
+	deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"`
+	dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"`
+      done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs -framework System"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+ 	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $rm conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $rm conftest
+	  $LTCC $LTCFLAGS -o conftest conftest.c $deplibs
+	  if test "$?" -eq 0 ; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      name=`expr $i : '-l\(.*\)'`
+	      # If $name is empty we are operating on a -L argument.
+              if test "$name" != "" && test "$name" -ne "0"; then
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    newdeplibs="$newdeplibs $i"
+		    i=""
+		    ;;
+		  esac
+	        fi
+		if test -n "$i" ; then
+		  libname=`eval \\$echo \"$libname_spec\"`
+		  deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		  set dummy $deplib_matches
+		  deplib_match=$2
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    $echo
+		    $echo "*** Warning: dynamic linker does not accept needed library $i."
+		    $echo "*** I have the capability to make that library automatically link in when"
+		    $echo "*** you link to this library.  But I can only do this if you have a"
+		    $echo "*** shared version of the library, which I believe you do not have"
+		    $echo "*** because a test_compile did reveal that the linker did not use it for"
+		    $echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      name=`expr $i : '-l\(.*\)'`
+	      # If $name is empty we are operating on a -L argument.
+              if test "$name" != "" && test "$name" != "0"; then
+		$rm conftest
+		$LTCC $LTCFLAGS -o conftest conftest.c $i
+		# Did it work?
+		if test "$?" -eq 0 ; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      newdeplibs="$newdeplibs $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval \\$echo \"$libname_spec\"`
+		    deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		    set dummy $deplib_matches
+		    deplib_match=$2
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      newdeplibs="$newdeplibs $i"
+		    else
+		      droppeddeps=yes
+		      $echo
+		      $echo "*** Warning: dynamic linker does not accept needed library $i."
+		      $echo "*** I have the capability to make that library automatically link in when"
+		      $echo "*** you link to this library.  But I can only do this if you have a"
+		      $echo "*** shared version of the library, which you do not appear to have"
+		      $echo "*** because a test_compile did reveal that the linker did not use this one"
+		      $echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  $echo
+		  $echo "*** Warning!  Library $i is needed by this library but I was not able to"
+		  $echo "***  make it link in!  You will probably need to install it or some"
+		  $echo "*** library that it depends on before this library will be fully"
+		  $echo "*** functional.  Installing it before continuing would be even better."
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method
+	  file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name=`expr $a_deplib : '-l\(.*\)'`
+	    # If $name is empty we are operating on a -L argument.
+            if test "$name" != "" && test  "$name" != "0"; then
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval \\$echo \"$libname_spec\"`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null \
+			 | grep " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+			 | ${SED} 10q \
+			 | $EGREP "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$echo
+		$echo "*** Warning: linker path does not have real file for library $a_deplib."
+		$echo "*** I have the capability to make that library automatically link in when"
+		$echo "*** you link to this library.  But I can only do this if you have a"
+		$echo "*** shared version of the library, which you do not appear to have"
+		$echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $echo "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $echo "*** with $libname and none of the candidates passed a file format test"
+		  $echo "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name=`expr $a_deplib : '-l\(.*\)'`
+	    # If $name is empty we are operating on a -L argument.
+	    if test -n "$name" && test "$name" != "0"; then
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval \\$echo \"$libname_spec\"`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval $echo \"$potent_lib\" 2>/dev/null \
+		        | ${SED} 10q \
+		        | $EGREP "$match_pattern_regex" > /dev/null; then
+		      newdeplibs="$newdeplibs $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$echo
+		$echo "*** Warning: linker path does not have real file for library $a_deplib."
+		$echo "*** I have the capability to make that library automatically link in when"
+		$echo "*** you link to this library.  But I can only do this if you have a"
+		$echo "*** shared version of the library, which you do not appear to have"
+		$echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $echo "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $echo "*** with $libname and none of the candidates passed a file format test"
+		  $echo "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+	    -e 's/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
+	    done
+	  fi
+	  if $echo "X $tmp_deplibs" | $Xsed -e 's/[ 	]//g' \
+	    | grep . >/dev/null; then
+	    $echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      $echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      $echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    $echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library is the System framework
+	  newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    $echo
+	    $echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $echo "*** dependencies of module $libname.  Therefore, libtool will create"
+	    $echo "*** a static module, that should work as long as the dlopening"
+	    $echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      $echo
+	      $echo "*** However, this would only work if libtool was able to extract symbol"
+	      $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      $echo "*** not find such a program.  So, this module is probably useless."
+	      $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    $echo "*** The inter-library dependencies that have been dropped here will be"
+	    $echo "*** automatically added whenever a program is linked with this library"
+	    $echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      $echo
+	      $echo "*** Since this library must not contain undefined symbols,"
+	      $echo "*** because either the platform does not support them or"
+	      $echo "*** it was explicitly requested with -no-undefined,"
+	      $echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    if test -n "$hardcode_libdir_flag_spec_ld"; then
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+	    else
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	    fi
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	realname="$2"
+	shift; shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  linknames="$linknames $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      eval cmd=\"$cmd\"
+	      if len=`expr "X$cmd" : ".*"` &&
+	       test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	        $show "$cmd"
+	        $run eval "$cmd" || exit $?
+	        skipped_export=false
+	      else
+	        # The command line is too long to execute in one step.
+	        $show "using reloadable object file for export list..."
+	        skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex"; then
+	      $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+	      $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+	      $run eval '$mv "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+		case " $convenience " in
+		*" $test_deplib "*) ;;
+		*)
+			tmp_deplibs="$tmp_deplibs $test_deplib"
+			;;
+		esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    libobjs="$libobjs $func_extract_archives_result"
+	  fi
+	fi
+	
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linker_flags="$linker_flags $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	  eval test_cmds=\"$archive_expsym_cmds\"
+	  cmds=$archive_expsym_cmds
+	else
+	  eval test_cmds=\"$archive_cmds\"
+	  cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+	   test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise.
+	  $echo "creating reloadable object files..."
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  output_la=`$echo "X$output" | $Xsed -e "$basename"`
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  delfiles=
+	  last_robj=
+	  k=1
+	  output=$output_objdir/$output_la-${k}.$objext
+	  # Loop over the list of objects to be linked.
+	  for obj in $save_libobjs
+	  do
+	    eval test_cmds=\"$reload_cmds $objlist $last_robj\"
+	    if test "X$objlist" = X ||
+	       { len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+		 test "$len" -le "$max_cmd_len"; }; then
+	      objlist="$objlist $obj"
+	    else
+	      # The command $test_cmds is almost too long, add a
+	      # command to the queue.
+	      if test "$k" -eq 1 ; then
+		# The first file doesn't have a previous command to add.
+		eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+	      else
+		# All subsequent reloadable object files will link in
+		# the last one created.
+		eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
+	      fi
+	      last_robj=$output_objdir/$output_la-${k}.$objext
+	      k=`expr $k + 1`
+	      output=$output_objdir/$output_la-${k}.$objext
+	      objlist=$obj
+	      len=1
+	    fi
+	  done
+	  # Handle the remaining objects by creating one last
+	  # reloadable object file.  All subsequent reloadable object
+	  # files will link in the last one created.
+	  test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	  eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+
+	  if ${skipped_export-false}; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    libobjs=$output
+	    # Append the command to create the export file.
+	    eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
+          fi
+
+	  # Set up a command to remove the reloadable object files
+	  # after they are used.
+	  i=0
+	  while test "$i" -lt "$k"
+	  do
+	    i=`expr $i + 1`
+	    delfiles="$delfiles $output_objdir/$output_la-${i}.$objext"
+	  done
+
+	  $echo "creating a temporary reloadable object file: $output"
+
+	  # Loop through the commands generated above and execute them.
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $concat_cmds; do
+	    IFS="$save_ifs"
+	    $show "$cmd"
+	    $run eval "$cmd" || exit $?
+	  done
+	  IFS="$save_ifs"
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    cmds=$archive_expsym_cmds
+	  else
+	    cmds=$archive_cmds
+	    fi
+	  fi
+
+	  # Append the command to remove the reloadable object files
+	  # to the just-reset $cmds.
+	  eval cmds=\"\$cmds~\$rm $delfiles\"
+	fi
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $show "$cmd"
+	  $run eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$mode" = relink; then
+	      $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      $show "${rm}r $gentop"
+	      $run ${rm}r "$gentop"
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+	    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+      fi
+
+      case $output in
+      *.lo)
+	if test -n "$objs$old_deplibs"; then
+	  $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	libobj="$output"
+	obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $run $rm $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+	else
+	  gentop="$output_objdir/${obj}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      cmds=$reload_cmds
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	eval cmd=\"$cmd\"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $run eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	cmds=$reload_cmds
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $show "$cmd"
+	  $run eval "$cmd" || exit $?
+	done
+	IFS="$save_ifs"
+      fi
+
+      if test -n "$gentop"; then
+	$show "${rm}r $gentop"
+	$run ${rm}r $gentop
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
+      esac
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+      fi
+
+      if test "$preload" = yes; then
+	if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+	   test "$dlopen_self_static" = unknown; then
+	  $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+	fi
+      fi
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	;;
+      esac
+
+      case $host in
+      *darwin*)
+        # Don't allow lazy linking, it breaks C++ global constructors
+        if test "$tagname" = CXX ; then
+        compile_command="$compile_command ${wl}-bind_at_load"
+        finalize_command="$finalize_command ${wl}-bind_at_load"
+        fi
+        ;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
+
+      dlsyms=
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	  dlsyms="${outputname}S.c"
+	else
+	  $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+	fi
+      fi
+
+      if test -n "$dlsyms"; then
+	case $dlsyms in
+	"") ;;
+	*.c)
+	  # Discover the nlist of each of the dlfiles.
+	  nlist="$output_objdir/${outputname}.nm"
+
+	  $show "$rm $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Parse the name list into a source file.
+	  $show "creating $output_objdir/$dlsyms"
+
+	  test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+	  if test "$dlself" = yes; then
+	    $show "generating symbol list for \`$output'"
+
+	    test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+	    # Add our own program objects to the symbol list.
+	    progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	    for arg in $progfiles; do
+	      $show "extracting global C symbols from \`$arg'"
+	      $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	    done
+
+	    if test -n "$exclude_expsyms"; then
+	      $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    if test -n "$export_symbols_regex"; then
+	      $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    # Prepare the list of exported symbols
+	    if test -z "$export_symbols"; then
+	      export_symbols="$output_objdir/$outputname.exp"
+	      $run $rm $export_symbols
+	      $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+              case $host in
+              *cygwin* | *mingw* )
+	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+		$run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+                ;;
+              esac
+	    else
+	      $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      $run eval 'mv "$nlist"T "$nlist"'
+              case $host in
+              *cygwin* | *mingw* )
+	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+		$run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+                ;;
+              esac
+	    fi
+	  fi
+
+	  for arg in $dlprefiles; do
+	    $show "extracting global C symbols from \`$arg'"
+	    name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
+	    $run eval '$echo ": $name " >> "$nlist"'
+	    $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -z "$run"; then
+	    # Make sure we have at least an empty file.
+	    test -f "$nlist" || : > "$nlist"
+
+	    if test -n "$exclude_expsyms"; then
+	      $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	      $mv "$nlist"T "$nlist"
+	    fi
+
+	    # Try sorting and uniquifying the output.
+	    if grep -v "^: " < "$nlist" |
+		if sort -k 3 </dev/null >/dev/null 2>&1; then
+		  sort -k 3
+		else
+		  sort +2
+		fi |
+		uniq > "$nlist"S; then
+	      :
+	    else
+	      grep -v "^: " < "$nlist" > "$nlist"S
+	    fi
+
+	    if test -f "$nlist"S; then
+	      eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+	    else
+	      $echo '/* NONE */' >> "$output_objdir/$dlsyms"
+	    fi
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+"
+
+	    case $host in
+	    *cygwin* | *mingw* )
+	  $echo >> "$output_objdir/$dlsyms" "\
+/* DATA imports from DLLs on WIN32 can't be const, because
+   runtime relocations are performed -- see ld's documentation
+   on pseudo-relocs */
+struct {
+"
+	      ;;
+	    * )
+	  $echo >> "$output_objdir/$dlsyms" "\
+const struct {
+"
+	      ;;
+	    esac
+
+
+	  $echo >> "$output_objdir/$dlsyms" "\
+  const char *name;
+  lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+  {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	  fi
+
+	  pic_flag_for_symtable=
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
+	    esac;;
+	  *-*-hpux*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag";;
+	    esac
+	  esac
+
+	  # Now compile the dynamic symbol file.
+	  $show "(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+	  $run eval '(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+	  # Clean up the generated files.
+	  $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Transform the symbol file into the correct name.
+          case $host in
+          *cygwin* | *mingw* )
+            if test -f "$output_objdir/${outputname}.def" ; then
+              compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
+              finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
+            else
+              compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+              finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+             fi
+            ;;
+          * )
+            compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+            finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+            ;;
+          esac
+	  ;;
+	*)
+	  $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+      else
+	# We keep going just in case the user didn't refer to
+	# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+	# really was required.
+
+	# Nullify the symbol file.
+	compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+	finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+      fi
+
+      if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+	# Replace the output file specification.
+	compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	$show "$link_command"
+	$run eval "$link_command"
+	exit_status=$?
+
+	# Delete the generated files.
+	if test -n "$dlsyms"; then
+	  $show "$rm $output_objdir/${outputname}S.${objext}"
+	  $run $rm "$output_objdir/${outputname}S.${objext}"
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$shlibpath_var"; then
+	# We should set the shlibpath_var
+	rpath=
+	for dir in $temp_rpath; do
+	  case $dir in
+	  [\\/]* | [A-Za-z]:[\\/]*)
+	    # Absolute path.
+	    rpath="$rpath$dir:"
+	    ;;
+	  *)
+	    # Relative path: add a thisdir entry.
+	    rpath="$rpath\$thisdir/$dir:"
+	    ;;
+	  esac
+	done
+	temp_rpath="$rpath"
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$run $rm $output
+	# Link the executable and exit
+	$show "$link_command"
+	$run eval "$link_command" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+	$echo "$modename: \`$output' will be relinked during installation" 1>&2
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      $show "$link_command"
+      $run eval "$link_command" || exit $?
+
+      # Now create the wrapper script.
+      $show "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	    relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Quote $echo for shipping.
+      if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
+	case $progpath in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+	esac
+	qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if our run command is non-null.
+      if test -z "$run"; then
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+            output_name=`basename $output`
+            output_path=`dirname $output`
+            cwrappersource="$output_path/$objdir/lt-$output_name.c"
+            cwrapper="$output_path/$output_name.exe"
+            $rm $cwrappersource $cwrapper
+            trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+
+   Currently, it simply execs the wrapper *script* "/bin/sh $output",
+   but could eventually absorb all of the scripts functionality and
+   exec $objdir/$outputname directly.
+*/
+EOF
+	    cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+        (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+/* -DDEBUG is fairly common in CFLAGS.  */
+#undef DEBUG
+#if defined DEBUGWRAPPER
+# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__)
+#else
+# define DEBUG(format, ...)
+#endif
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+const char * base_name (const char *name);
+char * find_executable(const char *wrapper);
+int    check_executable(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  DEBUG("(main) argv[0]      : %s\n",argv[0]);
+  DEBUG("(main) program_name : %s\n",program_name);
+  newargz = XMALLOC(char *, argc+2);
+EOF
+
+            cat >> $cwrappersource <<EOF
+  newargz[0] = (char *) xstrdup("$SHELL");
+EOF
+
+            cat >> $cwrappersource <<"EOF"
+  newargz[1] = find_executable(argv[0]);
+  if (newargz[1] == NULL)
+    lt_fatal("Couldn't find %s", argv[0]);
+  DEBUG("(main) found exe at : %s\n",newargz[1]);
+  /* we know the script has the same name, without the .exe */
+  /* so make sure newargz[1] doesn't end in .exe */
+  strendzap(newargz[1],".exe");
+  for (i = 1; i < argc; i++)
+    newargz[i+1] = xstrdup(argv[i]);
+  newargz[argc+1] = NULL;
+
+  for (i=0; i<argc+1; i++)
+  {
+    DEBUG("(main) newargz[%d]   : %s\n",i,newargz[i]);
+    ;
+  }
+
+EOF
+
+            case $host_os in
+              mingw*)
+                cat >> $cwrappersource <<EOF
+  execv("$SHELL",(char const **)newargz);
+EOF
+              ;;
+              *)
+                cat >> $cwrappersource <<EOF
+  execv("$SHELL",newargz);
+EOF
+              ;;
+            esac
+
+            cat >> $cwrappersource <<"EOF"
+  return 127;
+}
+
+void *
+xmalloc (size_t num)
+{
+  void * p = (void *) malloc (num);
+  if (!p)
+    lt_fatal ("Memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
+;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char)name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable(const char * path)
+{
+  struct stat st;
+
+  DEBUG("(check_executable)  : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!");
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0) &&
+      (
+        /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
+#if defined (S_IXOTH)
+       ((st.st_mode & S_IXOTH) == S_IXOTH) ||
+#endif
+#if defined (S_IXGRP)
+       ((st.st_mode & S_IXGRP) == S_IXGRP) ||
+#endif
+       ((st.st_mode & S_IXUSR) == S_IXUSR))
+      )
+    return 1;
+  else
+    return 0;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise */
+char *
+find_executable (const char* wrapper)
+{
+  int has_slash = 0;
+  const char* p;
+  const char* p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char* concat_name;
+
+  DEBUG("(find_executable)  : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':')
+  {
+    concat_name = xstrdup (wrapper);
+    if (check_executable(concat_name))
+      return concat_name;
+    XFREE(concat_name);
+  }
+  else
+  {
+#endif
+    if (IS_DIR_SEPARATOR (wrapper[0]))
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable(concat_name))
+        return concat_name;
+      XFREE(concat_name);
+    }
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+    {
+      has_slash = 1;
+      break;
+    }
+  if (!has_slash)
+  {
+    /* no slashes; search PATH */
+    const char* path = getenv ("PATH");
+    if (path != NULL)
+    {
+      for (p = path; *p; p = p_next)
+      {
+        const char* q;
+        size_t p_len;
+        for (q = p; *q; q++)
+          if (IS_PATH_SEPARATOR(*q))
+            break;
+        p_len = q - p;
+        p_next = (*q == '\0' ? q : q + 1);
+        if (p_len == 0)
+        {
+          /* empty path: current directory */
+          if (getcwd (tmp, LT_PATHMAX) == NULL)
+            lt_fatal ("getcwd failed");
+          tmp_len = strlen(tmp);
+          concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
+          memcpy (concat_name, tmp, tmp_len);
+          concat_name[tmp_len] = '/';
+          strcpy (concat_name + tmp_len + 1, wrapper);
+        }
+        else
+        {
+          concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1);
+          memcpy (concat_name, p, p_len);
+          concat_name[p_len] = '/';
+          strcpy (concat_name + p_len + 1, wrapper);
+        }
+        if (check_executable(concat_name))
+          return concat_name;
+        XFREE(concat_name);
+      }
+    }
+    /* not found in PATH; assume curdir */
+  }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal ("getcwd failed");
+  tmp_len = strlen(tmp);
+  concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable(concat_name))
+    return concat_name;
+  XFREE(concat_name);
+  return NULL;
+}
+
+char *
+strendzap(char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert(str != NULL);
+  assert(pat != NULL);
+
+  len = strlen(str);
+  patlen = strlen(pat);
+
+  if (patlen <= len)
+  {
+    str += len - patlen;
+    if (strcmp(str, pat) == 0)
+      *str = '\0';
+  }
+  return str;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+          const char * message, va_list ap)
+{
+  fprintf (stderr, "%s: %s: ", program_name, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+  va_end (ap);
+}
+EOF
+          # we should really use a build-platform specific compiler
+          # here, but OTOH, the wrappers (shell script and this C one)
+          # are only useful if you want to execute the "real" binary.
+          # Since the "real" binary is built for $host, then this
+          # wrapper might as well be built for $host, too.
+          $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource
+          ;;
+        esac
+        $rm $output
+        trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+
+	$echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variable:
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$echo are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    echo=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$echo works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$echo will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$echo >> $output "\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+  done
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $echo >> $output "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" || \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $mkdir \"\$progdir\"
+    else
+      $rm \"\$progdir/\$file\"
+    fi"
+
+	  $echo >> $output "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$echo \"\$relink_command_output\" >&2
+	$rm \"\$progdir/\$file\"
+	exit $EXIT_FAILURE
+      fi
+    fi
+
+    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $rm \"\$progdir/\$program\";
+      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $rm \"\$progdir/\$file\"
+  fi"
+	else
+	  $echo >> $output "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$echo >> $output "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $echo >> $output "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $echo >> $output "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	$echo >> $output "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2*)
+	  $echo >> $output "\
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $echo >> $output "\
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$echo >> $output "\
+      \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+      exit $EXIT_FAILURE
+    fi
+  else
+    # The program doesn't exist.
+    \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$echo \"This script is just a wrapper for \$program.\" 1>&2
+    $echo \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit $EXIT_FAILURE
+  fi
+fi\
+"
+	chmod +x $output
+      fi
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	generated="$generated $gentop"
+
+	func_extract_archives $gentop $addlibs
+	oldobjs="$oldobjs $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+       cmds=$old_archive_from_new_cmds
+      else
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      $echo "X$obj" | $Xsed -e 's%^.*/%%'
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  $echo "copying selected object files to avoid basename conflicts..."
+
+	  if test -z "$gentop"; then
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
+
+	    $show "${rm}r $gentop"
+	    $run ${rm}r "$gentop"
+	    $show "$mkdir $gentop"
+	    $run $mkdir "$gentop"
+	    exit_status=$?
+	    if test "$exit_status" -ne 0 && test ! -d "$gentop"; then
+	      exit $exit_status
+	    fi
+	  fi
+
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		counter=`expr $counter + 1`
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      $run ln "$obj" "$gentop/$newobj" ||
+	      $run cp "$obj" "$gentop/$newobj"
+	      oldobjs="$oldobjs $gentop/$newobj"
+	      ;;
+	    *) oldobjs="$oldobjs $obj" ;;
+	    esac
+	  done
+	fi
+
+	eval cmds=\"$old_archive_cmds\"
+
+	if len=`expr "X$cmds" : ".*"` &&
+	     test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  $echo "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  for obj in $save_oldobjs
+	  do
+	    oldobjs="$objlist $obj"
+	    objlist="$objlist $obj"
+	    eval test_cmds=\"$old_archive_cmds\"
+	    if len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+	       test "$len" -le "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+	        RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+        eval cmd=\"$cmd\"
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$generated"; then
+      $show "${rm}r$generated"
+      $run ${rm}r$generated
+    fi
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      $show "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	  relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+
+      # Only create the output if not a dry run.
+      if test -z "$run"; then
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		if test -z "$libdir"; then
+		  $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		  exit $EXIT_FAILURE
+		fi
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit $EXIT_FAILURE
+	      fi
+	      newdlfiles="$newdlfiles $libdir/$name"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit $EXIT_FAILURE
+	      fi
+	      newdlprefiles="$newdlprefiles $libdir/$name"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlfiles="$newdlfiles $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlprefiles="$newdlprefiles $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $rm $output
+	  # place dlname in correct position for cygwin
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	  esac
+	  $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $echo >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      fi
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool install mode
+  install)
+    modename="$modename: install"
+
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $echo "X$nonopt" | grep shtool > /dev/null; then
+      # Aesthetically quote it.
+      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$arg "
+      arg="$1"
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+    case $arg in
+    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+      arg="\"$arg\""
+      ;;
+    esac
+    install_prog="$install_prog$arg"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f) 
+      	case " $install_prog " in
+	*[\\\ /]cp\ *) ;;
+	*) prev=$arg ;;
+	esac
+	;;
+      -g | -m | -o) prev=$arg ;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$install_prog $arg"
+    done
+
+    if test -z "$install_prog"; then
+      $echo "$modename: you must specify an install program" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prev' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	$echo "$modename: no file or destination specified" 1>&2
+      else
+	$echo "$modename: you must specify a destination" 1>&2
+      fi
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Strip any trailing slash from the destination.
+    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+      test "X$destdir" = "X$dest" && destdir=.
+      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files
+      if test "$#" -gt 2; then
+	$echo "$modename: \`$dest' is not a directory" 1>&2
+	$echo "$help" 1>&2
+	exit $EXIT_FAILURE
+      fi
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	library_names=
+	old_library=
+	relink_command=
+	# If there is no directory component, then add one.
+	case $file in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+	test "X$dir" = "X$file/" && dir=
+	dir="$dir$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  if test "$inst_prefix_dir" = "$destdir"; then
+	    $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  $echo "$modename: warning: relinking \`$file'" 1>&2
+	  $show "$relink_command"
+	  if $run eval "$relink_command"; then :
+	  else
+	    $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names
+	if test -n "$2"; then
+	  realname="$2"
+	  shift
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  $show "$install_prog $dir/$srcname $destdir/$realname"
+	  $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+	  if test -n "$stripme" && test -n "$striplib"; then
+	    $show "$striplib $destdir/$realname"
+	    $run eval "$striplib $destdir/$realname" || exit $?
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      if test "$linkname" != "$realname"; then
+                $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+                $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+	      fi
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  cmds=$postinstall_cmds
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    eval cmd=\"$cmd\"
+	    $show "$cmd"
+	    $run eval "$cmd" || {
+	      lt_exit=$?
+
+	      # Restore the uninstalled library and exit
+	      if test "$mode" = relink; then
+		$run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+	      fi
+
+	      exit $lt_exit
+	    }
+	  done
+	  IFS="$save_ifs"
+	fi
+
+	# Install the pseudo-library for information purposes.
+	name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	instname="$dir/$name"i
+	$show "$install_prog $instname $destdir/$name"
+	$run eval "$install_prog $instname $destdir/$name" || exit $?
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	if test -n "$destfile"; then
+	  $show "$install_prog $file $destfile"
+	  $run eval "$install_prog $file $destfile" || exit $?
+	fi
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+	  $show "$install_prog $staticobj $staticdest"
+	  $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      file=`$echo $file|${SED} 's,.exe$,,'`
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin*|*mingw*)
+	    wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  # Note that it is not necessary on cygwin/mingw to append a dot to
+	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
+	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
+	  # `FILE.' does not work on cygwin managed mounts.
+	  #
+	  # If there is no directory component, then add one.
+	  case $wrapper in
+	  */* | *\\*) . ${wrapper} ;;
+	  *) . ./${wrapper} ;;
+	  esac
+
+	  # Check the variables that should have been set.
+	  if test -z "$notinst_deplibs"; then
+	    $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      # If there is no directory component, then add one.
+	      case $lib in
+	      */* | *\\*) . $lib ;;
+	      *) . ./$lib ;;
+	      esac
+	    fi
+	    libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  # Note that it is not necessary on cygwin/mingw to append a dot to
+	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
+	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
+	  # `FILE.' does not work on cygwin managed mounts.
+	  #
+	  # If there is no directory component, then add one.
+	  case $wrapper in
+	  */* | *\\*) . ${wrapper} ;;
+	  *) . ./${wrapper} ;;
+	  esac
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    if test "$finalize" = yes && test -z "$run"; then
+	      tmpdir=`func_mktempdir`
+	      file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
+	      outputname="$tmpdir/$file"
+	      # Replace the output file specification.
+	      relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+	      $show "$relink_command"
+	      if $run eval "$relink_command"; then :
+	      else
+		$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+		${rm}r "$tmpdir"
+		continue
+	      fi
+	      file="$outputname"
+	    else
+	      $echo "$modename: warning: cannot relink \`$file'" 1>&2
+	    fi
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway 
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
+	    ;;
+	  esac
+	  ;;
+	esac
+	$show "$install_prog$stripme $file $destfile"
+	$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+	test -n "$outputname" && ${rm}r "$tmpdir"
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      $show "$install_prog $file $oldlib"
+      $run eval "$install_prog \$file \$oldlib" || exit $?
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	$show "$old_striplib $oldlib"
+	$run eval "$old_striplib $oldlib" || exit $?
+      fi
+
+      # Do each command in the postinstall commands.
+      cmds=$old_postinstall_cmds
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	eval cmd=\"$cmd\"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$future_libdirs"; then
+      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+    fi
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      test -n "$run" && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+    ;;
+
+  # libtool finish mode
+  finish)
+    modename="$modename: finish"
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  cmds=$finish_cmds
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    eval cmd=\"$cmd\"
+	    $show "$cmd"
+	    $run eval "$cmd" || admincmds="$admincmds
+       $cmd"
+	  done
+	  IFS="$save_ifs"
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $run eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    test "$show" = : && exit $EXIT_SUCCESS
+
+    $echo "X----------------------------------------------------------------------" | $Xsed
+    $echo "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      $echo "   $libdir"
+    done
+    $echo
+    $echo "If you ever happen to want to link against installed libraries"
+    $echo "in a given directory, LIBDIR, you must either use libtool, and"
+    $echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    $echo "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      $echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      $echo "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      $echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+      $echo "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
+
+      $echo "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      $echo "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      $echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    $echo
+    $echo "See any operating system documentation about shared libraries for"
+    $echo "more information, such as the ld(1) and ld.so(8) manual pages."
+    $echo "X----------------------------------------------------------------------" | $Xsed
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool execute mode
+  execute)
+    modename="$modename: execute"
+
+    # The first argument is the command name.
+    cmd="$nonopt"
+    if test -z "$cmd"; then
+      $echo "$modename: you must specify a COMMAND" 1>&2
+      $echo "$help"
+      exit $EXIT_FAILURE
+    fi
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      if test ! -f "$file"; then
+	$echo "$modename: \`$file' is not a file" 1>&2
+	$echo "$help" 1>&2
+	exit $EXIT_FAILURE
+      fi
+
+      dir=
+      case $file in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+
+	# If there is no directory component, then add one.
+	case $file in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+	;;
+
+      *)
+	$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  # If there is no directory component, then add one.
+	  case $file in
+	  */* | *\\*) . $file ;;
+	  *) . ./$file ;;
+	  esac
+
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+      args="$args \"$file\""
+    done
+
+    if test -z "$run"; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      if test "${save_LC_ALL+set}" = set; then
+	LC_ALL="$save_LC_ALL"; export LC_ALL
+      fi
+      if test "${save_LANG+set}" = set; then
+	LANG="$save_LANG"; export LANG
+      fi
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+	$echo "export $shlibpath_var"
+      fi
+      $echo "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+    ;;
+
+  # libtool clean and uninstall mode
+  clean | uninstall)
+    modename="$modename: $mode"
+    rm="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) rm="$rm $arg"; rmforce=yes ;;
+      -*) rm="$rm $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    if test -z "$rm"; then
+      $echo "$modename: you must specify an RM program" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    rmdirs=
+
+    origobjdir="$objdir"
+    for file in $files; do
+      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+      if test "X$dir" = "X$file"; then
+	dir=.
+	objdir="$origobjdir"
+      else
+	objdir="$dir/$origobjdir"
+      fi
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+      test "$mode" = uninstall && objdir="$dir"
+
+      # Remember objdir for removal later, being careful to avoid duplicates
+      if test "$mode" = clean; then
+	case " $rmdirs " in
+	  *" $objdir "*) ;;
+	  *) rmdirs="$rmdirs $objdir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if (test -L "$file") >/dev/null 2>&1 \
+	|| (test -h "$file") >/dev/null 2>&1 \
+	|| test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  . $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles="$rmfiles $objdir/$n"
+	  done
+	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+	  case "$mode" in
+	  clean)
+	    case "  $library_names " in
+	    # "  " in the beginning catches empty $dlname
+	    *" $dlname "*) ;;
+	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
+	    esac
+	     test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      cmds=$postuninstall_cmds
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test "$?" -ne 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      cmds=$old_postuninstall_cmds
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test "$?" -ne 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+
+	  # Read the .lo file
+	  . $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" \
+	     && test "$pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" \
+	     && test "$non_pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    file=`$echo $file|${SED} 's,.exe$,,'`
+	    noexename=`$echo $name|${SED} 's,.exe$,,'`
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    rmfiles="$rmfiles $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	    relink_command=
+	    . $dir/$noexename
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      rmfiles="$rmfiles $objdir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      $show "$rm $rmfiles"
+      $run $rm $rmfiles || exit_status=1
+    done
+    objdir="$origobjdir"
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	$show "rmdir $dir"
+	$run rmdir $dir >/dev/null 2>&1
+      fi
+    done
+
+    exit $exit_status
+    ;;
+
+  "")
+    $echo "$modename: you must specify a MODE" 1>&2
+    $echo "$generic_help" 1>&2
+    exit $EXIT_FAILURE
+    ;;
+  esac
+
+  if test -z "$exec_cmd"; then
+    $echo "$modename: invalid operation mode \`$mode'" 1>&2
+    $echo "$generic_help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+  eval exec $exec_cmd
+  exit $EXIT_FAILURE
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+    --config          show all configuration variables
+    --debug           enable verbose shell tracing
+-n, --dry-run         display commands without modifying any files
+    --features        display basic configuration information and exit
+    --finish          same as \`--mode=finish'
+    --help            display this help message and exit
+    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
+    --quiet           same as \`--silent'
+    --silent          don't print informational messages
+    --tag=TAG         use configuration variables from tag TAG
+    --version         print version information
+
+MODE must be one of the following:
+
+      clean           remove files from the build directory
+      compile         compile a source file into a libtool object
+      execute         automatically set library path, then run a program
+      finish          complete the installation of libtool libraries
+      install         install libraries or executables
+      link            create a library or an executable
+      uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE.
+
+Report bugs to <bug-libtool at gnu.org>."
+  exit $EXIT_SUCCESS
+  ;;
+
+clean)
+  $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+compile)
+  $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -static           always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+  ;;
+
+execute)
+  $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+  ;;
+
+finish)
+  $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+  ;;
+
+install)
+  $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+  ;;
+
+link)
+  $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+		    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+		    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -static           do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+		    specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+  ;;
+
+uninstall)
+  $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+*)
+  $echo "$modename: invalid operation mode \`$mode'" 1>&2
+  $echo "$help" 1>&2
+  exit $EXIT_FAILURE
+  ;;
+esac
+
+$echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit $?
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+disable_libs=shared
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+disable_libs=static
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/Watchdog/missing b/Watchdog/missing
new file mode 100755
index 0000000..d84fac8
--- /dev/null
+++ b/Watchdog/missing
@@ -0,0 +1,359 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2005-06-08.21
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
+#   Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake at gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+  lex|yacc)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case "$f" in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+    test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f y.tab.h ]; then
+	echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+	file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+    fi
+    if [ -f "$file" ]; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit 1
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case "$firstarg" in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case "$firstarg" in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Watchdog/mkinstalldirs b/Watchdog/mkinstalldirs
new file mode 100755
index 0000000..259dbfc
--- /dev/null
+++ b/Watchdog/mkinstalldirs
@@ -0,0 +1,158 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2005-06-29.22
+
+# Original author: Noah Friedman <friedman at prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+errstatus=0
+dirmode=
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake at gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+  case $1 in
+    -h | --help | --h*)         # -h for help
+      echo "$usage"
+      exit $?
+      ;;
+    -m)                         # -m PERM arg
+      shift
+      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+      dirmode=$1
+      shift
+      ;;
+    --version)
+      echo "$0 $scriptversion"
+      exit $?
+      ;;
+    --)                         # stop option processing
+      shift
+      break
+      ;;
+    -*)                         # unknown option
+      echo "$usage" 1>&2
+      exit 1
+      ;;
+    *)                          # first non-opt arg
+      break
+      ;;
+  esac
+done
+
+for file
+do
+  if test -d "$file"; then
+    shift
+  else
+    break
+  fi
+done
+
+case $# in
+  0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error.  This is a problem when calling mkinstalldirs
+# from a parallel make.  We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+  '')
+    if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+      echo "mkdir -p -- $*"
+      exec mkdir -p -- "$@"
+    else
+      # On NextStep and OpenStep, the `mkdir' command does not
+      # recognize any option.  It will interpret all options as
+      # directories to create, and then abort because `.' already
+      # exists.
+      test -d ./-p && rmdir ./-p
+      test -d ./--version && rmdir ./--version
+    fi
+    ;;
+  *)
+    if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+       test ! -d ./--version; then
+      echo "mkdir -m $dirmode -p -- $*"
+      exec mkdir -m "$dirmode" -p -- "$@"
+    else
+      # Clean up after NextStep and OpenStep mkdir.
+      for d in ./-m ./-p ./--version "./$dirmode";
+      do
+        test -d $d && rmdir $d
+      done
+    fi
+    ;;
+esac
+
+for file
+do
+  case $file in
+    /*) pathcomp=/ ;;
+    *)  pathcomp= ;;
+  esac
+  oIFS=$IFS
+  IFS=/
+  set fnord $file
+  shift
+  IFS=$oIFS
+
+  for d
+  do
+    test "x$d" = x && continue
+
+    pathcomp=$pathcomp$d
+    case $pathcomp in
+      -*) pathcomp=./$pathcomp ;;
+    esac
+
+    if test ! -d "$pathcomp"; then
+      echo "mkdir $pathcomp"
+
+      mkdir "$pathcomp" || lasterr=$?
+
+      if test ! -d "$pathcomp"; then
+	errstatus=$lasterr
+      else
+	if test ! -z "$dirmode"; then
+	  echo "chmod $dirmode $pathcomp"
+	  lasterr=
+	  chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+	  if test ! -z "$lasterr"; then
+	    errstatus=$lasterr
+	  fi
+	fi
+      fi
+    fi
+
+    pathcomp=$pathcomp/
+  done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Watchdog/src/Doubly_Linked_Object.defs.hh b/Watchdog/src/Doubly_Linked_Object.defs.hh
new file mode 100644
index 0000000..bac30b5
--- /dev/null
+++ b/Watchdog/src/Doubly_Linked_Object.defs.hh
@@ -0,0 +1,64 @@
+/* Doubly_Linked_Object class declaration.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Doubly_Linked_Object_defs_hh
+#define PWL_Doubly_Linked_Object_defs_hh 1
+
+#include "Doubly_Linked_Object.types.hh"
+#include "EList.types.hh"
+#include "EList_Iterator.types.hh"
+
+//! A (base) class for doubly linked objects.
+class Parma_Watchdog_Library::Doubly_Linked_Object {
+public:
+  //! Default constructor.
+  Doubly_Linked_Object();
+
+  //! Creates a chain element with forward link \p f and backward link \p b.
+  Doubly_Linked_Object(Doubly_Linked_Object* f, Doubly_Linked_Object* b);
+
+  //! Inserts \p y before \p *this.
+  void insert_before(Doubly_Linked_Object& y);
+
+  //! Inserts \p y after \p *this.
+  void insert_after(Doubly_Linked_Object& y);
+
+  //! Erases \p *this from the chain and returns a pointer to the next element.
+  Doubly_Linked_Object* erase();
+
+  //! Erases \p *this from the chain.
+  ~Doubly_Linked_Object();
+
+private:
+  //! Forward link.
+  Doubly_Linked_Object* next;
+
+  //! Backward link.
+  Doubly_Linked_Object* prev;
+
+  template <typename T> friend class EList;
+  template <typename T> friend class EList_Iterator;
+};
+
+#include "Doubly_Linked_Object.inlines.hh"
+
+#endif // !defined(PWL_Doubly_Linked_Object_defs_hh)
diff --git a/Watchdog/src/Doubly_Linked_Object.inlines.hh b/Watchdog/src/Doubly_Linked_Object.inlines.hh
new file mode 100644
index 0000000..8b7d52e
--- /dev/null
+++ b/Watchdog/src/Doubly_Linked_Object.inlines.hh
@@ -0,0 +1,69 @@
+/* Doubly_Linked_Object class implementation: inline functions.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Doubly_Linked_Object_inlines_hh
+#define PWL_Doubly_Linked_Object_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+inline
+Doubly_Linked_Object::Doubly_Linked_Object() {
+}
+
+inline
+Doubly_Linked_Object::Doubly_Linked_Object(Doubly_Linked_Object* f,
+					   Doubly_Linked_Object* b)
+  : next(f),
+    prev(b) {
+}
+
+inline void
+Doubly_Linked_Object::insert_before(Doubly_Linked_Object& y) {
+  y.next = this;
+  y.prev = prev;
+  prev->next = &y;
+  prev = &y;
+}
+
+inline void
+Doubly_Linked_Object::insert_after(Doubly_Linked_Object& y) {
+  y.next = next;
+  y.prev = this;
+  next->prev = &y;
+  next = &y;
+}
+
+inline Doubly_Linked_Object*
+Doubly_Linked_Object::erase() {
+  next->prev = prev;
+  prev->next = next;
+  return next;
+}
+
+inline
+Doubly_Linked_Object::~Doubly_Linked_Object() {
+  erase();
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Doubly_Linked_Object_inlines_hh)
diff --git a/Watchdog/src/Doubly_Linked_Object.types.hh b/Watchdog/src/Doubly_Linked_Object.types.hh
new file mode 100644
index 0000000..a3466b0
--- /dev/null
+++ b/Watchdog/src/Doubly_Linked_Object.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PWL_Doubly_Linked_Object_types_hh
+#define PWL_Doubly_Linked_Object_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Doubly_Linked_Object;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Doubly_Linked_Object_types_hh)
diff --git a/Watchdog/src/EList.defs.hh b/Watchdog/src/EList.defs.hh
new file mode 100644
index 0000000..1572e28
--- /dev/null
+++ b/Watchdog/src/EList.defs.hh
@@ -0,0 +1,87 @@
+/* EList class declaration.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_EList_defs_hh
+#define PWL_EList_defs_hh 1
+
+#include "EList.types.hh"
+#include "EList_Iterator.defs.hh"
+
+/*! \brief
+  A simple kind of embedded list (i.e., a doubly linked objects
+  where the links are embedded in the objects themselves).
+*/
+template <typename T>
+class Parma_Watchdog_Library::EList : private Doubly_Linked_Object {
+public:
+  //! A const iterator to traverse the list.
+  typedef EList_Iterator<const T> Const_Iterator;
+
+  //! A non-const iterator to traverse the list.
+  typedef EList_Iterator<T> Iterator;
+
+  //! Constructs an empty list.
+  EList();
+
+  //! Destructs the list and all the elements in it.
+  ~EList();
+
+  //! Pushes \p obj to the front of the list.
+  void push_front(T& obj);
+
+  //! Pushes \p obj to the back of the list.
+  void push_back(T& obj);
+
+  /*! \brief
+    Inserts \p obj jyst before \p position and returns an iterator
+    that points to the inserted object.
+  */
+  Iterator insert(Iterator position, T& obj);
+
+  /*! \brief
+    Removes the element pointed to by \p position, returning
+    an iterator pointing to the next element, if any, or end(), otherwise.
+  */
+  Iterator erase(Iterator position);
+
+  //! Returns <CODE>true</CODE> if and only if the list is empty.
+  bool empty() const;
+
+  //! Returns an iterator pointing to the beginning of the list.
+  Iterator begin();
+
+  //! Returns an iterator pointing one past the last element in the list.
+  Iterator end();
+
+  //! Returns a const iterator pointing to the beginning of the list.
+  Const_Iterator begin() const;
+
+  //! Returns a const iterator pointing one past the last element in the list.
+  Const_Iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+#include "EList.inlines.hh"
+
+#endif // !defined(PWL_EList_defs_hh)
diff --git a/Watchdog/src/EList.inlines.hh b/Watchdog/src/EList.inlines.hh
new file mode 100644
index 0000000..828fa55
--- /dev/null
+++ b/Watchdog/src/EList.inlines.hh
@@ -0,0 +1,112 @@
+/* EList class implementation: inline functions.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_EList_inlines_hh
+#define PWL_EList_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+template <typename T>
+inline
+EList<T>::EList()
+  : Doubly_Linked_Object(this, this) {
+}
+
+template <typename T>
+inline void
+EList<T>::push_front(T& obj) {
+  next->insert_before(obj);
+}
+
+template <typename T>
+inline void
+EList<T>::push_back(T& obj) {
+  prev->insert_after(obj);
+}
+
+template <typename T>
+inline typename EList<T>::Iterator
+EList<T>::insert(Iterator position, T& obj) {
+  position->insert_before(obj);
+  return Iterator(&obj);
+}
+
+template <typename T>
+inline typename EList<T>::Iterator
+EList<T>::begin() {
+  return Iterator(next);
+}
+
+template <typename T>
+inline typename EList<T>::Iterator
+EList<T>::end() {
+  return Iterator(this);
+}
+
+template <typename T>
+inline typename EList<T>::Const_Iterator
+EList<T>::begin() const {
+  return Const_Iterator(next);
+}
+
+template <typename T>
+inline typename EList<T>::Const_Iterator
+EList<T>::end() const {
+  return Const_Iterator(const_cast<EList<T>*>(this));
+}
+
+template <typename T>
+inline bool
+EList<T>::empty() const {
+  return begin() == end();
+}
+
+template <typename T>
+inline typename EList<T>::Iterator
+EList<T>::erase(Iterator position) {
+  assert(!empty());
+  return Iterator(position->erase());
+}
+
+template <typename T>
+inline
+EList<T>::~EList() {
+  // Erase and deallocate all the elements.
+  for (Iterator i = begin(), lend = end(), next; i != lend; i = next) {
+    next = erase(i);
+    delete &*i;
+  }
+}
+
+template <typename T>
+inline bool
+EList<T>::OK() const {
+  for (Const_Iterator i = begin(), lend = end(); i != lend; ++i)
+    if (!i->OK())
+      return false;
+
+  return true;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_inlines_hh)
diff --git a/Watchdog/src/EList.types.hh b/Watchdog/src/EList.types.hh
new file mode 100644
index 0000000..84d7300
--- /dev/null
+++ b/Watchdog/src/EList.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PWL_EList_types_hh
+#define PWL_EList_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+template <typename T>
+class EList;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_types_hh)
diff --git a/Watchdog/src/EList_Iterator.defs.hh b/Watchdog/src/EList_Iterator.defs.hh
new file mode 100644
index 0000000..fd7123f
--- /dev/null
+++ b/Watchdog/src/EList_Iterator.defs.hh
@@ -0,0 +1,83 @@
+/* EList_Iterator class declaration.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_EList_Iterator_defs_hh
+#define PWL_EList_Iterator_defs_hh 1
+
+#include "EList_Iterator.types.hh"
+#include "Doubly_Linked_Object.types.hh"
+
+namespace Parma_Watchdog_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+template <typename T>
+bool operator==(const EList_Iterator<T>& x, const EList_Iterator<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+template <typename T>
+bool operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y);
+
+} // namespace Parma_Watchdog_Library
+
+//! A class providing iterators for embedded lists.
+template <typename T>
+class Parma_Watchdog_Library::EList_Iterator {
+public:
+  //! Constructs an iterator pointing to nothing.
+  EList_Iterator();
+
+  //! Constructs an iterator pointing to \p p.
+  explicit EList_Iterator(Doubly_Linked_Object* p);
+
+  //! Changes \p *this so that it points to \p p.
+  EList_Iterator& operator=(Doubly_Linked_Object* p);
+
+  //! Indirect member selector.
+  T* operator->();
+
+  //! Dereference operator.
+  T& operator*();
+
+  //! Preincrement operator.
+  EList_Iterator& operator++();
+
+  //! Postincrement operator.
+  EList_Iterator operator++(int);
+
+  //! Predecrement operator.
+  EList_Iterator& operator--();
+
+  //! Postdecrement operator.
+  EList_Iterator operator--(int);
+
+private:
+  //! Embedded pointer.
+  Doubly_Linked_Object* ptr;
+
+  friend bool operator==<T>(const EList_Iterator& x, const EList_Iterator& y);
+
+  friend bool operator!=<T>(const EList_Iterator& x, const EList_Iterator& y);
+};
+
+#include "EList_Iterator.inlines.hh"
+
+#endif // !defined(PWL_EList_Iterator_defs_hh)
diff --git a/Watchdog/src/EList_Iterator.inlines.hh b/Watchdog/src/EList_Iterator.inlines.hh
new file mode 100644
index 0000000..1998f11
--- /dev/null
+++ b/Watchdog/src/EList_Iterator.inlines.hh
@@ -0,0 +1,104 @@
+/* EList_Iterator class implementation: inline functions.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_EList_Iterator_inlines_hh
+#define PWL_EList_Iterator_inlines_hh 1
+
+#include "Doubly_Linked_Object.defs.hh"
+
+namespace Parma_Watchdog_Library {
+
+template <typename T>
+inline
+EList_Iterator<T>::EList_Iterator() {
+}
+
+template <typename T>
+inline
+EList_Iterator<T>::EList_Iterator(Doubly_Linked_Object* p)
+  : ptr(p) {
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator=(Doubly_Linked_Object* p) {
+  ptr = p;
+  return *this;
+}
+
+template <typename T>
+inline T*
+EList_Iterator<T>::operator->() {
+  return static_cast<T*>(ptr);
+}
+
+template <typename T>
+inline T&
+EList_Iterator<T>::operator*() {
+  return *operator->();
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator++() {
+  ptr = ptr->next;
+  return *this;
+}
+
+template <typename T>
+inline EList_Iterator<T>
+EList_Iterator<T>::operator++(int) {
+  EList_Iterator tmp = *this;
+  ++*this;
+  return tmp;
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator--() {
+  ptr = ptr->prev;
+  return *this;
+}
+
+template <typename T>
+inline EList_Iterator<T>
+EList_Iterator<T>::operator--(int) {
+  EList_Iterator tmp = *this;
+  --*this;
+  return tmp;
+}
+
+template <typename T>
+inline bool
+operator==(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
+  return x.ptr == y.ptr;
+}
+
+template <typename T>
+inline bool
+operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
+  return x.ptr != y.ptr;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_Iterator_inlines_hh)
diff --git a/Watchdog/src/EList_Iterator.types.hh b/Watchdog/src/EList_Iterator.types.hh
new file mode 100644
index 0000000..f3e3d91
--- /dev/null
+++ b/Watchdog/src/EList_Iterator.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PWL_EList_Iterator_types_hh
+#define PWL_EList_Iterator_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+template <typename T>
+class EList_Iterator;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_Iterator_types_hh)
diff --git a/Watchdog/src/Handler.defs.hh b/Watchdog/src/Handler.defs.hh
new file mode 100644
index 0000000..fdbc555
--- /dev/null
+++ b/Watchdog/src/Handler.defs.hh
@@ -0,0 +1,90 @@
+/* Handler and derived classes' declaration.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Handler_defs_hh
+#define PWL_Handler_defs_hh 1
+
+#include "Handler.types.hh"
+
+//! Abstract base class for handlers of the watchdog events.
+class Parma_Watchdog_Library::Handler {
+public:
+  //! Does the job.
+  virtual void act() const = 0;
+
+  //! Virtual destructor.
+  virtual ~Handler();
+};
+
+//! A kind of Handler that installs a flag onto a flag-holder.
+/*!
+  The templatic class Handler_Flag<Flag_Base, Flag> is an handler whose
+  job is to install a flag onto an <EM>holder</EM> for the flag.
+  The flag is of type \p Flag and the holder is a (volatile) pointer
+  to \p Flag_Base.  Installing the flag onto the holder means making
+  the holder point to the flag, so that it must be possible to assign
+  a value of type <CODE>Flag*</CODE> to an entity of type
+  <CODE>Flag_Base*</CODE>.
+  The class \p Flag must provide the method
+
+  \code
+    int priority() const
+  \endcode
+  returning an integer priority associated to the flag.
+
+  The handler will install its flag onto the holder only if the holder
+  is empty, namely, it is the null pointer, or if the holder holds a
+  flag of strictly lower priority.
+ */
+template <typename Flag_Base, typename Flag>
+class Parma_Watchdog_Library::Handler_Flag : virtual public Handler {
+public:
+  //! Constructor with a given function.
+  Handler_Flag(const Flag_Base* volatile& holder, Flag& flag);
+
+  //! Does its job: installs the flag onto the holder, if a flag with
+  //! an higher priority has not already been installed.
+  void act() const;
+
+private:
+  // declare holder as reference to volatile pointer to const Flag_Base
+  const Flag_Base* volatile& h;
+  Flag& f;
+};
+
+//! A kind of Handler calling a given function.
+class Parma_Watchdog_Library::Handler_Function : virtual public Handler {
+public:
+  //! Constructor with a given function.
+  Handler_Function(void (*function)());
+
+  //! Does its job: calls the embedded function.
+  void act() const;
+
+private:
+  //! Pointer to the embedded function.
+  void (*f)();
+};
+
+#include "Handler.inlines.hh"
+
+#endif // !defined(PWL_Handler_defs_hh)
diff --git a/Watchdog/src/Handler.inlines.hh b/Watchdog/src/Handler.inlines.hh
new file mode 100644
index 0000000..8ef1325
--- /dev/null
+++ b/Watchdog/src/Handler.inlines.hh
@@ -0,0 +1,57 @@
+/* Handler and derived classes' implementation: inline functions.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Handler_inlines_hh
+#define PWL_Handler_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+inline
+Handler::~Handler() {
+}
+
+template <typename Flag_Base, typename Flag>
+Handler_Flag<Flag_Base, Flag>::Handler_Flag(const Flag_Base* volatile& holder,
+					    Flag& flag)
+  : h(holder), f(flag) {
+}
+
+template <typename Flag_Base, typename Flag>
+void
+Handler_Flag<Flag_Base, Flag>::act() const {
+  if (h == 0 || static_cast<const Flag&>(*h).priority() < f.priority())
+    h = &f;
+}
+
+inline
+Handler_Function::Handler_Function(void (*function)())
+  : f(function) {
+}
+
+inline void
+Handler_Function::act() const {
+  (*f)();
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Handler_inlines_hh)
diff --git a/Watchdog/src/Handler.types.hh b/Watchdog/src/Handler.types.hh
new file mode 100644
index 0000000..fd81d28
--- /dev/null
+++ b/Watchdog/src/Handler.types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PWL_Handler_types_hh
+#define PWL_Handler_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Handler;
+
+template <typename Flag_Base, typename Flag>
+class Handler_Flag;
+
+class Handler_Function;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Handler_types_hh)
diff --git a/Watchdog/src/Makefile.am b/Watchdog/src/Makefile.am
new file mode 100644
index 0000000..9982382
--- /dev/null
+++ b/Watchdog/src/Makefile.am
@@ -0,0 +1,143 @@
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+# The ordering of the following list *matters*!
+INCLUDE_FILES = \
+Doubly_Linked_Object.types.hh \
+EList.types.hh \
+EList_Iterator.types.hh \
+Handler.types.hh \
+Pending_Element.types.hh \
+Pending_List.types.hh \
+Time.types.hh \
+Watchdog.types.hh \
+Handler.defs.hh \
+Handler.inlines.hh \
+Time.defs.hh \
+Time.inlines.hh \
+Doubly_Linked_Object.defs.hh \
+Doubly_Linked_Object.inlines.hh \
+EList_Iterator.defs.hh \
+EList_Iterator.inlines.hh \
+EList.defs.hh \
+EList.inlines.hh \
+Pending_Element.defs.hh \
+Pending_Element.inlines.hh \
+Pending_List.defs.hh \
+Pending_List.inlines.hh \
+Watchdog.defs.hh \
+Watchdog.inlines.hh
+
+SOURCE_FILES = \
+$(INCLUDE_FILES) \
+Pending_Element.cc \
+Pending_List.cc \
+Time.cc \
+Watchdog.cc
+
+EXTRA_DIST = \
+$(SOURCE_FILES) \
+pwl_header.hh
+
+if BUILD_WATCHDOG_LIBRARY
+
+# Libtool -version-info for libpwl.la.
+#
+#  1. Start with version information of `0:0:0' for each libtool library.
+#
+#  2. Update the version information only immediately before a public
+#     release of your software.  More frequent updates are unnecessary,
+#     and only guarantee that the current interface number gets larger
+#     faster.
+#
+#  3. If the library source code has changed at all since the last
+#     update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+#  4. If any interfaces have been added, removed, or changed since the
+#     last update, increment CURRENT, and set REVISION to 0.
+#
+#  5. If any interfaces have been added since the last public release,
+#     then increment AGE.
+#
+#  6. If any interfaces have been removed since the last public release,
+#     then set AGE to 0.
+#
+#	PWL release	(with PPL release)	-version-info
+#	    0.1			0.4		    0:0:0
+#	    0.2			0.5		    1:0:0
+#	    0.3			0.6		    2:0:0
+#	    0.4			0.7		    3:0:0
+
+LIBPWL_LT_CURRENT =  3
+LIBPWL_LT_REVISION = 0
+LIBPWL_LT_AGE =      0
+
+lib_LTLIBRARIES = libpwl.la
+libpwl_la_SOURCES = $(SOURCE_FILES)
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libpwl_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPWL_LT_CURRENT):$(LIBPWL_LT_REVISION):$(LIBPWL_LT_AGE)
+
+include_HEADERS = pwl.hh
+
+nodist_noinst_HEADERS = pwl_include_files.hh
+
+pwl_include_files.hh: $(INCLUDE_FILES) Makefile
+	rm -f $@
+	for file in $(INCLUDE_FILES); \
+	do \
+	  printf "#include \"%s\"\n" $$file >>$@; \
+	done
+
+if HAVE_PERL
+
+pwl.hh:	$(top_builddir)/config.h pwl_header.hh pwl_include_files.hh Makefile $(top_builddir)/utils/build_header
+	$(top_builddir)/utils/build_header \
+		-I $(top_builddir) -I $(top_builddir)/src \
+		$(top_srcdir)/src/pwl_header.hh >$@
+
+else !HAVE_PERL
+
+pwl.hh:	pwl.hh.dist
+	cp -f $< $@
+
+endif !HAVE_PERL
+
+BUILT_SOURCES = \
+$(include_HEADERS) \
+$(nodist_noinst_HEADERS)
+
+# pwl.hh is not distributed.
+# pwl.hh.dist, which is distributed, is a copy of pwl.hh.
+dist-hook:
+	mv -f $(distdir)/pwl.hh $(distdir)/pwl.hh.dist
+
+MOSTLYCLEANFILES = $(BUILT_SOURCES)
+
+endif BUILD_WATCHDOG_LIBRARY
diff --git a/Watchdog/src/Makefile.in b/Watchdog/src/Makefile.in
new file mode 100644
index 0000000..304b698
--- /dev/null
+++ b/Watchdog/src/Makefile.in
@@ -0,0 +1,644 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = src
+DIST_COMMON = $(am__include_HEADERS_DIST) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libpwl_la_LIBADD =
+am__libpwl_la_SOURCES_DIST = Doubly_Linked_Object.types.hh \
+	EList.types.hh EList_Iterator.types.hh Handler.types.hh \
+	Pending_Element.types.hh Pending_List.types.hh Time.types.hh \
+	Watchdog.types.hh Handler.defs.hh Handler.inlines.hh \
+	Time.defs.hh Time.inlines.hh Doubly_Linked_Object.defs.hh \
+	Doubly_Linked_Object.inlines.hh EList_Iterator.defs.hh \
+	EList_Iterator.inlines.hh EList.defs.hh EList.inlines.hh \
+	Pending_Element.defs.hh Pending_Element.inlines.hh \
+	Pending_List.defs.hh Pending_List.inlines.hh Watchdog.defs.hh \
+	Watchdog.inlines.hh Pending_Element.cc Pending_List.cc Time.cc \
+	Watchdog.cc
+am__objects_1 =
+am__objects_2 = $(am__objects_1) Pending_Element.lo Pending_List.lo \
+	Time.lo Watchdog.lo
+ at BUILD_WATCHDOG_LIBRARY_TRUE@am_libpwl_la_OBJECTS = $(am__objects_2)
+libpwl_la_OBJECTS = $(am_libpwl_la_OBJECTS)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@am_libpwl_la_rpath = -rpath $(libdir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libpwl_la_SOURCES)
+DIST_SOURCES = $(am__libpwl_la_SOURCES_DIST)
+am__include_HEADERS_DIST = pwl.hh
+includeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(include_HEADERS) $(nodist_noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+debug_flag = @debug_flag@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+
+# The ordering of the following list *matters*!
+INCLUDE_FILES = \
+Doubly_Linked_Object.types.hh \
+EList.types.hh \
+EList_Iterator.types.hh \
+Handler.types.hh \
+Pending_Element.types.hh \
+Pending_List.types.hh \
+Time.types.hh \
+Watchdog.types.hh \
+Handler.defs.hh \
+Handler.inlines.hh \
+Time.defs.hh \
+Time.inlines.hh \
+Doubly_Linked_Object.defs.hh \
+Doubly_Linked_Object.inlines.hh \
+EList_Iterator.defs.hh \
+EList_Iterator.inlines.hh \
+EList.defs.hh \
+EList.inlines.hh \
+Pending_Element.defs.hh \
+Pending_Element.inlines.hh \
+Pending_List.defs.hh \
+Pending_List.inlines.hh \
+Watchdog.defs.hh \
+Watchdog.inlines.hh
+
+SOURCE_FILES = \
+$(INCLUDE_FILES) \
+Pending_Element.cc \
+Pending_List.cc \
+Time.cc \
+Watchdog.cc
+
+EXTRA_DIST = \
+$(SOURCE_FILES) \
+pwl_header.hh
+
+
+# Libtool -version-info for libpwl.la.
+#
+#  1. Start with version information of `0:0:0' for each libtool library.
+#
+#  2. Update the version information only immediately before a public
+#     release of your software.  More frequent updates are unnecessary,
+#     and only guarantee that the current interface number gets larger
+#     faster.
+#
+#  3. If the library source code has changed at all since the last
+#     update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+#  4. If any interfaces have been added, removed, or changed since the
+#     last update, increment CURRENT, and set REVISION to 0.
+#
+#  5. If any interfaces have been added since the last public release,
+#     then increment AGE.
+#
+#  6. If any interfaces have been removed since the last public release,
+#     then set AGE to 0.
+#
+#	PWL release	(with PPL release)	-version-info
+#	    0.1			0.4		    0:0:0
+#	    0.2			0.5		    1:0:0
+#	    0.3			0.6		    2:0:0
+#	    0.4			0.7		    3:0:0
+ at BUILD_WATCHDOG_LIBRARY_TRUE@LIBPWL_LT_CURRENT = 3
+ at BUILD_WATCHDOG_LIBRARY_TRUE@LIBPWL_LT_REVISION = 0
+ at BUILD_WATCHDOG_LIBRARY_TRUE@LIBPWL_LT_AGE = 0
+ at BUILD_WATCHDOG_LIBRARY_TRUE@lib_LTLIBRARIES = libpwl.la
+ at BUILD_WATCHDOG_LIBRARY_TRUE@libpwl_la_SOURCES = $(SOURCE_FILES)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@NO_UNDEFINED_TRUE at NO_UNDEFINED_FLAG = -no-undefined
+ at BUILD_WATCHDOG_LIBRARY_TRUE@libpwl_la_LDFLAGS = \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@$(NO_UNDEFINED_FLAG) \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@-version-info $(LIBPWL_LT_CURRENT):$(LIBPWL_LT_REVISION):$(LIBPWL_LT_AGE)
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@include_HEADERS = pwl.hh
+ at BUILD_WATCHDOG_LIBRARY_TRUE@nodist_noinst_HEADERS = pwl_include_files.hh
+ at BUILD_WATCHDOG_LIBRARY_TRUE@BUILT_SOURCES = \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@$(include_HEADERS) \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@$(nodist_noinst_HEADERS)
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@MOSTLYCLEANFILES = $(BUILT_SOURCES)
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    f=$(am__strip_dir) \
+	    echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+	    $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+	  else :; fi; \
+	done
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  p=$(am__strip_dir) \
+	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+libpwl.la: $(libpwl_la_OBJECTS) $(libpwl_la_DEPENDENCIES) 
+	$(CXXLINK) $(am_libpwl_la_rpath) $(libpwl_la_LDFLAGS) $(libpwl_la_OBJECTS) $(libpwl_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Pending_Element.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Pending_List.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Time.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Watchdog.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)"
+	@list='$(include_HEADERS)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
+	  $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(include_HEADERS)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(includedir)/$$f"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ at BUILD_WATCHDOG_LIBRARY_FALSE@dist-hook:
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS
+
+install-exec-am: install-libLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-includeHEADERS uninstall-info-am \
+	uninstall-libLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-libLTLIBRARIES clean-libtool ctags dist-hook distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-exec \
+	install-exec-am install-includeHEADERS install-info \
+	install-info-am install-libLTLIBRARIES install-man \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags uninstall uninstall-am \
+	uninstall-includeHEADERS uninstall-info-am \
+	uninstall-libLTLIBRARIES
+
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@pwl_include_files.hh: $(INCLUDE_FILES) Makefile
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	rm -f $@
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	for file in $(INCLUDE_FILES); \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	do \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	  printf "#include \"%s\"\n" $$file >>$@; \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	done
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE at pwl.hh:	$(top_builddir)/config.h pwl_header.hh pwl_include_files.hh Makefile $(top_builddir)/utils/build_header
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE@	$(top_builddir)/utils/build_header \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE@		-I $(top_builddir) -I $(top_builddir)/src \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE@		$(top_srcdir)/src/pwl_header.hh >$@
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_FALSE at pwl.hh:	pwl.hh.dist
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_FALSE@	cp -f $< $@
+
+# pwl.hh is not distributed.
+# pwl.hh.dist, which is distributed, is a copy of pwl.hh.
+ at BUILD_WATCHDOG_LIBRARY_TRUE@dist-hook:
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	mv -f $(distdir)/pwl.hh $(distdir)/pwl.hh.dist
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Watchdog/src/Pending_Element.cc b/Watchdog/src/Pending_Element.cc
new file mode 100644
index 0000000..ea026e3
--- /dev/null
+++ b/Watchdog/src/Pending_Element.cc
@@ -0,0 +1,32 @@
+/* Pending_Element class implementation (non-inline functions).
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#include <config.h>
+
+#include "Pending_Element.defs.hh"
+
+namespace PWL = Parma_Watchdog_Library;
+
+bool
+PWL::Pending_Element::OK() const {
+  return d.OK();
+}
diff --git a/Watchdog/src/Pending_Element.defs.hh b/Watchdog/src/Pending_Element.defs.hh
new file mode 100644
index 0000000..76b1df5
--- /dev/null
+++ b/Watchdog/src/Pending_Element.defs.hh
@@ -0,0 +1,75 @@
+/* Pending_Element class declaration.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Pending_Element_defs_hh
+#define PWL_Pending_Element_defs_hh 1
+
+#include "Pending_Element.types.hh"
+#include "Doubly_Linked_Object.defs.hh"
+#include "Time.defs.hh"
+#include "Handler.types.hh"
+
+//! A class for pending watchdog events with embedded links.
+/*!
+  Each pending watchdog event is characterized by a deadline (a positive
+  time interval), an associated handler that will be invoked upon event
+  expiration, and a boolean flag that indicates whether the event has already
+  expired or not.
+*/
+class Parma_Watchdog_Library::Pending_Element : public Doubly_Linked_Object {
+public:
+  //! Constructs an element with the given attributes.
+  Pending_Element(const Time& deadline,
+		  const Handler& handler,
+		  bool& expired_flag);
+
+  //! Modifies \p *this so that it has the given attributes.
+  void assign(const Time& deadline,
+	      const Handler& handler,
+	      bool& expired_flag);
+
+  //! Returns the deadline of the event.
+  const Time& deadline() const;
+
+  //! Returns the handler associated to the event.
+  const Handler& handler() const;
+
+  //! Returns a reference to the "event-expired" flag.
+  bool& expired_flag() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! The deadline of the event.
+  Time d;
+
+  //! A pointer to the handler associated to the event.
+  const Handler* p_h;
+
+  //! A pointer to a flag saying whether the event has already expired or not.
+  bool* p_f;
+};
+
+#include "Pending_Element.inlines.hh"
+
+#endif // !defined(PWL_Pending_Element_defs_hh)
diff --git a/Watchdog/src/Pending_Element.inlines.hh b/Watchdog/src/Pending_Element.inlines.hh
new file mode 100644
index 0000000..42a1744
--- /dev/null
+++ b/Watchdog/src/Pending_Element.inlines.hh
@@ -0,0 +1,63 @@
+/* Pending_Element class implementation: inline functions.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Pending_Element_inlines_hh
+#define PWL_Pending_Element_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+inline
+Pending_Element::Pending_Element(const Time& deadline,
+				 const Handler& handler,
+				 bool& expired_flag)
+  : d(deadline), p_h(&handler), p_f(&expired_flag) {
+  assert(OK());
+}
+
+inline void
+Pending_Element::assign(const Time& deadline,
+			const Handler& handler,
+			bool& expired_flag) {
+  d = deadline;
+  p_h = &handler;
+  p_f = &expired_flag;
+  assert(OK());
+}
+
+inline const Time&
+Pending_Element::deadline() const {
+  return d;
+}
+
+inline const Handler&
+Pending_Element::handler() const {
+  return *p_h;
+}
+
+inline bool&
+Pending_Element::expired_flag() const {
+  return *p_f;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_Element_inlines_hh)
diff --git a/Watchdog/src/Pending_Element.types.hh b/Watchdog/src/Pending_Element.types.hh
new file mode 100644
index 0000000..7f8cb62
--- /dev/null
+++ b/Watchdog/src/Pending_Element.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PWL_Pending_Element_types_hh
+#define PWL_Pending_Element_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Pending_Element;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_Element_types_hh)
diff --git a/Watchdog/src/Pending_List.cc b/Watchdog/src/Pending_List.cc
new file mode 100644
index 0000000..5ce8a38
--- /dev/null
+++ b/Watchdog/src/Pending_List.cc
@@ -0,0 +1,75 @@
+/* Pending_List class implementation (non-inline functions).
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#include <config.h>
+
+#include "Pending_List.defs.hh"
+#include <iostream>
+
+namespace PWL = Parma_Watchdog_Library;
+
+PWL::Pending_List::Iterator
+PWL::Pending_List::insert(const Time& deadline,
+			  const Handler& handler,
+			  bool& expired_flag) {
+  Iterator position = active_list.begin();
+  for (Iterator active_list_end = active_list.end();
+       position != active_list_end && position->deadline() < deadline;
+       ++position)
+    ;
+  Iterator ppe;
+  // Only allocate a new element if the free list is empty.
+  if (free_list.empty())
+    ppe = new Pending_Element(deadline, handler, expired_flag);
+  else {
+    ppe = free_list.begin();
+    free_list.erase(ppe);
+    ppe->assign(deadline, handler, expired_flag);
+  }
+  Iterator r = active_list.insert(position, *ppe);
+  assert(OK());
+  return r;
+}
+
+bool
+PWL::Pending_List::OK() const {
+  if (!active_list.OK())
+    return false;
+
+  if (!free_list.OK())
+    return false;
+
+  Time t(0);
+  for (EList<Pending_Element>::Const_Iterator i = active_list.begin(),
+	 active_list_end = active_list.end(); i != active_list_end; ++i) {
+    const Time& d = i->deadline();
+    if (t > d) {
+#ifndef NDEBUG
+      std::cerr << "The active list is not sorted!"
+		<< std::endl;
+#endif
+      return false;
+    }
+    t = d;
+  }
+  return true;
+}
diff --git a/Watchdog/src/Pending_List.defs.hh b/Watchdog/src/Pending_List.defs.hh
new file mode 100644
index 0000000..366dcb7
--- /dev/null
+++ b/Watchdog/src/Pending_List.defs.hh
@@ -0,0 +1,74 @@
+/* Pending_List class declaration.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Pending_List_defs_hh
+#define PWL_Pending_List_defs_hh 1
+
+#include "Pending_List.types.hh"
+#include "Pending_Element.defs.hh"
+#include "EList.defs.hh"
+#include "Time.types.hh"
+#include "Handler.types.hh"
+
+//! An ordered list for recording pending watchdog events.
+class Parma_Watchdog_Library::Pending_List {
+public:
+  //! A non-const iterator to traverse the list.
+  typedef EList<Pending_Element>::Iterator Iterator;
+
+  //! Constructs an empty list.
+  Pending_List();
+
+  //! Destructor.
+  ~Pending_List();
+
+  //! Inserts a new Pending_Element object with the given attributes.
+  Iterator insert(const Time& deadline,
+		  const Handler& handler,
+		  bool& expired_flag);
+
+  /*! \brief
+    Removes the element pointed to by \p position, returning
+    an iterator pointing to the next element, if any, or end(), otherwise.
+  */
+  Iterator erase(Iterator position);
+
+  //! Returns <CODE>true</CODE> if and only if the list is empty.
+  bool empty() const;
+
+  //! Returns an iterator pointing to the beginning of the list.
+  Iterator begin();
+
+  //! Returns an iterator pointing one past the last element in the list.
+  Iterator end();
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  EList<Pending_Element> active_list;
+  EList<Pending_Element> free_list;
+};
+
+#include "Pending_List.inlines.hh"
+
+#endif // !defined(PWL_Pending_List_defs_hh)
diff --git a/Watchdog/src/Pending_List.inlines.hh b/Watchdog/src/Pending_List.inlines.hh
new file mode 100644
index 0000000..1486419
--- /dev/null
+++ b/Watchdog/src/Pending_List.inlines.hh
@@ -0,0 +1,65 @@
+/* Pending_List class implementation: inline functions.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Pending_List_inlines_hh
+#define PWL_Pending_List_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+inline
+Pending_List::Pending_List()
+  : active_list(),
+    free_list() {
+  assert(OK());
+}
+
+inline
+Pending_List::~Pending_List() {
+}
+
+inline Pending_List::Iterator
+Pending_List::begin() {
+  return active_list.begin();
+}
+
+inline Pending_List::Iterator
+Pending_List::end() {
+  return active_list.end();
+}
+
+inline bool
+Pending_List::empty() const {
+  return active_list.empty();
+}
+
+inline Pending_List::Iterator
+Pending_List::erase(Iterator position) {
+  assert(!empty());
+  Iterator next = active_list.erase(position);
+  free_list.push_back(*position);
+  assert(OK());
+  return next;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_List_inlines_hh)
diff --git a/Watchdog/src/Pending_List.types.hh b/Watchdog/src/Pending_List.types.hh
new file mode 100644
index 0000000..f784288
--- /dev/null
+++ b/Watchdog/src/Pending_List.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PWL_Pending_List_types_hh
+#define PWL_Pending_List_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Pending_List;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_List_types_hh)
diff --git a/Watchdog/src/Time.cc b/Watchdog/src/Time.cc
new file mode 100644
index 0000000..88fa378
--- /dev/null
+++ b/Watchdog/src/Time.cc
@@ -0,0 +1,32 @@
+/* Time class implementation (non-inline functions).
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#include <config.h>
+
+#include "Time.defs.hh"
+
+namespace PWL = Parma_Watchdog_Library;
+
+bool
+PWL::Time::OK() const {
+  return microsecs < 1000000;
+}
diff --git a/Watchdog/src/Time.defs.hh b/Watchdog/src/Time.defs.hh
new file mode 100644
index 0000000..ae27c8d
--- /dev/null
+++ b/Watchdog/src/Time.defs.hh
@@ -0,0 +1,111 @@
+/* Time class declaration.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Time_defs_hh
+#define PWL_Time_defs_hh 1
+
+#include "Time.types.hh"
+
+namespace Parma_Watchdog_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+bool operator==(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+bool operator!=(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is shorter than \p y.
+bool operator<(const Time& x, const Time& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x is shorter than
+  or equal to \p y.
+*/
+bool operator<=(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is longer than \p y.
+bool operator>(const Time& x, const Time& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x is longer than
+  or equal to \p y.
+*/
+bool operator>=(const Time& x, const Time& y);
+
+//! Returns the sum of \p x and \p y.
+Time operator+(const Time& x, const Time& y);
+
+/*! \brief
+  Returns the difference of \p x and \p y or the null interval,
+  if \p x is shorter than \p y.
+*/
+Time operator-(const Time& x, const Time& y);
+
+} // namespace Parma_Watchdog_Library
+
+//! A class for representing and manipulating positive time intervals.
+class Parma_Watchdog_Library::Time {
+public:
+  //! Zero seconds.
+  Time();
+
+  //! Constructor taking a number of hundredths of a second.
+  explicit Time(unsigned long hundredths_of_a_second);
+
+  //! Constructor with seconds and microseconds.
+  Time(unsigned long s, unsigned long m);
+
+  /*! \brief
+    Returns the number of whole seconds contained in the represented
+    time interval.
+  */
+  unsigned long seconds() const;
+
+  /*! \brief
+    Returns the number of microseconds that, when added to the number
+    of seconds returned by seconds(), give the represent time interval.
+  */
+  unsigned long microseconds() const;
+
+  //! Adds \p y to \p *this.
+  Time& operator+=(const Time& y);
+
+  /*! \brief
+    Subtracts \p y from \p *this; if \p *this is shorter than \p y,
+    \p *this is set to the null interval.
+  */
+  Time& operator-=(const Time& y);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! Number of seconds.
+  unsigned long secs;
+
+  //! Number of microseconds.
+  unsigned long microsecs;
+};
+
+#include "Time.inlines.hh"
+
+#endif // !defined(PWL_Time_defs_hh)
diff --git a/Watchdog/src/Time.inlines.hh b/Watchdog/src/Time.inlines.hh
new file mode 100644
index 0000000..8971c0f
--- /dev/null
+++ b/Watchdog/src/Time.inlines.hh
@@ -0,0 +1,144 @@
+/* Time class implementation: inline functions.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Time_inlines_hh
+#define PWL_Time_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Watchdog_Library {
+
+inline
+Time::Time()
+  : secs(0), microsecs(0) {
+  assert(OK());
+}
+
+inline
+Time::Time(unsigned long hundredths_of_a_second)
+  : secs(hundredths_of_a_second / 100),
+    microsecs((hundredths_of_a_second % 100) * 10000) {
+  assert(OK());
+}
+
+inline
+Time::Time(unsigned long s, unsigned long m)
+  : secs(s),
+    microsecs(m) {
+  if (microsecs >= 1000000) {
+    secs += microsecs / 1000000;
+    microsecs %= 1000000;
+  }
+  assert(OK());
+}
+
+inline unsigned long
+Time::seconds() const {
+  return secs;
+}
+
+inline unsigned long
+Time::microseconds() const {
+  return microsecs;
+}
+
+inline Time&
+Time::operator+=(const Time& y) {
+  unsigned long r_secs = secs + y.secs;
+  unsigned long r_microsecs = microsecs + y.microsecs;
+  if (r_microsecs >= 1000000) {
+    ++r_secs;
+    r_microsecs %= 1000000;
+  }
+  secs = r_secs;
+  microsecs = r_microsecs;
+  assert(OK());
+  return *this;
+}
+
+inline Time&
+Time::operator-=(const Time& y) {
+  long r_secs = secs - y.secs;
+  long r_microsecs = microsecs - y.microsecs;
+  if (r_microsecs < 0) {
+    --r_secs;
+    r_microsecs += 1000000;
+  }
+  if (r_secs < 0)
+    r_secs = r_microsecs = 0;
+  secs = r_secs;
+  microsecs = r_microsecs;
+  assert(OK());
+  return *this;
+}
+
+inline Time
+operator+(const Time& x, const Time& y) {
+  Time z = x;
+  z += y;
+  return z;
+}
+
+inline Time
+operator-(const Time& x, const Time& y) {
+  Time z = x;
+  z -= y;
+  return z;
+}
+
+inline bool
+operator==(const Time& x, const Time& y) {
+  assert(x.OK() && y.OK());
+  return x.seconds() == y.seconds() && y.microseconds() == y.microseconds();
+}
+
+inline bool
+operator!=(const Time& x, const Time& y) {
+  assert(x.OK() && y.OK());
+  return !(x == y);
+}
+
+inline bool
+operator<(const Time& x, const Time& y) {
+  assert(x.OK() && y.OK());
+  return x.seconds() < y.seconds()
+    || (x.seconds() == y.seconds() && x.microseconds() < y.microseconds());
+}
+
+inline bool
+operator<=(const Time& x, const Time& y) {
+  return x < y || x == y;
+}
+
+inline bool
+operator>(const Time& x, const Time& y) {
+  return y < x;
+}
+
+inline bool
+operator>=(const Time& x, const Time& y) {
+  return y <= x;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Time_inlines_hh)
diff --git a/Watchdog/src/Time.types.hh b/Watchdog/src/Time.types.hh
new file mode 100644
index 0000000..90698d1
--- /dev/null
+++ b/Watchdog/src/Time.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PWL_Time_types_hh
+#define PWL_Time_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Time;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Time_types_hh)
diff --git a/Watchdog/src/Watchdog.cc b/Watchdog/src/Watchdog.cc
new file mode 100644
index 0000000..49cbadd
--- /dev/null
+++ b/Watchdog/src/Watchdog.cc
@@ -0,0 +1,252 @@
+/* Watchdog and associated classes' implementation (non-inline functions).
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the CS at Parma software
+site: http://www.cs.unipr.it/Software/ . */
+
+#include <config.h>
+
+#include "Watchdog.defs.hh"
+
+#include <csignal>
+#include <iostream>
+#include <stdexcept>
+#include <cerrno>
+#include <string>
+#include <string.h>
+
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <ctime>
+#else
+# ifdef HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <ctime>
+# endif
+#endif
+
+// Cygwin only supports ITIMER_REAL.
+// Profiling does not work on programs that uses the ITIMER_PROF timer.
+#if defined(__CYGWIN__) || defined(PROFILING)
+#define THE_TIMER  ITIMER_REAL
+#define THE_SIGNAL SIGALRM
+#else
+#define THE_TIMER  ITIMER_PROF
+#define THE_SIGNAL SIGPROF
+#endif
+
+namespace PWL = Parma_Watchdog_Library;
+
+using std::cerr;
+using std::endl;
+
+// Pass this to getitimer.
+itimerval PWL::Watchdog::current_timer_status;
+
+// Pass this to setitimer.
+itimerval PWL::Watchdog::signal_once;
+
+// Last time value we set the timer to.
+PWL::Time PWL::Watchdog::last_time_requested;
+
+// Records the time elapsed since last fresh start.
+PWL::Time PWL::Watchdog::time_so_far;
+
+// The ordered queue of pending watchdog events.
+PWL::Pending_List PWL::Watchdog::pending;
+
+// Whether the alarm clock is running.
+volatile bool PWL::Watchdog::alarm_clock_running = false;
+
+// Whether we are changing data which are also changed by the signal handler.
+volatile bool PWL::Watchdog::in_critical_section = false;
+
+namespace {
+
+void
+throw_syscall_error(const char* syscall_name) {
+  throw std::runtime_error(std::string(syscall_name) + strerror(errno));
+}
+
+void
+my_getitimer(int which, struct itimerval* value) {
+  if (getitimer(which, value) != 0)
+    throw_syscall_error("getitimer");
+}
+
+void
+my_setitimer(int which,
+	     const struct itimerval* value, struct itimerval* ovalue) {
+  if (setitimer(which, value, ovalue) != 0)
+    throw_syscall_error("setitimer");
+}
+
+void
+my_sigaction(int signum,
+	     const struct sigaction* act, struct sigaction* oldact) {
+  if (sigaction(signum, act, oldact) != 0)
+    throw_syscall_error("sigaction");
+}
+
+} // namespace
+
+void
+PWL::Watchdog::get_timer(Time& time) {
+  my_getitimer(THE_TIMER, &current_timer_status);
+  time = Time(current_timer_status.it_value.tv_sec,
+	      current_timer_status.it_value.tv_usec);
+}
+
+void
+PWL::Watchdog::set_timer(const Time& time) {
+  if (time.seconds() == 0 && time.microseconds() == 0)
+    throw std::runtime_error("PWL internal error");
+  last_time_requested = time;
+  signal_once.it_value.tv_sec = time.seconds();
+  signal_once.it_value.tv_usec = time.microseconds();
+  my_setitimer(THE_TIMER, &signal_once, 0);
+}
+
+void
+PWL::Watchdog::stop_timer() {
+  signal_once.it_value.tv_sec = 0;
+  signal_once.it_value.tv_usec = 0;
+  my_setitimer(THE_TIMER, &signal_once, 0);
+}
+
+void
+PWL::Watchdog::handle_timeout(int) {
+  if (in_critical_section)
+    reschedule();
+  else {
+    time_so_far += last_time_requested;
+    if (!pending.empty()) {
+      Pending_List::Iterator i = pending.begin();
+      do {
+	i->handler().act();
+	i->expired_flag() = true;
+	i = pending.erase(i);
+      } while (i != pending.end() && i->deadline() <= time_so_far);
+      if (pending.empty())
+	alarm_clock_running = false;
+      else
+	set_timer((*pending.begin()).deadline() - time_so_far);
+    }
+    else
+      alarm_clock_running = false;
+  }
+}
+
+void
+PWL::PWL_handle_timeout(int signum) {
+  PWL::Watchdog::handle_timeout(signum);
+}
+
+PWL::Pending_List::Iterator
+PWL::Watchdog::new_watchdog_event(int units,
+				  const Handler& handler,
+				  bool& expired_flag) {
+  assert(units > 0);
+  Pending_List::Iterator position;
+  Time deadline(units);
+  if (!alarm_clock_running) {
+    position = pending.insert(deadline, handler, expired_flag);
+    time_so_far = Time(0);
+    set_timer(deadline);
+    alarm_clock_running = true;
+  }
+  else {
+    Time time_to_shoot;
+    get_timer(time_to_shoot);
+    Time elapsed_time(last_time_requested);
+    elapsed_time -= time_to_shoot;
+    Time current_time(time_so_far);
+    current_time += elapsed_time;
+    Time real_deadline(deadline);
+    real_deadline += current_time;
+    position = pending.insert(real_deadline, handler, expired_flag);
+    if (deadline < time_to_shoot) {
+      time_so_far = current_time;
+      set_timer(deadline);
+    }
+  }
+  return position;
+}
+
+void
+PWL::Watchdog::remove_watchdog_event(Pending_List::Iterator position) {
+  assert(!pending.empty());
+  if (position == pending.begin()) {
+    Pending_List::Iterator next = position;
+    ++next;
+    if (next != pending.end()) {
+      Time first_deadline(position->deadline());
+      Time next_deadline(next->deadline());
+      if (first_deadline != next_deadline) {
+	Time time_to_shoot;
+	get_timer(time_to_shoot);
+	Time elapsed_time(last_time_requested);
+	elapsed_time -= time_to_shoot;
+	time_so_far += elapsed_time;
+	next_deadline -= first_deadline;
+	time_to_shoot += next_deadline;
+	set_timer(time_to_shoot);
+      }
+    }
+    else {
+      stop_timer();
+      alarm_clock_running = false;
+    }
+  }
+  pending.erase(position);
+}
+
+PWL::Watchdog::~Watchdog() {
+  if (!expired) {
+    in_critical_section = true;
+    remove_watchdog_event(pending_position);
+    in_critical_section = false;
+  }
+  delete &handler;
+}
+
+void
+PWL::Watchdog::initialize() {
+  signal_once.it_interval.tv_sec = 0;
+  signal_once.it_interval.tv_usec = 0;
+
+  sigset_t mask;
+  sigemptyset(&mask);
+
+  struct sigaction s;
+  s.sa_handler = PWL_handle_timeout;
+  s.sa_mask = mask;
+  s.sa_flags = 0;  // Was SA_ONESHOT: why?
+
+  my_sigaction(THE_SIGNAL, &s, 0);
+}
+
+void
+PWL::Watchdog::finalize() {
+}
+
+PWL::Time PWL::Watchdog::reschedule_time(1);
+
+unsigned int PWL::Init::count = 0;
diff --git a/Watchdog/src/Watchdog.defs.hh b/Watchdog/src/Watchdog.defs.hh
new file mode 100644
index 0000000..d8b3464
--- /dev/null
+++ b/Watchdog/src/Watchdog.defs.hh
@@ -0,0 +1,139 @@
+/* Watchdog and associated classes' declaration and inline functions.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Watchdog_defs_hh
+#define PWL_Watchdog_defs_hh 1
+
+#include "Watchdog.types.hh"
+#include "Time.defs.hh"
+#include "Handler.types.hh"
+#include "Pending_List.defs.hh"
+#include <cassert>
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+namespace Parma_Watchdog_Library {
+
+// Set linkage now to declare it friend later.
+extern "C" void PWL_handle_timeout(int signum);
+
+//! A watchdog timer.
+class Watchdog {
+public:
+  template <typename Flag_Base, typename Flag>
+  Watchdog(int units, const Flag_Base* volatile& holder, Flag& flag);
+
+  Watchdog(int units, void (*function)());
+  ~Watchdog();
+
+
+private:
+  friend class Init;
+  static void initialize();
+  static void finalize();
+
+  bool expired;
+  const Handler& handler;
+  Pending_List::Iterator pending_position;
+
+private:
+  // Just to prevent their use.
+  Watchdog(const Watchdog&);
+  Watchdog& operator=(const Watchdog&);
+
+  // Pass this to getitimer.
+  static itimerval current_timer_status;
+
+  // Get the timer value.
+  static void get_timer(Time& time);
+
+  // Pass this to setitimer.
+  static itimerval signal_once;
+
+  // Last time value we set the timer to.
+  static Time last_time_requested;
+
+  // Set the timer value.
+  static void set_timer(const Time& time);
+
+  // Stops the timer.
+  static void stop_timer();
+
+  // Quick reschedule to avoid race conditions.
+  static void reschedule();
+
+  // Used by the above.
+  static Time reschedule_time;
+
+  // Records the time elapsed since last fresh start.
+  static Time time_so_far;
+
+  //! The ordered queue of pending watchdog events.
+  static Pending_List pending;
+
+  //! The actual signal handler.
+  static void handle_timeout(int);
+
+  // Handle the addition of a new watchdog event.
+  static Pending_List::Iterator new_watchdog_event(int units,
+						   const Handler& handler,
+						   bool& expired_flag);
+
+  // Handle the removal of a watchdog event.
+  void remove_watchdog_event(Pending_List::Iterator position);
+
+  // Whether the alarm clock is running.
+  static volatile bool alarm_clock_running;
+
+  // Whether we are changing data that is also changed by the signal handler.
+  static volatile bool in_critical_section;
+
+  friend void Parma_Watchdog_Library::PWL_handle_timeout(int signum);
+};
+
+class Init {
+private:
+  //! Count the number of objects created.
+  static unsigned int count;
+
+public:
+  //! Initializes the PWL.
+  Init();
+
+  //! Finalizes the PWL.
+  ~Init();
+};
+
+} // namespace Parma_Watchdog_Library
+
+#include "Watchdog.inlines.hh"
+
+namespace {
+
+Parma_Watchdog_Library::Init Parma_Watchdog_Library_initializer;
+
+} // namespace
+
+#endif // !defined(PWL_Watchdog_defs_hh)
+
diff --git a/Watchdog/src/Watchdog.inlines.hh b/Watchdog/src/Watchdog.inlines.hh
new file mode 100644
index 0000000..00b9878
--- /dev/null
+++ b/Watchdog/src/Watchdog.inlines.hh
@@ -0,0 +1,80 @@
+/* Watchdog and associated classes' implementation: inline functions.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the CS at Parma software
+site: http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Watchdog_inlines_hh
+#define PWL_Watchdog_inlines_hh 1
+
+#include <stdexcept>
+
+#include "Handler.defs.hh"
+
+namespace Parma_Watchdog_Library {
+
+inline void
+Watchdog::reschedule() {
+  set_timer(reschedule_time);
+}
+
+template <typename Flag_Base, typename Flag>
+Watchdog::Watchdog(int units, const Flag_Base* volatile& holder, Flag& flag)
+  : expired(false),
+    handler(*new Handler_Flag<Flag_Base, Flag>(holder, flag)) {
+  if (units <= 0)
+    throw std::invalid_argument("Watchdog constructor called with a"
+				" non-positive number of time units");
+  in_critical_section = true;
+  pending_position = new_watchdog_event(units, handler, expired);
+  in_critical_section = false;
+}
+
+inline
+Watchdog::Watchdog(int units, void (*function)())
+  : expired(false), handler(*new Handler_Function(function)) {
+  if (units <= 0)
+    throw std::invalid_argument("Watchdog constructor called with a"
+				" non-positive number of time units");
+  in_critical_section = true;
+  pending_position = new_watchdog_event(units, handler, expired);
+  in_critical_section = false;
+}
+
+inline
+Init::Init() {
+  // Only when the first Init object is constructed...
+  if (count++ == 0) {
+    // ... the library is initialized.
+    Watchdog::initialize();
+  }
+}
+
+inline
+Init::~Init() {
+  // Only when the last Init object is destroyed...
+  if (--count == 0) {
+    // ... the library is finalized.
+    Watchdog::finalize();
+  }
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Watchdog_inlines_hh)
diff --git a/Watchdog/src/Watchdog.types.hh b/Watchdog/src/Watchdog.types.hh
new file mode 100644
index 0000000..bbe1313
--- /dev/null
+++ b/Watchdog/src/Watchdog.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PWL_Watchdog_types_hh
+#define PWL_Watchdog_types_hh 1
+
+namespace Parma_Watchdog_Library {
+  class Watchdog;
+  class Flag;
+  class Init;
+}
+
+#endif // !defined(PWL_Watchdog_types_hh)
diff --git a/Watchdog/src/pwl.hh.dist b/Watchdog/src/pwl.hh.dist
new file mode 100644
index 0000000..6dc3767
--- /dev/null
+++ b/Watchdog/src/pwl.hh.dist
@@ -0,0 +1,1338 @@
+/* This is the header file of the Parma Watchdog Library.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the CS at Parma software
+site: http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_pwl_hh
+#define PWL_pwl_hh 1
+
+#ifdef NDEBUG
+# define PWL_SAVE_NDEBUG 1
+# undef NDEBUG
+#endif
+
+// Automatically generated from PPL source file ../config.h line 1
+/* config.h.  Generated by configure.  */
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `setitimer' function. */
+#define HAVE_SETITIMER 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Assertions are disabled when this is defined */
+#define NDEBUG 1
+
+/* Name of package */
+#define PACKAGE "watchdog"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "bagnara at cs.unipr.it"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "the Parma Watchdog Library"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "the Parma Watchdog Library 0.4"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "watchdog"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "0.4"
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* Version number of package */
+#define VERSION "0.4"
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+// Automatically generated from PPL source file ../src/Doubly_Linked_Object.types.hh line 1
+
+#ifndef PWL_Doubly_Linked_Object_types_hh
+#define PWL_Doubly_Linked_Object_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Doubly_Linked_Object;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Doubly_Linked_Object_types_hh)
+// Automatically generated from PPL source file ../src/EList.types.hh line 1
+
+#ifndef PWL_EList_types_hh
+#define PWL_EList_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+template <typename T>
+class EList;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_types_hh)
+// Automatically generated from PPL source file ../src/EList_Iterator.types.hh line 1
+
+#ifndef PWL_EList_Iterator_types_hh
+#define PWL_EList_Iterator_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+template <typename T>
+class EList_Iterator;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_Iterator_types_hh)
+// Automatically generated from PPL source file ../src/Handler.types.hh line 1
+
+#ifndef PWL_Handler_types_hh
+#define PWL_Handler_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Handler;
+
+template <typename Flag_Base, typename Flag>
+class Handler_Flag;
+
+class Handler_Function;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Handler_types_hh)
+// Automatically generated from PPL source file ../src/Pending_Element.types.hh line 1
+
+#ifndef PWL_Pending_Element_types_hh
+#define PWL_Pending_Element_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Pending_Element;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_Element_types_hh)
+// Automatically generated from PPL source file ../src/Pending_List.types.hh line 1
+
+#ifndef PWL_Pending_List_types_hh
+#define PWL_Pending_List_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Pending_List;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_List_types_hh)
+// Automatically generated from PPL source file ../src/Time.types.hh line 1
+
+#ifndef PWL_Time_types_hh
+#define PWL_Time_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Time;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Time_types_hh)
+// Automatically generated from PPL source file ../src/Watchdog.types.hh line 1
+
+#ifndef PWL_Watchdog_types_hh
+#define PWL_Watchdog_types_hh 1
+
+namespace Parma_Watchdog_Library {
+  class Watchdog;
+  class Flag;
+  class Init;
+}
+
+#endif // !defined(PWL_Watchdog_types_hh)
+// Automatically generated from PPL source file ../src/Handler.defs.hh line 1
+/* Handler and derived classes' declaration.
+*/
+
+#ifndef PWL_Handler_defs_hh
+#define PWL_Handler_defs_hh 1
+
+// Automatically generated from PPL source file ../src/Handler.defs.hh line 27
+
+//! Abstract base class for handlers of the watchdog events.
+class Parma_Watchdog_Library::Handler {
+public:
+  //! Does the job.
+  virtual void act() const = 0;
+
+  //! Virtual destructor.
+  virtual ~Handler();
+};
+
+//! A kind of Handler that installs a flag onto a flag-holder.
+/*!
+  The templatic class Handler_Flag<Flag_Base, Flag> is an handler whose
+  job is to install a flag onto an <EM>holder</EM> for the flag.
+  The flag is of type \p Flag and the holder is a (volatile) pointer
+  to \p Flag_Base.  Installing the flag onto the holder means making
+  the holder point to the flag, so that it must be possible to assign
+  a value of type <CODE>Flag*</CODE> to an entity of type
+  <CODE>Flag_Base*</CODE>.
+  The class \p Flag must provide the method
+
+  \code
+    int priority() const
+  \endcode
+  returning an integer priority associated to the flag.
+
+  The handler will install its flag onto the holder only if the holder
+  is empty, namely, it is the null pointer, or if the holder holds a
+  flag of strictly lower priority.
+ */
+template <typename Flag_Base, typename Flag>
+class Parma_Watchdog_Library::Handler_Flag : virtual public Handler {
+public:
+  //! Constructor with a given function.
+  Handler_Flag(const Flag_Base* volatile& holder, Flag& flag);
+
+  //! Does its job: installs the flag onto the holder, if a flag with
+  //! an higher priority has not already been installed.
+  void act() const;
+
+private:
+  // declare holder as reference to volatile pointer to const Flag_Base
+  const Flag_Base* volatile& h;
+  Flag& f;
+};
+
+//! A kind of Handler calling a given function.
+class Parma_Watchdog_Library::Handler_Function : virtual public Handler {
+public:
+  //! Constructor with a given function.
+  Handler_Function(void (*function)());
+
+  //! Does its job: calls the embedded function.
+  void act() const;
+
+private:
+  //! Pointer to the embedded function.
+  void (*f)();
+};
+
+// Automatically generated from PPL source file ../src/Handler.inlines.hh line 1
+/* Handler and derived classes' implementation: inline functions.
+*/
+
+#ifndef PWL_Handler_inlines_hh
+#define PWL_Handler_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+inline
+Handler::~Handler() {
+}
+
+template <typename Flag_Base, typename Flag>
+Handler_Flag<Flag_Base, Flag>::Handler_Flag(const Flag_Base* volatile& holder,
+					    Flag& flag)
+  : h(holder), f(flag) {
+}
+
+template <typename Flag_Base, typename Flag>
+void
+Handler_Flag<Flag_Base, Flag>::act() const {
+  if (h == 0 || static_cast<const Flag&>(*h).priority() < f.priority())
+    h = &f;
+}
+
+inline
+Handler_Function::Handler_Function(void (*function)())
+  : f(function) {
+}
+
+inline void
+Handler_Function::act() const {
+  (*f)();
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Handler_inlines_hh)
+// Automatically generated from PPL source file ../src/Handler.defs.hh line 89
+
+#endif // !defined(PWL_Handler_defs_hh)
+// Automatically generated from PPL source file ../src/Time.defs.hh line 1
+/* Time class declaration.
+*/
+
+#ifndef PWL_Time_defs_hh
+#define PWL_Time_defs_hh 1
+
+// Automatically generated from PPL source file ../src/Time.defs.hh line 27
+
+namespace Parma_Watchdog_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+bool operator==(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+bool operator!=(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is shorter than \p y.
+bool operator<(const Time& x, const Time& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x is shorter than
+  or equal to \p y.
+*/
+bool operator<=(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is longer than \p y.
+bool operator>(const Time& x, const Time& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x is longer than
+  or equal to \p y.
+*/
+bool operator>=(const Time& x, const Time& y);
+
+//! Returns the sum of \p x and \p y.
+Time operator+(const Time& x, const Time& y);
+
+/*! \brief
+  Returns the difference of \p x and \p y or the null interval,
+  if \p x is shorter than \p y.
+*/
+Time operator-(const Time& x, const Time& y);
+
+} // namespace Parma_Watchdog_Library
+
+//! A class for representing and manipulating positive time intervals.
+class Parma_Watchdog_Library::Time {
+public:
+  //! Zero seconds.
+  Time();
+
+  //! Constructor taking a number of hundredths of a second.
+  explicit Time(unsigned long hundredths_of_a_second);
+
+  //! Constructor with seconds and microseconds.
+  Time(unsigned long s, unsigned long m);
+
+  /*! \brief
+    Returns the number of whole seconds contained in the represented
+    time interval.
+  */
+  unsigned long seconds() const;
+
+  /*! \brief
+    Returns the number of microseconds that, when added to the number
+    of seconds returned by seconds(), give the represent time interval.
+  */
+  unsigned long microseconds() const;
+
+  //! Adds \p y to \p *this.
+  Time& operator+=(const Time& y);
+
+  /*! \brief
+    Subtracts \p y from \p *this; if \p *this is shorter than \p y,
+    \p *this is set to the null interval.
+  */
+  Time& operator-=(const Time& y);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! Number of seconds.
+  unsigned long secs;
+
+  //! Number of microseconds.
+  unsigned long microsecs;
+};
+
+// Automatically generated from PPL source file ../src/Time.inlines.hh line 1
+/* Time class implementation: inline functions.
+*/
+
+#ifndef PWL_Time_inlines_hh
+#define PWL_Time_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Watchdog_Library {
+
+inline
+Time::Time()
+  : secs(0), microsecs(0) {
+  assert(OK());
+}
+
+inline
+Time::Time(unsigned long hundredths_of_a_second)
+  : secs(hundredths_of_a_second / 100),
+    microsecs((hundredths_of_a_second % 100) * 10000) {
+  assert(OK());
+}
+
+inline
+Time::Time(unsigned long s, unsigned long m)
+  : secs(s),
+    microsecs(m) {
+  if (microsecs >= 1000000) {
+    secs += microsecs / 1000000;
+    microsecs %= 1000000;
+  }
+  assert(OK());
+}
+
+inline unsigned long
+Time::seconds() const {
+  return secs;
+}
+
+inline unsigned long
+Time::microseconds() const {
+  return microsecs;
+}
+
+inline Time&
+Time::operator+=(const Time& y) {
+  unsigned long r_secs = secs + y.secs;
+  unsigned long r_microsecs = microsecs + y.microsecs;
+  if (r_microsecs >= 1000000) {
+    ++r_secs;
+    r_microsecs %= 1000000;
+  }
+  secs = r_secs;
+  microsecs = r_microsecs;
+  assert(OK());
+  return *this;
+}
+
+inline Time&
+Time::operator-=(const Time& y) {
+  long r_secs = secs - y.secs;
+  long r_microsecs = microsecs - y.microsecs;
+  if (r_microsecs < 0) {
+    --r_secs;
+    r_microsecs += 1000000;
+  }
+  if (r_secs < 0)
+    r_secs = r_microsecs = 0;
+  secs = r_secs;
+  microsecs = r_microsecs;
+  assert(OK());
+  return *this;
+}
+
+inline Time
+operator+(const Time& x, const Time& y) {
+  Time z = x;
+  z += y;
+  return z;
+}
+
+inline Time
+operator-(const Time& x, const Time& y) {
+  Time z = x;
+  z -= y;
+  return z;
+}
+
+inline bool
+operator==(const Time& x, const Time& y) {
+  assert(x.OK() && y.OK());
+  return x.seconds() == y.seconds() && y.microseconds() == y.microseconds();
+}
+
+inline bool
+operator!=(const Time& x, const Time& y) {
+  assert(x.OK() && y.OK());
+  return !(x == y);
+}
+
+inline bool
+operator<(const Time& x, const Time& y) {
+  assert(x.OK() && y.OK());
+  return x.seconds() < y.seconds()
+    || (x.seconds() == y.seconds() && x.microseconds() < y.microseconds());
+}
+
+inline bool
+operator<=(const Time& x, const Time& y) {
+  return x < y || x == y;
+}
+
+inline bool
+operator>(const Time& x, const Time& y) {
+  return y < x;
+}
+
+inline bool
+operator>=(const Time& x, const Time& y) {
+  return y <= x;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Time_inlines_hh)
+// Automatically generated from PPL source file ../src/Time.defs.hh line 110
+
+#endif // !defined(PWL_Time_defs_hh)
+// Automatically generated from PPL source file ../src/Doubly_Linked_Object.defs.hh line 1
+/* Doubly_Linked_Object class declaration.
+*/
+
+#ifndef PWL_Doubly_Linked_Object_defs_hh
+#define PWL_Doubly_Linked_Object_defs_hh 1
+
+// Automatically generated from PPL source file ../src/Doubly_Linked_Object.defs.hh line 29
+
+//! A (base) class for doubly linked objects.
+class Parma_Watchdog_Library::Doubly_Linked_Object {
+public:
+  //! Default constructor.
+  Doubly_Linked_Object();
+
+  //! Creates a chain element with forward link \p f and backward link \p b.
+  Doubly_Linked_Object(Doubly_Linked_Object* f, Doubly_Linked_Object* b);
+
+  //! Inserts \p y before \p *this.
+  void insert_before(Doubly_Linked_Object& y);
+
+  //! Inserts \p y after \p *this.
+  void insert_after(Doubly_Linked_Object& y);
+
+  //! Erases \p *this from the chain and returns a pointer to the next element.
+  Doubly_Linked_Object* erase();
+
+  //! Erases \p *this from the chain.
+  ~Doubly_Linked_Object();
+
+private:
+  //! Forward link.
+  Doubly_Linked_Object* next;
+
+  //! Backward link.
+  Doubly_Linked_Object* prev;
+
+  template <typename T> friend class EList;
+  template <typename T> friend class EList_Iterator;
+};
+
+// Automatically generated from PPL source file ../src/Doubly_Linked_Object.inlines.hh line 1
+/* Doubly_Linked_Object class implementation: inline functions.
+*/
+
+#ifndef PWL_Doubly_Linked_Object_inlines_hh
+#define PWL_Doubly_Linked_Object_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+inline
+Doubly_Linked_Object::Doubly_Linked_Object() {
+}
+
+inline
+Doubly_Linked_Object::Doubly_Linked_Object(Doubly_Linked_Object* f,
+					   Doubly_Linked_Object* b)
+  : next(f),
+    prev(b) {
+}
+
+inline void
+Doubly_Linked_Object::insert_before(Doubly_Linked_Object& y) {
+  y.next = this;
+  y.prev = prev;
+  prev->next = &y;
+  prev = &y;
+}
+
+inline void
+Doubly_Linked_Object::insert_after(Doubly_Linked_Object& y) {
+  y.next = next;
+  y.prev = this;
+  next->prev = &y;
+  next = &y;
+}
+
+inline Doubly_Linked_Object*
+Doubly_Linked_Object::erase() {
+  next->prev = prev;
+  prev->next = next;
+  return next;
+}
+
+inline
+Doubly_Linked_Object::~Doubly_Linked_Object() {
+  erase();
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Doubly_Linked_Object_inlines_hh)
+// Automatically generated from PPL source file ../src/Doubly_Linked_Object.defs.hh line 63
+
+#endif // !defined(PWL_Doubly_Linked_Object_defs_hh)
+// Automatically generated from PPL source file ../src/EList_Iterator.defs.hh line 1
+/* EList_Iterator class declaration.
+*/
+
+#ifndef PWL_EList_Iterator_defs_hh
+#define PWL_EList_Iterator_defs_hh 1
+
+// Automatically generated from PPL source file ../src/EList_Iterator.defs.hh line 28
+
+namespace Parma_Watchdog_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+template <typename T>
+bool operator==(const EList_Iterator<T>& x, const EList_Iterator<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+template <typename T>
+bool operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y);
+
+} // namespace Parma_Watchdog_Library
+
+//! A class providing iterators for embedded lists.
+template <typename T>
+class Parma_Watchdog_Library::EList_Iterator {
+public:
+  //! Constructs an iterator pointing to nothing.
+  EList_Iterator();
+
+  //! Constructs an iterator pointing to \p p.
+  explicit EList_Iterator(Doubly_Linked_Object* p);
+
+  //! Changes \p *this so that it points to \p p.
+  EList_Iterator& operator=(Doubly_Linked_Object* p);
+
+  //! Indirect member selector.
+  T* operator->();
+
+  //! Dereference operator.
+  T& operator*();
+
+  //! Preincrement operator.
+  EList_Iterator& operator++();
+
+  //! Postincrement operator.
+  EList_Iterator operator++(int);
+
+  //! Predecrement operator.
+  EList_Iterator& operator--();
+
+  //! Postdecrement operator.
+  EList_Iterator operator--(int);
+
+private:
+  //! Embedded pointer.
+  Doubly_Linked_Object* ptr;
+
+  friend bool operator==<T>(const EList_Iterator& x, const EList_Iterator& y);
+
+  friend bool operator!=<T>(const EList_Iterator& x, const EList_Iterator& y);
+};
+
+// Automatically generated from PPL source file ../src/EList_Iterator.inlines.hh line 1
+/* EList_Iterator class implementation: inline functions.
+*/
+
+#ifndef PWL_EList_Iterator_inlines_hh
+#define PWL_EList_Iterator_inlines_hh 1
+
+// Automatically generated from PPL source file ../src/EList_Iterator.inlines.hh line 27
+
+namespace Parma_Watchdog_Library {
+
+template <typename T>
+inline
+EList_Iterator<T>::EList_Iterator() {
+}
+
+template <typename T>
+inline
+EList_Iterator<T>::EList_Iterator(Doubly_Linked_Object* p)
+  : ptr(p) {
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator=(Doubly_Linked_Object* p) {
+  ptr = p;
+  return *this;
+}
+
+template <typename T>
+inline T*
+EList_Iterator<T>::operator->() {
+  return static_cast<T*>(ptr);
+}
+
+template <typename T>
+inline T&
+EList_Iterator<T>::operator*() {
+  return *operator->();
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator++() {
+  ptr = ptr->next;
+  return *this;
+}
+
+template <typename T>
+inline EList_Iterator<T>
+EList_Iterator<T>::operator++(int) {
+  EList_Iterator tmp = *this;
+  ++*this;
+  return tmp;
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator--() {
+  ptr = ptr->prev;
+  return *this;
+}
+
+template <typename T>
+inline EList_Iterator<T>
+EList_Iterator<T>::operator--(int) {
+  EList_Iterator tmp = *this;
+  --*this;
+  return tmp;
+}
+
+template <typename T>
+inline bool
+operator==(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
+  return x.ptr == y.ptr;
+}
+
+template <typename T>
+inline bool
+operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
+  return x.ptr != y.ptr;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_Iterator_inlines_hh)
+// Automatically generated from PPL source file ../src/EList_Iterator.defs.hh line 82
+
+#endif // !defined(PWL_EList_Iterator_defs_hh)
+// Automatically generated from PPL source file ../src/EList.defs.hh line 1
+/* EList class declaration.
+*/
+
+#ifndef PWL_EList_defs_hh
+#define PWL_EList_defs_hh 1
+
+// Automatically generated from PPL source file ../src/EList.defs.hh line 28
+
+/*! \brief
+  A simple kind of embedded list (i.e., a doubly linked objects
+  where the links are embedded in the objects themselves).
+*/
+template <typename T>
+class Parma_Watchdog_Library::EList : private Doubly_Linked_Object {
+public:
+  //! A const iterator to traverse the list.
+  typedef EList_Iterator<const T> Const_Iterator;
+
+  //! A non-const iterator to traverse the list.
+  typedef EList_Iterator<T> Iterator;
+
+  //! Constructs an empty list.
+  EList();
+
+  //! Destructs the list and all the elements in it.
+  ~EList();
+
+  //! Pushes \p obj to the front of the list.
+  void push_front(T& obj);
+
+  //! Pushes \p obj to the back of the list.
+  void push_back(T& obj);
+
+  /*! \brief
+    Inserts \p obj jyst before \p position and returns an iterator
+    that points to the inserted object.
+  */
+  Iterator insert(Iterator position, T& obj);
+
+  /*! \brief
+    Removes the element pointed to by \p position, returning
+    an iterator pointing to the next element, if any, or end(), otherwise.
+  */
+  Iterator erase(Iterator position);
+
+  //! Returns <CODE>true</CODE> if and only if the list is empty.
+  bool empty() const;
+
+  //! Returns an iterator pointing to the beginning of the list.
+  Iterator begin();
+
+  //! Returns an iterator pointing one past the last element in the list.
+  Iterator end();
+
+  //! Returns a const iterator pointing to the beginning of the list.
+  Const_Iterator begin() const;
+
+  //! Returns a const iterator pointing one past the last element in the list.
+  Const_Iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+// Automatically generated from PPL source file ../src/EList.inlines.hh line 1
+/* EList class implementation: inline functions.
+*/
+
+#ifndef PWL_EList_inlines_hh
+#define PWL_EList_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+template <typename T>
+inline
+EList<T>::EList()
+  : Doubly_Linked_Object(this, this) {
+}
+
+template <typename T>
+inline void
+EList<T>::push_front(T& obj) {
+  next->insert_before(obj);
+}
+
+template <typename T>
+inline void
+EList<T>::push_back(T& obj) {
+  prev->insert_after(obj);
+}
+
+template <typename T>
+inline typename EList<T>::Iterator
+EList<T>::insert(Iterator position, T& obj) {
+  position->insert_before(obj);
+  return Iterator(&obj);
+}
+
+template <typename T>
+inline typename EList<T>::Iterator
+EList<T>::begin() {
+  return Iterator(next);
+}
+
+template <typename T>
+inline typename EList<T>::Iterator
+EList<T>::end() {
+  return Iterator(this);
+}
+
+template <typename T>
+inline typename EList<T>::Const_Iterator
+EList<T>::begin() const {
+  return Const_Iterator(next);
+}
+
+template <typename T>
+inline typename EList<T>::Const_Iterator
+EList<T>::end() const {
+  return Const_Iterator(const_cast<EList<T>*>(this));
+}
+
+template <typename T>
+inline bool
+EList<T>::empty() const {
+  return begin() == end();
+}
+
+template <typename T>
+inline typename EList<T>::Iterator
+EList<T>::erase(Iterator position) {
+  assert(!empty());
+  return Iterator(position->erase());
+}
+
+template <typename T>
+inline
+EList<T>::~EList() {
+  // Erase and deallocate all the elements.
+  for (Iterator i = begin(), lend = end(), next; i != lend; i = next) {
+    next = erase(i);
+    delete &*i;
+  }
+}
+
+template <typename T>
+inline bool
+EList<T>::OK() const {
+  for (Const_Iterator i = begin(), lend = end(); i != lend; ++i)
+    if (!i->OK())
+      return false;
+
+  return true;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_inlines_hh)
+// Automatically generated from PPL source file ../src/EList.defs.hh line 86
+
+#endif // !defined(PWL_EList_defs_hh)
+// Automatically generated from PPL source file ../src/Pending_Element.defs.hh line 1
+/* Pending_Element class declaration.
+*/
+
+#ifndef PWL_Pending_Element_defs_hh
+#define PWL_Pending_Element_defs_hh 1
+
+// Automatically generated from PPL source file ../src/Pending_Element.defs.hh line 30
+
+//! A class for pending watchdog events with embedded links.
+/*!
+  Each pending watchdog event is characterized by a deadline (a positive
+  time interval), an associated handler that will be invoked upon event
+  expiration, and a boolean flag that indicates whether the event has already
+  expired or not.
+*/
+class Parma_Watchdog_Library::Pending_Element : public Doubly_Linked_Object {
+public:
+  //! Constructs an element with the given attributes.
+  Pending_Element(const Time& deadline,
+		  const Handler& handler,
+		  bool& expired_flag);
+
+  //! Modifies \p *this so that it has the given attributes.
+  void assign(const Time& deadline,
+	      const Handler& handler,
+	      bool& expired_flag);
+
+  //! Returns the deadline of the event.
+  const Time& deadline() const;
+
+  //! Returns the handler associated to the event.
+  const Handler& handler() const;
+
+  //! Returns a reference to the "event-expired" flag.
+  bool& expired_flag() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! The deadline of the event.
+  Time d;
+
+  //! A pointer to the handler associated to the event.
+  const Handler* p_h;
+
+  //! A pointer to a flag saying whether the event has already expired or not.
+  bool* p_f;
+};
+
+// Automatically generated from PPL source file ../src/Pending_Element.inlines.hh line 1
+/* Pending_Element class implementation: inline functions.
+*/
+
+#ifndef PWL_Pending_Element_inlines_hh
+#define PWL_Pending_Element_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+inline
+Pending_Element::Pending_Element(const Time& deadline,
+				 const Handler& handler,
+				 bool& expired_flag)
+  : d(deadline), p_h(&handler), p_f(&expired_flag) {
+  assert(OK());
+}
+
+inline void
+Pending_Element::assign(const Time& deadline,
+			const Handler& handler,
+			bool& expired_flag) {
+  d = deadline;
+  p_h = &handler;
+  p_f = &expired_flag;
+  assert(OK());
+}
+
+inline const Time&
+Pending_Element::deadline() const {
+  return d;
+}
+
+inline const Handler&
+Pending_Element::handler() const {
+  return *p_h;
+}
+
+inline bool&
+Pending_Element::expired_flag() const {
+  return *p_f;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_Element_inlines_hh)
+// Automatically generated from PPL source file ../src/Pending_Element.defs.hh line 74
+
+#endif // !defined(PWL_Pending_Element_defs_hh)
+// Automatically generated from PPL source file ../src/Pending_List.defs.hh line 1
+/* Pending_List class declaration.
+*/
+
+#ifndef PWL_Pending_List_defs_hh
+#define PWL_Pending_List_defs_hh 1
+
+// Automatically generated from PPL source file ../src/Pending_List.defs.hh line 31
+
+//! An ordered list for recording pending watchdog events.
+class Parma_Watchdog_Library::Pending_List {
+public:
+  //! A non-const iterator to traverse the list.
+  typedef EList<Pending_Element>::Iterator Iterator;
+
+  //! Constructs an empty list.
+  Pending_List();
+
+  //! Destructor.
+  ~Pending_List();
+
+  //! Inserts a new Pending_Element object with the given attributes.
+  Iterator insert(const Time& deadline,
+		  const Handler& handler,
+		  bool& expired_flag);
+
+  /*! \brief
+    Removes the element pointed to by \p position, returning
+    an iterator pointing to the next element, if any, or end(), otherwise.
+  */
+  Iterator erase(Iterator position);
+
+  //! Returns <CODE>true</CODE> if and only if the list is empty.
+  bool empty() const;
+
+  //! Returns an iterator pointing to the beginning of the list.
+  Iterator begin();
+
+  //! Returns an iterator pointing one past the last element in the list.
+  Iterator end();
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  EList<Pending_Element> active_list;
+  EList<Pending_Element> free_list;
+};
+
+// Automatically generated from PPL source file ../src/Pending_List.inlines.hh line 1
+/* Pending_List class implementation: inline functions.
+*/
+
+#ifndef PWL_Pending_List_inlines_hh
+#define PWL_Pending_List_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+inline
+Pending_List::Pending_List()
+  : active_list(),
+    free_list() {
+  assert(OK());
+}
+
+inline
+Pending_List::~Pending_List() {
+}
+
+inline Pending_List::Iterator
+Pending_List::begin() {
+  return active_list.begin();
+}
+
+inline Pending_List::Iterator
+Pending_List::end() {
+  return active_list.end();
+}
+
+inline bool
+Pending_List::empty() const {
+  return active_list.empty();
+}
+
+inline Pending_List::Iterator
+Pending_List::erase(Iterator position) {
+  assert(!empty());
+  Iterator next = active_list.erase(position);
+  free_list.push_back(*position);
+  assert(OK());
+  return next;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_List_inlines_hh)
+// Automatically generated from PPL source file ../src/Pending_List.defs.hh line 73
+
+#endif // !defined(PWL_Pending_List_defs_hh)
+// Automatically generated from PPL source file ../src/Watchdog.defs.hh line 1
+/* Watchdog and associated classes' declaration and inline functions.
+*/
+
+#ifndef PWL_Watchdog_defs_hh
+#define PWL_Watchdog_defs_hh 1
+
+// Automatically generated from PPL source file ../src/Watchdog.defs.hh line 30
+#include <cassert>
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+namespace Parma_Watchdog_Library {
+
+// Set linkage now to declare it friend later.
+extern "C" void PWL_handle_timeout(int signum);
+
+//! A watchdog timer.
+class Watchdog {
+public:
+  template <typename Flag_Base, typename Flag>
+  Watchdog(int units, const Flag_Base* volatile& holder, Flag& flag);
+
+  Watchdog(int units, void (*function)());
+  ~Watchdog();
+
+
+private:
+  friend class Init;
+  static void initialize();
+  static void finalize();
+
+  bool expired;
+  const Handler& handler;
+  Pending_List::Iterator pending_position;
+
+private:
+  // Just to prevent their use.
+  Watchdog(const Watchdog&);
+  Watchdog& operator=(const Watchdog&);
+
+  // Pass this to getitimer.
+  static itimerval current_timer_status;
+
+  // Get the timer value.
+  static void get_timer(Time& time);
+
+  // Pass this to setitimer.
+  static itimerval signal_once;
+
+  // Last time value we set the timer to.
+  static Time last_time_requested;
+
+  // Set the timer value.
+  static void set_timer(const Time& time);
+
+  // Stops the timer.
+  static void stop_timer();
+
+  // Quick reschedule to avoid race conditions.
+  static void reschedule();
+
+  // Used by the above.
+  static Time reschedule_time;
+
+  // Records the time elapsed since last fresh start.
+  static Time time_so_far;
+
+  //! The ordered queue of pending watchdog events.
+  static Pending_List pending;
+
+  //! The actual signal handler.
+  static void handle_timeout(int);
+
+  // Handle the addition of a new watchdog event.
+  static Pending_List::Iterator new_watchdog_event(int units,
+						   const Handler& handler,
+						   bool& expired_flag);
+
+  // Handle the removal of a watchdog event.
+  void remove_watchdog_event(Pending_List::Iterator position);
+
+  // Whether the alarm clock is running.
+  static volatile bool alarm_clock_running;
+
+  // Whether we are changing data that is also changed by the signal handler.
+  static volatile bool in_critical_section;
+
+  friend void Parma_Watchdog_Library::PWL_handle_timeout(int signum);
+};
+
+class Init {
+private:
+  //! Count the number of objects created.
+  static unsigned int count;
+
+public:
+  //! Initializes the PWL.
+  Init();
+
+  //! Finalizes the PWL.
+  ~Init();
+};
+
+} // namespace Parma_Watchdog_Library
+
+// Automatically generated from PPL source file ../src/Watchdog.inlines.hh line 1
+/* Watchdog and associated classes' implementation: inline functions.
+*/
+
+#ifndef PWL_Watchdog_inlines_hh
+#define PWL_Watchdog_inlines_hh 1
+
+#include <stdexcept>
+
+// Automatically generated from PPL source file ../src/Watchdog.inlines.hh line 29
+
+namespace Parma_Watchdog_Library {
+
+inline void
+Watchdog::reschedule() {
+  set_timer(reschedule_time);
+}
+
+template <typename Flag_Base, typename Flag>
+Watchdog::Watchdog(int units, const Flag_Base* volatile& holder, Flag& flag)
+  : expired(false),
+    handler(*new Handler_Flag<Flag_Base, Flag>(holder, flag)) {
+  if (units <= 0)
+    throw std::invalid_argument("Watchdog constructor called with a"
+				" non-positive number of time units");
+  in_critical_section = true;
+  pending_position = new_watchdog_event(units, handler, expired);
+  in_critical_section = false;
+}
+
+inline
+Watchdog::Watchdog(int units, void (*function)())
+  : expired(false), handler(*new Handler_Function(function)) {
+  if (units <= 0)
+    throw std::invalid_argument("Watchdog constructor called with a"
+				" non-positive number of time units");
+  in_critical_section = true;
+  pending_position = new_watchdog_event(units, handler, expired);
+  in_critical_section = false;
+}
+
+inline
+Init::Init() {
+  // Only when the first Init object is constructed...
+  if (count++ == 0) {
+    // ... the library is initialized.
+    Watchdog::initialize();
+  }
+}
+
+inline
+Init::~Init() {
+  // Only when the last Init object is destroyed...
+  if (--count == 0) {
+    // ... the library is finalized.
+    Watchdog::finalize();
+  }
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Watchdog_inlines_hh)
+// Automatically generated from PPL source file ../src/Watchdog.defs.hh line 131
+
+namespace {
+
+Parma_Watchdog_Library::Init Parma_Watchdog_Library_initializer;
+
+} // namespace
+
+#endif // !defined(PWL_Watchdog_defs_hh)
+
+
+#ifdef PWL_SAVE_NDEBUG
+# define NDEBUG 1
+# undef PWL_SAVE_NDEBUG
+#else
+# undef NDEBUG
+#endif
+#include <cassert>
+
+#undef PACKAGE
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#undef VERSION
+
+#endif
diff --git a/Watchdog/src/pwl_header.hh b/Watchdog/src/pwl_header.hh
new file mode 100644
index 0000000..69eef10
--- /dev/null
+++ b/Watchdog/src/pwl_header.hh
@@ -0,0 +1,50 @@
+/* This is the header file of the Parma Watchdog Library.
+   Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the CS at Parma software
+site: http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_pwl_hh
+#define PWL_pwl_hh 1
+
+#ifdef NDEBUG
+# define PWL_SAVE_NDEBUG 1
+# undef NDEBUG
+#endif
+
+#include "config.h"
+#include "pwl_include_files.hh"
+
+#ifdef PWL_SAVE_NDEBUG
+# define NDEBUG 1
+# undef PWL_SAVE_NDEBUG
+#else
+# undef NDEBUG
+#endif
+#include <cassert>
+
+#undef PACKAGE
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#undef VERSION
+
+#endif
diff --git a/Watchdog/utils/Makefile.am b/Watchdog/utils/Makefile.am
new file mode 100644
index 0000000..6fc0edc
--- /dev/null
+++ b/Watchdog/utils/Makefile.am
@@ -0,0 +1,45 @@
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+dist_noinst_SCRIPTS = \
+build_header.in
+
+noinst_SCRIPTS = \
+build_header
+
+# Even if the scripts listed in noinst_SCRIPTS are not distributed
+# (only the corresponding *.in files are), we need them to actually
+# generating the distribution.  Using dist-hook is the best solution
+# we came up with to obtain this effect.
+dist-hook: $(noinst_SCRIPTS)
+
+generated_automatically = Generated automatically: \
+do not modify; modify the .in file instead.
+
+do_subst = sed -e 's,[@]PERL[@],$(PERL),g' \
+	-e 's,[@]generated_automatically[@],$(generated_automatically),g'
+
+build_header: build_header.in Makefile
+	$(do_subst) < $(srcdir)/build_header.in > build_header
+	chmod +x build_header
+
+CLEANFILES = $(noinst_SCRIPTS)
diff --git a/Watchdog/utils/Makefile.in b/Watchdog/utils/Makefile.in
new file mode 100644
index 0000000..89fc943
--- /dev/null
+++ b/Watchdog/utils/Makefile.in
@@ -0,0 +1,374 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = utils
+DIST_COMMON = $(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SCRIPTS = $(dist_noinst_SCRIPTS) $(noinst_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+debug_flag = @debug_flag@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+dist_noinst_SCRIPTS = \
+build_header.in
+
+noinst_SCRIPTS = \
+build_header
+
+generated_automatically = Generated automatically: \
+do not modify; modify the .in file instead.
+
+do_subst = sed -e 's,[@]PERL[@],$(PERL),g' \
+	-e 's,[@]generated_automatically[@],$(generated_automatically),g'
+
+CLEANFILES = $(noinst_SCRIPTS)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  utils/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  utils/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+check-am: all-am
+check: check-am
+all-am: Makefile $(SCRIPTS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	dist-hook distclean distclean-generic distclean-libtool \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am uninstall-info-am
+
+
+# Even if the scripts listed in noinst_SCRIPTS are not distributed
+# (only the corresponding *.in files are), we need them to actually
+# generating the distribution.  Using dist-hook is the best solution
+# we came up with to obtain this effect.
+dist-hook: $(noinst_SCRIPTS)
+
+build_header: build_header.in Makefile
+	$(do_subst) < $(srcdir)/build_header.in > build_header
+	chmod +x build_header
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Watchdog/utils/build_header.in b/Watchdog/utils/build_header.in
new file mode 100644
index 0000000..4ebe2f3
--- /dev/null
+++ b/Watchdog/utils/build_header.in
@@ -0,0 +1,102 @@
+#! @PERL@
+# -*- Perl -*-
+# @generated_automatically@
+
+eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
+    if 0;
+
+# Builds a self-contained C++ header file by performing recursive inclusion.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+sub filter($$$$);
+sub filter($$$$) {
+    my ($file, $dirs, $level, $files) = @_;
+    return if (exists($$files{$file}));
+    $$files{$file} = undef;
+    my $fh;
+    open $fh, $file or die "Cannot open $file";
+    my $comment = 0;
+    my $copyright = 0;
+    my $print_from = 1;
+    while (my $line = <$fh>) {
+	my $iname;
+	if (($iname) = ($line =~ '^\s*#include\s+"([^"]+)"\s*\n$')) {
+	    my $lineno = $.;
+	    my $ifile;
+	    foreach my $idir (@$dirs) {
+		$ifile = $idir . '/' . $iname;
+		last if -e $ifile;
+	    }
+	    filter($ifile, $dirs, $level+1, $files);
+	    $print_from = 1;
+	    next;
+	}
+	if ($level > 0) {
+	    if ($print_from) {
+		print "// Automatically generated from PPL source file $file line $.\n";
+		$print_from = 0;
+	    }
+	    next if ($line =~ '^\s*#ifndef\s+PPL_[A-Za-z0-9_]+_hh\s*$');
+	    next if ($line =~ '^\s*#define\s+PPL_[A-Za-z0-9_]+_hh(\s+1)?\s*$');
+	    next if ($line =~ '^\s*#endif\s*//\s*!defined\(PPL_[A-Za-z0-9_]+_hh\)\s*$');
+	    if ($line =~ '/\*') {
+		$comment = 1;
+	    }
+	    if ($comment && $line =~ 'Copyright.*Roberto Bagnara <bagnara at cs.unipr.it>') {
+		$copyright = 1;
+		print "*/\n" unless $line =~ '/\*';
+	    }
+	    if ($line =~ '\*/') {
+		$comment = 0;
+		if ($copyright) {
+		    $copyright = 0;
+		    next;
+		}
+	    }
+	    next if $copyright;
+	}
+	print $line;
+    }
+    close $fh;
+
+}
+
+
+my @dirs;
+
+unless (GetOptions("I=s" => \@dirs) && @ARGV == 1) {
+    print STDERR "Usage: $0 [-I dir]... file\n";
+    exit;
+}
+my $file = $ARGV[0];
+
+my ($dir, $name) = ($file =~ '^(?:(.*)/)?([^/]+)$');
+$dir = '.' unless defined($dir);
+unshift @dirs, $dir; 
+
+my %files;
+
+filter($file, \@dirs, 0, \%files);
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..dccda82
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,7241 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+
+# serial 48 AC_PROG_LIBTOOL
+
+
+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
+# -----------------------------------------------------------
+# If this macro is not defined by Autoconf, define it here.
+m4_ifdef([AC_PROVIDE_IFELSE],
+         [],
+         [m4_define([AC_PROVIDE_IFELSE],
+	         [m4_ifdef([AC_PROVIDE_$1],
+		           [$2], [$3])])])
+
+
+# AC_PROG_LIBTOOL
+# ---------------
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
+dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
+dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
+  AC_PROVIDE_IFELSE([AC_PROG_CXX],
+    [AC_LIBTOOL_CXX],
+    [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
+  ])])
+dnl And a similar setup for Fortran 77 support
+  AC_PROVIDE_IFELSE([AC_PROG_F77],
+    [AC_LIBTOOL_F77],
+    [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
+])])
+
+dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
+dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
+dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
+  AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+    [AC_LIBTOOL_GCJ],
+    [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+      [AC_LIBTOOL_GCJ],
+      [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
+	[AC_LIBTOOL_GCJ],
+      [ifdef([AC_PROG_GCJ],
+	     [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+       ifdef([A][M_PROG_GCJ],
+	     [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+       ifdef([LT_AC_PROG_GCJ],
+	     [define([LT_AC_PROG_GCJ],
+		defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
+])])# AC_PROG_LIBTOOL
+
+
+# _AC_PROG_LIBTOOL
+# ----------------
+AC_DEFUN([_AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])# _AC_PROG_LIBTOOL
+
+
+# AC_LIBTOOL_SETUP
+# ----------------
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.50)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+
+AC_LIBTOOL_SYS_MAX_CMD_LEN
+AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+AC_LIBTOOL_OBJDIR
+
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+_LT_AC_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
+
+# Same as above, but do not quote variable references.
+[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+AC_CHECK_TOOL(AR, ar, false)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    AC_PATH_MAGIC
+  fi
+  ;;
+esac
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE([libtool-lock],
+    [AC_HELP_STRING([--disable-libtool-lock],
+	[avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+AC_ARG_WITH([pic],
+    [AC_HELP_STRING([--with-pic],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [pic_mode="$withval"],
+    [pic_mode=default])
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+AC_LIBTOOL_LANG_C_CONFIG
+_LT_AC_TAGCONFIG
+])# AC_LIBTOOL_SETUP
+
+
+# _LT_AC_SYS_COMPILER
+# -------------------
+AC_DEFUN([_LT_AC_SYS_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_AC_SYS_COMPILER
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+AC_DEFUN([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+AC_DEFUN([_LT_COMPILER_BOILERPLATE],
+[ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+AC_DEFUN([_LT_LINKER_BOILERPLATE],
+[ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+])# _LT_LINKER_BOILERPLATE
+
+
+# _LT_AC_SYS_LIBPATH_AIX
+# ----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
+[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_AC_SYS_LIBPATH_AIX
+
+
+# _LT_AC_SHELL_INIT(ARG)
+# ----------------------
+AC_DEFUN([_LT_AC_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+	 [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_AC_SHELL_INIT
+
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[_LT_AC_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+  ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X[$]1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+[$]*
+EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+  for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+    if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+       echo_test_string=`eval $cmd` &&
+       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+    then
+      break
+    fi
+  done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+   test "X$echo_testing_string" = "X$echo_test_string"; then
+  :
+else
+  # The Solaris, AIX, and Digital Unix default echo programs unquote
+  # backslashes.  This makes it impossible to quote backslashes using
+  #   echo "$something" | sed 's/\\/\\\\/g'
+  #
+  # So, first we look for a working echo in the user's PATH.
+
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for dir in $PATH /usr/ucb; do
+    IFS="$lt_save_ifs"
+    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      echo="$dir/echo"
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+
+  if test "X$echo" = Xecho; then
+    # We didn't find a better echo, so look for alternatives.
+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      # This shell has a builtin print -r that does the trick.
+      echo='print -r'
+    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+	 test "X$CONFIG_SHELL" != X/bin/ksh; then
+      # If we have ksh, try running configure again with it.
+      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+      export ORIGINAL_CONFIG_SHELL
+      CONFIG_SHELL=/bin/ksh
+      export CONFIG_SHELL
+      exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+    else
+      # Try using printf.
+      echo='printf %s\n'
+      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+	 test "X$echo_testing_string" = "X$echo_test_string"; then
+	# Cool, printf works
+	:
+      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	export CONFIG_SHELL
+	SHELL="$CONFIG_SHELL"
+	export SHELL
+	echo="$CONFIG_SHELL [$]0 --fallback-echo"
+      elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	echo="$CONFIG_SHELL [$]0 --fallback-echo"
+      else
+	# maybe with a smaller string...
+	prev=:
+
+	for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+	  then
+	    break
+	  fi
+	  prev="$cmd"
+	done
+
+	if test "$prev" != 'sed 50q "[$]0"'; then
+	  echo_test_string=`eval $prev`
+	  export echo_test_string
+	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+	else
+	  # Oops.  We lost completely, so just stick with echo.
+	  echo=echo
+	fi
+      fi
+    fi
+  fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+   ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+])])# _LT_AC_PROG_ECHO_BACKSLASH
+
+
+# _LT_AC_LOCK
+# -----------
+AC_DEFUN([_LT_AC_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+    [AC_HELP_STRING([--disable-libtool-lock],
+	[avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *ELF-32*)
+      HPUX_IA64_MODE="32"
+      ;;
+    *ELF-64*)
+      HPUX_IA64_MODE="64"
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+   if test "$lt_cv_prog_gnu_ld" = yes; then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -melf32bsmip"
+      ;;
+    *N32*)
+      LD="${LD-ld} -melf32bmipn32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -melf64bmip"
+      ;;
+    esac
+   else
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -32"
+      ;;
+    *N32*)
+      LD="${LD-ld} -n32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -64"
+      ;;
+    esac
+   fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *32-bit*)
+      case $host in
+        x86_64-*linux*)
+          LD="${LD-ld} -m elf_i386"
+          ;;
+        ppc64-*linux*|powerpc64-*linux*)
+          LD="${LD-ld} -m elf32ppclinux"
+          ;;
+        s390x-*linux*)
+          LD="${LD-ld} -m elf_s390"
+          ;;
+        sparc64-*linux*)
+          LD="${LD-ld} -m elf32_sparc"
+          ;;
+      esac
+      ;;
+    *64-bit*)
+      case $host in
+        x86_64-*linux*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        ppc*-*linux*|powerpc*-*linux*)
+          LD="${LD-ld} -m elf64ppc"
+          ;;
+        s390*-*linux*)
+          LD="${LD-ld} -m elf64_s390"
+          ;;
+        sparc*-*linux*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)    LD="${LD-ld} -64" ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+  ])
+esac
+
+need_locks="$enable_libtool_lock"
+
+])# _LT_AC_LOCK
+
+
+# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+  ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $rm conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    ifelse([$5], , :, [$5])
+else
+    ifelse([$6], , :, [$6])
+fi
+])# AC_LIBTOOL_COMPILER_OPTION
+
+
+# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                          [ACTION-SUCCESS], [ACTION-FAILURE])
+# ------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
+[AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   printf "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $rm conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    ifelse([$4], , :, [$4])
+else
+    ifelse([$5], , :, [$5])
+fi
+])# AC_LIBTOOL_LINKER_OPTION
+
+
+# AC_LIBTOOL_SYS_MAX_CMD_LEN
+# --------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
+[# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ 	]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    # If test is not a shell built-in, we'll probably end up computing a
+    # maximum length that is only half of the actual maximum length, but
+    # we can't tell.
+    SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+    while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
+	       = "XX$teststring") >/dev/null 2>&1 &&
+	    new_result=`expr "X$teststring" : ".*" 2>&1` &&
+	    lt_cv_sys_max_cmd_len=$new_result &&
+	    test $i != 17 # 1/2 MB should be enough
+    do
+      i=`expr $i + 1`
+      teststring=$teststring$teststring
+    done
+    teststring=
+    # Add a significant safety factor because C++ compilers can tack on massive
+    # amounts of additional arguments before passing them to the linker.
+    # It appears as though 1/2 is a usable value.
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+])# AC_LIBTOOL_SYS_MAX_CMD_LEN
+
+
+# _LT_AC_CHECK_DLFCN
+# ------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)dnl
+])# _LT_AC_CHECK_DLFCN
+
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                           ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ---------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+    exit (status);
+}]
+EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_AC_TRY_DLOPEN_SELF
+
+
+# AC_LIBTOOL_DLOPEN_SELF
+# ----------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+   ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+   ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+   ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_AC_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+    	  lt_cv_dlopen_self_static, [dnl
+	  _LT_AC_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+])# AC_LIBTOOL_DLOPEN_SELF
+
+
+# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
+# ---------------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler
+AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+])
+])# AC_LIBTOOL_PROG_CC_C_O
+
+
+# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
+# -----------------------------------------
+# Check to see if we can do hard links to lock some files if needed
+AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
+[AC_REQUIRE([_LT_AC_LOCK])dnl
+
+hard_links="nottested"
+if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
+
+
+# AC_LIBTOOL_OBJDIR
+# -----------------
+AC_DEFUN([AC_LIBTOOL_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+])# AC_LIBTOOL_OBJDIR
+
+
+# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
+# ----------------------------------------------
+# Check hardcoding attributes.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_AC_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
+   test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
+   test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_AC_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_AC_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
+
+
+# AC_LIBTOOL_SYS_LIB_STRIP
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
+[striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+   darwin*)
+       if test -n "$STRIP" ; then
+         striplib="$STRIP -x"
+         AC_MSG_RESULT([yes])
+       else
+  AC_MSG_RESULT([no])
+fi
+       ;;
+   *)
+  AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+])# AC_LIBTOOL_SYS_LIB_STRIP
+
+
+# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
+[AC_MSG_CHECKING([dynamic linker characteristics])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+  if test "$GCC" = yes; then
+    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+  else
+    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+  fi
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+kfreebsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[123]]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  freebsd*) # from 4.6 on
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix3*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+knetbsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+
+
+# _LT_AC_TAGCONFIG
+# ----------------
+AC_DEFUN([_LT_AC_TAGCONFIG],
+[AC_ARG_WITH([tags],
+    [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
+        [include additional configurations @<:@automatic@:>@])],
+    [tagnames="$withval"])
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+  if test ! -f "${ofile}"; then
+    AC_MSG_WARN([output file `$ofile' does not exist])
+  fi
+
+  if test -z "$LTCC"; then
+    eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+    if test -z "$LTCC"; then
+      AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
+    else
+      AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
+    fi
+  fi
+  if test -z "$LTCFLAGS"; then
+    eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+  fi
+
+  # Extract list of available tagged configurations in $ofile.
+  # Note that this assumes the entire list is on one line.
+  available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+  lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+  for tagname in $tagnames; do
+    IFS="$lt_save_ifs"
+    # Check whether tagname contains only valid characters
+    case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
+    "") ;;
+    *)  AC_MSG_ERROR([invalid tag name: $tagname])
+	;;
+    esac
+
+    if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+    then
+      AC_MSG_ERROR([tag name \"$tagname\" already exists])
+    fi
+
+    # Update the list of available tags.
+    if test -n "$tagname"; then
+      echo appending configuration tag \"$tagname\" to $ofile
+
+      case $tagname in
+      CXX)
+	if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+	    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+	    (test "X$CXX" != "Xg++"))) ; then
+	  AC_LIBTOOL_LANG_CXX_CONFIG
+	else
+	  tagname=""
+	fi
+	;;
+
+      F77)
+	if test -n "$F77" && test "X$F77" != "Xno"; then
+	  AC_LIBTOOL_LANG_F77_CONFIG
+	else
+	  tagname=""
+	fi
+	;;
+
+      GCJ)
+	if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+	  AC_LIBTOOL_LANG_GCJ_CONFIG
+	else
+	  tagname=""
+	fi
+	;;
+
+      RC)
+	AC_LIBTOOL_LANG_RC_CONFIG
+	;;
+
+      *)
+	AC_MSG_ERROR([Unsupported tag name: $tagname])
+	;;
+      esac
+
+      # Append the new tag name to the list of available tags.
+      if test -n "$tagname" ; then
+      available_tags="$available_tags $tagname"
+    fi
+    fi
+  done
+  IFS="$lt_save_ifs"
+
+  # Now substitute the updated list of available tags.
+  if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+    mv "${ofile}T" "$ofile"
+    chmod +x "$ofile"
+  else
+    rm -f "${ofile}T"
+    AC_MSG_ERROR([unable to update list of available tagged configurations.])
+  fi
+fi
+])# _LT_AC_TAGCONFIG
+
+
+# AC_LIBTOOL_DLOPEN
+# -----------------
+# enable checks for dlopen support
+AC_DEFUN([AC_LIBTOOL_DLOPEN],
+ [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_DLOPEN
+
+
+# AC_LIBTOOL_WIN32_DLL
+# --------------------
+# declare package support for building win32 DLLs
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_WIN32_DLL
+
+
+# AC_ENABLE_SHARED([DEFAULT])
+# ---------------------------
+# implement the --enable-shared flag
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([shared],
+    [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]AC_ENABLE_SHARED_DEFAULT)
+])# AC_ENABLE_SHARED
+
+
+# AC_DISABLE_SHARED
+# -----------------
+# set the default shared flag to --disable-shared
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)
+])# AC_DISABLE_SHARED
+
+
+# AC_ENABLE_STATIC([DEFAULT])
+# ---------------------------
+# implement the --enable-static flag
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([static],
+    [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]AC_ENABLE_STATIC_DEFAULT)
+])# AC_ENABLE_STATIC
+
+
+# AC_DISABLE_STATIC
+# -----------------
+# set the default static flag to --disable-static
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)
+])# AC_DISABLE_STATIC
+
+
+# AC_ENABLE_FAST_INSTALL([DEFAULT])
+# ---------------------------------
+# implement the --enable-fast-install flag
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([fast-install],
+    [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT)
+])# AC_ENABLE_FAST_INSTALL
+
+
+# AC_DISABLE_FAST_INSTALL
+# -----------------------
+# set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)
+])# AC_DISABLE_FAST_INSTALL
+
+
+# AC_LIBTOOL_PICMODE([MODE])
+# --------------------------
+# implement the --with-pic flag
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)
+])# AC_LIBTOOL_PICMODE
+
+
+# AC_PROG_EGREP
+# -------------
+# This is predefined starting with Autoconf 2.54, so this conditional
+# definition can be removed once we require Autoconf 2.54 or later.
+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
+   [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+    then ac_cv_prog_egrep='grep -E'
+    else ac_cv_prog_egrep='egrep'
+    fi])
+ EGREP=$ac_cv_prog_egrep
+ AC_SUBST([EGREP])
+])])
+
+
+# AC_PATH_TOOL_PREFIX
+# -------------------
+# find a file program which can recognise shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="ifelse([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+])# AC_PATH_TOOL_PREFIX
+
+
+# AC_PATH_MAGIC
+# -------------
+# find a file program which can recognise a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# AC_PATH_MAGIC
+
+
+# AC_PROG_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([AC_PROG_LD],
+[AC_ARG_WITH([gnu-ld],
+    [AC_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])
+AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_PROG_LD_GNU
+])# AC_PROG_LD
+
+
+# AC_PROG_LD_GNU
+# --------------
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# AC_PROG_LD_GNU
+
+
+# AC_PROG_LD_RELOAD_FLAG
+# ----------------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+])# AC_PROG_LD_RELOAD_FLAG
+
+
+# AC_DEPLIBS_CHECK_METHOD
+# -----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognise dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump'.
+  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | kfreebsd*-gnu | dragonfly*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix3*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+nto-qnx*)
+  lt_cv_deplibs_check_method=unknown
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+])# AC_DEPLIBS_CHECK_METHOD
+
+
+# AC_PROG_NM
+# ----------
+# find the pathname to a BSD-compatible name lister
+AC_DEFUN([AC_PROG_NM],
+[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then 
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi])
+NM="$lt_cv_path_NM"
+])# AC_PROG_NM
+
+
+# AC_CHECK_LIBM
+# -------------
+# check for math library
+AC_DEFUN([AC_CHECK_LIBM],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+])# AC_CHECK_LIBM
+
+
+# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments.  Note that
+# AC_CONFIG_SUBDIRS is not called here.  If DIRECTORY is not provided,
+# it is assumed to be `libltdl'.  LIBLTDL will be prefixed with
+# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/'
+# (note the single quotes!).  If your package is not flat and you're not
+# using automake, define top_builddir and top_srcdir appropriately in
+# the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+  case $enable_ltdl_convenience in
+  no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+  "") enable_ltdl_convenience=yes
+      ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+  esac
+  LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+  LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+  # For backwards non-gettext consistent compatibility...
+  INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_CONVENIENCE
+
+
+# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl installable library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments.  Note that
+# AC_CONFIG_SUBDIRS is not called here.  If DIRECTORY is not provided,
+# and an installed libltdl is not found, it is assumed to be `libltdl'.
+# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with
+# '${top_srcdir}/' (note the single quotes!).  If your package is not
+# flat and you're not using automake, define top_builddir and top_srcdir
+# appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+  AC_CHECK_LIB(ltdl, lt_dlinit,
+  [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+  [if test x"$enable_ltdl_install" = xno; then
+     AC_MSG_WARN([libltdl not installed, but installation disabled])
+   else
+     enable_ltdl_install=yes
+   fi
+  ])
+  if test x"$enable_ltdl_install" = x"yes"; then
+    ac_configure_args="$ac_configure_args --enable-ltdl-install"
+    LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+    LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+  else
+    ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+    LIBLTDL="-lltdl"
+    LTDLINCL=
+  fi
+  # For backwards non-gettext consistent compatibility...
+  INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_INSTALLABLE
+
+
+# AC_LIBTOOL_CXX
+# --------------
+# enable support for C++ libraries
+AC_DEFUN([AC_LIBTOOL_CXX],
+[AC_REQUIRE([_LT_AC_LANG_CXX])
+])# AC_LIBTOOL_CXX
+
+
+# _LT_AC_LANG_CXX
+# ---------------
+AC_DEFUN([_LT_AC_LANG_CXX],
+[AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
+])# _LT_AC_LANG_CXX
+
+# _LT_AC_PROG_CXXCPP
+# ------------------
+AC_DEFUN([_LT_AC_PROG_CXXCPP],
+[
+AC_REQUIRE([AC_PROG_CXX])
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+fi
+])# _LT_AC_PROG_CXXCPP
+
+# AC_LIBTOOL_F77
+# --------------
+# enable support for Fortran 77 libraries
+AC_DEFUN([AC_LIBTOOL_F77],
+[AC_REQUIRE([_LT_AC_LANG_F77])
+])# AC_LIBTOOL_F77
+
+
+# _LT_AC_LANG_F77
+# ---------------
+AC_DEFUN([_LT_AC_LANG_F77],
+[AC_REQUIRE([AC_PROG_F77])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
+])# _LT_AC_LANG_F77
+
+
+# AC_LIBTOOL_GCJ
+# --------------
+# enable support for GCJ libraries
+AC_DEFUN([AC_LIBTOOL_GCJ],
+[AC_REQUIRE([_LT_AC_LANG_GCJ])
+])# AC_LIBTOOL_GCJ
+
+
+# _LT_AC_LANG_GCJ
+# ---------------
+AC_DEFUN([_LT_AC_LANG_GCJ],
+[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
+    [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
+      [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
+	 [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
+	   [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
+])# _LT_AC_LANG_GCJ
+
+
+# AC_LIBTOOL_RC
+# -------------
+# enable support for Windows resource files
+AC_DEFUN([AC_LIBTOOL_RC],
+[AC_REQUIRE([LT_AC_PROG_RC])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
+])# AC_LIBTOOL_RC
+
+
+# AC_LIBTOOL_LANG_C_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
+AC_DEFUN([_LT_AC_LANG_C_CONFIG],
+[lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF
+
+# Report which library types will actually be built
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+
+aix4* | aix5*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+    ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_C_CONFIG
+
+
+# AC_LIBTOOL_LANG_CXX_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
+AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
+[AC_LANG_PUSH(C++)
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Dependencies to place before and after the object being linked:
+_LT_AC_TAGVAR(predep_objects, $1)=
+_LT_AC_TAGVAR(postdep_objects, $1)=
+_LT_AC_TAGVAR(predeps, $1)=
+_LT_AC_TAGVAR(postdeps, $1)=
+_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+  lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+  $as_unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+  lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+  $as_unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+else
+  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+fi
+
+if test "$GXX" = yes; then
+  # Set up default GNU C++ configuration
+
+  AC_PROG_LD
+
+  # Check if GNU C++ uses GNU ld as the underlying linker, since the
+  # archiving commands below assume that GNU ld is being used.
+  if test "$with_gnu_ld" = yes; then
+    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+    #     investigate it a little bit more. (MM)
+    wlarc='${wl}'
+
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+	grep 'no-whole-archive' > /dev/null; then
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    with_gnu_ld=no
+    wlarc=
+
+    # A generic and very simple default shared library creation
+    # command for GNU C++ for the case where it uses the native
+    # linker, instead of GNU ld.  If possible, this setting should
+    # overridden to take advantage of the native linker features on
+    # the platform it is being used on.
+    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+  fi
+
+  # Commands to make compiler produce verbose output that lists
+  # what "hidden" libraries, object files and flags are used when
+  # linking a shared library.
+  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+  GXX=no
+  with_gnu_ld=no
+  wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+_LT_AC_TAGVAR(ld_shlibs, $1)=yes
+case $host_os in
+  aix3*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  aix4* | aix5*)
+    if test "$host_cpu" = ia64; then
+      # On IA64, the linker does run time linking by default, so we don't
+      # have to do anything special.
+      aix_use_runtimelinking=no
+      exp_sym_flag='-Bexport'
+      no_entry_flag=""
+    else
+      aix_use_runtimelinking=no
+
+      # Test if we are trying to use run time linking or normal
+      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+      # need to do runtime linking.
+      case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+	for ld_flag in $LDFLAGS; do
+	  case $ld_flag in
+	  *-brtl*)
+	    aix_use_runtimelinking=yes
+	    break
+	    ;;
+	  esac
+	done
+	;;
+      esac
+
+      exp_sym_flag='-bexport'
+      no_entry_flag='-bnoentry'
+    fi
+
+    # When large executables or shared objects are built, AIX ld can
+    # have problems creating the table of contents.  If linking a library
+    # or program results in "error TOC overflow" add -mminimal-toc to
+    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+    _LT_AC_TAGVAR(archive_cmds, $1)=''
+    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+    _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+    if test "$GXX" = yes; then
+      case $host_os in aix4.[[012]]|aix4.[[012]].*)
+      # We only want to do this on AIX 4.2 and lower, the check
+      # below for broken collect2 doesn't work under 4.3+
+	collect2name=`${CC} -print-prog-name=collect2`
+	if test -f "$collect2name" && \
+	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	then
+	  # We have reworked collect2
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+	else
+	  # We have old collect2
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+	fi
+	;;
+      esac
+      shared_flag='-shared'
+      if test "$aix_use_runtimelinking" = yes; then
+	shared_flag="$shared_flag "'${wl}-G'
+      fi
+    else
+      # not using gcc
+      if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	shared_flag='-G'
+      else
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag='${wl}-G'
+	else
+	  shared_flag='${wl}-bM:SRE'
+	fi
+      fi
+    fi
+
+    # It seems that -bexpall does not export symbols beginning with
+    # underscore (_), so it is better to generate a list of symbols to export.
+    _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+    if test "$aix_use_runtimelinking" = yes; then
+      # Warning - without using the other runtime loading flags (-brtl),
+      # -berok will link without error, but may produce a broken library.
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+      # Determine the default libpath from the value encoded in an empty executable.
+      _LT_AC_SYS_LIBPATH_AIX
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+     else
+      if test "$host_cpu" = ia64; then
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+      else
+	# Determine the default libpath from the value encoded in an empty executable.
+	_LT_AC_SYS_LIBPATH_AIX
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	# Warning - without using the other run time loading flags,
+	# -berok will link without error, but may produce a broken library.
+	_LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	# Exported symbols can be pulled into shared objects from archives
+	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+	# This is similar to how AIX traditionally builds its shared libraries.
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+      fi
+    fi
+    ;;
+
+  beos*)
+    if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+      # support --undefined.  This deserves some investigation.  FIXME
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    else
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    fi
+    ;;
+
+  chorus*)
+    case $cc_basename in
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+    # as there is no search path for DLLs.
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+    _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+    _LT_AC_TAGVAR(always_export_symbols, $1)=no
+    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+    if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      # If the export-symbols file already is a .def file (1st line
+      # is EXPORTS), use it as is; otherwise, prepend...
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	cp $export_symbols $output_objdir/$soname.def;
+      else
+	echo EXPORTS > $output_objdir/$soname.def;
+	cat $export_symbols >> $output_objdir/$soname.def;
+      fi~
+      $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+    else
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    fi
+  ;;
+      darwin* | rhapsody*)
+        case $host_os in
+        rhapsody* | darwin1.[[012]])
+         _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[[012]])
+               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+        esac
+      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_AC_TAGVAR(hardcode_direct, $1)=no
+      _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+    if test "$GXX" = yes ; then
+      lt_int_apple_cc_single_mod=no
+      output_verbose_link_cmd='echo'
+      if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
+       lt_int_apple_cc_single_mod=yes
+      fi
+      if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+       _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      else
+          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+        fi
+        _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+        # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+          if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+            _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          else
+            _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          fi
+            _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+          _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+          _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         _LT_AC_TAGVAR(ld_shlibs, $1)=no
+          ;;
+      esac
+      fi
+        ;;
+
+  dgux*)
+    case $cc_basename in
+      ec++*)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      ghcx*)
+	# Green Hills C++ Compiler
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  freebsd[[12]]*)
+    # C++ shared libraries reported to be fairly broken before switch to ELF
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  freebsd-elf*)
+    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+    ;;
+  freebsd* | kfreebsd*-gnu | dragonfly*)
+    # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+    # conventions
+    _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+    ;;
+  gnu*)
+    ;;
+  hpux9*)
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+    _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				# but as the default
+				# location of the library.
+
+    case $cc_basename in
+    CC*)
+      # FIXME: insert proper C++ library support
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    aCC*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      #
+      # There doesn't appear to be a way to prevent this compiler from
+      # explicitly linking system object files so we need to strip them
+      # from the output so that they don't get included in the library
+      # dependencies.
+      output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+      ;;
+    *)
+      if test "$GXX" = yes; then
+        _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+        # FIXME: insert proper C++ library support
+        _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+    ;;
+  hpux10*|hpux11*)
+    if test $with_gnu_ld = no; then
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+      case $host_cpu in
+      hppa*64*|ia64*)
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+        ;;
+      *)
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        ;;
+      esac
+    fi
+    case $host_cpu in
+    hppa*64*|ia64*)
+      _LT_AC_TAGVAR(hardcode_direct, $1)=no
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+    *)
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					      # but as the default
+					      # location of the library.
+      ;;
+    esac
+
+    case $cc_basename in
+      CC*)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      aCC*)
+	case $host_cpu in
+	hppa*64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	esac
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes; then
+	  if test $with_gnu_ld = no; then
+	    case $host_cpu in
+	    hppa*64*)
+	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    ia64*)
+	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    *)
+	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    esac
+	  fi
+	else
+	  # FIXME: insert proper C++ library support
+	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+    esac
+    ;;
+  interix3*)
+    _LT_AC_TAGVAR(hardcode_direct, $1)=no
+    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+    # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+    # Instead, shared libraries are loaded at an image base (0x10000000 by
+    # default) and relocated if they conflict, which is a slow very memory
+    # consuming and fragmenting process.  To avoid this, we pick a random,
+    # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+    # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+    ;;
+  irix5* | irix6*)
+    case $cc_basename in
+      CC*)
+	# SGI C++
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	# Archives containing C++ object files must be created using
+	# "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	# necessary to make sure instantiated templates are included
+	# in the archive.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	;;
+      *)
+	if test "$GXX" = yes; then
+	  if test "$with_gnu_ld" = no; then
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	  else
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+	  fi
+	fi
+	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+	;;
+    esac
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+    ;;
+  linux*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	# Archives containing C++ object files must be created using
+	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	;;
+      icpc*)
+	# Intel C++
+	with_gnu_ld=yes
+	# version 8.0 and above of icpc choke on multiply defined symbols
+	# if we add $predep_objects and $postdep_objects, however 7.1 and
+	# earlier do not add the objects themselves.
+	case `$CC -V 2>&1` in
+	*"Version 7."*)
+  	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+  	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  ;;
+	*)  # Version 8.0 or newer
+	  tmp_idyn=
+	  case $host_cpu in
+	    ia64*) tmp_idyn=' -i_dynamic';;
+	  esac
+  	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  ;;
+	esac
+	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	;;
+      pgCC*)
+        # Portland Group C++ compiler
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+  	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+        ;;
+      cxx*)
+	# Compaq C++
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	runpath_var=LD_RUN_PATH
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+    esac
+    ;;
+  lynxos*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  m88k*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  mvs*)
+    case $cc_basename in
+      cxx*)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+      wlarc=
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+    fi
+    # Workaround some broken pre-1.5 toolchains
+    output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+    ;;
+  openbsd2*)
+    # C++ shared libraries are fairly broken
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  openbsd*)
+    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    fi
+    output_verbose_link_cmd='echo'
+    ;;
+  osf3*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Archives containing C++ object files must be created using
+	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+
+	;;
+      RCC*)
+	# Rational C++ 2.4.1
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      cxx*)
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	  # Commands to make compiler produce verbose output that lists
+	  # what "hidden" libraries, object files and flags are used when
+	  # linking a shared library.
+	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+	else
+	  # FIXME: insert proper C++ library support
+	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+    esac
+    ;;
+  osf4* | osf5*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Archives containing C++ object files must be created using
+	# the KAI C++ compiler.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
+	;;
+      RCC*)
+	# Rational C++ 2.4.1
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      cxx*)
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	  echo "-hidden">> $lib.exp~
+	  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp  `test -n "$verstring" && echo -set_version	$verstring` -update_registry ${output_objdir}/so_locations -o $lib~
+	  $rm $lib.exp'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	 _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	  # Commands to make compiler produce verbose output that lists
+	  # what "hidden" libraries, object files and flags are used when
+	  # linking a shared library.
+	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+	else
+	  # FIXME: insert proper C++ library support
+	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+    esac
+    ;;
+  psos*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  sunos4*)
+    case $cc_basename in
+      CC*)
+	# Sun C++ 4.x
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      lcc*)
+	# Lucid
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  solaris*)
+    case $cc_basename in
+      CC*)
+	# Sun C++ 4.2, 5.x and Centerline C++
+        _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes
+	_LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	$CC -G${allow_undefined_flag}  ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+	case $host_os in
+	  solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	  *)
+	    # The C++ compiler is used as linker so we must use $wl
+	    # flag to pass the commands to the underlying system
+	    # linker. We must also pass each convience library through
+	    # to the system linker between allextract/defaultextract.
+	    # The C++ compiler will combine linker options so we
+	    # cannot just pass the convience library names through
+	    # without $wl.
+	    # Supported since Solaris 2.6 (maybe 2.5.1?)
+	    _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
+	    ;;
+	esac
+	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+	output_verbose_link_cmd='echo'
+
+	# Archives containing C++ object files must be created using
+	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	# necessary to make sure instantiated templates are included
+	# in the archive.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	;;
+      gcx*)
+	# Green Hills C++ Compiler
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	# The C++ compiler must be used to create the archive.
+	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	;;
+      *)
+	# GNU C++ compiler with Solaris linker
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	  if $CC --version | grep -v '^2\.7' > /dev/null; then
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+	  else
+	    # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	    # platform.
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+	  fi
+
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	fi
+	;;
+    esac
+    ;;
+  sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+    _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+    runpath_var='LD_RUN_PATH'
+
+    case $cc_basename in
+      CC*)
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      *)
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+    esac
+    ;;
+  sysv5* | sco3.2v5* | sco5v6*)
+    # Note: We can NOT use -z defs as we might desire, because we do not
+    # link with -lc, and that would cause any symbols used from libc to
+    # always be unresolved, which means just about no library would
+    # ever link correctly.  If we're not using GNU ld we use -z text
+    # though, which does catch some bad symbols but isn't as heavy-handed
+    # as -z defs.
+    # For security reasons, it is highly recommended that you always
+    # use absolute paths for naming shared libraries, and exclude the
+    # DT_RUNPATH tag from executables and libraries.  But doing so
+    # requires that you compile everything twice, which is a pain.
+    # So that behaviour is only enabled if SCOABSPATH is set to a
+    # non-empty value in the environment.  Most likely only useful for
+    # creating official distributions of packages.
+    # This is a hack until libtool officially supports absolute path
+    # names for shared libraries.
+    _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+    _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+    _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+    runpath_var='LD_RUN_PATH'
+
+    case $cc_basename in
+      CC*)
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      *)
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+    esac
+    ;;
+  tandem*)
+    case $cc_basename in
+      NCC*)
+	# NonStop-UX NCC 3.20
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	;;
+    esac
+    ;;
+  vxworks*)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+  *)
+    # FIXME: insert proper C++ library support
+    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+    ;;
+esac
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$GXX"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_POSTDEP_PREDEP($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+])# AC_LIBTOOL_LANG_CXX_CONFIG
+
+# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
+# ------------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
+int a;
+void foo (void) { a = 0; }
+EOF
+],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+EOF
+],[$1],[F77],[cat > conftest.$ac_ext <<EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+EOF
+],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  # The `*' in the case matches for architectures that use `case' in
+  # $output_verbose_cmd can trigger glob expansion during the loop
+  # eval without this substitution.
+  output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+  for p in `eval $output_verbose_link_cmd`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" \
+	  || test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_AC_TAGVAR(postdeps, $1)"; then
+	   _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_AC_TAGVAR(predep_objects, $1)"; then
+	   _LT_AC_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
+	   _LT_AC_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$rm -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+ifelse([$1],[CXX],
+[case $host_os in
+interix3*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_AC_TAGVAR(predep_objects,$1)=
+  _LT_AC_TAGVAR(postdep_objects,$1)=
+  _LT_AC_TAGVAR(postdeps,$1)=
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun'
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_AC_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+])# AC_LIBTOOL_POSTDEP_PREDEP
+
+# AC_LIBTOOL_LANG_F77_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
+AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
+[AC_REQUIRE([AC_PROG_F77])
+AC_LANG_PUSH(Fortran 77)
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="      subroutine t\n      return\n      end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="      program t\n      end\n"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+aix4* | aix5*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+  ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+_LT_AC_TAGVAR(GCC, $1)="$G77"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_F77_CONFIG
+
+
+# AC_LIBTOOL_LANG_GCJ_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
+AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_GCJ_CONFIG
+
+
+# AC_LIBTOOL_LANG_RC_CONFIG
+# -------------------------
+# Ensure that the configuration vars for the Windows resource compiler are
+# suitably defined.  Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
+AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_RC_CONFIG
+
+
+# AC_LIBTOOL_CONFIG([TAGNAME])
+# ----------------------------
+# If TAGNAME is not passed, then create an initial libtool script
+# with a default configuration from the untagged config vars.  Otherwise
+# add code to config.status for appending the configuration named by
+# TAGNAME from the matching tagged config vars.
+AC_DEFUN([AC_LIBTOOL_CONFIG],
+[# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    _LT_AC_TAGVAR(compiler, $1) \
+    _LT_AC_TAGVAR(CC, $1) \
+    _LT_AC_TAGVAR(LD, $1) \
+    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
+    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
+    _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
+    _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
+    _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
+    _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
+    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
+    _LT_AC_TAGVAR(old_archive_cmds, $1) \
+    _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
+    _LT_AC_TAGVAR(predep_objects, $1) \
+    _LT_AC_TAGVAR(postdep_objects, $1) \
+    _LT_AC_TAGVAR(predeps, $1) \
+    _LT_AC_TAGVAR(postdeps, $1) \
+    _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
+    _LT_AC_TAGVAR(archive_cmds, $1) \
+    _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
+    _LT_AC_TAGVAR(postinstall_cmds, $1) \
+    _LT_AC_TAGVAR(postuninstall_cmds, $1) \
+    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
+    _LT_AC_TAGVAR(allow_undefined_flag, $1) \
+    _LT_AC_TAGVAR(no_undefined_flag, $1) \
+    _LT_AC_TAGVAR(export_symbols_cmds, $1) \
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
+    _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
+    _LT_AC_TAGVAR(hardcode_automatic, $1) \
+    _LT_AC_TAGVAR(module_cmds, $1) \
+    _LT_AC_TAGVAR(module_expsym_cmds, $1) \
+    _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
+    _LT_AC_TAGVAR(exclude_expsyms, $1) \
+    _LT_AC_TAGVAR(include_expsyms, $1); do
+
+    case $var in
+    _LT_AC_TAGVAR(old_archive_cmds, $1) | \
+    _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
+    _LT_AC_TAGVAR(archive_cmds, $1) | \
+    _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
+    _LT_AC_TAGVAR(module_cmds, $1) | \
+    _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
+    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
+    _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\[$]0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
+    ;;
+  esac
+
+ifelse([$1], [],
+  [cfgfile="${ofile}T"
+  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+  $rm -f "$cfgfile"
+  AC_MSG_NOTICE([creating $ofile])],
+  [cfgfile="$ofile"])
+
+  cat <<__EOF__ >> "$cfgfile"
+ifelse([$1], [],
+[#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG],
+[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
+
+# Is the compiler the GNU C compiler?
+with_gcc=$_LT_AC_TAGVAR(GCC, $1)
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
+archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
+module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1)
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
+
+# Symbols that must always be exported.
+include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
+
+ifelse([$1],[],
+[# ### END LIBTOOL CONFIG],
+[# ### END LIBTOOL TAG CONFIG: $tagname])
+
+__EOF__
+
+ifelse([$1],[], [
+  case $host_os in
+  aix3*)
+    cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+EOF
+    ;;
+  esac
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" || \
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+])
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+])# AC_LIBTOOL_CONFIG
+
+
+# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+
+_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+  AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
+
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*) # Its linker distinguishes data from code symbols
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+  lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  ;;
+linux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDGIRSTW]]'
+    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ 	]]\($symcode$symcode*\)[[ 	]][[ 	]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if grep ' nm_test_var$' "$nlist" >/dev/null; then
+	if grep ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+	  cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+lt_preloaded_symbols[[]] =
+{
+EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+	  cat <<\EOF >> conftest.$ac_ext
+  {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -f conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+
+
+# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
+# ---------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
+[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+ ifelse([$1],[CXX],[
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+      ;;
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | os2* | pw32*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    interix3*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	;;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix4* | aix5*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+       darwin*)
+         # PIC is the default on this platform
+         # Common symbols not allowed in MH_DYLIB files
+         case $cc_basename in
+           xlc*)
+           _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+           _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           ;;
+         esac
+       ;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | kfreebsd*-gnu | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  icpc* | ecpc*)
+	    # Intel C++
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC*)
+	    # Portland Group C++ compiler.
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+      ;;
+
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    interix3*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    *)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+      darwin*)
+        # PIC is the default on this platform
+        # Common symbols not allowed in MH_DYLIB files
+       case $cc_basename in
+         xlc*)
+         _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+         _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         ;;
+       esac
+       ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    newsos6)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    linux*)
+      case $cc_basename in
+      icc* | ecc*)
+	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      esac
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
+    _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
+    [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\"
+AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
+])
+
+
+# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
+# ------------------------------------
+# See if the linker supports building shared libraries.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
+[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ifelse([$1],[CXX],[
+  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix4* | aix5*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+  ;;
+  cygwin* | mingw*)
+    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  *)
+    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+],[
+  runpath_var=
+  _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+  _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_AC_TAGVAR(archive_cmds, $1)=
+  _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
+  _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+  _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_AC_TAGVAR(hardcode_direct, $1)=no
+  _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_AC_TAGVAR(hardcode_automatic, $1)=no
+  _LT_AC_TAGVAR(module_cmds, $1)=
+  _LT_AC_TAGVAR(module_expsym_cmds, $1)=
+  _LT_AC_TAGVAR(always_export_symbols, $1)=no
+  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_AC_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  extract_expsyms_cmds=
+  # Just being paranoid about ensuring that cc_basename is set.
+  _LT_CC_BASENAME([$compiler])
+  case $host_os in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+  	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>/dev/null` in
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+      fi
+      ;;
+
+    amigaos*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+
+      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can't use
+      # them.
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_AC_TAGVAR(always_export_symbols, $1)=no
+      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    interix3*)
+      _LT_AC_TAGVAR(hardcode_direct, $1)=no
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    linux*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	tmp_addflag=
+	case $cc_basename,$host_cpu in
+	pgcc*)				# Portland Group C compiler
+	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	esac
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+	if test $supports_anon_versioning = yes; then
+	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~
+  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+  $echo "local: *; };" >> $output_objdir/$libname.ver~
+	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	fi
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) 
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+	  else
+	    _LT_AC_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_AC_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+	  for ld_flag in $LDFLAGS; do
+  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+  	    aix_use_runtimelinking=yes
+  	    break
+  	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_AC_TAGVAR(archive_cmds, $1)=''
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" && \
+  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  then
+  	  # We have reworked collect2
+  	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+	  else
+  	  # We have old collect2
+  	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+  	  # It fails to find uninstalled libraries when the uninstalled
+  	  # path is not listed in the libpath.  Setting hardcode_minus_L
+  	  # to unsupported forces relinking
+  	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+  	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+  	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+  	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+       # Determine the default libpath from the value encoded in an empty executable.
+       _LT_AC_SYS_LIBPATH_AIX
+       _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+       else
+	if test "$host_cpu" = ia64; then
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an empty executable.
+	 _LT_AC_SYS_LIBPATH_AIX
+	 _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      # see comment about different semantics on the GNU ld section
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    bsdi[[45]]*)
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
+      # FIXME: Should let the user specify the lib program.
+      _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs'
+      _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    darwin* | rhapsody*)
+      case $host_os in
+        rhapsody* | darwin1.[[012]])
+         _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[[012]])
+               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+      esac
+      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_AC_TAGVAR(hardcode_direct, $1)=no
+      _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+    if test "$GCC" = yes ; then
+    	output_verbose_link_cmd='echo'
+        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+         _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+         _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+         _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         _LT_AC_TAGVAR(ld_shlibs, $1)=no
+          ;;
+      esac
+    fi
+      ;;
+
+    dgux*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    freebsd1*)
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | kfreebsd*-gnu | dragonfly*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	_LT_AC_TAGVAR(hardcode_direct, $1)=yes
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
+	  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    openbsd*)
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      else
+       case $host_os in
+	 openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	   _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	   _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	   ;;
+	 *)
+	   _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	   _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	   ;;
+       esac
+      fi
+      ;;
+
+    os2*)
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+      else
+	wlarc=''
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+ 	# The compiler driver will combine linker options so we
+ 	# cannot just pass the convience library names through
+ 	# without $wl, iff we do not link with $LD.
+ 	# Luckily, gcc supports the same syntax we need for Sun Studio.
+ 	# Supported since Solaris 2.6 (maybe 2.5.1?)
+ 	case $wlarc in
+ 	'')
+ 	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;;
+ 	*)
+ 	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ 	esac ;;
+      esac
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_AC_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*)
+      _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_AC_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+  fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_AC_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+      $rm conftest*
+      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+	pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
+        _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+        if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+        then
+	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+        else
+	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+        fi
+        _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
+      ;;
+    esac
+  fi
+  ;;
+esac
+])# AC_LIBTOOL_PROG_LD_SHLIBS
+
+
+# _LT_AC_FILE_LTDLL_C
+# -------------------
+# Be careful that the start marker always follows a newline.
+AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# #  ifdef __CYGWIN32__
+# #    define __CYGWIN__ __CYGWIN32__
+# #  endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+#   __hDllInstance_base = hInst;
+#   return TRUE;
+# }
+# /* ltdll.c ends here */
+])# _LT_AC_FILE_LTDLL_C
+
+
+# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
+# ---------------------------------
+AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
+
+
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL],   [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED],  [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC],  [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD],        [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM],        [AC_PROG_NM])
+
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
+
+AC_DEFUN([LT_AC_PROG_GCJ],
+[AC_CHECK_TOOL(GCJ, gcj, no)
+  test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+  AC_SUBST(GCJFLAGS)
+])
+
+AC_DEFUN([LT_AC_PROG_RC],
+[AC_CHECK_TOOL(RC, windres, no)
+])
+
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+# LT_AC_PROG_SED
+# --------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+AC_DEFUN([LT_AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_MSG_RESULT([$SED])
+])
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+	 [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+	      		     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/ac_check_fpu_control.m4])
+m4_include([m4/ac_check_gmp.m4])
+m4_include([m4/ac_check_sicstus_prolog.m4])
+m4_include([m4/ac_check_swi_prolog.m4])
+m4_include([m4/ac_check_xsb_prolog.m4])
+m4_include([m4/ac_cxx_attribute_weak.m4])
+m4_include([m4/ac_cxx_double_binary_format.m4])
+m4_include([m4/ac_cxx_flexible_arrays.m4])
+m4_include([m4/ac_cxx_float_binary_format.m4])
+m4_include([m4/ac_cxx_long_double_binary_format.m4])
+m4_include([m4/ac_text_md5sum.m4])
+m4_include([m4/lib-ld.m4])
+m4_include([m4/lib-link.m4])
+m4_include([m4/lib-prefix.m4])
diff --git a/compile b/compile
new file mode 100755
index 0000000..cd27e88
--- /dev/null
+++ b/compile
@@ -0,0 +1,142 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2005-05-14.22
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey at cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand `-c -o'.
+Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file `INSTALL'.
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+	# configure might choose to run compile as `compile cc -o foo foo.c'.
+	# So we strip `-o arg' only if arg is an object.
+	eat=1
+	case $2 in
+	  *.o | *.obj)
+	    ofile=$2
+	    ;;
+	  *)
+	    set x "$@" -o "$2"
+	    shift
+	    ;;
+	esac
+	;;
+      *.c)
+	cfile=$1
+	set x "$@" "$1"
+	shift
+	;;
+      *)
+	set x "$@" "$1"
+	shift
+	;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no `-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # `.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use `[/.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..ec46d18
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1498 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+#   Inc.
+
+timestamp='2006-02-27'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per at bothner.com>.
+# Please send patches to <config-patches at gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep __LP64__ >/dev/null
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:MSYS_NT-*:*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    x86:Interix*:[345]*)
+	echo i586-pc-interix${UNAME_RELEASE}
+	exit ;;
+    EM64T:Interix*:[345]*)
+	echo x86_64-unknown-interix${UNAME_RELEASE}
+	exit ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mipsel
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips64
+	#undef mips64el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mips64el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips64
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit ;;
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun)
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^LIBC/{
+		s: ::g
+		p
+	    }'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel at ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes at openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf at swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches at gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..8dc0031
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,286 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+
+
+/* Defined if the integral type to be used for coefficients is a checked one.
+   */
+#undef CHECKED_INTEGERS
+
+/* The number of bits of coefficients; 0 if unbounded. */
+#undef COEFFICIENT_BITS
+
+/* The integral type used to represent coefficients. */
+#undef COEFFICIENT_TYPE
+
+/* The binary format of C++ doubles, if supported; undefined otherwise. */
+#undef CXX_DOUBLE_BINARY_FORMAT
+
+/* The binary format of C++ floats, if supported; undefined otherwise. */
+#undef CXX_FLOAT_BINARY_FORMAT
+
+/* The binary format of C++ long doubles, if supported; undefined otherwise.
+   */
+#undef CXX_LONG_DOUBLE_BINARY_FORMAT
+
+/* Not zero if the C++ compiler supports __attribute__ ((weak)). */
+#undef CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+/* Not zero if the C++ compiler supports flexible arrays. */
+#undef CXX_SUPPORTS_FLEXIBLE_ARRAYS
+
+/* Enable more assertions when defined. */
+#undef EXTRA_ROW_DEBUG
+
+/* Defined if the integral type to be used for coefficients is GMP's one. */
+#undef GMP_INTEGERS
+
+/* Not zero if GMP has been compiled with support for exceptions. */
+#undef GMP_SUPPORTS_EXCEPTIONS
+
+/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
+#undef HAVE_DECL_FFS
+
+/* Define to 1 if you have the declaration of `fma', and to 0 if you don't. */
+#undef HAVE_DECL_FMA
+
+/* Define to 1 if you have the declaration of `fmaf', and to 0 if you don't.
+   */
+#undef HAVE_DECL_FMAF
+
+/* Define to 1 if you have the declaration of `fmal', and to 0 if you don't.
+   */
+#undef HAVE_DECL_FMAL
+
+/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
+   */
+#undef HAVE_DECL_GETENV
+
+/* Define to 1 if you have the declaration of `rintf', and to 0 if you don't.
+   */
+#undef HAVE_DECL_RINTF
+
+/* Define to 1 if you have the declaration of `rintl', and to 0 if you don't.
+   */
+#undef HAVE_DECL_RINTL
+
+/* Define to 1 if you have the declaration of `RLIMIT_AS', and to 0 if you
+   don't. */
+#undef HAVE_DECL_RLIMIT_AS
+
+/* Define to 1 if you have the declaration of `RLIMIT_DATA', and to 0 if you
+   don't. */
+#undef HAVE_DECL_RLIMIT_DATA
+
+/* Define to 1 if you have the declaration of `RLIMIT_RSS', and to 0 if you
+   don't. */
+#undef HAVE_DECL_RLIMIT_RSS
+
+/* Define to 1 if you have the declaration of `RLIMIT_VMEM', and to 0 if you
+   don't. */
+#undef HAVE_DECL_RLIMIT_VMEM
+
+/* Define to 1 if you have the declaration of `strtod', and to 0 if you don't.
+   */
+#undef HAVE_DECL_STRTOD
+
+/* Define to 1 if you have the declaration of `strtof', and to 0 if you don't.
+   */
+#undef HAVE_DECL_STRTOF
+
+/* Define to 1 if you have the declaration of `strtold', and to 0 if you
+   don't. */
+#undef HAVE_DECL_STRTOLD
+
+/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
+   don't. */
+#undef HAVE_DECL_STRTOLL
+
+/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
+   don't. */
+#undef HAVE_DECL_STRTOULL
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <fenv.h> header file. */
+#undef HAVE_FENV_H
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#undef HAVE_GETOPT_H
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+#undef HAVE_IEEEFP_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if the system has the type `int_fast16_t'. */
+#undef HAVE_INT_FAST16_T
+
+/* Define to 1 if the system has the type `int_fast32_t'. */
+#undef HAVE_INT_FAST32_T
+
+/* Define to 1 if the system has the type `int_fast64_t'. */
+#undef HAVE_INT_FAST64_T
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <signal.h> header file. */
+#undef HAVE_SIGNAL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef HAVE_SYS_RESOURCE_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if the system has the type `uint_fast16_t'. */
+#undef HAVE_UINT_FAST16_T
+
+/* Define to 1 if the system has the type `uint_fast32_t'. */
+#undef HAVE_UINT_FAST32_T
+
+/* Define to 1 if the system has the type `uint_fast64_t'. */
+#undef HAVE_UINT_FAST64_T
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if `_mp_alloc' is member of `__mpz_struct'. */
+#undef HAVE___MPZ_STRUCT__MP_ALLOC
+
+/* Define to 1 if `_mp_d' is member of `__mpz_struct'. */
+#undef HAVE___MPZ_STRUCT__MP_D
+
+/* Define to 1 if `_mp_size' is member of `__mpz_struct'. */
+#undef HAVE___MPZ_STRUCT__MP_SIZE
+
+/* Defined if the integral type to be used for coefficients is a native one.
+   */
+#undef NATIVE_INTEGERS
+
+/* Assertions are disabled when this is defined. */
+#undef NDEBUG
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Not zero if the FPU can be controlled. */
+#undef PPL_CAN_CONTROL_FPU
+
+/* This contains the options with which `configure' was invoked. */
+#undef PPL_CONFIGURE_OPTIONS
+
+/* Not zero if doubles are supported. */
+#undef PPL_SUPPORTED_DOUBLE
+
+/* Not zero if floats are supported. */
+#undef PPL_SUPPORTED_FLOAT
+
+/* Not zero if long doubles are supported. */
+#undef PPL_SUPPORTED_LONG_DOUBLE
+
+/* The size of a `double', as computed by sizeof. */
+#undef SIZEOF_DOUBLE
+
+/* The size of a `float', as computed by sizeof. */
+#undef SIZEOF_FLOAT
+
+/* The size of a `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of a `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of a `long double', as computed by sizeof. */
+#undef SIZEOF_LONG_DOUBLE
+
+/* The size of a `long long', as computed by sizeof. */
+#undef SIZEOF_LONG_LONG
+
+/* The size of a `mp_limb_t', as computed by sizeof. */
+#undef SIZEOF_MP_LIMB_T
+
+/* The size of a `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
+/* The size of a `unsigned', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED
+
+/* The size of a `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* The size of a `unsigned long long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG_LONG
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to 1 if your processor stores words with the most significant byte
+   first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+
+/*
+  In order for the definition of `int64_t' to be seen by Comeau C/C++,
+  we must make sure <stdint.h> is included before <sys/types.hh> is
+  (even indirectly) included.
+*/
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#endif /* !defined(PPL_ppl_config_h) */
+
diff --git a/config.rpath b/config.rpath
new file mode 100755
index 0000000..65e298a
--- /dev/null
+++ b/config.rpath
@@ -0,0 +1,557 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+#   Copyright 1996-2004 Free Software Foundation, Inc.
+#   Taken from GNU libtool, 2001
+#   Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+#
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 2 of the License, or
+#   (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#   General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+#   As a special exception to the GNU General Public License, if you
+#   distribute this file as part of a program that contains a
+#   configuration script generated by Autoconf, you may include it under
+#   the same distribution terms that you use for the rest of that program.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+#   than 256 bytes, otherwise the compiler driver will dump core. The only
+#   known workaround is to choose shorter directory names for the build
+#   directory and/or the installation directory.
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+  wl='-Wl,'
+else
+  case "$host_os" in
+    aix*)
+      wl='-Wl,'
+      ;;
+    mingw* | pw32* | os2*)
+      ;;
+    hpux9* | hpux10* | hpux11*)
+      wl='-Wl,'
+      ;;
+    irix5* | irix6* | nonstopux*)
+      wl='-Wl,'
+      ;;
+    newsos6)
+      ;;
+    linux*)
+      case $CC in
+        icc* | ecc*)
+          wl='-Wl,'
+          ;;
+        ccc*)
+          wl='-Wl,'
+          ;;
+        como)
+          wl='-lopt='
+          ;;
+      esac
+      ;;
+    osf3* | osf4* | osf5*)
+      wl='-Wl,'
+      ;;
+    sco3.2v5*)
+      ;;
+    solaris*)
+      wl='-Wl,'
+      ;;
+    sunos4*)
+      wl='-Qoption ld '
+      ;;
+    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+      wl='-Wl,'
+      ;;
+    sysv4*MP*)
+      ;;
+    uts4*)
+      ;;
+  esac
+fi
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  case "$host_os" in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+        ld_shlibs=no
+      fi
+      ;;
+    amigaos*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we cannot use
+      # them.
+      ld_shlibs=no
+      ;;
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    cygwin* | mingw* | pw32*)
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    netbsd*)
+      ;;
+    solaris* | sysv5*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+        ld_shlibs=no
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    sunos4*)
+      hardcode_direct=yes
+      ;;
+    linux*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+  esac
+  if test "$ld_shlibs" = yes; then
+    # Unlike libtool, we use -rpath here, not --rpath, since the documented
+    # option of GNU ld is called -rpath, not --rpath.
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+  fi
+else
+  case "$host_os" in
+    aix3*)
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes; then
+        # Neither direct hardcoding nor static linking is supported with a
+        # broken collect2.
+        hardcode_direct=unsupported
+      fi
+      ;;
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+        # On IA64, the linker does run time linking by default, so we don't
+        # have to do anything special.
+        aix_use_runtimelinking=no
+      else
+        aix_use_runtimelinking=no
+        # Test if we are trying to use run time linking or normal
+        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+        # need to do runtime linking.
+        case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+          for ld_flag in $LDFLAGS; do
+            if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+              aix_use_runtimelinking=yes
+              break
+            fi
+          done
+        esac
+      fi
+      hardcode_direct=yes
+      hardcode_libdir_separator=':'
+      if test "$GCC" = yes; then
+        case $host_os in aix4.[012]|aix4.[012].*)
+          collect2name=`${CC} -print-prog-name=collect2`
+          if test -f "$collect2name" && \
+            strings "$collect2name" | grep resolve_lib_name >/dev/null
+          then
+            # We have reworked collect2
+            hardcode_direct=yes
+          else
+            # We have old collect2
+            hardcode_direct=unsupported
+            hardcode_minus_L=yes
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_libdir_separator=
+          fi
+        esac
+      fi
+      # Begin _LT_AC_SYS_LIBPATH_AIX.
+      echo 'int main () { return 0; }' > conftest.c
+      ${CC} ${LDFLAGS} conftest.c -o conftest
+      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      if test -z "$aix_libpath"; then
+        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      fi
+      if test -z "$aix_libpath"; then
+        aix_libpath="/usr/lib:/lib"
+      fi
+      rm -f conftest.c conftest
+      # End _LT_AC_SYS_LIBPATH_AIX.
+      if test "$aix_use_runtimelinking" = yes; then
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+      else
+        if test "$host_cpu" = ia64; then
+          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+        else
+          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        fi
+      fi
+      ;;
+    amigaos*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs=no
+      ;;
+    bsdi[45]*)
+      ;;
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      libext=lib
+      ;;
+    dgux*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    freebsd1*)
+      ld_shlibs=no
+      ;;
+    freebsd2.2*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    freebsd2*)
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    freebsd* | kfreebsd*-gnu)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    hpux9*)
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      ;;
+    hpux10* | hpux11*)
+      if test "$with_gnu_ld" = no; then
+        case "$host_cpu" in
+          hppa*64*)
+            hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+            hardcode_libdir_separator=:
+            hardcode_direct=no
+            ;;
+          ia64*)
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_direct=no
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+          *)
+            hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+            hardcode_libdir_separator=:
+            hardcode_direct=yes
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+        esac
+      fi
+      ;;
+    irix5* | irix6* | nonstopux*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    netbsd*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    newsos6)
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    openbsd*)
+      hardcode_direct=yes
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      else
+        case "$host_os" in
+          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+            hardcode_libdir_flag_spec='-R$libdir'
+            ;;
+          *)
+            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+            ;;
+        esac
+      fi
+      ;;
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      ;;
+    osf3*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    osf4* | osf5*)
+      if test "$GCC" = yes; then
+        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+        # Both cc and cxx compiler support -rpath directly
+        hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      hardcode_libdir_separator=:
+      ;;
+    sco3.2v5*)
+      ;;
+    solaris*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      ;;
+    sunos4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    sysv4)
+      case $host_vendor in
+        sni)
+          hardcode_direct=yes # is this really true???
+          ;;
+        siemens)
+          hardcode_direct=no
+          ;;
+        motorola)
+          hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+          ;;
+      esac
+      ;;
+    sysv4.3*)
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+        ld_shlibs=yes
+      fi
+      ;;
+    sysv4.2uw2*)
+      hardcode_direct=yes
+      hardcode_minus_L=no
+      ;;
+    sysv5OpenUNIX8* | sysv5UnixWare7* |  sysv5uw[78]* | unixware7*)
+      ;;
+    sysv5*)
+      hardcode_libdir_flag_spec=
+      ;;
+    uts4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    *)
+      ld_shlibs=no
+      ;;
+  esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
+libname_spec='lib$name'
+case "$host_os" in
+  aix3*)
+    ;;
+  aix4* | aix5*)
+    ;;
+  amigaos*)
+    ;;
+  beos*)
+    ;;
+  bsdi[45]*)
+    ;;
+  cygwin* | mingw* | pw32*)
+    shrext=.dll
+    ;;
+  darwin* | rhapsody*)
+    shrext=.dylib
+    ;;
+  dgux*)
+    ;;
+  freebsd1*)
+    ;;
+  kfreebsd*-gnu)
+    ;;
+  freebsd*)
+    ;;
+  gnu*)
+    ;;
+  hpux9* | hpux10* | hpux11*)
+    case "$host_cpu" in
+      ia64*)
+        shrext=.so
+        ;;
+      hppa*64*)
+        shrext=.sl
+        ;;
+      *)
+        shrext=.sl
+        ;;
+    esac
+    ;;
+  irix5* | irix6* | nonstopux*)
+    case "$host_os" in
+      irix5* | nonstopux*)
+        libsuff= shlibsuff=
+        ;;
+      *)
+        case $LD in
+          *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+          *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+          *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+          *) libsuff= shlibsuff= ;;
+        esac
+        ;;
+    esac
+    ;;
+  linux*oldld* | linux*aout* | linux*coff*)
+    ;;
+  linux*)
+    ;;
+  knetbsd*-gnu)
+    ;;
+  netbsd*)
+    ;;
+  newsos6)
+    ;;
+  nto-qnx*)
+    ;;
+  openbsd*)
+    ;;
+  os2*)
+    libname_spec='$name'
+    shrext=.dll
+    ;;
+  osf3* | osf4* | osf5*)
+    ;;
+  sco3.2v5*)
+    ;;
+  solaris*)
+    ;;
+  sunos4*)
+    ;;
+  sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+    ;;
+  sysv4*MP*)
+    ;;
+  uts4*)
+    ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..ab2c16c
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1609 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+#   Inc.
+
+timestamp='2006-02-27'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches at gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m32c)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	m32c-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+    c4x-* | tic4x-*)
+        os=-coff
+        ;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 0000000..b5d4798
--- /dev/null
+++ b/configure
@@ -0,0 +1,33025 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for the Parma Polyhedra Library 0.9.
+#
+# Report bugs to <ppl-devel at cs.unipr.it>.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+  ;;
+esac
+
+echo=${ECHO-echo}
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+  for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+    if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+       echo_test_string=`eval $cmd` &&
+       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+    then
+      break
+    fi
+  done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+   test "X$echo_testing_string" = "X$echo_test_string"; then
+  :
+else
+  # The Solaris, AIX, and Digital Unix default echo programs unquote
+  # backslashes.  This makes it impossible to quote backslashes using
+  #   echo "$something" | sed 's/\\/\\\\/g'
+  #
+  # So, first we look for a working echo in the user's PATH.
+
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for dir in $PATH /usr/ucb; do
+    IFS="$lt_save_ifs"
+    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      echo="$dir/echo"
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+
+  if test "X$echo" = Xecho; then
+    # We didn't find a better echo, so look for alternatives.
+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      # This shell has a builtin print -r that does the trick.
+      echo='print -r'
+    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+	 test "X$CONFIG_SHELL" != X/bin/ksh; then
+      # If we have ksh, try running configure again with it.
+      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+      export ORIGINAL_CONFIG_SHELL
+      CONFIG_SHELL=/bin/ksh
+      export CONFIG_SHELL
+      exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+    else
+      # Try using printf.
+      echo='printf %s\n'
+      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+	 test "X$echo_testing_string" = "X$echo_test_string"; then
+	# Cool, printf works
+	:
+      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	export CONFIG_SHELL
+	SHELL="$CONFIG_SHELL"
+	export SHELL
+	echo="$CONFIG_SHELL $0 --fallback-echo"
+      elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	echo="$CONFIG_SHELL $0 --fallback-echo"
+      else
+	# maybe with a smaller string...
+	prev=:
+
+	for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+	  then
+	    break
+	  fi
+	  prev="$cmd"
+	done
+
+	if test "$prev" != 'sed 50q "$0"'; then
+	  echo_test_string=`eval $prev`
+	  export echo_test_string
+	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+	else
+	  # Oops.  We lost completely, so just stick with echo.
+	  echo=echo
+	fi
+      fi
+    fi
+  fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+   ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+
+tagnames=${tagnames+${tagnames},}CXX
+
+tagnames=${tagnames+${tagnames},}F77
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='the Parma Polyhedra Library'
+PACKAGE_TARNAME='ppl'
+PACKAGE_VERSION='0.9'
+PACKAGE_STRING='the Parma Polyhedra Library 0.9'
+PACKAGE_BUGREPORT='ppl-devel at cs.unipr.it'
+
+ac_unique_file="src/Polyhedron_public.cc"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subdirs_all="$ac_subdirs_all Watchdog"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INS [...]
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+	      localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_CXXCPP_set=${CXXCPP+set}
+ac_env_CXXCPP_value=$CXXCPP
+ac_cv_env_CXXCPP_set=${CXXCPP+set}
+ac_cv_env_CXXCPP_value=$CXXCPP
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+ac_env_F77_set=${F77+set}
+ac_env_F77_value=$F77
+ac_cv_env_F77_set=${F77+set}
+ac_cv_env_F77_value=$F77
+ac_env_FFLAGS_set=${FFLAGS+set}
+ac_env_FFLAGS_value=$FFLAGS
+ac_cv_env_FFLAGS_set=${FFLAGS+set}
+ac_cv_env_FFLAGS_value=$FFLAGS
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures the Parma Polyhedra Library 0.9 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of the Parma Polyhedra Library 0.9:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-debugging      compile with debugging information
+  --enable-profiling      compile for profiling
+  --enable-coverage       compile for test coverage
+  --enable-assertions     check run-time assertions
+  --enable-more-assertions
+                          check even more run-time assertions
+  --enable-optimization   enable compiler optimizations
+  --enable-arch[=ARCH]
+                          optimize for architecture ARCH
+  --enable-pch            use precompiled headers, if available
+  --enable-coefficients   select the type of the coefficients
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --disable-rpath         do not hardcode runtime library paths
+  --enable-watchdog       build also the Parma Watchdog Library
+  --enable-interfaces     enable some or all the library interfaces
+  --enable-shared[=PKGS]
+                          build shared libraries [default=yes]
+  --enable-static[=PKGS]
+                          build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-cc=XXX           use XXX as the C compiler
+  --with-cxx=XXX          use XXX as the C++ compiler
+  --with-cflags=XXX       add XXX to the options for the C compiler
+  --with-cxxflags=XXX     add XXX to the options for the C++ compiler
+  --with-gnu-ld           assume the C compiler uses GNU ld default=no
+  --with-libgmp-prefix[=DIR]  search for libgmp in DIR/include and DIR/lib
+  --without-libgmp-prefix     don't search for libgmp in includedir and libdir
+  --with-libgmpxx-prefix[=DIR]  search for libgmpxx in DIR/include and DIR/lib
+  --without-libgmpxx-prefix     don't search for libgmpxx in includedir and libdir
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-pic              try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-tags[=TAGS]
+                          include additional configurations [automatic]
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CXXCPP      C++ preprocessor
+  CPP         C preprocessor
+  F77         Fortran 77 compiler command
+  FFLAGS      Fortran 77 compiler flags
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <ppl-devel at cs.unipr.it>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+	   test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+the Parma Polyhedra Library configure 0.9
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by the Parma Polyhedra Library $as_me 0.9, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+	echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Minimum autoconf version required.
+
+
+# Make sure the sources are there.
+
+
+# Use Automake.
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+all:
+	@echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='ppl'
+ VERSION='0.9'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  STRIP=$ac_ct_STRIP
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+
+
+# Version number machinery.
+if test -n "`expr $VERSION : '\([0-9]*\)\.[0-9]*\.[0-9]*'`"
+then
+  PPL_VERSION_MAJOR=`expr $VERSION : '\([0-9]*\)\.[0-9]*\.[0-9]*'`
+  PPL_VERSION_MINOR=`expr $VERSION : '[0-9]*\.\([0-9]*\)\.[0-9]*'`
+  PPL_VERSION_REVISION=`expr $VERSION : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
+  PPL_VERSION_BETA=`expr $VERSION : '[0-9]*\.[0-9]*\.[0-9]*pre\([0-9]*\)'`
+else
+  PPL_VERSION_MAJOR=`expr $VERSION : '\([0-9]*\)\.[0-9]*'`
+  PPL_VERSION_MINOR=`expr $VERSION : '[0-9]*\.\([0-9]*\)'`
+  PPL_VERSION_REVISION=0
+  PPL_VERSION_BETA=`expr $VERSION : '[0-9]*\.[0-9]*pre\([0-9]*\)'`
+fi
+if test -z "$PPL_VERSION_BETA"
+then
+  PPL_VERSION_BETA=0
+fi
+
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CONFIGURE_OPTIONS "$ac_configure_args"
+_ACEOF
+
+PPL_CONFIGURE_OPTIONS="\"$ac_configure_args\""
+
+
+# Installation directories.
+docdir='${datadir}/doc/ppl'
+
+
+# Generate a configuration header file.
+          ac_config_headers="$ac_config_headers config.h"
+
+
+ISODATE=`date +%Y-%m-%d`
+
+
+# Check for host type.
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+
+
+
+
+
+
+# C compiler
+
+
+# Check whether --with-cc or --without-cc was given.
+if test "${with_cc+set}" = set; then
+  withval="$with_cc"
+  CC=$with_cc
+fi;
+
+# C++ compiler
+
+
+# Check whether --with-cxx or --without-cxx was given.
+if test "${with_cxx+set}" = set; then
+  withval="$with_cxx"
+  CXX=$with_cxx
+fi;
+
+# Compilation flags
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+echo "$as_me:$LINENO: checking whether to compile with debug info" >&5
+echo $ECHO_N "checking whether to compile with debug info... $ECHO_C" >&6
+# Check whether --enable-debugging or --disable-debugging was given.
+if test "${enable_debugging+set}" = set; then
+  enableval="$enable_debugging"
+
+fi;
+case "${enableval}" in
+yes)
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  OPT_FLAGS="-g"
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to compile for profiling" >&5
+echo $ECHO_N "checking whether to compile for profiling... $ECHO_C" >&6
+# Check whether --enable-profiling or --disable-profiling was given.
+if test "${enable_profiling+set}" = set; then
+  enableval="$enable_profiling"
+
+fi;
+case "${enableval}" in
+yes)
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -pg -DPROFILING=1"
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to compile for test coverage" >&5
+echo $ECHO_N "checking whether to compile for test coverage... $ECHO_C" >&6
+# Check whether --enable-coverage or --disable-coverage was given.
+if test "${enable_coverage+set}" = set; then
+  enableval="$enable_coverage"
+
+fi;
+case "${enableval}" in
+yes)
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to enable checking of run-time assertions" >&5
+echo $ECHO_N "checking whether to enable checking of run-time assertions... $ECHO_C" >&6
+# Check whether --enable-assertions or --disable-assertions was given.
+if test "${enable_assertions+set}" = set; then
+  enableval="$enable_assertions"
+
+fi;
+case "${enableval}" in
+yes)
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-assertions, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-assertions, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+enable_assertions=${enableval}
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to enable even more run-time assertions" >&5
+echo $ECHO_N "checking whether to enable even more run-time assertions... $ECHO_C" >&6
+# Check whether --enable-more-assertions or --disable-more-assertions was given.
+if test "${enable_more_assertions+set}" = set; then
+  enableval="$enable_more_assertions"
+
+fi;
+case "${enableval}" in
+yes)
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-more-assertions, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-more-assertions, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+enable_more_assertions=${enableval}
+
+if test x"$enable_more_assertions" = xyes
+then
+  enable_assertions=yes
+
+cat >>confdefs.h <<\_ACEOF
+#define EXTRA_ROW_DEBUG 1
+_ACEOF
+
+fi
+
+if test x"$enable_assertions" = xno
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define NDEBUG 1
+_ACEOF
+
+  debug_flag="-DNDEBUG=1"
+fi
+
+
+
+if test x"$enable_assertions" = xyes; then
+  ASSERTIONS_ENABLED_TRUE=
+  ASSERTIONS_ENABLED_FALSE='#'
+else
+  ASSERTIONS_ENABLED_TRUE='#'
+  ASSERTIONS_ENABLED_FALSE=
+fi
+
+
+
+arch=no
+enableval=standard
+echo "$as_me:$LINENO: checking whether to enable optimizations" >&5
+echo $ECHO_N "checking whether to enable optimizations... $ECHO_C" >&6
+# Check whether --enable-optimization or --disable-optimization was given.
+if test "${enable_optimization+set}" = set; then
+  enableval="$enable_optimization"
+
+fi;
+case "${enableval}" in
+sspeed)
+  echo "$as_me:$LINENO: result: sspeed" >&5
+echo "${ECHO_T}sspeed" >&6
+  OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
+  arch=yes
+  ;;
+speed)
+  echo "$as_me:$LINENO: result: speed" >&5
+echo "${ECHO_T}speed" >&6
+  OPT_FLAGS="$OPT_FLAGS -O3"
+  arch=yes
+  ;;
+size)
+  echo "$as_me:$LINENO: result: size" >&5
+echo "${ECHO_T}size" >&6
+  OPT_FLAGS="$OPT_FLAGS -Os"
+  arch=yes
+  ;;
+standard | yes)
+  echo "$as_me:$LINENO: result: standard" >&5
+echo "${ECHO_T}standard" >&6
+  OPT_FLAGS="$OPT_FLAGS -O2"
+  ;;
+mild)
+  echo "$as_me:$LINENO: result: mild" >&5
+echo "${ECHO_T}mild" >&6
+  OPT_FLAGS="$OPT_FLAGS -O1"
+  ;;
+zero)
+  echo "$as_me:$LINENO: result: zero" >&5
+echo "${ECHO_T}zero" >&6
+  OPT_FLAGS="$OPT_FLAGS -O0"
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+enableval=$arch
+echo "$as_me:$LINENO: checking for which architecture to optimize" >&5
+echo $ECHO_N "checking for which architecture to optimize... $ECHO_C" >&6
+# Check whether --enable-arch or --disable-arch was given.
+if test "${enable_arch+set}" = set; then
+  enableval="$enable_arch"
+
+fi;
+case "${enableval}" in
+yes)
+  m=`uname -m`
+  case $m in
+  i?86 | k6 | athlon)
+    echo "$as_me:$LINENO: result: $m" >&5
+echo "${ECHO_T}$m" >&6
+    OPT_FLAGS="$OPT_FLAGS -march=$m"
+    ;;
+  *)
+    echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6
+    ;;
+  esac
+  ;;
+no)
+  echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6
+  ;;
+*)
+  echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+  OPT_FLAGS="$OPT_FLAGS -march=$enableval"
+  ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to use precompiled headers" >&5
+echo $ECHO_N "checking whether to use precompiled headers... $ECHO_C" >&6
+# Check whether --enable-pch or --disable-pch was given.
+if test "${enable_pch+set}" = set; then
+  enableval="$enable_pch"
+
+fi;
+case "${enableval}" in
+yes)
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  COMP_FLAGS="$COMP_FLAGS -Winvalid-pch"
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-pch, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-pch, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+
+if test x"$enableval" = xyes; then
+  USE_PRECOMPILED_HEADERS_TRUE=
+  USE_PRECOMPILED_HEADERS_FALSE='#'
+else
+  USE_PRECOMPILED_HEADERS_TRUE='#'
+  USE_PRECOMPILED_HEADERS_FALSE=
+fi
+
+
+CFLAGS="$COMP_FLAGS $OPT_FLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS"
+
+enableval=mpz
+echo "$as_me:$LINENO: checking the type of integral values to use as coefficients" >&5
+echo $ECHO_N "checking the type of integral values to use as coefficients... $ECHO_C" >&6
+# Check whether --enable-coefficients or --disable-coefficients was given.
+if test "${enable_coefficients+set}" = set; then
+  enableval="$enable_coefficients"
+
+fi;
+case "${enableval}" in
+native-int8)
+  echo "$as_me:$LINENO: result: native 8 bits integers" >&5
+echo "${ECHO_T}native 8 bits integers" >&6
+  coefficient_kind=native
+  coefficient_bits=8
+  coefficient_mnemonic=nint8
+  ;;
+native-int16)
+  echo "$as_me:$LINENO: result: native 16 bits integers" >&5
+echo "${ECHO_T}native 16 bits integers" >&6
+  coefficient_kind=native
+  coefficient_bits=16
+  coefficient_mnemonic=nint16
+  ;;
+native-int32)
+  echo "$as_me:$LINENO: result: native 32 bits integers" >&5
+echo "${ECHO_T}native 32 bits integers" >&6
+  coefficient_kind=native
+  coefficient_bits=32
+  coefficient_mnemonic=nint32
+  ;;
+native-int64)
+  echo "$as_me:$LINENO: result: native 64 bits integers" >&5
+echo "${ECHO_T}native 64 bits integers" >&6
+  coefficient_kind=native
+  coefficient_bits=64
+  coefficient_mnemonic=nint64
+  ;;
+checked-int8)
+  echo "$as_me:$LINENO: result: checked 8 bits integers" >&5
+echo "${ECHO_T}checked 8 bits integers" >&6
+  coefficient_kind=checked
+  coefficient_bits=8
+  coefficient_mnemonic=int8
+  ;;
+checked-int16)
+  echo "$as_me:$LINENO: result: checked 16 bits integers" >&5
+echo "${ECHO_T}checked 16 bits integers" >&6
+  coefficient_kind=checked
+  coefficient_bits=16
+  coefficient_mnemonic=int16
+  ;;
+checked-int32)
+  echo "$as_me:$LINENO: result: checked 32 bits integers" >&5
+echo "${ECHO_T}checked 32 bits integers" >&6
+  coefficient_kind=checked
+  coefficient_bits=32
+  coefficient_mnemonic=int32
+  ;;
+checked-int64)
+  echo "$as_me:$LINENO: result: checked 64 bits integers" >&5
+echo "${ECHO_T}checked 64 bits integers" >&6
+  coefficient_kind=checked
+  coefficient_bits=64
+  coefficient_mnemonic=int64
+  ;;
+mpz)
+  echo "$as_me:$LINENO: result: GMP mpz" >&5
+echo "${ECHO_T}GMP mpz" >&6
+  coefficient_kind=unbounded
+  coefficient_bits=0
+  coefficient_mnemonic=mpz
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+
+
+
+if test x"$coefficient_kind" = xnative; then
+  USE_NATIVE_INTEGERS_TRUE=
+  USE_NATIVE_INTEGERS_FALSE='#'
+else
+  USE_NATIVE_INTEGERS_TRUE='#'
+  USE_NATIVE_INTEGERS_FALSE=
+fi
+
+
+
+if test x"$coefficient_kind" = xchecked; then
+  USE_CHECKED_INTEGERS_TRUE=
+  USE_CHECKED_INTEGERS_FALSE='#'
+else
+  USE_CHECKED_INTEGERS_TRUE='#'
+  USE_CHECKED_INTEGERS_FALSE=
+fi
+
+
+
+if test x"$coefficient_kind" = xunbounded; then
+  USE_GMP_INTEGERS_TRUE=
+  USE_GMP_INTEGERS_FALSE='#'
+else
+  USE_GMP_INTEGERS_TRUE='#'
+  USE_GMP_INTEGERS_FALSE=
+fi
+
+
+
+if test x"$coefficient_bits" = x8; then
+  USE_INT8_TRUE=
+  USE_INT8_FALSE='#'
+else
+  USE_INT8_TRUE='#'
+  USE_INT8_FALSE=
+fi
+
+
+
+if test x"$coefficient_bits" = x16; then
+  USE_INT16_TRUE=
+  USE_INT16_FALSE='#'
+else
+  USE_INT16_TRUE='#'
+  USE_INT16_FALSE=
+fi
+
+
+
+if test x"$coefficient_bits" = x32; then
+  USE_INT32_TRUE=
+  USE_INT32_FALSE='#'
+else
+  USE_INT32_TRUE='#'
+  USE_INT32_FALSE=
+fi
+
+
+
+if test x"$coefficient_bits" = x64; then
+  USE_INT64_TRUE=
+  USE_INT64_FALSE='#'
+else
+  USE_INT64_TRUE='#'
+  USE_INT64_FALSE=
+fi
+
+
+
+if test x"$coefficient_kind" = xnative
+then
+  coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t, Checked_Number_Transparent_Policy>"
+
+cat >>confdefs.h <<_ACEOF
+#define COEFFICIENT_TYPE $coefficient_type
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define COEFFICIENT_BITS $coefficient_bits
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define NATIVE_INTEGERS 1
+_ACEOF
+
+elif test x"$coefficient_kind" = xchecked
+then
+  coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t>"
+  cat >>confdefs.h <<_ACEOF
+#define COEFFICIENT_TYPE $coefficient_type
+_ACEOF
+
+  cat >>confdefs.h <<_ACEOF
+#define COEFFICIENT_BITS $coefficient_bits
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define CHECKED_INTEGERS 1
+_ACEOF
+
+elif test x"$coefficient_kind" = xunbounded
+then
+  cat >>confdefs.h <<\_ACEOF
+#define COEFFICIENT_TYPE mpz_class
+_ACEOF
+
+  cat >>confdefs.h <<\_ACEOF
+#define COEFFICIENT_BITS 0
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define GMP_INTEGERS 1
+_ACEOF
+
+fi
+
+# Allow additions to C and C++ compilation flags
+
+
+# Check whether --with-cflags or --without-cflags was given.
+if test "${with_cflags+set}" = set; then
+  withval="$with_cflags"
+  CFLAGS="$CFLAGS $with_cflags"
+fi;
+
+
+# Check whether --with-cxxflags or --without-cxxflags was given.
+if test "${with_cxxflags+set}" = set; then
+  withval="$with_cxxflags"
+  CXXFLAGS="$CXXFLAGS $with_cxxflags"
+fi;
+
+# Checks for programs.
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+    then ac_cv_prog_egrep='grep -E'
+    else ac_cv_prog_egrep='egrep'
+    fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+	;;
+    conftest.$ac_ext )
+	# This is the source file.
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	# FIXME: I believe we export ac_cv_exeext for Libtool,
+	# but it would be cool to find out if it's true.  Does anybody
+	# maintain Libtool? --akim.
+	export ac_cv_exeext
+	break;;
+    * )
+	break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  export ac_cv_exeext
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+          ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CC"   am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+  CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+all:
+	@echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+# Check for Perl.
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PERL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PERL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no"
+  ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+
+if test -n "$PERL"; then
+  echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+
+
+if test x"$PERL" != xno; then
+  HAVE_PERL_TRUE=
+  HAVE_PERL_FALSE='#'
+else
+  HAVE_PERL_TRUE='#'
+  HAVE_PERL_FALSE=
+fi
+
+
+# Checks for C typedefs, structures, compiler and architecture characteristics.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset x;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *ccp;
+  char **p;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  ccp = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++ccp;
+  p = (char**) ccp;
+  ccp = (char const *const *) p;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+  }
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_const=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6
+if test "${ac_cv_c_inline+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_inline=$ac_kw; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6
+
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
+echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6
+if test "${ac_cv_c_bigendian+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # See if sys/param.h defines the BYTE_ORDER macro.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/param.h>
+
+int
+main ()
+{
+#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+ bogus endian macros
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_bigendian=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_bigendian=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+# It does not; compile a test program.
+if test "$cross_compiling" = yes; then
+  # try to guess the endianness by grepping values into an object file
+  ac_cv_c_bigendian=unknown
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; }
+short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; }
+int
+main ()
+{
+ _ascii (); _ebcdic ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then
+  ac_cv_c_bigendian=yes
+fi
+if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+  if test "$ac_cv_c_bigendian" = unknown; then
+    ac_cv_c_bigendian=no
+  else
+    # finding both strings is unlikely to happen, but who knows?
+    ac_cv_c_bigendian=unknown
+  fi
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+int
+main ()
+{
+  /* Are we little or big endian?  From Harbison&Steele.  */
+  union
+  {
+    long l;
+    char c[sizeof (long)];
+  } u;
+  u.l = 1;
+  exit (u.c[sizeof (long) - 1] == 1);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_bigendian=no
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_bigendian=yes
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
+echo "${ECHO_T}$ac_cv_c_bigendian" >&6
+case $ac_cv_c_bigendian in
+  yes)
+
+cat >>confdefs.h <<\_ACEOF
+#define WORDS_BIGENDIAN 1
+_ACEOF
+ ;;
+  no)
+     ;;
+  *)
+    { { echo "$as_me:$LINENO: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&5
+echo "$as_me: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+
+
+# Checks for C type sizes.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      exit(2);
+  exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+echo "$as_me:$LINENO: checking for int" >&5
+echo $ECHO_N "checking for int... $ECHO_C" >&6
+if test "${ac_cv_type_int+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((int *) 0)
+  return 0;
+if (sizeof (int))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_int=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_int=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
+echo "${ECHO_T}$ac_cv_type_int" >&6
+
+echo "$as_me:$LINENO: checking size of int" >&5
+echo $ECHO_N "checking size of int... $ECHO_C" >&6
+if test "${ac_cv_sizeof_int+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_int" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_int=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+long longval () { return (long) (sizeof (int)); }
+unsigned long ulongval () { return (long) (sizeof (int)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (int))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (int))))
+	exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (int))))
+	exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_int=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_int=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_int" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6
+if test "${ac_cv_type_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((long *) 0)
+  return 0;
+if (sizeof (long))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_long=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6
+
+echo "$as_me:$LINENO: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_long" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+long longval () { return (long) (sizeof (long)); }
+unsigned long ulongval () { return (long) (sizeof (long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (long))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (long))))
+	exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (long))))
+	exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_long=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for long long" >&5
+echo $ECHO_N "checking for long long... $ECHO_C" >&6
+if test "${ac_cv_type_long_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((long long *) 0)
+  return 0;
+if (sizeof (long long))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_long_long=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_long_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_long_long" >&6
+
+echo "$as_me:$LINENO: checking size of long long" >&5
+echo $ECHO_N "checking size of long long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_long_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_long_long" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long long), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+long longval () { return (long) (sizeof (long long)); }
+unsigned long ulongval () { return (long) (sizeof (long long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (long long))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (long long))))
+	exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (long long))))
+	exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_long_long=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long long), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_long_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for unsigned" >&5
+echo $ECHO_N "checking for unsigned... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((unsigned *) 0)
+  return 0;
+if (sizeof (unsigned))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_unsigned=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_unsigned=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_unsigned" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned" >&6
+
+echo "$as_me:$LINENO: checking size of unsigned" >&5
+echo $ECHO_N "checking size of unsigned... $ECHO_C" >&6
+if test "${ac_cv_sizeof_unsigned+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_unsigned" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+long longval () { return (long) (sizeof (unsigned)); }
+unsigned long ulongval () { return (long) (sizeof (unsigned)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (unsigned))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (unsigned))))
+	exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (unsigned))))
+	exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_unsigned=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_unsigned=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED $ac_cv_sizeof_unsigned
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for unsigned long" >&5
+echo $ECHO_N "checking for unsigned long... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((unsigned long *) 0)
+  return 0;
+if (sizeof (unsigned long))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_unsigned_long=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_unsigned_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long" >&6
+
+echo "$as_me:$LINENO: checking size of unsigned long" >&5
+echo $ECHO_N "checking size of unsigned long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_unsigned_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_unsigned_long" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+long longval () { return (long) (sizeof (unsigned long)); }
+unsigned long ulongval () { return (long) (sizeof (unsigned long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (unsigned long))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (unsigned long))))
+	exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (unsigned long))))
+	exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_unsigned_long=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_unsigned_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for unsigned long long" >&5
+echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned_long_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((unsigned long long *) 0)
+  return 0;
+if (sizeof (unsigned long long))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_unsigned_long_long=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_unsigned_long_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long_long" >&6
+
+echo "$as_me:$LINENO: checking size of unsigned long long" >&5
+echo $ECHO_N "checking size of unsigned long long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_unsigned_long_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_unsigned_long_long" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_long_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long long), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+long longval () { return (long) (sizeof (unsigned long long)); }
+unsigned long ulongval () { return (long) (sizeof (unsigned long long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (unsigned long long))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (unsigned long long))))
+	exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (unsigned long long))))
+	exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_unsigned_long_long=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long long), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_unsigned_long_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_long_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_long_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((size_t *) 0)
+  return 0;
+if (sizeof (size_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_size_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_size_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+
+echo "$as_me:$LINENO: checking size of size_t" >&5
+echo $ECHO_N "checking size of size_t... $ECHO_C" >&6
+if test "${ac_cv_sizeof_size_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_size_t" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_size_t=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (size_t), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (size_t), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+long longval () { return (long) (sizeof (size_t)); }
+unsigned long ulongval () { return (long) (sizeof (size_t)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (size_t))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (size_t))))
+	exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (size_t))))
+	exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_size_t=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (size_t), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (size_t), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_size_t=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_size_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_size_t" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for float" >&5
+echo $ECHO_N "checking for float... $ECHO_C" >&6
+if test "${ac_cv_type_float+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((float *) 0)
+  return 0;
+if (sizeof (float))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_float=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_float=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_float" >&5
+echo "${ECHO_T}$ac_cv_type_float" >&6
+
+echo "$as_me:$LINENO: checking size of float" >&5
+echo $ECHO_N "checking size of float... $ECHO_C" >&6
+if test "${ac_cv_sizeof_float+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_float" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (float))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (float))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (float))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (float))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (float))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_float=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (float), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (float), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+long longval () { return (long) (sizeof (float)); }
+unsigned long ulongval () { return (long) (sizeof (float)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (float))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (float))))
+	exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (float))))
+	exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_float=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (float), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (float), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_float=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_float" >&5
+echo "${ECHO_T}$ac_cv_sizeof_float" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_FLOAT $ac_cv_sizeof_float
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for double" >&5
+echo $ECHO_N "checking for double... $ECHO_C" >&6
+if test "${ac_cv_type_double+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((double *) 0)
+  return 0;
+if (sizeof (double))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_double=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_double=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_double" >&5
+echo "${ECHO_T}$ac_cv_type_double" >&6
+
+echo "$as_me:$LINENO: checking size of double" >&5
+echo $ECHO_N "checking size of double... $ECHO_C" >&6
+if test "${ac_cv_sizeof_double+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_double" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (double))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (double))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (double))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (double))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (double))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_double=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (double), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (double), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+long longval () { return (long) (sizeof (double)); }
+unsigned long ulongval () { return (long) (sizeof (double)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (double))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (double))))
+	exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (double))))
+	exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_double=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (double), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (double), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_double=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_double" >&5
+echo "${ECHO_T}$ac_cv_sizeof_double" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_DOUBLE $ac_cv_sizeof_double
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for long double" >&5
+echo $ECHO_N "checking for long double... $ECHO_C" >&6
+if test "${ac_cv_type_long_double+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((long double *) 0)
+  return 0;
+if (sizeof (long double))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_long_double=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_long_double=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long_double" >&5
+echo "${ECHO_T}$ac_cv_type_long_double" >&6
+
+echo "$as_me:$LINENO: checking size of long double" >&5
+echo $ECHO_N "checking size of long double... $ECHO_C" >&6
+if test "${ac_cv_sizeof_long_double+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_long_double" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long_double=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long double), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long double), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+long longval () { return (long) (sizeof (long double)); }
+unsigned long ulongval () { return (long) (sizeof (long double)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (long double))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (long double))))
+	exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (long double))))
+	exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_long_double=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long double), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long double), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_long_double=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_double" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long_double" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
+_ACEOF
+
+
+
+# Use C++ for the remaining checks.
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+for ac_header in fenv.h ieeefp.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+echo "$as_me:$LINENO: checking for the possibility to control the FPU" >&5
+echo $ECHO_N "checking for the possibility to control the FPU... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main() {
+#if i386
+#elif defined(HAVE_FENV_H)
+#elif sparc && defined( HAVE_IEEEFP_H)
+#else
+  choke me
+#endif
+
+  ;
+  return 0;
+}
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  ac_cv_can_control_fpu=1
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ac_cv_can_control_fpu=0
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext,
+
+
+if test $ac_cv_can_control_fpu = 1; then
+  CAN_CONTROL_FPU_TRUE=
+  CAN_CONTROL_FPU_FALSE='#'
+else
+  CAN_CONTROL_FPU_TRUE='#'
+  CAN_CONTROL_FPU_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CAN_CONTROL_FPU $ac_cv_can_control_fpu
+_ACEOF
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+# Detect the binary format used by C++ floats.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking the binary format of C++ floats" >&5
+echo $ECHO_N "checking the binary format of C++ floats... $ECHO_C" >&6
+ac_cxx_float_binary_format=unknown
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_FLOAT == 4
+
+inline float
+convert(uint32_t x) {
+  union {
+    float value;
+    uint32_t word;
+  } u;
+
+  u.word = x;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<float>::is_iec559
+    && (convert(0xaaacccaaUL)
+	== -3.069535185924732179074680971098132431507110595703125e-13
+    &&  convert(0xcccaaaccUL)
+	== -106255968)
+  ? 0 : 1;
+}
+
+#else // SIZEOF_FLOAT != 4
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_FLOAT != 4
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_FLOAT_BINARY_FORMAT float_ieee754_single
+_ACEOF
+
+  ac_cxx_float_binary_format="IEEE754 Single Precision"
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+echo "$as_me:$LINENO: result: $ac_cxx_float_binary_format" >&5
+echo "${ECHO_T}$ac_cxx_float_binary_format" >&6
+
+if test x"$ac_cxx_float_binary_format" = x"unknown"
+then
+  ac_supported_float=0
+else
+  ac_supported_float=1
+fi
+
+
+if test $ac_supported_float = 1; then
+  SUPPORTED_FLOAT_TRUE=
+  SUPPORTED_FLOAT_FALSE='#'
+else
+  SUPPORTED_FLOAT_TRUE='#'
+  SUPPORTED_FLOAT_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_SUPPORTED_FLOAT $ac_supported_float
+_ACEOF
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Detect the binary format used by C++ doubles.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking the binary format of C++ doubles" >&5
+echo $ECHO_N "checking the binary format of C++ doubles... $ECHO_C" >&6
+ac_cxx_double_binary_format=unknown
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+  union {
+    double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint32_t lsp;
+#else
+      uint32_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<double>::is_iec559
+    && (convert(0xaaacccaaUL, 0xacccaaacUL)
+	== -4.018242396032647e-103
+    &&	convert(0xcccaaaccUL, 0xcaaacccaUL)
+	  == -85705035845709846787631445265530356117787053916987832397725696.0)
+    ? 0 : 1;
+}
+
+#else // SIZEOF_DOUBLE != 8
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_DOUBLE != 8
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_DOUBLE_BINARY_FORMAT float_ieee754_double
+_ACEOF
+
+  ac_cxx_double_binary_format="IEEE754 Double Precision"
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+echo "$as_me:$LINENO: result: $ac_cxx_double_binary_format" >&5
+echo "${ECHO_T}$ac_cxx_double_binary_format" >&6
+
+if test x"$ac_cxx_double_binary_format" = x"unknown"
+then
+  ac_supported_double=0
+else
+  ac_supported_double=1
+fi
+
+
+if test $ac_supported_double = 1; then
+  SUPPORTED_DOUBLE_TRUE=
+  SUPPORTED_DOUBLE_FALSE='#'
+else
+  SUPPORTED_DOUBLE_TRUE='#'
+  SUPPORTED_DOUBLE_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_SUPPORTED_DOUBLE $ac_supported_double
+_ACEOF
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Detect the binary format used by C++ long doubles.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking the binary format of C++ long doubles" >&5
+echo $ECHO_N "checking the binary format of C++ long doubles... $ECHO_C" >&6
+ac_cxx_long_double_binary_format=unknown
+
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 12
+
+long double
+convert(uint32_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<long double>::is_iec559
+    && (convert(0xaaacccaaUL, 0xacccaaacccaaacccULL)
+	== -2347515119623533044836098728848844802360499059743792266553789449931714103027083147350004052130909778252174381128110073162061230391014115892328306480775581568464385654456454167018199800371311459509865035007576337091690846028483890278748770302000164922066968427857731908531920447109369397262198780877931467490364866823668872333299978555289484532591724489792080483029098529153534398647750864910040989348665150713407129673962368698401443396580325986886785546510945722073165626067034971013793 [...]
+    &&  convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL)
+        == -3.2343499084336735697883624337582367014013792003863104780702304912017160945762080887330922093527110817635309731394394027547210062178890319023095669053441067666970505933558514051896941259661008015375938113204938505791529386797054658707886845235185418061587914083787185969361328546834255817542052425946141924658766401026284322468976745836497454676411392342071395848101018687729153124540755822652406871842792438612173516670599208782361645064732617977033939815107992280307781523996574 [...]
+    ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 12
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 12
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_intel_double_extended
+_ACEOF
+
+  ac_cxx_long_double_binary_format="Intel Double-Extended"
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 16
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint64_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint64_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<long double>::is_iec559
+    && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+        == -8.5585565388510043474134185399390263e-1644L
+    &&  convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+        == -1.245145811075115522107964569349668e+986L)
+    ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_ieee754_quad
+_ACEOF
+
+  ac_cxx_long_double_binary_format="IEEE754 Quad Precision"
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 16
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint64_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint64_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<long double>::is_iec559
+  && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+      == -7.604854094366020338337599887587800202175513745285694296699118737579061822543271195468213752945697068626341230960061791319756014599393179237494607606117559455091592495531339152856677735299681614113855047309039978381765251689655330467878879653297684753038610775075912700489795099693753075187209767515639593721823446001374821995460346508811516182804821576375433157503444723668976504567458418892711612877008293336291456723718701753008252854005800263180027419214648596175836662547627167 [...]
+      && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+         == -99658331877181425640389193712445288804009112642407197633229907048864350192381814628233384153539524368748305269642704450459572458913058829202094408933558533552137589226430537671503754737153845553845646099179512540696038707395491223325946106007770844660381340028079827237033670900446083793353682761885084154898636897779677124010119288945740273072415898996441722571487815052387317025675191665761918119006431828756780493604546658949166486641354783002536071366287780290680620995991797 [...]
+    ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_intel_double_extended
+_ACEOF
+
+  ac_cxx_long_double_binary_format="Intel Double-Extended"
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint32_t lsp;
+#else
+      uint32_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<long double>::is_iec559
+    && (convert(0xaaacccaaUL, 0xacccaaacUL)
+	== -4.018242396032647e-103
+    &&	convert(0xcccaaaccUL, 0xcaaacccaUL)
+	  == -85705035845709846787631445265530356117787053916987832397725696.0)
+    ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 8
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 8
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_ieee754_double
+_ACEOF
+
+  ac_cxx_long_double_binary_format="IEEE754 Double Precision"
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+
+echo "$as_me:$LINENO: result: $ac_cxx_long_double_binary_format" >&5
+echo "${ECHO_T}$ac_cxx_long_double_binary_format" >&6
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+  ac_supported_long_double=0
+else
+  ac_supported_long_double=1
+fi
+
+
+if test $ac_supported_long_double = 1; then
+  SUPPORTED_LONG_DOUBLE_TRUE=
+  SUPPORTED_LONG_DOUBLE_FALSE='#'
+else
+  SUPPORTED_LONG_DOUBLE_TRUE='#'
+  SUPPORTED_LONG_DOUBLE_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_SUPPORTED_LONG_DOUBLE $ac_supported_long_double
+_ACEOF
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Check whether the C++ compiler supports flexible arrays.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking whether the C++ compiler supports flexible arrays" >&5
+echo $ECHO_N "checking whether the C++ compiler supports flexible arrays... $ECHO_C" >&6
+if test "$cross_compiling" = yes; then
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ac_cxx_supports_flexible_arrays=no
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <new>
+#include <cstddef>
+#include <cstdlib>
+
+class A {
+private:
+  int i;
+  bool b;
+
+public:
+  A()
+    : i(0), b(false) {
+  }
+};
+
+class B {
+private:
+  int capacity;
+  A vec[];
+
+public:
+  void* operator new(size_t fixed_size, int c) {
+    return ::operator new(fixed_size + c*sizeof(B));
+  }
+
+  void operator delete(void* p) {
+    ::operator delete(p);
+  }
+
+  void operator delete(void* p, int) {
+    ::operator delete(p);
+  }
+
+  B(int s)
+    : capacity(s) {
+  }
+};
+
+int
+main() {
+  B* p = new (100) B(100);
+  delete p;
+  exit(0);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  ac_cxx_supports_flexible_arrays=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ac_cxx_supports_flexible_arrays=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+if test x"$ac_cxx_supports_flexible_arrays" = xyes
+then
+  value=1
+else
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define CXX_SUPPORTS_FLEXIBLE_ARRAYS $value
+_ACEOF
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Check whether the C++ compiler supports __attribute__ ((weak)).
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking whether the C++ compiler supports __attribute__ ((weak))" >&5
+echo $ECHO_N "checking whether the C++ compiler supports __attribute__ ((weak))... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+void
+foo() __attribute__ ((weak));
+
+void
+foo() {
+}
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  ac_cxx_supports_attribute_weak=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ac_cxx_supports_attribute_weak=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test x"$ac_cxx_supports_attribute_weak" = xyes
+then
+  value=1
+else
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define CXX_SUPPORTS_ATTRIBUTE_WEAK $value
+_ACEOF
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Checks for the availability of C library functions in C++.
+echo "$as_me:$LINENO: checking whether ffs is declared" >&5
+echo $ECHO_N "checking whether ffs is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_ffs+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <strings.h>
+
+int
+main ()
+{
+#ifndef ffs
+  char *p = (char *) ffs;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_ffs=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_ffs=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_ffs" >&5
+echo "${ECHO_T}$ac_cv_have_decl_ffs" >&6
+if test $ac_cv_have_decl_ffs = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FFS 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FFS 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether getenv is declared" >&5
+echo $ECHO_N "checking whether getenv is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_getenv+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <cstdlib>
+
+int
+main ()
+{
+#ifndef getenv
+  char *p = (char *) getenv;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_getenv=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_getenv=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getenv" >&6
+if test $ac_cv_have_decl_getenv = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETENV 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETENV 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether strtof is declared" >&5
+echo $ECHO_N "checking whether strtof is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_strtof+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <cstdlib>
+
+int
+main ()
+{
+#ifndef strtof
+  char *p = (char *) strtof;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_strtof=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_strtof=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtof" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtof" >&6
+if test $ac_cv_have_decl_strtof = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOF 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOF 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether strtod is declared" >&5
+echo $ECHO_N "checking whether strtod is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_strtod+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <cstdlib>
+
+int
+main ()
+{
+#ifndef strtod
+  char *p = (char *) strtod;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_strtod=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_strtod=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtod" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtod" >&6
+if test $ac_cv_have_decl_strtod = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOD 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOD 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether strtold is declared" >&5
+echo $ECHO_N "checking whether strtold is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_strtold+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <cstdlib>
+
+int
+main ()
+{
+#ifndef strtold
+  char *p = (char *) strtold;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_strtold=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_strtold=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtold" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtold" >&6
+if test $ac_cv_have_decl_strtold = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLD 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLD 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether strtoll is declared" >&5
+echo $ECHO_N "checking whether strtoll is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_strtoll+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <cstdlib>
+
+int
+main ()
+{
+#ifndef strtoll
+  char *p = (char *) strtoll;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_strtoll=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_strtoll=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoll" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtoll" >&6
+if test $ac_cv_have_decl_strtoll = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLL 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLL 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether strtoull is declared" >&5
+echo $ECHO_N "checking whether strtoull is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_strtoull+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <cstdlib>
+
+int
+main ()
+{
+#ifndef strtoull
+  char *p = (char *) strtoull;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_strtoull=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_strtoull=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoull" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtoull" >&6
+if test $ac_cv_have_decl_strtoull = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOULL 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOULL 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether fma is declared" >&5
+echo $ECHO_N "checking whether fma is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_fma+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <cmath>
+
+int
+main ()
+{
+#ifndef fma
+  char *p = (char *) fma;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_fma=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_fma=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_fma" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fma" >&6
+if test $ac_cv_have_decl_fma = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMA 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMA 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether fmaf is declared" >&5
+echo $ECHO_N "checking whether fmaf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_fmaf+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <cmath>
+
+int
+main ()
+{
+#ifndef fmaf
+  char *p = (char *) fmaf;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_fmaf=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_fmaf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_fmaf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fmaf" >&6
+if test $ac_cv_have_decl_fmaf = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAF 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAF 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether fmal is declared" >&5
+echo $ECHO_N "checking whether fmal is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_fmal+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <cmath>
+
+int
+main ()
+{
+#ifndef fmal
+  char *p = (char *) fmal;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_fmal=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_fmal=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_fmal" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fmal" >&6
+if test $ac_cv_have_decl_fmal = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAL 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAL 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether rintf is declared" >&5
+echo $ECHO_N "checking whether rintf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_rintf+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <cmath>
+
+int
+main ()
+{
+#ifndef rintf
+  char *p = (char *) rintf;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_rintf=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_rintf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_rintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_rintf" >&6
+if test $ac_cv_have_decl_rintf = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTF 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTF 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether rintl is declared" >&5
+echo $ECHO_N "checking whether rintl is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_rintl+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <cmath>
+
+int
+main ()
+{
+#ifndef rintl
+  char *p = (char *) rintl;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_rintl=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_rintl=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_rintl" >&5
+echo "${ECHO_T}$ac_cv_have_decl_rintl" >&6
+if test $ac_cv_have_decl_rintl = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTL 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTL 0
+_ACEOF
+
+
+fi
+
+
+
+# Checks for the availability of "fast" integral types.
+echo "$as_me:$LINENO: checking for int_fast16_t" >&5
+echo $ECHO_N "checking for int_fast16_t... $ECHO_C" >&6
+if test "${ac_cv_type_int_fast16_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((int_fast16_t *) 0)
+  return 0;
+if (sizeof (int_fast16_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_int_fast16_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_int_fast16_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_int_fast16_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_fast16_t" >&6
+if test $ac_cv_type_int_fast16_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST16_T 1
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking for int_fast32_t" >&5
+echo $ECHO_N "checking for int_fast32_t... $ECHO_C" >&6
+if test "${ac_cv_type_int_fast32_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((int_fast32_t *) 0)
+  return 0;
+if (sizeof (int_fast32_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_int_fast32_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_int_fast32_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_int_fast32_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_fast32_t" >&6
+if test $ac_cv_type_int_fast32_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST32_T 1
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking for int_fast64_t" >&5
+echo $ECHO_N "checking for int_fast64_t... $ECHO_C" >&6
+if test "${ac_cv_type_int_fast64_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((int_fast64_t *) 0)
+  return 0;
+if (sizeof (int_fast64_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_int_fast64_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_int_fast64_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_int_fast64_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_fast64_t" >&6
+if test $ac_cv_type_int_fast64_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST64_T 1
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking for uint_fast16_t" >&5
+echo $ECHO_N "checking for uint_fast16_t... $ECHO_C" >&6
+if test "${ac_cv_type_uint_fast16_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((uint_fast16_t *) 0)
+  return 0;
+if (sizeof (uint_fast16_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_uint_fast16_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_uint_fast16_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast16_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint_fast16_t" >&6
+if test $ac_cv_type_uint_fast16_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST16_T 1
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking for uint_fast32_t" >&5
+echo $ECHO_N "checking for uint_fast32_t... $ECHO_C" >&6
+if test "${ac_cv_type_uint_fast32_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((uint_fast32_t *) 0)
+  return 0;
+if (sizeof (uint_fast32_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_uint_fast32_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_uint_fast32_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast32_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint_fast32_t" >&6
+if test $ac_cv_type_uint_fast32_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST32_T 1
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking for uint_fast64_t" >&5
+echo $ECHO_N "checking for uint_fast64_t... $ECHO_C" >&6
+if test "${ac_cv_type_uint_fast64_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((uint_fast64_t *) 0)
+  return 0;
+if (sizeof (uint_fast64_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_uint_fast64_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_uint_fast64_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast64_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint_fast64_t" >&6
+if test $ac_cv_type_uint_fast64_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST64_T 1
+_ACEOF
+
+
+fi
+
+
+# Must link everything with libm.
+extra_libraries="${extra_libraries} -lm"
+
+# GMP library
+
+
+      if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval="$with_gnu_ld"
+  test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi;
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  echo "$as_me:$LINENO: checking for ld used by GCC" >&5
+echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | [A-Za-z]:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${acl_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break ;;
+      *)
+	test "$with_gnu_ld" != yes && break ;;
+      esac
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${acl_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  acl_cv_prog_gnu_ld=yes ;;
+*)
+  acl_cv_prog_gnu_ld=no ;;
+esac
+fi
+echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+
+                                                echo "$as_me:$LINENO: checking for shared library run path origin" >&5
+echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6
+if test "${acl_cv_rpath+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+
+fi
+echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5
+echo "${ECHO_T}$acl_cv_rpath" >&6
+  wl="$acl_cv_wl"
+  libext="$acl_cv_libext"
+  shlibext="$acl_cv_shlibext"
+  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  hardcode_direct="$acl_cv_hardcode_direct"
+  hardcode_minus_L="$acl_cv_hardcode_minus_L"
+    # Check whether --enable-rpath or --disable-rpath was given.
+if test "${enable_rpath+set}" = set; then
+  enableval="$enable_rpath"
+  :
+else
+  enable_rpath=yes
+fi;
+
+
+if test -n "$with_libgmpxx_prefix" && test -z "$with_libgmp_prefix"; then
+  with_libgmp_prefix="$with_libgmpxx_prefix"
+else
+  if test -n "$with_libgmp_prefix" && test -z "$with_libgmpxx_prefix"; then
+    with_libgmpxx_prefix="$with_libgmp_prefix"
+  fi
+fi
+
+
+
+
+
+
+  echo "$as_me:$LINENO: checking how to link with libgmp" >&5
+echo $ECHO_N "checking how to link with libgmp... $ECHO_C" >&6
+if test "${ac_cv_libgmp_libs+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libgmp-prefix or --without-libgmp-prefix was given.
+if test "${with_libgmp_prefix+set}" = set; then
+  withval="$with_libgmp_prefix"
+
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+
+fi;
+      LIBGMP=
+  LTLIBGMP=
+  INCGMP=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='gmp '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBGMP="${LIBGMP}${LIBGMP:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBGMP; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+                                LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$hardcode_direct" = yes; then
+                                                      LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                                                            LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBGMP; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBGMP="${LIBGMP}${LIBGMP:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                                                                                        LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBGMP="${LIBGMP}${LIBGMP:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBGMP="${LIBGMP}${LIBGMP:+ }$found_a"
+              else
+                                                LIBGMP="${LIBGMP}${LIBGMP:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCGMP; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCGMP="${INCGMP}${INCGMP:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBGMP; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBGMP="${LIBGMP}${LIBGMP:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBGMP; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBGMP="${LIBGMP}${LIBGMP:+ }$dep"
+                    LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBGMP="${LIBGMP}${LIBGMP:+ }-l$name"
+            LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBGMP="${LIBGMP}${LIBGMP:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBGMP="${LIBGMP}${LIBGMP:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-R$found_dir"
+    done
+  fi
+
+    ac_cv_libgmp_libs="$LIBGMP"
+    ac_cv_libgmp_ltlibs="$LTLIBGMP"
+    ac_cv_libgmp_cppflags="$INCGMP"
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_libgmp_libs" >&5
+echo "${ECHO_T}$ac_cv_libgmp_libs" >&6
+  LIBGMP="$ac_cv_libgmp_libs"
+  LTLIBGMP="$ac_cv_libgmp_ltlibs"
+  INCGMP="$ac_cv_libgmp_cppflags"
+
+  for element in $INCGMP; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+
+
+      HAVE_LIBGMP=yes
+
+
+
+
+
+
+
+
+
+  echo "$as_me:$LINENO: checking how to link with libgmpxx" >&5
+echo $ECHO_N "checking how to link with libgmpxx... $ECHO_C" >&6
+if test "${ac_cv_libgmpxx_libs+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libgmpxx-prefix or --without-libgmpxx-prefix was given.
+if test "${with_libgmpxx_prefix+set}" = set; then
+  withval="$with_libgmpxx_prefix"
+
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+
+fi;
+      LIBGMPXX=
+  LTLIBGMPXX=
+  INCGMPXX=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='gmpxx gmp'
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBGMPXX; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+                                LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$hardcode_direct" = yes; then
+                                                      LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                                                            LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBGMPXX; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                                                                                        LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_a"
+              else
+                                                LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCGMPXX; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCGMPXX="${INCGMPXX}${INCGMPXX:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBGMPXX; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBGMPXX; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$dep"
+                    LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-l$name"
+            LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-R$found_dir"
+    done
+  fi
+
+    ac_cv_libgmpxx_libs="$LIBGMPXX"
+    ac_cv_libgmpxx_ltlibs="$LTLIBGMPXX"
+    ac_cv_libgmpxx_cppflags="$INCGMPXX"
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_libgmpxx_libs" >&5
+echo "${ECHO_T}$ac_cv_libgmpxx_libs" >&6
+  LIBGMPXX="$ac_cv_libgmpxx_libs"
+  LTLIBGMPXX="$ac_cv_libgmpxx_ltlibs"
+  INCGMPXX="$ac_cv_libgmpxx_cppflags"
+
+  for element in $INCGMPXX; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+
+
+      HAVE_LIBGMPXX=yes
+
+
+
+
+ac_save_LIBS="$LIBS"
+LIBS="$LIBS $LIBGMPXX"
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for the GMP library version 4.1.3 or above" >&5
+echo $ECHO_N "checking for the GMP library version 4.1.3 or above... $ECHO_C" >&6
+if test "$cross_compiling" = yes; then
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ac_cv_have_gmp=no
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <gmpxx.h>
+
+#if __GNU_MP_VERSION < 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR < 1) || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR == 1 && __GNU_MP_VERSION_PATCHLEVEL < 3)
+#error "GMP version 4.1.3 or higher is required"
+#endif
+
+int main() {
+  mpz_class n("3141592653589793238462643383279502884");
+  return 0;
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  ac_cv_have_gmp=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ac_cv_have_gmp=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+have_gmp=${ac_cv_have_gmp}
+
+if test x"$ac_cv_have_gmp" = xyes
+then
+
+echo "$as_me:$LINENO: checking for mp_limb_t" >&5
+echo $ECHO_N "checking for mp_limb_t... $ECHO_C" >&6
+if test "${ac_cv_type_mp_limb_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+int
+main ()
+{
+if ((mp_limb_t *) 0)
+  return 0;
+if (sizeof (mp_limb_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_mp_limb_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_mp_limb_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_mp_limb_t" >&5
+echo "${ECHO_T}$ac_cv_type_mp_limb_t" >&6
+
+echo "$as_me:$LINENO: checking size of mp_limb_t" >&5
+echo $ECHO_N "checking size of mp_limb_t... $ECHO_C" >&6
+if test "${ac_cv_sizeof_mp_limb_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_mp_limb_t" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+		    if test $ac_lo -le $ac_mid; then
+		      ac_lo= ac_hi=
+		      break
+		    fi
+		    ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+		       if test $ac_mid -le $ac_hi; then
+			 ac_lo= ac_hi=
+			 break
+		       fi
+		       ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_mp_limb_t=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (mp_limb_t), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (mp_limb_t), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+long longval () { return (long) (sizeof (mp_limb_t)); }
+unsigned long ulongval () { return (long) (sizeof (mp_limb_t)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (mp_limb_t))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (mp_limb_t))))
+	exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (mp_limb_t))))
+	exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_mp_limb_t=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (mp_limb_t), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (mp_limb_t), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_mp_limb_t=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_mp_limb_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_mp_limb_t" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_MP_LIMB_T $ac_cv_sizeof_mp_limb_t
+_ACEOF
+
+
+
+echo "$as_me:$LINENO: checking whether GMP has been compiled with support for exceptions" >&5
+echo $ECHO_N "checking whether GMP has been compiled with support for exceptions... $ECHO_C" >&6
+if test "$cross_compiling" = yes; then
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ac_cv_gmp_supports_exceptions=no
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <gmpxx.h>
+#include <new>
+#include <cstddef>
+
+static void*
+x_malloc(size_t) {
+  throw std::bad_alloc();
+}
+
+static void*
+x_realloc(void*, size_t, size_t) {
+  throw std::bad_alloc();
+}
+
+static void
+x_free(void*, size_t) {
+}
+
+int main() {
+  mp_set_memory_functions(x_malloc, x_realloc, x_free);
+  try {
+    mpz_class n("3141592653589793238462643383279502884");
+  }
+  catch (std::bad_alloc&) {
+    return 0;
+  }
+  return 1;
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  ac_cv_gmp_supports_exceptions=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ac_cv_gmp_supports_exceptions=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+gmp_supports_exceptions=${ac_cv_gmp_supports_exceptions}
+if test x"$gmp_supports_exceptions" = xyes
+then
+  value=1
+else
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define GMP_SUPPORTS_EXCEPTIONS $value
+_ACEOF
+
+
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+LIBS="$ac_save_LIBS"
+
+gmp_library_option="$LTLIBGMPXX"
+
+
+if test x"$have_gmp" = xno
+then
+  { { echo "$as_me:$LINENO: error: Cannot find GMP version 4.1.3 or higher.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options." >&5
+echo "$as_me: error: Cannot find GMP version 4.1.3 or higher.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  if test x"$have_gmpxx" = xno
+  then
+    { { echo "$as_me:$LINENO: error: GMP compiled without enabling the C++ interface.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options." >&5
+echo "$as_me: error: GMP compiled without enabling the C++ interface.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options." >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+fi
+
+echo "$as_me:$LINENO: checking for __mpz_struct._mp_alloc" >&5
+echo $ECHO_N "checking for __mpz_struct._mp_alloc... $ECHO_C" >&6
+if test "${ac_cv_member___mpz_struct__mp_alloc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+int
+main ()
+{
+static __mpz_struct ac_aggr;
+if (ac_aggr._mp_alloc)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_member___mpz_struct__mp_alloc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+int
+main ()
+{
+static __mpz_struct ac_aggr;
+if (sizeof ac_aggr._mp_alloc)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_member___mpz_struct__mp_alloc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_member___mpz_struct__mp_alloc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_alloc" >&5
+echo "${ECHO_T}$ac_cv_member___mpz_struct__mp_alloc" >&6
+if test $ac_cv_member___mpz_struct__mp_alloc = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE___MPZ_STRUCT__MP_ALLOC 1
+_ACEOF
+
+
+else
+  gmp_has_changes=yes
+fi
+echo "$as_me:$LINENO: checking for __mpz_struct._mp_size" >&5
+echo $ECHO_N "checking for __mpz_struct._mp_size... $ECHO_C" >&6
+if test "${ac_cv_member___mpz_struct__mp_size+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+int
+main ()
+{
+static __mpz_struct ac_aggr;
+if (ac_aggr._mp_size)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_member___mpz_struct__mp_size=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+int
+main ()
+{
+static __mpz_struct ac_aggr;
+if (sizeof ac_aggr._mp_size)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_member___mpz_struct__mp_size=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_member___mpz_struct__mp_size=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_size" >&5
+echo "${ECHO_T}$ac_cv_member___mpz_struct__mp_size" >&6
+if test $ac_cv_member___mpz_struct__mp_size = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE___MPZ_STRUCT__MP_SIZE 1
+_ACEOF
+
+
+else
+  gmp_has_changes=yes
+fi
+echo "$as_me:$LINENO: checking for __mpz_struct._mp_d" >&5
+echo $ECHO_N "checking for __mpz_struct._mp_d... $ECHO_C" >&6
+if test "${ac_cv_member___mpz_struct__mp_d+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+int
+main ()
+{
+static __mpz_struct ac_aggr;
+if (ac_aggr._mp_d)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_member___mpz_struct__mp_d=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gmp.h>
+
+int
+main ()
+{
+static __mpz_struct ac_aggr;
+if (sizeof ac_aggr._mp_d)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_member___mpz_struct__mp_d=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_member___mpz_struct__mp_d=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_d" >&5
+echo "${ECHO_T}$ac_cv_member___mpz_struct__mp_d" >&6
+if test $ac_cv_member___mpz_struct__mp_d = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE___MPZ_STRUCT__MP_D 1
+_ACEOF
+
+
+else
+  gmp_has_changes=yes
+fi
+
+
+if test x"$gmp_has_changed" = xyes
+then
+  { { echo "$as_me:$LINENO: error: GMP HAS CHANGED:
+*** The PPL exploits some implementation details of GMP that were current
+*** until (at least) version 4.1.4 of GMP.  You seem to be using a version
+*** where these details have changed.
+*** Please report this to ppl-devel at cs.unipr.it." >&5
+echo "$as_me: error: GMP HAS CHANGED:
+*** The PPL exploits some implementation details of GMP that were current
+*** until (at least) version 4.1.4 of GMP.  You seem to be using a version
+*** where these details have changed.
+*** Please report this to ppl-devel at cs.unipr.it." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+extra_includes="${extra_includes}${extra_includes:+ }${gmp_includes_option}"
+extra_libraries="${extra_libraries}${extra_libraries:+ }${gmp_library_option}"
+
+enableval=yes
+echo "$as_me:$LINENO: checking whether to build the Parma Watchdog Library" >&5
+echo $ECHO_N "checking whether to build the Parma Watchdog Library... $ECHO_C" >&6
+# Check whether --enable-watchdog or --disable-watchdog was given.
+if test "${enable_watchdog+set}" = set; then
+  enableval="$enable_watchdog"
+
+fi;
+case "${enableval}" in
+yes)
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  ;;
+no)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+*)
+  { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-watchdog, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-watchdog, needs yes or no" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+esac
+build_watchdog_library=$enableval
+
+
+if test x"$build_watchdog_library" = xyes; then
+  BUILD_WATCHDOG_LIBRARY_TRUE=
+  BUILD_WATCHDOG_LIBRARY_FALSE='#'
+else
+  BUILD_WATCHDOG_LIBRARY_TRUE='#'
+  BUILD_WATCHDOG_LIBRARY_FALSE=
+fi
+
+
+# Enabled or not, the Watchdog subdirectory must be configured.
+
+
+subdirs="$subdirs Watchdog"
+
+
+# This is the list of available interfaces: lowercase and blank-separated.
+available_interfaces="cxx c ciao_prolog gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog"
+
+# This is the list of interfaces that are enabled by default.
+#default_interfaces="cxx c swi_prolog"
+default_interfaces=${available_interfaces}
+
+enableval=not_specified
+echo "$as_me:$LINENO: checking which interfaces are enabled" >&5
+echo $ECHO_N "checking which interfaces are enabled... $ECHO_C" >&6
+# Check whether --enable-interfaces or --disable-interfaces was given.
+if test "${enable_interfaces+set}" = set; then
+  enableval="$enable_interfaces"
+
+fi;
+case x"${enableval}" in
+xyes | x)
+  { { echo "$as_me:$LINENO: error: --enable-interfaces needs at least one argument chosen among ${available_interfaces}, none and all" >&5
+echo "$as_me: error: --enable-interfaces needs at least one argument chosen among ${available_interfaces}, none and all" >&2;}
+   { (exit 1); exit 1; }; }
+  ;;
+xnone | xno)
+  for interface in ${available_interfaces}
+  do
+    eval ${interface}_interface_enabled=no
+  done
+  echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+  ;;
+xall)
+  for interface in ${available_interfaces}
+  do
+    eval ${interface}_interface_enabled=yes
+  done
+  echo "$as_me:$LINENO: result: ${available_interfaces}" >&5
+echo "${ECHO_T}${available_interfaces}" >&6
+  ;;
+*)
+  if test x"${enableval}" = xnot_specified
+  then
+    enableval=${default_interfaces}
+  fi
+  # Make the list blank-separated and lowercase; turn "c++" into "cxx".
+  required_interfaces=`echo "${enableval}" | sed -e 's/-/_/g' -e 's/[ 	,][ 	,]*/ /g' -e 's/c++/cxx/g' | tr '[:upper:]' '[:lower:]'`
+  # Check that the specified interfaces exist.
+  for interface in ${required_interfaces}
+  do
+    case " ${available_interfaces} " in
+    *\ ${interface}\ *)
+      ;;
+    *)
+      { { echo "$as_me:$LINENO: error: unknown interface ${interface}: must be one of ${available_interfaces}" >&5
+echo "$as_me: error: unknown interface ${interface}: must be one of ${available_interfaces}" >&2;}
+   { (exit 1); exit 1; }; }
+      ;;
+    esac
+  done
+  # Initialize the enabled variable for each interface.
+  for interface in ${available_interfaces}
+  do
+    case " ${required_interfaces} " in
+    *\ ${interface}\ *)
+      eval ${interface}_interface_enabled=yes
+      enabled_interfaces="${enabled_interfaces}${enabled_interfaces:+ }${interface}"
+      ;;
+    *)
+      eval ${interface}_interface_enabled=no
+      ;;
+    esac
+  done
+  echo "$as_me:$LINENO: result: ${enabled_interfaces}" >&5
+echo "${ECHO_T}${enabled_interfaces}" >&6
+  ;;
+esac
+
+# Set an Automake conditional to build or not to build the C interface.
+
+
+if test x${c_interface_enabled} = xyes; then
+  BUILD_C_INTERFACE_TRUE=
+  BUILD_C_INTERFACE_FALSE='#'
+else
+  BUILD_C_INTERFACE_TRUE='#'
+  BUILD_C_INTERFACE_FALSE=
+fi
+
+
+# Checks for Prolog systems for which the interface is enabled.
+
+# Ciao Prolog
+if test x${ciao_prolog_interface_enabled} = xyes
+then
+  # Extract the first word of "ciao", so it can be a program name with args.
+set dummy ciao; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CIAO_PROLOG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CIAO_PROLOG"; then
+  ac_cv_prog_CIAO_PROLOG="$CIAO_PROLOG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CIAO_PROLOG="ciao"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CIAO_PROLOG=$ac_cv_prog_CIAO_PROLOG
+if test -n "$CIAO_PROLOG"; then
+  echo "$as_me:$LINENO: result: $CIAO_PROLOG" >&5
+echo "${ECHO_T}$CIAO_PROLOG" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  if test x"$CIAO_PROLOG" = xciao
+  then
+  if test "${ac_cv_header_ciao_prolog_h+set}" = set; then
+  echo "$as_me:$LINENO: checking for ciao_prolog.h" >&5
+echo $ECHO_N "checking for ciao_prolog.h... $ECHO_C" >&6
+if test "${ac_cv_header_ciao_prolog_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_ciao_prolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_ciao_prolog_h" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking ciao_prolog.h usability" >&5
+echo $ECHO_N "checking ciao_prolog.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <ciao_prolog.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking ciao_prolog.h presence" >&5
+echo $ECHO_N "checking ciao_prolog.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ciao_prolog.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: ciao_prolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: ciao_prolog.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: ciao_prolog.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: ciao_prolog.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: ciao_prolog.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: ciao_prolog.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: ciao_prolog.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: ciao_prolog.h: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for ciao_prolog.h" >&5
+echo $ECHO_N "checking for ciao_prolog.h... $ECHO_C" >&6
+if test "${ac_cv_header_ciao_prolog_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_ciao_prolog_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_ciao_prolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_ciao_prolog_h" >&6
+
+fi
+if test $ac_cv_header_ciao_prolog_h = yes; then
+  :
+else
+  CIAO_PROLOG=""
+fi
+
+
+  fi
+fi
+
+
+if test x$CIAO_PROLOG = xciao; then
+  BUILD_CIAO_PROLOG_INTERFACE_TRUE=
+  BUILD_CIAO_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_CIAO_PROLOG_INTERFACE_TRUE='#'
+  BUILD_CIAO_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# GNU Prolog
+if test x${gnu_prolog_interface_enabled} = xyes
+then
+  # Extract the first word of "gprolog", so it can be a program name with args.
+set dummy gprolog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_GNU_PROLOG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$GNU_PROLOG"; then
+  ac_cv_prog_GNU_PROLOG="$GNU_PROLOG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_GNU_PROLOG="gprolog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+GNU_PROLOG=$ac_cv_prog_GNU_PROLOG
+if test -n "$GNU_PROLOG"; then
+  echo "$as_me:$LINENO: result: $GNU_PROLOG" >&5
+echo "${ECHO_T}$GNU_PROLOG" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  if test x"$GNU_PROLOG" = xgprolog
+  then
+    if test "${ac_cv_header_gprolog_h+set}" = set; then
+  echo "$as_me:$LINENO: checking for gprolog.h" >&5
+echo $ECHO_N "checking for gprolog.h... $ECHO_C" >&6
+if test "${ac_cv_header_gprolog_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_gprolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_gprolog_h" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking gprolog.h usability" >&5
+echo $ECHO_N "checking gprolog.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <gprolog.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking gprolog.h presence" >&5
+echo $ECHO_N "checking gprolog.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <gprolog.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: gprolog.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: gprolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: gprolog.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: gprolog.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: gprolog.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: gprolog.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: gprolog.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: gprolog.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: gprolog.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gprolog.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: gprolog.h: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for gprolog.h" >&5
+echo $ECHO_N "checking for gprolog.h... $ECHO_C" >&6
+if test "${ac_cv_header_gprolog_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_gprolog_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_gprolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_gprolog_h" >&6
+
+fi
+if test $ac_cv_header_gprolog_h = yes; then
+  :
+else
+  GNU_PROLOG=""
+fi
+
+
+  fi
+fi
+
+
+if test x$GNU_PROLOG = xgprolog; then
+  BUILD_GNU_PROLOG_INTERFACE_TRUE=
+  BUILD_GNU_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_GNU_PROLOG_INTERFACE_TRUE='#'
+  BUILD_GNU_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# SICStus
+if test x${sicstus_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "sicstus", so it can be a program name with args.
+set dummy sicstus; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_sicstus_prolog+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $sicstus_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_sicstus_prolog="$sicstus_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_sicstus_prolog="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  ;;
+esac
+fi
+sicstus_prolog=$ac_cv_path_sicstus_prolog
+
+if test -n "$sicstus_prolog"; then
+  echo "$as_me:$LINENO: result: $sicstus_prolog" >&5
+echo "${ECHO_T}$sicstus_prolog" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test x$sicstus_prolog != x
+then
+        sicstus_prolog_base=$(dirname $($sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt."))
+  SICSTUS_PROLOG_INCLUDE_OPTIONS="-I${sicstus_prolog_base}/include"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $SICSTUS_PROLOG_INCLUDE_OPTIONS"
+  ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  # We require SICStus Prolog 3.9.1 or later.
+  if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then
+  echo "$as_me:$LINENO: checking for sicstus/sicstus.h" >&5
+echo $ECHO_N "checking for sicstus/sicstus.h... $ECHO_C" >&6
+if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_sicstus_sicstus_h" >&5
+echo "${ECHO_T}$ac_cv_header_sicstus_sicstus_h" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking sicstus/sicstus.h usability" >&5
+echo $ECHO_N "checking sicstus/sicstus.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <sicstus/sicstus.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking sicstus/sicstus.h presence" >&5
+echo $ECHO_N "checking sicstus/sicstus.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sicstus/sicstus.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for sicstus/sicstus.h" >&5
+echo $ECHO_N "checking for sicstus/sicstus.h... $ECHO_C" >&6
+if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_sicstus_sicstus_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_sicstus_sicstus_h" >&5
+echo "${ECHO_T}$ac_cv_header_sicstus_sicstus_h" >&6
+
+fi
+if test $ac_cv_header_sicstus_sicstus_h = yes; then
+  echo "$as_me:$LINENO: checking for SICStus version 3.9.1 or later" >&5
+echo $ECHO_N "checking for SICStus version 3.9.1 or later... $ECHO_C" >&6
+                  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+                      #include <sicstus/sicstus.h>
+                      #if SICSTUS_MAJOR_VERSION > 3 || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION > 9) || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION == 9 && SICSTUS_REVISION_VERSION >= 1)
+                      yes
+                      #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  sicstus_prolog=""
+                    echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+fi
+rm -f conftest*
+
+else
+  sicstus_prolog=""
+fi
+
+
+  ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
+fi
+
+if test x$sicstus_prolog != x
+then
+  have_sicstus_prolog=yes
+else
+  have_sicstus_prolog=no
+fi
+
+fi
+
+
+if test x$have_sicstus_prolog = xyes; then
+  BUILD_SICSTUS_PROLOG_INTERFACE_TRUE=
+  BUILD_SICSTUS_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_SICSTUS_PROLOG_INTERFACE_TRUE='#'
+  BUILD_SICSTUS_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# SWI Prolog
+if test x${swi_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "swi-prolog", so it can be a program name with args.
+set dummy swi-prolog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_swi_prolog+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $swi_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+
+if test -n "$swi_prolog"; then
+  echo "$as_me:$LINENO: result: $swi_prolog" >&5
+echo "${ECHO_T}$swi_prolog" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test -z $swi_prolog
+then
+  # Extract the first word of "swipl", so it can be a program name with args.
+set dummy swipl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_swi_prolog+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $swi_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+
+if test -n "$swi_prolog"; then
+  echo "$as_me:$LINENO: result: $swi_prolog" >&5
+echo "${ECHO_T}$swi_prolog" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  if test -z $swi_prolog
+  then
+    # Extract the first word of "pl", so it can be a program name with args.
+set dummy pl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_swi_prolog+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $swi_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+
+if test -n "$swi_prolog"; then
+  echo "$as_me:$LINENO: result: $swi_prolog" >&5
+echo "${ECHO_T}$swi_prolog" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  fi
+fi
+if test x$swi_prolog != x
+then
+  swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\(.*\)";/\1/'`
+  swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";/\1/'`
+
+
+  SWI_PROLOG_INCLUDE_OPTIONS="-I${swi_prolog_base}/include"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $SWI_PROLOG_INCLUDE_OPTIONS"
+  ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  # We require SWI-Prolog 5.6.0 or later.
+  if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then
+  echo "$as_me:$LINENO: checking for SWI-Prolog.h" >&5
+echo $ECHO_N "checking for SWI-Prolog.h... $ECHO_C" >&6
+if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_SWI_Prolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_SWI_Prolog_h" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking SWI-Prolog.h usability" >&5
+echo $ECHO_N "checking SWI-Prolog.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <SWI-Prolog.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking SWI-Prolog.h presence" >&5
+echo $ECHO_N "checking SWI-Prolog.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <SWI-Prolog.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: SWI-Prolog.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: SWI-Prolog.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for SWI-Prolog.h" >&5
+echo $ECHO_N "checking for SWI-Prolog.h... $ECHO_C" >&6
+if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_SWI_Prolog_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_SWI_Prolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_SWI_Prolog_h" >&6
+
+fi
+if test $ac_cv_header_SWI_Prolog_h = yes; then
+  echo "$as_me:$LINENO: checking for SWI-Prolog version 5.6.0 or later" >&5
+echo $ECHO_N "checking for SWI-Prolog version 5.6.0 or later... $ECHO_C" >&6
+                  cat >conftest.$ac_ext <<_ACEOF
+#include <SWI-Prolog.h>
+
+int
+main() {
+#if !defined(PLVERSION) || PLVERSION < 50600
+  choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+swi_prolog=""
+                    echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  swi_prolog=""
+fi
+
+
+  ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
+fi
+
+if test x$swi_prolog != x
+then
+  have_swi_prolog=yes
+else
+  have_swi_prolog=no
+fi
+
+fi
+
+
+if test x$have_swi_prolog = xyes; then
+  BUILD_SWI_PROLOG_INTERFACE_TRUE=
+  BUILD_SWI_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_SWI_PROLOG_INTERFACE_TRUE='#'
+  BUILD_SWI_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# XSB
+if test x${xsb_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "xsb", so it can be a program name with args.
+set dummy xsb; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_xsb_prolog+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $xsb_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_xsb_prolog="$xsb_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_xsb_prolog="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  ;;
+esac
+fi
+xsb_prolog=$ac_cv_path_xsb_prolog
+
+if test -n "$xsb_prolog"; then
+  echo "$as_me:$LINENO: result: $xsb_prolog" >&5
+echo "${ECHO_T}$xsb_prolog" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test x$xsb_prolog != x
+then
+        xsb_emu_dir=$(xsb --nobanner --quietload --noprompt \
+                -e "write('emudir='), \
+                  xsb_configuration(emudir, X), write(X), nl, halt." \
+                    2>/dev/null | sed "s/^emudir=//g")
+  xsb_config_dir=$(xsb --nobanner --quietload --noprompt \
+                   -e "write('config_dir='), \
+                     xsb_configuration(config_dir,X), write(X), nl, halt." \
+                       2>/dev/null | sed "s/^config_dir=//g")
+  XSB_PROLOG_INCLUDE_OPTIONS="-I${xsb_emu_dir} -I${xsb_config_dir}"
+
+fi
+
+if test x$xsb_prolog != x
+then
+  have_xsb_prolog=yes
+else
+  have_xsb_prolog=no
+fi
+
+fi
+
+
+if test x$have_xsb_prolog = xyes; then
+  BUILD_XSB_PROLOG_INTERFACE_TRUE=
+  BUILD_XSB_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_XSB_PROLOG_INTERFACE_TRUE='#'
+  BUILD_XSB_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# YAP
+if test x${yap_prolog_interface_enabled} = xyes
+then
+  # Extract the first word of "yap", so it can be a program name with args.
+set dummy yap; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_YAP_PROLOG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$YAP_PROLOG"; then
+  ac_cv_prog_YAP_PROLOG="$YAP_PROLOG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_YAP_PROLOG="yap"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+YAP_PROLOG=$ac_cv_prog_YAP_PROLOG
+if test -n "$YAP_PROLOG"; then
+  echo "$as_me:$LINENO: result: $YAP_PROLOG" >&5
+echo "${ECHO_T}$YAP_PROLOG" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  if test x"$YAP_PROLOG" = xyap
+  then
+    if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then
+  echo "$as_me:$LINENO: checking for Yap/c_interface.h" >&5
+echo $ECHO_N "checking for Yap/c_interface.h... $ECHO_C" >&6
+if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_Yap_c_interface_h" >&5
+echo "${ECHO_T}$ac_cv_header_Yap_c_interface_h" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking Yap/c_interface.h usability" >&5
+echo $ECHO_N "checking Yap/c_interface.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <Yap/c_interface.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking Yap/c_interface.h presence" >&5
+echo $ECHO_N "checking Yap/c_interface.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <Yap/c_interface.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: Yap/c_interface.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: Yap/c_interface.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for Yap/c_interface.h" >&5
+echo $ECHO_N "checking for Yap/c_interface.h... $ECHO_C" >&6
+if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_Yap_c_interface_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_Yap_c_interface_h" >&5
+echo "${ECHO_T}$ac_cv_header_Yap_c_interface_h" >&6
+
+fi
+if test $ac_cv_header_Yap_c_interface_h = yes; then
+  :
+else
+  YAP_PROLOG=""
+fi
+
+
+  fi
+fi
+
+
+if test x$YAP_PROLOG = xyap; then
+  BUILD_YAP_PROLOG_INTERFACE_TRUE=
+  BUILD_YAP_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_YAP_PROLOG_INTERFACE_TRUE='#'
+  BUILD_YAP_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# # This is the list of interfaces that are enabled by default.
+# # Different instantiations are separated by a '@' character.
+# default_instantiations="Polyhedron @ BD_Shape<int8_t>"
+#
+# enableval=not_specified
+# AC_MSG_CHECKING([which instantiations are enabled])
+# AC_ARG_ENABLE(instantiations,
+#   AC_HELP_STRING([--enable-instantiations],
+#     [enable instantiations for the non-C++ interfaces]))
+# case x"${enableval}" in
+# xyes | x)
+#   AC_MSG_ERROR([--enable-instantiations needs at least one argument])
+#   ;;
+# xno | xnone)
+#   enabled_instantiations=
+#   AC_MSG_RESULT(none)
+#   ;;
+# *)
+#   if test x"${enableval}" = xnot_specified
+#   then
+#     enableval=${default_instantiations}
+#   fi
+#   # Make the list blank-separated.
+#   required_instantiations=`echo "${enableval}" | sed -e 's/[[ 	]][[ 	]]*//g' -e 's/@/ /g' -e 's/[[ 	]][[ 	]]*/ /g'`
+#   # Check the specified instantiations for validity.
+#   ac_save_CPPFLAGS="$CPPFLAGS"
+#   CPPFLAGS="$CPPFLAGS -I${srcdir}"
+#   for instantiation in ${required_instantiations}
+#   do
+#     AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+# #include "instchk.hh"
+#
+# using namespace Parma_Polyhedra_Library;
+#
+# bool valid = ${instantiation}::valid_instantiation();
+# ]])],
+#       valid_instantiation=yes,
+#       valid_instantiation=no)
+#     if test x${valid_instantiation} != xyes
+#     then
+#       AC_MSG_ERROR([invalid instantiation ${instantiation}])
+#     fi
+#   done
+#   CPPFLAGS="$ac_save_CPPFLAGS"
+#   AC_MSG_RESULT([${required_instantiations}])
+#   ;;
+# esac
+
+# Libtool.
+# Turn off shared libraries during beta-testing, since they
+# make debugging harder and the build process takes too long.
+#AC_DISABLE_SHARED
+
+
+
+
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+  enableval="$enable_shared"
+  p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi;
+
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+  enableval="$enable_static"
+  p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi;
+
+# Check whether --enable-fast-install or --disable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+  enableval="$enable_fast_install"
+  p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi;
+
+echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
+if test "${lt_cv_path_SED+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+
+fi
+
+SED=$lt_cv_path_SED
+echo "$as_me:$LINENO: result: $SED" >&5
+echo "${ECHO_T}$SED" >&6
+
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval="$with_gnu_ld"
+  test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi;
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
+echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
+if test "${lt_cv_path_NM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi
+fi
+echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+echo "${ECHO_T}$lt_cv_path_NM" >&6
+NM="$lt_cv_path_NM"
+
+echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
+echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump'.
+  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | kfreebsd*-gnu | dragonfly*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix3*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+nto-qnx*)
+  lt_cv_deplibs_check_method=unknown
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+  enableval="$enable_libtool_lock"
+
+fi;
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *ELF-32*)
+      HPUX_IA64_MODE="32"
+      ;;
+    *ELF-64*)
+      HPUX_IA64_MODE="64"
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line 16042 "configure"' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+   if test "$lt_cv_prog_gnu_ld" = yes; then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -melf32bsmip"
+      ;;
+    *N32*)
+      LD="${LD-ld} -melf32bmipn32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -melf64bmip"
+      ;;
+    esac
+   else
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -32"
+      ;;
+    *N32*)
+      LD="${LD-ld} -n32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -64"
+      ;;
+    esac
+   fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.o` in
+    *32-bit*)
+      case $host in
+        x86_64-*linux*)
+          LD="${LD-ld} -m elf_i386"
+          ;;
+        ppc64-*linux*|powerpc64-*linux*)
+          LD="${LD-ld} -m elf32ppclinux"
+          ;;
+        s390x-*linux*)
+          LD="${LD-ld} -m elf_s390"
+          ;;
+        sparc64-*linux*)
+          LD="${LD-ld} -m elf32_sparc"
+          ;;
+      esac
+      ;;
+    *64-bit*)
+      case $host in
+        x86_64-*linux*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        ppc*-*linux*|powerpc*-*linux*)
+          LD="${LD-ld} -m elf64ppc"
+          ;;
+        s390*-*linux*)
+          LD="${LD-ld} -m elf64_s390"
+          ;;
+        sparc*-*linux*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
+if test "${lt_cv_cc_needs_belf+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  lt_cv_cc_needs_belf=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+lt_cv_cc_needs_belf=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)    LD="${LD-ld} -64" ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_DLLTOOL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  echo "$as_me:$LINENO: result: $DLLTOOL" >&5
+echo "${ECHO_T}$DLLTOOL" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_DLLTOOL" && ac_cv_prog_ac_ct_DLLTOOL="false"
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5
+echo "${ECHO_T}$ac_ct_DLLTOOL" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  DLLTOOL=$ac_ct_DLLTOOL
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AS"; then
+  ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AS="${ac_tool_prefix}as"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AS=$ac_cv_prog_AS
+if test -n "$AS"; then
+  echo "$as_me:$LINENO: result: $AS" >&5
+echo "${ECHO_T}$AS" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AS"; then
+  ac_ct_AS=$AS
+  # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_AS"; then
+  ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AS="as"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_AS" && ac_cv_prog_ac_ct_AS="false"
+fi
+fi
+ac_ct_AS=$ac_cv_prog_ac_ct_AS
+if test -n "$ac_ct_AS"; then
+  echo "$as_me:$LINENO: result: $ac_ct_AS" >&5
+echo "${ECHO_T}$ac_ct_AS" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  AS=$ac_ct_AS
+else
+  AS="$ac_cv_prog_AS"
+fi
+
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_OBJDUMP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  echo "$as_me:$LINENO: result: $OBJDUMP" >&5
+echo "${ECHO_T}$OBJDUMP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_OBJDUMP" && ac_cv_prog_ac_ct_OBJDUMP="false"
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5
+echo "${ECHO_T}$ac_ct_OBJDUMP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  OBJDUMP=$ac_ct_OBJDUMP
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+  ;;
+
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+
+for ac_header in dlfcn.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+fi
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$F77"; then
+  ac_cv_prog_F77="$F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+F77=$ac_cv_prog_F77
+if test -n "$F77"; then
+  echo "$as_me:$LINENO: result: $F77" >&5
+echo "${ECHO_T}$F77" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$F77" && break
+  done
+fi
+if test -z "$F77"; then
+  ac_ct_F77=$F77
+  for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_F77"; then
+  ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_F77="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_F77=$ac_cv_prog_ac_ct_F77
+if test -n "$ac_ct_F77"; then
+  echo "$as_me:$LINENO: result: $ac_ct_F77" >&5
+echo "${ECHO_T}$ac_ct_F77" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_F77" && break
+done
+
+  F77=$ac_ct_F77
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:16945:" \
+     "checking for Fortran 77 compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+rm -f a.out
+
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file.  (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6
+if test "${ac_cv_f77_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+      program main
+#ifndef __GNUC__
+       choke me
+#endif
+
+      end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_f77_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_f77_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6
+ac_ext=$ac_save_ext
+ac_test_FFLAGS=${FFLAGS+set}
+ac_save_FFLAGS=$FFLAGS
+FFLAGS=
+echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5
+echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_f77_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  FFLAGS=-g
+cat >conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_f77_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_f77_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_f77_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5
+echo "${ECHO_T}$ac_cv_prog_f77_g" >&6
+if test "$ac_test_FFLAGS" = set; then
+  FFLAGS=$ac_save_FFLAGS
+elif test $ac_cv_prog_f77_g = yes; then
+  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+    FFLAGS="-g -O2"
+  else
+    FFLAGS="-g"
+  fi
+else
+  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+    FFLAGS="-O2"
+  else
+    FFLAGS=
+  fi
+fi
+
+G77=`test $ac_compiler_gnu = yes && echo yes`
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+
+# find the maximum length of command line arguments
+echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ 	]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    # If test is not a shell built-in, we'll probably end up computing a
+    # maximum length that is only half of the actual maximum length, but
+    # we can't tell.
+    SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+    while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
+	       = "XX$teststring") >/dev/null 2>&1 &&
+	    new_result=`expr "X$teststring" : ".*" 2>&1` &&
+	    lt_cv_sys_max_cmd_len=$new_result &&
+	    test $i != 17 # 1/2 MB should be enough
+    do
+      i=`expr $i + 1`
+      teststring=$teststring$teststring
+    done
+    teststring=
+    # Add a significant safety factor because C++ compilers can tack on massive
+    # amounts of additional arguments before passing them to the linker.
+    # It appears as though 1/2 is a usable value.
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6
+else
+  echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+fi
+
+
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*) # Its linker distinguishes data from code symbols
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+  lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  ;;
+linux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDGIRSTW]'
+    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ 	]\($symcode$symcode*\)[ 	][ 	]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
+  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if grep ' nm_test_var$' "$nlist" >/dev/null; then
+	if grep ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+	  cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+	  cat <<\EOF >> conftest.$ac_ext
+  {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -f conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6
+else
+  echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+fi
+
+echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6
+if test "${lt_cv_objdir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+echo "${ECHO_T}$lt_cv_objdir" >&6
+objdir=$lt_cv_objdir
+
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="${ac_tool_prefix}ar"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="ar"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false"
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  AR=$ac_ct_AR
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  RANLIB=$ac_ct_RANLIB
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  STRIP=$ac_ct_STRIP
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+enable_dlopen=yes
+enable_win32_dll=yes
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+  enableval="$enable_libtool_lock"
+
+fi;
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+
+# Check whether --with-pic or --without-pic was given.
+if test "${with_pic+set}" = set; then
+  withval="$with_pic"
+  pic_mode="$withval"
+else
+  pic_mode=default
+fi;
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+  ac_outfile=conftest.$ac_objext
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:18008: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:18012: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+      ;;
+
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    interix3*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+      darwin*)
+        # PIC is the default on this platform
+        # Common symbols not allowed in MH_DYLIB files
+       case $cc_basename in
+         xlc*)
+         lt_prog_compiler_pic='-qnocommon'
+         lt_prog_compiler_wl='-Wl,'
+         ;;
+       esac
+       ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    linux*)
+      case $cc_basename in
+      icc* | ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      esac
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_pic_works=no
+  ac_outfile=conftest.$ac_objext
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:18276: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:18280: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_prog_compiler_pic_works=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6
+
+if test x"$lt_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   printf "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_prog_compiler_static_works=yes
+       fi
+     else
+       lt_prog_compiler_static_works=yes
+     fi
+   fi
+   $rm conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works" >&6
+
+if test x"$lt_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:18380: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:18384: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+  runpath_var=
+  allow_undefined_flag=
+  enable_shared_with_static_runtimes=no
+  archive_cmds=
+  archive_expsym_cmds=
+  old_archive_From_new_cmds=
+  old_archive_from_expsyms_cmds=
+  export_dynamic_flag_spec=
+  whole_archive_flag_spec=
+  thread_safe_flag_spec=
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_flag_spec_ld=
+  hardcode_libdir_separator=
+  hardcode_direct=no
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  link_all_deplibs=unknown
+  hardcode_automatic=no
+  module_cmds=
+  module_expsym_cmds=
+  always_export_symbols=no
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  extract_expsyms_cmds=
+  # Just being paranoid about ensuring that cc_basename is set.
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+  case $host_os in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+	whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+  	whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>/dev/null` in
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+
+      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can't use
+      # them.
+      ld_shlibs=no
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    interix3*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    linux*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	tmp_addflag=
+	case $cc_basename,$host_cpu in
+	pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	esac
+	archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+	if test $supports_anon_versioning = yes; then
+	  archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~
+  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+  $echo "local: *; };" >> $output_objdir/$libname.ver~
+	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+	  for ld_flag in $LDFLAGS; do
+  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+  	    aix_use_runtimelinking=yes
+  	    break
+  	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" && \
+  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  then
+  	  # We have reworked collect2
+  	  hardcode_direct=yes
+	  else
+  	  # We have old collect2
+  	  hardcode_direct=unsupported
+  	  # It fails to find uninstalled libraries when the uninstalled
+  	  # path is not listed in the libpath.  Setting hardcode_minus_L
+  	  # to unsupported forces relinking
+  	  hardcode_minus_L=yes
+  	  hardcode_libdir_flag_spec='-L$libdir'
+  	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+  	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+       # Determine the default libpath from the value encoded in an empty executable.
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+       hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+       else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an empty executable.
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec='$convenience'
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs=no
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      allow_undefined_flag=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_From_new_cmds='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    darwin* | rhapsody*)
+      case $host_os in
+        rhapsody* | darwin1.[012])
+         allow_undefined_flag='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[012])
+               allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+      esac
+      archive_cmds_need_lc=no
+      hardcode_direct=no
+      hardcode_automatic=yes
+      hardcode_shlibpath_var=unsupported
+      whole_archive_flag_spec=''
+      link_all_deplibs=yes
+    if test "$GCC" = yes ; then
+    	output_verbose_link_cmd='echo'
+        archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+      archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      module_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+         archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+         module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+         archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          module_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         ld_shlibs=no
+          ;;
+      esac
+    fi
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    freebsd1*)
+      ld_shlibs=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | kfreebsd*-gnu | dragonfly*)
+      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	hardcode_direct=yes
+	export_dynamic_flag_spec='${wl}-E'
+
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_libdir_flag_spec_ld='+b $libdir'
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_ld='-rpath $libdir'
+      fi
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      link_all_deplibs=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    openbsd*)
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec='${wl}-E'
+      else
+       case $host_os in
+	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	   archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	   hardcode_libdir_flag_spec='-R$libdir'
+	   ;;
+	 *)
+	   archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	   hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	   ;;
+       esac
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z text'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+      else
+	wlarc=''
+	archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+ 	# The compiler driver will combine linker options so we
+ 	# cannot just pass the convience library names through
+ 	# without $wl, iff we do not link with $LD.
+ 	# Luckily, gcc supports the same syntax we need for Sun Studio.
+ 	# Supported since Solaris 2.6 (maybe 2.5.1?)
+ 	case $wlarc in
+ 	'')
+ 	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+ 	*)
+ 	  whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ 	esac ;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+      $rm conftest*
+      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl
+	pic_flag=$lt_prog_compiler_pic
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag
+        allow_undefined_flag=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc=no
+        else
+	  archive_cmds_need_lc=yes
+        fi
+        allow_undefined_flag=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+echo "${ECHO_T}$archive_cmds_need_lc" >&6
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+  if test "$GCC" = yes; then
+    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+  else
+    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+  fi
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+kfreebsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  freebsd*) # from 4.6 on
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix3*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+knetbsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+   test -n "$runpath_var" || \
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6
+
+if test "$hardcode_action" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+striplib=
+old_striplib=
+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+   darwin*)
+       if test -n "$STRIP" ; then
+         striplib="$STRIP -x"
+         echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+       else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+       ;;
+   *)
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+    ;;
+  esac
+fi
+
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+   ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+   ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_dl_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+   ;;
+
+  *)
+    echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+if test "${ac_cv_func_shl_load+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define shl_load innocuous_shl_load
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char shl_load (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef shl_load
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char shl_load ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+char (*f) () = shl_load;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != shl_load;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_shl_load=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+if test $ac_cv_func_shl_load = yes; then
+  lt_cv_dlopen="shl_load"
+else
+  echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char shl_load ();
+int
+main ()
+{
+shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_dld_shl_load=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+if test $ac_cv_lib_dld_shl_load = yes; then
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
+else
+  echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+if test "${ac_cv_func_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define dlopen innocuous_dlopen
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char dlopen (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef dlopen
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlopen ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+char (*f) () = dlopen;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != dlopen;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+if test $ac_cv_func_dlopen = yes; then
+  lt_cv_dlopen="dlopen"
+else
+  echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_dl_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_svld_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_svld_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+if test $ac_cv_lib_svld_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dld_link ();
+int
+main ()
+{
+dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_dld_dld_link=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_dld_link=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
+if test $ac_cv_lib_dld_dld_link = yes; then
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+#line 20725 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+    exit (status);
+}
+EOF
+  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+#line 20825 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+    exit (status);
+}
+EOF
+  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+# Report which library types will actually be built
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+
+aix4* | aix5*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+    ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler \
+    CC \
+    LD \
+    lt_prog_compiler_wl \
+    lt_prog_compiler_pic \
+    lt_prog_compiler_static \
+    lt_prog_compiler_no_builtin_flag \
+    export_dynamic_flag_spec \
+    thread_safe_flag_spec \
+    whole_archive_flag_spec \
+    enable_shared_with_static_runtimes \
+    old_archive_cmds \
+    old_archive_from_new_cmds \
+    predep_objects \
+    postdep_objects \
+    predeps \
+    postdeps \
+    compiler_lib_search_path \
+    archive_cmds \
+    archive_expsym_cmds \
+    postinstall_cmds \
+    postuninstall_cmds \
+    old_archive_from_expsyms_cmds \
+    allow_undefined_flag \
+    no_undefined_flag \
+    export_symbols_cmds \
+    hardcode_libdir_flag_spec \
+    hardcode_libdir_flag_spec_ld \
+    hardcode_libdir_separator \
+    hardcode_automatic \
+    module_cmds \
+    module_expsym_cmds \
+    lt_cv_prog_compiler_c_o \
+    exclude_expsyms \
+    include_expsyms; do
+
+    case $var in
+    old_archive_cmds | \
+    old_archive_from_new_cmds | \
+    archive_cmds | \
+    archive_expsym_cmds | \
+    module_cmds | \
+    module_expsym_cmds | \
+    old_archive_from_expsyms_cmds | \
+    export_symbols_cmds | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="${ofile}T"
+  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+  $rm -f "$cfgfile"
+  { echo "$as_me:$LINENO: creating $ofile" >&5
+echo "$as_me: creating $ofile" >&6;}
+
+  cat <<__EOF__ >> "$cfgfile"
+#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+
+  case $host_os in
+  aix3*)
+    cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+EOF
+    ;;
+  esac
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" || \
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+# Check whether --with-tags or --without-tags was given.
+if test "${with_tags+set}" = set; then
+  withval="$with_tags"
+  tagnames="$withval"
+fi;
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+  if test ! -f "${ofile}"; then
+    { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;}
+  fi
+
+  if test -z "$LTCC"; then
+    eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+    if test -z "$LTCC"; then
+      { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;}
+    else
+      { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5
+echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;}
+    fi
+  fi
+  if test -z "$LTCFLAGS"; then
+    eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+  fi
+
+  # Extract list of available tagged configurations in $ofile.
+  # Note that this assumes the entire list is on one line.
+  available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+  lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+  for tagname in $tagnames; do
+    IFS="$lt_save_ifs"
+    # Check whether tagname contains only valid characters
+    case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in
+    "") ;;
+    *)  { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5
+echo "$as_me: error: invalid tag name: $tagname" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+    esac
+
+    if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+    then
+      { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5
+echo "$as_me: error: tag name \"$tagname\" already exists" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+
+    # Update the list of available tags.
+    if test -n "$tagname"; then
+      echo appending configuration tag \"$tagname\" to $ofile
+
+      case $tagname in
+      CXX)
+	if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+	    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+	    (test "X$CXX" != "Xg++"))) ; then
+	  ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_flag_spec_ld_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+  lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+  $as_unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+  lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+  $as_unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+compiler_CXX=$CC
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+  lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+else
+  lt_prog_compiler_no_builtin_flag_CXX=
+fi
+
+if test "$GXX" = yes; then
+  # Set up default GNU C++ configuration
+
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval="$with_gnu_ld"
+  test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi;
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+  # Check if GNU C++ uses GNU ld as the underlying linker, since the
+  # archiving commands below assume that GNU ld is being used.
+  if test "$with_gnu_ld" = yes; then
+    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+    #     investigate it a little bit more. (MM)
+    wlarc='${wl}'
+
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+	grep 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec_CXX=
+    fi
+  else
+    with_gnu_ld=no
+    wlarc=
+
+    # A generic and very simple default shared library creation
+    # command for GNU C++ for the case where it uses the native
+    # linker, instead of GNU ld.  If possible, this setting should
+    # overridden to take advantage of the native linker features on
+    # the platform it is being used on.
+    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+  fi
+
+  # Commands to make compiler produce verbose output that lists
+  # what "hidden" libraries, object files and flags are used when
+  # linking a shared library.
+  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+  GXX=no
+  with_gnu_ld=no
+  wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+ld_shlibs_CXX=yes
+case $host_os in
+  aix3*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  aix4* | aix5*)
+    if test "$host_cpu" = ia64; then
+      # On IA64, the linker does run time linking by default, so we don't
+      # have to do anything special.
+      aix_use_runtimelinking=no
+      exp_sym_flag='-Bexport'
+      no_entry_flag=""
+    else
+      aix_use_runtimelinking=no
+
+      # Test if we are trying to use run time linking or normal
+      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+      # need to do runtime linking.
+      case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+	for ld_flag in $LDFLAGS; do
+	  case $ld_flag in
+	  *-brtl*)
+	    aix_use_runtimelinking=yes
+	    break
+	    ;;
+	  esac
+	done
+	;;
+      esac
+
+      exp_sym_flag='-bexport'
+      no_entry_flag='-bnoentry'
+    fi
+
+    # When large executables or shared objects are built, AIX ld can
+    # have problems creating the table of contents.  If linking a library
+    # or program results in "error TOC overflow" add -mminimal-toc to
+    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+    archive_cmds_CXX=''
+    hardcode_direct_CXX=yes
+    hardcode_libdir_separator_CXX=':'
+    link_all_deplibs_CXX=yes
+
+    if test "$GXX" = yes; then
+      case $host_os in aix4.[012]|aix4.[012].*)
+      # We only want to do this on AIX 4.2 and lower, the check
+      # below for broken collect2 doesn't work under 4.3+
+	collect2name=`${CC} -print-prog-name=collect2`
+	if test -f "$collect2name" && \
+	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	then
+	  # We have reworked collect2
+	  hardcode_direct_CXX=yes
+	else
+	  # We have old collect2
+	  hardcode_direct_CXX=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L_CXX=yes
+	  hardcode_libdir_flag_spec_CXX='-L$libdir'
+	  hardcode_libdir_separator_CXX=
+	fi
+	;;
+      esac
+      shared_flag='-shared'
+      if test "$aix_use_runtimelinking" = yes; then
+	shared_flag="$shared_flag "'${wl}-G'
+      fi
+    else
+      # not using gcc
+      if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	shared_flag='-G'
+      else
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag='${wl}-G'
+	else
+	  shared_flag='${wl}-bM:SRE'
+	fi
+      fi
+    fi
+
+    # It seems that -bexpall does not export symbols beginning with
+    # underscore (_), so it is better to generate a list of symbols to export.
+    always_export_symbols_CXX=yes
+    if test "$aix_use_runtimelinking" = yes; then
+      # Warning - without using the other runtime loading flags (-brtl),
+      # -berok will link without error, but may produce a broken library.
+      allow_undefined_flag_CXX='-berok'
+      # Determine the default libpath from the value encoded in an empty executable.
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+      hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+      archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+     else
+      if test "$host_cpu" = ia64; then
+	hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+	allow_undefined_flag_CXX="-z nodefs"
+	archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+      else
+	# Determine the default libpath from the value encoded in an empty executable.
+	cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	# Warning - without using the other run time loading flags,
+	# -berok will link without error, but may produce a broken library.
+	no_undefined_flag_CXX=' ${wl}-bernotok'
+	allow_undefined_flag_CXX=' ${wl}-berok'
+	# Exported symbols can be pulled into shared objects from archives
+	whole_archive_flag_spec_CXX='$convenience'
+	archive_cmds_need_lc_CXX=yes
+	# This is similar to how AIX traditionally builds its shared libraries.
+	archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+      fi
+    fi
+    ;;
+
+  beos*)
+    if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+      allow_undefined_flag_CXX=unsupported
+      # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+      # support --undefined.  This deserves some investigation.  FIXME
+      archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    else
+      ld_shlibs_CXX=no
+    fi
+    ;;
+
+  chorus*)
+    case $cc_basename in
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+    # as there is no search path for DLLs.
+    hardcode_libdir_flag_spec_CXX='-L$libdir'
+    allow_undefined_flag_CXX=unsupported
+    always_export_symbols_CXX=no
+    enable_shared_with_static_runtimes_CXX=yes
+
+    if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+      archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      # If the export-symbols file already is a .def file (1st line
+      # is EXPORTS), use it as is; otherwise, prepend...
+      archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	cp $export_symbols $output_objdir/$soname.def;
+      else
+	echo EXPORTS > $output_objdir/$soname.def;
+	cat $export_symbols >> $output_objdir/$soname.def;
+      fi~
+      $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+    else
+      ld_shlibs_CXX=no
+    fi
+  ;;
+      darwin* | rhapsody*)
+        case $host_os in
+        rhapsody* | darwin1.[012])
+         allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[012])
+               allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+        esac
+      archive_cmds_need_lc_CXX=no
+      hardcode_direct_CXX=no
+      hardcode_automatic_CXX=yes
+      hardcode_shlibpath_var_CXX=unsupported
+      whole_archive_flag_spec_CXX=''
+      link_all_deplibs_CXX=yes
+
+    if test "$GXX" = yes ; then
+      lt_int_apple_cc_single_mod=no
+      output_verbose_link_cmd='echo'
+      if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
+       lt_int_apple_cc_single_mod=yes
+      fi
+      if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+       archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      else
+          archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+        fi
+        module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+        # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+          if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+            archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          else
+            archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          fi
+            module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+          archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+          module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+          archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         ld_shlibs_CXX=no
+          ;;
+      esac
+      fi
+        ;;
+
+  dgux*)
+    case $cc_basename in
+      ec++*)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      ghcx*)
+	# Green Hills C++ Compiler
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+  freebsd[12]*)
+    # C++ shared libraries reported to be fairly broken before switch to ELF
+    ld_shlibs_CXX=no
+    ;;
+  freebsd-elf*)
+    archive_cmds_need_lc_CXX=no
+    ;;
+  freebsd* | kfreebsd*-gnu | dragonfly*)
+    # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+    # conventions
+    ld_shlibs_CXX=yes
+    ;;
+  gnu*)
+    ;;
+  hpux9*)
+    hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+    hardcode_libdir_separator_CXX=:
+    export_dynamic_flag_spec_CXX='${wl}-E'
+    hardcode_direct_CXX=yes
+    hardcode_minus_L_CXX=yes # Not in the search PATH,
+				# but as the default
+				# location of the library.
+
+    case $cc_basename in
+    CC*)
+      # FIXME: insert proper C++ library support
+      ld_shlibs_CXX=no
+      ;;
+    aCC*)
+      archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      #
+      # There doesn't appear to be a way to prevent this compiler from
+      # explicitly linking system object files so we need to strip them
+      # from the output so that they don't get included in the library
+      # dependencies.
+      output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+      ;;
+    *)
+      if test "$GXX" = yes; then
+        archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+      fi
+      ;;
+    esac
+    ;;
+  hpux10*|hpux11*)
+    if test $with_gnu_ld = no; then
+      hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator_CXX=:
+
+      case $host_cpu in
+      hppa*64*|ia64*)
+	hardcode_libdir_flag_spec_ld_CXX='+b $libdir'
+        ;;
+      *)
+	export_dynamic_flag_spec_CXX='${wl}-E'
+        ;;
+      esac
+    fi
+    case $host_cpu in
+    hppa*64*|ia64*)
+      hardcode_direct_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      ;;
+    *)
+      hardcode_direct_CXX=yes
+      hardcode_minus_L_CXX=yes # Not in the search PATH,
+					      # but as the default
+					      # location of the library.
+      ;;
+    esac
+
+    case $cc_basename in
+      CC*)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      aCC*)
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	esac
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes; then
+	  if test $with_gnu_ld = no; then
+	    case $host_cpu in
+	    hppa*64*)
+	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    ia64*)
+	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    *)
+	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    esac
+	  fi
+	else
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	fi
+	;;
+    esac
+    ;;
+  interix3*)
+    hardcode_direct_CXX=no
+    hardcode_shlibpath_var_CXX=no
+    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+    export_dynamic_flag_spec_CXX='${wl}-E'
+    # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+    # Instead, shared libraries are loaded at an image base (0x10000000 by
+    # default) and relocated if they conflict, which is a slow very memory
+    # consuming and fragmenting process.  To avoid this, we pick a random,
+    # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+    # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+    archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+    archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+    ;;
+  irix5* | irix6*)
+    case $cc_basename in
+      CC*)
+	# SGI C++
+	archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	# Archives containing C++ object files must be created using
+	# "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	# necessary to make sure instantiated templates are included
+	# in the archive.
+	old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	;;
+      *)
+	if test "$GXX" = yes; then
+	  if test "$with_gnu_ld" = no; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	  else
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+	  fi
+	fi
+	link_all_deplibs_CXX=yes
+	;;
+    esac
+    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator_CXX=:
+    ;;
+  linux*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+	hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir'
+	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+	# Archives containing C++ object files must be created using
+	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+	;;
+      icpc*)
+	# Intel C++
+	with_gnu_ld=yes
+	# version 8.0 and above of icpc choke on multiply defined symbols
+	# if we add $predep_objects and $postdep_objects, however 7.1 and
+	# earlier do not add the objects themselves.
+	case `$CC -V 2>&1` in
+	*"Version 7."*)
+  	  archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+  	  archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  ;;
+	*)  # Version 8.0 or newer
+	  tmp_idyn=
+	  case $host_cpu in
+	    ia64*) tmp_idyn=' -i_dynamic';;
+	  esac
+  	  archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  ;;
+	esac
+	archive_cmds_need_lc_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	;;
+      pgCC*)
+        # Portland Group C++ compiler
+	archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+  	archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+
+	hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+        ;;
+      cxx*)
+	# Compaq C++
+	archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	runpath_var=LD_RUN_PATH
+	hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+    esac
+    ;;
+  lynxos*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  m88k*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  mvs*)
+    case $cc_basename in
+      cxx*)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+      wlarc=
+      hardcode_libdir_flag_spec_CXX='-R$libdir'
+      hardcode_direct_CXX=yes
+      hardcode_shlibpath_var_CXX=no
+    fi
+    # Workaround some broken pre-1.5 toolchains
+    output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+    ;;
+  openbsd2*)
+    # C++ shared libraries are fairly broken
+    ld_shlibs_CXX=no
+    ;;
+  openbsd*)
+    hardcode_direct_CXX=yes
+    hardcode_shlibpath_var_CXX=no
+    archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+      export_dynamic_flag_spec_CXX='${wl}-E'
+      whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    fi
+    output_verbose_link_cmd='echo'
+    ;;
+  osf3*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Archives containing C++ object files must be created using
+	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+
+	;;
+      RCC*)
+	# Rational C++ 2.4.1
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      cxx*)
+	allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	  archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+	  hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+	  # Commands to make compiler produce verbose output that lists
+	  # what "hidden" libraries, object files and flags are used when
+	  # linking a shared library.
+	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+	else
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	fi
+	;;
+    esac
+    ;;
+  osf4* | osf5*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Archives containing C++ object files must be created using
+	# the KAI C++ compiler.
+	old_archive_cmds_CXX='$CC -o $oldlib $oldobjs'
+	;;
+      RCC*)
+	# Rational C++ 2.4.1
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      cxx*)
+	allow_undefined_flag_CXX=' -expect_unresolved \*'
+	archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	  echo "-hidden">> $lib.exp~
+	  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp  `test -n "$verstring" && echo -set_version	$verstring` -update_registry ${output_objdir}/so_locations -o $lib~
+	  $rm $lib.exp'
+
+	hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	 archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+	  hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+	  # Commands to make compiler produce verbose output that lists
+	  # what "hidden" libraries, object files and flags are used when
+	  # linking a shared library.
+	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+	else
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	fi
+	;;
+    esac
+    ;;
+  psos*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  sunos4*)
+    case $cc_basename in
+      CC*)
+	# Sun C++ 4.x
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      lcc*)
+	# Lucid
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+  solaris*)
+    case $cc_basename in
+      CC*)
+	# Sun C++ 4.2, 5.x and Centerline C++
+        archive_cmds_need_lc_CXX=yes
+	no_undefined_flag_CXX=' -zdefs'
+	archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	$CC -G${allow_undefined_flag}  ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	hardcode_libdir_flag_spec_CXX='-R$libdir'
+	hardcode_shlibpath_var_CXX=no
+	case $host_os in
+	  solaris2.[0-5] | solaris2.[0-5].*) ;;
+	  *)
+	    # The C++ compiler is used as linker so we must use $wl
+	    # flag to pass the commands to the underlying system
+	    # linker. We must also pass each convience library through
+	    # to the system linker between allextract/defaultextract.
+	    # The C++ compiler will combine linker options so we
+	    # cannot just pass the convience library names through
+	    # without $wl.
+	    # Supported since Solaris 2.6 (maybe 2.5.1?)
+	    whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
+	    ;;
+	esac
+	link_all_deplibs_CXX=yes
+
+	output_verbose_link_cmd='echo'
+
+	# Archives containing C++ object files must be created using
+	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	# necessary to make sure instantiated templates are included
+	# in the archive.
+	old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	;;
+      gcx*)
+	# Green Hills C++ Compiler
+	archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	# The C++ compiler must be used to create the archive.
+	old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	;;
+      *)
+	# GNU C++ compiler with Solaris linker
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+	  if $CC --version | grep -v '^2\.7' > /dev/null; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+	  else
+	    # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	    # platform.
+	    archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+	  fi
+
+	  hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+	fi
+	;;
+    esac
+    ;;
+  sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+    no_undefined_flag_CXX='${wl}-z,text'
+    archive_cmds_need_lc_CXX=no
+    hardcode_shlibpath_var_CXX=no
+    runpath_var='LD_RUN_PATH'
+
+    case $cc_basename in
+      CC*)
+	archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      *)
+	archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+    esac
+    ;;
+  sysv5* | sco3.2v5* | sco5v6*)
+    # Note: We can NOT use -z defs as we might desire, because we do not
+    # link with -lc, and that would cause any symbols used from libc to
+    # always be unresolved, which means just about no library would
+    # ever link correctly.  If we're not using GNU ld we use -z text
+    # though, which does catch some bad symbols but isn't as heavy-handed
+    # as -z defs.
+    # For security reasons, it is highly recommended that you always
+    # use absolute paths for naming shared libraries, and exclude the
+    # DT_RUNPATH tag from executables and libraries.  But doing so
+    # requires that you compile everything twice, which is a pain.
+    # So that behaviour is only enabled if SCOABSPATH is set to a
+    # non-empty value in the environment.  Most likely only useful for
+    # creating official distributions of packages.
+    # This is a hack until libtool officially supports absolute path
+    # names for shared libraries.
+    no_undefined_flag_CXX='${wl}-z,text'
+    allow_undefined_flag_CXX='${wl}-z,nodefs'
+    archive_cmds_need_lc_CXX=no
+    hardcode_shlibpath_var_CXX=no
+    hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+    hardcode_libdir_separator_CXX=':'
+    link_all_deplibs_CXX=yes
+    export_dynamic_flag_spec_CXX='${wl}-Bexport'
+    runpath_var='LD_RUN_PATH'
+
+    case $cc_basename in
+      CC*)
+	archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      *)
+	archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+    esac
+    ;;
+  tandem*)
+    case $cc_basename in
+      NCC*)
+	# NonStop-UX NCC 3.20
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+  vxworks*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  *)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+esac
+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+GCC_CXX="$GXX"
+LD_CXX="$LD"
+
+
+cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+EOF
+
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  # The `*' in the case matches for architectures that use `case' in
+  # $output_verbose_cmd can trigger glob expansion during the loop
+  # eval without this substitution.
+  output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+  for p in `eval $output_verbose_link_cmd`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" \
+	  || test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_CXX"; then
+	     compiler_lib_search_path_CXX="${prev}${p}"
+	   else
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_CXX"; then
+	   postdeps_CXX="${prev}${p}"
+	 else
+	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$predep_objects_CXX"; then
+	   predep_objects_CXX="$p"
+	 else
+	   predep_objects_CXX="$predep_objects_CXX $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_CXX"; then
+	   postdep_objects_CXX="$p"
+	 else
+	   postdep_objects_CXX="$postdep_objects_CXX $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$rm -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix3*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    postdeps_CXX='-lCstd -lCrun'
+    ;;
+  esac
+  ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+
+lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      ;;
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+      ;;
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | os2* | pw32*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    interix3*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	;;
+      *)
+	lt_prog_compiler_pic_CXX='-fPIC'
+	;;
+      esac
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix4* | aix5*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  lt_prog_compiler_static_CXX='-Bstatic'
+	else
+	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+       darwin*)
+         # PIC is the default on this platform
+         # Common symbols not allowed in MH_DYLIB files
+         case $cc_basename in
+           xlc*)
+           lt_prog_compiler_pic_CXX='-qnocommon'
+           lt_prog_compiler_wl_CXX='-Wl,'
+           ;;
+         esac
+       ;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | kfreebsd*-gnu | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      lt_prog_compiler_pic_CXX='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      lt_prog_compiler_pic_CXX='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    ;;
+	  icpc* | ecpc*)
+	    # Intel C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  pgCC*)
+	    # Portland Group C++ compiler.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fpic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    lt_prog_compiler_pic_CXX='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    lt_prog_compiler_wl_CXX='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    lt_prog_compiler_pic_CXX='-pic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	lt_prog_compiler_can_build_shared_CXX=no
+	;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_pic_works_CXX=no
+  ac_outfile=conftest.$ac_objext
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:23165: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:23169: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6
+
+if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_static_works_CXX=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   printf "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $rm conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6
+
+if test x"$lt_prog_compiler_static_works_CXX" = xyes; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:23269: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:23273: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix4* | aix5*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX="$ltdll_cmds"
+  ;;
+  cygwin* | mingw*)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+
+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+      $rm conftest*
+      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl_CXX
+	pic_flag=$lt_prog_compiler_pic_CXX
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+        allow_undefined_flag_CXX=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc_CXX=no
+        else
+	  archive_cmds_need_lc_CXX=yes
+        fi
+        allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+  if test "$GCC" = yes; then
+    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+  else
+    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+  fi
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+kfreebsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  freebsd*) # from 4.6 on
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix3*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+knetbsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" || \
+   test -n "$runpath_var_CXX" || \
+   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct_CXX" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+     test "$hardcode_minus_L_CXX" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5
+echo "${ECHO_T}$hardcode_action_CXX" >&6
+
+if test "$hardcode_action_CXX" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler_CXX \
+    CC_CXX \
+    LD_CXX \
+    lt_prog_compiler_wl_CXX \
+    lt_prog_compiler_pic_CXX \
+    lt_prog_compiler_static_CXX \
+    lt_prog_compiler_no_builtin_flag_CXX \
+    export_dynamic_flag_spec_CXX \
+    thread_safe_flag_spec_CXX \
+    whole_archive_flag_spec_CXX \
+    enable_shared_with_static_runtimes_CXX \
+    old_archive_cmds_CXX \
+    old_archive_from_new_cmds_CXX \
+    predep_objects_CXX \
+    postdep_objects_CXX \
+    predeps_CXX \
+    postdeps_CXX \
+    compiler_lib_search_path_CXX \
+    archive_cmds_CXX \
+    archive_expsym_cmds_CXX \
+    postinstall_cmds_CXX \
+    postuninstall_cmds_CXX \
+    old_archive_from_expsyms_cmds_CXX \
+    allow_undefined_flag_CXX \
+    no_undefined_flag_CXX \
+    export_symbols_cmds_CXX \
+    hardcode_libdir_flag_spec_CXX \
+    hardcode_libdir_flag_spec_ld_CXX \
+    hardcode_libdir_separator_CXX \
+    hardcode_automatic_CXX \
+    module_cmds_CXX \
+    module_expsym_cmds_CXX \
+    lt_cv_prog_compiler_c_o_CXX \
+    exclude_expsyms_CXX \
+    include_expsyms_CXX; do
+
+    case $var in
+    old_archive_cmds_CXX | \
+    old_archive_from_new_cmds_CXX | \
+    archive_cmds_CXX | \
+    archive_expsym_cmds_CXX | \
+    module_cmds_CXX | \
+    module_expsym_cmds_CXX | \
+    old_archive_from_expsyms_cmds_CXX | \
+    export_symbols_cmds_CXX | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="$ofile"
+
+  cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_CXX
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_CXX
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_CXX
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_CXX"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+
+	else
+	  tagname=""
+	fi
+	;;
+
+      F77)
+	if test -n "$F77" && test "X$F77" != "Xno"; then
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+
+archive_cmds_need_lc_F77=no
+allow_undefined_flag_F77=
+always_export_symbols_F77=no
+archive_expsym_cmds_F77=
+export_dynamic_flag_spec_F77=
+hardcode_direct_F77=no
+hardcode_libdir_flag_spec_F77=
+hardcode_libdir_flag_spec_ld_F77=
+hardcode_libdir_separator_F77=
+hardcode_minus_L_F77=no
+hardcode_automatic_F77=no
+module_cmds_F77=
+module_expsym_cmds_F77=
+link_all_deplibs_F77=unknown
+old_archive_cmds_F77=$old_archive_cmds
+no_undefined_flag_F77=
+whole_archive_flag_spec_F77=
+enable_shared_with_static_runtimes_F77=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+objext_F77=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="      subroutine t\n      return\n      end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="      program t\n      end\n"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+compiler_F77=$CC
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+aix4* | aix5*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+  ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+GCC_F77="$G77"
+LD_F77="$LD"
+
+lt_prog_compiler_wl_F77=
+lt_prog_compiler_pic_F77=
+lt_prog_compiler_static_F77=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl_F77='-Wl,'
+    lt_prog_compiler_static_F77='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_F77='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4'
+      ;;
+
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_F77='-fno-common'
+      ;;
+
+    interix3*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared_F77=no
+      enable_shared=no
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_F77=-Kconform_pic
+      fi
+      ;;
+
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_F77='-fPIC'
+	;;
+      esac
+      ;;
+
+    *)
+      lt_prog_compiler_pic_F77='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_F77='-Bstatic'
+      else
+	lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+      darwin*)
+        # PIC is the default on this platform
+        # Common symbols not allowed in MH_DYLIB files
+       case $cc_basename in
+         xlc*)
+         lt_prog_compiler_pic_F77='-qnocommon'
+         lt_prog_compiler_wl_F77='-Wl,'
+         ;;
+       esac
+       ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_F77='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static_F77='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    linux*)
+      case $cc_basename in
+      icc* | ecc*)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-KPIC'
+	lt_prog_compiler_static_F77='-static'
+        ;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-fpic'
+	lt_prog_compiler_static_F77='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl_F77='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static_F77='-non_shared'
+        ;;
+      esac
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl_F77='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl_F77='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl_F77='-Qoption ld '
+      lt_prog_compiler_pic_F77='-PIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic_F77='-Kconform_pic'
+	lt_prog_compiler_static_F77='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_can_build_shared_F77=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic_F77='-pic'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared_F77=no
+      ;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_F77"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_pic_works_F77=no
+  ac_outfile=conftest.$ac_objext
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_F77"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:24839: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:24843: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_prog_compiler_pic_works_F77=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6
+
+if test x"$lt_prog_compiler_pic_works_F77" = xyes; then
+    case $lt_prog_compiler_pic_F77 in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
+     esac
+else
+    lt_prog_compiler_pic_F77=
+     lt_prog_compiler_can_build_shared_F77=no
+fi
+
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_F77=
+    ;;
+  *)
+    lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_static_works_F77=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   printf "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_prog_compiler_static_works_F77=yes
+       fi
+     else
+       lt_prog_compiler_static_works_F77=yes
+     fi
+   fi
+   $rm conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6
+
+if test x"$lt_prog_compiler_static_works_F77" = xyes; then
+    :
+else
+    lt_prog_compiler_static_F77=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_F77=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:24943: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:24947: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_F77=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+  runpath_var=
+  allow_undefined_flag_F77=
+  enable_shared_with_static_runtimes_F77=no
+  archive_cmds_F77=
+  archive_expsym_cmds_F77=
+  old_archive_From_new_cmds_F77=
+  old_archive_from_expsyms_cmds_F77=
+  export_dynamic_flag_spec_F77=
+  whole_archive_flag_spec_F77=
+  thread_safe_flag_spec_F77=
+  hardcode_libdir_flag_spec_F77=
+  hardcode_libdir_flag_spec_ld_F77=
+  hardcode_libdir_separator_F77=
+  hardcode_direct_F77=no
+  hardcode_minus_L_F77=no
+  hardcode_shlibpath_var_F77=unsupported
+  link_all_deplibs_F77=unknown
+  hardcode_automatic_F77=no
+  module_cmds_F77=
+  module_expsym_cmds_F77=
+  always_export_symbols_F77=no
+  export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms_F77=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_"
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  extract_expsyms_cmds=
+  # Just being paranoid about ensuring that cc_basename is set.
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+  case $host_os in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs_F77=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec_F77='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+	whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+  	whole_archive_flag_spec_F77=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>/dev/null` in
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs_F77=no
+	cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_minus_L_F77=yes
+
+      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can't use
+      # them.
+      ld_shlibs_F77=no
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag_F77=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      allow_undefined_flag_F77=unsupported
+      always_export_symbols_F77=no
+      enable_shared_with_static_runtimes_F77=yes
+      export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    interix3*)
+      hardcode_direct_F77=no
+      hardcode_shlibpath_var_F77=no
+      hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec_F77='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    linux*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	tmp_addflag=
+	case $cc_basename,$host_cpu in
+	pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	esac
+	archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+	if test $supports_anon_versioning = yes; then
+	  archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~
+  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+  $echo "local: *; };" >> $output_objdir/$libname.ver~
+	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	fi
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+	ld_shlibs_F77=no
+	cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs_F77=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+	    archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+	    archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+	  else
+	    ld_shlibs_F77=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs_F77" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec_F77=
+      export_dynamic_flag_spec_F77=
+      whole_archive_flag_spec_F77=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag_F77=unsupported
+      always_export_symbols_F77=yes
+      archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L_F77=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct_F77=unsupported
+      fi
+      ;;
+
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+	  export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+	  for ld_flag in $LDFLAGS; do
+  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+  	    aix_use_runtimelinking=yes
+  	    break
+  	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds_F77=''
+      hardcode_direct_F77=yes
+      hardcode_libdir_separator_F77=':'
+      link_all_deplibs_F77=yes
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" && \
+  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  then
+  	  # We have reworked collect2
+  	  hardcode_direct_F77=yes
+	  else
+  	  # We have old collect2
+  	  hardcode_direct_F77=unsupported
+  	  # It fails to find uninstalled libraries when the uninstalled
+  	  # path is not listed in the libpath.  Setting hardcode_minus_L
+  	  # to unsupported forces relinking
+  	  hardcode_minus_L_F77=yes
+  	  hardcode_libdir_flag_spec_F77='-L$libdir'
+  	  hardcode_libdir_separator_F77=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+  	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols_F77=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag_F77='-berok'
+       # Determine the default libpath from the value encoded in an empty executable.
+       cat >conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_f77_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+       hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+	archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+       else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag_F77="-z nodefs"
+	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an empty executable.
+	 cat >conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_f77_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	 hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag_F77=' ${wl}-bernotok'
+	  allow_undefined_flag_F77=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec_F77='$convenience'
+	  archive_cmds_need_lc_F77=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_minus_L_F77=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs_F77=no
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec_F77=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec_F77=' '
+      allow_undefined_flag_F77=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_From_new_cmds_F77='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path_F77='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes_F77=yes
+      ;;
+
+    darwin* | rhapsody*)
+      case $host_os in
+        rhapsody* | darwin1.[012])
+         allow_undefined_flag_F77='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[012])
+               allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+      esac
+      archive_cmds_need_lc_F77=no
+      hardcode_direct_F77=no
+      hardcode_automatic_F77=yes
+      hardcode_shlibpath_var_F77=unsupported
+      whole_archive_flag_spec_F77=''
+      link_all_deplibs_F77=yes
+    if test "$GCC" = yes ; then
+    	output_verbose_link_cmd='echo'
+        archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+      archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+         archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+         module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+         archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         ld_shlibs_F77=no
+          ;;
+      esac
+    fi
+      ;;
+
+    dgux*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    freebsd1*)
+      ld_shlibs_F77=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_F77=yes
+      hardcode_minus_L_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | kfreebsd*-gnu | dragonfly*)
+      archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      hardcode_direct_F77=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L_F77=yes
+      export_dynamic_flag_spec_F77='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_F77=:
+
+	hardcode_direct_F77=yes
+	export_dynamic_flag_spec_F77='${wl}-E'
+
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L_F77=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_F77=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_libdir_flag_spec_ld_F77='+b $libdir'
+	  hardcode_direct_F77=no
+	  hardcode_shlibpath_var_F77=no
+	  ;;
+	*)
+	  hardcode_direct_F77=yes
+	  export_dynamic_flag_spec_F77='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L_F77=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_ld_F77='-rpath $libdir'
+      fi
+      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      link_all_deplibs_F77=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    newsos6)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_F77=yes
+      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    openbsd*)
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_F77='${wl}-E'
+      else
+       case $host_os in
+	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	   archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	   hardcode_libdir_flag_spec_F77='-R$libdir'
+	   ;;
+	 *)
+	   archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	   hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+	   ;;
+       esac
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_minus_L_F77=yes
+      allow_undefined_flag_F77=unsupported
+      archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag_F77=' -expect_unresolved \*'
+	archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag_F77=' -expect_unresolved \*'
+	archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec_F77='-rpath $libdir'
+      fi
+      hardcode_libdir_separator_F77=:
+      ;;
+
+    solaris*)
+      no_undefined_flag_F77=' -z text'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+      else
+	wlarc=''
+	archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      fi
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_shlibpath_var_F77=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+ 	# The compiler driver will combine linker options so we
+ 	# cannot just pass the convience library names through
+ 	# without $wl, iff we do not link with $LD.
+ 	# Luckily, gcc supports the same syntax we need for Sun Studio.
+ 	# Supported since Solaris 2.6 (maybe 2.5.1?)
+ 	case $wlarc in
+ 	'')
+ 	  whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;;
+ 	*)
+ 	  whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ 	esac ;;
+      esac
+      link_all_deplibs_F77=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_direct_F77=yes
+      hardcode_minus_L_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_F77=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds_F77='$CC -r -o $output$reload_objs'
+	  hardcode_direct_F77=no
+        ;;
+	motorola)
+	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var_F77=no
+      export_dynamic_flag_spec_F77='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var_F77=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs_F77=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+      no_undefined_flag_F77='${wl}-z,text'
+      archive_cmds_need_lc_F77=no
+      hardcode_shlibpath_var_F77=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag_F77='${wl}-z,text'
+      allow_undefined_flag_F77='${wl}-z,nodefs'
+      archive_cmds_need_lc_F77=no
+      hardcode_shlibpath_var_F77=no
+      hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator_F77=':'
+      link_all_deplibs_F77=yes
+      export_dynamic_flag_spec_F77='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    *)
+      ld_shlibs_F77=no
+      ;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5
+echo "${ECHO_T}$ld_shlibs_F77" >&6
+test "$ld_shlibs_F77" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_F77" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_F77=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_F77 in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+      $rm conftest*
+      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl_F77
+	pic_flag=$lt_prog_compiler_pic_F77
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag_F77
+        allow_undefined_flag_F77=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc_F77=no
+        else
+	  archive_cmds_need_lc_F77=yes
+        fi
+        allow_undefined_flag_F77=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+  if test "$GCC" = yes; then
+    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+  else
+    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+  fi
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+kfreebsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  freebsd*) # from 4.6 on
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix3*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+knetbsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_F77=
+if test -n "$hardcode_libdir_flag_spec_F77" || \
+   test -n "$runpath_var_F77" || \
+   test "X$hardcode_automatic_F77" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct_F77" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no &&
+     test "$hardcode_minus_L_F77" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_F77=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_F77=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_F77=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5
+echo "${ECHO_T}$hardcode_action_F77" >&6
+
+if test "$hardcode_action_F77" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler_F77 \
+    CC_F77 \
+    LD_F77 \
+    lt_prog_compiler_wl_F77 \
+    lt_prog_compiler_pic_F77 \
+    lt_prog_compiler_static_F77 \
+    lt_prog_compiler_no_builtin_flag_F77 \
+    export_dynamic_flag_spec_F77 \
+    thread_safe_flag_spec_F77 \
+    whole_archive_flag_spec_F77 \
+    enable_shared_with_static_runtimes_F77 \
+    old_archive_cmds_F77 \
+    old_archive_from_new_cmds_F77 \
+    predep_objects_F77 \
+    postdep_objects_F77 \
+    predeps_F77 \
+    postdeps_F77 \
+    compiler_lib_search_path_F77 \
+    archive_cmds_F77 \
+    archive_expsym_cmds_F77 \
+    postinstall_cmds_F77 \
+    postuninstall_cmds_F77 \
+    old_archive_from_expsyms_cmds_F77 \
+    allow_undefined_flag_F77 \
+    no_undefined_flag_F77 \
+    export_symbols_cmds_F77 \
+    hardcode_libdir_flag_spec_F77 \
+    hardcode_libdir_flag_spec_ld_F77 \
+    hardcode_libdir_separator_F77 \
+    hardcode_automatic_F77 \
+    module_cmds_F77 \
+    module_expsym_cmds_F77 \
+    lt_cv_prog_compiler_c_o_F77 \
+    exclude_expsyms_F77 \
+    include_expsyms_F77; do
+
+    case $var in
+    old_archive_cmds_F77 | \
+    old_archive_from_new_cmds_F77 | \
+    archive_cmds_F77 | \
+    archive_expsym_cmds_F77 | \
+    module_cmds_F77 | \
+    module_expsym_cmds_F77 | \
+    old_archive_from_expsyms_cmds_F77 | \
+    export_symbols_cmds_F77 | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="$ofile"
+
+  cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_F77
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_F77
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_F77
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_F77
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_F77
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_F77
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_F77
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_F77
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_F77
+archive_expsym_cmds=$lt_archive_expsym_cmds_F77
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_F77
+module_expsym_cmds=$lt_module_expsym_cmds_F77
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_F77
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_F77
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_F77
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_F77
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_F77
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_F77
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_F77
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_F77
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_F77
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_F77
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_F77"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_F77
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_F77
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_F77
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_F77
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+	else
+	  tagname=""
+	fi
+	;;
+
+      GCJ)
+	if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+
+
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+objext_GCJ=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+compiler_GCJ=$CC
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+archive_cmds_need_lc_GCJ=no
+
+old_archive_cmds_GCJ=$old_archive_cmds
+
+
+lt_prog_compiler_no_builtin_flag_GCJ=
+
+if test "$GCC" = yes; then
+  lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+  ac_outfile=conftest.$ac_objext
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:27146: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:27150: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+lt_prog_compiler_wl_GCJ=
+lt_prog_compiler_pic_GCJ=
+lt_prog_compiler_static_GCJ=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl_GCJ='-Wl,'
+    lt_prog_compiler_static_GCJ='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_GCJ='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4'
+      ;;
+
+    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_GCJ='-fno-common'
+      ;;
+
+    interix3*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared_GCJ=no
+      enable_shared=no
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_GCJ=-Kconform_pic
+      fi
+      ;;
+
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_GCJ='-fPIC'
+	;;
+      esac
+      ;;
+
+    *)
+      lt_prog_compiler_pic_GCJ='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_GCJ='-Bstatic'
+      else
+	lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+      darwin*)
+        # PIC is the default on this platform
+        # Common symbols not allowed in MH_DYLIB files
+       case $cc_basename in
+         xlc*)
+         lt_prog_compiler_pic_GCJ='-qnocommon'
+         lt_prog_compiler_wl_GCJ='-Wl,'
+         ;;
+       esac
+       ;;
+
+    mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_GCJ='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static_GCJ='-non_shared'
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic_GCJ='-KPIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    linux*)
+      case $cc_basename in
+      icc* | ecc*)
+	lt_prog_compiler_wl_GCJ='-Wl,'
+	lt_prog_compiler_pic_GCJ='-KPIC'
+	lt_prog_compiler_static_GCJ='-static'
+        ;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl_GCJ='-Wl,'
+	lt_prog_compiler_pic_GCJ='-fpic'
+	lt_prog_compiler_static_GCJ='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl_GCJ='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static_GCJ='-non_shared'
+        ;;
+      esac
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static_GCJ='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic_GCJ='-KPIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl_GCJ='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl_GCJ='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl_GCJ='-Qoption ld '
+      lt_prog_compiler_pic_GCJ='-PIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      lt_prog_compiler_pic_GCJ='-KPIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic_GCJ='-Kconform_pic'
+	lt_prog_compiler_static_GCJ='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      lt_prog_compiler_pic_GCJ='-KPIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      lt_prog_compiler_can_build_shared_GCJ=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic_GCJ='-pic'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared_GCJ=no
+      ;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_GCJ"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_pic_works_GCJ=no
+  ac_outfile=conftest.$ac_objext
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_GCJ"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:27414: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:27418: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_prog_compiler_pic_works_GCJ=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6
+
+if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then
+    case $lt_prog_compiler_pic_GCJ in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;;
+     esac
+else
+    lt_prog_compiler_pic_GCJ=
+     lt_prog_compiler_can_build_shared_GCJ=no
+fi
+
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_GCJ=
+    ;;
+  *)
+    lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_prog_compiler_static_works_GCJ=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   printf "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_prog_compiler_static_works_GCJ=yes
+       fi
+     else
+       lt_prog_compiler_static_works_GCJ=yes
+     fi
+   fi
+   $rm conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6
+
+if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then
+    :
+else
+    lt_prog_compiler_static_GCJ=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_GCJ=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:27518: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:27522: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_GCJ=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+  runpath_var=
+  allow_undefined_flag_GCJ=
+  enable_shared_with_static_runtimes_GCJ=no
+  archive_cmds_GCJ=
+  archive_expsym_cmds_GCJ=
+  old_archive_From_new_cmds_GCJ=
+  old_archive_from_expsyms_cmds_GCJ=
+  export_dynamic_flag_spec_GCJ=
+  whole_archive_flag_spec_GCJ=
+  thread_safe_flag_spec_GCJ=
+  hardcode_libdir_flag_spec_GCJ=
+  hardcode_libdir_flag_spec_ld_GCJ=
+  hardcode_libdir_separator_GCJ=
+  hardcode_direct_GCJ=no
+  hardcode_minus_L_GCJ=no
+  hardcode_shlibpath_var_GCJ=unsupported
+  link_all_deplibs_GCJ=unknown
+  hardcode_automatic_GCJ=no
+  module_cmds_GCJ=
+  module_expsym_cmds_GCJ=
+  always_export_symbols_GCJ=no
+  export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms_GCJ=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_"
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  extract_expsyms_cmds=
+  # Just being paranoid about ensuring that cc_basename is set.
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+  case $host_os in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs_GCJ=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec_GCJ='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+	whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+  	whole_archive_flag_spec_GCJ=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>/dev/null` in
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs_GCJ=no
+	cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_minus_L_GCJ=yes
+
+      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can't use
+      # them.
+      ld_shlibs_GCJ=no
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag_GCJ=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      allow_undefined_flag_GCJ=unsupported
+      always_export_symbols_GCJ=no
+      enable_shared_with_static_runtimes_GCJ=yes
+      export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    interix3*)
+      hardcode_direct_GCJ=no
+      hardcode_shlibpath_var_GCJ=no
+      hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec_GCJ='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    linux*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	tmp_addflag=
+	case $cc_basename,$host_cpu in
+	pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	esac
+	archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+	if test $supports_anon_versioning = yes; then
+	  archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~
+  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+  $echo "local: *; };" >> $output_objdir/$libname.ver~
+	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	fi
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+	ld_shlibs_GCJ=no
+	cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs_GCJ=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+	    archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+	    archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+	  else
+	    ld_shlibs_GCJ=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs_GCJ" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec_GCJ=
+      export_dynamic_flag_spec_GCJ=
+      whole_archive_flag_spec_GCJ=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag_GCJ=unsupported
+      always_export_symbols_GCJ=yes
+      archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L_GCJ=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct_GCJ=unsupported
+      fi
+      ;;
+
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+	  export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+	  for ld_flag in $LDFLAGS; do
+  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+  	    aix_use_runtimelinking=yes
+  	    break
+  	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds_GCJ=''
+      hardcode_direct_GCJ=yes
+      hardcode_libdir_separator_GCJ=':'
+      link_all_deplibs_GCJ=yes
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" && \
+  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  then
+  	  # We have reworked collect2
+  	  hardcode_direct_GCJ=yes
+	  else
+  	  # We have old collect2
+  	  hardcode_direct_GCJ=unsupported
+  	  # It fails to find uninstalled libraries when the uninstalled
+  	  # path is not listed in the libpath.  Setting hardcode_minus_L
+  	  # to unsupported forces relinking
+  	  hardcode_minus_L_GCJ=yes
+  	  hardcode_libdir_flag_spec_GCJ='-L$libdir'
+  	  hardcode_libdir_separator_GCJ=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+  	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols_GCJ=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag_GCJ='-berok'
+       # Determine the default libpath from the value encoded in an empty executable.
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+       hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+	archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+       else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag_GCJ="-z nodefs"
+	  archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an empty executable.
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`; fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	 hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag_GCJ=' ${wl}-bernotok'
+	  allow_undefined_flag_GCJ=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec_GCJ='$convenience'
+	  archive_cmds_need_lc_GCJ=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_minus_L_GCJ=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs_GCJ=no
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec_GCJ=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec_GCJ=' '
+      allow_undefined_flag_GCJ=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_From_new_cmds_GCJ='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes_GCJ=yes
+      ;;
+
+    darwin* | rhapsody*)
+      case $host_os in
+        rhapsody* | darwin1.[012])
+         allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[012])
+               allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+      esac
+      archive_cmds_need_lc_GCJ=no
+      hardcode_direct_GCJ=no
+      hardcode_automatic_GCJ=yes
+      hardcode_shlibpath_var_GCJ=unsupported
+      whole_archive_flag_spec_GCJ=''
+      link_all_deplibs_GCJ=yes
+    if test "$GCC" = yes ; then
+    	output_verbose_link_cmd='echo'
+        archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+      module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+      archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+         archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+         module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+         archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         ld_shlibs_GCJ=no
+          ;;
+      esac
+    fi
+      ;;
+
+    dgux*)
+      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    freebsd1*)
+      ld_shlibs_GCJ=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec_GCJ='-R$libdir'
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_GCJ=yes
+      hardcode_minus_L_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | kfreebsd*-gnu | dragonfly*)
+      archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec_GCJ='-R$libdir'
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator_GCJ=:
+      hardcode_direct_GCJ=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L_GCJ=yes
+      export_dynamic_flag_spec_GCJ='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_GCJ=:
+
+	hardcode_direct_GCJ=yes
+	export_dynamic_flag_spec_GCJ='${wl}-E'
+
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L_GCJ=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_GCJ=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_libdir_flag_spec_ld_GCJ='+b $libdir'
+	  hardcode_direct_GCJ=no
+	  hardcode_shlibpath_var_GCJ=no
+	  ;;
+	*)
+	  hardcode_direct_GCJ=yes
+	  export_dynamic_flag_spec_GCJ='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L_GCJ=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir'
+      fi
+      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_GCJ=:
+      link_all_deplibs_GCJ=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec_GCJ='-R$libdir'
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    newsos6)
+      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_GCJ=yes
+      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_GCJ=:
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    openbsd*)
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_GCJ='${wl}-E'
+      else
+       case $host_os in
+	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	   archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	   hardcode_libdir_flag_spec_GCJ='-R$libdir'
+	   ;;
+	 *)
+	   archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	   hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+	   ;;
+       esac
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_minus_L_GCJ=yes
+      allow_undefined_flag_GCJ=unsupported
+      archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag_GCJ=' -expect_unresolved \*'
+	archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_GCJ=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag_GCJ=' -expect_unresolved \*'
+	archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec_GCJ='-rpath $libdir'
+      fi
+      hardcode_libdir_separator_GCJ=:
+      ;;
+
+    solaris*)
+      no_undefined_flag_GCJ=' -z text'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+      else
+	wlarc=''
+	archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      fi
+      hardcode_libdir_flag_spec_GCJ='-R$libdir'
+      hardcode_shlibpath_var_GCJ=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+ 	# The compiler driver will combine linker options so we
+ 	# cannot just pass the convience library names through
+ 	# without $wl, iff we do not link with $LD.
+ 	# Luckily, gcc supports the same syntax we need for Sun Studio.
+ 	# Supported since Solaris 2.6 (maybe 2.5.1?)
+ 	case $wlarc in
+ 	'')
+ 	  whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;;
+ 	*)
+ 	  whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ 	esac ;;
+      esac
+      link_all_deplibs_GCJ=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_direct_GCJ=yes
+      hardcode_minus_L_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_GCJ=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds_GCJ='$CC -r -o $output$reload_objs'
+	  hardcode_direct_GCJ=no
+        ;;
+	motorola)
+	  archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var_GCJ=no
+      export_dynamic_flag_spec_GCJ='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var_GCJ=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs_GCJ=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+      no_undefined_flag_GCJ='${wl}-z,text'
+      archive_cmds_need_lc_GCJ=no
+      hardcode_shlibpath_var_GCJ=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag_GCJ='${wl}-z,text'
+      allow_undefined_flag_GCJ='${wl}-z,nodefs'
+      archive_cmds_need_lc_GCJ=no
+      hardcode_shlibpath_var_GCJ=no
+      hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator_GCJ=':'
+      link_all_deplibs_GCJ=yes
+      export_dynamic_flag_spec_GCJ='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    *)
+      ld_shlibs_GCJ=no
+      ;;
+    esac
+  fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5
+echo "${ECHO_T}$ld_shlibs_GCJ" >&6
+test "$ld_shlibs_GCJ" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_GCJ" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_GCJ=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_GCJ in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+      $rm conftest*
+      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl_GCJ
+	pic_flag=$lt_prog_compiler_pic_GCJ
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ
+        allow_undefined_flag_GCJ=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc_GCJ=no
+        else
+	  archive_cmds_need_lc_GCJ=yes
+        fi
+        allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+  if test "$GCC" = yes; then
+    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+  else
+    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+  fi
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+kfreebsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  freebsd*) # from 4.6 on
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix3*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+knetbsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='GNU ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_GCJ=
+if test -n "$hardcode_libdir_flag_spec_GCJ" || \
+   test -n "$runpath_var_GCJ" || \
+   test "X$hardcode_automatic_GCJ" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct_GCJ" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no &&
+     test "$hardcode_minus_L_GCJ" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_GCJ=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_GCJ=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_GCJ=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5
+echo "${ECHO_T}$hardcode_action_GCJ" >&6
+
+if test "$hardcode_action_GCJ" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler_GCJ \
+    CC_GCJ \
+    LD_GCJ \
+    lt_prog_compiler_wl_GCJ \
+    lt_prog_compiler_pic_GCJ \
+    lt_prog_compiler_static_GCJ \
+    lt_prog_compiler_no_builtin_flag_GCJ \
+    export_dynamic_flag_spec_GCJ \
+    thread_safe_flag_spec_GCJ \
+    whole_archive_flag_spec_GCJ \
+    enable_shared_with_static_runtimes_GCJ \
+    old_archive_cmds_GCJ \
+    old_archive_from_new_cmds_GCJ \
+    predep_objects_GCJ \
+    postdep_objects_GCJ \
+    predeps_GCJ \
+    postdeps_GCJ \
+    compiler_lib_search_path_GCJ \
+    archive_cmds_GCJ \
+    archive_expsym_cmds_GCJ \
+    postinstall_cmds_GCJ \
+    postuninstall_cmds_GCJ \
+    old_archive_from_expsyms_cmds_GCJ \
+    allow_undefined_flag_GCJ \
+    no_undefined_flag_GCJ \
+    export_symbols_cmds_GCJ \
+    hardcode_libdir_flag_spec_GCJ \
+    hardcode_libdir_flag_spec_ld_GCJ \
+    hardcode_libdir_separator_GCJ \
+    hardcode_automatic_GCJ \
+    module_cmds_GCJ \
+    module_expsym_cmds_GCJ \
+    lt_cv_prog_compiler_c_o_GCJ \
+    exclude_expsyms_GCJ \
+    include_expsyms_GCJ; do
+
+    case $var in
+    old_archive_cmds_GCJ | \
+    old_archive_from_new_cmds_GCJ | \
+    archive_cmds_GCJ | \
+    archive_expsym_cmds_GCJ | \
+    module_cmds_GCJ | \
+    module_expsym_cmds_GCJ | \
+    old_archive_from_expsyms_cmds_GCJ | \
+    export_symbols_cmds_GCJ | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="$ofile"
+
+  cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_GCJ
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_GCJ
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_GCJ
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_GCJ
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_GCJ
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_GCJ
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_GCJ
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_GCJ
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_GCJ
+archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_GCJ
+module_expsym_cmds=$lt_module_expsym_cmds_GCJ
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_GCJ
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_GCJ
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_GCJ
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_GCJ
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_GCJ
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_GCJ
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_GCJ
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_GCJ
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_GCJ
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_GCJ"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_GCJ
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_GCJ
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_GCJ
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_GCJ
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+	else
+	  tagname=""
+	fi
+	;;
+
+      RC)
+
+
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+objext_RC=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+compiler_RC=$CC
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+lt_cv_prog_compiler_c_o_RC=yes
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler_RC \
+    CC_RC \
+    LD_RC \
+    lt_prog_compiler_wl_RC \
+    lt_prog_compiler_pic_RC \
+    lt_prog_compiler_static_RC \
+    lt_prog_compiler_no_builtin_flag_RC \
+    export_dynamic_flag_spec_RC \
+    thread_safe_flag_spec_RC \
+    whole_archive_flag_spec_RC \
+    enable_shared_with_static_runtimes_RC \
+    old_archive_cmds_RC \
+    old_archive_from_new_cmds_RC \
+    predep_objects_RC \
+    postdep_objects_RC \
+    predeps_RC \
+    postdeps_RC \
+    compiler_lib_search_path_RC \
+    archive_cmds_RC \
+    archive_expsym_cmds_RC \
+    postinstall_cmds_RC \
+    postuninstall_cmds_RC \
+    old_archive_from_expsyms_cmds_RC \
+    allow_undefined_flag_RC \
+    no_undefined_flag_RC \
+    export_symbols_cmds_RC \
+    hardcode_libdir_flag_spec_RC \
+    hardcode_libdir_flag_spec_ld_RC \
+    hardcode_libdir_separator_RC \
+    hardcode_automatic_RC \
+    module_cmds_RC \
+    module_expsym_cmds_RC \
+    lt_cv_prog_compiler_c_o_RC \
+    exclude_expsyms_RC \
+    include_expsyms_RC; do
+
+    case $var in
+    old_archive_cmds_RC | \
+    old_archive_from_new_cmds_RC | \
+    archive_cmds_RC | \
+    archive_expsym_cmds_RC | \
+    module_cmds_RC | \
+    module_expsym_cmds_RC | \
+    old_archive_from_expsyms_cmds_RC | \
+    export_symbols_cmds_RC | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="$ofile"
+
+  cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_RC
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_RC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_RC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_RC
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_RC
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_RC
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_RC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_RC
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_RC
+archive_expsym_cmds=$lt_archive_expsym_cmds_RC
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_RC
+module_expsym_cmds=$lt_module_expsym_cmds_RC
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_RC
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_RC
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_RC
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_RC
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_RC
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_RC
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_RC
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_RC
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_RC
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_RC
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_RC
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_RC"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_RC
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_RC
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_RC
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_RC
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+	;;
+
+      *)
+	{ { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5
+echo "$as_me: error: Unsupported tag name: $tagname" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+      esac
+
+      # Append the new tag name to the list of available tags.
+      if test -n "$tagname" ; then
+      available_tags="$available_tags $tagname"
+    fi
+    fi
+  done
+  IFS="$lt_save_ifs"
+
+  # Now substitute the updated list of available tags.
+  if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+    mv "${ofile}T" "$ofile"
+    chmod +x "$ofile"
+  else
+    rm -f "${ofile}T"
+    { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5
+echo "$as_me: error: unable to update list of available tagged configurations." >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+fi
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Prevent multiple expansion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test x"$enable_shared" = xyes; then
+  ENABLE_SHARED_TRUE=
+  ENABLE_SHARED_FALSE='#'
+else
+  ENABLE_SHARED_TRUE='#'
+  ENABLE_SHARED_FALSE=
+fi
+
+
+
+if test x"$enable_static" = xyes; then
+  ENABLE_STATIC_TRUE=
+  ENABLE_STATIC_FALSE='#'
+else
+  ENABLE_STATIC_TRUE='#'
+  ENABLE_STATIC_FALSE=
+fi
+
+
+# Checks for md5sum.
+# Extract the first word of "md5sum", so it can be a program name with args.
+set dummy md5sum; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_MD5SUM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$MD5SUM"; then
+  ac_cv_prog_MD5SUM="$MD5SUM" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MD5SUM="md5sum"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+MD5SUM=$ac_cv_prog_MD5SUM
+if test -n "$MD5SUM"; then
+  echo "$as_me:$LINENO: result: $MD5SUM" >&5
+echo "${ECHO_T}$MD5SUM" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+
+if test x$MD5SUM = xmd5sum; then
+  HAVE_MD5SUM_TRUE=
+  HAVE_MD5SUM_FALSE='#'
+else
+  HAVE_MD5SUM_TRUE='#'
+  HAVE_MD5SUM_FALSE=
+fi
+
+if test x$MD5SUM = xmd5sum
+then
+
+echo "$as_me:$LINENO: checking for the text md5sum command" >&5
+echo $ECHO_N "checking for the text md5sum command... $ECHO_C" >&6
+if echo a | (md5sum -t) >/dev/null 2>&1
+then
+  ac_cv_prog_text_md5sum='md5sum -t'
+else
+  ac_cv_prog_text_md5sum='md5sum'
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_text_md5sum" >&5
+echo "${ECHO_T}$ac_cv_prog_text_md5sum" >&6
+TEXT_MD5SUM=$ac_cv_prog_text_md5sum
+
+
+fi
+
+# Check for the GLPK library.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test "${ac_cv_header_glpk_h+set}" = set; then
+  echo "$as_me:$LINENO: checking for glpk.h" >&5
+echo $ECHO_N "checking for glpk.h... $ECHO_C" >&6
+if test "${ac_cv_header_glpk_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_glpk_h" >&5
+echo "${ECHO_T}$ac_cv_header_glpk_h" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking glpk.h usability" >&5
+echo $ECHO_N "checking glpk.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <glpk.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking glpk.h presence" >&5
+echo $ECHO_N "checking glpk.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <glpk.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: glpk.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: glpk.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: glpk.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: glpk.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: glpk.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: glpk.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: glpk.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: glpk.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: glpk.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: glpk.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: glpk.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: glpk.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: glpk.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: glpk.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: glpk.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: glpk.h: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for glpk.h" >&5
+echo $ECHO_N "checking for glpk.h... $ECHO_C" >&6
+if test "${ac_cv_header_glpk_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_glpk_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_glpk_h" >&5
+echo "${ECHO_T}$ac_cv_header_glpk_h" >&6
+
+fi
+if test $ac_cv_header_glpk_h = yes; then
+  HAVE_GLPK_H=yes
+fi
+
+
+
+
+if test x$HAVE_GLPK_H = xyes; then
+  HAVE_GLPK_TRUE=
+  HAVE_GLPK_FALSE='#'
+else
+  HAVE_GLPK_TRUE='#'
+  HAVE_GLPK_FALSE=
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+# Checks for header files.
+
+
+
+
+
+
+
+
+for ac_header in fenv.h ieeefp.h getopt.h signal.h sys/resource.h sys/time.h sys/types.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# Checks for header declarations.
+echo "$as_me:$LINENO: checking whether RLIMIT_DATA is declared" >&5
+echo $ECHO_N "checking whether RLIMIT_DATA is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_RLIMIT_DATA+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+
+int
+main ()
+{
+#ifndef RLIMIT_DATA
+  char *p = (char *) RLIMIT_DATA;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_RLIMIT_DATA=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_RLIMIT_DATA=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_DATA" >&5
+echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_DATA" >&6
+if test $ac_cv_have_decl_RLIMIT_DATA = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_DATA 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_DATA 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether RLIMIT_RSS is declared" >&5
+echo $ECHO_N "checking whether RLIMIT_RSS is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_RLIMIT_RSS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+
+int
+main ()
+{
+#ifndef RLIMIT_RSS
+  char *p = (char *) RLIMIT_RSS;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_RLIMIT_RSS=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_RLIMIT_RSS=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_RSS" >&5
+echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_RSS" >&6
+if test $ac_cv_have_decl_RLIMIT_RSS = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_RSS 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_RSS 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether RLIMIT_VMEM is declared" >&5
+echo $ECHO_N "checking whether RLIMIT_VMEM is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_RLIMIT_VMEM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+
+int
+main ()
+{
+#ifndef RLIMIT_VMEM
+  char *p = (char *) RLIMIT_VMEM;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_RLIMIT_VMEM=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_RLIMIT_VMEM=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_VMEM" >&5
+echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_VMEM" >&6
+if test $ac_cv_have_decl_RLIMIT_VMEM = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_VMEM 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_VMEM 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether RLIMIT_AS is declared" >&5
+echo $ECHO_N "checking whether RLIMIT_AS is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_RLIMIT_AS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+
+int
+main ()
+{
+#ifndef RLIMIT_AS
+  char *p = (char *) RLIMIT_AS;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_RLIMIT_AS=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_RLIMIT_AS=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_AS" >&5
+echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_AS" >&6
+if test $ac_cv_have_decl_RLIMIT_AS = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_AS 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_AS 0
+_ACEOF
+
+
+fi
+
+
+
+# Checks for typedefs, structures, and compiler characteristics.
+# Nothing for the time being.
+
+# Checks for library functions.
+# Nothing for the time being.
+
+# If we are using GCC we want to compile with warnings enabled.
+if test x"$GCC" = xyes
+then
+  CFLAGS="-W -Wall $CFLAGS"
+fi
+if test x"$GXX" = xyes
+then
+  CXXFLAGS="-W -Wall $CXXFLAGS"
+fi
+
+# System-dependent adjustments.
+cygwin=no
+darwin=no
+solaris=no
+no_undefined=no
+
+case "${host_cpu}" in
+alpha*)
+  if test x"$GCC" = xyes
+  then
+    CFLAGS="$CFLAGS -mfp-rounding-mode=d -mieee"
+    CXXFLAGS="$CXXFLAGS -mfp-rounding-mode=d -mieee"
+  else
+    CFLAGS="$CFLAGS -fprm d -ieee -underflow_to_zero"
+    CXXFLAGS="$CXXFLAGS -fprm d -ieee -underflow_to_zero"
+  fi
+  ;;
+*)
+  ;;
+esac
+
+case "${host_os}" in
+cygwin)
+  cygwin=yes
+  no_undefined=yes
+  ;;
+darwin*)
+  darwin=yes
+  if test x"$GCC" = xyes
+  then
+    CFLAGS="$CFLAGS -Wno-long-double"
+    CXXFLAGS="$CXXFLAGS -Wno-long-double"
+  fi
+  ;;
+solaris*)
+  solaris=yes
+  ;;
+*)
+  ;;
+esac
+
+
+
+if test x$cygwin = xyes; then
+  HOST_OS_CYGWIN_TRUE=
+  HOST_OS_CYGWIN_FALSE='#'
+else
+  HOST_OS_CYGWIN_TRUE='#'
+  HOST_OS_CYGWIN_FALSE=
+fi
+
+
+
+if test x$darwin = xyes; then
+  HOST_OS_DARWIN_TRUE=
+  HOST_OS_DARWIN_FALSE='#'
+else
+  HOST_OS_DARWIN_TRUE='#'
+  HOST_OS_DARWIN_FALSE=
+fi
+
+
+
+if test x$solaris = xyes; then
+  HOST_OS_SOLARIS_TRUE=
+  HOST_OS_SOLARIS_FALSE='#'
+else
+  HOST_OS_SOLARIS_TRUE='#'
+  HOST_OS_SOLARIS_FALSE=
+fi
+
+
+
+if test x$no_undefined = xyes; then
+  NO_UNDEFINED_TRUE=
+  NO_UNDEFINED_FALSE='#'
+else
+  NO_UNDEFINED_TRUE='#'
+  NO_UNDEFINED_FALSE=
+fi
+
+
+
+
+
+
+
+                                                                                                                                                                                                                                                                                                                                                                        ac_config_files="$ac_config_files Makefile ppl.lsm ppl.spec debian/Makefile debian/libppl.copyright debian/libppl-pwl.copyright src/ [...]
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[	 ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[	 ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${ASSERTIONS_ENABLED_TRUE}" && test -z "${ASSERTIONS_ENABLED_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"ASSERTIONS_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ASSERTIONS_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_PRECOMPILED_HEADERS_TRUE}" && test -z "${USE_PRECOMPILED_HEADERS_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_PRECOMPILED_HEADERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_PRECOMPILED_HEADERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_NATIVE_INTEGERS_TRUE}" && test -z "${USE_NATIVE_INTEGERS_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_NATIVE_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_NATIVE_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_CHECKED_INTEGERS_TRUE}" && test -z "${USE_CHECKED_INTEGERS_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_CHECKED_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_CHECKED_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_GMP_INTEGERS_TRUE}" && test -z "${USE_GMP_INTEGERS_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_GMP_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_GMP_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INT8_TRUE}" && test -z "${USE_INT8_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_INT8\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INT8\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INT16_TRUE}" && test -z "${USE_INT16_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_INT16\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INT16\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INT32_TRUE}" && test -z "${USE_INT32_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_INT32\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INT32\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INT64_TRUE}" && test -z "${USE_INT64_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_INT64\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INT64\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_PERL_TRUE}" && test -z "${HAVE_PERL_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${CAN_CONTROL_FPU_TRUE}" && test -z "${CAN_CONTROL_FPU_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"CAN_CONTROL_FPU\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"CAN_CONTROL_FPU\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${SUPPORTED_FLOAT_TRUE}" && test -z "${SUPPORTED_FLOAT_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"SUPPORTED_FLOAT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"SUPPORTED_FLOAT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${SUPPORTED_DOUBLE_TRUE}" && test -z "${SUPPORTED_DOUBLE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"SUPPORTED_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"SUPPORTED_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${SUPPORTED_LONG_DOUBLE_TRUE}" && test -z "${SUPPORTED_LONG_DOUBLE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"SUPPORTED_LONG_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"SUPPORTED_LONG_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_WATCHDOG_LIBRARY_TRUE}" && test -z "${BUILD_WATCHDOG_LIBRARY_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_C_INTERFACE_TRUE}" && test -z "${BUILD_C_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_C_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_C_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_CIAO_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_CIAO_PROLOG_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_CIAO_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_CIAO_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_GNU_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_GNU_PROLOG_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_GNU_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_GNU_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_SICSTUS_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_SICSTUS_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_SWI_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SWI_PROLOG_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_SWI_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_SWI_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_XSB_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_XSB_PROLOG_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_XSB_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_XSB_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_YAP_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_YAP_PROLOG_INTERFACE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_YAP_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_YAP_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${ENABLE_STATIC_TRUE}" && test -z "${ENABLE_STATIC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"ENABLE_STATIC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ENABLE_STATIC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_MD5SUM_TRUE}" && test -z "${HAVE_MD5SUM_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_MD5SUM\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_MD5SUM\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_GLPK_TRUE}" && test -z "${HAVE_GLPK_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_GLPK\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_GLPK\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HOST_OS_CYGWIN_TRUE}" && test -z "${HOST_OS_CYGWIN_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HOST_OS_CYGWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HOST_OS_CYGWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HOST_OS_DARWIN_TRUE}" && test -z "${HOST_OS_DARWIN_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HOST_OS_DARWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HOST_OS_DARWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HOST_OS_SOLARIS_TRUE}" && test -z "${HOST_OS_SOLARIS_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HOST_OS_SOLARIS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HOST_OS_SOLARIS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by the Parma Polyhedra Library $as_me 0.9, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+		   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf at gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+the Parma Polyhedra Library config.status 0.9
+configured by $0, generated by GNU Autoconf 2.59,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "ppl.lsm" ) CONFIG_FILES="$CONFIG_FILES ppl.lsm" ;;
+  "ppl.spec" ) CONFIG_FILES="$CONFIG_FILES ppl.spec" ;;
+  "debian/Makefile" ) CONFIG_FILES="$CONFIG_FILES debian/Makefile" ;;
+  "debian/libppl.copyright" ) CONFIG_FILES="$CONFIG_FILES debian/libppl.copyright" ;;
+  "debian/libppl-pwl.copyright" ) CONFIG_FILES="$CONFIG_FILES debian/libppl-pwl.copyright" ;;
+  "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+  "src/version.hh" ) CONFIG_FILES="$CONFIG_FILES src/version.hh" ;;
+  "src/ppl-config.cc" ) CONFIG_FILES="$CONFIG_FILES src/ppl-config.cc" ;;
+  "tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+  "tests/BD_Shape/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/BD_Shape/Makefile" ;;
+  "tests/Polyhedron/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Polyhedron/Makefile" ;;
+  "tests/Grid/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Grid/Makefile" ;;
+  "utils/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
+  "m4/Makefile" ) CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+  "demos/Makefile" ) CONFIG_FILES="$CONFIG_FILES demos/Makefile" ;;
+  "demos/ppl_lcdd/Makefile" ) CONFIG_FILES="$CONFIG_FILES demos/ppl_lcdd/Makefile" ;;
+  "demos/ppl_lcdd/examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES demos/ppl_lcdd/examples/Makefile" ;;
+  "demos/ppl_lpsol/Makefile" ) CONFIG_FILES="$CONFIG_FILES demos/ppl_lpsol/Makefile" ;;
+  "demos/ppl_lpsol/examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES demos/ppl_lpsol/examples/Makefile" ;;
+  "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+  "doc/user.doxyconf-latex" ) CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-latex" ;;
+  "doc/devref.doxyconf-latex" ) CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-latex" ;;
+  "doc/user.doxyconf-html" ) CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-html" ;;
+  "doc/devref.doxyconf-html" ) CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-html" ;;
+  "interfaces/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Makefile" ;;
+  "interfaces/C/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/C/Makefile" ;;
+  "interfaces/C/ppl_c.h" ) CONFIG_FILES="$CONFIG_FILES interfaces/C/ppl_c.h" ;;
+  "interfaces/Prolog/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/Makefile" ;;
+  "interfaces/Prolog/Ciao/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/Ciao/Makefile" ;;
+  "interfaces/Prolog/GNU/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/GNU/Makefile" ;;
+  "interfaces/Prolog/SICStus/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/SICStus/Makefile" ;;
+  "interfaces/Prolog/SWI/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/SWI/Makefile" ;;
+  "interfaces/Prolog/XSB/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/XSB/Makefile" ;;
+  "interfaces/Prolog/YAP/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/YAP/Makefile" ;;
+  "interfaces/Prolog/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/tests/Makefile" ;;
+  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s, at SHELL@,$SHELL,;t t
+s, at PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s, at PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s, at PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s, at PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s, at PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s, at PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s, at exec_prefix@,$exec_prefix,;t t
+s, at prefix@,$prefix,;t t
+s, at program_transform_name@,$program_transform_name,;t t
+s, at bindir@,$bindir,;t t
+s, at sbindir@,$sbindir,;t t
+s, at libexecdir@,$libexecdir,;t t
+s, at datadir@,$datadir,;t t
+s, at sysconfdir@,$sysconfdir,;t t
+s, at sharedstatedir@,$sharedstatedir,;t t
+s, at localstatedir@,$localstatedir,;t t
+s, at libdir@,$libdir,;t t
+s, at includedir@,$includedir,;t t
+s, at oldincludedir@,$oldincludedir,;t t
+s, at infodir@,$infodir,;t t
+s, at mandir@,$mandir,;t t
+s, at build_alias@,$build_alias,;t t
+s, at host_alias@,$host_alias,;t t
+s, at target_alias@,$target_alias,;t t
+s, at DEFS@,$DEFS,;t t
+s, at ECHO_C@,$ECHO_C,;t t
+s, at ECHO_N@,$ECHO_N,;t t
+s, at ECHO_T@,$ECHO_T,;t t
+s, at LIBS@,$LIBS,;t t
+s, at INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s, at INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s, at INSTALL_DATA@,$INSTALL_DATA,;t t
+s, at CYGPATH_W@,$CYGPATH_W,;t t
+s, at PACKAGE@,$PACKAGE,;t t
+s, at VERSION@,$VERSION,;t t
+s, at ACLOCAL@,$ACLOCAL,;t t
+s, at AUTOCONF@,$AUTOCONF,;t t
+s, at AUTOMAKE@,$AUTOMAKE,;t t
+s, at AUTOHEADER@,$AUTOHEADER,;t t
+s, at MAKEINFO@,$MAKEINFO,;t t
+s, at install_sh@,$install_sh,;t t
+s, at STRIP@,$STRIP,;t t
+s, at ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s, at INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s, at mkdir_p@,$mkdir_p,;t t
+s, at AWK@,$AWK,;t t
+s, at SET_MAKE@,$SET_MAKE,;t t
+s, at am__leading_dot@,$am__leading_dot,;t t
+s, at AMTAR@,$AMTAR,;t t
+s, at am__tar@,$am__tar,;t t
+s, at am__untar@,$am__untar,;t t
+s, at PPL_VERSION_MAJOR@,$PPL_VERSION_MAJOR,;t t
+s, at PPL_VERSION_MINOR@,$PPL_VERSION_MINOR,;t t
+s, at PPL_VERSION_REVISION@,$PPL_VERSION_REVISION,;t t
+s, at PPL_VERSION_BETA@,$PPL_VERSION_BETA,;t t
+s, at PPL_CONFIGURE_OPTIONS@,$PPL_CONFIGURE_OPTIONS,;t t
+s, at docdir@,$docdir,;t t
+s, at ISODATE@,$ISODATE,;t t
+s, at build@,$build,;t t
+s, at build_cpu@,$build_cpu,;t t
+s, at build_vendor@,$build_vendor,;t t
+s, at build_os@,$build_os,;t t
+s, at host@,$host,;t t
+s, at host_cpu@,$host_cpu,;t t
+s, at host_vendor@,$host_vendor,;t t
+s, at host_os@,$host_os,;t t
+s, at ASSERTIONS_ENABLED_TRUE@,$ASSERTIONS_ENABLED_TRUE,;t t
+s, at ASSERTIONS_ENABLED_FALSE@,$ASSERTIONS_ENABLED_FALSE,;t t
+s, at USE_PRECOMPILED_HEADERS_TRUE@,$USE_PRECOMPILED_HEADERS_TRUE,;t t
+s, at USE_PRECOMPILED_HEADERS_FALSE@,$USE_PRECOMPILED_HEADERS_FALSE,;t t
+s, at USE_NATIVE_INTEGERS_TRUE@,$USE_NATIVE_INTEGERS_TRUE,;t t
+s, at USE_NATIVE_INTEGERS_FALSE@,$USE_NATIVE_INTEGERS_FALSE,;t t
+s, at USE_CHECKED_INTEGERS_TRUE@,$USE_CHECKED_INTEGERS_TRUE,;t t
+s, at USE_CHECKED_INTEGERS_FALSE@,$USE_CHECKED_INTEGERS_FALSE,;t t
+s, at USE_GMP_INTEGERS_TRUE@,$USE_GMP_INTEGERS_TRUE,;t t
+s, at USE_GMP_INTEGERS_FALSE@,$USE_GMP_INTEGERS_FALSE,;t t
+s, at USE_INT8_TRUE@,$USE_INT8_TRUE,;t t
+s, at USE_INT8_FALSE@,$USE_INT8_FALSE,;t t
+s, at USE_INT16_TRUE@,$USE_INT16_TRUE,;t t
+s, at USE_INT16_FALSE@,$USE_INT16_FALSE,;t t
+s, at USE_INT32_TRUE@,$USE_INT32_TRUE,;t t
+s, at USE_INT32_FALSE@,$USE_INT32_FALSE,;t t
+s, at USE_INT64_TRUE@,$USE_INT64_TRUE,;t t
+s, at USE_INT64_FALSE@,$USE_INT64_FALSE,;t t
+s, at EGREP@,$EGREP,;t t
+s, at CC@,$CC,;t t
+s, at CFLAGS@,$CFLAGS,;t t
+s, at LDFLAGS@,$LDFLAGS,;t t
+s, at CPPFLAGS@,$CPPFLAGS,;t t
+s, at ac_ct_CC@,$ac_ct_CC,;t t
+s, at EXEEXT@,$EXEEXT,;t t
+s, at OBJEXT@,$OBJEXT,;t t
+s, at DEPDIR@,$DEPDIR,;t t
+s, at am__include@,$am__include,;t t
+s, at am__quote@,$am__quote,;t t
+s, at AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s, at AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s, at AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s, at CCDEPMODE@,$CCDEPMODE,;t t
+s, at am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s, at am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s, at CXX@,$CXX,;t t
+s, at CXXFLAGS@,$CXXFLAGS,;t t
+s, at ac_ct_CXX@,$ac_ct_CXX,;t t
+s, at CXXDEPMODE@,$CXXDEPMODE,;t t
+s, at am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s, at am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s, at CXXCPP@,$CXXCPP,;t t
+s, at PERL@,$PERL,;t t
+s, at HAVE_PERL_TRUE@,$HAVE_PERL_TRUE,;t t
+s, at HAVE_PERL_FALSE@,$HAVE_PERL_FALSE,;t t
+s, at CPP@,$CPP,;t t
+s, at CAN_CONTROL_FPU_TRUE@,$CAN_CONTROL_FPU_TRUE,;t t
+s, at CAN_CONTROL_FPU_FALSE@,$CAN_CONTROL_FPU_FALSE,;t t
+s, at SUPPORTED_FLOAT_TRUE@,$SUPPORTED_FLOAT_TRUE,;t t
+s, at SUPPORTED_FLOAT_FALSE@,$SUPPORTED_FLOAT_FALSE,;t t
+s, at SUPPORTED_DOUBLE_TRUE@,$SUPPORTED_DOUBLE_TRUE,;t t
+s, at SUPPORTED_DOUBLE_FALSE@,$SUPPORTED_DOUBLE_FALSE,;t t
+s, at SUPPORTED_LONG_DOUBLE_TRUE@,$SUPPORTED_LONG_DOUBLE_TRUE,;t t
+s, at SUPPORTED_LONG_DOUBLE_FALSE@,$SUPPORTED_LONG_DOUBLE_FALSE,;t t
+s, at LIBGMP@,$LIBGMP,;t t
+s, at LTLIBGMP@,$LTLIBGMP,;t t
+s, at LIBGMPXX@,$LIBGMPXX,;t t
+s, at LTLIBGMPXX@,$LTLIBGMPXX,;t t
+s, at BUILD_WATCHDOG_LIBRARY_TRUE@,$BUILD_WATCHDOG_LIBRARY_TRUE,;t t
+s, at BUILD_WATCHDOG_LIBRARY_FALSE@,$BUILD_WATCHDOG_LIBRARY_FALSE,;t t
+s, at subdirs@,$subdirs,;t t
+s, at BUILD_C_INTERFACE_TRUE@,$BUILD_C_INTERFACE_TRUE,;t t
+s, at BUILD_C_INTERFACE_FALSE@,$BUILD_C_INTERFACE_FALSE,;t t
+s, at CIAO_PROLOG@,$CIAO_PROLOG,;t t
+s, at BUILD_CIAO_PROLOG_INTERFACE_TRUE@,$BUILD_CIAO_PROLOG_INTERFACE_TRUE,;t t
+s, at BUILD_CIAO_PROLOG_INTERFACE_FALSE@,$BUILD_CIAO_PROLOG_INTERFACE_FALSE,;t t
+s, at GNU_PROLOG@,$GNU_PROLOG,;t t
+s, at BUILD_GNU_PROLOG_INTERFACE_TRUE@,$BUILD_GNU_PROLOG_INTERFACE_TRUE,;t t
+s, at BUILD_GNU_PROLOG_INTERFACE_FALSE@,$BUILD_GNU_PROLOG_INTERFACE_FALSE,;t t
+s, at sicstus_prolog@,$sicstus_prolog,;t t
+s, at SICSTUS_PROLOG_INCLUDE_OPTIONS@,$SICSTUS_PROLOG_INCLUDE_OPTIONS,;t t
+s, at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@,$BUILD_SICSTUS_PROLOG_INTERFACE_TRUE,;t t
+s, at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@,$BUILD_SICSTUS_PROLOG_INTERFACE_FALSE,;t t
+s, at swi_prolog@,$swi_prolog,;t t
+s, at SWI_PROLOG_INCLUDE_OPTIONS@,$SWI_PROLOG_INCLUDE_OPTIONS,;t t
+s, at BUILD_SWI_PROLOG_INTERFACE_TRUE@,$BUILD_SWI_PROLOG_INTERFACE_TRUE,;t t
+s, at BUILD_SWI_PROLOG_INTERFACE_FALSE@,$BUILD_SWI_PROLOG_INTERFACE_FALSE,;t t
+s, at xsb_prolog@,$xsb_prolog,;t t
+s, at XSB_PROLOG_INCLUDE_OPTIONS@,$XSB_PROLOG_INCLUDE_OPTIONS,;t t
+s, at BUILD_XSB_PROLOG_INTERFACE_TRUE@,$BUILD_XSB_PROLOG_INTERFACE_TRUE,;t t
+s, at BUILD_XSB_PROLOG_INTERFACE_FALSE@,$BUILD_XSB_PROLOG_INTERFACE_FALSE,;t t
+s, at YAP_PROLOG@,$YAP_PROLOG,;t t
+s, at BUILD_YAP_PROLOG_INTERFACE_TRUE@,$BUILD_YAP_PROLOG_INTERFACE_TRUE,;t t
+s, at BUILD_YAP_PROLOG_INTERFACE_FALSE@,$BUILD_YAP_PROLOG_INTERFACE_FALSE,;t t
+s, at LN_S@,$LN_S,;t t
+s, at ECHO@,$ECHO,;t t
+s, at AR@,$AR,;t t
+s, at ac_ct_AR@,$ac_ct_AR,;t t
+s, at RANLIB@,$RANLIB,;t t
+s, at ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s, at DLLTOOL@,$DLLTOOL,;t t
+s, at ac_ct_DLLTOOL@,$ac_ct_DLLTOOL,;t t
+s, at AS@,$AS,;t t
+s, at ac_ct_AS@,$ac_ct_AS,;t t
+s, at OBJDUMP@,$OBJDUMP,;t t
+s, at ac_ct_OBJDUMP@,$ac_ct_OBJDUMP,;t t
+s, at F77@,$F77,;t t
+s, at FFLAGS@,$FFLAGS,;t t
+s, at ac_ct_F77@,$ac_ct_F77,;t t
+s, at LIBTOOL@,$LIBTOOL,;t t
+s, at ENABLE_SHARED_TRUE@,$ENABLE_SHARED_TRUE,;t t
+s, at ENABLE_SHARED_FALSE@,$ENABLE_SHARED_FALSE,;t t
+s, at ENABLE_STATIC_TRUE@,$ENABLE_STATIC_TRUE,;t t
+s, at ENABLE_STATIC_FALSE@,$ENABLE_STATIC_FALSE,;t t
+s, at MD5SUM@,$MD5SUM,;t t
+s, at HAVE_MD5SUM_TRUE@,$HAVE_MD5SUM_TRUE,;t t
+s, at HAVE_MD5SUM_FALSE@,$HAVE_MD5SUM_FALSE,;t t
+s, at TEXT_MD5SUM@,$TEXT_MD5SUM,;t t
+s, at HAVE_GLPK_TRUE@,$HAVE_GLPK_TRUE,;t t
+s, at HAVE_GLPK_FALSE@,$HAVE_GLPK_FALSE,;t t
+s, at HOST_OS_CYGWIN_TRUE@,$HOST_OS_CYGWIN_TRUE,;t t
+s, at HOST_OS_CYGWIN_FALSE@,$HOST_OS_CYGWIN_FALSE,;t t
+s, at HOST_OS_DARWIN_TRUE@,$HOST_OS_DARWIN_TRUE,;t t
+s, at HOST_OS_DARWIN_FALSE@,$HOST_OS_DARWIN_FALSE,;t t
+s, at HOST_OS_SOLARIS_TRUE@,$HOST_OS_SOLARIS_TRUE,;t t
+s, at HOST_OS_SOLARIS_FALSE@,$HOST_OS_SOLARIS_FALSE,;t t
+s, at NO_UNDEFINED_TRUE@,$NO_UNDEFINED_TRUE,;t t
+s, at NO_UNDEFINED_FALSE@,$NO_UNDEFINED_FALSE,;t t
+s, at extra_includes@,$extra_includes,;t t
+s, at extra_libraries@,$extra_libraries,;t t
+s, at debug_flag@,$debug_flag,;t t
+s, at coefficient_mnemonic@,$coefficient_mnemonic,;t t
+s, at LIBOBJS@,$LIBOBJS,;t t
+s, at LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+				     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s, at configure_input@,$configure_input,;t t
+s, at srcdir@,$ac_srcdir,;t t
+s, at abs_srcdir@,$ac_abs_srcdir,;t t
+s, at top_srcdir@,$ac_top_srcdir,;t t
+s, at abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s, at builddir@,$ac_builddir,;t t
+s, at abs_builddir@,$ac_abs_builddir,;t t
+s, at top_builddir@,$ac_top_builddir,;t t
+s, at abs_top_builddir@,$ac_abs_top_builddir,;t t
+s, at INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
+ac_dB='[	 ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 # Do quote $f, to prevent DOS paths from being IFS'd.
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h.  The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status.  Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless.  Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo '  :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+  # Write a limited-size here document to $tmp/defines.sed.
+  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#define' lines.
+  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/defines.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo '  fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+  # Write a limited-size here document to $tmp/undefs.sed.
+  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#undef'
+  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+  rm -f conftest.undefs
+  mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated by configure.  */" >$tmp/config.h
+  else
+    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
+  fi
+  cat $tmp/in >>$tmp/config.h
+  rm -f $tmp/in
+  if test x"$ac_file" != x-; then
+    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+      { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+      rm -f $ac_file
+      mv $tmp/config.h $ac_file
+    fi
+  else
+    cat $tmp/config.h
+    rm -f $tmp/config.h
+  fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $ac_file | $ac_file:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X$ac_file : 'X\(//\)[^/]' \| \
+	 X$ac_file : 'X\(//\)$' \| \
+	 X$ac_file : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_dest" : 'X\(//\)[^/]' \| \
+	 X"$ac_dest" : 'X\(//\)$' \| \
+	 X"$ac_dest" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+  case $ac_dest in
+    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    { if $as_mkdir_p; then
+    mkdir -p $dirpart/$fdir
+  else
+    as_dir=$dirpart/$fdir
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+  esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+#
+# CONFIG_SUBDIRS section.
+#
+if test "$no_recursion" != yes; then
+
+  # Remove --cache-file and --srcdir arguments so they do not pile up.
+  ac_sub_configure_args=
+  ac_prev=
+  for ac_arg in $ac_configure_args; do
+    if test -n "$ac_prev"; then
+      ac_prev=
+      continue
+    fi
+    case $ac_arg in
+    -cache-file | --cache-file | --cache-fil | --cache-fi \
+    | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+      ac_prev=cache_file ;;
+    -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+    | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+    | --c=*)
+      ;;
+    --config-cache | -C)
+      ;;
+    -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+      ac_prev=srcdir ;;
+    -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+      ;;
+    -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+      ac_prev=prefix ;;
+    -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+      ;;
+    *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;;
+    esac
+  done
+
+  # Always prepend --prefix to ensure using the same prefix
+  # in subdir configurations.
+  ac_sub_configure_args="--prefix=$prefix $ac_sub_configure_args"
+
+  ac_popdir=`pwd`
+  for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
+
+    # Do not complain, so a configure script can configure whichever
+    # parts of a large source tree are present.
+    test -d $srcdir/$ac_dir || continue
+
+    { echo "$as_me:$LINENO: configuring in $ac_dir" >&5
+echo "$as_me: configuring in $ac_dir" >&6;}
+    { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+    cd $ac_dir
+
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      ac_sub_configure="$SHELL '$ac_srcdir/configure.gnu'"
+    elif test -f $ac_srcdir/configure; then
+      ac_sub_configure="$SHELL '$ac_srcdir/configure'"
+    elif test -f $ac_srcdir/configure.in; then
+      ac_sub_configure=$ac_configure
+    else
+      { echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5
+echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+      ac_sub_configure=
+    fi
+
+    # The recursion is here.
+    if test -n "$ac_sub_configure"; then
+      # Make the cache file name correct relative to the subdirectory.
+      case $cache_file in
+      [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
+      *) # Relative path.
+	ac_sub_cache_file=$ac_top_builddir$cache_file ;;
+      esac
+
+      { echo "$as_me:$LINENO: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+echo "$as_me: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+      # The eval makes quoting arguments work.
+      eval $ac_sub_configure $ac_sub_configure_args \
+	   --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir ||
+	{ { echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5
+echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+
+    cd $ac_popdir
+  done
+fi
+
+
+if test x"$gmp_supports_exceptions" = xno
+then
+  { echo "$as_me:$LINENO: WARNING: CANNOT PROPAGATE EXCEPTIONS BACK FROM GMP:
+*** MEMORY EXHAUSTION MAY RESULT IN ABRUPT TERMINATION.
+*** This is OK, if you do not plan to use the bounded memory capabilities
+*** offered by the PPL.  Otherwise, if you are using GCC or the Intel C/C++
+*** compiler, please make sure you use a version of GMP compiled with the
+*** \`-fexceptions' compiler option.
+*** To build such a version, you can configure GMP as follows:
+*** CPPFLAGS=-fexceptions ./configure --enable-cxx --prefix=/usr/local" >&5
+echo "$as_me: WARNING: CANNOT PROPAGATE EXCEPTIONS BACK FROM GMP:
+*** MEMORY EXHAUSTION MAY RESULT IN ABRUPT TERMINATION.
+*** This is OK, if you do not plan to use the bounded memory capabilities
+*** offered by the PPL.  Otherwise, if you are using GCC or the Intel C/C++
+*** compiler, please make sure you use a version of GMP compiled with the
+*** \`-fexceptions' compiler option.
+*** To build such a version, you can configure GMP as follows:
+*** CPPFLAGS=-fexceptions ./configure --enable-cxx --prefix=/usr/local" >&2;}
+fi
+
+if test x"$PERL" = xno
+then
+  { echo "$as_me:$LINENO: WARNING: PERL UNAVAILABLE:
+***  CANNOT REBUILD SOME FILES IF SOURCES ARE CHANGED.
+*** Perl could not be found on your system.  This is OK, if you only plan
+*** to build the PPL without modifying the sources and without trying to
+*** build a distribution out of a CVS working copy.  If this is not the case,
+*** then you need to add Perl to your development environment:
+*** see http://www.perl.org/ for more information." >&5
+echo "$as_me: WARNING: PERL UNAVAILABLE:
+***  CANNOT REBUILD SOME FILES IF SOURCES ARE CHANGED.
+*** Perl could not be found on your system.  This is OK, if you only plan
+*** to build the PPL without modifying the sources and without trying to
+*** build a distribution out of a CVS working copy.  If this is not the case,
+*** then you need to add Perl to your development environment:
+*** see http://www.perl.org/ for more information." >&2;}
+fi
+
+if test x"$coefficient_kind" = xnative
+then
+  { echo "$as_me:$LINENO: WARNING: USING NATIVE INTEGERS IS EXTREMELY DANGEROUS:
+*** CONSIDER ANY RESULT YOU WILL GET FROM THE LIBRARY AS PSEUDO-RANDOM!!!
+*** You have requested to use a native integral type to represent
+*** coefficients.  This means that arithmetic overflows will be possible
+*** and will not be detected.  The consequence of that is that nothing
+*** can be said about the behavior of the library:  whatever the
+*** documentation says, it does not apply to the version of the library
+*** you are about to build.  Just one arithmetic overflow is enough
+*** to invalidate any possible significance of the results.
+*** Please, do not assume that your computation will not overflow because
+*** only small coefficients are involved.  Do not do it because
+*** (1) coefficients may grow very rapidly depending on the polyhedra
+***     computations being performed;
+*** (2) the library may do internal polyhedra computations that you
+***     cannot easily anticipate;
+*** (3) the library has never had, among its design goals, the one of
+***     trying to keep the coefficients small.
+***
+*** Please, consider using a _checked_ native integral type instead." >&5
+echo "$as_me: WARNING: USING NATIVE INTEGERS IS EXTREMELY DANGEROUS:
+*** CONSIDER ANY RESULT YOU WILL GET FROM THE LIBRARY AS PSEUDO-RANDOM!!!
+*** You have requested to use a native integral type to represent
+*** coefficients.  This means that arithmetic overflows will be possible
+*** and will not be detected.  The consequence of that is that nothing
+*** can be said about the behavior of the library:  whatever the
+*** documentation says, it does not apply to the version of the library
+*** you are about to build.  Just one arithmetic overflow is enough
+*** to invalidate any possible significance of the results.
+*** Please, do not assume that your computation will not overflow because
+*** only small coefficients are involved.  Do not do it because
+*** (1) coefficients may grow very rapidly depending on the polyhedra
+***     computations being performed;
+*** (2) the library may do internal polyhedra computations that you
+***     cannot easily anticipate;
+*** (3) the library has never had, among its design goals, the one of
+***     trying to keep the coefficients small.
+***
+*** Please, consider using a _checked_ native integral type instead." >&2;}
+fi
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..18e3c2e
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,911 @@
+# Autoconf source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+# Process this file with autoconf to produce a configure script.
+
+# Every other copy of the package version number gets its value from here.
+AC_INIT([the Parma Polyhedra Library], [0.9], [ppl-devel at cs.unipr.it], [ppl])
+
+# Minimum autoconf version required.
+AC_PREREQ(2.59)
+
+# Make sure the sources are there.
+AC_CONFIG_SRCDIR(src/Polyhedron_public.cc)
+
+# Use Automake.
+AM_INIT_AUTOMAKE([foreign dist-bzip2 dist-zip 1.7.3])
+
+AC_SUBST(VERSION)
+
+# Version number machinery.
+changequote(<<, >>)dnl
+if test -n "`expr $VERSION : '\([0-9]*\)\.[0-9]*\.[0-9]*'`"
+then
+  PPL_VERSION_MAJOR=`expr $VERSION : '\([0-9]*\)\.[0-9]*\.[0-9]*'`
+  PPL_VERSION_MINOR=`expr $VERSION : '[0-9]*\.\([0-9]*\)\.[0-9]*'`
+  PPL_VERSION_REVISION=`expr $VERSION : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
+  PPL_VERSION_BETA=`expr $VERSION : '[0-9]*\.[0-9]*\.[0-9]*pre\([0-9]*\)'`
+else
+  PPL_VERSION_MAJOR=`expr $VERSION : '\([0-9]*\)\.[0-9]*'`
+  PPL_VERSION_MINOR=`expr $VERSION : '[0-9]*\.\([0-9]*\)'`
+  PPL_VERSION_REVISION=0
+  PPL_VERSION_BETA=`expr $VERSION : '[0-9]*\.[0-9]*pre\([0-9]*\)'`
+fi
+if test -z "$PPL_VERSION_BETA"
+then
+  PPL_VERSION_BETA=0
+fi
+changequote([, ])dnl
+AC_SUBST(PPL_VERSION_MAJOR)
+AC_SUBST(PPL_VERSION_MINOR)
+AC_SUBST(PPL_VERSION_REVISION)
+AC_SUBST(PPL_VERSION_BETA)
+
+AC_DEFINE_UNQUOTED(PPL_CONFIGURE_OPTIONS, "$ac_configure_args", [This contains the options with which `configure' was invoked.])
+PPL_CONFIGURE_OPTIONS="\"$ac_configure_args\""
+AC_SUBST(PPL_CONFIGURE_OPTIONS)
+
+# Installation directories.
+AC_SUBST([docdir], ['${datadir}/doc/ppl'])
+
+# Generate a configuration header file.
+AC_CONFIG_HEADER(config.h)
+
+ISODATE=`date +%Y-%m-%d`
+AC_SUBST(ISODATE)
+
+# Check for host type.
+AC_CANONICAL_HOST
+
+AH_TOP([
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+])
+
+AH_BOTTOM([
+/*
+  In order for the definition of `int64_t' to be seen by Comeau C/C++,
+  we must make sure <stdint.h> is included before <sys/types.hh> is
+  (even indirectly) included.
+*/
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#endif /* !defined(PPL_ppl_config_h) */
+])
+
+# C compiler
+
+AC_ARG_WITH(cc,
+  AC_HELP_STRING([--with-cc=XXX],
+    [use XXX as the C compiler]),
+  CC=$with_cc)
+
+# C++ compiler
+
+AC_ARG_WITH(cxx,
+  AC_HELP_STRING([--with-cxx=XXX],
+    [use XXX as the C++ compiler]),
+  CXX=$with_cxx)
+
+# Compilation flags
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+AC_MSG_CHECKING([whether to compile with debug info])
+AC_ARG_ENABLE(debugging,
+  AC_HELP_STRING([--enable-debugging],
+    [compile with debugging information]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  OPT_FLAGS="-g"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-debugging, needs yes or no])
+  ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether to compile for profiling])
+AC_ARG_ENABLE(profiling,
+  AC_HELP_STRING([--enable-profiling],
+    [compile for profiling]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -pg -DPROFILING=1"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-profiling, needs yes or no])
+  ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether to compile for test coverage])
+AC_ARG_ENABLE(coverage,
+  AC_HELP_STRING([--enable-coverage],
+    [compile for test coverage]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-coverage, needs yes or no])
+  ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether to enable checking of run-time assertions])
+AC_ARG_ENABLE(assertions,
+  AC_HELP_STRING([--enable-assertions],
+    [check run-time assertions]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-assertions, needs yes or no])
+  ;;
+esac
+enable_assertions=${enableval}
+
+enableval=no
+AC_MSG_CHECKING([whether to enable even more run-time assertions])
+AC_ARG_ENABLE(more-assertions,
+  AC_HELP_STRING([--enable-more-assertions],
+    [check even more run-time assertions]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-more-assertions, needs yes or no])
+  ;;
+esac
+enable_more_assertions=${enableval}
+
+if test x"$enable_more_assertions" = xyes
+then
+  enable_assertions=yes
+  AC_DEFINE(EXTRA_ROW_DEBUG, 1, [Enable more assertions when defined.])
+fi
+
+if test x"$enable_assertions" = xno
+then
+  AC_DEFINE(NDEBUG, 1, [Assertions are disabled when this is defined.])
+  debug_flag="-DNDEBUG=1"
+fi
+
+AM_CONDITIONAL(ASSERTIONS_ENABLED, test x"$enable_assertions" = xyes)
+
+
+arch=no
+enableval=standard
+AC_MSG_CHECKING([whether to enable optimizations])
+AC_ARG_ENABLE(optimization,
+  AC_HELP_STRING([--enable-optimization],
+    [enable compiler optimizations]))
+case "${enableval}" in
+sspeed)
+  AC_MSG_RESULT(sspeed)
+  OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
+  arch=yes
+  ;;
+speed)
+  AC_MSG_RESULT(speed)
+  OPT_FLAGS="$OPT_FLAGS -O3"
+  arch=yes
+  ;;
+size)
+  AC_MSG_RESULT(size)
+  OPT_FLAGS="$OPT_FLAGS -Os"
+  arch=yes
+  ;;
+standard | yes)
+  AC_MSG_RESULT(standard)
+  OPT_FLAGS="$OPT_FLAGS -O2"
+  ;;
+mild)
+  AC_MSG_RESULT(mild)
+  OPT_FLAGS="$OPT_FLAGS -O1"
+  ;;
+zero)
+  AC_MSG_RESULT(zero)
+  OPT_FLAGS="$OPT_FLAGS -O0"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no])
+  ;;
+esac
+
+enableval=$arch
+AC_MSG_CHECKING([for which architecture to optimize])
+AC_ARG_ENABLE(arch,
+  AC_HELP_STRING([--enable-arch@<:@=ARCH@:>@],
+    [optimize for architecture ARCH]))
+case "${enableval}" in
+yes)
+  m=`uname -m`
+  case $m in
+  i?86 | k6 | athlon)
+    AC_MSG_RESULT($m)
+    OPT_FLAGS="$OPT_FLAGS -march=$m"
+    ;;
+  *)
+    AC_MSG_RESULT(default)
+    ;;
+  esac
+  ;;
+no)
+  AC_MSG_RESULT(default)
+  ;;
+*)
+  AC_MSG_RESULT($enableval)
+  OPT_FLAGS="$OPT_FLAGS -march=$enableval"
+  ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether to use precompiled headers])
+AC_ARG_ENABLE(pch,
+  AC_HELP_STRING([--enable-pch],
+    [use precompiled headers, if available]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  COMP_FLAGS="$COMP_FLAGS -Winvalid-pch"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-pch, needs yes or no])
+  ;;
+esac
+AM_CONDITIONAL(USE_PRECOMPILED_HEADERS, test x"$enableval" = xyes)
+
+CFLAGS="$COMP_FLAGS $OPT_FLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS"
+
+enableval=mpz
+AC_MSG_CHECKING([the type of integral values to use as coefficients])
+AC_ARG_ENABLE(coefficients,
+  AC_HELP_STRING([--enable-coefficients],
+    [select the type of the coefficients]))
+case "${enableval}" in
+native-int8)
+  AC_MSG_RESULT([native 8 bits integers])
+  coefficient_kind=native
+  coefficient_bits=8
+  coefficient_mnemonic=nint8
+  ;;
+native-int16)
+  AC_MSG_RESULT([native 16 bits integers])
+  coefficient_kind=native
+  coefficient_bits=16
+  coefficient_mnemonic=nint16
+  ;;
+native-int32)
+  AC_MSG_RESULT([native 32 bits integers])
+  coefficient_kind=native
+  coefficient_bits=32
+  coefficient_mnemonic=nint32
+  ;;
+native-int64)
+  AC_MSG_RESULT([native 64 bits integers])
+  coefficient_kind=native
+  coefficient_bits=64
+  coefficient_mnemonic=nint64
+  ;;
+checked-int8)
+  AC_MSG_RESULT([checked 8 bits integers])
+  coefficient_kind=checked
+  coefficient_bits=8
+  coefficient_mnemonic=int8
+  ;;
+checked-int16)
+  AC_MSG_RESULT([checked 16 bits integers])
+  coefficient_kind=checked
+  coefficient_bits=16
+  coefficient_mnemonic=int16
+  ;;
+checked-int32)
+  AC_MSG_RESULT([checked 32 bits integers])
+  coefficient_kind=checked
+  coefficient_bits=32
+  coefficient_mnemonic=int32
+  ;;
+checked-int64)
+  AC_MSG_RESULT([checked 64 bits integers])
+  coefficient_kind=checked
+  coefficient_bits=64
+  coefficient_mnemonic=int64
+  ;;
+mpz)
+  AC_MSG_RESULT([GMP mpz])
+  coefficient_kind=unbounded
+  coefficient_bits=0
+  coefficient_mnemonic=mpz
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8])
+  ;;
+esac
+
+AM_CONDITIONAL(USE_NATIVE_INTEGERS, test x"$coefficient_kind" = xnative)
+AM_CONDITIONAL(USE_CHECKED_INTEGERS, test x"$coefficient_kind" = xchecked)
+AM_CONDITIONAL(USE_GMP_INTEGERS, test x"$coefficient_kind" = xunbounded)
+AM_CONDITIONAL(USE_INT8, test x"$coefficient_bits" = x8)
+AM_CONDITIONAL(USE_INT16, test x"$coefficient_bits" = x16)
+AM_CONDITIONAL(USE_INT32, test x"$coefficient_bits" = x32)
+AM_CONDITIONAL(USE_INT64, test x"$coefficient_bits" = x64)
+
+
+if test x"$coefficient_kind" = xnative
+then
+  coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t, Checked_Number_Transparent_Policy>"
+  AC_DEFINE_UNQUOTED(COEFFICIENT_TYPE, $coefficient_type, [The integral type used to represent coefficients.])
+  AC_DEFINE_UNQUOTED(COEFFICIENT_BITS, $coefficient_bits, [The number of bits of coefficients; 0 if unbounded.])
+  AC_DEFINE(NATIVE_INTEGERS, 1, [Defined if the integral type to be used for coefficients is a native one.])
+elif test x"$coefficient_kind" = xchecked
+then
+  coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t>"
+  AC_DEFINE_UNQUOTED(COEFFICIENT_TYPE, $coefficient_type)
+  AC_DEFINE_UNQUOTED(COEFFICIENT_BITS, $coefficient_bits)
+  AC_DEFINE(CHECKED_INTEGERS, 1, [Defined if the integral type to be used for coefficients is a checked one.])
+elif test x"$coefficient_kind" = xunbounded
+then
+  AC_DEFINE(COEFFICIENT_TYPE, mpz_class)
+  AC_DEFINE(COEFFICIENT_BITS, 0)
+  AC_DEFINE(GMP_INTEGERS, 1, [Defined if the integral type to be used for coefficients is GMP's one.])
+fi
+
+# Allow additions to C and C++ compilation flags
+
+AC_ARG_WITH(cflags,
+  AC_HELP_STRING([--with-cflags=XXX],
+    [add XXX to the options for the C compiler]),
+  CFLAGS="$CFLAGS $with_cflags")
+
+AC_ARG_WITH(cxxflags,
+  AC_HELP_STRING([--with-cxxflags=XXX],
+    [add XXX to the options for the C++ compiler]),
+  CXXFLAGS="$CXXFLAGS $with_cxxflags")
+
+# Checks for programs.
+AC_PROG_EGREP
+AC_PROG_CC
+AC_PROG_CXX
+AC_PROG_CXXCPP
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+
+# Check for Perl.
+AC_PATH_PROG([PERL], perl, no)
+AC_SUBST([PERL])
+AM_CONDITIONAL(HAVE_PERL, test x"$PERL" != xno)
+
+# Checks for C typedefs, structures, compiler and architecture characteristics.
+AC_LANG(C)
+AC_C_CONST
+AC_C_INLINE
+AC_C_BIGENDIAN
+
+# Checks for C type sizes.
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(long)
+AC_CHECK_SIZEOF(long long)
+AC_CHECK_SIZEOF(unsigned)
+AC_CHECK_SIZEOF(unsigned long)
+AC_CHECK_SIZEOF(unsigned long long)
+AC_CHECK_SIZEOF(size_t)
+AC_CHECK_SIZEOF(float)
+AC_CHECK_SIZEOF(double)
+AC_CHECK_SIZEOF(long double)
+
+# Use C++ for the remaining checks.
+AC_LANG(C++)
+
+dnl Check for the possibility to control the FPU.
+AC_CHECK_FPU_CONTROL
+
+# Detect the binary format used by C++ floats.
+AC_CXX_FLOAT_BINARY_FORMAT
+
+# Detect the binary format used by C++ doubles.
+AC_CXX_DOUBLE_BINARY_FORMAT
+
+# Detect the binary format used by C++ long doubles.
+AC_CXX_LONG_DOUBLE_BINARY_FORMAT
+
+# Check whether the C++ compiler supports flexible arrays.
+AC_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+
+# Check whether the C++ compiler supports __attribute__ ((weak)).
+AC_CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+# Checks for the availability of C library functions in C++.
+AC_CHECK_DECLS([ffs], , , [#include <strings.h>])
+AC_CHECK_DECLS([getenv,strtof,strtod,strtold,strtoll,strtoull], , , [#include <cstdlib>])
+AC_CHECK_DECLS([fma,fmaf,fmal,rintf,rintl], , , [#include <cmath>])
+
+# Checks for the availability of "fast" integral types.
+AC_CHECK_TYPES([int_fast16_t,int_fast32_t,int_fast64_t,uint_fast16_t,uint_fast32_t,uint_fast64_t])
+
+# Must link everything with libm.
+extra_libraries="${extra_libraries} -lm"
+
+# GMP library
+
+AC_CHECK_GMP
+
+if test x"$have_gmp" = xno
+then
+  AC_MSG_ERROR([Cannot find GMP version 4.1.3 or higher.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options.])
+else
+  if test x"$have_gmpxx" = xno
+  then
+    AC_MSG_ERROR([GMP compiled without enabling the C++ interface.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options.])
+  fi
+fi
+
+AC_CHECK_MEMBERS([__mpz_struct._mp_alloc,
+                  __mpz_struct._mp_size,
+                  __mpz_struct._mp_d],
+                 ,
+                 gmp_has_changes=yes,
+                 [#include <gmp.h>])
+
+if test x"$gmp_has_changed" = xyes
+then
+  AC_MSG_ERROR([GMP HAS CHANGED:
+*** The PPL exploits some implementation details of GMP that were current
+*** until (at least) version 4.1.4 of GMP.  You seem to be using a version
+*** where these details have changed.
+*** Please report this to ppl-devel at cs.unipr.it.])
+fi
+
+extra_includes="${extra_includes}${extra_includes:+ }${gmp_includes_option}"
+extra_libraries="${extra_libraries}${extra_libraries:+ }${gmp_library_option}"
+
+enableval=yes
+AC_MSG_CHECKING([whether to build the Parma Watchdog Library])
+AC_ARG_ENABLE(watchdog,
+  AC_HELP_STRING([--enable-watchdog],
+    [build also the Parma Watchdog Library]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-watchdog, needs yes or no])
+  ;;
+esac
+build_watchdog_library=$enableval
+AM_CONDITIONAL(BUILD_WATCHDOG_LIBRARY, test x"$build_watchdog_library" = xyes)
+
+# Enabled or not, the Watchdog subdirectory must be configured.
+AC_CONFIG_SUBDIRS(Watchdog)
+
+# This is the list of available interfaces: lowercase and blank-separated.
+available_interfaces="cxx c ciao_prolog gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog"
+
+# This is the list of interfaces that are enabled by default.
+#default_interfaces="cxx c swi_prolog"
+default_interfaces=${available_interfaces}
+
+enableval=not_specified
+AC_MSG_CHECKING([which interfaces are enabled])
+AC_ARG_ENABLE(interfaces,
+  AC_HELP_STRING([--enable-interfaces],
+    [enable some or all the library interfaces]))
+case x"${enableval}" in
+xyes | x)
+  AC_MSG_ERROR([--enable-interfaces needs at least one argument chosen among ${available_interfaces}, none and all])
+  ;;
+xnone | xno)
+  for interface in ${available_interfaces}
+  do
+    eval ${interface}_interface_enabled=no
+  done
+  AC_MSG_RESULT(none)
+  ;;
+xall)
+  for interface in ${available_interfaces}
+  do
+    eval ${interface}_interface_enabled=yes
+  done
+  AC_MSG_RESULT([${available_interfaces}])
+  ;;
+*)
+  if test x"${enableval}" = xnot_specified
+  then
+    enableval=${default_interfaces}
+  fi
+  # Make the list blank-separated and lowercase; turn "c++" into "cxx".
+  required_interfaces=`echo "${enableval}" | sed -e 's/-/_/g' -e 's/[[ 	,]][[ 	,]]*/ /g' -e 's/c++/cxx/g' | tr '[[:upper:]]' '[[:lower:]]'`
+  # Check that the specified interfaces exist.
+  for interface in ${required_interfaces}
+  do
+    case " ${available_interfaces} " in
+    *\ ${interface}\ *)
+      ;;
+    *)
+      AC_MSG_ERROR([unknown interface ${interface}: must be one of ${available_interfaces}])
+      ;;
+    esac
+  done
+  # Initialize the enabled variable for each interface.
+  for interface in ${available_interfaces}
+  do
+    case " ${required_interfaces} " in
+    *\ ${interface}\ *)
+      eval ${interface}_interface_enabled=yes
+      enabled_interfaces="${enabled_interfaces}${enabled_interfaces:+ }${interface}"
+      ;;
+    *)
+      eval ${interface}_interface_enabled=no
+      ;;
+    esac
+  done
+  AC_MSG_RESULT([${enabled_interfaces}])
+  ;;
+esac
+
+# Set an Automake conditional to build or not to build the C interface.
+AM_CONDITIONAL(BUILD_C_INTERFACE, test x${c_interface_enabled} = xyes)
+
+# Checks for Prolog systems for which the interface is enabled.
+
+# Ciao Prolog
+if test x${ciao_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_PROG(CIAO_PROLOG, ciao, ciao)
+  if test x"$CIAO_PROLOG" = xciao
+  then
+  AC_CHECK_HEADER(ciao_prolog.h,
+                  [],
+                  CIAO_PROLOG="")
+  fi
+fi
+AM_CONDITIONAL(BUILD_CIAO_PROLOG_INTERFACE, test x$CIAO_PROLOG = xciao)
+
+# GNU Prolog
+if test x${gnu_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_PROG(GNU_PROLOG, gprolog, gprolog)
+  if test x"$GNU_PROLOG" = xgprolog
+  then
+    AC_CHECK_HEADER(gprolog.h,
+                    [],
+                    GNU_PROLOG="")
+  fi
+fi
+AM_CONDITIONAL(BUILD_GNU_PROLOG_INTERFACE, test x$GNU_PROLOG = xgprolog)
+
+# SICStus
+if test x${sicstus_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_SICSTUS_PROLOG
+fi
+AM_CONDITIONAL(BUILD_SICSTUS_PROLOG_INTERFACE, test x$have_sicstus_prolog = xyes)
+
+# SWI Prolog
+if test x${swi_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_SWI_PROLOG
+fi
+AM_CONDITIONAL(BUILD_SWI_PROLOG_INTERFACE, test x$have_swi_prolog = xyes)
+
+# XSB
+if test x${xsb_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_XSB_PROLOG
+fi
+AM_CONDITIONAL(BUILD_XSB_PROLOG_INTERFACE, test x$have_xsb_prolog = xyes)
+
+# YAP
+if test x${yap_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_PROG(YAP_PROLOG, yap, yap)
+  if test x"$YAP_PROLOG" = xyap
+  then
+    AC_CHECK_HEADER(Yap/c_interface.h,
+                    [],
+                    YAP_PROLOG="")
+  fi
+fi
+AM_CONDITIONAL(BUILD_YAP_PROLOG_INTERFACE, test x$YAP_PROLOG = xyap)
+
+# # This is the list of interfaces that are enabled by default.
+# # Different instantiations are separated by a '@' character.
+# default_instantiations="Polyhedron @ BD_Shape<int8_t>"
+# 
+# enableval=not_specified
+# AC_MSG_CHECKING([which instantiations are enabled])
+# AC_ARG_ENABLE(instantiations,
+#   AC_HELP_STRING([--enable-instantiations],
+#     [enable instantiations for the non-C++ interfaces]))
+# case x"${enableval}" in
+# xyes | x)
+#   AC_MSG_ERROR([--enable-instantiations needs at least one argument])
+#   ;;
+# xno | xnone)
+#   enabled_instantiations=
+#   AC_MSG_RESULT(none)
+#   ;;
+# *)
+#   if test x"${enableval}" = xnot_specified
+#   then
+#     enableval=${default_instantiations}
+#   fi
+#   # Make the list blank-separated.
+#   required_instantiations=`echo "${enableval}" | sed -e 's/[[ 	]][[ 	]]*//g' -e 's/@/ /g' -e 's/[[ 	]][[ 	]]*/ /g'`
+#   # Check the specified instantiations for validity.
+#   ac_save_CPPFLAGS="$CPPFLAGS"
+#   CPPFLAGS="$CPPFLAGS -I${srcdir}"
+#   for instantiation in ${required_instantiations}
+#   do
+#     AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+# #include "instchk.hh"
+# 
+# using namespace Parma_Polyhedra_Library;
+# 
+# bool valid = ${instantiation}::valid_instantiation();
+# ]])],
+#       valid_instantiation=yes,
+#       valid_instantiation=no)
+#     if test x${valid_instantiation} != xyes
+#     then
+#       AC_MSG_ERROR([invalid instantiation ${instantiation}])
+#     fi
+#   done
+#   CPPFLAGS="$ac_save_CPPFLAGS"
+#   AC_MSG_RESULT([${required_instantiations}])
+#   ;;
+# esac
+
+# Libtool.
+# Turn off shared libraries during beta-testing, since they
+# make debugging harder and the build process takes too long.
+#AC_DISABLE_SHARED
+AC_LIBTOOL_DLOPEN
+AC_LIBTOOL_WIN32_DLL
+AC_PROG_LIBTOOL
+AM_CONDITIONAL(ENABLE_SHARED, test x"$enable_shared" = xyes)
+AM_CONDITIONAL(ENABLE_STATIC, test x"$enable_static" = xyes)
+
+# Checks for md5sum.
+AC_CHECK_PROG(MD5SUM, md5sum, md5sum)
+AM_CONDITIONAL(HAVE_MD5SUM, test x$MD5SUM = xmd5sum)
+if test x$MD5SUM = xmd5sum
+then
+  AC_TEXT_MD5SUM
+fi
+
+# Check for the GLPK library.
+AC_LANG_PUSH(C)
+AC_CHECK_HEADER(glpk.h, HAVE_GLPK_H=yes)
+AM_CONDITIONAL(HAVE_GLPK, test x$HAVE_GLPK_H = xyes)
+AC_LANG_POP(C)
+
+# Checks for header files.
+AC_CHECK_HEADERS([fenv.h ieeefp.h getopt.h signal.h sys/resource.h sys/time.h sys/types.h unistd.h])
+
+# Checks for header declarations.
+AC_CHECK_DECLS([RLIMIT_DATA, RLIMIT_RSS, RLIMIT_VMEM, RLIMIT_AS],
+               ,
+               ,
+               [
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+])
+
+# Checks for typedefs, structures, and compiler characteristics.
+# Nothing for the time being.
+
+# Checks for library functions.
+# Nothing for the time being.
+
+# If we are using GCC we want to compile with warnings enabled.
+if test x"$GCC" = xyes
+then
+  CFLAGS="-W -Wall $CFLAGS"
+fi
+if test x"$GXX" = xyes
+then
+  CXXFLAGS="-W -Wall $CXXFLAGS"
+fi
+
+# System-dependent adjustments.
+cygwin=no
+darwin=no
+solaris=no
+no_undefined=no
+
+case "${host_cpu}" in
+alpha*)
+  if test x"$GCC" = xyes
+  then
+    CFLAGS="$CFLAGS -mfp-rounding-mode=d -mieee"
+    CXXFLAGS="$CXXFLAGS -mfp-rounding-mode=d -mieee"
+  else
+    CFLAGS="$CFLAGS -fprm d -ieee -underflow_to_zero"
+    CXXFLAGS="$CXXFLAGS -fprm d -ieee -underflow_to_zero"
+  fi
+  ;;
+*)
+  ;;
+esac
+
+case "${host_os}" in
+cygwin)
+  cygwin=yes
+  no_undefined=yes
+  ;;
+darwin*)
+  darwin=yes
+  if test x"$GCC" = xyes
+  then
+    CFLAGS="$CFLAGS -Wno-long-double"
+    CXXFLAGS="$CXXFLAGS -Wno-long-double"
+  fi
+  ;;
+solaris*)
+  solaris=yes
+  ;;
+*)
+  ;;
+esac
+
+AM_CONDITIONAL(HOST_OS_CYGWIN, test x$cygwin = xyes)
+AM_CONDITIONAL(HOST_OS_DARWIN, test x$darwin = xyes)
+AM_CONDITIONAL(HOST_OS_SOLARIS, test x$solaris = xyes)
+AM_CONDITIONAL(NO_UNDEFINED, test x$no_undefined = xyes)
+
+AC_SUBST(extra_includes)
+AC_SUBST(extra_libraries)
+AC_SUBST(debug_flag)
+AC_SUBST(coefficient_mnemonic)
+
+AC_CONFIG_FILES(Makefile
+                ppl.lsm ppl.spec
+                debian/Makefile
+                debian/libppl.copyright
+                debian/libppl-pwl.copyright
+                src/Makefile
+                src/version.hh
+                src/ppl-config.cc
+                tests/Makefile
+                tests/BD_Shape/Makefile
+                tests/Polyhedron/Makefile
+                tests/Grid/Makefile
+                utils/Makefile
+                m4/Makefile
+                demos/Makefile
+                demos/ppl_lcdd/Makefile
+                demos/ppl_lcdd/examples/Makefile
+                demos/ppl_lpsol/Makefile
+                demos/ppl_lpsol/examples/Makefile
+                doc/Makefile
+                doc/user.doxyconf-latex
+                doc/devref.doxyconf-latex
+                doc/user.doxyconf-html
+                doc/devref.doxyconf-html
+                interfaces/Makefile
+                interfaces/C/Makefile
+                interfaces/C/ppl_c.h
+                interfaces/Prolog/Makefile
+                interfaces/Prolog/Ciao/Makefile
+                interfaces/Prolog/GNU/Makefile
+                interfaces/Prolog/SICStus/Makefile
+                interfaces/Prolog/SWI/Makefile
+                interfaces/Prolog/XSB/Makefile
+                interfaces/Prolog/YAP/Makefile
+                interfaces/Prolog/tests/Makefile)
+AC_OUTPUT
+
+if test x"$gmp_supports_exceptions" = xno
+then
+  AC_MSG_WARN([CANNOT PROPAGATE EXCEPTIONS BACK FROM GMP:
+*** MEMORY EXHAUSTION MAY RESULT IN ABRUPT TERMINATION.
+*** This is OK, if you do not plan to use the bounded memory capabilities
+*** offered by the PPL.  Otherwise, if you are using GCC or the Intel C/C++
+*** compiler, please make sure you use a version of GMP compiled with the
+*** `-fexceptions' compiler option.
+*** To build such a version, you can configure GMP as follows:
+*** CPPFLAGS=-fexceptions ./configure --enable-cxx --prefix=/usr/local])
+fi
+
+if test x"$PERL" = xno
+then
+  AC_MSG_WARN([PERL UNAVAILABLE:
+***  CANNOT REBUILD SOME FILES IF SOURCES ARE CHANGED.
+*** Perl could not be found on your system.  This is OK, if you only plan
+*** to build the PPL without modifying the sources and without trying to
+*** build a distribution out of a CVS working copy.  If this is not the case,
+*** then you need to add Perl to your development environment:
+*** see http://www.perl.org/ for more information.])
+fi
+
+if test x"$coefficient_kind" = xnative
+then
+  AC_MSG_WARN([USING NATIVE INTEGERS IS EXTREMELY DANGEROUS:
+*** CONSIDER ANY RESULT YOU WILL GET FROM THE LIBRARY AS PSEUDO-RANDOM!!!
+*** You have requested to use a native integral type to represent
+*** coefficients.  This means that arithmetic overflows will be possible
+*** and will not be detected.  The consequence of that is that nothing
+*** can be said about the behavior of the library:  whatever the
+*** documentation says, it does not apply to the version of the library
+*** you are about to build.  Just one arithmetic overflow is enough
+*** to invalidate any possible significance of the results.
+*** Please, do not assume that your computation will not overflow because
+*** only small coefficients are involved.  Do not do it because
+*** (1) coefficients may grow very rapidly depending on the polyhedra
+***     computations being performed;
+*** (2) the library may do internal polyhedra computations that you
+***     cannot easily anticipate;
+*** (3) the library has never had, among its design goals, the one of
+***     trying to keep the coefficients small.
+***
+*** Please, consider using a _checked_ native integral type instead.])
+fi
diff --git a/debian/Makefile.am b/debian/Makefile.am
new file mode 100644
index 0000000..a33cb7e
--- /dev/null
+++ b/debian/Makefile.am
@@ -0,0 +1,44 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+EXTRA_DIST = \
+changelog \
+compat \
+control \
+libppl-c.dirs \
+libppl-c.install \
+libppl-c.links \
+libppl-dev.dirs \
+libppl-dev.doc-base \
+libppl-dev.doc-base.user \
+libppl-dev.docs \
+libppl-dev.install \
+libppl-dev.links \
+libppl-pwl.copyright.in \
+libppl-pwl.dirs \
+libppl-pwl.docs \
+libppl-pwl.install \
+libppl.copyright.in \
+libppl.dirs \
+libppl.docs \
+libppl.install \
+rules
diff --git a/debian/Makefile.in b/debian/Makefile.in
new file mode 100644
index 0000000..57f9618
--- /dev/null
+++ b/debian/Makefile.in
@@ -0,0 +1,465 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = debian
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/libppl-pwl.copyright.in \
+	$(srcdir)/libppl.copyright.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = libppl.copyright libppl-pwl.copyright
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+EXTRA_DIST = \
+changelog \
+compat \
+control \
+libppl-c.dirs \
+libppl-c.install \
+libppl-c.links \
+libppl-dev.dirs \
+libppl-dev.doc-base \
+libppl-dev.doc-base.user \
+libppl-dev.docs \
+libppl-dev.install \
+libppl-dev.links \
+libppl-pwl.copyright.in \
+libppl-pwl.dirs \
+libppl-pwl.docs \
+libppl-pwl.install \
+libppl.copyright.in \
+libppl.dirs \
+libppl.docs \
+libppl.install \
+rules
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  debian/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  debian/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+libppl.copyright: $(top_builddir)/config.status $(srcdir)/libppl.copyright.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+libppl-pwl.copyright: $(top_builddir)/config.status $(srcdir)/libppl-pwl.copyright.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+	uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/debian/README b/debian/README
new file mode 100644
index 0000000..a1564a0
--- /dev/null
+++ b/debian/README
@@ -0,0 +1,35 @@
+Building the Debian packages
+============================
+
+The simplest way to build the Debian packages is to run the following
+command in an up-to-date PPL directory.
+
+	dpkg-buildpackage -rsudo
+
+`dpkg-buildpackage' is available in the dpkg-dev package.  Here the
+`sudo' program (from the sudo package) is also required.  This will
+build the PPL using the standard GMP, C compiler and C++ compiler.
+Note that the configuration of GMP, at least on the Debian stable
+distribution, lacks the -fexceptions preprocessor flag, which is
+required for PPL memory bounds handling.
+
+Alternatively, the `pbuilder' program (from the pbuilder package) can
+be used to build a "clean-room" package.  `pbuilder' sets up a chroot
+of a minimal stable distribution and then builds the package inside
+the chroot.  This is good to verify the build dependencies.  It also
+may be required, to ensure that the PPL is built against the compiler
+and GMP from the stable distributions (if, for example, the build
+machine uses the testing or unstable distributions).
+
+
+References
+----------
+
+ - Debian Library Packaging guide
+	 http://www.netfort.gr.jp/~dancer/column/libpkg-guide/libpkg-guide.html
+
+ - Debian New Maintainers' Guide
+	 http://www.debian.org/doc/maint-guide/
+
+ - Debian Developer's Reference
+	 http://www.debian.org/doc/developers-reference/
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..2ed3e36
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,11 @@
+libppl (0.9) unstable; urgency=low
+
+   * Release 0.9.
+
+ -- Roberto Bagnara <bagnara at cs.unipr.it>  Fri, 10 Mar 2006 18:08:34 +0000
+
+libppl (0.8) unstable; urgency=low
+
+   * Initial upstream release.
+
+ -- Roberto Bagnara <bagnara at cs.unipr.it>  Thu, 19 Jan 2006 23:58:34 +0000
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..b8626c4
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+4
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..c6ef086
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,74 @@
+Source: libppl
+Section: libs
+Priority: optional
+Maintainer: PPL developers <ppl-devel at cs.unipr.it>
+Standards-Version: 3.6.1
+Build-Depends: debhelper (>= 4), binutils, g++, libgmp3-dev (>= 4.1.3), autoconf, automake1.9, libtool, doxygen, graphviz, glpk, tetex-bin, tetex-extra, xpdf-utils, gs-gpl
+Build-Conflicts: automake1.4
+
+Package: libppl
+Architecture: any
+Depends: libgmp3 (>=4.1.3)
+Description: Parma Polyhedra Library: base package
+ The Parma Polyhedra Library (PPL) is a C++ library for the
+ manipulation of (not necessarily closed) convex polyhedra and other
+ numerical abstractions.  The applications of convex polyhedra include
+ program analysis, optimized compilation, integer and combinatorial
+ optimization and statistical data-editing.  The Parma Polyhedra
+ Library is user friendly (you write `x + 2*y + 5*z <= 7' when you
+ mean it), fully dynamic (available virtual memory is the only
+ limitation to the dimension of anything), written in standard C++,
+ exception-safe, rather efficient and thoroughly documented.
+ .
+ Homepage: http://www.cs.unipr.it/ppl/
+
+Package: libppl-dev
+Architecture: any
+Section: libdevel
+Depends: libppl, graphviz
+Recommends: libgmp3-dev
+Suggests: libgmp3-doc
+Description: Parma Polyhedra Library: C++ interface
+ The Parma Polyhedra Library (PPL) is a C++ library for the
+ manipulation of (not necessarily closed) convex polyhedra and other
+ numerical abstractions.  The applications of convex polyhedra include
+ program analysis, optimized compilation, integer and combinatorial
+ optimization and statistical data-editing.  The Parma Polyhedra
+ Library is user friendly (you write `x + 2*y + 5*z <= 7' when you
+ mean it), fully dynamic (available virtual memory is the only
+ limitation to the dimension of anything), written in standard C++,
+ exception-safe, rather efficient and thoroughly documented.
+ .
+ This package provides C++ header files, the static library and
+ various formats of the developer documentation.
+ .
+ Homepage: http://www.cs.unipr.it/ppl/
+
+Package: libppl-c
+Architecture: any
+Depends: libppl, libc6
+Description: Parma Polyhedra Library: C interface
+ The Parma Polyhedra Library (PPL) is a C++ library for the
+ manipulation of (not necessarily closed) convex polyhedra and other
+ numerical abstractions.  The applications of convex polyhedra include
+ program analysis, optimized compilation, integer and combinatorial
+ optimization and statistical data-editing.  The Parma Polyhedra
+ Library is user friendly (you write `x + 2*y + 5*z <= 7' when you
+ mean it), fully dynamic (available virtual memory is the only
+ limitation to the dimension of anything), written in standard C++,
+ exception-safe, rather efficient and thoroughly documented.
+ .
+ This package provides the C interface.
+ .
+ Homepage: http://www.cs.unipr.it/ppl/
+
+Package: libppl-pwl
+Architecture: any
+Section: libs
+Description: Parma Watchdog Library: C++ library for watchdog timers
+ The Parma Watchdog Library (PWL) provides support for multiple,
+ concurrent watchdog timers on systems providing setitimer(2).  The
+ PWL is currently distributed with the Parma Polyhedra Library (PPL),
+ but is totally independent from it.
+ .
+ Homepage: http://www.cs.unipr.it/ppl/
diff --git a/debian/libppl-c.dirs b/debian/libppl-c.dirs
new file mode 100644
index 0000000..6845771
--- /dev/null
+++ b/debian/libppl-c.dirs
@@ -0,0 +1 @@
+usr/lib
diff --git a/debian/libppl-c.install b/debian/libppl-c.install
new file mode 100644
index 0000000..9ffe5c0
--- /dev/null
+++ b/debian/libppl-c.install
@@ -0,0 +1 @@
+usr/lib/libppl_c.so.*
diff --git a/debian/libppl-c.links b/debian/libppl-c.links
new file mode 100644
index 0000000..f764b85
--- /dev/null
+++ b/debian/libppl-c.links
@@ -0,0 +1 @@
+usr/share/doc/libppl usr/share/doc/libppl-c
diff --git a/debian/libppl-dev.dirs b/debian/libppl-dev.dirs
new file mode 100644
index 0000000..3b6ff49
--- /dev/null
+++ b/debian/libppl-dev.dirs
@@ -0,0 +1,3 @@
+usr/include
+usr/share/doc-base
+usr/share/doc/libppl
diff --git a/debian/libppl-dev.doc-base b/debian/libppl-dev.doc-base
new file mode 100644
index 0000000..8aa51e2
--- /dev/null
+++ b/debian/libppl-dev.doc-base
@@ -0,0 +1,17 @@
+Document: libppl-dev
+Title: The Parma Polyhedra Library Developer Reference Manual
+Author: PPL developers <ppl-devel at cs.unipr.it>
+Abstract: This manual contains a general introduction to the Parma
+ Polyhedra Library (PPL) and full documentation of the PPL C++
+ interface, including implementation details.
+Section: Apps/Programming
+
+Format: postscript
+Files: /usr/share/doc/libppl/ppl-devref-browse.ps.gz
+
+Format: pdf
+Files: /usr/share/doc/libppl/ppl-devref-browse.pdf
+
+Format: HTML
+Index: /usr/share/doc/libppl/html/developer-reference/index.html
+Files: /usr/share/doc/libppl/html/developer-reference/*.html
diff --git a/debian/libppl-dev.doc-base.user b/debian/libppl-dev.doc-base.user
new file mode 100644
index 0000000..1bbe891
--- /dev/null
+++ b/debian/libppl-dev.doc-base.user
@@ -0,0 +1,17 @@
+Document: libppl
+Title: The Parma Polyhedra Library User Manual
+Author: PPL developers <ppl-devel at cs.unipr.it>
+Abstract: This manual contains a general introduction to the Parma
+ Polyhedra Library (PPL) and full documentation of the PPL C++
+ interface.
+Section: Apps/Programming
+
+Format: postscript
+Files: /usr/share/doc/libppl/ppl-user-browse.ps.gz
+
+Format: pdf
+Files: /usr/share/doc/libppl/ppl-user-browse.pdf
+
+Format: HTML
+Index: /usr/share/doc/libppl/html/user-manual/index.html
+Files: /usr/share/doc/libppl/html/user-manual/*.html
diff --git a/debian/libppl-dev.docs b/debian/libppl-dev.docs
new file mode 100644
index 0000000..e69de29
diff --git a/debian/libppl-dev.install b/debian/libppl-dev.install
new file mode 100644
index 0000000..1371793
--- /dev/null
+++ b/debian/libppl-dev.install
@@ -0,0 +1,5 @@
+usr/lib/libppl.la
+usr/lib/libppl.a
+usr/include/ppl_c.h
+usr/include/ppl.hh
+usr/include/pwl.hh
diff --git a/debian/libppl-dev.links b/debian/libppl-dev.links
new file mode 100644
index 0000000..cf1724c
--- /dev/null
+++ b/debian/libppl-dev.links
@@ -0,0 +1 @@
+usr/share/doc/libppl usr/share/doc/libppl-dev
diff --git a/debian/libppl-pwl.copyright.in b/debian/libppl-pwl.copyright.in
new file mode 100644
index 0000000..16a6b17
--- /dev/null
+++ b/debian/libppl-pwl.copyright.in
@@ -0,0 +1,444 @@
+This is the Debian GNU/Linux prepackaged version of the Parma
+Polyhedra Library (PPL): a C++ library for the manipulation of
+numerical abstractions.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/
+
+
+Sources: this package was put together by the PPL developers
+<ppl-devel at cs.unipr.it>, with sources obtained from
+
+  ftp://ftp.cs.unipr.it/pub/ppl/releases/@VERSION@/ppl-@VERSION@.tar.gz
+
+or, for prereleases, from the anonymously accessible CVS repository
+
+  :pserver:anoncvs at cvs.cs.unipr.it:/cvs/ppl
+
+
+Authors: see the CREDITS file or http://www.cs.unipr.it/ppl/Credits
+for the complete list of authors.
+
+
+Copyright: 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+  The PPL is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published by the
+  Free Software Foundation; either version 2 of the License, or (at your
+  option) any later version.
+
+  The PPL is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+  for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software Foundation,
+  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+On Debian systems, the complete text of the GNU General Public
+License, version 2, can be found in /usr/share/common-licenses/GPL-2.
+
+The documentation of the PPL is licensed under the GNU Free Documentation
+License (v1.2), appended at the end of this file.
+
+
+==============================================================================
+
+		GNU Free Documentation License
+		  Version 1.2, November 2002
+
+
+ Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document 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.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation 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.  See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+    Copyright (c)  YEAR  YOUR NAME.
+    Permission is granted to copy, distribute and/or modify this document
+    under the terms of the GNU Free Documentation License, Version 1.2
+    or any later version published by the Free Software Foundation;
+    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+    A copy of the license is included in the section entitled "GNU
+    Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/debian/libppl-pwl.dirs b/debian/libppl-pwl.dirs
new file mode 100644
index 0000000..4418816
--- /dev/null
+++ b/debian/libppl-pwl.dirs
@@ -0,0 +1,2 @@
+usr/lib
+usr/include
diff --git a/debian/libppl-pwl.docs b/debian/libppl-pwl.docs
new file mode 100644
index 0000000..a5a4271
--- /dev/null
+++ b/debian/libppl-pwl.docs
@@ -0,0 +1,5 @@
+BUGS
+NEWS
+README
+ChangeLog
+CREDITS
diff --git a/debian/libppl-pwl.install b/debian/libppl-pwl.install
new file mode 100644
index 0000000..353e95a
--- /dev/null
+++ b/debian/libppl-pwl.install
@@ -0,0 +1,4 @@
+usr/lib/libpwl.so
+usr/lib/libpwl.so.*
+usr/lib/libpwl.a
+usr/lib/libpwl.la
diff --git a/debian/libppl.copyright.in b/debian/libppl.copyright.in
new file mode 100644
index 0000000..16a6b17
--- /dev/null
+++ b/debian/libppl.copyright.in
@@ -0,0 +1,444 @@
+This is the Debian GNU/Linux prepackaged version of the Parma
+Polyhedra Library (PPL): a C++ library for the manipulation of
+numerical abstractions.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/
+
+
+Sources: this package was put together by the PPL developers
+<ppl-devel at cs.unipr.it>, with sources obtained from
+
+  ftp://ftp.cs.unipr.it/pub/ppl/releases/@VERSION@/ppl-@VERSION@.tar.gz
+
+or, for prereleases, from the anonymously accessible CVS repository
+
+  :pserver:anoncvs at cvs.cs.unipr.it:/cvs/ppl
+
+
+Authors: see the CREDITS file or http://www.cs.unipr.it/ppl/Credits
+for the complete list of authors.
+
+
+Copyright: 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+  The PPL is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published by the
+  Free Software Foundation; either version 2 of the License, or (at your
+  option) any later version.
+
+  The PPL is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+  for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software Foundation,
+  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+On Debian systems, the complete text of the GNU General Public
+License, version 2, can be found in /usr/share/common-licenses/GPL-2.
+
+The documentation of the PPL is licensed under the GNU Free Documentation
+License (v1.2), appended at the end of this file.
+
+
+==============================================================================
+
+		GNU Free Documentation License
+		  Version 1.2, November 2002
+
+
+ Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document 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.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation 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.  See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+    Copyright (c)  YEAR  YOUR NAME.
+    Permission is granted to copy, distribute and/or modify this document
+    under the terms of the GNU Free Documentation License, Version 1.2
+    or any later version published by the Free Software Foundation;
+    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+    A copy of the license is included in the section entitled "GNU
+    Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/debian/libppl.dirs b/debian/libppl.dirs
new file mode 100644
index 0000000..d96c6d6
--- /dev/null
+++ b/debian/libppl.dirs
@@ -0,0 +1,3 @@
+usr/lib
+usr/bin
+usr/share/man/man1
diff --git a/debian/libppl.docs b/debian/libppl.docs
new file mode 100644
index 0000000..a5a4271
--- /dev/null
+++ b/debian/libppl.docs
@@ -0,0 +1,5 @@
+BUGS
+NEWS
+README
+ChangeLog
+CREDITS
diff --git a/debian/libppl.install b/debian/libppl.install
new file mode 100644
index 0000000..a7ba61c
--- /dev/null
+++ b/debian/libppl.install
@@ -0,0 +1,8 @@
+usr/lib/libppl.so
+usr/lib/libppl.so.*
+usr/bin/ppl-config
+usr/bin/ppl_lcdd
+usr/bin/ppl_lpsol
+usr/share/man/man1/ppl-config.1
+usr/share/man/man1/ppl_lcdd.1
+usr/share/man/man1/ppl_lpsol.1
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..aaa9070
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,186 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+#
+# Modified to make a template file for a multi-binary package with separated
+# build-arch and build-indep targets  by Bill Allombert 2001
+
+# Uncomment this to turn on verbose mode.
+export DH_VERBOSE=1
+
+# This has to be exported to make some magic below work.
+export DH_OPTIONS
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+CFLAGS = -Wall -g
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+	CFLAGS += -O0
+else
+	CFLAGS += -O2
+endif
+
+# FOR AUTOCONF 2.52 AND NEWER ONLY
+ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
+  confflags += --build $(DEB_HOST_GNU_TYPE)
+else
+  confflags += --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE)
+endif
+
+# If the version string was set using automake then the build would
+# have to be configured before the dpkg-buildpackage command.
+PPL_VERSION = $(shell grep "^AC_INIT" $(CURDIR)/configure.ac | sed -e "s/^AC_INIT.\[[^]]*\],[ \t]*\[\([^]]*\)\],.*/\1/")
+
+config.status:
+	dh_testdir
+#   Add here commands to configure the package.
+#   /usr/share/doc/autotools-dev/README.Debian.gz:
+#     - Call the autoconf suite using simple names ("autoconf", "autoheader", etc.)
+#     - Call the automake suite using *versioned* names ("automake-1.9", etc),
+	autoreconf && CFLAGS="$(CFLAGS)" ./configure $(confflags) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info
+
+## Architecture
+build: build-arch build-indep
+
+build-arch: build-arch-stamp
+build-arch-stamp: config.status
+
+#	Add here commands to compile the arch part of the package.
+	$(MAKE)
+	touch build-arch-stamp
+
+build-indep: build-indep-stamp
+build-indep-stamp:  config.status
+
+#	Add here commands to compile the indep part of the package.
+#   FIX this depends on build-arch to install the doc to debian/tmp
+#	$(MAKE) doc
+	touch build-indep-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+	rm -f build-arch-stamp build-indep-stamp #CONFIGURE-STAMP#
+
+#	Add here commands to clean up after the build process.
+	-$(MAKE) distclean
+ifneq "$(wildcard /usr/share/misc/config.sub)" ""
+	cp -f /usr/share/misc/config.sub config.sub
+endif
+ifneq "$(wildcard /usr/share/misc/config.guess)" ""
+	cp -f /usr/share/misc/config.guess config.guess
+endif
+	dh_clean
+
+install: install-indep install-arch
+install: install-arch
+
+install-indep:
+# 	dh_testdir
+# 	dh_testroot
+# 	dh_clean -k -i
+# 	dh_installdirs -i
+
+##	Add here commands to install the indep part of the package into
+##	debian/<package>-doc.
+
+# 	dh_install -i
+
+# Destination directory for user manual.
+DOC_DIR=debian/libppl-dev/usr/share/doc/libppl
+# Destination directory for developer reference.
+DEV_DOC_DIR=debian/libppl-dev/usr/share/doc/libppl
+#SRC_DOC_DIR=$(CURDIR)/debian/tmp/usr/share/doc/ppl/
+SRC_DOC_DIR=$(CURDIR)/doc
+install-arch:
+	dh_testdir
+	dh_testroot
+	dh_clean -k -s
+	dh_installdirs -s
+
+#	Add here commands to install the arch part of the package into
+# 	debian/tmp.
+
+	$(MAKE) install DESTDIR=$(CURDIR)/debian/tmp
+	$(MAKE) -C Watchdog install DESTDIR=$(CURDIR)/debian/tmp
+
+#   Install the PPL programs.
+#   FIXME: Consider installing the ppl_lcdd and ppl_lpsol examples
+#          (what about copyrights?).
+	cp -a $(CURDIR)/src/ppl-config $(CURDIR)/debian/tmp/usr/bin/
+	cp -a $(CURDIR)/demos/ppl_lcdd/ppl_lcdd $(CURDIR)/debian/tmp/usr/bin/
+	cp -a $(CURDIR)/demos/ppl_lpsol/ppl_lpsol $(CURDIR)/debian/tmp/usr/bin/
+
+#   Build all the documentation, then move it into debian/tmp
+#   directories which have fixed names.
+	mkdir -p $(DOC_DIR)/html || exit 1
+	mkdir -p $(DEV_DOC_DIR)/html || exit 1
+	$(MAKE) -C doc world \
+	&& cp -a $(SRC_DOC_DIR)/ppl-user-$(PPL_VERSION)-html $(DOC_DIR)/html/user-manual/ \
+	&& cp -a $(SRC_DOC_DIR)/ppl-user-$(PPL_VERSION).pdf $(DOC_DIR)/ppl-user-browse.pdf \
+	&& cp -a $(SRC_DOC_DIR)/ppl-user-$(PPL_VERSION).ps.gz $(DOC_DIR)/ppl-user-print.ps.gz \
+	&& cp -a $(SRC_DOC_DIR)/ppl-devref-$(PPL_VERSION)-html $(DEV_DOC_DIR)/html/developer-reference/ \
+	&& cp -a $(SRC_DOC_DIR)/ppl-devref-$(PPL_VERSION).pdf $(DEV_DOC_DIR)/ppl-devref-browse.pdf \
+	&& cp -a $(SRC_DOC_DIR)/ppl-devref-$(PPL_VERSION).ps.gz $(DEV_DOC_DIR)/ppl-devref-print.ps.gz
+
+#	Explicitly install the Debian changelog, for libppl and libppl-pwl.
+	mkdir -p debian/libppl/usr/share/doc/libppl/
+	cp -a debian/changelog debian/libppl/usr/share/doc/libppl/changelog.Debian
+	mkdir -p debian/libppl-pwl/usr/share/doc/libppl-pwl/
+	cp -a debian/changelog debian/libppl-pwl/usr/share/doc/libppl-pwl/changelog.Debian
+
+	dh_install -s --sourcedir=debian/tmp
+
+# Must not depend on anything. This is to be called by
+# binary-arch/binary-indep
+# in another 'make' thread.
+binary-common:
+	dh_testdir
+	dh_testroot
+
+#   This would install the change logs into every package, so instead
+#   the install-arch rule above copies the logs into place.
+#	dh_installchangelogs -plibppl -plibppl-pwl
+
+	dh_installdocs
+#   These directories will be symlinks instead.  The [^p] is to keep
+#   the directory for libppl-pwl.
+	rmdir debian/libppl-[^p]*/usr/share/doc/libppl-* || exit 1
+#	dh_installexamples
+#	dh_installmenu
+#	dh_installdebconf
+#	dh_installlogrotate
+#	dh_installinit
+#	dh_installcron
+#	dh_installinfo
+#	dh_installman
+	dh_link
+	dh_strip
+	dh_compress
+	dh_fixperms
+#	dh_perl
+#	dh_python
+	dh_makeshlibs
+	dh_installdeb
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+## Build architecture independant packages using the common target.
+binary-indep: build-indep install-indep
+#	$(MAKE) -f debian/rules DH_OPTIONS=-i binary-common
+
+## Build architecture dependant packages using the common target.
+binary-arch: build-arch install-arch
+	$(MAKE) -f debian/rules DH_OPTIONS=-a binary-common
+
+binary: binary-arch binary-indep
+.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch
diff --git a/demos/Makefile.am b/demos/Makefile.am
new file mode 100644
index 0000000..5f88c4e
--- /dev/null
+++ b/demos/Makefile.am
@@ -0,0 +1,23 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SUBDIRS = ppl_lcdd ppl_lpsol
diff --git a/demos/Makefile.in b/demos/Makefile.in
new file mode 100644
index 0000000..aea007a
--- /dev/null
+++ b/demos/Makefile.in
@@ -0,0 +1,594 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = demos
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+SUBDIRS = ppl_lcdd ppl_lpsol
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  demos/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  demos/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+	clean clean-generic clean-libtool clean-recursive ctags \
+	ctags-recursive distclean distclean-generic distclean-libtool \
+	distclean-recursive distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic maintainer-clean-recursive \
+	mostlyclean mostlyclean-generic mostlyclean-libtool \
+	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lcdd/Makefile.am b/demos/ppl_lcdd/Makefile.am
new file mode 100644
index 0000000..fe5b08e
--- /dev/null
+++ b/demos/ppl_lcdd/Makefile.am
@@ -0,0 +1,122 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SUBDIRS = examples
+
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+ at extra_includes@
+
+bin_PROGRAMS = ppl_lcdd
+ppl_lcdd_SOURCES = ppl_lcdd.cc
+ppl_lcdd_LDADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/utils/libppl_utils.a \
+ at extra_libraries@
+
+polka_lcdd.o: $(srcdir)/ppl_lcdd.cc $(top_builddir)/utils/libppl_utils.a
+	$(CXXCOMPILE) -c -o $@ -DUSE_POLKA $(srcdir)/ppl_lcdd.cc
+
+polka_lcdd: polka_lcdd.o
+	$(CXXLINK) $< -lpolkag -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+
+polylib_lcdd.o:	$(srcdir)/ppl_lcdd.cc
+	$(CXXCOMPILE) -c -o $@ -DUSE_POLYLIB $(srcdir)/ppl_lcdd.cc
+
+polylib_lcdd: polylib_lcdd.o $(top_builddir)/utils/libppl_utils.a
+	$(CXXLINK) $< -lpolylibgmp -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+EXTRA_DIST = \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+if HAVE_MD5SUM
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED = \
+ccc6.ext \
+ccp6.ext \
+cut32_16.ext \
+cyclic16-10.ext \
+reg600-5_m.ext \
+cyclic17_8.ine \
+in6.ine \
+in7.ine \
+kq20_11_m.ine \
+mit31-20.ine \
+sampleh8.ine \
+trunc10.ine
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES = \
+cp7.ext \
+cyclic25_13.ext \
+prodst62.ext \
+cp6.ine \
+mit.ine \
+mit288-281.ine \
+mit41-16.ine \
+mit708-9.ine \
+mit71-61.ine \
+mit90-86.ine \
+$(TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED)
+
+check-local: ppl_lcdd
+	echo $(TOUGH_EXAMPLES) >tough_examples
+	echo $(ECHO_N) "$(ECHO_C)" >obtained
+	LANG=C; \
+	for path in $(srcdir)/examples/*.ext $(srcdir)/examples/*.ine; \
+	do \
+	  file=`basename $$path`; \
+	  grep $$file tough_examples >/dev/null 2>&1 && continue; \
+	  echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+	  echo ppl_lcdd $$path; \
+	  ./ppl_lcdd $$path | $(TEXT_MD5SUM) >>obtained; \
+	done
+	diff -u $(srcdir)/$(EXPECTED) obtained
+
+MOSTLYCLEANFILES = \
+tough_examples \
+obtained
+
+endif HAVE_MD5SUM
diff --git a/demos/ppl_lcdd/Makefile.in b/demos/ppl_lcdd/Makefile.in
new file mode 100644
index 0000000..09135ae
--- /dev/null
+++ b/demos/ppl_lcdd/Makefile.in
@@ -0,0 +1,770 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ppl_lcdd$(EXEEXT)
+subdir = demos/ppl_lcdd
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_lcdd_OBJECTS = ppl_lcdd.$(OBJEXT)
+ppl_lcdd_OBJECTS = $(am_ppl_lcdd_OBJECTS)
+ppl_lcdd_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+	$(top_builddir)/utils/libppl_utils.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ppl_lcdd_SOURCES)
+DIST_SOURCES = $(ppl_lcdd_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+SUBDIRS = examples
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+ at extra_includes@
+
+ppl_lcdd_SOURCES = ppl_lcdd.cc
+ppl_lcdd_LDADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/utils/libppl_utils.a \
+ at extra_libraries@
+
+EXTRA_DIST = \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+ at HAVE_MD5SUM_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED = \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at ccc6.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at ccp6.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at cut32_16.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at cyclic16-10.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at reg600-5_m.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at cyclic17_8.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at in6.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at in7.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at kq20_11_m.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at mit31-20.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at sampleh8.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at trunc10.ine
+
+ at ASSERTIONS_ENABLED_FALSE@@HAVE_MD5SUM_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+ at HAVE_MD5SUM_TRUE@TOUGH_EXAMPLES = \
+ at HAVE_MD5SUM_TRUE@cp7.ext \
+ at HAVE_MD5SUM_TRUE@cyclic25_13.ext \
+ at HAVE_MD5SUM_TRUE@prodst62.ext \
+ at HAVE_MD5SUM_TRUE@cp6.ine \
+ at HAVE_MD5SUM_TRUE@mit.ine \
+ at HAVE_MD5SUM_TRUE@mit288-281.ine \
+ at HAVE_MD5SUM_TRUE@mit41-16.ine \
+ at HAVE_MD5SUM_TRUE@mit708-9.ine \
+ at HAVE_MD5SUM_TRUE@mit71-61.ine \
+ at HAVE_MD5SUM_TRUE@mit90-86.ine \
+ at HAVE_MD5SUM_TRUE@$(TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED)
+
+ at HAVE_MD5SUM_TRUE@MOSTLYCLEANFILES = \
+ at HAVE_MD5SUM_TRUE@tough_examples \
+ at HAVE_MD5SUM_TRUE@obtained
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  demos/ppl_lcdd/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  demos/ppl_lcdd/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	     || test -f $$p1 \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+ppl_lcdd$(EXEEXT): $(ppl_lcdd_OBJECTS) $(ppl_lcdd_DEPENDENCIES) 
+	@rm -f ppl_lcdd$(EXEEXT)
+	$(CXXLINK) $(ppl_lcdd_LDFLAGS) $(ppl_lcdd_OBJECTS) $(ppl_lcdd_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_lcdd.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+ at HAVE_MD5SUM_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-recursive
+all-am: Makefile $(PROGRAMS)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+	check-local clean clean-binPROGRAMS clean-generic \
+	clean-libtool clean-recursive ctags ctags-recursive distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-recursive distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic \
+	maintainer-clean-recursive mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \
+	pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+	uninstall-binPROGRAMS uninstall-info-am
+
+
+polka_lcdd.o: $(srcdir)/ppl_lcdd.cc $(top_builddir)/utils/libppl_utils.a
+	$(CXXCOMPILE) -c -o $@ -DUSE_POLKA $(srcdir)/ppl_lcdd.cc
+
+polka_lcdd: polka_lcdd.o
+	$(CXXLINK) $< -lpolkag -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+polylib_lcdd.o:	$(srcdir)/ppl_lcdd.cc
+	$(CXXCOMPILE) -c -o $@ -DUSE_POLYLIB $(srcdir)/ppl_lcdd.cc
+
+polylib_lcdd: polylib_lcdd.o $(top_builddir)/utils/libppl_utils.a
+	$(CXXLINK) $< -lpolylibgmp -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+ at HAVE_MD5SUM_TRUE@check-local: ppl_lcdd
+ at HAVE_MD5SUM_TRUE@	echo $(TOUGH_EXAMPLES) >tough_examples
+ at HAVE_MD5SUM_TRUE@	echo $(ECHO_N) "$(ECHO_C)" >obtained
+ at HAVE_MD5SUM_TRUE@	LANG=C; \
+ at HAVE_MD5SUM_TRUE@	for path in $(srcdir)/examples/*.ext $(srcdir)/examples/*.ine; \
+ at HAVE_MD5SUM_TRUE@	do \
+ at HAVE_MD5SUM_TRUE@	  file=`basename $$path`; \
+ at HAVE_MD5SUM_TRUE@	  grep $$file tough_examples >/dev/null 2>&1 && continue; \
+ at HAVE_MD5SUM_TRUE@	  echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+ at HAVE_MD5SUM_TRUE@	  echo ppl_lcdd $$path; \
+ at HAVE_MD5SUM_TRUE@	  ./ppl_lcdd $$path | $(TEXT_MD5SUM) >>obtained; \
+ at HAVE_MD5SUM_TRUE@	done
+ at HAVE_MD5SUM_TRUE@	diff -u $(srcdir)/$(EXPECTED) obtained
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lcdd/examples/1d.ine b/demos/ppl_lcdd/examples/1d.ine
new file mode 100644
index 0000000..e07de85
--- /dev/null
+++ b/demos/ppl_lcdd/examples/1d.ine
@@ -0,0 +1,5 @@
+H-representation
+begin
+1 2 rational
+-1 1
+end
diff --git a/demos/ppl_lcdd/examples/1da.ine b/demos/ppl_lcdd/examples/1da.ine
new file mode 100644
index 0000000..b0c0534
--- /dev/null
+++ b/demos/ppl_lcdd/examples/1da.ine
@@ -0,0 +1,6 @@
+H-representation
+begin
+2 2 rational
+-1 1
+0 1
+end
diff --git a/demos/ppl_lcdd/examples/Makefile.am b/demos/ppl_lcdd/examples/Makefile.am
new file mode 100644
index 0000000..4ddf077
--- /dev/null
+++ b/demos/ppl_lcdd/examples/Makefile.am
@@ -0,0 +1,135 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+EXT_FILES = \
+ccc4.ext \
+ccc5.ext \
+ccc6.ext \
+ccp4.ext \
+ccp5.ext \
+ccp6.ext \
+cp4.ext \
+cp5.ext \
+cp6.ext \
+cp7.ext \
+cube.ext \
+cut16_11.ext \
+cut32_16.ext \
+cyclic10-4.ext \
+cyclic12-6.ext \
+cyclic14-8.ext \
+cyclic16-10.ext \
+cyclic25_13.ext \
+dcube10.ext \
+dcube12.ext \
+dcube3.ext \
+dcube6.ext \
+dcube8.ext \
+irbox20-4.ext \
+irbox200-4.ext \
+mp5.ext \
+prodst62.ext \
+redcheck.ext \
+reg24-5.ext \
+reg600-5_m.ext \
+samplev1.ext \
+samplev2.ext \
+samplev3.ext \
+tsp5.ext
+
+INE_FILES = \
+1d.ine \
+1da.ine \
+allzero.ine \
+cp4.ine \
+cp5.ine \
+cp6.ine \
+cross10.ine \
+cross12.ine \
+cross4.ine \
+cross6.ine \
+cross8.ine \
+cube.ine \
+cube10.ine \
+cube12.ine \
+cube3.ine \
+cube6.ine \
+cube8.ine \
+cubetop.ine \
+cubocta.ine \
+cyc.ine \
+cyclic17_8.ine \
+diamond.ine \
+dodeca_m.ine \
+ex1.ine \
+grcubocta.ine \
+hexocta.ine \
+icododeca_m.ine \
+in0.ine \
+in1.ine \
+in2.ine \
+in3.ine \
+in4.ine \
+in5.ine \
+in6.ine \
+in7.ine \
+infeas.ine \
+integralpoints.ine \
+kkd18_4.ine \
+kkd27_5.ine \
+kkd38_6.ine \
+kq20_11_m.ine \
+metric40_11.ine \
+metric80_16.ine \
+mit.ine \
+mit288-281.ine \
+mit31-20.ine \
+mit41-16.ine \
+mit708-9.ine \
+mit71-61.ine \
+mit90-86.ine \
+mp5.ine \
+mp5a.ine \
+mp6.ine \
+nonfull.ine \
+origin.ine \
+project1_m.ine \
+project1res.ine \
+project2_m.ine \
+project2res.ine \
+rcubocta.ine \
+reg24-5.ine \
+rhomtria_m.ine \
+sample.ine \
+sampleh1.ine \
+sampleh2.ine \
+sampleh3.ine \
+sampleh4.ine \
+sampleh5.ine \
+sampleh6.ine \
+sampleh7.ine \
+sampleh8.ine \
+trunc10.ine \
+trunc7.ine \
+tsp5.ine
+
+dist_noinst_DATA = $(EXT_FILES) $(INE_FILES)
diff --git a/demos/ppl_lcdd/examples/Makefile.in b/demos/ppl_lcdd/examples/Makefile.in
new file mode 100644
index 0000000..771315f
--- /dev/null
+++ b/demos/ppl_lcdd/examples/Makefile.in
@@ -0,0 +1,552 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = demos/ppl_lcdd/examples
+DIST_COMMON = README $(dist_noinst_DATA) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DATA = $(dist_noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+EXT_FILES = \
+ccc4.ext \
+ccc5.ext \
+ccc6.ext \
+ccp4.ext \
+ccp5.ext \
+ccp6.ext \
+cp4.ext \
+cp5.ext \
+cp6.ext \
+cp7.ext \
+cube.ext \
+cut16_11.ext \
+cut32_16.ext \
+cyclic10-4.ext \
+cyclic12-6.ext \
+cyclic14-8.ext \
+cyclic16-10.ext \
+cyclic25_13.ext \
+dcube10.ext \
+dcube12.ext \
+dcube3.ext \
+dcube6.ext \
+dcube8.ext \
+irbox20-4.ext \
+irbox200-4.ext \
+mp5.ext \
+prodst62.ext \
+redcheck.ext \
+reg24-5.ext \
+reg600-5_m.ext \
+samplev1.ext \
+samplev2.ext \
+samplev3.ext \
+tsp5.ext
+
+INE_FILES = \
+1d.ine \
+1da.ine \
+allzero.ine \
+cp4.ine \
+cp5.ine \
+cp6.ine \
+cross10.ine \
+cross12.ine \
+cross4.ine \
+cross6.ine \
+cross8.ine \
+cube.ine \
+cube10.ine \
+cube12.ine \
+cube3.ine \
+cube6.ine \
+cube8.ine \
+cubetop.ine \
+cubocta.ine \
+cyc.ine \
+cyclic17_8.ine \
+diamond.ine \
+dodeca_m.ine \
+ex1.ine \
+grcubocta.ine \
+hexocta.ine \
+icododeca_m.ine \
+in0.ine \
+in1.ine \
+in2.ine \
+in3.ine \
+in4.ine \
+in5.ine \
+in6.ine \
+in7.ine \
+infeas.ine \
+integralpoints.ine \
+kkd18_4.ine \
+kkd27_5.ine \
+kkd38_6.ine \
+kq20_11_m.ine \
+metric40_11.ine \
+metric80_16.ine \
+mit.ine \
+mit288-281.ine \
+mit31-20.ine \
+mit41-16.ine \
+mit708-9.ine \
+mit71-61.ine \
+mit90-86.ine \
+mp5.ine \
+mp5a.ine \
+mp6.ine \
+nonfull.ine \
+origin.ine \
+project1_m.ine \
+project1res.ine \
+project2_m.ine \
+project2res.ine \
+rcubocta.ine \
+reg24-5.ine \
+rhomtria_m.ine \
+sample.ine \
+sampleh1.ine \
+sampleh2.ine \
+sampleh3.ine \
+sampleh4.ine \
+sampleh5.ine \
+sampleh6.ine \
+sampleh7.ine \
+sampleh8.ine \
+trunc10.ine \
+trunc7.ine \
+tsp5.ine
+
+dist_noinst_DATA = $(EXT_FILES) $(INE_FILES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  demos/ppl_lcdd/examples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  demos/ppl_lcdd/examples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+	uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lcdd/examples/README b/demos/ppl_lcdd/examples/README
new file mode 100644
index 0000000..c1c4b14
--- /dev/null
+++ b/demos/ppl_lcdd/examples/README
@@ -0,0 +1,13 @@
+Most of the examples in this directory have been taken (sometimes with
+changes) from cddlib version 0.93c [1] and lrslib version 4.2 [2].
+The changes consisted in the removal of commands that are not
+implemented in `ppl_lcdd', the revision of some comments and, for some
+examples, in the conversion of floating point coefficients to integer
+or rational numbers.  In this last case, the name of the example has
+been changed from, e.g., `file.ine' to `file_m.ine'.
+
+
+--------
+
+[1] http://www.cs.mcgill.ca/~fukuda/soft/cdd_home/cdd.html
+[2] http://cgm.cs.mcgill.ca/~avis/C/lrs.html
diff --git a/demos/ppl_lcdd/examples/allzero.ine b/demos/ppl_lcdd/examples/allzero.ine
new file mode 100644
index 0000000..9c9c353
--- /dev/null
+++ b/demos/ppl_lcdd/examples/allzero.ine
@@ -0,0 +1,11 @@
+H-representation
+begin
+    6   4    integer
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+end
+
diff --git a/demos/ppl_lcdd/examples/ccc4.ext b/demos/ppl_lcdd/examples/ccc4.ext
new file mode 100644
index 0000000..8f98f5f
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccc4.ext
@@ -0,0 +1,14 @@
+* Complete cut cone on 4 vertices
+* The number of facets is 12.
+V-representation
+begin
+    7    7    integer
+ 0  1  1  1  0  0  0
+ 0  0  1  1  1  1  0
+ 0  1  0  1  1  0  1
+ 0  1  1  0  0  1  1
+ 0  0  0  1  0  1  1
+ 0  0  1  0  1  0  1
+ 0  1  0  0  1  1  0
+end
+
diff --git a/demos/ppl_lcdd/examples/ccc5.ext b/demos/ppl_lcdd/examples/ccc5.ext
new file mode 100644
index 0000000..007cad2
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccc5.ext
@@ -0,0 +1,21 @@
+* Complete cut cone on 5 vertices
+* The number of facets is 40.
+V-representation
+begin
+  15  11  integer
+0 1 1 1 1 0 0 0 0 0 0
+0 0 1 1 1 1 1 1 0 0 0
+0 1 0 1 1 1 0 0 1 1 0
+0 1 1 0 1 0 1 0 1 0 1
+0 1 1 1 0 0 0 1 0 1 1
+0 0 0 1 1 0 1 1 1 1 0
+0 0 1 0 1 1 0 1 1 0 1
+0 0 1 1 0 1 1 0 0 1 1
+0 1 0 0 1 1 1 0 0 1 1
+0 1 0 1 0 1 0 1 1 0 1
+0 1 1 0 0 0 1 1 1 1 0
+0 0 0 0 1 0 0 1 0 1 1
+0 0 0 1 0 0 1 0 1 0 1
+0 0 1 0 0 1 0 0 1 1 0
+0 1 0 0 0 1 1 1 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/ccc6.ext b/demos/ppl_lcdd/examples/ccc6.ext
new file mode 100644
index 0000000..08f4879
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccc6.ext
@@ -0,0 +1,37 @@
+* Complete cut cone on 6 vertices
+* The number of facets is 210.
+V-representation
+begin
+  31  16   integer
+0   1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+0   0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+0   1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+0   1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+0   1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+0   1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+0   0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+0   0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+0   0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+0   0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+0   1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+0   1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+0   1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+0   1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+0   1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+0   1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+0   0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+0   0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+0   0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+0   0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+0   0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+0   0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+0   1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+0   1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+0   1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+0   1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+0   0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+0   0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+0   0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+0   0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+0   1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/ccp4.ext b/demos/ppl_lcdd/examples/ccp4.ext
new file mode 100644
index 0000000..0c3e44c
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccp4.ext
@@ -0,0 +1,14 @@
+* Input file for computing the facets of the complete cut polytope on 4 vertices
+* The number of facets is 16.
+V-representation
+begin
+    8    7    integer
+ 1  0  0  0  0  0  0
+ 1  1  1  1  0  0  0
+ 1  0  1  1  1  1  0
+ 1  1  0  1  1  0  1
+ 1  1  1  0  0  1  1
+ 1  0  0  1  0  1  1
+ 1  0  1  0  1  0  1
+ 1  1  0  0  1  1  0
+end
diff --git a/demos/ppl_lcdd/examples/ccp5.ext b/demos/ppl_lcdd/examples/ccp5.ext
new file mode 100644
index 0000000..bd56d93
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccp5.ext
@@ -0,0 +1,22 @@
+* Input file for computing the facets of the complete cut polytope on 5 vertices
+* The number of facets is 56.
+V-representation
+begin
+  16  11  integer
+1 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 0 0 0 0 0 0
+1 0 1 1 1 1 1 1 0 0 0
+1 1 0 1 1 1 0 0 1 1 0
+1 1 1 0 1 0 1 0 1 0 1
+1 1 1 1 0 0 0 1 0 1 1
+1 0 0 1 1 0 1 1 1 1 0
+1 0 1 0 1 1 0 1 1 0 1
+1 0 1 1 0 1 1 0 0 1 1
+1 1 0 0 1 1 1 0 0 1 1
+1 1 0 1 0 1 0 1 1 0 1
+1 1 1 0 0 0 1 1 1 1 0
+1 0 0 0 1 0 0 1 0 1 1
+1 0 0 1 0 0 1 0 1 0 1
+1 0 1 0 0 1 0 0 1 1 0
+1 1 0 0 0 1 1 1 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/ccp6.ext b/demos/ppl_lcdd/examples/ccp6.ext
new file mode 100644
index 0000000..def0444
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccp6.ext
@@ -0,0 +1,38 @@
+* Input file for computing the facets of the complete cut polytope on 6 vertices
+* The number of facets is 368.
+V-representation
+begin
+  32  16   integer
+1   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1   1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+1   0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1   1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+1   1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+1   1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+1   1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+1   0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+1   0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+1   0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+1   0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+1   1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+1   1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+1   1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+1   1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+1   1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+1   1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+1   0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+1   0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+1   0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+1   0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+1   0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+1   0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+1   1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+1   1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+1   1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+1   1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+1   0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+1   0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+1   0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+1   0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+1   1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/cp4.ext b/demos/ppl_lcdd/examples/cp4.ext
new file mode 100644
index 0000000..2de9fb7
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp4.ext
@@ -0,0 +1,12 @@
+V-representation
+begin
+8 7 integer
+1 0 0 0 0 0 0
+1 0 1 1 1 1 0
+1 0 0 1 0 1 1
+1 1 0 0 1 1 0
+1 1 1 1 0 0 0
+1 0 1 0 1 0 1
+1 1 1 0 0 1 1
+1 1 0 1 1 0 1
+end
diff --git a/demos/ppl_lcdd/examples/cp4.ine b/demos/ppl_lcdd/examples/cp4.ine
new file mode 100644
index 0000000..0a2ec5e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp4.ine
@@ -0,0 +1,20 @@
+H-representation
+begin
+16 7 rational
+ 2  0 -1 -1  0  0 -1
+ 2 -1 -1  0 -1  0  0
+ 2  0  0  0 -1 -1 -1
+ 2 -1  0 -1  0 -1  0
+ 0  0  0  0  1  1 -1
+ 0 -1  0  1  0  1  0
+ 0  0  1  1  0  0 -1
+ 0 -1  1  0  1  0  0
+ 0  1  0 -1  0  1  0
+ 0  0  0  0 -1  1  1
+ 0  1  1  0 -1  0  0
+ 0  0  1 -1  0  0  1
+ 0  1 -1  0  1  0  0
+ 0  0 -1  1  0  0  1
+ 0  1  0  1  0 -1  0
+ 0  0  0  0  1 -1  1
+end
diff --git a/demos/ppl_lcdd/examples/cp5.ext b/demos/ppl_lcdd/examples/cp5.ext
new file mode 100644
index 0000000..3aa967a
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp5.ext
@@ -0,0 +1,21 @@
+* 5 point cut polytope
+V-representation
+begin
+  16  11  integer
+1   0  0  0  0  0  0  0  0  0  0
+1   1  1  1  1  0  0  0  0  0  0
+1   0  1  1  1  1  1  1  0  0  0
+1   1  0  1  1  1  0  0  1  1  0
+1   1  1  0  1  0  1  0  1  0  1
+1   1  1  1  0  0  0  1  0  1  1
+1   0  0  1  1  0  1  1  1  1  0
+1   0  1  0  1  1  0  1  1  0  1
+1   0  1  1  0  1  1  0  0  1  1
+1   1  0  0  1  1  1  0  0  1  1
+1   1  0  1  0  1  0  1  1  0  1
+1   1  1  0  0  0  1  1  1  1  0
+1   0  0  0  1  0  0  1  0  1  1
+1   0  0  1  0  0  1  0  1  0  1
+1   0  1  0  0  1  0  0  1  1  0
+1   1  0  0  0  1  1  1  0  0  0
+end
diff --git a/demos/ppl_lcdd/examples/cp5.ine b/demos/ppl_lcdd/examples/cp5.ine
new file mode 100644
index 0000000..8b21e42
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp5.ine
@@ -0,0 +1,61 @@
+* 6 point cut polytope
+H-representation
+begin
+56 11 rational
+ 2  0  0  0  0  0  0  0 -1 -1 -1
+ 2  0  0  0  0  0 -1 -1  0  0 -1
+ 2  0  0  0  0 -1  0 -1  0 -1  0
+ 0  1  0  0  1  0  0 -1  0  0  0
+ 0  0  1  0  1  0  0  0  0 -1  0
+ 0  0  0  1  1  0  0  0  0  0 -1
+ 2  1  1  1  1 -1 -1 -1 -1 -1 -1
+ 0  0  1  1  0  0  0  0 -1  0  0
+ 0 -1  1  0  0  1  0  0  0  0  0
+ 0 -1  1  1  1  1  1  1 -1 -1 -1
+ 0  0  0  0  0  1  1  0 -1  0  0
+ 0  0  0  0  0  1  0 -1  0  1  0
+ 0  0  1  0 -1  0  0  0  0  1  0
+ 2 -1  1 -1 -1  1 -1 -1  1  1 -1
+ 2 -1  0  0 -1  0  0 -1  0  0  0
+ 0 -1  0  1  0  0  1  0  0  0  0
+ 0  0  0  0  0  0  1 -1  0  0  1
+ 0 -1  1  1 -1  1  1 -1 -1  1  1
+ 0  0  0  1 -1  0  0  0  0  0  1
+ 2 -1 -1  1 -1 -1  1 -1  1 -1  1
+ 0  1  0  1  0  0 -1  0  0  0  0
+ 0  0  0  0  0  1  0  1  0 -1  0
+ 0  0  0  0  0  1 -1  0  1  0  0
+ 0  1 -1  0  0  1  0  0  0  0  0
+ 0  1 -1  1  1  1 -1 -1  1  1 -1
+ 0  1  0  0 -1  0  0  1  0  0  0
+ 0  1  1  1 -1 -1 -1  1 -1  1  1
+ 2  1 -1 -1 -1  1  1  1 -1 -1 -1
+ 2  0 -1  0 -1  0  0  0  0 -1  0
+ 0  0 -1  1  0  0  0  0  1  0  0
+ 0  0  0  0  0  0  0  0  1 -1  1
+ 0  1 -1  1 -1  1 -1  1  1 -1  1
+ 0  1  1  0  0 -1  0  0  0  0  0
+ 0  0  0  0  0  0  1  1  0  0 -1
+ 0  0  0  0  0 -1  1  0  1  0  0
+ 0  1  0 -1  0  0  1  0  0  0  0
+ 0  1  1 -1  1 -1  1 -1  1 -1  1
+ 2  0  0 -1 -1  0  0  0  0  0 -1
+ 0  0  1 -1  0  0  0  0  1  0  0
+ 0  0  0  0  0  0  0  0  1  1 -1
+ 0  1  1 -1 -1 -1  1  1  1  1 -1
+ 2  0  0  0  0 -1 -1  0 -1  0  0
+ 2 -1  0 -1  0  0 -1  0  0  0  0
+ 0 -1  0  0  1  0  0  1  0  0  0
+ 0  0  0 -1  1  0  0  0  0  0  1
+ 2 -1 -1 -1  1 -1 -1  1 -1  1  1
+ 0  0  0  0  0  0 -1  1  0  0  1
+ 0 -1  1 -1  1  1 -1  1  1 -1  1
+ 2  0 -1 -1  0  0  0  0 -1  0  0
+ 0  0 -1  0  1  0  0  0  0  1  0
+ 0  0  0  0  0  0  0  0 -1  1  1
+ 0  1 -1 -1  1  1  1 -1 -1  1  1
+ 0  0  0  0  0 -1  0  1  0  1  0
+ 0 -1 -1  1  1 -1  1  1  1  1 -1
+ 2 -1 -1  0  0 -1  0  0  0  0  0
+ 6 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cp6.ext b/demos/ppl_lcdd/examples/cp6.ext
new file mode 100644
index 0000000..81b136e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp6.ext
@@ -0,0 +1,37 @@
+* 6 point cut cone
+V-representation
+begin
+  32  16   integer
+1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
+1  1  1  1  1  1  0  0  0  0  0  0  0  0  0  0
+1  0  1  1  1  1  1  1  1  1  0  0  0  0  0  0
+1  1  0  1  1  1  1  0  0  0  1  1  1  0  0  0
+1  1  1  0  1  1  0  1  0  0  1  0  0  1  1  0
+1  1  1  1  0  1  0  0  1  0  0  1  0  1  0  1
+1  1  1  1  1  0  0  0  0  1  0  0  1  0  1  1
+1  0  0  1  1  1  0  1  1  1  1  1  1  0  0  0
+1  0  1  0  1  1  1  0  1  1  1  0  0  1  1  0
+1  0  1  1  0  1  1  1  0  1  0  1  0  1  0  1
+1  0  1  1  1  0  1  1  1  0  0  0  1  0  1  1
+1  1  0  0  1  1  1  1  0  0  0  1  1  1  1  0
+1  1  0  1  0  1  1  0  1  0  1  0  1  1  0  1
+1  1  0  1  1  0  1  0  0  1  1  1  0  0  1  1
+1  1  1  0  0  1  0  1  1  0  1  1  0  0  1  1
+1  1  1  0  1  0  0  1  0  1  1  0  1  1  0  1
+1  1  1  1  0  0  0  0  1  1  0  1  1  1  1  0
+1  0  0  0  1  1  0  0  1  1  0  1  1  1  1  0
+1  0  0  1  0  1  0  1  0  1  1  0  1  1  0  1
+1  0  0  1  1  0  0  1  1  0  1  1  0  0  1  1
+1  0  1  0  0  1  1  0  0  1  1  1  0  0  1  1
+1  0  1  0  1  0  1  0  1  0  1  0  1  1  0  1
+1  0  1  1  0  0  1  1  0  0  0  1  1  1  1  0
+1  1  0  0  0  1  1  1  1  0  0  0  1  0  1  1
+1  1  0  0  1  0  1  1  0  1  0  1  0  1  0  1
+1  1  0  1  0  0  1  0  1  1  1  0  0  1  1  0
+1  1  1  0  0  0  0  1  1  1  1  1  1  0  0  0
+1  0  0  0  0  1  0  0  0  1  0  0  1  0  1  1
+1  0  0  0  1  0  0  0  1  0  0  1  0  1  0  1
+1  0  0  1  0  0  0  1  0  0  1  0  0  1  1  0
+1  0  1  0  0  0  1  0  0  0  1  1  1  0  0  0
+1  1  0  0  0  0  1  1  1  1  0  0  0  0  0  0
+end
diff --git a/demos/ppl_lcdd/examples/cp6.ine b/demos/ppl_lcdd/examples/cp6.ine
new file mode 100644
index 0000000..a26068e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp6.ine
@@ -0,0 +1,373 @@
+* 6 point cut polytope
+H-representation
+begin
+368 16 integer
+ 2  0  1  1  1  1  0  0  0  0 -1 -1 -1 -1 -1 -1
+ 2  1  0  1  1  1  0 -1 -1 -1  0  0  0 -1 -1 -1
+ 2  1  1  0  1  1 -1  0 -1 -1  0 -1 -1  0  0 -1
+ 0  1  0  0  1  0  0  0 -1  0  0  0  0  0  0  0
+ 0  1  0  0  0  1  0  0  0 -1  0  0  0  0  0  0
+ 0  0  1  0  1  0  0  0  0  0  0 -1  0  0  0  0
+ 0  0  1  0  0  1  0  0  0  0  0  0 -1  0  0  0
+ 0  0  0  1  1  0  0  0  0  0  0  0  0 -1  0  0
+ 0  0  0  1  0  1  0  0  0  0  0  0  0  0 -1  0
+ 0  0  0  0  1  1  0  0  0  0  0  0  0  0  0 -1
+ 2  2  2  2  2  2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 0  0  1  1  0  0  0  0  0  0 -1  0  0  0  0  0
+ 0 -1  1  0  0  0  1  0  0  0  0  0  0  0  0  0
+ 0 -2  2  2  2  2  1  1  1  1 -1 -1 -1 -1 -1 -1
+ 0 -2  1  1  1  1  2  2  2  2 -1 -1 -1 -1 -1 -1
+ 0  1 -1  2 -1 -1  1 -2  1  1  2 -1 -1  2  2 -1
+ 0  1 -1 -1  2 -1  1  1 -2  1 -1  2 -1  2 -1  2
+ 2 -2  1  1 -1 -1  2  2 -2 -2 -1  1  1  1  1 -1
+ 0 -1  2  1 -1 -1  2  1 -1 -1 -2  2  2  1  1 -1
+ 2 -2  1 -1 -1  1  2 -2 -2  2  1  1 -1 -1  1  1
+ 0 -1  2 -1 -1  1  2 -1 -1  1  2  2 -2 -1  1  1
+ 2 -1  2  1  1  1  2  1  1  1 -2 -2 -2 -1 -1 -1
+ 2 -2  1 -1  1 -1  2 -2  2 -2  1 -1  1  1 -1  1
+ 0 -1  2 -1  1 -1  2 -1  1 -1  2 -2  2  1 -1  1
+ 0  1 -1 -1 -1  2  1  1  1 -2 -1 -1  2 -1  2  2
+ 0  0  0  0  0  0  1  0  0 -1  0  0  1  0  0  0
+ 0 -1  1  1  1  0  1  1  1  0 -1 -1  0 -1  0  0
+ 2  1 -2 -1 -1  1  2  1  1 -1 -2 -2  2 -1  1  1
+ 0  2 -1 -1 -1  1  2  2  2 -2 -1 -1  1 -1  1  1
+ 0  0  1  1  1 -1  0  0  0  0 -1 -1  1 -1  1  1
+ 0 -1  2  1  1 -1  2  1  1 -1 -2 -2  2 -1  1  1
+ 0  0  0  0  0  0  1  1  1 -1 -1 -1  1 -1  1  1
+ 0  1  2 -1 -1 -1 -2  1  1  1  2  2  2 -1 -1 -1
+ 2 -2  2 -2  2 -2  1 -1  1 -1  1 -1  1  1 -1  1
+ 2 -1  1 -1  1 -2  1 -1  1 -2  1 -1  2  1 -2  2
+ 0  0  1  0  0 -1  0  0  0  0  0  0  1  0  0  0
+ 2 -1  2 -1 -1 -1  2 -1 -1 -1  2  2  2 -1 -1 -1
+ 6 -1  1 -1 -1 -2  1 -1 -1 -2  1  1  2 -1 -2 -2
+ 2  0  1 -1 -1 -1  0  0  0  0  1  1  1 -1 -1 -1
+ 2 -1  1 -1  0 -1  1 -1  0 -1  1  0  1  0 -1  0
+ 2 -1  1  0 -1 -1  1  0 -1 -1  0  1  1  0  0 -1
+ 2  0  0  0  0  0  1 -1 -1 -1  1  1  1 -1 -1 -1
+ 2  1 -1  1  1  2  1 -1 -1 -2  1  1  2 -1 -2 -2
+ 0 -2  1  1  1 -1  2  2  2 -2 -1 -1  1 -1  1  1
+ 0 -1  1  0  1 -1  1  0  1 -1  0 -1  1  0  0  1
+ 0 -1  1  1  0 -1  1  1  0 -1 -1  0  1  0  1  0
+ 2 -1  0  0  0 -1  0  0  0 -1  0  0  0  0  0  0
+ 0 -1  0  1  1 -1  0  1  1 -1  0  0  0 -1  1  1
+ 0 -2  2  2  2 -2  1  1  1 -1 -1 -1  1 -1  1  1
+ 2 -2 -2  2  2 -2 -1  1  1 -1  1  1 -1 -1  1  1
+ 2 -1 -1  1  1 -2 -1  1  1 -2  1  1 -2 -1  2  2
+ 12 -1 -1 -1 -1 -2 -1 -1 -1 -2 -1 -1 -2 -1 -2 -2
+ 0  0  0  0  0  0  1  0 -1  0  0  1  0  0  0  0
+ 0 -1  1  1  0  1  1  1  0  1 -1  0 -1  0 -1  0
+ 2  1 -2 -1  1 -1  2  1 -1  1 -2  2 -2  1 -1  1
+ 0  2 -1 -1  1 -1  2  2 -2  2 -1  1 -1  1 -1  1
+ 0  0  1  1 -1  1  0  0  0  0 -1  1 -1  1 -1  1
+ 0 -1  2  1 -1  1  2  1 -1  1 -2  2 -2  1 -1  1
+ 0  0  0  0  0  0  1  1 -1  1 -1  1 -1  1 -1  1
+ 0  0  0  0  0  0  1  1  0  0 -1  0  0  0  0  0
+ 0  1 -1  0  1  1  1  0 -1 -1  0  1  1  0  0 -1
+ 2  1 -1 -2  1 -1  1  2 -1  1 -2  1 -1  2 -2  1
+ 2 -2 -1  1 -1  1 -2  2 -2  2  1 -1  1  1 -1  1
+ 0 -1 -1  2 -1  1 -1  2 -1  1  2 -1  1  2 -2  1
+ 2 -1  1  2  1  1  1  2  1  1 -2 -1 -1 -2 -2 -1
+ 2  1 -1  1  2  1  1 -1 -2 -1  1  2  1 -2 -1 -2
+ 0  0  0  0  0  0  0  0  0  0 -1  1  0  1  0  0
+ 0  1 -1 -1  1  0  1  1 -1  0 -1  1  0  1  0  0
+ 0  0  0  0  0  0  0  1 -1  0  0  0  0  1  0  0
+ 0  1  0 -1  1  1  0  1 -1 -1  0  0  0  1  1 -1
+ 0  2 -1 -1  1  1  2  2 -2 -2 -1  1  1  1  1 -1
+ 2  1  1 -1  2  1 -1  1 -2 -1  1 -2 -1  2  1 -2
+ 0  1 -1 -1  2  1  1  1 -2 -1 -1  2  1  2  1 -2
+ 0 -1  1  2 -1 -1  1  2 -1 -1 -2  1  1  2  2 -1
+ 0 -1  1  1 -1  0  1  1 -1  0 -1  1  0  1  0  0
+ 0 -1  1  2 -1  1  1  2 -1  1 -2  1 -1  2 -2  1
+ 0  0  0  0  0  0  1  1 -1 -1 -1  1  1  1  1 -1
+ 2 -2 -1  1  1 -1 -2  2  2 -2  1  1 -1 -1  1  1
+ 0 -1 -1  2  1 -1 -1  2  1 -1  2  1 -1 -2  2  1
+ 0  0  1  0 -1  0  0  0  0  0  0  1  0  0  0  0
+ 0  0  0  0  0  0  0  0  0  0  0  1  1  0  0 -1
+ 0 -2  1  1 -1  1  2  2 -2  2 -1  1 -1  1 -1  1
+ 0 -1  1  0 -1  1  1  0 -1  1  0  1 -1  0  0  1
+ 0  0  0  0  0  0  0  0  0  0 -1  0  1  0  1  0
+ 0  1 -2 -1  1  1  2  1 -1 -1 -2  2  2  1  1 -1
+ 0  1 -1 -1  0  1  1  1  0 -1 -1  0  1  0  1  0
+ 2 -2  2 -2 -2  2  1 -1 -1  1  1  1 -1 -1  1  1
+ 2 -1  1 -1 -2  1  1 -1 -2  1  1  2 -1 -2  1  2
+ 2  1 -1 -2 -1  1  1  2  1 -1 -2 -1  1 -2  2  1
+ 6 -1  1 -1 -2 -1  1 -1 -2 -1  1  2  1 -2 -1 -2
+ 2 -1  1 -1 -1  0  1 -1 -1  0  1  1  0 -1  0  0
+ 0  1 -1 -2  1  1  1  2 -1 -1 -2  1  1  2  2 -1
+ 0 -1  1  2  1 -1  1  2  1 -1 -2 -1  1 -2  2  1
+ 6 -1 -1  1 -2 -1 -1  1 -2 -1  1 -2 -1  2  1 -2
+ 2 -1 -1  1 -1  0 -1  1 -1  0  1 -1  0  1  0  0
+ 2 -1  0  0 -1  0  0  0 -1  0  0  0  0  0  0  0
+ 0 -1  0  1 -1  1  0  1 -1  1  0  0  0  1 -1  1
+ 0 -2  2  2 -2  2  1  1 -1  1 -1  1 -1  1 -1  1
+ 2 -2 -2  2 -2  2 -1  1 -1  1  1 -1  1  1 -1  1
+ 2 -1 -1  1 -2  1 -1  1 -2  1  1 -2  1  2 -1  2
+ 12 -1 -1 -1 -2 -1 -1 -1 -2 -1 -1 -2 -1 -2 -1 -2
+ 0  1 -1 -1  1  2  1  1 -1 -2 -1  1  2  1  2 -2
+ 2  0  0  0  0  0  0  0 -1 -1  0  0  0  0  0 -1
+ 0  0  0  0  0  0  0  1  0 -1  0  0  0  0  1  0
+ 0 -1  0  1  0  0  0  1  0  0  0  0  0  0  0  0
+ 0  0  0  1  0 -1  0  0  0  0  0  0  0  0  1  0
+ 2 -1 -1  2 -1 -1 -1  2 -1 -1  2 -1 -1  2  2 -1
+ 6 -1 -1  1 -1 -2 -1  1 -1 -2  1 -1 -2  1  2 -2
+ 2  0 -1  1 -1 -1  0  0  0  0  1 -1 -1  1  1 -1
+ 2 -1 -1  1  0 -1 -1  1  0 -1  1  0 -1  0  1  0
+ 2 -1  0  1 -1 -1  0  1 -1 -1  0  0  0  1  1 -1
+ 2  0  0  0  0  0 -1  1 -1 -1  1 -1 -1  1  1 -1
+ 2  1  1 -1  1  2 -1  1 -1 -2  1 -1 -2  1  2 -2
+ 0  0  0  1 -1  0  0  0  0  0  0  0  0  1  0  0
+ 0  0  0  0  0  0  0  0  0  0  0  0  0  1  1 -1
+ 0  1  0  1  0  0  0 -1  0  0  0  0  0  0  0  0
+ 0  0  0  0  0  0  1 -1  0  0  1  0  0  0  0  0
+ 0 -1  1  0  1  1  1  0  1  1  0 -1 -1  0  0 -1
+ 2  1 -2  1 -1 -1  2 -1  1  1  2 -2 -2  1  1 -1
+ 0  2 -1  1 -1 -1  2 -2  2  2  1 -1 -1  1  1 -1
+ 0  0  1 -1  1  1  0  0  0  0  1 -1 -1  1  1 -1
+ 0 -1  2 -1  1  1  2 -1  1  1  2 -2 -2  1  1 -1
+ 0  0  0  0  0  0  1 -1  1  1  1 -1 -1  1  1 -1
+ 0  0  0  0  0  0  1  0  1  0  0 -1  0  0  0  0
+ 0  1 -1  1  0  1  1 -1  0 -1  1  0  1  0 -1  0
+ 2  1 -1  1 -2 -1  1 -1  2  1  1 -2 -1  2  1 -2
+ 2 -2 -1 -1  1  1 -2 -2  2  2 -1  1  1  1  1 -1
+ 0 -1 -1 -1  2  1 -1 -1  2  1 -1  2  1  2  1 -2
+ 2 -2  2  2 -2 -2  1  1 -1 -1 -1  1  1  1  1 -1
+ 2  1 -1  2  1  1  1 -2 -1 -1  2  1  1 -2 -2 -1
+ 2  1  2 -1  1  1 -2  1 -1 -1  2 -2 -2  1  1 -1
+ 2 -1  1  1  2  1  1  1  2  1 -1 -2 -1 -2 -1 -2
+ 2  2 -2 -2  2 -2  1  1 -1  1 -1  1 -1  1 -1  1
+ 2 -1  1  1 -1 -2  1  1 -1 -2 -1  1  2  1  2 -2
+ 2  1 -1 -1  1 -2  1  1 -1  2 -1  1 -2  1 -2  2
+ 0  0  0  0  0  0  0 -1  1  0  0  0  0  1  0  0
+ 0  1  0  1 -1  1  0 -1  1 -1  0  0  0  1 -1  1
+ 0  2 -1  1 -1  1  2 -2  2 -2  1 -1  1  1 -1  1
+ 2  1  1  2 -1  1 -1 -2  1 -1 -2  1 -1  2 -2  1
+ 0  1 -1  2 -1  1  1 -2  1 -1  2 -1  1  2 -2  1
+ 0 -1  1 -1  2 -1  1 -1  2 -1  1 -2  1  2 -1  2
+ 0 -1  1 -1  1  0  1 -1  1  0  1 -1  0  1  0  0
+ 0 -1  1 -1  2  1  1 -1  2  1  1 -2 -1  2  1 -2
+ 0  0  0  0  0  0  1 -1  1 -1  1 -1  1  1 -1  1
+ 0  0  0  0  0  0  0  0  0  0  1 -1  0  1  0  0
+ 0  1 -1  1 -1  0  1 -1  1  0  1 -1  0  1  0  0
+ 0  0  0  0  0  0  1  0  0  1  0  0 -1  0  0  0
+ 0  1 -1  1  1  0  1 -1 -1  0  1  1  0 -1  0  0
+ 0  1 -1  0  0  0  1  0  0  0  0  0  0  0  0  0
+ 0  2 -2  2  2  2  1 -1 -1 -1  1  1  1 -1 -1 -1
+ 0  1 -2  1  1  1  2 -1 -1 -1  2  2  2 -1 -1 -1
+ 2  2 -1  1  1  1  2 -2 -2 -2  1  1  1 -1 -1 -1
+ 0  1  0  0  0 -1  0  0  0  1  0  0  0  0  0  0
+ 0  1  1  1  1 -2 -1 -1 -1  2 -1 -1  2 -1  2  2
+ 0  2  2  2  2 -2 -1 -1 -1  1 -1 -1  1 -1  1  1
+ 2  2  1  1  1 -1 -2 -2 -2  2 -1 -1  1 -1  1  1
+ 2  2  2 -2 -2 -2 -1  1  1  1  1  1  1 -1 -1 -1
+ 2  2 -1 -1 -1 -1  2  2  2  2 -1 -1 -1 -1 -1 -1
+ 6  1 -1 -1 -1 -2  1  1  1  2 -1 -1 -2 -1 -2 -2
+ 2  1  0 -1 -1 -1  0  1  1  1  0  0  0 -1 -1 -1
+ 2  1  1 -1 -1 -2 -1  1  1  2  1  1  2 -1 -2 -2
+ 2  1 -1 -1  0 -1  1  1  0  1 -1  0 -1  0 -1  0
+ 6  1 -1 -1 -2 -1  1  1  2  1 -1 -2 -1 -2 -1 -2
+ 2  1 -1  0 -1 -1  1  0  1  1  0 -1 -1  0  0 -1
+ 2  2 -2  2 -2 -2  1 -1  1  1  1 -1 -1  1  1 -1
+ 2  1 -1  1 -1 -2  1 -1  1  2  1 -1 -2  1  2 -2
+ 2 -1 -2  1  1 -1 -2  1  1 -1  2  2 -2 -1  1  1
+ 2 -1  1  1 -2 -1  1  1 -2 -1 -1  2  1  2  1 -2
+ 2 -1  1  1  1  2  1  1  1  2 -1 -1 -2 -1 -2 -2
+ 2  2 -2 -2 -2  2  1  1  1 -1 -1 -1  1 -1  1  1
+ 2 -1  1 -2  1 -1  1 -2  1 -1  2 -1  1  2 -2  1
+ 2  1 -1 -1 -1  0  1  1  1  0 -1 -1  0 -1  0  0
+ 2  0  0  0  0  0  1  1  1  1 -1 -1 -1 -1 -1 -1
+ 0  1 -2  1  1 -1  2 -1 -1  1  2  2 -2 -1  1  1
+ 0  1 -1  0  1 -1  1  0 -1  1  0  1 -1  0  0  1
+ 0  1 -1  1  0 -1  1 -1  0  1  1  0 -1  0  1  0
+ 2  0 -1  0  0 -1  0  0  0  0  0  0 -1  0  0  0
+ 0  0 -1  1  1 -1  0  0  0  0  1  1 -1 -1  1  1
+ 0  2 -2  2  2 -2  1 -1 -1  1  1  1 -1 -1  1  1
+ 0  0  0  0  0  0  0  0  1  1  0  0  0  0  0 -1
+ 0  1  1  1 -1  0 -1 -1  1  0 -1  1  0  1  0  0
+ 0  1  0  0 -1  0  0  0  1  0  0  0  0  0  0  0
+ 2  2  1  1 -1  1 -2 -2  2 -2 -1  1 -1  1 -1  1
+ 0  2  2  2 -2  2 -1 -1  1 -1 -1  1 -1  1 -1  1
+ 0  1  1  1 -2  1 -1 -1  2 -1 -1  2 -1  2 -1  2
+ 0  1  1  1 -2 -1 -1 -1  2  1 -1  2  1  2  1 -2
+ 0  1  0  1 -1 -1  0 -1  1  1  0  0  0  1  1 -1
+ 0  1  1  0 -1 -1 -1  0  1  1  0  1  1  0  0 -1
+ 2  0  0  0 -1 -1  0  0  0  0  0  0  0  0  0 -1
+ 0  0  1  1 -1 -1  0  0  0  0 -1  1  1  1  1 -1
+ 0  2  2  2 -2 -2 -1 -1  1  1 -1  1  1  1  1 -1
+ 2  1  1 -1 -2 -1 -1  1  2  1  1  2  1 -2 -1 -2
+ 0  0  0  0  0  0  0 -1  0  1  0  0  0  0  1  0
+ 2  1  1  2  1 -1 -1 -2 -1  1 -2 -1  1 -2  2  1
+ 0  1  0  1  1 -1  0 -1 -1  1  0  0  0 -1  1  1
+ 0  2 -1  1  1 -1  2 -2 -2  2  1  1 -1 -1  1  1
+ 0  1 -1  2  1 -1  1 -2 -1  1  2  1 -1 -2  2  1
+ 0 -1  1 -1 -1  2  1 -1 -1  2  1  1 -2 -1  2  2
+ 0 -2  1 -1  1  1  2 -2  2  2  1 -1 -1  1  1 -1
+ 0 -1  1 -1  0  1  1 -1  0  1  1  0 -1  0  1  0
+ 0 -1  1 -2  1  1  1 -2  1  1  2 -1 -1  2  2 -1
+ 0 -1  1 -1  1  2  1 -1  1  2  1 -1 -2  1  2 -2
+ 0  0  0  0  0  0  1 -1 -1  1  1  1 -1 -1  1  1
+ 0  1 -2  1 -1  1  2 -1  1 -1  2 -2  2  1 -1  1
+ 0  1 -1  0 -1  1  1  0  1 -1  0 -1  1  0  0  1
+ 0  0  0  0  0  0 -1 -1  1  1 -1  1  1  1  1 -1
+ 0  1  1  2 -1 -1 -1 -2  1  1 -2  1  1  2  2 -1
+ 2 -1 -2  1 -1  1 -2  1 -1  1  2 -2  2  1 -1  1
+ 0 -1 -1 -1  1  2 -1 -1  1  2 -1  1  2  1  2 -2
+ 2  1 -1 -1 -2  1  1  1  2 -1 -1 -2  1 -2  1  2
+ 2 -1  1 -2 -1  1  1 -2 -1  1  2  1 -1 -2  2  1
+ 2  0 -1  0 -1  0  0  0  0  0  0 -1  0  0  0  0
+ 0  0 -1  1 -1  1  0  0  0  0  1 -1  1  1 -1  1
+ 0  2 -2  2 -2  2  1 -1  1 -1  1 -1  1  1 -1  1
+ 2  0  0  0  0  0  0  0  0  0  0 -1 -1  0  0 -1
+ 0  0  0  0  0  0  0  0  0  0  1  0 -1  0  1  0
+ 0  0 -1  1  0  0  0  0  0  0  1  0  0  0  0  0
+ 0  1  1  0  0  0 -1  0  0  0  0  0  0  0  0  0
+ 0  0  0  0  0  0 -1  1  0  0  1  0  0  0  0  0
+ 0 -1  0  1  1  1  0  1  1  1  0  0  0 -1 -1 -1
+ 2  1  1 -2 -1 -1 -1  2  1  1  2  1  1 -2 -2 -1
+ 0  2  1 -1 -1 -1 -2  2  2  2  1  1  1 -1 -1 -1
+ 0  0 -1  1  1  1  0  0  0  0  1  1  1 -1 -1 -1
+ 0 -1 -1  2  1  1 -1  2  1  1  2  1  1 -2 -2 -1
+ 0  0  0  0  0  0 -1  1  1  1  1  1  1 -1 -1 -1
+ 0  0  0  0  0  0  0  1  1  0  0  0  0 -1  0  0
+ 0  1  1 -1  0  1 -1  1  0 -1  1  0 -1  0  1  0
+ 0  0  0  0  0  0  0  0  0  0  1  1  0 -1  0  0
+ 0  1  1 -1 -1  0 -1  1  1  0  1  1  0 -1  0  0
+ 0  0  0  0  0  0  0  1  0  1  0  0  0  0 -1  0
+ 0  1  1 -1  1  0 -1  1 -1  0  1 -1  0  1  0  0
+ 0  1  0 -1  0  0  0  1  0  0  0  0  0  0  0  0
+ 2  2  1 -1  1  1 -2  2 -2 -2  1 -1 -1  1  1 -1
+ 0  2  2 -2  2  2 -1  1 -1 -1  1 -1 -1  1  1 -1
+ 0  1  1 -2  1  1 -1  2 -1 -1  2 -1 -1  2  2 -1
+ 0  1  1 -2  1 -1 -1  2 -1  1  2 -1  1  2 -2  1
+ 0  1  0 -1  1 -1  0  1 -1  1  0  0  0  1 -1  1
+ 0  1  1 -1  0 -1 -1  1  0  1  1  0  1  0 -1  0
+ 2  0  0 -1  0 -1  0  0  0  0  0  0  0  0 -1  0
+ 0  0  1 -1  1 -1  0  0  0  0  1 -1  1  1 -1  1
+ 0  2  2 -2  2 -2 -1  1 -1  1  1 -1  1  1 -1  1
+ 2  0  0  0  0  0  0  0  0  0  0  0  0 -1 -1 -1
+ 0  0  1 -1  0  0  0  0  0  0  1  0  0  0  0  0
+ 0  0  0  0  0  0  0  0  0  0  1  0  1  0 -1  0
+ 2  1  1  1  1  0 -1 -1 -1  0 -1 -1  0 -1  0  0
+ 2  0  0  0  0  0  0 -1 -1  0  0  0  0 -1  0  0
+ 0  0  0  0  0  0  0  0 -1  1  0  0  0  0  0  1
+ 0 -1  0  0  0  1  0  0  0  1  0  0  0  0  0  0
+ 0  0  0  0 -1  1  0  0  0  0  0  0  0  0  0  1
+ 2 -1 -1 -1 -1  2 -1 -1 -1  2 -1 -1  2 -1  2  2
+ 6 -1 -1 -1 -2  1 -1 -1 -2  1 -1 -2  1 -2  1  2
+ 2  0 -1 -1 -1  1  0  0  0  0 -1 -1  1 -1  1  1
+ 2 -1 -1  0 -1  1 -1  0 -1  1  0 -1  1  0  0  1
+ 2 -1  0 -1 -1  1  0 -1 -1  1  0  0  0 -1  1  1
+ 2  0  0  0  0  0 -1 -1 -1  1 -1 -1  1 -1  1  1
+ 2  1  1  1  2 -1 -1 -1 -2  1 -1 -2  1 -2  1  2
+ 0  0  0  0  0  0  0  0  0  0  0  0  0 -1  1  1
+ 0  0  0 -1  0  1  0  0  0  0  0  0  0  0  1  0
+ 2  0  0  0  0  0  0  0  0  0 -1 -1  0 -1  0  0
+ 0  0  0  0  0  0  0  0  0  0  0 -1  1  0  0  1
+ 0  0 -1  0  0  1  0  0  0  0  0  0  1  0  0  0
+ 0  0  0  0  0  0 -1  0  0  1  0  0  1  0  0  0
+ 2  1  2  1  1 -1 -2 -1 -1  1 -2 -2  2 -1  1  1
+ 0  1  1  0  1 -1 -1  0 -1  1  0 -1  1  0  0  1
+ 0  2  1 -1  1 -1 -2  2 -2  2  1 -1  1  1 -1  1
+ 0  1  2 -1  1 -1 -2  1 -1  1  2 -2  2  1 -1  1
+ 0  1  1  1  0 -1 -1 -1  0  1 -1  0  1  0  1  0
+ 0  2  1  1 -1 -1 -2 -2  2  2 -1  1  1  1  1 -1
+ 0  1  1  1 -1 -2 -1 -1  1  2 -1  1  2  1  2 -2
+ 0  1  2  1 -1 -1 -2 -1  1  1 -2  2  2  1  1 -1
+ 0  1  1 -1  1 -2 -1  1 -1  2  1 -1  2  1 -2  2
+ 0 -2 -1  1  1  1 -2  2  2  2  1  1  1 -1 -1 -1
+ 0 -1 -1  1  0  1 -1  1  0  1  1  0  1  0 -1  0
+ 0 -1 -2  1  1  1 -2  1  1  1  2  2  2 -1 -1 -1
+ 0 -1 -1  1  1  2 -1  1  1  2  1  1  2 -1 -2 -2
+ 0 -1 -1  1 -1  2 -1  1 -1  2  1 -1  2  1 -2  2
+ 0  1  1 -2 -1  1 -1  2  1 -1  2  1 -1 -2  2  1
+ 0  1  0 -1 -1  1  0  1  1 -1  0  0  0 -1  1  1
+ 2  0  0 -1 -1  0  0  0  0  0  0  0  0 -1  0  0
+ 0  0  1 -1 -1  1  0  0  0  0  1  1 -1 -1  1  1
+ 0  2  2 -2 -2  2 -1  1  1 -1  1  1 -1 -1  1  1
+ 0  0  0  0  0  0 -1  1 -1  1  1 -1  1  1 -1  1
+ 0  1  1 -1  2 -1 -1  1 -2  1  1 -2  1  2 -1  2
+ 6  1 -1 -2 -1 -1  1  2  1  1 -2 -1 -1 -2 -2 -1
+ 2  0  0  0  0  0 -1  0 -1  0  0 -1  0  0  0  0
+ 6  1  1  1  2  1 -1 -1 -2 -1 -1 -2 -1 -2 -1 -2
+ 2  1  1  1  0  1 -1 -1  0 -1 -1  0 -1  0 -1  0
+ 2  0  0  0  0  0  0 -1  0 -1  0  0  0  0 -1  0
+ 0  0  0  0  0  0  0  0  1 -1  0  0  0  0  0  1
+ 0 -1  0  0  1  0  0  0  1  0  0  0  0  0  0  0
+ 0  0  0  0  1 -1  0  0  0  0  0  0  0  0  0  1
+ 2 -1 -1 -1  2 -1 -1 -1  2 -1 -1  2 -1  2 -1  2
+ 6 -1 -1 -1  1 -2 -1 -1  1 -2 -1  1 -2  1 -2  2
+ 2  0 -1 -1  1 -1  0  0  0  0 -1  1 -1  1 -1  1
+ 2 -1 -1  0  1 -1 -1  0  1 -1  0  1 -1  0  0  1
+ 2 -1  0 -1  1 -1  0 -1  1 -1  0  0  0  1 -1  1
+ 2  0  0  0  0  0 -1 -1  1 -1 -1  1 -1  1 -1  1
+ 2  1  1  1 -1  2 -1 -1  1 -2 -1  1 -2  1 -2  2
+ 0  0  0  0  0  0  0  0  0  0  0  0  0  1 -1  1
+ 0  0  0 -1  1  0  0  0  0  0  0  0  0  1  0  0
+ 2  0  0  0  0  0  0  0  0  0 -1  0 -1  0 -1  0
+ 0  0  0  0  0  0  0  0  0  0  0  1 -1  0  0  1
+ 0  0 -1  0  1  0  0  0  0  0  0  1  0  0  0  0
+ 0  0  0  0  0  0 -1  0  1  0  0  1  0  0  0  0
+ 0  1  1  0 -1  1 -1  0  1 -1  0  1 -1  0  0  1
+ 0  2  1 -1 -1  1 -2  2  2 -2  1  1 -1 -1  1  1
+ 2  1  2  1 -1  1 -2 -1  1 -1 -2  2 -2  1 -1  1
+ 0  1  2 -1 -1  1 -2  1  1 -1  2  2 -2 -1  1  1
+ 0 -1 -1  1  1  0 -1  1  1  0  1  1  0 -1  0  0
+ 0 -1 -1  1  2  1 -1  1  2  1  1  2  1 -2 -1 -2
+ 0 -1 -1  1  2 -1 -1  1  2 -1  1  2 -1 -2  1  2
+ 0  0  0  0  0  0 -1  1  1 -1  1  1 -1 -1  1  1
+ 2  0  0  0  0  0 -1 -1  0  0 -1  0  0  0  0  0
+ 6  1  1  2  1  1 -1 -2 -1 -1 -2 -1 -1 -2 -2 -1
+ 0  1 -1  1  1 -2  1 -1 -1  2  1  1 -2 -1  2  2
+ 0 -1  1  1 -2  1  1  1 -2  1 -1  2 -1  2 -1  2
+ 6 -1 -1 -2 -1  1 -1 -2 -1  1 -2 -1  1 -2  2  1
+ 2 -1 -1 -1  0  1 -1 -1  0  1 -1  0  1  0  1  0
+ 0 -1  1  1 -1  2  1  1 -1  2 -1  1 -2  1 -2  2
+ 0  1 -1  1  2 -1  1 -1 -2  1  1  2 -1 -2  1  2
+ 0  1 -1  1 -2  1  1 -1  2 -1  1 -2  1  2 -1  2
+ 0 -1  1  1  1 -2  1  1  1 -2 -1 -1  2 -1  2  2
+ 0 -1  1  1  2 -1  1  1  2 -1 -1 -2  1 -2  1  2
+ 6 -1 -1 -2  1 -1 -1 -2  1 -1 -2  1 -1  2 -2  1
+ 2 -1 -1 -1  1  0 -1 -1  1  0 -1  1  0  1  0  0
+ 2 -2 -2 -2  2  2 -1 -1  1  1 -1  1  1  1  1 -1
+ 0 -2  2 -2  2  2  1 -1  1  1  1 -1 -1  1  1 -1
+ 0 -1  0 -1  1  1  0 -1  1  1  0  0  0  1  1 -1
+ 2 -1 -1 -2  1  1 -1 -2  1  1 -2  1  1  2  2 -1
+ 2 -1  0 -1  0  0  0 -1  0  0  0  0  0  0  0  0
+ 12 -2 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 12 -1 -1 -2 -1 -1 -1 -2 -1 -1 -2 -1 -1 -2 -2 -1
+ 6 -1  1 -2 -1 -1  1 -2 -1 -1  2  1  1 -2 -2 -1
+ 6 -1  0 -1 -1 -1  0 -1 -1 -1  0  0  0 -1 -1 -1
+ 6 -2  1 -1 -1 -1  2 -2 -2 -2  1  1  1 -1 -1 -1
+ 0  1 -1  1 -1  2  1 -1  1 -2  1 -1  2  1 -2  2
+ 0  2 -2 -2  2  2  1  1 -1 -1 -1  1  1  1  1 -1
+ 0  0 -1 -1  1  1  0  0  0  0 -1  1  1  1  1 -1
+ 2  0 -1 -1  0  0  0  0  0  0 -1  0  0  0  0  0
+ 0  1  1 -1 -2  1 -1  1  2 -1  1  2 -1 -2  1  2
+ 0 -2 -2  2  2  2 -1  1  1  1  1  1  1 -1 -1 -1
+ 0 -1 -1  0  1  1 -1  0  1  1  0  1  1  0  0 -1
+ 2 -1 -2 -1  1  1 -2 -1  1  1 -2  2  2  1  1 -1
+ 0  1  1 -1 -1  2 -1  1  1 -2  1  1 -2 -1  2  2
+ 6  1  2  1  1  1 -2 -1 -1 -1 -2 -2 -2 -1 -1 -1
+ 6  2 -2 -2 -2 -2  1  1  1  1 -1 -1 -1 -1 -1 -1
+ 6  2  1  1  1  1 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1
+ 6 -2  2 -2 -2 -2  1 -1 -1 -1  1  1  1 -1 -1 -1
+ 6 -2 -2  2 -2 -2 -1  1 -1 -1  1 -1 -1  1  1 -1
+ 2 -1 -1  0  0  0 -1  0  0  0  0  0  0  0  0  0
+ 12 -1 -2 -1 -1 -1 -2 -1 -1 -1 -2 -2 -2 -1 -1 -1
+ 6 -1 -2  1 -1 -1 -2  1 -1 -1  2 -2 -2  1  1 -1
+ 6 -1 -1  0 -1 -1 -1  0 -1 -1  0 -1 -1  0  0 -1
+ 6 -2 -1  1 -1 -1 -2  2 -2 -2  1 -1 -1  1  1 -1
+ 6 -1 -2 -1  1 -1 -2 -1  1 -1 -2  2 -2  1 -1  1
+ 6 -2 -2 -2  2 -2 -1 -1  1 -1 -1  1 -1  1 -1  1
+ 6 -1 -1 -1  0 -1 -1 -1  0 -1 -1  0 -1  0 -1  0
+ 6 -2 -1 -1  1 -1 -2 -2  2 -2 -1  1 -1  1 -1  1
+ 12 -2 -1 -1 -1 -1 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1
+ 6 -1 -2 -1 -1  1 -2 -1 -1  1 -2 -2  2 -1  1  1
+ 6 -2 -2 -2 -2  2 -1 -1 -1  1 -1 -1  1 -1  1  1
+ 6 -1 -1 -1 -1  0 -1 -1 -1  0 -1 -1  0 -1  0  0
+ 6 -2 -1 -1 -1  1 -2 -2 -2  2 -1 -1  1 -1  1  1
+ 6  0 -1 -1 -1 -1  0  0  0  0 -1 -1 -1 -1 -1 -1
+ 6  1 -2 -1 -1 -1  2  1  1  1 -2 -2 -2 -1 -1 -1
+ 6  0  0  0  0  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 2  0  0  0  0  0 -1  0  0 -1  0  0 -1  0  0  0
+ 6  1  1  1  1  2 -1 -1 -1 -2 -1 -1 -2 -1 -2 -2
+end
diff --git a/demos/ppl_lcdd/examples/cp7.ext b/demos/ppl_lcdd/examples/cp7.ext
new file mode 100644
index 0000000..390c068
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp7.ext
@@ -0,0 +1,70 @@
+* Complete Cut Polytope on 7 vertices
+* The number of facets is 116,764.
+V-representation
+begin
+  64  22   integer
+1   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1   1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1   0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+1   1 0 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+1   1 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+1   1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+1   1 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+1   1 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+1   0 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1   0 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+1   0 1 1 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+1   0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+1   0 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+1   1 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+1   1 0 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+1   1 0 1 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+1   1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+1   1 1 0 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+1   1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+1   1 1 0 1 1 0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+1   1 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+1   1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+1   1 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+1   0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+1   0 0 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+1   0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+1   0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+1   0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+1   0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+1   0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+1   0 1 1 0 0 1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+1   0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+1   0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+1   1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+1   1 0 0 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+1   1 0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+1   1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+1   1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+1   1 0 1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+1   1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+1   1 1 0 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+1   1 1 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+1   1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+1   0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+1   0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+1   0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+1   0 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+1   0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+1   0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+1   0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+1   0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+1   0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+1   0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+1   1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+1   1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+1   1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+1   1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+1   1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1   0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+1   0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+1   0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+1   0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+1   0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+1   1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/cross10.ine b/demos/ppl_lcdd/examples/cross10.ine
new file mode 100644
index 0000000..ad45922
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross10.ine
@@ -0,0 +1,1030 @@
+* 10-dim cross polytope
+H-representation
+begin
+1024  11  integer
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 1
+ 1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 1
+ 1 1 -1 1 1 1 1 1 1 1 -1
+ 1 1 -1 1 1 1 1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 1
+ 1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 1
+ 1 1 1 1 -1 1 1 1 1 1 -1
+ 1 1 1 1 -1 1 1 1 1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 1
+ 1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 1
+ 1 1 1 1 1 1 -1 1 1 1 -1
+ 1 1 1 1 1 1 -1 1 1 1 1
+ 1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 1
+ 1 1 1 1 1 1 1 1 -1 1 -1
+ 1 1 1 1 1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 -1 1
+ 1 1 1 1 1 1 1 1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 1 1
+ 1 1 1 1 1 1 1 -1 1 1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 1
+ 1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 1
+ 1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 1 1
+ 1 1 1 1 1 -1 1 1 1 1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 1
+ 1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 1
+ 1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 1
+ 1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 1
+ 1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 1 1
+ 1 1 1 -1 1 1 1 1 1 1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 1
+ 1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 1
+ 1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 1
+ 1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 1
+ 1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 1
+ 1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 1
+ 1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 1 1
+ 1 -1 1 1 1 1 1 1 1 1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 1
+ 1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 1
+ 1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 1
+ 1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 1
+ 1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 1
+ 1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 1
+ 1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 1
+ 1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 1
+ 1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/cross12.ine b/demos/ppl_lcdd/examples/cross12.ine
new file mode 100644
index 0000000..ce5b2fc
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross12.ine
@@ -0,0 +1,4102 @@
+* 12-dim cross polytope
+H-representation
+begin
+4096  13   integer
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 1 1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 1 1 1
+ 1 1 -1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 1 1 1
+ 1 1 -1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 1 1 -1 1 1
+ 1 1 -1 1 1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 1 1 -1 1
+ 1 1 -1 1 1 1 1 1 1 1 1 1 -1
+ 1 1 -1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 1 1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 1 1 1
+ 1 1 1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 1 1 1
+ 1 1 1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 1 1 -1 1 1
+ 1 1 1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 1 1 -1 1
+ 1 1 1 1 -1 1 1 1 1 1 1 1 -1
+ 1 1 1 1 -1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 1 1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 1 1 1
+ 1 1 1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 1 1 1
+ 1 1 1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 1 1 -1 1
+ 1 1 1 1 1 1 -1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 -1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 1 1 1
+ 1 1 1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 1 1 -1 1 -1 1 1
+ 1 1 1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 1 1 -1 1
+ 1 1 1 1 1 1 1 1 -1 1 1 1 -1
+ 1 1 1 1 1 1 1 1 -1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 1 1 -1 -1 1
+ 1 1 1 1 1 1 1 1 1 1 -1 1 -1
+ 1 1 1 1 1 1 1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 -1 1
+ 1 1 1 1 1 1 1 1 1 1 1 -1 -1
+ 1 1 1 1 1 1 1 1 1 -1 1 1 1
+ 1 1 1 1 1 1 1 1 1 -1 1 1 -1
+ 1 1 1 1 1 1 1 1 1 -1 1 -1 1
+ 1 1 1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 1 1 -1 -1 1 1
+ 1 1 1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 1 1 1 1
+ 1 1 1 1 1 1 1 -1 1 1 1 1 -1
+ 1 1 1 1 1 1 1 -1 1 1 1 -1 1
+ 1 1 1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 1 -1 1 1
+ 1 1 1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 1 1 1
+ 1 1 1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 1 1 1
+ 1 1 1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 1 1 1 1
+ 1 1 1 1 1 -1 1 1 1 1 1 1 -1
+ 1 1 1 1 1 -1 1 1 1 1 1 -1 1
+ 1 1 1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 1 -1 1 1
+ 1 1 1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 1 1 1
+ 1 1 1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 1 1 1
+ 1 1 1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 1 1 1
+ 1 1 1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 1 1 1
+ 1 1 1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 1 1 1 1
+ 1 1 1 -1 1 1 1 1 1 1 1 1 -1
+ 1 1 1 -1 1 1 1 1 1 1 1 -1 1
+ 1 1 1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 1 -1 1 1
+ 1 1 1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 1 1 1
+ 1 1 1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 1 1 1
+ 1 1 1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 1 1 1
+ 1 1 1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 1 1 1
+ 1 1 1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 1 1 1
+ 1 1 1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 1 1 1
+ 1 1 1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 1 1 1 1
+ 1 -1 1 1 1 1 1 1 1 1 1 1 -1
+ 1 -1 1 1 1 1 1 1 1 1 1 -1 1
+ 1 -1 1 1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 1 -1 1 1
+ 1 -1 1 1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 1 1 1
+ 1 -1 1 1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 1 1 1
+ 1 -1 1 1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 1 1 1
+ 1 -1 1 1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 1 1 1
+ 1 -1 1 1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 1 1 1
+ 1 -1 1 1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 1 1 1
+ 1 -1 1 1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 1 1 1
+ 1 -1 1 -1 1 1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 1 1 1
+ 1 -1 -1 1 1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/cross4.ine b/demos/ppl_lcdd/examples/cross4.ine
new file mode 100644
index 0000000..b716562
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross4.ine
@@ -0,0 +1,20 @@
+H-representation
+begin
+16 5 integer
+1 1 1 1 -1
+1 -1 -1 1 -1
+1 -1 1 -1 -1
+1 -1 1 1 -1
+1 1 -1 -1 1
+1 1 -1 1 1
+1 1 1 -1 1
+1 1 1 1 1
+1 -1 -1 -1 1
+1 -1 -1 1 1
+1 -1 1 -1 1
+1 -1 1 1 1
+1 1 -1 -1 -1
+1 1 -1 1 -1
+1 1 1 -1 -1
+1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cross6.ine b/demos/ppl_lcdd/examples/cross6.ine
new file mode 100644
index 0000000..a4024b8
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross6.ine
@@ -0,0 +1,69 @@
+* 6-dim cross polytope
+H-representation
+begin
+64  7  integer
+ 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 1
+ 1 1 1 1 1 -1 1
+ 1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 1
+ 1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1
+ 1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cross8.ine b/demos/ppl_lcdd/examples/cross8.ine
new file mode 100644
index 0000000..b045ac5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross8.ine
@@ -0,0 +1,261 @@
+* 8-dim cross polytope
+H-representation
+begin
+256  9  integer
+ 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 1 1 1
+ 1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 -1 1
+ 1 1 1 1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 1
+ 1 1 1 1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 1
+ 1 1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 1
+ 1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube.ext b/demos/ppl_lcdd/examples/cube.ext
new file mode 100644
index 0000000..b55a875
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube.ext
@@ -0,0 +1,13 @@
+* cube
+V-representation
+begin
+8 4 rational
+ 1  1  1  1
+ 1 -1  1  1
+ 1  1 -1  1
+ 1 -1 -1  1
+ 1  1  1 -1
+ 1 -1  1 -1
+ 1  1 -1 -1
+ 1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube.ine b/demos/ppl_lcdd/examples/cube.ine
new file mode 100644
index 0000000..28301fc
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube.ine
@@ -0,0 +1,12 @@
+* cube of side 2 centred at origin
+H-representation
+linearity 1 1
+begin
+6  4 rational
+1 -1 0 0
+1 0 -1 0
+1 0 0 -1
+1 1 0 0
+1 0 1 0
+1 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/cube10.ine b/demos/ppl_lcdd/examples/cube10.ine
new file mode 100644
index 0000000..7318f48
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube10.ine
@@ -0,0 +1,25 @@
+* 10-dim hypercube
+H-representation
+begin
+   20  11  integer
+  1  1  0  0  0  0  0  0  0  0  0
+  1  0  1  0  0  0  0  0  0  0  0
+  1  0  0  1  0  0  0  0  0  0  0
+  1  0  0  0  1  0  0  0  0  0  0
+  1  0  0  0  0  1  0  0  0  0  0
+  1  0  0  0  0  0  1  0  0  0  0
+  1  0  0  0  0  0  0  1  0  0  0
+  1  0  0  0  0  0  0  0  1  0  0
+  1  0  0  0  0  0  0  0  0  1  0
+  1  0  0  0  0  0  0  0  0  0  1
+  1 -1  0  0  0  0  0  0  0  0  0
+  1  0 -1  0  0  0  0  0  0  0  0
+  1  0  0 -1  0  0  0  0  0  0  0
+  1  0  0  0 -1  0  0  0  0  0  0
+  1  0  0  0  0 -1  0  0  0  0  0
+  1  0  0  0  0  0 -1  0  0  0  0
+  1  0  0  0  0  0  0 -1  0  0  0
+  1  0  0  0  0  0  0  0 -1  0  0
+  1  0  0  0  0  0  0  0  0 -1  0
+  1  0  0  0  0  0  0  0  0  0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube12.ine b/demos/ppl_lcdd/examples/cube12.ine
new file mode 100644
index 0000000..4206e39
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube12.ine
@@ -0,0 +1,29 @@
+* 12-dim hypercube
+H-representation
+begin
+   24  13  integer
+  1  1  0  0  0  0  0  0  0  0  0  0  0
+  1  0  1  0  0  0  0  0  0  0  0  0  0
+  1  0  0  1  0  0  0  0  0  0  0  0  0
+  1  0  0  0  1  0  0  0  0  0  0  0  0
+  1  0  0  0  0  1  0  0  0  0  0  0  0
+  1  0  0  0  0  0  1  0  0  0  0  0  0
+  1  0  0  0  0  0  0  1  0  0  0  0  0
+  1  0  0  0  0  0  0  0  1  0  0  0  0
+  1  0  0  0  0  0  0  0  0  1  0  0  0
+  1  0  0  0  0  0  0  0  0  0  1  0  0
+  1  0  0  0  0  0  0  0  0  0  0  1  0
+  1  0  0  0  0  0  0  0  0  0  0  0  1
+  1 -1  0  0  0  0  0  0  0  0  0  0  0
+  1  0 -1  0  0  0  0  0  0  0  0  0  0
+  1  0  0 -1  0  0  0  0  0  0  0  0  0
+  1  0  0  0 -1  0  0  0  0  0  0  0  0
+  1  0  0  0  0 -1  0  0  0  0  0  0  0
+  1  0  0  0  0  0 -1  0  0  0  0  0  0
+  1  0  0  0  0  0  0 -1  0  0  0  0  0
+  1  0  0  0  0  0  0  0 -1  0  0  0  0
+  1  0  0  0  0  0  0  0  0 -1  0  0  0
+  1  0  0  0  0  0  0  0  0  0 -1  0  0
+  1  0  0  0  0  0  0  0  0  0  0 -1  0
+  1  0  0  0  0  0  0  0  0  0  0  0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube3.ine b/demos/ppl_lcdd/examples/cube3.ine
new file mode 100644
index 0000000..601dd13
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube3.ine
@@ -0,0 +1,11 @@
+* Hypercube of dimension 3
+H-representation
+begin
+    6    4    integer
+ 1  1  0  0
+ 1  0  1  0
+ 1  0  0  1
+ 1 -1  0  0
+ 1  0 -1  0
+ 1  0  0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube6.ine b/demos/ppl_lcdd/examples/cube6.ine
new file mode 100644
index 0000000..98b2553
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube6.ine
@@ -0,0 +1,17 @@
+* 6-dim hypercube
+H-representation
+begin
+    12    7    integer
+ 1  1  0  0  0  0  0
+ 1  0  1  0  0  0  0
+ 1  0  0  1  0  0  0
+ 1  0  0  0  1  0  0
+ 1  0  0  0  0  1  0
+ 1  0  0  0  0  0  1
+ 1 -1  0  0  0  0  0
+ 1  0 -1  0  0  0  0
+ 1  0  0 -1  0  0  0
+ 1  0  0  0 -1  0  0
+ 1  0  0  0  0 -1  0
+ 1  0  0  0  0  0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube8.ine b/demos/ppl_lcdd/examples/cube8.ine
new file mode 100644
index 0000000..2028c83
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube8.ine
@@ -0,0 +1,21 @@
+* 8-dim hypercube
+H-representation
+begin
+   16  9  integer
+  1  1  0  0  0  0  0  0  0
+  1  0  1  0  0  0  0  0  0
+  1  0  0  1  0  0  0  0  0
+  1  0  0  0  1  0  0  0  0
+  1  0  0  0  0  1  0  0  0
+  1  0  0  0  0  0  1  0  0
+  1  0  0  0  0  0  0  1  0
+  1  0  0  0  0  0  0  0  1
+  1 -1  0  0  0  0  0  0  0
+  1  0 -1  0  0  0  0  0  0
+  1  0  0 -1  0  0  0  0  0
+  1  0  0  0 -1  0  0  0  0
+  1  0  0  0  0 -1  0  0  0
+  1  0  0  0  0  0 -1  0  0
+  1  0  0  0  0  0  0 -1  0
+  1  0  0  0  0  0  0  0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cubetop.ine b/demos/ppl_lcdd/examples/cubetop.ine
new file mode 100644
index 0000000..bc0b835
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cubetop.ine
@@ -0,0 +1,12 @@
+* top facet of cube
+linearity 1 3
+H-representation
+begin
+6  4 integer
+ 1 -1  0  0
+ 1  0 -1  0
+ 1  0  0 -1
+ 0  1  0  0
+ 0  0  1  0
+ 0  0  0  1
+end
diff --git a/demos/ppl_lcdd/examples/cubocta.ine b/demos/ppl_lcdd/examples/cubocta.ine
new file mode 100644
index 0000000..d467383
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cubocta.ine
@@ -0,0 +1,19 @@
+* Cuboctahedron
+H-representation
+begin
+  14    4   integer
+   1  1  0  0
+   1  0  1  0
+   1  0  0  1
+   1 -1  0  0
+   1  0 -1  0
+   1  0  0 -1
+   2  1  1  1
+   2 -1  1  1
+   2  1 -1  1
+   2  1  1 -1
+   2 -1 -1  1
+   2  1 -1 -1
+   2 -1  1 -1
+   2 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cut16_11.ext b/demos/ppl_lcdd/examples/cut16_11.ext
new file mode 100644
index 0000000..c7370ff
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cut16_11.ext
@@ -0,0 +1,21 @@
+* 5 point cut polytope
+V-representation
+begin
+16 11 integer
+1 1 1 -1 -1 -1 1 1 1 1 -1
+1 -1 -1 -1 1 -1 -1 1 -1 1 1
+1 -1 -1 1 -1 -1 1 -1 1 -1 1
+1 -1 1 -1 -1 1 -1 -1 1 1 -1
+1 1 -1 -1 -1 1 1 1 -1 -1 -1
+1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+1 1 1 1 1 -1 -1 -1 -1 -1 -1
+1 -1 1 1 1 1 1 1 -1 -1 -1
+1 1 -1 1 1 1 -1 -1 1 1 -1
+1 1 1 -1 1 -1 1 -1 1 -1 1
+1 1 1 1 -1 -1 -1 1 -1 1 1
+1 -1 -1 1 1 -1 1 1 1 1 -1
+1 -1 1 -1 1 1 -1 1 1 -1 1
+1 -1 1 1 -1 1 1 -1 -1 1 1
+1 1 -1 -1 1 1 1 -1 -1 1 1
+1 1 -1 1 -1 1 -1 1 1 -1 1
+end
diff --git a/demos/ppl_lcdd/examples/cut32_16.ext b/demos/ppl_lcdd/examples/cut32_16.ext
new file mode 100644
index 0000000..5d68397
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cut32_16.ext
@@ -0,0 +1,37 @@
+* 6 point cut polytope
+V-representation
+begin
+  32  16   integer
+1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+1  1  1  1  1  1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1
+1  -1  1  1  1  1  1  1  1  1  -1  -1  -1  -1  -1  -1
+1  1  -1  1  1  1  1  -1  -1  -1  1  1  1  -1  -1  -1
+1  1  1  -1  1  1  -1  1  -1  -1  1  -1  -1  1  1  -1
+1  1  1  1  -1  1  -1  -1  1  -1  -1  1  -1  1  -1  1
+1  1  1  1  1  -1  -1  -1  -1  1  -1  -1  1  -1  1  1
+1  -1  -1  1  1  1  -1  1  1  1  1  1  1  -1  -1  -1
+1  -1  1  -1  1  1  1  -1  1  1  1  -1  -1  1  1  -1
+1  -1  1  1  -1  1  1  1  -1  1  -1  1  -1  1  -1  1
+1  -1  1  1  1  -1  1  1  1  -1  -1  -1  1  -1  1  1
+1  1  -1  -1  1  1  1  1  -1  -1  -1  1  1  1  1  -1
+1  1  -1  1  -1  1  1  -1  1  -1  1  -1  1  1  -1  1
+1  1  -1  1  1  -1  1  -1  -1  1  1  1  -1  -1  1  1
+1  1  1  -1  -1  1  -1  1  1  -1  1  1  -1  -1  1  1
+1  1  1  -1  1  -1  -1  1  -1  1  1  -1  1  1  -1  1
+1  1  1  1  -1  -1  -1  -1  1  1  -1  1  1  1  1  -1
+1  -1  -1  -1  1  1  -1  -1  1  1  -1  1  1  1  1  -1
+1  -1  -1  1  -1  1  -1  1  -1  1  1  -1  1  1  -1  1
+1  -1  -1  1  1  -1  -1  1  1  -1  1  1  -1  -1  1  1
+1  -1  1  -1  -1  1  1  -1  -1  1  1  1  -1  -1  1  1
+1  -1  1  -1  1  -1  1  -1  1  -1  1  -1  1  1  -1  1
+1  -1  1  1  -1  -1  1  1  -1  -1  -1  1  1  1  1  -1
+1  1  -1  -1  -1  1  1  1  1  -1  -1  -1  1  -1  1  1
+1  1  -1  -1  1  -1  1  1  -1  1  -1  1  -1  1  -1  1
+1  1  -1  1  -1  -1  1  -1  1  1  1  -1  -1  1  1  -1
+1  1  1  -1  -1  -1  -1  1  1  1  1  1  1  -1  -1  -1
+1  -1  -1  -1  -1  1  -1  -1  -1  1  -1  -1  1  -1  1  1
+1  -1  -1  -1  1  -1  -1  -1  1  -1  -1  1  -1  1  -1  1
+1  -1  -1  1  -1  -1  -1  1  -1  -1  1  -1  -1  1  1  -1
+1  -1  1  -1  -1  -1  1  -1  -1  -1  1  1  1  -1  -1  -1
+1  1  -1  -1  -1  -1  1  1  1  1  -1  -1  -1  -1  -1  -1
+end
diff --git a/demos/ppl_lcdd/examples/cyc.ine b/demos/ppl_lcdd/examples/cyc.ine
new file mode 100644
index 0000000..9eeadd9
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyc.ine
@@ -0,0 +1,10 @@
+* cyclic polytope: 5 vertices in R^3
+V-representation
+begin
+5 4 integer
+1 1 1 1
+1 2 4 8
+1 3 9 27
+1 4 16 64
+1 5 25 125
+end
diff --git a/demos/ppl_lcdd/examples/cyclic10-4.ext b/demos/ppl_lcdd/examples/cyclic10-4.ext
new file mode 100644
index 0000000..84629a5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic10-4.ext
@@ -0,0 +1,16 @@
+* 3-dim cyclic polytope with 10 vertices
+* Number of facets (outputs) =16
+V-representation
+begin
+10  4  integer
+  1  1  1  1
+  1  2  4  8
+  1  3  9  27
+  1  4  16  64
+  1  5  25  125
+  1  6  36  216
+  1  7  49  343
+  1  8  64  512
+  1  9  81  729
+  1  10  100  1000
+end
diff --git a/demos/ppl_lcdd/examples/cyclic12-6.ext b/demos/ppl_lcdd/examples/cyclic12-6.ext
new file mode 100644
index 0000000..4dfa2f6
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic12-6.ext
@@ -0,0 +1,18 @@
+* 5-dim cyclic polytope with12 vertices
+* Number of facets (outputs) =72
+V-representation
+begin
+12  6  integer
+  1  1  1  1  1  1
+  1  2  4  8  16  32
+  1  3  9  27  81  243
+  1  4  16  64  256  1024
+  1  5  25  125  625  3125
+  1  6  36  216  1296  7776
+  1  7  49  343  2401  16807
+  1  8  64  512  4096  32768
+  1  9  81  729  6561  59049
+  1  10  100  1000  10000  100000
+  1  11  121  1331  14641  161051
+  1  12  144  1728  20736  248832
+end
diff --git a/demos/ppl_lcdd/examples/cyclic14-8.ext b/demos/ppl_lcdd/examples/cyclic14-8.ext
new file mode 100644
index 0000000..df59976
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic14-8.ext
@@ -0,0 +1,20 @@
+* 7-dim cyclic polytope with 14 vertices
+* Number of facets (outputs) =240
+V-representation
+begin
+14  8  integer
+  1  1  1  1  1  1  1  1
+  1  2  4  8  16  32  64  128
+  1  3  9  27  81  243  729  2187
+  1  4  16  64  256  1024  4096  16384
+  1  5  25  125  625  3125  15625  78125
+  1  6  36  216  1296  7776  46656  279936
+  1  7  49  343  2401  16807  117649  823543
+  1  8  64  512  4096  32768  262144  2097152
+  1  9  81  729  6561  59049  531441  4782969
+  1  10  100  1000  10000  100000  1000000  10000000
+  1  11  121  1331  14641  161051  1771561  19487171
+  1  12  144  1728  20736  248832  2985984  35831808
+  1  13  169  2197  28561  371293  4826809  62748517
+  1  14  196  2744  38416  537824  7529536  105413504
+end
diff --git a/demos/ppl_lcdd/examples/cyclic16-10.ext b/demos/ppl_lcdd/examples/cyclic16-10.ext
new file mode 100644
index 0000000..c7d90da
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic16-10.ext
@@ -0,0 +1,23 @@
+* 9-dim cyclic polytope with 16 vertices
+* Number of facets (outputs) =660
+* This must be computed with exact arithmetic
+V-representation
+begin
+16  10  integer
+  1  1  1  1  1  1  1  1  1  1
+  1  2  4  8  16  32  64  128  256  512
+  1  3  9  27  81  243  729  2187  6561  19683
+  1  4  16  64  256  1024  4096  16384  65536  262144
+  1  5  25  125  625  3125  15625  78125  390625  1953125
+  1  6  36  216  1296  7776  46656  279936  1679616  10077696
+  1  7  49  343  2401  16807  117649  823543  5764801  40353607
+  1  8  64  512  4096  32768  262144  2097152  16777216  134217728
+  1  9  81  729  6561  59049  531441  4782969  43046721  387420489
+  1  10  100  1000  10000  100000  1000000  10000000  100000000  1000000000
+  1  11  121  1331  14641  161051  1771561  19487171  214358881  2357947691
+  1  12  144  1728  20736  248832  2985984  35831808  429981696  5159780352
+  1  13  169  2197  28561  371293  4826809  62748517  815730721  10604499373
+  1  14  196  2744  38416  537824  7529536  105413504  1475789056 20661046784
+  1  15  225  3375  50625  759375  11390625  170859375  2562890625 38443359375
+  1  16  256  4096  65536  1048576  16777216  268435456  4294967296 68719476736
+end
diff --git a/demos/ppl_lcdd/examples/cyclic17_8.ine b/demos/ppl_lcdd/examples/cyclic17_8.ine
new file mode 100644
index 0000000..af885fc
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic17_8.ine
@@ -0,0 +1,20 @@
+begin
+17 9 integer
+1   -72   516   -4608   36156   -294912   2349516   -18874368   150850236
+1   -63   381   -3087   20901   -151263   1049061   -7411887   51738501
+1   -54   264   -1944   10956   -69984   410124   -2519424   14971836
+1   -45   165   -1125   4917   -28125   130845   -703125   3370917
+1   -36   84   -576   1596   -9216   27084   -147456   445116
+1   -27   21   -243   21   -2187   -3219   -19683   -85659
+1   -18   -24   -72   -564   -288   -9204   -1152   -142404
+1   -9   -51   -9   -699   -9   -9771   -9   -144699
+1   0   -60   0   -708   0   -9780   0   -144708
+1   9   -51   9   -699   9   -9771   9   -144699
+1   18   -24   72   -564   288   -9204   1152   -142404
+1   27   21   243   21   2187   -3219   19683   -85659
+1   36   84   576   1596   9216   27084   147456   445116
+1   45   165   1125   4917   28125   130845   703125   3370917
+1   54   264   1944   10956   69984   410124   2519424   14971836
+1   63   381   3087   20901   151263   1049061   7411887   51738501
+1   72   516   4608   36156   294912   2349516   18874368   150850236
+end
diff --git a/demos/ppl_lcdd/examples/cyclic25_13.ext b/demos/ppl_lcdd/examples/cyclic25_13.ext
new file mode 100644
index 0000000..fdd1448
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic25_13.ext
@@ -0,0 +1,54 @@
+H-representation
+begin
+25 13 integer
+1   -156   1690   -22464   265018   -3234816   38683450   -465813504
+5585476858   -67077144576   804783054010   -9659108818944   115904429355898
+1   -143   1391   -17303   185783   -2093663   22895951   -253333223
+2782380263   -30653319983   337043838911   -3709051717943   40794692425943
+1   -130   1118   -13000   125450   -1300000   12865658   -130000000
+1295714810   -13000000000   129857319098   -1300000000000   12995123528570
+1   -117   871   -9477   80743   -767637   6774391   -62178597   555322183
+-5036466357   45185516311   -407953774917   3666707502823
+1   -104   650   -6656   48698   -425984   3273530   -27262976   213818618
+-1744830464   13815962810   -111669149696   888476726138
+1   -91   455   -4459   26663   -218491   1395095   -10706059   70657223
+-524596891   3529497335   -25705247659   175060262183
+1   -78   286   -2808   12298   -101088   472186   -3639168   17549818
+-131010048   643379386   -4716361728   23421698938
+1   -65   143   -1625   3575   -40625   68783   -1015625   792935   -25390625
+   -15727777   -634765625   -1702643305
+1   -52   26   -832   -1222   -13312   -81094   -212992   -3433222   -3407872
+   -129049414   -54525952   -4658367622
+1   -39   -65   -351   -3497   -3159   -124865   -28431   -4199897   -255879
+-141913265   -2302911   -4869562697
+1   -26   -130   -104   -4342   -416   -133510   -1664   -4281862   -6656
+-142667590   -26624   -4876418182
+1   -13   -169   -13   -4537   -13   -134329   -13   -4285177   -13
+-142680889   -13   -4876471417
+1   0   -182   0   -4550   0   -134342   0   -4285190   0   -142680902   0
+-4876471430
+1   13   -169   13   -4537   13   -134329   13   -4285177   13   -142680889
+13   -4876471417
+1   26   -130   104   -4342   416   -133510   1664   -4281862   6656
+-142667590   26624   -4876418182
+1   39   -65   351   -3497   3159   -124865   28431   -4199897   255879
+-141913265   2302911   -4869562697
+1   52   26   832   -1222   13312   -81094   212992   -3433222   3407872
+-129049414   54525952   -4658367622
+1   65   143   1625   3575   40625   68783   1015625   792935   25390625
+-15727777   634765625   -1702643305
+1   78   286   2808   12298   101088   472186   3639168   17549818   131010048
+   643379386   4716361728   23421698938
+1   91   455   4459   26663   218491   1395095   10706059   70657223
+524596891   3529497335   25705247659   175060262183
+1   104   650   6656   48698   425984   3273530   27262976   213818618
+1744830464   13815962810   111669149696   888476726138
+1   117   871   9477   80743   767637   6774391   62178597   555322183
+5036466357   45185516311   407953774917   3666707502823
+1   130   1118   13000   125450   1300000   12865658   130000000   1295714810
+   13000000000   129857319098   1300000000000   12995123528570
+1   143   1391   17303   185783   2093663   22895951   253333223   2782380263
+   30653319983   337043838911   3709051717943   40794692425943
+1   156   1690   22464   265018   3234816   38683450   465813504   5585476858
+   67077144576   804783054010   9659108818944   115904429355898
+end
diff --git a/demos/ppl_lcdd/examples/dcube10.ext b/demos/ppl_lcdd/examples/dcube10.ext
new file mode 100644
index 0000000..67db319
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube10.ext
@@ -0,0 +1,24 @@
+V-representation
+begin
+20 11 rational
+1 0 0 0 0 0 0 0 0 0 1
+1 0 0 0 0 0 0 0 0 0 -1
+1 0 0 0 0 0 0 0 0 1 0
+1 0 0 0 0 0 0 0 0 -1 0
+1 0 0 0 0 0 0 0 1 0 0
+1 0 0 0 0 0 0 0 -1 0 0
+1 0 0 0 0 0 0 1 0 0 0
+1 0 0 0 0 0 0 -1 0 0 0
+1 0 0 0 0 0 1 0 0 0 0
+1 0 0 0 0 0 -1 0 0 0 0
+1 0 0 0 0 1 0 0 0 0 0
+1 0 0 0 0 -1 0 0 0 0 0
+1 0 0 0 1 0 0 0 0 0 0
+1 0 0 0 -1 0 0 0 0 0 0
+1 0 0 1 0 0 0 0 0 0 0
+1 0 0 -1 0 0 0 0 0 0 0
+1 0 1 0 0 0 0 0 0 0 0
+1 0 -1 0 0 0 0 0 0 0 0
+1 1 0 0 0 0 0 0 0 0 0
+1 -1 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/dcube12.ext b/demos/ppl_lcdd/examples/dcube12.ext
new file mode 100644
index 0000000..0e4b7f5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube12.ext
@@ -0,0 +1,28 @@
+V-representation
+begin
+24 13 rational
+1 0 0 0 0 0 0 0 0 0 0 0 1
+1 0 0 0 0 0 0 0 0 0 0 0 -1
+1 0 0 0 0 0 0 0 0 0 0 1 0
+1 0 0 0 0 0 0 0 0 0 0 -1 0
+1 0 0 0 0 0 0 0 0 0 1 0 0
+1 0 0 0 0 0 0 0 0 0 -1 0 0
+1 0 0 0 0 0 0 0 0 1 0 0 0
+1 0 0 0 0 0 0 0 0 -1 0 0 0
+1 0 0 0 0 0 0 0 1 0 0 0 0
+1 0 0 0 0 0 0 0 -1 0 0 0 0
+1 0 0 0 0 0 0 1 0 0 0 0 0
+1 0 0 0 0 0 0 -1 0 0 0 0 0
+1 0 0 0 0 0 1 0 0 0 0 0 0
+1 0 0 0 0 0 -1 0 0 0 0 0 0
+1 0 0 0 0 1 0 0 0 0 0 0 0
+1 0 0 0 0 -1 0 0 0 0 0 0 0
+1 0 0 0 1 0 0 0 0 0 0 0 0
+1 0 0 0 -1 0 0 0 0 0 0 0 0
+1 0 0 1 0 0 0 0 0 0 0 0 0
+1 0 0 -1 0 0 0 0 0 0 0 0 0
+1 0 1 0 0 0 0 0 0 0 0 0 0
+1 0 -1 0 0 0 0 0 0 0 0 0 0
+1 1 0 0 0 0 0 0 0 0 0 0 0
+1 -1 0 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/dcube3.ext b/demos/ppl_lcdd/examples/dcube3.ext
new file mode 100644
index 0000000..5702d28
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube3.ext
@@ -0,0 +1,10 @@
+V-representation
+begin
+6 4 rational
+1 0 0 1
+1 0 0 -1
+1 0 1 0
+1 0 -1 0
+1 1 0 0
+1 -1 0 0
+end
diff --git a/demos/ppl_lcdd/examples/dcube6.ext b/demos/ppl_lcdd/examples/dcube6.ext
new file mode 100644
index 0000000..43861a0
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube6.ext
@@ -0,0 +1,16 @@
+V-representation
+begin
+12 7 rational
+1 0 0 0 0 0 1
+1 0 0 0 0 0 -1
+1 0 0 0 0 1 0
+1 0 0 0 0 -1 0
+1 0 0 0 1 0 0
+1 0 0 0 -1 0 0
+1 0 0 1 0 0 0
+1 0 0 -1 0 0 0
+1 0 1 0 0 0 0
+1 0 -1 0 0 0 0
+1 1 0 0 0 0 0
+1 -1 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/dcube8.ext b/demos/ppl_lcdd/examples/dcube8.ext
new file mode 100644
index 0000000..d151797
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube8.ext
@@ -0,0 +1,20 @@
+V-representation
+begin
+16 9 rational
+1 0 0 0 0 0 0 0 1
+1 0 0 0 0 0 0 0 -1
+1 0 0 0 0 0 0 1 0
+1 0 0 0 0 0 0 -1 0
+1 0 0 0 0 0 1 0 0
+1 0 0 0 0 0 -1 0 0
+1 0 0 0 0 1 0 0 0
+1 0 0 0 0 -1 0 0 0
+1 0 0 0 1 0 0 0 0
+1 0 0 0 -1 0 0 0 0
+1 0 0 1 0 0 0 0 0
+1 0 0 -1 0 0 0 0 0
+1 0 1 0 0 0 0 0 0
+1 0 -1 0 0 0 0 0 0
+1 1 0 0 0 0 0 0 0
+1 -1 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/diamond.ine b/demos/ppl_lcdd/examples/diamond.ine
new file mode 100644
index 0000000..8522f1c
--- /dev/null
+++ b/demos/ppl_lcdd/examples/diamond.ine
@@ -0,0 +1,10 @@
+* Unit diamond centred at origin
+* Last two inequalities define vertex (-1/2,0)
+begin
+4 3 rational
+1/2 -1 -1
+1/2 -1  1
+1/2  1 -1
+1/2  1  1
+end
+
diff --git a/demos/ppl_lcdd/examples/dodeca_m.ine b/demos/ppl_lcdd/examples/dodeca_m.ine
new file mode 100644
index 0000000..6599d78
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dodeca_m.ine
@@ -0,0 +1,17 @@
+* dodecahedron inequalities
+H-representation
+begin
+12 4 integer
+562949953421312 -562949953421312 0 -347922205179541
+562949953421312 -562949953421312 0 347922205179541
+562949953421312 -347922205179541 -562949953421312 0
+562949953421312 -347922205179541 562949953421312 0
+562949953421312 0 -347922205179541 -562949953421312
+562949953421312 0 -347922205179541 562949953421312
+562949953421312 0 347922205179541 -562949953421312
+562949953421312 0 347922205179541 562949953421312
+562949953421312 347922205179541 -562949953421312 0
+562949953421312 347922205179541 562949953421312 0
+562949953421312 562949953421312 0 -347922205179541
+562949953421312 562949953421312 0 347922205179541
+end
diff --git a/demos/ppl_lcdd/examples/ex1.ine b/demos/ppl_lcdd/examples/ex1.ine
new file mode 100644
index 0000000..790b897
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ex1.ine
@@ -0,0 +1,10 @@
+* 2 dimensional polyhedron with three vertices (0,3), (-1, 4) and (-1,10) and
+* two extremal rays (2,1) and (1,2).
+H-representation
+begin
+  4   3   integer
+ 12   2  -1
+ -6  -1   2
+ -3   1   1
+  1   1   0
+end
diff --git a/demos/ppl_lcdd/examples/grcubocta.ine b/demos/ppl_lcdd/examples/grcubocta.ine
new file mode 100644
index 0000000..9fd74c4
--- /dev/null
+++ b/demos/ppl_lcdd/examples/grcubocta.ine
@@ -0,0 +1,31 @@
+* Great rhombicuboctahedron
+H-representation
+begin
+  26    4   integer
+   1  1  0  0
+   1  0  1  0
+   1  0  0  1
+   1 -1  0  0
+   1  0 -1  0
+   1  0  0 -1
+   2  1  1  1
+   2 -1  1  1
+   2  1 -1  1
+   2  1  1 -1
+   2 -1 -1  1
+   2  1 -1 -1
+   2 -1  1 -1
+   2 -1 -1 -1
+   5  3  3  0
+   5  0  3  3
+   5  3  0  3
+   5 -3  3  0
+   5  0 -3  3
+   5  3  0 -3
+   5  3 -3  0
+   5  0  3 -3
+   5 -3  0  3
+   5 -3 -3  0
+   5  0 -3 -3
+   5 -3  0 -3
+end
diff --git a/demos/ppl_lcdd/examples/hexocta.ine b/demos/ppl_lcdd/examples/hexocta.ine
new file mode 100644
index 0000000..57ffede
--- /dev/null
+++ b/demos/ppl_lcdd/examples/hexocta.ine
@@ -0,0 +1,54 @@
+* Hexakis octahedron
+H-representation
+begin
+ 48  4  integer
+  3 -3  1 -2
+  3 -2 -1 -3
+  3 -2  1 -3
+  3 -3 -1 -2
+  3 -2  3 -1
+  3 -2  3  1
+  3 -3  2 -1
+  3 -3  2  1
+  3  1 -3  2
+  3  1 -2  3
+  3 -1 -3  2
+  3 -1 -2  3
+  3  1  2  3
+  3  1  3  2
+  3 -1  2  3
+  3 -1  3  2
+  3  3  1 -2
+  3  2 -1 -3
+  3  3 -1 -2
+  3  2  1 -3
+  3  2  3 -1
+  3  3  2 -1
+  3  2  3  1
+  3  3  2  1
+  3  2  1  3
+  3  3 -1  2
+  3  2 -1  3
+  3  3  1  2
+  3  2 -3  1
+  3  2 -3 -1
+  3  3 -2  1
+  3  3 -2 -1
+  3 -1  3 -2
+  3 -1  2 -3
+  3  1  3 -2
+  3  1  2 -3
+  3 -1 -2 -3
+  3 -1 -3 -2
+  3  1 -2 -3
+  3  1 -3 -2
+  3 -3 -1  2
+  3 -2  1  3
+  3 -2 -1  3
+  3 -3  1  2
+  3 -2 -3  1
+  3 -2 -3 -1
+  3 -3 -2  1
+  3 -3 -2 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/icododeca_m.ine b/demos/ppl_lcdd/examples/icododeca_m.ine
new file mode 100644
index 0000000..3f095ec
--- /dev/null
+++ b/demos/ppl_lcdd/examples/icododeca_m.ine
@@ -0,0 +1,39 @@
+* Icosidodecahedron
+% rational numbers appearing here are [approximations of]
+% -3-5^(1/2), -1-5^(1/2) and their negatives.
+H-representation
+begin
+32 4 integer
+2251799813685248 -11790576896177794 -7286977268807297 0
+2251799813685248 -11790576896177794 7286977268807297 0
+2251799813685248 -7286977268807297 -7286977268807297 -7286977268807297
+2251799813685248 -7286977268807297 -7286977268807297 7286977268807297
+2251799813685248 -7286977268807297 0 -11790576896177794
+2251799813685248 -7286977268807297 0 11790576896177794
+2251799813685248 -7286977268807297 7286977268807297 -7286977268807297
+2251799813685248 -7286977268807297 7286977268807297 7286977268807297
+1125899906842624 -5895288448088897 0 -2251799813685248
+1125899906842624 -5895288448088897 0 2251799813685248
+1125899906842624 -2251799813685248 -5895288448088897 0
+1125899906842624 -2251799813685248 5895288448088897 0
+2251799813685248 0 -11790576896177794 -7286977268807297
+2251799813685248 0 -11790576896177794 7286977268807297
+1125899906842624 0 -2251799813685248 -5895288448088897
+1125899906842624 0 -2251799813685248 5895288448088897
+1125899906842624 0 2251799813685248 -5895288448088897
+1125899906842624 0 2251799813685248 5895288448088897
+2251799813685248 0 11790576896177794 -7286977268807297
+2251799813685248 0 11790576896177794 7286977268807297
+1125899906842624 2251799813685248 -5895288448088897 0
+1125899906842624 2251799813685248 5895288448088897 0
+1125899906842624 5895288448088897 0 -2251799813685248
+1125899906842624 5895288448088897 0 2251799813685248
+2251799813685248 7286977268807297 -7286977268807297 -7286977268807297
+2251799813685248 7286977268807297 -7286977268807297 7286977268807297
+2251799813685248 7286977268807297 0 -11790576896177794
+2251799813685248 7286977268807297 0 11790576896177794
+2251799813685248 7286977268807297 7286977268807297 -7286977268807297
+2251799813685248 7286977268807297 7286977268807297 7286977268807297
+2251799813685248 11790576896177794 -7286977268807297 0
+2251799813685248 11790576896177794 7286977268807297 0
+end
diff --git a/demos/ppl_lcdd/examples/in0.ine b/demos/ppl_lcdd/examples/in0.ine
new file mode 100644
index 0000000..8c3d751
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in0.ine
@@ -0,0 +1,11 @@
+begin
+8 6 integer
+9 -2 -3 -3 -2 -2
+9 -2 0 0 2 0
+9 -2 -1 -1 -1 -3
+0 1 0 0 0 0
+0 0 1 0 0 0
+0 0 0 1 0 0
+0 0 0 0 1 0
+0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in1.ine b/demos/ppl_lcdd/examples/in1.ine
new file mode 100644
index 0000000..e231e52
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in1.ine
@@ -0,0 +1,37 @@
+begin
+34 5 integer
+1 -299 -534 815 807
+1 -887 -399 -867 -543
+1 683 632 958 -181
+1 -756 681 -658 470
+1 -99 135 -921 -825
+1 -795 -874 -286 732
+1 43 -567 588 -143
+1 -955 414 -159 -378
+1 -235 -695 947 166
+1 957 853 -194 -258
+1 487 -914 -100 -991
+1 -515 -786 -169 200
+1 954 -758 -178 985
+1 505 -970 400 -211
+1 714 997 401 661
+1 -475 618 459 775
+1 -219 704 -111 -876
+1 152 -390 -629 984
+1 -240 -621 -62 583
+1 -76 531 -606 -676
+1 490 -519 -240 -109
+1 -635 860 -798 825
+1 5 49 781 895
+1 495 490 -774 866
+1 -78 69 853 861
+1 -340 228 -374 498
+1 390 -12 -524 -408
+1 -382 -42 -376 264
+1 -299 -731 -283 -518
+1 892 -581 654 -439
+0 1 0 0 0
+0 0 1 0 0
+0 0 0 1 0
+0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in2.ine b/demos/ppl_lcdd/examples/in2.ine
new file mode 100644
index 0000000..cb49112
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in2.ine
@@ -0,0 +1,19 @@
+begin
+16 6 integer
+1 -1 0 -1 0 0
+1 -1 0 0 0 -1
+1 0 -1 -1 0 0
+1 0 -1 0 -1 0
+1 0 0 0 -1 -1
+0 -1 1 0 0 1
+0 1 -1 0 1 0
+0 0 0 -1 1 1
+0 0 1 1 -1 0
+0 1 0 1 0 -1
+2 -1 -1 -1 -1 -1
+0 1 0 0 0 0
+0 0 1 0 0 0
+0 0 0 1 0 0
+0 0 0 0 1 0
+0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in3.ine b/demos/ppl_lcdd/examples/in3.ine
new file mode 100644
index 0000000..a5db732
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in3.ine
@@ -0,0 +1,16 @@
+begin
+13 7 integer
+0 1 -1 0 1 0 0
+0 0 -1 1 0 0 1
+0 -1 1 0 1 0 0
+0 -1 0 1 0 1 0
+0 0 1 -1 0 0 1
+0 1 1 0 -1 0 0
+0 0 0 0 -1 1 1
+0 1 0 1 0 -1 0
+0 0 0 0 1 -1 1
+0 0 1 1 0 0 -1
+0 0 0 0 1 1 -1
+0 1 0 -1 0 1 0
+12 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/in4.ine b/demos/ppl_lcdd/examples/in4.ine
new file mode 100644
index 0000000..8c11b95
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in4.ine
@@ -0,0 +1,15 @@
+begin
+12 8 integer
+10 -8 -1 -2 -3 -3 -2 -2
+10 8 -2 -2 0 0 2 0
+10 -11 3 -2 -1 -1 -1 -3
+5 23 -4 -2 -3 0 0 1
+27 5 -4 -1 3 9 11 -12
+0 1 0 0 0 0 0 0
+0 0 1 0 0 0 0 0
+0 0 0 1 0 0 0 0
+0 0 0 0 1 0 0 0
+0 0 0 0 0 1 0 0
+0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in5.ine b/demos/ppl_lcdd/examples/in5.ine
new file mode 100644
index 0000000..e429d0b
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in5.ine
@@ -0,0 +1,17 @@
+begin
+14 10 integer
+10 2 3 -8 -1 -2 -3 -3 -2 -2
+10 -6 33 8 -2 -2 0 0 2 0
+10 93 3 -11 3 -2 -1 -1 -1 -3
+5 -9 21 23 -4 -2 -3 0 0 1
+27 31 23 5 -4 -1 3 9 11 -12
+0 1 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in6.ine b/demos/ppl_lcdd/examples/in6.ine
new file mode 100644
index 0000000..faa493a
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in6.ine
@@ -0,0 +1,26 @@
+begin
+23 11 integer
+1 1 1 1 1 1 1 1 1 1 0
+2 -2 -3 8 1 2 3 3 2 2 -9
+3 6 -3 -8 2 2 0 0 -2 0 -9
+4 -9 -3 1 -3 2 1 1 1 3 -9
+5 9 -2 -2 4 2 3 0 0 -1 -5
+6 -3 -2 -5 4 1 -3 -9 -1 2 -7
+7 -9 -3 -5 -2 2 4 -2 4 -1 -7
+8 -8 -4 5 -2 2 4 -2 4 -1 -7
+9 -7 -5 -5 -2 2 4 -2 4 -1 -7
+10 -6 -6 5 -2 2 4 -2 4 -1 -7
+11 -5 -7 -5 -2 2 4 -2 4 -1 -7
+12 -4 -8 5 -2 2 4 -2 4 -1 -7
+13 -3 -9 -5 -2 2 4 -2 4 -1 -7
+0 1 0 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in7.ine b/demos/ppl_lcdd/examples/in7.ine
new file mode 100644
index 0000000..5e82762
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in7.ine
@@ -0,0 +1,23 @@
+begin
+20 11 integer
+10000 -915 -828 -303 -632 -786 -231 -12 -568 -351 -308
+10000 -930 -217 -480 -704 -700 -91 -441 -927 -33 -330
+10000 -765 -616 -962 -274 -276 -39 -924 -541 -444 -838
+10000 -747 -470 -506 -329 -481 -425 -679 -140 -764 -960
+10000 -243 -664 -760 -333 -456 -686 -717 -137 -721 -833
+10000 -682 -107 -380 -720 -382 -920 -164 -220 -640 -262
+10000 -145 -942 -873 -570 -973 -365 -685 -932 -424 -928
+10000 -183 -612 -402 -869 -681 -539 -941 -513 -290 -622
+10000 -669 -694 -353 -941 -209 -572 -580 -822 -964 -725
+10000 -188 -646 -87 -552 -330 -19 -976 -609 -965 -158
+0 1 0 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/infeas.ine b/demos/ppl_lcdd/examples/infeas.ine
new file mode 100644
index 0000000..0f2a496
--- /dev/null
+++ b/demos/ppl_lcdd/examples/infeas.ine
@@ -0,0 +1,18 @@
+* The empty polytope. No vertices and rays.
+H-representation
+begin
+   13   7   integer
+ 0  1  0  0  0  0  0
+ 0  0  1  0  0  0  0
+ 0  0  0  1  0  0  0
+ 0  0  0  0  1  0  0
+ 0  0  0  0  0  1  0
+ 0  0  0  0  0  0  1
+ 1 -1  0  0  0  0  0
+ 1  0 -1  0  0  0  0
+ 1  0  0 -1  0  0  0
+ 1  0  0  0 -1  0  0
+ 1  0  0  0  0 -1  0
+ 1  0  0  0  0  0  -1
+ -2 1  0  0  0  0   0
+end
diff --git a/demos/ppl_lcdd/examples/integralpoints.ine b/demos/ppl_lcdd/examples/integralpoints.ine
new file mode 100644
index 0000000..8f75e27
--- /dev/null
+++ b/demos/ppl_lcdd/examples/integralpoints.ine
@@ -0,0 +1,36 @@
+* This input file is an example for generating
+* integral solutions to the following system of linear inequalities:
+* 10 x1 + 7 x2  <= 70
+* 11 x1 + 5 x2  >= 55
+*    x1 >= 0,  x2 >= 0
+* By using the fact that  0<=x1<=7 and 0<=x2<=10, we apply
+* the (binary representation) substitution:
+    x1 =         4 x13 + 2 x12 + x11  (all binary variables)
+    x2 = 8 x24 + 4 x23 + 2 x22 + x21  (all binary variables)
+* The reduced system of linear inequalities is the input data.
+* Since all integral (i.e. 0-1) solutions are extreme points,
+* the integral extreme points are in one-to-one correspondence
+* with the integral solutions to the original system.  In this
+* example, there are 194 extreme points among which 10 are
+* integral (0-1) solutions.
+
+H-representation
+begin
+ 16  8   integer
+ 0  1  0  0  0  0  0  0
+ 0  0  1  0  0  0  0  0
+ 0  0  0  1  0  0  0  0
+ 0  0  0  0  1  0  0  0
+ 0  0  0  0  0  1  0  0
+ 0  0  0  0  0  0  1  0
+ 0  0  0  0  0  0  0  1
+ 1 -1  0  0  0  0  0  0
+ 1  0 -1  0  0  0  0  0
+ 1  0  0 -1  0  0  0  0
+ 1  0  0  0 -1  0  0  0
+ 1  0  0  0  0 -1  0  0
+ 1  0  0  0  0  0 -1  0
+ 1  0  0  0  0  0  0 -1
+  70 -40 -20 -10 -56 -28 -14 -7
+ -55  44  22  11  40  20  10  5
+end
diff --git a/demos/ppl_lcdd/examples/irbox20-4.ext b/demos/ppl_lcdd/examples/irbox20-4.ext
new file mode 100644
index 0000000..8fba299
--- /dev/null
+++ b/demos/ppl_lcdd/examples/irbox20-4.ext
@@ -0,0 +1,25 @@
+* Randomly generated 20 integral points in [-100..100]^3
+V-representation
+begin
+  20   4   integer
+  1    -45      1     47
+  1    -34     19      4
+  1      5    -11     28
+  1     17    -43     17
+  1    -46      8    -15
+  1     35    -26     -6
+  1     41     -3     -8
+  1    -39     41     34
+  1    -46     49     40
+  1    -18    -29     46
+  1    -20    -25     -2
+  1    -22     -9    -32
+  1     31     46      5
+  1     10     14     11
+  1    -22     17    -29
+  1     12      3     -5
+  1    -44     -5     40
+  1     -2      4     32
+  1    -18      8     31
+  1    -27     40    -48
+end
diff --git a/demos/ppl_lcdd/examples/irbox200-4.ext b/demos/ppl_lcdd/examples/irbox200-4.ext
new file mode 100644
index 0000000..d218b33
--- /dev/null
+++ b/demos/ppl_lcdd/examples/irbox200-4.ext
@@ -0,0 +1,205 @@
+* Randomly generated 200 integral points in [-100..100]^3
+V-representation
+begin
+  200   4   integer
+  1     12    -49      2
+  1    -38     25     -3
+  1    -26     39     -7
+  1    -25     28     44
+  1    -20    -41    -31
+  1     49     45     28
+  1    -42     12    -25
+  1     -9    -31    -20
+  1     49      5     33
+  1     15     34     30
+  1    -18     -3     31
+  1     34      8      6
+  1    -19     31     -4
+  1     23    -44    -25
+  1     17    -14    -16
+  1     36    -14    -20
+  1     15     -7     42
+  1     39     33    -39
+  1    -30     33     15
+  1    -46     -1      0
+  1     33     30     47
+  1     14     14      5
+  1    -28     45    -13
+  1     17     18     -7
+  1     41    -13     27
+  1    -24    -27    -36
+  1      5     37      5
+  1     -2     27    -11
+  1      7     47    -28
+  1    -26    -49     20
+  1     24     34      0
+  1     21      0    -35
+  1    -23     20    -39
+  1     13    -12     28
+  1    -44    -20    -35
+  1     33      4    -12
+  1     46    -39    -25
+  1      2      7    -47
+  1     41    -34     49
+  1    -36    -11    -49
+  1     33    -37     34
+  1    -16     34    -15
+  1     -1    -39    -45
+  1      8     23     -8
+  1    -12     29     21
+  1      2     13    -23
+  1     39     10    -13
+  1    -36    -37     43
+  1    -34    -46    -41
+  1    -34    -32     -2
+  1    -33    -49     10
+  1    -48    -15     -5
+  1    -14     33      4
+  1    -10     -7    -21
+  1     31     29    -42
+  1      2    -18     21
+  1     29    -29    -18
+  1    -34    -15     -6
+  1    -41      0     -2
+  1    -32     16     14
+  1     14     32     15
+  1    -25     33    -49
+  1     19    -31     33
+  1    -26      8    -24
+  1      2    -10    -44
+  1      9     42    -12
+  1    -19     21      8
+  1     12     37     43
+  1    -44     45     -6
+  1      3    -36    -40
+  1    -31     27     42
+  1     33    -47     25
+  1     33     21     43
+  1     17     45      1
+  1     43     -2     41
+  1     49    -42     34
+  1    -13    -11      5
+  1     45    -49     -7
+  1     38    -43    -11
+  1    -18     10      2
+  1     -8     28    -19
+  1    -16     12    -17
+  1    -40     -4    -45
+  1    -46    -36    -49
+  1      5    -43     -2
+  1     -3    -44      5
+  1    -18     -7     43
+  1     36    -12     44
+  1    -20    -24    -49
+  1     18      7     10
+  1    -29     48    -10
+  1      0    -17    -48
+  1     33     -8     -2
+  1     37     -4     10
+  1     38    -49     17
+  1    -14     -2     22
+  1     41     28    -35
+  1     35     15      2
+  1     29     44     27
+  1     30     13    -15
+  1     -8     33    -16
+  1     30    -16     15
+  1     31    -32    -42
+  1    -20    -44      3
+  1     39     43      3
+  1      6    -20    -49
+  1    -20    -29     29
+  1     -5    -44     -5
+  1     46     34    -11
+  1     24     15    -48
+  1    -41    -43     35
+  1     -8     37    -30
+  1    -42     19    -13
+  1    -34     48     -8
+  1     18     37    -15
+  1    -27     -5     13
+  1    -27     23     33
+  1    -48    -32     39
+  1     -3    -35     23
+  1     34     38    -10
+  1     36     47     -4
+  1     22    -11    -17
+  1     41     -3    -47
+  1    -22     12    -49
+  1     18    -18     37
+  1    -46      3    -17
+  1     17     26    -44
+  1      1     28    -26
+  1     -9    -25    -11
+  1    -35    -40    -23
+  1      3     46    -26
+  1     49     18     12
+  1    -18      9    -40
+  1    -16     37     21
+  1    -15      5    -46
+  1    -27      9      6
+  1      4    -23    -16
+  1     10     27    -38
+  1     34    -31    -14
+  1    -27    -17     -4
+  1     -1     35     -8
+  1     22     34    -40
+  1    -15    -33     19
+  1     -5      0      6
+  1    -33     34    -37
+  1    -30    -43     21
+  1     26     11     48
+  1    -40    -28     26
+  1    -29    -43     44
+  1      6    -21    -23
+  1    -48     27    -38
+  1     -7      0     46
+  1      2     34    -36
+  1    -28    -21     13
+  1     27     -5     -1
+  1     39     14      5
+  1     11     -9    -33
+  1      9      0    -11
+  1    -14     20     -5
+  1    -20    -22     23
+  1      6    -21      0
+  1     18     21     49
+  1     14    -25     34
+  1     27     -4    -37
+  1     -8    -26      7
+  1     39    -36    -27
+  1     -4     24     13
+  1     11    -15    -36
+  1    -49     20     33
+  1     -4     49    -38
+  1    -31      6    -10
+  1     18    -25    -38
+  1     18     39    -13
+  1      2     17     32
+  1     14    -41    -44
+  1    -27     48    -31
+  1     -5     -6     43
+  1    -42    -44    -22
+  1    -29    -44     48
+  1    -45      1     47
+  1    -34     19      4
+  1      5    -11     28
+  1     17    -43     17
+  1    -46      8    -15
+  1     35    -26     -6
+  1     41     -3     -8
+  1    -39     41     34
+  1    -46     49     40
+  1    -18    -29     46
+  1    -20    -25     -2
+  1    -22     -9    -32
+  1     31     46      5
+  1     10     14     11
+  1    -22     17    -29
+  1     12      3     -5
+  1    -44     -5     40
+  1     -2      4     32
+  1    -18      8     31
+  1    -27     40    -48
+  1    -31    -29    -23
+end
diff --git a/demos/ppl_lcdd/examples/kkd18_4.ine b/demos/ppl_lcdd/examples/kkd18_4.ine
new file mode 100644
index 0000000..ad6b26b
--- /dev/null
+++ b/demos/ppl_lcdd/examples/kkd18_4.ine
@@ -0,0 +1,25 @@
+* This must be computed with rational arithmetic.
+H-representation
+begin
+18   5   integer
+3976210973720   -5964591245895   -33802508475500   -161110322828670
+-745886931169976
+5   -10   -50   -220   -974
+5   -5   -35   -185   -899
+5   0   -10   -90   -574
+5   5   25   95   301
+5   10   70   400   2146
+5   15   125   855   5501
+5   20   190   1490   11026
+5   25   265   2335   19501
+5   30   350   3420   31826
+5   35   445   4775   49021
+5   40   550   6430   72226
+5   45   665   8415   102701
+5   50   790   10760   141826
+5   55   925   13495   191101
+5   60   1070   16650   252146
+5   65   1225   20255   326701
+-3976210973719   5964591245895   33802508475500   161110322828670
+745886931169976
+end
diff --git a/demos/ppl_lcdd/examples/kkd27_5.ine b/demos/ppl_lcdd/examples/kkd27_5.ine
new file mode 100644
index 0000000..7a8954c
--- /dev/null
+++ b/demos/ppl_lcdd/examples/kkd27_5.ine
@@ -0,0 +1,34 @@
+* This must be computed with rational arithmetic.
+H-representation
+begin
+27 6 integer
+1172039901841798080   -1758060515119739835   -12306436783413558955
+-72080893223436992535   -406122552605284841587   -2275777153240670950215
+6   -15   -85   -435   -2269   -12195
+6   -9   -67   -393   -2179   -12009
+6   -3   -37   -279   -1789   -10743
+6   3   5   -57   -739   -6057
+6   9   59   309   1475   6549
+6   15   125   855   5501   34455
+6   21   203   1617   12131   88641
+6   27   293   2631   22301   184407
+6   33   395   3933   37091   342093
+6   39   509   5559   57725   587799
+6   45   635   7545   85571   954105
+6   51   773   9927   122141   1480791
+6   57   923   12741   169091   2215557
+6   63   1085   16023   228221   3214743
+6   69   1259   19809   301475   4544049
+6   75   1445   24135   390941   6279255
+6   81   1643   29037   498851   8506941
+6   87   1853   34551   627581   11325207
+6   93   2075   40713   779651   14844393
+6   99   2309   47559   957725   19187799
+6   105   2555   55125   1164611   24492405
+6   111   2813   63447   1403261   30909591
+6   117   3083   72561   1676771   38605857
+6   123   3365   82503   1988381   47763543
+6   129   3659   93309   2341475   58581549
+-1172039901841798079   1758060515119739835   12306436783413558955
+72080893223436992535   406122552605284841587   2275777153240670950215
+end
diff --git a/demos/ppl_lcdd/examples/kkd38_6.ine b/demos/ppl_lcdd/examples/kkd38_6.ine
new file mode 100644
index 0000000..4ea9b0b
--- /dev/null
+++ b/demos/ppl_lcdd/examples/kkd38_6.ine
@@ -0,0 +1,49 @@
+* This must be computed with rational arithmetic.
+H-representation
+begin
+38 7 integer
+2919394390774395218459334   -4379091595292464054287507
+-36492430237104184038520181   -253987324572060483286422939
+-1691789494531258045567157717   -11149182918946980113429731347
+-73511950112254277868261780941
+7   -21   -133   -777   -4669   -29001   -184813
+7   -14   -112   -728   -4564   -28784   -184372
+7   -7   -77   -595   -4109   -27307   -179717
+7   0   -28   -336   -2884   -21840   -156148
+7   7   35   91   -301   -7133   -75445
+7   14   112   728   4396   25424   141772
+7   21   203   1617   12131   88641   638723
+7   28   308   2800   23996   200368   1650188
+7   35   427   4319   41251   384335   3535267
+7   42   560   6216   65324   670992   6815180
+7   49   707   8533   97811   1098349   12216107
+7   56   868   11312   140476   1712816   20717068
+7   63   1043   14595   195251   2570043   33602843
+7   70   1232   18424   264236   3735760   52521932
+7   77   1435   22841   349699   5286617   79549555
+7   84   1652   27888   454076   7311024   117255692
+7   91   1883   33607   579971   9909991   168778163
+7   98   2128   40040   730156   13197968   237900748
+7   105   2387   47229   907571   17303685   329136347
+7   112   2660   55216   1115324   22370992   447815180
+7   119   2947   64043   1356691   28559699   600178027
+7   126   3248   73752   1635116   36046416   793474508
+7   133   3563   84385   1954211   45025393   1036066403
+7   140   3892   95984   2317756   55709360   1337536012
+7   147   4235   108591   2729699   68330367   1708799555
+7   154   4592   122248   3194156   83140624   2162225612
+7   161   4963   136997   3715411   100413341   2711758603
+7   168   5348   152880   4297916   120443568   3373047308
+7   175   5747   169939   4946291   143549035   4163578427
+7   182   6160   188216   5665324   170070992   5102815180
+7   189   6587   207753   6459971   200375049   6212340947
+7   196   7028   228592   7335356   234852016   7516007948
+7   203   7483   250775   8296771   273918743   9040090963
+7   210   7952   274344   9349676   318018960   10813446092
+7   217   8435   299341   10499699   367624117   12867674555
+7   224   8932   325808   11752636   423234224   15237291532
+-2919394390774395218459333   4379091595292464054287507
+36492430237104184038520181   253987324572060483286422939
+1691789494531258045567157717   11149182918946980113429731347
+73511950112254277868261780941
+end
diff --git a/demos/ppl_lcdd/examples/kq20_11_m.ine b/demos/ppl_lcdd/examples/kq20_11_m.ine
new file mode 100644
index 0000000..19a589d
--- /dev/null
+++ b/demos/ppl_lcdd/examples/kq20_11_m.ine
@@ -0,0 +1,24 @@
+H-representation
+begin
+20 11 integer
+10000 -915 -828 -303 -632 -786 -231 -12 -568 -351 -308
+10000 -930 -217 -480 -704 -700 -91 -441 -927 -33 -330
+10000 -765 -616 -962 -274 -276 -39 -924 -541 -444 -838
+10000 -747 -470 -506 -329 -481 -425 -679 -140 -764 -960
+10000 -243 -664 -760 -333 -456 -686 -717 -137 -721 -833
+10000 -682 -107 -380 -720 -382 -920 -164 -220 -640 -262
+10000 -145 -942 -873 -570 -973 -365 -685 -932 -424 -928
+10000 -183 -612 -402 -869 -681 -539 -941 -513 -290 -622
+10000 -669 -694 -353 -941 -209 -572 -580 -822 -964 -725
+10000 -188 -646 -87 -552 -330 -19 -976 -609 -965 -158
+0 1 0 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/metric40_11.ine b/demos/ppl_lcdd/examples/metric40_11.ine
new file mode 100644
index 0000000..2fec9a5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/metric40_11.ine
@@ -0,0 +1,45 @@
+* metric polytope on 5 points
+H-representation
+begin
+40 11 integer
+0 0 0 1 1 0 0 0 0 0 -1
+0 0 1 0 1 0 0 0 0 -1 0
+0 0 1 1 0 0 0 0 -1 0 0
+0 1 0 0 1 0 0 -1 0 0 0
+0 1 0 1 0 0 -1 0 0 0 0
+0 1 1 0 0 -1 0 0 0 0 0
+0 -1 0 0 1 0 0 1 0 0 0
+0 0 0 -1 1 0 0 0 0 0 1
+0 0 0 0 0 0 -1 1 0 0 1
+0 0 -1 0 1 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 -1 1 1
+0 0 0 0 0 -1 0 1 0 1 0
+2 0 0 0 0 -1 -1 0 -1 0 0
+0 -1 0 1 0 0 1 0 0 0 0
+0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 1 -1 0 0 0 0 0 1
+0 0 -1 1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 -1 1 0 1 0 0
+2 -1 -1 0 0 -1 0 0 0 0 0
+2 0 0 0 0 -1 0 -1 0 -1 0
+0 -1 1 0 0 1 0 0 0 0 0
+0 0 0 0 0 1 0 -1 0 1 0
+0 0 1 0 -1 0 0 0 0 1 0
+2 -1 0 0 -1 0 0 -1 0 0 0
+0 0 0 0 0 1 -1 0 1 0 0
+0 0 0 0 0 0 0 0 1 1 -1
+0 0 1 -1 0 0 0 0 1 0 0
+2 -1 0 -1 0 0 -1 0 0 0 0
+2 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 1 0 1 0 -1 0
+0 1 -1 0 0 1 0 0 0 0 0
+0 1 0 0 -1 0 0 1 0 0 0
+2 0 -1 0 -1 0 0 0 0 -1 0
+0 0 0 0 0 0 1 1 0 0 -1
+0 1 0 -1 0 0 1 0 0 0 0
+2 0 0 -1 -1 0 0 0 0 0 -1
+2 0 -1 -1 0 0 0 0 -1 0 0
+2 0 0 0 0 0 0 0 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/metric80_16.ine b/demos/ppl_lcdd/examples/metric80_16.ine
new file mode 100644
index 0000000..065eae3
--- /dev/null
+++ b/demos/ppl_lcdd/examples/metric80_16.ine
@@ -0,0 +1,86 @@
+* metric polytope on 6 points
+H-representation
+linearity 3 1 2 3
+begin
+80 16 integer
+0 1 1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+0 -1 0 1 0 0 0 1 0 0 0 0 0 0 0 0
+0 1 0 1 0 0 0 -1 0 0 0 0 0 0 0 0
+0 -1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+0 1 0 0 1 0 0 0 -1 0 0 0 0 0 0 0
+0 -1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+0 1 0 0 0 1 0 0 0 -1 0 0 0 0 0 0
+0 0 -1 1 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 1 -1 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 1 1 0 0 0 0 0 0 -1 0 0 0 0 0
+0 0 -1 0 1 0 0 0 0 0 0 1 0 0 0 0
+0 0 1 0 -1 0 0 0 0 0 0 1 0 0 0 0
+0 0 1 0 1 0 0 0 0 0 0 -1 0 0 0 0
+0 0 -1 0 0 1 0 0 0 0 0 0 1 0 0 0
+0 0 1 0 0 -1 0 0 0 0 0 0 1 0 0 0
+0 0 1 0 0 1 0 0 0 0 0 0 -1 0 0 0
+0 0 0 1 1 0 0 0 0 0 0 0 0 -1 0 0
+0 0 0 1 -1 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 -1 1 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 1 0 1 0 0 0 0 0 0 0 0 -1 0
+0 0 0 1 0 -1 0 0 0 0 0 0 0 0 1 0
+0 0 0 -1 0 1 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 -1
+0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 1
+0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 1
+6 0 0 0 0 0 -1 -1 0 0 -1 0 0 0 0 0
+0 0 0 0 0 0 1 1 0 0 -1 0 0 0 0 0
+0 0 0 0 0 0 -1 1 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 -1 0 0 1 0 0 0 0 0
+6 0 0 0 0 0 -1 0 -1 0 0 -1 0 0 0 0
+0 0 0 0 0 0 1 0 1 0 0 -1 0 0 0 0
+0 0 0 0 0 0 -1 0 1 0 0 1 0 0 0 0
+0 0 0 0 0 0 1 0 -1 0 0 1 0 0 0 0
+6 0 0 0 0 0 -1 0 0 -1 0 0 -1 0 0 0
+0 0 0 0 0 0 -1 0 0 1 0 0 1 0 0 0
+0 0 0 0 0 0 1 0 0 1 0 0 -1 0 0 0
+0 0 0 0 0 0 1 0 0 -1 0 0 1 0 0 0
+6 0 0 0 0 0 0 -1 -1 0 0 0 0 -1 0 0
+0 0 0 0 0 0 0 -1 1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 -1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 1 0 0 0 0 -1 0 0
+6 0 0 0 0 0 0 -1 0 -1 0 0 0 0 -1 0
+0 0 0 0 0 0 0 -1 0 1 0 0 0 0 1 0
+0 0 0 0 0 0 0 1 0 -1 0 0 0 0 1 0
+0 0 0 0 0 0 0 1 0 1 0 0 0 0 -1 0
+6 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 -1
+0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 -1
+6 0 0 0 0 0 0 0 0 0 -1 -1 0 -1 0 0
+0 0 0 0 0 0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 0 0 0 0 0 1 -1 0 1 0 0
+0 0 0 0 0 0 0 0 0 0 -1 1 0 1 0 0
+6 0 0 0 0 0 0 0 0 0 -1 0 -1 0 -1 0
+0 0 0 0 0 0 0 0 0 0 1 0 1 0 -1 0
+0 0 0 0 0 0 0 0 0 0 1 0 -1 0 1 0
+0 0 0 0 0 0 0 0 0 0 -1 0 1 0 1 0
+6 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 1
+6 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1
+6 -1 -1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+0 -1 1 0 0 0 1 0 0 0 0 0 0 0 0 0
+0 1 -1 0 0 0 1 0 0 0 0 0 0 0 0 0
+6 -1 0 -1 0 0 0 -1 0 0 0 0 0 0 0 0
+0 1 0 -1 0 0 0 1 0 0 0 0 0 0 0 0
+6 -1 0 0 -1 0 0 0 -1 0 0 0 0 0 0 0
+0 1 0 0 -1 0 0 0 1 0 0 0 0 0 0 0
+6 -1 0 0 0 -1 0 0 0 -1 0 0 0 0 0 0
+0 1 0 0 0 -1 0 0 0 1 0 0 0 0 0 0
+6 0 -1 -1 0 0 0 0 0 0 -1 0 0 0 0 0
+6 0 -1 0 -1 0 0 0 0 0 0 -1 0 0 0 0
+6 0 -1 0 0 -1 0 0 0 0 0 0 -1 0 0 0
+6 0 0 -1 -1 0 0 0 0 0 0 0 0 -1 0 0
+6 0 0 -1 0 -1 0 0 0 0 0 0 0 0 -1 0
+6 0 0 0 -1 -1 0 0 0 0 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/mit.ine b/demos/ppl_lcdd/examples/mit.ine
new file mode 100644
index 0000000..5d31d88
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit.ine
@@ -0,0 +1,732 @@
+begin
+729 9 integer
+72 0 0 -4 -4 -2 0 0 0
+216 -2 -2 -10 -12 -6 0 0 0
+192 -4 -2 -8 -8 -8 0 0 0
+288 -12 6 8 -16 -8 0 0 0
+96 -4 2 0 -4 -4 0 0 0
+144 -5 1 -4 -6 -6 0 0 0
+288 -8 -2 -10 -12 -12 0 0 0
+96 -4 2 -4 -2 -4 0 0 0
+240 -7 -1 -10 -8 -10 0 0 0
+288 -8 -2 -12 -8 -12 0 0 0
+288 -8 -2 -8 -16 -8 0 0 0
+96 -4 2 -8 0 0 0 0 0
+0 0 6 -8 4 8 0 0 0
+0 4 6 -8 0 8 0 0 0
+24 2 2 -4 -2 2 0 0 0
+864 -24 -6 -40 -16 -32 0 0 0
+24 0 0 -2 -2 2 0 0 0
+0 4 10 -16 0 24 0 0 0
+0 1 1 -4 0 12 0 0 0
+0 0 6 -16 8 40 0 0 0
+96 -4 2 -16 16 32 0 0 0
+288 -8 -2 -16 0 0 0 0 0
+96 -4 2 8 -8 8 0 0 0
+288 -8 -2 8 -24 24 0 0 0
+0 0 2 -8 8 24 0 0 0
+96 -1 -1 -4 -8 8 0 0 0
+576 -12 -6 -16 -40 16 0 0 0
+192 -4 -2 0 -16 16 0 0 0
+576 -8 -6 -24 -32 -16 0 0 0
+576 -12 -6 -20 -32 -16 0 0 0
+960 -16 -10 -40 -56 -16 0 0 0
+160 0 0 -7 -7 -6 -1 0 -1
+480 -4 -4 -21 -21 -18 -1 0 -3
+192 -4 -4 -12 -4 -8 4 2 -4
+640 -16 -8 -28 -28 -24 4 2 -4
+640 -8 -6 -28 -28 -24 0 0 -4
+192 -8 0 -8 -8 -8 4 2 0
+384 -12 -4 -16 -16 -16 4 2 0
+960 -20 -12 -42 -42 -36 4 2 -6
+240 -9 -1 -11 -9 -10 3 2 -1
+0 2 2 4 0 0 -4 -2 0
+640 -22 -4 -24 -28 -24 8 4 -4
+1920 -60 -20 -76 -84 -72 20 10 -12
+1920 -32 -22 -84 -84 -72 4 2 -12
+960 -28 -10 -44 -36 -40 8 4 -4
+1152 -36 -12 -52 -44 -48 12 6 -4
+720 -23 -7 -33 -27 -30 7 4 -3
+1920 -48 -24 -88 -72 -80 12 6 -8
+3456 -96 -40 -160 -128 -144 28 14 -16
+576 -15 -7 -26 -20 -24 4 2 -4
+384 -12 -4 -20 -12 -16 4 2 0
+336 -11 -3 -17 -11 -14 3 2 -1
+192 -8 0 -12 -4 -8 4 2 0
+0 0 0 -4 4 0 4 2 0
+0 0 2 -8 8 0 8 4 -2
+192 -12 12 -28 12 -8 20 10 -4
+192 -12 12 -20 4 -8 12 6 -2
+1920 -48 -24 -92 -60 -80 12 6 -4
+576 -15 -7 -28 -18 -24 4 2 -2
+1536 -42 -18 -76 -40 -64 12 6 -8
+384 -12 -4 -20 4 -16 4 2 -4
+1920 -60 -20 -102 18 -76 14 10 -18
+1920 -60 -20 -102 -46 -76 14 10 -2
+672 -22 -6 -37 -17 -26 5 4 -1
+640 -22 -4 -36 -16 -24 4 4 0
+960 -40 0 -64 -16 -32 8 10 0
+64 -4 4 -8 0 0 0 2 0
+0 0 8 -6 2 4 -2 2 0
+0 8 18 -8 0 8 -8 2 0
+64 36 60 -28 -4 24 -28 6 -4
+192 28 36 -20 -12 8 -20 2 -4
+96 4 4 -5 -5 -2 -3 0 -1
+64 4 6 -4 -4 0 -4 0 0
+96 0 0 -5 -5 -2 -1 0 -1
+16 0 0 -1 -1 0 0 0 0
+192 -6 0 -8 12 -8 0 0 -4
+192 -6 0 -8 -4 -8 0 0 0
+960 -30 -8 -48 -20 -40 8 4 -4
+960 -32 -8 -52 -20 -40 12 6 -4
+960 -32 -8 -52 44 -40 12 6 -20
+960 -30 -8 -48 12 -40 8 4 -12
+576 -16 -6 -28 -12 -24 4 2 -4
+208 -8 0 -8 -8 -8 4 2 -2
+160 -7 1 -5 -7 -6 3 2 -1
+192 -12 12 0 -8 -8 8 6 0
+160 -9 7 -1 -7 -6 5 4 -1
+640 -20 -4 -20 -28 -24 4 2 -4
+96 -5 3 -2 -4 -4 2 2 0
+192 -6 0 -4 -8 -8 0 0 0
+480 -18 -2 -17 -21 -18 7 4 -3
+528 -19 -3 -20 -22 -20 8 4 -4
+960 -30 -4 -32 -36 -40 4 2 -4
+1152 -36 -4 -32 -40 -48 0 2 -8
+1152 -36 -12 -48 -40 -48 8 6 -8
+192 -8 0 -4 -4 -8 4 2 -4
+192 -6 0 0 -4 -8 0 0 -4
+384 -12 -4 -8 -8 -16 4 2 -8
+1920 -48 -24 -48 -40 -80 12 6 -40
+384 -16 2 -20 -12 -16 4 4 0
+576 -24 0 -32 -16 -24 8 6 0
+432 -17 -1 -23 -13 -18 5 4 -1
+576 -28 12 -36 -12 -24 12 10 -4
+960 -52 36 -92 12 -40 52 26 -12
+0 0 4 -14 10 4 6 6 -2
+2688 -72 -32 -120 -104 -112 16 10 -8
+0 0 8 -20 12 56 -12 2 -4
+64 -4 4 -16 8 24 -4 2 0
+192 -8 0 -16 0 0 0 2 0
+64 8 16 -20 -4 24 -12 2 -4
+0 2 4 -4 0 8 -4 0 0
+288 -13 3 -12 -10 -12 6 4 -2
+336 -14 2 -15 -11 -14 7 4 -3
+96 3 1 -8 -6 4 0 0 -2
+192 12 0 -20 -12 8 4 2 -4
+0 4 8 -6 2 4 -2 2 -2
+192 -12 12 -28 28 -8 20 10 -12
+0 0 0 -4 16 0 4 2 -6
+0 0 0 -4 40 0 4 2 -12
+192 -8 0 -12 44 -8 4 2 -12
+0 0 2 0 32 0 0 0 -8
+192 -12 12 -20 300 -8 12 6 -76
+960 -40 0 -64 208 -32 8 10 -56
+2112 -72 -16 -120 120 -80 16 14 -48
+512 -16 -4 -26 6 -20 2 2 -6
+512 -16 -4 -26 -10 -20 2 2 -2
+448 -16 0 -24 -8 -16 0 2 0
+448 24 8 -68 -20 56 12 6 -20
+192 8 2 -24 -8 16 4 2 -8
+192 16 0 -36 -4 24 12 6 -12
+448 -13 -5 -23 -13 -18 3 2 -1
+64 -2 0 -4 0 0 0 0 0
+0 2 -2 -4 4 0 4 2 -2
+0 0 0 -22 22 4 14 10 0
+0 0 0 -22 82 4 14 10 -30
+0 0 4 -14 34 4 6 6 -14
+480 -21 3 -20 -18 -20 8 6 -2
+480 -19 1 -16 -18 -20 4 4 -2
+1344 -52 0 -44 -52 -56 12 10 -4
+576 -22 0 -12 -24 -24 4 4 0
+768 -28 -4 -24 -32 -32 8 6 0
+768 -28 -4 40 -32 -32 -8 6 0
+576 -22 0 20 -24 -24 -4 4 0
+320 -12 0 10 -14 -12 -2 2 -2
+160 -7 1 3 -7 -6 1 2 -1
+0 2 2 -12 8 16 4 2 -4
+0 22 14 -52 16 80 12 6 -16
+192 32 16 -68 -4 88 12 6 -20
+128 18 10 -36 -8 48 4 2 -8
+64 8 8 -20 -4 24 -4 2 -4
+0 4 2 -4 4 8 0 0 -4
+0 4 8 -14 2 20 -4 2 -2
+0 1 7 -11 3 14 -3 2 -1
+0 0 8 -12 4 16 -4 2 0
+0 4 12 -20 4 32 -8 2 0
+0 0 24 -44 20 64 -16 6 0
+0 0 4 -10 6 12 -2 2 -2
+0 14 22 -44 8 64 -12 6 -8
+0 6 10 -18 2 28 -6 2 -2
+192 28 36 -52 -12 72 -36 2 -12
+96 3 3 -8 -6 4 -4 0 -2
+0 1 1 -2 0 4 0 0 0
+0 0 12 -10 6 12 -6 2 -2
+48 0 0 -3 -3 2 -1 0 -1
+192 16 24 -44 -12 72 -28 2 -12
+0 4 12 -14 2 20 -8 2 -2
+0 1 9 -11 3 14 -5 2 -1
+192 32 40 -68 -4 88 -36 6 -20
+16 1 1 -3 -1 6 -1 0 -1
+64 4 6 -12 -4 24 -8 0 -4
+0 4 12 -20 4 40 -12 2 -4
+0 0 10 -16 8 24 -8 2 0
+192 -12 12 -40 16 32 -8 6 0
+0 0 24 -34 14 44 -14 6 -2
+64 -4 4 -16 8 16 0 2 0
+0 0 8 -20 12 32 0 2 0
+0 0 4 -14 10 20 2 2 -2
+0 0 2 -2 2 4 -2 0 0
+0 0 24 -44 20 72 -20 6 -4
+0 0 24 -60 36 104 -4 6 -4
+0 6 10 -16 4 24 -8 2 -4
+0 1 1 -1 1 2 -1 0 -1
+0 6 18 -16 4 24 -12 2 -4
+384 0 -2 -20 -20 -8 0 0 -4
+384 -12 -4 -12 -20 -8 4 2 -4
+640 -16 -8 -20 -36 -8 4 2 -4
+960 -20 -12 -32 -56 -8 4 2 -4
+96 -1 -1 -4 -6 0 0 0 0
+1280 -6 -14 -60 -80 0 -4 2 0
+1024 -2 -10 -52 -64 0 -4 2 0
+1024 -12 -12 -48 -56 -16 0 2 -8
+384 8 -4 -24 -24 0 0 2 0
+256 4 -4 -16 -16 0 2 2 0
+1024 0 -16 -56 -56 -16 8 6 -8
+960 0 -16 -52 -52 -16 12 6 -8
+6400 -96 -72 -280 -280 -240 8 6 -40
+960 -16 -12 -42 -42 -36 2 2 -6
+3840 -48 -40 -168 -168 -144 0 2 -24
+4032 -72 -48 -178 -178 -148 10 6 -26
+1152 -20 -14 -52 -52 -40 4 2 -8
+0 2 -2 0 0 0 2 2 0
+192 -6 0 12 -8 -8 -4 0 0
+192 -4 -4 -8 -8 -8 4 2 0
+6912 -176 -88 -288 -288 -288 40 26 0
+1920 -48 -24 -80 -80 -80 10 6 0
+576 -12 -10 -24 -24 -24 6 4 0
+5760 -168 -64 -264 -216 -240 48 26 -24
+960 -48 24 -36 -36 -40 20 18 -4
+960 -44 12 -28 -36 -40 12 14 -4
+192 -12 12 4 -4 -8 4 6 -4
+960 -56 48 -20 -36 -40 28 26 -4
+640 -20 0 -4 -28 -24 -2 0 -4
+576 -24 0 -28 -12 -24 4 6 -4
+0 0 0 4 8 0 -2 0 -4
+192 -6 0 -4 12 -8 -4 0 -6
+960 -30 0 -32 -12 -40 -8 0 -6
+960 -32 0 -36 -20 -40 -4 2 -4
+640 -20 0 -28 -4 -24 -4 0 -2
+0 0 20 -4 12 8 -12 0 -2
+16 0 0 -1 -1 6 -1 0 -1
+720 -23 -3 -25 -27 -30 3 2 -3
+624 -21 -1 -27 -17 -26 1 2 -1
+768 -26 0 -32 -20 -32 0 2 0
+1536 -62 0 -80 -44 -64 16 14 0
+1344 -42 -12 -64 -44 -56 12 6 -4
+2880 -90 -28 -128 -108 -120 28 14 -12
+960 -30 0 -12 -32 -40 -6 0 -8
+768 -30 0 -24 -28 -32 6 6 -4
+576 -24 0 -20 -20 -24 8 6 -4
+576 -24 0 -15 -23 -22 9 6 -5
+192 -8 0 12 -4 -8 -4 2 -4
+0 0 2 -4 4 8 0 0 0
+0 0 0 -8 8 8 4 2 0
+192 -12 12 -76 76 88 20 10 -12
+0 0 6 -28 28 40 8 4 -6
+576 -15 -7 -29 -15 -22 3 2 -1
+448 -13 -5 -25 -7 -14 3 2 -1
+512 -14 -6 -26 -14 -20 4 2 -2
+448 -13 -5 -23 -5 -18 3 2 -3
+384 -6 -4 -16 -20 -8 0 0 -4
+0 6 8 -16 4 40 -4 0 -4
+0 8 8 -24 8 48 0 2 -8
+96 -1 -1 0 -6 36 -4 0 -6
+192 -4 -4 12 -12 72 -4 2 -12
+0 0 0 -6 6 4 2 2 0
+384 -12 -4 -22 -6 -12 2 2 0
+1216 -31 -15 -59 -37 -50 7 4 -3
+960 -20 -16 -42 -42 -36 10 6 -6
+2304 -72 -20 -112 -64 -96 16 10 -8
+1344 -42 -12 -64 -36 -56 8 6 -6
+1152 -36 -12 -56 -32 -48 8 6 -4
+384 -12 -4 -16 -8 -16 0 2 0
+192 -6 0 -4 0 -8 -4 0 0
+912 -26 -10 -43 -31 -38 5 4 -1
+960 -27 -11 -46 -32 -40 6 4 -2
+1344 -39 -15 -66 -44 -56 10 6 -4
+4224 -120 -48 -200 -152 -176 32 18 -16
+4992 -132 -60 -240 -168 -208 32 18 -16
+3456 -96 -40 -168 -104 -144 24 14 -16
+2688 -76 -28 -128 -72 -112 16 10 -16
+960 -29 -9 -46 -28 -40 6 4 -4
+0 2 -2 12 0 0 -4 2 0
+960 -20 -20 134 -42 -36 -38 10 -6
+1920 -60 -20 148 -84 -72 -36 10 -12
+1920 -68 -12 100 -84 -72 -20 14 -12
+320 -12 0 -6 -14 -12 2 2 -2
+960 -40 0 -26 -42 -36 18 10 -6
+576 -12 -8 -22 -30 -12 2 2 -6
+576 -12 -10 -8 -24 -24 -2 4 0
+2304 -56 -32 -80 -96 -96 8 10 0
+960 -20 -20 -38 -42 -36 20 10 -6
+192 -6 0 -4 -4 -8 -2 0 -2
+0 0 0 1 1 2 -1 0 -1
+192 -8 0 -4 28 -8 -4 2 -12
+192 -8 0 -4 60 -8 -4 2 -20
+0 0 2 -4 4 16 -4 0 0
+1792 -28 -20 -80 -88 -48 0 2 -16
+384 -3 -3 -18 -20 -8 -2 0 -4
+8064 -204 -100 -384 -264 -336 48 26 -24
+1920 -48 -24 -88 -56 -80 8 6 -8
+384 -12 -4 -16 8 -16 0 2 -8
+192 -12 12 -12 -4 -8 4 6 0
+192 -12 12 -12 12 -8 4 6 -8
+192 -12 12 4 60 -8 -12 6 -28
+0 0 0 -8 8 16 0 2 0
+192 -4 -2 -4 -4 -8 0 0 -4
+192 -4 -4 16 -12 0 -4 2 0
+768 -20 -12 40 -48 0 -8 6 0
+512 -14 -6 20 -32 0 -4 2 0
+64 -2 0 0 -4 0 0 0 0
+1344 -60 12 -68 -44 -56 20 18 -4
+2112 -92 12 -116 -60 -88 28 26 -4
+960 -44 12 -52 -28 -40 12 14 0
+1920 -48 -24 -72 -56 -80 8 6 -24
+96 -5 3 -4 -2 -4 0 2 0
+0 0 2 -8 24 0 8 4 -10
+0 4 4 -16 8 112 -16 2 -8
+384 -12 -4 -24 0 0 0 2 0
+0 2 -2 -4 16 0 4 2 -8
+64 -4 4 -20 20 24 4 2 -2
+128 -6 2 -20 16 16 4 2 -2
+192 -8 0 -20 12 8 4 2 0
+96 -4 0 -14 10 8 4 2 -2
+448 -20 4 -76 60 56 20 10 -12
+192 -4 -2 -4 -12 8 0 0 -4
+384 -12 -4 0 -24 16 4 2 -8
+192 -8 0 4 -12 8 4 2 -4
+192 12 20 -20 -12 8 -12 2 -4
+192 12 4 -20 -12 8 -4 2 -4
+192 76 20 -84 -12 72 -4 18 -12
+64 20 12 -28 -4 24 -4 6 -4
+64 20 44 -28 -4 24 -20 6 -4
+0 12 36 -22 2 20 -14 6 -2
+0 4 10 -8 0 8 -4 2 0
+0 4 6 -8 0 8 -2 2 0
+0 4 0 -6 2 4 2 2 -2
+0 0 4 -6 2 4 0 2 0
+192 4 2 -12 -12 0 -4 0 0
+0 8 8 -16 0 24 -4 2 0
+64 20 4 -28 -4 24 4 6 -4
+0 20 4 -24 0 24 4 6 0
+0 8 0 -8 0 8 4 2 0
+0 5 -1 -6 2 4 4 2 -2
+64 24 0 -28 -4 24 12 6 -4
+96 46 -10 -42 -6 36 18 14 -6
+32 18 -6 -14 -2 12 10 6 -2
+192 112 -40 -84 -12 72 76 38 -12
+0 6 -2 -4 0 4 4 2 0
+0 0 0 0 16 0 0 2 -8
+192 -12 12 4 28 -8 4 6 -20
+960 -40 0 38 -42 -36 2 10 -6
+960 -40 8 -20 -36 -40 4 10 -4
+192 -8 2 0 -8 -8 0 2 0
+384 -18 6 -4 -16 -16 4 6 0
+192 -8 0 8 -8 -8 0 2 0
+320 -20 20 10 -14 -12 14 10 -2
+576 -8 -6 -20 -36 24 -4 0 -12
+96 -1 -1 -4 -6 4 0 0 -2
+192 16 -8 -20 -12 8 12 6 -4
+960 12 -20 -60 -52 -8 20 10 -12
+576 -12 -8 -26 -26 -20 4 2 -4
+1920 -48 -24 -68 -100 -40 12 6 -20
+640 -16 -8 -32 -16 -24 4 2 0
+384 -12 -4 -24 0 -8 4 2 0
+192 -8 0 -36 44 24 12 6 -12
+192 -8 0 -36 76 24 12 6 -20
+128 -6 2 -20 40 16 4 2 -8
+64 -4 4 -20 60 24 4 2 -12
+0 0 2 -4 20 8 0 0 -4
+624 -21 -5 -34 -16 -24 4 4 0
+400 -12 -4 -20 -12 -16 2 2 0
+192 1 -1 -10 -12 0 -2 0 0
+640 -16 -8 -8 -40 48 0 2 -16
+1920 -48 -24 -24 -120 80 8 6 -40
+96 8 8 -22 -6 36 -10 2 -6
+0 8 8 -16 0 32 -8 2 0
+2112 -72 -16 -120 -40 -80 16 14 -8
+3456 -100 -36 -160 -120 -144 24 14 -16
+1152 -36 -12 -59 -27 -46 7 6 -3
+1920 -48 -24 -96 -32 -64 8 6 0
+640 -16 -8 -32 0 0 0 2 0
+240 -2 -2 -11 -15 10 -3 0 -5
+960 -20 -12 -32 -56 16 0 2 -16
+1920 -48 -24 216 -80 -80 -64 6 0
+384 -12 -4 32 -16 -16 -8 2 0
+320 -10 0 18 -14 -12 -6 0 -2
+192 -6 0 20 -4 -8 -8 0 -4
+320 -10 0 -14 18 -12 -2 0 -6
+32 -1 1 -4 6 20 -4 0 -2
+192 -8 0 -16 32 0 0 2 -8
+192 -8 0 -20 28 8 4 2 -4
+0 0 0 -8 28 8 4 2 -8
+0 0 0 -6 34 4 2 2 -10
+384 -12 -4 -22 2 -12 2 2 -2
+192 -12 12 28 -12 8 12 6 -4
+576 -24 0 -8 -24 -16 8 6 -8
+192 -8 0 -2 -10 -4 4 2 -2
+768 0 -8 -40 -40 -16 0 2 -8
+3840 0 -56 -200 -200 -80 24 18 -40
+384 0 -6 -20 -20 -8 4 2 -4
+768 -12 -10 -36 -36 -24 4 2 -6
+192 -8 0 -20 28 88 -12 2 -4
+64 -4 4 -20 52 200 -28 2 -12
+0 0 8 -24 72 336 -48 2 -24
+0 1 1 -2 4 40 -6 0 -4
+0 0 2 -4 12 48 -8 0 -4
+1792 -4 -20 -88 -112 0 -8 6 0
+768 4 -12 -40 -48 0 0 6 0
+192 0 -4 -10 -10 -4 2 2 -2
+96 -5 3 1 -5 -2 3 2 -1
+96 6 -2 -10 -6 4 2 2 -2
+528 9 -11 -35 -29 -2 9 6 -7
+480 38 -18 -50 -30 20 22 14 -10
+640 12 -12 -40 -40 0 8 6 0
+48 -3 3 -14 8 24 -4 2 0
+384 2 -6 -20 -24 144 4 2 -24
+192 -4 -2 -6 -10 -4 0 0 -2
+1344 -24 -16 -56 -72 -16 0 2 -16
+2880 -60 -36 -112 -152 -56 12 6 -28
+1344 -24 -16 -56 -72 -24 4 2 -12
+384 -6 -6 -12 -24 0 0 2 0
+64 -4 4 4 -4 0 4 2 0
+384 -12 -4 48 -8 -16 -16 2 -8
+192 -6 0 12 -4 -8 -6 0 -4
+576 -18 0 -23 -3 -22 -5 0 -3
+0 0 0 -22 194 4 14 10 -58
+64 -4 4 -8 96 0 0 2 -24
+0 0 10 -2 154 4 -6 0 -38
+384 -12 -4 16 -24 80 0 2 -16
+64 -2 0 8 -4 24 0 0 -4
+384 -12 -4 48 -24 144 0 2 -24
+192 -8 0 4 -12 0 4 2 0
+384 -12 -4 16 -24 16 0 2 -8
+0 0 6 1 9 2 -5 0 -3
+0 0 2 4 16 0 -4 0 -6
+1344 -56 8 -60 -44 -56 12 14 -4
+192 -4 -2 32 -4 -8 -12 0 -4
+1920 -48 -24 296 -40 -80 -104 6 -40
+192 -4 -2 24 -8 -8 -8 0 0
+960 -20 -10 114 -42 -36 -38 0 -6
+640 -16 -8 68 -28 -24 -20 2 -4
+0 10 2 -12 0 160 -20 2 0
+0 3 -1 -6 4 40 -2 2 -4
+0 8 -8 -24 24 80 8 10 -8
+0 116 -36 -80 0 80 64 38 0
+0 136 -56 -120 40 80 104 58 -40
+0 14 -6 -12 4 8 12 6 -4
+0 10 -6 -12 8 16 12 6 -8
+192 8 -8 -20 -4 88 12 6 -20
+960 0 -16 -52 -52 248 12 6 -52
+0 0 2 -4 20 80 -12 0 -4
+64 -2 0 -4 8 24 -4 0 0
+1920 -40 -20 -68 -84 -72 -2 0 -12
+576 -12 -6 -19 -23 -22 -1 0 -5
+1920 -48 -24 -72 -72 -80 4 6 -8
+192 -4 -4 4 -4 -8 -4 2 -4
+1920 -68 -12 -60 -84 -72 20 14 -12
+0 1 1 -2 4 24 -4 0 -4
+0 0 2 -4 12 32 -6 0 -4
+64 -4 4 -20 52 72 -12 2 -12
+192 -8 0 -20 28 24 -4 2 -4
+448 -16 0 -36 28 56 -12 2 -4
+288 -8 -4 -2 -18 12 2 2 -6
+192 -4 -4 12 -12 8 -4 2 -4
+192 -12 12 14 -10 -4 10 6 -2
+192 -8 0 36 -12 72 4 2 -12
+1344 -24 -16 -36 -84 120 -12 2 -36
+960 -20 -12 -20 -60 72 -4 2 -24
+640 -16 -8 -20 -36 0 4 2 -8
+576 -12 -8 -18 -34 -4 2 2 -2
+192 -4 -4 -4 -12 0 4 2 0
+192 -4 -4 -6 -10 -4 4 2 -2
+192 -4 -4 36 -4 -8 -12 2 -4
+192 -4 -4 28 -8 -8 -8 2 0
+192 -4 -4 4 -8 -8 -2 2 0
+960 -20 -20 22 -42 -36 -10 10 -6
+384 -12 -4 16 -8 -16 -8 2 -8
+576 -12 -6 0 -16 -24 -10 0 -8
+1920 -48 -24 -24 -56 -80 -16 6 -24
+1920 -48 -24 72 -40 -80 -48 6 -40
+192 -4 -2 8 -4 -8 -6 0 -4
+576 -12 -6 -15 -23 -22 -3 0 -5
+0 0 0 -8 24 80 -8 2 -8
+64 -4 4 -20 20 72 -12 2 -4
+192 -8 0 -20 12 24 -4 2 0
+192 -6 0 -12 8 8 -4 0 0
+0 0 0 -8 24 16 0 2 -8
+0 0 2 -4 20 16 -4 0 -4
+0 0 2 -4 12 24 -4 0 -4
+96 -4 0 -14 10 20 -2 2 -2
+64 -4 4 -20 52 40 -4 2 -12
+192 -12 12 -60 188 152 -28 6 -36
+192 -4 -2 -4 -12 0 0 0 0
+0 16 24 -52 12 120 -12 2 -12
+0 0 14 -18 6 20 -6 4 0
+576 -8 -8 -20 -36 24 -4 2 -12
+640 -16 -8 24 -40 48 -8 2 -16
+192 -6 0 8 -12 8 0 0 -4
+640 -20 -4 16 -40 48 0 2 -16
+960 -20 -12 -4 -60 168 -12 2 -36
+640 -16 -8 24 -40 176 -8 2 -32
+640 -16 -8 56 -40 240 -8 2 -40
+960 -20 -12 28 -60 296 -20 2 -52
+192 -4 -2 12 -12 72 -4 0 -12
+1920 -48 -24 156 -100 -40 -44 6 -20
+384 -12 -4 20 -20 -8 -4 2 -4
+192 -8 0 6 -10 -4 2 2 -2
+0 0 0 8 4 0 -4 0 -2
+192 -12 12 4 12 -8 -12 6 -4
+192 -8 0 -4 4 -8 -4 2 0
+192 -6 0 -4 20 -8 -4 0 -8
+0 3 11 -9 1 10 -5 2 -1
+576 -12 -6 -16 -16 -24 -2 0 -8
+1920 -48 -24 -48 -112 32 8 6 -32
+640 -16 -8 -8 -40 16 0 2 -8
+1152 -12 -12 -52 -60 -24 -4 2 -12
+2880 -60 -36 -112 -152 -48 8 6 -32
+0 8 16 -36 12 120 -28 2 -12
+0 2 4 -8 4 40 -8 0 -4
+0 0 4 -16 16 48 -8 2 -4
+0 4 4 -16 8 48 -8 2 -8
+128 -6 2 -2 -6 -4 2 2 0
+160 -7 1 1 -9 -2 3 2 -1
+288 -8 -4 -2 -18 0 2 2 0
+768 -20 -12 8 -48 0 0 6 0
+0 8 0 0 0 96 -16 2 0
+192 4 -4 12 -12 72 -20 2 -12
+0 6 -2 12 0 48 -12 2 0
+0 12 -4 -8 0 96 -8 6 0
+192 16 -16 -12 -12 72 4 14 -12
+0 14 -10 -4 0 48 4 10 0
+640 -16 -8 32 -40 0 -8 2 0
+1920 -48 -24 104 -120 80 -24 6 -40
+1920 -48 -24 116 -108 8 -36 6 -28
+640 -16 -8 24 -40 16 -8 2 -8
+192 -4 -2 12 -12 8 -4 0 -4
+192 -4 -2 13 -11 2 -5 0 -3
+576 -12 -6 28 -36 16 -12 0 -8
+192 -4 -2 12 -12 0 -4 0 0
+192 -4 -2 18 -10 -4 -6 0 -2
+384 -12 -4 16 -24 0 0 2 0
+384 -12 -4 0 -24 0 4 2 0
+1920 -48 -24 -56 -56 -80 -8 6 -8
+0 20 4 -24 0 288 -40 6 0
+0 2 0 4 0 8 -4 0 0
+0 10 -6 -4 0 16 4 6 0
+0 14 -6 -8 0 8 8 6 0
+0 20 -4 -16 0 16 8 6 0
+0 8 2 -8 0 8 0 2 0
+0 32 0 -32 0 32 8 10 0
+48 19 -1 -21 -3 18 5 6 -3
+1152 -18 -14 -50 -62 -20 2 2 -10
+0 2 -2 -2 2 4 2 2 -2
+192 -4 -2 4 -12 40 -4 0 -8
+192 -4 -2 4 -12 24 -4 0 -6
+128 -3 -1 2 -8 16 -2 0 -4
+64 -4 4 -20 20 40 -4 2 -4
+192 -12 12 -52 36 104 -20 6 -4
+0 0 6 -12 20 40 -8 0 -4
+384 -12 -4 -24 32 64 -8 2 0
+0 0 0 -6 18 4 2 2 -6
+0 0 0 -8 20 8 4 2 -6
+0 0 8 -24 40 208 -32 2 -16
+0 0 8 -24 40 144 -24 2 -16
+0 0 8 -24 40 112 -16 2 -16
+192 -8 0 -20 60 152 -20 2 -4
+64 -4 4 -20 84 264 -36 2 -12
+960 -16 -12 -26 -42 -36 -6 2 -6
+960 -20 -12 -34 -42 -36 0 2 -6
+960 -20 -16 -18 -42 -36 -2 6 -6
+576 -8 -8 -20 -36 88 -4 2 -20
+192 132 -60 -84 -12 72 76 58 -12
+192 20 -12 -20 -12 8 12 10 -4
+96 3 -3 -6 -6 0 2 2 0
+768 16 -16 -48 -48 0 8 10 0
+96 -1 -1 0 -6 20 -4 0 -4
+0 3 5 -10 8 72 -14 0 -8
+0 4 12 -32 24 176 -32 2 -16
+192 -12 12 -60 60 152 -28 6 -4
+192 -12 12 -76 76 184 -28 10 -12
+0 0 0 0 48 0 0 2 -16
+576 -12 -8 -12 -36 24 0 2 -12
+192 -4 -4 -4 -12 8 4 2 -4
+0 0 12 -32 32 96 -16 2 -8
+0 24 -8 -24 8 16 16 10 -8
+0 52 -28 -64 40 80 48 30 -40
+192 -12 12 20 156 -8 -28 6 -60
+192 -12 12 20 380 -8 -28 6 -116
+0 0 2 4 40 0 -4 0 -12
+0 0 6 8 24 0 -8 0 -10
+0 0 8 -36 28 152 -20 6 -4
+32 -2 2 -12 8 32 -4 2 0
+0 0 2 4 4 0 -4 0 0
+0 0 6 8 8 0 -8 0 -2
+0 0 6 1 5 2 -5 0 -1
+1024 -16 -12 -48 -48 -32 4 2 -8
+1248 -23 -15 -55 -57 -42 3 2 -9
+1344 -24 -16 -58 -66 -36 2 2 -12
+1056 -21 -13 -45 -51 -30 3 2 -9
+960 -20 -12 -40 -48 -24 4 2 -8
+0 0 8 -24 24 112 -20 2 -8
+0 4 12 -32 24 144 -24 2 -16
+0 0 8 -24 24 80 -12 2 -8
+0 8 0 -8 24 80 -8 2 -24
+0 6 -2 -4 16 48 4 2 -16
+0 14 -10 -20 16 48 20 10 -16
+0 20 -12 -32 24 80 16 14 -24
+0 14 -2 -20 8 16 12 6 -8
+0 12 -4 -16 8 16 8 6 -8
+0 2 0 0 4 8 0 0 -4
+192 4 -4 -12 -4 88 4 2 -20
+96 1 -3 -4 -6 36 0 2 -6
+192 4 -12 -4 -12 72 12 10 -12
+192 -4 -4 22 -10 -4 -6 2 -2
+1344 -28 -16 -54 -62 -44 2 2 -10
+2688 -36 -28 -120 -144 -32 -8 2 -32
+640 -8 -6 -28 -36 0 -4 0 -8
+112 -1 -1 -5 -7 2 -1 0 -1
+48 2 2 -7 -3 18 -5 0 -3
+0 1 1 -2 0 8 -2 0 0
+0 12 20 -48 24 240 -48 2 -24
+4864 -80 -56 -216 -216 -176 8 6 -32
+2304 -32 -24 -104 -104 -80 0 2 -16
+1152 -24 -14 -44 -60 -24 4 2 -12
+384 -6 -4 -12 -24 24 -4 0 -8
+1728 -28 -20 -64 -104 48 -8 2 -32
+1344 -24 -16 -36 -84 88 -12 2 -28
+192 8 -8 -12 -12 8 4 6 -4
+192 48 -32 -28 -12 72 20 30 -12
+1920 -48 -24 -44 -108 8 4 6 -28
+960 -20 -12 -20 -60 40 -4 2 -16
+1344 -28 -16 -28 -84 40 -4 2 -20
+768 -14 -8 -20 -48 24 -4 0 -12
+2112 -32 -24 -68 -132 152 -20 2 -52
+192 -4 -2 -3 -11 2 -1 0 -3
+576 -12 -6 -4 -36 16 -4 0 -8
+192 -4 -2 4 -12 16 -4 0 -4
+1728 -36 -18 -59 -75 -62 -3 0 -13
+192 4 -4 -12 -12 0 4 2 0
+96 -1 -1 -3 -5 -2 -1 0 -1
+192 0 -2 -4 -12 0 -4 0 0
+2496 -36 -28 -96 -152 16 -8 2 -16
+960 -12 -12 -36 -60 8 -4 2 -4
+1920 -18 -26 -76 -120 0 -4 6 0
+2688 -42 -34 -116 -144 -48 4 6 -24
+864 -17 -11 -37 -43 -22 3 2 -7
+2880 -60 -36 -118 -142 -76 10 6 -26
+192 -6 0 -10 10 -4 -2 0 -2
+192 -6 0 -10 2 -4 -2 0 0
+0 0 2 -2 26 4 -2 0 -6
+192 -12 12 -40 240 32 -8 6 -56
+480 -7 -5 -12 -30 52 -8 0 -14
+0 0 4 -16 16 80 -12 2 -4
+0 4 6 -12 4 48 -12 0 -4
+1152 -36 -12 -60 -20 -40 4 6 -4
+0 2 8 -16 12 56 -12 0 -4
+0 10 16 -32 12 120 -28 0 -12
+96 9 -1 16 -6 36 -20 0 -6
+96 1 -1 0 -6 4 -4 0 -2
+416 -10 -6 -12 -24 16 4 2 -8
+192 -4 -4 6 -10 -4 -2 2 -2
+192 -4 -4 8 -12 0 -2 2 0
+0 4 -2 -3 1 2 3 2 -1
+960 -12 -12 -44 -52 -16 4 2 -8
+576 -8 -8 -28 -28 -16 4 2 -4
+0 3 5 -9 1 10 -1 2 -1
+0 3 7 -9 1 10 -3 2 -1
+1792 -16 -24 -88 -88 -48 8 6 -16
+864 -15 -11 -39 -41 -26 3 2 -7
+672 -11 -9 -31 -33 -18 3 2 -5
+960 -16 -12 -42 -50 -20 2 2 -8
+3200 -80 -40 -154 -90 -132 18 10 -6
+1920 -48 -24 -94 -46 -76 10 6 -2
+1056 -12 -12 -50 -58 -4 -2 2 -14
+960 -12 -12 -44 -52 -8 4 2 -12
+0 0 6 -20 20 56 -8 2 -6
+192 8 8 -24 -8 16 -8 2 -8
+0 3 1 -2 4 8 -2 0 -4
+0 11 1 -2 20 40 -6 0 -20
+0 0 18 -3 13 10 -13 0 -3
+400 -6 -4 -16 -20 -8 -2 0 -4
+3648 -64 -40 -144 -176 -96 -8 2 -32
+624 -8 -6 -26 -34 -4 -4 0 -8
+576 0 -6 -28 -36 0 -4 2 0
+4608 -60 -52 -200 -240 -96 -8 6 -48
+1152 -18 -14 -48 -60 -24 0 2 -12
+1920 -34 -22 -80 -92 -56 0 2 -16
+1728 -36 -22 -74 -82 -52 8 4 -14
+1344 -28 -20 -40 -80 96 8 6 -32
+576 -12 -8 -12 -36 56 0 2 -16
+528 -13 -7 -16 -30 4 4 2 -8
+192 -12 12 -48 40 80 -16 6 -8
+192 -12 12 -48 200 80 -16 6 -48
+0 0 6 -12 52 40 -8 0 -12
+0 0 2 -3 21 10 -3 0 -5
+256 -8 0 -12 12 -8 -2 0 -4
+192 -6 0 -7 13 -6 -3 0 -5
+512 -16 0 -24 0 -16 -4 0 -2
+512 -14 -6 -4 -32 0 2 2 0
+640 -16 -8 -8 -40 0 2 2 0
+960 -20 -14 -20 -60 0 2 4 0
+960 -20 -12 -4 -60 72 -12 2 -20
+960 -20 -12 -4 -60 104 -12 2 -28
+192 -12 12 20 36 -8 -28 6 0
+0 0 2 -3 5 10 -3 0 -1
+192 28 -4 -44 -4 24 20 10 -12
+64 8 0 -12 -4 8 4 2 -2
+256 14 6 -36 -16 32 4 2 -8
+48 4 6 -10 -2 20 -8 0 -4
+16 2 4 -4 0 8 -4 0 -2
+0 12 36 -28 12 56 -28 2 -12
+0 4 4 -8 0 8 0 2 0
+64 4 8 -12 -4 8 -4 2 0
+448 12 12 -36 -28 8 -12 2 -4
+768 -10 -8 -28 -48 8 -4 0 -4
+1536 -22 -16 -52 -96 56 -12 0 -28
+1792 -16 -16 -88 -88 -48 0 2 -16
+384 6 -10 -20 -24 0 4 6 0
+2304 -12 -28 -104 -144 0 -8 6 0
+3840 -48 -40 -168 -200 -80 -8 2 -40
+0 0 8 -6 10 4 -2 2 -4
+0 4 8 -6 18 4 -2 2 -10
+768 -16 -10 -16 -48 24 -2 2 -12
+2304 -56 -32 -32 -144 96 8 10 -48
+1792 -48 -24 -16 -112 0 8 10 0
+2304 -56 -32 -32 -144 0 8 10 0
+192 -6 0 -7 5 -6 -3 0 -3
+448 -14 0 -19 1 -14 -5 0 -3
+576 -18 0 -24 4 -16 -8 0 -4
+2880 -60 -36 -96 -168 -16 8 6 -16
+192 -6 0 10 -10 -4 -2 0 -2
+256 -8 0 12 -12 -8 -4 0 -2
+512 -16 0 0 -24 -16 -2 0 -4
+192 -6 0 2 -10 -4 0 0 -2
+576 -18 0 4 -24 -16 -4 0 -8
+448 -14 0 1 -19 -14 -3 0 -5
+576 -18 0 -3 -23 -22 -3 0 -5
+192 -6 0 5 -7 -6 -3 0 -3
+192 -6 0 13 -7 -6 -5 0 -3
+64 -4 4 20 -4 24 4 2 -4
+2304 -56 -32 -96 -96 -96 16 10 0
+768 -30 0 -32 -28 -32 8 6 0
+0 1 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0
+0 0 0 0 1 0 0 0 0
+0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/mit288-281.ine b/demos/ppl_lcdd/examples/mit288-281.ine
new file mode 100644
index 0000000..895a518
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit288-281.ine
@@ -0,0 +1,291 @@
+begin
+288 281 rational
+1 -3 0 10 -4 -8 8 4 -4 -4 4 4 2 4 8 -12 -4 4 0 -2 1 0 -8 -4 0 4 -4 0 -8 -16 2 -8 4 4 12 8 2 0 -8 16 0 0 -4 -4 -8 -4 -4 0 24 8 0 -4 -2 8 -2 0 -8 -1 -16 -10 -8 -4 -12 0 24 8 -12 2 4 -4 4 -8 12 0 -8 -8 16 8 0 0 -4 -8 0 0 0 8 0 8 0 0 0 0 -16 -24 10 16 16 -16 0 4 -16 4 16 4 -16 8 16 8 12 -8 -4 -8 0 8 -8 4 -12 0 -8 4 16 4 -24 -6 8 -4 -8 12 8 8 4 8 -16 0 16 0 -16 0 -24 0 8 0 0 4 -16 -8 -4 -8 16 12 8 -16 -16 16 16 8 16 -16 16 -16 8 4 -8 8 0 8 4 0 0 -12 -16 16 -8 -8 4 0 4 0 10 8 4 0 12 -4 4 -24 - [...]
+1 -5 0 12 -2 -4 0 4 -8 0 2 0 4 8 8 -8 0 0 0 -4 -1 -8 -8 -8 8 0 -4 0 0 -8 2 0 0 4 8 0 -2 0 0 4 -4 -8 0 0 -8 0 0 8 8 8 0 0 -2 0 2 0 -8 1 -4 0 0 0 -4 -8 0 0 0 0 0 0 -4 0 0 0 0 -8 8 0 8 4 0 8 0 0 0 0 0 4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 -8 -8 0 8 4 0 4 0 4 8 0 0 0 -4 4 0 -8 0 -8 0 0 0 -8 0 0 0 0 8 8 0 8 0 0 0 0 0 0 0 0 0 -8 0 -4 8 0 0 -8 -8 0 -8 0 0 -8 0 8 0 -4 0 -4 0 -4 0 0 4 0 0 8 0 0 0 0 0 0 0 0 -8 0 -4 -4 0 0 8 0 -8 0 8 0 0 0 0 0 0 0 4 -8 0 8 0 0 2 0 0 4 -4 0 -8 0 0 0 0 0 -8 0 0 8 -2 0 -8 [...]
+1 -7 4 14 0 0 -8 4 -12 4 0 -4 -2 4 8 -8 4 -4 0 2 1 0 -8 -4 0 -4 -4 0 24 0 -2 0 4 4 4 -8 -2 0 0 -8 -8 -16 4 4 8 4 4 0 -8 -8 0 -4 2 0 2 0 8 -1 8 2 -8 4 4 0 8 0 -4 -10 -4 -4 4 -8 12 0 8 8 0 8 16 8 4 8 -16 0 0 8 0 0 0 0 0 0 16 -8 -2 0 0 0 0 -4 0 -4 0 -4 -16 -8 -16 -8 -4 -8 -4 -8 0 -8 -4 -4 -12 0 0 -4 16 4 8 6 8 4 8 4 4 8 4 -8 0 0 0 0 0 0 -8 0 8 0 0 -4 0 -8 -4 8 0 4 -8 0 0 0 0 8 0 0 16 16 0 4 0 8 0 4 -4 0 0 -12 -16 -16 -8 -4 -4 0 -4 0 -2 -8 -4 0 -4 4 4 8 6 -8 0 -8 0 0 8 -8 4 0 8 4 -8 -4 8 -8  [...]
+1 -7 0 18 0 0 0 4 -12 0 0 -12 6 12 0 -12 0 0 12 -6 -3 -24 0 -12 24 0 -4 0 0 -12 6 0 0 12 12 0 -6 0 0 0 0 -24 12 12 -24 12 0 24 0 24 -12 12 -6 0 6 0 0 3 0 6 0 -12 12 -24 0 0 0 6 0 -12 -12 0 -12 0 0 0 12 0 24 0 -12 24 0 -12 4 -12 0 0 0 0 12 0 -24 0 -6 -24 0 24 -4 12 0 -12 -24 -12 0 -24 24 24 -12 0 12 12 0 0 0 -12 12 0 0 12 0 12 0 -6 0 0 -24 0 0 0 -12 0 0 0 0 0 24 -12 0 0 0 0 0 -12 0 0 12 -24 -24 0 0 24 0 -24 0 0 0 24 0 -24 0 -12 0 -12 0 0 12 0 0 12 0 24 12 0 12 4 -12 -4 -6 0 -12 0 -12 0 12 [...]
+1 -7 0 14 0 4 0 0 -12 -4 0 -4 6 4 0 -4 4 4 -8 -6 -3 -16 0 -4 0 0 0 -8 8 8 2 0 0 0 4 0 -2 -8 0 4 -4 0 4 -12 8 4 0 16 0 0 8 12 -2 0 2 8 0 3 -4 -2 0 12 0 0 0 0 4 -2 12 4 0 0 -4 8 0 0 -8 8 0 4 -4 -8 -8 4 -4 -8 0 4 0 0 -4 0 0 0 2 16 -8 -16 4 -12 8 12 0 -4 8 8 0 -8 0 -8 0 8 0 0 0 -4 4 0 -4 4 -8 -4 0 2 0 -12 0 -4 0 0 -12 0 -8 0 8 0 0 4 0 0 0 0 0 -4 -8 -8 0 0 0 -4 0 -16 8 16 -8 0 8 0 -8 0 4 -12 -4 -8 0 0 4 0 0 4 8 0 8 0 -12 -4 12 4 2 0 -4 0 0 -12 -4 0 2 -8 -4 8 0 0 0 0 4 8 8 0 0 4 0 0 12 -2 -4 - [...]
+1 -9 4 20 2 8 -8 0 -16 -4 -2 -16 0 0 -8 -12 4 4 4 0 -1 -8 8 0 8 0 0 0 24 4 2 0 0 8 8 0 -2 0 0 0 0 -8 8 0 0 8 0 8 -8 0 -4 8 -2 0 2 0 8 1 0 4 -8 0 8 -8 8 0 -4 -4 4 0 0 8 0 0 0 8 -4 8 8 0 -8 0 -16 0 0 -4 8 -8 -4 0 0 -8 8 -8 -4 -8 0 -8 0 0 0 0 -8 -8 0 0 8 0 -8 -8 0 -4 -4 -8 -4 -8 0 4 -8 8 0 0 8 4 8 -4 0 4 -4 -8 -8 -8 -16 0 -16 0 -8 0 8 8 -8 0 0 8 16 8 0 0 8 -4 8 8 0 8 0 8 16 8 0 -8 8 8 8 4 4 4 -8 -4 -8 0 0 -8 4 4 0 0 0 0 4 8 8 4 8 4 0 -8 -4 0 0 0 0 0 -8 8 -8 0 -8 0 0 4 -8 -8 -8 2 8 0 0 0 4 4 [...]
+1 -11 8 26 4 16 -24 -4 -20 -12 -4 -28 -6 -12 -24 -20 4 12 8 6 1 16 24 12 16 4 4 16 40 8 2 8 4 12 12 8 2 16 8 8 8 16 -4 -4 -8 -4 -4 -16 -8 -8 -8 -4 -2 -8 -2 -16 -8 -1 -8 -2 -8 -4 -4 -16 -8 -8 -4 -6 -4 -4 -4 -8 -4 -16 -8 -8 -8 -8 -16 -8 -4 -8 -16 0 0 0 0 0 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 4 8 4 0 0 8 0 4 4 0 0 4 0 4 8 2 8 4 8 4 0 8 4 8 0 0 0 0 0 0 8 0 8 0 0 4 0 8 4 8 0 4 8 0 0 0 0 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 8 4 0 4 4 4 8 2 8 0 8 0 -8 -8 -8 -4 -16 -8 -4 -8 -4 -8  [...]
+1 -13 12 36 6 24 -48 -8 -32 -24 -6 -48 -12 -24 -48 -36 8 24 24 12 3 48 48 24 48 12 8 48 96 24 6 24 12 24 24 24 6 48 24 24 24 48 -24 -24 -48 -24 -12 -48 -48 -48 -24 -24 -6 -24 -6 -48 -48 -3 -24 -12 -48 -24 -24 -48 -48 -24 -24 -24 -24 -24 -24 -48 -24 -48 -24 -48 -24 -48 -48 -24 -24 -48 -48 12 4 24 24 24 12 48 12 24 48 48 12 48 48 48 4 24 48 24 48 24 48 48 48 48 24 48 24 24 12 48 12 24 24 12 24 24 48 24 48 12 48 24 48 24 12 48 24 48 48 16 48 48 48 -12 -48 -24 -48 -48 -16 -24 -48 -48 -24 -48 [...]
+1 13 12 36 6 24 48 8 32 24 6 48 12 24 48 36 8 24 24 12 3 48 48 24 48 12 8 48 96 24 6 24 12 24 24 24 6 48 24 24 24 48 24 24 48 24 12 48 48 48 24 24 6 24 6 48 48 3 24 12 48 24 24 48 48 24 24 24 24 24 24 48 24 48 24 48 24 48 48 24 24 48 48 12 4 24 24 24 12 48 12 24 48 48 12 48 48 48 4 24 48 24 48 24 48 48 48 48 24 48 24 24 12 48 12 24 24 12 24 24 48 24 48 12 48 24 48 24 12 48 24 48 48 16 48 48 48 12 48 24 48 48 16 24 48 48 24 48 48 24 48 48 48 48 48 48 48 48 48 48 24 24 24 24 12 12 24 12 24 [...]
+1 11 8 26 4 16 24 4 20 12 4 28 6 12 24 20 4 12 8 6 1 16 24 12 16 4 4 16 40 8 2 8 4 12 12 8 2 16 8 8 8 16 4 4 8 4 4 16 8 8 8 4 2 8 2 16 8 1 8 2 8 4 4 16 8 8 4 6 4 4 4 8 4 16 8 8 8 8 16 8 4 8 16 0 0 0 0 0 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 4 8 4 0 0 8 0 4 4 0 0 4 0 4 8 2 8 4 8 4 0 8 4 8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 -8 -4 -8 0 -4 -8 0 0 0 0 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 -8 -4 0 -4 -4 -4 -8 -2 -8 0 -8 0 -8 -8 -8 -4 -16 -8 -4 -8 -4 -8 -8 -4 -2 -4 -4 -8 -8 -8 -8 - [...]
+1 11 12 12 6 24 48 8 -16 24 -6 0 12 24 48 12 -8 -24 24 -12 3 48 -48 -24 48 12 -8 48 0 24 6 24 12 -24 -24 24 6 48 24 24 24 48 24 24 48 24 -12 -48 48 48 -24 24 -6 -24 -6 -48 48 -3 -24 12 48 24 24 -48 48 -24 24 0 24 24 24 48 24 -48 -24 48 -24 48 -48 -24 24 48 -48 12 4 24 24 24 12 48 12 24 48 -48 -12 48 48 48 4 -24 48 -24 48 -24 48 -48 48 -48 -24 -48 -24 24 12 -48 12 -24 -24 12 24 -24 48 -24 -48 -12 -48 -24 -48 -24 12 -48 -24 -48 48 16 48 48 48 -12 48 -24 48 -48 -16 24 -48 48 24 48 -48 24 48 [...]
+1 9 8 16 2 8 16 0 8 0 2 8 8 8 0 16 0 0 -8 8 3 16 0 8 0 -4 0 16 16 -8 2 8 4 0 8 0 2 0 0 -8 -8 0 8 -16 -16 0 -4 16 -16 0 -8 16 2 8 2 16 -16 3 -8 0 0 -16 0 0 0 0 0 4 0 0 0 16 8 0 0 0 -8 0 0 -8 0 -16 0 -4 -4 8 0 8 -4 -32 -4 0 0 0 0 -16 -16 -16 -4 -16 -16 -16 0 0 0 -16 0 -16 0 0 0 8 4 0 8 8 8 -4 8 0 0 0 -16 0 0 0 0 0 8 16 16 -16 0 0 0 -16 0 -4 0 0 0 -16 0 8 0 0 0 0 0 0 0 -16 -16 -16 -16 16 0 0 0 0 8 16 8 8 4 8 0 -4 0 8 0 0 8 8 -16 -4 -16 -4 0 -16 0 -4 0 0 0 -16 0 -16 -4 -16 -32 8 0 0 8 16 0 0 [...]
+1 9 4 20 2 8 8 0 16 4 2 16 0 0 8 12 4 4 4 0 -1 -8 8 0 8 0 0 0 24 4 2 0 0 8 8 0 -2 0 0 0 0 -8 -8 0 0 -8 0 -8 8 0 4 -8 2 0 -2 0 -8 -1 0 -4 8 0 -8 8 -8 0 4 4 -4 0 0 -8 0 0 0 -8 4 -8 -8 0 8 0 16 0 0 -4 8 -8 -4 0 0 -8 8 -8 -4 -8 0 -8 0 0 0 0 -8 -8 0 0 8 0 -8 -8 0 -4 -4 -8 -4 -8 0 4 -8 8 0 0 8 4 8 -4 0 4 -4 -8 -8 -8 -16 0 -16 0 -8 0 -8 -8 8 0 0 -8 -16 -8 0 0 -8 4 -8 -8 0 -8 0 -8 -16 -8 0 8 -8 -8 -8 -4 -4 -4 8 4 8 0 0 8 -4 -4 0 0 0 0 -4 -8 -8 -4 -8 -4 0 8 4 0 0 0 0 0 -8 8 -8 0 -8 0 0 4 -8 -8 -8 [...]
+1 9 4 16 6 8 0 0 8 0 6 8 8 0 32 4 0 0 8 8 3 16 32 0 -16 12 0 16 -16 8 -2 -8 -4 0 0 8 -2 -16 8 8 8 -16 0 16 0 -16 12 16 0 0 8 16 -2 -8 -2 16 0 3 8 -8 -32 16 0 -16 -32 8 0 -12 0 -16 0 0 0 -16 8 32 8 0 -16 8 -16 0 -16 -4 4 8 -24 8 -4 16 -4 -24 -16 -32 -8 16 16 16 4 16 16 16 -16 -16 -16 0 -16 0 0 0 0 8 12 32 4 0 0 -4 8 -16 -16 -16 0 -8 -32 0 0 0 4 0 16 0 -16 -16 -16 -16 -16 -4 -32 -24 -32 -16 -16 0 -16 0 0 0 -16 0 32 16 16 16 16 0 -16 -16 -16 -16 8 16 8 8 12 4 -16 -4 -24 0 -16 -16 8 4 16 4 1 [...]
+1 9 4 16 2 12 8 4 8 8 2 16 0 8 8 4 0 8 0 0 -1 0 8 8 0 0 4 -8 0 0 -2 0 0 4 0 0 2 8 0 4 4 16 0 0 0 8 0 0 -8 -8 0 -8 -2 0 2 -8 8 -1 4 4 -8 0 4 0 8 0 -8 -4 0 0 -4 -8 -8 8 0 -8 0 0 16 4 -8 0 -8 0 0 -8 -8 -4 4 0 0 8 -16 8 4 0 -8 0 0 0 -8 0 0 8 -8 0 -16 0 4 0 -4 -8 -4 -8 -4 0 -8 -4 -4 -8 -8 0 -8 -4 -8 0 -8 -8 -4 -8 -8 8 8 0 8 0 0 0 8 8 -8 0 0 0 8 0 -4 -8 0 -8 -8 0 -8 0 -8 -8 8 0 -8 -16 -4 -8 -4 -8 -4 -4 -8 -4 -8 -8 -8 -16 -8 -4 0 0 0 0 4 8 8 4 4 0 0 -8 -4 0 0 0 0 0 8 -8 0 -8 0 -4 -8 -8 -8 -8 -8 [...]
+1 9 8 6 4 16 24 4 -12 12 -4 -4 6 12 24 4 -4 -12 8 -6 1 16 -24 -12 16 4 -4 16 -8 8 2 8 4 -12 -12 8 2 16 8 8 8 16 4 4 8 4 -4 -16 8 8 -8 4 -2 -8 -2 -16 8 -1 -8 2 8 4 4 -16 8 -8 4 -2 4 4 4 8 4 -16 -8 8 -8 8 -16 -8 4 8 -16 0 0 0 0 0 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 -4 -8 -4 0 0 -8 0 -4 -4 0 0 -4 0 -4 -8 -2 -8 -4 -8 -4 0 -8 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 -8 -4 -8 0 -4 -8 0 0 0 0 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 -8 -4 0 -4 -4 -4 -8 -2 -8 0 -8 0 -8 8 8 4 - [...]
+1 7 4 14 0 0 8 -4 12 -4 0 4 2 -4 -8 8 4 -4 0 2 1 0 -8 -4 0 -4 -4 0 24 0 -2 0 4 4 4 -8 -2 0 0 -8 -8 -16 -4 -4 -8 -4 -4 0 8 8 0 4 -2 0 -2 0 -8 1 -8 -2 8 -4 -4 0 -8 0 4 10 4 4 -4 8 -12 0 -8 -8 0 -8 -16 -8 -4 -8 16 0 0 8 0 0 0 0 0 0 16 -8 -2 0 0 0 0 -4 0 -4 0 -4 -16 -8 -16 -8 -4 -8 -4 -8 0 -8 -4 -4 -12 0 0 -4 16 4 8 6 8 4 8 4 4 8 4 -8 0 0 0 0 0 0 8 0 -8 0 0 4 0 8 4 -8 0 -4 8 0 0 0 0 -8 0 0 -16 -16 0 -4 0 -8 0 -4 4 0 0 12 16 16 8 4 4 0 4 0 2 8 4 0 4 -4 -4 -8 -6 8 0 8 0 0 8 -8 4 0 8 4 -8 -4 8  [...]
+1 7 8 6 4 0 8 -4 -4 -12 4 -12 10 4 8 12 -4 -12 -8 10 1 16 8 4 -16 4 -4 16 -8 -8 2 8 4 -12 4 8 2 -16 8 -8 -8 -16 12 -4 -8 -4 4 16 -8 -8 -8 -4 2 8 2 16 -8 1 -8 -2 -8 -4 -4 -16 -8 8 -4 2 -4 -4 -4 24 12 -16 8 24 -8 -8 -16 -8 -4 -8 -16 0 0 -16 0 16 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 -4 -8 -4 16 0 24 0 12 12 0 -16 -4 0 -4 -8 -2 -8 -4 -8 -4 0 24 -4 -8 0 0 0 0 0 0 8 0 8 0 0 -12 0 8 4 8 0 4 -24 0 0 0 0 -24 0 0 0 0 -16 4 16 16 0 0 4 0 0 -12 0 0 -16 0 4 0 4 0 2 8 4 0 4 4 4 8 2 8 0 8 0 - [...]
+1 7 4 6 0 8 8 4 -4 4 0 4 2 4 -8 0 -4 4 -8 2 1 0 -8 4 0 -4 4 0 -8 -8 -2 0 4 -4 -4 -8 -2 0 0 0 0 16 -12 -4 -8 -4 -4 0 -8 -8 -8 4 -2 0 -2 0 8 1 0 6 -8 -4 4 0 8 0 -4 2 -4 4 4 8 -4 0 -8 -8 -8 8 16 0 -4 -8 -16 0 0 0 0 -8 0 0 0 0 0 8 6 0 0 0 0 -4 0 -4 -16 -4 0 -8 0 -8 4 8 4 0 0 -8 -4 -12 -4 0 8 -4 0 4 -8 -2 -8 -4 -8 -4 4 8 4 8 -16 0 16 0 16 0 -8 0 8 0 0 12 16 -8 -4 8 16 4 8 0 0 0 0 -8 -16 -16 0 0 8 -4 -8 0 0 -4 4 0 0 4 0 0 0 4 4 0 4 0 -6 -8 4 0 -4 4 -4 8 2 8 0 8 0 0 -8 8 12 0 -8 -4 8 4 8 -8 -4  [...]
+1 7 4 10 0 4 0 0 4 0 0 4 2 4 -8 8 0 0 -4 2 1 0 -8 4 0 -4 0 0 0 -4 2 0 -4 0 4 0 2 0 -8 -4 -4 0 4 -4 0 4 -4 0 -8 0 -4 4 2 0 2 0 -8 1 -4 -2 0 -4 0 0 0 -8 0 -6 0 -4 0 -16 4 0 0 -8 -4 0 0 -4 4 0 0 0 0 4 0 -4 0 0 0 0 -8 0 -2 0 0 0 0 -4 0 -4 8 4 8 0 8 0 0 0 0 -4 0 -8 4 4 4 0 4 4 -8 -4 -8 -2 0 0 0 0 -4 -16 4 -8 8 0 -8 0 -8 0 0 0 0 0 0 -4 -8 0 0 0 -8 0 8 0 0 0 0 16 8 8 8 8 4 -4 -4 -4 0 4 -4 0 0 -4 -8 -8 4 -4 4 0 4 0 2 8 -4 0 0 0 4 8 2 0 0 0 0 0 0 0 -4 0 0 0 0 0 8 16 -4 -2 -4 -4 4 4 4 4 4 4 4 8 4  [...]
+1 7 8 0 2 8 16 0 -8 0 -2 -8 8 8 0 0 0 0 -8 -8 3 16 0 -8 0 -4 0 16 -16 -8 2 8 4 0 -8 0 2 0 0 -8 -8 0 8 -16 -16 0 4 -16 -16 0 8 16 -2 -8 -2 -16 -16 -3 8 0 0 -16 0 0 0 0 0 -4 0 0 0 16 8 0 0 0 8 0 0 8 0 -16 0 -4 -4 8 0 8 -4 -32 -4 0 0 0 0 -16 -16 -16 -4 16 -16 16 0 0 0 16 0 16 0 0 0 8 4 0 8 -8 -8 -4 8 0 0 0 16 0 0 0 0 0 8 -16 -16 16 0 0 0 -16 0 4 0 0 0 16 0 8 0 0 0 0 0 0 0 16 16 16 16 16 0 0 0 0 -8 16 -8 -8 -4 -8 0 4 0 8 0 0 -8 -8 -16 4 -16 4 0 -16 0 4 0 0 0 -16 0 -16 4 -16 32 8 0 0 -8 16 0  [...]
+1 7 0 10 4 4 -8 0 4 0 4 4 2 -4 16 -4 0 0 4 2 1 0 16 -4 -8 4 0 0 -16 4 -2 -8 -4 0 -4 0 -2 -8 0 4 4 -8 -4 4 0 -4 4 0 0 0 4 4 -2 -8 -2 0 0 1 4 -2 -8 4 0 -8 -8 0 0 -6 0 -4 0 -8 -4 -8 0 0 4 0 -8 4 -4 0 -8 0 0 4 0 -4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 -4 0 0 0 -4 -4 0 4 -4 0 -4 0 -2 -8 0 0 0 0 -8 4 0 0 0 0 0 0 0 8 0 8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 4 -4 -4 -4 0 0 4 0 0 4 0 0 4 0 -4 0 -4 0 2 0 4 0 0 0 4 0 2 0 0 0 0 8 8 8 4 0 0 0 0 0 0 8 -4 2 4 4 -4 -4 -4 -4 -4 -4 -4 0 4 8 2 [...]
+1 7 0 18 0 0 0 -4 12 0 0 12 -6 -12 0 12 0 0 12 -6 -3 -24 0 -12 24 0 -4 0 0 -12 6 0 0 12 12 0 -6 0 0 0 0 -24 -12 -12 24 -12 0 -24 0 -24 12 -12 6 0 -6 0 0 -3 0 -6 0 12 -12 24 0 0 0 -6 0 12 12 0 12 0 0 0 -12 0 -24 0 12 -24 0 -12 4 -12 0 0 0 0 12 0 -24 0 -6 -24 0 24 -4 12 0 -12 -24 -12 0 -24 24 24 -12 0 12 12 0 0 0 -12 12 0 0 12 0 12 0 -6 0 0 -24 0 0 0 -12 0 0 0 0 0 24 12 0 0 0 0 0 12 0 0 -12 24 24 0 0 -24 0 24 0 0 0 -24 0 24 0 12 0 12 0 0 -12 0 0 -12 0 -24 -12 0 -12 -4 12 4 6 0 12 0 12 0 -1 [...]
+1 7 0 14 0 4 0 0 12 4 0 4 -6 -4 0 4 4 4 -8 -6 -3 -16 0 -4 0 0 0 -8 8 8 2 0 0 0 4 0 -2 -8 0 4 -4 0 -4 12 -8 -4 0 -16 0 0 -8 -12 2 0 -2 -8 0 -3 4 2 0 -12 0 0 0 0 -4 2 -12 -4 0 0 4 -8 0 0 8 -8 0 -4 4 8 8 4 -4 -8 0 4 0 0 -4 0 0 0 2 16 -8 -16 4 -12 8 12 0 -4 8 8 0 -8 0 -8 0 8 0 0 0 -4 4 0 -4 4 -8 -4 0 2 0 -12 0 -4 0 0 -12 0 -8 0 8 0 0 -4 0 0 0 0 0 4 8 8 0 0 0 4 0 16 -8 -16 8 0 -8 0 8 0 -4 12 4 8 0 0 -4 0 0 -4 -8 0 -8 0 12 4 -12 -4 -2 0 4 0 0 12 4 0 -2 8 4 -8 0 0 0 0 4 8 8 0 0 4 0 0 12 -2 -4 - [...]
+1 7 0 10 0 8 0 4 4 0 0 12 -6 4 0 -4 0 0 4 -6 -3 -8 0 4 -8 0 4 -16 0 -4 -2 0 0 4 -4 0 2 0 0 -8 8 8 4 -12 -8 4 0 -8 0 -8 4 -12 -2 0 2 -16 0 -3 -8 2 0 12 -4 -8 0 0 0 2 0 -4 -12 0 -4 0 0 0 -4 0 8 8 -4 8 0 4 4 -4 0 8 0 0 -4 0 8 0 2 -8 16 8 -4 12 -16 -12 8 4 0 8 -8 -8 -4 0 -12 4 0 0 0 4 -4 0 -8 -4 0 -4 0 2 0 0 -8 0 0 0 -12 0 0 0 0 0 -8 -4 0 0 0 0 0 -4 0 0 12 8 -8 0 0 -8 16 8 -16 0 0 8 0 -8 -8 12 8 4 0 0 4 0 0 4 0 8 -4 0 -12 -4 12 4 -2 0 -4 0 4 0 4 0 -2 8 4 -8 0 0 0 0 -4 16 0 12 8 0 0 0 12 2 4  [...]
+1 7 4 4 2 8 8 0 -8 4 -2 0 0 0 8 4 -4 -4 4 0 -1 -8 -8 0 8 0 0 0 8 4 2 0 0 -8 -8 0 -2 0 0 0 0 -8 -8 0 0 -8 0 8 8 0 -4 -8 -2 0 2 0 -8 1 0 -4 8 0 -8 -8 -8 0 4 4 -4 0 0 -8 0 0 0 -8 -4 -8 8 0 8 0 -16 0 0 -4 8 -8 -4 0 0 -8 8 8 4 -8 0 -8 0 0 0 0 -8 8 0 0 8 0 8 8 0 -4 -4 8 -4 8 0 4 -8 -8 0 0 -8 -4 -8 4 0 -4 -4 8 8 8 -16 0 -16 0 -8 0 -8 8 8 0 0 -8 16 -8 0 0 8 4 -8 8 0 8 0 -8 16 8 0 -8 8 -8 8 4 4 4 8 -4 -8 0 0 -8 4 4 0 0 0 0 -4 -8 -8 4 -8 -4 0 8 4 0 0 0 0 0 8 -8 8 0 8 0 0 -4 8 8 8 2 -8 0 0 0 4 4 0  [...]
+1 7 4 0 6 8 0 0 -8 0 -6 -8 8 0 32 -4 0 0 8 -8 3 16 -32 0 -16 12 0 16 -16 8 -2 -8 -4 0 0 8 -2 -16 8 8 8 -16 0 16 0 -16 -12 -16 0 0 -8 16 2 8 2 -16 0 -3 -8 -8 -32 16 0 16 -32 -8 0 -4 0 -16 0 0 0 16 -8 32 -8 0 16 -8 -16 0 16 -4 4 8 -24 8 -4 16 -4 -24 -16 32 8 16 16 16 4 -16 16 -16 -16 16 -16 0 -16 0 0 0 0 8 12 -32 4 0 0 -4 8 16 -16 16 0 8 32 0 0 0 4 0 -16 0 -16 -16 -16 -16 -16 4 -32 24 -32 16 16 0 16 0 0 0 16 0 32 -16 -16 -16 -16 0 16 16 16 16 -8 16 -8 -8 -12 -4 -16 4 24 0 16 16 -8 -4 16 -4 [...]
+1 7 0 6 0 12 0 0 -4 12 0 12 -6 12 0 -12 -4 12 0 -6 -3 0 0 12 0 0 0 -24 -24 0 -6 0 0 0 -12 0 6 24 0 12 -12 0 12 12 24 12 0 0 0 0 0 -12 -6 0 6 -24 0 -3 12 -6 0 -12 0 0 0 0 -12 -6 12 12 0 0 -12 24 0 0 0 -24 0 -12 -12 -24 -24 -12 -4 0 0 12 0 0 12 0 0 0 -6 0 -24 0 4 -12 24 12 0 12 -24 -24 0 24 0 -24 0 0 0 0 0 12 -12 0 -12 -12 24 12 0 -6 0 12 0 -12 0 0 -12 0 24 0 -24 0 0 12 0 0 0 0 0 -12 -24 24 0 0 0 12 0 0 -24 0 24 0 24 0 -24 0 -12 12 12 0 0 0 12 0 0 12 24 0 0 0 12 4 -12 -4 6 0 -12 0 0 -12 -1 [...]
+1 7 4 0 2 12 8 4 -8 8 -2 -8 0 8 8 -4 0 -8 0 0 -1 0 -8 -8 0 0 -4 -8 -16 0 -2 0 0 -4 0 0 2 8 0 4 4 16 0 0 0 8 0 0 -8 -8 0 -8 2 0 -2 8 8 1 -4 4 -8 0 4 0 8 0 -8 -4 0 0 -4 -8 -8 -8 0 -8 0 0 -16 -4 -8 0 8 0 0 -8 -8 -4 4 0 0 8 -16 -8 -4 0 -8 0 0 0 -8 0 0 -8 -8 0 -16 0 -4 0 4 -8 -4 8 -4 0 8 -4 -4 8 -8 0 8 4 8 0 8 8 -4 8 8 -8 8 0 8 0 0 0 8 -8 -8 0 0 0 -8 0 -4 -8 0 -8 -8 0 8 0 8 -8 -8 0 8 16 4 -8 4 8 4 4 -8 4 8 -8 8 16 8 4 0 0 0 0 4 8 8 -4 4 0 0 -8 -4 0 0 0 0 0 -8 8 0 -8 0 4 8 8 8 8 8 -2 8 8 4 4 0 [...]
+1 5 4 12 -2 -8 16 -8 16 -8 -2 0 4 -8 -16 -4 8 -8 8 4 3 16 -16 -8 -16 -4 -8 -16 32 8 -2 -8 12 8 -8 -24 -2 16 8 -8 -8 -16 -8 8 -16 8 -4 16 16 16 8 8 -2 -8 -2 -16 16 3 -8 4 -16 8 8 -16 -16 8 -8 16 24 8 -24 16 -8 16 -24 -16 8 -16 -16 -8 8 -16 16 -4 4 8 8 -8 12 16 -4 8 -16 -16 4 16 -16 16 4 8 -16 8 -16 8 16 -16 -16 -16 8 -16 -24 8 -4 -16 4 -8 -8 12 -8 8 16 8 16 4 -16 24 16 -8 4 16 8 16 16 -16 16 -16 -16 -4 -16 8 -16 -16 -16 -8 16 -16 -24 16 -16 -8 -16 16 -16 16 -16 16 16 -16 16 -16 -8 8 -8 8  [...]
+1 5 4 4 2 -4 0 -4 0 -8 2 -8 4 0 0 4 0 -8 0 4 -1 0 0 0 -8 0 -4 8 0 0 -2 0 0 -4 0 0 2 0 0 -4 -4 -8 0 0 0 8 0 0 0 8 0 -8 -2 0 2 8 0 -1 -4 0 0 0 -4 -8 0 0 8 0 0 0 4 0 0 0 0 0 0 0 -8 -4 -8 0 0 0 0 0 -8 -4 4 0 0 8 8 0 0 0 8 0 0 0 8 0 8 8 0 0 8 0 -4 0 4 0 -4 0 -4 0 0 -4 -4 -8 0 0 0 0 0 0 8 8 -4 0 -8 0 0 0 0 0 8 0 0 8 0 0 0 0 0 0 4 8 8 8 0 0 8 0 8 0 0 8 0 8 -4 -8 -4 0 -4 -4 -8 -4 -8 0 0 8 0 -4 0 0 0 0 0 0 8 4 -4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 4 8 8 0 0 -8 -2 -8 0 -4 -4 0 0 0 0 0 0 0 -8 0 0 0 2 8 0  [...]
+1 5 4 4 -2 0 0 0 0 0 -2 0 4 0 -16 4 0 0 0 4 3 0 -16 0 0 -4 0 0 0 0 -2 8 -4 0 0 -8 -2 0 -8 0 0 0 0 8 0 -8 -4 0 0 0 0 8 -2 8 -2 0 0 3 0 -4 16 8 0 0 16 -8 0 -8 0 -8 0 0 0 0 -8 -16 0 0 0 0 -8 0 0 -4 4 0 -8 0 -4 16 -4 -8 0 16 -4 0 0 0 4 8 0 8 0 -8 0 0 0 0 0 0 0 0 -4 -16 4 0 0 -4 0 -8 0 -8 0 -4 16 0 0 0 4 0 8 0 0 16 0 16 0 -4 16 -8 16 16 16 0 0 0 0 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 8 0 0 -4 4 -8 -4 -8 0 0 0 0 4 8 4 8 4 -4 0 -8 -4 0 0 -8 0 -4 0 -4 0 16 8 16 16 0 0 0 0 0 0 -16 0 8 -2 -8 0 0 0 0 0 -4 [...]
+1 5 0 4 2 0 0 0 0 0 2 0 4 -8 0 -8 0 0 0 4 3 0 0 -8 0 -4 0 0 0 0 -6 -8 4 0 -8 0 -6 0 0 0 0 0 -8 -8 16 -8 -4 0 0 0 0 8 -6 -8 -6 0 0 3 0 4 0 -8 0 0 0 0 0 8 0 8 0 0 -8 0 0 0 0 0 0 0 -8 16 0 12 -4 0 0 0 -4 0 12 0 0 0 4 0 0 0 -4 -8 0 -8 0 -8 0 16 0 16 0 0 0 0 4 0 0 -8 -8 -4 0 -8 0 8 0 4 0 0 0 0 0 0 8 0 0 0 0 16 0 12 0 0 0 16 0 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 4 0 -8 -4 0 -8 0 0 0 0 -8 -4 -8 -4 4 0 -8 -4 0 0 8 0 4 16 12 16 0 -8 0 0 -8 0 0 0 0 0 0 0 8 -6 -8 -8 0 0 0 0 -4 -8 -8 0 4 0 4  [...]
+1 5 0 12 -2 -4 0 -4 8 0 -2 0 -4 -8 -8 8 0 0 0 -4 -1 -8 -8 -8 8 0 -4 0 0 -8 2 0 0 4 8 0 -2 0 0 4 -4 -8 0 0 8 0 0 -8 -8 -8 0 0 2 0 -2 0 8 -1 4 0 0 0 4 8 0 0 0 0 0 0 4 0 0 0 0 8 -8 0 -8 -4 0 -8 0 0 0 0 0 4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 -8 -8 0 8 4 0 4 0 4 8 0 0 0 -4 4 0 -8 0 -8 0 0 0 -8 0 0 0 0 8 8 0 8 0 0 0 0 0 0 0 0 0 8 0 4 -8 0 0 8 8 0 8 0 0 8 0 -8 0 4 0 4 0 4 0 0 -4 0 0 -8 0 0 0 0 0 0 0 0 8 0 4 4 0 0 -8 0 8 0 -8 0 0 0 0 0 0 0 4 -8 0 8 0 0 2 0 0 4 -4 0 -8 0 0 0 0 0 -8 0 0 8 -2 0 -8 4 0 [...]
+1 5 0 8 -2 0 0 0 8 -4 -2 0 -4 0 -8 0 4 -4 -4 -4 -1 0 -8 0 0 0 0 -8 8 4 -2 0 0 0 0 0 2 -8 0 -8 0 0 8 0 -8 0 0 0 8 0 -4 0 -2 0 2 -8 -8 -1 -8 0 0 0 0 0 0 0 -4 0 -4 0 0 0 -8 -8 0 8 4 8 0 0 0 8 8 0 0 -4 0 8 -4 0 0 0 -8 0 0 0 8 0 0 0 8 0 8 0 0 8 -8 -8 0 8 0 -4 4 8 0 8 -8 4 8 0 0 0 8 0 0 -4 0 -4 0 0 0 -8 0 0 0 0 8 0 0 0 0 0 0 8 0 8 0 0 8 -4 8 0 8 0 8 0 0 8 0 -8 8 0 8 -4 4 0 0 4 0 -8 0 -8 -4 0 0 0 0 0 0 -8 0 -4 0 -4 0 8 0 -8 0 8 0 0 0 0 8 -8 8 0 0 -4 8 0 0 -2 0 -8 -8 0 -4 4 0 0 0 0 0 0 0 -8 -8 2 [...]
+1 5 4 2 0 0 8 -4 -4 -4 0 4 2 -4 -8 0 -4 4 0 -2 1 0 8 4 0 -4 4 0 8 0 -2 0 4 -4 -4 -8 -2 0 0 -8 -8 -16 -4 -4 -8 -4 4 0 8 8 0 4 2 0 2 0 -8 -1 8 -2 8 -4 -4 0 -8 0 4 2 4 4 -4 8 -12 0 8 -8 0 -8 16 8 -4 -8 -16 0 0 8 0 0 0 0 0 0 16 8 2 0 0 0 0 4 0 4 0 4 -16 8 -16 8 4 8 4 -8 0 8 -4 4 12 0 0 4 16 -4 -8 -6 -8 -4 -8 -4 4 -8 -4 8 0 0 0 0 0 0 8 0 -8 0 0 4 0 8 4 -8 0 -4 8 0 0 0 0 -8 0 0 16 16 0 -4 0 8 0 4 4 0 0 12 -16 -16 -8 -4 4 0 4 0 2 8 4 0 4 -4 -4 -8 -6 8 0 8 0 0 -8 8 -4 0 -8 -4 8 4 -8 8 4 2 -4 -12 [...]
+1 5 12 -4 6 -8 16 -8 -16 -24 6 -32 4 8 16 20 -8 -24 -8 4 3 -16 16 8 -16 12 -8 -16 0 -8 6 24 12 -24 8 24 6 -16 24 -8 -8 -16 8 8 16 8 12 -16 16 -48 -8 8 6 24 6 -16 16 3 -8 4 16 8 -24 -16 16 24 -24 16 -24 8 -24 16 8 -16 24 16 -8 -48 -16 -8 8 16 -16 12 4 -8 24 -8 12 48 12 24 -16 16 4 -16 -16 -16 4 8 -16 8 -16 8 -16 16 -16 16 -24 -48 -24 -8 12 16 12 8 8 12 -8 8 -16 8 16 4 16 -24 -48 -24 12 16 8 16 -16 16 -16 48 -16 12 16 24 16 48 16 8 -16 -48 -24 -48 -16 -24 16 -16 -16 -16 -16 16 -16 -16 -16  [...]
+1 5 4 0 2 0 0 0 -8 -4 2 -8 4 0 0 4 -4 -4 -4 4 -1 8 0 0 0 0 0 0 -8 -4 2 0 0 -8 0 0 -2 -8 0 0 0 0 0 0 0 -8 0 8 0 0 -4 -8 2 0 -2 0 0 -1 0 0 0 0 8 0 0 0 -4 0 4 0 0 0 0 -8 0 0 -4 8 0 0 8 0 -8 0 0 -4 8 0 -4 0 0 -8 0 0 0 8 0 8 0 0 0 0 0 -8 8 0 0 0 8 8 0 -4 -4 0 -4 0 0 4 0 8 8 0 0 0 0 4 0 -4 -4 0 -8 0 8 0 8 0 0 0 0 -8 0 0 0 0 8 8 0 0 0 -4 0 8 0 8 0 0 8 0 8 0 0 -8 0 -4 -4 -4 8 4 8 0 8 0 -4 -4 0 0 0 0 0 0 -8 -4 8 4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 0 -8 2 8 0 0 0 -4 -4 0 0 0 0 0 0 0 -8 0 -2 -8 8  [...]
+1 5 8 -6 4 0 8 -4 -4 -12 -4 -12 10 4 8 -4 4 12 -8 -10 1 16 -8 -4 -16 4 4 16 -24 -8 2 8 4 12 -4 8 2 -16 8 -8 -8 -16 12 -4 -8 -4 -4 -16 -8 -8 8 -4 -2 -8 -2 -16 -8 -1 8 -2 -8 -4 -4 16 -8 -8 -4 -6 -4 -4 -4 24 12 16 -8 24 8 -8 16 8 -4 -8 16 0 0 -16 0 16 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 4 8 4 16 0 -24 0 -12 -12 0 -16 4 0 4 8 2 8 4 8 4 0 -24 4 8 0 0 0 0 0 0 8 0 8 0 0 -12 0 8 4 8 0 4 -24 0 0 0 0 -24 0 0 0 0 16 4 -16 -16 0 0 4 0 0 -12 0 0 16 0 4 0 4 0 2 8 4 0 4 4 4 8 2 8 0 8 0 -8 -8 -8 12  [...]
+1 5 4 -4 -2 8 16 8 -16 8 -2 0 4 -8 -16 -4 -8 8 -8 4 3 -16 -16 -8 16 -4 8 16 0 -8 -2 -8 12 -8 -8 -24 -2 -16 8 8 8 16 -8 8 -16 8 -4 -16 16 -16 -8 8 -2 -8 -2 16 16 3 8 4 -16 8 -8 16 -16 8 8 16 -24 8 24 16 -8 -16 -24 -16 -8 16 16 8 8 -16 -16 -4 4 -8 8 8 12 16 -4 8 16 -16 4 -16 16 -16 4 8 16 8 16 8 -16 -16 16 -16 -8 16 24 -8 -4 -16 4 -8 -8 12 8 8 -16 8 16 4 -16 -24 -16 8 4 16 8 16 -16 -16 -16 -16 16 -4 -16 8 -16 -16 -16 -8 -16 16 24 -16 16 8 -16 -16 16 -16 16 16 -16 16 -16 16 8 8 8 -8 -4 4 8  [...]
+1 5 0 4 -2 4 0 4 0 0 -2 0 -4 0 -8 0 0 0 -8 -4 -1 -8 -8 0 -8 0 4 0 0 0 2 0 0 -4 0 0 -2 0 0 -4 4 8 -8 0 -8 0 0 -8 -8 8 -8 0 2 0 -2 0 8 -1 -4 0 0 0 -4 -8 0 0 0 0 0 0 -4 0 8 0 0 8 0 0 8 4 0 8 0 0 0 8 0 -4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 8 8 0 -8 -4 0 -4 8 4 8 0 -8 8 -4 -4 0 8 0 -8 0 0 0 8 0 0 0 0 8 -8 0 -8 0 0 0 0 0 0 0 0 -8 -8 0 -4 8 0 0 8 8 0 8 0 0 -8 0 8 0 -4 0 -4 8 4 0 0 -4 0 8 8 0 8 0 0 0 0 0 0 8 0 4 -4 0 0 -8 0 -8 0 8 0 0 0 0 -8 0 0 -4 8 0 8 0 0 2 0 8 -4 4 -8 0 0 0 0 0 0 8 0 0 8 -2 0 - [...]
+1 5 0 0 -2 8 0 0 -8 4 -2 8 -4 8 -8 -8 -4 4 4 -4 -1 0 -8 8 0 0 0 -8 -8 -4 -2 0 0 0 -8 0 2 8 0 0 -8 0 0 0 8 0 0 0 8 0 4 0 -2 0 2 -8 -8 -1 0 0 0 0 0 0 0 0 4 0 4 0 0 0 0 8 0 8 -4 -8 0 -8 0 -8 -8 0 0 4 0 0 -4 0 0 0 8 0 0 0 8 0 0 0 8 0 -8 0 0 -8 8 8 0 -8 0 4 4 8 0 0 0 4 0 0 0 0 8 0 0 4 0 4 0 0 0 -8 0 0 0 0 -8 0 0 0 0 0 0 0 0 -8 0 0 -8 4 8 0 8 0 8 0 0 -8 0 8 0 0 0 4 4 0 0 4 0 0 0 8 4 0 0 0 0 0 0 -8 0 -4 0 4 0 8 0 8 0 -8 0 0 0 0 0 -8 -8 0 0 4 8 0 0 -2 0 0 0 -8 4 -4 0 0 0 0 0 0 0 8 -8 2 0 0 0 4 - [...]
+1 5 4 -6 0 8 8 4 -4 4 0 -12 2 4 -8 -8 4 -4 -8 -2 1 0 8 -4 0 -4 -4 0 -24 -8 -2 0 4 4 4 -8 -2 0 0 0 0 16 -12 -4 -8 -4 4 0 -8 -8 8 4 2 0 2 0 8 -1 0 6 -8 -4 4 0 8 0 -4 -6 -4 4 4 8 -4 0 8 -8 8 8 -16 0 -4 -8 16 0 0 0 0 -8 0 0 0 0 0 -8 -6 0 0 0 0 4 0 4 -16 4 0 8 0 8 -4 -8 -4 0 0 8 -4 12 4 0 8 4 0 -4 8 2 8 4 8 4 4 -8 -4 -8 -16 0 16 0 16 0 -8 0 8 0 0 12 -16 -8 -4 8 -16 4 8 0 0 0 0 -8 16 16 0 0 -8 -4 8 0 0 4 4 0 0 4 0 0 0 -4 4 0 4 0 -6 -8 4 0 -4 4 -4 8 2 8 0 8 0 0 8 -8 -12 0 8 4 -8 -4 -8 8 4 2 -4  [...]
+1 5 4 4 -2 0 -16 0 0 0 -2 0 4 8 -16 12 0 0 0 4 3 0 -16 8 0 -4 0 0 -16 0 6 -8 -4 0 8 8 6 0 -24 0 0 0 8 8 16 8 -4 0 -16 0 0 8 6 -8 6 0 -16 3 0 4 -16 8 0 0 -16 -24 0 0 0 8 0 -16 8 0 8 -16 0 0 0 0 8 16 0 12 4 0 8 0 -4 16 12 8 0 -16 4 0 0 0 4 8 0 8 0 8 0 16 0 16 0 0 0 0 -4 -16 4 8 8 -4 0 8 0 8 -16 4 -16 0 0 0 4 -16 8 -16 0 -16 0 -16 0 12 -16 8 -16 -16 -16 8 0 0 0 0 0 0 -16 0 0 0 0 -16 0 0 0 0 0 8 0 0 -4 4 8 -4 8 8 0 0 0 4 8 4 8 4 4 -16 8 -4 0 0 8 -16 4 16 12 16 16 -8 -16 -16 8 0 0 0 0 0 -16 - [...]
+1 5 0 4 2 0 -16 0 0 0 2 0 4 0 0 0 0 0 0 4 3 0 0 0 0 -4 0 0 -16 0 2 -8 -12 0 0 0 2 0 0 0 0 0 0 -8 0 8 -4 0 16 0 0 8 2 -8 2 0 16 3 0 -4 0 -8 0 0 0 0 0 -16 0 -8 0 -16 0 0 0 0 0 0 0 0 8 0 0 -4 -4 0 0 0 12 0 -4 0 0 0 -4 0 0 0 -4 -8 0 -8 0 8 0 0 0 0 0 0 0 0 4 0 0 0 0 12 0 8 0 -8 16 -4 0 0 0 0 0 -16 8 16 0 0 0 16 0 -4 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 -16 0 0 0 0 0 8 0 0 4 0 8 12 0 0 0 0 0 0 -8 -4 -8 -4 -4 16 8 12 0 0 -8 16 -4 0 -4 0 0 -8 0 0 0 0 0 0 0 0 0 -16 8 2 8 0 0 0 0 0 -4 -8 -8 0 -12 0  [...]
+1 5 4 -2 0 4 0 0 -4 0 0 -4 2 4 -8 0 0 0 -4 -2 1 0 8 -4 0 -4 0 0 0 -4 2 0 -4 0 -4 0 2 0 -8 -4 -4 0 4 -4 0 4 4 0 -8 0 4 4 -2 0 -2 0 -8 -1 4 -2 0 -4 0 0 0 8 0 2 0 -4 0 -16 4 0 0 -8 4 0 0 4 4 0 0 0 0 4 0 -4 0 0 0 0 -8 0 2 0 0 0 0 4 0 4 8 -4 8 0 8 0 0 0 0 -4 0 8 4 -4 -4 0 4 -4 -8 4 8 2 0 0 0 0 -4 16 -4 8 8 0 -8 0 -8 0 0 0 0 0 0 -4 8 0 0 0 8 0 8 0 0 0 0 16 -8 -8 -8 -8 -4 -4 4 4 0 -4 -4 0 0 -4 8 8 -4 4 4 0 4 0 2 8 -4 0 0 0 4 8 2 0 0 0 0 0 0 0 4 0 0 0 0 0 -8 -16 4 -2 4 4 4 4 4 4 4 -4 -4 8 4 0 -2 [...]
+1 5 -4 4 6 0 -16 0 0 0 6 0 4 -8 16 -12 0 0 0 4 3 0 16 -8 0 12 0 0 -16 0 -2 -8 -4 0 -8 -8 -2 0 -8 0 0 0 -8 8 -16 8 12 0 -16 0 0 8 -2 -8 -2 0 -16 3 0 4 16 8 0 0 16 -8 0 0 0 8 0 -16 -8 0 -8 16 0 0 0 0 8 -16 0 -4 4 0 24 0 -4 -16 -4 24 0 16 4 0 0 0 4 8 0 8 0 8 0 -16 0 -16 0 0 0 0 12 16 -4 -8 -8 -4 0 8 0 8 -16 4 16 0 0 0 -4 -16 8 -16 0 16 0 -16 0 -4 16 24 16 -16 16 -8 0 0 0 0 0 0 16 0 0 0 0 -16 0 0 0 0 0 8 0 0 12 -4 8 -4 24 -8 0 0 0 -4 8 4 8 4 4 -16 8 -4 0 0 8 -16 4 -16 -4 -16 -16 -8 16 16 -8  [...]
+1 5 -4 8 2 0 -8 0 0 -4 2 8 -4 -8 8 -4 -4 -4 12 -4 -1 -8 8 -8 8 0 0 0 -24 -4 2 0 0 8 0 0 -2 0 0 -8 8 -8 0 -8 0 0 0 -8 8 0 12 0 2 0 -2 0 -8 -1 -8 0 -8 8 -8 8 8 0 -4 -8 4 8 0 8 8 0 0 -8 -4 8 -8 8 0 0 -16 0 0 4 -8 0 -4 0 0 8 -8 8 0 -8 0 -8 0 8 0 -8 8 0 16 0 -8 0 -8 8 0 4 -4 -8 4 0 8 4 0 0 16 8 8 -8 -8 4 0 -4 4 8 0 -8 0 0 0 0 8 0 8 8 -8 0 0 0 0 8 0 0 8 -4 -8 -8 0 -8 0 8 0 8 16 -8 0 0 0 4 -4 4 0 4 -8 8 16 -8 4 4 8 0 -8 0 0 -8 0 -4 -8 4 8 8 -8 0 0 0 0 0 8 -8 0 0 8 0 0 -4 -8 8 0 2 0 8 -8 8 12 -4 [...]
+1 5 -4 8 2 0 -8 0 8 4 2 -8 -4 -8 8 -4 4 4 -4 -4 -1 -8 8 -8 -8 0 0 0 -8 12 2 0 0 -8 0 0 -2 -16 0 8 -8 8 0 8 0 0 0 -8 8 0 -4 0 2 0 -2 0 -8 -1 8 8 -8 -8 8 -8 8 0 4 0 -4 -8 0 8 8 -16 0 -8 12 -8 8 -8 0 0 0 0 0 4 -8 0 -4 0 0 8 8 8 8 -8 0 -8 0 -8 0 8 -8 0 0 0 8 0 8 -8 0 4 -4 -8 4 0 8 4 0 0 0 -8 8 0 -8 -4 0 4 4 8 0 -8 16 0 16 0 -8 0 8 8 -8 0 0 0 16 -8 0 0 -8 4 -8 -8 0 -8 0 8 16 -8 0 8 0 0 0 4 -4 4 0 4 -8 8 0 8 4 4 -8 0 8 0 8 -8 0 -4 8 -4 -8 8 0 0 0 0 0 0 8 -8 0 0 -8 0 0 4 -8 8 0 2 0 8 8 -8 -4 12 [...]
+1 5 -4 4 2 4 -8 -4 0 8 2 0 -4 0 8 -12 0 8 -8 -4 -1 0 8 0 0 0 -4 -8 -16 8 -2 0 0 -4 -8 0 2 8 0 12 -4 -16 8 8 0 0 0 0 -8 8 -8 0 -2 0 2 -8 8 -1 12 -8 8 -8 -4 0 -8 0 -8 0 0 8 4 8 0 8 0 -8 8 0 -16 -4 0 0 -8 0 0 0 8 4 4 0 0 -8 0 -8 -8 0 -8 0 0 -8 -8 8 16 0 8 0 0 0 -4 0 4 0 -4 -8 4 8 0 -4 4 0 8 8 -8 0 8 0 8 -8 4 8 0 8 -8 0 -8 0 16 0 -8 -8 8 0 0 8 -8 0 4 8 16 -8 -8 0 -8 0 -8 8 -8 16 8 0 4 0 4 0 -4 4 0 -4 8 0 8 0 0 4 -8 0 8 0 -8 8 0 4 -4 0 8 -8 0 0 0 0 0 0 -8 8 8 -8 0 4 8 -8 -8 8 0 -2 0 0 12 -4 - [...]
+1 5 -4 4 2 4 -8 4 0 -8 2 8 -4 0 8 -12 0 -8 8 -4 -1 0 8 0 -16 0 4 -8 0 -8 -2 0 0 4 -8 0 2 -8 0 -4 12 0 8 -8 0 0 0 0 -8 -8 8 0 -2 0 2 -8 8 -1 -4 0 8 8 4 -16 -8 0 8 8 0 -8 -4 8 0 -8 0 -8 -8 0 0 12 0 0 8 0 0 0 8 4 4 0 0 -8 16 -8 0 0 -8 0 0 8 -8 -8 0 0 -8 0 16 0 4 0 -4 0 -4 -8 4 8 0 -4 4 0 -8 -8 -8 8 8 0 -8 8 4 8 0 8 8 0 8 0 0 0 -8 -8 8 0 0 8 8 0 -4 -8 0 8 -8 0 -8 0 -8 8 8 0 -8 16 4 0 4 0 -4 4 0 -4 8 0 -8 16 0 4 8 0 -8 0 0 8 0 4 4 0 -8 -8 8 0 0 0 0 0 -8 8 8 -8 0 -4 -8 8 -8 8 0 -2 0 0 -4 12 8  [...]
+1 5 0 -2 4 4 -8 0 -4 0 -4 -4 2 -4 16 -4 0 0 4 -2 1 0 -16 4 -8 4 0 0 0 4 -2 -8 -4 0 4 0 -2 -8 0 4 4 -8 -4 4 0 -4 -4 0 0 0 -4 4 2 8 2 0 0 -1 -4 -2 -8 4 0 8 -8 0 0 2 0 -4 0 -8 -4 8 0 0 -4 0 8 -4 -4 0 8 0 0 4 0 -4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 -4 0 0 0 4 4 0 4 4 0 4 0 2 8 0 0 0 0 8 -4 0 0 0 0 0 0 0 8 0 8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 -4 -4 4 4 0 0 4 0 0 4 0 0 -4 0 -4 0 -4 0 2 0 4 0 0 0 4 0 2 0 0 0 0 8 -8 -8 -4 0 0 0 0 0 0 -8 4 2 -4 -4 -4 -4 -4 -4 -4 4 4 0 4 8 -2 8 0 [...]
+1 5 0 6 0 0 0 -4 -12 0 0 12 -6 -12 0 12 0 0 12 6 -3 -24 0 12 24 0 4 0 0 -12 6 0 0 -12 -12 0 -6 0 0 0 0 -24 -12 -12 24 -12 0 24 0 -24 -12 -12 -6 0 6 0 0 3 0 -6 0 12 -12 -24 0 0 0 -6 0 12 12 0 12 0 0 0 12 0 24 0 12 -24 0 -12 4 -12 0 0 0 0 12 0 -24 0 6 -24 0 24 -4 -12 0 12 -24 12 0 24 24 -24 12 0 -12 12 0 0 0 12 -12 0 0 -12 0 -12 0 6 0 0 24 0 0 0 12 0 0 0 0 0 24 -12 0 0 0 0 0 12 0 0 -12 24 -24 0 0 24 0 -24 0 0 0 24 0 -24 0 12 0 -12 0 0 -12 0 0 -12 0 24 12 0 -12 4 12 -4 6 0 12 0 12 0 -12 0 6 [...]
+1 5 0 2 0 4 0 0 -4 4 0 -4 -6 -4 0 4 -4 -4 -8 6 -3 -16 0 4 0 0 0 -8 8 8 2 0 0 0 -4 0 -2 -8 0 4 -4 0 -4 12 -8 -4 0 16 0 0 8 -12 -2 0 2 8 0 3 -4 2 0 -12 0 0 0 0 -4 2 -12 -4 0 0 4 8 0 0 -8 -8 0 4 4 8 -8 4 -4 -8 0 4 0 0 -4 0 0 0 -2 16 -8 -16 4 12 8 -12 0 4 8 -8 0 8 0 8 0 8 0 0 0 4 -4 0 -4 -4 -8 4 0 -2 0 12 0 4 0 0 12 0 -8 0 8 0 0 4 0 0 0 0 0 4 -8 8 0 0 0 4 0 -16 8 16 -8 0 8 0 -8 0 4 12 -4 -8 0 0 -4 0 0 -4 8 0 8 0 12 -4 -12 4 -2 0 4 0 0 12 4 0 -2 8 -4 -8 0 0 0 0 -4 8 -8 0 0 -4 0 0 -12 -2 4 4 - [...]
+1 5 0 -2 0 8 0 4 -4 0 0 -4 -6 4 0 -4 0 0 4 6 -3 -8 0 -4 -8 0 -4 -16 0 -4 -2 0 0 -4 4 0 2 0 0 -8 8 8 4 -12 -8 4 0 8 0 -8 -4 -12 2 0 -2 16 0 3 8 2 0 12 -4 8 0 0 0 2 0 -4 -12 0 -4 0 0 0 4 0 -8 -8 -4 8 0 4 4 -4 0 8 0 0 -4 0 8 0 -2 -8 16 8 -4 -12 -16 12 8 -4 0 -8 -8 8 4 0 12 4 0 0 0 -4 4 0 -8 4 0 4 0 -2 0 0 8 0 0 0 12 0 0 0 0 0 -8 4 0 0 0 0 0 -4 0 0 12 8 8 0 0 8 -16 -8 16 0 0 -8 0 8 8 12 -8 -4 0 0 4 0 0 4 0 -8 4 0 -12 4 12 -4 -2 0 -4 0 4 0 4 0 -2 8 -4 -8 0 0 0 0 4 16 0 -12 -8 0 0 0 -12 2 -4 - [...]
+1 5 0 -6 0 12 0 0 -4 12 0 -12 -6 12 0 -12 4 -12 0 6 -3 0 0 -12 0 0 0 -24 -24 0 -6 0 0 0 12 0 6 24 0 12 -12 0 12 12 24 12 0 0 0 0 0 -12 6 0 -6 24 0 3 -12 -6 0 -12 0 0 0 0 -12 -6 12 12 0 0 -12 -24 0 0 0 -24 0 12 -12 -24 24 -12 -4 0 0 12 0 0 12 0 0 0 6 0 -24 0 4 12 24 -12 0 -12 -24 24 0 -24 0 24 0 0 0 0 0 -12 12 0 -12 12 24 -12 0 6 0 -12 0 12 0 0 12 0 24 0 -24 0 0 -12 0 0 0 0 0 -12 24 24 0 0 0 12 0 0 24 0 -24 0 -24 0 24 0 12 12 -12 0 0 0 12 0 0 12 -24 0 0 0 12 -4 -12 4 6 0 -12 0 0 -12 -12 0 [...]
+1 3 4 2 0 -8 8 -4 4 -4 0 -4 6 -4 -8 -8 4 -4 8 6 1 0 -8 -4 -16 -4 -4 0 8 8 -2 0 4 4 -12 -8 -2 16 0 0 0 0 -4 4 8 4 -4 0 -8 8 8 -4 -2 0 -2 0 8 1 0 2 -8 4 -4 -16 8 0 4 -2 4 -4 -4 8 4 16 -8 -8 8 -8 0 0 4 8 0 0 0 0 0 8 0 0 0 0 -16 8 2 0 0 0 0 4 0 4 0 4 16 8 16 8 -4 -8 -4 0 0 -8 -4 -4 4 0 -8 4 -16 -4 -8 -6 -8 4 8 4 4 8 -4 8 0 0 0 0 0 0 -8 0 8 0 0 4 0 8 4 -8 0 -4 8 0 0 0 0 -8 0 0 16 16 -8 4 8 0 0 -4 -4 0 0 -4 -16 -16 0 4 -4 0 -4 0 -2 -8 -4 0 4 -4 4 8 6 -8 0 -8 0 0 -8 8 4 0 8 4 -8 -4 8 -8 4 2 -4  [...]
+1 3 0 10 -4 -8 8 -4 12 -4 -4 -4 -2 -4 -8 -4 4 -4 0 -2 1 16 -8 -4 0 4 -4 -16 8 0 2 -8 4 4 -4 -8 2 0 8 0 0 0 4 4 -8 4 4 16 8 -8 0 4 2 -8 2 -16 8 1 0 2 -8 4 12 0 -8 8 -12 6 4 4 -4 -8 4 0 -8 8 0 8 0 0 4 -8 0 0 0 -8 0 -8 0 0 0 0 0 -8 2 0 0 0 0 4 0 4 0 4 0 -8 0 -8 12 8 -4 8 0 8 8 4 4 0 8 4 0 4 8 2 -8 4 -8 -12 -8 -8 4 8 0 0 0 0 0 0 8 0 8 0 0 -4 0 -8 4 8 0 12 -8 0 0 0 0 8 0 0 0 0 8 -4 -8 8 0 8 -4 0 0 -4 0 0 -8 -8 -4 0 -4 0 -2 -8 -4 0 -12 -4 -4 -8 -2 8 0 8 0 8 8 8 -4 16 -8 4 8 12 -8 8 -4 -2 -4 -4 [...]
+1 3 4 4 -2 -8 16 -8 0 -8 2 16 4 -8 -16 -12 -8 8 8 -4 3 16 16 8 -16 -4 8 -16 0 8 -2 -8 12 -8 8 -24 -2 16 8 -8 -8 -16 -8 8 -16 8 4 -16 16 16 -8 8 2 8 2 16 16 -3 8 4 -16 8 8 16 -16 -8 -8 -8 24 8 -24 16 -8 -16 24 -16 -8 -16 16 8 8 -16 -16 -4 4 8 8 -8 12 16 -4 8 -16 16 -4 16 -16 16 4 -8 -16 -8 -16 -8 16 16 -16 16 -8 16 24 8 -4 16 4 8 8 12 -8 -8 16 -8 -16 -4 16 -24 -16 8 4 -16 -8 -16 16 -16 16 -16 -16 4 -16 -8 -16 16 16 -8 -16 -16 -24 16 16 -8 -16 -16 16 -16 16 16 -16 16 -16 16 8 8 8 -8 4 -4 8 [...]
+1 3 8 -6 4 -8 8 -4 -12 -12 4 -20 -2 4 8 12 -4 -12 0 -2 1 -16 8 4 0 4 -4 -16 8 0 2 8 4 -12 4 8 2 0 8 0 0 0 -4 4 8 4 4 -16 8 -8 0 4 2 8 2 -16 8 1 0 2 8 4 -4 0 8 8 -4 6 -4 4 -4 -8 -4 0 8 -8 0 -8 0 0 4 8 0 0 0 8 0 -8 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 -4 -8 -4 -8 0 -8 0 -4 -4 0 8 4 0 4 8 2 8 -4 -8 -4 0 -8 4 8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 8 4 8 0 4 8 0 0 0 0 8 0 0 0 0 8 -4 -8 -8 0 0 -4 0 0 4 0 0 8 0 -4 0 -4 0 -2 -8 -4 0 4 4 -4 -8 -2 -8 0 -8 0 -8 -8 -8 4 16 8 4 8 4 8 8 -4 -2 -4 4 0 0 0 0 - [...]
+1 3 4 -2 0 -4 -16 0 -4 0 0 -4 6 4 -8 8 0 0 4 6 1 0 -8 4 0 -4 0 0 -16 4 2 0 -4 0 4 0 2 0 -8 4 4 0 4 4 0 -4 -4 0 8 0 4 -4 2 0 2 0 8 1 4 2 0 4 0 0 0 -8 0 -2 0 4 0 0 4 0 0 -8 4 0 0 4 -4 0 0 0 0 -4 0 4 0 0 0 0 8 0 2 0 0 0 0 4 0 4 -8 -4 -8 0 -8 0 0 0 0 4 0 -8 4 4 4 0 -4 -4 8 4 8 2 0 0 0 0 -4 0 -4 8 -8 0 8 0 8 0 0 0 0 0 0 -4 8 0 0 0 8 0 8 0 0 0 0 0 -8 -8 -8 -8 -4 4 4 4 0 4 4 0 0 -4 8 8 -4 -4 -4 0 -4 0 -2 -8 4 0 0 0 -4 -8 -2 0 0 0 0 0 0 0 -4 0 0 0 0 0 8 0 4 -2 4 -4 -4 -4 -4 -4 4 -4 -4 8 4 0 -2 0 [...]
+1 3 0 -2 4 -4 -8 0 -4 0 4 -4 6 -4 0 -4 0 0 -4 6 1 0 0 -4 8 4 0 0 0 -4 -2 -8 -4 0 -4 0 -2 8 0 -4 -4 8 -4 -4 0 4 4 0 0 0 -4 -4 -2 -8 -2 0 0 1 -4 2 8 -4 0 8 8 0 0 -2 0 4 0 -8 -4 8 0 16 -4 0 8 -4 4 0 8 0 0 -4 0 4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 4 0 16 0 -4 -4 0 -4 4 0 4 0 2 8 0 0 0 0 -8 -4 0 0 0 0 0 0 0 -8 0 -8 0 0 4 0 0 0 0 0 0 -16 0 0 0 0 8 0 0 0 0 -4 4 4 4 0 0 -4 0 0 4 0 0 -4 0 4 0 4 0 -2 0 -4 0 0 0 -4 0 -2 0 0 0 0 8 -8 -8 4 0 0 0 0 0 -16 8 4 2 -4 4 4 4 4 4 -4 4 4 0 4 -8 - [...]
+1 3 0 6 0 -8 0 -4 4 0 0 -12 -2 -4 0 4 0 0 4 -2 -3 -8 0 -4 -8 0 -4 16 0 -4 -2 0 0 -4 4 0 2 0 0 8 -8 8 -4 -4 8 12 0 -8 0 8 4 -4 -2 0 2 16 0 -3 8 6 0 4 4 -8 0 0 0 6 0 -12 12 0 4 0 0 0 -4 0 8 -8 -12 -8 0 4 4 -4 0 -8 0 0 -4 0 8 0 6 -8 -16 8 -4 4 16 -4 8 12 0 -8 -8 8 4 0 12 4 0 0 0 -4 4 0 8 -12 0 -12 0 6 0 0 8 0 0 0 -4 0 0 0 0 0 -8 -4 0 0 0 0 0 4 0 0 -12 -8 -8 0 0 -8 -16 8 16 0 0 8 0 -8 8 4 -8 4 0 0 12 0 0 -4 0 8 -4 0 -4 -4 4 4 -6 0 -12 0 -4 0 12 0 -6 -8 4 8 0 0 0 0 4 -16 0 -12 -8 0 0 0 4 2 12 [...]
+1 3 0 2 0 -4 0 0 -4 -4 0 -4 -2 -4 0 4 -4 -4 0 -2 -3 0 0 -4 0 0 0 8 -8 0 2 0 0 0 4 0 -2 8 0 -4 4 0 -4 4 -8 4 0 0 0 0 0 -4 2 0 -2 8 0 -3 -4 -2 0 -4 0 0 0 0 4 -2 12 4 0 0 4 8 0 0 0 8 0 4 -4 8 -8 4 -4 0 0 -4 0 0 -4 0 0 0 -2 0 8 0 4 -4 -8 4 0 4 -8 8 0 -8 0 8 0 0 0 0 0 -4 4 0 4 -4 8 4 0 -2 0 12 0 4 0 0 -4 0 8 0 -8 0 0 -4 0 0 0 0 0 4 -8 -8 0 0 0 -4 0 0 8 0 -8 0 8 0 -8 0 4 4 -4 0 0 0 4 0 0 -4 8 0 0 0 4 4 -4 -4 2 0 -4 0 0 -12 -4 0 2 8 4 -8 0 0 0 0 4 -8 -8 0 0 -4 0 0 4 -2 4 -4 4 -4 0 0 0 4 -4 0 0  [...]
+1 3 0 2 0 -4 0 0 4 -12 0 -4 -2 4 0 -4 4 -12 0 -2 -3 0 0 4 0 0 0 8 8 0 -6 0 0 0 -4 0 6 -8 0 -4 4 0 4 4 8 4 0 0 0 0 0 -4 -6 0 6 8 0 -3 -4 -2 0 -4 0 0 0 0 12 -2 -12 4 0 0 -4 -8 0 0 0 24 0 4 -4 -8 8 -12 -4 0 0 -4 0 0 12 0 0 0 -2 0 8 0 4 -4 -8 4 0 4 8 -8 0 8 0 24 0 0 0 0 0 4 -4 0 4 -4 -8 4 0 -2 0 -12 0 12 0 0 -4 0 -8 0 8 0 0 12 0 0 0 0 0 -4 8 -24 0 0 0 -12 0 0 8 0 -8 0 -8 0 8 0 4 4 -4 0 0 0 4 0 0 4 -8 0 0 0 4 4 -4 -4 2 0 -4 0 0 12 -4 0 2 -8 -12 8 0 0 0 0 -4 -8 -24 0 0 -12 0 0 4 6 4 4 4 -4 0 0 [...]
+1 3 0 -2 0 0 0 -4 -4 0 0 -4 -2 4 0 -4 0 0 -4 -2 -3 8 0 4 8 0 -4 0 0 4 -2 0 0 -4 -4 0 2 0 0 0 0 -8 4 -4 -8 -4 0 8 0 8 -4 -4 -2 0 2 0 0 -3 0 -2 0 4 4 8 0 0 0 -2 0 4 12 0 -4 0 0 0 4 0 -8 0 4 8 0 4 4 4 0 0 0 0 -4 0 -8 0 -2 8 0 -8 -4 4 0 -4 -8 -4 0 8 8 -8 4 0 12 -4 0 0 0 4 -4 0 0 4 0 4 0 -2 0 0 8 0 0 0 -4 0 0 0 0 0 8 -4 0 0 0 0 0 -4 0 0 -12 -8 8 0 0 8 0 -8 0 0 0 -8 0 8 0 4 0 -4 0 0 -4 0 0 4 0 -8 4 0 -4 -4 4 4 2 0 4 0 -4 0 -4 0 2 8 4 -8 0 0 0 0 -4 0 0 -12 -8 0 0 0 4 2 -4 4 0 0 4 -4 0 -4 4 0 0  [...]
+1 3 4 -4 2 -4 0 -4 0 -8 -2 0 4 0 0 -4 0 8 0 -4 -1 0 0 0 -8 0 4 8 0 0 -2 0 0 4 0 0 2 0 0 -4 -4 -8 0 0 0 8 0 0 0 8 0 -8 2 0 -2 -8 0 1 4 0 0 0 -4 8 0 0 8 0 0 0 4 0 0 0 0 0 0 0 8 4 -8 0 0 0 0 0 -8 -4 4 0 0 8 8 0 0 0 8 0 0 0 8 0 8 -8 0 0 8 0 4 0 -4 0 -4 0 -4 0 0 -4 -4 8 0 0 0 0 0 0 -8 -8 -4 0 8 0 0 0 0 0 8 0 0 -8 0 0 0 0 0 0 4 8 -8 8 0 0 -8 0 -8 0 0 -8 0 -8 4 -8 4 0 4 4 -8 4 8 0 0 -8 0 4 0 0 0 0 0 0 8 -4 -4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 -4 -8 -8 0 0 8 -2 8 0 -4 -4 0 0 0 0 0 0 0 -8 0 0 0 2 -8 0  [...]
+1 3 4 -6 0 0 8 4 -12 4 0 -4 6 -12 -8 0 -4 4 0 6 1 0 -8 -12 16 -4 4 0 8 0 -2 0 4 -4 -4 -8 -2 -16 0 8 8 0 4 4 8 4 -4 0 8 -8 0 -4 -2 0 -2 0 -8 1 8 -6 8 4 4 16 -8 0 -4 6 -4 -4 4 8 -4 -16 -8 -8 0 8 0 8 4 8 0 0 0 -8 0 0 0 0 0 0 0 -8 -6 0 0 0 0 4 0 4 16 4 0 8 0 8 4 8 4 8 0 -8 -4 4 -4 0 0 4 0 -4 8 2 8 -4 -8 -4 4 8 -4 -8 16 0 -16 0 -16 0 8 0 -8 0 0 -4 -16 -8 -4 8 -16 4 8 0 0 0 0 -8 16 16 0 0 0 4 0 8 0 -4 -4 0 0 4 0 0 -8 4 -4 0 -4 0 6 8 -4 0 -4 4 4 -8 -2 -8 0 -8 0 0 8 -8 -4 0 -8 -4 8 4 8 -8 4 2 -4 [...]
+1 3 0 6 -4 -4 0 0 4 0 -4 -4 -2 -4 -8 4 0 0 -4 -2 1 0 -8 -4 0 4 0 0 0 -4 -2 8 -4 0 4 0 -2 0 0 4 4 0 4 4 0 -4 4 0 -8 0 -4 4 -2 8 -2 0 8 1 4 -6 0 4 0 0 16 0 0 -2 0 -4 0 0 -4 0 0 8 -4 0 0 4 -4 0 0 0 0 4 0 4 0 0 0 0 8 16 -6 0 0 0 0 4 0 4 -8 -4 8 0 -8 0 0 0 0 -4 0 8 0 4 -4 0 -4 -4 -8 -4 -8 2 0 0 0 0 0 0 4 8 8 0 -8 0 8 0 -16 0 0 0 0 -4 -8 0 0 0 8 0 -8 0 0 0 0 0 8 -8 8 -8 -4 -4 4 -4 0 0 4 0 0 4 -8 8 4 0 -4 0 -4 0 6 -8 4 0 0 0 4 8 -2 0 0 0 0 -8 -16 0 -4 0 0 0 0 0 -8 0 -4 2 4 4 -4 -4 4 4 -4 -4 -4  [...]
+1 3 0 -2 -4 4 0 0 -4 0 -4 4 -2 4 -8 -4 0 0 4 -2 1 0 -8 4 0 4 0 0 0 4 -2 8 -4 0 -4 0 -2 0 0 -4 -4 0 -4 4 0 -4 4 0 8 0 4 4 -2 8 -2 0 -8 1 -4 2 16 4 0 0 0 0 0 -10 0 -4 0 0 4 0 0 8 4 0 0 -4 -4 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 2 0 0 0 0 4 0 4 8 -4 -8 0 8 0 0 0 0 4 0 8 0 -4 4 0 4 -4 8 -4 8 -6 16 0 0 0 0 0 4 -8 -8 0 8 0 -8 0 0 0 -16 0 0 4 8 0 0 0 -8 0 -8 0 0 0 0 0 -8 8 -8 8 4 -4 -4 4 0 0 4 0 0 -4 8 -8 -4 0 -4 0 -4 0 -2 8 4 0 0 0 4 -8 6 0 0 0 0 -8 0 -16 4 0 0 0 0 0 -8 0 -4 2 4 -4 4 4 -4 -4 -4 -4 -4  [...]
+1 3 4 -4 -2 0 0 0 0 0 2 0 4 0 -16 -4 0 0 0 -4 3 0 16 0 0 -4 0 0 0 0 -2 8 -4 0 0 -8 -2 0 -8 0 0 0 0 8 0 -8 4 0 0 0 0 8 2 -8 2 0 0 -3 0 -4 16 8 0 0 16 8 0 0 0 -8 0 0 0 0 8 -16 0 0 0 0 -8 0 0 -4 4 0 -8 0 -4 16 -4 -8 0 -16 4 0 0 0 4 -8 0 -8 0 8 0 0 0 0 0 0 0 0 -4 16 4 0 0 -4 0 8 0 8 0 4 -16 0 0 0 4 0 -8 0 0 16 0 16 0 4 16 8 16 -16 -16 0 0 0 0 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 8 0 0 4 -4 -8 4 8 0 0 0 0 -4 8 -4 8 -4 -4 0 -8 4 0 0 -8 0 -4 0 4 0 -16 8 -16 -16 0 0 0 0 0 0 16 0 -8 -2 8 0 0 0 0 0 -4 -8 [...]
+1 3 -4 2 0 0 0 -4 -4 4 0 4 -2 -4 0 -8 -4 4 0 -2 1 0 0 -4 8 -4 -4 0 -8 0 -2 0 4 4 -4 8 -2 8 0 0 0 -8 4 -4 8 -4 -4 0 0 8 0 4 -2 0 -2 0 0 1 0 2 0 -4 -4 8 0 0 -4 6 -4 4 -4 0 4 8 8 0 0 8 -8 0 -4 8 -8 0 0 0 0 0 0 0 0 0 8 0 2 0 0 0 0 -4 0 -4 8 -4 8 8 -8 8 -4 8 -4 0 0 0 4 4 4 0 0 -4 -8 4 0 2 0 -4 8 -4 -4 0 4 0 -8 0 8 0 -8 0 0 0 0 0 0 -4 8 -8 4 -8 -8 4 0 0 0 0 0 0 -8 8 8 -8 0 -4 0 0 0 4 4 0 0 -4 -8 8 0 -4 4 0 4 0 -2 0 4 0 4 4 -4 0 -2 -8 0 -8 0 0 0 0 -4 0 -8 4 -8 4 0 0 -4 2 4 -4 0 0 0 0 4 4 4 0 -4 [...]
+1 3 -4 2 0 0 0 4 4 -4 0 -4 -2 -4 0 -8 4 -4 0 -2 1 0 0 -4 -8 -4 4 0 8 0 -2 0 4 -4 -4 8 -2 -8 0 0 0 8 4 -4 8 -4 -4 0 0 -8 0 4 -2 0 -2 0 0 1 0 2 0 -4 4 -8 0 0 4 6 4 4 4 0 4 -8 8 0 0 -8 8 0 -4 8 8 0 0 0 0 0 0 0 0 0 -8 0 2 0 0 0 0 -4 0 -4 -8 -4 -8 8 8 8 4 -8 4 0 0 0 4 4 4 0 0 -4 8 4 0 2 0 4 -8 4 -4 0 4 0 8 0 -8 0 8 0 0 0 0 0 0 -4 -8 8 -4 8 8 -4 0 0 0 0 0 0 8 -8 -8 8 0 -4 0 0 0 4 4 0 0 -4 8 -8 0 -4 4 0 4 0 -2 0 4 0 -4 -4 -4 0 -2 -8 0 -8 0 0 0 0 -4 0 8 -4 8 -4 0 0 -4 2 4 -4 0 0 0 0 4 4 4 0 -4 - [...]
+1 3 0 -4 2 0 0 0 0 0 -2 0 4 -8 0 -8 0 0 0 -4 3 0 0 8 0 -4 0 0 0 0 -6 -8 4 0 8 0 -6 0 0 0 0 0 -8 -8 16 -8 4 0 0 0 0 8 6 8 6 0 0 -3 0 4 0 -8 0 0 0 0 0 0 0 8 0 0 -8 0 0 0 0 0 0 0 -8 16 0 12 -4 0 0 0 -4 0 12 0 0 0 -4 0 0 0 -4 8 0 8 0 8 0 -16 0 -16 0 0 0 0 4 0 0 8 8 -4 0 8 0 -8 0 -4 0 0 0 0 0 0 -8 0 0 0 0 16 0 -12 0 0 0 -16 0 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 -8 4 0 -8 0 0 0 0 -8 4 -8 4 4 0 -8 4 0 0 8 0 4 16 -12 16 0 -8 0 0 8 0 0 0 0 0 0 0 -8 -6 8 8 0 0 0 0 -4 8 8 0 4 0 -4 0 0 - [...]
+1 3 0 10 -4 -8 -8 -4 4 4 -4 -4 -2 -4 -8 12 -4 4 0 -2 1 0 -8 -4 0 4 -4 0 -8 -16 2 -8 4 4 12 8 2 0 -8 16 0 0 4 4 8 4 4 0 -24 -8 0 4 2 -8 2 0 8 1 16 10 8 4 12 0 -24 -8 12 -2 -4 4 -4 8 -12 0 8 8 -16 -8 0 0 4 8 0 0 0 8 0 8 0 0 0 0 -16 -24 10 16 16 -16 0 4 -16 4 16 4 -16 8 16 8 12 -8 -4 -8 0 8 -8 4 -12 0 -8 4 16 4 -24 -6 8 -4 -8 12 8 8 4 8 -16 0 16 0 -16 0 24 0 -8 0 0 -4 16 8 4 8 -16 -12 -8 16 16 -16 -16 -8 -16 16 -16 16 -8 -4 8 -8 0 -8 -4 0 0 12 16 -16 8 8 -4 0 -4 0 -10 -8 -4 0 -12 4 -4 24 6  [...]
+1 3 -4 6 0 -4 -8 0 4 0 0 -4 -2 -4 0 0 0 0 4 -2 1 0 0 -4 8 -4 0 0 -16 4 2 0 -4 0 4 0 2 -8 8 -4 -4 8 4 -4 0 4 -4 0 16 0 4 4 2 0 2 0 0 1 -4 2 -8 -4 0 8 8 8 0 -10 0 -4 0 8 -4 -8 0 0 4 0 8 -4 4 0 -8 0 0 4 0 4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 -4 0 0 -4 4 -4 0 -4 4 0 -4 16 -6 -8 0 0 0 4 8 4 0 0 0 0 0 0 0 -8 0 8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 -4 -4 4 -4 0 -4 -4 0 0 4 0 0 4 4 4 0 4 0 -2 0 -4 0 0 0 4 -16 6 0 0 0 0 0 -8 8 -4 0 0 0 0 0 0 -8 -4 -2 -4 4 4 4 -4 -4 4 4 4 -8 4 -8  [...]
+1 3 0 4 -2 -4 0 -4 -8 0 2 8 -4 -8 -8 8 0 0 0 4 -1 -8 8 8 8 0 4 0 0 -8 2 0 0 -4 -8 0 -2 0 0 4 -4 -8 0 0 8 0 0 8 -8 -8 0 0 -2 0 2 0 8 1 -4 0 0 0 4 -8 0 0 0 0 0 0 4 0 0 0 0 8 8 0 8 4 0 -8 0 0 0 0 0 4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 -8 8 0 -8 -4 0 -4 0 4 -8 0 0 0 -4 4 0 -8 0 8 0 0 0 8 0 0 0 0 -8 8 0 8 0 0 0 0 0 0 0 0 0 -8 0 4 -8 0 0 8 -8 0 -8 0 0 -8 0 8 0 -4 0 -4 0 -4 0 0 4 0 0 8 0 0 0 0 0 0 0 0 8 0 -4 4 0 0 -8 0 8 0 -8 0 0 0 0 0 0 0 -4 8 0 -8 0 0 2 0 0 4 -4 0 -8 0 0 0 0 0 -8 0 0 -8 -2 0 -8  [...]
+1 3 0 2 -4 0 -8 4 4 -4 -4 -4 -2 4 -8 4 4 -4 -8 -2 1 0 -8 4 0 4 4 0 -8 8 2 -8 4 -4 4 8 2 0 -8 -8 8 0 -4 4 8 4 4 0 -8 8 -8 4 2 -8 2 0 -8 1 -8 2 -8 4 -12 0 -8 -8 -12 6 4 4 4 8 -4 0 8 8 8 8 0 8 4 8 0 0 0 0 0 0 0 0 0 0 0 -8 2 -16 -16 16 0 4 16 4 0 4 0 8 0 8 -12 8 4 0 0 8 -8 -4 -4 0 0 4 0 4 -8 2 -8 4 8 -12 8 8 4 -8 0 0 0 0 0 0 8 0 8 0 0 4 0 -8 -4 -8 0 12 -8 -16 -16 16 16 -8 0 0 0 0 0 -4 0 0 0 -8 -4 0 0 4 0 0 0 8 -4 0 -4 0 -2 8 -4 0 12 -4 -4 8 -2 -8 0 -8 0 8 8 8 4 0 -8 -4 -8 12 -8 -8 -4 -2 -4 4 [...]
+1 3 0 0 -2 0 0 0 0 -4 2 0 -4 0 -8 0 -4 4 -4 4 -1 0 8 0 0 0 0 -8 8 4 -2 0 0 0 0 0 2 -8 0 -8 0 0 8 0 -8 0 0 0 8 0 4 0 2 0 -2 8 -8 1 8 0 0 0 0 0 0 0 -4 0 -4 0 0 0 -8 8 0 8 -4 8 0 0 0 8 -8 0 0 -4 0 8 -4 0 0 0 -8 0 0 0 8 0 0 0 8 0 8 0 0 -8 -8 8 0 -8 0 -4 4 -8 0 -8 8 4 8 0 0 0 -8 0 0 4 0 4 0 0 0 8 0 0 0 0 8 0 0 0 0 0 0 8 0 8 0 0 -8 -4 8 0 -8 0 -8 0 0 -8 0 8 -8 0 -8 4 -4 0 0 -4 0 -8 0 8 4 0 0 0 0 0 0 -8 0 4 0 -4 0 8 0 -8 0 8 0 0 0 0 -8 -8 -8 0 0 4 -8 0 0 -2 0 8 -8 0 -4 4 0 0 0 0 0 0 0 -8 8 2 0  [...]
+1 3 12 -12 6 -8 16 -8 0 -24 -6 -16 4 8 16 -4 8 24 -8 -4 3 -16 -16 -8 -16 12 8 -16 -32 -8 6 24 12 24 -8 24 6 -16 24 -8 -8 -16 8 8 16 8 -12 16 16 -48 8 8 -6 -24 -6 16 16 -3 8 4 16 8 -24 16 16 -24 -24 -8 -24 8 -24 16 8 16 -24 16 8 -48 16 8 8 16 16 12 4 -8 24 -8 12 48 12 24 -16 -16 -4 -16 -16 -16 4 -8 -16 -8 -16 -8 -16 -16 -16 -16 24 48 24 -8 12 -16 12 -8 -8 12 -8 -8 -16 -8 -16 -4 -16 24 48 24 12 -16 -8 -16 -16 16 -16 48 -16 -12 16 -24 16 -48 -16 8 16 -48 -24 -48 16 -24 16 16 16 16 16 16 16  [...]
+1 3 0 -2 0 0 0 4 -4 0 0 -12 -2 -4 0 4 0 0 -4 -2 -3 8 0 -4 -8 0 4 0 0 4 6 0 0 -12 4 0 -6 0 0 0 0 8 -4 -4 8 -4 0 8 0 24 -4 -4 6 0 -6 0 0 -3 0 -2 0 4 12 -8 0 0 0 -2 0 4 -12 0 4 0 0 0 4 0 8 0 4 -8 0 -12 4 4 0 0 0 0 12 0 8 0 -2 8 0 -8 -4 4 0 -4 8 -4 0 -8 -8 8 12 0 -12 -4 0 0 0 -4 4 0 0 4 0 4 0 -2 0 0 24 0 0 0 -4 0 0 0 0 0 -8 12 0 0 0 0 0 4 0 0 12 -24 -8 0 0 8 0 -8 0 0 0 8 0 -8 0 4 0 -4 0 0 -4 0 0 -4 0 8 4 0 -4 -4 4 4 2 0 4 0 -12 0 -4 0 2 -8 -12 8 0 0 0 0 4 0 0 12 -24 0 0 0 4 -6 -4 -4 0 0 4 -4 [...]
+1 3 0 -6 0 4 0 0 -12 -4 0 4 -2 4 0 -4 -4 -4 8 -2 -3 16 0 4 0 0 0 -8 8 -8 2 0 0 0 -4 0 -2 -8 0 4 -4 0 4 4 8 -12 0 16 0 0 8 -4 2 0 -2 -8 0 -3 4 6 0 -4 0 0 0 0 4 6 12 -12 0 0 -4 -8 0 0 -8 8 0 -4 12 -8 8 4 -4 8 0 4 0 0 -4 0 0 0 6 -16 -8 16 4 -4 8 4 0 -12 8 -8 0 8 0 8 0 -8 0 0 0 4 -4 0 -4 12 -8 -12 0 6 0 12 0 4 0 0 -4 0 -8 0 8 0 0 -4 0 0 0 0 0 -4 8 -8 0 0 0 -4 0 -16 -8 16 8 0 -8 0 8 0 -4 4 4 -8 0 0 -12 0 0 4 -8 0 8 0 4 4 -4 -4 -6 0 12 0 0 -12 12 0 -6 -8 4 8 0 0 0 0 -4 8 -8 0 0 -4 0 0 4 -2 -12 [...]
+1 3 4 -8 2 0 0 0 0 -4 -2 -8 4 0 0 -4 4 4 -4 -4 -1 8 0 0 0 0 0 0 -8 -4 2 0 0 8 0 0 -2 -8 0 0 0 0 0 0 0 -8 0 -8 0 0 4 -8 -2 0 2 0 0 1 0 0 0 0 8 0 0 0 -4 0 4 0 0 0 0 8 0 0 4 8 0 0 8 0 8 0 0 -4 8 0 -4 0 0 -8 0 0 0 8 0 8 0 0 0 0 0 8 8 0 0 0 -8 -8 0 -4 -4 0 -4 0 0 4 0 -8 8 0 0 0 0 -4 0 4 -4 0 8 0 8 0 8 0 0 0 0 8 0 0 0 0 -8 8 0 0 0 -4 0 -8 0 -8 0 0 -8 0 -8 0 0 -8 0 4 4 4 8 -4 -8 0 -8 0 4 4 0 0 0 0 0 0 -8 4 8 4 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 0 8 2 -8 0 0 0 -4 -4 0 0 0 0 0 0 0 -8 0 -2 8 8 -8  [...]
+1 3 0 -6 -4 8 8 4 -12 4 -4 4 -2 -4 -8 -4 -4 4 0 -2 1 -16 -8 -4 0 4 4 16 8 0 2 -8 4 -4 -4 -8 2 0 8 0 0 0 4 4 -8 4 4 -16 8 8 0 4 2 -8 2 16 8 1 0 2 -8 4 -12 0 -8 8 12 6 -4 4 4 -8 4 0 -8 8 0 -8 0 0 4 -8 0 0 0 8 0 8 0 0 0 0 0 -8 2 0 0 0 0 4 0 4 0 4 0 -8 0 -8 -12 -8 4 -8 0 8 8 4 4 0 -8 4 0 4 8 2 -8 -4 8 12 -8 -8 4 8 0 0 0 0 0 0 8 0 8 0 0 -4 0 8 -4 -8 0 -12 -8 0 0 0 0 8 0 0 0 0 -8 -4 8 -8 0 8 -4 0 0 -4 0 0 8 -8 -4 0 -4 0 -2 -8 -4 0 12 4 -4 -8 -2 8 0 8 0 8 8 8 -4 -16 8 -4 -8 -12 -8 8 -4 -2 -4 -4 [...]
+1 3 4 -12 -2 8 16 8 0 8 2 -16 4 -8 -16 -12 8 -8 -8 -4 3 -16 16 8 16 -4 -8 16 -32 -8 -2 -8 12 8 8 -24 -2 -16 8 8 8 16 -8 8 -16 8 4 16 16 -16 8 8 2 8 2 -16 16 -3 -8 4 -16 8 -8 -16 -16 -8 8 -8 -24 8 24 16 -8 16 24 -16 8 16 -16 -8 8 -16 16 -4 4 -8 8 8 12 16 -4 8 16 16 -4 -16 16 -16 4 -8 16 -8 16 -8 -16 16 16 16 8 -16 -24 -8 -4 16 4 8 8 12 8 -8 -16 -8 -16 -4 16 24 16 -8 4 -16 -8 -16 -16 -16 -16 -16 16 4 -16 -8 -16 16 16 -8 16 16 24 -16 -16 8 -16 16 -16 16 -16 16 16 -16 16 -16 -8 8 -8 8 4 -4 8 [...]
+1 3 -4 -2 0 4 -8 0 -4 0 0 4 -2 4 0 -8 0 0 -4 -2 1 0 0 4 -8 -4 0 0 0 -4 2 0 -4 0 -4 0 2 8 8 4 4 -8 -4 -4 0 4 -4 0 0 0 -4 4 2 0 2 0 16 1 4 -6 8 -4 0 -8 -8 8 0 -2 0 -4 0 8 4 8 0 0 -4 0 -8 4 4 0 8 0 0 -4 0 -4 0 0 0 0 0 -8 -6 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 4 0 0 -4 -4 4 0 4 4 0 -4 0 2 8 0 0 0 4 8 4 16 0 0 0 0 0 0 8 0 -8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 4 -4 -4 4 0 -4 -4 0 0 -4 0 0 -4 4 4 0 4 0 6 -16 -4 0 0 0 4 0 -2 0 0 0 0 0 8 -8 4 0 0 0 0 0 0 -8 -4 -2 -4 -4 -4 -4 4 4 4 4 4 -8 4 8 6  [...]
+1 3 0 -4 -2 4 0 4 0 0 2 -8 -4 0 -8 0 0 0 -8 4 -1 -8 8 0 -8 0 -4 0 0 0 2 0 0 4 0 0 -2 0 0 -4 4 8 -8 0 -8 0 0 8 -8 8 8 0 -2 0 2 0 8 1 4 0 0 0 -4 8 0 0 0 0 0 0 -4 0 8 0 0 8 0 0 -8 -4 0 8 0 0 0 8 0 -4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 8 -8 0 8 4 0 4 8 4 -8 0 8 -8 -4 -4 0 8 0 8 0 0 0 -8 0 0 0 0 -8 -8 0 -8 0 0 0 0 0 0 0 0 -8 8 0 -4 8 0 0 8 -8 0 -8 0 0 8 0 -8 0 4 0 4 -8 -4 0 0 4 0 8 -8 0 -8 0 0 0 0 0 0 8 0 -4 -4 0 0 -8 0 -8 0 8 0 0 0 0 8 0 0 4 -8 0 -8 0 0 2 0 -8 -4 4 -8 0 0 0 0 0 0 8 0 0 -8 -2 0  [...]
+1 3 0 -6 -4 8 -8 -4 -12 4 -4 12 -2 12 -8 -4 -4 4 16 -2 1 0 -8 12 0 4 -4 0 -8 0 2 -8 4 4 -4 8 2 0 -8 0 -16 0 -12 4 8 4 4 0 8 -8 16 4 2 -8 2 0 -24 1 0 -6 -24 4 12 0 8 -8 12 14 -4 4 -4 8 4 0 8 8 0 -8 0 -16 4 8 0 0 0 -8 0 -8 0 0 0 0 16 8 -6 16 16 -16 0 4 -16 4 -16 4 16 8 -16 8 12 -8 -4 8 0 8 -8 -12 4 0 8 4 -16 4 8 10 -24 -4 -8 12 8 8 4 -24 16 0 -16 0 16 0 -8 0 24 0 0 12 -16 8 4 8 16 -12 -8 16 16 -16 -16 -8 16 -16 16 -16 8 -4 -8 8 0 -8 -4 0 0 -4 -16 16 -8 8 -4 0 -4 0 6 24 -4 0 -12 4 -4 -8 -10 [...]
+1 3 0 -8 -2 8 0 0 0 4 2 -8 -4 8 -8 -8 4 -4 4 4 -1 0 8 -8 0 0 0 -8 -8 -4 -2 0 0 0 8 0 2 8 0 0 -8 0 0 0 8 0 0 0 8 0 -4 0 2 0 -2 8 -8 1 0 0 0 0 0 0 0 0 4 0 4 0 0 0 0 -8 0 8 4 -8 0 8 0 -8 8 0 0 4 0 0 -4 0 0 0 8 0 0 0 8 0 0 0 8 0 -8 0 0 8 8 -8 0 8 0 4 4 -8 0 0 0 4 0 0 0 0 -8 0 0 -4 0 -4 0 0 0 8 0 0 0 0 -8 0 0 0 0 0 0 0 0 -8 0 0 8 4 8 0 -8 0 -8 0 0 8 0 -8 0 0 0 -4 -4 0 0 -4 0 0 0 -8 -4 0 0 0 0 0 0 -8 0 4 0 4 0 8 0 8 0 -8 0 0 0 0 0 -8 8 0 0 -4 -8 0 0 -2 0 0 0 -8 4 -4 0 0 0 0 0 0 0 8 8 2 0 0 0 - [...]
+1 3 4 -4 -2 0 -16 0 0 0 2 0 4 8 -16 4 0 0 0 -4 3 0 16 -8 0 -4 0 0 16 0 6 -8 -4 0 -8 8 6 0 -24 0 0 0 8 8 16 8 4 0 -16 0 0 8 -6 8 -6 0 -16 -3 0 4 -16 8 0 0 -16 24 0 8 0 8 0 -16 8 0 -8 -16 0 0 0 0 8 16 0 12 4 0 8 0 -4 16 12 8 0 16 -4 0 0 0 4 -8 0 -8 0 -8 0 -16 0 -16 0 0 0 0 -4 16 4 -8 -8 -4 0 -8 0 -8 16 -4 16 0 0 0 4 16 -8 16 0 -16 0 -16 0 -12 -16 -8 -16 16 16 8 0 0 0 0 0 0 -16 0 0 0 0 -16 0 0 0 0 0 8 0 0 4 -4 8 4 -8 8 0 0 0 -4 8 -4 8 -4 4 -16 8 4 0 0 8 -16 4 16 -12 16 -16 -8 16 16 -8 0 0 0 [...]
+1 3 0 -4 2 0 -16 0 0 0 -2 0 4 0 0 0 0 0 0 -4 3 0 0 0 0 -4 0 0 16 0 2 -8 -12 0 0 0 2 0 0 0 0 0 0 -8 0 8 4 0 16 0 0 8 -2 8 -2 0 16 -3 0 -4 0 -8 0 0 0 0 0 8 0 -8 0 -16 0 0 0 0 0 0 0 0 8 0 0 -4 -4 0 0 0 12 0 -4 0 0 0 4 0 0 0 -4 8 0 8 0 -8 0 0 0 0 0 0 0 0 4 0 0 0 0 12 0 -8 0 8 -16 4 0 0 0 0 0 16 -8 -16 0 0 0 16 0 4 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 0 0 0 -16 0 0 0 0 0 8 0 0 -4 0 8 -12 0 0 0 0 0 0 -8 4 -8 4 -4 16 8 -12 0 0 -8 16 -4 0 4 0 0 -8 0 0 0 0 0 0 0 0 0 16 -8 2 -8 0 0 0 0 0 -4 8 8 0 -12 0 4 [...]
+1 3 -8 2 4 0 -8 4 -4 -12 4 12 -2 -4 8 -12 -4 -12 8 -2 1 0 8 -4 0 4 4 0 -8 -8 2 8 4 12 -4 -8 2 0 -8 -8 8 0 4 4 -8 4 4 0 -8 8 8 4 2 8 2 0 -8 1 -8 2 8 4 4 0 8 -8 -4 6 -4 4 4 8 4 0 -8 -8 -8 -8 0 8 4 -8 0 0 0 0 0 0 0 0 0 0 0 8 2 16 -16 -16 0 4 16 4 0 4 0 -8 0 -8 4 -8 4 0 0 -8 0 4 4 0 0 4 0 4 -8 2 8 -4 8 -4 0 8 4 -8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 8 -4 -8 0 4 8 16 -16 -16 16 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 8 -4 0 -4 4 -4 8 -2 8 0 8 0 -8 -8 -8 -4 0 8 -4 -8 4 8 -8 -4 -2 -4 -4 [...]
+1 3 -8 2 4 0 -8 -4 4 12 4 -12 -2 -4 8 -12 4 12 -8 -2 1 0 8 -4 0 4 -4 0 -8 8 2 8 4 -12 -4 -8 2 0 -8 8 -8 0 4 4 -8 4 4 0 -8 -8 -8 4 2 8 2 0 -8 1 8 2 8 4 -4 0 8 -8 4 6 4 4 -4 8 4 0 -8 -8 8 8 0 -8 4 -8 0 0 0 0 0 0 0 0 0 0 0 8 2 -16 16 16 0 4 -16 4 0 4 0 -8 0 -8 -4 8 -4 0 0 -8 0 4 4 0 0 4 0 4 -8 2 8 4 -8 4 0 8 4 -8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 -8 4 8 0 -4 8 -16 16 16 -16 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 8 -4 0 4 -4 -4 8 -2 8 0 8 0 -8 -8 -8 -4 0 -8 4 8 -4 8 -8 -4 -2 -4 -4 [...]
+1 3 -4 -4 6 0 -16 0 0 0 -6 0 4 -8 16 -4 0 0 0 -4 3 0 -16 8 0 12 0 0 16 0 -2 -8 -4 0 8 -8 -2 0 -8 0 0 0 -8 8 -16 8 -12 0 -16 0 0 8 2 8 2 0 -16 -3 0 4 16 8 0 0 16 8 0 8 0 8 0 -16 -8 0 8 16 0 0 0 0 8 -16 0 -4 4 0 24 0 -4 -16 -4 24 0 -16 -4 0 0 0 4 -8 0 -8 0 -8 0 16 0 16 0 0 0 0 12 -16 -4 8 8 -4 0 -8 0 -8 16 -4 -16 0 0 0 -4 16 -8 16 0 16 0 -16 0 4 16 -24 16 16 -16 -8 0 0 0 0 0 0 16 0 0 0 0 -16 0 0 0 0 0 8 0 0 -12 4 8 4 -24 -8 0 0 0 4 8 -4 8 -4 4 -16 8 4 0 0 8 -16 4 -16 4 -16 16 -8 -16 -16 8  [...]
+1 3 -4 0 2 0 -8 0 -8 -4 -2 8 -4 -8 8 4 4 4 12 4 -1 -8 -8 8 8 0 0 0 -8 -4 2 0 0 -8 0 0 -2 0 0 -8 8 -8 0 -8 0 0 0 8 8 0 -12 0 -2 0 2 0 -8 1 8 0 -8 8 -8 -8 8 0 -4 -8 4 8 0 8 8 0 0 -8 4 8 8 -8 0 0 16 0 0 4 -8 0 -4 0 0 8 -8 -8 0 -8 0 -8 0 -8 0 8 8 0 16 0 -8 0 8 -8 0 4 -4 8 4 0 -8 4 0 0 16 -8 -8 8 8 -4 0 4 4 -8 0 8 0 0 0 0 8 0 8 -8 -8 0 0 0 0 8 0 0 -8 -4 -8 8 0 8 0 8 0 -8 -16 8 0 0 0 -4 4 -4 0 -4 8 8 -16 8 -4 -4 8 0 -8 0 0 -8 0 4 -8 4 8 8 -8 0 0 0 0 0 -8 8 0 0 -8 0 0 4 8 -8 0 2 0 -8 -8 8 12 -4 [...]
+1 3 -4 0 2 0 -8 0 0 4 -2 -8 -4 -8 8 4 -4 -4 -4 4 -1 -8 -8 8 -8 0 0 0 8 12 2 0 0 8 0 0 -2 -16 0 8 -8 8 0 8 0 0 0 8 8 0 4 0 -2 0 2 0 -8 1 -8 8 -8 -8 8 8 8 0 4 0 -4 -8 0 8 8 16 0 -8 -12 -8 -8 8 0 0 0 0 0 4 -8 0 -4 0 0 8 8 -8 -8 -8 0 -8 0 8 0 -8 -8 0 0 0 8 0 -8 8 0 4 -4 8 4 0 -8 4 0 0 0 8 -8 0 8 4 0 -4 4 -8 0 8 16 0 16 0 -8 0 8 -8 -8 0 0 0 -16 -8 0 0 8 4 -8 8 0 8 0 8 -16 8 0 -8 0 0 0 -4 4 -4 0 -4 8 8 0 -8 -4 -4 -8 0 8 0 8 -8 0 4 8 -4 -8 8 0 0 0 0 0 0 -8 8 0 0 8 0 0 -4 8 -8 0 2 0 -8 8 -8 -4 1 [...]
+1 3 -4 -4 2 4 -8 -4 0 8 -2 -8 -4 0 8 -4 0 -8 -8 4 -1 0 -8 0 0 0 4 -8 0 8 -2 0 0 4 8 0 2 8 0 12 -4 -16 8 8 0 0 0 0 -8 8 8 0 2 0 -2 8 8 1 -12 -8 8 -8 -4 0 -8 0 -8 0 0 8 4 8 0 -8 0 -8 -8 0 16 4 0 0 8 0 0 0 8 4 4 0 0 -8 0 8 8 0 -8 0 0 8 -8 -8 16 0 8 0 0 0 4 0 -4 0 -4 8 4 -8 0 -4 4 0 8 -8 8 0 -8 0 -8 8 4 -8 0 -8 -8 0 -8 0 16 0 -8 8 8 0 0 8 8 0 4 8 -16 -8 -8 0 8 0 8 8 8 -16 -8 0 -4 0 -4 0 4 -4 0 4 -8 0 -8 0 0 -4 -8 0 8 0 -8 8 0 -4 -4 0 8 -8 0 0 0 0 0 0 8 -8 -8 -8 0 -4 -8 8 8 -8 0 -2 0 0 12 -4  [...]
+1 3 -4 -4 2 4 -8 4 0 -8 -2 0 -4 0 8 -4 0 8 8 4 -1 0 -8 0 -16 0 -4 -8 16 -8 -2 0 0 -4 8 0 2 -8 0 -4 12 0 8 -8 0 0 0 0 -8 -8 -8 0 2 0 -2 8 8 1 4 0 8 8 4 16 -8 0 8 8 0 -8 -4 8 0 8 0 -8 8 0 0 -12 0 0 -8 0 0 0 8 4 4 0 0 -8 16 8 0 0 -8 0 0 -8 -8 8 0 0 -8 0 16 0 -4 0 4 0 -4 8 4 -8 0 -4 4 0 -8 8 8 -8 -8 0 8 -8 4 -8 0 -8 8 0 8 0 0 0 -8 8 8 0 0 8 -8 0 -4 -8 0 8 -8 0 8 0 8 8 -8 0 8 -16 -4 0 -4 0 4 -4 0 4 -8 0 8 -16 0 -4 8 0 -8 0 0 8 0 -4 4 0 -8 -8 8 0 0 0 0 0 8 -8 -8 -8 0 4 8 -8 8 -8 0 -2 0 0 -4 12 [...]
+1 1 8 -8 2 -8 16 0 -8 0 2 -8 0 -8 0 0 0 0 8 0 3 -16 0 -8 0 -4 0 -16 16 8 2 8 4 0 -8 0 2 0 0 8 8 0 -8 0 16 16 -4 -16 -16 0 8 0 2 8 2 -16 -16 3 8 -8 0 0 0 0 0 0 0 -4 0 -16 0 16 -8 0 0 0 8 0 0 8 16 16 0 -4 -4 -8 0 -8 -4 -32 -4 0 0 0 -8 16 16 16 -4 0 16 0 0 16 0 16 0 16 0 0 0 -8 4 0 8 -8 -8 -4 -8 16 0 -16 -16 -8 0 0 0 0 8 16 0 -16 0 0 0 -16 0 -4 0 0 0 -16 0 -8 0 0 0 0 0 0 0 16 16 16 16 16 0 0 0 0 -8 0 -8 -8 4 8 16 -4 0 -8 0 0 -8 8 0 -4 0 -4 -8 -16 16 -4 0 0 -16 -16 -8 16 -4 16 -32 8 0 0 -8 - [...]
+1 1 4 -4 2 -8 -8 0 0 4 2 0 8 0 -8 -4 4 4 4 8 -1 -8 -8 0 -8 0 0 0 -8 4 2 0 0 8 -8 0 -2 16 0 0 0 8 8 0 0 -8 0 -8 -8 0 4 -8 2 0 -2 0 8 -1 0 4 -8 0 -8 -8 8 0 4 -4 -4 0 0 8 0 16 0 8 4 -8 8 0 8 0 0 0 0 12 8 8 -4 0 0 -8 -8 8 4 -8 0 -8 0 0 0 0 8 -8 -16 0 -8 0 -8 -8 0 12 -4 8 -4 8 0 4 8 8 -16 0 -8 -4 -8 -4 0 4 -4 8 -8 8 0 0 0 0 8 0 8 -8 -8 0 0 8 0 -8 0 0 8 4 8 -8 0 -8 0 8 0 8 -16 -8 8 -8 8 12 -4 -4 8 4 8 0 -16 -8 12 -4 0 0 0 0 4 8 -8 -4 -8 -4 0 -8 -4 0 0 0 0 0 8 -8 8 0 -8 0 0 4 8 8 -8 2 8 0 0 0 4 [...]
+1 1 0 4 -2 -8 8 0 8 -4 -2 -8 0 0 0 -8 4 -4 4 0 -1 0 0 0 -8 0 0 8 8 -4 -2 0 0 0 -8 0 2 0 0 8 0 8 0 0 8 0 0 0 0 0 4 0 -2 0 2 8 0 -1 8 -4 -8 0 0 -8 8 0 -4 4 -4 0 0 -8 8 0 0 0 -4 8 8 0 0 -8 0 0 0 -4 0 0 -4 0 0 0 0 8 -4 0 -8 0 0 0 -8 0 0 0 8 -8 0 8 0 8 0 -4 4 0 0 0 8 4 0 0 8 0 0 4 -8 -4 0 -4 0 -8 0 0 -8 0 -8 0 0 0 8 0 -8 0 0 0 -8 8 0 0 0 -4 0 0 -8 0 -8 -8 -8 0 8 0 0 0 0 -4 4 0 0 4 0 8 8 0 -4 0 0 0 0 0 -4 0 0 -4 0 -4 0 0 4 8 0 -8 0 0 8 -8 0 8 8 0 0 -4 0 -8 0 -2 0 8 8 0 4 -4 0 0 0 0 0 8 -4 0 0  [...]
+1 1 0 0 -2 -4 8 -4 0 0 -2 0 0 0 0 -8 0 0 0 0 -1 8 0 0 0 0 -4 0 0 8 2 0 0 4 -8 0 -2 8 0 -4 4 0 0 0 -8 0 0 8 0 -8 0 0 2 0 -2 0 0 -1 -4 4 8 0 4 0 -8 0 0 -4 0 0 4 -8 8 8 0 0 8 0 0 4 0 8 -8 0 0 -8 0 4 4 0 0 0 8 -8 4 -8 0 -8 0 0 0 0 -8 0 0 8 8 -8 4 0 4 -8 4 0 0 0 8 -4 4 0 0 0 0 -4 8 0 -8 0 0 -8 0 0 0 0 0 0 -8 0 -8 0 8 0 0 0 0 0 4 -8 -8 0 0 -8 0 -8 0 -8 0 -8 0 8 4 0 4 -8 4 0 0 -4 0 8 0 8 -8 0 0 0 0 0 4 0 0 4 4 0 0 0 -4 -8 0 8 0 0 -8 8 0 0 0 4 -8 0 0 -8 0 2 0 8 -4 4 0 8 0 0 0 0 0 0 4 8 0 -2 0 8  [...]
+1 1 4 -2 0 -8 8 -4 4 -4 0 12 6 -4 -8 -16 -4 4 8 -6 1 0 8 4 -16 -4 4 0 -8 8 -2 0 4 -4 12 -8 -2 16 0 0 0 0 -4 4 8 4 4 0 -8 8 -8 -4 2 0 2 0 8 -1 0 2 -8 4 -4 16 8 0 4 -10 4 -4 -4 8 4 -16 8 -8 -8 -8 0 0 4 8 0 0 0 0 0 8 0 0 0 0 -16 -8 -2 0 0 0 0 -4 0 -4 0 -4 16 -8 16 -8 4 8 4 0 0 8 -4 4 -4 0 -8 -4 -16 4 8 6 8 -4 -8 -4 4 -8 4 -8 0 0 0 0 0 0 -8 0 8 0 0 4 0 8 4 -8 0 -4 8 0 0 0 0 -8 0 0 -16 -16 8 4 -8 0 0 4 -4 0 0 -4 16 16 0 -4 -4 0 -4 0 -2 -8 -4 0 4 -4 4 8 6 -8 0 -8 0 0 8 -8 -4 0 -8 -4 8 4 -8 8 - [...]
+1 1 0 8 -6 -8 0 0 8 0 -6 -8 0 0 0 0 0 0 -8 0 3 16 0 0 0 12 0 -16 0 -8 2 -8 4 0 0 0 2 0 0 8 8 0 0 0 0 0 12 16 0 0 -8 0 2 -8 2 -16 0 3 8 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 -4 -4 8 0 -8 -4 0 -4 0 0 0 0 -16 16 -16 -4 0 16 0 0 0 0 0 0 0 0 0 0 8 -12 0 0 0 0 -4 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 -4 0 0 0 16 0 0 0 0 0 0 0 0 0 -16 16 -16 16 0 0 0 0 0 -8 0 -8 8 -12 0 0 -4 0 0 0 0 8 0 0 -4 0 -4 0 0 0 -4 0 0 0 0 0 0 -4 0 0 -8 0 0 0 -16 0 0 0 0 0 0 0 2 0 0 8 8 -8 -8 12 0 0 0 4 0 0  [...]
+1 1 -4 8 -2 -8 0 0 8 0 -2 -8 0 0 0 -4 0 0 8 0 3 16 0 0 16 -4 0 -16 -16 8 6 -8 -4 0 0 -8 6 -16 24 -8 -8 16 0 0 0 0 -4 16 0 0 8 0 6 -8 6 -16 0 3 -8 0 0 0 0 16 0 24 0 -4 0 0 0 0 0 -16 -8 0 8 0 16 -8 0 0 -16 12 4 8 -8 -8 -4 -16 12 -8 16 0 0 16 -16 16 4 0 -16 0 16 0 -16 0 16 0 0 0 0 8 -4 0 -4 0 0 -4 -8 0 -16 0 0 0 0 0 0 0 -4 0 0 0 -16 16 -16 -16 16 12 0 -8 0 -16 16 0 -16 0 0 0 16 0 0 16 -16 16 -16 0 -16 16 -16 16 -8 0 -8 8 -4 -4 0 -4 -8 0 -16 16 8 -4 0 4 0 4 0 0 0 -4 0 0 0 0 0 0 12 0 -16 -8 0 [...]
+1 1 0 6 -4 -8 8 -4 -4 -4 4 12 -2 -4 -8 -4 -4 4 0 2 1 16 8 4 0 4 4 -16 -8 0 2 -8 4 -4 4 -8 2 0 8 0 0 0 4 4 -8 4 -4 -16 8 -8 0 4 -2 8 -2 16 8 -1 0 2 -8 4 12 0 -8 -8 -12 -2 4 4 -4 -8 4 0 8 8 0 8 0 0 4 -8 0 0 0 -8 0 -8 0 0 0 0 0 8 -2 0 0 0 0 -4 0 -4 0 -4 0 8 0 8 -12 -8 4 8 0 -8 8 -4 -4 0 8 -4 0 -4 -8 -2 8 -4 8 12 -8 8 -4 -8 0 0 0 0 0 0 8 0 8 0 0 -4 0 -8 4 8 0 12 -8 0 0 0 0 8 0 0 0 0 -8 -4 8 -8 0 -8 -4 0 0 -4 0 0 8 8 -4 0 -4 0 -2 -8 -4 0 -12 -4 -4 -8 -2 8 0 8 0 8 -8 -8 4 16 8 -4 -8 -12 8 -8 4 [...]
+1 1 8 -8 2 -8 -16 0 -8 0 2 -8 0 8 0 16 0 0 8 0 3 -16 0 8 0 -4 0 -16 -16 8 2 8 4 0 8 0 2 0 0 8 8 0 8 0 -16 -16 -4 -16 16 0 8 0 2 8 2 -16 16 3 8 8 0 0 0 0 0 0 0 12 0 16 0 -16 8 0 0 0 8 0 0 8 -16 -16 0 -4 -4 -8 0 -8 -4 -32 -4 0 0 0 8 16 16 16 -4 0 16 0 0 -16 0 -16 0 -16 0 0 0 -8 4 0 8 8 8 -4 -8 -16 0 16 16 8 0 0 0 0 8 -16 0 16 0 0 0 -16 0 -4 0 0 0 -16 0 8 0 0 0 0 0 0 0 16 16 16 16 -16 0 0 0 0 -8 0 -8 -8 4 8 -16 -4 0 8 0 0 -8 8 0 -4 0 -4 8 16 -16 -4 0 0 16 16 8 -16 -4 -16 -32 8 0 0 8 -16 0 0 [...]
+1 1 4 -8 6 -8 0 0 -8 0 6 -8 0 0 0 4 0 0 -8 0 3 -16 0 0 16 12 0 -16 16 -8 -2 -8 -4 0 0 8 -2 16 8 -8 -8 16 0 0 0 0 12 -16 0 0 -8 0 -2 -8 -2 -16 0 3 -8 0 0 0 0 16 0 8 0 -4 0 0 0 0 0 16 8 0 -8 0 16 -8 0 0 16 -4 4 -8 -24 -8 -4 16 -4 -24 16 0 0 -16 -16 -16 4 0 -16 0 16 0 16 0 16 0 0 0 0 -8 12 0 4 0 0 -4 -8 0 16 0 0 0 0 0 0 0 4 0 0 0 16 -16 16 -16 16 -4 0 -24 0 -16 -16 0 16 0 0 0 16 0 0 -16 -16 -16 -16 0 16 16 16 16 -8 0 -8 -8 12 4 0 -4 -24 0 16 16 -8 4 0 4 0 4 0 0 0 -4 0 0 0 0 0 0 -4 0 16 -8 0 [...]
+1 1 4 -4 2 -8 8 0 -8 -4 2 -16 -8 0 8 12 -4 -4 4 -8 -1 -8 8 0 -8 0 0 0 8 4 2 0 0 -8 8 0 -2 16 0 0 0 8 -8 0 0 8 0 -8 8 0 4 8 2 0 -2 0 -8 -1 0 -4 8 0 8 -8 -8 0 -4 4 4 0 0 -8 0 16 0 -8 4 8 8 0 -8 0 0 0 0 12 8 8 -4 0 0 -8 -8 -8 -4 -8 0 -8 0 0 0 0 8 8 -16 0 -8 0 8 8 0 12 -4 -8 -4 -8 0 4 8 -8 -16 0 8 4 8 4 0 -4 -4 -8 8 -8 0 0 0 0 8 0 -8 -8 8 0 0 -8 0 8 0 0 8 -4 -8 -8 0 -8 0 -8 0 8 -16 -8 8 8 8 12 -4 -4 -8 4 8 0 -16 -8 12 -4 0 0 0 0 -4 -8 8 -4 8 4 0 8 4 0 0 0 0 0 -8 8 -8 0 8 0 0 -4 -8 -8 8 2 -8  [...]
+1 1 4 -8 2 -4 8 -4 -8 -8 2 -8 -8 8 8 4 0 -8 0 -8 -1 0 8 8 16 0 -4 -8 16 0 -2 0 0 -4 0 0 2 -8 0 4 4 0 0 0 0 -8 0 0 -8 8 0 8 -2 0 2 -8 8 -1 4 4 -8 0 -4 16 8 0 8 -4 0 0 4 -8 -8 -8 0 -8 0 0 0 4 8 0 8 0 0 8 -8 12 4 0 0 8 0 8 4 0 -8 0 0 0 -8 0 -16 -8 8 0 0 0 -4 0 4 8 -4 -8 -4 0 -8 -4 12 8 8 0 -8 -4 -8 0 8 8 -4 -8 8 8 -8 0 -8 0 -16 0 8 8 -8 0 0 0 -8 0 4 8 -16 8 -8 0 -8 0 -8 -8 -8 -16 8 0 12 8 12 8 -4 -4 8 -4 -8 -8 8 0 8 -4 0 0 0 0 4 8 -8 4 -4 0 0 -8 -4 0 0 0 0 0 8 -8 0 -8 0 4 8 8 -8 -8 8 -2 8 - [...]
+1 1 8 -10 4 -8 8 -4 4 -12 -4 -4 -2 4 8 -4 4 12 0 2 1 -16 -8 -4 0 4 4 -16 -8 0 2 8 4 12 -4 8 2 0 8 0 0 0 -4 4 8 4 -4 16 8 -8 0 4 -2 -8 -2 16 8 -1 0 2 8 4 -4 0 8 -8 -4 -2 -4 4 -4 -8 -4 0 -8 -8 0 -8 0 0 4 8 0 0 0 8 0 -8 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 4 8 4 -8 0 8 0 4 4 0 8 -4 0 -4 -8 -2 -8 4 8 4 0 8 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 8 4 8 0 4 8 0 0 0 0 8 0 0 0 0 -8 -4 8 8 0 0 -4 0 0 4 0 0 -8 0 -4 0 -4 0 -2 -8 -4 0 4 4 -4 -8 -2 -8 0 -8 0 -8 8 8 -4 16 -8 -4 -8 -4 -8 -8 4 -2 4  [...]
+1 1 4 -8 2 -4 -8 4 -8 8 2 0 8 -8 -8 4 0 8 0 8 -1 0 -8 -8 16 0 4 -8 0 0 -2 0 0 4 0 0 2 -8 0 4 4 0 0 0 0 8 0 0 8 -8 0 -8 -2 0 2 -8 -8 -1 4 -4 8 0 4 16 -8 0 -8 4 0 0 -4 8 8 -8 0 8 0 0 0 4 -8 0 8 0 0 8 -8 12 4 0 0 8 0 -8 -4 0 -8 0 0 0 -8 0 -16 8 8 0 0 0 4 0 -4 8 -4 8 -4 0 8 -4 12 -8 8 0 8 4 8 0 -8 -8 -4 8 -8 -8 -8 0 -8 0 -16 0 -8 8 8 0 0 0 -8 0 -4 -8 -16 -8 8 0 -8 0 -8 8 -8 -16 8 0 12 -8 12 8 -4 -4 -8 -4 -8 8 8 0 8 -4 0 0 0 0 -4 -8 8 4 4 0 0 8 4 0 0 0 0 0 -8 8 0 -8 0 -4 -8 -8 8 8 -8 -2 -8 8  [...]
+1 1 0 4 -2 -8 -8 0 0 4 -2 -8 0 0 0 8 -4 4 4 0 -1 0 0 0 -8 0 0 8 -8 -4 -2 0 0 0 8 0 2 0 0 8 0 8 0 0 -8 0 0 0 0 0 4 0 -2 0 2 8 0 -1 8 4 8 0 0 -8 -8 0 4 -4 4 0 0 8 -8 0 0 0 -4 -8 8 0 0 8 0 0 0 -4 0 0 -4 0 0 0 0 -8 4 0 -8 0 0 0 -8 0 0 0 8 8 0 -8 0 -8 0 -4 4 0 0 0 -8 4 0 0 8 0 0 -4 8 4 0 4 0 8 0 0 -8 0 -8 0 0 0 -8 0 8 0 0 0 -8 -8 0 0 0 4 0 0 -8 0 -8 8 -8 0 8 0 0 0 0 -4 4 0 0 4 0 -8 8 0 -4 0 0 0 0 0 4 0 0 -4 0 4 0 0 -4 -8 0 8 0 0 -8 8 0 8 -8 0 0 4 0 8 0 -2 0 -8 8 0 4 -4 0 0 0 0 0 8 4 0 0 2 0 0 [...]
+1 1 0 0 -2 -4 -8 4 0 0 -2 -8 0 0 0 8 0 0 0 0 -1 8 0 0 0 0 4 0 -16 8 2 0 0 -4 8 0 -2 8 0 -4 4 0 0 0 8 0 0 8 0 8 0 0 2 0 -2 0 0 -1 -4 -4 -8 0 -4 0 8 0 0 4 0 0 -4 8 -8 8 0 0 8 0 0 4 0 -8 -8 0 0 -8 0 4 4 0 0 0 8 8 -4 -8 0 -8 0 0 0 0 -8 0 0 -8 8 8 -4 0 -4 -8 4 0 0 0 -8 -4 4 0 0 0 0 4 -8 0 8 0 0 8 0 0 0 0 0 0 -8 0 8 0 -8 0 0 0 0 0 -4 8 -8 0 0 -8 0 -8 0 8 0 -8 0 8 4 0 4 -8 4 0 0 -4 0 -8 0 8 -8 0 0 0 0 0 -4 0 0 4 -4 0 0 0 4 8 0 -8 0 0 8 -8 0 0 0 -4 8 0 0 8 0 2 0 -8 -4 4 0 8 0 0 0 0 0 0 -4 8 0 -2 [...]
+1 1 0 -4 -2 0 -8 0 0 -4 -2 0 0 8 0 0 4 -4 -4 0 -1 0 0 8 8 0 0 8 -8 4 -2 0 0 0 0 0 2 0 0 0 8 -8 -8 0 8 0 0 0 0 0 -4 0 -2 0 2 8 0 -1 0 4 8 0 0 8 -8 0 -4 -4 -4 0 0 8 0 0 0 0 4 8 -8 8 0 -8 0 0 0 4 0 -8 -4 0 0 0 0 -8 4 0 -8 0 0 0 -8 0 0 0 -8 -8 0 8 0 8 0 4 4 0 0 -8 0 4 -8 0 -8 0 0 -4 8 -4 0 -4 0 8 0 0 8 0 8 0 0 0 -8 0 8 0 0 -8 8 8 0 0 0 -4 0 0 -8 0 -8 8 8 0 -8 0 -8 0 -8 4 4 0 0 4 0 0 -8 0 4 0 0 0 0 0 4 0 0 -4 0 -4 0 0 -4 8 0 -8 0 0 -8 8 -8 8 8 0 0 -4 0 8 0 -2 0 0 0 8 -4 4 0 0 0 0 0 -8 4 0 0 2 [...]
+1 1 0 -8 -2 4 -8 -4 -8 0 -2 8 0 8 0 0 0 0 8 0 -1 8 0 8 0 0 -4 0 0 0 2 0 0 4 0 0 -2 -8 0 4 -4 0 -8 0 -8 0 0 8 0 -8 8 0 2 0 -2 0 0 -1 4 -4 -8 0 4 0 8 0 0 4 0 0 4 8 0 -8 0 0 0 0 0 -4 0 8 8 0 0 0 0 -4 4 0 0 0 -8 8 -4 -8 0 -8 0 0 0 0 8 0 0 8 -8 -8 4 0 4 0 4 0 0 -8 0 -4 -4 0 0 0 0 4 -8 0 -8 0 0 8 0 0 0 0 0 0 8 0 8 0 -8 0 0 -8 0 0 4 -8 8 0 0 -8 0 -8 0 8 0 8 0 -8 -4 0 -4 0 4 0 0 -4 0 0 0 -8 0 0 0 0 0 0 -4 0 0 4 4 0 0 0 4 -8 0 8 0 0 8 -8 -8 0 0 4 -8 0 0 8 0 2 0 0 4 -4 8 0 0 0 0 0 0 0 -4 -8 0 -2 0 [...]
+1 1 4 -6 0 -4 -16 0 4 0 0 4 6 4 -8 0 0 0 4 -6 1 0 8 -4 0 -4 0 0 16 4 2 0 -4 0 -4 0 2 0 -8 4 4 0 4 4 0 -4 4 0 8 0 -4 -4 -2 0 -2 0 8 -1 -4 2 0 4 0 0 0 8 0 6 0 4 0 0 4 0 0 -8 -4 0 0 -4 -4 0 0 0 0 -4 0 4 0 0 0 0 8 0 -2 0 0 0 0 -4 0 -4 -8 4 -8 0 -8 0 0 0 0 4 0 8 4 -4 -4 0 -4 4 8 -4 -8 -2 0 0 0 0 -4 0 4 -8 -8 0 8 0 8 0 0 0 0 0 0 -4 -8 0 0 0 -8 0 8 0 0 0 0 0 8 8 8 8 4 4 -4 -4 0 -4 4 0 0 -4 -8 -8 4 4 -4 0 -4 0 -2 -8 4 0 0 0 -4 -8 -2 0 0 0 0 0 0 0 4 0 0 0 0 0 -8 0 -4 -2 -4 4 -4 -4 -4 -4 4 4 4 8 4 [...]
+1 1 -4 0 2 -4 0 -4 0 8 2 -8 0 0 0 -4 0 8 0 0 -1 0 0 0 8 0 -4 8 0 0 -2 0 0 -4 0 0 2 0 0 -4 -4 8 0 -8 0 0 0 0 0 8 0 0 -2 0 2 8 0 -1 -4 4 0 8 -4 8 0 0 -8 4 0 -8 4 0 0 0 0 0 0 0 8 -4 0 0 0 0 0 0 8 -4 4 0 0 -8 -8 0 4 0 8 0 0 8 8 -8 -8 0 0 0 -8 0 -4 0 4 0 -4 0 4 0 0 -4 -4 0 0 -8 0 4 0 0 8 -8 4 0 0 0 0 0 0 0 -8 0 0 -8 0 0 0 0 0 0 4 8 -8 -8 0 0 8 0 8 0 0 -8 0 -8 -4 0 -4 0 -4 4 0 -4 8 0 0 -8 0 4 8 0 -8 0 4 0 0 4 -4 0 -8 0 4 0 0 0 0 0 0 0 0 8 0 4 8 -8 0 0 0 -2 0 0 -4 -4 0 0 0 8 -8 0 0 8 4 0 0 2 0  [...]
+1 1 -4 -4 2 0 0 0 -8 -4 2 8 0 0 0 -4 -4 -4 -4 0 -1 8 0 0 0 0 0 0 8 -4 2 0 0 8 0 0 -2 8 0 0 0 0 0 8 0 0 0 8 0 0 -4 0 2 0 -2 0 0 -1 0 4 0 -8 -8 0 0 0 -4 4 4 -8 0 0 0 8 0 0 -4 8 0 0 0 0 8 0 0 -4 -8 0 -4 0 0 8 0 0 4 8 0 8 0 -8 0 8 0 0 -8 0 0 0 -8 8 0 -4 -4 0 4 0 0 4 0 0 -8 -8 0 4 0 4 0 -4 4 0 0 0 -8 0 -8 0 0 0 0 8 0 0 0 0 -8 8 0 0 0 -4 0 8 0 8 0 0 -8 0 -8 0 0 0 0 -4 -4 4 0 4 -8 0 -8 0 -4 4 -8 0 8 0 4 0 0 -4 -8 4 -8 0 4 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 0 0 2 0 0 0 0 -4 -4 0 -8 8 0 0 0 4 8 0 -2 0  [...]
+1 1 -4 0 2 -4 0 4 0 -8 2 0 0 0 0 -4 0 -8 0 0 -1 0 0 0 8 0 4 8 0 0 -2 0 0 4 0 0 2 0 0 -4 -4 8 0 8 0 0 0 0 0 -8 0 0 -2 0 2 8 0 -1 -4 -4 0 -8 4 8 0 0 8 -4 0 8 -4 0 0 0 0 0 0 0 8 -4 0 0 0 0 0 0 8 -4 4 0 0 -8 -8 0 -4 0 8 0 0 -8 8 8 -8 0 0 0 -8 0 4 0 -4 0 -4 0 4 0 0 -4 -4 0 0 8 0 -4 0 0 -8 8 4 0 0 0 0 0 0 0 -8 0 0 -8 0 0 0 0 0 0 -4 -8 -8 8 0 0 8 0 8 0 0 -8 0 -8 -4 0 -4 0 -4 4 0 -4 8 0 0 -8 0 4 -8 0 8 0 -4 0 0 4 4 0 8 0 -4 0 0 0 0 0 0 0 0 8 0 -4 -8 8 0 0 0 -2 0 0 -4 -4 0 0 0 -8 8 0 0 8 -4 0 0 2 [...]
+1 1 -4 -4 2 0 0 0 0 4 2 -8 0 0 0 -4 4 4 -4 0 -1 8 0 0 0 0 0 0 8 -4 2 0 0 -8 0 0 -2 8 0 0 0 0 0 -8 0 0 0 8 0 0 -4 0 2 0 -2 0 0 -1 0 -4 0 8 8 0 0 0 4 -4 -4 8 0 0 0 8 0 0 -4 -8 0 0 0 0 8 0 0 -4 -8 0 -4 0 0 8 0 0 -4 8 0 8 0 8 0 -8 0 0 -8 0 0 0 8 -8 0 -4 -4 0 4 0 0 4 0 0 -8 8 0 -4 0 -4 0 4 4 0 0 0 -8 0 -8 0 0 0 0 8 0 0 0 0 -8 -8 0 0 0 4 0 8 0 8 0 0 -8 0 -8 0 0 0 0 -4 -4 4 0 4 -8 0 -8 0 -4 4 8 0 -8 0 -4 0 0 -4 8 -4 8 0 -4 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 0 0 2 0 0 0 0 -4 -4 0 8 -8 0 0 0 -4 8 0 -2  [...]
+1 1 0 -6 4 -4 -8 0 4 0 -4 4 6 -4 0 -4 0 0 -4 -6 1 0 0 4 8 4 0 0 16 -4 -2 -8 -4 0 4 0 -2 8 0 -4 -4 8 -4 -4 0 4 -4 0 0 0 4 -4 2 8 2 0 0 -1 4 2 8 -4 0 -8 8 0 0 6 0 4 0 -8 -4 -8 0 16 4 0 -8 4 4 0 -8 0 0 -4 0 4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 4 0 -16 0 4 4 0 -4 -4 0 -4 0 -2 -8 0 0 0 0 8 4 0 0 0 0 0 0 0 -8 0 -8 0 0 4 0 0 0 0 0 0 -16 0 0 0 0 8 0 0 0 0 4 4 -4 -4 0 0 -4 0 0 4 0 0 4 0 4 0 4 0 -2 0 -4 0 0 0 -4 0 -2 0 0 0 0 8 8 8 -4 0 0 0 0 0 16 -8 -4 2 4 -4 4 4 4 4 -4 -4 -4 0 4 -8  [...]
+1 1 0 2 0 -8 0 -4 -4 0 0 4 -2 -4 0 4 0 0 4 2 -3 -8 0 4 -8 0 4 16 0 -4 -2 0 0 4 -4 0 2 0 0 8 -8 8 -4 -4 8 12 0 8 0 8 -4 -4 2 0 -2 -16 0 3 -8 6 0 4 4 8 0 0 0 6 0 -12 12 0 4 0 0 0 4 0 -8 8 -12 -8 0 4 4 -4 0 -8 0 0 -4 0 8 0 -6 -8 -16 8 -4 -4 16 4 8 -12 0 8 -8 -8 -4 0 -12 4 0 0 0 4 -4 0 8 12 0 12 0 -6 0 0 -8 0 0 0 4 0 0 0 0 0 -8 4 0 0 0 0 0 4 0 0 -12 -8 8 0 0 8 16 -8 -16 0 0 -8 0 8 -8 4 8 -4 0 0 12 0 0 -4 0 -8 4 0 -4 4 4 -4 -6 0 -12 0 -4 0 12 0 -6 -8 -4 8 0 0 0 0 -4 -16 0 12 8 0 0 0 -4 2 -12  [...]
+1 1 0 -4 -2 0 8 0 -8 4 -2 0 0 -8 0 0 -4 4 -4 0 -1 0 0 -8 8 0 0 8 8 4 -2 0 0 0 0 0 2 0 0 0 8 -8 8 0 -8 0 0 0 0 0 -4 0 -2 0 2 8 0 -1 0 -4 -8 0 0 8 8 0 4 4 4 0 0 -8 0 0 0 0 4 -8 -8 8 0 8 0 0 0 4 0 -8 -4 0 0 0 0 8 -4 0 -8 0 0 0 -8 0 0 0 -8 8 0 -8 0 -8 0 4 4 0 0 8 0 4 -8 0 -8 0 0 4 -8 4 0 4 0 -8 0 0 8 0 8 0 0 0 8 0 -8 0 0 8 8 -8 0 0 0 4 0 0 -8 0 -8 -8 8 0 -8 0 -8 0 -8 4 4 0 0 4 0 0 -8 0 4 0 0 0 0 0 -4 0 0 -4 0 4 0 0 4 -8 0 8 0 0 8 -8 8 8 -8 0 0 4 0 -8 0 -2 0 0 0 8 -4 4 0 0 0 0 0 -8 -4 0 0 2 0 [...]
+1 1 0 -2 0 -4 0 0 -4 -4 0 4 -2 -4 0 4 4 4 0 2 -3 0 0 4 0 0 0 8 -8 0 2 0 0 0 -4 0 -2 8 0 -4 4 0 -4 4 -8 4 0 0 0 0 0 -4 -2 0 2 -8 0 3 4 -2 0 -4 0 0 0 0 4 -2 12 4 0 0 4 -8 0 0 0 8 0 -4 -4 8 8 4 -4 0 0 -4 0 0 -4 0 0 0 2 0 8 0 4 4 -8 -4 0 -4 -8 -8 0 8 0 -8 0 0 0 0 0 4 -4 0 4 4 8 -4 0 2 0 -12 0 -4 0 0 4 0 8 0 -8 0 0 4 0 0 0 0 0 4 8 -8 0 0 0 -4 0 0 -8 0 8 0 -8 0 8 0 -4 4 4 0 0 0 4 0 0 -4 -8 0 0 0 4 -4 -4 4 2 0 -4 0 0 -12 -4 0 2 8 -4 -8 0 0 0 0 -4 -8 8 0 0 4 0 0 -4 -2 -4 4 4 -4 0 0 0 -4 4 0 0 0  [...]
+1 1 0 -2 0 -4 0 0 4 -12 0 4 -2 4 0 -4 -4 12 0 2 -3 0 0 -4 0 0 0 8 8 0 -6 0 0 0 4 0 6 -8 0 -4 4 0 4 4 8 4 0 0 0 0 0 -4 6 0 -6 -8 0 3 4 -2 0 -4 0 0 0 0 12 -2 -12 4 0 0 -4 8 0 0 0 24 0 -4 -4 -8 -8 -12 -4 0 0 -4 0 0 12 0 0 0 2 0 8 0 4 4 -8 -4 0 -4 8 8 0 -8 0 -24 0 0 0 0 0 -4 4 0 4 4 -8 -4 0 2 0 12 0 -12 0 0 4 0 -8 0 8 0 0 -12 0 0 0 0 0 -4 -8 -24 0 0 0 -12 0 0 -8 0 8 0 8 0 -8 0 -4 4 4 0 0 0 4 0 0 4 8 0 0 0 4 -4 -4 4 2 0 -4 0 0 12 -4 0 2 -8 12 8 0 0 0 0 4 -8 24 0 0 12 0 0 -4 6 -4 -4 4 -4 0 0 0 [...]
+1 1 0 -6 0 0 0 -4 4 0 0 -4 -2 4 0 -4 0 0 -4 2 -3 8 0 -4 8 0 4 0 0 4 -2 0 0 4 4 0 2 0 0 0 0 -8 4 -4 -8 -4 0 -8 0 8 4 -4 2 0 -2 0 0 3 0 -2 0 4 4 -8 0 0 0 -2 0 4 12 0 -4 0 0 0 -4 0 8 0 4 8 0 4 4 4 0 0 0 0 -4 0 -8 0 2 8 0 -8 -4 -4 0 4 -8 4 0 -8 8 8 -4 0 -12 -4 0 0 0 -4 4 0 0 -4 0 -4 0 2 0 0 -8 0 0 0 4 0 0 0 0 0 8 4 0 0 0 0 0 -4 0 0 -12 -8 -8 0 0 -8 0 8 0 0 0 8 0 -8 0 4 0 4 0 0 -4 0 0 4 0 8 -4 0 -4 4 4 -4 2 0 4 0 -4 0 -4 0 2 8 -4 -8 0 0 0 0 4 0 0 12 8 0 0 0 -4 2 4 -4 0 0 4 -4 0 4 -4 0 0 8 -2  [...]
+1 1 0 -8 -2 4 8 4 -8 0 -2 0 0 -8 0 0 0 0 8 0 -1 8 0 -8 0 0 4 0 16 0 2 0 0 -4 0 0 -2 -8 0 4 -4 0 8 0 8 0 0 8 0 8 8 0 2 0 -2 0 0 -1 4 4 8 0 -4 0 -8 0 0 -4 0 0 -4 -8 0 -8 0 0 0 0 0 -4 0 -8 8 0 0 0 0 -4 4 0 0 0 -8 -8 4 -8 0 -8 0 0 0 0 8 0 0 -8 -8 8 -4 0 -4 0 4 0 0 8 0 -4 -4 0 0 0 0 -4 8 0 8 0 0 -8 0 0 0 0 0 0 8 0 -8 0 8 0 0 8 0 0 -4 8 8 0 0 -8 0 -8 0 -8 0 8 0 -8 -4 0 -4 0 4 0 0 -4 0 0 0 -8 0 0 0 0 0 0 4 0 0 4 -4 0 0 0 -4 8 0 -8 0 0 -8 8 8 0 0 -4 8 0 0 -8 0 2 0 0 4 -4 8 0 0 0 0 0 0 0 4 -8 0 - [...]
+1 1 4 -10 0 0 8 4 4 4 0 -4 6 -12 -8 -8 4 -4 0 -6 1 0 8 12 16 -4 -4 0 -8 0 -2 0 4 4 4 -8 -2 -16 0 8 8 0 4 4 8 4 4 0 8 -8 0 -4 2 0 2 0 -8 -1 -8 -6 8 4 4 -16 -8 0 -4 -2 -4 -4 4 8 -4 16 8 -8 0 8 0 -8 4 8 0 0 0 -8 0 0 0 0 0 0 0 8 6 0 0 0 0 -4 0 -4 16 -4 0 -8 0 -8 -4 -8 -4 8 0 8 -4 -4 4 0 0 -4 0 4 -8 -2 -8 4 8 4 4 -8 4 8 16 0 -16 0 -16 0 8 0 -8 0 0 -4 16 -8 -4 8 16 4 8 0 0 0 0 -8 -16 -16 0 0 0 4 0 -8 0 4 -4 0 0 4 0 0 8 -4 -4 0 -4 0 6 8 -4 0 -4 4 4 -8 -2 -8 0 -8 0 0 -8 8 4 0 8 4 -8 -4 -8 8 -4 2 [...]
+1 1 0 0 -6 0 0 0 0 0 -6 0 0 0 0 0 0 0 0 0 3 0 0 0 0 12 0 0 0 0 -6 24 -12 0 0 0 -6 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 -6 24 -6 0 0 3 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 -4 0 0 0 12 0 12 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -48 0 12 0 0 0 -48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 0 0 12 0 0 0 0 0 0 0 -4 0 -4 0 0 0 12 0 0 0 0 0 0 12 0 0 24 0 0 0 0 0 0 0 0 0 0 0 -6 0 0 0 0 0 0 12 0 0 0 -12 0 0 0 0 -6 0 0 0 0 3 0  [...]
+1 1 -4 0 -2 0 0 0 0 0 -2 0 0 0 0 -4 0 0 0 0 3 0 0 0 0 -4 0 0 0 0 -2 8 -4 0 0 8 -2 0 8 0 0 0 0 0 0 0 -4 0 0 0 0 0 -2 8 -2 0 0 3 0 0 0 0 0 0 0 8 0 -4 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 -4 4 0 8 0 -4 -16 -4 8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 0 -4 0 0 -4 0 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 -16 0 16 0 -4 0 8 0 16 -16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 -4 8 0 0 0 0 -4 0 4 0 4 0 0 0 -4 0 0 0 0 0 0 -4 0 -16 8 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 -4 0 0 8 -4 0 0 0 0 -2 0 0 0 0 3 0  [...]
+1 1 0 2 -4 -4 0 0 -4 0 4 4 -2 -4 -8 4 0 0 -4 2 1 0 8 4 0 4 0 0 0 -4 -2 8 -4 0 -4 0 -2 0 0 4 4 0 4 4 0 -4 -4 0 -8 0 4 4 2 -8 2 0 8 -1 -4 -6 0 4 0 0 16 0 0 6 0 -4 0 0 -4 0 0 8 4 0 0 -4 -4 0 0 0 0 4 0 4 0 0 0 0 8 -16 6 0 0 0 0 -4 0 -4 -8 4 8 0 -8 0 0 0 0 -4 0 -8 0 -4 4 0 -4 4 -8 4 8 -2 0 0 0 0 0 0 -4 -8 8 0 -8 0 8 0 -16 0 0 0 0 -4 8 0 0 0 -8 0 -8 0 0 0 0 0 -8 8 -8 8 4 -4 -4 4 0 0 4 0 0 4 8 -8 -4 0 -4 0 -4 0 6 -8 4 0 0 0 4 8 -2 0 0 0 0 -8 16 0 4 0 0 0 0 0 8 0 4 2 -4 -4 -4 -4 4 4 -4 4 4 0 4 0 [...]
+1 1 0 -8 -6 8 0 0 -8 0 -6 8 0 0 0 0 0 0 8 0 3 -16 0 0 0 12 0 16 0 8 2 -8 4 0 0 0 2 0 0 -8 -8 0 0 0 0 0 12 -16 0 0 8 0 2 -8 2 16 0 3 -8 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 8 0 0 -8 0 0 0 -4 -4 -8 0 8 -4 0 -4 0 0 0 0 16 -16 16 -4 0 -16 0 0 0 0 0 0 0 0 0 0 -8 -12 0 0 0 0 -4 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 -4 0 0 0 16 0 0 0 0 0 0 0 0 0 16 -16 16 -16 0 0 0 0 0 8 0 8 -8 -12 0 0 -4 0 0 0 0 -8 0 0 -4 0 -4 0 0 0 -4 0 0 0 0 0 0 -4 0 0 -8 0 0 0 16 0 0 0 0 0 0 0 2 0 0 -8 -8 8 8 12 0 0 0 4 0 0 0 [...]
+1 1 0 -6 -4 4 0 0 4 0 4 -4 -2 4 -8 -4 0 0 4 2 1 0 8 -4 0 4 0 0 0 4 -2 8 -4 0 4 0 -2 0 0 -4 -4 0 -4 4 0 -4 -4 0 8 0 -4 4 2 -8 2 0 -8 -1 4 2 16 4 0 0 0 0 0 -2 0 -4 0 0 4 0 0 8 -4 0 0 4 -4 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 -2 0 0 0 0 -4 0 -4 8 4 -8 0 8 0 0 0 0 4 0 -8 0 4 -4 0 4 4 8 4 -8 6 -16 0 0 0 0 0 -4 8 -8 0 8 0 -8 0 0 0 -16 0 0 4 -8 0 0 0 8 0 -8 0 0 0 0 0 8 -8 8 -8 -4 -4 4 -4 0 0 4 0 0 -4 -8 8 4 0 -4 0 -4 0 -2 8 4 0 0 0 4 -8 6 0 0 0 0 -8 0 16 -4 0 0 0 0 0 8 0 4 2 -4 4 4 4 -4 -4 -4 4 4 0 4 0 [...]
+1 1 -4 0 -2 0 0 -8 -8 8 -2 8 0 0 0 -4 -8 8 0 0 3 0 0 0 0 -4 -8 0 0 0 -2 -8 12 8 0 24 -2 0 -8 0 0 0 0 0 0 0 -4 0 0 16 0 0 -2 -8 -2 0 0 3 0 0 0 0 8 0 0 -8 8 12 -24 0 -24 0 0 0 24 0 0 16 0 0 0 0 0 -4 4 0 -8 0 12 -16 -4 -8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 8 16 -24 0 -4 0 -4 0 0 12 0 0 0 0 0 0 0 -24 16 8 -4 0 0 0 0 16 0 -16 0 -4 0 -8 0 -16 16 0 0 16 -24 16 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 12 -8 0 0 0 0 -4 0 4 0 4 0 0 0 12 8 -24 0 0 0 0 -4 0 -16 -8 0 0 0 0 16 -24 16 8 0 0 0 -2 0 0 0 0 0  [...]
+1 1 -8 0 2 0 0 0 0 0 2 0 0 0 0 -8 0 0 0 0 3 0 0 0 0 -4 0 0 0 0 2 8 4 0 0 0 2 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 2 8 2 0 0 3 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 0 0 -4 32 -4 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 0 0 -4 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 0 0 -16 0 -4 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 0 -4 0 0 0 0 0 -8 0 -4 0 -4 0 0 0 -4 0 0 0 0 0 0 -4 0 32 8 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 -4 0 0 0 4 0 0 0 0 2 0 0 0 0 3 0 0 0 0 0 0 0 0 [...]
+1 1 -4 -2 0 0 0 -4 -4 4 0 4 -2 -4 0 0 4 -4 0 2 1 0 0 4 8 -4 4 0 -8 0 -2 0 4 -4 4 8 -2 8 0 0 0 -8 4 -4 8 -4 4 0 0 8 0 4 2 0 2 0 0 -1 0 2 0 -4 -4 -8 0 0 -4 -2 -4 4 -4 0 4 -8 -8 0 0 8 8 0 -4 8 8 0 0 0 0 0 0 0 0 0 8 0 -2 0 0 0 0 4 0 4 8 4 8 -8 -8 -8 4 -8 4 0 0 0 4 -4 -4 0 0 4 -8 -4 0 -2 0 4 -8 4 -4 0 -4 0 -8 0 8 0 -8 0 0 0 0 0 0 -4 -8 -8 4 -8 8 4 0 0 0 0 0 0 8 -8 -8 8 0 -4 0 0 0 -4 4 0 0 -4 8 -8 0 4 4 0 4 0 -2 0 4 0 4 4 -4 0 -2 -8 0 -8 0 0 0 0 4 0 8 -4 8 -4 0 0 4 2 -4 4 0 0 0 0 4 -4 -4 0 -4  [...]
+1 1 -4 0 -2 0 0 8 8 -8 -2 -8 0 0 0 -4 8 -8 0 0 3 0 0 0 0 -4 8 0 0 0 -2 -8 12 -8 0 24 -2 0 -8 0 0 0 0 0 0 0 -4 0 0 -16 0 0 -2 -8 -2 0 0 3 0 0 0 0 -8 0 0 -8 -8 12 24 0 24 0 0 0 24 0 0 -16 0 0 0 0 0 -4 4 0 -8 0 12 -16 -4 -8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 -8 -16 24 0 -4 0 -4 0 0 12 0 0 0 0 0 0 0 24 -16 -8 -4 0 0 0 0 16 0 -16 0 -4 0 -8 0 -16 16 0 0 -16 24 -16 0 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 12 -8 0 0 0 0 -4 0 4 0 4 0 0 0 12 -8 24 0 0 0 0 -4 0 -16 -8 0 0 0 0 -16 24 -16 -8 0 0 0 -2 0  [...]
+1 1 -4 -2 0 0 0 4 4 -4 0 -4 -2 -4 0 0 -4 4 0 2 1 0 0 4 -8 -4 -4 0 8 0 -2 0 4 4 4 8 -2 -8 0 0 0 8 4 -4 8 -4 4 0 0 -8 0 4 2 0 2 0 0 -1 0 2 0 -4 4 8 0 0 4 -2 4 4 4 0 4 8 -8 0 0 -8 -8 0 -4 8 -8 0 0 0 0 0 0 0 0 0 -8 0 -2 0 0 0 0 4 0 4 -8 4 -8 -8 8 -8 -4 8 -4 0 0 0 4 -4 -4 0 0 4 8 -4 0 -2 0 -4 8 -4 -4 0 -4 0 8 0 -8 0 8 0 0 0 0 0 0 -4 8 8 -4 8 -8 -4 0 0 0 0 0 0 -8 8 8 -8 0 -4 0 0 0 -4 4 0 0 -4 -8 8 0 4 4 0 4 0 -2 0 4 0 -4 -4 -4 0 -2 -8 0 -8 0 0 0 0 4 0 -8 4 -8 4 0 0 4 2 -4 4 0 0 0 0 4 -4 -4 0 - [...]
+1 1 0 6 -4 -8 -8 -4 -12 4 4 12 -2 -4 -8 12 4 -4 0 2 1 0 8 4 0 4 4 0 8 -16 2 -8 4 -4 -12 8 2 0 -8 16 0 0 4 4 8 4 -4 0 -24 -8 0 4 -2 8 -2 0 8 -1 -16 10 8 4 12 0 -24 8 12 -10 -4 4 -4 8 -12 0 -8 8 16 -8 0 0 4 8 0 0 0 8 0 8 0 0 0 0 -16 24 -10 16 16 -16 0 -4 -16 -4 16 -4 -16 -8 16 -8 -12 8 4 -8 0 -8 -8 -4 12 0 -8 -4 16 -4 24 6 -8 4 8 -12 8 -8 -4 -8 -16 0 16 0 -16 0 24 0 -8 0 0 -4 -16 8 4 8 16 -12 -8 -16 -16 16 16 -8 16 -16 16 -16 8 -4 -8 8 0 8 -4 0 0 12 -16 16 -8 -8 -4 0 -4 0 -10 -8 -4 0 -12 4 [...]
+1 1 -4 2 0 -4 -8 0 -4 0 0 4 -2 -4 0 8 0 0 4 2 1 0 0 4 8 -4 0 0 0 4 2 0 -4 0 -4 0 2 -8 8 -4 -4 8 4 -4 0 4 4 0 16 0 -4 4 -2 0 -2 0 0 -1 4 2 -8 -4 0 -8 8 -8 0 -2 0 -4 0 8 -4 8 0 0 -4 0 -8 4 4 0 8 0 0 4 0 4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 -4 0 0 -4 -4 4 0 -4 -4 0 4 -16 6 8 0 0 0 4 -8 -4 0 0 0 0 0 0 0 -8 0 8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 4 -4 -4 4 0 4 -4 0 0 4 0 0 -4 -4 4 0 4 0 -2 0 -4 0 0 0 4 -16 6 0 0 0 0 0 8 -8 4 0 0 0 0 0 0 8 4 -2 4 -4 4 4 -4 -4 4 -4 -4 -8 4 -8  [...]
+1 1 0 -2 -4 0 -8 4 4 -4 4 -4 -2 4 -8 4 -4 4 -8 2 1 0 8 -4 0 4 -4 0 8 8 2 -8 4 4 -4 8 2 0 -8 -8 8 0 -4 4 8 4 -4 0 -8 8 8 4 -2 8 -2 0 -8 -1 8 2 -8 4 -12 0 -8 8 -12 -2 4 4 4 8 -4 0 -8 8 -8 8 0 -8 4 8 0 0 0 0 0 0 0 0 0 0 0 8 -2 -16 -16 16 0 -4 16 -4 0 -4 0 -8 0 -8 12 -8 -4 0 0 -8 -8 4 4 0 0 -4 0 -4 8 -2 8 -4 -8 12 8 -8 -4 8 0 0 0 0 0 0 8 0 8 0 0 4 0 -8 -4 -8 0 12 -8 16 16 -16 -16 -8 0 0 0 0 0 -4 0 0 0 8 -4 0 0 4 0 0 0 -8 -4 0 -4 0 -2 8 -4 0 12 -4 -4 8 -2 -8 0 -8 0 8 -8 -8 -4 0 8 4 8 -12 8 8  [...]
+1 1 0 -6 0 0 0 4 4 0 0 -12 -2 -4 0 4 0 0 -4 2 -3 8 0 4 -8 0 -4 0 0 4 6 0 0 12 -4 0 -6 0 0 0 0 8 -4 -4 8 -4 0 -8 0 24 4 -4 -6 0 6 0 0 3 0 -2 0 4 12 8 0 0 0 -2 0 4 -12 0 4 0 0 0 -4 0 -8 0 4 -8 0 -12 4 4 0 0 0 0 12 0 8 0 2 8 0 -8 -4 -4 0 4 8 4 0 8 -8 -8 -12 0 12 -4 0 0 0 4 -4 0 0 -4 0 -4 0 2 0 0 -24 0 0 0 4 0 0 0 0 0 -8 -12 0 0 0 0 0 4 0 0 12 -24 8 0 0 -8 0 8 0 0 0 -8 0 8 0 4 0 4 0 0 -4 0 0 -4 0 -8 -4 0 -4 4 4 -4 2 0 4 0 -12 0 -4 0 2 -8 12 8 0 0 0 0 -4 0 0 -12 24 0 0 0 -4 -6 4 4 0 0 4 -4 0  [...]
+1 1 0 -10 0 4 0 0 4 -4 0 -4 -2 4 0 -4 4 4 8 2 -3 16 0 -4 0 0 0 -8 8 -8 2 0 0 0 4 0 -2 -8 0 4 -4 0 4 4 8 -12 0 -16 0 0 -8 -4 -2 0 2 8 0 3 -4 6 0 -4 0 0 0 0 4 6 12 -12 0 0 -4 8 0 0 8 8 0 4 12 -8 -8 4 -4 8 0 4 0 0 -4 0 0 0 -6 -16 -8 16 4 4 8 -4 0 12 8 8 0 -8 0 -8 0 -8 0 0 0 -4 4 0 -4 -12 -8 12 0 -6 0 -12 0 -4 0 0 4 0 -8 0 8 0 0 4 0 0 0 0 0 -4 -8 -8 0 0 0 -4 0 16 8 -16 -8 0 8 0 -8 0 4 4 -4 8 0 0 -12 0 0 4 8 0 -8 0 4 -4 -4 4 -6 0 12 0 0 -12 12 0 -6 -8 -4 8 0 0 0 0 4 8 8 0 0 4 0 0 -4 -2 12 -4  [...]
+1 1 -4 -8 -2 8 0 0 -8 0 -2 8 0 0 0 -4 0 0 -8 0 3 -16 0 0 -16 -4 0 16 16 -8 6 -8 -4 0 0 -8 6 16 24 8 8 -16 0 0 0 0 -4 -16 0 0 -8 0 6 -8 6 16 0 3 8 0 0 0 0 -16 0 24 0 -4 0 0 0 0 0 16 -8 0 -8 0 -16 8 0 0 16 12 4 -8 -8 8 -4 -16 12 -8 -16 0 0 -16 16 -16 4 0 16 0 -16 0 16 0 -16 0 0 0 0 -8 -4 0 -4 0 0 -4 8 0 16 0 0 0 0 0 0 0 -4 0 0 0 16 16 16 -16 -16 12 0 -8 0 -16 16 0 16 0 0 0 -16 0 0 -16 16 -16 16 0 16 -16 16 -16 8 0 8 -8 -4 -4 0 -4 -8 0 16 -16 -8 -4 0 4 0 4 0 0 0 -4 0 0 0 0 0 0 12 0 -16 -8 0 [...]
+1 1 0 -10 -4 8 8 4 4 4 4 -12 -2 -4 -8 -4 4 -4 0 2 1 -16 8 4 0 4 -4 16 -8 0 2 -8 4 4 4 -8 2 0 8 0 0 0 4 4 -8 4 -4 16 8 8 0 4 -2 8 -2 -16 8 -1 0 2 -8 4 -12 0 -8 -8 12 -2 -4 4 4 -8 4 0 8 8 0 -8 0 0 4 -8 0 0 0 8 0 8 0 0 0 0 0 8 -2 0 0 0 0 -4 0 -4 0 -4 0 8 0 8 12 8 -4 -8 0 -8 8 -4 -4 0 -8 -4 0 -4 -8 -2 8 4 -8 -12 -8 8 -4 -8 0 0 0 0 0 0 8 0 8 0 0 -4 0 8 -4 -8 0 -12 -8 0 0 0 0 8 0 0 0 0 8 -4 -8 8 0 -8 -4 0 0 -4 0 0 -8 8 -4 0 -4 0 -2 -8 -4 0 12 4 -4 -8 -2 8 0 8 0 8 -8 -8 4 -16 -8 4 8 12 8 -8 4 - [...]
+1 1 -4 -6 0 4 -8 0 4 0 0 -4 -2 4 0 0 0 0 -4 2 1 0 0 -4 -8 -4 0 0 16 -4 2 0 -4 0 4 0 2 8 8 4 4 -8 -4 -4 0 4 4 0 0 0 4 4 -2 0 -2 0 16 -1 -4 -6 8 -4 0 8 -8 -8 0 6 0 -4 0 8 4 -8 0 0 4 0 8 -4 4 0 -8 0 0 -4 0 -4 0 0 0 0 0 8 6 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 4 0 0 -4 4 -4 0 4 -4 0 4 0 -2 -8 0 0 0 4 -8 -4 -16 0 0 0 0 0 0 8 0 -8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 -4 -4 4 -4 0 4 -4 0 0 -4 0 0 4 -4 4 0 4 0 6 -16 -4 0 0 0 4 0 -2 0 0 0 0 0 -8 8 -4 0 0 0 0 0 0 8 4 -2 4 4 -4 -4 4 4 4 -4 -4 -8 4 8  [...]
+1 1 0 -10 -4 8 -8 -4 4 4 4 -4 -2 12 -8 -4 4 -4 16 2 1 0 8 -12 0 4 4 0 8 0 2 -8 4 -4 4 8 2 0 -8 0 -16 0 -12 4 8 4 -4 0 8 -8 -16 4 -2 8 -2 0 -24 -1 0 -6 -24 4 12 0 8 8 12 6 -4 4 -4 8 4 0 -8 8 0 -8 0 16 4 8 0 0 0 -8 0 -8 0 0 0 0 16 -8 6 16 16 -16 0 -4 -16 -4 -16 -4 16 -8 -16 -8 -12 8 4 8 0 -8 -8 12 -4 0 8 -4 -16 -4 -8 -10 24 4 8 -12 8 -8 -4 24 16 0 -16 0 16 0 -8 0 24 0 0 12 16 8 4 8 -16 -12 -8 -16 -16 16 16 -8 -16 16 -16 16 -8 -4 8 -8 0 8 -4 0 0 -4 16 -16 8 -8 -4 0 -4 0 6 24 -4 0 -12 4 -4 - [...]
+1 1 -12 0 6 0 0 8 -8 -24 6 24 0 0 0 -12 -8 -24 0 0 3 0 0 0 0 12 8 0 0 0 6 24 12 24 0 -24 6 0 -24 0 0 0 0 0 0 0 12 0 0 48 0 0 6 24 6 0 0 3 0 0 0 0 24 0 0 -24 -24 12 -24 0 24 0 0 0 -24 0 0 -48 0 0 0 0 0 12 4 0 -24 0 12 -48 12 -24 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 24 -48 24 0 12 0 -12 0 0 12 0 0 0 0 0 0 0 -24 48 -24 -12 0 0 0 0 -16 0 48 0 12 0 -24 0 48 -16 0 0 -48 24 48 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 -12 0 12 -24 0 0 0 0 -12 0 4 0 4 0 0 0 12 24 -24 0 0 0 0 12 0 -48 24 0 0 0 0 -48 24 48  [...]
+1 1 -8 -2 4 0 -8 4 -4 -12 -4 12 -2 -4 8 4 4 12 8 2 1 0 -8 4 0 4 -4 0 8 -8 2 8 4 -12 4 -8 2 0 -8 -8 8 0 4 4 -8 4 -4 0 -8 8 -8 4 -2 -8 -2 0 -8 -1 8 2 8 4 4 0 8 8 -4 -2 -4 4 4 8 4 0 8 -8 8 -8 0 -8 4 -8 0 0 0 0 0 0 0 0 0 0 0 -8 -2 16 -16 -16 0 -4 16 -4 0 -4 0 8 0 8 -4 8 -4 0 0 8 0 -4 -4 0 0 -4 0 -4 8 -2 -8 4 -8 4 0 -8 -4 8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 8 -4 -8 0 4 8 -16 16 16 -16 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 8 -4 0 -4 4 -4 8 -2 8 0 8 0 -8 8 8 4 0 -8 4 8 -4 -8 8 4 -2  [...]
+1 1 -12 0 6 0 0 -8 8 24 6 -24 0 0 0 -12 8 24 0 0 3 0 0 0 0 12 -8 0 0 0 6 24 12 -24 0 -24 6 0 -24 0 0 0 0 0 0 0 12 0 0 -48 0 0 6 24 6 0 0 3 0 0 0 0 -24 0 0 -24 24 12 24 0 -24 0 0 0 -24 0 0 48 0 0 0 0 0 12 4 0 -24 0 12 -48 12 -24 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 -24 48 -24 0 12 0 -12 0 0 12 0 0 0 0 0 0 0 24 -48 24 -12 0 0 0 0 -16 0 48 0 12 0 -24 0 48 -16 0 0 48 -24 -48 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 -12 0 12 -24 0 0 0 0 -12 0 4 0 4 0 0 0 12 -24 24 0 0 0 0 12 0 -48 24 0 0 0 0 48 -24 -48 [...]
+1 1 -8 -2 4 0 -8 -4 4 12 -4 -12 -2 -4 8 4 -4 -12 -8 2 1 0 -8 4 0 4 4 0 8 8 2 8 4 12 4 -8 2 0 -8 8 -8 0 4 4 -8 4 -4 0 -8 -8 8 4 -2 -8 -2 0 -8 -1 -8 2 8 4 -4 0 8 8 4 -2 4 4 -4 8 4 0 8 -8 -8 8 0 8 4 -8 0 0 0 0 0 0 0 0 0 0 0 -8 -2 -16 16 16 0 -4 -16 -4 0 -4 0 8 0 8 4 -8 4 0 0 8 0 -4 -4 0 0 -4 0 -4 8 -2 -8 -4 8 -4 0 -8 -4 8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 -8 4 8 0 -4 8 16 -16 -16 16 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 8 -4 0 4 -4 -4 8 -2 8 0 8 0 -8 8 8 4 0 8 -4 -8 4 -8 8 4 -2  [...]
+1 -1 8 -10 4 -8 -8 4 -4 12 4 4 2 -4 -8 4 4 12 0 2 1 -16 -8 -4 0 4 4 -16 -8 0 2 8 4 12 -4 8 2 0 8 0 0 0 4 -4 -8 -4 4 -16 -8 8 0 -4 2 8 2 -16 -8 1 0 -2 -8 -4 4 0 -8 8 4 2 4 -4 4 8 4 0 8 8 0 8 0 0 -4 -8 0 0 0 8 0 -8 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 4 8 4 -8 0 8 0 4 4 0 8 -4 0 -4 -8 -2 -8 4 8 4 0 8 -4 -8 0 0 0 0 0 0 8 0 8 0 0 -4 0 -8 -4 -8 0 -4 -8 0 0 0 0 -8 0 0 0 0 8 4 -8 -8 0 0 4 0 0 -4 0 0 8 0 4 0 4 0 2 8 4 0 -4 -4 4 8 2 8 0 8 0 -8 8 8 -4 16 -8 -4 -8 -4 -8 -8 4 -2 4 -4 0 0 0 [...]
+1 -1 4 -6 0 -4 16 0 -4 0 0 -4 -6 -4 8 0 0 0 4 -6 1 0 8 -4 0 -4 0 0 16 4 2 0 -4 0 -4 0 2 0 -8 4 4 0 -4 -4 0 4 -4 0 -8 0 4 4 2 0 2 0 -8 1 4 -2 0 -4 0 0 0 -8 0 -6 0 -4 0 0 -4 0 0 8 4 0 0 4 4 0 0 0 0 -4 0 4 0 0 0 0 8 0 -2 0 0 0 0 -4 0 -4 -8 4 -8 0 -8 0 0 0 0 4 0 8 4 -4 -4 0 -4 4 8 -4 -8 -2 0 0 0 0 -4 0 4 -8 -8 0 8 0 8 0 0 0 0 0 0 4 8 0 0 0 8 0 -8 0 0 0 0 0 -8 -8 -8 -8 -4 -4 4 4 0 4 -4 0 0 4 8 8 -4 -4 4 0 4 0 2 8 -4 0 0 0 4 8 2 0 0 0 0 0 0 0 4 0 0 0 0 0 -8 0 -4 -2 -4 4 -4 -4 -4 -4 4 4 4 8 4 0 [...]
+1 -1 8 -8 2 -8 16 0 8 0 -2 8 0 -8 0 -16 0 0 8 0 3 -16 0 8 0 -4 0 -16 -16 8 2 8 4 0 8 0 2 0 0 8 8 0 -8 0 16 16 4 16 -16 0 -8 0 -2 -8 -2 16 -16 -3 -8 -8 0 0 0 0 0 0 0 -12 0 -16 0 16 -8 0 0 0 -8 0 0 -8 16 16 0 -4 -4 -8 0 -8 -4 -32 -4 0 0 0 8 16 16 16 -4 0 16 0 0 -16 0 -16 0 -16 0 0 0 -8 4 0 8 8 8 -4 -8 -16 0 16 16 8 0 0 0 0 8 -16 0 16 0 0 0 -16 0 4 0 0 0 16 0 -8 0 0 0 0 0 0 0 -16 -16 -16 -16 16 0 0 0 0 8 0 8 8 -4 -8 16 4 0 -8 0 0 8 -8 0 4 0 4 -8 -16 16 4 0 0 -16 -16 -8 16 4 16 32 8 0 0 8 -1 [...]
+1 -1 0 2 0 -8 0 4 4 0 0 -4 2 4 0 -4 0 0 4 2 -3 -8 0 4 -8 0 4 16 0 -4 -2 0 0 4 -4 0 2 0 0 8 -8 8 4 4 -8 -12 0 -8 0 -8 4 4 -2 0 2 16 0 -3 8 -6 0 -4 -4 -8 0 0 0 -6 0 12 -12 0 -4 0 0 0 -4 0 8 -8 12 8 0 4 4 -4 0 -8 0 0 -4 0 8 0 -6 -8 -16 8 -4 -4 16 4 8 -12 0 8 -8 -8 -4 0 -12 4 0 0 0 4 -4 0 8 12 0 12 0 -6 0 0 -8 0 0 0 4 0 0 0 0 0 -8 -4 0 0 0 0 0 -4 0 0 12 8 -8 0 0 -8 -16 8 16 0 0 8 0 -8 8 -4 -8 4 0 0 -12 0 0 4 0 8 -4 0 4 -4 -4 4 6 0 12 0 4 0 -12 0 6 8 4 -8 0 0 0 0 -4 -16 0 12 8 0 0 0 -4 2 -12  [...]
+1 -1 0 -2 0 -4 0 0 4 4 0 -4 2 4 0 -4 4 4 0 2 -3 0 0 4 0 0 0 8 -8 0 2 0 0 0 -4 0 -2 8 0 -4 4 0 4 -4 8 -4 0 0 0 0 0 4 2 0 -2 8 0 -3 -4 2 0 4 0 0 0 0 -4 2 -12 -4 0 0 -4 8 0 0 0 -8 0 4 4 -8 -8 4 -4 0 0 -4 0 0 -4 0 0 0 2 0 8 0 4 4 -8 -4 0 -4 -8 -8 0 8 0 -8 0 0 0 0 0 4 -4 0 4 4 8 -4 0 2 0 -12 0 -4 0 0 4 0 8 0 -8 0 0 -4 0 0 0 0 0 -4 -8 8 0 0 0 4 0 0 8 0 -8 0 8 0 -8 0 4 -4 -4 0 0 0 -4 0 0 4 8 0 0 0 -4 4 4 -4 -2 0 4 0 0 12 4 0 -2 -8 4 8 0 0 0 0 -4 -8 8 0 0 4 0 0 -4 -2 -4 4 4 -4 0 0 0 -4 4 0 0 0 - [...]
+1 -1 0 -6 0 0 0 -4 -4 0 0 12 2 4 0 -4 0 0 -4 2 -3 8 0 4 -8 0 -4 0 0 4 6 0 0 12 -4 0 -6 0 0 0 0 8 4 4 -8 4 0 8 0 -24 -4 4 6 0 -6 0 0 -3 0 2 0 -4 -12 -8 0 0 0 2 0 -4 12 0 -4 0 0 0 4 0 8 0 -4 8 0 -12 4 4 0 0 0 0 12 0 8 0 2 8 0 -8 -4 -4 0 4 8 4 0 8 -8 -8 -12 0 12 -4 0 0 0 4 -4 0 0 -4 0 -4 0 2 0 0 -24 0 0 0 4 0 0 0 0 0 -8 12 0 0 0 0 0 -4 0 0 -12 24 -8 0 0 8 0 -8 0 0 0 8 0 -8 0 -4 0 -4 0 0 4 0 0 4 0 8 4 0 4 -4 -4 4 -2 0 -4 0 12 0 4 0 -2 8 -12 -8 0 0 0 0 -4 0 0 -12 24 0 0 0 -4 -6 4 4 0 0 4 -4 0 [...]
+1 -1 4 -4 2 -8 -8 0 8 4 -2 16 8 0 -8 -12 -4 -4 4 -8 -1 -8 8 0 -8 0 0 0 8 4 2 0 0 -8 8 0 -2 16 0 0 0 8 8 0 0 -8 0 8 -8 0 -4 -8 -2 0 2 0 8 1 0 4 -8 0 -8 8 8 0 4 -4 -4 0 0 8 0 -16 0 8 -4 -8 -8 0 8 0 0 0 0 12 8 8 -4 0 0 -8 -8 -8 -4 -8 0 -8 0 0 0 0 8 8 -16 0 -8 0 8 8 0 12 -4 -8 -4 -8 0 4 8 -8 -16 0 8 4 8 4 0 -4 -4 -8 8 -8 0 0 0 0 8 0 8 8 -8 0 0 8 0 -8 0 0 -8 4 8 8 0 8 0 8 0 -8 16 8 -8 -8 -8 -12 4 4 8 -4 -8 0 16 8 -12 4 0 0 0 0 4 8 -8 4 -8 -4 0 -8 -4 0 0 0 0 0 -8 8 -8 0 8 0 0 -4 -8 -8 8 2 -8 0 [...]
+1 -1 0 2 -4 -4 0 0 4 0 -4 -4 2 4 8 -4 0 0 -4 2 1 0 8 4 0 4 0 0 0 -4 -2 8 -4 0 -4 0 -2 0 0 4 4 0 -4 -4 0 4 4 0 8 0 -4 -4 -2 8 -2 0 -8 1 4 6 0 -4 0 0 -16 0 0 -6 0 4 0 0 4 0 0 -8 -4 0 0 4 4 0 0 0 0 4 0 4 0 0 0 0 8 -16 6 0 0 0 0 -4 0 -4 -8 4 8 0 -8 0 0 0 0 -4 0 -8 0 -4 4 0 -4 4 -8 4 8 -2 0 0 0 0 0 0 -4 -8 8 0 -8 0 8 0 16 0 0 0 0 4 -8 0 0 0 8 0 8 0 0 0 0 0 8 -8 8 -8 -4 4 4 -4 0 0 -4 0 0 -4 -8 8 4 0 4 0 4 0 -6 8 -4 0 0 0 -4 -8 2 0 0 0 0 -8 16 0 4 0 0 0 0 0 8 0 4 2 -4 -4 -4 -4 4 4 -4 4 4 0 4 0  [...]
+1 -1 0 6 -4 -8 8 4 12 -4 -4 -12 2 4 8 -12 4 -4 0 2 1 0 8 4 0 4 4 0 8 -16 2 -8 4 -4 -12 8 2 0 -8 16 0 0 -4 -4 -8 -4 4 0 24 8 0 -4 2 -8 2 0 -8 1 16 -10 -8 -4 -12 0 24 -8 -12 10 4 -4 4 -8 12 0 8 -8 -16 8 0 0 -4 -8 0 0 0 8 0 8 0 0 0 0 -16 24 -10 16 16 -16 0 -4 -16 -4 16 -4 -16 -8 16 -8 -12 8 4 -8 0 -8 -8 -4 12 0 -8 -4 16 -4 24 6 -8 4 8 -12 8 -8 -4 -8 -16 0 16 0 -16 0 -24 0 8 0 0 4 16 -8 -4 -8 -16 12 8 16 16 -16 -16 8 -16 16 -16 16 -8 4 8 -8 0 -8 4 0 0 -12 16 -16 8 8 4 0 4 0 10 8 4 0 12 -4 4  [...]
+1 -1 -4 2 0 -4 8 0 4 0 0 -4 2 4 0 -8 0 0 4 2 1 0 0 4 8 -4 0 0 0 4 2 0 -4 0 -4 0 2 -8 8 -4 -4 8 -4 4 0 -4 -4 0 -16 0 4 -4 2 0 2 0 0 1 -4 -2 8 4 0 8 -8 8 0 2 0 4 0 -8 4 -8 0 0 4 0 8 -4 -4 0 -8 0 0 4 0 4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 -4 0 0 -4 -4 4 0 -4 -4 0 4 -16 6 8 0 0 0 4 -8 -4 0 0 0 0 0 0 0 8 0 -8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 -4 4 4 -4 0 -4 4 0 0 -4 0 0 4 4 -4 0 -4 0 2 0 4 0 0 0 -4 16 -6 0 0 0 0 0 8 -8 4 0 0 0 0 0 0 8 4 -2 4 -4 4 4 -4 -4 4 -4 -4 -8 4 -8 2 8  [...]
+1 -1 0 4 -2 -8 8 0 0 -4 2 8 0 0 0 -8 -4 4 4 0 -1 0 0 0 -8 0 0 8 -8 -4 -2 0 0 0 8 0 2 0 0 8 0 8 0 0 8 0 0 0 0 0 -4 0 2 0 -2 -8 0 1 -8 -4 -8 0 0 8 8 0 -4 4 -4 0 0 -8 8 0 0 0 4 8 -8 0 0 -8 0 0 0 -4 0 0 -4 0 0 0 0 -8 4 0 -8 0 0 0 -8 0 0 0 8 8 0 -8 0 -8 0 -4 4 0 0 0 -8 4 0 0 8 0 0 -4 8 4 0 4 0 8 0 0 -8 0 -8 0 0 0 8 0 -8 0 0 0 8 8 0 0 0 -4 0 0 8 0 8 -8 8 0 -8 0 0 0 0 4 -4 0 0 -4 0 8 -8 0 4 0 0 0 0 0 -4 0 0 4 0 -4 0 0 4 8 0 -8 0 0 -8 8 0 8 -8 0 0 4 0 8 0 -2 0 -8 8 0 4 -4 0 0 0 0 0 8 4 0 0 2 0 0 [...]
+1 -1 0 -2 -4 0 8 -4 -4 4 -4 4 2 -4 8 -4 -4 4 -8 2 1 0 8 -4 0 4 -4 0 8 8 2 -8 4 4 -4 8 2 0 -8 -8 8 0 4 -4 -8 -4 4 0 8 -8 -8 -4 2 -8 2 0 8 1 -8 -2 8 -4 12 0 8 -8 12 2 -4 -4 -4 -8 4 0 8 -8 8 -8 0 8 -4 -8 0 0 0 0 0 0 0 0 0 0 0 8 -2 -16 -16 16 0 -4 16 -4 0 -4 0 -8 0 -8 12 -8 -4 0 0 -8 -8 4 4 0 0 -4 0 -4 8 -2 8 -4 -8 12 8 -8 -4 8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 8 4 8 0 -12 8 -16 -16 16 16 8 0 0 0 0 0 4 0 0 0 -8 4 0 0 -4 0 0 0 8 4 0 4 0 2 -8 4 0 -12 4 4 -8 2 8 0 8 0 8 -8 -8 -4 0 8 4 8 -12 8 8 4 -2 [...]
+1 -1 0 0 -2 -4 8 -4 0 0 2 8 0 0 0 -8 0 0 0 0 -1 8 0 0 0 0 4 0 -16 8 2 0 0 -4 8 0 -2 8 0 -4 4 0 0 0 -8 0 0 -8 0 -8 0 0 -2 0 2 0 0 1 4 4 8 0 4 0 -8 0 0 -4 0 0 4 -8 8 -8 0 0 -8 0 0 -4 0 8 8 0 0 -8 0 4 4 0 0 0 8 8 -4 -8 0 -8 0 0 0 0 -8 0 0 -8 8 8 -4 0 -4 -8 4 0 0 0 -8 -4 4 0 0 0 0 4 -8 0 8 0 0 8 0 0 0 0 0 0 -8 0 -8 0 8 0 0 0 0 0 4 -8 8 0 0 8 0 8 0 -8 0 8 0 -8 -4 0 -4 8 -4 0 0 4 0 8 0 -8 8 0 0 0 0 0 4 0 0 -4 4 0 0 0 -4 -8 0 8 0 0 8 -8 0 0 0 -4 8 0 0 8 0 2 0 -8 -4 4 0 8 0 0 0 0 0 0 -4 8 0 -2 0 [...]
+1 -1 0 6 -4 -8 -8 4 4 4 -4 -12 2 4 8 4 -4 4 0 2 1 16 8 4 0 4 4 -16 -8 0 2 -8 4 -4 4 -8 2 0 8 0 0 0 -4 -4 8 -4 4 16 -8 8 0 -4 2 -8 2 -16 -8 1 0 -2 8 -4 -12 0 8 8 12 2 -4 -4 4 8 -4 0 -8 -8 0 -8 0 0 -4 8 0 0 0 -8 0 -8 0 0 0 0 0 8 -2 0 0 0 0 -4 0 -4 0 -4 0 8 0 8 -12 -8 4 8 0 -8 8 -4 -4 0 8 -4 0 -4 -8 -2 8 -4 8 12 -8 8 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 8 -4 -8 0 -12 8 0 0 0 0 -8 0 0 0 0 8 4 -8 8 0 8 4 0 0 4 0 0 -8 -8 4 0 4 0 2 8 4 0 12 4 4 8 2 -8 0 -8 0 8 -8 -8 4 16 8 -4 -8 -12 8 -8 4 -2 4 4  [...]
+1 -1 0 8 -6 -8 0 0 -8 0 6 8 0 0 0 0 0 0 -8 0 3 16 0 0 0 12 0 -16 0 -8 2 -8 4 0 0 0 2 0 0 8 8 0 0 0 0 0 -12 -16 0 0 8 0 -2 8 -2 16 0 -3 -8 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 8 0 0 -8 0 0 0 -4 -4 8 0 -8 -4 0 -4 0 0 0 0 -16 16 -16 -4 0 16 0 0 0 0 0 0 0 0 0 0 8 -12 0 0 0 0 -4 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 4 0 0 0 -16 0 0 0 0 0 0 0 0 0 16 -16 16 -16 0 0 0 0 0 8 0 8 -8 12 0 0 4 0 0 0 0 -8 0 0 4 0 4 0 0 0 4 0 0 0 0 0 0 4 0 0 -8 0 0 0 -16 0 0 0 0 0 0 0 2 0 0 8 8 -8 -8 12 0 0 0 4 0 0 0  [...]
+1 -1 -4 8 -2 -8 0 0 -8 0 2 8 0 0 0 4 0 0 8 0 3 16 0 0 16 -4 0 -16 -16 8 6 -8 -4 0 0 -8 6 -16 24 -8 -8 16 0 0 0 0 4 -16 0 0 -8 0 -6 8 -6 16 0 -3 8 0 0 0 0 -16 0 -24 0 4 0 0 0 0 0 16 8 0 -8 0 -16 8 0 0 16 12 4 8 -8 -8 -4 -16 12 -8 16 0 0 16 -16 16 4 0 -16 0 16 0 -16 0 16 0 0 0 0 8 -4 0 -4 0 0 -4 -8 0 -16 0 0 0 0 0 0 0 -4 0 0 0 -16 16 -16 -16 16 -12 0 8 0 16 -16 0 16 0 0 0 -16 0 0 -16 16 -16 16 0 16 -16 16 -16 8 0 8 -8 4 4 0 4 8 0 16 -16 -8 4 0 -4 0 -4 0 0 0 4 0 0 0 0 0 0 -12 0 16 -8 0 0 0  [...]
+1 -1 4 -2 0 -8 -8 4 -4 4 0 -12 -6 4 8 16 -4 4 8 -6 1 0 8 4 -16 -4 4 0 -8 8 -2 0 4 -4 12 -8 -2 16 0 0 0 0 4 -4 -8 -4 -4 0 8 -8 8 4 -2 0 -2 0 -8 1 0 -2 8 -4 4 -16 -8 0 -4 10 -4 4 4 -8 -4 16 -8 8 8 8 0 0 -4 -8 0 0 0 0 0 8 0 0 0 0 -16 -8 -2 0 0 0 0 -4 0 -4 0 -4 16 -8 16 -8 4 8 4 0 0 8 -4 4 -4 0 -8 -4 -16 4 8 6 8 -4 -8 -4 4 -8 4 -8 0 0 0 0 0 0 8 0 -8 0 0 -4 0 -8 -4 8 0 4 -8 0 0 0 0 8 0 0 16 16 -8 -4 8 0 0 -4 4 0 0 4 -16 -16 0 4 4 0 4 0 2 8 4 0 -4 4 -4 -8 -6 8 0 8 0 0 8 -8 -4 0 -8 -4 8 4 -8 8  [...]
+1 -1 4 -10 0 0 -8 -4 -4 -4 0 4 -6 12 8 8 4 -4 0 -6 1 0 8 12 16 -4 -4 0 -8 0 -2 0 4 4 4 -8 -2 -16 0 8 8 0 -4 -4 -8 -4 -4 0 -8 8 0 4 -2 0 -2 0 8 1 8 6 -8 -4 -4 16 8 0 4 2 4 4 -4 -8 4 -16 -8 8 0 -8 0 8 -4 -8 0 0 0 -8 0 0 0 0 0 0 0 8 6 0 0 0 0 -4 0 -4 16 -4 0 -8 0 -8 -4 -8 -4 8 0 8 -4 -4 4 0 0 -4 0 4 -8 -2 -8 4 8 4 4 -8 4 8 16 0 -16 0 -16 0 -8 0 8 0 0 4 -16 8 4 -8 -16 -4 -8 0 0 0 0 8 16 16 0 0 0 -4 0 8 0 -4 4 0 0 -4 0 0 -8 4 4 0 4 0 -6 -8 4 0 4 -4 -4 8 2 8 0 8 0 0 -8 8 4 0 8 4 -8 -4 -8 8 -4  [...]
+1 -1 8 -8 2 -8 -16 0 8 0 -2 8 0 8 0 0 0 0 8 0 3 -16 0 -8 0 -4 0 -16 16 8 2 8 4 0 -8 0 2 0 0 8 8 0 8 0 -16 -16 4 16 16 0 -8 0 -2 -8 -2 16 16 -3 -8 8 0 0 0 0 0 0 0 4 0 16 0 -16 8 0 0 0 -8 0 0 -8 -16 -16 0 -4 -4 -8 0 -8 -4 -32 -4 0 0 0 -8 16 16 16 -4 0 16 0 0 16 0 16 0 16 0 0 0 -8 4 0 8 -8 -8 -4 -8 16 0 -16 -16 -8 0 0 0 0 8 16 0 -16 0 0 0 -16 0 4 0 0 0 16 0 8 0 0 0 0 0 0 0 -16 -16 -16 -16 -16 0 0 0 0 8 0 8 8 -4 -8 -16 4 0 8 0 0 8 -8 0 4 0 4 8 16 -16 4 0 0 16 16 8 -16 4 -16 32 8 0 0 -8 -16 0 [...]
+1 -1 0 -6 4 -4 8 0 -4 0 4 -4 -6 4 0 4 0 0 -4 -6 1 0 0 4 8 4 0 0 16 -4 -2 -8 -4 0 4 0 -2 8 0 -4 -4 8 4 4 0 -4 4 0 0 0 -4 4 -2 -8 -2 0 0 1 -4 -2 -8 4 0 8 -8 0 0 -6 0 -4 0 8 4 8 0 -16 -4 0 8 -4 -4 0 8 0 0 -4 0 4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 4 0 -16 0 4 4 0 -4 -4 0 -4 0 -2 -8 0 0 0 0 8 4 0 0 0 0 0 0 0 8 0 8 0 0 -4 0 0 0 0 0 0 16 0 0 0 0 -8 0 0 0 0 -4 -4 4 4 0 0 4 0 0 -4 0 0 -4 0 -4 0 -4 0 2 0 4 0 0 0 4 0 2 0 0 0 0 8 8 8 -4 0 0 0 0 0 16 -8 -4 2 4 -4 4 4 4 4 -4 -4 -4 0 4 -8 [...]
+1 -1 4 -8 6 -8 0 0 8 0 -6 8 0 0 0 -4 0 0 -8 0 3 -16 0 0 16 12 0 -16 16 -8 -2 -8 -4 0 0 8 -2 16 8 -8 -8 16 0 0 0 0 -12 16 0 0 8 0 2 8 2 16 0 -3 8 0 0 0 0 -16 0 -8 0 4 0 0 0 0 0 -16 -8 0 8 0 -16 8 0 0 -16 -4 4 -8 -24 -8 -4 16 -4 -24 16 0 0 -16 -16 -16 4 0 -16 0 16 0 16 0 16 0 0 0 0 -8 12 0 4 0 0 -4 -8 0 16 0 0 0 0 0 0 0 4 0 0 0 16 -16 16 -16 16 4 0 24 0 16 16 0 -16 0 0 0 -16 0 0 16 16 16 16 0 -16 -16 -16 -16 8 0 8 8 -12 -4 0 4 24 0 -16 -16 8 -4 0 -4 0 -4 0 0 0 4 0 0 0 0 0 0 4 0 -16 -8 0 0  [...]
+1 -1 4 -4 2 -8 8 0 0 -4 -2 0 -8 0 8 4 4 4 4 8 -1 -8 -8 0 -8 0 0 0 -8 4 2 0 0 8 -8 0 -2 16 0 0 0 8 -8 0 0 8 0 8 8 0 -4 8 -2 0 2 0 -8 1 0 -4 8 0 8 8 -8 0 -4 4 4 0 0 -8 0 -16 0 -8 -4 8 -8 0 -8 0 0 0 0 12 8 8 -4 0 0 -8 -8 8 4 -8 0 -8 0 0 0 0 8 -8 -16 0 -8 0 -8 -8 0 12 -4 8 -4 8 0 4 8 8 -16 0 -8 -4 -8 -4 0 4 -4 8 -8 8 0 0 0 0 8 0 -8 8 8 0 0 -8 0 8 0 0 -8 -4 -8 8 0 8 0 -8 0 -8 16 8 -8 8 -8 -12 4 4 -8 -4 -8 0 16 8 -12 4 0 0 0 0 -4 -8 8 4 8 4 0 8 4 0 0 0 0 0 8 -8 8 0 -8 0 0 4 8 8 -8 2 8 0 0 0 4  [...]
+1 -1 4 -8 2 -4 8 -4 8 -8 -2 0 -8 8 8 -4 0 8 0 8 -1 0 -8 -8 16 0 4 -8 0 0 -2 0 0 4 0 0 2 -8 0 4 4 0 0 0 0 -8 0 0 -8 8 0 8 2 0 -2 8 8 1 -4 4 -8 0 -4 -16 8 0 8 -4 0 0 4 -8 -8 8 0 -8 0 0 0 -4 8 0 -8 0 0 8 -8 12 4 0 0 8 0 -8 -4 0 -8 0 0 0 -8 0 -16 8 8 0 0 0 4 0 -4 8 -4 8 -4 0 8 -4 12 -8 8 0 8 4 8 0 -8 -8 -4 8 -8 -8 -8 0 -8 0 -16 0 8 -8 -8 0 0 0 8 0 4 8 16 8 -8 0 8 0 8 -8 8 16 -8 0 -12 8 -12 -8 4 4 8 4 8 -8 -8 0 -8 4 0 0 0 0 4 8 -8 -4 -4 0 0 -8 -4 0 0 0 0 0 -8 8 0 -8 0 -4 -8 -8 8 8 -8 -2 -8 8  [...]
+1 -1 0 -2 0 -4 0 0 -4 12 0 -4 2 -4 0 4 -4 12 0 2 -3 0 0 -4 0 0 0 8 8 0 -6 0 0 0 4 0 6 -8 0 -4 4 0 -4 -4 -8 -4 0 0 0 0 0 4 -6 0 6 8 0 -3 -4 2 0 4 0 0 0 0 -12 2 12 -4 0 0 4 -8 0 0 0 -24 0 4 4 8 8 -12 -4 0 0 -4 0 0 12 0 0 0 2 0 8 0 4 4 -8 -4 0 -4 8 8 0 -8 0 -24 0 0 0 0 0 -4 4 0 4 4 -8 -4 0 2 0 12 0 -12 0 0 4 0 -8 0 8 0 0 12 0 0 0 0 0 4 8 24 0 0 0 12 0 0 8 0 -8 0 -8 0 8 0 4 -4 -4 0 0 0 -4 0 0 -4 -8 0 0 0 -4 4 4 -4 -2 0 4 0 0 -12 4 0 -2 8 -12 -8 0 0 0 0 4 -8 24 0 0 12 0 0 -4 6 -4 -4 4 -4 0 0  [...]
+1 -1 0 -6 0 0 0 4 -4 0 0 4 2 -4 0 4 0 0 -4 2 -3 8 0 -4 8 0 4 0 0 4 -2 0 0 4 4 0 2 0 0 0 0 -8 -4 4 8 4 0 8 0 -8 -4 4 -2 0 2 0 0 -3 0 2 0 -4 -4 8 0 0 0 2 0 -4 -12 0 4 0 0 0 4 0 -8 0 -4 -8 0 4 4 4 0 0 0 0 -4 0 -8 0 2 8 0 -8 -4 -4 0 4 -8 4 0 -8 8 8 -4 0 -12 -4 0 0 0 -4 4 0 0 -4 0 -4 0 2 0 0 -8 0 0 0 4 0 0 0 0 0 8 -4 0 0 0 0 0 4 0 0 12 8 8 0 0 8 0 -8 0 0 0 -8 0 8 0 -4 0 -4 0 0 4 0 0 -4 0 -8 4 0 4 -4 -4 4 -2 0 -4 0 4 0 4 0 -2 -8 4 8 0 0 0 0 4 0 0 12 8 0 0 0 -4 2 4 -4 0 0 4 -4 0 4 -4 0 0 8 -2 0 [...]
+1 -1 0 -10 0 4 0 0 -4 4 0 4 2 -4 0 4 4 4 8 2 -3 16 0 -4 0 0 0 -8 8 -8 2 0 0 0 4 0 -2 -8 0 4 -4 0 -4 -4 -8 12 0 16 0 0 8 4 2 0 -2 -8 0 -3 4 -6 0 4 0 0 0 0 -4 -6 -12 12 0 0 4 -8 0 0 -8 -8 0 -4 -12 8 8 4 -4 8 0 4 0 0 -4 0 0 0 -6 -16 -8 16 4 4 8 -4 0 12 8 8 0 -8 0 -8 0 -8 0 0 0 -4 4 0 -4 -12 -8 12 0 -6 0 -12 0 -4 0 0 4 0 -8 0 8 0 0 -4 0 0 0 0 0 4 8 8 0 0 0 4 0 -16 -8 16 8 0 -8 0 8 0 -4 -4 4 -8 0 0 12 0 0 -4 -8 0 8 0 -4 4 4 -4 6 0 -12 0 0 12 -12 0 6 8 4 -8 0 0 0 0 4 8 8 0 0 4 0 0 -4 -2 12 -4  [...]
+1 -1 4 -8 2 -4 -8 4 8 8 -2 8 8 -8 -8 -4 0 -8 0 -8 -1 0 8 8 16 0 -4 -8 16 0 -2 0 0 -4 0 0 2 -8 0 4 4 0 0 0 0 8 0 0 8 -8 0 -8 2 0 -2 8 -8 1 -4 -4 8 0 4 -16 -8 0 -8 4 0 0 -4 8 8 8 0 8 0 0 0 -4 -8 0 -8 0 0 8 -8 12 4 0 0 8 0 8 4 0 -8 0 0 0 -8 0 -16 -8 8 0 0 0 -4 0 4 8 -4 -8 -4 0 -8 -4 12 8 8 0 -8 -4 -8 0 8 8 -4 -8 8 8 -8 0 -8 0 -16 0 -8 -8 8 0 0 0 8 0 -4 -8 16 -8 8 0 8 0 8 8 8 16 -8 0 -12 -8 -12 -8 4 4 -8 4 8 8 -8 0 -8 4 0 0 0 0 -4 -8 8 -4 4 0 0 8 4 0 0 0 0 0 8 -8 0 -8 0 4 8 8 -8 -8 8 -2 8 -8 [...]
+1 -1 -4 -2 0 0 0 -4 -4 4 0 4 2 4 0 0 -4 4 0 2 1 0 0 4 -8 -4 -4 0 8 0 -2 0 4 4 4 8 -2 -8 0 0 0 8 -4 4 -8 4 -4 0 0 8 0 -4 -2 0 -2 0 0 1 0 -2 0 4 -4 -8 0 0 -4 2 -4 -4 -4 0 -4 -8 8 0 0 8 8 0 4 -8 8 0 0 0 0 0 0 0 0 0 -8 0 -2 0 0 0 0 4 0 4 -8 4 -8 -8 8 -8 -4 8 -4 0 0 0 4 -4 -4 0 0 4 8 -4 0 -2 0 -4 8 -4 -4 0 -4 0 8 0 -8 0 8 0 0 0 0 0 0 4 -8 -8 4 -8 8 4 0 0 0 0 0 0 8 -8 -8 8 0 4 0 0 0 4 -4 0 0 4 8 -8 0 -4 -4 0 -4 0 2 0 -4 0 4 4 4 0 2 8 0 8 0 0 0 0 4 0 -8 4 -8 4 0 0 4 2 -4 4 0 0 0 0 4 -4 -4 0 -4  [...]
+1 -1 0 4 -2 -8 -8 0 -8 4 2 8 0 0 0 8 4 -4 4 0 -1 0 0 0 -8 0 0 8 8 -4 -2 0 0 0 -8 0 2 0 0 8 0 8 0 0 -8 0 0 0 0 0 -4 0 2 0 -2 -8 0 1 -8 4 8 0 0 8 -8 0 4 -4 4 0 0 8 -8 0 0 0 4 -8 -8 0 0 8 0 0 0 -4 0 0 -4 0 0 0 0 8 -4 0 -8 0 0 0 -8 0 0 0 8 -8 0 8 0 8 0 -4 4 0 0 0 8 4 0 0 8 0 0 4 -8 -4 0 -4 0 -8 0 0 -8 0 -8 0 0 0 -8 0 8 0 0 0 8 -8 0 0 0 4 0 0 8 0 8 8 8 0 -8 0 0 0 0 4 -4 0 0 -4 0 -8 -8 0 4 0 0 0 0 0 4 0 0 4 0 4 0 0 -4 -8 0 8 0 0 8 -8 0 8 8 0 0 -4 0 -8 0 -2 0 8 8 0 4 -4 0 0 0 0 0 8 -4 0 0 2 0 0 [...]
+1 -1 -4 -2 0 0 0 4 4 -4 0 -4 2 4 0 0 4 -4 0 2 1 0 0 4 8 -4 4 0 -8 0 -2 0 4 -4 4 8 -2 8 0 0 0 -8 -4 4 -8 4 -4 0 0 -8 0 -4 -2 0 -2 0 0 1 0 -2 0 4 4 8 0 0 4 2 4 -4 4 0 -4 8 8 0 0 -8 -8 0 4 -8 -8 0 0 0 0 0 0 0 0 0 8 0 -2 0 0 0 0 4 0 4 8 4 8 -8 -8 -8 4 -8 4 0 0 0 4 -4 -4 0 0 4 -8 -4 0 -2 0 4 -8 4 -4 0 -4 0 -8 0 8 0 -8 0 0 0 0 0 0 4 8 8 -4 8 -8 -4 0 0 0 0 0 0 -8 8 8 -8 0 4 0 0 0 4 -4 0 0 4 -8 8 0 -4 -4 0 -4 0 2 0 -4 0 -4 -4 4 0 2 8 0 8 0 0 0 0 4 0 8 -4 8 -4 0 0 4 2 -4 4 0 0 0 0 4 -4 -4 0 -4 8  [...]
+1 -1 0 -6 -4 4 0 0 -4 0 -4 4 2 -4 8 4 0 0 4 2 1 0 8 -4 0 4 0 0 0 4 -2 8 -4 0 4 0 -2 0 0 -4 -4 0 4 -4 0 4 4 0 -8 0 4 -4 -2 8 -2 0 8 1 -4 -2 -16 -4 0 0 0 0 0 2 0 4 0 0 -4 0 0 -8 4 0 0 -4 4 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 -2 0 0 0 0 -4 0 -4 8 4 -8 0 8 0 0 0 0 4 0 -8 0 4 -4 0 4 4 8 4 -8 6 -16 0 0 0 0 0 -4 8 -8 0 8 0 -8 0 0 0 16 0 0 -4 8 0 0 0 -8 0 8 0 0 0 0 0 -8 8 -8 8 4 4 -4 4 0 0 -4 0 0 4 8 -8 -4 0 4 0 4 0 2 -8 -4 0 0 0 -4 8 -6 0 0 0 0 -8 0 16 -4 0 0 0 0 0 8 0 4 2 -4 4 4 4 -4 -4 -4 4 4 0 4 0  [...]
+1 -1 0 0 -2 -4 -8 4 0 0 2 0 0 0 0 8 0 0 0 0 -1 8 0 0 0 0 -4 0 0 8 2 0 0 4 -8 0 -2 8 0 -4 4 0 0 0 8 0 0 -8 0 8 0 0 -2 0 2 0 0 1 4 -4 -8 0 -4 0 8 0 0 4 0 0 -4 8 -8 -8 0 0 -8 0 0 -4 0 -8 8 0 0 -8 0 4 4 0 0 0 8 -8 4 -8 0 -8 0 0 0 0 -8 0 0 8 8 -8 4 0 4 -8 4 0 0 0 8 -4 4 0 0 0 0 -4 8 0 -8 0 0 -8 0 0 0 0 0 0 -8 0 8 0 -8 0 0 0 0 0 -4 8 8 0 0 8 0 8 0 8 0 8 0 -8 -4 0 -4 8 -4 0 0 4 0 -8 0 -8 8 0 0 0 0 0 -4 0 0 -4 -4 0 0 0 4 8 0 -8 0 0 -8 8 0 0 0 4 -8 0 0 -8 0 2 0 8 -4 4 0 8 0 0 0 0 0 0 4 8 0 -2 0 8 [...]
+1 -1 0 -10 -4 8 -8 -4 -4 -4 -4 12 2 4 8 4 4 -4 0 2 1 -16 8 4 0 4 -4 16 -8 0 2 -8 4 4 4 -8 2 0 8 0 0 0 -4 -4 8 -4 4 -16 -8 -8 0 -4 2 -8 2 16 -8 1 0 -2 8 -4 12 0 8 8 -12 2 4 -4 -4 8 -4 0 -8 -8 0 8 0 0 -4 8 0 0 0 8 0 8 0 0 0 0 0 8 -2 0 0 0 0 -4 0 -4 0 -4 0 8 0 8 12 8 -4 -8 0 -8 8 -4 -4 0 -8 -4 0 -4 -8 -2 8 4 -8 -12 -8 8 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 -8 4 8 0 12 8 0 0 0 0 -8 0 0 0 0 -8 4 8 -8 0 8 4 0 0 4 0 0 8 -8 4 0 4 0 2 8 4 0 -12 -4 4 8 2 -8 0 -8 0 8 -8 -8 4 -16 -8 4 8 12 8 -8 4 -2 4  [...]
+1 -1 0 -4 -2 0 -8 0 8 -4 2 0 0 8 0 0 -4 4 -4 0 -1 0 0 -8 8 0 0 8 8 4 -2 0 0 0 0 0 2 0 0 0 8 -8 -8 0 8 0 0 0 0 0 4 0 2 0 -2 -8 0 1 0 4 8 0 0 -8 -8 0 -4 -4 -4 0 0 8 0 0 0 0 -4 8 8 -8 0 -8 0 0 0 4 0 -8 -4 0 0 0 0 8 -4 0 -8 0 0 0 -8 0 0 0 -8 8 0 -8 0 -8 0 4 4 0 0 8 0 4 -8 0 -8 0 0 4 -8 4 0 4 0 -8 0 0 8 0 8 0 0 0 -8 0 8 0 0 -8 -8 8 0 0 0 -4 0 0 8 0 8 8 -8 0 8 0 8 0 8 -4 -4 0 0 -4 0 0 8 0 -4 0 0 0 0 0 4 0 0 4 0 -4 0 0 -4 8 0 -8 0 0 8 -8 8 8 -8 0 0 4 0 -8 0 -2 0 0 0 8 -4 4 0 0 0 0 0 -8 -4 0 0 2 [...]
+1 -1 0 -8 -2 4 -8 -4 8 0 2 0 0 8 0 0 0 0 8 0 -1 8 0 -8 0 0 4 0 16 0 2 0 0 -4 0 0 -2 -8 0 4 -4 0 -8 0 -8 0 0 -8 0 -8 -8 0 -2 0 2 0 0 1 -4 -4 -8 0 4 0 8 0 0 4 0 0 4 8 0 8 0 0 0 0 0 4 0 8 -8 0 0 0 0 -4 4 0 0 0 -8 -8 4 -8 0 -8 0 0 0 0 8 0 0 -8 -8 8 -4 0 -4 0 4 0 0 8 0 -4 -4 0 0 0 0 -4 8 0 8 0 0 -8 0 0 0 0 0 0 8 0 8 0 -8 0 0 -8 0 0 4 -8 -8 0 0 8 0 8 0 8 0 -8 0 8 4 0 4 0 -4 0 0 4 0 0 0 8 0 0 0 0 0 0 -4 0 0 -4 4 0 0 0 4 -8 0 8 0 0 -8 8 8 0 0 -4 8 0 0 -8 0 2 0 0 4 -4 8 0 0 0 0 0 0 0 4 -8 0 -2 0  [...]
+1 -1 -8 -2 4 0 8 -4 4 12 4 -12 2 4 -8 -4 4 12 8 2 1 0 -8 4 0 4 -4 0 8 -8 2 8 4 -12 4 -8 2 0 -8 -8 8 0 -4 -4 8 -4 4 0 8 -8 8 -4 2 8 2 0 8 1 -8 -2 -8 -4 -4 0 -8 -8 4 2 4 -4 -4 -8 -4 0 -8 8 -8 8 0 8 -4 8 0 0 0 0 0 0 0 0 0 0 0 -8 -2 16 -16 -16 0 -4 16 -4 0 -4 0 8 0 8 -4 8 -4 0 0 8 0 -4 -4 0 0 -4 0 -4 8 -2 -8 4 -8 4 0 -8 -4 8 0 0 0 0 0 0 8 0 8 0 0 4 0 -8 4 8 0 -4 -8 16 -16 -16 16 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 -8 4 0 4 -4 4 -8 2 -8 0 -8 0 -8 8 8 4 0 -8 4 8 -4 -8 8 4 -2 4 4 8  [...]
+1 -1 -4 0 2 -4 0 -4 0 8 -2 0 0 0 0 4 0 -8 0 0 -1 0 0 0 8 0 4 8 0 0 -2 0 0 4 0 0 2 0 0 -4 -4 8 0 -8 0 0 0 0 0 8 0 0 2 0 -2 -8 0 1 4 4 0 8 -4 -8 0 0 -8 4 0 -8 4 0 0 0 0 0 0 0 -8 4 0 0 0 0 0 0 8 -4 4 0 0 -8 -8 0 -4 0 8 0 0 -8 8 8 -8 0 0 0 -8 0 4 0 -4 0 -4 0 4 0 0 -4 -4 0 0 8 0 -4 0 0 -8 8 4 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 0 0 0 4 8 8 -8 0 0 -8 0 -8 0 0 8 0 8 4 0 4 0 4 -4 0 4 -8 0 0 8 0 -4 8 0 -8 0 4 0 0 -4 -4 0 -8 0 4 0 0 0 0 0 0 0 0 8 0 -4 -8 8 0 0 0 -2 0 0 -4 -4 0 0 0 -8 8 0 0 8 -4 0 0 2 0 0 [...]
+1 -1 -8 -2 4 0 8 4 -4 -12 4 12 2 4 -8 -4 -4 -12 -8 2 1 0 -8 4 0 4 4 0 8 8 2 8 4 12 4 -8 2 0 -8 8 -8 0 -4 -4 8 -4 4 0 8 8 -8 -4 2 8 2 0 8 1 8 -2 -8 -4 4 0 -8 -8 -4 2 -4 -4 4 -8 -4 0 -8 8 8 -8 0 -8 -4 8 0 0 0 0 0 0 0 0 0 0 0 -8 -2 -16 16 16 0 -4 -16 -4 0 -4 0 8 0 8 4 -8 4 0 0 8 0 -4 -4 0 0 -4 0 -4 8 -2 -8 -4 8 -4 0 -8 -4 8 0 0 0 0 0 0 8 0 8 0 0 4 0 8 -4 -8 0 4 -8 -16 16 16 -16 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 -8 4 0 -4 4 4 -8 2 -8 0 -8 0 -8 8 8 4 0 8 -4 -8 4 -8 8 4 -2 4 4 -8 [...]
+1 -1 -4 -6 0 4 8 0 -4 0 0 4 2 -4 0 0 0 0 -4 2 1 0 0 -4 -8 -4 0 0 16 -4 2 0 -4 0 4 0 2 8 8 4 4 -8 4 4 0 -4 -4 0 0 0 -4 -4 2 0 2 0 -16 1 4 6 -8 4 0 -8 8 8 0 -6 0 4 0 -8 -4 8 0 0 -4 0 -8 4 -4 0 8 0 0 -4 0 -4 0 0 0 0 0 8 6 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 4 0 0 -4 4 -4 0 4 -4 0 4 0 -2 -8 0 0 0 4 -8 -4 -16 0 0 0 0 0 0 -8 0 8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 4 4 -4 4 0 -4 4 0 0 4 0 0 -4 4 -4 0 -4 0 -6 16 4 0 0 0 -4 0 2 0 0 0 0 0 -8 8 -4 0 0 0 0 0 0 8 4 -2 4 4 -4 -4 4 4 4 -4 -4 -8 4 8 -6  [...]
+1 -1 -4 -4 2 0 0 0 0 -4 -2 8 0 0 0 4 4 4 -4 0 -1 8 0 0 0 0 0 0 8 -4 2 0 0 -8 0 0 -2 8 0 0 0 0 0 8 0 0 0 -8 0 0 4 0 -2 0 2 0 0 1 0 4 0 -8 -8 0 0 0 -4 4 4 -8 0 0 0 -8 0 0 4 8 0 0 0 0 -8 0 0 -4 -8 0 -4 0 0 8 0 0 -4 8 0 8 0 8 0 -8 0 0 -8 0 0 0 8 -8 0 -4 -4 0 4 0 0 4 0 0 -8 8 0 -4 0 -4 0 4 4 0 0 0 -8 0 -8 0 0 0 0 -8 0 0 0 0 8 8 0 0 0 -4 0 -8 0 -8 0 0 8 0 8 0 0 0 0 4 4 -4 0 -4 8 0 8 0 4 -4 -8 0 8 0 4 0 0 4 -8 4 -8 0 4 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 0 0 2 0 0 0 0 -4 -4 0 8 -8 0 0 0 -4 8 0 -2 0 8  [...]
+1 -1 -4 0 2 -4 0 4 0 -8 -2 8 0 0 0 4 0 8 0 0 -1 0 0 0 8 0 -4 8 0 0 -2 0 0 -4 0 0 2 0 0 -4 -4 8 0 8 0 0 0 0 0 -8 0 0 2 0 -2 -8 0 1 4 -4 0 -8 4 -8 0 0 8 -4 0 8 -4 0 0 0 0 0 0 0 -8 4 0 0 0 0 0 0 8 -4 4 0 0 -8 -8 0 4 0 8 0 0 8 8 -8 -8 0 0 0 -8 0 -4 0 4 0 -4 0 4 0 0 -4 -4 0 0 -8 0 4 0 0 8 -8 4 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 0 0 0 -4 -8 8 8 0 0 -8 0 -8 0 0 8 0 8 4 0 4 0 4 -4 0 4 -8 0 0 8 0 -4 -8 0 8 0 -4 0 0 -4 4 0 8 0 -4 0 0 0 0 0 0 0 0 8 0 4 8 -8 0 0 0 -2 0 0 -4 -4 0 0 0 8 -8 0 0 8 4 0 0 2 0 0 [...]
+1 -1 -4 -4 2 0 0 0 8 4 -2 -8 0 0 0 4 -4 -4 -4 0 -1 8 0 0 0 0 0 0 8 -4 2 0 0 8 0 0 -2 8 0 0 0 0 0 -8 0 0 0 -8 0 0 4 0 -2 0 2 0 0 1 0 -4 0 8 8 0 0 0 4 -4 -4 8 0 0 0 -8 0 0 4 -8 0 0 0 0 -8 0 0 -4 -8 0 -4 0 0 8 0 0 4 8 0 8 0 -8 0 8 0 0 -8 0 0 0 -8 8 0 -4 -4 0 4 0 0 4 0 0 -8 -8 0 4 0 4 0 -4 4 0 0 0 -8 0 -8 0 0 0 0 -8 0 0 0 0 8 -8 0 0 0 4 0 -8 0 -8 0 0 8 0 8 0 0 0 0 4 4 -4 0 -4 8 0 8 0 4 -4 8 0 -8 0 -4 0 0 4 8 -4 8 0 -4 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 0 0 2 0 0 0 0 -4 -4 0 -8 8 0 0 0 4 8 0 -2 0 8 [...]
+1 -1 0 -4 -2 0 8 0 0 4 2 0 0 -8 0 0 4 -4 -4 0 -1 0 0 8 8 0 0 8 -8 4 -2 0 0 0 0 0 2 0 0 0 8 -8 8 0 -8 0 0 0 0 0 4 0 2 0 -2 -8 0 1 0 -4 -8 0 0 -8 8 0 4 4 4 0 0 -8 0 0 0 0 -4 -8 8 -8 0 8 0 0 0 4 0 -8 -4 0 0 0 0 -8 4 0 -8 0 0 0 -8 0 0 0 -8 -8 0 8 0 8 0 4 4 0 0 -8 0 4 -8 0 -8 0 0 -4 8 -4 0 -4 0 8 0 0 8 0 8 0 0 0 8 0 -8 0 0 8 -8 -8 0 0 0 4 0 0 8 0 8 -8 -8 0 8 0 8 0 8 -4 -4 0 0 -4 0 0 8 0 -4 0 0 0 0 0 -4 0 0 4 0 4 0 0 4 -8 0 8 0 0 -8 8 -8 8 8 0 0 -4 0 8 0 -2 0 0 0 8 -4 4 0 0 0 0 0 -8 4 0 0 2 0  [...]
+1 -1 0 -10 -4 8 8 4 -4 -4 -4 4 2 -12 8 4 4 -4 16 2 1 0 8 -12 0 4 4 0 8 0 2 -8 4 -4 4 8 2 0 -8 0 -16 0 12 -4 -8 -4 4 0 -8 8 16 -4 2 -8 2 0 24 1 0 6 24 -4 -12 0 -8 -8 -12 -6 4 -4 4 -8 -4 0 8 -8 0 8 0 -16 -4 -8 0 0 0 -8 0 -8 0 0 0 0 16 -8 6 16 16 -16 0 -4 -16 -4 -16 -4 16 -8 -16 -8 -12 8 4 8 0 -8 -8 12 -4 0 8 -4 -16 -4 -8 -10 24 4 8 -12 8 -8 -4 24 16 0 -16 0 16 0 8 0 -24 0 0 -12 -16 -8 -4 -8 16 12 8 16 16 -16 -16 8 16 -16 16 -16 8 4 -8 8 0 -8 4 0 0 4 -16 16 -8 8 4 0 4 0 -6 -24 4 0 12 -4 4 8 [...]
+1 -1 0 -8 -2 4 8 4 8 0 2 -8 0 -8 0 0 0 0 8 0 -1 8 0 8 0 0 -4 0 0 0 2 0 0 4 0 0 -2 -8 0 4 -4 0 8 0 8 0 0 -8 0 8 -8 0 -2 0 2 0 0 1 -4 4 8 0 -4 0 -8 0 0 -4 0 0 -4 -8 0 8 0 0 0 0 0 4 0 -8 -8 0 0 0 0 -4 4 0 0 0 -8 8 -4 -8 0 -8 0 0 0 0 8 0 0 8 -8 -8 4 0 4 0 4 0 0 -8 0 -4 -4 0 0 0 0 4 -8 0 -8 0 0 8 0 0 0 0 0 0 8 0 -8 0 8 0 0 8 0 0 -4 8 -8 0 0 8 0 8 0 -8 0 -8 0 8 4 0 4 0 -4 0 0 4 0 0 0 8 0 0 0 0 0 0 4 0 0 -4 -4 0 0 0 -4 8 0 -8 0 0 8 -8 -8 0 0 4 -8 0 0 8 0 2 0 0 4 -4 8 0 0 0 0 0 0 0 -4 -8 0 -2 0  [...]
+1 -1 0 0 -6 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 3 0 0 0 0 12 0 0 0 0 -6 24 -12 0 0 0 -6 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 0 6 -24 6 0 0 -3 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 -4 0 0 0 12 0 12 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -48 0 -12 0 0 0 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 0 0 -12 0 0 0 0 0 0 0 4 0 4 0 0 0 -12 0 0 0 0 0 0 -12 0 0 24 0 0 0 0 0 0 0 0 0 0 0 -6 0 0 0 0 0 0 12 0 0 0 -12 0 0 0 0 -6 0 0 0 0 3 0  [...]
+1 -1 -4 0 -2 0 0 0 0 0 2 0 0 0 0 4 0 0 0 0 3 0 0 0 0 -4 0 0 0 0 -2 8 -4 0 0 8 -2 0 8 0 0 0 0 0 0 0 4 0 0 0 0 0 2 -8 2 0 0 -3 0 0 0 0 0 0 0 -8 0 4 0 0 0 0 0 0 -8 0 0 0 0 0 0 0 0 -4 4 0 8 0 -4 -16 -4 8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 0 -4 0 0 -4 0 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 -16 0 16 0 4 0 -8 0 -16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 4 -8 0 0 0 0 4 0 -4 0 -4 0 0 0 4 0 0 0 0 0 0 4 0 16 8 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 -4 0 0 8 -4 0 0 0 0 -2 0 0 0 0 3 0 0 0 0 [...]
+1 -1 0 -8 -6 8 0 0 8 0 6 -8 0 0 0 0 0 0 8 0 3 -16 0 0 0 12 0 16 0 8 2 -8 4 0 0 0 2 0 0 -8 -8 0 0 0 0 0 -12 16 0 0 -8 0 -2 8 -2 -16 0 -3 8 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 -4 -4 -8 0 8 -4 0 -4 0 0 0 0 16 -16 16 -4 0 -16 0 0 0 0 0 0 0 0 0 0 -8 -12 0 0 0 0 -4 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 4 0 0 0 -16 0 0 0 0 0 0 0 0 0 -16 16 -16 16 0 0 0 0 0 -8 0 -8 8 12 0 0 4 0 0 0 0 8 0 0 4 0 4 0 0 0 4 0 0 0 0 0 0 4 0 0 -8 0 0 0 16 0 0 0 0 0 0 0 2 0 0 -8 -8 8 8 12 0 0 0 4 0 0 0 0 [...]
+1 -1 -4 0 -2 0 0 -8 -8 8 2 8 0 0 0 4 8 -8 0 0 3 0 0 0 0 -4 8 0 0 0 -2 -8 12 -8 0 24 -2 0 -8 0 0 0 0 0 0 0 4 0 0 16 0 0 2 8 2 0 0 -3 0 0 0 0 8 0 0 8 8 -12 -24 0 -24 0 0 0 -24 0 0 16 0 0 0 0 0 -4 4 0 -8 0 12 -16 -4 -8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 -8 -16 24 0 -4 0 -4 0 0 12 0 0 0 0 0 0 0 24 -16 -8 -4 0 0 0 0 16 0 -16 0 4 0 8 0 16 -16 0 0 16 -24 16 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 -12 8 0 0 0 0 4 0 -4 0 -4 0 0 0 -12 8 -24 0 0 0 0 4 0 16 -8 0 0 0 0 -16 24 -16 -8 0 0 0 -2 0 0 0 0 0 0 - [...]
+1 -1 -8 0 2 0 0 0 0 0 -2 0 0 0 0 8 0 0 0 0 3 0 0 0 0 -4 0 0 0 0 2 8 4 0 0 0 2 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 -2 -8 -2 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 0 0 -4 32 -4 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 0 0 -4 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 0 0 -16 0 4 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 8 0 4 0 0 0 0 0 8 0 4 0 4 0 0 0 4 0 0 0 0 0 0 4 0 -32 8 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 -4 0 0 0 4 0 0 0 0 2 0 0 0 0 3 0 0 0 0 0 0 0 0 0 [...]
+1 -1 -4 0 -2 0 0 8 8 -8 2 -8 0 0 0 4 -8 8 0 0 3 0 0 0 0 -4 -8 0 0 0 -2 -8 12 8 0 24 -2 0 -8 0 0 0 0 0 0 0 4 0 0 -16 0 0 2 8 2 0 0 -3 0 0 0 0 -8 0 0 8 -8 -12 24 0 24 0 0 0 -24 0 0 -16 0 0 0 0 0 -4 4 0 -8 0 12 -16 -4 -8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 8 16 -24 0 -4 0 -4 0 0 12 0 0 0 0 0 0 0 -24 16 8 -4 0 0 0 0 16 0 -16 0 4 0 8 0 16 -16 0 0 -16 24 -16 0 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 -12 8 0 0 0 0 4 0 -4 0 -4 0 0 0 -12 -8 24 0 0 0 0 4 0 16 -8 0 0 0 0 16 -24 16 8 0 0 0 -2 0 0 0 0 0 0 - [...]
+1 -1 -4 -8 -2 8 0 0 8 0 2 -8 0 0 0 4 0 0 -8 0 3 -16 0 0 -16 -4 0 16 16 -8 6 -8 -4 0 0 -8 6 16 24 8 8 -16 0 0 0 0 4 16 0 0 8 0 -6 8 -6 -16 0 -3 -8 0 0 0 0 16 0 -24 0 4 0 0 0 0 0 -16 8 0 8 0 16 -8 0 0 -16 12 4 -8 -8 8 -4 -16 12 -8 -16 0 0 -16 16 -16 4 0 16 0 -16 0 16 0 -16 0 0 0 0 -8 -4 0 -4 0 0 -4 8 0 16 0 0 0 0 0 0 0 -4 0 0 0 16 16 16 -16 -16 -12 0 8 0 16 -16 0 -16 0 0 0 16 0 0 16 -16 16 -16 0 -16 16 -16 16 -8 0 -8 8 4 4 0 4 8 0 -16 16 8 4 0 -4 0 -4 0 0 0 4 0 0 0 0 0 0 -12 0 16 -8 0 0 0  [...]
+1 -1 -12 0 6 0 0 8 -8 -24 -6 24 0 0 0 12 8 24 0 0 3 0 0 0 0 12 -8 0 0 0 6 24 12 -24 0 -24 6 0 -24 0 0 0 0 0 0 0 -12 0 0 48 0 0 -6 -24 -6 0 0 -3 0 0 0 0 24 0 0 24 -24 -12 -24 0 24 0 0 0 24 0 0 -48 0 0 0 0 0 12 4 0 -24 0 12 -48 12 -24 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 -24 48 -24 0 12 0 -12 0 0 12 0 0 0 0 0 0 0 24 -48 24 -12 0 0 0 0 -16 0 48 0 -12 0 24 0 -48 16 0 0 -48 24 48 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 12 0 -12 24 0 0 0 0 12 0 -4 0 -4 0 0 0 -12 24 -24 0 0 0 0 -12 0 48 24 0 0 0 0 48  [...]
+1 -1 -12 0 6 0 0 -8 8 24 -6 -24 0 0 0 12 -8 -24 0 0 3 0 0 0 0 12 8 0 0 0 6 24 12 24 0 -24 6 0 -24 0 0 0 0 0 0 0 -12 0 0 -48 0 0 -6 -24 -6 0 0 -3 0 0 0 0 -24 0 0 24 24 -12 24 0 -24 0 0 0 24 0 0 48 0 0 0 0 0 12 4 0 -24 0 12 -48 12 -24 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 24 -48 24 0 12 0 -12 0 0 12 0 0 0 0 0 0 0 -24 48 -24 -12 0 0 0 0 -16 0 48 0 -12 0 24 0 -48 16 0 0 48 -24 -48 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 12 0 -12 24 0 0 0 0 12 0 -4 0 -4 0 0 0 -12 -24 24 0 0 0 0 -12 0 48 24 0 0 0 0 -48 [...]
+1 -3 12 -12 6 -8 -16 8 0 24 6 16 -4 -8 -16 4 8 24 -8 -4 3 -16 -16 -8 -16 12 8 -16 -32 -8 6 24 12 24 -8 24 6 -16 24 -8 -8 -16 -8 -8 -16 -8 12 -16 -16 48 -8 -8 6 24 6 -16 -16 3 -8 -4 -16 -8 24 -16 -16 24 24 8 24 -8 24 -16 -8 -16 24 -16 -8 48 -16 -8 -8 -16 -16 12 4 -8 24 -8 12 48 12 24 -16 -16 -4 -16 -16 -16 4 -8 -16 -8 -16 -8 -16 -16 -16 -16 24 48 24 -8 12 -16 12 -8 -8 12 -8 -8 -16 -8 -16 -4 -16 24 48 24 12 -16 -8 -16 -16 16 -16 48 -16 12 -16 24 -16 48 16 -8 -16 48 24 48 -16 24 -16 -16 -16 [...]
+1 -3 4 -4 2 -4 0 4 0 8 2 0 -4 0 0 4 0 8 0 -4 -1 0 0 0 -8 0 4 8 0 0 -2 0 0 4 0 0 2 0 0 -4 -4 -8 0 0 0 -8 0 0 0 -8 0 8 -2 0 2 8 0 -1 -4 0 0 0 4 -8 0 0 -8 0 0 0 -4 0 0 0 0 0 0 0 -8 -4 8 0 0 0 0 0 -8 -4 4 0 0 8 8 0 0 0 8 0 0 0 8 0 8 -8 0 0 8 0 4 0 -4 0 -4 0 -4 0 0 -4 -4 8 0 0 0 0 0 0 -8 -8 -4 0 8 0 0 0 0 0 8 0 0 8 0 0 0 0 0 0 -4 -8 8 -8 0 0 8 0 8 0 0 8 0 8 -4 8 -4 0 -4 -4 8 -4 -8 0 0 8 0 -4 0 0 0 0 0 0 -8 4 4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 -4 -8 -8 0 0 8 -2 8 0 -4 -4 0 0 0 0 0 0 0 -8 0 0 0 2 -8 [...]
+1 -3 4 -8 2 0 0 0 0 4 2 8 -4 0 0 4 4 4 -4 -4 -1 8 0 0 0 0 0 0 -8 -4 2 0 0 8 0 0 -2 -8 0 0 0 0 0 0 0 8 0 8 0 0 -4 8 2 0 -2 0 0 -1 0 0 0 0 -8 0 0 0 4 0 -4 0 0 0 0 -8 0 0 -4 -8 0 0 -8 0 -8 0 0 -4 8 0 -4 0 0 -8 0 0 0 8 0 8 0 0 0 0 0 8 8 0 0 0 -8 -8 0 -4 -4 0 -4 0 0 4 0 -8 8 0 0 0 0 -4 0 4 -4 0 8 0 8 0 8 0 0 0 0 -8 0 0 0 0 8 -8 0 0 0 4 0 8 0 8 0 0 8 0 8 0 0 8 0 -4 -4 -4 -8 4 8 0 8 0 -4 -4 0 0 0 0 0 0 8 -4 -8 -4 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 0 8 2 -8 0 0 0 -4 -4 0 0 0 0 0 0 0 -8 0 -2 8 8  [...]
+1 -3 8 -6 4 -8 -8 4 12 12 -4 20 2 -4 -8 -12 -4 -12 0 -2 1 -16 8 4 0 4 -4 -16 8 0 2 8 4 -12 4 8 2 0 8 0 0 0 4 -4 -8 -4 -4 16 -8 8 0 -4 -2 -8 -2 16 -8 -1 0 -2 -8 -4 4 0 -8 -8 4 -6 4 -4 4 8 4 0 -8 8 0 8 0 0 -4 -8 0 0 0 8 0 -8 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 -4 -8 -4 -8 0 -8 0 -4 -4 0 8 4 0 4 8 2 8 -4 -8 -4 0 -8 4 8 0 0 0 0 0 0 8 0 8 0 0 -4 0 -8 -4 -8 0 -4 -8 0 0 0 0 -8 0 0 0 0 -8 4 8 8 0 0 4 0 0 -4 0 0 -8 0 4 0 4 0 2 8 4 0 -4 -4 4 8 2 8 0 8 0 -8 -8 -8 4 16 8 4 8 4 8 8 -4 -2 -4 4 0 0 [...]
+1 -3 4 -4 -2 0 0 0 0 0 -2 0 -4 0 16 4 0 0 0 -4 3 0 16 0 0 -4 0 0 0 0 -2 8 -4 0 0 -8 -2 0 -8 0 0 0 0 -8 0 8 -4 0 0 0 0 -8 -2 8 -2 0 0 3 0 4 -16 -8 0 0 -16 -8 0 0 0 8 0 0 0 0 -8 16 0 0 0 0 8 0 0 -4 4 0 -8 0 -4 16 -4 -8 0 -16 4 0 0 0 4 -8 0 -8 0 8 0 0 0 0 0 0 0 0 -4 16 4 0 0 -4 0 8 0 8 0 4 -16 0 0 0 4 0 -8 0 0 16 0 16 0 -4 -16 -8 -16 16 16 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 -8 0 0 -4 4 8 -4 -8 0 0 0 0 4 -8 4 -8 4 4 0 8 -4 0 0 8 0 4 0 -4 0 16 8 -16 -16 0 0 0 0 0 0 16 0 -8 -2 8 0 0 0 0 0 -4 [...]
+1 -3 4 -4 -2 0 16 0 0 0 -2 0 -4 -8 16 -4 0 0 0 -4 3 0 16 -8 0 -4 0 0 16 0 6 -8 -4 0 -8 8 6 0 -24 0 0 0 -8 -8 -16 -8 -4 0 16 0 0 -8 6 -8 6 0 16 3 0 -4 16 -8 0 0 16 -24 0 -8 0 -8 0 16 -8 0 8 16 0 0 0 0 -8 -16 0 12 4 0 8 0 -4 16 12 8 0 16 -4 0 0 0 4 -8 0 -8 0 -8 0 -16 0 -16 0 0 0 0 -4 16 4 -8 -8 -4 0 -8 0 -8 16 -4 16 0 0 0 4 16 -8 16 0 -16 0 -16 0 12 16 8 16 -16 -16 -8 0 0 0 0 0 0 16 0 0 0 0 16 0 0 0 0 0 -8 0 0 -4 4 -8 -4 8 -8 0 0 0 4 -8 4 -8 4 -4 16 -8 -4 0 0 -8 16 -4 -16 12 -16 16 -8 16 1 [...]
+1 -3 0 -4 2 0 16 0 0 0 2 0 -4 0 0 0 0 0 0 -4 3 0 0 0 0 -4 0 0 16 0 2 -8 -12 0 0 0 2 0 0 0 0 0 0 8 0 -8 -4 0 -16 0 0 -8 2 -8 2 0 -16 3 0 4 0 8 0 0 0 0 0 -8 0 8 0 16 0 0 0 0 0 0 0 0 -8 0 0 -4 -4 0 0 0 12 0 -4 0 0 0 4 0 0 0 -4 8 0 8 0 -8 0 0 0 0 0 0 0 0 4 0 0 0 0 12 0 -8 0 8 -16 4 0 0 0 0 0 16 -8 -16 0 0 0 16 0 -4 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 -8 0 0 4 0 -8 12 0 0 0 0 0 0 8 -4 8 -4 4 -16 -8 12 0 0 8 -16 4 0 -4 0 0 -8 0 0 0 0 0 0 0 0 0 16 -8 2 -8 0 0 0 0 0 -4 8 8 0 -12 0 4  [...]
+1 -3 4 -2 0 -4 16 0 4 0 0 4 -6 -4 8 -8 0 0 4 6 1 0 -8 4 0 -4 0 0 -16 4 2 0 -4 0 4 0 2 0 -8 4 4 0 -4 -4 0 4 4 0 -8 0 -4 4 -2 0 -2 0 -8 -1 -4 -2 0 -4 0 0 0 8 0 2 0 -4 0 0 -4 0 0 8 -4 0 0 -4 4 0 0 0 0 -4 0 4 0 0 0 0 8 0 2 0 0 0 0 4 0 4 -8 -4 -8 0 -8 0 0 0 0 4 0 -8 4 4 4 0 -4 -4 8 4 8 2 0 0 0 0 -4 0 -4 8 -8 0 8 0 8 0 0 0 0 0 0 4 -8 0 0 0 -8 0 -8 0 0 0 0 0 8 8 8 8 4 -4 -4 -4 0 -4 -4 0 0 4 -8 -8 4 4 4 0 4 0 2 8 -4 0 0 0 4 8 2 0 0 0 0 0 0 0 -4 0 0 0 0 0 8 0 4 -2 4 -4 -4 -4 -4 -4 4 -4 -4 8 4 0 - [...]
+1 -3 0 4 -2 -4 0 4 8 0 -2 -8 4 8 8 -8 0 0 0 4 -1 -8 8 8 8 0 4 0 0 -8 2 0 0 -4 -8 0 -2 0 0 4 -4 -8 0 0 -8 0 0 -8 8 8 0 0 2 0 -2 0 -8 -1 4 0 0 0 -4 8 0 0 0 0 0 0 -4 0 0 0 0 -8 -8 0 -8 -4 0 8 0 0 0 0 0 4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 -8 8 0 -8 -4 0 -4 0 4 -8 0 0 0 -4 4 0 -8 0 8 0 0 0 8 0 0 0 0 -8 8 0 8 0 0 0 0 0 0 0 0 0 8 0 -4 8 0 0 -8 8 0 8 0 0 8 0 -8 0 4 0 4 0 4 0 0 -4 0 0 -8 0 0 0 0 0 0 0 0 -8 0 4 -4 0 0 8 0 -8 0 8 0 0 0 0 0 0 0 -4 8 0 -8 0 0 2 0 0 4 -4 0 -8 0 0 0 0 0 -8 0 0 -8 -2 0 -8 [...]
+1 -3 -4 0 2 0 8 0 0 -4 2 8 4 8 -8 -4 -4 -4 -4 4 -1 -8 -8 8 -8 0 0 0 8 12 2 0 0 8 0 0 -2 -16 0 8 -8 8 0 -8 0 0 0 -8 -8 0 -4 0 2 0 -2 0 8 -1 8 -8 8 8 -8 -8 -8 0 -4 0 4 8 0 -8 -8 -16 0 8 12 8 8 -8 0 0 0 0 0 4 -8 0 -4 0 0 8 8 -8 -8 -8 0 -8 0 8 0 -8 -8 0 0 0 8 0 -8 8 0 4 -4 8 4 0 -8 4 0 0 0 8 -8 0 8 4 0 -4 4 -8 0 8 16 0 16 0 -8 0 -8 8 8 0 0 0 16 8 0 0 -8 -4 8 -8 0 -8 0 -8 16 -8 0 8 0 0 0 4 -4 4 0 4 -8 -8 0 8 4 4 8 0 -8 0 -8 8 0 -4 -8 4 8 -8 0 0 0 0 0 0 -8 8 0 0 8 0 0 -4 8 -8 0 2 0 -8 8 -8 -4  [...]
+1 -3 0 6 0 -8 0 4 -4 0 0 12 2 4 0 -4 0 0 4 -2 -3 -8 0 -4 -8 0 -4 16 0 -4 -2 0 0 -4 4 0 2 0 0 8 -8 8 4 4 -8 -12 0 8 0 -8 -4 4 2 0 -2 -16 0 3 -8 -6 0 -4 -4 8 0 0 0 -6 0 12 -12 0 -4 0 0 0 4 0 -8 8 12 8 0 4 4 -4 0 -8 0 0 -4 0 8 0 6 -8 -16 8 -4 4 16 -4 8 12 0 -8 -8 8 4 0 12 4 0 0 0 -4 4 0 8 -12 0 -12 0 6 0 0 8 0 0 0 -4 0 0 0 0 0 -8 4 0 0 0 0 0 -4 0 0 12 8 8 0 0 8 16 -8 -16 0 0 -8 0 8 -8 -4 8 -4 0 0 -12 0 0 4 0 -8 4 0 4 4 -4 -4 6 0 12 0 4 0 -12 0 6 8 -4 -8 0 0 0 0 4 -16 0 -12 -8 0 0 0 4 2 12 - [...]
+1 -3 -4 0 2 0 8 0 8 4 2 -8 4 8 -8 -4 4 4 12 4 -1 -8 -8 8 8 0 0 0 -8 -4 2 0 0 -8 0 0 -2 0 0 -8 8 -8 0 8 0 0 0 -8 -8 0 12 0 2 0 -2 0 8 -1 -8 0 8 -8 8 8 -8 0 4 8 -4 -8 0 -8 -8 0 0 8 -4 -8 -8 8 0 0 -16 0 0 4 -8 0 -4 0 0 8 -8 -8 0 -8 0 -8 0 -8 0 8 8 0 16 0 -8 0 8 -8 0 4 -4 8 4 0 -8 4 0 0 16 -8 -8 8 8 -4 0 4 4 -8 0 8 0 0 0 0 8 0 -8 8 8 0 0 0 0 -8 0 0 8 4 8 -8 0 -8 0 -8 0 8 16 -8 0 0 0 4 -4 4 0 4 -8 -8 16 -8 4 4 -8 0 8 0 0 8 0 -4 8 -4 -8 -8 8 0 0 0 0 0 -8 8 0 0 -8 0 0 4 8 -8 0 2 0 -8 -8 8 12 -4 [...]
+1 -3 0 -4 -2 4 0 -4 0 0 -2 8 4 0 8 0 0 0 -8 4 -1 -8 8 0 -8 0 -4 0 0 0 2 0 0 4 0 0 -2 0 0 -4 4 8 8 0 8 0 0 -8 8 -8 -8 0 2 0 -2 0 -8 -1 -4 0 0 0 4 -8 0 0 0 0 0 0 4 0 -8 0 0 -8 0 0 8 4 0 -8 0 0 0 8 0 -4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 8 -8 0 8 4 0 4 8 4 -8 0 8 -8 -4 -4 0 8 0 8 0 0 0 -8 0 0 0 0 -8 -8 0 -8 0 0 0 0 0 0 0 0 8 -8 0 4 -8 0 0 -8 8 0 8 0 0 -8 0 8 0 -4 0 -4 8 4 0 0 -4 0 -8 8 0 8 0 0 0 0 0 0 -8 0 4 4 0 0 8 0 8 0 -8 0 0 0 0 8 0 0 4 -8 0 -8 0 0 2 0 -8 -4 4 -8 0 0 0 0 0 0 8 0 0 -8 -2 0  [...]
+1 -3 0 2 0 -4 0 0 4 4 0 4 2 4 0 -4 -4 -4 0 -2 -3 0 0 -4 0 0 0 8 -8 0 2 0 0 0 4 0 -2 8 0 -4 4 0 4 -4 8 -4 0 0 0 0 0 4 -2 0 2 -8 0 3 4 2 0 4 0 0 0 0 -4 2 -12 -4 0 0 -4 -8 0 0 0 -8 0 -4 4 -8 8 4 -4 0 0 -4 0 0 -4 0 0 0 -2 0 8 0 4 -4 -8 4 0 4 -8 8 0 -8 0 8 0 0 0 0 0 -4 4 0 4 -4 8 4 0 -2 0 12 0 4 0 0 -4 0 8 0 -8 0 0 4 0 0 0 0 0 -4 8 8 0 0 0 4 0 0 -8 0 8 0 -8 0 8 0 -4 -4 4 0 0 0 -4 0 0 4 -8 0 0 0 -4 -4 4 4 -2 0 4 0 0 12 4 0 -2 -8 -4 8 0 0 0 0 4 -8 -8 0 0 -4 0 0 4 -2 4 -4 4 -4 0 0 0 4 -4 0 0 0 2 [...]
+1 -3 0 -2 0 0 0 -4 4 0 0 12 2 4 0 -4 0 0 -4 -2 -3 8 0 -4 -8 0 4 0 0 4 6 0 0 -12 4 0 -6 0 0 0 0 8 4 4 -8 4 0 -8 0 -24 4 4 -6 0 6 0 0 3 0 2 0 -4 -12 8 0 0 0 2 0 -4 12 0 -4 0 0 0 -4 0 -8 0 -4 8 0 -12 4 4 0 0 0 0 12 0 8 0 -2 8 0 -8 -4 4 0 -4 8 -4 0 -8 -8 8 12 0 -12 -4 0 0 0 -4 4 0 0 4 0 4 0 -2 0 0 24 0 0 0 -4 0 0 0 0 0 -8 -12 0 0 0 0 0 -4 0 0 -12 24 8 0 0 -8 0 8 0 0 0 -8 0 8 0 -4 0 4 0 0 4 0 0 4 0 -8 -4 0 4 4 -4 -4 -2 0 -4 0 12 0 4 0 -2 8 12 -8 0 0 0 0 4 0 0 12 -24 0 0 0 4 -6 -4 -4 0 0 4 -4  [...]
+1 -3 0 0 -2 0 0 0 0 4 -2 0 4 0 8 0 -4 4 -4 4 -1 0 8 0 0 0 0 -8 8 4 -2 0 0 0 0 0 2 -8 0 -8 0 0 -8 0 8 0 0 0 -8 0 -4 0 -2 0 2 -8 8 -1 -8 0 0 0 0 0 0 0 4 0 4 0 0 0 8 -8 0 -8 4 -8 0 0 0 -8 8 0 0 -4 0 8 -4 0 0 0 -8 0 0 0 8 0 0 0 8 0 8 0 0 -8 -8 8 0 -8 0 -4 4 -8 0 -8 8 4 8 0 0 0 -8 0 0 4 0 4 0 0 0 8 0 0 0 0 8 0 0 0 0 0 0 -8 0 -8 0 0 8 4 -8 0 8 0 8 0 0 8 0 -8 8 0 8 -4 4 0 0 4 0 8 0 -8 -4 0 0 0 0 0 0 8 0 -4 0 4 0 -8 0 8 0 -8 0 0 0 0 -8 -8 -8 0 0 4 -8 0 0 -2 0 8 -8 0 -4 4 0 0 0 0 0 0 0 -8 8 2 0 0 [...]
+1 -3 0 6 -4 -4 0 0 -4 0 4 4 2 4 8 -4 0 0 -4 -2 1 0 -8 -4 0 4 0 0 0 -4 -2 8 -4 0 4 0 -2 0 0 4 4 0 -4 -4 0 4 -4 0 8 0 4 -4 2 -8 2 0 -8 -1 -4 6 0 -4 0 0 -16 0 0 2 0 4 0 0 4 0 0 -8 4 0 0 -4 4 0 0 0 0 4 0 4 0 0 0 0 8 16 -6 0 0 0 0 4 0 4 -8 -4 8 0 -8 0 0 0 0 -4 0 8 0 4 -4 0 -4 -4 -8 -4 -8 2 0 0 0 0 0 0 4 8 8 0 -8 0 8 0 16 0 0 0 0 4 8 0 0 0 -8 0 8 0 0 0 0 0 -8 8 -8 8 4 4 -4 4 0 0 -4 0 0 -4 8 -8 -4 0 4 0 4 0 -6 8 -4 0 0 0 -4 -8 2 0 0 0 0 -8 -16 0 -4 0 0 0 0 0 -8 0 -4 2 4 4 -4 -4 4 4 -4 -4 -4 0 4 [...]
+1 -3 -4 6 0 -4 8 0 -4 0 0 4 2 4 0 0 0 0 4 -2 1 0 0 -4 8 -4 0 0 -16 4 2 0 -4 0 4 0 2 -8 8 -4 -4 8 -4 4 0 -4 4 0 -16 0 -4 -4 -2 0 -2 0 0 -1 4 -2 8 4 0 -8 -8 -8 0 10 0 4 0 -8 4 8 0 0 -4 0 -8 4 -4 0 8 0 0 4 0 4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 -4 0 0 -4 4 -4 0 -4 4 0 -4 16 -6 -8 0 0 0 4 8 4 0 0 0 0 0 0 0 8 0 -8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 4 4 -4 4 0 4 4 0 0 -4 0 0 -4 -4 -4 0 -4 0 2 0 4 0 0 0 -4 16 -6 0 0 0 0 0 -8 8 -4 0 0 0 0 0 0 -8 -4 -2 -4 4 4 4 -4 -4 4 4 4 -8 4 -8 [...]
+1 -3 0 2 -4 0 8 -4 -4 4 4 4 2 -4 8 -4 4 -4 -8 -2 1 0 -8 4 0 4 4 0 -8 8 2 -8 4 -4 4 8 2 0 -8 -8 8 0 4 -4 -8 -4 -4 0 8 -8 8 -4 -2 8 -2 0 8 -1 8 -2 8 -4 12 0 8 8 12 -6 -4 -4 -4 -8 4 0 -8 -8 -8 -8 0 -8 -4 -8 0 0 0 0 0 0 0 0 0 0 0 -8 2 -16 -16 16 0 4 16 4 0 4 0 8 0 8 -12 8 4 0 0 8 -8 -4 -4 0 0 4 0 4 -8 2 -8 4 8 -12 8 8 4 -8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 8 4 8 0 -12 8 16 16 -16 -16 8 0 0 0 0 0 4 0 0 0 8 4 0 0 -4 0 0 0 -8 4 0 4 0 2 -8 4 0 -12 4 4 -8 2 8 0 8 0 8 8 8 4 0 -8 -4 -8 12 -8 -8 -4 -2 -4 [...]
+1 -3 4 4 -2 -8 -16 8 0 8 -2 -16 -4 8 16 12 -8 8 8 -4 3 16 16 8 -16 -4 8 -16 0 8 -2 -8 12 -8 8 -24 -2 16 8 -8 -8 -16 8 -8 16 -8 -4 16 -16 -16 8 -8 -2 -8 -2 -16 -16 3 -8 -4 16 -8 -8 -16 16 8 8 8 -24 -8 24 -16 8 16 -24 16 8 16 -16 -8 -8 16 16 -4 4 8 8 -8 12 16 -4 8 -16 16 -4 16 -16 16 4 -8 -16 -8 -16 -8 16 16 -16 16 -8 16 24 8 -4 16 4 8 8 12 -8 -8 16 -8 -16 -4 16 -24 -16 8 4 -16 -8 -16 16 -16 16 -16 -16 -4 16 8 16 -16 -16 8 16 16 24 -16 -16 8 16 16 -16 16 -16 -16 16 -16 16 -16 -8 -8 -8 8 -4 [...]
+1 -3 0 10 -4 -8 -8 4 -12 4 4 4 2 4 8 4 4 -4 0 -2 1 16 -8 -4 0 4 -4 -16 8 0 2 -8 4 4 -4 -8 2 0 8 0 0 0 -4 -4 8 -4 -4 -16 -8 8 0 -4 -2 8 -2 16 -8 -1 0 -2 8 -4 -12 0 8 -8 12 -6 -4 -4 4 8 -4 0 8 -8 0 -8 0 0 -4 8 0 0 0 -8 0 -8 0 0 0 0 0 -8 2 0 0 0 0 4 0 4 0 4 0 -8 0 -8 12 8 -4 8 0 8 8 4 4 0 8 4 0 4 8 2 -8 4 -8 -12 -8 -8 4 8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 8 -4 -8 0 -12 8 0 0 0 0 -8 0 0 0 0 -8 4 8 -8 0 -8 4 0 0 4 0 0 8 8 4 0 4 0 2 8 4 0 12 4 4 8 2 -8 0 -8 0 8 8 8 -4 16 -8 4 8 12 -8 8 -4 -2 -4 -4 0 [...]
+1 -3 0 -4 2 0 0 0 0 0 2 0 -4 8 0 8 0 0 0 -4 3 0 0 8 0 -4 0 0 0 0 -6 -8 4 0 8 0 -6 0 0 0 0 0 8 8 -16 8 -4 0 0 0 0 -8 -6 -8 -6 0 0 3 0 -4 0 8 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 0 0 0 0 8 -16 0 12 -4 0 0 0 -4 0 12 0 0 0 -4 0 0 0 -4 8 0 8 0 8 0 -16 0 -16 0 0 0 0 4 0 0 8 8 -4 0 8 0 -8 0 -4 0 0 0 0 0 0 -8 0 0 0 0 16 0 12 0 0 0 16 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 8 -4 0 8 0 0 0 0 8 -4 8 -4 -4 0 8 -4 0 0 -8 0 -4 -16 12 -16 0 -8 0 0 8 0 0 0 0 0 0 0 -8 -6 8 8 0 0 0 0 -4 8 8 0 4 0 -4 0 0  [...]
+1 -3 4 2 0 -8 -8 4 -4 4 0 4 -6 4 8 8 4 -4 8 6 1 0 -8 -4 -16 -4 -4 0 8 8 -2 0 4 4 -12 -8 -2 16 0 0 0 0 4 -4 -8 -4 4 0 8 -8 -8 4 2 0 2 0 -8 -1 0 -2 8 -4 4 16 -8 0 -4 2 -4 4 4 -8 -4 -16 8 8 -8 8 0 0 -4 -8 0 0 0 0 0 8 0 0 0 0 -16 8 2 0 0 0 0 4 0 4 0 4 16 8 16 8 -4 -8 -4 0 0 -8 -4 -4 4 0 -8 4 -16 -4 -8 -6 -8 4 8 4 4 8 -4 8 0 0 0 0 0 0 8 0 -8 0 0 -4 0 -8 -4 8 0 4 -8 0 0 0 0 8 0 0 -16 -16 8 -4 -8 0 0 4 4 0 0 4 16 16 0 -4 4 0 4 0 2 8 4 0 -4 4 -4 -8 -6 8 0 8 0 0 -8 8 4 0 8 4 -8 -4 8 -8 4 2 -4 -4  [...]
+1 -3 4 -12 -2 8 -16 -8 0 -8 -2 16 -4 8 16 12 8 -8 -8 -4 3 -16 16 8 16 -4 -8 16 -32 -8 -2 -8 12 8 8 -24 -2 -16 8 8 8 16 8 -8 16 -8 -4 -16 -16 16 -8 -8 -2 -8 -2 16 -16 3 8 -4 16 -8 8 16 16 8 -8 8 24 -8 -24 -16 8 -16 -24 16 -8 -16 16 8 -8 16 -16 -4 4 -8 8 8 12 16 -4 8 16 16 -4 -16 16 -16 4 -8 16 -8 16 -8 -16 16 16 16 8 -16 -24 -8 -4 16 4 8 8 12 8 -8 -16 -8 -16 -4 16 24 16 -8 4 -16 -8 -16 -16 -16 -16 -16 16 -4 16 8 16 -16 -16 8 -16 -16 -24 16 16 -8 16 -16 16 -16 16 -16 -16 16 -16 16 8 -8 8 - [...]
+1 -3 4 -6 0 0 -8 -4 12 -4 0 4 -6 12 8 0 -4 4 0 6 1 0 -8 -12 16 -4 4 0 8 0 -2 0 4 -4 -4 -8 -2 -16 0 8 8 0 -4 -4 -8 -4 4 0 -8 8 0 4 2 0 2 0 8 -1 -8 6 -8 -4 -4 -16 8 0 4 -6 4 4 -4 -8 4 16 8 8 0 -8 0 -8 -4 -8 0 0 0 -8 0 0 0 0 0 0 0 -8 -6 0 0 0 0 4 0 4 16 4 0 8 0 8 4 8 4 8 0 -8 -4 4 -4 0 0 4 0 -4 8 2 8 -4 -8 -4 4 8 -4 -8 16 0 -16 0 -16 0 -8 0 8 0 0 4 16 8 4 -8 16 -4 -8 0 0 0 0 8 -16 -16 0 0 0 -4 0 -8 0 4 4 0 0 -4 0 0 8 -4 4 0 4 0 -6 -8 4 0 4 -4 -4 8 2 8 0 8 0 0 8 -8 -4 0 -8 -4 8 4 8 -8 4 2 -4 [...]
+1 -3 -4 -4 6 0 16 0 0 0 6 0 -4 8 -16 4 0 0 0 -4 3 0 -16 8 0 12 0 0 16 0 -2 -8 -4 0 8 -8 -2 0 -8 0 0 0 8 -8 16 -8 12 0 16 0 0 -8 -2 -8 -2 0 16 3 0 -4 -16 -8 0 0 -16 -8 0 -8 0 -8 0 16 8 0 -8 -16 0 0 0 0 -8 16 0 -4 4 0 24 0 -4 -16 -4 24 0 -16 -4 0 0 0 4 -8 0 -8 0 -8 0 16 0 16 0 0 0 0 12 -16 -4 8 8 -4 0 -8 0 -8 16 -4 -16 0 0 0 -4 16 -8 16 0 16 0 -16 0 -4 -16 24 -16 -16 16 8 0 0 0 0 0 0 -16 0 0 0 0 16 0 0 0 0 0 -8 0 0 12 -4 -8 -4 24 8 0 0 0 -4 -8 4 -8 4 -4 16 -8 -4 0 0 -8 16 -4 16 -4 16 -16 - [...]
+1 -3 0 -2 4 -4 8 0 4 0 -4 4 -6 4 0 4 0 0 -4 6 1 0 0 -4 8 4 0 0 0 -4 -2 -8 -4 0 -4 0 -2 8 0 -4 -4 8 4 4 0 -4 -4 0 0 0 4 4 2 8 2 0 0 -1 4 -2 -8 4 0 -8 -8 0 0 2 0 -4 0 8 4 -8 0 -16 4 0 -8 4 -4 0 -8 0 0 -4 0 4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 4 0 16 0 -4 -4 0 -4 4 0 4 0 2 8 0 0 0 0 -8 -4 0 0 0 0 0 0 0 8 0 8 0 0 -4 0 0 0 0 0 0 16 0 0 0 0 -8 0 0 0 0 4 -4 -4 -4 0 0 4 0 0 -4 0 0 4 0 -4 0 -4 0 2 0 4 0 0 0 4 0 2 0 0 0 0 8 -8 -8 4 0 0 0 0 0 -16 8 4 2 -4 4 4 4 4 4 -4 4 4 0 4 -8 -2 -8  [...]
+1 -3 -4 -4 2 4 8 -4 0 8 2 0 4 0 -8 4 0 8 8 4 -1 0 -8 0 -16 0 -4 -8 16 -8 -2 0 0 -4 8 0 2 -8 0 -4 12 0 -8 8 0 0 0 0 8 8 8 0 -2 0 2 -8 -8 -1 -4 0 -8 -8 -4 -16 8 0 -8 -8 0 8 4 -8 0 -8 0 8 -8 0 0 12 0 0 8 0 0 0 8 4 4 0 0 -8 16 8 0 0 -8 0 0 -8 -8 8 0 0 -8 0 16 0 -4 0 4 0 -4 8 4 -8 0 -4 4 0 -8 8 8 -8 -8 0 8 -8 4 -8 0 -8 8 0 8 0 0 0 8 -8 -8 0 0 -8 8 0 4 8 0 -8 8 0 -8 0 -8 -8 8 0 -8 16 4 0 4 0 -4 4 0 -4 8 0 -8 16 0 4 -8 0 8 0 0 -8 0 4 -4 0 8 8 -8 0 0 0 0 0 8 -8 -8 -8 0 4 8 -8 8 -8 0 -2 0 0 -4 12 [...]
+1 -3 0 2 0 -4 0 0 -4 12 0 4 2 -4 0 4 4 -12 0 -2 -3 0 0 4 0 0 0 8 8 0 -6 0 0 0 -4 0 6 -8 0 -4 4 0 -4 -4 -8 -4 0 0 0 0 0 4 6 0 -6 -8 0 3 4 2 0 4 0 0 0 0 -12 2 12 -4 0 0 4 8 0 0 0 -24 0 -4 4 8 -8 -12 -4 0 0 -4 0 0 12 0 0 0 -2 0 8 0 4 -4 -8 4 0 4 8 -8 0 8 0 24 0 0 0 0 0 4 -4 0 4 -4 -8 4 0 -2 0 -12 0 12 0 0 -4 0 -8 0 8 0 0 -12 0 0 0 0 0 4 -8 24 0 0 0 12 0 0 -8 0 8 0 8 0 -8 0 -4 -4 4 0 0 0 -4 0 0 -4 8 0 0 0 -4 -4 4 4 -2 0 4 0 0 -12 4 0 -2 8 12 -8 0 0 0 0 -4 -8 -24 0 0 -12 0 0 4 6 4 4 4 -4 0 0  [...]
+1 -3 -4 -4 2 4 8 4 0 -8 2 8 4 0 -8 4 0 -8 -8 4 -1 0 -8 0 0 0 4 -8 0 8 -2 0 0 4 8 0 2 8 0 12 -4 -16 -8 -8 0 0 0 0 8 -8 -8 0 -2 0 2 -8 -8 -1 12 8 -8 8 4 0 8 0 8 0 0 -8 -4 -8 0 8 0 8 8 0 -16 -4 0 0 -8 0 0 0 8 4 4 0 0 -8 0 8 8 0 -8 0 0 8 -8 -8 16 0 8 0 0 0 4 0 -4 0 -4 8 4 -8 0 -4 4 0 8 -8 8 0 -8 0 -8 8 4 -8 0 -8 -8 0 -8 0 16 0 8 -8 -8 0 0 -8 -8 0 -4 -8 16 8 8 0 -8 0 -8 -8 -8 16 8 0 4 0 4 0 -4 4 0 -4 8 0 8 0 0 4 8 0 -8 0 8 -8 0 4 4 0 -8 8 0 0 0 0 0 0 8 -8 -8 -8 0 -4 -8 8 8 -8 0 -2 0 0 12 -4 - [...]
+1 -3 0 -8 -2 8 0 0 0 -4 -2 8 4 -8 8 8 4 -4 4 4 -1 0 8 -8 0 0 0 -8 -8 -4 -2 0 0 0 8 0 2 8 0 0 -8 0 0 0 -8 0 0 0 -8 0 4 0 -2 0 2 -8 8 -1 0 0 0 0 0 0 0 0 -4 0 -4 0 0 0 0 8 0 -8 -4 8 0 -8 0 8 -8 0 0 4 0 0 -4 0 0 0 8 0 0 0 8 0 0 0 8 0 -8 0 0 8 8 -8 0 8 0 4 4 -8 0 0 0 4 0 0 0 0 -8 0 0 -4 0 -4 0 0 0 8 0 0 0 0 -8 0 0 0 0 0 0 0 0 8 0 0 -8 -4 -8 0 8 0 8 0 0 -8 0 8 0 0 0 4 4 0 0 4 0 0 0 8 4 0 0 0 0 0 0 8 0 -4 0 -4 0 -8 0 -8 0 8 0 0 0 0 0 -8 8 0 0 -4 -8 0 0 -2 0 0 0 -8 4 -4 0 0 0 0 0 0 0 8 8 2 0 0 0 [...]
+1 -3 0 -2 0 0 0 4 4 0 0 4 2 -4 0 4 0 0 -4 -2 -3 8 0 4 8 0 -4 0 0 4 -2 0 0 -4 -4 0 2 0 0 0 0 -8 -4 4 8 4 0 -8 0 -8 4 4 2 0 -2 0 0 3 0 2 0 -4 -4 -8 0 0 0 2 0 -4 -12 0 4 0 0 0 -4 0 8 0 -4 -8 0 4 4 4 0 0 0 0 -4 0 -8 0 -2 8 0 -8 -4 4 0 -4 -8 -4 0 8 8 -8 4 0 12 -4 0 0 0 4 -4 0 0 4 0 4 0 -2 0 0 8 0 0 0 -4 0 0 0 0 0 8 4 0 0 0 0 0 4 0 0 12 8 -8 0 0 -8 0 8 0 0 0 8 0 -8 0 -4 0 4 0 0 4 0 0 -4 0 8 -4 0 4 4 -4 -4 -2 0 -4 0 4 0 4 0 -2 -8 -4 8 0 0 0 0 -4 0 0 -12 -8 0 0 0 4 2 -4 4 0 0 4 -4 0 -4 4 0 0 8 2 [...]
+1 -3 0 -6 0 4 0 0 12 4 0 -4 2 -4 0 4 -4 -4 8 -2 -3 16 0 4 0 0 0 -8 8 -8 2 0 0 0 -4 0 -2 -8 0 4 -4 0 -4 -4 -8 12 0 -16 0 0 -8 4 -2 0 2 8 0 3 -4 -6 0 4 0 0 0 0 -4 -6 -12 12 0 0 4 8 0 0 8 -8 0 4 -12 8 -8 4 -4 8 0 4 0 0 -4 0 0 0 6 -16 -8 16 4 -4 8 4 0 -12 8 -8 0 8 0 8 0 -8 0 0 0 4 -4 0 -4 12 -8 -12 0 6 0 12 0 4 0 0 -4 0 -8 0 8 0 0 4 0 0 0 0 0 4 -8 8 0 0 0 4 0 16 8 -16 -8 0 8 0 -8 0 4 -4 -4 8 0 0 12 0 0 -4 8 0 -8 0 -4 -4 4 4 6 0 -12 0 0 12 -12 0 6 8 -4 -8 0 0 0 0 -4 8 -8 0 0 -4 0 0 4 -2 -12 4 [...]
+1 -3 -4 2 0 0 0 -4 -4 4 0 4 2 4 0 8 4 -4 0 -2 1 0 0 -4 -8 -4 4 0 8 0 -2 0 4 -4 -4 8 -2 -8 0 0 0 8 -4 4 -8 4 4 0 0 8 0 -4 2 0 2 0 0 -1 0 -2 0 4 -4 8 0 0 -4 -6 -4 -4 -4 0 -4 8 -8 0 0 8 -8 0 4 -8 -8 0 0 0 0 0 0 0 0 0 -8 0 2 0 0 0 0 -4 0 -4 -8 -4 -8 8 8 8 4 -8 4 0 0 0 4 4 4 0 0 -4 8 4 0 2 0 4 -8 4 -4 0 4 0 8 0 -8 0 8 0 0 0 0 0 0 4 8 -8 4 -8 -8 4 0 0 0 0 0 0 -8 8 8 -8 0 4 0 0 0 -4 -4 0 0 4 -8 8 0 4 -4 0 -4 0 2 0 -4 0 4 4 4 0 2 8 0 8 0 0 0 0 -4 0 8 -4 8 -4 0 0 -4 2 4 -4 0 0 0 0 4 4 4 0 -4 -8 - [...]
+1 -3 -4 2 0 0 0 4 4 -4 0 -4 2 4 0 8 -4 4 0 -2 1 0 0 -4 8 -4 -4 0 -8 0 -2 0 4 4 -4 8 -2 8 0 0 0 -8 -4 4 -8 4 4 0 0 -8 0 -4 2 0 2 0 0 -1 0 -2 0 4 4 -8 0 0 4 -6 4 -4 4 0 -4 -8 -8 0 0 -8 8 0 4 -8 8 0 0 0 0 0 0 0 0 0 8 0 2 0 0 0 0 -4 0 -4 8 -4 8 8 -8 8 -4 8 -4 0 0 0 4 4 4 0 0 -4 -8 4 0 2 0 -4 8 -4 -4 0 4 0 -8 0 8 0 -8 0 0 0 0 0 0 4 -8 8 -4 8 8 -4 0 0 0 0 0 0 8 -8 -8 8 0 4 0 0 0 -4 -4 0 0 4 8 -8 0 4 -4 0 -4 0 2 0 -4 0 -4 -4 4 0 2 8 0 8 0 0 0 0 -4 0 -8 4 -8 4 0 0 -4 2 4 -4 0 0 0 0 4 4 4 0 -4 8  [...]
+1 -3 0 -2 -4 4 0 0 4 0 4 -4 2 -4 8 4 0 0 4 -2 1 0 -8 4 0 4 0 0 0 4 -2 8 -4 0 -4 0 -2 0 0 -4 -4 0 4 -4 0 4 -4 0 -8 0 -4 -4 2 -8 2 0 8 -1 4 -2 -16 -4 0 0 0 0 0 10 0 4 0 0 -4 0 0 -8 -4 0 0 4 4 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 2 0 0 0 0 4 0 4 8 -4 -8 0 8 0 0 0 0 4 0 8 0 -4 4 0 4 -4 8 -4 8 -6 16 0 0 0 0 0 4 -8 -8 0 8 0 -8 0 0 0 16 0 0 -4 -8 0 0 0 8 0 8 0 0 0 0 0 8 -8 8 -8 -4 4 4 -4 0 0 -4 0 0 4 -8 8 4 0 4 0 4 0 2 -8 -4 0 0 0 -4 8 -6 0 0 0 0 -8 0 -16 4 0 0 0 0 0 -8 0 -4 2 4 -4 4 4 -4 -4 -4 -4 -4 0 [...]
+1 -3 0 -6 -4 8 -8 -4 12 -4 4 -4 2 4 8 4 -4 4 0 -2 1 -16 -8 -4 0 4 4 16 8 0 2 -8 4 -4 -4 -8 2 0 8 0 0 0 -4 -4 8 -4 -4 16 -8 -8 0 -4 -2 8 -2 -16 -8 -1 0 -2 8 -4 12 0 8 -8 -12 -6 4 -4 -4 8 -4 0 8 -8 0 8 0 0 -4 8 0 0 0 8 0 8 0 0 0 0 0 -8 2 0 0 0 0 4 0 4 0 4 0 -8 0 -8 -12 -8 4 -8 0 8 8 4 4 0 -8 4 0 4 8 2 -8 -4 8 12 -8 -8 4 8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 -8 4 8 0 12 8 0 0 0 0 -8 0 0 0 0 8 4 -8 8 0 -8 4 0 0 4 0 0 -8 8 4 0 4 0 2 8 4 0 -12 -4 4 8 2 -8 0 -8 0 8 8 8 -4 -16 8 -4 -8 -12 -8 8 -4 -2 -4  [...]
+1 -3 -8 2 4 0 8 -4 4 12 -4 -12 2 4 -8 12 -4 -12 8 -2 1 0 8 -4 0 4 4 0 -8 -8 2 8 4 12 -4 -8 2 0 -8 -8 8 0 -4 -4 8 -4 -4 0 8 -8 -8 -4 -2 -8 -2 0 8 -1 8 -2 -8 -4 -4 0 -8 8 4 -6 4 -4 -4 -8 -4 0 8 8 8 8 0 -8 -4 8 0 0 0 0 0 0 0 0 0 0 0 8 2 16 -16 -16 0 4 16 4 0 4 0 -8 0 -8 4 -8 4 0 0 -8 0 4 4 0 0 4 0 4 -8 2 8 -4 8 -4 0 8 4 -8 0 0 0 0 0 0 8 0 8 0 0 4 0 -8 4 8 0 -4 -8 -16 16 16 -16 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 -8 4 0 4 -4 4 -8 2 -8 0 -8 0 -8 -8 -8 -4 0 8 -4 -8 4 8 -8 -4 -2 -4  [...]
+1 -3 -8 2 4 0 8 4 -4 -12 -4 12 2 4 -8 12 4 12 -8 -2 1 0 8 -4 0 4 -4 0 -8 8 2 8 4 -12 -4 -8 2 0 -8 8 -8 0 -4 -4 8 -4 -4 0 8 8 8 -4 -2 -8 -2 0 8 -1 -8 -2 -8 -4 4 0 -8 8 -4 -6 -4 -4 4 -8 -4 0 8 8 -8 -8 0 8 -4 8 0 0 0 0 0 0 0 0 0 0 0 8 2 -16 16 16 0 4 -16 4 0 4 0 -8 0 -8 -4 8 -4 0 0 -8 0 4 4 0 0 4 0 4 -8 2 8 4 -8 4 0 8 4 -8 0 0 0 0 0 0 8 0 8 0 0 4 0 8 -4 -8 0 4 -8 16 -16 -16 16 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 -8 4 0 -4 4 4 -8 2 -8 0 -8 0 -8 -8 -8 -4 0 -8 4 8 -4 8 -8 -4 -2 -4  [...]
+1 -3 -4 -2 0 4 8 0 4 0 0 -4 2 -4 0 8 0 0 -4 -2 1 0 0 4 -8 -4 0 0 0 -4 2 0 -4 0 -4 0 2 8 8 4 4 -8 4 4 0 -4 4 0 0 0 4 -4 -2 0 -2 0 -16 -1 -4 6 -8 4 0 8 8 -8 0 2 0 4 0 -8 -4 -8 0 0 4 0 8 -4 -4 0 -8 0 0 -4 0 -4 0 0 0 0 0 -8 -6 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 4 0 0 -4 -4 4 0 4 4 0 -4 0 2 8 0 0 0 4 8 4 16 0 0 0 0 0 0 -8 0 8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 -4 4 4 -4 0 4 4 0 0 4 0 0 4 -4 -4 0 -4 0 -6 16 4 0 0 0 -4 0 2 0 0 0 0 0 8 -8 4 0 0 0 0 0 0 -8 -4 -2 -4 -4 -4 -4 4 4 4 4 4 -8 4 8 6  [...]
+1 -3 0 -6 -4 8 8 4 12 -4 4 -12 2 -12 8 4 -4 4 16 -2 1 0 -8 12 0 4 -4 0 -8 0 2 -8 4 4 -4 8 2 0 -8 0 -16 0 12 -4 -8 -4 -4 0 -8 8 -16 -4 -2 8 -2 0 24 -1 0 6 24 -4 -12 0 -8 8 -12 -14 4 -4 4 -8 -4 0 -8 -8 0 8 0 16 -4 -8 0 0 0 -8 0 -8 0 0 0 0 16 8 -6 16 16 -16 0 4 -16 4 -16 4 16 8 -16 8 12 -8 -4 8 0 8 -8 -12 4 0 8 4 -16 4 8 10 -24 -4 -8 12 8 8 4 -24 16 0 -16 0 16 0 8 0 -24 0 0 -12 16 -8 -4 -8 -16 12 8 -16 -16 16 16 8 -16 16 -16 16 -8 4 8 -8 0 8 4 0 0 4 16 -16 8 -8 4 0 4 0 -6 -24 4 0 12 -4 4 8  [...]
+1 -5 8 -6 4 0 -8 4 4 12 4 12 -10 -4 -8 4 4 12 -8 -10 1 16 -8 -4 -16 4 4 16 -24 -8 2 8 4 12 -4 8 2 -16 8 -8 -8 -16 -12 4 8 4 4 16 8 8 -8 4 2 8 2 16 8 1 -8 2 8 4 4 -16 8 8 4 6 4 4 4 -24 -12 -16 8 -24 -8 8 -16 -8 4 8 -16 0 0 -16 0 16 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 4 8 4 16 0 -24 0 -12 -12 0 -16 4 0 4 8 2 8 4 8 4 0 -24 4 8 0 0 0 0 0 0 -8 0 -8 0 0 12 0 -8 -4 -8 0 -4 24 0 0 0 0 24 0 0 0 0 -16 -4 16 16 0 0 -4 0 0 12 0 0 -16 0 -4 0 -4 0 -2 -8 -4 0 -4 -4 -4 -8 -2 -8 0 -8 0 -8 -8 -8 12 -1 [...]
+1 -5 12 -4 6 -8 -16 8 16 24 -6 32 -4 -8 -16 -20 -8 -24 -8 4 3 -16 16 8 -16 12 -8 -16 0 -8 6 24 12 -24 8 24 6 -16 24 -8 -8 -16 -8 -8 -16 -8 -12 16 -16 48 8 -8 -6 -24 -6 16 -16 -3 8 -4 -16 -8 24 16 -16 -24 24 -16 24 -8 24 -16 -8 16 -24 -16 8 48 16 8 -8 -16 16 12 4 -8 24 -8 12 48 12 24 -16 16 4 -16 -16 -16 4 8 -16 8 -16 8 -16 16 -16 16 -24 -48 -24 -8 12 16 12 8 8 12 -8 8 -16 8 16 4 16 -24 -48 -24 12 16 8 16 -16 16 -16 48 -16 -12 -16 -24 -16 -48 -16 -8 16 48 24 48 16 24 -16 16 16 16 16 -16 1 [...]
+1 -5 4 2 0 0 -8 4 4 4 0 -4 -2 4 8 0 -4 4 0 -2 1 0 8 4 0 -4 4 0 8 0 -2 0 4 -4 -4 -8 -2 0 0 -8 -8 -16 4 4 8 4 -4 0 -8 -8 0 -4 -2 0 -2 0 8 1 -8 2 -8 4 4 0 8 0 -4 -2 -4 -4 4 -8 12 0 -8 8 0 8 -16 -8 4 8 16 0 0 8 0 0 0 0 0 0 16 8 2 0 0 0 0 4 0 4 0 4 -16 8 -16 8 4 8 4 -8 0 8 -4 4 12 0 0 4 16 -4 -8 -6 -8 -4 -8 -4 4 -8 -4 8 0 0 0 0 0 0 -8 0 8 0 0 -4 0 -8 -4 8 0 4 -8 0 0 0 0 8 0 0 -16 -16 0 4 0 -8 0 -4 -4 0 0 -12 16 16 8 4 -4 0 -4 0 -2 -8 -4 0 -4 4 4 8 6 -8 0 -8 0 0 -8 8 -4 0 -8 -4 8 4 -8 8 4 2 -4 [...]
+1 -5 4 -2 0 4 0 0 4 0 0 4 -2 -4 8 0 0 0 -4 -2 1 0 8 -4 0 -4 0 0 0 -4 2 0 -4 0 -4 0 2 0 -8 -4 -4 0 -4 4 0 -4 -4 0 8 0 -4 -4 2 0 2 0 8 1 -4 2 0 4 0 0 0 -8 0 -2 0 4 0 16 -4 0 0 8 -4 0 0 -4 -4 0 0 0 0 4 0 -4 0 0 0 0 -8 0 2 0 0 0 0 4 0 4 8 -4 8 0 8 0 0 0 0 -4 0 8 4 -4 -4 0 4 -4 -8 4 8 2 0 0 0 0 -4 16 -4 8 8 0 -8 0 -8 0 0 0 0 0 0 4 -8 0 0 0 -8 0 -8 0 0 0 0 -16 8 8 8 8 4 4 -4 -4 0 4 4 0 0 4 -8 -8 4 -4 -4 0 -4 0 -2 -8 4 0 0 0 -4 -8 -2 0 0 0 0 0 0 0 4 0 0 0 0 0 -8 -16 4 -2 4 4 4 4 4 4 4 -4 -4 8 4 [...]
+1 -5 0 -2 4 4 8 0 4 0 4 4 -2 4 -16 4 0 0 4 -2 1 0 -16 4 -8 4 0 0 0 4 -2 -8 -4 0 4 0 -2 -8 0 4 4 -8 4 -4 0 4 4 0 0 0 4 -4 -2 -8 -2 0 0 1 4 2 8 -4 0 -8 8 0 0 -2 0 4 0 8 4 -8 0 0 4 0 -8 4 4 0 -8 0 0 4 0 -4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 -4 0 0 0 4 4 0 4 4 0 4 0 2 8 0 0 0 0 8 -4 0 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 4 4 -4 -4 0 0 -4 0 0 -4 0 0 4 0 4 0 4 0 -2 0 -4 0 0 0 -4 0 -2 0 0 0 0 8 -8 -8 -4 0 0 0 0 0 0 -8 4 2 -4 -4 -4 -4 -4 -4 -4 4 4 0 4 8 -2 8 0 [...]
+1 -5 4 4 2 -4 0 4 0 8 -2 8 -4 0 0 -4 0 -8 0 4 -1 0 0 0 -8 0 -4 8 0 0 -2 0 0 -4 0 0 2 0 0 -4 -4 -8 0 0 0 -8 0 0 0 -8 0 8 2 0 -2 -8 0 1 4 0 0 0 4 8 0 0 -8 0 0 0 -4 0 0 0 0 0 0 0 8 4 8 0 0 0 0 0 -8 -4 4 0 0 8 8 0 0 0 8 0 0 0 8 0 8 8 0 0 8 0 -4 0 4 0 -4 0 -4 0 0 -4 -4 -8 0 0 0 0 0 0 8 8 -4 0 -8 0 0 0 0 0 8 0 0 -8 0 0 0 0 0 0 -4 -8 -8 -8 0 0 -8 0 -8 0 0 -8 0 -8 4 8 4 0 4 4 8 4 8 0 0 -8 0 4 0 0 0 0 0 0 -8 -4 4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 4 8 8 0 0 -8 -2 -8 0 -4 -4 0 0 0 0 0 0 0 -8 0 0 0 2 8 0  [...]
+1 -5 4 -6 0 8 -8 -4 4 -4 0 12 -2 -4 8 8 4 -4 -8 -2 1 0 8 -4 0 -4 -4 0 -24 -8 -2 0 4 4 4 -8 -2 0 0 0 0 16 12 4 8 4 -4 0 8 8 -8 -4 -2 0 -2 0 -8 1 0 -6 8 4 -4 0 -8 0 4 6 4 -4 -4 -8 4 0 -8 8 -8 -8 16 0 4 8 -16 0 0 0 0 -8 0 0 0 0 0 -8 -6 0 0 0 0 4 0 4 -16 4 0 8 0 8 -4 -8 -4 0 0 8 -4 12 4 0 8 4 0 -4 8 2 8 4 8 4 4 -8 -4 -8 -16 0 16 0 16 0 8 0 -8 0 0 -12 16 8 4 -8 16 -4 -8 0 0 0 0 8 -16 -16 0 0 8 4 -8 0 0 -4 -4 0 0 -4 0 0 0 4 -4 0 -4 0 6 8 -4 0 4 -4 4 -8 -2 -8 0 -8 0 0 8 -8 -12 0 8 4 -8 -4 -8 8  [...]
+1 -5 4 0 2 0 0 0 8 4 -2 8 -4 0 0 -4 -4 -4 -4 4 -1 8 0 0 0 0 0 0 -8 -4 2 0 0 -8 0 0 -2 -8 0 0 0 0 0 0 0 8 0 -8 0 0 4 8 -2 0 2 0 0 1 0 0 0 0 -8 0 0 0 4 0 -4 0 0 0 0 8 0 0 4 -8 0 0 -8 0 8 0 0 -4 8 0 -4 0 0 -8 0 0 0 8 0 8 0 0 0 0 0 -8 8 0 0 0 8 8 0 -4 -4 0 -4 0 0 4 0 8 8 0 0 0 0 4 0 -4 -4 0 -8 0 8 0 8 0 0 0 0 8 0 0 0 0 -8 -8 0 0 0 4 0 -8 0 -8 0 0 -8 0 -8 0 0 8 0 4 4 4 -8 -4 -8 0 -8 0 4 4 0 0 0 0 0 0 8 4 -8 -4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 0 -8 2 8 0 0 0 -4 -4 0 0 0 0 0 0 0 -8 0 -2 -8 8  [...]
+1 -5 4 4 -2 0 0 0 0 0 2 0 -4 0 16 -4 0 0 0 4 3 0 -16 0 0 -4 0 0 0 0 -2 8 -4 0 0 -8 -2 0 -8 0 0 0 0 -8 0 8 4 0 0 0 0 -8 2 -8 2 0 0 -3 0 4 -16 -8 0 0 -16 8 0 8 0 8 0 0 0 0 8 16 0 0 0 0 8 0 0 -4 4 0 -8 0 -4 16 -4 -8 0 16 -4 0 0 0 4 8 0 8 0 -8 0 0 0 0 0 0 0 0 -4 -16 4 0 0 -4 0 -8 0 -8 0 -4 16 0 0 0 4 0 8 0 0 16 0 16 0 4 -16 8 -16 -16 -16 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 -8 0 0 4 -4 8 4 8 0 0 0 0 -4 -8 -4 -8 -4 4 0 8 4 0 0 8 0 4 0 4 0 -16 8 16 16 0 0 0 0 0 0 -16 0 8 -2 -8 0 0 0 0 0 -4 8 8 [...]
+1 -5 4 4 -2 0 16 0 0 0 2 0 -4 -8 16 -12 0 0 0 4 3 0 -16 8 0 -4 0 0 -16 0 6 -8 -4 0 8 8 6 0 -24 0 0 0 -8 -8 -16 -8 4 0 16 0 0 -8 -6 8 -6 0 16 -3 0 -4 16 -8 0 0 16 24 0 0 0 -8 0 16 -8 0 -8 16 0 0 0 0 -8 -16 0 12 4 0 8 0 -4 16 12 8 0 -16 4 0 0 0 4 8 0 8 0 8 0 16 0 16 0 0 0 0 -4 -16 4 8 8 -4 0 8 0 8 -16 4 -16 0 0 0 4 -16 8 -16 0 -16 0 -16 0 -12 16 -8 16 16 16 -8 0 0 0 0 0 0 16 0 0 0 0 16 0 0 0 0 0 -8 0 0 4 -4 -8 4 -8 -8 0 0 0 -4 -8 -4 -8 -4 -4 16 -8 4 0 0 -8 16 -4 -16 -12 -16 -16 -8 -16 -16  [...]
+1 -5 0 4 2 0 16 0 0 0 -2 0 -4 0 0 0 0 0 0 4 3 0 0 0 0 -4 0 0 -16 0 2 -8 -12 0 0 0 2 0 0 0 0 0 0 8 0 -8 4 0 -16 0 0 -8 -2 8 -2 0 -16 -3 0 4 0 8 0 0 0 0 0 16 0 8 0 16 0 0 0 0 0 0 0 0 -8 0 0 -4 -4 0 0 0 12 0 -4 0 0 0 -4 0 0 0 -4 -8 0 -8 0 8 0 0 0 0 0 0 0 0 4 0 0 0 0 12 0 8 0 -8 16 -4 0 0 0 0 0 -16 8 16 0 0 0 16 0 4 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 -8 0 0 -4 0 -8 -12 0 0 0 0 0 0 8 4 8 4 4 -16 -8 -12 0 0 8 -16 4 0 4 0 0 -8 0 0 0 0 0 0 0 0 0 -16 8 2 8 0 0 0 0 0 -4 -8 -8 0 -12 0 [...]
+1 -5 0 6 0 0 0 4 12 0 0 -12 6 12 0 -12 0 0 12 6 -3 -24 0 12 24 0 4 0 0 -12 6 0 0 -12 -12 0 -6 0 0 0 0 -24 12 12 -24 12 0 -24 0 24 12 12 6 0 -6 0 0 -3 0 6 0 -12 12 24 0 0 0 6 0 -12 -12 0 -12 0 0 0 -12 0 -24 0 -12 24 0 -12 4 -12 0 0 0 0 12 0 -24 0 6 -24 0 24 -4 -12 0 12 -24 12 0 24 24 -24 12 0 -12 12 0 0 0 12 -12 0 0 -12 0 -12 0 6 0 0 24 0 0 0 12 0 0 0 0 0 24 12 0 0 0 0 0 -12 0 0 12 -24 24 0 0 -24 0 24 0 0 0 -24 0 24 0 -12 0 12 0 0 12 0 0 12 0 -24 -12 0 12 -4 -12 4 -6 0 -12 0 -12 0 12 0 -6 [...]
+1 -5 0 2 0 4 0 0 4 -4 0 4 6 4 0 -4 -4 -4 -8 6 -3 -16 0 4 0 0 0 -8 8 8 2 0 0 0 -4 0 -2 -8 0 4 -4 0 4 -12 8 4 0 -16 0 0 -8 12 2 0 -2 -8 0 -3 4 -2 0 12 0 0 0 0 4 -2 12 4 0 0 -4 -8 0 0 8 8 0 -4 -4 -8 8 4 -4 -8 0 4 0 0 -4 0 0 0 -2 16 -8 -16 4 12 8 -12 0 4 8 -8 0 8 0 8 0 8 0 0 0 4 -4 0 -4 -4 -8 4 0 -2 0 12 0 4 0 0 12 0 -8 0 8 0 0 -4 0 0 0 0 0 -4 8 -8 0 0 0 -4 0 16 -8 -16 8 0 -8 0 8 0 -4 -12 4 8 0 0 4 0 0 4 -8 0 -8 0 -12 4 12 -4 2 0 -4 0 0 -12 -4 0 2 -8 4 8 0 0 0 0 -4 8 -8 0 0 -4 0 0 -12 -2 4 4 [...]
+1 -5 -4 8 2 0 8 0 -8 -4 -2 8 4 8 -8 4 4 4 -4 -4 -1 -8 8 -8 -8 0 0 0 -8 12 2 0 0 -8 0 0 -2 -16 0 8 -8 8 0 -8 0 0 0 8 -8 0 4 0 -2 0 2 0 8 1 -8 -8 8 8 -8 8 -8 0 -4 0 4 8 0 -8 -8 16 0 8 -12 8 -8 8 0 0 0 0 0 4 -8 0 -4 0 0 8 8 8 8 -8 0 -8 0 -8 0 8 -8 0 0 0 8 0 8 -8 0 4 -4 -8 4 0 8 4 0 0 0 -8 8 0 -8 -4 0 4 4 8 0 -8 16 0 16 0 -8 0 -8 -8 8 0 0 0 -16 8 0 0 8 -4 8 8 0 8 0 -8 -16 8 0 -8 0 0 0 -4 4 -4 0 -4 8 -8 0 -8 -4 -4 8 0 -8 0 -8 8 0 4 -8 4 8 -8 0 0 0 0 0 0 8 -8 0 0 -8 0 0 4 -8 8 0 2 0 8 8 -8 -4  [...]
+1 -5 0 -2 0 8 0 -4 4 0 0 4 6 -4 0 4 0 0 4 6 -3 -8 0 -4 -8 0 -4 -16 0 -4 -2 0 0 -4 4 0 2 0 0 -8 8 8 -4 12 8 -4 0 -8 0 8 4 12 -2 0 2 -16 0 -3 -8 -2 0 -12 4 -8 0 0 0 -2 0 4 12 0 4 0 0 0 -4 0 8 8 4 -8 0 4 4 -4 0 8 0 0 -4 0 8 0 -2 -8 16 8 -4 -12 -16 12 8 -4 0 -8 -8 8 4 0 12 4 0 0 0 -4 4 0 -8 4 0 4 0 -2 0 0 8 0 0 0 12 0 0 0 0 0 -8 -4 0 0 0 0 0 4 0 0 -12 -8 -8 0 0 -8 16 8 -16 0 0 8 0 -8 -8 -12 8 4 0 0 -4 0 0 -4 0 8 -4 0 12 -4 -12 4 2 0 4 0 -4 0 -4 0 2 -8 4 8 0 0 0 0 4 16 0 -12 -8 0 0 0 -12 2 -4 [...]
+1 -5 -4 8 2 0 8 0 0 4 -2 -8 4 8 -8 4 -4 -4 12 -4 -1 -8 8 -8 8 0 0 0 -24 -4 2 0 0 8 0 0 -2 0 0 -8 8 -8 0 8 0 0 0 8 -8 0 -12 0 -2 0 2 0 8 1 8 0 8 -8 8 -8 -8 0 4 8 -4 -8 0 -8 -8 0 0 8 4 -8 8 -8 0 0 16 0 0 4 -8 0 -4 0 0 8 -8 8 0 -8 0 -8 0 8 0 -8 8 0 16 0 -8 0 -8 8 0 4 -4 -8 4 0 8 4 0 0 16 8 8 -8 -8 4 0 -4 4 8 0 -8 0 0 0 0 8 0 -8 -8 8 0 0 0 0 -8 0 0 -8 4 8 8 0 8 0 -8 0 -8 -16 8 0 0 0 -4 4 -4 0 -4 8 -8 -16 8 -4 -4 -8 0 8 0 0 8 0 4 8 -4 -8 -8 8 0 0 0 0 0 8 -8 0 0 8 0 0 -4 -8 8 0 2 0 8 -8 8 12 - [...]
+1 -5 0 4 -2 4 0 -4 0 0 2 0 4 0 8 0 0 0 -8 -4 -1 -8 -8 0 -8 0 4 0 0 0 2 0 0 -4 0 0 -2 0 0 -4 4 8 8 0 8 0 0 8 8 -8 8 0 -2 0 2 0 -8 1 4 0 0 0 4 8 0 0 0 0 0 0 4 0 -8 0 0 -8 0 0 -8 -4 0 -8 0 0 0 8 0 -4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 8 8 0 -8 -4 0 -4 8 4 8 0 -8 8 -4 -4 0 8 0 -8 0 0 0 8 0 0 0 0 8 -8 0 -8 0 0 0 0 0 0 0 0 8 8 0 4 -8 0 0 -8 -8 0 -8 0 0 8 0 -8 0 4 0 4 -8 -4 0 0 4 0 -8 -8 0 -8 0 0 0 0 0 0 -8 0 -4 4 0 0 8 0 8 0 -8 0 0 0 0 -8 0 0 -4 8 0 8 0 0 2 0 8 -4 4 -8 0 0 0 0 0 0 8 0 0 8 -2 0 -8 [...]
+1 -5 0 8 -2 0 0 0 -8 4 2 0 4 0 8 0 4 -4 -4 -4 -1 0 -8 0 0 0 0 -8 8 4 -2 0 0 0 0 0 2 -8 0 -8 0 0 -8 0 8 0 0 0 -8 0 4 0 2 0 -2 8 8 1 8 0 0 0 0 0 0 0 4 0 4 0 0 0 8 8 0 -8 -4 -8 0 0 0 -8 -8 0 0 -4 0 8 -4 0 0 0 -8 0 0 0 8 0 0 0 8 0 8 0 0 8 -8 -8 0 8 0 -4 4 8 0 8 -8 4 8 0 0 0 8 0 0 -4 0 -4 0 0 0 -8 0 0 0 0 8 0 0 0 0 0 0 -8 0 -8 0 0 -8 4 -8 0 -8 0 -8 0 0 -8 0 8 -8 0 -8 4 -4 0 0 -4 0 8 0 8 4 0 0 0 0 0 0 8 0 4 0 4 0 -8 0 8 0 -8 0 0 0 0 8 -8 8 0 0 -4 8 0 0 -2 0 -8 -8 0 -4 4 0 0 0 0 0 0 0 -8 -8 2 0 [...]
+1 -5 4 12 -2 -8 -16 8 -16 8 2 0 -4 8 16 4 8 -8 8 4 3 16 -16 -8 -16 -4 -8 -16 32 8 -2 -8 12 8 -8 -24 -2 16 8 -8 -8 -16 8 -8 16 -8 4 -16 -16 -16 -8 -8 2 8 2 16 -16 -3 8 -4 16 -8 -8 16 16 -8 8 -16 -24 -8 24 -16 8 -16 24 16 -8 16 16 8 -8 16 -16 -4 4 8 8 -8 12 16 -4 8 -16 -16 4 16 -16 16 4 8 -16 8 -16 8 16 -16 -16 -16 8 -16 -24 8 -4 -16 4 -8 -8 12 -8 8 16 8 16 4 -16 24 16 -8 4 16 8 16 16 -16 16 -16 -16 4 16 -8 16 16 16 8 -16 16 24 -16 16 8 16 -16 16 -16 16 -16 -16 16 -16 16 8 -8 8 -8 4 -4 -8  [...]
+1 -5 0 4 2 0 0 0 0 0 -2 0 -4 8 0 8 0 0 0 4 3 0 0 -8 0 -4 0 0 0 0 -6 -8 4 0 -8 0 -6 0 0 0 0 0 8 8 -16 8 4 0 0 0 0 -8 6 8 6 0 0 -3 0 -4 0 8 0 0 0 0 0 -8 0 -8 0 0 8 0 0 0 0 0 0 0 8 -16 0 12 -4 0 0 0 -4 0 12 0 0 0 4 0 0 0 -4 -8 0 -8 0 -8 0 16 0 16 0 0 0 0 4 0 0 -8 -8 -4 0 -8 0 8 0 4 0 0 0 0 0 0 8 0 0 0 0 16 0 -12 0 0 0 -16 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 -4 0 8 4 0 8 0 0 0 0 8 4 8 4 -4 0 8 4 0 0 -8 0 -4 -16 -12 -16 0 -8 0 0 -8 0 0 0 0 0 0 0 8 -6 -8 -8 0 0 0 0 -4 -8 -8 0 4 0 4 0  [...]
+1 -5 4 -4 -2 8 -16 -8 16 -8 2 0 -4 8 16 4 -8 8 -8 4 3 -16 -16 -8 16 -4 8 16 0 -8 -2 -8 12 -8 -8 -24 -2 -16 8 8 8 16 8 -8 16 -8 4 16 -16 16 8 -8 2 8 2 -16 -16 -3 -8 -4 16 -8 8 -16 16 -8 -8 -16 24 -8 -24 -16 8 16 24 16 8 -16 -16 -8 -8 16 16 -4 4 -8 8 8 12 16 -4 8 16 -16 4 -16 16 -16 4 8 16 8 16 8 -16 -16 16 -16 -8 16 24 -8 -4 -16 4 -8 -8 12 8 8 -16 8 16 4 -16 -24 -16 8 4 16 8 16 -16 -16 -16 -16 16 4 16 -8 16 16 16 8 16 -16 -24 16 -16 -8 16 16 -16 16 -16 -16 16 -16 16 -16 -8 -8 -8 8 4 -4 -8 [...]
+1 -5 -4 4 6 0 16 0 0 0 -6 0 -4 8 -16 12 0 0 0 4 3 0 16 -8 0 12 0 0 -16 0 -2 -8 -4 0 -8 -8 -2 0 -8 0 0 0 8 -8 16 -8 -12 0 16 0 0 -8 2 8 2 0 16 -3 0 -4 -16 -8 0 0 -16 8 0 0 0 -8 0 16 8 0 8 -16 0 0 0 0 -8 16 0 -4 4 0 24 0 -4 -16 -4 24 0 16 4 0 0 0 4 8 0 8 0 8 0 -16 0 -16 0 0 0 0 12 16 -4 -8 -8 -4 0 8 0 8 -16 4 16 0 0 0 -4 -16 8 -16 0 16 0 -16 0 4 -16 -24 -16 16 -16 8 0 0 0 0 0 0 -16 0 0 0 0 16 0 0 0 0 0 -8 0 0 -12 4 -8 4 -24 8 0 0 0 4 -8 -4 -8 -4 -4 16 -8 4 0 0 -8 16 -4 16 4 16 16 -8 16 16  [...]
+1 -5 -4 4 2 4 8 -4 0 8 -2 -8 4 0 -8 12 0 -8 8 -4 -1 0 8 0 -16 0 4 -8 0 -8 -2 0 0 4 -8 0 2 -8 0 -4 12 0 -8 8 0 0 0 0 8 8 -8 0 2 0 -2 8 -8 1 4 0 -8 -8 -4 16 8 0 -8 -8 0 8 4 -8 0 8 0 8 8 0 0 -12 0 0 -8 0 0 0 8 4 4 0 0 -8 16 -8 0 0 -8 0 0 8 -8 -8 0 0 -8 0 16 0 4 0 -4 0 -4 -8 4 8 0 -4 4 0 -8 -8 -8 8 8 0 -8 8 4 8 0 8 8 0 8 0 0 0 8 8 -8 0 0 -8 -8 0 4 8 0 -8 8 0 8 0 8 -8 -8 0 8 -16 -4 0 -4 0 4 -4 0 4 -8 0 8 -16 0 -4 -8 0 8 0 0 -8 0 -4 -4 0 8 8 -8 0 0 0 0 0 -8 8 8 -8 0 -4 -8 8 -8 8 0 -2 0 0 -4 12 [...]
+1 -5 0 -6 0 12 0 0 4 -12 0 12 6 -12 0 12 4 -12 0 6 -3 0 0 -12 0 0 0 -24 -24 0 -6 0 0 0 12 0 6 24 0 12 -12 0 -12 -12 -24 -12 0 0 0 0 0 12 -6 0 6 -24 0 -3 12 6 0 12 0 0 0 0 12 6 -12 -12 0 0 12 24 0 0 0 24 0 -12 12 24 -24 -12 -4 0 0 12 0 0 12 0 0 0 6 0 -24 0 4 12 24 -12 0 -12 -24 24 0 -24 0 24 0 0 0 0 0 -12 12 0 -12 12 24 -12 0 6 0 -12 0 12 0 0 12 0 24 0 -24 0 0 12 0 0 0 0 0 12 -24 -24 0 0 0 -12 0 0 -24 0 24 0 24 0 -24 0 -12 -12 12 0 0 0 -12 0 0 -12 24 0 0 0 -12 4 12 -4 -6 0 12 0 0 12 12 0  [...]
+1 -5 -4 4 2 4 8 4 0 -8 -2 0 4 0 -8 12 0 8 -8 -4 -1 0 8 0 0 0 -4 -8 -16 8 -2 0 0 -4 -8 0 2 8 0 12 -4 -16 -8 -8 0 0 0 0 8 -8 8 0 2 0 -2 8 -8 1 -12 8 -8 8 4 0 8 0 8 0 0 -8 -4 -8 0 -8 0 8 -8 0 16 4 0 0 8 0 0 0 8 4 4 0 0 -8 0 -8 -8 0 -8 0 0 -8 -8 8 16 0 8 0 0 0 -4 0 4 0 -4 -8 4 8 0 -4 4 0 8 8 -8 0 8 0 8 -8 4 8 0 8 -8 0 -8 0 16 0 8 8 -8 0 0 -8 8 0 -4 -8 -16 8 8 0 8 0 8 -8 8 -16 -8 0 -4 0 -4 0 4 -4 0 4 -8 0 -8 0 0 -4 8 0 -8 0 8 -8 0 -4 4 0 -8 8 0 0 0 0 0 0 -8 8 8 -8 0 4 8 -8 -8 8 0 -2 0 0 12 -4 [...]
+1 -5 0 0 -2 8 0 0 8 -4 2 -8 4 -8 8 8 -4 4 4 -4 -1 0 -8 8 0 0 0 -8 -8 -4 -2 0 0 0 -8 0 2 8 0 0 -8 0 0 0 -8 0 0 0 -8 0 -4 0 2 0 -2 8 8 1 0 0 0 0 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 -8 4 8 0 8 0 8 8 0 0 4 0 0 -4 0 0 0 8 0 0 0 8 0 0 0 8 0 -8 0 0 -8 8 8 0 -8 0 4 4 8 0 0 0 4 0 0 0 0 8 0 0 4 0 4 0 0 0 -8 0 0 0 0 -8 0 0 0 0 0 0 0 0 8 0 0 8 -4 -8 0 -8 0 -8 0 0 8 0 -8 0 0 0 -4 -4 0 0 -4 0 0 0 -8 -4 0 0 0 0 0 0 8 0 4 0 -4 0 -8 0 -8 0 8 0 0 0 0 0 -8 -8 0 0 4 8 0 0 -2 0 0 0 -8 4 -4 0 0 0 0 0 0 0 8 -8 2 0 0  [...]
+1 -7 8 0 2 8 -16 0 8 0 2 8 -8 -8 0 0 0 0 -8 -8 3 16 0 -8 0 -4 0 16 -16 -8 2 8 4 0 -8 0 2 0 0 -8 -8 0 -8 16 16 0 -4 16 16 0 -8 -16 2 8 2 16 16 3 -8 0 0 16 0 0 0 0 0 4 0 0 0 -16 -8 0 0 0 -8 0 0 -8 0 16 0 -4 -4 8 0 8 -4 -32 -4 0 0 0 0 -16 -16 -16 -4 16 -16 16 0 0 0 16 0 16 0 0 0 8 4 0 8 -8 -8 -4 8 0 0 0 16 0 0 0 0 0 8 -16 -16 16 0 0 0 -16 0 -4 0 0 0 -16 0 -8 0 0 0 0 0 0 0 -16 -16 -16 -16 -16 0 0 0 0 8 -16 8 8 4 8 0 -4 0 -8 0 0 8 8 16 -4 16 -4 0 16 0 -4 0 0 0 16 0 16 -4 16 -32 8 0 0 -8 16 0  [...]
+1 -7 4 0 6 8 0 0 8 0 6 8 -8 0 -32 4 0 0 8 -8 3 16 -32 0 -16 12 0 16 -16 8 -2 -8 -4 0 0 8 -2 -16 8 8 8 -16 0 -16 0 16 12 16 0 0 8 -16 -2 -8 -2 16 0 3 8 8 32 -16 0 -16 32 8 0 4 0 16 0 0 0 -16 8 -32 8 0 -16 8 16 0 -16 -4 4 8 -24 8 -4 16 -4 -24 -16 32 8 16 16 16 4 -16 16 -16 -16 16 -16 0 -16 0 0 0 0 8 12 -32 4 0 0 -4 8 16 -16 16 0 8 32 0 0 0 4 0 -16 0 -16 -16 -16 -16 -16 -4 32 -24 32 -16 -16 0 -16 0 0 0 -16 0 -32 16 16 16 16 0 -16 -16 -16 -16 8 -16 8 8 12 4 16 -4 -24 0 -16 -16 8 4 -16 4 -16  [...]
+1 -7 8 6 4 0 -8 4 4 12 -4 12 -10 -4 -8 -12 -4 -12 -8 10 1 16 8 4 -16 4 -4 16 -8 -8 2 8 4 -12 4 8 2 -16 8 -8 -8 -16 -12 4 8 4 -4 -16 8 8 8 4 -2 -8 -2 -16 8 -1 8 2 8 4 4 16 8 -8 4 -2 4 4 4 -24 -12 16 -8 -24 8 8 16 8 4 8 16 0 0 -16 0 16 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 -4 -8 -4 16 0 24 0 12 12 0 -16 -4 0 -4 -8 -2 -8 -4 -8 -4 0 24 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 12 0 -8 -4 -8 0 -4 24 0 0 0 0 24 0 0 0 0 16 -4 -16 -16 0 0 -4 0 0 12 0 0 16 0 -4 0 -4 0 -2 -8 -4 0 -4 -4 -4 -8 -2 -8 0  [...]
+1 -7 4 4 2 8 -8 0 8 -4 2 0 0 0 -8 -4 -4 -4 4 0 -1 -8 -8 0 8 0 0 0 8 4 2 0 0 -8 -8 0 -2 0 0 0 0 -8 8 0 0 8 0 -8 -8 0 4 8 2 0 -2 0 8 -1 0 4 -8 0 8 8 8 0 -4 -4 4 0 0 8 0 0 0 8 4 8 -8 0 -8 0 16 0 0 -4 8 -8 -4 0 0 -8 8 8 4 -8 0 -8 0 0 0 0 -8 8 0 0 8 0 8 8 0 -4 -4 8 -4 8 0 4 -8 -8 0 0 -8 -4 -8 4 0 -4 -4 8 8 8 -16 0 -16 0 -8 0 8 -8 -8 0 0 8 -16 8 0 0 -8 -4 8 -8 0 -8 0 8 -16 -8 0 8 -8 8 -8 -4 -4 -4 -8 4 8 0 0 8 -4 -4 0 0 0 0 4 8 8 -4 8 4 0 -8 -4 0 0 0 0 0 8 -8 8 0 8 0 0 -4 8 8 8 2 -8 0 0 0 4 4 0 [...]
+1 -7 4 0 2 12 -8 -4 8 -8 2 8 0 -8 -8 4 0 -8 0 0 -1 0 -8 -8 0 0 -4 -8 -16 0 -2 0 0 -4 0 0 2 8 0 4 4 16 0 0 0 -8 0 0 8 8 0 8 -2 0 2 -8 -8 -1 4 -4 8 0 -4 0 -8 0 8 4 0 0 4 8 8 8 0 8 0 0 16 4 8 0 -8 0 0 -8 -8 -4 4 0 0 8 -16 -8 -4 0 -8 0 0 0 -8 0 0 -8 -8 0 -16 0 -4 0 4 -8 -4 8 -4 0 8 -4 -4 8 -8 0 8 4 8 0 8 8 -4 8 8 -8 8 0 8 0 0 0 -8 8 8 0 0 0 8 0 4 8 0 8 8 0 -8 0 -8 8 8 0 -8 -16 -4 8 -4 -8 -4 -4 8 -4 -8 8 -8 -16 -8 -4 0 0 0 0 -4 -8 -8 4 -4 0 0 8 4 0 0 0 0 0 -8 8 0 -8 0 4 8 8 8 8 8 -2 8 8 4 4 0 [...]
+1 -7 4 10 0 4 0 0 -4 0 0 -4 -2 -4 8 -8 0 0 -4 2 1 0 -8 4 0 -4 0 0 0 -4 2 0 -4 0 4 0 2 0 -8 -4 -4 0 -4 4 0 -4 4 0 8 0 4 -4 -2 0 -2 0 8 -1 4 2 0 4 0 0 0 8 0 6 0 4 0 16 -4 0 0 8 4 0 0 4 -4 0 0 0 0 4 0 -4 0 0 0 0 -8 0 -2 0 0 0 0 -4 0 -4 8 4 8 0 8 0 0 0 0 -4 0 -8 4 4 4 0 4 4 -8 -4 -8 -2 0 0 0 0 -4 -16 4 -8 8 0 -8 0 -8 0 0 0 0 0 0 4 8 0 0 0 8 0 -8 0 0 0 0 -16 -8 -8 -8 -8 -4 4 4 4 0 -4 4 0 0 4 8 8 -4 4 -4 0 -4 0 -2 -8 4 0 0 0 -4 -8 -2 0 0 0 0 0 0 0 -4 0 0 0 0 0 8 16 -4 -2 -4 -4 4 4 4 4 4 4 4 8  [...]
+1 -7 0 10 4 4 8 0 -4 0 -4 -4 -2 4 -16 4 0 0 4 2 1 0 16 -4 -8 4 0 0 -16 4 -2 -8 -4 0 -4 0 -2 -8 0 4 4 -8 4 -4 0 4 -4 0 0 0 -4 -4 2 8 2 0 0 -1 -4 2 8 -4 0 8 8 0 0 6 0 4 0 8 4 8 0 0 -4 0 8 -4 4 0 8 0 0 4 0 -4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 -4 0 0 0 -4 -4 0 4 -4 0 -4 0 -2 -8 0 0 0 0 -8 4 0 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 -4 4 4 4 0 0 -4 0 0 -4 0 0 -4 0 4 0 4 0 -2 0 -4 0 0 0 -4 0 -2 0 0 0 0 8 8 8 4 0 0 0 0 0 0 8 -4 2 4 4 -4 -4 -4 -4 -4 -4 -4 0 4 8 [...]
+1 -7 4 6 0 8 -8 -4 4 -4 0 -4 -2 -4 8 0 -4 4 -8 2 1 0 -8 4 0 -4 4 0 -8 -8 -2 0 4 -4 -4 -8 -2 0 0 0 0 16 12 4 8 4 4 0 8 8 8 -4 2 0 2 0 -8 -1 0 -6 8 4 -4 0 -8 0 4 -2 4 -4 -4 -8 4 0 8 8 8 -8 -16 0 4 8 16 0 0 0 0 -8 0 0 0 0 0 8 6 0 0 0 0 -4 0 -4 -16 -4 0 -8 0 -8 4 8 4 0 0 -8 -4 -12 -4 0 8 -4 0 4 -8 -2 -8 -4 -8 -4 4 8 4 8 -16 0 16 0 16 0 8 0 -8 0 0 -12 -16 8 4 -8 -16 -4 -8 0 0 0 0 8 16 16 0 0 -8 4 8 0 0 4 -4 0 0 -4 0 0 0 -4 -4 0 -4 0 6 8 -4 0 4 -4 4 -8 -2 -8 0 -8 0 0 -8 8 12 0 -8 -4 8 4 8 -8 - [...]
+1 -7 0 10 0 8 0 -4 -4 0 0 -12 6 -4 0 4 0 0 4 -6 -3 -8 0 4 -8 0 4 -16 0 -4 -2 0 0 4 -4 0 2 0 0 -8 8 8 -4 12 8 -4 0 8 0 8 -4 12 2 0 -2 16 0 3 8 -2 0 -12 4 8 0 0 0 -2 0 4 12 0 4 0 0 0 4 0 -8 -8 4 -8 0 4 4 -4 0 8 0 0 -4 0 8 0 2 -8 16 8 -4 12 -16 -12 8 4 0 8 -8 -8 -4 0 -12 4 0 0 0 4 -4 0 -8 -4 0 -4 0 2 0 0 -8 0 0 0 -12 0 0 0 0 0 -8 4 0 0 0 0 0 4 0 0 -12 -8 8 0 0 8 -16 -8 16 0 0 -8 0 8 8 -12 -8 -4 0 0 -4 0 0 -4 0 -8 4 0 12 4 -12 -4 2 0 4 0 -4 0 -4 0 2 -8 -4 8 0 0 0 0 -4 16 0 12 8 0 0 0 12 2 4  [...]
+1 -7 0 6 0 12 0 0 4 -12 0 -12 6 -12 0 12 -4 12 0 -6 -3 0 0 12 0 0 0 -24 -24 0 -6 0 0 0 -12 0 6 24 0 12 -12 0 -12 -12 -24 -12 0 0 0 0 0 12 6 0 -6 24 0 3 -12 6 0 12 0 0 0 0 12 6 -12 -12 0 0 12 -24 0 0 0 24 0 12 12 24 24 -12 -4 0 0 12 0 0 12 0 0 0 -6 0 -24 0 4 -12 24 12 0 12 -24 -24 0 24 0 -24 0 0 0 0 0 12 -12 0 -12 -12 24 12 0 -6 0 12 0 -12 0 0 -12 0 24 0 -24 0 0 -12 0 0 0 0 0 12 24 -24 0 0 0 -12 0 0 24 0 -24 0 -24 0 24 0 12 -12 -12 0 0 0 -12 0 0 -12 -24 0 0 0 -12 -4 12 4 -6 0 12 0 0 12 12 [...]
+1 -9 8 6 4 16 -24 -4 12 -12 4 4 -6 -12 -24 -4 -4 -12 8 -6 1 16 -24 -12 16 4 -4 16 -8 8 2 8 4 -12 -12 8 2 16 8 8 8 16 -4 -4 -8 -4 4 16 -8 -8 8 -4 2 8 2 16 -8 1 8 -2 -8 -4 -4 16 -8 8 -4 2 -4 -4 -4 -8 -4 16 8 -8 8 -8 16 8 -4 -8 16 0 0 0 0 0 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 -4 -8 -4 0 0 -8 0 -4 -4 0 0 -4 0 -4 -8 -2 -8 -4 -8 -4 0 -8 -4 -8 0 0 0 0 0 0 8 0 8 0 0 4 0 8 4 8 0 4 8 0 0 0 0 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 8 4 0 4 4 4 8 2 8 0 8 0 -8 8 8 4 -16 8 4 8 4 8 8 [...]
+1 -9 8 16 2 8 -16 0 -8 0 -2 -8 -8 -8 0 -16 0 0 -8 8 3 16 0 8 0 -4 0 16 16 -8 2 8 4 0 8 0 2 0 0 -8 -8 0 -8 16 16 0 4 -16 16 0 8 -16 -2 -8 -2 -16 16 -3 8 0 0 16 0 0 0 0 0 -4 0 0 0 -16 -8 0 0 0 8 0 0 8 0 16 0 -4 -4 8 0 8 -4 -32 -4 0 0 0 0 -16 -16 -16 -4 -16 -16 -16 0 0 0 -16 0 -16 0 0 0 8 4 0 8 8 8 -4 8 0 0 0 -16 0 0 0 0 0 8 16 16 -16 0 0 0 -16 0 4 0 0 0 16 0 -8 0 0 0 0 0 0 0 16 16 16 16 -16 0 0 0 0 -8 -16 -8 -8 -4 -8 0 4 0 -8 0 0 -8 -8 16 4 16 4 0 16 0 4 0 0 0 16 0 16 4 16 32 8 0 0 8 16 0  [...]
+1 -9 4 16 6 8 0 0 -8 0 -6 -8 -8 0 -32 -4 0 0 8 8 3 16 32 0 -16 12 0 16 -16 8 -2 -8 -4 0 0 8 -2 -16 8 8 8 -16 0 -16 0 16 -12 -16 0 0 -8 -16 2 8 2 -16 0 -3 -8 8 32 -16 0 16 32 -8 0 12 0 16 0 0 0 16 -8 -32 -8 0 16 -8 16 0 16 -4 4 8 -24 8 -4 16 -4 -24 -16 -32 -8 16 16 16 4 16 16 16 -16 -16 -16 0 -16 0 0 0 0 8 12 32 4 0 0 -4 8 -16 -16 -16 0 -8 -32 0 0 0 4 0 16 0 -16 -16 -16 -16 -16 4 32 24 32 16 16 0 16 0 0 0 16 0 -32 -16 -16 -16 -16 0 16 16 16 16 -8 -16 -8 -8 -12 -4 16 4 24 0 16 16 -8 -4 -16 [...]
+1 -9 4 16 2 12 -8 -4 -8 -8 -2 -16 0 -8 -8 -4 0 8 0 0 -1 0 8 8 0 0 4 -8 0 0 -2 0 0 4 0 0 2 8 0 4 4 16 0 0 0 -8 0 0 8 8 0 8 2 0 -2 8 -8 1 -4 -4 8 0 -4 0 -8 0 8 4 0 0 4 8 8 -8 0 8 0 0 -16 -4 8 0 8 0 0 -8 -8 -4 4 0 0 8 -16 8 4 0 -8 0 0 0 -8 0 0 8 -8 0 -16 0 4 0 -4 -8 -4 -8 -4 0 -8 -4 -4 -8 -8 0 -8 -4 -8 0 -8 -8 -4 -8 -8 8 8 0 8 0 0 0 -8 -8 8 0 0 0 -8 0 4 8 0 8 8 0 8 0 8 8 -8 0 8 16 4 8 4 8 4 4 8 4 8 8 8 16 8 4 0 0 0 0 -4 -8 -8 -4 -4 0 0 8 4 0 0 0 0 0 8 -8 0 -8 0 -4 -8 -8 -8 -8 -8 -2 -8 -8 4  [...]
+1 -11 12 12 6 24 -48 -8 16 -24 6 0 -12 -24 -48 -12 -8 -24 24 -12 3 48 -48 -24 48 12 -8 48 0 24 6 24 12 -24 -24 24 6 48 24 24 24 48 -24 -24 -48 -24 12 48 -48 -48 24 -24 6 24 6 48 -48 3 24 -12 -48 -24 -24 48 -48 24 -24 0 -24 -24 -24 -48 -24 48 24 -48 24 -48 48 24 -24 -48 48 12 4 24 24 24 12 48 12 24 48 -48 -12 48 48 48 4 -24 48 -24 48 -24 48 -48 48 -48 -24 -48 -24 24 12 -48 12 -24 -24 12 24 -24 48 -24 -48 -12 -48 -24 -48 -24 12 -48 -24 -48 48 16 48 48 48 12 -48 24 -48 48 16 -24 48 -48 -24  [...]
+end
diff --git a/demos/ppl_lcdd/examples/mit31-20.ine b/demos/ppl_lcdd/examples/mit31-20.ine
new file mode 100644
index 0000000..d38798a
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit31-20.ine
@@ -0,0 +1,34 @@
+begin
+31 20 integer
+1 -6 12 3 0 0 0 -12 -8 0 0 12 3 0 0 0 -6 0 1 0
+1 2 -1 2 -2 0 -4 4 -4 -2 0 2 0 1 -2 2 0 0 0 1
+1 0 -3 0 0 2 0 0 -2 0 4 0 0 -1 0 -2 0 2 0 -1
+1 0 1 -2 -2 0 0 0 0 2 0 2 0 1 -2 0 0 0 0 -1
+1 0 -3 2 -2 0 0 0 0 2 0 -2 0 1 2 0 0 0 0 -1
+1 -2 -1 0 0 2 0 0 2 0 0 0 0 -1 0 0 0 -2 0 1
+1 -2 -5 2 2 -4 4 4 0 2 -8 2 0 1 2 2 0 -4 0 1
+1 -2 3 -2 -2 0 4 4 -4 -2 0 -2 0 1 2 -2 0 0 0 1
+1 -2 -1 2 -2 0 4 -4 4 -2 0 2 0 1 -2 -2 0 0 0 1
+1 -4 1 2 2 -4 0 0 4 -2 0 -2 0 1 -2 0 0 4 0 -1
+1 -4 5 0 0 2 0 0 -2 0 -4 0 0 -1 0 2 0 2 0 -1
+1 -6 11 2 2 -4 -4 -4 -8 2 8 2 0 1 2 -2 0 -4 0 1
+1 6 12 3 0 0 0 12 8 0 0 12 3 0 0 0 6 0 1 0
+1 4 4 1 0 0 0 0 0 0 0 -4 -1 0 0 0 -4 0 -1 0
+1 2 0 -1 0 0 0 -4 0 0 0 0 -1 0 0 0 2 0 1 0
+1 2 -4 3 0 0 0 4 -8 0 0 -4 3 0 0 0 2 0 1 0
+1 0 -4 1 0 0 0 0 0 0 0 4 -1 0 0 0 0 0 -1 0
+1 0 0 -3 0 0 0 0 0 0 0 0 3 0 0 0 0 0 -1 0
+1 -2 -4 3 0 0 0 -4 8 0 0 -4 3 0 0 0 -2 0 1 0
+1 -2 0 -1 0 0 0 4 0 0 0 0 -1 0 0 0 -2 0 1 0
+1 -4 4 1 0 0 0 0 0 0 0 -4 -1 0 0 0 4 0 -1 0
+1 6 11 2 2 4 4 4 8 2 8 2 0 1 2 2 0 4 0 1
+1 4 5 0 0 -2 0 0 2 0 -4 0 0 -1 0 -2 0 -2 0 -1
+1 4 1 2 2 4 0 0 -4 -2 0 -2 0 1 -2 0 0 -4 0 -1
+1 2 3 -2 -2 0 -4 -4 4 -2 0 -2 0 1 2 2 0 0 0 1
+1 2 -1 0 0 -2 0 0 -2 0 0 0 0 -1 0 0 0 2 0 1
+1 2 -1 -2 2 0 4 -4 -4 2 0 -2 0 1 -2 2 0 0 0 1
+1 2 -5 2 2 4 -4 -4 0 2 -8 2 0 1 2 -2 0 4 0 1
+1 0 -3 -2 2 0 0 0 0 -2 0 2 0 1 2 0 0 0 0 -1
+1 0 -3 0 0 -2 0 0 2 0 4 0 0 -1 0 2 0 -2 0 -1
+1 -2 -1 -2 2 0 -4 4 4 2 0 -2 0 1 -2 -2 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/mit41-16.ine b/demos/ppl_lcdd/examples/mit41-16.ine
new file mode 100644
index 0000000..bb26798
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit41-16.ine
@@ -0,0 +1,44 @@
+begin
+41 16 rational
+1 -1 0 0 -1 0 1 0 0 0 0 0 0 0 0 0
+1 -3 2 0 1 0 -1 0 0 0 0 0 0 0 0 0
+1 1 0 -1 0 0 0 0 -1 0 0 0 0 0 0 0
+1 -1 0 -1 0 0 0 0 1 0 0 0 0 0 0 0
+1 -1 -2 1 0 0 0 0 1 0 0 0 0 0 0 0
+1 -3 2 1 0 0 0 0 -1 0 0 0 0 0 0 0
+1 1 -1 1 -1 0 0 0 0 -1 0 0 0 0 0 0
+1 1 -1 -1 1 0 0 0 0 -1 0 0 0 0 0 0
+1 1 1 -1 -1 0 0 0 0 -1 0 0 0 0 0 0
+1 -1 1 -1 -1 0 0 0 0 1 0 0 0 0 0 0
+1 -1 -1 -1 1 0 0 0 0 1 0 0 0 0 0 0
+1 -1 -1 1 -1 0 0 0 0 1 0 0 0 0 0 0
+1 -3 1 1 1 0 0 0 0 -1 0 0 0 0 0 0
+1 1 -1 0 0 0 0 0 0 0 -1 0 0 0 0 0
+1 1 1 0 -2 0 0 0 0 0 -1 0 0 0 0 0
+1 -1 -1 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 -1 1 0 -2 0 0 0 0 0 1 0 0 0 0 0
+1 -3 1 0 2 0 0 0 0 0 -1 0 0 0 0 0
+1 0 0 0 -2 0 0 0 0 0 0 0 1 0 0 0
+1 -2 0 0 0 2 0 0 0 0 0 0 -1 0 0 0
+1 -4 0 0 6 -4 0 0 0 0 0 0 1 0 0 0
+1 0 0 -3 0 0 0 0 0 0 0 0 0 3 0 -1
+1 -2 0 3 -4 8 0 -4 0 0 0 -4 0 3 -2 1
+1 -2 0 -1 0 0 0 4 0 0 0 0 0 -1 -2 1
+1 -4 0 1 4 0 0 0 0 0 0 -4 0 -1 4 -1
+1 -6 0 3 12 -8 0 -12 0 0 0 12 0 3 -6 1
+1 3 2 0 1 0 1 0 0 0 0 0 0 0 0 0
+1 1 0 0 -1 0 -1 0 0 0 0 0 0 0 0 0
+1 1 -2 0 1 0 -1 0 0 0 0 0 0 0 0 0
+1 -1 -2 0 1 0 1 0 0 0 0 0 0 0 0 0
+1 3 2 1 0 0 0 0 1 0 0 0 0 0 0 0
+1 1 -2 1 0 0 0 0 -1 0 0 0 0 0 0 0
+1 3 1 1 1 0 0 0 0 1 0 0 0 0 0 0
+1 3 1 0 2 0 0 0 0 0 1 0 0 0 0 0
+1 4 0 0 6 4 0 0 0 0 0 0 1 0 0 0
+1 2 0 0 0 -2 0 0 0 0 0 0 -1 0 0 0
+1 6 0 3 12 8 0 12 0 0 0 12 0 3 6 1
+1 4 0 1 4 0 0 0 0 0 0 -4 0 -1 -4 -1
+1 2 0 -1 0 0 0 -4 0 0 0 0 0 -1 2 1
+1 2 0 3 -4 -8 0 4 0 0 0 -4 0 3 2 1
+1 0 0 1 -4 0 0 0 0 0 0 4 0 -1 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/mit708-9.ine b/demos/ppl_lcdd/examples/mit708-9.ine
new file mode 100644
index 0000000..a30a095
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit708-9.ine
@@ -0,0 +1,711 @@
+begin
+708 9 rational
+72 0 0 -4 -4 -2 0 0 0
+216 -2 -2 -10 -12 -6 0 0 0
+192 -4 -2 -8 -8 -8 0 0 0
+288 -12 6 8 -16 -8 0 0 0
+96 -4 2 0 -4 -4 0 0 0
+144 -5 1 -4 -6 -6 0 0 0
+288 -8 -2 -10 -12 -12 0 0 0
+96 -4 2 -4 -2 -4 0 0 0
+240 -7 -1 -10 -8 -10 0 0 0
+288 -8 -2 -12 -8 -12 0 0 0
+288 -8 -2 -8 -16 -8 0 0 0
+96 -4 2 -8 0 0 0 0 0
+0 0 6 -8 4 8 0 0 0
+0 4 6 -8 0 8 0 0 0
+24 2 2 -4 -2 2 0 0 0
+864 -24 -6 -40 -16 -32 0 0 0
+24 0 0 -2 -2 2 0 0 0
+0 4 10 -16 0 24 0 0 0
+0 1 1 -4 0 12 0 0 0
+0 0 6 -16 8 40 0 0 0
+96 -4 2 -16 16 32 0 0 0
+288 -8 -2 -16 0 0 0 0 0
+96 -4 2 8 -8 8 0 0 0
+288 -8 -2 8 -24 24 0 0 0
+0 0 2 -8 8 24 0 0 0
+96 -1 -1 -4 -8 8 0 0 0
+576 -12 -6 -16 -40 16 0 0 0
+192 -4 -2 0 -16 16 0 0 0
+576 -8 -6 -24 -32 -16 0 0 0
+576 -12 -6 -20 -32 -16 0 0 0
+960 -16 -10 -40 -56 -16 0 0 0
+160 0 0 -7 -7 -6 -1 0 -1
+480 -4 -4 -21 -21 -18 -1 0 -3
+192 -4 -4 -12 -4 -8 4 2 -4
+640 -16 -8 -28 -28 -24 4 2 -4
+640 -8 -6 -28 -28 -24 0 0 -4
+192 -8 0 -8 -8 -8 4 2 0
+384 -12 -4 -16 -16 -16 4 2 0
+960 -20 -12 -42 -42 -36 4 2 -6
+240 -9 -1 -11 -9 -10 3 2 -1
+0 2 2 4 0 0 -4 -2 0
+640 -22 -4 -24 -28 -24 8 4 -4
+1920 -60 -20 -76 -84 -72 20 10 -12
+1920 -32 -22 -84 -84 -72 4 2 -12
+960 -28 -10 -44 -36 -40 8 4 -4
+1152 -36 -12 -52 -44 -48 12 6 -4
+720 -23 -7 -33 -27 -30 7 4 -3
+1920 -48 -24 -88 -72 -80 12 6 -8
+3456 -96 -40 -160 -128 -144 28 14 -16
+576 -15 -7 -26 -20 -24 4 2 -4
+384 -12 -4 -20 -12 -16 4 2 0
+336 -11 -3 -17 -11 -14 3 2 -1
+192 -8 0 -12 -4 -8 4 2 0
+0 0 0 -4 4 0 4 2 0
+0 0 2 -8 8 0 8 4 -2
+192 -12 12 -28 12 -8 20 10 -4
+192 -12 12 -20 4 -8 12 6 -2
+1920 -48 -24 -92 -60 -80 12 6 -4
+576 -15 -7 -28 -18 -24 4 2 -2
+1536 -42 -18 -76 -40 -64 12 6 -8
+384 -12 -4 -20 4 -16 4 2 -4
+1920 -60 -20 -102 18 -76 14 10 -18
+1920 -60 -20 -102 -46 -76 14 10 -2
+672 -22 -6 -37 -17 -26 5 4 -1
+640 -22 -4 -36 -16 -24 4 4 0
+960 -40 0 -64 -16 -32 8 10 0
+64 -4 4 -8 0 0 0 2 0
+0 0 8 -6 2 4 -2 2 0
+0 8 18 -8 0 8 -8 2 0
+64 36 60 -28 -4 24 -28 6 -4
+192 28 36 -20 -12 8 -20 2 -4
+96 4 4 -5 -5 -2 -3 0 -1
+64 4 6 -4 -4 0 -4 0 0
+96 0 0 -5 -5 -2 -1 0 -1
+192 -6 0 -8 12 -8 0 0 -4
+960 -30 -8 -48 -20 -40 8 4 -4
+960 -32 -8 -52 -20 -40 12 6 -4
+960 -32 -8 -52 44 -40 12 6 -20
+960 -30 -8 -48 12 -40 8 4 -12
+576 -16 -6 -28 -12 -24 4 2 -4
+208 -8 0 -8 -8 -8 4 2 -2
+160 -7 1 -5 -7 -6 3 2 -1
+192 -12 12 0 -8 -8 8 6 0
+160 -9 7 -1 -7 -6 5 4 -1
+640 -20 -4 -20 -28 -24 4 2 -4
+96 -5 3 -2 -4 -4 2 2 0
+480 -18 -2 -17 -21 -18 7 4 -3
+528 -19 -3 -20 -22 -20 8 4 -4
+1152 -36 -4 -32 -40 -48 0 2 -8
+1152 -36 -12 -48 -40 -48 8 6 -8
+192 -8 0 -4 -4 -8 4 2 -4
+192 -6 0 0 -4 -8 0 0 -4
+384 -12 -4 -8 -8 -16 4 2 -8
+1920 -48 -24 -48 -40 -80 12 6 -40
+384 -16 2 -20 -12 -16 4 4 0
+576 -24 0 -32 -16 -24 8 6 0
+432 -17 -1 -23 -13 -18 5 4 -1
+576 -28 12 -36 -12 -24 12 10 -4
+960 -52 36 -92 12 -40 52 26 -12
+0 0 4 -14 10 4 6 6 -2
+2688 -72 -32 -120 -104 -112 16 10 -8
+0 0 8 -20 12 56 -12 2 -4
+64 -4 4 -16 8 24 -4 2 0
+192 -8 0 -16 0 0 0 2 0
+64 8 16 -20 -4 24 -12 2 -4
+0 2 4 -4 0 8 -4 0 0
+288 -13 3 -12 -10 -12 6 4 -2
+336 -14 2 -15 -11 -14 7 4 -3
+96 3 1 -8 -6 4 0 0 -2
+192 12 0 -20 -12 8 4 2 -4
+0 4 8 -6 2 4 -2 2 -2
+192 -12 12 -28 28 -8 20 10 -12
+0 0 0 -4 16 0 4 2 -6
+0 0 0 -4 40 0 4 2 -12
+192 -8 0 -12 44 -8 4 2 -12
+0 0 2 0 32 0 0 0 -8
+192 -12 12 -20 300 -8 12 6 -76
+960 -40 0 -64 208 -32 8 10 -56
+2112 -72 -16 -120 120 -80 16 14 -48
+512 -16 -4 -26 6 -20 2 2 -6
+512 -16 -4 -26 -10 -20 2 2 -2
+448 -16 0 -24 -8 -16 0 2 0
+448 24 8 -68 -20 56 12 6 -20
+192 8 2 -24 -8 16 4 2 -8
+192 16 0 -36 -4 24 12 6 -12
+448 -13 -5 -23 -13 -18 3 2 -1
+0 2 -2 -4 4 0 4 2 -2
+0 0 0 -22 22 4 14 10 0
+0 0 0 -22 82 4 14 10 -30
+0 0 4 -14 34 4 6 6 -14
+480 -21 3 -20 -18 -20 8 6 -2
+480 -19 1 -16 -18 -20 4 4 -2
+1344 -52 0 -44 -52 -56 12 10 -4
+576 -22 0 -12 -24 -24 4 4 0
+768 -28 -4 -24 -32 -32 8 6 0
+768 -28 -4 40 -32 -32 -8 6 0
+576 -22 0 20 -24 -24 -4 4 0
+320 -12 0 10 -14 -12 -2 2 -2
+160 -7 1 3 -7 -6 1 2 -1
+0 2 2 -12 8 16 4 2 -4
+0 22 14 -52 16 80 12 6 -16
+192 32 16 -68 -4 88 12 6 -20
+128 18 10 -36 -8 48 4 2 -8
+64 8 8 -20 -4 24 -4 2 -4
+0 4 2 -4 4 8 0 0 -4
+0 4 8 -14 2 20 -4 2 -2
+0 1 7 -11 3 14 -3 2 -1
+0 0 8 -12 4 16 -4 2 0
+0 4 12 -20 4 32 -8 2 0
+0 0 24 -44 20 64 -16 6 0
+0 0 4 -10 6 12 -2 2 -2
+0 14 22 -44 8 64 -12 6 -8
+0 6 10 -18 2 28 -6 2 -2
+192 28 36 -52 -12 72 -36 2 -12
+96 3 3 -8 -6 4 -4 0 -2
+0 0 12 -10 6 12 -6 2 -2
+48 0 0 -3 -3 2 -1 0 -1
+192 16 24 -44 -12 72 -28 2 -12
+0 4 12 -14 2 20 -8 2 -2
+0 1 9 -11 3 14 -5 2 -1
+192 32 40 -68 -4 88 -36 6 -20
+16 1 1 -3 -1 6 -1 0 -1
+64 4 6 -12 -4 24 -8 0 -4
+0 4 12 -20 4 40 -12 2 -4
+0 0 10 -16 8 24 -8 2 0
+192 -12 12 -40 16 32 -8 6 0
+0 0 24 -34 14 44 -14 6 -2
+64 -4 4 -16 8 16 0 2 0
+0 0 4 -14 10 20 2 2 -2
+0 0 2 -2 2 4 -2 0 0
+0 0 24 -44 20 72 -20 6 -4
+0 6 10 -16 4 24 -8 2 -4
+0 1 1 -1 1 2 -1 0 -1
+0 6 18 -16 4 24 -12 2 -4
+384 0 -2 -20 -20 -8 0 0 -4
+384 -12 -4 -12 -20 -8 4 2 -4
+640 -16 -8 -20 -36 -8 4 2 -4
+1280 -6 -14 -60 -80 0 -4 2 0
+1024 -2 -10 -52 -64 0 -4 2 0
+1024 -12 -12 -48 -56 -16 0 2 -8
+384 8 -4 -24 -24 0 0 2 0
+256 4 -4 -16 -16 0 2 2 0
+1024 0 -16 -56 -56 -16 8 6 -8
+960 0 -16 -52 -52 -16 12 6 -8
+6400 -96 -72 -280 -280 -240 8 6 -40
+960 -16 -12 -42 -42 -36 2 2 -6
+3840 -48 -40 -168 -168 -144 0 2 -24
+4032 -72 -48 -178 -178 -148 10 6 -26
+1152 -20 -14 -52 -52 -40 4 2 -8
+0 2 -2 0 0 0 2 2 0
+192 -6 0 12 -8 -8 -4 0 0
+192 -4 -4 -8 -8 -8 4 2 0
+6912 -176 -88 -288 -288 -288 40 26 0
+1920 -48 -24 -80 -80 -80 10 6 0
+576 -12 -10 -24 -24 -24 6 4 0
+5760 -168 -64 -264 -216 -240 48 26 -24
+960 -48 24 -36 -36 -40 20 18 -4
+960 -44 12 -28 -36 -40 12 14 -4
+192 -12 12 4 -4 -8 4 6 -4
+960 -56 48 -20 -36 -40 28 26 -4
+640 -20 0 -4 -28 -24 -2 0 -4
+576 -24 0 -28 -12 -24 4 6 -4
+0 0 0 4 8 0 -2 0 -4
+192 -6 0 -4 12 -8 -4 0 -6
+960 -30 0 -32 -12 -40 -8 0 -6
+960 -32 0 -36 -20 -40 -4 2 -4
+640 -20 0 -28 -4 -24 -4 0 -2
+0 0 20 -4 12 8 -12 0 -2
+16 0 0 -1 -1 6 -1 0 -1
+1536 -62 0 -80 -44 -64 16 14 0
+1344 -42 -12 -64 -44 -56 12 6 -4
+2880 -90 -28 -128 -108 -120 28 14 -12
+960 -30 0 -12 -32 -40 -6 0 -8
+768 -30 0 -24 -28 -32 6 6 -4
+576 -24 0 -20 -20 -24 8 6 -4
+576 -24 0 -15 -23 -22 9 6 -5
+192 -8 0 12 -4 -8 -4 2 -4
+0 0 0 -8 8 8 4 2 0
+192 -12 12 -76 76 88 20 10 -12
+0 0 6 -28 28 40 8 4 -6
+576 -15 -7 -29 -15 -22 3 2 -1
+448 -13 -5 -25 -7 -14 3 2 -1
+512 -14 -6 -26 -14 -20 4 2 -2
+448 -13 -5 -23 -5 -18 3 2 -3
+384 -6 -4 -16 -20 -8 0 0 -4
+0 8 8 -24 8 48 0 2 -8
+96 -1 -1 0 -6 36 -4 0 -6
+192 -4 -4 12 -12 72 -4 2 -12
+0 0 0 -6 6 4 2 2 0
+384 -12 -4 -22 -6 -12 2 2 0
+1216 -31 -15 -59 -37 -50 7 4 -3
+960 -20 -16 -42 -42 -36 10 6 -6
+2304 -72 -20 -112 -64 -96 16 10 -8
+1344 -42 -12 -64 -36 -56 8 6 -6
+1152 -36 -12 -56 -32 -48 8 6 -4
+384 -12 -4 -16 -8 -16 0 2 0
+192 -6 0 -4 0 -8 -4 0 0
+912 -26 -10 -43 -31 -38 5 4 -1
+960 -27 -11 -46 -32 -40 6 4 -2
+1344 -39 -15 -66 -44 -56 10 6 -4
+4224 -120 -48 -200 -152 -176 32 18 -16
+4992 -132 -60 -240 -168 -208 32 18 -16
+3456 -96 -40 -168 -104 -144 24 14 -16
+2688 -76 -28 -128 -72 -112 16 10 -16
+960 -29 -9 -46 -28 -40 6 4 -4
+0 2 -2 12 0 0 -4 2 0
+960 -20 -20 134 -42 -36 -38 10 -6
+1920 -60 -20 148 -84 -72 -36 10 -12
+1920 -68 -12 100 -84 -72 -20 14 -12
+320 -12 0 -6 -14 -12 2 2 -2
+960 -40 0 -26 -42 -36 18 10 -6
+576 -12 -8 -22 -30 -12 2 2 -6
+576 -12 -10 -8 -24 -24 -2 4 0
+2304 -56 -32 -80 -96 -96 8 10 0
+960 -20 -20 -38 -42 -36 20 10 -6
+192 -6 0 -4 -4 -8 -2 0 -2
+0 0 0 1 1 2 -1 0 -1
+192 -8 0 -4 28 -8 -4 2 -12
+192 -8 0 -4 60 -8 -4 2 -20
+0 0 2 -4 4 16 -4 0 0
+1792 -28 -20 -80 -88 -48 0 2 -16
+384 -3 -3 -18 -20 -8 -2 0 -4
+8064 -204 -100 -384 -264 -336 48 26 -24
+1920 -48 -24 -88 -56 -80 8 6 -8
+384 -12 -4 -16 8 -16 0 2 -8
+192 -12 12 -12 -4 -8 4 6 0
+192 -12 12 -12 12 -8 4 6 -8
+192 -12 12 4 60 -8 -12 6 -28
+0 0 0 -8 8 16 0 2 0
+192 -4 -2 -4 -4 -8 0 0 -4
+192 -4 -4 16 -12 0 -4 2 0
+768 -20 -12 40 -48 0 -8 6 0
+512 -14 -6 20 -32 0 -4 2 0
+1344 -60 12 -68 -44 -56 20 18 -4
+2112 -92 12 -116 -60 -88 28 26 -4
+960 -44 12 -52 -28 -40 12 14 0
+1920 -48 -24 -72 -56 -80 8 6 -24
+96 -5 3 -4 -2 -4 0 2 0
+0 0 2 -8 24 0 8 4 -10
+0 4 4 -16 8 112 -16 2 -8
+384 -12 -4 -24 0 0 0 2 0
+0 2 -2 -4 16 0 4 2 -8
+64 -4 4 -20 20 24 4 2 -2
+128 -6 2 -20 16 16 4 2 -2
+192 -8 0 -20 12 8 4 2 0
+96 -4 0 -14 10 8 4 2 -2
+448 -20 4 -76 60 56 20 10 -12
+192 -4 -2 -4 -12 8 0 0 -4
+384 -12 -4 0 -24 16 4 2 -8
+192 -8 0 4 -12 8 4 2 -4
+192 12 20 -20 -12 8 -12 2 -4
+192 12 4 -20 -12 8 -4 2 -4
+192 76 20 -84 -12 72 -4 18 -12
+64 20 12 -28 -4 24 -4 6 -4
+64 20 44 -28 -4 24 -20 6 -4
+0 12 36 -22 2 20 -14 6 -2
+0 4 10 -8 0 8 -4 2 0
+0 4 6 -8 0 8 -2 2 0
+0 4 0 -6 2 4 2 2 -2
+0 0 4 -6 2 4 0 2 0
+192 4 2 -12 -12 0 -4 0 0
+0 8 8 -16 0 24 -4 2 0
+64 20 4 -28 -4 24 4 6 -4
+0 20 4 -24 0 24 4 6 0
+0 8 0 -8 0 8 4 2 0
+0 5 -1 -6 2 4 4 2 -2
+64 24 0 -28 -4 24 12 6 -4
+96 46 -10 -42 -6 36 18 14 -6
+32 18 -6 -14 -2 12 10 6 -2
+192 112 -40 -84 -12 72 76 38 -12
+0 6 -2 -4 0 4 4 2 0
+0 0 0 0 16 0 0 2 -8
+192 -12 12 4 28 -8 4 6 -20
+960 -40 0 38 -42 -36 2 10 -6
+960 -40 8 -20 -36 -40 4 10 -4
+192 -8 2 0 -8 -8 0 2 0
+384 -18 6 -4 -16 -16 4 6 0
+192 -8 0 8 -8 -8 0 2 0
+320 -20 20 10 -14 -12 14 10 -2
+576 -8 -6 -20 -36 24 -4 0 -12
+96 -1 -1 -4 -6 4 0 0 -2
+192 16 -8 -20 -12 8 12 6 -4
+960 12 -20 -60 -52 -8 20 10 -12
+576 -12 -8 -26 -26 -20 4 2 -4
+1920 -48 -24 -68 -100 -40 12 6 -20
+640 -16 -8 -32 -16 -24 4 2 0
+384 -12 -4 -24 0 -8 4 2 0
+192 -8 0 -36 44 24 12 6 -12
+192 -8 0 -36 76 24 12 6 -20
+128 -6 2 -20 40 16 4 2 -8
+64 -4 4 -20 60 24 4 2 -12
+0 0 2 -4 20 8 0 0 -4
+624 -21 -5 -34 -16 -24 4 4 0
+400 -12 -4 -20 -12 -16 2 2 0
+192 1 -1 -10 -12 0 -2 0 0
+640 -16 -8 -8 -40 48 0 2 -16
+1920 -48 -24 -24 -120 80 8 6 -40
+96 8 8 -22 -6 36 -10 2 -6
+0 8 8 -16 0 32 -8 2 0
+2112 -72 -16 -120 -40 -80 16 14 -8
+3456 -100 -36 -160 -120 -144 24 14 -16
+1152 -36 -12 -59 -27 -46 7 6 -3
+1920 -48 -24 -96 -32 -64 8 6 0
+640 -16 -8 -32 0 0 0 2 0
+240 -2 -2 -11 -15 10 -3 0 -5
+960 -20 -12 -32 -56 16 0 2 -16
+1920 -48 -24 216 -80 -80 -64 6 0
+384 -12 -4 32 -16 -16 -8 2 0
+320 -10 0 18 -14 -12 -6 0 -2
+192 -6 0 20 -4 -8 -8 0 -4
+320 -10 0 -14 18 -12 -2 0 -6
+32 -1 1 -4 6 20 -4 0 -2
+192 -8 0 -16 32 0 0 2 -8
+192 -8 0 -20 28 8 4 2 -4
+0 0 0 -8 28 8 4 2 -8
+0 0 0 -6 34 4 2 2 -10
+384 -12 -4 -22 2 -12 2 2 -2
+192 -12 12 28 -12 8 12 6 -4
+576 -24 0 -8 -24 -16 8 6 -8
+192 -8 0 -2 -10 -4 4 2 -2
+768 0 -8 -40 -40 -16 0 2 -8
+3840 0 -56 -200 -200 -80 24 18 -40
+384 0 -6 -20 -20 -8 4 2 -4
+768 -12 -10 -36 -36 -24 4 2 -6
+192 -8 0 -20 28 88 -12 2 -4
+64 -4 4 -20 52 200 -28 2 -12
+0 0 8 -24 72 336 -48 2 -24
+0 1 1 -2 4 40 -6 0 -4
+0 0 2 -4 12 48 -8 0 -4
+1792 -4 -20 -88 -112 0 -8 6 0
+768 4 -12 -40 -48 0 0 6 0
+192 0 -4 -10 -10 -4 2 2 -2
+96 -5 3 1 -5 -2 3 2 -1
+96 6 -2 -10 -6 4 2 2 -2
+528 9 -11 -35 -29 -2 9 6 -7
+480 38 -18 -50 -30 20 22 14 -10
+640 12 -12 -40 -40 0 8 6 0
+48 -3 3 -14 8 24 -4 2 0
+384 2 -6 -20 -24 144 4 2 -24
+192 -4 -2 -6 -10 -4 0 0 -2
+1344 -24 -16 -56 -72 -16 0 2 -16
+2880 -60 -36 -112 -152 -56 12 6 -28
+1344 -24 -16 -56 -72 -24 4 2 -12
+384 -6 -6 -12 -24 0 0 2 0
+64 -4 4 4 -4 0 4 2 0
+384 -12 -4 48 -8 -16 -16 2 -8
+192 -6 0 12 -4 -8 -6 0 -4
+576 -18 0 -23 -3 -22 -5 0 -3
+0 0 0 -22 194 4 14 10 -58
+64 -4 4 -8 96 0 0 2 -24
+0 0 10 -2 154 4 -6 0 -38
+384 -12 -4 16 -24 80 0 2 -16
+64 -2 0 8 -4 24 0 0 -4
+384 -12 -4 48 -24 144 0 2 -24
+192 -8 0 4 -12 0 4 2 0
+384 -12 -4 16 -24 16 0 2 -8
+0 0 6 1 9 2 -5 0 -3
+0 0 2 4 16 0 -4 0 -6
+1344 -56 8 -60 -44 -56 12 14 -4
+192 -4 -2 32 -4 -8 -12 0 -4
+1920 -48 -24 296 -40 -80 -104 6 -40
+192 -4 -2 24 -8 -8 -8 0 0
+960 -20 -10 114 -42 -36 -38 0 -6
+640 -16 -8 68 -28 -24 -20 2 -4
+0 10 2 -12 0 160 -20 2 0
+0 3 -1 -6 4 40 -2 2 -4
+0 8 -8 -24 24 80 8 10 -8
+0 116 -36 -80 0 80 64 38 0
+0 136 -56 -120 40 80 104 58 -40
+0 14 -6 -12 4 8 12 6 -4
+0 10 -6 -12 8 16 12 6 -8
+192 8 -8 -20 -4 88 12 6 -20
+960 0 -16 -52 -52 248 12 6 -52
+0 0 2 -4 20 80 -12 0 -4
+64 -2 0 -4 8 24 -4 0 0
+1920 -40 -20 -68 -84 -72 -2 0 -12
+576 -12 -6 -19 -23 -22 -1 0 -5
+1920 -48 -24 -72 -72 -80 4 6 -8
+192 -4 -4 4 -4 -8 -4 2 -4
+1920 -68 -12 -60 -84 -72 20 14 -12
+0 1 1 -2 4 24 -4 0 -4
+0 0 2 -4 12 32 -6 0 -4
+64 -4 4 -20 52 72 -12 2 -12
+192 -8 0 -20 28 24 -4 2 -4
+448 -16 0 -36 28 56 -12 2 -4
+288 -8 -4 -2 -18 12 2 2 -6
+192 -4 -4 12 -12 8 -4 2 -4
+192 -12 12 14 -10 -4 10 6 -2
+192 -8 0 36 -12 72 4 2 -12
+1344 -24 -16 -36 -84 120 -12 2 -36
+960 -20 -12 -20 -60 72 -4 2 -24
+640 -16 -8 -20 -36 0 4 2 -8
+576 -12 -8 -18 -34 -4 2 2 -2
+192 -4 -4 -4 -12 0 4 2 0
+192 -4 -4 -6 -10 -4 4 2 -2
+192 -4 -4 36 -4 -8 -12 2 -4
+192 -4 -4 28 -8 -8 -8 2 0
+192 -4 -4 4 -8 -8 -2 2 0
+960 -20 -20 22 -42 -36 -10 10 -6
+384 -12 -4 16 -8 -16 -8 2 -8
+576 -12 -6 0 -16 -24 -10 0 -8
+1920 -48 -24 -24 -56 -80 -16 6 -24
+1920 -48 -24 72 -40 -80 -48 6 -40
+192 -4 -2 8 -4 -8 -6 0 -4
+576 -12 -6 -15 -23 -22 -3 0 -5
+0 0 0 -8 24 80 -8 2 -8
+64 -4 4 -20 20 72 -12 2 -4
+192 -8 0 -20 12 24 -4 2 0
+192 -6 0 -12 8 8 -4 0 0
+0 0 0 -8 24 16 0 2 -8
+0 0 2 -4 20 16 -4 0 -4
+0 0 2 -4 12 24 -4 0 -4
+96 -4 0 -14 10 20 -2 2 -2
+64 -4 4 -20 52 40 -4 2 -12
+192 -12 12 -60 188 152 -28 6 -36
+0 0 14 -18 6 20 -6 4 0
+576 -8 -8 -20 -36 24 -4 2 -12
+640 -16 -8 24 -40 48 -8 2 -16
+192 -6 0 8 -12 8 0 0 -4
+640 -20 -4 16 -40 48 0 2 -16
+960 -20 -12 -4 -60 168 -12 2 -36
+640 -16 -8 24 -40 176 -8 2 -32
+640 -16 -8 56 -40 240 -8 2 -40
+960 -20 -12 28 -60 296 -20 2 -52
+192 -4 -2 12 -12 72 -4 0 -12
+1920 -48 -24 156 -100 -40 -44 6 -20
+384 -12 -4 20 -20 -8 -4 2 -4
+192 -8 0 6 -10 -4 2 2 -2
+0 0 0 8 4 0 -4 0 -2
+192 -12 12 4 12 -8 -12 6 -4
+192 -8 0 -4 4 -8 -4 2 0
+192 -6 0 -4 20 -8 -4 0 -8
+0 3 11 -9 1 10 -5 2 -1
+576 -12 -6 -16 -16 -24 -2 0 -8
+1920 -48 -24 -48 -112 32 8 6 -32
+640 -16 -8 -8 -40 16 0 2 -8
+1152 -12 -12 -52 -60 -24 -4 2 -12
+2880 -60 -36 -112 -152 -48 8 6 -32
+0 8 16 -36 12 120 -28 2 -12
+0 2 4 -8 4 40 -8 0 -4
+0 0 4 -16 16 48 -8 2 -4
+0 4 4 -16 8 48 -8 2 -8
+128 -6 2 -2 -6 -4 2 2 0
+160 -7 1 1 -9 -2 3 2 -1
+288 -8 -4 -2 -18 0 2 2 0
+768 -20 -12 8 -48 0 0 6 0
+0 8 0 0 0 96 -16 2 0
+192 4 -4 12 -12 72 -20 2 -12
+0 6 -2 12 0 48 -12 2 0
+0 12 -4 -8 0 96 -8 6 0
+192 16 -16 -12 -12 72 4 14 -12
+0 14 -10 -4 0 48 4 10 0
+640 -16 -8 32 -40 0 -8 2 0
+1920 -48 -24 104 -120 80 -24 6 -40
+1920 -48 -24 116 -108 8 -36 6 -28
+640 -16 -8 24 -40 16 -8 2 -8
+192 -4 -2 12 -12 8 -4 0 -4
+192 -4 -2 13 -11 2 -5 0 -3
+576 -12 -6 28 -36 16 -12 0 -8
+192 -4 -2 12 -12 0 -4 0 0
+192 -4 -2 18 -10 -4 -6 0 -2
+384 -12 -4 16 -24 0 0 2 0
+384 -12 -4 0 -24 0 4 2 0
+1920 -48 -24 -56 -56 -80 -8 6 -8
+0 20 4 -24 0 288 -40 6 0
+0 2 0 4 0 8 -4 0 0
+0 10 -6 -4 0 16 4 6 0
+0 14 -6 -8 0 8 8 6 0
+0 20 -4 -16 0 16 8 6 0
+0 8 2 -8 0 8 0 2 0
+0 32 0 -32 0 32 8 10 0
+48 19 -1 -21 -3 18 5 6 -3
+1152 -18 -14 -50 -62 -20 2 2 -10
+0 2 -2 -2 2 4 2 2 -2
+192 -4 -2 4 -12 40 -4 0 -8
+192 -4 -2 4 -12 24 -4 0 -6
+128 -3 -1 2 -8 16 -2 0 -4
+64 -4 4 -20 20 40 -4 2 -4
+192 -12 12 -52 36 104 -20 6 -4
+0 0 6 -12 20 40 -8 0 -4
+384 -12 -4 -24 32 64 -8 2 0
+0 0 0 -6 18 4 2 2 -6
+0 0 0 -8 20 8 4 2 -6
+0 0 8 -24 40 208 -32 2 -16
+0 0 8 -24 40 144 -24 2 -16
+0 0 8 -24 40 112 -16 2 -16
+192 -8 0 -20 60 152 -20 2 -4
+64 -4 4 -20 84 264 -36 2 -12
+960 -16 -12 -26 -42 -36 -6 2 -6
+960 -20 -12 -34 -42 -36 0 2 -6
+960 -20 -16 -18 -42 -36 -2 6 -6
+576 -8 -8 -20 -36 88 -4 2 -20
+192 132 -60 -84 -12 72 76 58 -12
+192 20 -12 -20 -12 8 12 10 -4
+96 3 -3 -6 -6 0 2 2 0
+768 16 -16 -48 -48 0 8 10 0
+96 -1 -1 0 -6 20 -4 0 -4
+0 3 5 -10 8 72 -14 0 -8
+0 4 12 -32 24 176 -32 2 -16
+192 -12 12 -60 60 152 -28 6 -4
+192 -12 12 -76 76 184 -28 10 -12
+0 0 0 0 48 0 0 2 -16
+576 -12 -8 -12 -36 24 0 2 -12
+192 -4 -4 -4 -12 8 4 2 -4
+0 0 12 -32 32 96 -16 2 -8
+0 24 -8 -24 8 16 16 10 -8
+0 52 -28 -64 40 80 48 30 -40
+192 -12 12 20 156 -8 -28 6 -60
+192 -12 12 20 380 -8 -28 6 -116
+0 0 2 4 40 0 -4 0 -12
+0 0 6 8 24 0 -8 0 -10
+0 0 8 -36 28 152 -20 6 -4
+32 -2 2 -12 8 32 -4 2 0
+0 0 2 4 4 0 -4 0 0
+0 0 6 8 8 0 -8 0 -2
+0 0 6 1 5 2 -5 0 -1
+1024 -16 -12 -48 -48 -32 4 2 -8
+1248 -23 -15 -55 -57 -42 3 2 -9
+1344 -24 -16 -58 -66 -36 2 2 -12
+1056 -21 -13 -45 -51 -30 3 2 -9
+960 -20 -12 -40 -48 -24 4 2 -8
+0 0 8 -24 24 112 -20 2 -8
+0 4 12 -32 24 144 -24 2 -16
+0 0 8 -24 24 80 -12 2 -8
+0 8 0 -8 24 80 -8 2 -24
+0 6 -2 -4 16 48 4 2 -16
+0 14 -10 -20 16 48 20 10 -16
+0 20 -12 -32 24 80 16 14 -24
+0 14 -2 -20 8 16 12 6 -8
+0 12 -4 -16 8 16 8 6 -8
+0 2 0 0 4 8 0 0 -4
+192 4 -4 -12 -4 88 4 2 -20
+96 1 -3 -4 -6 36 0 2 -6
+192 4 -12 -4 -12 72 12 10 -12
+192 -4 -4 22 -10 -4 -6 2 -2
+1344 -28 -16 -54 -62 -44 2 2 -10
+2688 -36 -28 -120 -144 -32 -8 2 -32
+640 -8 -6 -28 -36 0 -4 0 -8
+112 -1 -1 -5 -7 2 -1 0 -1
+48 2 2 -7 -3 18 -5 0 -3
+0 1 1 -2 0 8 -2 0 0
+0 12 20 -48 24 240 -48 2 -24
+4864 -80 -56 -216 -216 -176 8 6 -32
+2304 -32 -24 -104 -104 -80 0 2 -16
+1152 -24 -14 -44 -60 -24 4 2 -12
+384 -6 -4 -12 -24 24 -4 0 -8
+1728 -28 -20 -64 -104 48 -8 2 -32
+1344 -24 -16 -36 -84 88 -12 2 -28
+192 8 -8 -12 -12 8 4 6 -4
+192 48 -32 -28 -12 72 20 30 -12
+1920 -48 -24 -44 -108 8 4 6 -28
+960 -20 -12 -20 -60 40 -4 2 -16
+1344 -28 -16 -28 -84 40 -4 2 -20
+768 -14 -8 -20 -48 24 -4 0 -12
+2112 -32 -24 -68 -132 152 -20 2 -52
+192 -4 -2 -3 -11 2 -1 0 -3
+576 -12 -6 -4 -36 16 -4 0 -8
+192 -4 -2 4 -12 16 -4 0 -4
+1728 -36 -18 -59 -75 -62 -3 0 -13
+192 4 -4 -12 -12 0 4 2 0
+96 -1 -1 -3 -5 -2 -1 0 -1
+192 0 -2 -4 -12 0 -4 0 0
+960 -12 -12 -36 -60 8 -4 2 -4
+1920 -18 -26 -76 -120 0 -4 6 0
+2688 -42 -34 -116 -144 -48 4 6 -24
+864 -17 -11 -37 -43 -22 3 2 -7
+2880 -60 -36 -118 -142 -76 10 6 -26
+192 -6 0 -10 10 -4 -2 0 -2
+192 -6 0 -10 2 -4 -2 0 0
+0 0 2 -2 26 4 -2 0 -6
+192 -12 12 -40 240 32 -8 6 -56
+480 -7 -5 -12 -30 52 -8 0 -14
+0 0 4 -16 16 80 -12 2 -4
+0 4 6 -12 4 48 -12 0 -4
+1152 -36 -12 -60 -20 -40 4 6 -4
+0 2 8 -16 12 56 -12 0 -4
+0 10 16 -32 12 120 -28 0 -12
+96 9 -1 16 -6 36 -20 0 -6
+96 1 -1 0 -6 4 -4 0 -2
+416 -10 -6 -12 -24 16 4 2 -8
+192 -4 -4 6 -10 -4 -2 2 -2
+192 -4 -4 8 -12 0 -2 2 0
+0 4 -2 -3 1 2 3 2 -1
+960 -12 -12 -44 -52 -16 4 2 -8
+576 -8 -8 -28 -28 -16 4 2 -4
+0 3 5 -9 1 10 -1 2 -1
+0 3 7 -9 1 10 -3 2 -1
+1792 -16 -24 -88 -88 -48 8 6 -16
+864 -15 -11 -39 -41 -26 3 2 -7
+672 -11 -9 -31 -33 -18 3 2 -5
+960 -16 -12 -42 -50 -20 2 2 -8
+3200 -80 -40 -154 -90 -132 18 10 -6
+1920 -48 -24 -94 -46 -76 10 6 -2
+1056 -12 -12 -50 -58 -4 -2 2 -14
+960 -12 -12 -44 -52 -8 4 2 -12
+0 0 6 -20 20 56 -8 2 -6
+192 8 8 -24 -8 16 -8 2 -8
+0 3 1 -2 4 8 -2 0 -4
+0 11 1 -2 20 40 -6 0 -20
+0 0 18 -3 13 10 -13 0 -3
+400 -6 -4 -16 -20 -8 -2 0 -4
+3648 -64 -40 -144 -176 -96 -8 2 -32
+624 -8 -6 -26 -34 -4 -4 0 -8
+576 0 -6 -28 -36 0 -4 2 0
+4608 -60 -52 -200 -240 -96 -8 6 -48
+1152 -18 -14 -48 -60 -24 0 2 -12
+1920 -34 -22 -80 -92 -56 0 2 -16
+1728 -36 -22 -74 -82 -52 8 4 -14
+1344 -28 -20 -40 -80 96 8 6 -32
+576 -12 -8 -12 -36 56 0 2 -16
+528 -13 -7 -16 -30 4 4 2 -8
+192 -12 12 -48 40 80 -16 6 -8
+192 -12 12 -48 200 80 -16 6 -48
+0 0 6 -12 52 40 -8 0 -12
+0 0 2 -3 21 10 -3 0 -5
+256 -8 0 -12 12 -8 -2 0 -4
+192 -6 0 -7 13 -6 -3 0 -5
+512 -16 0 -24 0 -16 -4 0 -2
+512 -14 -6 -4 -32 0 2 2 0
+640 -16 -8 -8 -40 0 2 2 0
+960 -20 -14 -20 -60 0 2 4 0
+960 -20 -12 -4 -60 72 -12 2 -20
+960 -20 -12 -4 -60 104 -12 2 -28
+192 -12 12 20 36 -8 -28 6 0
+0 0 2 -3 5 10 -3 0 -1
+192 28 -4 -44 -4 24 20 10 -12
+64 8 0 -12 -4 8 4 2 -2
+256 14 6 -36 -16 32 4 2 -8
+48 4 6 -10 -2 20 -8 0 -4
+16 2 4 -4 0 8 -4 0 -2
+0 12 36 -28 12 56 -28 2 -12
+0 4 4 -8 0 8 0 2 0
+64 4 8 -12 -4 8 -4 2 0
+448 12 12 -36 -28 8 -12 2 -4
+1536 -22 -16 -52 -96 56 -12 0 -28
+1792 -16 -16 -88 -88 -48 0 2 -16
+384 6 -10 -20 -24 0 4 6 0
+2304 -12 -28 -104 -144 0 -8 6 0
+3840 -48 -40 -168 -200 -80 -8 2 -40
+0 0 8 -6 10 4 -2 2 -4
+0 4 8 -6 18 4 -2 2 -10
+768 -16 -10 -16 -48 24 -2 2 -12
+2304 -56 -32 -32 -144 96 8 10 -48
+1792 -48 -24 -16 -112 0 8 10 0
+2304 -56 -32 -32 -144 0 8 10 0
+192 -6 0 -7 5 -6 -3 0 -3
+448 -14 0 -19 1 -14 -5 0 -3
+576 -18 0 -24 4 -16 -8 0 -4
+192 -6 0 10 -10 -4 -2 0 -2
+256 -8 0 12 -12 -8 -4 0 -2
+512 -16 0 0 -24 -16 -2 0 -4
+192 -6 0 2 -10 -4 0 0 -2
+576 -18 0 4 -24 -16 -4 0 -8
+448 -14 0 1 -19 -14 -3 0 -5
+576 -18 0 -3 -23 -22 -3 0 -5
+192 -6 0 5 -7 -6 -3 0 -3
+192 -6 0 13 -7 -6 -5 0 -3
+64 -4 4 20 -4 24 4 2 -4
+2304 -56 -32 -96 -96 -96 16 10 0
+768 -30 0 -32 -28 -32 8 6 0
+0 1 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0
+0 0 0 0 1 0 0 0 0
+0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/mit71-61.ine b/demos/ppl_lcdd/examples/mit71-61.ine
new file mode 100644
index 0000000..dcc420d
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit71-61.ine
@@ -0,0 +1,74 @@
+begin
+71 61 rational
+64 -384 0 192 0 0 768 0 0 -512 0 0 0 -768 0 0 0 0 0 768 0 0 0 0 0 0 0 0 0 0 0 0 0 192 0 0 0 0 0 -384 0 0 0 0 0 0 0 0 0 0 0 64 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 2 -6 6 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 6 -6 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 2 -2 -2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 2 2 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 2 2 -2 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 -2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 2 6 6 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 -6 -6 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 4 -8 4 -8 16 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 4 0 -4 -8 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 4 8 4 -8 -16 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 8 -8 0 0 0 -24 24 0 24 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 8 8 0 0 0 -24 -24 0 24 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+16 -64 0 0 0 0 96 0 0 -64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -6 12 3 -12 -8 3 12 -6 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -4 4 1 0 0 -1 -4 4 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -2 0 -1 4 0 -1 0 -2 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -2 -4 3 -4 8 3 -4 -2 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -4 1 0 0 -1 4 0 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -3 0 0 3 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 -4 3 4 -8 3 -4 2 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 -1 -4 0 -1 0 2 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 4 1 0 0 -1 -4 -4 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 6 12 3 12 8 3 12 6 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -8 -2 8 4 8 -4 -8 -8 8 2 -2 -2 10 -16 -4 12 8 -2 -8 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -4 -2 4 0 0 0 0 4 -4 -2 2 -2 6 -4 0 -4 0 2 4 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -8 2 -8 4 8 4 8 -8 -8 2 2 -2 6 0 -4 4 -8 -2 8 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -4 2 -4 0 0 0 0 4 4 -2 -2 -2 2 4 0 -4 0 2 -4 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 -2 0 4 -8 -4 8 0 0 2 -2 -2 2 8 -4 4 -8 -2 0 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 -2 0 -4 0 4 0 0 0 2 -2 -2 2 0 4 -4 0 -2 0 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 4 -8 4 -8 0 0 2 2 -2 -2 8 -4 -4 8 -2 0 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 -4 0 -4 0 0 0 2 2 -2 -2 0 4 4 0 -2 0 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 -2 -4 0 0 0 0 -4 4 -2 2 -2 -2 4 0 4 0 2 -4 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 2 4 0 0 0 0 -4 -4 -2 -2 -2 -6 -4 0 4 0 2 4 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 -2 -8 4 8 -4 -8 8 -8 2 -2 -2 -6 0 -4 -4 8 -2 8 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 2 8 4 8 4 8 8 8 2 2 -2 -10 -16 -4 -12 -8 -2 -8 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 -8 4 16 4 -8 -8 4 0 0 0 0 0 0 0 0 0 0 0 -8 24 8 -24 -8 -16 8 16 8 -8 0 0 4 -16 20 4 -8 -8 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 -4 0 4 8 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 16 0 8 -8 0 0 -16 0 8 0 0 4 -8 -4 4 0 8 0 -4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 0 4 0 -4 0 8 -4 0 0 0 0 0 0 0 0 0 0 0 -8 8 8 -8 8 0 -8 0 -8 8 0 0 4 -8 4 -4 8 0 0 -4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 -8 4 -16 4 -8 8 4 0 0 0 0 0 0 0 0 0 0 0 -8 8 -8 8 -8 16 -8 16 -8 -8 0 0 4 0 -12 4 8 -8 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 -4 0 -4 0 0 4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 8 8 0 0 0 0 -8 0 0 4 0 -4 -4 0 0 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 8 4 -16 4 8 -8 4 0 0 0 0 0 0 0 0 0 0 0 -8 -8 8 8 -8 16 8 -16 8 -8 0 0 4 0 -12 4 -8 8 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 0 4 0 -4 0 -8 -4 0 0 0 0 0 0 0 0 0 0 0 -8 -8 -8 -8 8 0 8 0 8 8 0 0 4 8 4 -4 -8 0 0 -4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 8 -4 0 4 -8 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 -16 0 8 -8 0 0 16 0 8 0 0 4 8 -4 4 0 -8 0 -4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 8 4 16 4 8 8 4 0 0 0 0 0 0 0 0 0 0 0 -8 -24 -8 -24 -8 -16 -8 -16 -8 -8 0 0 4 16 20 4 8 8 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -16 8 16 -16 4 -8 32 0 0 -16 -32 0 0 32 0 -8 0 4 -16 16 8 -16 0 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 0 0 8 -4 -8 16 0 0 0 0 0 0 -16 0 8 0 4 -8 0 0 8 0 -4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 8 -16 0 4 -8 0 0 0 -16 32 0 0 0 0 -8 0 4 0 -16 8 0 0 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 0 0 4 -8 0 0 0 16 0 0 0 0 0 -8 0 4 0 0 -8 0 0 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 0 0 -8 -4 -8 -16 0 0 0 0 0 0 16 0 8 0 4 8 0 0 -8 0 -4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 16 8 16 16 4 -8 -32 0 0 -16 -32 0 0 -32 0 -8 0 4 16 16 8 16 0 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8 -16 16 8 -8 -16 16 32 0 -32 -16 0 16 0 0 0 0 0 0 -8 24 -8 -16 8 0 24 -64 -8 16 24 32 -8 0 -16 0 0 0 -8 24 -16 -8 8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 -16 -16 8 8 -16 -16 32 0 32 -16 0 -16 0 0 0 0 0 0 -8 8 -8 16 -8 0 24 -32 8 -16 24 -32 8 0 16 0 0 0 -8 8 16 -8 -8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8 0 0 -8 8 -16 16 0 0 0 16 0 -16 0 0 0 0 0 0 -8 8 8 0 -8 0 24 -16 -8 0 -24 0 8 0 16 0 0 0 -8 8 0 8 -8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 0 0 -8 -8 -16 -16 0 0 0 16 0 16 0 0 0 0 0 0 -8 -8 8 0 8 0 24 16 8 0 -24 0 -8 0 -16 0 0 0 -8 -8 0 8 8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8 16 -16 8 -8 -16 16 -32 0 32 -16 0 16 0 0 0 0 0 0 -8 -8 -8 16 8 0 24 32 -8 -16 24 -32 -8 0 -16 0 0 0 -8 -8 16 -8 8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 16 16 8 8 -16 -16 -32 0 -32 -16 0 -16 0 0 0 0 0 0 -8 -24 -8 -16 -8 0 24 64 8 16 24 32 8 0 16 0 0 0 -8 -24 -16 -8 -8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 8 -24 24 -8 0 0 0 0 0 0 -24 48 24 -24 -48 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 -48 -24 48 0 24 0 -24 0 0 0 0 -8 24 -24 0 0 8 0 0 0 0
+0 0 0 0 0 0 0 0 0 8 -8 -8 8 0 0 0 0 0 0 -24 16 8 8 16 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 -16 -8 -16 0 -8 0 24 0 0 0 0 -8 8 8 0 0 -8 0 0 0 0
+0 0 0 0 0 0 0 0 0 8 8 -8 -8 0 0 0 0 0 0 -24 -16 -8 8 16 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 16 8 -16 0 -8 0 -24 0 0 0 0 -8 -8 8 0 0 8 0 0 0 0
+0 0 0 0 0 0 0 0 0 8 24 24 8 0 0 0 0 0 0 -24 -48 -24 -24 -48 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 48 24 48 0 24 0 24 0 0 0 0 -8 -24 -24 0 0 -8 0 0 0 0
+0 0 0 16 -32 16 0 0 0 0 0 0 0 -64 0 128 0 -64 0 64 0 -128 0 0 64 0 0 0 0 0 0 0 0 32 -64 32 0 0 0 -64 128 0 0 -64 0 0 0 0 0 0 0 16 -32 0 16 0 0 0 0 0 0
+0 0 0 16 0 -16 0 0 0 0 0 0 0 -64 0 0 0 64 0 64 0 0 0 0 -64 0 0 0 0 0 0 0 0 32 0 -32 0 0 0 -64 0 0 0 64 0 0 0 0 0 0 0 16 0 0 -16 0 0 0 0 0 0
+0 0 0 16 32 16 0 0 0 0 0 0 0 -64 0 -128 0 -64 0 64 0 128 0 0 64 0 0 0 0 0 0 0 0 32 64 32 0 0 0 -64 -128 0 0 -64 0 0 0 0 0 0 0 16 32 0 16 0 0 0 0 0 0
+0 0 0 0 0 0 16 -32 16 -32 64 -32 0 -32 32 32 -32 0 0 80 -96 -64 16 64 0 0 0 0 0 0 0 0 0 16 -32 0 16 0 0 -64 96 32 -32 0 -32 0 0 0 0 0 0 16 -32 16 0 0 0 0 0 0 0
+0 0 0 0 0 0 16 0 -16 -32 0 32 0 -32 0 0 32 0 0 80 0 0 -16 -64 0 0 0 0 0 0 0 0 0 16 0 0 -16 0 0 -64 0 0 32 0 32 0 0 0 0 0 0 16 0 -16 0 0 0 0 0 0 0
+0 0 0 0 0 0 16 32 16 -32 -64 -32 0 -32 -32 -32 -32 0 0 80 96 64 16 64 0 0 0 0 0 0 0 0 0 16 32 0 16 0 0 -64 -96 -32 -32 0 -32 0 0 0 0 0 0 16 32 16 0 0 0 0 0 0 0
+0 32 -32 -32 32 0 -128 128 0 128 -128 0 0 192 -64 -128 0 0 0 -256 128 128 0 0 0 0 0 0 0 0 0 0 0 -64 64 0 0 0 0 160 -128 -32 0 0 0 0 0 0 0 0 0 -32 32 0 0 0 0 0 0 0 0
+0 32 32 -32 -32 0 -128 -128 0 128 128 0 0 192 64 128 0 0 0 -256 -128 -128 0 0 0 0 0 0 0 0 0 0 0 -64 -64 0 0 0 0 160 128 32 0 0 0 0 0 0 0 0 0 -32 -32 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -4 6 -4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -2 0 2 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 -2 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 6 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/mit90-86.ine b/demos/ppl_lcdd/examples/mit90-86.ine
new file mode 100644
index 0000000..5bee933
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit90-86.ine
@@ -0,0 +1,93 @@
+begin
+90 86 rational
+1 -4 6 0 -3 0 0 12 0 0 0 0 0 0 -4 0 -4 0 4 0 -12 0 0 12 1 0 0 3 -6 0 -12 0 0 0 0 -12 0 12 0 0 0 0 -12 0 0 0 12 0 -12 12 12 0 0 0 12 0 0 4 -12 6 0 0 -1 -3 -4 0 0 -4 4 -12 0 0 0 4 0 0 0 0 3 0 0 -6 0 4 0 -1
+1 -4 6 0 -3 0 0 12 0 0 0 0 0 0 -4 0 4 0 -4 0 -12 0 0 -12 1 0 0 3 -6 0 12 0 0 0 0 12 0 12 0 0 0 0 -12 0 0 0 -12 0 12 -12 12 0 0 0 -12 0 0 -4 12 6 0 0 -1 -3 4 0 0 4 -4 -12 0 0 0 4 0 0 0 0 3 0 0 -6 0 4 0 -1
+1 -6 6 4 -1 4 0 4 -2 -8 0 4 0 -2 -4 0 0 0 0 0 -4 0 -8 0 1 4 4 -1 -2 0 0 -8 -2 4 0 0 8 4 0 0 0 -2 4 0 8 0 0 4 0 0 -4 0 -8 0 0 0 -8 0 0 -2 4 0 1 -1 0 0 4 0 0 4 -8 0 0 -4 -2 -2 0 4 -1 4 0 6 4 -4 -2 1
+1 -8 6 8 1 12 -4 -4 -4 -16 -4 0 -8 -4 -4 4 0 8 0 8 4 -4 0 0 1 8 8 -1 2 4 0 0 -4 0 4 0 0 -4 -4 -8 -4 4 4 8 0 4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 -8 -8 -1 1 0 4 -8 0 0 4 16 8 4 4 4 4 4 0 -1 -8 -4 -6 -8 4 4 -1
+1 -10 6 12 3 24 -12 -12 -6 -24 -20 -12 -24 -6 -4 12 4 24 4 24 12 12 24 12 1 12 12 3 6 12 12 24 -6 -12 -12 -12 -24 -12 -12 -24 -12 -6 -12 -24 -24 -12 -12 -12 -12 -12 12 24 24 12 12 12 24 4 12 6 12 24 1 3 4 12 12 -4 -4 -12 -24 -24 -12 -4 -6 -6 -12 -12 3 12 12 6 12 -4 -6 1
+1 10 6 12 3 24 12 12 6 24 20 12 24 6 4 12 4 24 4 24 12 12 24 12 1 12 12 3 6 12 12 24 6 12 12 12 24 12 12 24 12 6 12 24 24 12 12 12 12 12 12 24 24 12 12 12 24 4 12 6 12 24 1 3 4 12 12 4 4 12 24 24 12 4 6 6 12 12 3 12 12 6 12 4 6 1
+1 8 6 8 1 12 4 4 4 16 4 0 8 4 4 4 0 8 0 8 4 -4 0 0 1 8 8 -1 2 4 0 0 4 0 -4 0 0 4 4 8 4 -4 -4 -8 0 -4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 -8 -8 -1 1 0 4 -8 0 0 -4 -16 -8 -4 -4 -4 -4 -4 0 -1 -8 -4 -6 -8 -4 -4 -1
+1 8 0 6 3 18 6 6 0 0 14 12 12 0 -2 0 2 0 2 0 0 12 12 6 -1 -6 -6 3 0 0 6 12 -6 0 6 0 0 -6 -6 -12 -6 6 6 12 0 6 0 0 0 0 0 0 -12 0 -6 0 -12 -2 -6 0 6 0 1 -3 -2 -12 6 -4 -4 -6 0 -12 -6 2 0 0 -6 -12 -3 -6 -12 0 -6 -2 -6 -1
+1 6 0 2 1 10 -2 2 2 0 6 0 4 -2 -2 0 2 8 -2 -8 0 -4 4 2 -1 -6 -2 -1 0 0 -2 -4 -4 -4 -6 -4 0 -2 -6 -4 2 -4 -2 -4 0 2 -4 4 4 4 0 -8 -4 0 -2 0 4 2 2 0 -2 8 -1 -1 -2 -4 -6 0 0 2 0 4 6 -2 -2 2 -2 0 1 2 4 0 6 2 4 1
+1 6 6 4 -1 4 0 -4 2 8 0 -4 0 2 4 0 0 0 0 0 -4 0 -8 0 1 4 4 -1 -2 0 0 -8 2 -4 0 0 -8 -4 0 0 0 2 -4 0 -8 0 0 -4 0 0 -4 0 -8 0 0 0 -8 0 0 -2 4 0 1 -1 0 0 4 0 0 -4 8 0 0 4 2 2 0 -4 -1 4 0 6 4 4 2 1
+1 6 0 6 1 6 6 2 -2 0 -2 0 4 2 -2 0 -2 -8 2 8 0 -4 -4 -2 -1 -2 -6 -1 0 0 2 4 -4 4 2 4 0 -2 2 -4 -6 -4 -2 -4 0 -6 4 -4 -4 -4 0 8 4 0 2 0 -4 -2 -2 0 -6 -8 -1 -1 2 -4 -2 0 0 2 0 4 -2 -2 2 -2 6 0 1 6 4 0 2 2 4 1
+1 6 6 4 3 0 -4 12 2 8 -12 4 -8 2 4 -4 -4 -8 -4 -8 12 -4 8 -12 1 4 4 3 6 -4 -12 8 2 4 -4 -12 8 12 -4 -8 -4 2 12 -8 8 -4 -12 4 -12 -12 12 -8 8 -4 -12 -4 8 -4 -12 6 4 -8 1 3 -4 -4 4 -4 -4 12 8 -8 -4 4 2 2 -4 4 3 4 -4 6 4 4 2 1
+1 6 -2 0 3 12 0 0 -2 -8 8 12 0 -2 0 -4 0 -8 0 -8 -4 12 0 0 1 0 0 3 -2 -4 0 0 6 -4 0 -4 -8 0 0 0 0 6 0 0 -8 0 -4 -4 -4 -4 -4 -8 0 -4 0 -4 0 0 0 -2 0 -8 1 3 0 12 0 4 4 0 -8 0 0 0 -2 -2 0 12 3 0 12 -2 0 0 6 1
+1 4 -2 -4 1 8 -8 0 -4 0 8 0 0 -4 0 4 4 -8 -4 -8 4 -4 8 4 1 4 -4 -1 -6 4 -4 -8 4 0 -8 0 -16 0 8 0 -8 -4 0 0 16 8 0 0 0 0 -4 8 8 -4 4 -4 -8 -4 -4 6 4 8 -1 1 4 4 -4 0 0 0 0 0 -8 0 4 4 8 0 -1 4 -4 2 -4 0 -4 -1
+1 4 0 -2 -1 6 -6 -2 4 0 2 -4 4 -4 -2 -4 -2 8 -2 -8 0 0 -4 2 -1 -6 2 -1 0 4 2 -4 -2 0 2 -4 0 2 -2 -4 6 2 -2 4 0 -6 4 0 4 -4 0 8 4 -4 -2 4 4 2 -2 0 -2 -8 1 1 2 0 6 0 0 2 0 -4 -2 2 4 -4 6 4 1 2 0 0 -6 -2 -2 -1
+1 4 0 2 -1 2 2 -2 0 0 2 -4 -4 0 -2 4 2 0 2 0 0 0 -4 -2 -1 -2 -2 -1 0 -4 -2 -4 -2 0 2 4 0 2 -2 4 -2 2 -2 -4 0 2 -4 0 -4 4 0 0 4 4 2 -4 4 -2 2 0 2 0 1 1 -2 0 2 0 0 2 0 4 -2 2 0 0 -2 4 1 -2 0 0 -2 -2 -2 -1
+1 4 -2 0 1 4 0 0 0 -8 0 0 0 0 0 -4 0 0 0 0 -4 -4 0 0 1 0 0 -1 2 -4 0 0 4 0 0 0 8 0 0 0 0 -4 0 0 -8 0 0 0 0 0 4 0 0 4 0 4 0 0 0 -2 0 0 -1 1 0 4 0 0 0 0 8 0 0 0 0 0 0 0 -1 0 -4 2 0 0 -4 -1
+1 4 0 2 3 -2 -2 6 0 0 -10 4 -4 0 -2 0 -2 0 -2 0 0 -4 4 -6 -1 -2 -2 3 0 0 -6 4 -2 0 -2 0 0 -6 2 4 2 2 6 -4 0 -2 0 0 0 0 0 0 -4 0 6 0 -4 2 6 0 2 0 1 -3 2 4 2 4 4 -6 0 4 2 2 0 0 2 -4 -3 -2 4 0 -2 -2 -2 -1
+1 4 6 0 -3 0 0 -12 0 0 0 0 0 0 4 0 4 0 -4 0 -12 0 0 -12 1 0 0 3 -6 0 12 0 0 0 0 -12 0 -12 0 0 0 0 12 0 0 0 12 0 -12 12 12 0 0 0 -12 0 0 -4 12 6 0 0 -1 -3 4 0 0 -4 4 12 0 0 0 -4 0 0 0 0 3 0 0 -6 0 -4 0 -1
+1 4 6 0 -3 0 0 -12 0 0 0 0 0 0 4 0 -4 0 4 0 -12 0 0 12 1 0 0 3 -6 0 -12 0 0 0 0 12 0 -12 0 0 0 0 12 0 0 0 -12 0 12 -12 12 0 0 0 12 0 0 4 -12 6 0 0 -1 -3 -4 0 0 4 -4 12 0 0 0 -4 0 0 0 0 3 0 0 -6 0 -4 0 -1
+1 4 6 0 1 -4 -4 4 0 0 -4 0 -8 0 4 -4 0 -8 0 -8 4 4 0 0 1 0 0 -1 2 -4 0 0 0 0 4 0 0 4 -4 -8 -4 0 -4 8 0 4 0 0 0 0 -4 8 0 4 0 4 0 0 0 -2 0 8 -1 1 0 -4 0 0 0 -4 0 8 4 -4 0 0 4 0 -1 0 4 -6 0 -4 0 -1
+1 4 0 6 -1 -2 2 -2 -4 0 -6 -4 4 4 -2 -4 -2 -8 -2 8 0 0 -4 2 -1 2 -6 -1 0 4 2 -4 -2 0 -6 -4 0 2 6 -4 -2 2 -2 4 0 2 4 0 4 -4 0 -8 4 -4 -2 4 4 2 -2 0 6 8 1 1 2 0 -2 0 0 2 0 -4 6 2 -4 4 -2 4 1 -6 0 0 2 -2 -2 -1
+1 4 -2 4 1 0 8 0 -4 0 -8 0 0 -4 0 4 -4 -8 4 -8 4 -4 -8 -4 1 -4 4 -1 -6 4 4 8 4 0 8 0 -16 0 -8 0 8 -4 0 0 16 -8 0 0 0 0 -4 8 -8 -4 -4 -4 8 4 4 6 -4 8 -1 1 -4 4 4 0 0 0 0 0 8 0 4 4 -8 0 -1 -4 -4 2 4 0 -4 -1
+1 4 0 -6 3 6 -6 -6 0 0 2 12 -12 0 2 0 -2 0 -2 0 0 12 -12 -6 -1 6 6 3 0 0 -6 -12 -6 0 -6 0 0 6 6 12 6 6 -6 -12 0 -6 0 0 0 0 0 0 12 0 6 0 12 2 6 0 -6 0 1 -3 2 -12 -6 -4 -4 6 0 12 6 -2 0 0 6 -12 -3 6 -12 0 6 2 -6 -1
+1 2 -2 -4 -1 4 -4 0 -2 0 4 -4 0 -2 0 0 0 0 0 0 4 0 0 0 1 4 -4 -1 -2 0 0 0 2 4 4 0 0 0 4 0 -4 2 0 0 0 -4 0 4 0 0 4 0 0 0 0 0 0 0 0 -2 -4 0 1 -1 0 0 4 0 0 0 0 0 4 0 -2 -2 -4 -4 -1 -4 0 -2 4 0 2 1
+1 2 0 -6 1 2 -6 -2 -2 0 2 0 -4 2 2 0 2 -8 -2 8 0 -4 4 2 -1 2 6 -1 0 0 -2 -4 -4 4 -2 4 0 2 -2 4 6 -4 2 4 0 6 4 -4 -4 -4 0 8 -4 0 -2 0 4 2 2 0 6 -8 -1 -1 -2 -4 2 0 0 -2 0 -4 2 2 2 -2 -6 0 1 -6 4 0 -2 -2 4 1
+1 2 -2 0 3 -4 0 0 -6 8 -8 4 0 -6 0 12 0 -8 0 -8 -4 -4 0 0 1 0 0 3 -2 12 0 0 2 -12 0 4 8 0 0 0 0 2 0 0 8 0 4 -12 4 4 -4 -8 0 12 0 12 0 0 0 -2 0 -8 1 3 0 -4 0 -4 -4 0 8 0 0 0 -6 -6 0 4 3 0 -4 -2 0 0 2 1
+1 2 0 -2 -3 2 2 -6 2 0 2 0 -4 -2 -2 4 2 0 -2 0 0 0 -4 -6 -1 -2 2 3 0 -4 6 4 0 4 -2 0 0 6 -2 4 -2 0 6 4 0 -2 0 -4 0 0 0 0 4 -4 6 4 -4 2 -6 0 2 0 -1 3 -2 0 -2 4 -4 -6 0 -4 2 -2 -2 2 2 0 -3 -2 0 0 2 2 0 1
+1 2 0 -6 -3 6 -6 -6 6 0 -6 0 12 -6 -2 -12 -2 0 2 0 0 0 -12 6 -1 -6 6 3 0 12 -6 12 0 12 6 0 0 6 6 -12 6 0 6 -12 0 6 0 -12 0 0 0 0 12 12 -6 -12 -12 -2 6 0 6 0 -1 3 2 0 -6 -4 4 -6 0 12 -6 -2 -6 6 -6 0 -3 -6 0 0 6 2 0 1
+1 2 0 -2 1 -2 -2 2 2 0 -2 0 -4 -2 -2 0 -2 0 2 0 0 4 4 -2 -1 -2 2 -1 0 0 2 -4 0 -4 2 4 0 -2 2 4 2 0 -2 4 0 2 4 4 -4 -4 0 0 -4 0 2 0 4 -2 -2 0 2 0 -1 -1 2 4 -2 0 0 2 0 -4 -2 -2 -2 2 -2 0 1 -2 -4 0 2 2 0 1
+1 2 -2 0 -1 0 -4 0 2 -8 -4 -4 8 2 0 0 -4 0 -4 0 -4 0 0 4 1 0 0 -1 6 0 4 0 2 -4 -4 0 8 0 -4 8 -4 2 0 8 8 -4 0 -4 0 0 -4 0 0 0 4 0 0 -4 4 6 0 0 1 -1 -4 0 0 0 0 0 -8 8 -4 0 2 2 -4 -4 -1 0 0 -2 0 0 2 1
+1 2 0 2 -3 -2 2 -6 -2 0 2 0 -4 2 -2 4 -2 0 2 0 0 0 4 6 -1 2 -2 3 0 -4 -6 -4 0 -4 -2 0 0 6 -2 4 -2 0 6 4 0 -2 0 4 0 0 0 0 -4 -4 -6 4 4 -2 6 0 -2 0 -1 3 2 0 2 -4 4 -6 0 -4 2 -2 2 -2 2 0 -3 2 0 0 -2 2 0 1
+1 2 -2 0 -1 0 4 0 2 -8 4 -4 -8 2 0 0 4 0 4 0 -4 0 0 -4 1 0 0 -1 6 0 -4 0 2 -4 4 0 8 0 4 -8 4 2 0 -8 8 4 0 -4 0 0 -4 0 0 0 -4 0 0 4 -4 6 0 0 1 -1 4 0 0 0 0 0 -8 -8 4 0 2 2 4 -4 -1 0 0 -2 0 0 2 1
+1 2 0 2 1 -6 -2 2 -2 0 -2 0 -4 2 -2 0 2 0 -2 0 0 4 -4 2 -1 2 -2 -1 0 0 -2 4 0 4 2 -4 0 -2 2 4 2 0 -2 4 0 2 -4 -4 4 4 0 0 4 0 -2 0 -4 2 2 0 -2 0 -1 -1 -2 4 2 0 0 2 0 -4 -2 -2 2 -2 -2 0 1 2 -4 0 -2 2 0 1
+1 2 -2 4 -1 -4 4 0 -2 0 -4 -4 0 -2 0 0 0 0 0 0 4 0 0 0 1 -4 4 -1 -2 0 0 0 2 4 -4 0 0 0 -4 0 4 2 0 0 0 4 0 4 0 0 4 0 0 0 0 0 0 0 0 -2 4 0 1 -1 0 0 -4 0 0 0 0 0 -4 0 -2 -2 4 -4 -1 4 0 -2 -4 0 2 1
+1 2 -2 0 3 -4 0 0 2 -8 -8 4 0 2 0 -4 0 8 0 8 -4 -4 0 0 1 0 0 3 -2 -4 0 0 2 4 0 4 -8 0 0 0 0 2 0 0 -8 0 4 4 4 4 -4 8 0 -4 0 -4 0 0 0 -2 0 8 1 3 0 -4 0 -4 -4 0 -8 0 0 0 2 2 0 4 3 0 -4 -2 0 0 2 1
+1 2 0 -2 1 -2 2 -2 2 0 -6 0 -4 -2 2 0 -2 8 2 -8 0 -4 -4 -2 -1 6 2 -1 0 0 2 4 -4 -4 6 -4 0 2 6 4 -2 -4 2 4 0 -2 -4 4 4 4 0 -8 4 0 2 0 -4 -2 -2 0 2 8 -1 -1 2 -4 6 0 0 -2 0 -4 -6 2 -2 2 2 0 1 -2 4 0 -6 -2 4 1
+1 2 6 -4 -1 -4 0 -4 -2 -8 0 4 0 -2 4 0 0 0 0 0 -4 0 8 0 1 -4 -4 -1 -2 0 0 8 -2 4 0 0 8 -4 0 0 0 -2 -4 0 8 0 0 4 0 0 -4 0 8 0 0 0 8 0 0 -2 -4 0 1 -1 0 0 -4 0 0 -4 -8 0 0 4 -2 -2 0 4 -1 -4 0 6 -4 4 -2 1
+1 2 0 6 -3 -6 -6 -6 -6 0 -6 0 12 6 -2 -12 2 0 -2 0 0 0 12 -6 -1 6 -6 3 0 12 6 -12 0 -12 6 0 0 6 6 -12 6 0 6 -12 0 6 0 12 0 0 0 0 -12 12 6 -12 12 2 -6 0 -6 0 -1 3 -2 0 6 4 -4 -6 0 12 -6 -2 6 -6 -6 0 -3 6 0 0 -6 2 0 1
+1 2 6 -4 3 -8 -4 12 -2 -8 4 -4 -8 -2 4 -4 4 -8 4 -8 12 -4 -8 12 1 -4 -4 3 6 -4 12 -8 -2 -4 -4 12 -8 12 -4 -8 -4 -2 12 -8 -8 -4 12 -4 12 12 12 -8 -8 -4 12 -4 -8 4 12 6 -4 -8 1 3 4 -4 -4 4 4 12 -8 -8 -4 4 -2 -2 -4 -4 3 -4 -4 6 -4 4 -2 1
+1 2 6 -12 3 0 -12 -12 6 24 -4 12 -24 6 -4 12 -4 24 -4 24 12 12 -24 -12 1 -12 -12 3 6 12 -12 -24 6 12 -12 12 24 -12 -12 -24 -12 6 -12 -24 24 -12 12 12 12 12 12 24 -24 12 -12 12 -24 -4 -12 6 -12 24 1 3 -4 12 -12 4 4 -12 24 -24 -12 -4 6 6 -12 12 3 -12 12 6 -12 -4 6 1
+1 0 -2 -4 -3 4 4 0 0 0 4 0 -8 0 0 0 0 0 0 0 4 0 -8 0 1 4 -4 3 2 0 0 8 0 0 -4 4 0 0 4 -8 4 0 0 8 0 -4 -4 0 4 -4 -4 0 -8 0 0 0 8 0 0 -2 4 0 -1 -3 0 0 -4 -4 4 0 0 8 -4 0 0 0 -4 0 3 4 0 2 -4 0 0 -1
+1 0 -2 -4 -3 4 -4 0 0 0 -4 0 8 0 0 0 0 0 0 0 4 0 -8 0 1 4 -4 3 2 0 0 8 0 0 4 -4 0 0 -4 8 -4 0 0 -8 0 4 4 0 -4 4 -4 0 -8 0 0 0 8 0 0 -2 4 0 -1 -3 0 0 -4 4 -4 0 0 -8 4 0 0 0 4 0 3 4 0 2 -4 0 0 -1
+1 0 -2 -4 1 0 0 0 0 0 0 0 0 0 0 -4 -4 8 4 8 4 4 8 -4 1 4 -4 -1 -6 -4 4 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -8 8 4 -4 4 -8 4 4 6 4 -8 -1 1 -4 -4 -4 0 0 0 0 0 0 0 0 0 0 0 -1 4 4 2 -4 0 0 -1
+1 0 0 -6 -1 2 -2 2 -4 0 6 -4 -4 4 2 -4 2 -8 2 8 0 0 4 -2 -1 -2 6 -1 0 4 -2 4 -2 0 6 -4 0 -2 -6 4 2 2 2 -4 0 -2 4 0 4 -4 0 -8 -4 -4 2 4 -4 -2 2 0 -6 8 1 1 -2 0 2 0 0 -2 0 4 -6 -2 -4 4 2 4 1 6 0 0 -2 2 -2 -1
+1 0 -2 0 1 -4 0 0 -4 8 0 0 0 -4 0 4 0 0 0 0 -4 4 0 0 1 0 0 -1 2 4 0 0 0 0 0 0 8 0 0 0 0 0 0 0 -8 0 0 0 0 0 4 0 0 -4 0 -4 0 0 0 -2 0 0 -1 1 0 -4 0 0 0 0 -8 0 0 0 4 4 0 0 -1 0 4 2 0 0 0 -1
+1 0 0 -2 -1 -2 -2 2 0 0 -2 -4 4 0 2 4 -2 0 -2 0 0 0 4 2 -1 2 2 -1 0 -4 2 4 -2 0 -2 4 0 -2 2 -4 2 2 2 4 0 -2 -4 0 -4 4 0 0 -4 4 -2 -4 -4 2 -2 0 -2 0 1 1 2 0 -2 0 0 -2 0 -4 2 -2 0 0 2 4 1 2 0 0 2 2 -2 -1
+1 0 0 -2 3 -6 2 -6 0 0 -6 4 4 0 2 0 2 0 2 0 0 -4 -4 6 -1 2 2 3 0 0 6 -4 -2 0 2 0 0 6 -2 -4 -2 2 -6 4 0 2 0 0 0 0 0 0 4 0 -6 0 4 -2 -6 0 -2 0 1 -3 -2 4 -2 4 4 6 0 -4 -2 -2 0 0 -2 -4 -3 2 4 0 2 2 -2 -1
+1 0 6 -8 1 -4 -4 -4 4 16 -4 0 -8 4 -4 4 0 8 0 8 4 -4 0 0 1 -8 -8 -1 2 4 0 0 4 0 4 0 0 -4 -4 -8 -4 -4 4 8 0 4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 8 -8 -1 1 0 4 8 0 0 4 -16 8 4 4 -4 -4 4 0 -1 8 -4 -6 8 4 -4 -1
+1 0 0 -6 -1 2 2 -2 4 0 -6 4 4 -4 -2 -4 2 -8 2 8 0 0 4 -2 -1 -2 6 -1 0 4 -2 4 2 0 -6 4 0 2 6 -4 -2 -2 -2 4 0 2 -4 0 -4 4 0 -8 -4 -4 2 4 -4 -2 2 0 -6 8 1 1 -2 0 2 0 0 2 0 -4 6 2 4 -4 -2 -4 1 6 0 0 -2 -2 2 -1
+1 0 0 -2 -1 -2 2 -2 0 0 2 4 -4 0 -2 4 -2 0 -2 0 0 0 4 2 -1 2 2 -1 0 -4 2 4 2 0 2 -4 0 2 -2 4 -2 -2 -2 -4 0 2 4 0 4 -4 0 0 -4 4 -2 -4 -4 2 -2 0 -2 0 1 1 2 0 -2 0 0 2 0 4 -2 2 0 0 -2 -4 1 2 0 0 2 -2 2 -1
+1 0 -2 4 -3 -4 -4 0 0 0 -4 0 8 0 0 0 0 0 0 0 4 0 8 0 1 -4 4 3 2 0 0 -8 0 0 4 4 0 0 -4 8 -4 0 0 -8 0 4 -4 0 4 -4 -4 0 8 0 0 0 -8 0 0 -2 -4 0 -1 -3 0 0 4 -4 4 0 0 -8 4 0 0 0 4 0 3 -4 0 2 4 0 0 -1
+1 0 0 -2 3 -6 -2 6 0 0 6 -4 -4 0 -2 0 2 0 2 0 0 -4 -4 6 -1 2 2 3 0 0 6 -4 2 0 -2 0 0 -6 2 4 2 -2 6 -4 0 -2 0 0 0 0 0 0 4 0 -6 0 4 -2 -6 0 -2 0 1 -3 -2 4 -2 -4 -4 -6 0 4 2 2 0 0 2 4 -3 2 4 0 2 -2 2 -1
+1 0 -2 0 1 -4 0 0 4 -8 0 0 0 4 0 4 0 0 0 0 -4 4 0 0 1 0 0 -1 2 4 0 0 0 0 0 0 -8 0 0 0 0 0 0 0 8 0 0 0 0 0 4 0 0 -4 0 -4 0 0 0 -2 0 0 -1 1 0 -4 0 0 0 0 8 0 0 0 -4 -4 0 0 -1 0 4 2 0 0 0 -1
+1 0 -2 4 -3 -4 4 0 0 0 4 0 -8 0 0 0 0 0 0 0 4 0 8 0 1 -4 4 3 2 0 0 -8 0 0 -4 -4 0 0 4 -8 4 0 0 8 0 -4 4 0 -4 4 -4 0 8 0 0 0 -8 0 0 -2 -4 0 -1 -3 0 0 4 4 -4 0 0 8 -4 0 0 0 -4 0 3 -4 0 2 4 0 0 -1
+1 0 0 2 -1 -6 -6 -2 -4 0 2 4 4 4 -2 -4 2 8 2 -8 0 0 4 -2 -1 6 -2 -1 0 4 -2 4 2 0 2 4 0 2 -2 -4 6 -2 -2 4 0 -6 -4 0 -4 4 0 8 -4 -4 2 4 -4 -2 2 0 2 -8 1 1 -2 0 -6 0 0 2 0 -4 -2 2 -4 4 6 -4 1 -2 0 0 6 -2 2 -1
+1 0 0 2 -1 -6 6 2 4 0 -2 -4 -4 -4 2 -4 2 8 2 -8 0 0 4 -2 -1 6 -2 -1 0 4 -2 4 -2 0 -2 -4 0 -2 2 4 -6 2 2 -4 0 6 4 0 4 -4 0 8 -4 -4 2 4 -4 -2 2 0 2 -8 1 1 -2 0 -6 0 0 -2 0 4 2 -2 4 -4 -6 4 1 -2 0 0 6 2 -2 -1
+1 0 -2 4 1 -8 0 0 0 0 0 0 0 0 0 -4 4 8 -4 8 4 4 -8 4 1 -4 4 -1 -6 -4 -4 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -8 -8 4 4 4 8 -4 -4 6 -4 -8 -1 1 4 -4 4 0 0 0 0 0 0 0 0 0 0 0 -1 -4 4 2 4 0 0 -1
+1 0 6 -8 1 -4 4 4 -4 -16 4 0 8 -4 4 4 0 8 0 8 4 -4 0 0 1 -8 -8 -1 2 4 0 0 -4 0 -4 0 0 4 4 8 4 4 -4 -8 0 -4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 8 -8 -1 1 0 4 8 0 0 -4 16 -8 -4 -4 4 4 -4 0 -1 8 -4 -6 8 -4 4 -1
+1 -2 -2 -4 -1 4 4 0 2 0 -4 4 0 2 0 0 0 0 0 0 4 0 0 0 1 4 -4 -1 -2 0 0 0 -2 -4 -4 0 0 0 -4 0 4 -2 0 0 0 4 0 -4 0 0 4 0 0 0 0 0 0 0 0 -2 -4 0 1 -1 0 0 4 0 0 0 0 0 -4 0 2 2 4 4 -1 -4 0 -2 4 0 -2 1
+1 -2 0 -6 -3 6 6 6 -6 0 6 0 -12 6 2 -12 -2 0 2 0 0 0 -12 6 -1 -6 6 3 0 12 -6 12 0 -12 -6 0 0 -6 -6 12 -6 0 -6 12 0 -6 0 12 0 0 0 0 12 12 -6 -12 -12 -2 6 0 6 0 -1 3 2 0 -6 4 -4 6 0 -12 6 2 6 -6 6 0 -3 -6 0 0 6 -2 0 1
+1 -2 -2 0 -1 0 4 0 -2 8 4 4 -8 -2 0 0 -4 0 -4 0 -4 0 0 4 1 0 0 -1 6 0 4 0 -2 4 4 0 -8 0 4 -8 4 -2 0 -8 -8 4 0 4 0 0 -4 0 0 0 4 0 0 -4 4 6 0 0 1 -1 -4 0 0 0 0 0 8 -8 4 0 -2 -2 4 4 -1 0 0 -2 0 0 -2 1
+1 -2 0 2 -3 -2 -2 6 2 0 -2 0 4 -2 2 4 -2 0 2 0 0 0 4 6 -1 2 -2 3 0 -4 -6 -4 0 4 2 0 0 -6 2 -4 2 0 -6 -4 0 2 0 -4 0 0 0 0 -4 -4 -6 4 4 -2 6 0 -2 0 -1 3 2 0 2 4 -4 6 0 4 -2 2 -2 2 -2 0 -3 2 0 0 -2 -2 0 1
+1 -2 0 -2 -3 2 -2 6 -2 0 -2 0 4 2 2 4 2 0 -2 0 0 0 -4 -6 -1 -2 2 3 0 -4 6 4 0 -4 2 0 0 -6 2 -4 2 0 -6 -4 0 2 0 4 0 0 0 0 4 -4 6 4 -4 2 -6 0 2 0 -1 3 -2 0 -2 -4 4 6 0 4 -2 2 2 -2 -2 0 -3 -2 0 0 2 -2 0 1
+1 -2 -2 0 -1 0 -4 0 -2 8 -4 4 8 -2 0 0 4 0 4 0 -4 0 0 -4 1 0 0 -1 6 0 -4 0 -2 4 -4 0 -8 0 -4 8 -4 -2 0 8 -8 -4 0 4 0 0 -4 0 0 0 -4 0 0 4 -4 6 0 0 1 -1 4 0 0 0 0 0 8 8 -4 0 -2 -2 -4 4 -1 0 0 -2 0 0 -2 1
+1 -2 0 -2 1 -2 2 -2 -2 0 2 0 4 2 2 0 -2 0 2 0 0 4 4 -2 -1 -2 2 -1 0 0 2 -4 0 4 -2 -4 0 2 -2 -4 -2 0 2 -4 0 -2 -4 -4 4 4 0 0 -4 0 2 0 4 -2 -2 0 2 0 -1 -1 2 4 -2 0 0 -2 0 4 2 2 2 -2 2 0 1 -2 -4 0 2 -2 0 1
+1 -2 -2 0 3 -4 0 0 -2 8 8 -4 0 -2 0 -4 0 8 0 8 -4 -4 0 0 1 0 0 3 -2 -4 0 0 -2 -4 0 -4 8 0 0 0 0 -2 0 0 8 0 -4 -4 -4 -4 -4 8 0 -4 0 -4 0 0 0 -2 0 8 1 3 0 -4 0 4 4 0 8 0 0 0 -2 -2 0 -4 3 0 -4 -2 0 0 -2 1
+1 -2 6 -4 -1 -4 0 4 2 8 0 -4 0 2 -4 0 0 0 0 0 -4 0 8 0 1 -4 -4 -1 -2 0 0 8 2 -4 0 0 -8 4 0 0 0 2 4 0 -8 0 0 -4 0 0 -4 0 8 0 0 0 8 0 0 -2 -4 0 1 -1 0 0 -4 0 0 4 8 0 0 -4 2 2 0 -4 -1 -4 0 6 -4 -4 2 1
+1 -2 0 2 1 -6 2 -2 2 0 2 0 4 -2 2 0 2 0 -2 0 0 4 -4 2 -1 2 -2 -1 0 0 -2 4 0 -4 -2 4 0 2 -2 -4 -2 0 2 -4 0 -2 4 4 -4 -4 0 0 4 0 -2 0 -4 2 2 0 -2 0 -1 -1 -2 4 2 0 0 -2 0 4 2 2 -2 2 2 0 1 2 -4 0 -2 -2 0 1
+1 -2 6 -4 3 -8 4 -12 2 8 -4 4 8 2 -4 -4 4 -8 4 -8 12 -4 -8 12 1 -4 -4 3 6 -4 12 -8 2 4 4 -12 8 -12 4 8 4 2 -12 8 8 4 -12 4 -12 -12 12 -8 -8 -4 12 -4 -8 4 12 6 -4 -8 1 3 4 -4 -4 -4 -4 -12 8 8 4 -4 2 2 4 4 3 -4 -4 6 -4 -4 2 1
+1 -2 0 -6 1 2 6 2 2 0 -2 0 4 -2 -2 0 2 -8 -2 8 0 -4 4 2 -1 2 6 -1 0 0 -2 -4 4 -4 2 -4 0 -2 2 -4 -6 4 -2 -4 0 -6 -4 4 4 4 0 8 -4 0 -2 0 4 2 2 0 6 -8 -1 -1 -2 -4 2 0 0 2 0 4 -2 -2 -2 2 6 0 1 -6 4 0 -2 2 -4 1
+1 -2 0 -2 1 -2 -2 2 -2 0 6 0 4 2 -2 0 -2 8 2 -8 0 -4 -4 -2 -1 6 2 -1 0 0 2 4 4 4 -6 4 0 -2 -6 -4 2 4 -2 -4 0 2 4 -4 -4 -4 0 -8 4 0 2 0 -4 -2 -2 0 2 8 -1 -1 2 -4 6 0 0 2 0 4 6 -2 2 -2 -2 0 1 -2 4 0 -6 2 -4 1
+1 -2 -2 4 -1 -4 -4 0 2 0 4 4 0 2 0 0 0 0 0 0 4 0 0 0 1 -4 4 -1 -2 0 0 0 -2 -4 4 0 0 0 4 0 -4 -2 0 0 0 -4 0 -4 0 0 4 0 0 0 0 0 0 0 0 -2 4 0 1 -1 0 0 -4 0 0 0 0 0 4 0 2 2 -4 4 -1 4 0 -2 -4 0 -2 1
+1 -2 -2 0 3 -4 0 0 6 -8 8 -4 0 6 0 12 0 -8 0 -8 -4 -4 0 0 1 0 0 3 -2 12 0 0 -2 12 0 -4 -8 0 0 0 0 -2 0 0 -8 0 -4 12 -4 -4 -4 -8 0 12 0 12 0 0 0 -2 0 -8 1 3 0 -4 0 4 4 0 -8 0 0 0 6 6 0 -4 3 0 -4 -2 0 0 -2 1
+1 -2 0 6 -3 -6 6 6 6 0 6 0 -12 -6 2 -12 2 0 -2 0 0 0 12 -6 -1 6 -6 3 0 12 6 -12 0 12 -6 0 0 -6 -6 12 -6 0 -6 12 0 -6 0 -12 0 0 0 0 -12 12 6 -12 12 2 -6 0 -6 0 -1 3 -2 0 6 -4 4 6 0 -12 6 2 -6 6 6 0 -3 6 0 0 -6 -2 0 1
+1 -2 6 -12 3 0 12 12 -6 -24 4 -12 24 -6 4 12 -4 24 -4 24 12 12 -24 -12 1 -12 -12 3 6 12 -12 -24 -6 -12 12 -12 -24 12 12 24 12 -6 12 24 -24 12 -12 -12 -12 -12 12 24 -24 12 -12 12 -24 -4 -12 6 -12 24 1 3 -4 12 -12 -4 -4 12 -24 24 12 4 -6 -6 12 -12 3 -12 12 6 -12 4 -6 1
+1 -4 -2 -4 1 8 8 0 4 0 -8 0 0 4 0 4 4 -8 -4 -8 4 -4 8 4 1 4 -4 -1 -6 4 -4 -8 -4 0 8 0 16 0 -8 0 8 4 0 0 -16 -8 0 0 0 0 -4 8 8 -4 4 -4 -8 -4 -4 6 4 8 -1 1 4 4 -4 0 0 0 0 0 8 0 -4 -4 -8 0 -1 4 -4 2 -4 0 4 -1
+1 -4 0 -2 -1 6 6 2 -4 0 -2 4 -4 4 2 -4 -2 8 -2 -8 0 0 -4 2 -1 -6 2 -1 0 4 2 -4 2 0 -2 4 0 -2 2 4 -6 -2 2 -4 0 6 -4 0 -4 4 0 8 4 -4 -2 4 4 2 -2 0 -2 -8 1 1 2 0 6 0 0 -2 0 4 2 -2 -4 4 -6 -4 1 2 0 0 -6 2 2 -1
+1 -4 -2 0 1 4 0 0 0 8 0 0 0 0 0 -4 0 0 0 0 -4 -4 0 0 1 0 0 -1 2 -4 0 0 -4 0 0 0 -8 0 0 0 0 4 0 0 8 0 0 0 0 0 4 0 0 4 0 4 0 0 0 -2 0 0 -1 1 0 4 0 0 0 0 -8 0 0 0 0 0 0 0 -1 0 -4 2 0 0 4 -1
+1 -4 0 2 -1 2 -2 2 0 0 -2 4 4 0 2 4 2 0 2 0 0 0 -4 -2 -1 -2 -2 -1 0 -4 -2 -4 2 0 -2 -4 0 -2 2 -4 2 -2 2 4 0 -2 4 0 4 -4 0 0 4 4 2 -4 4 -2 2 0 2 0 1 1 -2 0 2 0 0 -2 0 -4 2 -2 0 0 2 -4 1 -2 0 0 -2 2 2 -1
+1 -4 0 6 -1 -2 -2 2 4 0 6 4 -4 -4 2 -4 -2 -8 -2 8 0 0 -4 2 -1 2 -6 -1 0 4 2 -4 2 0 6 4 0 -2 -6 4 2 -2 2 -4 0 -2 -4 0 -4 4 0 -8 4 -4 -2 4 4 2 -2 0 6 8 1 1 2 0 -2 0 0 -2 0 4 -6 -2 4 -4 2 -4 1 -6 0 0 2 2 2 -1
+1 -4 0 2 3 -2 2 -6 0 0 10 -4 4 0 2 0 -2 0 -2 0 0 -4 4 -6 -1 -2 -2 3 0 0 -6 4 2 0 2 0 0 6 -2 -4 -2 -2 -6 4 0 2 0 0 0 0 0 0 -4 0 6 0 -4 2 6 0 2 0 1 -3 2 4 2 -4 -4 6 0 -4 -2 -2 0 0 -2 4 -3 -2 4 0 -2 2 2 -1
+1 -4 6 0 1 -4 4 -4 0 0 4 0 8 0 -4 -4 0 -8 0 -8 4 4 0 0 1 0 0 -1 2 -4 0 0 0 0 -4 0 0 -4 4 8 4 0 4 -8 0 -4 0 0 0 0 -4 8 0 4 0 4 0 0 0 -2 0 8 -1 1 0 -4 0 0 0 4 0 -8 -4 4 0 0 -4 0 -1 0 4 -6 0 4 0 -1
+1 -4 0 -6 3 6 6 6 0 0 -2 -12 12 0 -2 0 -2 0 -2 0 0 12 -12 -6 -1 6 6 3 0 0 -6 -12 6 0 6 0 0 -6 -6 -12 -6 -6 6 12 0 6 0 0 0 0 0 0 12 0 6 0 12 2 6 0 -6 0 1 -3 2 -12 -6 4 4 -6 0 -12 -6 2 0 0 -6 12 -3 6 -12 0 6 -2 6 -1
+1 -4 -2 4 1 0 -8 0 4 0 8 0 0 4 0 4 -4 -8 4 -8 4 -4 -8 -4 1 -4 4 -1 -6 4 4 8 -4 0 -8 0 16 0 8 0 -8 4 0 0 -16 8 0 0 0 0 -4 8 -8 -4 -4 -4 8 4 4 6 -4 8 -1 1 -4 4 4 0 0 0 0 0 -8 0 -4 -4 8 0 -1 -4 -4 2 4 0 4 -1
+1 -6 0 2 1 10 2 -2 -2 0 -6 0 -4 2 2 0 2 8 -2 -8 0 -4 4 2 -1 -6 -2 -1 0 0 -2 -4 4 4 6 4 0 2 6 4 -2 4 2 4 0 -2 4 -4 -4 -4 0 -8 -4 0 -2 0 4 2 2 0 -2 8 -1 -1 -2 -4 -6 0 0 -2 0 -4 -6 2 2 -2 2 0 1 2 4 0 6 -2 -4 1
+1 -6 -2 0 3 12 0 0 2 8 -8 -12 0 2 0 -4 0 -8 0 -8 -4 12 0 0 1 0 0 3 -2 -4 0 0 -6 4 0 4 8 0 0 0 0 -6 0 0 8 0 4 4 4 4 -4 -8 0 -4 0 -4 0 0 0 -2 0 -8 1 3 0 12 0 -4 -4 0 8 0 0 0 2 2 0 -12 3 0 12 -2 0 0 -6 1
+1 -6 0 6 1 6 -6 -2 2 0 2 0 -4 -2 2 0 -2 -8 2 8 0 -4 -4 -2 -1 -2 -6 -1 0 0 2 4 4 -4 -2 -4 0 2 -2 4 6 4 2 4 0 6 -4 4 4 4 0 8 4 0 2 0 -4 -2 -2 0 -6 -8 -1 -1 2 -4 -2 0 0 -2 0 -4 2 2 -2 2 -6 0 1 6 4 0 2 -2 -4 1
+1 -6 6 4 3 0 4 -12 -2 -8 12 -4 8 -2 -4 -4 -4 -8 -4 -8 12 -4 8 -12 1 4 4 3 6 -4 -12 8 -2 -4 4 12 -8 -12 4 8 4 -2 -12 8 -8 4 12 -4 12 12 12 -8 8 -4 -12 -4 8 -4 -12 6 4 -8 1 3 -4 -4 4 4 4 -12 -8 8 4 -4 -2 -2 4 -4 3 4 -4 6 4 -4 -2 1
+1 -8 0 6 3 18 -6 -6 0 0 -14 -12 -12 0 2 0 2 0 2 0 0 12 12 6 -1 -6 -6 3 0 0 6 12 6 0 -6 0 0 6 6 12 6 -6 -6 -12 0 -6 0 0 0 0 0 0 -12 0 -6 0 -12 -2 -6 0 6 0 1 -3 -2 -12 6 4 4 6 0 12 6 -2 0 0 6 12 -3 -6 -12 0 -6 2 6 -1
+end
diff --git a/demos/ppl_lcdd/examples/mp5.ext b/demos/ppl_lcdd/examples/mp5.ext
new file mode 100644
index 0000000..dff1bf7
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mp5.ext
@@ -0,0 +1,36 @@
+V-representation
+begin
+32 11 rational
+ 1  1  1  1  1  0  0  0  0  0  0
+ 1  0  0  1  1  0  1  1  1  1  0
+ 1  2/3  2/3  2/3  2/3  2/3  2/3  2/3  2/3  2/3  2/3
+ 1  1  0  1  1  1  0  0  1  1  0
+ 1  0  1  1  1  1  1  1  0  0  0
+ 1  2/3  2/3  1/3  1/3  2/3  1/3  1/3  1/3  1/3  2/3
+ 1  0  1  0  1  1  0  1  1  0  1
+ 1  1  1  0  1  0  1  0  1  0  1
+ 1  1/3  2/3  2/3  2/3  1/3  1/3  1/3  2/3  2/3  2/3
+ 1  0  1  1  0  1  1  0  0  1  1
+ 1  1  1  1  0  0  0  1  0  1  1
+ 1  1/3  1/3  2/3  2/3  2/3  1/3  1/3  1/3  1/3  2/3
+ 1  0  0  0  1  0  0  1  0  1  1
+ 1  1  0  0  1  1  1  0  0  1  1
+ 1  2/3  1/3  2/3  2/3  1/3  2/3  2/3  1/3  1/3  2/3
+ 1  1/3  2/3  1/3  1/3  1/3  2/3  2/3  1/3  1/3  2/3
+ 1  2/3  1/3  1/3  1/3  1/3  1/3  1/3  2/3  2/3  2/3
+ 1  0  0  1  0  0  1  0  1  0  1
+ 1  2/3  2/3  2/3  1/3  2/3  2/3  1/3  2/3  1/3  1/3
+ 1  1  0  1  0  1  0  1  1  0  1
+ 1  2/3  1/3  1/3  2/3  1/3  1/3  2/3  2/3  1/3  1/3
+ 1  1/3  1/3  1/3  2/3  2/3  2/3  1/3  2/3  1/3  1/3
+ 1  1/3  1/3  1/3  1/3  2/3  2/3  2/3  2/3  2/3  2/3
+ 1  0  1  0  0  1  0  0  1  1  0
+ 1  2/3  1/3  2/3  1/3  1/3  2/3  1/3  1/3  2/3  1/3
+ 1  1/3  2/3  1/3  2/3  1/3  2/3  1/3  1/3  2/3  1/3
+ 1  1/3  1/3  2/3  1/3  2/3  1/3  2/3  1/3  2/3  1/3
+ 1  1  1  0  0  0  1  1  1  1  0
+ 1  1/3  2/3  2/3  1/3  1/3  1/3  2/3  2/3  1/3  1/3
+ 1  1  0  0  0  1  1  1  0  0  0
+ 1  2/3  2/3  1/3  2/3  2/3  1/3  2/3  1/3  2/3  1/3
+ 1  0  0  0  0  0  0  0  0  0  0
+end
diff --git a/demos/ppl_lcdd/examples/mp5.ine b/demos/ppl_lcdd/examples/mp5.ine
new file mode 100644
index 0000000..b901024
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mp5.ine
@@ -0,0 +1,45 @@
+* metric polytope on 5 points
+H-representation
+begin
+40 11 integer
+2 -1 -1 0 0 -1 0 0 0 0 0
+0 1 1 0 0 -1 0 0 0 0 0
+0 -1 0 1 0 0 1 0 0 0 0
+0 1 0 1 0 0 -1 0 0 0 0
+0 -1 0 0 1 0 0 1 0 0 0
+0 1 0 0 1 0 0 -1 0 0 0
+0 0 -1 1 0 0 0 0 1 0 0
+0 0 1 -1 0 0 0 0 1 0 0
+0 0 1 1 0 0 0 0 -1 0 0
+0 0 -1 0 1 0 0 0 0 1 0
+0 0 1 0 -1 0 0 0 0 1 0
+0 0 1 0 1 0 0 0 0 -1 0
+0 0 0 1 1 0 0 0 0 0 -1
+0 0 0 1 -1 0 0 0 0 0 1
+0 0 0 -1 1 0 0 0 0 0 1
+2 0 0 0 0 -1 -1 0 -1 0 0
+0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 -1 1 0 1 0 0
+0 0 0 0 0 1 -1 0 1 0 0
+2 0 0 0 0 -1 0 -1 0 -1 0
+0 0 0 0 0 1 0 1 0 -1 0
+0 0 0 0 0 -1 0 1 0 1 0
+0 0 0 0 0 1 0 -1 0 1 0
+2 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 0 -1 1 0 0 1
+0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 0 0 0 1 1 0 0 -1
+2 0 0 0 0 0 0 0 -1 -1 -1
+0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 0 0 0 -1 1 1
+0 0 0 0 0 0 0 0 1 1 -1
+0 -1 1 0 0 1 0 0 0 0 0
+0 1 -1 0 0 1 0 0 0 0 0
+2 -1 0 -1 0 0 -1 0 0 0 0
+0 1 0 -1 0 0 1 0 0 0 0
+2 -1 0 0 -1 0 0 -1 0 0 0
+0 1 0 0 -1 0 0 1 0 0 0
+2 0 -1 -1 0 0 0 0 -1 0 0
+2 0 -1 0 -1 0 0 0 0 -1 0
+2 0 0 -1 -1 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/mp5a.ine b/demos/ppl_lcdd/examples/mp5a.ine
new file mode 100644
index 0000000..6e18548
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mp5a.ine
@@ -0,0 +1,44 @@
+* metric polytope on 5 points
+begin
+40 11 integer
+2 -1 -1 0 0 -1 0 0 0 0 0
+0 1 1 0 0 -1 0 0 0 0 0
+0 -1 0 1 0 0 1 0 0 0 0
+0 1 0 1 0 0 -1 0 0 0 0
+0 -1 0 0 1 0 0 1 0 0 0
+0 1 0 0 1 0 0 -1 0 0 0
+0 0 -1 1 0 0 0 0 1 0 0
+0 0 1 -1 0 0 0 0 1 0 0
+0 0 1 1 0 0 0 0 -1 0 0
+0 0 -1 0 1 0 0 0 0 1 0
+0 0 1 0 -1 0 0 0 0 1 0
+0 0 1 0 1 0 0 0 0 -1 0
+0 0 0 1 1 0 0 0 0 0 -1
+0 0 0 1 -1 0 0 0 0 0 1
+0 0 0 -1 1 0 0 0 0 0 1
+2 0 0 0 0 -1 -1 0 -1 0 0
+0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 -1 1 0 1 0 0
+0 0 0 0 0 1 -1 0 1 0 0
+2 0 0 0 0 -1 0 -1 0 -1 0
+0 0 0 0 0 1 0 1 0 -1 0
+0 0 0 0 0 -1 0 1 0 1 0
+0 0 0 0 0 1 0 -1 0 1 0
+2 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 0 -1 1 0 0 1
+0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 0 0 0 1 1 0 0 -1
+2 0 0 0 0 0 0 0 -1 -1 -1
+0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 0 0 0 -1 1 1
+0 0 0 0 0 0 0 0 1 1 -1
+0 -1 1 0 0 1 0 0 0 0 0
+0 1 -1 0 0 1 0 0 0 0 0
+2 -1 0 -1 0 0 -1 0 0 0 0
+0 1 0 -1 0 0 1 0 0 0 0
+2 -1 0 0 -1 0 0 -1 0 0 0
+0 1 0 0 -1 0 0 1 0 0 0
+2 0 -1 -1 0 0 0 0 -1 0 0
+2 0 -1 0 -1 0 0 0 0 -1 0
+2 0 0 -1 -1 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/mp6.ine b/demos/ppl_lcdd/examples/mp6.ine
new file mode 100644
index 0000000..7359781
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mp6.ine
@@ -0,0 +1,84 @@
+* metric polytope on 6 points
+begin
+80 16 integer
+0 1 1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+0 -1 0 1 0 0 0 1 0 0 0 0 0 0 0 0
+0 1 0 1 0 0 0 -1 0 0 0 0 0 0 0 0
+0 -1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+0 1 0 0 1 0 0 0 -1 0 0 0 0 0 0 0
+0 -1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+0 1 0 0 0 1 0 0 0 -1 0 0 0 0 0 0
+0 0 -1 1 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 1 -1 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 1 1 0 0 0 0 0 0 -1 0 0 0 0 0
+0 0 -1 0 1 0 0 0 0 0 0 1 0 0 0 0
+0 0 1 0 -1 0 0 0 0 0 0 1 0 0 0 0
+0 0 1 0 1 0 0 0 0 0 0 -1 0 0 0 0
+0 0 -1 0 0 1 0 0 0 0 0 0 1 0 0 0
+0 0 1 0 0 -1 0 0 0 0 0 0 1 0 0 0
+0 0 1 0 0 1 0 0 0 0 0 0 -1 0 0 0
+0 0 0 1 1 0 0 0 0 0 0 0 0 -1 0 0
+0 0 0 1 -1 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 -1 1 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 1 0 1 0 0 0 0 0 0 0 0 -1 0
+0 0 0 1 0 -1 0 0 0 0 0 0 0 0 1 0
+0 0 0 -1 0 1 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 -1
+0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 1
+0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 1
+2 0 0 0 0 0 -1 -1 0 0 -1 0 0 0 0 0
+0 0 0 0 0 0 1 1 0 0 -1 0 0 0 0 0
+0 0 0 0 0 0 -1 1 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 -1 0 0 1 0 0 0 0 0
+2 0 0 0 0 0 -1 0 -1 0 0 -1 0 0 0 0
+0 0 0 0 0 0 1 0 1 0 0 -1 0 0 0 0
+0 0 0 0 0 0 -1 0 1 0 0 1 0 0 0 0
+0 0 0 0 0 0 1 0 -1 0 0 1 0 0 0 0
+2 0 0 0 0 0 -1 0 0 -1 0 0 -1 0 0 0
+0 0 0 0 0 0 -1 0 0 1 0 0 1 0 0 0
+0 0 0 0 0 0 1 0 0 1 0 0 -1 0 0 0
+0 0 0 0 0 0 1 0 0 -1 0 0 1 0 0 0
+2 0 0 0 0 0 0 -1 -1 0 0 0 0 -1 0 0
+0 0 0 0 0 0 0 -1 1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 -1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 1 0 0 0 0 -1 0 0
+2 0 0 0 0 0 0 -1 0 -1 0 0 0 0 -1 0
+0 0 0 0 0 0 0 -1 0 1 0 0 0 0 1 0
+0 0 0 0 0 0 0 1 0 -1 0 0 0 0 1 0
+0 0 0 0 0 0 0 1 0 1 0 0 0 0 -1 0
+2 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 -1
+0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 -1
+2 0 0 0 0 0 0 0 0 0 -1 -1 0 -1 0 0
+0 0 0 0 0 0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 0 0 0 0 0 1 -1 0 1 0 0
+0 0 0 0 0 0 0 0 0 0 -1 1 0 1 0 0
+2 0 0 0 0 0 0 0 0 0 -1 0 -1 0 -1 0
+0 0 0 0 0 0 0 0 0 0 1 0 1 0 -1 0
+0 0 0 0 0 0 0 0 0 0 1 0 -1 0 1 0
+0 0 0 0 0 0 0 0 0 0 -1 0 1 0 1 0
+2 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 1
+2 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1
+2 -1 -1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+0 -1 1 0 0 0 1 0 0 0 0 0 0 0 0 0
+0 1 -1 0 0 0 1 0 0 0 0 0 0 0 0 0
+2 -1 0 -1 0 0 0 -1 0 0 0 0 0 0 0 0
+0 1 0 -1 0 0 0 1 0 0 0 0 0 0 0 0
+2 -1 0 0 -1 0 0 0 -1 0 0 0 0 0 0 0
+0 1 0 0 -1 0 0 0 1 0 0 0 0 0 0 0
+2 -1 0 0 0 -1 0 0 0 -1 0 0 0 0 0 0
+0 1 0 0 0 -1 0 0 0 1 0 0 0 0 0 0
+2 0 -1 -1 0 0 0 0 0 0 -1 0 0 0 0 0
+2 0 -1 0 -1 0 0 0 0 0 0 -1 0 0 0 0
+2 0 -1 0 0 -1 0 0 0 0 0 0 -1 0 0 0
+2 0 0 -1 -1 0 0 0 0 0 0 0 0 -1 0 0
+2 0 0 -1 0 -1 0 0 0 0 0 0 0 0 -1 0
+2 0 0 0 -1 -1 0 0 0 0 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/nonfull.ine b/demos/ppl_lcdd/examples/nonfull.ine
new file mode 100644
index 0000000..b662f47
--- /dev/null
+++ b/demos/ppl_lcdd/examples/nonfull.ine
@@ -0,0 +1,11 @@
+* non full-dimensional polyhedron
+H-representation
+begin
+    6      4    integer
+  2   -1   0   0
+ -2    1   0   0
+  2    0  -1   0
+ -1    1   0   0
+ -1    0   1   0
+ -1    0   0   1
+end
diff --git a/demos/ppl_lcdd/examples/origin.ine b/demos/ppl_lcdd/examples/origin.ine
new file mode 100644
index 0000000..a755533
--- /dev/null
+++ b/demos/ppl_lcdd/examples/origin.ine
@@ -0,0 +1,14 @@
+* The polytope consists of a single point, the origin.
+* cddlib now works properly for this input (version 090c and up).
+H-representation
+begin
+    7   7     integer
+ 0  1  0  0  0  0  0
+ 0  0  1  0  0  0  0
+ 0  0  0  1  0  0  0
+ 0  0  0  0  1  0  0
+ 0  0  0  0  0  1  0
+ 0  0  0  0  0  0  1
+ 0 -1 -1 -1 -1 -1 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/prodst62.ext b/demos/ppl_lcdd/examples/prodst62.ext
new file mode 100644
index 0000000..6fcd39e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/prodst62.ext
@@ -0,0 +1,3467 @@
+* Created by Alain Prodon.
+* Convex hull problem and the number of facets is 168.
+V-representation
+begin
+  3461 25  integer
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 1 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/project1_m.ine b/demos/ppl_lcdd/examples/project1_m.ine
new file mode 100644
index 0000000..af7e014
--- /dev/null
+++ b/demos/ppl_lcdd/examples/project1_m.ine
@@ -0,0 +1,24 @@
+H-representation
+begin
+20  7  integer
+  1  0  0  0  1  0  0
+  1  0  0  0  0  1  0
+  1  0  0  0  0  0  1
+  1  0  0  0  -1  0  0
+  1  0  0  0  0  -1  0
+  1  0  0  0  0  0  -1
+  1  1  0  0  -1  0  0
+  1  0  1  0  0  -1  0
+  1  0  0  1  0  0  -1
+  1  -1  0  0  1  0  0
+  1  0  -1  0  0  1  0
+  1  0  0  -1  0  0  1
+  2  1  1  1  -1  -1  -1
+  2  -1  1  1  1  -1  -1
+  2  1  -1  1  -1  1  -1
+  2  1  1  -1  -1  -1  1
+  2  -1  -1  1  1  1  -1
+  2  1  -1  -1  -1  1  1
+  2  -1  1  -1  1  -1  1
+  2  -1  -1  -1  1  1  1
+end
diff --git a/demos/ppl_lcdd/examples/project1res.ine b/demos/ppl_lcdd/examples/project1res.ine
new file mode 100644
index 0000000..d89603e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/project1res.ine
@@ -0,0 +1,18 @@
+H-representation
+begin
+14  4  integer
+  5  -1  -1  1
+  2  0  0  1
+  5  -1  1  1
+  5  1  -1  1
+  2  1  0  0
+  5  1  1  1
+  5  1  1  -1
+  5  1  -1  -1
+  2  0  1  0
+  5  -1  1  -1
+  2  0  0  -1
+  5  -1  -1  -1
+  2  0  -1  0
+  2  -1  0  0
+end
diff --git a/demos/ppl_lcdd/examples/project2_m.ine b/demos/ppl_lcdd/examples/project2_m.ine
new file mode 100644
index 0000000..a71cbff
--- /dev/null
+++ b/demos/ppl_lcdd/examples/project2_m.ine
@@ -0,0 +1,66 @@
+H-representation
+begin
+62  7  integer
+  7  0  0  0  -3  1  -2
+  9  0  0  0  -2  -1  -3
+  7  0  0  0  -2  1  -3
+  9  0  0  0  -3  -1  -2
+  3  0  0  0  -2  3  -1
+  1  0  0  0  -2  3  1
+  5  0  0  0  -3  2  -1
+  3  0  0  0  -3  2  1
+  3  0  0  0  1  -3  2
+  1  0  0  0  1  -2  3
+  5  0  0  0  -1  -3  2
+  3  0  0  0  -1  -2  3
+  -3  0  0  0  1  2  3
+  -3  0  0  0  1  3  2
+  -1  0  0  0  -1  2  3
+  -1  0  0  0  -1  3  2
+  1  0  0  0  3  1  -2
+  5  0  0  0  2  -1  -3
+  3  0  0  0  3  -1  -2
+  3  0  0  0  2  1  -3
+  -1  0  0  0  2  3  -1
+  -1  0  0  0  3  2  -1
+  -3  0  0  0  2  3  1
+  -3  0  0  0  3  2  1
+  -3  0  0  0  2  1  3
+  -1  0  0  0  3  -1  2
+  -1  0  0  0  2  -1  3
+  -3  0  0  0  3  1  2
+  3  0  0  0  2  -3  1
+  5  0  0  0  2  -3  -1
+  1  0  0  0  3  -2  1
+  3  0  0  0  3  -2  -1
+  3  0  0  0  -1  3  -2
+  5  0  0  0  -1  2  -3
+  1  0  0  0  1  3  -2
+  3  0  0  0  1  2  -3
+  9  0  0  0  -1  -2  -3
+  9  0  0  0  -1  -3  -2
+  7  0  0  0  1  -2  -3
+  7  0  0  0  1  -3  -2
+  5  0  0  0  -3  -1  2
+  1  0  0  0  -2  1  3
+  3  0  0  0  -2  -1  3
+  3  0  0  0  -3  1  2
+  7  0  0  0  -2  -3  1
+  9  0  0  0  -2  -3  -1
+  7  0  0  0  -3  -2  1
+  9  0  0  0  -3  -2  -1
+  0  1  0  0  -1  0  0
+  0  0  1  0  0  -1  0
+  0  0  0  1  0  0  -1
+  2  -1  0  0  1  0  0
+  2  0  -1  0  0  1  0
+  2  0  0  -1  0  0  1
+  -1  1  1  1  -1  -1  -1
+  1  -1  1  1  1  -1  -1
+  1  1  -1  1  -1  1  -1
+  1  1  1  -1  -1  -1  1
+  3  -1  -1  1  1  1  -1
+  3  1  -1  -1  -1  1  1
+  3  -1  1  -1  1  -1  1
+  5  -1  -1  -1  1  1  1
+end
diff --git a/demos/ppl_lcdd/examples/project2res.ine b/demos/ppl_lcdd/examples/project2res.ine
new file mode 100644
index 0000000..740f2aa
--- /dev/null
+++ b/demos/ppl_lcdd/examples/project2res.ine
@@ -0,0 +1,90 @@
+H-representation
+begin
+86  4  integer
+  9  -2  1  -1
+  16  -3  1  -2
+  20  -3  -1  -2
+  12  -3  2  -1
+  8  -3  2  1
+  8  -2  -1  3
+  4  -2  1  3
+  8  -2  3  -1
+  4  -2  3  1
+  9  -1  -2  1
+  11  -2  -2  2
+  5  -1  -1  2
+  1  -1  1  2
+  3  -2  2  2
+  1  -1  2  1
+  4  0  0  -1
+  0  0  1  0
+  8  -1  -2  3
+  12  -1  -3  2
+  0  -1  2  3
+  0  -1  3  2
+  5  1  -2  1
+  8  1  -3  2
+  4  1  -2  3
+  1  1  -1  2
+  -3  1  1  2
+  -4  1  2  3
+  -4  1  3  2
+  -3  1  2  1
+  3  2  -2  2
+ -5  2  2  2
+  8  2  1  -3
+  12  2  -1  -3
+  0  2  3  -1
+  -4  2  3  1
+  1  2  -1  1
+  4  3  -2  1
+  0  3  -1  2
+  -3  2  1  1
+  -4  3  1  2
+  -4  3  2  1
+  0  1  0  0
+  0  3  2  -1
+  4  3  1  -2
+  1  2  1  -1
+  8  3  -1  -2
+  8  3  -2  -1
+  5  2  -1  -1
+  0  2  -1  3
+  -4  2  1  3
+  8  2  -3  1
+  12  2  -3  -1
+  3  2  2  -2
+  11 2  -2  -2
+  1  1  2  -1
+  4  1  3  -2
+  8  1  2  -3
+  5  1  1  -2
+  9  1  -1  -2
+  16  1  -2  -3
+  16  1  -3  -2
+  9  1  -2  -1
+  12  -1  2  -3
+  8  -1  3  -2
+  20  -1  -2  -3
+  20  -1  -3  -2
+  0  0  0  1
+  4  0  -1  0
+  5  -1  2  -1
+  11 -2  2  -2
+  9  -1  1  -2
+  13  -1  -1  -2
+  19 -2  -2  -2
+  13  -1  -2  -1
+  16  -2  1  -3
+  20  -2  -1  -3
+  16  -2  -3  1
+  20  -2  -3  -1
+  12  -3  -1  2
+  8  -3  1  2
+  5  -2  1  1
+  16  -3  -2  1
+  20  -3  -2  -1
+  9  -2  -1  1
+  13  -2  -1  -1
+  4  -1  0  0
+end
diff --git a/demos/ppl_lcdd/examples/rcubocta.ine b/demos/ppl_lcdd/examples/rcubocta.ine
new file mode 100644
index 0000000..909db72
--- /dev/null
+++ b/demos/ppl_lcdd/examples/rcubocta.ine
@@ -0,0 +1,31 @@
+* Rhombicuboctahedron
+H-representation
+begin
+  26    4   integer
+   1  1  0  0
+   1  0  1  0
+   1  0  0  1
+   1 -1  0  0
+   1  0 -1  0
+   1  0  0 -1
+   2  1  1  1
+   2 -1  1  1
+   2  1 -1  1
+   2  1  1 -1
+   2 -1 -1  1
+   2  1 -1 -1
+   2 -1  1 -1
+   2 -1 -1 -1
+   3  2  2  0
+   3  0  2  2
+   3  2  0  2
+   3 -2  2  0
+   3  0 -2  2
+   3  2  0 -2
+   3  2 -2  0
+   3  0  2 -2
+   3 -2  0  2
+   3 -2 -2  0
+   3  0 -2 -2
+   3 -2  0 -2
+end
diff --git a/demos/ppl_lcdd/examples/redcheck.ext b/demos/ppl_lcdd/examples/redcheck.ext
new file mode 100644
index 0000000..e970c42
--- /dev/null
+++ b/demos/ppl_lcdd/examples/redcheck.ext
@@ -0,0 +1,11 @@
+V-representation
+begin
+  7  3  integer
+ 1 0 0
+ 1 2 0
+ 1 0 2
+ 1 1 1
+ 1 2 1
+ 1 1 2
+ 1 2 2
+end
diff --git a/demos/ppl_lcdd/examples/reg24-5.ext b/demos/ppl_lcdd/examples/reg24-5.ext
new file mode 100644
index 0000000..b755b67
--- /dev/null
+++ b/demos/ppl_lcdd/examples/reg24-5.ext
@@ -0,0 +1,31 @@
+* The vertices of a self-dual 4-dim regular polytope
+* with 24 octahedron facets.
+* We use hull option to compute all (24) facet inequalities.
+V-representation
+begin
+  24  5  integer
+ 1  1  1  1  1
+ 1  1  1  1 -1
+ 1  1  1 -1  1
+ 1  1  1 -1 -1
+ 1  1 -1  1  1
+ 1  1 -1  1 -1
+ 1  1 -1 -1  1
+ 1  1 -1 -1 -1
+ 1 -1  1  1  1
+ 1 -1  1  1 -1
+ 1 -1  1 -1  1
+ 1 -1  1 -1 -1
+ 1 -1 -1  1  1
+ 1 -1 -1  1 -1
+ 1 -1 -1 -1  1
+ 1 -1 -1 -1 -1
+ 1  2  0  0  0
+ 1  0  2  0  0
+ 1  0  0  2  0
+ 1  0  0  0  2
+ 1 -2  0  0  0
+ 1  0 -2  0  0
+ 1  0  0 -2  0
+ 1  0  0  0 -2
+end
diff --git a/demos/ppl_lcdd/examples/reg24-5.ine b/demos/ppl_lcdd/examples/reg24-5.ine
new file mode 100644
index 0000000..d984817
--- /dev/null
+++ b/demos/ppl_lcdd/examples/reg24-5.ine
@@ -0,0 +1,30 @@
+* The facets of a self-dual 4-dim regular polytope
+* with 24 octahedron facets.
+H-representation
+begin
+  24  5  integer
+ 1  1  1  1  1
+ 1  1  1  1 -1
+ 1  1  1 -1  1
+ 1  1  1 -1 -1
+ 1  1 -1  1  1
+ 1  1 -1  1 -1
+ 1  1 -1 -1  1
+ 1  1 -1 -1 -1
+ 1 -1  1  1  1
+ 1 -1  1  1 -1
+ 1 -1  1 -1  1
+ 1 -1  1 -1 -1
+ 1 -1 -1  1  1
+ 1 -1 -1  1 -1
+ 1 -1 -1 -1  1
+ 1 -1 -1 -1 -1
+ 1  2  0  0  0
+ 1  0  2  0  0
+ 1  0  0  2  0
+ 1  0  0  0  2
+ 1 -2  0  0  0
+ 1  0 -2  0  0
+ 1  0  0 -2  0
+ 1  0  0  0 -2
+end
diff --git a/demos/ppl_lcdd/examples/reg600-5_m.ext b/demos/ppl_lcdd/examples/reg600-5_m.ext
new file mode 100644
index 0000000..4147d7f
--- /dev/null
+++ b/demos/ppl_lcdd/examples/reg600-5_m.ext
@@ -0,0 +1,606 @@
+* The vertices of a 4-dim regular polytope with 600 vertices.
+* Hull computation for finding all 120 facets.
+V-representation
+begin
+600 5 rational
+1 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984
+1 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 6880887944635499/18014398509481984
+1 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0
+1 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 0
+1 -47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984
+1 -47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 18014398509481984/18014398509481984
+1 -47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 -18014398509481984/18014398509481984
+1 -47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 18014398509481984/18014398509481984
+1 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0
+1 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 18014398509481984/18014398509481984 0
+1 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984
+1 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992
+1 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 5566755282423243/9007199254740992
+1 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0
+1 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 0
+1 -20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0
+1 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 0
+1 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992
+1 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 5566755282423243/9007199254740992
+1 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0
+1 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 0
+1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984
+1 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 47162307589214776/18014398509481984
+1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 -18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984
+1 -18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 6880887944635499/18014398509481984
+1 -18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 -6880887944635499/18014398509481984
+1 -18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 6880887944635499/18014398509481984
+1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984
+1 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 47162307589214776/18014398509481984
+1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0
+1 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 6880887944635499/18014398509481984 0
+1 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0
+1 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 0
+1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 20140709815984596/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 20140709815984596/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0
+1 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 5566755282423243/9007199254740992 0
+1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984
+1 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 18014398509481984/18014398509481984
+1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0
+1 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 0
+1 -6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984
+1 -6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 47162307589214776/18014398509481984
+1 -6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 -47162307589214776/18014398509481984
+1 -6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 47162307589214776/18014398509481984
+1 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0
+1 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 47162307589214776/18014398509481984 0
+1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984
+1 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 18014398509481984/18014398509481984
+1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 0
+1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992
+1 -5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 20140709815984596/9007199254740992
+1 -5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 -20140709815984596/9007199254740992
+1 -5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 20140709815984596/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 20140709815984596/9007199254740992 0
+1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2 -2 0 0
+1 -2 0 -2 0
+1 -2 0 0 -2
+1 -2 0 0 2
+1 -2 0 2 0
+1 -2 2 0 0
+1 0 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984
+1 0 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 6880887944635499/18014398509481984
+1 0 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 -6880887944635499/18014398509481984
+1 0 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 6880887944635499/18014398509481984
+1 0 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 0 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 0 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 0 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 0 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984
+1 0 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 47162307589214776/18014398509481984
+1 0 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 -47162307589214776/18014398509481984
+1 0 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 47162307589214776/18014398509481984
+1 0 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992
+1 0 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 20140709815984596/9007199254740992
+1 0 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -20140709815984596/9007199254740992
+1 0 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 20140709815984596/9007199254740992
+1 0 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984
+1 0 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 18014398509481984/18014398509481984
+1 0 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 -18014398509481984/18014398509481984
+1 0 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 18014398509481984/18014398509481984
+1 0 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992
+1 0 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 14573954539866394/9007199254740992
+1 0 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 -14573954539866394/9007199254740992
+1 0 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 14573954539866394/9007199254740992
+1 0 -2 -2 0
+1 0 -2 0 -2
+1 0 -2 0 2
+1 0 -2 2 0
+1 0 0 -2 -2
+1 0 0 -2 2
+1 0 0 2 -2
+1 0 0 2 2
+1 0 2 -2 0
+1 0 2 0 -2
+1 0 2 0 2
+1 0 2 2 0
+1 0 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992
+1 0 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 14573954539866394/9007199254740992
+1 0 5566755282423243/9007199254740992 20140709815984596/9007199254740992 -14573954539866394/9007199254740992
+1 0 5566755282423243/9007199254740992 20140709815984596/9007199254740992 14573954539866394/9007199254740992
+1 0 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984
+1 0 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 18014398509481984/18014398509481984
+1 0 6880887944635499/18014398509481984 47162307589214776/18014398509481984 -18014398509481984/18014398509481984
+1 0 6880887944635499/18014398509481984 47162307589214776/18014398509481984 18014398509481984/18014398509481984
+1 0 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992
+1 0 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 20140709815984596/9007199254740992
+1 0 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -20140709815984596/9007199254740992
+1 0 14573954539866394/9007199254740992 5566755282423243/9007199254740992 20140709815984596/9007199254740992
+1 0 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984
+1 0 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 47162307589214776/18014398509481984
+1 0 18014398509481984/18014398509481984 6880887944635499/18014398509481984 -47162307589214776/18014398509481984
+1 0 18014398509481984/18014398509481984 6880887944635499/18014398509481984 47162307589214776/18014398509481984
+1 0 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 0 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 0 20140709815984596/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 0 20140709815984596/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 0 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984
+1 0 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 6880887944635499/18014398509481984
+1 0 47162307589214776/18014398509481984 18014398509481984/18014398509481984 -6880887944635499/18014398509481984
+1 0 47162307589214776/18014398509481984 18014398509481984/18014398509481984 6880887944635499/18014398509481984
+1 2 -2 0 0
+1 2 0 -2 0
+1 2 0 0 -2
+1 2 0 0 2
+1 2 0 2 0
+1 2 2 0 0
+1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 0
+1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992
+1 5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 20140709815984596/9007199254740992
+1 5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 -20140709815984596/9007199254740992
+1 5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 20140709815984596/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 20140709815984596/9007199254740992 0
+1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984
+1 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 18014398509481984/18014398509481984
+1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0
+1 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 0
+1 6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984
+1 6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 47162307589214776/18014398509481984
+1 6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 -47162307589214776/18014398509481984
+1 6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 47162307589214776/18014398509481984
+1 6880887944635499/18014398509481984 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0
+1 6880887944635499/18014398509481984 18014398509481984/18014398509481984 47162307589214776/18014398509481984 0
+1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984
+1 6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 18014398509481984/18014398509481984
+1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0
+1 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 0
+1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 20140709815984596/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 20140709815984596/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0
+1 14573954539866394/9007199254740992 20140709815984596/9007199254740992 5566755282423243/9007199254740992 0
+1 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0
+1 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 0
+1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984
+1 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 47162307589214776/18014398509481984
+1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984
+1 18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 6880887944635499/18014398509481984
+1 18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 -6880887944635499/18014398509481984
+1 18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 6880887944635499/18014398509481984
+1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984
+1 18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 47162307589214776/18014398509481984
+1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 18014398509481984/18014398509481984 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0
+1 18014398509481984/18014398509481984 47162307589214776/18014398509481984 6880887944635499/18014398509481984 0
+1 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992
+1 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 5566755282423243/9007199254740992
+1 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0
+1 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 0
+1 20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 20140709815984596/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0
+1 20140709815984596/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 0
+1 20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992
+1 20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984
+1 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 6880887944635499/18014398509481984
+1 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0
+1 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 0
+1 47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984
+1 47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 18014398509481984/18014398509481984
+1 47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 -18014398509481984/18014398509481984
+1 47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 18014398509481984/18014398509481984
+1 47162307589214776/18014398509481984 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0
+1 47162307589214776/18014398509481984 6880887944635499/18014398509481984 18014398509481984/18014398509481984 0
+1 47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984
+1 47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 6880887944635499/18014398509481984
+end
diff --git a/demos/ppl_lcdd/examples/rhomtria_m.ine b/demos/ppl_lcdd/examples/rhomtria_m.ine
new file mode 100644
index 0000000..26757d4
--- /dev/null
+++ b/demos/ppl_lcdd/examples/rhomtria_m.ine
@@ -0,0 +1,35 @@
+* Rhombic Triacontahedron
+H-representation
+begin
+30 4 integer
+14411518807585588 -22267021104472812 -8505245247627733 -13761775885668118
+14411518807585588 -22267021104472812 -8505245247627733 13761775885668118
+14411518807585588 -22267021104472812 8505245247627733 -13761775885668118
+14411518807585588 -22267021104472812 8505245247627733 13761775885668118
+14411518807585588 -13761775885668118 -22267021104472812 -8505245247627733
+14411518807585588 -13761775885668118 -22267021104472812 8505245247627733
+14411518807585588 -13761775885668118 22267021104472812 -8505245247627733
+14411518807585588 -13761775885668118 22267021104472812 8505245247627733
+14411518807585588 -8505245247627733 -13761775885668118 -22267021104472812
+14411518807585588 -8505245247627733 -13761775885668118 22267021104472812
+14411518807585588 -8505245247627733 13761775885668118 -22267021104472812
+14411518807585588 -8505245247627733 13761775885668118 22267021104472812
+3602879701896397 -6880887957245578 0 0
+3602879701896397 0 -6880887957245578 0
+3602879701896397 0 0 -6880887957245578
+3602879701896397 0 0 6880887957245578
+3602879701896397 0 6880887957245578 0
+3602879701896397 6880887957245578 0 0
+14411518807585588 8505245247627733 -13761775885668118 -22267021104472812
+14411518807585588 8505245247627733 -13761775885668118 22267021104472812
+14411518807585588 8505245247627733 13761775885668118 -22267021104472812
+14411518807585588 8505245247627733 13761775885668118 22267021104472812
+14411518807585588 13761775885668118 -22267021104472812 -8505245247627733
+14411518807585588 13761775885668118 -22267021104472812 8505245247627733
+14411518807585588 13761775885668118 22267021104472812 -8505245247627733
+14411518807585588 13761775885668118 22267021104472812 8505245247627733
+14411518807585588 22267021104472812 -8505245247627733 -13761775885668118
+14411518807585588 22267021104472812 -8505245247627733 13761775885668118
+14411518807585588 22267021104472812 8505245247627733 -13761775885668118
+14411518807585588 22267021104472812 8505245247627733 13761775885668118
+end
diff --git a/demos/ppl_lcdd/examples/sample.ine b/demos/ppl_lcdd/examples/sample.ine
new file mode 100644
index 0000000..452e1bf
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sample.ine
@@ -0,0 +1,11 @@
+* 3-cube
+H-representation
+begin
+    6    4    rational
+ 10/3  1  0  0
+ 10/3  0  1  0
+ 10/3  0  0  1
+ 10/3 -1  0  0
+ 10/3  0 -1  0
+ 10/3  0  0 -1
+end
diff --git a/demos/ppl_lcdd/examples/sampleh1.ine b/demos/ppl_lcdd/examples/sampleh1.ine
new file mode 100644
index 0000000..93f3df3
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh1.ine
@@ -0,0 +1,9 @@
+* a 3-D cone containing no vertices and a line
+H-representation
+begin
+    3    4   integer
+ 2 -1 -1  0
+ 0  1  0  0
+ 0  0  1  0
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh2.ine b/demos/ppl_lcdd/examples/sampleh2.ine
new file mode 100644
index 0000000..082026d
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh2.ine
@@ -0,0 +1,7 @@
+* a hyperplane with no vertices and rays
+H-representation
+begin
+    1    4   integer
+-1  0  0  1
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh3.ine b/demos/ppl_lcdd/examples/sampleh3.ine
new file mode 100644
index 0000000..b2ace9b
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh3.ine
@@ -0,0 +1,7 @@
+* a 3-D homogeneous cone with no vertices
+H-representation
+begin
+    2    4   integer
+ 0  1  1  0
+ 0  0  1  0
+end
diff --git a/demos/ppl_lcdd/examples/sampleh4.ine b/demos/ppl_lcdd/examples/sampleh4.ine
new file mode 100644
index 0000000..f929e10
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh4.ine
@@ -0,0 +1,12 @@
+* trivial inequalities: the polyhedron is the whole space.
+H-representation
+begin
+    6   4    integer
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh5.ine b/demos/ppl_lcdd/examples/sampleh5.ine
new file mode 100644
index 0000000..ec122d5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh5.ine
@@ -0,0 +1,15 @@
+* test file for redundancy removal
+H-representation
+linearity 1 3
+begin
+    8   4   integer
+ 0  1  0  0
+ 0  0  1  0
+ 0  0  0  1
+ 1 -1 -1 -1
+ 1 -1 -1  0
+ 1  0 -1 -1
+ 1 -1  0 -1
+ 2 -1 -1 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh6.ine b/demos/ppl_lcdd/examples/sampleh6.ine
new file mode 100644
index 0000000..b9c93a7
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh6.ine
@@ -0,0 +1,11 @@
+* test file for forced-equality checking
+H-representation
+begin
+    5   4   integer
+ 0  1  0  0
+ 0  0  1  0
+ 0  0  0  1
+ 1 -1 -1 -1
+-1  1  1  0
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh7.ine b/demos/ppl_lcdd/examples/sampleh7.ine
new file mode 100644
index 0000000..c4c09d2
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh7.ine
@@ -0,0 +1,19 @@
+* test file for redundancy removal
+* the redundant rows are
+* 3 4 5 9 10
+* LP type =  1   Seed = 123
+H-representation
+begin
+  10  3  integer
+ 0 1 0
+ 0 0 1
+ -10000 651 693
+ -10000 697 637
+ -10000 368 824
+ -10000 87 725
+ -10000 387 219
+ -10000 430 202
+ -10000 356 988
+ -10000 674 979
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh8.ine b/demos/ppl_lcdd/examples/sampleh8.ine
new file mode 100644
index 0000000..cf5f54c
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh8.ine
@@ -0,0 +1,110 @@
+* test file for redundancy removal
+* the redundant rows are
+* 10 11 12 14 21 23 26 32 39 40 41 44 46
+* 50 51 54 56 57 59 62 63 64 69 76 77 78
+* 79 83 84 85 87 88 91 94 97
+* LP type =  1   Seed = 123
+H-representation
+begin
+  100  10  integer
+ 0 1 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0
+ 0 0 0 0 0 0 0 1 0 0
+ 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 0 0 0 1
+ -10000 651 693 84 697 637 340 368 824 663
+ -10000 725 742 387 219 751 430 202 745 356
+ -10000 377 674 979 167 815 988 412 676 475
+ -10000 710 275 949 284 629 1 422 974 510
+ -10000 692 945 725 488 271 430 724 225 726
+ -10000 465 258 450 343 87 168 161 103 919
+ -10000 86 79 656 493 832 514 791 506 29
+ -10000 63 630 874 918 877 272 992 119 480
+ -10000 598 926 42 378 288 66 927 919 99
+ -10000 256 354 106 979 641 160 395 225 837
+ -10000 202 388 900 471 160 751 300 731 818
+ -10000 342 502 825 563 639 261 194 984 990
+ -10000 266 406 364 216 448 675 145 694 866
+ -10000 362 983 732 378 134 902 946 877 205
+ -10000 926 125 949 888 234 630 275 707 67
+ -10000 634 81 192 768 652 822 311 961 895
+ -10000 983 597 743 314 696 585 367 396 826
+ -10000 511 545 539 97 111 996 477 35 372
+ -10000 474 103 152 753 159 120 929 161 563
+ -10000 549 793 307 456 444 184 149 792 894
+ -10000 839 488 917 192 168 788 959 245 25
+ -10000 750 165 338 182 392 381 962 117 713
+ -10000 738 827 943 507 914 814 951 663 815
+ -10000 493 339 225 351 450 788 992 167 792
+ -10000 174 773 247 247 180 517 445 599 596
+ -10000 303 26 967 39 535 4 7 335 217
+ -10000 772 173 189 291 668 191 610 677 544
+ -10000 848 642 40 125 865 100 259 534 648
+ -10000 501 622 398 624 118 416 30 17 236
+ -10000 218 602 697 892 322 314 361 573 985
+ -10000 958 856 608 492 563 478 311 614 740
+ -10000 582 913 938 949 715 338 39 726 998
+ -10000 521 805 708 221 624 316 24 127 322
+ -10000 491 189 412 774 418 200 193 633 315
+ -10000 144 679 383 447 989 939 441 631 482
+ -10000 940 241 153 215 149 457 254 207 125
+ -10000 80 873 207 904 684 600 940 431 825
+ -10000 75 100 353 637 432 377 940 758 164
+ -10000 627 721 915 710 8 786 96 17 576
+ -10000 247 104 607 432 540 164 597 282 317
+ -10000 553 787 881 942 152 318 44 509 518
+ -10000 181 772 942 993 916 900 713 694 812
+ -10000 625 26 638 261 385 196 676 717 572
+ -10000 11 911 296 761 658 631 757 817 400
+ -10000 964 989 879 491 490 751 490 97 405
+ -10000 28 461 343 452 480 504 411 242 892
+ -10000 768 746 347 352 724 487 185 767 287
+ -10000 924 228 958 554 352 460 765 742 430
+ -10000 737 986 499 993 721 29 821 416 813
+ -10000 483 458 249 781 584 321 779 209 570
+ -10000 222 166 975 53 765 256 859 469 164
+ -10000 82 696 181 166 375 145 415 496 261
+ -10000 540 309 526 918 439 489 846 417 775
+ -10000 699 145 327 873 467 866 711 393 603
+ -10000 445 668 729 224 654 970 279 789 680
+ -10000 28 659 365 306 186 520 427 176 191
+ -10000 919 58 859 436 105 35 560 716 14
+ -10000 641 238 340 524 205 255 272 14 472
+ -10000 817 22 904 782 573 847 649 100 280
+ -10000 925 277 930 495 736 960 276 726 657
+ -10000 336 54 357 979 941 765 593 630 286
+ -10000 65 113 104 915 222 158 580 520 188
+ -10000 42 617 904 414 588 857 416 94 988
+ -10000 716 49 849 67 607 99 934 184 217
+ -10000 458 32 500 552 108 980 255 998 935
+ -10000 860 936 115 268 231 281 948 209 766
+ -10000 293 330 940 570 857 421 574 481 364
+ -10000 959 949 372 757 306 757 752 312 137
+ -10000 769 303 737 260 187 695 946 723 433
+ -10000 980 564 605 363 776 893 558 616 603
+ -10000 945 23 632 820 54 677 795 616 625
+ -10000 629 692 585 33 674 703 304 489 949
+ -10000 52 903 723 746 692 232 917 933 211
+ -10000 367 566 364 318 607 818 424 234 605
+ -10000 915 305 354 829 469 447 925 188 799
+ -10000 387 596 946 888 751 614 539 295 299
+ -10000 969 902 10 739 289 923 808 28 151
+ -10000 537 152 546 442 182 301 258 265 762
+ -10000 671 288 343 199 694 391 457 947 250
+ -10000 415 734 423 435 696 111 53 227 784
+ -10000 800 992 720 76 40 419 608 182 683
+ -10000 619 627 278 526 453 960 772 992 86
+ -10000 836 623 0 21 371 4 676 964 658
+ -10000 258 677 64 968 62 219 587 308 299
+ -10000 224 823 258 449 575 526 908 585 405
+ -10000 593 660 663 341 36 79 50 242 293
+ -10000 80 761 270 460 82 133 874 559 41
+ -10000 169 539 257 827 222 743 873 929 523
+ -10000 403 167 259 377 76 160 749 448 902
+ -10000 290 5 276 509 342 909 193 443 552
+ -10000 928 326 757 405 598 765 143 833 150
+end
diff --git a/demos/ppl_lcdd/examples/samplev1.ext b/demos/ppl_lcdd/examples/samplev1.ext
new file mode 100644
index 0000000..b68bf9f
--- /dev/null
+++ b/demos/ppl_lcdd/examples/samplev1.ext
@@ -0,0 +1,8 @@
+* a 1-D cone in 3D space
+V-representation
+begin
+    2    4   integer
+  1  1  0  1
+  0  0  1  0
+end
+
diff --git a/demos/ppl_lcdd/examples/samplev2.ext b/demos/ppl_lcdd/examples/samplev2.ext
new file mode 100644
index 0000000..99ab9f6
--- /dev/null
+++ b/demos/ppl_lcdd/examples/samplev2.ext
@@ -0,0 +1,11 @@
+* a 1-D cone in 3D space without any vertices
+V-representation
+linearity  1  3
+begin
+    3    4   integer
+  0  0  0  1
+  1  1  0  0
+  0  1 -1  0
+end
+
+
diff --git a/demos/ppl_lcdd/examples/samplev3.ext b/demos/ppl_lcdd/examples/samplev3.ext
new file mode 100644
index 0000000..bc92ef4
--- /dev/null
+++ b/demos/ppl_lcdd/examples/samplev3.ext
@@ -0,0 +1,16 @@
+* test file for redundancy removal
+* the redundant rows: 2 4 5 6 7
+* the implicit linearities : 8 9
+V-representation
+begin
+  9  3  integer
+ 1 0 0
+ 1 2 0
+ 1 0 2
+ 1 1 1
+ 1 2 1
+ 1 1 2
+ 1 2 2
+ 0 1 0
+ 0 -1 0
+end
diff --git a/demos/ppl_lcdd/examples/trunc10.ine b/demos/ppl_lcdd/examples/trunc10.ine
new file mode 100644
index 0000000..3f5bd91
--- /dev/null
+++ b/demos/ppl_lcdd/examples/trunc10.ine
@@ -0,0 +1,119 @@
+* delta=1/10
+* eps0=1/20
+* scut=1/40
+* pcut=1/40
+begin
+112 11 integer
+3 5 -5 -5 -5 -5 -5 -5 -5 -5 20
+3 -5 -5 -5 -5 -5 -5 -5 -5 -5 20
+3 0 10 0 0 0 0 0 0 0 20
+3 0 20 0 0 0 0 0 0 0 10
+3 5 20 -5 -5 -5 -5 -5 -5 -5 -5
+3 -5 20 -5 -5 -5 -5 -5 -5 -5 -5
+3 0 20 10 0 0 0 0 0 0 0
+3 0 20 0 10 0 0 0 0 0 0
+3 0 20 0 0 10 0 0 0 0 0
+3 0 20 0 0 0 10 0 0 0 0
+3 0 20 0 0 0 0 10 0 0 0
+3 0 20 0 0 0 0 0 10 0 0
+3 0 20 0 0 0 0 0 0 10 0
+3 0 0 10 0 0 0 0 0 0 20
+3 0 0 20 0 0 0 0 0 0 10
+3 5 -5 20 -5 -5 -5 -5 -5 -5 -5
+3 -5 -5 20 -5 -5 -5 -5 -5 -5 -5
+3 0 10 20 0 0 0 0 0 0 0
+3 0 0 20 10 0 0 0 0 0 0
+3 0 0 20 0 10 0 0 0 0 0
+3 0 0 20 0 0 10 0 0 0 0
+3 0 0 20 0 0 0 10 0 0 0
+3 0 0 20 0 0 0 0 10 0 0
+3 0 0 20 0 0 0 0 0 10 0
+3 0 0 0 10 0 0 0 0 0 20
+3 0 0 0 20 0 0 0 0 0 10
+3 5 -5 -5 20 -5 -5 -5 -5 -5 -5
+3 -5 -5 -5 20 -5 -5 -5 -5 -5 -5
+3 0 10 0 20 0 0 0 0 0 0
+3 0 0 10 20 0 0 0 0 0 0
+3 0 0 0 20 10 0 0 0 0 0
+3 0 0 0 20 0 10 0 0 0 0
+3 0 0 0 20 0 0 10 0 0 0
+3 0 0 0 20 0 0 0 10 0 0
+3 0 0 0 20 0 0 0 0 10 0
+3 0 0 0 0 10 0 0 0 0 20
+3 0 0 0 0 20 0 0 0 0 10
+3 5 -5 -5 -5 20 -5 -5 -5 -5 -5
+3 -5 -5 -5 -5 20 -5 -5 -5 -5 -5
+3 0 10 0 0 20 0 0 0 0 0
+3 0 0 10 0 20 0 0 0 0 0
+3 0 0 0 10 20 0 0 0 0 0
+3 0 0 0 0 20 10 0 0 0 0
+3 0 0 0 0 20 0 10 0 0 0
+3 0 0 0 0 20 0 0 10 0 0
+3 0 0 0 0 20 0 0 0 10 0
+3 0 0 0 0 0 10 0 0 0 20
+3 0 0 0 0 0 20 0 0 0 10
+3 5 -5 -5 -5 -5 20 -5 -5 -5 -5
+3 -5 -5 -5 -5 -5 20 -5 -5 -5 -5
+3 0 10 0 0 0 20 0 0 0 0
+3 0 0 10 0 0 20 0 0 0 0
+3 0 0 0 10 0 20 0 0 0 0
+3 0 0 0 0 10 20 0 0 0 0
+3 0 0 0 0 0 20 10 0 0 0
+3 0 0 0 0 0 20 0 10 0 0
+3 0 0 0 0 0 20 0 0 10 0
+3 0 0 0 0 0 0 10 0 0 20
+3 0 0 0 0 0 0 20 0 0 10
+3 5 -5 -5 -5 -5 -5 20 -5 -5 -5
+3 -5 -5 -5 -5 -5 -5 20 -5 -5 -5
+3 0 10 0 0 0 0 20 0 0 0
+3 0 0 10 0 0 0 20 0 0 0
+3 0 0 0 10 0 0 20 0 0 0
+3 0 0 0 0 10 0 20 0 0 0
+3 0 0 0 0 0 10 20 0 0 0
+3 0 0 0 0 0 0 20 10 0 0
+3 0 0 0 0 0 0 20 0 10 0
+3 0 0 0 0 0 0 0 10 0 20
+3 0 0 0 0 0 0 0 20 0 10
+3 5 -5 -5 -5 -5 -5 -5 20 -5 -5
+3 -5 -5 -5 -5 -5 -5 -5 20 -5 -5
+3 0 10 0 0 0 0 0 20 0 0
+3 0 0 10 0 0 0 0 20 0 0
+3 0 0 0 10 0 0 0 20 0 0
+3 0 0 0 0 10 0 0 20 0 0
+3 0 0 0 0 0 10 0 20 0 0
+3 0 0 0 0 0 0 10 20 0 0
+3 0 0 0 0 0 0 0 20 10 0
+3 0 0 0 0 0 0 0 0 10 20
+3 0 0 0 0 0 0 0 0 20 10
+3 5 -5 -5 -5 -5 -5 -5 -5 20 -5
+3 -5 -5 -5 -5 -5 -5 -5 -5 20 -5
+3 0 10 0 0 0 0 0 0 20 0
+3 0 0 10 0 0 0 0 0 20 0
+3 0 0 0 10 0 0 0 0 20 0
+3 0 0 0 0 10 0 0 0 20 0
+3 0 0 0 0 0 10 0 0 20 0
+3 0 0 0 0 0 0 10 0 20 0
+3 0 0 0 0 0 0 0 10 20 0
+1 10 -10 -10 -10 -10 -10 -10 -10 -10 -10
+1 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10
+39 40 0 0 0 0 0 0 0 0 0
+39 -40 0 0 0 0 0 0 0 0 0
+1 0 8 0 0 0 0 0 0 0 0
+1 0 0 8 0 0 0 0 0 0 0
+1 0 0 0 8 0 0 0 0 0 0
+1 0 0 0 0 8 0 0 0 0 0
+1 0 0 0 0 0 8 0 0 0 0
+1 0 0 0 0 0 0 8 0 0 0
+1 0 0 0 0 0 0 0 8 0 0
+1 0 0 0 0 0 0 0 0 8 0
+1 0 0 0 0 0 0 0 0 0 8
+7 0 -8 0 0 0 0 0 0 0 0
+7 0 0 -8 0 0 0 0 0 0 0
+7 0 0 0 -8 0 0 0 0 0 0
+7 0 0 0 0 -8 0 0 0 0 0
+7 0 0 0 0 0 -8 0 0 0 0
+7 0 0 0 0 0 0 -8 0 0 0
+7 0 0 0 0 0 0 0 -8 0 0
+7 0 0 0 0 0 0 0 0 -8 0
+7 0 0 0 0 0 0 0 0 0 -8
+end
diff --git a/demos/ppl_lcdd/examples/trunc7.ine b/demos/ppl_lcdd/examples/trunc7.ine
new file mode 100644
index 0000000..8250bc0
--- /dev/null
+++ b/demos/ppl_lcdd/examples/trunc7.ine
@@ -0,0 +1,65 @@
+* delta=1/7
+* eps0=1/14
+* scut=1/28
+* pcut=1/28
+begin
+58 8 integer
+6 7 -7 -7 -7 -7 -7 28
+6 -7 -7 -7 -7 -7 -7 28
+3 0 7 0 0 0 0 14
+3 0 14 0 0 0 0 7
+6 7 28 -7 -7 -7 -7 -7
+6 -7 28 -7 -7 -7 -7 -7
+3 0 14 7 0 0 0 0
+3 0 14 0 7 0 0 0
+3 0 14 0 0 7 0 0
+3 0 14 0 0 0 7 0
+3 0 0 7 0 0 0 14
+3 0 0 14 0 0 0 7
+6 7 -7 28 -7 -7 -7 -7
+6 -7 -7 28 -7 -7 -7 -7
+3 0 7 14 0 0 0 0
+3 0 0 14 7 0 0 0
+3 0 0 14 0 7 0 0
+3 0 0 14 0 0 7 0
+3 0 0 0 7 0 0 14
+3 0 0 0 14 0 0 7
+6 7 -7 -7 28 -7 -7 -7
+6 -7 -7 -7 28 -7 -7 -7
+3 0 7 0 14 0 0 0
+3 0 0 7 14 0 0 0
+3 0 0 0 14 7 0 0
+3 0 0 0 14 0 7 0
+3 0 0 0 0 7 0 14
+3 0 0 0 0 14 0 7
+6 7 -7 -7 -7 28 -7 -7
+6 -7 -7 -7 -7 28 -7 -7
+3 0 7 0 0 14 0 0
+3 0 0 7 0 14 0 0
+3 0 0 0 7 14 0 0
+3 0 0 0 0 14 7 0
+3 0 0 0 0 0 7 14
+3 0 0 0 0 0 14 7
+6 7 -7 -7 -7 -7 28 -7
+6 -7 -7 -7 -7 -7 28 -7
+3 0 7 0 0 0 14 0
+3 0 0 7 0 0 14 0
+3 0 0 0 7 0 14 0
+3 0 0 0 0 7 14 0
+1 7 -7 -7 -7 -7 -7 -7
+1 -7 -7 -7 -7 -7 -7 -7
+27 28 0 0 0 0 0 0
+27 -28 0 0 0 0 0 0
+5 0 28 0 0 0 0 0
+5 0 0 28 0 0 0 0
+5 0 0 0 28 0 0 0
+5 0 0 0 0 28 0 0
+5 0 0 0 0 0 28 0
+5 0 0 0 0 0 0 28
+23 0 -28 0 0 0 0 0
+23 0 0 -28 0 0 0 0
+23 0 0 0 -28 0 0 0
+23 0 0 0 0 -28 0 0
+23 0 0 0 0 0 -28 0
+23 0 0 0 0 0 0 -28
+end
diff --git a/demos/ppl_lcdd/examples/tsp5.ext b/demos/ppl_lcdd/examples/tsp5.ext
new file mode 100644
index 0000000..b4e6874
--- /dev/null
+++ b/demos/ppl_lcdd/examples/tsp5.ext
@@ -0,0 +1,16 @@
+V-representation
+begin
+12 11 rational
+ 1  0  0  1  1  1  1  0  0  1  0
+ 1  1  0  0  1  0  1  0  1  1  0
+ 1  0  1  0  1  0  1  1  1  0  0
+ 1  0  1  0  1  1  1  0  0  0  1
+ 1  0  1  1  0  0  1  1  0  1  0
+ 1  0  1  1  0  1  0  1  0  0  1
+ 1  1  1  0  0  0  0  1  1  0  1
+ 1  1  1  0  0  0  1  0  0  1  1
+ 1  1  0  1  0  0  0  1  1  1  0
+ 1  1  0  1  0  1  0  0  0  1  1
+ 1  0  0  1  1  1  0  1  1  0  0
+ 1  1  0  0  1  1  0  0  1  0  1
+end
diff --git a/demos/ppl_lcdd/examples/tsp5.ine b/demos/ppl_lcdd/examples/tsp5.ine
new file mode 100644
index 0000000..04563a2
--- /dev/null
+++ b/demos/ppl_lcdd/examples/tsp5.ine
@@ -0,0 +1,30 @@
+H-representation
+linearity 5  1 2 3 4 5
+begin
+25 11 rational
+-2  1  1  1  1  0  0  0  0  0  0
+-2  1  0  0  0  1  1  1  0  0  0
+-3  1  1  1  0  1  1  0  1  0  0
+ 1 -1  0 -1  0  0 -1  0  0  1  0
+ 1 -1 -1  0  0 -1  0  0  0  0  1
+ 1 -1  0  0  0  0  0  0  0  0  0
+ 0  0  0  0  0  0  1  0  0  0  0
+ 0  0  1  0  0  0  0  0  0  0  0
+ 2 -1 -1  0  0 -1  0  0  0  0  0
+ 1  0  0  0  0 -1  0  0  0  0  0
+ 2 -1  0  0  0 -1 -1  0  0  0  0
+-1  1  0  1  0  0  1  0  0  0  0
+ 0  0  0  1  0  0  0  0  0  0  0
+-1  1  1  1  0  0  0  0  0  0  0
+-2  1  1  1  0  1  1  0  0  0  0
+ 2 -1 -1 -1  0  0  0  0  0  0  0
+ 1  0  0 -1  0  0  0  0  0  0  0
+ 2 -1  0 -1  0  0 -1  0  0  0  0
+ 3 -1 -1 -1  0 -1 -1  0  0  0  0
+-1  1  0  0  0  1  1  0  0  0  0
+ 0  0  0  0  0  1  0  0  0  0  0
+-1  1  1  0  0  1  0  0  0  0  0
+ 1  0 -1  0  0  0  0  0  0  0  0
+ 1  0  0  0  0  0 -1  0  0  0  0
+ 0  1  0  0  0  0  0  0  0  0  0
+end
diff --git a/demos/ppl_lcdd/expected_int16 b/demos/ppl_lcdd/expected_int16
new file mode 100644
index 0000000..281f13b
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int16
@@ -0,0 +1,98 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccc6.ext  c458b6a2a77990c6d8fe562c9d223c2c  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+ccp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cut32_16.ext  2f524bae3b4ba2edf72f54183cb702a5  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic16-10.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+reg600-5_m.ext  d41d8cd98f00b204e9800998ecf8427e  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+cyclic17_8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  e8057c28540aa563ef831399d8a15654  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kq20_11_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mit31-20.ine  03aef81d50c861b73302866415184106  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sampleh8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc10.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc7.ine  989656d77040b040f10b241041f7c404  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int16_a b/demos/ppl_lcdd/expected_int16_a
new file mode 100644
index 0000000..8dbcb68
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int16_a
@@ -0,0 +1,85 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cyclic10-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic12-6.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int32 b/demos/ppl_lcdd/expected_int32
new file mode 100644
index 0000000..2e253f8
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int32
@@ -0,0 +1,98 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccc6.ext  c458b6a2a77990c6d8fe562c9d223c2c  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+ccp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cut32_16.ext  2f524bae3b4ba2edf72f54183cb702a5  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d72a192a8057e34b9cd3a9ad112b6cd2  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic16-10.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+reg600-5_m.ext  d41d8cd98f00b204e9800998ecf8427e  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+cyclic17_8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  9e3e0e301762546a26557c8bee786732  -
+in5.ine  c29524500ec4656ca26c5671df46db96  -
+in6.ine  1d81f92f878af596166bc64c20392e5b  -
+in7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  e8057c28540aa563ef831399d8a15654  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kq20_11_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mit31-20.ine  03aef81d50c861b73302866415184106  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sampleh8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc10.ine  edecfb72df1fe7f8c4849cdb3c47bfce  -
+trunc7.ine  989656d77040b040f10b241041f7c404  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int32_a b/demos/ppl_lcdd/expected_int32_a
new file mode 100644
index 0000000..afac8d7
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int32_a
@@ -0,0 +1,85 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int64 b/demos/ppl_lcdd/expected_int64
new file mode 100644
index 0000000..bae6f3d
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int64
@@ -0,0 +1,98 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccc6.ext  c458b6a2a77990c6d8fe562c9d223c2c  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+ccp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cut32_16.ext  2f524bae3b4ba2edf72f54183cb702a5  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d72a192a8057e34b9cd3a9ad112b6cd2  -
+cyclic14-8.ext  a4a97e43ad11ff98450b2a94618e373d  -
+cyclic16-10.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  1324d63c4fe3e0902178254e768e9504  -
+irbox200-4.ext  eb69ce06ed90547eeb9ff98a62ce3b7e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+reg600-5_m.ext  d41d8cd98f00b204e9800998ecf8427e  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+cyclic17_8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  9e3e0e301762546a26557c8bee786732  -
+in5.ine  c29524500ec4656ca26c5671df46db96  -
+in6.ine  1d81f92f878af596166bc64c20392e5b  -
+in7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  e8057c28540aa563ef831399d8a15654  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kq20_11_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mit31-20.ine  03aef81d50c861b73302866415184106  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  3b9b5d0e083f6754a8a208e438159547  -
+sampleh8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc10.ine  edecfb72df1fe7f8c4849cdb3c47bfce  -
+trunc7.ine  989656d77040b040f10b241041f7c404  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int64_a b/demos/ppl_lcdd/expected_int64_a
new file mode 100644
index 0000000..b8e517c
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int64_a
@@ -0,0 +1,85 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d72a192a8057e34b9cd3a9ad112b6cd2  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  9e3e0e301762546a26557c8bee786732  -
+in5.ine  c29524500ec4656ca26c5671df46db96  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  e8057c28540aa563ef831399d8a15654  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  3b9b5d0e083f6754a8a208e438159547  -
+trunc7.ine  989656d77040b040f10b241041f7c404  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int8 b/demos/ppl_lcdd/expected_int8
new file mode 100644
index 0000000..179b90d
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int8
@@ -0,0 +1,98 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccc6.ext  c458b6a2a77990c6d8fe562c9d223c2c  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+ccp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cut32_16.ext  2f524bae3b4ba2edf72f54183cb702a5  -
+cyclic10-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic12-6.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic16-10.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+reg600-5_m.ext  d41d8cd98f00b204e9800998ecf8427e  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic17_8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  d41d8cd98f00b204e9800998ecf8427e  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kq20_11_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mit31-20.ine  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+project2res.ine  d41d8cd98f00b204e9800998ecf8427e  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sampleh8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc10.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int8_a b/demos/ppl_lcdd/expected_int8_a
new file mode 100644
index 0000000..5e7a7d0
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int8_a
@@ -0,0 +1,85 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic10-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic12-6.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  d41d8cd98f00b204e9800998ecf8427e  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  d41d8cd98f00b204e9800998ecf8427e  -
+hexocta.ine  d41d8cd98f00b204e9800998ecf8427e  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+project2res.ine  d41d8cd98f00b204e9800998ecf8427e  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_mpz b/demos/ppl_lcdd/expected_mpz
new file mode 100644
index 0000000..0f5701e
--- /dev/null
+++ b/demos/ppl_lcdd/expected_mpz
@@ -0,0 +1,98 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccc6.ext  c458b6a2a77990c6d8fe562c9d223c2c  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+ccp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cut32_16.ext  2f524bae3b4ba2edf72f54183cb702a5  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d72a192a8057e34b9cd3a9ad112b6cd2  -
+cyclic14-8.ext  a4a97e43ad11ff98450b2a94618e373d  -
+cyclic16-10.ext  a7b2ba7c494b41e0f7faf6f34cb6ca48  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  1324d63c4fe3e0902178254e768e9504  -
+irbox200-4.ext  eb69ce06ed90547eeb9ff98a62ce3b7e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+reg600-5_m.ext  bf50ec3c18bc063d041f07259cbe0977  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+cyclic17_8.ine  7dde598eeb61433637ff7ecd1d9689e0  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  4a3d6132b5a0f2ee9a65e422b520bcce  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  8a75d6463098ed2e2160c33f6955f3ac  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  bba9cb757ba441e33e0a3628fc13ed2c  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  9e3e0e301762546a26557c8bee786732  -
+in5.ine  c29524500ec4656ca26c5671df46db96  -
+in6.ine  1d81f92f878af596166bc64c20392e5b  -
+in7.ine  a5f569a088696cf71dbd23ccf5a2cca6  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  e8057c28540aa563ef831399d8a15654  -
+kkd18_4.ine  1736867592c3f53fb4d062ace63e6ba4  -
+kkd27_5.ine  9c376148791743bbb9d2a6b1467b8a11  -
+kkd38_6.ine  1c692bb63e7d61fad11d3b1e196eabe4  -
+kq20_11_m.ine  a5f569a088696cf71dbd23ccf5a2cca6  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mit31-20.ine  03aef81d50c861b73302866415184106  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  a351f4fc25819a278bdf2244f3f1c3a4  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  3b9b5d0e083f6754a8a208e438159547  -
+sampleh8.ine  8ddc3026fccbbeb3699fc6db254ff981  -
+trunc10.ine  edecfb72df1fe7f8c4849cdb3c47bfce  -
+trunc7.ine  989656d77040b040f10b241041f7c404  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_mpz_a b/demos/ppl_lcdd/expected_mpz_a
new file mode 100644
index 0000000..561cef3
--- /dev/null
+++ b/demos/ppl_lcdd/expected_mpz_a
@@ -0,0 +1,85 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d72a192a8057e34b9cd3a9ad112b6cd2  -
+cyclic14-8.ext  a4a97e43ad11ff98450b2a94618e373d  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  1324d63c4fe3e0902178254e768e9504  -
+irbox200-4.ext  eb69ce06ed90547eeb9ff98a62ce3b7e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  4a3d6132b5a0f2ee9a65e422b520bcce  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  8a75d6463098ed2e2160c33f6955f3ac  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  bba9cb757ba441e33e0a3628fc13ed2c  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  9e3e0e301762546a26557c8bee786732  -
+in5.ine  c29524500ec4656ca26c5671df46db96  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  e8057c28540aa563ef831399d8a15654  -
+kkd18_4.ine  1736867592c3f53fb4d062ace63e6ba4  -
+kkd27_5.ine  9c376148791743bbb9d2a6b1467b8a11  -
+kkd38_6.ine  1c692bb63e7d61fad11d3b1e196eabe4  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  a351f4fc25819a278bdf2244f3f1c3a4  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  3b9b5d0e083f6754a8a208e438159547  -
+trunc7.ine  989656d77040b040f10b241041f7c404  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/ppl_lcdd.cc b/demos/ppl_lcdd/ppl_lcdd.cc
new file mode 100644
index 0000000..5391e47
--- /dev/null
+++ b/demos/ppl_lcdd/ppl_lcdd.cc
@@ -0,0 +1,1294 @@
+/* A sort of clone of the cddlib test program `lcdd'.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+//#define USE_POLKA 1
+//#define USE_POLYLIB 1
+
+#if (!defined(USE_PPL) && !defined(USE_POLKA) && !defined(USE_POLYLIB))
+#define USE_PPL 1
+#elif \
+   (defined(USE_PPL)   && defined(USE_POLKA)) \
+|| (defined(USE_PPL)   && defined(USE_POLYLIB)) \
+|| (defined(USE_POLKA) && defined(USE_POLYLIB))
+#error "Exactly one among USE_PPL, USE_POLKA and USE_POLYLIB must be defined."
+#endif
+
+#if defined(USE_PPL)
+
+#include "ppl.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6
+#error "PPL version 0.6 or following is required"
+#endif
+
+typedef PPL::C_Polyhedron POLYHEDRON_TYPE;
+
+#if !CXX_SUPPORTS_ATTRIBUTE_WEAK
+extern "C" void
+set_GMP_memory_allocation_functions(void) {
+}
+#endif
+
+#elif defined(USE_POLKA)
+
+#include <config.h>
+#include <gmp.h>
+
+extern "C" {
+#define bool polka_bool
+#define true polka_true
+#define false polka_false
+#define POLKA_NUM 3
+#include <polka/poly.h>
+#undef POLKA_NUM
+#undef false
+#undef true
+#undef bool
+#undef pkint_set
+#define pkint_set(a,b) mpz_set((a).rep, (b))
+}
+
+typedef poly_t* POLYHEDRON_TYPE;
+
+#elif defined(USE_POLYLIB)
+
+#include <config.h>
+#include <gmp.h>
+
+extern "C" {
+#include "polylib/polylibgmp.h"
+}
+
+// This is required (and, yes, 20000 is a magic number ;-)
+const unsigned max_constraints_or_generators = 20000;
+
+typedef Polyhedron* POLYHEDRON_TYPE;
+
+#endif
+
+#include "timings.hh"
+#include <gmpxx.h>
+#include <vector>
+#include <set>
+#include <cstdarg>
+#include <csignal>
+#include <cerrno>
+#include <cstring>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <stdexcept>
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+// Include this for `getopt()': especially important if we do not have
+// <getopt.h>.
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., `ru_utime'.
+# include <sys/resource.h>
+#endif
+
+namespace {
+
+#ifdef HAVE_GETOPT_H
+struct option long_options[] = {
+  {"max-cpu",        required_argument, 0, 'C'},
+  {"max-memory",     required_argument, 0, 'R'},
+  {"help",           no_argument,       0, 'h'},
+  {"version",        no_argument,       0, 'V'},
+  {"output",         required_argument, 0, 'o'},
+  {"timings",        no_argument,       0, 't'},
+  {"verbose",        no_argument,       0, 'v'},
+#if defined(USE_PPL)
+  {"check",          required_argument, 0, 'c'},
+#endif
+  {0, 0, 0, 0}
+};
+#endif
+
+static const char* usage_string
+= "Usage: %s [OPTION]... [FILE]...\n\n"
+"  -CSECS, --max-cpu=SECS  limits CPU usage to SECS seconds\n"
+"  -RMB, --max-memory=MB   limits memory usage to MB megabytes\n"
+"  -h, --help              prints this help text to stdout\n"
+"  -V, --version           prints version information to stdout\n"
+"  -oPATH, --output=PATH   appends output to PATH\n"
+"  -t, --timings           prints timings to stderr\n"
+"  -v, --verbose           produces lots of output\n"
+#if defined(USE_PPL)
+"  -cPATH, --check=PATH    checks if the result is equal to what is in PATH\n"
+#endif
+#ifndef HAVE_GETOPT_H
+"\n"
+"NOTE: this version does not support long options.\n"
+#endif
+"\n"
+"Report bugs to <ppl-devel at cs.unipr.it>.\n";
+
+#if defined(USE_PPL)
+#define OPTION_LETTERS "C:R:hVo:tvc:"
+#else
+#define OPTION_LETTERS "C:R:hVo:tv"
+#endif
+
+const char* program_name = 0;
+
+unsigned long max_seconds_of_cpu_time = 0;
+unsigned long max_bytes_of_virtual_memory = 0;
+bool print_timings = false;
+bool verbose = false;
+const char* check_file_name = 0;
+
+void
+fatal(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: ", program_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+  exit(1);
+}
+
+namespace {
+
+const char* input_file_name = 0;
+std::istream* input_stream_p = 0;
+
+void
+set_input(const char* file_name) {
+  if (input_stream_p && *input_stream_p != std::cin)
+    delete input_stream_p;
+
+  if (file_name) {
+    input_stream_p = new std::ifstream(file_name, std::ios_base::in);
+    if (!*input_stream_p)
+      fatal("cannot open input file `%s'", file_name);
+    input_file_name = file_name;
+  }
+  else {
+    input_stream_p = &std::cin;
+    input_file_name = "<cin>";
+  }
+}
+
+std::istream&
+input() {
+  assert(input_stream_p);
+  return *input_stream_p;
+}
+
+const char* output_file_name = 0;
+std::ostream* output_stream_p = 0;
+
+void
+set_output(const char* file_name) {
+  if (output_stream_p && *output_stream_p != std::cout)
+    delete output_stream_p;
+
+  if (file_name) {
+    output_stream_p = new std::ofstream(file_name,
+					std::ios_base::out
+					| std::ios_base::app);
+    if (!*output_stream_p)
+      fatal("cannot open output file `%s'", file_name);
+    output_file_name = file_name;
+  }
+  else {
+    output_stream_p = &std::cout;
+    output_file_name = "<cout>";
+  }
+}
+
+std::ostream&
+output() {
+  assert(output_stream_p);
+  return *output_stream_p;
+}
+
+} // namespace
+
+void
+error(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: in `%s': ", program_name, input_file_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+  exit(1);
+}
+
+void
+warning(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: Warning: in `%s': ", program_name, input_file_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+}
+
+extern "C" typedef void (*sig_handler_type)(int);
+
+void
+set_alarm_on_cpu_time(const unsigned seconds, sig_handler_type handler) {
+  sigset_t mask;
+  sigemptyset(&mask);
+
+  struct sigaction s;
+  s.sa_handler = handler;
+  s.sa_mask = mask;
+#if defined(SA_ONESHOT)
+  s.sa_flags = SA_ONESHOT;
+#elif defined(SA_RESETHAND)
+  s.sa_flags = SA_RESETHAND;
+#else
+  #error "Either SA_ONESHOT or SA_RESETHAND must be defined."
+#endif
+
+  if (sigaction(SIGXCPU, &s, 0) != 0)
+    fatal("sigaction failed: %s", strerror(errno));
+
+  struct rlimit t;
+  if (getrlimit(RLIMIT_CPU, &t) != 0)
+    fatal("getrlimit failed: %s", strerror(errno));
+
+  if (seconds < t.rlim_cur) {
+    t.rlim_cur = seconds;
+    if (setrlimit(RLIMIT_CPU, &t) != 0)
+      fatal("setrlimit failed: %s", strerror(errno));
+  }
+}
+
+#if HAVE_DECL_RLIMIT_AS
+void
+limit_virtual_memory(const unsigned bytes) {
+  struct rlimit t;
+
+  if (getrlimit(RLIMIT_AS, &t) != 0)
+    fatal("getrlimit failed: %s", strerror(errno));
+
+  if (bytes < t.rlim_cur) {
+    t.rlim_cur = bytes;
+    if (setrlimit(RLIMIT_AS, &t) != 0)
+      fatal("setrlimit failed: %s", strerror(errno));
+  }
+}
+#else
+void
+limit_virtual_memory(unsigned) {
+}
+#endif // !HAVE_DECL_RLIMIT_AS
+
+extern "C" void
+timeout(int) {
+  try {
+    std::cerr << "TIMEOUT"
+	      << std::endl;
+  }
+  catch (...) {
+  }
+
+  try {
+    if (output_file_name)
+      output() << "TIMEOUT"
+	       << std::endl;
+  }
+  catch (...) {
+  }
+
+  exit(0);
+}
+
+void
+process_options(int argc, char* argv[]) {
+  while (true) {
+#ifdef HAVE_GETOPT_H
+    int option_index = 0;
+    int c = getopt_long(argc, argv, OPTION_LETTERS, long_options,
+			&option_index);
+#else
+    int c = getopt(argc, argv, OPTION_LETTERS);
+#endif
+
+    if (c == EOF)
+      break;
+
+    char* endptr;
+    long l;
+    switch (c) {
+    case 0:
+      break;
+
+    case '?':
+    case 'h':
+      fprintf(stdout, usage_string, argv[0]);
+      exit(0);
+      break;
+
+    case 'V':
+      fprintf(stdout, "%s\n", PPL_VERSION);
+      exit(0);
+      break;
+
+    case 'C':
+      l = strtol(optarg, &endptr, 10);
+      if (*endptr || l < 0)
+	fatal("a non-negative integer must follow `-C'");
+      else
+	max_seconds_of_cpu_time = l;
+      break;
+
+    case 'R':
+      l = strtol(optarg, &endptr, 10);
+      if (*endptr || l < 0)
+	fatal("a non-negative integer must follow `-R'");
+      else
+	max_bytes_of_virtual_memory = l*1024*1024;
+      break;
+
+    case 'o':
+      output_file_name = optarg;
+      break;
+
+    case 't':
+      print_timings = true;
+      break;
+
+    case 'v':
+      verbose = true;
+      break;
+
+    case 'c':
+      check_file_name = optarg;
+      break;
+
+    default:
+      abort();
+    }
+  }
+
+  if (argc - optind > 1)
+    // We have multiple input files.
+    fatal("at most one input file is accepted");
+
+  // We have one input files.
+  if (optind < argc)
+    input_file_name = argv[optind];
+  else
+    // If no input files have been specified: we will read from standard input.
+    assert(input_file_name == 0);
+}
+
+void
+maybe_start_clock() {
+  if (print_timings)
+    start_clock();
+}
+
+void
+maybe_print_clock() {
+  if (print_timings) {
+    std::cerr << input_file_name << " ";
+    print_clock(std::cerr);
+    std::cerr << std::endl;
+  }
+}
+
+
+void
+normalize(const std::vector<mpq_class>& source,
+	  std::vector<mpz_class>& dest,
+	  mpz_class& denominator) {
+  unsigned n = source.size();
+  denominator = 1;
+  for (unsigned i = 0; i < n; ++i)
+    mpz_lcm(denominator.get_mpz_t(),
+	    denominator.get_mpz_t(),
+	    source[i].get_den().get_mpz_t());
+  for (unsigned i = 0; i < n; ++i)
+    dest[i] = denominator*source[i];
+}
+
+template <typename T>
+bool
+guarded_read(std::istream& in, T& x) {
+  try {
+    return in >> x;
+  }
+  catch (...) {
+    return false;
+  }
+}
+
+template <typename T>
+void
+guarded_write(std::ostream& out, const T& x) {
+  bool succeeded = false;
+  try {
+    succeeded = out << x;
+  }
+  catch (...) {
+  }
+  if (!succeeded)
+    fatal("cannot write to output file `%s'", output_file_name);
+}
+
+#if defined (USE_POLKA)
+template <>
+void
+guarded_write(std::ostream& out, const pkint_t& x) {
+  bool succeeded = false;
+  try {
+    succeeded = out << x.rep;
+  }
+  catch (...) {
+  }
+  if (!succeeded)
+    fatal("cannot write to output file `%s'", output_file_name);
+}
+#endif
+
+enum Number_Type { INTEGER, RATIONAL, REAL };
+
+void
+read_coefficients(std::istream& in,
+		  const Number_Type number_type,
+		  std::vector<mpz_class>& coefficients,
+		  mpz_class& denominator) {
+  unsigned num_coefficients = coefficients.size();
+  switch (number_type) {
+  case INTEGER:
+    {
+      for (unsigned i = 0; i < num_coefficients; ++i)
+	if (!guarded_read(in, coefficients[i]))
+	  error("missing or invalid integer coefficient");
+      denominator = 1;
+      break;
+    }
+  case RATIONAL:
+    {
+      std::vector<mpq_class> rational_coefficients(num_coefficients);
+      for (unsigned i = 0; i < num_coefficients; ++i)
+	if (!guarded_read(in, rational_coefficients[i]))
+	  error("missing or invalid rational coefficient");
+      normalize(rational_coefficients, coefficients, denominator);
+      break;
+    }
+  case REAL:
+    {
+      std::vector<mpq_class> rational_coefficients(num_coefficients);
+      for (unsigned i = 0; i < num_coefficients; ++i) {
+	double d;
+	if (!guarded_read(in, d))
+	  error("missing or invalid real coefficient");
+	rational_coefficients[i] = mpq_class(d);
+      }
+      normalize(rational_coefficients, coefficients, denominator);
+      break;
+    }
+  }
+}
+
+void
+read_indexes_set(std::istream& in,
+		 std::set<unsigned>& dest,
+		 const char* what) {
+  assert(dest.empty());
+  unsigned num_elements;
+  if (!guarded_read(in, num_elements))
+    error("missing or invalid number of set elements in `%s'", what);
+  while (num_elements--) {
+    unsigned i;
+    if (!guarded_read(in, i))
+      error("missing or invalid set element in `%s'", what);
+    dest.insert(i);
+  }
+}
+
+enum Representation { H, V };
+
+Representation
+read_polyhedron(std::istream& in, POLYHEDRON_TYPE& ph) {
+  // By default we have an H-representation.
+  Representation rep = H;
+
+  std::string s;
+  std::set<unsigned> linearity;
+  while (true) {
+    if (!guarded_read(in, s))
+      error("premature end of file while seeking for `begin'");
+
+    if (s == "V-representation")
+      rep = V;
+    else if (s == "H-representation")
+      rep = H;
+    else if (s == "linearity" || s == "equality" || s == "partial_enum") {
+      read_indexes_set(in, linearity, "linearity");
+      if (verbose) {
+	std::cerr << "Linearity: ";
+	for (std::set<unsigned>::const_iterator j = linearity.begin(),
+	       linearity_end = linearity.end(); j != linearity_end; ++j)
+	  std::cerr << *j << " ";
+	std::cerr << std::endl;
+      }
+    }
+    else if (s == "begin")
+      break;
+    else
+      // A comment: skip to end of line.
+      in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+  }
+
+  // Tools such as `lrs' produce "*****" instead of the number of
+  // rows.  We will accept that as valid input and compute the number
+  // of rows ourselves.
+  bool has_num_rows = false;
+  unsigned num_rows;
+  if (!guarded_read(in, s))
+    error("missing number of rows");
+  if (s != "*****") {
+    std::istringstream istr(s);
+    if (!guarded_read(istr, num_rows))
+      error("illegal number of rows `%s' (\"*****\" would be accepted)",
+	    s.c_str());
+    has_num_rows = true;
+  }
+
+  unsigned num_columns;
+  if (!guarded_read(in, num_columns))
+    error("illegal or missing number of columns");
+  unsigned space_dim = num_columns - 1;
+
+  if (!guarded_read(in, s))
+    error("missing number type");
+  Number_Type number_type = INTEGER;
+  if (s == "integer")
+    number_type = INTEGER;
+  else if (s == "rational")
+    number_type = RATIONAL;
+  else if (s == "real")
+    number_type = REAL;
+  else
+    error("illegal number type `%s'", s.c_str());
+
+  if (verbose) {
+    std::cerr << "Problem dimension: ";
+    if (has_num_rows)
+      std::cerr << num_rows;
+    else
+      std::cerr << '?';
+    std::cerr << " x " << num_columns
+	      << "; number type: " << s
+	      << std::endl;
+  }
+
+#if defined(USE_PPL)
+
+  PPL::Constraint_System cs;
+  PPL::Generator_System gs;
+
+#elif defined(USE_POLKA)
+
+  // Initialize polka in non-strict mode.
+  // 25000 is a magic number: with 22500 Polka 2.0.2 dies on
+  // mit31-20.ine with the error "Chernikova: out of table space".
+  polka_initialize(polka_false, space_dim, 25000);
+  // Declare and allocate a Polka matrix.
+  matrix_t* mat = matrix_alloc(num_rows+1, space_dim+2, polka_false);
+
+#elif defined(USE_POLYLIB)
+
+  // Declare and allocate a PolyLib matrix.
+  Matrix* mat = Matrix_Alloc(num_rows+1, space_dim+2);
+
+#endif
+
+  unsigned row = 0;
+  std::set<unsigned>::iterator linearity_end = linearity.end();
+  if (rep == V) {
+    // The V representation allows for `space_dim' coordinates.
+    std::vector<mpz_class> coefficients(space_dim);
+    mpz_class denominator;
+    bool has_a_point = false;
+    for (row = 0; !has_num_rows || row < num_rows; ++row) {
+      int vertex_marker;
+      if (!has_num_rows) {
+	// Must be prepared to read an "end" here.
+	if (!guarded_read(in, s))
+	  error("missing vertex marker");
+	if (s == "end")
+	  break;
+	std::istringstream istr(s);
+	if (!guarded_read(istr, vertex_marker)
+	    || vertex_marker < 0 || vertex_marker > 1)
+	  error("illegal vertex marker `%s'", s.c_str());
+      }
+      else if (!guarded_read(in, vertex_marker)
+		 || vertex_marker < 0 || vertex_marker > 1)
+	error("illegal or missing vertex marker");
+      read_coefficients(in, number_type, coefficients, denominator);
+
+#if defined(USE_PPL)
+      // PPL variables have indices 0, 1, ..., space_dim-1.
+      PPL::Linear_Expression e;
+      for (unsigned j = space_dim; j-- > 0; )
+	e += coefficients[j] * PPL::Variable(j);
+#elif defined(USE_POLKA)
+      // NewPolka variables have indices 2, 3, ..., space_dim+1.
+      for (unsigned j = space_dim; j-- > 0; )
+	pkint_set(mat->p[row][j+2], coefficients[j].get_mpz_t());
+#elif defined(USE_POLYLIB)
+      // PolyLib variables have indices 1, 2, ..., space_dim.
+      for (unsigned j = space_dim; j-- > 0; )
+	value_assign(mat->p[row][j+1], coefficients[j].get_mpz_t());
+#endif
+      if (vertex_marker == 1) {
+	assert(linearity.find(row+1) == linearity_end);
+#if defined(USE_PPL)
+	gs.insert(point(e, denominator));
+#elif defined(USE_POLKA)
+	// NewPolka stores the generator kind at index 0 (1 = ray/point)
+	// and the common denominator at index 1.
+	pkint_set_si(mat->p[row][0], 1);
+	pkint_set(mat->p[row][1], denominator.get_mpz_t());
+#elif defined(USE_POLYLIB)
+	// PolyLib stores the generator kind at index 0 (1 = ray/point)
+	// and the common denominator at index space_dim+1.
+	value_set_si(mat->p[row][0], 1);
+	value_assign(mat->p[row][space_dim+1], denominator.get_mpz_t());
+#endif
+	has_a_point = true;
+      }
+      else if (linearity.find(row+1) != linearity_end) {
+#if defined(USE_PPL)
+	gs.insert(line(e));
+#elif defined(USE_POLKA)
+	// NewPolka stores the generator kind at index 0 (0 = line)
+	// and the common denominator at index 1 (0 for ray/line).
+	pkint_set_si(mat->p[row][0], 0);
+	pkint_set_si(mat->p[row][1], 0);
+#elif defined(USE_POLYLIB)
+	// PolyLib stores the generator kind at index 0 (0 = line)
+	// and the common denominator at index space_dim+1 (0 for ray/line).
+	value_set_si(mat->p[row][0], 0);
+	value_set_si(mat->p[row][space_dim+1], 0);
+#endif
+      }
+      else {
+#if defined(USE_PPL)
+	gs.insert(ray(e));
+#elif defined(USE_POLKA)
+	// NewPolka stores the generator kind at index 0 (1 = ray/point)
+	// and the common denominator at index 1 (0 for ray/line).
+	pkint_set_si(mat->p[row][0], 1);
+	pkint_set_si(mat->p[row][1], 0);
+#elif defined(USE_POLYLIB)
+	// PolyLib stores the generator kind at index 0 (1 = ray/point)
+	// and the common denominator at index space_dim+1 (0 for ray/line).
+	value_set_si(mat->p[row][0], 1);
+	value_set_si(mat->p[row][space_dim+1], 0);
+#endif
+      }
+    }
+    // Every non-empty generator system must have at least one point.
+    if (row > 0 && !has_a_point) {
+#if defined(USE_PPL)
+      gs.insert(PPL::point());
+#elif defined(USE_POLKA)
+      // Add the origin as a point.
+      pkint_set_si(mat->p[num_rows][0], 1);
+      pkint_set_si(mat->p[num_rows][1], 1);
+      for (unsigned j = space_dim; j-- > 0; )
+	pkint_set_si(mat->p[num_rows][j+2], 0);
+      ++num_rows;
+#elif defined(USE_POLYLIB)
+      // Add the origin as a point.
+      value_set_si(mat->p[num_rows][0], 1);
+      value_set_si(mat->p[num_rows][space_dim+1], 1);
+      for (unsigned j = space_dim; j-- > 0; )
+	value_set_si(mat->p[num_rows][j+1], 0);
+      ++num_rows;
+#endif
+    }
+
+    if (verbose) {
+      if (!has_num_rows)
+	std::cerr << "Problem dimension: " << row << " x " << num_columns
+		  << "; number type: " << s
+		  << std::endl;
+
+#if defined(USE_PPL)
+      using namespace PPL::IO_Operators;
+      std::cerr << "Generator system:\n" << gs << std::endl;
+#elif defined(USE_POLKA)
+      // Polka can only print to stdout.
+      printf("Generator system:\n");
+      matrix_print(mat);
+#elif defined(USE_POLYLIB)
+      fprintf(stderr, "Generator system:\n");
+      Matrix_Print(stderr, 0, mat);
+#endif
+    }
+  }
+  else {
+    assert(rep == H);
+    // The H representation stores the inhomogeneous term at index 0,
+    // and the variables' coefficients at indices 1, 2, ..., space_dim.
+    std::vector<mpz_class> coefficients(space_dim+1);
+    mpz_class denominator;
+    for (row = 0; !has_num_rows || row < num_rows; ++row) {
+      if (!has_num_rows) {
+	// Must be prepared to read an "end" here.
+	std::getline(in, s);
+	if (!in)
+	  error("premature end of file while seeking "
+		"for coefficients or `end'");
+	if (s.substr(0, 2) == "end")
+	  break;
+	std::istringstream istr(s);
+	read_coefficients(istr, number_type, coefficients, denominator);
+      }
+      else
+	read_coefficients(in, number_type, coefficients, denominator);
+
+#if defined(USE_PPL)
+      // PPL variables have indices 0, 1, ..., space_dim-1.
+      PPL::Linear_Expression e;
+      for (unsigned j = num_columns; j-- > 1; )
+	e += coefficients[j] * PPL::Variable(j-1);
+      e += coefficients[0];
+#elif defined(USE_POLKA)
+      // NewPolka variables have indices 2, 3, ..., space_dim+1.
+      for (unsigned j = num_columns; j-- > 1; )
+	pkint_set(mat->p[row][j+1], coefficients[j].get_mpz_t());
+      // NewPolka stores the inhomogeneous term at index 1.
+      pkint_set(mat->p[row][1], coefficients[0].get_mpz_t());
+#elif defined(USE_POLYLIB)
+      // PolyLib variables have indices 1, 2, ..., space_dim.
+      for (unsigned j = num_columns; j-- > 1; )
+	value_assign(mat->p[row][j], coefficients[j].get_mpz_t());
+      // PolyLib stores the inhomogeneous term at index space_dim+1.
+      value_assign(mat->p[row][space_dim+1], coefficients[0].get_mpz_t());
+#endif
+
+      if (linearity.find(row+1) != linearity_end) {
+#if defined(USE_PPL)
+	cs.insert(e == 0);
+#elif defined(USE_POLKA)
+	// NewPolka stores the constraint kind at index 0 (0 = equality).
+	pkint_set_si(mat->p[row][0], 0);
+#elif defined(USE_POLYLIB)
+	// PolyLib stores the constraint kind at index 0 (0 = equality).
+	value_set_si(mat->p[row][0], 0);
+#endif
+      }
+      else {
+#if defined(USE_PPL)
+	cs.insert(e >= 0);
+#elif defined(USE_POLKA)
+	// NewPolka stores the constraint kind at index 0 (1 = inequality).
+	pkint_set_si(mat->p[row][0], 1);
+#elif defined(USE_POLYLIB)
+	// PolyLib stores the constraint kind at index 0 (1 = inequality).
+	value_set_si(mat->p[row][0], 1);
+#endif
+      }
+    }
+
+    if (verbose) {
+      if (!has_num_rows)
+	std::cerr << "Problem dimension: " << row << " x " << num_columns
+		  << "; number type: " << s
+		  << std::endl;
+
+#if defined(USE_PPL)
+      using namespace PPL::IO_Operators;
+      std::cerr << "Constraint system:\n" << cs << std::endl;
+#elif defined(USE_POLKA)
+      // Polka can only print to stdout.
+      printf("Constraint system:\n");
+      matrix_print(mat);
+#elif defined(USE_POLYLIB)
+      fprintf(stderr, "Constraint system:\n");
+      Matrix_Print(stderr, 0, mat);
+#endif
+    }
+  }
+
+  if (has_num_rows) {
+    if (!guarded_read(in, s))
+      error("premature end of file while seeking for `end'");
+
+    if (s != "end")
+      error("`%s' found while seeking for `end'", s.c_str());
+  }
+
+  if (rep == H) {
+#if defined(USE_PPL)
+    ph = PPL::C_Polyhedron(cs);
+#elif defined(USE_POLKA)
+    ph = poly_universe(space_dim);
+    ph = poly_add_constraints_lazy(ph, mat);
+#elif defined(USE_POLYLIB)
+    ph = Universe_Polyhedron(space_dim);
+
+    // PolyLib is not lazy: it will perform the conversion immediately.
+    maybe_start_clock();
+    ph = AddConstraints(mat->p[0], num_rows, ph,
+			max_constraints_or_generators);
+    maybe_print_clock();
+#endif
+  }
+  else {
+#if defined(USE_PPL)
+    ph = PPL::C_Polyhedron(gs);
+#elif defined(USE_POLKA)
+    ph = poly_of_frames(mat);
+#elif defined(USE_POLYLIB)
+    ph = Empty_Polyhedron(space_dim);
+
+    // PolyLib is not lazy: it will perform the conversion immediately.
+    maybe_start_clock();
+    ph = AddRays(mat->p[0], num_rows, ph,
+		 max_constraints_or_generators);
+    maybe_print_clock();
+#endif
+  }
+  return rep;
+}
+
+void
+write_polyhedron(std::ostream& out,
+		 const POLYHEDRON_TYPE& ph,
+		 const Representation rep) {
+  if (rep == H)
+    guarded_write(out, "H-representation\n");
+  else {
+    assert(rep == V);
+    guarded_write(out, "V-representation\n");
+  }
+
+  std::set<unsigned> linearity;
+#if defined(USE_PPL)
+  unsigned num_rows = 0;
+  if (rep == H) {
+    const PPL::Constraint_System& cs = ph.constraints();
+    for (PPL::Constraint_System::const_iterator i = cs.begin(),
+	   cs_end = cs.end(); i != cs_end; ++i) {
+      ++num_rows;
+      if (i->is_equality())
+	linearity.insert(linearity.end(), num_rows);
+    }
+  }
+  else {
+    const PPL::Generator_System& gs = ph.generators();
+    for (PPL::Generator_System::const_iterator i = gs.begin(),
+	   gs_end = gs.end(); i != gs_end; ++i) {
+      ++num_rows;
+      if (i->is_line())
+	linearity.insert(linearity.end(), num_rows);
+    }
+  }
+#elif defined(USE_POLKA)
+  // Don't even try to get frames if the polyhedron is empty.
+  const matrix_t* mat = (rep == H)
+    ? poly_constraints(ph)
+    : (poly_is_empty(ph) ? 0 : poly_frames(ph));
+  const unsigned num_rows = (rep == V && poly_is_empty(ph)) ? 0 : mat->nbrows;
+  for (unsigned i = 0; i < num_rows; ++i)
+    if (pkint_sgn(mat->p[i][0]) == 0)
+      linearity.insert(linearity.end(), i+1);
+#elif defined(USE_POLYLIB)
+  const Matrix* mat = (rep == H)
+    ? Polyhedron2Constraints(ph)
+    : Polyhedron2Rays(ph);
+  const unsigned num_rows = mat->NbRows;
+  for (unsigned i = 0; i < num_rows; ++i)
+    if (value_sign(mat->p[i][0]) == 0)
+      linearity.insert(linearity.end(), i+1);
+#endif
+
+  if (!linearity.empty()) {
+    guarded_write(out, "linearity ");
+    guarded_write(out, linearity.size());
+    for (std::set<unsigned>::const_iterator j = linearity.begin(),
+	   linearity_end = linearity.end(); j != linearity_end; ++j) {
+      guarded_write(out, ' ');
+      guarded_write(out, *j);
+    }
+    guarded_write(out, '\n');
+  }
+
+#if defined(USE_PPL)
+  PPL::dimension_type space_dim = ph.space_dimension();
+#elif defined(USE_POLKA)
+  unsigned space_dim = poly_dimension(ph);
+#elif defined(USE_POLYLIB)
+  unsigned space_dim = mat->NbColumns - 2;
+#endif
+
+  guarded_write(out, "begin\n");
+  guarded_write(out, num_rows);
+  guarded_write(out, ' ');
+  guarded_write(out, space_dim+1);
+  guarded_write(out, ' ');
+  if (rep == H)
+    guarded_write(out, "integer\n");
+  else
+    guarded_write(out, "rational\n");
+
+#if defined(USE_PPL)
+  if (rep == H) {
+    const PPL::Constraint_System& cs = ph.constraints();
+    for (PPL::Constraint_System::const_iterator i = cs.begin(),
+	   cs_end = cs.end(); i != cs_end; ++i) {
+      const PPL::Constraint& c = *i;
+      guarded_write(out, c.inhomogeneous_term());
+      for (PPL::dimension_type j = 0; j < space_dim; ++j) {
+	guarded_write(out, ' ');
+	guarded_write(out, c.coefficient(PPL::Variable(j)));
+      }
+      guarded_write(out, '\n');
+    }
+  }
+  else {
+    assert(rep == V);
+    const PPL::Generator_System& gs = ph.generators();
+    for (PPL::Generator_System::const_iterator i = gs.begin(),
+	   gs_end = gs.end(); i != gs_end; ++i) {
+      const PPL::Generator& g = *i;
+      if (g.is_point()) {
+	guarded_write(out, '1');
+	const PPL::Coefficient& divisor = g.divisor();
+	for (PPL::dimension_type j = 0; j < space_dim; ++j) {
+	  guarded_write(out, ' ');
+	  if (g.coefficient(PPL::Variable(j)) == 0)
+	    guarded_write(out, '0');
+	  else {
+	    mpz_class num, den;
+	    PPL::assign_r(num,
+			g.coefficient(PPL::Variable(j)),
+			PPL::ROUND_NOT_NEEDED);
+	    PPL::assign_r(den, divisor, PPL::ROUND_NOT_NEEDED);
+	    guarded_write(out, mpq_class(num, den));
+	  }
+	}
+      }
+      else {
+	// `g' is a ray or a line.
+	guarded_write(out, '0');
+	for (PPL::dimension_type j = 0; j < space_dim; ++j) {
+	  guarded_write(out, ' ');
+	  guarded_write(out, g.coefficient(PPL::Variable(j)));
+	}
+      }
+      guarded_write(out, '\n');
+    }
+  }
+#elif defined(USE_POLKA)
+  if (rep == H) {
+    for (unsigned i = 0; i < num_rows; ++i) {
+      const pkint_t* c = mat->p[i];
+      // The inhomogeneous term.
+      guarded_write(out, c[1]);
+      // The variables' coefficients.
+      for (unsigned j = 0; j < space_dim; ++j) {
+	guarded_write(out, ' ');
+	guarded_write(out, c[j+2]);
+      }
+      guarded_write(out, '\n');
+    }
+  }
+  else {
+    assert(rep == V);
+    for (unsigned i = 0; i < num_rows; ++i) {
+      const pkint_t* g = mat->p[i];
+      guarded_write(out, g[0]);
+      const pkint_t divisor = g[1];
+      if (pkint_sgn(divisor) != 0)
+	// `g' is a point.
+	for (unsigned j = 0; j < space_dim; ++j) {
+	  guarded_write(out, ' ');
+	  if (pkint_sgn(g[j+2]) == 0)
+	    guarded_write(out, '0');
+	  else
+	    guarded_write(out, mpq_class(mpz_class(g[j+2].rep),
+					 mpz_class(divisor.rep)));
+	}
+      else
+	// `g' is a ray or a line.
+	for (unsigned j = 0; j < space_dim; ++j) {
+	  guarded_write(out, ' ');
+	  guarded_write(out, g[j+2]);
+	}
+      guarded_write(out, '\n');
+    }
+  }
+#elif defined (USE_POLYLIB)
+  if (rep == H) {
+    for (unsigned i = 0; i < num_rows; ++i) {
+      const Value* c = mat->p[i];
+      // The inhomogeneous term.
+      guarded_write(out, c[space_dim+1]);
+      // The variables' coefficients.
+      for (unsigned j = 0; j < space_dim; ++j) {
+	guarded_write(out, ' ');
+	guarded_write(out, c[j+1]);
+      }
+      guarded_write(out, '\n');
+    }
+  }
+  else {
+    assert(rep == V);
+    for (unsigned i = 0; i < num_rows; ++i) {
+      const Value* g = mat->p[i];
+      guarded_write(out, g[0]);
+      const Value& divisor = g[space_dim+1];
+      if (value_sign(divisor) != 0)
+	// `g' is a point.
+	for (unsigned j = 0; j < space_dim; ++j) {
+	  guarded_write(out, ' ');
+	  if (value_sign(g[j+1]) == 0)
+	    guarded_write(out, '0');
+	  else
+	    guarded_write(out, mpq_class(mpz_class(g[j+1]),
+					 mpz_class(divisor)));
+	}
+      else
+	// `g' is a ray or a line.
+	for (unsigned j = 0; j < space_dim; ++j) {
+	  guarded_write(out, ' ');
+	  guarded_write(out, g[j+1]);
+	}
+      guarded_write(out, '\n');
+    }
+  }
+#endif
+  guarded_write(out, "end\n");
+
+  // Flush `out'.
+  bool flush_succeeded = false;
+  try {
+    flush_succeeded = out.flush();
+  }
+  catch (...) {
+  }
+  if (!flush_succeeded)
+    fatal("cannot write to output file `%s'", output_file_name);
+}
+
+} // namespace
+
+int
+main(int argc, char* argv[]) try {
+  program_name = argv[0];
+
+#if defined(USE_PPL)
+  if (strcmp(PPL_VERSION, PPL::version()) != 0)
+    fatal("was compiled with PPL version %s, but linked with version %s",
+	  PPL_VERSION, PPL::version());
+
+  if (verbose)
+    std::cerr << "Parma Polyhedra Library version:\n" << PPL::version()
+	      << "\n\nParma Polyhedra Library banner:\n" << PPL::banner()
+	      << std::endl;
+#endif
+
+  // Process command line options.
+  process_options(argc, argv);
+
+  if (max_seconds_of_cpu_time > 0)
+    set_alarm_on_cpu_time(max_seconds_of_cpu_time, timeout);
+
+  if (max_bytes_of_virtual_memory > 0)
+    limit_virtual_memory(max_bytes_of_virtual_memory);
+
+  // Set up the input and output streams.
+  set_input(input_file_name);
+  set_output(output_file_name);
+
+  POLYHEDRON_TYPE ph;
+  Representation rep = read_polyhedron(input(), ph);
+
+  enum Command { None, H_to_V, V_to_H };
+  Command command = None;
+
+  // Warn for misplaced linearity commands, and ignore all what follows.
+  std::string s;
+  while (guarded_read(input(), s)) {
+    if (s == "linearity" || s == "equality" || s == "partial_enum")
+      error("the `linearity' command must occur before `begin'");
+    input().ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+  }
+
+
+#if defined(USE_PPL) || defined(USE_POLKA)
+  maybe_start_clock();
+#endif
+
+  // Compute the dual representation.
+  if (rep == V) {
+    command = V_to_H;
+#if defined(USE_PPL)
+    ph.minimized_constraints();
+#elif defined(USE_POLKA)
+    poly_minimize(ph);
+#endif
+  }
+  else {
+    command = H_to_V;
+#if defined(USE_PPL)
+    ph.minimized_generators();
+#elif defined(USE_POLKA)
+    poly_minimize(ph);
+#endif
+  }
+
+#if defined(USE_PPL) || defined(USE_POLKA)
+  maybe_print_clock();
+#endif
+
+  // Write the result of the conversion.
+  if (rep == V)
+    write_polyhedron(output(), ph, H);
+  else
+    write_polyhedron(output(), ph, V);
+
+#if defined(USE_PPL)
+  // Check the result, if requested to do so.
+  if (check_file_name) {
+    set_input(check_file_name);
+    // Read the polyhedron containing the expected result.
+    PPL::C_Polyhedron e_ph;
+    Representation e_rep = read_polyhedron(input(), e_ph);
+
+    switch (command) {
+    case H_to_V:
+      {
+	if (e_rep == H)
+	  warning("checking an H-to-V conversion with an H representation");
+
+	// Count the number of generators of `ph'.
+	unsigned ph_num_generators = 0;
+	const PPL::Generator_System& ph_gs = ph.generators();
+	for (PPL::Generator_System::const_iterator i = ph_gs.begin(),
+	       ph_gs_end = ph_gs.end(); i != ph_gs_end; ++i)
+	  ++ph_num_generators;
+
+	// Count the number of generators of `e_ph'.
+	unsigned e_ph_num_generators = 0;
+	const PPL::Generator_System& e_ph_gs = e_ph.generators();
+	for (PPL::Generator_System::const_iterator i = e_ph_gs.begin(),
+	       e_ph_gs_end = e_ph_gs.end(); i != e_ph_gs_end; ++i)
+	  ++e_ph_num_generators;
+
+	// If the polyhedra differ, that is the problem.
+	if (ph != e_ph) {
+	  if (verbose)
+	    std::cerr << "Check failed: polyhedra differ"
+		      << std::endl;
+	  return 1;
+	}
+	else if (ph_num_generators != e_ph_num_generators)
+	  // If we have different number of generators, we fail.
+	  std::cerr << "Check failed: different number of generators:\n"
+		    << "expected " << e_ph_num_generators
+		    << ", obtained " << ph_num_generators
+		    << std::endl;
+	break;
+      }
+    case V_to_H:
+      {
+	if (e_rep == V)
+	  warning("checking an V-to-H conversion with a V representation");
+
+	// Count the number of constraints of `ph'.
+	unsigned ph_num_constraints = 0;
+	const PPL::Constraint_System& ph_cs = ph.constraints();
+	for (PPL::Constraint_System::const_iterator i = ph_cs.begin(),
+	       ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i)
+	  ++ph_num_constraints;
+
+	// Count the number of constraints of `e_ph'.
+	unsigned e_ph_num_constraints = 0;
+	const PPL::Constraint_System& e_ph_cs = e_ph.constraints();
+	for (PPL::Constraint_System::const_iterator i = e_ph_cs.begin(),
+	       e_ph_cs_end = e_ph_cs.end(); i != e_ph_cs_end; ++i)
+	  ++e_ph_num_constraints;
+
+	// If the polyhedra differ, that is the problem.
+	if (ph != e_ph) {
+	  if (verbose)
+	    std::cerr << "Check failed: polyhedra differ"
+		      << std::endl;
+	  return 1;
+	}
+	else if (ph_num_constraints != e_ph_num_constraints)
+	  // If we have different number of constraints, we fail.
+	  std::cerr << "Check failed: different number of constraints:\n"
+		    << "expected " << e_ph_num_constraints
+		    << ", obtained " << ph_num_constraints
+		    << std::endl;
+	break;
+      }
+    case None:
+      break;
+    }
+  }
+#endif
+
+#if defined(USE_POLKA)
+    // Finalize the library.
+    polka_finalize();
+#endif
+
+  return 0;
+}
+catch (const std::bad_alloc&) {
+  fatal("out of memory");
+  exit(1);
+}
+catch (const std::overflow_error& e) {
+  fatal("arithmetic overflow (%s)", e.what());
+  exit(1);
+}
+catch (...) {
+  fatal("internal error: please submit a bug report to ppl-devel at cs.unipr.it");
+  exit(1);
+}
diff --git a/demos/ppl_lpsol/Makefile.am b/demos/ppl_lpsol/Makefile.am
new file mode 100644
index 0000000..06c7f75
--- /dev/null
+++ b/demos/ppl_lpsol/Makefile.am
@@ -0,0 +1,160 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SUBDIRS = examples
+
+EXTRA_DIST = \
+ppl_lpsol.c \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+if BUILD_C_INTERFACE
+if HAVE_GLPK
+
+AM_CPPFLAGS = -I$(top_builddir)/interfaces/C @extra_includes@
+
+bin_PROGRAMS = ppl_lpsol
+# dummy.cc serves the only purpose to force linking using the C++ compiler.
+ppl_lpsol_SOURCES = \
+ppl_lpsol.c \
+dummy.cc
+ppl_lpsol_LDADD = \
+-lglpk \
+$(top_builddir)/interfaces/C/libppl_c.la \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED = \
+afiro.mps
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+
+CHECK_OPTION =
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+
+CHECK_OPTION = -c
+
+endif !ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES_FOR_ENUM = \
+adlittle.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+kb2.mps \
+mip.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
+ship08l.mps \
+$(TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED)
+
+TOUGH_EXAMPLES_FOR_SIMPLEX = \
+ship08l.mps
+
+if HOST_OS_CYGWIN
+
+DIFF_COMMAND = \
+grep "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+&& grep "^Optimum value: " obtained >obtained_optima \
+&& diff -u expected_optima obtained_optima
+
+else !HOST_OS_CYGWIN
+
+if HOST_OS_DARWIN
+
+DIFF_COMMAND = \
+grep "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+&& grep "^Optimum value: " obtained >obtained_optima \
+&& diff -u expected_optima obtained_optima
+
+else !HOST_OS_DARWIN
+
+if HOST_OS_SOLARIS
+
+DIFF_COMMAND = \
+grep "^Optimum value: " $(srcdir)/$(EXPECTED) \
+| sed -e "s/^Optimum value: \(-*[0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.]\)[0-9]*$/Optimum value: \1/g" >expected_optima \
+&& grep "^Optimum value: " obtained \
+| sed -e "s/^Optimum value: \(-*[0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\\.][0-9\.][0-9\.]\)[0-9]*$/Optimum value: \1/g" >obtained_optima \
+&& diff -u expected_optima obtained_optima
+
+else !HOST_OS_SOLARIS
+
+DIFF_COMMAND = diff -u $(srcdir)/$(EXPECTED) obtained
+
+endif !HOST_OS_SOLARIS
+
+endif !HOST_OS_DARWIN
+
+endif !HOST_OS_CYGWIN
+
+check-local: ppl_lpsol
+	echo $(ECHO_N) "$(ECHO_C)" >obtained
+	echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples
+	LANG=C; \
+	for path in $(srcdir)/examples/*.mps; \
+	do \
+	  file=`basename $$path`; \
+	  grep $$file tough_examples >/dev/null 2>&1 && continue; \
+	  for m in -m -M; \
+	  do \
+	    echo "*** ppl_lpsol -e $$m -oobtained $$file" >>obtained; \
+	    ./ppl_lpsol -e $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
+	  done \
+	done
+	echo $(TOUGH_EXAMPLES_FOR_SIMPLEX) >tough_examples
+	for path in $(srcdir)/examples/*.mps; \
+	do \
+	  file=`basename $$path`; \
+	  grep $$file tough_examples >/dev/null 2>&1 && continue; \
+	  for m in -m -M; \
+	  do \
+	    echo "*** ppl_lpsol -s $$m -oobtained $$file" >>obtained; \
+	    ./ppl_lpsol -s $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
+	  done \
+	done
+	$(DIFF_COMMAND)
+
+MOSTLYCLEANFILES = \
+tough_examples \
+obtained \
+expected_optima \
+obtained_optima
+
+endif HAVE_GLPK
+endif BUILD_C_INTERFACE
diff --git a/demos/ppl_lpsol/Makefile.in b/demos/ppl_lpsol/Makefile.in
new file mode 100644
index 0000000..50a89da
--- /dev/null
+++ b/demos/ppl_lpsol/Makefile.in
@@ -0,0 +1,821 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at bin_PROGRAMS =  \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	ppl_lpsol$(EXEEXT)
+subdir = demos/ppl_lpsol
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am__ppl_lpsol_SOURCES_DIST = ppl_lpsol.c dummy.cc
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at am_ppl_lpsol_OBJECTS =  \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	ppl_lpsol.$(OBJEXT) \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	dummy.$(OBJEXT)
+ppl_lpsol_OBJECTS = $(am_ppl_lpsol_OBJECTS)
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_DEPENDENCIES = $(top_builddir)/interfaces/C/libppl_c.la \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(top_builddir)/src/libppl.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ppl_lpsol_SOURCES)
+DIST_SOURCES = $(am__ppl_lpsol_SOURCES_DIST)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+SUBDIRS = examples
+EXTRA_DIST = \
+ppl_lpsol.c \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at AM_CPPFLAGS = -I$(top_builddir)/interfaces/C @extra_includes@
+# dummy.cc serves the only purpose to force linking using the C++ compiler.
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_SOURCES = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol.c \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at dummy.cc
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_LDADD = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at -lglpk \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(top_builddir)/interfaces/C/libppl_c.la \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@extra_libraries@
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED = \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at afiro.mps
+
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at CHECK_OPTION = -c
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at CHECK_OPTION = 
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_ENUM = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at adlittle.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at blend.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at kb2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mip.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc105.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50a.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50b.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ship08l.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED)
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_SIMPLEX = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ship08l.mps
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_FALSE at DIFF_COMMAND = diff -u $(srcdir)/$(EXPECTED) obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE at DIFF_COMMAND = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE at grep "^Optimum value: " $(srcdir)/$(EXPECTED) \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@| sed -e "s/^Optimum value: \(-*[0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.]\)[0-9]*$/Optimum value: \1/g" >expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@&& grep "^Optimum value: " obtained \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@| sed -e "s/^Optimum value: \(-*[0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\\.][0-9\.][0-9\.]\)[0-9]*$/Optimum value: \1/g" >obtained_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@&& diff -u expected_optima obtained_optima
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE at DIFF_COMMAND = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE at grep "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@&& grep "^Optimum value: " obtained >obtained_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@&& diff -u expected_optima obtained_optima
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE at DIFF_COMMAND = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE at grep "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@&& grep "^Optimum value: " obtained >obtained_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@&& diff -u expected_optima obtained_optima
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at MOSTLYCLEANFILES = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at tough_examples \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at obtained \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at obtained_optima
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  demos/ppl_lpsol/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  demos/ppl_lpsol/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	     || test -f $$p1 \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+ppl_lpsol$(EXEEXT): $(ppl_lpsol_OBJECTS) $(ppl_lpsol_DEPENDENCIES) 
+	@rm -f ppl_lpsol$(EXEEXT)
+	$(CXXLINK) $(ppl_lpsol_LDFLAGS) $(ppl_lpsol_OBJECTS) $(ppl_lpsol_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dummy.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_lpsol.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+ at BUILD_C_INTERFACE_FALSE@check-local:
+ at HAVE_GLPK_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-recursive
+all-am: Makefile $(PROGRAMS)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+	check-local clean clean-binPROGRAMS clean-generic \
+	clean-libtool clean-recursive ctags ctags-recursive distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-recursive distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic \
+	maintainer-clean-recursive mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \
+	pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+	uninstall-binPROGRAMS uninstall-info-am
+
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at check-local: ppl_lpsol
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(ECHO_N) "$(ECHO_C)" >obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	LANG=C; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  grep $$file tough_examples >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  for m in -m -M; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    echo "*** ppl_lpsol -e $$m -oobtained $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    ./ppl_lpsol -e $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  done \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(TOUGH_EXAMPLES_FOR_SIMPLEX) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  grep $$file tough_examples >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  for m in -m -M; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    echo "*** ppl_lpsol -s $$m -oobtained $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    ./ppl_lpsol -s $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  done \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(DIFF_COMMAND)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lpsol/dummy.cc b/demos/ppl_lpsol/dummy.cc
new file mode 100644
index 0000000..fbf56a6
--- /dev/null
+++ b/demos/ppl_lpsol/dummy.cc
@@ -0,0 +1 @@
+// This file intentionally contains only this comment.
diff --git a/demos/ppl_lpsol/examples/Makefile.am b/demos/ppl_lpsol/examples/Makefile.am
new file mode 100644
index 0000000..e10393f
--- /dev/null
+++ b/demos/ppl_lpsol/examples/Makefile.am
@@ -0,0 +1,38 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+dist_noinst_DATA = \
+adlittle.mps \
+afiro.mps \
+bgprtr.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+ex1.mps \
+kb2.mps \
+mip.mps \
+sample.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
+ship08l.mps \
+unboundedmin.mps
diff --git a/demos/ppl_lpsol/examples/Makefile.in b/demos/ppl_lpsol/examples/Makefile.in
new file mode 100644
index 0000000..82c7b70
--- /dev/null
+++ b/demos/ppl_lpsol/examples/Makefile.in
@@ -0,0 +1,456 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = demos/ppl_lpsol/examples
+DIST_COMMON = README $(dist_noinst_DATA) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DATA = $(dist_noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+dist_noinst_DATA = \
+adlittle.mps \
+afiro.mps \
+bgprtr.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+ex1.mps \
+kb2.mps \
+mip.mps \
+sample.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
+ship08l.mps \
+unboundedmin.mps
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  demos/ppl_lpsol/examples/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  demos/ppl_lpsol/examples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+	uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lpsol/examples/README b/demos/ppl_lpsol/examples/README
new file mode 100644
index 0000000..91cfe27
--- /dev/null
+++ b/demos/ppl_lpsol/examples/README
@@ -0,0 +1,7 @@
+Most of the examples in this directory have been taken from the `lp'
+library of Netlib [1].
+
+
+--------
+
+[1] http://www.netlib.org/
diff --git a/demos/ppl_lpsol/examples/adlittle.mps b/demos/ppl_lpsol/examples/adlittle.mps
new file mode 100644
index 0000000..6620f06
--- /dev/null
+++ b/demos/ppl_lpsol/examples/adlittle.mps
@@ -0,0 +1,335 @@
+NAME          ADLITTLE
+ROWS
+ N  .Z....
+ L  ....01
+ E  ....02
+ L  ....03
+ L  ....04
+ L  ....05
+ L  ....06
+ L  ....07
+ L  ....08
+ L  ....09
+ E  ....10
+ L  ....11
+ L  ....12
+ L  ....13
+ L  ....14
+ L  ....15
+ L  ....16
+ L  ....17
+ L  ....18
+ L  ....19
+ L  ....20
+ L  ....21
+ L  ....22
+ L  ....23
+ L  ....24
+ E  ....25
+ L  ....26
+ L  ....27
+ E  ....28
+ L  ....29
+ L  ....30
+ E  ....31
+ E  ....32
+ E  ....33
+ L  ....34
+ L  ....35
+ E  ....36
+ L  ....37
+ L  ....38
+ L  ....39
+ E  ....40
+ L  ....41
+ E  ....42
+ E  ....43
+ E  ....44
+ L  ....45
+ L  ....46
+ L  ....47
+ L  ....48
+ E  ....49
+ E  ....50
+ G  ....51
+ L  ....52
+ L  ....53
+ E  ....54
+ L  ....55
+ L  ....56
+COLUMNS
+    ...100    .Z....          -3280.   ....01            .506
+    ...100    ....04              1.   ....05            .182
+    ...100    ....55            .312
+    ...101    .Z....          -3280.   ....01            .638
+    ...101    ....04              1.   ....05             .05
+    ...101    ....55            .312
+    ...102    .Z....           3310.   ....01             -1.
+    ...103    .Z....          -1890.   ....05             .92
+    ...103    ....30              1.   ....49            -9.5
+    ...103    ....52           -.042   ....53           -.063
+    ...103    ....55             .08
+    ...104    ....34            .825   ....35            .175
+    ...104    ....40              1.   ....51             16.
+    ...105    ....35            .175   ....40              1.
+    ...105    ....46            .825   ....51             21.
+    ...106    .Z....          -1890.   ....06              1.
+    ...106    ....30              1.   ....49             3.6
+    ...106    ....52           -.042   ....53           -.063
+    ...107    .Z....           -903.   ....06              1.
+    ...107    ....38              1.
+    ...108    ....06              1.   ....50             -.8
+    ...109    .Z....            432.   ....31           -1.23
+    ...109    ....42             .23
+    ...110    .Z....            432.   ....32           -1.23
+    ...110    ....43             .23   ....56              1.
+    ...111    .Z....            432.   ....33           -1.23
+    ...111    ....44             .23   ....56              1.
+    ...112    .Z....            446.   ....07              1.
+    ...112    ....31             -1.
+    ...113    .Z....            446.   ....07              1.
+    ...113    ....32             -1.
+    ...114    .Z....            446.   ....07              1.
+    ...114    ....33             -1.
+    ...115    .Z....            450.   ....08              1.
+    ...115    ....31            -.95   ....42            -.05
+    ...116    .Z....            450.   ....08              1.
+    ...116    ....32            -.95   ....43            -.05
+    ...117    .Z....            450.   ....08              1.
+    ...117    ....33            -.95   ....44            -.05
+    ...118    .Z....            459.   ....09              1.
+    ...118    ....31            -.79   ....42            -.21
+    ...119    .Z....            459.   ....09              1.
+    ...119    ....32            -.79   ....43            -.21
+    ...120    .Z....            459.   ....09              1.
+    ...120    ....33            -.79   ....44            -.21
+    ...121    .Z....            483.   ....11              1.
+    ...121    ....31            -.42   ....42            -.58
+    ...122    .Z....            483.   ....11              1.
+    ...122    ....32            -.42   ....43            -.58
+    ...123    .Z....            483.   ....11              1.
+    ...123    ....33            -.42   ....44            -.58
+    ...124    .Z....            500.   ....12              1.
+    ...124    ....31            -.05   ....42            -.95
+    ...125    .Z....            500.   ....12              1.
+    ...125    ....32            -.05   ....43            -.95
+    ...126    .Z....            500.   ....12              1.
+    ...126    ....33            -.05   ....44            -.95
+    ...127    .Z....            493.   ....13              1.
+    ...127    ....31            -.26   ....42            -.74
+    ...128    .Z....            493.   ....13              1.
+    ...128    ....32            -.26   ....43            -.74
+    ...129    .Z....            493.   ....13              1.
+    ...129    ....33            -.26   ....44            -.74
+    ...130    .Z....          -1890.   ....14              1.
+    ...130    ....30              1.   ....49            -3.2
+    ...130    ....52           -.042   ....53           -.063
+    ...131    .Z....           -903.   ....14              1.
+    ...131    ....38              1.
+    ...132    .Z....            506.   ....17              1.
+    ...132    ....31             .26   ....42           -1.26
+    ...133    ....14              1.   ....50             -.8
+    ...134    .Z....            506.   ....17              1.
+    ...134    ....32             .26   ....43           -1.26
+    ...135    .Z....            506.   ....17              1.
+    ...135    ....33             .26   ....44           -1.26
+    ...136    .Z....            505.   ....15              1.
+    ...136    ....31             .16   ....42           -1.16
+    ...137    .Z....            505.   ....15              1.
+    ...137    ....32             .16   ....43           -1.16
+    ...138    .Z....            505.   ....15              1.
+    ...138    ....33             .16   ....44           -1.16
+    ...139    .Z....            499.   ....16              1.
+    ...139    ....31            -.16   ....42            -.84
+    ...140    .Z....            499.   ....16              1.
+    ...140    ....32            -.16   ....43            -.84
+    ...141    .Z....            499.   ....16              1.
+    ...141    ....33            -.16   ....44            -.84
+    ...142    ....10             -1.
+    ...143    ....02              1.   ....03             .79
+    ...143    ....10             37.   ....28            .494
+    ...143    ....34            .506   ....54         2.27424
+    ...144    ....02              1.   ....03             .53
+    ...144    ....10             47.   ....28            .492
+    ...144    ....46            .508   ....54          2.2632
+    ...145    .Z....            512.   ....18              1.
+    ...145    ....31             .62   ....42           -1.62
+    ...146    .Z....            512.   ....18              1.
+    ...146    ....32             .62   ....43           -1.62
+    ...147    .Z....            512.   ....18              1.
+    ...147    ....33             .62   ....44           -1.62
+    ...148    .Z....            70.9   ....01           -.247
+    ...148    ....06           .1726   ....14          -.3122
+    ...148    ....20           1.783   ....28           .4703
+    ...148    ....50          -.0928   ....54         1.40015
+    ...149    .Z....            39.8   ....01           -.157
+    ...149    ....14          -.2399   ....20              1.
+    ...149    ....28           .4273   ....50          -.0361
+    ...149    ....54         1.20404
+    ...150    .Z....            39.8   ....01           -.157
+    ...150    ....14          -.2789   ....20              1.
+    ...150    ....28           .4663   ....50          -.0361
+    ...150    ....54         1.43498
+    ...151    .Z....            2.04   ....26              1.
+    ...151    ....28             .55   ....50            -.52
+    ...151    ....54              .6
+    ...152    ....28              1.   ....50             -1.
+    ...152    ....54             1.8
+    ...153    .Z....             1.8   ....03            -.33
+    ...153    ....21              1.   ....50            .017
+    ...154    .Z....             1.8   ....21              1.
+    ...154    ....37            -.33
+    ...155    .Z....          -2600.   ....01              .2
+    ...155    ....14             .73   ....29              1.
+    ...155    ....55             .07
+    ...156    .Z....          -2600.   ....14             .72
+    ...156    ....29              1.   ....47              .2
+    ...156    ....55             .08
+    ...157    .Z....            10.4   ....02              1.
+    ...157    ....03             .25   ....10             45.
+    ...157    ....22            .875   ....28           .3675
+    ...157    ....34           .6325   ....50          .02536
+    ...157    ....54           1.614
+    ...158    .Z....            10.4   ....02              1.
+    ...158    ....03              .2   ....10             55.
+    ...158    ....22            .875   ....28            .365
+    ...158    ....46            .635   ....50          .02538
+    ...158    ....54            1.59
+    ...159    .Z....            28.8   ....19              1.
+    ...159    ....28           -.828   ....31              1.
+    ...159    ....34           -.095   ....35            -.02
+    ...159    ....50            .012   ....54           -1.42
+    ...159    ....55          -.0467
+    ...160    .Z....            43.4   ....01          -.0022
+    ...160    ....06          -.0192   ....19              1.
+    ...160    ....27            .679   ....28           -.808
+    ...160    ....32              1.   ....34           -.095
+    ...160    ....35            -.02   ....50           .0205
+    ...160    ....54           -1.84   ....55          -.0467
+    ...161    .Z....            30.4   ....01          -.0022
+    ...161    ....06          -.0192   ....24              1.
+    ...161    ....27            .679   ....28           -.808
+    ...161    ....33              1.   ....34           -.095
+    ...161    ....35            -.02   ....50           .0205
+    ...161    ....54           -1.84   ....55          -.0467
+    ...162    ....28             -1.   ....34              1.
+    ...162    ....54            -5.2
+    ...163    ....28             -1.   ....35              1.
+    ...163    ....54            -6.7
+    ...164    .Z....          -1218.   ....35              1.
+    ...164    ....48              1.
+    ...165    ....35              1.   ....50             -.8
+    ...166    ....28            .482   ....34            .498
+    ...166    ....35             .02   ....36              1.
+    ...166    ....37             .79   ....54           2.217
+    ...167    ....28            .474   ....35             .02
+    ...167    ....36              1.   ....37             .53
+    ...167    ....46            .506   ....54            2.18
+    ...168    .Z....          -1322.   ....06             .07
+    ...168    ....35              .1   ....39              1.
+    ...168    ....55             .83
+    ...169    .Z....          -1322.   ....35             .07
+    ...169    ....39              1.   ....46             .33
+    ...169    ....55              .6
+    ...170    .Z....          -1322.   ....34             .33
+    ...170    ....35             .07   ....39              1.
+    ...170    ....55              .6
+    ...171    .Z....          -1660.   ....22            .625
+    ...171    ....28           -.125   ....34           1.125
+    ...171    ....41              1.   ....50          .01812
+    ...171    ....54            -.65
+    ...172    .Z....          -1670.   ....41              1.
+    ...172    ....46              1.
+    ...173    .Z....            14.8   ....22            1.25
+    ...173    ....28            -.25   ....34         1.03125
+    ...173    ....35          .21875   ....40              1.
+    ...173    ....50          .03625   ....51             30.
+    ...173    ....54        -1.36562
+    ...174    .Z....            14.8   ....22            1.25
+    ...174    ....28            -.25   ....35          .21875
+    ...174    ....40              1.   ....46         1.03125
+    ...174    ....50          .03625   ....51             35.
+    ...174    ....54        -1.38375
+    ...175    .Z....            28.8   ....19           1.072
+    ...175    ....28           -.706   ....35           -.027
+    ...175    ....42              1.   ....46           -.128
+    ...175    ....50           .0129   ....54           -1.61
+    ...175    ....55          -.1203
+    ...176    .Z....             43.   ....01          -.0012
+    ...176    ....06          -.0159   ....19           1.072
+    ...176    ....27            .534   ....28            -.69
+    ...176    ....35           -.027   ....43              1.
+    ...176    ....46           -.128   ....50           .0195
+    ...176    ....54           -1.84   ....55          -.1203
+    ...177    .Z....             30.   ....01          -.0012
+    ...177    ....06          -.0159   ....24              1.
+    ...177    ....27            .534   ....28            -.69
+    ...177    ....35           -.027   ....44              1.
+    ...177    ....46           -.128   ....50           .0195
+    ...177    ....54           -1.84   ....55          -.1203
+    ...178    .Z....          -1763.   ....05            .181
+    ...178    ....45              1.   ....47             .11
+    ...178    ....55            .709
+    ...179    .Z....          -1722.   ....05            .051
+    ...179    ....45              1.   ....47            .055
+    ...179    ....55            .894
+    ...180    .Z....          -1680.   ....05            .036
+    ...180    ....45              1.   ....55            .964
+    ...181    ....28             -1.   ....46              1.
+    ...181    ....54            -5.3
+    ...182    .Z....          -1890.   ....30              1.
+    ...182    ....47             .92   ....49           -10.1
+    ...182    ....52           -.042   ....53           -.063
+    ...182    ....55             .08
+    ...183    .Z....           1780.   ....02              1.
+    ...183    ....03              .4   ....10             45.
+    ...184    .Z....           1600.   ....28             -1.
+    ...184    ....54           -4.35
+    ...185    .Z....            903.   ....28             -1.
+    ...185    ....54            -2.1
+    ...186    .Z....           1760.   ....36              1.
+    ...186    ....37              .8
+    ...187    .Z....           2100.   ....40              1.
+    ...187    ....51             24.
+    ...188    .Z....           1000.   ....49           -64.3
+    ...188    ....52              1.
+    ...189    .Z....           1000.   ....49           -27.4
+    ...189    ....53              1.
+    ...190    .Z....          -1890.   ....30              1.
+    ...190    ....49             9.1   ....52           -.042
+    ...190    ....53           -.063   ....55              1.
+    ...191    .Z....            92.1   ....05            -.36
+    ...191    ....23              1.   ....28           -.026
+    ...191    ....47           -.134   ....50           -.182
+    ...191    ....54          -.1742   ....55            .826
+    ...192    .Z....           -903.   ....38              1.
+    ...192    ....55              1.
+    ...193    .Z....            78.7   ....55              1.
+    ...194    .Z....          -1218.   ....48              1.
+    ...194    ....55              1.
+    ...195    .Z....            15.6   ....05           -.396
+    ...195    ....25              1.   ....28           -.029
+    ...195    ....47           -.147   ....50           -.119
+    ...195    ....54           -.194   ....55             .81
+    ...196    ....50             -.8   ....55              1.
+RHS
+    ZZZZ0001  ....02            52.6   ....03            22.7
+    ZZZZ0001  ....04            23.4   ....07            108.
+    ZZZZ0001  ....08             50.   ....09             13.
+    ZZZZ0001  ....10           2366.   ....11            200.
+    ZZZZ0001  ....12            265.   ....13            300.
+    ZZZZ0001  ....15             31.   ....16             60.
+    ZZZZ0001  ....17            134.   ....18             34.
+    ZZZZ0001  ....19            413.   ....20            41.5
+    ZZZZ0001  ....21             15.   ....22            20.6
+    ZZZZ0001  ....23            13.5   ....24            440.
+    ZZZZ0001  ....26             16.   ....27            290.
+    ZZZZ0001  ....28          -524.9   ....29             3.1
+    ZZZZ0001  ....30             9.1   ....36             43.
+    ZZZZ0001  ....37            34.4   ....38            15.6
+    ZZZZ0001  ....39            19.2   ....40            44.9
+    ZZZZ0001  ....41             6.1   ....45            13.2
+    ZZZZ0001  ....48            31.2   ....50             2.5
+    ZZZZ0001  ....51           1080.   ....54         -1231.6
+    ZZZZ0001  ....56            107.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/afiro.mps b/demos/ppl_lpsol/examples/afiro.mps
new file mode 100644
index 0000000..26002a3
--- /dev/null
+++ b/demos/ppl_lpsol/examples/afiro.mps
@@ -0,0 +1,83 @@
+NAME          AFIRO
+ROWS
+ E  R09
+ E  R10
+ L  X05
+ L  X21
+ E  R12
+ E  R13
+ L  X17
+ L  X18
+ L  X19
+ L  X20
+ E  R19
+ E  R20
+ L  X27
+ L  X44
+ E  R22
+ E  R23
+ L  X40
+ L  X41
+ L  X42
+ L  X43
+ L  X45
+ L  X46
+ L  X47
+ L  X48
+ L  X49
+ L  X50
+ L  X51
+ N  COST
+COLUMNS
+    X01       X48               .301   R09                -1.
+    X01       R10              -1.06   X05                 1.
+    X02       X21                -1.   R09                 1.
+    X02       COST               -.4
+    X03       X46                -1.   R09                 1.
+    X04       X50                 1.   R10                 1.
+    X06       X49               .301   R12                -1.
+    X06       R13              -1.06   X17                 1.
+    X07       X49               .313   R12                -1.
+    X07       R13              -1.06   X18                 1.
+    X08       X49               .313   R12                -1.
+    X08       R13               -.96   X19                 1.
+    X09       X49               .326   R12                -1.
+    X09       R13               -.86   X20                 1.
+    X10       X45              2.364   X17                -1.
+    X11       X45              2.386   X18                -1.
+    X12       X45              2.408   X19                -1.
+    X13       X45              2.429   X20                -1.
+    X14       X21                1.4   R12                 1.
+    X14       COST              -.32
+    X15       X47                -1.   R12                 1.
+    X16       X51                 1.   R13                 1.
+    X22       X46               .109   R19                -1.
+    X22       R20               -.43   X27                 1.
+    X23       X44                -1.   R19                 1.
+    X23       COST               -.6
+    X24       X48                -1.   R19                 1.
+    X25       X45                -1.   R19                 1.
+    X26       X50                 1.   R20                 1.
+    X28       X47               .109   R22               -.43
+    X28       R23                 1.   X40                 1.
+    X29       X47               .108   R22               -.43
+    X29       R23                 1.   X41                 1.
+    X30       X47               .108   R22               -.39
+    X30       R23                 1.   X42                 1.
+    X31       X47               .107   R22               -.37
+    X31       R23                 1.   X43                 1.
+    X32       X45              2.191   X40                -1.
+    X33       X45              2.219   X41                -1.
+    X34       X45              2.249   X42                -1.
+    X35       X45              2.279   X43                -1.
+    X36       X44                1.4   R23                -1.
+    X36       COST              -.48
+    X37       X49                -1.   R23                 1.
+    X38       X51                 1.   R22                 1.
+    X39       R23                 1.   COST               10.
+RHS
+    B         X50               310.   X51               300.
+    B         X05                80.   X17                80.
+    B         X27               500.   R23                44.
+    B         X40               500.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/bgprtr.mps b/demos/ppl_lpsol/examples/bgprtr.mps
new file mode 100644
index 0000000..50e56cd
--- /dev/null
+++ b/demos/ppl_lpsol/examples/bgprtr.mps
@@ -0,0 +1,84 @@
+NAME          BGPRTR
+ROWS
+ N  1
+ E  2
+ E  3
+ L  4
+ L  5
+ L  6
+ L  7
+ L  8
+ L  9
+ E  10
+ E  11
+ E  12
+ E  13
+ E  14
+ E  15
+ E  16
+ E  17
+ E  18
+ E  19
+ E  20
+ E  21
+COLUMNS
+    P1T1      1               29970.   2                   1.
+    P1T1      14                  1.
+    P1T2      1               29970.   3                   1.
+    P1T2      15                  1.
+    P2T1      1               29910.   2                   1.
+    P2T1      16                  1.
+    P2T2      1               29910.   3                   1.
+    P2T2      17                  1.
+    I1T1      1               -1000.   8                   1.
+    I1T1      10                 -1.
+    I1T2      1               -1000.   9                   1.
+    I1T2      12                 -1.
+    I2T1      1               -1000.   8                   1.
+    I2T1      11                 -1.
+    I2T2      1               -1000.   9                   1.
+    I2T2      13                 -1.
+    E1T1      1               -1200.   10                 -1.
+    E1T2      1               -1200.   12                 -1.
+    E2T1      1               -1200.   11                 -1.
+    E2T2      1               -1200.   13                 -1.
+    C1T1      1                 -20.   18                  1.
+    C1T1      21                 -1.
+    C1T2      1                 -20.   19                  1.
+    C2T1      1                 -20.   19                 -1.
+    C2T1      20                  1.
+    C2T2      1                 -20.   21                  1.
+    NDT1      1               -3000.   2                  -1.
+    NDT2      1               -3000.   3                  -1.
+    R1T1      1                 -20.   18                  1.
+    R1T1      19                 -1.
+    R1T2      1                 -20.   19                  1.
+    R2T1      1                 -20.   20                  1.
+    R2T1      21                 -1.
+    R2T2      1                 -20.   21                  1.
+    N1T1      1                -300.   14                  1.
+    N1T1      15                 -1.
+    N1T2      1                -300.   15                  1.
+    N2T1      1                -300.   16                  1.
+    N2T1      17                 -1.
+    N2T2      1                -300.   17                  1.
+    B1T1      4                 900.   10                  6.
+    B1T1      14                 -1.   18                  1.
+    T1T1      4                  90.   18                 -1.
+    B1T2      5                 900.   12                  6.
+    B1T2      15                 -1.   19                  1.
+    T1T2      5                  90.   19                 -1.
+    B2T1      6                 600.   11                  6.
+    B2T1      16                 -1.   20                  1.
+    T2T1      6                  60.   20                 -1.
+    B2T2      7                 600.   13                  6.
+    B2T2      17                 -1.   21                  1.
+    T2T2      7                  60.   21                 -1.
+RHS
+    RHS       2                 130.   3                 190.
+    RHS       4                   8.   5               80000.
+    RHS       6               70000.   7               70000.
+    RHS       8                1000.   9                1000.
+    RHS       14                  5.   16                  2.
+    RHS       18                  6.   20                  4.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/blend.mps b/demos/ppl_lpsol/examples/blend.mps
new file mode 100644
index 0000000..cd267e5
--- /dev/null
+++ b/demos/ppl_lpsol/examples/blend.mps
@@ -0,0 +1,359 @@
+NAME          BLEND    BRUCE MURTAGHS BLENDING PROBLEM (MINIMIZE).
+ROWS
+ E  1
+ E  2
+ E  3
+ E  4
+ E  5
+ E  6
+ E  7
+ E  8
+ E  9
+ E  10
+ E  11
+ E  12
+ E  13
+ E  14
+ E  15
+ E  16
+ E  17
+ E  18
+ E  19
+ E  20
+ E  21
+ E  22
+ E  23
+ E  24
+ E  25
+ E  26
+ E  27
+ E  28
+ E  29
+ E  30
+ E  31
+ E  32
+ E  33
+ E  34
+ E  35
+ E  36
+ E  37
+ E  38
+ E  39
+ E  40
+ E  41
+ E  42
+ E  43
+ L  44
+ L  45
+ L  46
+ L  47
+ L  48
+ L  49
+ L  50
+ L  51
+ L  52
+ L  53
+ L  54
+ L  55
+ L  56
+ L  57
+ L  58
+ L  59
+ L  60
+ L  61
+ L  62
+ L  63
+ L  64
+ L  65
+ L  66
+ L  67
+ L  68
+ L  69
+ L  70
+ L  71
+ L  72
+ L  73
+ L  74
+ N  C
+COLUMNS
+    1         2                -.537   3                -.131
+    1         4               -.1155   5               -.0365
+    1         6                -.143   7                -.037
+    1         40                .003   41               .0587
+    1         42                 .15   43                .302
+    1         67                  1.   C                  3.2
+    2         1               -.2931   3                -.117
+    2         4               -.0649   5               -.1233
+    2         6               -.2217   8                 -.18
+    2         39               .0042   40                .003
+    2         41               .1053   42                .185
+    2         43                .384   50             -.00862
+    2         51             -.00862   56              -.0101
+    2         57              -.0101   68                  1.
+    2         C                 2.87
+    3         2                   1.   9               -.0277
+    3         10              -.0563   11               -.199
+    3         12              -.6873   13               -.017
+    3         40              .01303   41               .0506
+    3         42                .209   43                .495
+    3         65                  1.
+    4         1                   1.   9               -.0112
+    4         10              -.0378   11              -.1502
+    4         12              -.7953   13              -.0099
+    4         40              .01303   41               .0448
+    4         42                .185   43                .721
+    4         65                  1.
+    5         9                -.175   10                -.27
+    5         11               -.028   13               -.455
+    5         21                  1.   40              .01303
+    5         41               .0506   42                .209
+    5         43                .495
+    6         9                -.271   10              -.3285
+    6         11              -.0255   13              -.2656
+    6         18                  1.   40              .01303
+    6         41               .0506   42                .209
+    6         43                .495
+    7         9               -.2836   10              -.3285
+    7         11              -.0241   13              -.2502
+    7         17                  1.   40              .01303
+    7         41               .0506   42                .209
+    7         43                .495
+    8         12                  1.   14                 -1.
+    8         39               .0327   41                .094
+    8         42                .045   43                .793
+    8         C                .0044
+    9         15                 -1.   22                  1.
+    10        16                 -1.   22                  1.
+    11        14                  1.   15                 -1.
+    12        14                  1.   16                 -1.
+    13        15                  1.   17              -.0588
+    13        19              -.8145   23              -.0091
+    13        39              -.8239   40               .0081
+    13        41              -.2112   42                .387
+    13        43                1.03   69                 1.3
+    13        C                  .07
+    14        16                  1.   18              -.0404
+    14        20              -.8564   23              -.0069
+    14        39              -.7689   40               .0063
+    14        41               -.156   42                .297
+    14        43                .792   69                  1.
+    14        C                .0378
+    15        5                   1.   21              -.3321
+    15        22              -.5875   23               -.362
+    15        39                 2.3   41              -.2049
+    15        42                .826   43               14.61
+    15        65                  1.   70                  1.
+    15        C                 .155
+    16        6                   1.   21              -.3321
+    16        22              -.5875   23               -.362
+    16        39                 2.3   41              -.2049
+    16        42                .826   43               14.61
+    16        66                  1.   70                  1.
+    16        C                 .155
+    17        4                   1.   21              -.2414
+    17        22              -.6627   23               -.293
+    17        39                 2.3   41              -.1531
+    17        42                .826   43               14.61
+    17        65                  1.   70                  1.
+    17        C                 .155
+    18        21              -.2414   22              -.6627
+    18        23               -.293   28                  1.
+    18        39                 2.3   41              -.1531
+    18        42                .826   43               14.61
+    18        70                  1.   C                 .155
+    19        5                   1.   10              -.0185
+    19        13              -.0568   24              -.0806
+    19        25              -.0658   26              -.0328
+    19        27              -.4934   28              -.2922
+    19        29              -.0096   40              -.0654
+    19        41              -.2535   42                .632
+    19        43               .6807   65                  1.
+    19        71                  1.   C                .0528
+    20        6                   1.   10              -.0185
+    20        13              -.0568   24              -.0806
+    20        25              -.0658   26              -.0328
+    20        27              -.4934   28              -.2922
+    20        29              -.0096   40              -.0654
+    20        41              -.2535   42                .632
+    20        43               .6807   66                  1.
+    20        71                  1.   C                .0528
+    21        4                   1.   10              -.0184
+    21        13              -.0564   24               -.078
+    21        25              -.0655   26              -.0303
+    21        27               -.475   28               -.305
+    21        40              -.0654   41              -.2703
+    21        42                .632   43               .6807
+    21        65                  1.   71                  1.
+    21        C                .0528
+    22        3                   1.   10              -.0184
+    22        13              -.0564   24               -.078
+    22        25              -.0655   26              -.0303
+    22        27               -.475   28               -.305
+    22        40              -.0654   41              -.2703
+    22        42                .632   43               .6807
+    22        65                  1.   71                  1.
+    22        C                .0528
+    23        13                 .76   25               .5714
+    23        30                 -1.   40               .1869
+    23        41               .2796   42               2.241
+    23        43               2.766   72                  1.
+    23        C                 .128
+    24        9               -.0571   10              -.0114
+    24        13               .6571   24               .5714
+    24        31                 -1.   40               .1724
+    24        41               .2579   42               2.067
+    24        43               2.552   72                  1.
+    24        C                 .118
+    25        9                  -1.   25                  1.
+    26        10                 -1.   24                  1.
+    27        10                 -1.   13                  1.
+    28        11                  1.   32                 -1.
+    28        44               -7.95   45                -8.7
+    28        46                 -3.   47                 14.
+    28        48                  1.   49                 -1.
+    29        23                  1.   32                 -1.
+    29        44               -8.84   45               -9.45
+    29        46                 -3.   47                 12.
+    29        48                  1.   49                 -1.
+    30        19                  1.   32                 -1.
+    30        44               -9.43   45               -9.57
+    30        46                 -3.   47                 3.5
+    30        48                .233   49               -.358
+    31        20                  1.   32                 -1.
+    31        44               -9.03   45               -9.32
+    31        46                 -3.   47                 3.5
+    31        48                .205   49               -.333
+    32        27                  1.   32                 -1.
+    32        44               -9.23   45               -9.22
+    32        46                 -3.   47                  6.
+    32        48                .381   49               -.509
+    33        30                  1.   32                 -1.
+    33        44                -9.4   45               -9.85
+    33        46                 -3.   47                 2.5
+    33        48                 .39   49                -.77
+    34        31                  1.   32                 -1.
+    34        44               -9.74   45               -10.1
+    34        46                 -3.   47                 3.3
+    34        48                .233   49                -.58
+    35        10                  1.   32                 -1.
+    35        44               -9.74   45                -9.9
+    35        46                 -3.   47                 66.
+    35        48                  1.   49                 -1.
+    36        44               -.493   45               -.165
+    36        46                  1.   C                .0924
+    37        32                  1.   44               10.03
+    37        45               10.03   47                -9.5
+    37        48                 -.5   49                  .5
+    37        73                 .64   74                 .35
+    37        C                -5.36
+    38        11                  1.   33                 -1.
+    38        50               -7.98   51               -8.58
+    38        52                 -3.   53                 14.
+    38        54                  1.   55                 -1.
+    39        23                  1.   33                 -1.
+    39        50               -8.87   51               -9.33
+    39        52                 -3.   53                 12.
+    39        54                  1.   55                 -1.
+    40        19                  1.   33                 -1.
+    40        50               -9.46   51               -9.45
+    40        52                 -3.   53                 3.5
+    40        54                .233   55               -.358
+    41        20                  1.   33                 -1.
+    41        50               -9.06   51                -9.2
+    41        52                 -3.   53                 3.5
+    41        54                .205   55               -.333
+    42        27                  1.   33                 -1.
+    42        50               -9.26   51               -9.13
+    42        52                 -3.   53                  6.
+    42        54                .318   55               -.509
+    43        10                  1.   33                 -1.
+    43        50               -9.77   51               -9.78
+    43        52                 -3.   53                 66.
+    43        54                  1.   55                 -1.
+    44        50               -.435   51               -.208
+    44        52                  1.   C                .0924
+    45        33                  1.   50                9.65
+    45        51                9.65   53                -9.5
+    45        54                 -.5   55                  .5
+    45        73                -.36   74                 .35
+    45        C                -5.08
+    46        11                  1.   36                 -1.
+    46        56               -7.99   57               -8.59
+    46        58                 -3.   59                 14.
+    46        60                  1.   61                 -1.
+    47        23                  1.   36                 -1.
+    47        56               -8.88   57               -9.34
+    47        58                 -3.   59                 12.
+    47        60                  1.   61                 -1.
+    48        19                  1.   36                 -1.
+    48        56               -9.47   57               -9.46
+    48        58                 -3.   59                 3.5
+    48        60                .233   61               -.358
+    49        20                  1.   36                 -1.
+    49        56               -9.07   57               -9.21
+    49        58                 -3.   59                 3.5
+    49        60                .205   61               -.333
+    50        27                  1.   36                 -1.
+    50        56               -9.27   57               -9.14
+    50        58                 -3.   59                  6.
+    50        60                .318   61               -.509
+    51        10                  1.   36                 -1.
+    51        56               -9.78   57               -9.79
+    51        58                 -3.   59                 66.
+    51        60                  1.   61                 -1.
+    52        56               -.426   57               -.204
+    52        58                  1.   C                .0924
+    53        36                  1.   56                9.05
+    53        57                9.05   59                -9.5
+    53        60                 -.5   61                  .5
+    53        73                -.36   74                -.65
+    53        C                -4.51
+    54        9                  -1.   26                  1.
+    55        9                   1.   37                 -1.
+    56        10                  1.   37                 -1.
+    57        37                  1.   C                -2.75
+    58        11                  1.   38                 -1.
+    58        63                -14.   64                 14.
+    59        12                  1.   38                 -1.
+    59        63                 -.8   64                  .8
+    60        38                  1.   63                  2.
+    60        64                 -3.   C                 -4.2
+    61        4                   1.   34                 -1.
+    62        3                   1.   34                 -1.
+    63        34                  1.   65                  1.
+    63        C                 -3.6
+    64        7                   1.   35                 -1.
+    64        62                10.1
+    65        8                   1.   35                 -1.
+    65        62               12.63
+    66        6                   1.   35                 -1.
+    66        62                8.05   66                  1.
+    67        5                   1.   35                 -1.
+    67        62                 6.9   65                  1.
+    68        29                  1.   35                 -1.
+    68        62                8.05
+    69        28                  1.   35                 -1.
+    69        62                 4.4
+    70        35                  1.   62               -10.1
+    70        C                  -2.
+    71        39                  1.   41               -.325
+    72        13                  1.   41              -4.153
+    73        10                  1.   41              -4.316
+    74        9                   1.   41              -3.814
+    75        25                  1.   41              -3.808
+    76        24                  1.   41               -4.44
+    77        40                 -1.   41                1.42
+    77        C                  .04
+    78        40                  1.
+    79        10                 -.5   13                 -.5
+    79        C                   3.
+    80        41                 -1.   C                   .4
+    81        41                  1.
+    82        42                 -1.   C                .0132
+    83        43                 -1.   C                  .01
+RHS
+              65               23.26   66                5.25
+              67               26.32   68               21.05
+              69               13.45   70                2.58
+              71                 10.   72                 10.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/boeing1.mps b/demos/ppl_lpsol/examples/boeing1.mps
new file mode 100644
index 0000000..bbe16dd
--- /dev/null
+++ b/demos/ppl_lpsol/examples/boeing1.mps
@@ -0,0 +1,2636 @@
+NAME          BOEING1  (FLAPINTL)
+ROWS
+ G  REVENUES
+ G  ACOCOSTS
+ N  OBJECTIV
+ G  SYSTDEPT
+ G  ACMILES
+ G  ASMILES
+ G  PASSNGRS
+ G  RPMILES
+ G  LFRPMASM
+ G  ATONMILE
+ G  RTONMILE
+ G  LFTNMILE
+ E  FLAV*1
+ E  FLAV*2
+ E  FLAV*3
+ E  FLAV*4
+ E  FLAV*5
+ E  FLAV*6
+ G  LF1001S1
+ G  LF1002S1
+ G  LF1002S2
+ G  LF1003S1
+ G  LF1004S1
+ G  LF1004S2
+ G  LF1005S1
+ G  LF1005S2
+ G  LF1105S1
+ G  LF1105S2
+ G  LF1006S1
+ G  LF1006S2
+ G  LF1007S1
+ G  LF1007S2
+ G  LF1008S1
+ G  LF1008S2
+ G  LF1008S3
+ G  LF1009S1
+ G  LF1009S2
+ G  LF1010S1
+ G  LF1011S1
+ G  LF1011S2
+ G  LF1012S1
+ G  LF1013S1
+ G  LF1013S2
+ G  LF1014S1
+ G  LF1014S2
+ G  LF1015S1
+ G  LF1015S2
+ G  LF1016S1
+ G  LF1016S2
+ G  LF1017S1
+ G  LF1017S2
+ G  LF1018S1
+ G  LF1018S2
+ G  LF1019S1
+ G  LF1019S2
+ G  LF1020S1
+ G  LF1021S1
+ G  LF1022S1
+ G  LF1022S2
+ G  LF1022S3
+ G  LF1023S1
+ G  LF1023S2
+ G  LF1023S3
+ G  LF1026S1
+ G  LF1026S2
+ G  LF1026S3
+ G  LF1027S1
+ G  LF1027S2
+ G  LF1027S3
+ G  LF1028S1
+ G  LF1028S2
+ G  LF1028S3
+ G  LF1029S1
+ G  LF1029S2
+ G  LF1029S3
+ G  LF1029S4
+ G  LF1029S5
+ G  LF1030S1
+ G  LF1030S2
+ G  LF1030S3
+ G  LF1030S4
+ G  LF1032S1
+ G  LF1032S2
+ G  LF1032S3
+ G  LF1032S4
+ G  LF1032S5
+ G  LF1033S1
+ G  LF1033S2
+ G  LF1033S3
+ G  LF1034S1
+ G  LF1034S2
+ G  LF1035S1
+ G  LF1035S2
+ G  LF1036S1
+ G  LF1036S2
+ G  LF1037S1
+ G  LF1037S2
+ G  LF1038S1
+ G  LF1039S1
+ G  LF1040S1
+ G  LF1040S2
+ G  LF1041S1
+ G  LF1042S1
+ G  LF1043S1
+ G  LF1044S1
+ G  LF1046S1
+ G  LF1046S2
+ G  LF1047S1
+ G  LF1047S2
+ G  LF1047S3
+ G  LF1050S1
+ G  LF1050S2
+ G  LF1051S1
+ L  NOPTLON0
+ G  NOPTLON1
+ L  NOPTTYO0
+ G  NOPTTYO1
+ L  DMBOSHNL
+ L  DMBOSLAX
+ L  DMBOSSEA
+ L  DMBOSSFO
+ L  DMBOSTPE
+ L  DMBOSTYO
+ L  DMBOSYUL
+ L  DMBOSYVR
+ L  DMBOSYWG
+ L  DMBOSYYZ
+ L  DMBUROAK
+ L  DMBURSEA
+ L  DMBURSFO
+ L  DMHNLLAX
+ L  DMHNLLON
+ L  DMHNLPAR
+ L  DMHNLSEA
+ L  DMHNLSFO
+ L  DMHNLYVR
+ L  DMLASSEA
+ L  DMLASYVR
+ L  DMLAXOAK
+ L  DMLAXSEA
+ L  DMLAXSFO
+ L  DMLAXTPE
+ L  DMLAXTYO
+ L  DMLAXYVR
+ L  DMLONPAR
+ L  DMLONSEA
+ L  DMLONYVR
+ L  DMOAKONT
+ L  DMOAKSEA
+ L  DMONTSFO
+ L  DMONTSEA
+ L  DMPARSEA
+ L  DMPARYVR
+ L  DMRNOSEA
+ L  DMRNOYVR
+ L  DMSEASFO
+ L  DMSEATPE
+ L  DMSEATYO
+ L  DMSEAYVR
+ L  DMSFOTPE
+ L  DMSFOTYO
+ L  DMSFOYVR
+ L  DMTPETYO
+ L  DMTPEYVR
+ L  DMTYOYVR
+ L  DMYULYVR
+ L  DMYULYWG
+ L  DMYULYYZ
+ L  DMYVRYWG
+ L  DMYVRYYZ
+ L  DMYWGYYZ
+ L  DMBOSOAK
+ L  DMBOSBUR
+ L  DMBOSONT
+ L  DMBURYVR
+ L  DMBURTYO
+ L  DMBURTPE
+ L  DMBURHNL
+ L  DMHNLOAK
+ L  DMHNLONT
+ L  DMHNLYWG
+ L  DMHNLYYZ
+ L  DMHNLYUL
+ L  DMLASTYO
+ L  DMLASTPE
+ L  DMLAXLON
+ L  DMLAXPAR
+ L  DMBURLON
+ L  DMBURPAR
+ L  DMLONONT
+ L  DMLONOAK
+ L  DMOAKPAR
+ L  DMOAKTYO
+ L  DMOAKTPE
+ L  DMONTPAR
+ L  DMONTTYO
+ L  DMONTTPE
+ L  DMPARSFO
+ L  DMRNOTYO
+ L  DMRNOTPE
+ L  DMTPEYWG
+ L  DMTPEYYZ
+ L  DMTPEYUL
+ L  DMTYOYUL
+ L  DMTYOYYZ
+ L  DMTYOYWG
+ E  DMSFOOAK
+ E  DMLAXBUR
+ E  DMLAXONT
+ G  MSBOSHNL
+ G  MSBOSSEA
+ G  MSBOSSFO
+ G  MSBOSYUL
+ G  MSBOSYVR
+ G  MSBOSYWG
+ G  MSBOSYYZ
+ G  MSBUROAK
+ G  MSBURSEA
+ G  MSBURSFO
+ G  MSHNLLAX
+ G  MSHNLSEA
+ G  MSHNLSFO
+ G  MSHNLYVR
+ G  MSLASSEA
+ G  MSLASYVR
+ G  MSLAXOAK
+ G  MSLAXSEA
+ G  MSLAXSFO
+ G  MSLAXTPE
+ G  MSLAXYVR
+ G  MSLONPAR
+ G  MSLONSEA
+ L  MSLONYVR
+ G  MSOAKONT
+ G  MSOAKSEA
+ G  MSONTSFO
+ G  MSONTSEA
+ L  MSPARSEA
+ G  MSRNOSEA
+ G  MSRNOYVR
+ G  MSSEASFO
+ G  MSSEATPE
+ G  MSSEATYO
+ G  MSSEAYVR
+ G  MSSFOYVR
+ G  MSTPETYO
+ G  MSYULYVR
+ G  MSYULYWG
+ G  MSYULYYZ
+ G  MSYVRYWG
+ G  MSYVRYYZ
+ G  MSYWGYYZ
+ G  MSBOSOAK
+ G  MSHNLOAK
+ G  MSLAXLON
+ G  P1044X32
+ G  P1047X54
+ G  P1032X76
+ G  P1033X54
+ G  P1036X43
+ G  P1040X43
+ G  P1042X32
+ G  P1032X75
+ G  P1040X42
+ G  P1016X43
+ G  P1003X32
+ G  P1004X43
+ G  P1105X43
+ G  P1047X23
+ G  P1001X32
+ G  P1002X43
+ G  P1007X43
+ G  P1002X42
+ G  P1022X23
+ G  P1019X43
+ G  P1021X32
+ G  P1105X32
+ G  P1017X43
+ G  P1046X23
+ G  P1008X53
+ G  P1009X43
+ G  P1011X42
+ G  P1012X32
+ G  P1017X42
+ G  P1026X23
+ G  P1027X23
+ G  P1029X24
+ G  P1030X24
+ G  P1050X32
+ G  P1004X32
+ G  P1008X54
+ G  P1011X43
+ G  P1029X23
+ G  P1030X23
+ G  P1047X34
+ G  P1051X23
+ G  P1027X25
+ G  P1029X27
+ G  P1030X26
+ G  P1008X52
+ G  P1009X42
+ G  P1029X25
+ G  P1013X32
+ G  P1014X32
+ G  P1017X32
+ G  P1015X43
+ G  P1013X42
+ G  P1015X42
+ G  P1050X42
+ G  P1018X43
+ G  P1020X32
+ G  P1008X34
+ G  P1011X23
+ G  P1015X23
+ G  P1016X23
+ G  P1028X32
+ G  P1029X43
+ G  P1030X43
+ G  P1002X32
+ G  P1008X32
+ G  P1009X32
+ G  P1010X32
+ G  P1018X32
+ G  P1019X32
+ G  P1023X32
+ G  P1029X45
+ G  P1032X23
+ G  P1008X42
+ G  P1029X35
+ G  P1032X63
+ G  P1033X42
+ G  P1034X42
+ G  P1036X32
+ G  P1032X64
+ G  P1033X43
+ G  P1037X42
+ G  P1039X32
+ G  P1032X65
+ G  P1034X43
+ G  P1037X43
+ G  P1040X32
+ G  P1041X32
+ G  P1032X34
+ G  P1033X23
+ G  P1035X23
+ G  P1032X35
+ G  P1034X23
+ G  P1035X24
+ G  P1032X45
+ G  P1035X34
+ G  P1037X23
+ G  P1038X23
+COLUMNS
+    PBOSHNL0  REVENUES        .23519   OBJECTIV       -.23519
+    PBOSHNL0  PASSNGRS            1.   RPMILES        5.16595
+    PBOSHNL0  LFRPMASM      -5.16595   DMBOSHNL            1.
+    PBOSHNL0  LF1007S1           -1.   LF1007S2           -1.
+    PBOSHNL1  REVENUES        .23519   OBJECTIV       -.23519
+    PBOSHNL1  PASSNGRS            1.   RPMILES        5.59035
+    PBOSHNL1  LFRPMASM      -5.59035   DMBOSHNL            1.
+    PBOSHNL1  LF1047S1           -1.   LF1047S2           -1.
+    PBOSHNL1  LF1047S3           -1.
+    PBOSHNL7  REVENUES       -.02469   OBJECTIV        .02469
+    PBOSHNL7  PASSNGRS           -1.   DMBOSHNL            1.
+    PBOSHNL7  DMBOSSEA           -1.   DMHNLSEA           -1.
+    PBOSHNL8  REVENUES       -.02665   OBJECTIV        .02665
+    PBOSHNL8  PASSNGRS           -1.   DMBOSHNL            1.
+    PBOSHNL8  DMBOSYVR           -1.   DMHNLYVR           -1.
+    PBOSLAX0  REVENUES        .13092   OBJECTIV       -.13092
+    PBOSLAX0  PASSNGRS            1.   RPMILES        3.02542
+    PBOSLAX0  LFRPMASM      -3.02542   DMBOSLAX            1.
+    PBOSLAX0  LF1046S1           -1.   LF1046S2           -1.
+    PBOSLAX1  REVENUES        .13092   OBJECTIV       -.13092
+    PBOSLAX1  PASSNGRS            1.   RPMILES        3.03697
+    PBOSLAX1  LFRPMASM      -3.03697   DMBOSLAX            1.
+    PBOSLAX1  LF1047S2           -1.   LF1047S3           -1.
+    PBOSLAX7  REVENUES       -.03462   OBJECTIV        .03462
+    PBOSLAX7  PASSNGRS           -1.   DMBOSLAX            1.
+    PBOSLAX7  DMBOSSFO           -1.   DMLAXSFO           -1.
+    PBOSSEA0  REVENUES        .12596   OBJECTIV       -.12596
+    PBOSSEA0  PASSNGRS            1.   RPMILES        2.48884
+    PBOSSEA0  LFRPMASM      -2.48884   DMBOSSEA            1.
+    PBOSSEA0  LF1007S1           -1.
+    PBOSSEA1  REVENUES        .12596   OBJECTIV       -.12596
+    PBOSSEA1  PASSNGRS            1.   RPMILES        2.78679
+    PBOSSEA1  LFRPMASM      -2.78679   DMBOSSEA            1.
+    PBOSSEA1  LF1032S1           -1.   LF1032S2           -1.
+    PBOSSEA1  LF1032S3           -1.   LF1032S4           -1.
+    PBOSSEA1  LF1032S5           -1.
+    PBOSSEA2  REVENUES        .12596   OBJECTIV       -.12596
+    PBOSSEA2  PASSNGRS            1.   RPMILES        2.48884
+    PBOSSEA2  LFRPMASM      -2.48884   DMBOSSEA            1.
+    PBOSSEA2  LF1043S1           -1.
+    PBOSSFO0  REVENUES        .13481   OBJECTIV       -.13481
+    PBOSSFO0  PASSNGRS            1.   RPMILES        2.69845
+    PBOSSFO0  LFRPMASM      -2.69845   DMBOSSFO            1.
+    PBOSSFO0  P1044X32           -1.   LF1044S1           -1.
+    PBOSSFO1  REVENUES        .13481   OBJECTIV       -.13481
+    PBOSSFO1  PASSNGRS            1.   RPMILES        2.69845
+    PBOSSFO1  LFRPMASM      -2.69845   DMBOSSFO            1.
+    PBOSSFO1  P1047X54           -1.   LF1047S3           -1.
+    PBOSTPE1  REVENUES       -.05629   OBJECTIV        .05629
+    PBOSTPE1  PASSNGRS           -1.   DMBOSTPE            1.
+    PBOSTPE1  DMBOSSEA           -1.   DMSEATPE           -1.
+    PBOSTPE2  REVENUES        -.0528   OBJECTIV         .0528
+    PBOSTPE2  PASSNGRS           -1.   DMBOSTPE            1.
+    PBOSTPE2  DMBOSYVR           -1.   DMTPEYVR           -1.
+    PBOSTYO1  REVENUES       -.04525   OBJECTIV        .04525
+    PBOSTYO1  PASSNGRS           -1.   DMBOSTYO            1.
+    PBOSTYO1  DMBOSSEA           -1.   DMSEATYO           -1.
+    PBOSTYO2  REVENUES       -.04206   OBJECTIV        .04206
+    PBOSTYO2  PASSNGRS           -1.   DMBOSTYO            1.
+    PBOSTYO2  DMBOSYVR           -1.   DMTYOYVR           -1.
+    PBOSYUL0  REVENUES        .02799   OBJECTIV       -.02799
+    PBOSYUL0  PASSNGRS            1.   RPMILES         .25418
+    PBOSYUL0  LFRPMASM       -.25418   DMBOSYUL            1.
+    PBOSYUL0  P1032X76           -1.   LF1032S5           -1.
+    PBOSYUL1  REVENUES        .02799   OBJECTIV       -.02799
+    PBOSYUL1  PASSNGRS            1.   RPMILES         .25418
+    PBOSYUL1  LFRPMASM       -.25418   DMBOSYUL            1.
+    PBOSYUL1  P1033X54           -1.   LF1033S3           -1.
+    PBOSYUL2  REVENUES        .02799   OBJECTIV       -.02799
+    PBOSYUL2  PASSNGRS            1.   RPMILES         .25418
+    PBOSYUL2  LFRPMASM       -.25418   DMBOSYUL            1.
+    PBOSYUL2  P1036X43           -1.   LF1036S2           -1.
+    PBOSYUL3  REVENUES        .02799   OBJECTIV       -.02799
+    PBOSYUL3  PASSNGRS            1.   RPMILES         .25418
+    PBOSYUL3  LFRPMASM       -.25418   DMBOSYUL            1.
+    PBOSYUL3  P1040X43           -1.   LF1040S2           -1.
+    PBOSYUL4  REVENUES        .02799   OBJECTIV       -.02799
+    PBOSYUL4  PASSNGRS            1.   RPMILES         .25418
+    PBOSYUL4  LFRPMASM       -.25418   DMBOSYUL            1.
+    PBOSYUL4  P1042X32           -1.   LF1042S1           -1.
+    PBOSYVR0  REVENUES        .12674   OBJECTIV       -.12674
+    PBOSYVR0  PASSNGRS            1.   RPMILES        2.66058
+    PBOSYVR0  LFRPMASM      -2.66058   DMBOSYVR            1.
+    PBOSYVR0  LF1032S2           -1.   LF1032S3           -1.
+    PBOSYVR0  LF1032S4           -1.   LF1032S5           -1.
+    PBOSYVR1  REVENUES        .12674   OBJECTIV       -.12674
+    PBOSYVR1  PASSNGRS            1.   RPMILES         2.5415
+    PBOSYVR1  LFRPMASM       -2.5415   DMBOSYVR            1.
+    PBOSYVR1  LF1033S1           -1.   LF1033S2           -1.
+    PBOSYVR1  LF1033S3           -1.
+    PBOSYVR2  REVENUES        .12674   OBJECTIV       -.12674
+    PBOSYVR2  PASSNGRS            1.   RPMILES        2.54144
+    PBOSYVR2  LFRPMASM      -2.54144   DMBOSYVR            1.
+    PBOSYVR2  LF1036S1           -1.   LF1036S2           -1.
+    PBOSYWG0  REVENUES        .07408   OBJECTIV       -.07408
+    PBOSYWG0  PASSNGRS            1.   RPMILES        1.50255
+    PBOSYWG0  LFRPMASM      -1.50255   DMBOSYWG            1.
+    PBOSYWG0  LF1032S3           -1.   LF1032S4           -1.
+    PBOSYWG0  LF1032S5           -1.
+    PBOSYWG1  REVENUES        .07408   OBJECTIV       -.07408
+    PBOSYWG1  PASSNGRS            1.   RPMILES        1.38348
+    PBOSYWG1  LFRPMASM      -1.38348   DMBOSYWG            1.
+    PBOSYWG1  LF1033S2           -1.   LF1033S3           -1.
+    PBOSYWG7  REVENUES       -.01789   OBJECTIV        .01789
+    PBOSYWG7  PASSNGRS           -1.   DMBOSYWG            1.
+    PBOSYWG7  DMBOSYUL           -1.   DMYULYWG           -1.
+    PBOSYYZ0  REVENUES        .03418   OBJECTIV       -.03418
+    PBOSYYZ0  PASSNGRS            1.   RPMILES         .56879
+    PBOSYYZ0  LFRPMASM       -.56879   DMBOSYYZ            1.
+    PBOSYYZ0  P1032X75           -1.   LF1032S4           -1.
+    PBOSYYZ0  LF1032S5           -1.
+    PBOSYYZ1  REVENUES        .03418   OBJECTIV       -.03418
+    PBOSYYZ1  PASSNGRS            1.   RPMILES         .56879
+    PBOSYYZ1  LFRPMASM       -.56879   DMBOSYYZ            1.
+    PBOSYYZ1  P1040X42           -1.   LF1040S1           -1.
+    PBOSYYZ1  LF1040S2           -1.
+    PBUROAK0  REVENUES        .03032   OBJECTIV       -.03032
+    PBUROAK0  PASSNGRS            1.   RPMILES         .32608
+    PBUROAK0  LFRPMASM       -.32608   DMBUROAK            1.
+    PBUROAK0  LF1005S1           -1.
+    PBUROAK1  REVENUES        .03032   OBJECTIV       -.03032
+    PBUROAK1  PASSNGRS            1.   RPMILES         .32608
+    PBUROAK1  LFRPMASM       -.32608   DMBUROAK            1.
+    PBUROAK1  LF1014S2           -1.
+    PBURSEA0  REVENUES        .05527   OBJECTIV       -.05527
+    PBURSEA0  PASSNGRS            1.   RPMILES          .9975
+    PBURSEA0  LFRPMASM        -.9975   DMBURSEA            1.
+    PBURSEA0  LF1014S1           -1.   LF1014S2           -1.
+    PBURSEA1  REVENUES        .05527   OBJECTIV       -.05527
+    PBURSEA1  PASSNGRS            1.   RPMILES        1.00605
+    PBURSEA1  LFRPMASM      -1.00605   DMBURSEA            1.
+    PBURSEA1  LF1016S1           -1.   LF1016S2           -1.
+    PBURSFO0  REVENUES        .03033   OBJECTIV       -.03033
+    PBURSFO0  PASSNGRS            1.   RPMILES         .32657
+    PBURSFO0  LFRPMASM       -.32657   DMBURSFO            1.
+    PBURSFO0  P1016X43           -1.   LF1016S2           -1.
+    PHNLLAX0  REVENUES        .12871   OBJECTIV       -.12871
+    PHNLLAX0  PASSNGRS            1.   RPMILES        2.55338
+    PHNLLAX0  LFRPMASM      -2.55338   DMHNLLAX            1.
+    PHNLLAX0  P1003X32           -1.   LF1003S1           -1.
+    PHNLLAX1  REVENUES        .12871   OBJECTIV       -.12871
+    PHNLLAX1  PASSNGRS            1.   RPMILES        2.55338
+    PHNLLAX1  LFRPMASM      -2.55338   DMHNLLAX            1.
+    PHNLLAX1  P1004X43           -1.   LF1004S2           -1.
+    PHNLLAX2  REVENUES        .12871   OBJECTIV       -.12871
+    PHNLLAX2  PASSNGRS            1.   RPMILES        2.55338
+    PHNLLAX2  LFRPMASM      -2.55338   DMHNLLAX            1.
+    PHNLLAX2  P1105X43           -1.   LF1105S2           -1.
+    PHNLLAX3  REVENUES        .12871   OBJECTIV       -.12871
+    PHNLLAX3  PASSNGRS            1.   RPMILES        2.55338
+    PHNLLAX3  LFRPMASM      -2.55338   DMHNLLAX            1.
+    PHNLLAX3  P1047X23           -1.   LF1047S1           -1.
+    PHNLLON0  REVENUES        .32504   OBJECTIV       -.32504
+    PHNLLON0  PASSNGRS            1.   RPMILES        7.41547
+    PHNLLON0  LFRPMASM      -7.41547   DMHNLLON            1.
+    PHNLLON0  LF1022S1           -1.   LF1022S2           -1.
+    PHNLLON6  REVENUES       -.03143   OBJECTIV        .03143
+    PHNLLON6  PASSNGRS           -1.   DMHNLLON            1.
+    PHNLLON6  DMHNLSEA           -1.   DMLONSEA           -1.
+    PHNLPAR0  REVENUES         .3343   OBJECTIV        -.3343
+    PHNLPAR0  PASSNGRS            1.   RPMILES        7.64184
+    PHNLPAR0  LFRPMASM      -7.64184   DMHNLPAR            1.
+    PHNLPAR0  LF1022S1           -1.   LF1022S2           -1.
+    PHNLPAR0  LF1022S3           -1.
+    PHNLPAR6  REVENUES       -.03166   OBJECTIV        .03166
+    PHNLPAR6  PASSNGRS           -1.   DMHNLPAR            1.
+    PHNLPAR6  DMHNLSEA           -1.   DMPARSEA           -1.
+    PHNLSEA0  REVENUES        .13391   OBJECTIV       -.13391
+    PHNLSEA0  PASSNGRS            1.   RPMILES        2.67711
+    PHNLSEA0  LFRPMASM      -2.67711   DMHNLSEA            1.
+    PHNLSEA0  P1001X32           -1.   LF1001S1           -1.
+    PHNLSEA1  REVENUES        .13391   OBJECTIV       -.13391
+    PHNLSEA1  PASSNGRS            1.   RPMILES        2.67711
+    PHNLSEA1  LFRPMASM      -2.67711   DMHNLSEA            1.
+    PHNLSEA1  P1002X43           -1.   LF1002S2           -1.
+    PHNLSEA2  REVENUES        .13391   OBJECTIV       -.13391
+    PHNLSEA2  PASSNGRS            1.   RPMILES        2.67711
+    PHNLSEA2  LFRPMASM      -2.67711   DMHNLSEA            1.
+    PHNLSEA2  P1007X43           -1.   LF1007S2           -1.
+    PHNLSFO0  REVENUES        .12174   OBJECTIV       -.12174
+    PHNLSFO0  PASSNGRS            1.   RPMILES         2.8919
+    PHNLSFO0  LFRPMASM       -2.8919   DMHNLSFO            1.
+    PHNLSFO0  LF1004S1           -1.   LF1004S2           -1.
+    PHNLSFO1  REVENUES        .12174   OBJECTIV       -.12174
+    PHNLSFO1  PASSNGRS            1.   RPMILES         2.8919
+    PHNLSFO1  LFRPMASM       -2.8919   DMHNLSFO            1.
+    PHNLSFO1  LF1047S1           -1.   LF1047S2           -1.
+    PHNLSFO7  REVENUES        -.0377   OBJECTIV         .0377
+    PHNLSFO7  PASSNGRS           -1.   DMHNLSFO            1.
+    PHNLSFO7  DMHNLLAX           -1.   DMLAXSFO           -1.
+    PHNLYVR0  REVENUES         .1351   OBJECTIV        -.1351
+    PHNLYVR0  PASSNGRS            1.   RPMILES        2.80333
+    PHNLYVR0  LFRPMASM      -2.80333   DMHNLYVR            1.
+    PHNLYVR0  P1002X42           -1.   LF1002S1           -1.
+    PHNLYVR0  LF1002S2           -1.
+    PHNLYVR1  REVENUES         .1351   OBJECTIV        -.1351
+    PHNLYVR1  PASSNGRS            1.   RPMILES        2.70531
+    PHNLYVR1  LFRPMASM      -2.70531   DMHNLYVR            1.
+    PHNLYVR1  P1022X23           -1.   LF1022S1           -1.
+    PHNLYVR7  REVENUES       -.01809   OBJECTIV        .01809
+    PHNLYVR7  PASSNGRS           -1.   DMHNLYVR            1.
+    PHNLYVR7  DMHNLSEA           -1.   DMSEAYVR           -1.
+    PLASSEA0  REVENUES        .05205   OBJECTIV       -.05205
+    PLASSEA0  PASSNGRS            1.   RPMILES         .86771
+    PLASSEA0  LFRPMASM       -.86771   DMLASSEA            1.
+    PLASSEA0  P1019X43           -1.   LF1019S2           -1.
+    PLASSEA1  REVENUES        .05205   OBJECTIV       -.05205
+    PLASSEA1  PASSNGRS            1.   RPMILES         .86771
+    PLASSEA1  LFRPMASM       -.86771   DMLASSEA            1.
+    PLASSEA1  P1021X32           -1.   LF1021S1           -1.
+    PLASYVR0  REVENUES        .05774   OBJECTIV       -.05774
+    PLASYVR0  PASSNGRS            1.   RPMILES         .99393
+    PLASYVR0  LFRPMASM       -.99393   DMLASYVR            1.
+    PLASYVR0  LF1019S1           -1.   LF1019S2           -1.
+    PLASYVR6  REVENUES       -.01359   OBJECTIV        .01359
+    PLASYVR6  PASSNGRS           -1.   DMLASYVR            1.
+    PLASYVR6  DMLASSEA           -1.   DMSEAYVR           -1.
+    PLAXOAK0  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXOAK0  PASSNGRS            1.   RPMILES         .33855
+    PLAXOAK0  LFRPMASM       -.33855   DMLAXOAK            1.
+    PLAXOAK0  P1105X32           -1.   LF1105S1           -1.
+    PLAXOAK1  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXOAK1  PASSNGRS            1.   RPMILES         .33855
+    PLAXOAK1  LFRPMASM       -.33855   DMLAXOAK            1.
+    PLAXOAK1  P1017X43           -1.   LF1017S2           -1.
+    PLAXOAK2  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXOAK2  PASSNGRS            1.   RPMILES         .33855
+    PLAXOAK2  LFRPMASM       -.33855   DMLAXOAK            1.
+    PLAXOAK2  P1046X23           -1.   LF1046S1           -1.
+    PLAXSEA0  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA0  PASSNGRS            1.   RPMILES        1.01801
+    PLAXSEA0  LFRPMASM      -1.01801   DMLAXSEA            1.
+    PLAXSEA0  P1008X53           -1.   LF1008S2           -1.
+    PLAXSEA0  LF1008S3           -1.
+    PLAXSEA1  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA1  PASSNGRS            1.   RPMILES         .95575
+    PLAXSEA1  LFRPMASM       -.95575   DMLAXSEA            1.
+    PLAXSEA1  P1009X43           -1.   LF1009S2           -1.
+    PLAXSEA2  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA2  PASSNGRS            1.   RPMILES        1.01801
+    PLAXSEA2  LFRPMASM      -1.01801   DMLAXSEA            1.
+    PLAXSEA2  P1011X42           -1.   LF1011S1           -1.
+    PLAXSEA2  LF1011S2           -1.
+    PLAXSEA3  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA3  PASSNGRS            1.   RPMILES         .95575
+    PLAXSEA3  LFRPMASM       -.95575   DMLAXSEA            1.
+    PLAXSEA3  P1012X32           -1.   LF1012S1           -1.
+    PLAXSEA4  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA4  PASSNGRS            1.   RPMILES        1.00997
+    PLAXSEA4  LFRPMASM      -1.00997   DMLAXSEA            1.
+    PLAXSEA4  P1017X42           -1.   LF1017S1           -1.
+    PLAXSEA4  LF1017S2           -1.
+    PLAXSEA5  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA5  PASSNGRS            1.   RPMILES         .95575
+    PLAXSEA5  LFRPMASM       -.95575   DMLAXSEA            1.
+    PLAXSEA5  P1026X23           -1.   LF1026S1           -1.
+    PLAXSEA6  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA6  PASSNGRS            1.   RPMILES         .95575
+    PLAXSEA6  LFRPMASM       -.95575   DMLAXSEA            1.
+    PLAXSEA6  P1027X23           -1.   LF1027S1           -1.
+    PLAXSEA7  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA7  PASSNGRS            1.   RPMILES        1.01801
+    PLAXSEA7  LFRPMASM      -1.01801   DMLAXSEA            1.
+    PLAXSEA7  P1029X24           -1.   LF1029S1           -1.
+    PLAXSEA7  LF1029S2           -1.
+    PLAXSEA8  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA8  PASSNGRS            1.   RPMILES        1.01801
+    PLAXSEA8  LFRPMASM      -1.01801   DMLAXSEA            1.
+    PLAXSEA8  P1030X24           -1.   LF1030S1           -1.
+    PLAXSEA8  LF1030S2           -1.
+    PLAXSEA9  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA9  PASSNGRS            1.   RPMILES         .95575
+    PLAXSEA9  LFRPMASM       -.95575   DMLAXSEA            1.
+    PLAXSEA9  P1050X32           -1.   LF1050S1           -1.
+    PLAXSFO0  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO0  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO0  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO0  P1004X32           -1.   LF1004S1           -1.
+    PLAXSFO1  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO1  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO1  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO1  P1008X54           -1.   LF1008S3           -1.
+    PLAXSFO2  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO2  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO2  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO2  P1011X43           -1.   LF1011S2           -1.
+    PLAXSFO3  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO3  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO3  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO3  P1029X23           -1.   LF1029S1           -1.
+    PLAXSFO4  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO4  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO4  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO4  P1030X23           -1.   LF1030S1           -1.
+    PLAXSFO5  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO5  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO5  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO5  P1047X34           -1.   LF1047S2           -1.
+    PLAXSFO6  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO6  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO6  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO6  P1051X23           -1.   LF1051S1           -1.
+    PLAXTPE0  REVENUES        .30609   OBJECTIV       -.30609
+    PLAXTPE0  PASSNGRS            1.   RPMILES        7.05137
+    PLAXTPE0  LFRPMASM      -7.05137   DMLAXTPE            1.
+    PLAXTPE0  P1027X25           -1.   LF1027S1           -1.
+    PLAXTPE0  LF1027S2           -1.   LF1027S3           -1.
+    PLAXTPE1  REVENUES        .30609   OBJECTIV       -.30609
+    PLAXTPE1  PASSNGRS            1.   RPMILES        7.14547
+    PLAXTPE1  LFRPMASM      -7.14547   DMLAXTPE            1.
+    PLAXTPE1  P1029X27           -1.   LF1029S1           -1.
+    PLAXTPE1  LF1029S2           -1.   LF1029S3           -1.
+    PLAXTPE1  LF1029S4           -1.   LF1029S5           -1.
+    PLAXTPE2  REVENUES        .30609   OBJECTIV       -.30609
+    PLAXTPE2  PASSNGRS            1.   RPMILES        7.11364
+    PLAXTPE2  LFRPMASM      -7.11364   DMLAXTPE            1.
+    PLAXTPE2  P1030X26           -1.   LF1030S1           -1.
+    PLAXTPE2  LF1030S2           -1.   LF1030S3           -1.
+    PLAXTPE2  LF1030S4           -1.
+    PLAXTPE8  REVENUES       -.02571   OBJECTIV        .02571
+    PLAXTPE8  PASSNGRS           -1.   DMLAXTPE            1.
+    PLAXTPE8  DMLAXSEA           -1.   DMSEATPE           -1.
+    PLAXTYO0  REVENUES         .2516   OBJECTIV        -.2516
+    PLAXTYO0  PASSNGRS            1.   RPMILES        5.74891
+    PLAXTYO0  LFRPMASM      -5.74891   DMLAXTYO            1.
+    PLAXTYO0  LF1027S1           -1.   LF1027S2           -1.
+    PLAXTYO1  REVENUES         .2516   OBJECTIV        -.2516
+    PLAXTYO1  PASSNGRS            1.   RPMILES          5.843
+    PLAXTYO1  LFRPMASM        -5.843   DMLAXTYO            1.
+    PLAXTYO1  LF1029S1           -1.   LF1029S2           -1.
+    PLAXTYO1  LF1029S3           -1.   LF1029S4           -1.
+    PLAXTYO2  REVENUES         .2516   OBJECTIV        -.2516
+    PLAXTYO2  PASSNGRS            1.   RPMILES        5.81118
+    PLAXTYO2  LFRPMASM      -5.81118   DMLAXTYO            1.
+    PLAXTYO2  LF1030S1           -1.   LF1030S2           -1.
+    PLAXTYO2  LF1030S3           -1.
+    PLAXTYO8  REVENUES        -.0273   OBJECTIV         .0273
+    PLAXTYO8  PASSNGRS           -1.   DMLAXTYO            1.
+    PLAXTYO8  DMLAXSEA           -1.   DMSEATYO           -1.
+    PLAXYVR0  REVENUES        .06181   OBJECTIV       -.06181
+    PLAXYVR0  PASSNGRS            1.   RPMILES        1.14422
+    PLAXYVR0  LFRPMASM      -1.14422   DMLAXYVR            1.
+    PLAXYVR0  P1008X52           -1.   LF1008S1           -1.
+    PLAXYVR0  LF1008S2           -1.   LF1008S3           -1.
+    PLAXYVR1  REVENUES        .06181   OBJECTIV       -.06181
+    PLAXYVR1  PASSNGRS            1.   RPMILES        1.08196
+    PLAXYVR1  LFRPMASM      -1.08196   DMLAXYVR            1.
+    PLAXYVR1  P1009X42           -1.   LF1009S1           -1.
+    PLAXYVR1  LF1009S2           -1.
+    PLAXYVR2  REVENUES        .06181   OBJECTIV       -.06181
+    PLAXYVR2  PASSNGRS            1.   RPMILES        1.14422
+    PLAXYVR2  LFRPMASM      -1.14422   DMLAXYVR            1.
+    PLAXYVR2  P1029X25           -1.   LF1029S1           -1.
+    PLAXYVR2  LF1029S2           -1.   LF1029S3           -1.
+    PLONPAR0  REVENUES        .02622   OBJECTIV       -.02622
+    PLONPAR0  PASSNGRS            1.   RPMILES         .22636
+    PLONPAR0  LFRPMASM       -.22636   DMLONPAR            1.
+    PLONPAR0  LF1022S3           -1.
+    PLONPAR1  REVENUES        .02622   OBJECTIV       -.02622
+    PLONPAR1  PASSNGRS            1.   RPMILES         .22636
+    PLONPAR1  LFRPMASM       -.22636   DMLONPAR            1.
+    PLONPAR1  LF1023S3           -1.
+    PLONPAR2  REVENUES        .02622   OBJECTIV       -.02622
+    PLONPAR2  PASSNGRS            1.   RPMILES         .22636
+    PLONPAR2  LFRPMASM       -.22636   DMLONPAR            1.
+    PLONPAR2  LF1026S3           -1.
+    PLONSEA0  REVENUES        .22255   OBJECTIV       -.22255
+    PLONSEA0  PASSNGRS            1.   RPMILES        4.78646
+    PLONSEA0  LFRPMASM      -4.78646   DMLONSEA            1.
+    PLONSEA0  LF1023S2           -1.
+    PLONSEA1  REVENUES        .22255   OBJECTIV       -.22255
+    PLONSEA1  PASSNGRS            1.   RPMILES        4.78646
+    PLONSEA1  LFRPMASM      -4.78646   DMLONSEA            1.
+    PLONSEA1  LF1026S2           -1.
+    PLONYVR0  REVENUES        .21935   OBJECTIV       -.21935
+    PLONYVR0  PASSNGRS            1.   RPMILES        4.71017
+    PLONYVR0  LFRPMASM      -4.71017   DMLONYVR            1.
+    PLONYVR0  LF1022S2           -1.
+    PLONYVR1  REVENUES        .21935   OBJECTIV       -.21935
+    PLONYVR1  PASSNGRS            1.   RPMILES        4.91267
+    PLONYVR1  LFRPMASM      -4.91267   DMLONYVR            1.
+    PLONYVR1  LF1023S1           -1.   LF1023S2           -1.
+    PLONYVR7  REVENUES       -.02248   OBJECTIV        .02248
+    PLONYVR7  PASSNGRS           -1.   DMLONYVR            1.
+    PLONYVR7  DMLONSEA           -1.   DMSEAYVR           -1.
+    POAKONT0  REVENUES        .03148   OBJECTIV       -.03148
+    POAKONT0  PASSNGRS            1.   RPMILES         .36196
+    POAKONT0  LFRPMASM       -.36196   DMOAKONT            1.
+    POAKONT0  LF1006S1           -1.
+    POAKONT1  REVENUES        .03148   OBJECTIV       -.03148
+    POAKONT1  PASSNGRS            1.   RPMILES         .36196
+    POAKONT1  LFRPMASM       -.36196   DMOAKONT            1.
+    POAKONT1  LF1013S2           -1.
+    POAKSEA0  REVENUES        .04311   OBJECTIV       -.04311
+    POAKSEA0  PASSNGRS            1.   RPMILES         .67142
+    POAKSEA0  LFRPMASM       -.67142   DMOAKSEA            1.
+    POAKSEA0  P1013X32           -1.   LF1013S1           -1.
+    POAKSEA1  REVENUES        .04311   OBJECTIV       -.04311
+    POAKSEA1  PASSNGRS            1.   RPMILES         .67142
+    POAKSEA1  LFRPMASM       -.67142   DMOAKSEA            1.
+    POAKSEA1  P1014X32           -1.   LF1014S1           -1.
+    POAKSEA2  REVENUES        .04311   OBJECTIV       -.04311
+    POAKSEA2  PASSNGRS            1.   RPMILES         .67142
+    POAKSEA2  LFRPMASM       -.67142   DMOAKSEA            1.
+    POAKSEA2  P1017X32           -1.   LF1017S1           -1.
+    PONTSFO0  REVENUES        .03152   OBJECTIV       -.03152
+    PONTSFO0  PASSNGRS            1.   RPMILES         .36328
+    PONTSFO0  LFRPMASM       -.36328   DMONTSFO            1.
+    PONTSFO0  P1015X43           -1.   LF1015S2           -1.
+    PONTSEA0  REVENUES        .05614   OBJECTIV       -.05614
+    PONTSEA0  PASSNGRS            1.   RPMILES        1.03338
+    PONTSEA0  LFRPMASM      -1.03338   DMONTSEA            1.
+    PONTSEA0  P1013X42           -1.   LF1013S1           -1.
+    PONTSEA0  LF1013S2           -1.
+    PONTSEA1  REVENUES        .05614   OBJECTIV       -.05614
+    PONTSEA1  PASSNGRS            1.   RPMILES        1.04277
+    PONTSEA1  LFRPMASM      -1.04277   DMONTSEA            1.
+    PONTSEA1  P1015X42           -1.   LF1015S1           -1.
+    PONTSEA1  LF1015S2           -1.
+    PONTSEA2  REVENUES        .05614   OBJECTIV       -.05614
+    PONTSEA2  PASSNGRS            1.   RPMILES        1.00139
+    PONTSEA2  LFRPMASM      -1.00139   DMONTSEA            1.
+    PONTSEA2  P1050X42           -1.   LF1050S1           -1.
+    PONTSEA2  LF1050S2           -1.
+    PPARSEA0  REVENUES        .23205   OBJECTIV       -.23205
+    PPARSEA0  PASSNGRS            1.   RPMILES        5.01282
+    PPARSEA0  LFRPMASM      -5.01282   DMPARSEA            1.
+    PPARSEA0  LF1023S2           -1.   LF1023S3           -1.
+    PPARSEA1  REVENUES        .23205   OBJECTIV       -.23205
+    PPARSEA1  PASSNGRS            1.   RPMILES        5.01282
+    PPARSEA1  LFRPMASM      -5.01282   DMPARSEA            1.
+    PPARSEA1  LF1026S2           -1.   LF1026S3           -1.
+    PPARYVR0  REVENUES        .22885   OBJECTIV       -.22885
+    PPARYVR0  PASSNGRS            1.   RPMILES        4.93653
+    PPARYVR0  LFRPMASM      -4.93653   DMPARYVR            1.
+    PPARYVR0  LF1022S2           -1.   LF1022S3           -1.
+    PPARYVR1  REVENUES        .22885   OBJECTIV       -.22885
+    PPARYVR1  PASSNGRS            1.   RPMILES        5.13904
+    PPARYVR1  LFRPMASM      -5.13904   DMPARYVR            1.
+    PPARYVR1  LF1023S1           -1.   LF1023S2           -1.
+    PPARYVR1  LF1023S3           -1.
+    PPARYVR7  REVENUES       -.02247   OBJECTIV        .02247
+    PPARYVR7  PASSNGRS           -1.   DMPARYVR            1.
+    PPARYVR7  DMPARSEA           -1.   DMSEAYVR           -1.
+    PRNOSEA0  REVENUES         .0382   OBJECTIV        -.0382
+    PRNOSEA0  PASSNGRS            1.   RPMILES         .56374
+    PRNOSEA0  LFRPMASM       -.56374   DMRNOSEA            1.
+    PRNOSEA0  P1018X43           -1.   LF1018S2           -1.
+    PRNOSEA1  REVENUES         .0382   OBJECTIV        -.0382
+    PRNOSEA1  PASSNGRS            1.   RPMILES         .56374
+    PRNOSEA1  LFRPMASM       -.56374   DMRNOSEA            1.
+    PRNOSEA1  P1020X32           -1.   LF1020S1           -1.
+    PRNOYVR0  REVENUES        .04394   OBJECTIV       -.04394
+    PRNOYVR0  PASSNGRS            1.   RPMILES         .68996
+    PRNOYVR0  LFRPMASM       -.68996   DMRNOYVR            1.
+    PRNOYVR0  LF1018S1           -1.   LF1018S2           -1.
+    PSEASFO0  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO0  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO0  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO0  P1008X34           -1.   LF1008S2           -1.
+    PSEASFO1  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO1  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO1  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO1  P1011X23           -1.   LF1011S1           -1.
+    PSEASFO2  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO2  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO2  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO2  P1015X23           -1.   LF1015S1           -1.
+    PSEASFO3  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO3  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO3  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO3  P1016X23           -1.   LF1016S1           -1.
+    PSEASFO4  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO4  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO4  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO4  P1028X32           -1.   LF1028S1           -1.
+    PSEASFO5  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO5  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO5  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO5  P1029X43           -1.   LF1029S2           -1.
+    PSEASFO6  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO6  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO6  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO6  P1030X43           -1.   LF1030S2           -1.
+    PSEATPE0  REVENUES        .27573   OBJECTIV       -.27573
+    PSEATPE0  PASSNGRS            1.   RPMILES        6.09563
+    PSEATPE0  LFRPMASM      -6.09563   DMSEATPE            1.
+    PSEATPE0  LF1027S2           -1.   LF1027S3           -1.
+    PSEATPE1  REVENUES        .27573   OBJECTIV       -.27573
+    PSEATPE1  PASSNGRS            1.   RPMILES        6.09563
+    PSEATPE1  LFRPMASM      -6.09563   DMSEATPE            1.
+    PSEATPE1  LF1028S2           -1.   LF1028S3           -1.
+    PSEATPE2  REVENUES        .27573   OBJECTIV       -.27573
+    PSEATPE2  PASSNGRS            1.   RPMILES        6.12746
+    PSEATPE2  LFRPMASM      -6.12746   DMSEATPE            1.
+    PSEATPE2  LF1029S3           -1.   LF1029S4           -1.
+    PSEATPE2  LF1029S5           -1.
+    PSEATPE3  REVENUES        .27573   OBJECTIV       -.27573
+    PSEATPE3  PASSNGRS            1.   RPMILES        6.09563
+    PSEATPE3  LFRPMASM      -6.09563   DMSEATPE            1.
+    PSEATPE3  LF1030S3           -1.   LF1030S4           -1.
+    PSEATYO0  REVENUES        .22283   OBJECTIV       -.22283
+    PSEATYO0  PASSNGRS            1.   RPMILES        4.79317
+    PSEATYO0  LFRPMASM      -4.79317   DMSEATYO            1.
+    PSEATYO0  LF1027S2           -1.
+    PSEATYO1  REVENUES        .22283   OBJECTIV       -.22283
+    PSEATYO1  PASSNGRS            1.   RPMILES        4.79317
+    PSEATYO1  LFRPMASM      -4.79317   DMSEATYO            1.
+    PSEATYO1  LF1028S2           -1.
+    PSEATYO2  REVENUES        .22283   OBJECTIV       -.22283
+    PSEATYO2  PASSNGRS            1.   RPMILES          4.825
+    PSEATYO2  LFRPMASM        -4.825   DMSEATYO            1.
+    PSEATYO2  LF1029S3           -1.   LF1029S4           -1.
+    PSEATYO3  REVENUES        .22283   OBJECTIV       -.22283
+    PSEATYO3  PASSNGRS            1.   RPMILES        4.79317
+    PSEATYO3  LFRPMASM      -4.79317   DMSEATYO            1.
+    PSEATYO3  LF1030S3           -1.
+    PSEAYVR0  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR0  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR0  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR0  P1002X32           -1.   LF1002S1           -1.
+    PSEAYVR1  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR1  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR1  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR1  P1008X32           -1.   LF1008S1           -1.
+    PSEAYVR2  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR2  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR2  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR2  P1009X32           -1.   LF1009S1           -1.
+    PSEAYVR3  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR3  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR3  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR3  P1010X32           -1.   LF1010S1           -1.
+    PSEAYVR4  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR4  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR4  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR4  P1018X32           -1.   LF1018S1           -1.
+    PSEAYVR5  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR5  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR5  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR5  P1019X32           -1.   LF1019S1           -1.
+    PSEAYVR6  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR6  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR6  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR6  P1023X32           -1.   LF1023S1           -1.
+    PSEAYVR7  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR7  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR7  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR7  P1029X45           -1.   LF1029S3           -1.
+    PSEAYVR8  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR8  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR8  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR8  P1032X23           -1.   LF1032S1           -1.
+    PSFOTPE0  REVENUES        .29218   OBJECTIV       -.29218
+    PSFOTPE0  PASSNGRS            1.   RPMILES        6.77512
+    PSFOTPE0  LFRPMASM      -6.77512   DMSFOTPE            1.
+    PSFOTPE0  LF1028S1           -1.   LF1028S2           -1.
+    PSFOTPE0  LF1028S3           -1.
+    PSFOTPE1  REVENUES        .29218   OBJECTIV       -.29218
+    PSFOTPE1  PASSNGRS            1.   RPMILES        6.80694
+    PSFOTPE1  LFRPMASM      -6.80694   DMSFOTPE            1.
+    PSFOTPE1  LF1029S2           -1.   LF1029S3           -1.
+    PSFOTPE1  LF1029S4           -1.   LF1029S5           -1.
+    PSFOTPE2  REVENUES        .29218   OBJECTIV       -.29218
+    PSFOTPE2  PASSNGRS            1.   RPMILES        6.77512
+    PSFOTPE2  LFRPMASM      -6.77512   DMSFOTPE            1.
+    PSFOTPE2  LF1030S2           -1.   LF1030S3           -1.
+    PSFOTPE2  LF1030S4           -1.
+    PSFOTPE8  REVENUES       -.02702   OBJECTIV        .02702
+    PSFOTPE8  PASSNGRS           -1.   DMSFOTPE            1.
+    PSFOTPE8  DMSEASFO           -1.   DMSEATPE           -1.
+    PSFOTYO0  REVENUES         .2378   OBJECTIV        -.2378
+    PSFOTYO0  PASSNGRS            1.   RPMILES        5.47265
+    PSFOTYO0  LFRPMASM      -5.47265   DMSFOTYO            1.
+    PSFOTYO0  LF1028S1           -1.   LF1028S2           -1.
+    PSFOTYO1  REVENUES         .2378   OBJECTIV        -.2378
+    PSFOTYO1  PASSNGRS            1.   RPMILES        5.50448
+    PSFOTYO1  LFRPMASM      -5.50448   DMSFOTYO            1.
+    PSFOTYO1  LF1029S2           -1.   LF1029S3           -1.
+    PSFOTYO1  LF1029S4           -1.
+    PSFOTYO2  REVENUES         .2378   OBJECTIV        -.2378
+    PSFOTYO2  PASSNGRS            1.   RPMILES        5.47265
+    PSFOTYO2  LFRPMASM      -5.47265   DMSFOTYO            1.
+    PSFOTYO2  LF1030S2           -1.   LF1030S3           -1.
+    PSFOTYO8  REVENUES        -.0285   OBJECTIV         .0285
+    PSFOTYO8  PASSNGRS           -1.   DMSFOTYO            1.
+    PSFOTYO8  DMSEASFO           -1.   DMSEATYO           -1.
+    PSFOYVR0  REVENUES        .04898   OBJECTIV       -.04898
+    PSFOYVR0  PASSNGRS            1.   RPMILES          .8057
+    PSFOYVR0  LFRPMASM        -.8057   DMSFOYVR            1.
+    PSFOYVR0  P1008X42           -1.   LF1008S1           -1.
+    PSFOYVR0  LF1008S2           -1.
+    PSFOYVR1  REVENUES        .04898   OBJECTIV       -.04898
+    PSFOYVR1  PASSNGRS            1.   RPMILES          .8057
+    PSFOYVR1  LFRPMASM        -.8057   DMSFOYVR            1.
+    PSFOYVR1  P1029X35           -1.   LF1029S2           -1.
+    PSFOYVR1  LF1029S3           -1.
+    PTPETYO0  REVENUES        .07188   OBJECTIV       -.07188
+    PTPETYO0  PASSNGRS            1.   RPMILES        1.30247
+    PTPETYO0  LFRPMASM      -1.30247   DMTPETYO            1.
+    PTPETYO0  LF1027S3           -1.
+    PTPETYO1  REVENUES        .07188   OBJECTIV       -.07188
+    PTPETYO1  PASSNGRS            1.   RPMILES        1.30247
+    PTPETYO1  LFRPMASM      -1.30247   DMTPETYO            1.
+    PTPETYO1  LF1028S3           -1.
+    PTPETYO2  REVENUES        .07188   OBJECTIV       -.07188
+    PTPETYO2  PASSNGRS            1.   RPMILES        1.30247
+    PTPETYO2  LFRPMASM      -1.30247   DMTPETYO            1.
+    PTPETYO2  LF1029S5           -1.
+    PTPETYO3  REVENUES        .07188   OBJECTIV       -.07188
+    PTPETYO3  PASSNGRS            1.   RPMILES        1.30247
+    PTPETYO3  LFRPMASM      -1.30247   DMTPETYO            1.
+    PTPETYO3  LF1030S4           -1.
+    PTPEYVR0  REVENUES        .27146   OBJECTIV       -.27146
+    PTPEYVR0  PASSNGRS            1.   RPMILES        6.00125
+    PTPEYVR0  LFRPMASM      -6.00125   DMTPEYVR            1.
+    PTPEYVR0  LF1029S4           -1.   LF1029S5           -1.
+    PTYOYVR0  REVENUES        .21887   OBJECTIV       -.21887
+    PTYOYVR0  PASSNGRS            1.   RPMILES        4.69878
+    PTYOYVR0  LFRPMASM      -4.69878   DMTYOYVR            1.
+    PTYOYVR0  LF1029S4           -1.
+    PYULYVR0  REVENUES        .11677   OBJECTIV       -.11677
+    PYULYVR0  PASSNGRS            1.   RPMILES         2.4064
+    PYULYVR0  LFRPMASM       -2.4064   DMYULYVR            1.
+    PYULYVR0  P1032X63           -1.   LF1032S2           -1.
+    PYULYVR0  LF1032S3           -1.   LF1032S4           -1.
+    PYULYVR1  REVENUES        .11677   OBJECTIV       -.11677
+    PYULYVR1  PASSNGRS            1.   RPMILES        2.28733
+    PYULYVR1  LFRPMASM      -2.28733   DMYULYVR            1.
+    PYULYVR1  P1033X42           -1.   LF1033S1           -1.
+    PYULYVR1  LF1033S2           -1.
+    PYULYVR2  REVENUES        .11677   OBJECTIV       -.11677
+    PYULYVR2  PASSNGRS            1.   RPMILES        2.39258
+    PYULYVR2  LFRPMASM      -2.39258   DMYULYVR            1.
+    PYULYVR2  P1034X42           -1.   LF1034S1           -1.
+    PYULYVR2  LF1034S2           -1.
+    PYULYVR3  REVENUES        .11677   OBJECTIV       -.11677
+    PYULYVR3  PASSNGRS            1.   RPMILES        2.28726
+    PYULYVR3  LFRPMASM      -2.28726   DMYULYVR            1.
+    PYULYVR3  P1036X32           -1.   LF1036S1           -1.
+    PYULYWG0  REVENUES        .06398   OBJECTIV       -.06398
+    PYULYWG0  PASSNGRS            1.   RPMILES        1.24837
+    PYULYWG0  LFRPMASM      -1.24837   DMYULYWG            1.
+    PYULYWG0  P1032X64           -1.   LF1032S3           -1.
+    PYULYWG0  LF1032S4           -1.
+    PYULYWG1  REVENUES        .06398   OBJECTIV       -.06398
+    PYULYWG1  PASSNGRS            1.   RPMILES         1.1293
+    PYULYWG1  LFRPMASM       -1.1293   DMYULYWG            1.
+    PYULYWG1  P1033X43           -1.   LF1033S2           -1.
+    PYULYWG2  REVENUES        .06398   OBJECTIV       -.06398
+    PYULYWG2  PASSNGRS            1.   RPMILES        1.24837
+    PYULYWG2  LFRPMASM      -1.24837   DMYULYWG            1.
+    PYULYWG2  P1037X42           -1.   LF1037S1           -1.
+    PYULYWG2  LF1037S2           -1.
+    PYULYWG3  REVENUES        .06398   OBJECTIV       -.06398
+    PYULYWG3  PASSNGRS            1.   RPMILES         1.1293
+    PYULYWG3  LFRPMASM       -1.1293   DMYULYWG            1.
+    PYULYWG3  P1039X32           -1.   LF1039S1           -1.
+    PYULYYZ0  REVENUES        .02995   OBJECTIV       -.02995
+    PYULYYZ0  PASSNGRS            1.   RPMILES         .31461
+    PYULYYZ0  LFRPMASM       -.31461   DMYULYYZ            1.
+    PYULYYZ0  P1032X65           -1.   LF1032S4           -1.
+    PYULYYZ1  REVENUES        .02995   OBJECTIV       -.02995
+    PYULYYZ1  PASSNGRS            1.   RPMILES         .31461
+    PYULYYZ1  LFRPMASM       -.31461   DMYULYYZ            1.
+    PYULYYZ1  P1034X43           -1.   LF1034S2           -1.
+    PYULYYZ2  REVENUES        .02995   OBJECTIV       -.02995
+    PYULYYZ2  PASSNGRS            1.   RPMILES         .31461
+    PYULYYZ2  LFRPMASM       -.31461   DMYULYYZ            1.
+    PYULYYZ2  P1037X43           -1.   LF1037S2           -1.
+    PYULYYZ3  REVENUES        .02995   OBJECTIV       -.02995
+    PYULYYZ3  PASSNGRS            1.   RPMILES         .31461
+    PYULYYZ3  LFRPMASM       -.31461   DMYULYYZ            1.
+    PYULYYZ3  P1040X32           -1.   LF1040S1           -1.
+    PYULYYZ4  REVENUES        .02995   OBJECTIV       -.02995
+    PYULYYZ4  PASSNGRS            1.   RPMILES         .31461
+    PYULYYZ4  LFRPMASM       -.31461   DMYULYYZ            1.
+    PYULYYZ4  P1041X32           -1.   LF1041S1           -1.
+    PYVRYWG0  REVENUES        .06529   OBJECTIV       -.06529
+    PYVRYWG0  PASSNGRS            1.   RPMILES        1.15803
+    PYVRYWG0  LFRPMASM      -1.15803   DMYVRYWG            1.
+    PYVRYWG0  P1032X34           -1.   LF1032S2           -1.
+    PYVRYWG1  REVENUES        .06529   OBJECTIV       -.06529
+    PYVRYWG1  PASSNGRS            1.   RPMILES        1.15803
+    PYVRYWG1  LFRPMASM      -1.15803   DMYVRYWG            1.
+    PYVRYWG1  P1033X23           -1.   LF1033S1           -1.
+    PYVRYWG2  REVENUES        .06529   OBJECTIV       -.06529
+    PYVRYWG2  PASSNGRS            1.   RPMILES        1.15803
+    PYVRYWG2  LFRPMASM      -1.15803   DMYVRYWG            1.
+    PYVRYWG2  P1035X23           -1.   LF1035S1           -1.
+    PYVRYYZ0  REVENUES        .10723   OBJECTIV       -.10723
+    PYVRYYZ0  PASSNGRS            1.   RPMILES        2.09179
+    PYVRYYZ0  LFRPMASM      -2.09179   DMYVRYYZ            1.
+    PYVRYYZ0  P1032X35           -1.   LF1032S2           -1.
+    PYVRYYZ0  LF1032S3           -1.
+    PYVRYYZ1  REVENUES        .10723   OBJECTIV       -.10723
+    PYVRYYZ1  PASSNGRS            1.   RPMILES        2.07796
+    PYVRYYZ1  LFRPMASM      -2.07796   DMYVRYYZ            1.
+    PYVRYYZ1  P1034X23           -1.   LF1034S1           -1.
+    PYVRYYZ2  REVENUES        .10723   OBJECTIV       -.10723
+    PYVRYYZ2  PASSNGRS            1.   RPMILES        2.09179
+    PYVRYYZ2  LFRPMASM      -2.09179   DMYVRYYZ            1.
+    PYVRYYZ2  P1035X24           -1.   LF1035S1           -1.
+    PYVRYYZ2  LF1035S2           -1.
+    PYWGYYZ0  REVENUES        .05507   OBJECTIV       -.05507
+    PYWGYYZ0  PASSNGRS            1.   RPMILES         .93376
+    PYWGYYZ0  LFRPMASM       -.93376   DMYWGYYZ            1.
+    PYWGYYZ0  P1032X45           -1.   LF1032S3           -1.
+    PYWGYYZ1  REVENUES        .05507   OBJECTIV       -.05507
+    PYWGYYZ1  PASSNGRS            1.   RPMILES         .93376
+    PYWGYYZ1  LFRPMASM       -.93376   DMYWGYYZ            1.
+    PYWGYYZ1  P1035X34           -1.   LF1035S2           -1.
+    PYWGYYZ2  REVENUES        .05507   OBJECTIV       -.05507
+    PYWGYYZ2  PASSNGRS            1.   RPMILES         .93376
+    PYWGYYZ2  LFRPMASM       -.93376   DMYWGYYZ            1.
+    PYWGYYZ2  P1037X23           -1.   LF1037S1           -1.
+    PYWGYYZ3  REVENUES        .05507   OBJECTIV       -.05507
+    PYWGYYZ3  PASSNGRS            1.   RPMILES         .93376
+    PYWGYYZ3  LFRPMASM       -.93376   DMYWGYYZ            1.
+    PYWGYYZ3  P1038X23           -1.   LF1038S1           -1.
+    PBOSOAK0  REVENUES        .13432   OBJECTIV       -.13432
+    PBOSOAK0  PASSNGRS            1.   RPMILES        2.68687
+    PBOSOAK0  LFRPMASM      -2.68687   DMBOSOAK            1.
+    PBOSOAK0  LF1046S2           -1.
+    PBOSOAK6  REVENUES       -.01157   OBJECTIV        .01157
+    PBOSOAK6  PASSNGRS           -1.   DMBOSOAK            1.
+    PBOSOAK6  DMBOSSFO           -1.   DMSFOOAK           -1.
+    PBOSBUR1  REVENUES       -.03469   OBJECTIV        .03469
+    PBOSBUR1  PASSNGRS           -1.   DMBOSBUR            1.
+    PBOSBUR1  DMBOSSFO           -1.   DMBURSFO           -1.
+    PBOSBUR2  REVENUES       -.04664   OBJECTIV        .04664
+    PBOSBUR2  PASSNGRS           -2.   DMBOSBUR            1.
+    PBOSBUR2  DMBOSSFO           -1.   DMLAXSFO           -1.
+    PBOSBUR2  DMLAXBUR           -1.
+    PBOSONT1  REVENUES       -.03725   OBJECTIV        .03725
+    PBOSONT1  PASSNGRS           -1.   DMBOSONT            1.
+    PBOSONT1  DMBOSSFO           -1.   DMONTSFO           -1.
+    PBOSONT2  REVENUES       -.04996   OBJECTIV        .04996
+    PBOSONT2  PASSNGRS           -2.   DMBOSONT            1.
+    PBOSONT2  DMBOSSFO           -1.   DMLAXSFO           -1.
+    PBOSONT2  DMLAXONT           -1.
+    PBURYVR1  REVENUES       -.01353   OBJECTIV        .01353
+    PBURYVR1  PASSNGRS           -1.   DMBURYVR            1.
+    PBURYVR1  DMBURSEA           -1.   DMSEAYVR           -1.
+    PBURTYO1  REVENUES       -.02686   OBJECTIV        .02686
+    PBURTYO1  PASSNGRS           -1.   DMBURTYO            1.
+    PBURTYO1  DMBURSEA           -1.   DMSEATYO           -1.
+    PBURTPE1  REVENUES       -.02529   OBJECTIV        .02529
+    PBURTPE1  PASSNGRS           -1.   DMBURTPE            1.
+    PBURTPE1  DMBURSEA           -1.   DMSEATPE           -1.
+    PBURHNL0  REVENUES        .12896   OBJECTIV       -.12896
+    PBURHNL0  PASSNGRS            1.   RPMILES        2.55929
+    PBURHNL0  LFRPMASM      -2.55929   DMBURHNL            1.
+    PBURHNL0  LF1005S2           -1.
+    PBURHNL6  REVENUES       -.01132   OBJECTIV        .01132
+    PBURHNL6  PASSNGRS           -1.   DMBURHNL            1.
+    PBURHNL6  DMLAXBUR           -1.   DMHNLLAX           -1.
+    PHNLOAK0  REVENUES        .12225   OBJECTIV       -.12225
+    PHNLOAK0  PASSNGRS            1.   RPMILES        2.88537
+    PHNLOAK0  LFRPMASM      -2.88537   DMHNLOAK            1.
+    PHNLOAK0  LF1005S1           -1.   LF1005S2           -1.
+    PHNLOAK1  REVENUES        .12225   OBJECTIV       -.12225
+    PHNLOAK1  PASSNGRS            1.   RPMILES        2.89192
+    PHNLOAK1  LFRPMASM      -2.89192   DMHNLOAK            1.
+    PHNLOAK1  LF1105S1           -1.   LF1105S2           -1.
+    PHNLOAK2  REVENUES        .12225   OBJECTIV       -.12225
+    PHNLOAK2  PASSNGRS            1.   RPMILES        2.96093
+    PHNLOAK2  LFRPMASM      -2.96093   DMHNLOAK            1.
+    PHNLOAK2  LF1006S1           -1.   LF1006S2           -1.
+    PHNLOAK8  REVENUES       -.03719   OBJECTIV        .03719
+    PHNLOAK8  PASSNGRS           -1.   DMHNLOAK            1.
+    PHNLOAK8  DMHNLLAX           -1.   DMLAXOAK           -1.
+    PHNLONT0  REVENUES        .13063   OBJECTIV       -.13063
+    PHNLONT0  PASSNGRS            1.   RPMILES        2.59897
+    PHNLONT0  LFRPMASM      -2.59897   DMHNLONT            1.
+    PHNLONT0  LF1006S2           -1.
+    PHNLONT6  REVENUES        -.0116   OBJECTIV         .0116
+    PHNLONT6  PASSNGRS           -1.   DMHNLONT            1.
+    PHNLONT6  DMHNLLAX           -1.   DMLAXONT           -1.
+    PHNLYWG1  REVENUES       -.01893   OBJECTIV        .01893
+    PHNLYWG1  PASSNGRS           -1.   DMHNLYWG            1.
+    PHNLYWG1  DMHNLYVR           -1.   DMYVRYWG           -1.
+    PHNLYYZ1  REVENUES       -.02585   OBJECTIV        .02585
+    PHNLYYZ1  PASSNGRS           -1.   DMHNLYYZ            1.
+    PHNLYYZ1  DMHNLYVR           -1.   DMYVRYYZ           -1.
+    PHNLYUL1  REVENUES       -.02429   OBJECTIV        .02429
+    PHNLYUL1  PASSNGRS           -1.   DMHNLYUL            1.
+    PHNLYUL1  DMHNLYVR           -1.   DMYULYVR           -1.
+    PLASTYO1  REVENUES       -.02076   OBJECTIV        .02076
+    PLASTYO1  PASSNGRS           -1.   DMLASTYO            1.
+    PLASTYO1  DMLASSEA           -1.   DMSEATYO           -1.
+    PLASTPE1  REVENUES       -.01956   OBJECTIV        .01956
+    PLASTPE1  PASSNGRS           -1.   DMLASTPE            1.
+    PLASTPE1  DMLASSEA           -1.   DMSEATPE           -1.
+    PLAXLON0  REVENUES        .25019   OBJECTIV       -.25019
+    PLAXLON0  PASSNGRS            1.   RPMILES         5.7422
+    PLAXLON0  LFRPMASM       -5.7422   DMLAXLON            1.
+    PLAXLON0  LF1026S1           -1.   LF1026S2           -1.
+    PLAXLON6  REVENUES       -.02843   OBJECTIV        .02843
+    PLAXLON6  PASSNGRS           -1.   DMLAXLON            1.
+    PLAXLON6  DMLAXSEA           -1.   DMLONSEA           -1.
+    PLAXLON7  REVENUES       -.03096   OBJECTIV        .03096
+    PLAXLON7  PASSNGRS           -1.   DMLAXLON            1.
+    PLAXLON7  DMLAXYVR           -1.   DMLONYVR           -1.
+    PLAXPAR0  REVENUES        .25943   OBJECTIV       -.25943
+    PLAXPAR0  PASSNGRS            1.   RPMILES        5.96857
+    PLAXPAR0  LFRPMASM      -5.96857   DMLAXPAR            1.
+    PLAXPAR0  LF1026S1           -1.   LF1026S2           -1.
+    PLAXPAR0  LF1026S3           -1.
+    PLAXPAR6  REVENUES       -.02868   OBJECTIV        .02868
+    PLAXPAR6  PASSNGRS           -1.   DMLAXPAR            1.
+    PLAXPAR6  DMLAXSEA           -1.   DMPARSEA           -1.
+    PLAXPAR7  REVENUES       -.03123   OBJECTIV        .03123
+    PLAXPAR7  PASSNGRS           -1.   DMLAXPAR            1.
+    PLAXPAR7  DMLAXYVR           -1.   DMPARYVR           -1.
+    PBURLON1  REVENUES       -.02834   OBJECTIV        .02834
+    PBURLON1  PASSNGRS           -1.   DMBURLON            1.
+    PBURLON1  DMBURSEA           -1.   DMLONSEA           -1.
+    PBURPAR1  REVENUES       -.02859   OBJECTIV        .02859
+    PBURPAR1  PASSNGRS           -1.   DMBURPAR            1.
+    PBURPAR1  DMBURSEA           -1.   DMPARSEA           -1.
+    PLONONT1  REVENUES       -.02984   OBJECTIV        .02984
+    PLONONT1  PASSNGRS           -1.   DMLONONT            1.
+    PLONONT1  DMLONSEA           -1.   DMONTSEA           -1.
+    PLONOAK1  REVENUES        -.0197   OBJECTIV         .0197
+    PLONOAK1  PASSNGRS           -1.   DMLONOAK            1.
+    PLONOAK1  DMLONSEA           -1.   DMOAKSEA           -1.
+    POAKPAR1  REVENUES        -.0198   OBJECTIV         .0198
+    POAKPAR1  PASSNGRS           -1.   DMOAKPAR            1.
+    POAKPAR1  DMOAKSEA           -1.   DMPARSEA           -1.
+    POAKTYO1  REVENUES         -.028   OBJECTIV          .028
+    POAKTYO1  PASSNGRS           -1.   DMOAKTYO            1.
+    POAKTYO1  DMOAKSEA           -1.   DMSEATYO           -1.
+    POAKTPE1  REVENUES       -.02654   OBJECTIV        .02654
+    POAKTPE1  PASSNGRS           -1.   DMOAKTPE            1.
+    POAKTPE1  DMOAKSEA           -1.   DMSEATPE           -1.
+    PONTPAR1  REVENUES       -.03012   OBJECTIV        .03012
+    PONTPAR1  PASSNGRS           -1.   DMONTPAR            1.
+    PONTPAR1  DMONTSEA           -1.   DMPARSEA           -1.
+    PONTTYO1  REVENUES       -.02605   OBJECTIV        .02605
+    PONTTYO1  PASSNGRS           -1.   DMONTTYO            1.
+    PONTTYO1  DMONTSEA           -1.   DMSEATYO           -1.
+    PONTTPE1  REVENUES       -.02451   OBJECTIV        .02451
+    PONTTPE1  PASSNGRS           -1.   DMONTTPE            1.
+    PONTTPE1  DMONTSEA           -1.   DMSEATPE           -1.
+    PPARSFO1  REVENUES       -.01968   OBJECTIV        .01968
+    PPARSFO1  PASSNGRS           -1.   DMPARSFO            1.
+    PPARSFO1  DMPARSEA           -1.   DMSEASFO           -1.
+    PRNOTYO1  REVENUES       -.02132   OBJECTIV        .02132
+    PRNOTYO1  PASSNGRS           -1.   DMRNOTYO            1.
+    PRNOTYO1  DMRNOSEA           -1.   DMSEATYO           -1.
+    PRNOTPE1  REVENUES        -.0202   OBJECTIV         .0202
+    PRNOTPE1  PASSNGRS           -1.   DMRNOTPE            1.
+    PRNOTPE1  DMRNOSEA           -1.   DMSEATPE           -1.
+    PTPEYWG1  REVENUES       -.03219   OBJECTIV        .03219
+    PTPEYWG1  PASSNGRS           -1.   DMTPEYWG            1.
+    PTPEYWG1  DMTPEYVR           -1.   DMYVRYWG           -1.
+    PTPEYYZ1  REVENUES       -.04208   OBJECTIV        .04208
+    PTPEYYZ1  PASSNGRS           -1.   DMTPEYYZ            1.
+    PTPEYYZ1  DMTPEYVR           -1.   DMYVRYYZ           -1.
+    PTPEYUL1  REVENUES       -.05292   OBJECTIV        .05292
+    PTPEYUL1  PASSNGRS           -1.   DMTPEYUL            1.
+    PTPEYUL1  DMTPEYVR           -1.   DMYULYVR           -1.
+    PTYOYUL1  REVENUES        -.0427   OBJECTIV         .0427
+    PTYOYUL1  PASSNGRS           -1.   DMTYOYUL            1.
+    PTYOYUL1  DMTYOYVR           -1.   DMYULYVR           -1.
+    PTYOYYZ1  REVENUES       -.03452   OBJECTIV        .03452
+    PTYOYYZ1  PASSNGRS           -1.   DMTYOYYZ            1.
+    PTYOYYZ1  DMTYOYVR           -1.   DMYVRYYZ           -1.
+    PTYOYWG1  REVENUES       -.02803   OBJECTIV        .02803
+    PTYOYWG1  PASSNGRS           -1.   DMTYOYWG            1.
+    PTYOYWG1  DMTYOYVR           -1.   DMYVRYWG           -1.
+    PLAXONT0  REVENUES        .01351   OBJECTIV       -.01351
+    PLAXONT0  PASSNGRS            1.   RPMILES         .04564
+    PLAXONT0  LFRPMASM       -.04564   DMLAXONT            1.
+    PLAXONT0  LF1050S2           -1.
+    GRDTIMO1  FLAV*1              1.   ACOCOSTS          .457
+    GRDTIMO1  OBJECTIV          .457
+    GRDTIMN1  FLAV*1              1.   ACOCOSTS       -.13333
+    GRDTIMN1  OBJECTIV       -.13333
+    GRDTIMO2  FLAV*2              1.   ACOCOSTS          .318
+    GRDTIMO2  OBJECTIV          .318
+    GRDTIMN2  FLAV*2              1.   ACOCOSTS       -.10692
+    GRDTIMN2  OBJECTIV       -.10692
+    GRDTIMO3  FLAV*3              1.   ACOCOSTS          .206
+    GRDTIMO3  OBJECTIV          .206
+    GRDTIMN3  FLAV*3              1.
+    GRDTIMO4  FLAV*4              1.   ACOCOSTS           .25
+    GRDTIMO4  OBJECTIV           .25
+    GRDTIMN4  FLAV*4              1.
+    GRDTIMO5  FLAV*5              1.   ACOCOSTS          .163
+    GRDTIMO5  OBJECTIV          .163
+    GRDTIMN5  FLAV*5              1.
+    GRDTIMO6  FLAV*6              1.   ACOCOSTS          .095
+    GRDTIMO6  OBJECTIV          .095
+    GRDTIMN6  FLAV*6              1.
+    N1001AC1  ACOCOSTS       14.0062   OBJECTIV       14.0062
+    N1001AC1  SYSTDEPT            1.   ACMILES        2.67711
+    N1001AC1  ASMILES     1086.90576   LFRPMASM    760.834032
+    N1001AC1  FLAV*1         5.53037   LF1001S1          284.
+    N1001AC1  MSHNLSEA            1.   P1001X32           67.
+    N1001AC2  ACOCOSTS      10.44277   OBJECTIV      10.44277
+    N1001AC2  SYSTDEPT            1.   ACMILES        2.67711
+    N1001AC2  ASMILES      690.69434   LFRPMASM    483.486038
+    N1001AC2  FLAV*2          5.5491   LF1001S1          180.
+    N1001AC2  MSHNLSEA            1.   P1001X32           67.
+    N1001AC3  ACOCOSTS       7.65023   OBJECTIV       7.65023
+    N1001AC3  SYSTDEPT            1.   ACMILES        2.67711
+    N1001AC3  ASMILES      492.58813   LFRPMASM    344.811691
+    N1001AC3  FLAV*3         5.74745   LF1001S1          128.
+    N1001AC3  MSHNLSEA            1.   P1001X32           67.
+    N1002AC1  ACOCOSTS      16.89049   OBJECTIV      16.89049
+    N1002AC1  SYSTDEPT            2.   ACMILES        2.80333
+    N1002AC1  ASMILES      1138.1499   LFRPMASM     796.70493
+    N1002AC1  FLAV*1         6.41046   LF1002S1          243.
+    N1002AC1  LF1002S2          284.   MSSEAYVR            1.
+    N1002AC1  MSHNLYVR            1.   MSHNLSEA            1.
+    N1002AC1  P1002X32          109.   P1002X42           40.
+    N1002AC1  P1002X43           67.
+    N1002AC2  ACOCOSTS      12.39107   OBJECTIV      12.39107
+    N1002AC2  SYSTDEPT            2.   ACMILES        2.80333
+    N1002AC2  ASMILES      723.25806   LFRPMASM    506.280642
+    N1002AC2  FLAV*2         6.35099   LF1002S1          154.
+    N1002AC2  LF1002S2          180.   MSSEAYVR            1.
+    N1002AC2  MSHNLYVR            1.   MSHNLSEA            1.
+    N1002AC2  P1002X32          109.   P1002X42           40.
+    N1002AC2  P1002X43           67.
+    N1002AC3  ACOCOSTS       8.97425   OBJECTIV       8.97425
+    N1002AC3  SYSTDEPT            2.   ACMILES        2.80333
+    N1002AC3  ASMILES      515.81177   LFRPMASM    361.068239
+    N1002AC3  FLAV*3         6.41862   LF1002S1          110.
+    N1002AC3  LF1002S2          128.   MSSEAYVR            1.
+    N1002AC3  MSHNLYVR            1.   MSHNLSEA            1.
+    N1002AC3  P1002X32          109.   P1002X42           40.
+    N1002AC3  P1002X43           67.
+    N1003AC1  ACOCOSTS      13.46672   OBJECTIV      13.46672
+    N1003AC1  SYSTDEPT            1.   ACMILES        2.55338
+    N1003AC1  ASMILES     1036.67114   LFRPMASM    725.669798
+    N1003AC1  FLAV*1         5.30481   LF1003S1          243.
+    N1003AC1  MSHNLLAX            1.   P1003X32          118.
+    N1003AC2  ACOCOSTS      10.03075   OBJECTIV      10.03075
+    N1003AC2  SYSTDEPT            1.   ACMILES        2.55338
+    N1003AC2  ASMILES      658.77124   LFRPMASM    461.139868
+    N1003AC2  FLAV*2         5.31883   LF1003S1          154.
+    N1003AC2  MSHNLLAX            1.   P1003X32          118.
+    N1003AC3  ACOCOSTS       7.34337   OBJECTIV       7.34337
+    N1003AC3  SYSTDEPT            1.   ACMILES        2.55338
+    N1003AC3  ASMILES      469.82129   LFRPMASM    328.874903
+    N1003AC3  FLAV*3         5.50122   LF1003S1          110.
+    N1003AC3  MSHNLLAX            1.   P1003X32          118.
+    N1004AC1  ACOCOSTS      17.27667   OBJECTIV      17.27667
+    N1004AC1  SYSTDEPT            2.   ACMILES         2.8919
+    N1004AC1  ASMILES     1174.11182   LFRPMASM    821.878274
+    N1004AC1  FLAV*1         6.57193   LF1004S1          243.
+    N1004AC1  LF1004S2          243.   MSLAXSFO            1.
+    N1004AC1  MSHNLSFO            1.   MSHNLLAX            1.
+    N1004AC1  P1004X32          168.   P1004X43          118.
+    N1004AC2  ACOCOSTS      12.68603   OBJECTIV      12.68603
+    N1004AC2  SYSTDEPT            2.   ACMILES         2.8919
+    N1004AC2  ASMILES      746.11035   LFRPMASM    522.277245
+    N1004AC2  FLAV*2         6.51583   LF1004S1          154.
+    N1004AC2  LF1004S2          154.   MSLAXSFO            1.
+    N1004AC2  MSHNLSFO            1.   MSHNLLAX            1.
+    N1004AC2  P1004X32          168.   P1004X43          118.
+    N1004AC3  ACOCOSTS       9.19391   OBJECTIV       9.19391
+    N1004AC3  SYSTDEPT            2.   ACMILES         2.8919
+    N1004AC3  ASMILES      532.10986   LFRPMASM    372.476902
+    N1004AC3  FLAV*3         6.59488   LF1004S1          110.
+    N1004AC3  LF1004S2          110.   MSLAXSFO            1.
+    N1004AC3  MSHNLSFO            1.   MSHNLLAX            1.
+    N1004AC3  P1004X32          168.   P1004X43          118.
+    N1005AC3  ACOCOSTS        9.1777   OBJECTIV        9.1777
+    N1005AC3  SYSTDEPT            2.   ACMILES        2.88537
+    N1005AC3  ASMILES      530.90723   LFRPMASM    371.635061
+    N1005AC3  FLAV*3         6.58188   LF1005S1          128.
+    N1005AC3  LF1005S2          128.   MSBUROAK            1.
+    N1005AC3  MSHNLOAK            1.
+    N1105AC3  ACOCOSTS       9.19396   OBJECTIV       9.19396
+    N1105AC3  SYSTDEPT            2.   ACMILES        2.89192
+    N1105AC3  ASMILES      532.11377   LFRPMASM    372.479639
+    N1105AC3  FLAV*3         6.59493   LF1105S1          128.
+    N1105AC3  LF1105S2          110.   MSLAXOAK            1.
+    N1105AC3  MSHNLOAK            1.   MSHNLLAX            1.
+    N1105AC3  P1105X32           46.   P1105X43          118.
+    N1006AC3  ACOCOSTS        9.3651   OBJECTIV        9.3651
+    N1006AC3  SYSTDEPT            2.   ACMILES        2.96093
+    N1006AC3  ASMILES      544.81104   LFRPMASM    381.367728
+    N1006AC3  FLAV*3         6.73225   LF1006S1          128.
+    N1006AC3  LF1006S2          128.   MSOAKONT            1.
+    N1006AC3  MSHNLOAK            1.
+    N1007AC1  ACOCOSTS      27.19154   OBJECTIV      27.19154
+    N1007AC1  SYSTDEPT            2.   ACMILES        5.16595
+    N1007AC1  ASMILES     2097.37598   LFRPMASM   1468.163186
+    N1007AC1  FLAV*1        10.71753   LF1007S1          284.
+    N1007AC1  LF1007S2          284.   MSBOSSEA            1.
+    N1007AC1  MSBOSHNL            1.   MSHNLSEA            1.
+    N1007AC1  P1007X43           67.
+    N1007AC2  ACOCOSTS      20.25861   OBJECTIV      20.25861
+    N1007AC2  SYSTDEPT            2.   ACMILES        5.16595
+    N1007AC2  ASMILES     1332.81494   LFRPMASM    932.970458
+    N1007AC2  FLAV*2        10.74784   LF1007S1          180.
+    N1007AC2  LF1007S2          180.   MSBOSSEA            1.
+    N1007AC2  MSBOSHNL            1.   MSHNLSEA            1.
+    N1007AC2  P1007X43           67.
+    N1007AC3  ACOCOSTS      14.83356   OBJECTIV      14.83356
+    N1007AC3  SYSTDEPT            2.   ACMILES        5.16595
+    N1007AC3  ASMILES      950.53516   LFRPMASM    665.374612
+    N1007AC3  FLAV*3        11.12024   LF1007S1          128.
+    N1007AC3  LF1007S2          128.   MSBOSSEA            1.
+    N1007AC3  MSBOSHNL            1.   MSHNLSEA            1.
+    N1007AC3  P1007X43           67.
+    N1008AC1  ACOCOSTS      11.99082   OBJECTIV      11.99082
+    N1008AC1  SYSTDEPT            3.   ACMILES        1.14422
+    N1008AC1  ASMILES      464.55518   LFRPMASM    325.188626
+    N1008AC1  FLAV*1         4.03592   LF1008S1          243.
+    N1008AC1  LF1008S2          243.   LF1008S3          243.
+    N1008AC1  MSSEAYVR            1.   MSSFOYVR            1.
+    N1008AC1  MSLAXYVR            1.   MSSEASFO            1.
+    N1008AC1  MSLAXSEA            1.   MSLAXSFO            1.
+    N1008AC1  P1008X32          109.   P1008X42           71.
+    N1008AC1  P1008X52           77.   P1008X34          170.
+    N1008AC1  P1008X53          139.   P1008X54          168.
+    N1008AC2  ACOCOSTS       8.39427   OBJECTIV       8.39427
+    N1008AC2  SYSTDEPT            3.   ACMILES        1.14422
+    N1008AC2  ASMILES      295.20972   LFRPMASM    206.646804
+    N1008AC2  FLAV*2          3.8304   LF1008S1          154.
+    N1008AC2  LF1008S2          154.   LF1008S3          154.
+    N1008AC2  MSSEAYVR            1.   MSSFOYVR            1.
+    N1008AC2  MSLAXYVR            1.   MSSEASFO            1.
+    N1008AC2  MSLAXSEA            1.   MSLAXSFO            1.
+    N1008AC2  P1008X32          109.   P1008X42           71.
+    N1008AC2  P1008X52           77.   P1008X34          170.
+    N1008AC2  P1008X53          139.   P1008X54          168.
+    N1008AC3  ACOCOSTS       5.87068   OBJECTIV       5.87068
+    N1008AC3  SYSTDEPT            3.   ACMILES        1.14422
+    N1008AC3  ASMILES      210.53731   LFRPMASM    147.376117
+    N1008AC3  FLAV*3         3.53701   LF1008S1          110.
+    N1008AC3  LF1008S2          110.   LF1008S3          110.
+    N1008AC3  MSSEAYVR            1.   MSSFOYVR            1.
+    N1008AC3  MSLAXYVR            1.   MSSEASFO            1.
+    N1008AC3  MSLAXSEA            1.   MSLAXSFO            1.
+    N1008AC3  P1008X32          109.   P1008X42           71.
+    N1008AC3  P1008X52           77.   P1008X34          170.
+    N1008AC3  P1008X53          139.   P1008X54          168.
+    N1008AC4  ACOCOSTS       3.99147   OBJECTIV       3.99147
+    N1008AC4  SYSTDEPT            3.   ACMILES        1.14422
+    N1008AC4  ASMILES      109.84555   LFRPMASM     76.891885
+    N1008AC4  FLAV*4         3.40841   LF1008S1           57.
+    N1008AC4  LF1008S2           57.   LF1008S3           57.
+    N1008AC4  MSSEAYVR            1.   MSSFOYVR            1.
+    N1008AC4  MSLAXYVR            1.   MSSEASFO            1.
+    N1008AC4  MSLAXSEA            1.   MSLAXSFO            1.
+    N1008AC4  P1008X32          109.   P1008X42           71.
+    N1008AC4  P1008X52           77.   P1008X34          170.
+    N1008AC4  P1008X53          139.   P1008X54          168.
+    N1008AC5  ACOCOSTS       4.41133   OBJECTIV       4.41133
+    N1008AC5  SYSTDEPT            3.   ACMILES        1.14422
+    N1008AC5  ASMILES       141.8838   LFRPMASM      99.31866
+    N1008AC5  FLAV*5         3.42334   LF1008S1           74.
+    N1008AC5  LF1008S2           74.   LF1008S3           74.
+    N1008AC5  MSSEAYVR            1.   MSSFOYVR            1.
+    N1008AC5  MSLAXYVR            1.   MSSEASFO            1.
+    N1008AC5  MSLAXSEA            1.   MSLAXSFO            1.
+    N1008AC5  P1008X32          109.   P1008X42           71.
+    N1008AC5  P1008X52           77.   P1008X34          170.
+    N1008AC5  P1008X53          139.   P1008X54          168.
+    N1008AC6  ACOCOSTS       3.43737   OBJECTIV       3.43737
+    N1008AC6  SYSTDEPT            3.   ACMILES        1.14422
+    N1008AC6  ASMILES      108.70131   LFRPMASM     76.090917
+    N1008AC6  FLAV*6         3.59515   LF1008S1           56.
+    N1008AC6  LF1008S2           56.   LF1008S3           56.
+    N1008AC6  MSSEAYVR            1.   MSSFOYVR            1.
+    N1008AC6  MSLAXYVR            1.   MSSEASFO            1.
+    N1008AC6  MSLAXSEA            1.   MSLAXSFO            1.
+    N1008AC6  P1008X32          109.   P1008X42           71.
+    N1008AC6  P1008X52           77.   P1008X34          170.
+    N1008AC6  P1008X53          139.   P1008X54          168.
+    N1009AC1  ACOCOSTS       9.38535   OBJECTIV       9.38535
+    N1009AC1  SYSTDEPT            2.   ACMILES        1.08196
+    N1009AC1  ASMILES      439.27612   LFRPMASM    307.493284
+    N1009AC1  FLAV*1         3.27241   LF1009S1          243.
+    N1009AC1  LF1009S2          243.   MSSEAYVR            1.
+    N1009AC1  MSLAXYVR            1.   MSLAXSEA            1.
+    N1009AC1  P1009X32          109.   P1009X42           77.
+    N1009AC1  P1009X43          139.
+    N1009AC2  ACOCOSTS       6.65893   OBJECTIV       6.65893
+    N1009AC2  SYSTDEPT            2.   ACMILES        1.08196
+    N1009AC2  ASMILES      279.14575   LFRPMASM    195.402025
+    N1009AC2  FLAV*2         3.14753   LF1009S1          154.
+    N1009AC2  LF1009S2          154.   MSSEAYVR            1.
+    N1009AC2  MSLAXYVR            1.   MSLAXSEA            1.
+    N1009AC2  P1009X32          109.   P1009X42           77.
+    N1009AC2  P1009X43          139.
+    N1009AC3  ACOCOSTS       4.70526   OBJECTIV       4.70526
+    N1009AC3  SYSTDEPT            2.   ACMILES        1.08196
+    N1009AC3  ASMILES      199.08081   LFRPMASM    139.356567
+    N1009AC3  FLAV*3          2.9931   LF1009S1          110.
+    N1009AC3  LF1009S2          110.   MSSEAYVR            1.
+    N1009AC3  MSLAXYVR            1.   MSLAXSEA            1.
+    N1009AC3  P1009X32          109.   P1009X42           77.
+    N1009AC3  P1009X43          139.
+    N1009AC4  ACOCOSTS       3.27055   OBJECTIV       3.27055
+    N1009AC4  SYSTDEPT            2.   ACMILES        1.08196
+    N1009AC4  ASMILES      103.86824   LFRPMASM     72.707768
+    N1009AC4  FLAV*4         2.90163   LF1009S1           57.
+    N1009AC4  LF1009S2           57.   MSSEAYVR            1.
+    N1009AC4  MSLAXYVR            1.   MSLAXSEA            1.
+    N1009AC4  P1009X32          109.   P1009X42           77.
+    N1009AC4  P1009X43          139.
+    N1009AC5  ACOCOSTS       3.58556   OBJECTIV       3.58556
+    N1009AC5  SYSTDEPT            2.   ACMILES        1.08196
+    N1009AC5  ASMILES      134.16312   LFRPMASM     93.914184
+    N1009AC5  FLAV*5         2.92913   LF1009S1           74.
+    N1009AC5  LF1009S2           74.   MSSEAYVR            1.
+    N1009AC5  MSLAXYVR            1.   MSLAXSEA            1.
+    N1009AC5  P1009X32          109.   P1009X42           77.
+    N1009AC5  P1009X43          139.
+    N1010AC1  ACOCOSTS        2.8843   OBJECTIV        2.8843
+    N1010AC1  SYSTDEPT            1.   ACMILES         .12622
+    N1010AC1  ASMILES       51.24359   LFRPMASM     35.870513
+    N1010AC1  FLAV*1          .88009   LF1010S1          243.
+    N1010AC1  MSSEAYVR            1.   P1010X32          109.
+    N1010AC2  ACOCOSTS        1.9483   OBJECTIV        1.9483
+    N1010AC2  SYSTDEPT            1.   ACMILES         .12622
+    N1010AC2  ASMILES       32.56366   LFRPMASM     22.794562
+    N1010AC2  FLAV*2          .80189   LF1010S1          154.
+    N1010AC2  MSSEAYVR            1.   P1010X32          109.
+    N1010AC3  ACOCOSTS       1.32401   OBJECTIV       1.32401
+    N1010AC3  SYSTDEPT            1.   ACMILES         .12622
+    N1010AC3  ASMILES       23.22369   LFRPMASM     16.256583
+    N1010AC3  FLAV*3          .67117   LF1010S1          110.
+    N1010AC3  MSSEAYVR            1.   P1010X32          109.
+    N1010AC4  ACOCOSTS        .84307   OBJECTIV        .84307
+    N1010AC4  SYSTDEPT            1.   ACMILES         .12622
+    N1010AC4  ASMILES       12.11671   LFRPMASM      8.481697
+    N1010AC4  FLAV*4           .6329   LF1010S1           57.
+    N1010AC4  MSSEAYVR            1.   P1010X32          109.
+    N1010AC5  ACOCOSTS        .95496   OBJECTIV        .95496
+    N1010AC5  SYSTDEPT            1.   ACMILES         .12622
+    N1010AC5  ASMILES       15.65075   LFRPMASM     10.955525
+    N1010AC5  FLAV*5          .62384   LF1010S1           74.
+    N1010AC5  MSSEAYVR            1.   P1010X32          109.
+    N1010AC6  ACOCOSTS        .67624   OBJECTIV        .67624
+    N1010AC6  SYSTDEPT            1.   ACMILES         .12622
+    N1010AC6  ASMILES        11.9905   LFRPMASM       8.39335
+    N1010AC6  FLAV*6          .61067   LF1010S1           56.
+    N1010AC6  MSSEAYVR            1.   P1010X32          109.
+    N1011AC1  ACOCOSTS       9.10651   OBJECTIV       9.10651
+    N1011AC1  SYSTDEPT            2.   ACMILES        1.01801
+    N1011AC1  ASMILES      413.31152   LFRPMASM    289.318064
+    N1011AC1  FLAV*1         3.15583   LF1011S1          243.
+    N1011AC1  LF1011S2          243.   MSSEASFO            1.
+    N1011AC1  MSLAXSEA            1.   MSLAXSFO            1.
+    N1011AC1  P1011X23          170.   P1011X42          139.
+    N1011AC1  P1011X43          168.
+    N1011AC2  ACOCOSTS       6.44597   OBJECTIV       6.44597
+    N1011AC2  SYSTDEPT            2.   ACMILES        1.01801
+    N1011AC2  ASMILES      262.64624   LFRPMASM    183.852368
+    N1011AC2  FLAV*2         3.02851   LF1011S1          154.
+    N1011AC2  LF1011S2          154.   MSSEASFO            1.
+    N1011AC2  MSLAXSEA            1.   MSLAXSFO            1.
+    N1011AC2  P1011X23          170.   P1011X42          139.
+    N1011AC2  P1011X43          168.
+    N1011AC3  ACOCOSTS       4.54666   OBJECTIV       4.54666
+    N1011AC3  SYSTDEPT            2.   ACMILES        1.01801
+    N1011AC3  ASMILES      187.31361   LFRPMASM    131.119527
+    N1011AC3  FLAV*3         2.86584   LF1011S1          110.
+    N1011AC3  LF1011S2          110.   MSSEASFO            1.
+    N1011AC3  MSLAXSEA            1.   MSLAXSFO            1.
+    N1011AC3  P1011X23          170.   P1011X42          139.
+    N1011AC3  P1011X43          168.
+    N1011AC4  ACOCOSTS        3.1484   OBJECTIV        3.1484
+    N1011AC4  SYSTDEPT            2.   ACMILES        1.01801
+    N1011AC4  ASMILES       97.72881   LFRPMASM     68.410167
+    N1011AC4  FLAV*4         2.77551   LF1011S1           57.
+    N1011AC4  LF1011S2           57.   MSSEASFO            1.
+    N1011AC4  MSLAXSEA            1.   MSLAXSFO            1.
+    N1011AC4  P1011X23          170.   P1011X42          139.
+    N1011AC4  P1011X43          168.
+    N1011AC5  ACOCOSTS       3.45638   OBJECTIV       3.45638
+    N1011AC5  SYSTDEPT            2.   ACMILES        1.01801
+    N1011AC5  ASMILES      126.23305   LFRPMASM     88.363135
+    N1011AC5  FLAV*5          2.7995   LF1011S1           74.
+    N1011AC5  LF1011S2           74.   MSSEASFO            1.
+    N1011AC5  MSLAXSEA            1.   MSLAXSFO            1.
+    N1011AC5  P1011X23          170.   P1011X42          139.
+    N1011AC5  P1011X43          168.
+    N1011AC6  ACOCOSTS       2.76114   OBJECTIV       2.76114
+    N1011AC6  SYSTDEPT            2.   ACMILES        1.01801
+    N1011AC6  ASMILES        96.7108   LFRPMASM      67.69756
+    N1011AC6  FLAV*6         2.98447   LF1011S1           56.
+    N1011AC6  LF1011S2           56.   MSSEASFO            1.
+    N1011AC6  MSLAXSEA            1.   MSLAXSFO            1.
+    N1011AC6  P1011X23          170.   P1011X42          139.
+    N1011AC6  P1011X43          168.
+    N1012AC1  ACOCOSTS       6.50105   OBJECTIV       6.50105
+    N1012AC1  SYSTDEPT            1.   ACMILES         .95575
+    N1012AC1  ASMILES      388.03247   LFRPMASM    271.622729
+    N1012AC1  FLAV*1         2.39232   LF1012S1          243.
+    N1012AC1  MSLAXSEA            1.   P1012X32          139.
+    N1012AC2  ACOCOSTS       4.71063   OBJECTIV       4.71063
+    N1012AC2  SYSTDEPT            1.   ACMILES         .95575
+    N1012AC2  ASMILES      246.58224   LFRPMASM    172.607568
+    N1012AC2  FLAV*2         2.34564   LF1012S1          154.
+    N1012AC2  MSLAXSEA            1.   P1012X32          139.
+    N1012AC3  ACOCOSTS       3.38125   OBJECTIV       3.38125
+    N1012AC3  SYSTDEPT            1.   ACMILES         .95575
+    N1012AC3  ASMILES      175.85712   LFRPMASM    123.099984
+    N1012AC3  FLAV*3         2.32193   LF1012S1          110.
+    N1012AC3  MSLAXSEA            1.   P1012X32          139.
+    N1012AC4  ACOCOSTS       2.42747   OBJECTIV       2.42747
+    N1012AC4  SYSTDEPT            1.   ACMILES         .95575
+    N1012AC4  ASMILES        91.7515   LFRPMASM      64.22605
+    N1012AC4  FLAV*4         2.26873   LF1012S1           57.
+    N1012AC4  MSLAXSEA            1.   P1012X32          139.
+    N1012AC5  MSLAXSEA            1.   P1012X32          139.
+    N1012AC5  ASMILES      118.51237   LFRPMASM     82.958659
+    N1012AC5  FLAV*5         2.30529   SYSTDEPT            1.
+    N1012AC5  ACMILES         .95575   ACOCOSTS        2.6306
+    N1012AC5  OBJECTIV        2.6306   LF1012S1           74.
+    N1013AC3  ACOCOSTS       4.58479   OBJECTIV       4.58479
+    N1013AC3  SYSTDEPT            2.   ACMILES        1.03338
+    N1013AC3  ASMILES      190.14275   LFRPMASM    133.099925
+    N1013AC3  FLAV*3         2.89643   LF1013S1          128.
+    N1013AC3  LF1013S2          128.   MSOAKSEA            1.
+    N1013AC3  MSONTSEA            1.   MSOAKONT            1.
+    N1013AC3  P1013X32           43.   P1013X42           25.
+    N1013AC4  ACOCOSTS       3.17776   OBJECTIV       3.17776
+    N1013AC4  SYSTDEPT            2.   ACMILES        1.03338
+    N1013AC4  ASMILES       99.20493   LFRPMASM     69.443451
+    N1013AC4  FLAV*4         2.80583   LF1013S1           67.
+    N1013AC4  LF1013S2           67.   MSOAKSEA            1.
+    N1013AC4  MSONTSEA            1.   MSOAKONT            1.
+    N1013AC4  P1013X32           43.   P1013X42           25.
+    N1013AC5  ACOCOSTS       3.48744   OBJECTIV       3.48744
+    N1013AC5  SYSTDEPT            2.   ACMILES        1.03338
+    N1013AC5  ASMILES      128.13968   LFRPMASM     89.697776
+    N1013AC5  FLAV*5         2.83067   LF1013S1           86.
+    N1013AC5  LF1013S2           86.   MSOAKSEA            1.
+    N1013AC5  MSONTSEA            1.   MSOAKONT            1.
+    N1013AC5  P1013X32           43.   P1013X42           25.
+    N1013AC6  ACOCOSTS       2.78943   OBJECTIV       2.78943
+    N1013AC6  SYSTDEPT            2.   ACMILES        1.03338
+    N1013AC6  ASMILES       98.17149   LFRPMASM     68.720043
+    N1013AC6  FLAV*6         3.01988   LF1013S1           66.
+    N1013AC6  LF1013S2           66.   MSOAKSEA            1.
+    N1013AC6  MSONTSEA            1.   MSOAKONT            1.
+    N1013AC6  P1013X32           43.   P1013X42           25.
+    N1014AC3  ACOCOSTS        4.4958   OBJECTIV        4.4958
+    N1014AC3  SYSTDEPT            2.   ACMILES          .9975
+    N1014AC3  ASMILES      183.53999   LFRPMASM    128.477993
+    N1014AC3  FLAV*3         2.82502   LF1014S1          128.
+    N1014AC3  LF1014S2          128.   MSOAKSEA            1.
+    N1014AC3  MSBURSEA            1.   MSBUROAK            1.
+    N1014AC3  P1014X32           43.
+    N1014AC4  ACOCOSTS       3.10922   OBJECTIV       3.10922
+    N1014AC4  SYSTDEPT            2.   ACMILES          .9975
+    N1014AC4  ASMILES       95.75999   LFRPMASM     67.031993
+    N1014AC4  FLAV*4         2.73507   LF1014S1           67.
+    N1014AC4  LF1014S2           67.   MSOAKSEA            1.
+    N1014AC4  MSBURSEA            1.   MSBUROAK            1.
+    N1014AC4  P1014X32           43.
+    N1014AC5  ACOCOSTS       3.41495   OBJECTIV       3.41495
+    N1014AC5  SYSTDEPT            2.   ACMILES          .9975
+    N1014AC5  ASMILES      123.68999   LFRPMASM     86.582993
+    N1014AC5  FLAV*5         2.75793   LF1014S1           86.
+    N1014AC5  LF1014S2           86.   MSOAKSEA            1.
+    N1014AC5  MSBURSEA            1.   MSBUROAK            1.
+    N1014AC5  P1014X32           43.
+    N1014AC6  ACOCOSTS        2.7234   OBJECTIV        2.7234
+    N1014AC6  SYSTDEPT            2.   ACMILES          .9975
+    N1014AC6  ASMILES        94.7625   LFRPMASM      66.33375
+    N1014AC6  FLAV*6         2.93724   LF1014S1           66.
+    N1014AC6  LF1014S2           66.   MSOAKSEA            1.
+    N1014AC6  MSBURSEA            1.   MSBUROAK            1.
+    N1014AC6  P1014X32           43.
+    N1015AC3  ACOCOSTS       4.60806   OBJECTIV       4.60806
+    N1015AC3  SYSTDEPT            2.   ACMILES        1.04277
+    N1015AC3  ASMILES      191.86919   LFRPMASM    134.308433
+    N1015AC3  FLAV*3         2.91511   LF1015S1          110.
+    N1015AC3  LF1015S2          128.   MSSEASFO            1.
+    N1015AC3  MSONTSEA            1.   MSONTSFO            1.
+    N1015AC3  P1015X23          170.   P1015X42           25.
+    N1015AC3  P1015X43           69.
+    N1015AC4  ACOCOSTS       3.19568   OBJECTIV       3.19568
+    N1015AC4  SYSTDEPT            2.   ACMILES        1.04277
+    N1015AC4  ASMILES      100.10562   LFRPMASM     70.073934
+    N1015AC4  FLAV*4         2.82434   LF1015S1           57.
+    N1015AC4  LF1015S2           67.   MSSEASFO            1.
+    N1015AC4  MSONTSEA            1.   MSONTSFO            1.
+    N1015AC4  P1015X23          170.   P1015X42           25.
+    N1015AC4  P1015X43           69.
+    N1015AC5  ACOCOSTS       3.50639   OBJECTIV       3.50639
+    N1015AC5  SYSTDEPT            2.   ACMILES        1.04277
+    N1015AC5  ASMILES      129.30312   LFRPMASM     90.512184
+    N1015AC5  FLAV*5         2.84969   LF1015S1           74.
+    N1015AC5  LF1015S2           86.   MSSEASFO            1.
+    N1015AC5  MSONTSEA            1.   MSONTSFO            1.
+    N1015AC5  P1015X23          170.   P1015X42           25.
+    N1015AC5  P1015X43           69.
+    N1015AC6  ACOCOSTS       2.80669   OBJECTIV       2.80669
+    N1015AC6  SYSTDEPT            2.   ACMILES        1.04277
+    N1015AC6  ASMILES       99.06287   LFRPMASM     69.344009
+    N1015AC6  FLAV*6         3.04149   LF1015S1           56.
+    N1015AC6  LF1015S2           66.   MSSEASFO            1.
+    N1015AC6  MSONTSEA            1.   MSONTSFO            1.
+    N1015AC6  P1015X23          170.   P1015X42           25.
+    N1015AC6  P1015X43           69.
+    N1016AC3  ACOCOSTS       4.51701   OBJECTIV       4.51701
+    N1016AC3  SYSTDEPT            2.   ACMILES        1.00605
+    N1016AC3  ASMILES      185.11406   LFRPMASM    129.579842
+    N1016AC3  FLAV*3         2.84205   LF1016S1          110.
+    N1016AC3  LF1016S2          128.   MSSEASFO            1.
+    N1016AC3  MSBURSEA            1.   MSBURSFO            1.
+    N1016AC3  P1016X23          170.   P1016X43           81.
+    N1016AC4  ACOCOSTS       3.12556   OBJECTIV       3.12556
+    N1016AC4  SYSTDEPT            2.   ACMILES        1.00605
+    N1016AC4  ASMILES       96.58124   LFRPMASM     67.606868
+    N1016AC4  FLAV*4         2.75194   LF1016S1           57.
+    N1016AC4  LF1016S2           67.   MSSEASFO            1.
+    N1016AC4  MSBURSEA            1.   MSBURSFO            1.
+    N1016AC4  P1016X23          170.   P1016X43           81.
+    N1016AC5  ACOCOSTS       3.43223   OBJECTIV       3.43223
+    N1016AC5  SYSTDEPT            2.   ACMILES        1.00605
+    N1016AC5  ASMILES      124.75075   LFRPMASM     87.325525
+    N1016AC5  FLAV*5         2.77527   LF1016S1           74.
+    N1016AC5  LF1016S2           86.   MSSEASFO            1.
+    N1016AC5  MSBURSEA            1.   MSBURSFO            1.
+    N1016AC5  P1016X23          170.   P1016X43           81.
+    N1016AC6  ACOCOSTS       2.73914   OBJECTIV       2.73914
+    N1016AC6  SYSTDEPT            2.   ACMILES        1.00605
+    N1016AC6  ASMILES       95.57518   LFRPMASM     66.902626
+    N1016AC6  FLAV*6         2.95694   LF1016S1           56.
+    N1016AC6  LF1016S2           66.   MSSEASFO            1.
+    N1016AC6  MSBURSEA            1.   MSBURSFO            1.
+    N1016AC6  P1016X23          170.   P1016X43           81.
+    N1017AC3  ACOCOSTS       4.52672   OBJECTIV       4.52672
+    N1017AC3  SYSTDEPT            2.   ACMILES        1.00997
+    N1017AC3  ASMILES       185.8343   LFRPMASM     130.08401
+    N1017AC3  FLAV*3         2.84984   LF1017S1          128.
+    N1017AC3  LF1017S2          128.   MSOAKSEA            1.
+    N1017AC3  MSLAXSEA            1.   MSLAXOAK            1.
+    N1017AC3  P1017X32           43.   P1017X42          139.
+    N1017AC3  P1017X43           46.
+    N1017AC4  ACOCOSTS       3.13304   OBJECTIV       3.13304
+    N1017AC4  SYSTDEPT            2.   ACMILES        1.00997
+    N1017AC4  ASMILES       96.95699   LFRPMASM     67.869893
+    N1017AC4  FLAV*4         2.75966   LF1017S1           67.
+    N1017AC4  LF1017S2           67.   MSOAKSEA            1.
+    N1017AC4  MSLAXSEA            1.   MSLAXOAK            1.
+    N1017AC4  P1017X32           43.   P1017X42          139.
+    N1017AC4  P1017X43           46.
+    N1017AC5  ACOCOSTS       3.44014   OBJECTIV       3.44014
+    N1017AC5  SYSTDEPT            2.   ACMILES        1.00997
+    N1017AC5  ASMILES      125.23611   LFRPMASM     87.665277
+    N1017AC5  FLAV*5         2.78321   LF1017S1           86.
+    N1017AC5  LF1017S2           86.   MSOAKSEA            1.
+    N1017AC5  MSLAXSEA            1.   MSLAXOAK            1.
+    N1017AC5  P1017X32           43.   P1017X42          139.
+    N1017AC5  P1017X43           46.
+    N1017AC6  ACOCOSTS       2.74634   OBJECTIV       2.74634
+    N1017AC6  SYSTDEPT            2.   ACMILES        1.00997
+    N1017AC6  ASMILES       95.94705   LFRPMASM     67.162935
+    N1017AC6  FLAV*6         2.96596   LF1017S1           66.
+    N1017AC6  LF1017S2           66.   MSOAKSEA            1.
+    N1017AC6  MSLAXSEA            1.   MSLAXOAK            1.
+    N1017AC6  P1017X32           43.   P1017X42          139.
+    N1017AC6  P1017X43           46.
+    N1018AC1  ACOCOSTS       7.67623   OBJECTIV       7.67623
+    N1018AC1  SYSTDEPT            2.   ACMILES         .68996
+    N1018AC1  ASMILES      280.12378   LFRPMASM    196.086646
+    N1018AC1  FLAV*1          2.5578   LF1018S1          243.
+    N1018AC1  LF1018S2          243.   MSSEAYVR            1.
+    N1018AC1  MSRNOYVR            1.   MSRNOSEA            1.
+    N1018AC1  P1018X32          109.   P1018X43           85.
+    N1018AC2  ACOCOSTS       5.35357   OBJECTIV       5.35357
+    N1018AC2  SYSTDEPT            2.   ACMILES         .68996
+    N1018AC2  ASMILES      178.00974   LFRPMASM    124.606818
+    N1018AC2  FLAV*2         2.41802   LF1018S1          154.
+    N1018AC2  LF1018S2          154.   MSSEAYVR            1.
+    N1018AC2  MSRNOYVR            1.   MSRNOSEA            1.
+    N1018AC2  P1018X32          109.   P1018X43           85.
+    N1018AC3  ACOCOSTS        3.7331   OBJECTIV        3.7331
+    N1018AC3  SYSTDEPT            2.   ACMILES         .68996
+    N1018AC3  ASMILES      126.95268   LFRPMASM     88.866876
+    N1018AC3  FLAV*3         2.21302   LF1018S1          110.
+    N1018AC3  LF1018S2          110.   MSSEAYVR            1.
+    N1018AC3  MSRNOYVR            1.   MSRNOSEA            1.
+    N1018AC3  P1018X32          109.   P1018X43           85.
+    N1018AC4  ACOCOSTS       2.52182   OBJECTIV       2.52182
+    N1018AC4  SYSTDEPT            2.   ACMILES         .68996
+    N1018AC4  ASMILES       66.23618   LFRPMASM     46.365326
+    N1018AC4  FLAV*4          2.1286   LF1018S1           57.
+    N1018AC4  LF1018S2           57.   MSSEAYVR            1.
+    N1018AC4  MSRNOYVR            1.   MSRNOSEA            1.
+    N1018AC4  P1018X32          109.   P1018X43           85.
+    N1018AC5  ACOCOSTS       2.79372   OBJECTIV       2.79372
+    N1018AC5  SYSTDEPT            2.   ACMILES         .68996
+    N1018AC5  ASMILES       85.55505   LFRPMASM     59.888535
+    N1018AC5  FLAV*5         2.13455   LF1018S1           74.
+    N1018AC5  LF1018S2           74.   MSSEAYVR            1.
+    N1018AC5  MSRNOYVR            1.   MSRNOSEA            1.
+    N1018AC5  P1018X32          109.   P1018X43           85.
+    N1018AC6  ACOCOSTS       2.15753   OBJECTIV       2.15753
+    N1018AC6  SYSTDEPT            2.   ACMILES         .68996
+    N1018AC6  ASMILES       65.54617   LFRPMASM     45.882319
+    N1018AC6  FLAV*6         2.22898   LF1018S1           56.
+    N1018AC6  LF1018S2           56.   MSSEAYVR            1.
+    N1018AC6  MSRNOYVR            1.   MSRNOSEA            1.
+    N1018AC6  P1018X32          109.   P1018X43           85.
+    N1019AC1  ACOCOSTS       9.00153   OBJECTIV       9.00153
+    N1019AC1  SYSTDEPT            2.   ACMILES         .99393
+    N1019AC1  ASMILES      403.53516   LFRPMASM    282.474612
+    N1019AC1  FLAV*1         3.11193   LF1019S1          243.
+    N1019AC1  LF1019S2          243.   MSSEAYVR            1.
+    N1019AC1  MSLASYVR            1.   MSLASSEA            1.
+    N1019AC1  P1019X32          109.   P1019X43          110.
+    N1019AC2  ACOCOSTS       6.36578   OBJECTIV       6.36578
+    N1019AC2  SYSTDEPT            2.   ACMILES         .99393
+    N1019AC2  ASMILES      256.43359   LFRPMASM    179.503513
+    N1019AC2  FLAV*2          2.9837   LF1019S1          154.
+    N1019AC2  LF1019S2          154.   MSSEAYVR            1.
+    N1019AC2  MSLASYVR            1.   MSLASSEA            1.
+    N1019AC2  P1019X32          109.   P1019X43          110.
+    N1019AC3  ACOCOSTS       4.48694   OBJECTIV       4.48694
+    N1019AC3  SYSTDEPT            2.   ACMILES         .99393
+    N1019AC3  ASMILES      182.88293   LFRPMASM    128.018051
+    N1019AC3  FLAV*3         2.81792   LF1019S1          110.
+    N1019AC3  LF1019S2          110.   MSSEAYVR            1.
+    N1019AC3  MSLASYVR            1.   MSLASSEA            1.
+    N1019AC3  P1019X32          109.   P1019X43          110.
+    N1019AC4  ACOCOSTS        3.1024   OBJECTIV        3.1024
+    N1019AC4  SYSTDEPT            2.   ACMILES         .99393
+    N1019AC4  ASMILES       95.41718   LFRPMASM     66.792026
+    N1019AC4  FLAV*4         2.72803   LF1019S1           57.
+    N1019AC4  LF1019S2           57.   MSSEAYVR            1.
+    N1019AC4  MSLASYVR            1.   MSLASSEA            1.
+    N1019AC4  P1019X32          109.   P1019X43          110.
+    N1019AC5  ACOCOSTS       3.40774   OBJECTIV       3.40774
+    N1019AC5  SYSTDEPT            2.   ACMILES         .99393
+    N1019AC5  ASMILES      123.24718   LFRPMASM     86.273026
+    N1019AC5  FLAV*5         2.75069   LF1019S1           74.
+    N1019AC5  LF1019S2           74.   MSSEAYVR            1.
+    N1019AC5  MSLASYVR            1.   MSLASSEA            1.
+    N1019AC5  P1019X32          109.   P1019X43          110.
+    N1020AC1  ACOCOSTS       4.79193   OBJECTIV       4.79193
+    N1020AC1  SYSTDEPT            1.   ACMILES         .56374
+    N1020AC1  ASMILES      228.88037   LFRPMASM    160.216259
+    N1020AC1  FLAV*1         1.67771   LF1020S1          243.
+    N1020AC1  MSRNOSEA            1.   P1020X32           85.
+    N1020AC2  ACOCOSTS       3.40527   OBJECTIV       3.40527
+    N1020AC2  SYSTDEPT            1.   ACMILES         .56374
+    N1020AC2  ASMILES      145.44612   LFRPMASM    101.812284
+    N1020AC2  FLAV*2         1.61613   LF1020S1          154.
+    N1020AC2  MSRNOSEA            1.   P1020X32           85.
+    N1020AC3  ACOCOSTS       2.40909   OBJECTIV       2.40909
+    N1020AC3  SYSTDEPT            1.   ACMILES         .56374
+    N1020AC3  ASMILES      103.72899   LFRPMASM     72.610293
+    N1020AC3  FLAV*3         1.54185   LF1020S1          110.
+    N1020AC3  MSRNOSEA            1.   P1020X32           85.
+    N1020AC4  ACOCOSTS       1.67875   OBJECTIV       1.67875
+    N1020AC4  SYSTDEPT            1.   ACMILES         .56374
+    N1020AC4  ASMILES       54.11951   LFRPMASM     37.883657
+    N1020AC4  FLAV*4          1.4957   LF1020S1           57.
+    N1020AC4  MSRNOSEA            1.   P1020X32           85.
+    N1020AC5  ACOCOSTS       1.83876   OBJECTIV       1.83876
+    N1020AC5  SYSTDEPT            1.   ACMILES         .56374
+    N1020AC5  ASMILES       69.90431   LFRPMASM     48.933017
+    N1020AC5  FLAV*5         1.51071   LF1020S1           74.
+    N1020AC5  MSRNOSEA            1.   P1020X32           85.
+    N1020AC6  ACOCOSTS       1.48129   OBJECTIV       1.48129
+    N1020AC6  SYSTDEPT            1.   ACMILES         .56374
+    N1020AC6  ASMILES       53.55576   LFRPMASM     37.489032
+    N1020AC6  FLAV*6          1.6183   LF1020S1           56.
+    N1020AC6  MSRNOSEA            1.   P1020X32           85.
+    N1021AC1  ACOCOSTS       6.11723   OBJECTIV       6.11723
+    N1021AC1  SYSTDEPT            1.   ACMILES         .86771
+    N1021AC1  ASMILES       352.2915   LFRPMASM     246.60405
+    N1021AC1  FLAV*1         2.23184   LF1021S1          243.
+    N1021AC1  MSLASSEA            1.   P1021X32          110.
+    N1021AC2  ACOCOSTS       4.41748   OBJECTIV       4.41748
+    N1021AC2  SYSTDEPT            1.   ACMILES         .86771
+    N1021AC2  ASMILES      223.87006   LFRPMASM    156.709042
+    N1021AC2  FLAV*2         2.18181   LF1021S1          154.
+    N1021AC2  MSLASSEA            1.   P1021X32          110.
+    N1021AC3  ACOCOSTS       3.16293   OBJECTIV       3.16293
+    N1021AC3  SYSTDEPT            1.   ACMILES         .86771
+    N1021AC3  ASMILES      159.65924   LFRPMASM    111.761468
+    N1021AC3  FLAV*3         2.14675   LF1021S1          110.
+    N1021AC3  MSLASSEA            1.   P1021X32          110.
+    N1021AC4  ACOCOSTS       2.25933   OBJECTIV       2.25933
+    N1021AC4  SYSTDEPT            1.   ACMILES         .86771
+    N1021AC4  ASMILES       83.30049   LFRPMASM     58.310343
+    N1021AC4  FLAV*4         2.09513   LF1021S1           57.
+    N1021AC4  MSLASSEA            1.   P1021X32          110.
+    N1021AC5  ACOCOSTS       2.45278   OBJECTIV       2.45278
+    N1021AC5  SYSTDEPT            1.   ACMILES         .86771
+    N1021AC5  ASMILES      107.59644   LFRPMASM     75.317508
+    N1021AC5  FLAV*5         2.12685   LF1021S1           74.
+    N1021AC5  MSLASSEA            1.   P1021X32          110.
+    N1022AC1  ACOCOSTS      40.32039   OBJECTIV      40.32039
+    N1022AC1  SYSTDEPT            3.   ACMILES        7.64184
+    N1022AC1  ASMILES     3102.58496   LFRPMASM   2171.809472
+    N1022AC1  FLAV*1        15.88107   LF1022S1          284.
+    N1022AC1  LF1022S2          284.   LF1022S3          284.
+    N1022AC1  NOPTLON1            2.   NOPTLON0            2.
+    N1022AC1  MSHNLYVR            1.   MSLONYVR            1.
+    N1022AC1  MSLONPAR            1.   P1022X23           40.
+    N1023AC1  ACOCOSTS       29.4082   OBJECTIV       29.4082
+    N1023AC1  SYSTDEPT            3.   ACMILES        5.13904
+    N1023AC1  ASMILES     2086.44897   LFRPMASM   1460.514279
+    N1023AC1  FLAV*1        11.31847   LF1023S1          243.
+    N1023AC1  LF1023S2          243.   LF1023S3          284.
+    N1023AC1  NOPTLON1            2.   NOPTLON0            2.
+    N1023AC1  MSSEAYVR            1.   MSLONYVR            1.
+    N1023AC1  MSLONSEA            1.   MSPARSEA            1.
+    N1023AC1  MSLONPAR            1.   P1023X32          109.
+    N1026AC1  ACOCOSTS      33.02493   OBJECTIV      33.02493
+    N1026AC1  SYSTDEPT            3.   ACMILES        5.96857
+    N1026AC1  ASMILES     2423.23682   LFRPMASM   1696.265774
+    N1026AC1  FLAV*1         12.8307   LF1026S1          243.
+    N1026AC1  LF1026S2          243.   LF1026S3          284.
+    N1026AC1  NOPTLON1            2.   NOPTLON0            2.
+    N1026AC1  MSLAXSEA            1.   MSLAXLON            1.
+    N1026AC1  MSLONSEA            1.   MSPARSEA            1.
+    N1026AC1  MSLONPAR            1.   P1026X23          139.
+    N1027AC1  ACOCOSTS      37.74599   OBJECTIV      37.74599
+    N1027AC1  SYSTDEPT            3.   ACMILES        7.05137
+    N1027AC1  ASMILES     2862.85791   LFRPMASM   2004.000537
+    N1027AC1  FLAV*1        14.80466   LF1027S1          243.
+    N1027AC1  LF1027S2          263.   LF1027S3          284.
+    N1027AC1  NOPTTYO1            2.   NOPTTYO0            2.
+    N1027AC1  MSLAXSEA            1.   MSLAXTPE            1.
+    N1027AC1  MSSEATYO            1.   MSSEATPE            1.
+    N1027AC1  MSTPETYO            1.   P1027X23          139.
+    N1027AC1  P1027X25           18.
+    N1028AC1  ACOCOSTS       36.5415   OBJECTIV       36.5415
+    N1028AC1  SYSTDEPT            3.   ACMILES        6.77512
+    N1028AC1  ASMILES     2750.69678   LFRPMASM   1925.487746
+    N1028AC1  FLAV*1        14.30104   LF1028S1          243.
+    N1028AC1  LF1028S2          263.   LF1028S3          284.
+    N1028AC1  NOPTTYO1            2.   NOPTTYO0            2.
+    N1028AC1  MSSEASFO            1.   MSSEATYO            1.
+    N1028AC1  MSSEATPE            1.   MSTPETYO            1.
+    N1028AC1  P1028X32          170.
+    N1029AC1  ACOCOSTS      42.82423   OBJECTIV      42.82423
+    N1029AC1  SYSTDEPT            5.   ACMILES        7.14547
+    N1029AC1  ASMILES     2901.05981   LFRPMASM   2030.741867
+    N1029AC1  FLAV*1        16.27618   LF1029S1          243.
+    N1029AC1  LF1029S2          243.   LF1029S3          243.
+    N1029AC1  LF1029S4          304.   LF1029S5          284.
+    N1029AC1  NOPTTYO1            2.   NOPTTYO0            2.
+    N1029AC1  MSLAXSFO            1.   MSLAXSEA            1.
+    N1029AC1  MSLAXYVR            1.   MSLAXTPE            1.
+    N1029AC1  MSSEASFO            1.   MSSFOYVR            1.
+    N1029AC1  MSSEAYVR            1.   MSSEATYO            1.
+    N1029AC1  MSSEATPE            1.   MSTPETYO            1.
+    N1029AC1  P1029X23          168.   P1029X24          139.
+    N1029AC1  P1029X25           77.   P1029X27           18.
+    N1029AC1  P1029X43          170.   P1029X35           71.
+    N1029AC1  P1029X45          109.
+    N1030AC1  ACOCOSTS      40.35146   OBJECTIV      40.35146
+    N1030AC1  SYSTDEPT            4.   ACMILES        7.11364
+    N1030AC1  ASMILES     2888.13794   LFRPMASM   2021.696558
+    N1030AC1  FLAV*1        15.56816   LF1030S1          243.
+    N1030AC1  LF1030S2          243.   LF1030S3          263.
+    N1030AC1  LF1030S4          284.   NOPTTYO1            2.
+    N1030AC1  NOPTTYO0            2.   MSLAXSFO            1.
+    N1030AC1  MSLAXSEA            1.   MSLAXTPE            1.
+    N1030AC1  MSSEASFO            1.   MSSEATYO            1.
+    N1030AC1  MSSEATPE            1.   MSTPETYO            1.
+    N1030AC1  P1030X23          168.   P1030X24          139.
+    N1030AC1  P1030X26           18.   P1030X43          170.
+    N1032AC1  ACOCOSTS       23.8204   OBJECTIV       23.8204
+    N1032AC1  SYSTDEPT            5.   ACMILES        2.78679
+    N1032AC1  ASMILES     1131.43799   LFRPMASM    792.006593
+    N1032AC1  FLAV*1         8.33032   LF1032S1          243.
+    N1032AC1  LF1032S2          284.   LF1032S3          284.
+    N1032AC1  LF1032S4          284.   LF1032S5          243.
+    N1032AC1  MSSEAYVR            1.   MSBOSSEA            1.
+    N1032AC1  MSYVRYWG            1.   MSYVRYYZ            1.
+    N1032AC1  MSYULYVR            1.   MSBOSYVR            1.
+    N1032AC1  MSYWGYYZ            1.   MSYULYWG            1.
+    N1032AC1  MSBOSYWG            1.   MSYULYYZ            1.
+    N1032AC1  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1032AC1  P1032X23          109.   P1032X34           89.
+    N1032AC1  P1032X35           76.   P1032X63           44.
+    N1032AC1  P1032X45           83.   P1032X64           99.
+    N1032AC1  P1032X65          130.   P1032X75           85.
+    N1032AC1  P1032X76          115.
+    N1032AC2  ACOCOSTS      16.92001   OBJECTIV      16.92001
+    N1032AC2  SYSTDEPT            5.   ACMILES        2.78679
+    N1032AC2  ASMILES      718.99268   LFRPMASM    503.294876
+    N1032AC2  FLAV*2         8.02122   LF1032S1          154.
+    N1032AC2  LF1032S2          180.   LF1032S3          180.
+    N1032AC2  LF1032S4          180.   LF1032S5          154.
+    N1032AC2  MSSEAYVR            1.   MSBOSSEA            1.
+    N1032AC2  MSYVRYWG            1.   MSYVRYYZ            1.
+    N1032AC2  MSYULYVR            1.   MSBOSYVR            1.
+    N1032AC2  MSYWGYYZ            1.   MSYULYWG            1.
+    N1032AC2  MSBOSYWG            1.   MSYULYYZ            1.
+    N1032AC2  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1032AC2  P1032X23          109.   P1032X34           89.
+    N1032AC2  P1032X35           76.   P1032X63           44.
+    N1032AC2  P1032X45           83.   P1032X64           99.
+    N1032AC2  P1032X65          130.   P1032X75           85.
+    N1032AC2  P1032X76          115.
+    N1032AC3  ACOCOSTS      11.96625   OBJECTIV      11.96625
+    N1032AC3  SYSTDEPT            5.   ACMILES        2.78679
+    N1032AC3  ASMILES      512.76978   LFRPMASM    358.938846
+    N1032AC3  FLAV*3         7.64572   LF1032S1          110.
+    N1032AC3  LF1032S2          128.   LF1032S3          128.
+    N1032AC3  LF1032S4          128.   LF1032S5          110.
+    N1032AC3  MSSEAYVR            1.   MSBOSSEA            1.
+    N1032AC3  MSYVRYWG            1.   MSYVRYYZ            1.
+    N1032AC3  MSYULYVR            1.   MSBOSYVR            1.
+    N1032AC3  MSYWGYYZ            1.   MSYULYWG            1.
+    N1032AC3  MSBOSYWG            1.   MSYULYYZ            1.
+    N1032AC3  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1032AC3  P1032X23          109.   P1032X34           89.
+    N1032AC3  P1032X35           76.   P1032X63           44.
+    N1032AC3  P1032X45           83.   P1032X64           99.
+    N1032AC3  P1032X65          130.   P1032X75           85.
+    N1032AC3  P1032X76          115.
+    N1032AC4  ACOCOSTS       8.33277   OBJECTIV       8.33277
+    N1032AC4  SYSTDEPT            5.   ACMILES        2.78679
+    N1032AC4  ASMILES      267.53198   LFRPMASM    187.272386
+    N1032AC4  FLAV*4         7.41556   LF1032S1           57.
+    N1032AC4  LF1032S2           67.   LF1032S3           67.
+    N1032AC4  LF1032S4           67.   LF1032S5           57.
+    N1032AC4  MSSEAYVR            1.   MSBOSSEA            1.
+    N1032AC4  MSYVRYWG            1.   MSYVRYYZ            1.
+    N1032AC4  MSYULYVR            1.   MSBOSYVR            1.
+    N1032AC4  MSYWGYYZ            1.   MSYULYWG            1.
+    N1032AC4  MSBOSYWG            1.   MSYULYYZ            1.
+    N1032AC4  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1032AC4  P1032X23          109.   P1032X34           89.
+    N1032AC4  P1032X35           76.   P1032X63           44.
+    N1032AC4  P1032X45           83.   P1032X64           99.
+    N1032AC4  P1032X65          130.   P1032X75           85.
+    N1032AC4  P1032X76          115.
+    N1032AC5  ACOCOSTS       9.12932   OBJECTIV       9.12932
+    N1032AC5  SYSTDEPT            5.   ACMILES        2.78679
+    N1032AC5  ASMILES      345.56226   LFRPMASM    241.893582
+    N1032AC5  FLAV*5         7.48883   LF1032S1           74.
+    N1032AC5  LF1032S2           86.   LF1032S3           86.
+    N1032AC5  LF1032S4           86.   LF1032S5           74.
+    N1032AC5  MSSEAYVR            1.   MSBOSSEA            1.
+    N1032AC5  MSYVRYWG            1.   MSYVRYYZ            1.
+    N1032AC5  MSYULYVR            1.   MSBOSYVR            1.
+    N1032AC5  MSYWGYYZ            1.   MSYULYWG            1.
+    N1032AC5  MSBOSYWG            1.   MSYULYYZ            1.
+    N1032AC5  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1032AC5  P1032X23          109.   P1032X34           89.
+    N1032AC5  P1032X35           76.   P1032X63           44.
+    N1032AC5  P1032X45           83.   P1032X64           99.
+    N1032AC5  P1032X65          130.   P1032X75           85.
+    N1032AC5  P1032X76          115.
+    N1033AC1  ACOCOSTS      18.08295   OBJECTIV      18.08295
+    N1033AC1  SYSTDEPT            3.   ACMILES         2.5415
+    N1033AC1  ASMILES      1031.8501   LFRPMASM     722.29507
+    N1033AC1  FLAV*1         6.58316   LF1033S1          284.
+    N1033AC1  LF1033S2          284.   LF1033S3          243.
+    N1033AC1  MSYVRYWG            1.   MSYULYVR            1.
+    N1033AC1  MSBOSYVR            1.   MSYULYWG            1.
+    N1033AC1  MSBOSYWG            1.   MSBOSYUL            1.
+    N1033AC1  P1033X23           89.   P1033X42           44.
+    N1033AC1  P1033X43           99.   P1033X54          115.
+    N1033AC2  ACOCOSTS       13.0472   OBJECTIV       13.0472
+    N1033AC2  SYSTDEPT            3.   ACMILES         2.5415
+    N1033AC2  ASMILES      655.70752   LFRPMASM    458.995264
+    N1033AC2  FLAV*2         6.43074   LF1033S1          180.
+    N1033AC2  LF1033S2          180.   LF1033S3          154.
+    N1033AC2  MSYVRYWG            1.   MSYULYVR            1.
+    N1033AC2  MSBOSYVR            1.   MSYULYWG            1.
+    N1033AC2  MSBOSYWG            1.   MSBOSYUL            1.
+    N1033AC2  P1033X23           89.   P1033X42           44.
+    N1033AC2  P1033X43           99.   P1033X54          115.
+    N1033AC3  ACOCOSTS       9.33593   OBJECTIV       9.33593
+    N1033AC3  SYSTDEPT            3.   ACMILES         2.5415
+    N1033AC3  ASMILES      467.63647   LFRPMASM    327.345529
+    N1033AC3  FLAV*3         6.31759   LF1033S1          128.
+    N1033AC3  LF1033S2          128.   LF1033S3          110.
+    N1033AC3  MSYVRYWG            1.   MSYULYVR            1.
+    N1033AC3  MSBOSYVR            1.   MSYULYWG            1.
+    N1033AC3  MSBOSYWG            1.   MSBOSYUL            1.
+    N1033AC3  P1033X23           89.   P1033X42           44.
+    N1033AC3  P1033X43           99.   P1033X54          115.
+    N1033AC4  ACOCOSTS       6.66027   OBJECTIV       6.66027
+    N1033AC4  SYSTDEPT            3.   ACMILES         2.5415
+    N1033AC4  ASMILES      243.98424   LFRPMASM    170.788968
+    N1033AC4  FLAV*4         6.16384   LF1033S1           67.
+    N1033AC4  LF1033S2           67.   LF1033S3           57.
+    N1033AC4  MSYVRYWG            1.   MSYULYVR            1.
+    N1033AC4  MSBOSYVR            1.   MSYULYWG            1.
+    N1033AC4  MSBOSYWG            1.   MSBOSYUL            1.
+    N1033AC4  P1033X23           89.   P1033X42           44.
+    N1033AC4  P1033X43           99.   P1033X54          115.
+    N1033AC5  ACOCOSTS       7.23383   OBJECTIV       7.23383
+    N1033AC5  SYSTDEPT            3.   ACMILES         2.5415
+    N1033AC5  ASMILES      315.14624   LFRPMASM    220.602368
+    N1033AC5  FLAV*5         6.25562   LF1033S1           86.
+    N1033AC5  LF1033S2           86.   LF1033S3           74.
+    N1033AC5  MSYVRYWG            1.   MSYULYVR            1.
+    N1033AC5  MSBOSYVR            1.   MSYULYWG            1.
+    N1033AC5  MSBOSYWG            1.   MSBOSYUL            1.
+    N1033AC5  P1033X23           89.   P1033X42           44.
+    N1033AC5  P1033X43           99.   P1033X54          115.
+    N1034AC1  ACOCOSTS      15.09963   OBJECTIV      15.09963
+    N1034AC1  SYSTDEPT            2.   ACMILES        2.39258
+    N1034AC1  ASMILES      971.38599   LFRPMASM    679.970193
+    N1034AC1  FLAV*1         5.66166   LF1034S1          284.
+    N1034AC1  LF1034S2          284.   MSYVRYYZ            1.
+    N1034AC1  MSYULYVR            1.   MSYULYYZ            1.
+    N1034AC1  P1034X23           76.   P1034X42           44.
+    N1034AC1  P1034X43          130.
+    N1034AC2  ACOCOSTS      11.02328   OBJECTIV      11.02328
+    N1034AC2  SYSTDEPT            2.   ACMILES        2.39258
+    N1034AC2  ASMILES      617.28467   LFRPMASM    432.099269
+    N1034AC2  FLAV*2         5.58658   LF1034S1          180.
+    N1034AC2  LF1034S2          180.   MSYVRYYZ            1.
+    N1034AC2  MSYULYVR            1.   MSYULYYZ            1.
+    N1034AC2  P1034X23           76.   P1034X42           44.
+    N1034AC2  P1034X43          130.
+    N1034AC3  ACOCOSTS       7.95559   OBJECTIV       7.95559
+    N1034AC3  SYSTDEPT            2.   ACMILES        2.39258
+    N1034AC3  ASMILES      440.23389   LFRPMASM    308.163723
+    N1034AC3  FLAV*3         5.60122   LF1034S1          128.
+    N1034AC3  LF1034S2          128.   MSYVRYYZ            1.
+    N1034AC3  MSYULYVR            1.   MSYULYYZ            1.
+    N1034AC3  P1034X23           76.   P1034X42           44.
+    N1034AC3  P1034X43          130.
+    N1035AC1  ACOCOSTS      13.78819   OBJECTIV      13.78819
+    N1035AC1  SYSTDEPT            2.   ACMILES        2.09179
+    N1035AC1  ASMILES      849.26563   LFRPMASM    594.485941
+    N1035AC1  FLAV*1         5.11333   LF1035S1          284.
+    N1035AC1  LF1035S2          284.   MSYVRYWG            1.
+    N1035AC1  MSYVRYYZ            1.   MSYWGYYZ            1.
+    N1035AC1  P1035X23           89.   P1035X24           76.
+    N1035AC1  P1035X34           83.
+    N1035AC2  ACOCOSTS      10.02165   OBJECTIV      10.02165
+    N1035AC2  SYSTDEPT            2.   ACMILES        2.09179
+    N1035AC2  ASMILES      539.68115   LFRPMASM    377.776805
+    N1035AC2  FLAV*2         5.02682   LF1035S1          180.
+    N1035AC2  LF1035S2          180.   MSYVRYWG            1.
+    N1035AC2  MSYVRYYZ            1.   MSYWGYYZ            1.
+    N1035AC2  P1035X23           89.   P1035X24           76.
+    N1035AC2  P1035X34           83.
+    N1035AC3  ACOCOSTS       7.20963   OBJECTIV       7.20963
+    N1035AC3  SYSTDEPT            2.   ACMILES        2.09179
+    N1035AC3  ASMILES      384.88867   LFRPMASM    269.422069
+    N1035AC3  FLAV*3         5.00266   LF1035S1          128.
+    N1035AC3  LF1035S2          128.   MSYVRYWG            1.
+    N1035AC3  MSYVRYYZ            1.   MSYWGYYZ            1.
+    N1035AC3  P1035X23           89.   P1035X24           76.
+    N1035AC3  P1035X34           83.
+    N1035AC4  ACOCOSTS       5.19931   OBJECTIV       5.19931
+    N1035AC4  SYSTDEPT            2.   ACMILES        2.09179
+    N1035AC4  ASMILES      200.81155   LFRPMASM    140.568085
+    N1035AC4  FLAV*4           4.893   LF1035S1           67.
+    N1035AC4  LF1035S2           67.   MSYVRYWG            1.
+    N1035AC4  MSYVRYYZ            1.   MSYWGYYZ            1.
+    N1035AC4  P1035X23           89.   P1035X24           76.
+    N1035AC4  P1035X34           83.
+    N1035AC5  ACOCOSTS       5.62541   OBJECTIV       5.62541
+    N1035AC5  SYSTDEPT            2.   ACMILES        2.09179
+    N1035AC5  ASMILES      259.38159   LFRPMASM    181.567113
+    N1035AC5  FLAV*5         4.97605   LF1035S1           86.
+    N1035AC5  LF1035S2           86.   MSYVRYWG            1.
+    N1035AC5  MSYVRYYZ            1.   MSYWGYYZ            1.
+    N1035AC5  P1035X23           89.   P1035X24           76.
+    N1035AC5  P1035X34           83.
+    N1036AC1  ACOCOSTS      15.74868   OBJECTIV      15.74868
+    N1036AC1  SYSTDEPT            2.   ACMILES        2.54144
+    N1036AC1  ASMILES     1031.82446   LFRPMASM    722.277122
+    N1036AC1  FLAV*1         5.93304   LF1036S1          284.
+    N1036AC1  LF1036S2          243.   MSYULYVR            1.
+    N1036AC1  MSBOSYVR            1.   MSBOSYUL            1.
+    N1036AC1  P1036X32           44.   P1036X43          115.
+    N1036AC2  ACOCOSTS      11.51899   OBJECTIV      11.51899
+    N1036AC2  SYSTDEPT            2.   ACMILES        2.54144
+    N1036AC2  ASMILES      655.69141   LFRPMASM    458.983987
+    N1036AC2  FLAV*2         5.86362   LF1036S1          180.
+    N1036AC2  LF1036S2          154.   MSYULYVR            1.
+    N1036AC2  MSBOSYVR            1.   MSBOSYUL            1.
+    N1036AC2  P1036X32           44.   P1036X43          115.
+    N1036AC3  ACOCOSTS       8.32477   OBJECTIV       8.32477
+    N1036AC3  SYSTDEPT            2.   ACMILES        2.54144
+    N1036AC3  ASMILES      467.62476   LFRPMASM    327.337332
+    N1036AC3  FLAV*3         5.89746   LF1036S1          128.
+    N1036AC3  LF1036S2          110.   MSYULYVR            1.
+    N1036AC3  MSBOSYVR            1.   MSBOSYUL            1.
+    N1036AC3  P1036X32           44.   P1036X43          115.
+    N1037AC4  ACOCOSTS        3.5884   OBJECTIV        3.5884
+    N1037AC4  SYSTDEPT            2.   ACMILES        1.24837
+    N1037AC4  ASMILES      119.84406   LFRPMASM     83.890842
+    N1037AC4  FLAV*4          3.2298   LF1037S1           67.
+    N1037AC4  LF1037S2           67.   MSYWGYYZ            1.
+    N1037AC4  MSYULYWG            1.   MSYULYYZ            1.
+    N1037AC4  P1037X23           83.   P1037X42           99.
+    N1037AC4  P1037X43          130.
+    N1037AC5  ACOCOSTS       3.92172   OBJECTIV       3.92172
+    N1037AC5  SYSTDEPT            2.   ACMILES        1.24837
+    N1037AC5  ASMILES      154.79855   LFRPMASM    108.358985
+    N1037AC5  FLAV*5         3.26646   LF1037S1           86.
+    N1037AC5  LF1037S2           86.   MSYWGYYZ            1.
+    N1037AC5  MSYULYWG            1.   MSYULYYZ            1.
+    N1037AC5  P1037X23           83.   P1037X42           99.
+    N1037AC5  P1037X43          130.
+    N1038AC4  ACOCOSTS       2.38548   OBJECTIV       2.38548
+    N1038AC4  SYSTDEPT            1.   ACMILES         .93376
+    N1038AC4  ASMILES       89.64105   LFRPMASM     62.748735
+    N1038AC4  FLAV*4         2.22538   LF1038S1           67.
+    N1038AC4  MSYWGYYZ            1.   P1038X23           83.
+    N1038AC5  ACOCOSTS        2.5862   OBJECTIV        2.5862
+    N1038AC5  SYSTDEPT            1.   ACMILES         .93376
+    N1038AC5  ASMILES      115.78636   LFRPMASM     81.050452
+    N1038AC5  FLAV*5         2.26073   LF1038S1           86.
+    N1038AC5  MSYWGYYZ            1.   P1038X23           83.
+    N1039AC4  ACOCOSTS       2.75896   OBJECTIV       2.75896
+    N1039AC4  SYSTDEPT            1.   ACMILES         1.1293
+    N1039AC4  ASMILES      108.41281   LFRPMASM     75.888967
+    N1039AC4  FLAV*4         2.61098   LF1039S1           67.
+    N1039AC4  MSYULYWG            1.   P1039X32           99.
+    N1039AC5  ACOCOSTS       2.98119   OBJECTIV       2.98119
+    N1039AC5  SYSTDEPT            1.   ACMILES         1.1293
+    N1039AC5  ASMILES      140.03325   LFRPMASM     98.023275
+    N1039AC5  FLAV*5         2.65709   LF1039S1           86.
+    N1039AC5  MSYULYWG            1.   P1039X32           99.
+    N1040AC4  ACOCOSTS       2.29039   OBJECTIV       2.29039
+    N1040AC4  SYSTDEPT            2.   ACMILES         .56879
+    N1040AC4  ASMILES       54.60388   LFRPMASM     38.222716
+    N1040AC4  FLAV*4         1.88965   LF1040S1           67.
+    N1040AC4  LF1040S2           57.   MSYULYYZ            1.
+    N1040AC4  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1040AC4  P1040X32          130.   P1040X42           85.
+    N1040AC4  P1040X43          115.
+    N1040AC5  ACOCOSTS       2.54896   OBJECTIV       2.54896
+    N1040AC5  SYSTDEPT            2.   ACMILES         .56879
+    N1040AC5  ASMILES          70.53   LFRPMASM        49.371
+    N1040AC5  FLAV*5         1.88894   LF1040S1           86.
+    N1040AC5  LF1040S2           74.   MSYULYYZ            1.
+    N1040AC5  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1040AC5  P1040X32          130.   P1040X42           85.
+    N1040AC5  P1040X43          115.
+    N1040AC6  ACOCOSTS       1.93457   OBJECTIV       1.93457
+    N1040AC6  SYSTDEPT            2.   ACMILES         .56879
+    N1040AC6  ASMILES        54.0351   LFRPMASM      37.82457
+    N1040AC6  FLAV*6         1.94992   LF1040S1           66.
+    N1040AC6  LF1040S2           56.   MSYULYYZ            1.
+    N1040AC6  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1040AC6  P1040X32          130.   P1040X42           85.
+    N1040AC6  P1040X43          115.
+    N1041AC4  ACOCOSTS       1.20291   OBJECTIV       1.20291
+    N1041AC4  SYSTDEPT            1.   ACMILES         .31461
+    N1041AC4  ASMILES       30.20299   LFRPMASM     21.142093
+    N1041AC4  FLAV*4         1.00442   LF1041S1           67.
+    N1041AC4  MSYULYYZ            1.   P1041X32          130.
+    N1041AC5  ACOCOSTS       1.33552   OBJECTIV       1.33552
+    N1041AC5  SYSTDEPT            1.   ACMILES         .31461
+    N1041AC5  ASMILES       39.01219   LFRPMASM     27.308533
+    N1041AC5  FLAV*5         1.00572   LF1041S1           86.
+    N1041AC5  MSYULYYZ            1.   P1041X32          130.
+    N1041AC6  ACOCOSTS       1.02289   OBJECTIV       1.02289
+    N1041AC6  SYSTDEPT            1.   ACMILES         .31461
+    N1041AC6  ASMILES       29.88837   LFRPMASM     20.921859
+    N1041AC6  FLAV*6         1.04456   LF1041S1           66.
+    N1041AC6  MSYULYYZ            1.   P1041X32          130.
+    N1042AC4  ACOCOSTS       1.08748   OBJECTIV       1.08748
+    N1042AC4  SYSTDEPT            1.   ACMILES         .25418
+    N1042AC4  ASMILES       24.40089   LFRPMASM     17.080623
+    N1042AC4  FLAV*4          .88524   LF1042S1           57.
+    N1042AC4  MSBOSYUL            1.   P1042X32          115.
+    N1042AC5  ACOCOSTS       1.21344   OBJECTIV       1.21344
+    N1042AC5  SYSTDEPT            1.   ACMILES         .25418
+    N1042AC5  ASMILES       31.51784   LFRPMASM     22.062488
+    N1042AC5  FLAV*5          .88321   LF1042S1           74.
+    N1042AC5  MSBOSYUL            1.   P1042X32          115.
+    N1042AC6  ACOCOSTS        .91168   OBJECTIV        .91168
+    N1042AC6  SYSTDEPT            1.   ACMILES         .25418
+    N1042AC6  ASMILES       24.14673   LFRPMASM     16.902711
+    N1042AC6  FLAV*6          .90537   LF1042S1           56.
+    N1042AC6  MSBOSYUL            1.   P1042X32          115.
+    N1043AC1  ACOCOSTS      13.18536   OBJECTIV      13.18536
+    N1043AC1  SYSTDEPT            1.   ACMILES        2.48884
+    N1043AC1  ASMILES     1010.47021   LFRPMASM    707.329147
+    N1043AC1  FLAV*1         5.18716   LF1043S1          284.
+    N1043AC1  MSBOSSEA            1.
+    N1043AC2  ACOCOSTS       9.81585   OBJECTIV       9.81585
+    N1043AC2  SYSTDEPT            1.   ACMILES        2.48884
+    N1043AC2  ASMILES      642.12134   LFRPMASM    449.484938
+    N1043AC2  FLAV*2         5.19874   LF1043S1          180.
+    N1043AC2  MSBOSSEA            1.
+    N1043AC3  ACOCOSTS       7.18333   OBJECTIV       7.18333
+    N1043AC3  SYSTDEPT            1.   ACMILES        2.48884
+    N1043AC3  ASMILES      457.94702   LFRPMASM    320.562914
+    N1043AC3  FLAV*3          5.3728   LF1043S1          128.
+    N1043AC3  MSBOSSEA            1.
+    N1044AC1  ACOCOSTS      14.09924   OBJECTIV      14.09924
+    N1044AC1  SYSTDEPT            1.   ACMILES        2.69845
+    N1044AC1  ASMILES     1095.56982   LFRPMASM    766.898874
+    N1044AC1  FLAV*1         5.56927   LF1044S1          243.
+    N1044AC1  MSBOSSFO            1.   P1044X32           73.
+    N1044AC2  ACOCOSTS      10.51384   OBJECTIV      10.51384
+    N1044AC2  SYSTDEPT            1.   ACMILES        2.69845
+    N1044AC2  ASMILES      696.19995   LFRPMASM    487.339965
+    N1044AC2  FLAV*2         5.58881   LF1044S1          154.
+    N1044AC2  MSBOSSFO            1.   P1044X32           73.
+    N1044AC3  ACOCOSTS       7.70315   OBJECTIV       7.70315
+    N1044AC3  SYSTDEPT            1.   ACMILES        2.69845
+    N1044AC3  ASMILES      496.51465   LFRPMASM    347.560255
+    N1044AC3  FLAV*3         5.78991   LF1044S1          110.
+    N1044AC3  MSBOSSFO            1.   P1044X32           73.
+    N1046AC3  ACOCOSTS       9.52503   OBJECTIV       9.52503
+    N1046AC3  SYSTDEPT            2.   ACMILES        3.02542
+    N1046AC3  ASMILES      556.67676   LFRPMASM    389.673732
+    N1046AC3  FLAV*3         6.86058   LF1046S1          128.
+    N1046AC3  LF1046S2          128.   MSLAXOAK            1.
+    N1046AC3  MSBOSOAK            1.   P1046X23           46.
+    N1047AC1  ACOCOSTS      31.37592   OBJECTIV      31.37592
+    N1047AC1  SYSTDEPT            3.   ACMILES        5.59035
+    N1047AC1  ASMILES     2269.68188   LFRPMASM   1588.777316
+    N1047AC1  FLAV*1        12.14121   LF1047S1          243.
+    N1047AC1  LF1047S2          243.   LF1047S3          243.
+    N1047AC1  MSHNLLAX            1.   MSHNLSFO            1.
+    N1047AC1  MSBOSHNL            1.   MSLAXSFO            1.
+    N1047AC1  MSBOSSFO            1.   P1047X23          118.
+    N1047AC1  P1047X34          168.   P1047X54           73.
+    N1047AC2  ACOCOSTS      23.19986   OBJECTIV      23.19986
+    N1047AC2  SYSTDEPT            3.   ACMILES        5.59035
+    N1047AC2  ASMILES     1442.30981   LFRPMASM   1009.616867
+    N1047AC2  FLAV*2        12.10464   LF1047S1          154.
+    N1047AC2  LF1047S2          154.   LF1047S3          154.
+    N1047AC2  MSHNLLAX            1.   MSHNLSFO            1.
+    N1047AC2  MSBOSHNL            1.   MSLAXSFO            1.
+    N1047AC2  MSBOSSFO            1.   P1047X23          118.
+    N1047AC2  P1047X34          168.   P1047X54           73.
+    N1047AC3  ACOCOSTS      16.89706   OBJECTIV      16.89706
+    N1047AC3  SYSTDEPT            3.   ACMILES        5.59035
+    N1047AC3  ASMILES     1028.62451   LFRPMASM    720.037157
+    N1047AC3  FLAV*3         12.3848   LF1047S1          110.
+    N1047AC3  LF1047S2          110.   LF1047S3          110.
+    N1047AC3  MSHNLLAX            1.   MSHNLSFO            1.
+    N1047AC3  MSBOSHNL            1.   MSLAXSFO            1.
+    N1047AC3  MSBOSSFO            1.   P1047X23          118.
+    N1047AC3  P1047X34          168.   P1047X54           73.
+    N1050AC3  ACOCOSTS       4.50544   OBJECTIV       4.50544
+    N1050AC3  SYSTDEPT            2.   ACMILES        1.00139
+    N1050AC3  ASMILES      184.25568   LFRPMASM    128.978976
+    N1050AC3  FLAV*3         2.83276   LF1050S1          110.
+    N1050AC3  LF1050S2          128.   MSLAXSEA            1.
+    N1050AC3  MSONTSEA            1.   P1050X32          139.
+    N1050AC3  P1050X42           25.
+    N1050AC4  ACOCOSTS       3.11665   OBJECTIV       3.11665
+    N1050AC4  SYSTDEPT            2.   ACMILES        1.00139
+    N1050AC4  ASMILES       96.13336   LFRPMASM     67.293352
+    N1050AC4  FLAV*4         2.74274   LF1050S1           57.
+    N1050AC4  LF1050S2           67.   MSLAXSEA            1.
+    N1050AC4  MSONTSEA            1.   P1050X32          139.
+    N1050AC4  P1050X42           25.
+    N1050AC5  ACOCOSTS       3.42281   OBJECTIV       3.42281
+    N1050AC5  SYSTDEPT            2.   ACMILES        1.00139
+    N1050AC5  ASMILES       124.1723   LFRPMASM      86.92061
+    N1050AC5  FLAV*5         2.76582   LF1050S1           74.
+    N1050AC5  LF1050S2           86.   MSLAXSEA            1.
+    N1050AC5  MSONTSEA            1.   P1050X32          139.
+    N1050AC5  P1050X42           25.
+    N1051AC1  ACOCOSTS       3.80996   OBJECTIV       3.80996
+    N1051AC1  SYSTDEPT            1.   ACMILES         .33852
+    N1051AC1  ASMILES      137.44067   LFRPMASM     96.208469
+    N1051AC1  FLAV*1         1.26713   LF1051S1          243.
+    N1051AC1  MSLAXSFO            1.   P1051X23          168.
+    N1051AC2  ACOCOSTS       2.65528   OBJECTIV       2.65528
+    N1051AC2  SYSTDEPT            1.   ACMILES         .33852
+    N1051AC2  ASMILES       87.33911   LFRPMASM     61.137377
+    N1051AC2  FLAV*2         1.19699   LF1051S1          154.
+    N1051AC2  MSLAXSFO            1.   P1051X23          168.
+    N1051AC3  ACOCOSTS       1.85054   OBJECTIV       1.85054
+    N1051AC3  SYSTDEPT            1.   ACMILES         .33852
+    N1051AC3  ASMILES       62.28839   LFRPMASM     43.601873
+    N1051AC3  FLAV*3         1.09366   LF1051S1          110.
+    N1051AC3  MSLAXSFO            1.   P1051X23          168.
+    N1051AC4  ACOCOSTS       1.24858   OBJECTIV       1.24858
+    N1051AC4  SYSTDEPT            1.   ACMILES         .33852
+    N1051AC4  ASMILES       32.49829   LFRPMASM     22.748803
+    N1051AC4  FLAV*4         1.05157   LF1051S1           57.
+    N1051AC4  MSLAXSFO            1.   P1051X23          168.
+    N1051AC5  ACOCOSTS       1.38382   OBJECTIV       1.38382
+    N1051AC5  SYSTDEPT            1.   ACMILES         .33852
+    N1051AC5  ASMILES       41.97696   LFRPMASM     29.383872
+    N1051AC5  FLAV*5         1.05419   LF1051S1           74.
+    N1051AC5  MSLAXSFO            1.   P1051X23          168.
+    N1051AC6  ACOCOSTS       1.06688   OBJECTIV       1.06688
+    N1051AC6  SYSTDEPT            1.   ACMILES         .33852
+    N1051AC6  ASMILES       32.15976   LFRPMASM     22.511832
+    N1051AC6  FLAV*6         1.09962   LF1051S1           56.
+    N1051AC6  MSLAXSFO            1.   P1051X23          168.
+RHS
+    RHS1      SYSTDEPT          200.   FLAV*1            10.5
+    RHS1      FLAV*2           13.65   FLAV*3            23.5
+    RHS1      FLAV*4           21.75   FLAV*5           21.75
+    RHS1      FLAV*6            24.3   DMBOSHNL           12.
+    RHS1      DMBOSLAX           14.   DMBOSSEA           45.
+    RHS1      DMBOSSFO          122.   DMBOSTPE            1.
+    RHS1      DMBOSTYO            3.   DMBOSYUL          676.
+    RHS1      DMBOSYVR           26.   DMBOSYWG           37.
+    RHS1      DMBOSYYZ          215.   DMBUROAK           27.
+    RHS1      DMBURSEA           52.   DMBURSFO          271.
+    RHS1      DMHNLLAX          297.   DMHNLLON            5.
+    RHS1      DMHNLPAR            1.   DMHNLSEA          112.
+    RHS1      DMHNLSFO           35.   DMHNLYVR           67.
+    RHS1      DMLASSEA          370.   DMLASYVR           37.
+    RHS1      DMLAXOAK           78.   DMLAXSEA          813.
+    RHS1      DMLAXSFO         2952.   DMLAXTPE           31.
+    RHS1      DMLAXTYO           41.   DMLAXYVR          193.
+    RHS1      DMLONPAR            2.   DMLONSEA           92.
+    RHS1      DMLONYVR           51.   DMOAKONT           13.
+    RHS1      DMOAKSEA          110.   DMONTSFO          173.
+    RHS1      DMONTSEA           42.   DMPARSEA           36.
+    RHS1      DMPARYVR           24.   DMRNOSEA          284.
+    RHS1      DMRNOYVR           67.   DMSEASFO         1417.
+    RHS1      DMSEATPE           47.   DMSEATYO          114.
+    RHS1      DMSEAYVR          547.   DMSFOTPE            6.
+    RHS1      DMSFOTYO           17.   DMSFOYVR          298.
+    RHS1      DMTPETYO          111.   DMTPEYVR           17.
+    RHS1      DMTYOYVR           42.   DMYULYVR          262.
+    RHS1      DMYULYWG          413.   DMYULYYZ         2612.
+    RHS1      DMYVRYWG          375.   DMYVRYYZ          318.
+    RHS1      DMYWGYYZ          278.   DMBOSOAK           11.
+    RHS1      DMBOSBUR            7.   DMBOSONT            4.
+    RHS1      DMBURYVR           26.   DMBURTYO            2.
+    RHS1      DMBURTPE            1.   DMBURHNL           11.
+    RHS1      DMHNLOAK           24.   DMHNLONT           16.
+    RHS1      DMHNLYWG            3.   DMHNLYYZ           24.
+    RHS1      DMHNLYUL           40.   DMLASTYO            5.
+    RHS1      DMLASTPE            1.   DMLAXLON           13.
+    RHS1      DMLAXPAR            8.   DMBURLON            1.
+    RHS1      DMBURPAR            1.   DMLONONT            1.
+    RHS1      DMLONOAK            1.   DMOAKPAR            2.
+    RHS1      DMOAKTYO            7.   DMOAKTPE            2.
+    RHS1      DMONTPAR            2.   DMONTTYO            2.
+    RHS1      DMONTTPE            1.   DMPARSFO            2.
+    RHS1      DMRNOTYO            5.   DMRNOTPE            2.
+    RHS1      DMTPEYWG           21.   DMTPEYYZ           13.
+    RHS1      DMTPEYUL            6.   DMTYOYUL            7.
+    RHS1      DMTYOYYZ           17.   DMTYOYWG           25.
+    RHS1      MSBOSHNL            1.   MSBOSSEA            1.
+    RHS1      MSBOSSFO            2.   MSBOSYUL            7.
+    RHS1      MSBOSYVR            1.   MSBOSYWG            1.
+    RHS1      MSBOSYYZ            3.   MSBUROAK            1.
+    RHS1      MSBURSEA            1.   MSBURSFO            4.
+    RHS1      MSHNLLAX            3.   MSHNLSEA            2.
+    RHS1      MSHNLSFO            1.   MSHNLYVR            2.
+    RHS1      MSLASSEA            4.   MSLASYVR            1.
+    RHS1      MSLAXOAK            2.   MSLAXSEA            7.
+    RHS1      MSLAXSFO           21.   MSLAXTPE            2.
+    RHS1      MSLAXYVR            3.   MSLONPAR            1.
+    RHS1      MSLONSEA            1.   MSLONYVR            1.
+    RHS1      MSOAKONT            1.   MSOAKSEA            3.
+    RHS1      MSONTSFO            3.   MSONTSEA            2.
+    RHS1      MSPARSEA            1.   MSRNOSEA            4.
+    RHS1      MSRNOYVR            1.   MSSEASFO           10.
+    RHS1      MSSEATPE            1.   MSSEATYO            1.
+    RHS1      MSSEAYVR            6.   MSSFOYVR            5.
+    RHS1      MSTPETYO            1.   MSYULYVR            7.
+    RHS1      MSYULYWG            5.   MSYULYYZ           24.
+    RHS1      MSYVRYWG            5.   MSYVRYYZ            5.
+    RHS1      MSYWGYYZ            4.   MSBOSOAK            1.
+    RHS1      MSHNLOAK            1.   MSLAXLON            1.
+    RHS1      NOPTLON0            4.   NOPTLON1            2.
+    RHS1      NOPTTYO0            4.   NOPTTYO1            2.
+RANGES
+    RANGE1    DMBOSHNL            2.   DMBOSLAX            2.
+    RANGE1    DMBOSSEA            5.   DMBOSSFO           13.
+    RANGE1    DMBOSTPE            1.   DMBOSTYO            3.
+    RANGE1    DMBOSYUL           68.   DMBOSYVR            3.
+    RANGE1    DMBOSYWG            4.   DMBOSYYZ           22.
+    RANGE1    DMBUROAK            3.   DMBURSEA            6.
+    RANGE1    DMBURSFO           28.   DMHNLLAX           30.
+    RANGE1    DMHNLLON            5.   DMHNLPAR            1.
+    RANGE1    DMHNLSEA           12.   DMHNLSFO            4.
+    RANGE1    DMHNLYVR            7.   DMLASSEA           38.
+    RANGE1    DMLASYVR            4.   DMLAXOAK            8.
+    RANGE1    DMLAXSEA           82.   DMLAXSFO          296.
+    RANGE1    DMLAXTPE            4.   DMLAXTYO            5.
+    RANGE1    DMLAXYVR           20.   DMLONPAR            2.
+    RANGE1    DMLONSEA           10.   DMLONYVR            6.
+    RANGE1    DMOAKONT            2.   DMOAKSEA           12.
+    RANGE1    DMONTSFO           18.   DMONTSEA            5.
+    RANGE1    DMPARSEA            4.   DMPARYVR            3.
+    RANGE1    DMRNOSEA           29.   DMRNOYVR            7.
+    RANGE1    DMSEASFO          142.   DMSEATPE            5.
+    RANGE1    DMSEATYO           12.   DMSEAYVR           55.
+    RANGE1    DMSFOTPE            6.   DMSFOTYO            2.
+    RANGE1    DMSFOYVR           30.   DMTPETYO           12.
+    RANGE1    DMTPEYVR            2.   DMTYOYVR            5.
+    RANGE1    DMYULYVR           27.   DMYULYWG           42.
+    RANGE1    DMYULYYZ          262.   DMYVRYWG           38.
+    RANGE1    DMYVRYYZ           32.   DMYWGYYZ           28.
+    RANGE1    DMBOSOAK            2.   DMBOSBUR            7.
+    RANGE1    DMBOSONT            4.   DMBURYVR            3.
+    RANGE1    DMBURTYO            2.   DMBURTPE            1.
+    RANGE1    DMBURHNL            2.   DMHNLOAK            3.
+    RANGE1    DMHNLONT            2.   DMHNLYWG            3.
+    RANGE1    DMHNLYYZ            3.   DMHNLYUL            5.
+    RANGE1    DMLASTYO            5.   DMLASTPE            1.
+    RANGE1    DMLAXLON            2.   DMLAXPAR            8.
+    RANGE1    DMBURLON            1.   DMBURPAR            1.
+    RANGE1    DMLONONT            1.   DMLONOAK            1.
+    RANGE1    DMOAKPAR            2.   DMOAKTYO            7.
+    RANGE1    DMOAKTPE            2.   DMONTPAR            2.
+    RANGE1    DMONTTYO            2.   DMONTTPE            1.
+    RANGE1    DMPARSFO            2.   DMRNOTYO            5.
+    RANGE1    DMRNOTPE            2.   DMTPEYWG            3.
+    RANGE1    DMTPEYYZ            2.   DMTPEYUL            6.
+    RANGE1    DMTYOYUL            7.   DMTYOYYZ            2.
+    RANGE1    DMTYOYWG            3.
+BOUNDS
+ LO INTBOU    GRDTIMN1         -105.
+ UP INTBOU    GRDTIMN1            0.
+ LO INTBOU    GRDTIMN2          -91.
+ UP INTBOU    GRDTIMN2            0.
+ LO INTBOU    GRDTIMN3          -47.
+ UP INTBOU    GRDTIMN3            0.
+ LO INTBOU    GRDTIMN4         -43.5
+ UP INTBOU    GRDTIMN4            0.
+ LO INTBOU    GRDTIMN5          -87.
+ UP INTBOU    GRDTIMN5            0.
+ LO INTBOU    GRDTIMN6          -81.
+ UP INTBOU    GRDTIMN6            0.
+ UP INTBOU    N1001AC1            3.
+ UP INTBOU    N1001AC2            3.
+ UP INTBOU    N1001AC3            3.
+ UP INTBOU    N1002AC1            3.
+ UP INTBOU    N1002AC2            3.
+ UP INTBOU    N1002AC3            3.
+ UP INTBOU    N1003AC1            4.
+ UP INTBOU    N1003AC2            4.
+ UP INTBOU    N1003AC3            4.
+ UP INTBOU    N1004AC1            4.
+ UP INTBOU    N1004AC2            4.
+ UP INTBOU    N1004AC3            4.
+ UP INTBOU    N1005AC3            2.
+ UP INTBOU    N1105AC3            1.
+ UP INTBOU    N1006AC3            2.
+ UP INTBOU    N1007AC1            2.
+ UP INTBOU    N1007AC2            2.
+ UP INTBOU    N1007AC3            2.
+ UP INTBOU    N1008AC1            7.
+ UP INTBOU    N1008AC2            7.
+ UP INTBOU    N1008AC3            7.
+ UP INTBOU    N1008AC4            7.
+ UP INTBOU    N1008AC5            7.
+ UP INTBOU    N1008AC6            7.
+ UP INTBOU    N1009AC1            7.
+ UP INTBOU    N1009AC2            7.
+ UP INTBOU    N1009AC3            7.
+ UP INTBOU    N1009AC4            7.
+ UP INTBOU    N1009AC5            7.
+ UP INTBOU    N1010AC1            7.
+ UP INTBOU    N1010AC2            7.
+ UP INTBOU    N1010AC3            7.
+ UP INTBOU    N1010AC4            7.
+ UP INTBOU    N1010AC5            7.
+ UP INTBOU    N1010AC6            7.
+ UP INTBOU    N1011AC1            7.
+ UP INTBOU    N1011AC2            7.
+ UP INTBOU    N1011AC3            7.
+ UP INTBOU    N1011AC4            7.
+ UP INTBOU    N1011AC5            7.
+ UP INTBOU    N1011AC6            7.
+ UP INTBOU    N1012AC1            7.
+ UP INTBOU    N1012AC2            7.
+ UP INTBOU    N1012AC3            7.
+ UP INTBOU    N1012AC4            7.
+ UP INTBOU    N1012AC5            7.
+ UP INTBOU    N1013AC3            4.
+ UP INTBOU    N1013AC4            4.
+ UP INTBOU    N1013AC5            4.
+ UP INTBOU    N1013AC6            4.
+ UP INTBOU    N1014AC3            4.
+ UP INTBOU    N1014AC4            4.
+ UP INTBOU    N1014AC5            4.
+ UP INTBOU    N1014AC6            4.
+ UP INTBOU    N1015AC3            4.
+ UP INTBOU    N1015AC4            4.
+ UP INTBOU    N1015AC5            4.
+ UP INTBOU    N1015AC6            4.
+ UP INTBOU    N1016AC3            4.
+ UP INTBOU    N1016AC4            4.
+ UP INTBOU    N1016AC5            4.
+ UP INTBOU    N1016AC6            4.
+ UP INTBOU    N1017AC3            4.
+ UP INTBOU    N1017AC4            4.
+ UP INTBOU    N1017AC5            4.
+ UP INTBOU    N1017AC6            4.
+ UP INTBOU    N1018AC1            7.
+ UP INTBOU    N1018AC2            7.
+ UP INTBOU    N1018AC3            7.
+ UP INTBOU    N1018AC4            7.
+ UP INTBOU    N1018AC5            7.
+ UP INTBOU    N1018AC6            7.
+ UP INTBOU    N1019AC1            7.
+ UP INTBOU    N1019AC2            7.
+ UP INTBOU    N1019AC3            7.
+ UP INTBOU    N1019AC4            7.
+ UP INTBOU    N1019AC5            7.
+ UP INTBOU    N1020AC1            7.
+ UP INTBOU    N1020AC2            7.
+ UP INTBOU    N1020AC3            7.
+ UP INTBOU    N1020AC4            7.
+ UP INTBOU    N1020AC5            7.
+ UP INTBOU    N1020AC6            7.
+ UP INTBOU    N1021AC1            7.
+ UP INTBOU    N1021AC2            7.
+ UP INTBOU    N1021AC3            7.
+ UP INTBOU    N1021AC4            7.
+ UP INTBOU    N1021AC5            7.
+ UP INTBOU    N1022AC1            1.
+ UP INTBOU    N1023AC1            1.
+ UP INTBOU    N1026AC1            1.
+ UP INTBOU    N1027AC1            1.
+ UP INTBOU    N1028AC1            1.
+ UP INTBOU    N1029AC1            1.
+ UP INTBOU    N1030AC1            1.
+ UP INTBOU    N1032AC1            1.
+ UP INTBOU    N1032AC2            1.
+ UP INTBOU    N1032AC3            1.
+ UP INTBOU    N1032AC4            1.
+ UP INTBOU    N1032AC5            1.
+ UP INTBOU    N1033AC1            5.
+ UP INTBOU    N1033AC2            5.
+ UP INTBOU    N1033AC3            5.
+ UP INTBOU    N1033AC4            5.
+ UP INTBOU    N1033AC5            5.
+ UP INTBOU    N1034AC1            5.
+ UP INTBOU    N1034AC2            5.
+ UP INTBOU    N1034AC3            5.
+ UP INTBOU    N1035AC1            5.
+ UP INTBOU    N1035AC2            5.
+ UP INTBOU    N1035AC3            5.
+ UP INTBOU    N1035AC4            5.
+ UP INTBOU    N1035AC5            5.
+ UP INTBOU    N1036AC1            5.
+ UP INTBOU    N1036AC2            5.
+ UP INTBOU    N1036AC3            5.
+ UP INTBOU    N1037AC4            5.
+ UP INTBOU    N1037AC5            5.
+ UP INTBOU    N1038AC4           10.
+ UP INTBOU    N1038AC5           10.
+ UP INTBOU    N1039AC4            7.
+ UP INTBOU    N1039AC5            7.
+ UP INTBOU    N1040AC4           10.
+ UP INTBOU    N1040AC5           10.
+ UP INTBOU    N1040AC6           10.
+ UP INTBOU    N1041AC4           20.
+ UP INTBOU    N1041AC5           20.
+ UP INTBOU    N1041AC6           20.
+ UP INTBOU    N1042AC4           20.
+ UP INTBOU    N1042AC5           20.
+ UP INTBOU    N1042AC6           20.
+ UP INTBOU    N1043AC1            3.
+ UP INTBOU    N1043AC2            3.
+ UP INTBOU    N1043AC3            3.
+ UP INTBOU    N1044AC1            3.
+ UP INTBOU    N1044AC2            3.
+ UP INTBOU    N1044AC3            3.
+ UP INTBOU    N1046AC3            2.
+ UP INTBOU    N1047AC1            1.
+ UP INTBOU    N1047AC2            1.
+ UP INTBOU    N1047AC3            1.
+ UP INTBOU    N1050AC3            5.
+ UP INTBOU    N1050AC4            5.
+ UP INTBOU    N1050AC5            5.
+ UP INTBOU    N1051AC1           20.
+ UP INTBOU    N1051AC2           20.
+ UP INTBOU    N1051AC3           20.
+ UP INTBOU    N1051AC4           20.
+ UP INTBOU    N1051AC5           20.
+ UP INTBOU    N1051AC6           20.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/boeing2.mps b/demos/ppl_lpsol/examples/boeing2.mps
new file mode 100644
index 0000000..254aed7
--- /dev/null
+++ b/demos/ppl_lpsol/examples/boeing2.mps
@@ -0,0 +1,970 @@
+NAME          BOEING2
+ROWS
+ G  REVENUES
+ G  ACOCOSTS
+ N  OBJECTIV
+ L  FUELAVAL
+ G  SYSTDEPT
+ G  ACMILES
+ G  ASMILES
+ G  PASSNGRS
+ G  RPMILES
+ G  LFRPMASM
+ G  ATONMILE
+ G  RTONMILE
+ G  LFTNMILE
+ E  FLAV*1
+ E  FLAV*2
+ E  FLAV*3
+ E  FLAV*4
+ G  LF1003S1
+ G  LF1003B1
+ G  LF1003C1
+ G  LF1005S1
+ G  LF1005B1
+ G  LF1005C1
+ G  LF1011S1
+ G  LF1011S2
+ G  LF1011B1
+ G  LF1011B2
+ G  LF1011C1
+ G  LF1011C2
+ G  LF1013S1
+ G  LF1013S2
+ G  LF1013B1
+ G  LF1013B2
+ G  LF1013C1
+ G  LF1013C2
+ G  LF1015S1
+ G  LF1015B1
+ G  LF1015C1
+ G  LF1017S1
+ G  LF1017B1
+ G  LF1017C1
+ G  LF1019S1
+ G  LF1019S2
+ G  LF1019B1
+ G  LF1019B2
+ G  LF1019C1
+ G  LF1019C2
+ G  LF1021S1
+ G  LF1021B1
+ G  LF1021C1
+ G  LF1002S1
+ G  LF1002B1
+ G  LF1002C1
+ G  LF1004S1
+ G  LF1004B1
+ G  LF1004C1
+ G  LF1006S1
+ G  LF1006S2
+ G  LF1006B1
+ G  LF1006B2
+ G  LF1006C1
+ G  LF1006C2
+ G  LF1008S1
+ G  LF1008S2
+ G  LF1008B1
+ G  LF1008B2
+ G  LF1008C1
+ G  LF1008C2
+ G  LF1010S1
+ G  LF1010S2
+ G  LF1010S3
+ G  LF1010B1
+ G  LF1010B2
+ G  LF1010B3
+ G  LF1010C1
+ G  LF1010C2
+ G  LF1010C3
+ G  LF1012S1
+ G  LF1012B1
+ G  LF1012C1
+ G  LF1014S1
+ G  LF1014S2
+ G  LF1014B1
+ G  LF1014B2
+ G  LF1014C1
+ G  LF1014C2
+ G  LF1100S1
+ G  LF1100S2
+ G  LF1100S3
+ G  LF1100S4
+ G  LF1100S5
+ G  LF1100B1
+ G  LF1100B2
+ G  LF1100B3
+ G  LF1100B4
+ G  LF1100B5
+ G  LF1100C1
+ G  LF1100C2
+ G  LF1100C3
+ G  LF1100C4
+ G  LF1100C5
+ G  LF1102S1
+ G  LF1102S2
+ G  LF1102S3
+ G  LF1102S4
+ G  LF1102B1
+ G  LF1102B2
+ G  LF1102B3
+ G  LF1102B4
+ G  LF1102C1
+ G  LF1102C2
+ G  LF1102C3
+ G  LF1102C4
+ G  LF1200S1
+ G  LF1200B1
+ G  LF1200C1
+ G  LF1201S1
+ G  LF1201B1
+ G  LF1201C1
+ G  NOPTCLE0
+ G  CONTBOS1
+ G  CONTBOS2
+ G  CONTBOS3
+ G  CONTBOS4
+ G  CONTORD1
+ G  CONTORD2
+ G  CONTORD3
+ G  CONTORD4
+ G  CONTLGA2
+ G  CONTLGA4
+ G  CONTCLE1
+ G  CONTCLE2
+ G  CONTCLE3
+ G  CONTCLE4
+ L  DMBOSORD
+ L  DMBOSLGA
+ L  DMBOSCLE
+ L  DMORDBOS
+ L  DMORDLGA
+ L  DMORDCLE
+ L  DMLGABOS
+ L  DMLGAORD
+ L  DMLGACLE
+ L  DMCLEBOS
+ L  DMCLEORD
+ L  DMCLELGA
+ G  MSBOSORD
+ G  MSBOSLGA
+ G  MSBOSCLE
+ G  MSORDBOS
+ G  MSORDLGA
+ G  MSORDCLE
+ G  MSLGABOS
+ G  MSLGAORD
+ G  MSLGACLE
+ G  MSCLEBOS
+ G  MSCLEORD
+ G  MSCLELGA
+ L  DCBOSORD
+ L  DCBOSCLE
+ L  DCORDBOS
+ L  DCORDLGA
+ L  DCLGAORD
+ L  DCLGACLE
+ L  DCCLELGA
+ G  MCORDBOS
+ G  MCLGAORD
+COLUMNS
+    PBOSORD0  REVENUES          .075   OBJECTIV         -.075
+    PBOSORD0  PASSNGRS            1.   RPMILES         .86441
+    PBOSORD0  LFRPMASM       -.86441   DMBOSORD            1.
+    PBOSORD0  LF1003S1           -1.
+    PBOSORD1  REVENUES          .075   OBJECTIV         -.075
+    PBOSORD1  PASSNGRS            1.   RPMILES         .87605
+    PBOSORD1  LFRPMASM       -.87605   DMBOSORD            1.
+    PBOSORD1  LF1011S1           -1.   LF1011S2           -1.
+    PBOSORD2  REVENUES          .075   OBJECTIV         -.075
+    PBOSORD2  PASSNGRS            1.   RPMILES         .91637
+    PBOSORD2  LFRPMASM       -.91637   DMBOSORD            1.
+    PBOSORD2  LF1013S1           -1.   LF1013S2           -1.
+    PBOSORD3  REVENUES          .075   OBJECTIV         -.075
+    PBOSORD3  PASSNGRS            1.   RPMILES         .91722
+    PBOSORD3  LFRPMASM       -.91722   DMBOSORD            1.
+    PBOSORD3  LF1100S1           -1.   LF1100S2           -1.
+    PBOSORD3  LF1100S3           -1.
+    PBOSORD4  REVENUES          .075   OBJECTIV         -.075
+    PBOSORD4  PASSNGRS            1.   RPMILES         .87605
+    PBOSORD4  LFRPMASM       -.87605   DMBOSORD            1.
+    PBOSORD4  LF1102S1           -1.   LF1102S2           -1.
+    PBOSLGA0  REVENUES          .027   OBJECTIV         -.027
+    PBOSLGA0  PASSNGRS            1.   RPMILES         .18557
+    PBOSLGA0  LFRPMASM       -.18557   DMBOSLGA            1.
+    PBOSLGA0  LF1013S1           -1.
+    PBOSLGA1  REVENUES          .027   OBJECTIV         -.027
+    PBOSLGA1  PASSNGRS            1.   RPMILES         .18557
+    PBOSLGA1  LFRPMASM       -.18557   DMBOSLGA            1.
+    PBOSLGA1  LF1100S1           -1.
+    PBOSLGA2  REVENUES          .027   OBJECTIV         -.027
+    PBOSLGA2  PASSNGRS            1.   RPMILES        1.60685
+    PBOSLGA2  LFRPMASM      -1.60685   DMBOSLGA            1.
+    PBOSLGA2  LF1102S1           -1.   LF1102S2           -1.
+    PBOSLGA2  LF1102S3           -1.
+    PBOSLGA3  REVENUES          .027   OBJECTIV         -.027
+    PBOSLGA3  PASSNGRS            1.   RPMILES         .18557
+    PBOSLGA3  LFRPMASM       -.18557   DMBOSLGA            1.
+    PBOSLGA3  LF1200S1           -1.
+    PBOSCLE0  REVENUES          .053   OBJECTIV         -.053
+    PBOSCLE0  PASSNGRS            1.   RPMILES         .56156
+    PBOSCLE0  LFRPMASM       -.56156   DMBOSCLE            1.
+    PBOSCLE0  LF1005S1           -1.
+    PBOSCLE1  REVENUES          .053   OBJECTIV         -.053
+    PBOSCLE1  PASSNGRS            1.   RPMILES         .56156
+    PBOSCLE1  LFRPMASM       -.56156   DMBOSCLE            1.
+    PBOSCLE1  LF1011S1           -1.
+    PBOSCLE2  REVENUES          .053   OBJECTIV         -.053
+    PBOSCLE2  PASSNGRS            1.   RPMILES         .60273
+    PBOSCLE2  LFRPMASM       -.60273   DMBOSCLE            1.
+    PBOSCLE2  LF1100S1           -1.   LF1100S2           -1.
+    PBOSCLE3  REVENUES          .053   OBJECTIV         -.053
+    PBOSCLE3  PASSNGRS            1.   RPMILES         .56156
+    PBOSCLE3  LFRPMASM       -.56156   DMBOSCLE            1.
+    PBOSCLE3  LF1102S1           -1.
+    PORDBOS0  REVENUES          .075   OBJECTIV         -.075
+    PORDBOS0  PASSNGRS            1.   RPMILES         .87605
+    PORDBOS0  LFRPMASM       -.87605   DMORDBOS            1.
+    PORDBOS0  LF1006S1           -1.   LF1006S2           -1.
+    PORDBOS1  REVENUES          .075   OBJECTIV         -.075
+    PORDBOS1  PASSNGRS            1.   RPMILES         .91637
+    PORDBOS1  LFRPMASM       -.91637   DMORDBOS            1.
+    PORDBOS1  LF1008S1           -1.   LF1008S2           -1.
+    PORDBOS2  REVENUES          .075   OBJECTIV         -.075
+    PORDBOS2  PASSNGRS            1.   RPMILES         .91722
+    PORDBOS2  LFRPMASM       -.91722   DMORDBOS            1.
+    PORDBOS2  LF1010S1           -1.   LF1010S2           -1.
+    PORDBOS2  LF1010S3           -1.
+    PORDBOS3  REVENUES          .075   OBJECTIV         -.075
+    PORDBOS3  PASSNGRS            1.   RPMILES         .87605
+    PORDBOS3  LFRPMASM       -.87605   DMORDBOS            1.
+    PORDBOS3  LF1100S4           -1.   LF1100S5           -1.
+    PORDBOS4  REVENUES          .075   OBJECTIV         -.075
+    PORDBOS4  PASSNGRS            1.   RPMILES         .91637
+    PORDBOS4  LFRPMASM       -.91637   DMORDBOS            1.
+    PORDBOS4  LF1102S3           -1.   LF1102S4           -1.
+    PORDLGA0  REVENUES          .068   OBJECTIV         -.068
+    PORDLGA0  PASSNGRS            1.   RPMILES          .7308
+    PORDLGA0  LFRPMASM        -.7308   DMORDLGA            1.
+    PORDLGA0  LF1004S1           -1.
+    PORDLGA1  REVENUES          .068   OBJECTIV         -.068
+    PORDLGA1  PASSNGRS            1.   RPMILES          .7308
+    PORDLGA1  LFRPMASM        -.7308   DMORDLGA            1.
+    PORDLGA1  LF1008S1           -1.
+    PORDLGA2  REVENUES          .068   OBJECTIV         -.068
+    PORDLGA2  PASSNGRS            1.   RPMILES         .73165
+    PORDLGA2  LFRPMASM       -.73165   DMORDLGA            1.
+    PORDLGA2  LF1010S1           -1.   LF1010S2           -1.
+    PORDLGA3  REVENUES          .068   OBJECTIV         -.068
+    PORDLGA3  PASSNGRS            1.   RPMILES          .7308
+    PORDLGA3  LFRPMASM        -.7308   DMORDLGA            1.
+    PORDLGA3  LF1102S3           -1.
+    PORDCLE0  REVENUES          .035   OBJECTIV         -.035
+    PORDCLE0  PASSNGRS            1.   RPMILES          .3145
+    PORDCLE0  LFRPMASM        -.3145   DMORDCLE            1.
+    PORDCLE0  LF1002S1           -1.
+    PORDCLE1  REVENUES          .035   OBJECTIV         -.035
+    PORDCLE1  PASSNGRS            1.   RPMILES          .3145
+    PORDCLE1  LFRPMASM        -.3145   DMORDCLE            1.
+    PORDCLE1  LF1006S1           -1.
+    PORDCLE2  REVENUES          .035   OBJECTIV         -.035
+    PORDCLE2  PASSNGRS            1.   RPMILES          .3145
+    PORDCLE2  LFRPMASM        -.3145   DMORDCLE            1.
+    PORDCLE2  LF1010S1           -1.
+    PORDCLE3  REVENUES          .035   OBJECTIV         -.035
+    PORDCLE3  PASSNGRS            1.   RPMILES          .3145
+    PORDCLE3  LFRPMASM        -.3145   DMORDCLE            1.
+    PORDCLE3  LF1100S4           -1.
+    PLGABOS0  REVENUES          .027   OBJECTIV         -.027
+    PLGABOS0  PASSNGRS            1.   RPMILES         .18557
+    PLGABOS0  LFRPMASM       -.18557   DMLGABOS            1.
+    PLGABOS0  LF1008S2           -1.
+    PLGABOS1  REVENUES          .027   OBJECTIV         -.027
+    PLGABOS1  PASSNGRS            1.   RPMILES         .18557
+    PLGABOS1  LFRPMASM       -.18557   DMLGABOS            1.
+    PLGABOS1  LF1010S3           -1.
+    PLGABOS2  REVENUES          .027   OBJECTIV         -.027
+    PLGABOS2  PASSNGRS            1.   RPMILES         .18557
+    PLGABOS2  LFRPMASM       -.18557   DMLGABOS            1.
+    PLGABOS2  LF1014S2           -1.
+    PLGABOS3  REVENUES          .027   OBJECTIV         -.027
+    PLGABOS3  PASSNGRS            1.   RPMILES         1.6077
+    PLGABOS3  LFRPMASM       -1.6077   DMLGABOS            1.
+    PLGABOS3  LF1100S2           -1.   LF1100S3           -1.
+    PLGABOS3  LF1100S4           -1.   LF1100S5           -1.
+    PLGABOS4  REVENUES          .027   OBJECTIV         -.027
+    PLGABOS4  PASSNGRS            1.   RPMILES         .18557
+    PLGABOS4  LFRPMASM       -.18557   DMLGABOS            1.
+    PLGABOS4  LF1102S4           -1.
+    PLGABOS5  REVENUES          .027   OBJECTIV         -.027
+    PLGABOS5  PASSNGRS            1.   RPMILES         .18557
+    PLGABOS5  LFRPMASM       -.18557   DMLGABOS            1.
+    PLGABOS5  LF1201S1           -1.
+    PLGAORD0  REVENUES          .068   OBJECTIV         -.068
+    PLGAORD0  PASSNGRS            1.   RPMILES          .7308
+    PLGAORD0  LFRPMASM        -.7308   DMLGAORD            1.
+    PLGAORD0  LF1013S2           -1.
+    PLGAORD1  REVENUES          .068   OBJECTIV         -.068
+    PLGAORD1  PASSNGRS            1.   RPMILES          .7308
+    PLGAORD1  LFRPMASM        -.7308   DMLGAORD            1.
+    PLGAORD1  LF1017S1           -1.
+    PLGAORD2  REVENUES          .068   OBJECTIV         -.068
+    PLGAORD2  PASSNGRS            1.   RPMILES         .73165
+    PLGAORD2  LFRPMASM       -.73165   DMLGAORD            1.
+    PLGAORD2  LF1019S1           -1.   LF1019S2           -1.
+    PLGAORD3  REVENUES          .068   OBJECTIV         -.068
+    PLGAORD3  PASSNGRS            1.   RPMILES         .73165
+    PLGAORD3  LFRPMASM       -.73165   DMLGAORD            1.
+    PLGAORD3  LF1100S2           -1.   LF1100S3           -1.
+    PLGACLE0  REVENUES          .037   OBJECTIV         -.037
+    PLGACLE0  PASSNGRS            1.   RPMILES         .41715
+    PLGACLE0  LFRPMASM       -.41715   DMLGACLE            1.
+    PLGACLE0  LF1015S1           -1.
+    PLGACLE1  REVENUES          .037   OBJECTIV         -.037
+    PLGACLE1  PASSNGRS            1.   RPMILES         .41715
+    PLGACLE1  LFRPMASM       -.41715   DMLGACLE            1.
+    PLGACLE1  LF1019S1           -1.
+    PLGACLE2  REVENUES          .037   OBJECTIV         -.037
+    PLGACLE2  PASSNGRS            1.   RPMILES         .41715
+    PLGACLE2  LFRPMASM       -.41715   DMLGACLE            1.
+    PLGACLE2  LF1100S2           -1.
+    PCLEBOS0  REVENUES          .053   OBJECTIV         -.053
+    PCLEBOS0  PASSNGRS            1.   RPMILES         .56156
+    PCLEBOS0  LFRPMASM       -.56156   DMCLEBOS            1.
+    PCLEBOS0  LF1006S2           -1.
+    PCLEBOS1  REVENUES          .053   OBJECTIV         -.053
+    PCLEBOS1  PASSNGRS            1.   RPMILES         .60273
+    PCLEBOS1  LFRPMASM       -.60273   DMCLEBOS            1.
+    PCLEBOS1  LF1010S2           -1.   LF1010S3           -1.
+    PCLEBOS2  REVENUES          .053   OBJECTIV         -.053
+    PCLEBOS2  PASSNGRS            1.   RPMILES         .60273
+    PCLEBOS2  LFRPMASM       -.60273   DMCLEBOS            1.
+    PCLEBOS2  LF1014S1           -1.   LF1014S2           -1.
+    PCLEBOS3  REVENUES          .053   OBJECTIV         -.053
+    PCLEBOS3  PASSNGRS            1.   RPMILES         .56156
+    PCLEBOS3  LFRPMASM       -.56156   DMCLEBOS            1.
+    PCLEBOS3  LF1100S5           -1.
+    PCLEBOS4  REVENUES          .053   OBJECTIV         -.053
+    PCLEBOS4  PASSNGRS            1.   RPMILES        1.23087
+    PCLEBOS4  LFRPMASM      -1.23087   DMCLEBOS            1.
+    PCLEBOS4  LF1102S2           -1.   LF1102S3           -1.
+    PCLEBOS4  LF1102S4           -1.
+    PCLEORD0  REVENUES          .035   OBJECTIV         -.035
+    PCLEORD0  PASSNGRS            1.   RPMILES          .3145
+    PCLEORD0  LFRPMASM        -.3145   DMCLEORD            1.
+    PCLEORD0  LF1011S2           -1.
+    PCLEORD1  REVENUES          .035   OBJECTIV         -.035
+    PCLEORD1  PASSNGRS            1.   RPMILES          .3145
+    PCLEORD1  LFRPMASM        -.3145   DMCLEORD            1.
+    PCLEORD1  LF1019S2           -1.
+    PCLEORD2  REVENUES          .035   OBJECTIV         -.035
+    PCLEORD2  PASSNGRS            1.   RPMILES          .3145
+    PCLEORD2  LFRPMASM        -.3145   DMCLEORD            1.
+    PCLEORD2  LF1021S1           -1.
+    PCLEORD3  REVENUES          .035   OBJECTIV         -.035
+    PCLEORD3  PASSNGRS            1.   RPMILES          .3145
+    PCLEORD3  LFRPMASM        -.3145   DMCLEORD            1.
+    PCLEORD3  LF1100S3           -1.
+    PCLEORD4  REVENUES          .035   OBJECTIV         -.035
+    PCLEORD4  PASSNGRS            1.   RPMILES          .3145
+    PCLEORD4  LFRPMASM        -.3145   DMCLEORD            1.
+    PCLEORD4  LF1102S2           -1.
+    PCLELGA0  REVENUES          .037   OBJECTIV         -.037
+    PCLELGA0  PASSNGRS            1.   RPMILES         .41715
+    PCLELGA0  LFRPMASM       -.41715   DMCLELGA            1.
+    PCLELGA0  LF1010S2           -1.
+    PCLELGA1  REVENUES          .037   OBJECTIV         -.037
+    PCLELGA1  PASSNGRS            1.   RPMILES         .41715
+    PCLELGA1  LFRPMASM       -.41715   DMCLELGA            1.
+    PCLELGA1  LF1012S1           -1.
+    PCLELGA2  REVENUES          .037   OBJECTIV         -.037
+    PCLELGA2  PASSNGRS            1.   RPMILES         .41715
+    PCLELGA2  LFRPMASM       -.41715   DMCLELGA            1.
+    PCLELGA2  LF1014S1           -1.
+    PCLELGA3  REVENUES          .037   OBJECTIV         -.037
+    PCLELGA3  PASSNGRS            1.   RPMILES         1.0453
+    PCLELGA3  LFRPMASM       -1.0453   DMCLELGA            1.
+    PCLELGA3  LF1102S2           -1.   LF1102S3           -1.
+    BBOSORD0  REVENUES           .75   OBJECTIV          -.75
+    BBOSORD0  RTONMILE        .86441   LFTNMILE       -.86441
+    BBOSORD0  DCBOSORD            1.   LF1003B1           -1.
+    BBOSORD1  REVENUES           .75   OBJECTIV          -.75
+    BBOSORD1  RTONMILE        .87605   LFTNMILE       -.87605
+    BBOSORD1  DCBOSORD            1.   LF1011B1           -1.
+    BBOSORD1  LF1011B2           -1.
+    BBOSCLE0  REVENUES           .53   OBJECTIV          -.53
+    BBOSCLE0  RTONMILE        .56156   LFTNMILE       -.56156
+    BBOSCLE0  DCBOSCLE            1.   LF1005B1           -1.
+    BBOSCLE1  REVENUES           .53   OBJECTIV          -.53
+    BBOSCLE1  RTONMILE        .56156   LFTNMILE       -.56156
+    BBOSCLE1  DCBOSCLE            1.   LF1011B1           -1.
+    BORDBOS0  REVENUES           .75   OBJECTIV          -.75
+    BORDBOS0  RTONMILE        .87605   LFTNMILE       -.87605
+    BORDBOS0  DCORDBOS            1.   LF1006B1           -1.
+    BORDBOS0  LF1006B2           -1.
+    CBOSORD0  REVENUES           .75   OBJECTIV          -.75
+    CBOSORD0  RTONMILE        .86441   LFTNMILE       -.86441
+    CBOSORD0  DCBOSORD            1.   LF1003C1           -1.
+    CBOSORD1  REVENUES           .75   OBJECTIV          -.75
+    CBOSORD1  RTONMILE        .87605   LFTNMILE       -.87605
+    CBOSORD1  DCBOSORD            1.   LF1011C1           -1.
+    CBOSORD1  LF1011C2           -1.
+    CBOSORD2  REVENUES           .75   OBJECTIV          -.75
+    CBOSORD2  RTONMILE        .91637   LFTNMILE       -.91637
+    CBOSORD2  DCBOSORD            1.   LF1013C1           -1.
+    CBOSORD2  LF1013C2           -1.
+    CBOSORD3  REVENUES           .75   OBJECTIV          -.75
+    CBOSORD3  RTONMILE        .91722   LFTNMILE       -.91722
+    CBOSORD3  DCBOSORD            1.   LF1100C1           -1.
+    CBOSORD3  LF1100C2           -1.   LF1100C3           -1.
+    CBOSORD4  REVENUES           .75   OBJECTIV          -.75
+    CBOSORD4  RTONMILE        .87605   LFTNMILE       -.87605
+    CBOSORD4  DCBOSORD            1.   LF1102C1           -1.
+    CBOSORD4  LF1102C2           -1.
+    CBOSCLE0  REVENUES           .53   OBJECTIV          -.53
+    CBOSCLE0  RTONMILE        .56156   LFTNMILE       -.56156
+    CBOSCLE0  DCBOSCLE            1.   LF1005C1           -1.
+    CBOSCLE1  REVENUES           .53   OBJECTIV          -.53
+    CBOSCLE1  RTONMILE        .56156   LFTNMILE       -.56156
+    CBOSCLE1  DCBOSCLE            1.   LF1011C1           -1.
+    CBOSCLE2  REVENUES           .53   OBJECTIV          -.53
+    CBOSCLE2  RTONMILE        .60273   LFTNMILE       -.60273
+    CBOSCLE2  DCBOSCLE            1.   LF1100C1           -1.
+    CBOSCLE2  LF1100C2           -1.
+    CBOSCLE3  REVENUES           .53   OBJECTIV          -.53
+    CBOSCLE3  RTONMILE        .56156   LFTNMILE       -.56156
+    CBOSCLE3  DCBOSCLE            1.   LF1102C1           -1.
+    CORDBOS0  REVENUES           .75   OBJECTIV          -.75
+    CORDBOS0  RTONMILE        .87605   LFTNMILE       -.87605
+    CORDBOS0  DCORDBOS            1.   LF1006C1           -1.
+    CORDBOS0  LF1006C2           -1.
+    CORDBOS1  REVENUES           .75   OBJECTIV          -.75
+    CORDBOS1  RTONMILE        .91637   LFTNMILE       -.91637
+    CORDBOS1  DCORDBOS            1.   LF1008C1           -1.
+    CORDBOS1  LF1008C2           -1.
+    CORDBOS2  REVENUES           .75   OBJECTIV          -.75
+    CORDBOS2  RTONMILE        .91722   LFTNMILE       -.91722
+    CORDBOS2  DCORDBOS            1.   LF1010C1           -1.
+    CORDBOS2  LF1010C2           -1.   LF1010C3           -1.
+    CORDBOS3  REVENUES           .75   OBJECTIV          -.75
+    CORDBOS3  RTONMILE        .87605   LFTNMILE       -.87605
+    CORDBOS3  DCORDBOS            1.   LF1100C4           -1.
+    CORDBOS3  LF1100C5           -1.
+    CORDBOS4  REVENUES           .75   OBJECTIV          -.75
+    CORDBOS4  RTONMILE        .91637   LFTNMILE       -.91637
+    CORDBOS4  DCORDBOS            1.   LF1102C3           -1.
+    CORDBOS4  LF1102C4           -1.
+    CORDLGA0  REVENUES           .68   OBJECTIV          -.68
+    CORDLGA0  RTONMILE         .7308   LFTNMILE        -.7308
+    CORDLGA0  DCORDLGA            1.   LF1004C1           -1.
+    CORDLGA1  REVENUES           .68   OBJECTIV          -.68
+    CORDLGA1  RTONMILE         .7308   LFTNMILE        -.7308
+    CORDLGA1  DCORDLGA            1.   LF1008C1           -1.
+    CORDLGA2  REVENUES           .68   OBJECTIV          -.68
+    CORDLGA2  RTONMILE        .73165   LFTNMILE       -.73165
+    CORDLGA2  DCORDLGA            1.   LF1010C1           -1.
+    CORDLGA2  LF1010C2           -1.
+    CORDLGA3  REVENUES           .68   OBJECTIV          -.68
+    CORDLGA3  RTONMILE         .7308   LFTNMILE        -.7308
+    CORDLGA3  DCORDLGA            1.   LF1102C3           -1.
+    CLGAORD0  REVENUES           .68   OBJECTIV          -.68
+    CLGAORD0  RTONMILE         .7308   LFTNMILE        -.7308
+    CLGAORD0  DCLGAORD            1.   LF1013C2           -1.
+    CLGAORD1  REVENUES           .68   OBJECTIV          -.68
+    CLGAORD1  RTONMILE         .7308   LFTNMILE        -.7308
+    CLGAORD1  DCLGAORD            1.   LF1017C1           -1.
+    CLGAORD2  REVENUES           .68   OBJECTIV          -.68
+    CLGAORD2  RTONMILE        .73165   LFTNMILE       -.73165
+    CLGAORD2  DCLGAORD            1.   LF1019C1           -1.
+    CLGAORD2  LF1019C2           -1.
+    CLGAORD3  REVENUES           .68   OBJECTIV          -.68
+    CLGAORD3  RTONMILE        .73165   LFTNMILE       -.73165
+    CLGAORD3  DCLGAORD            1.   LF1100C2           -1.
+    CLGAORD3  LF1100C3           -1.
+    CLGACLE0  REVENUES           .37   OBJECTIV          -.37
+    CLGACLE0  RTONMILE        .41715   LFTNMILE       -.41715
+    CLGACLE0  DCLGACLE            1.   LF1015C1           -1.
+    CLGACLE1  REVENUES           .37   OBJECTIV          -.37
+    CLGACLE1  RTONMILE        .41715   LFTNMILE       -.41715
+    CLGACLE1  DCLGACLE            1.   LF1019C1           -1.
+    CLGACLE2  REVENUES           .37   OBJECTIV          -.37
+    CLGACLE2  RTONMILE        .41715   LFTNMILE       -.41715
+    CLGACLE2  DCLGACLE            1.   LF1100C2           -1.
+    CCLELGA0  REVENUES           .37   OBJECTIV          -.37
+    CCLELGA0  RTONMILE        .41715   LFTNMILE       -.41715
+    CCLELGA0  DCCLELGA            1.   LF1010C2           -1.
+    CCLELGA1  REVENUES           .37   OBJECTIV          -.37
+    CCLELGA1  RTONMILE        .41715   LFTNMILE       -.41715
+    CCLELGA1  DCCLELGA            1.   LF1012C1           -1.
+    CCLELGA2  REVENUES           .37   OBJECTIV          -.37
+    CCLELGA2  RTONMILE        .41715   LFTNMILE       -.41715
+    CCLELGA2  DCCLELGA            1.   LF1014C1           -1.
+    CCLELGA3  REVENUES           .37   OBJECTIV          -.37
+    CCLELGA3  RTONMILE        1.0453   LFTNMILE       -1.0453
+    CCLELGA3  DCCLELGA            1.   LF1102C2           -1.
+    CCLELGA3  LF1102C3           -1.
+    GRDTIMO1  FLAV*1              1.   ACOCOSTS           .65
+    GRDTIMO1  OBJECTIV           .65
+    GRDTIMN1  FLAV*1              1.   ACOCOSTS          -.05
+    GRDTIMN1  OBJECTIV          -.05
+    GRDTIMO2  FLAV*2              1.   ACOCOSTS          .275
+    GRDTIMO2  OBJECTIV          .275
+    GRDTIMN2  FLAV*2              1.   ACOCOSTS       -.02889
+    GRDTIMN2  OBJECTIV       -.02889
+    GRDTIMN3  FLAV*3              1.   ACOCOSTS       -.03611
+    GRDTIMN3  OBJECTIV       -.03611
+    GRDTIMN4  FLAV*4              1.   ACOCOSTS       -.01333
+    GRDTIMN4  OBJECTIV       -.01333
+    N1003AC1  ACOCOSTS           .01   OBJECTIV           .01
+    N1003AC1  FUELAVAL       7.98429   SYSTDEPT            1.
+    N1003AC1  ACMILES         .86441   ASMILES      351.81396
+    N1003AC1  LFRPMASM    211.088376   FLAV*1         2.32729
+    N1003AC1  ATONMILE      25.93224   LFTNMILE      12.96612
+    N1003AC1  LF1003S1          305.   LF1003B1           12.
+    N1003AC1  CONTBOS1            1.   CONTORD1           -1.
+    N1003AC1  MSBOSORD            1.
+    N1003AC2  ACOCOSTS           .02   OBJECTIV           .02
+    N1003AC2  FUELAVAL       2.51914   SYSTDEPT            1.
+    N1003AC2  ACMILES         .86441   ASMILES      113.23743
+    N1003AC2  LFRPMASM     67.942458   FLAV*2         2.10966
+    N1003AC2  LF1003S1           98.   CONTBOS2            1.
+    N1003AC2  CONTORD2           -1.   MSBOSORD            1.
+    N1003AC3  ACOCOSTS           .03   OBJECTIV           .03
+    N1003AC3  FUELAVAL       3.15178   SYSTDEPT            1.
+    N1003AC3  ACMILES         .86441   FLAV*3         2.10966
+    N1003AC3  ATONMILE      34.57631   LFTNMILE     17.288155
+    N1003AC3  LF1003C1           30.   CONTBOS3            1.
+    N1003AC3  CONTORD3           -1.
+    N1003AC4  ACOCOSTS           .04   OBJECTIV           .04
+    N1003AC4  FUELAVAL       1.99337   SYSTDEPT            1.
+    N1003AC4  ACMILES         .86441   FLAV*4         2.10966
+    N1003AC4  ATONMILE      12.96612   LFTNMILE       6.48306
+    N1003AC4  LF1003C1         11.25   CONTBOS4            1.
+    N1003AC4  CONTORD4           -1.
+    N1005AC1  ACOCOSTS       4.04337   OBJECTIV       4.04337
+    N1005AC1  FUELAVAL       5.83404   SYSTDEPT            1.
+    N1005AC1  ACMILES         .56156   ASMILES      228.55299
+    N1005AC1  LFRPMASM    137.131794   FLAV*1           1000.
+    N1005AC1  ATONMILE      16.84665   LFTNMILE      8.423325
+    N1005AC1  LF1005S1          305.   LF1005B1           12.
+    N1005AC1  NOPTCLE0            1.   CONTBOS1            1.
+    N1005AC1  CONTCLE1           -1.   MSBOSCLE            1.
+    N1005AC2  ACOCOSTS       1.60964   OBJECTIV       1.60964
+    N1005AC2  FUELAVAL       1.82258   SYSTDEPT            1.
+    N1005AC2  ACMILES         .56156   ASMILES       73.56374
+    N1005AC2  LFRPMASM     44.138244   FLAV*2           2000.
+    N1005AC2  LF1005S1           98.   NOPTCLE0            1.
+    N1005AC2  CONTBOS2            1.   CONTCLE2           -1.
+    N1005AC2  MSBOSCLE            1.
+    N1005AC3  ACOCOSTS       1.93119   OBJECTIV       1.93119
+    N1005AC3  FUELAVAL       2.27351   SYSTDEPT            1.
+    N1005AC3  ACMILES         .56156   FLAV*3           3000.
+    N1005AC3  ATONMILE       22.4622   LFTNMILE       11.2311
+    N1005AC3  LF1005C1           30.   NOPTCLE0            1.
+    N1005AC3  CONTBOS3            1.   CONTCLE3           -1.
+    N1005AC4  ACOCOSTS       1.34618   OBJECTIV       1.34618
+    N1005AC4  FUELAVAL       1.41795   SYSTDEPT            1.
+    N1005AC4  ACMILES         .56156   FLAV*4           1500.
+    N1005AC4  ATONMILE       8.42333   LFTNMILE      4.211665
+    N1005AC4  LF1005C1         11.25   NOPTCLE0            1.
+    N1005AC4  CONTBOS4            1.   CONTCLE4           -1.
+    N1011AC1  ACOCOSTS           1.1   OBJECTIV           1.1
+    N1011AC1  FUELAVAL       9.91398   SYSTDEPT            2.
+    N1011AC1  ACMILES         .87605   ASMILES      356.55371
+    N1011AC1  LFRPMASM    213.932226   FLAV*1             25.
+    N1011AC1  ATONMILE       26.2816   LFTNMILE       13.1408
+    N1011AC1  LF1011S1          305.   LF1011S2          305.
+    N1011AC1  LF1011B1           12.   LF1011B2           12.
+    N1011AC1  NOPTCLE0            2.   CONTBOS1            1.
+    N1011AC1  CONTORD1           -1.   MSBOSCLE            1.
+    N1011AC1  MSBOSORD            1.   MSCLEORD            1.
+    N1011AC2  ACOCOSTS           1.2   OBJECTIV           1.2
+    N1011AC2  FUELAVAL       3.07692   SYSTDEPT            2.
+    N1011AC2  ACMILES         .87605   ASMILES      114.76299
+    N1011AC2  LFRPMASM     68.857794   FLAV*2             25.
+    N1011AC2  LF1011S1           98.   LF1011S2           98.
+    N1011AC2  NOPTCLE0            2.   CONTBOS2            1.
+    N1011AC2  CONTORD2           -1.   MSBOSCLE            1.
+    N1011AC2  MSBOSORD            1.   MSCLEORD            1.
+    N1011AC3  ACOCOSTS           1.3   OBJECTIV           1.3
+    N1011AC3  FUELAVAL       3.83055   SYSTDEPT            2.
+    N1011AC3  ACMILES         .87605   FLAV*3             26.
+    N1011AC3  ATONMILE      35.04214   LFTNMILE      17.52107
+    N1011AC3  LF1011C1           30.   LF1011C2           30.
+    N1011AC3  NOPTCLE0            2.   CONTBOS3            1.
+    N1011AC3  CONTORD3           -1.
+    N1011AC4  ACOCOSTS       2.34647   OBJECTIV       2.34647
+    N1011AC4  FUELAVAL        2.3665   SYSTDEPT            2.
+    N1011AC4  ACMILES         .87605   FLAV*4             27.
+    N1011AC4  ATONMILE       13.1408   LFTNMILE        6.5704
+    N1011AC4  LF1011C1         11.25   LF1011C2         11.25
+    N1011AC4  NOPTCLE0            2.   CONTBOS4            1.
+    N1011AC4  CONTORD4           -1.
+    N1013AC2  ACOCOSTS       2.36783   OBJECTIV       2.36783
+    N1013AC2  FUELAVAL       3.16965   SYSTDEPT            2.
+    N1013AC2  ACMILES         .91637   ASMILES      120.04449
+    N1013AC2  LFRPMASM     72.026694   FLAV*2         2.65943
+    N1013AC2  LF1013S1           98.   LF1013S2           98.
+    N1013AC2  CONTBOS2            1.   CONTORD2           -1.
+    N1013AC2  MSBOSLGA            1.   MSBOSORD            1.
+    N1013AC2  MSLGAORD            1.
+    N1013AC4  ACOCOSTS       1.90292   OBJECTIV       1.90292
+    N1013AC4  FUELAVAL        2.4431   SYSTDEPT            2.
+    N1013AC4  ACMILES         .91637   FLAV*4         2.65943
+    N1013AC4  ATONMILE      13.74556   LFTNMILE       6.87278
+    N1013AC4  LF1013C1         11.25   LF1013C2         11.25
+    N1013AC4  CONTBOS4            1.   CONTORD4           -1.
+    N1013AC4  MCLGAORD            1.
+    N1015AC2  ACOCOSTS       1.36416   OBJECTIV       1.36416
+    N1015AC2  FUELAVAL       1.49045   SYSTDEPT            1.
+    N1015AC2  ACMILES         .41715   ASMILES       54.64705
+    N1015AC2  LFRPMASM      32.78823   FLAV*2         1.25093
+    N1015AC2  LF1015S1           98.   NOPTCLE0            1.
+    N1015AC2  CONTLGA2            1.   CONTCLE2           -1.
+    N1015AC2  MSLGACLE            1.
+    N1015AC4  ACOCOSTS       1.14401   OBJECTIV       1.14401
+    N1015AC4  FUELAVAL       1.14359   SYSTDEPT            1.
+    N1015AC4  ACMILES         .41715   FLAV*4         1.25093
+    N1015AC4  ATONMILE       6.25729   LFTNMILE      3.128645
+    N1015AC4  LF1015C1         11.25   NOPTCLE0            1.
+    N1015AC4  CONTLGA4            1.   CONTCLE4           -1.
+    N1017AC2  ACOCOSTS       1.64736   OBJECTIV       1.64736
+    N1017AC2  FUELAVAL       2.21183   SYSTDEPT            1.
+    N1017AC2  ACMILES          .7308   ASMILES       95.73444
+    N1017AC2  LFRPMASM     57.440664   FLAV*2         1.85313
+    N1017AC2  LF1017S1           98.   CONTLGA2            1.
+    N1017AC2  CONTORD2           -1.   MSLGAORD            1.
+    N1017AC4  ACOCOSTS       1.33312   OBJECTIV       1.33312
+    N1017AC4  FUELAVAL       1.73951   SYSTDEPT            1.
+    N1017AC4  ACMILES          .7308   FLAV*4         1.85313
+    N1017AC4  ATONMILE      10.96196   LFTNMILE       5.48098
+    N1017AC4  LF1017C1         11.25   CONTLGA4            1.
+    N1017AC4  CONTORD4           -1.   MCLGAORD            1.
+    N1019AC2  ACOCOSTS       2.55381   OBJECTIV       2.55381
+    N1019AC2  FUELAVAL        2.7448   SYSTDEPT            2.
+    N1019AC2  ACMILES         .73165   ASMILES        95.8463
+    N1019AC2  LFRPMASM      57.50778   FLAV*2         2.30477
+    N1019AC2  LF1019S1           98.   LF1019S2           98.
+    N1019AC2  NOPTCLE0            2.   CONTLGA2            1.
+    N1019AC2  CONTORD2           -1.   MSLGACLE            1.
+    N1019AC2  MSLGAORD            1.   MSCLEORD            1.
+    N1019AC4  ACOCOSTS       2.14431   OBJECTIV       2.14431
+    N1019AC4  FUELAVAL       2.09214   SYSTDEPT            2.
+    N1019AC4  ACMILES         .73165   FLAV*4         2.30477
+    N1019AC4  ATONMILE      10.97477   LFTNMILE      5.487385
+    N1019AC4  LF1019C1         11.25   LF1019C2         11.25
+    N1019AC4  NOPTCLE0            2.   CONTLGA4            1.
+    N1019AC4  CONTORD4           -1.   MCLGAORD            1.
+    N1021AC1  ACOCOSTS       3.12679   OBJECTIV       3.12679
+    N1021AC1  FUELAVAL       4.07994   SYSTDEPT            1.
+    N1021AC1  ACMILES          .3145   ASMILES      128.00075
+    N1021AC1  LFRPMASM      76.80045   FLAV*1         1.34295
+    N1021AC1  ATONMILE       9.43495   LFTNMILE      4.717475
+    N1021AC1  LF1021S1          305.   LF1021B1           12.
+    N1021AC1  NOPTCLE0            1.   CONTCLE1            1.
+    N1021AC1  CONTORD1           -1.   MSCLEORD            1.
+    N1021AC2  ACOCOSTS       1.18965   OBJECTIV       1.18965
+    N1021AC2  FUELAVAL       1.25435   SYSTDEPT            1.
+    N1021AC2  ACMILES          .3145   ASMILES       41.19926
+    N1021AC2  LFRPMASM     24.719556   FLAV*2         1.05384
+    N1021AC2  LF1021S1           98.   NOPTCLE0            1.
+    N1021AC2  CONTCLE2            1.   CONTORD2           -1.
+    N1021AC2  MSCLEORD            1.
+    N1021AC3  ACOCOSTS       1.42472   OBJECTIV       1.42472
+    N1021AC3  FUELAVAL       1.55704   SYSTDEPT            1.
+    N1021AC3  ACMILES          .3145   FLAV*3         1.05384
+    N1021AC3  ATONMILE      12.57993   LFTNMILE      6.289965
+    N1021AC3  LF1021C1           30.   NOPTCLE0            1.
+    N1021AC3  CONTCLE3            1.   CONTORD3           -1.
+    N1021AC4  ACOCOSTS        1.0003   OBJECTIV        1.0003
+    N1021AC4  FUELAVAL        .94855   SYSTDEPT            1.
+    N1021AC4  ACMILES          .3145   FLAV*4         1.05384
+    N1021AC4  ATONMILE       4.71747   LFTNMILE      2.358735
+    N1021AC4  LF1021C1         11.25   NOPTCLE0            1.
+    N1021AC4  CONTCLE4            1.   CONTORD4           -1.
+    N1002AC1  ACOCOSTS       3.12679   OBJECTIV       3.12679
+    N1002AC1  FUELAVAL       4.07994   SYSTDEPT            1.
+    N1002AC1  ACMILES          .3145   ASMILES      128.00075
+    N1002AC1  LFRPMASM      76.80045   FLAV*1         1.34295
+    N1002AC1  ATONMILE       9.43495   LFTNMILE      4.717475
+    N1002AC1  LF1002S1          305.   LF1002B1           12.
+    N1002AC1  NOPTCLE0            1.   CONTORD1            1.
+    N1002AC1  CONTCLE1           -1.   MSORDCLE            1.
+    N1002AC2  ACOCOSTS       1.18965   OBJECTIV       1.18965
+    N1002AC2  FUELAVAL       1.25435   SYSTDEPT            1.
+    N1002AC2  ACMILES          .3145   ASMILES       41.19926
+    N1002AC2  LFRPMASM     24.719556   FLAV*2         1.05384
+    N1002AC2  LF1002S1           98.   NOPTCLE0            1.
+    N1002AC2  CONTORD2            1.   CONTCLE2           -1.
+    N1002AC2  MSORDCLE            1.
+    N1002AC3  ACOCOSTS       1.42472   OBJECTIV       1.42472
+    N1002AC3  FUELAVAL       1.55704   SYSTDEPT            1.
+    N1002AC3  ACMILES          .3145   FLAV*3         1.05384
+    N1002AC3  ATONMILE      12.57993   LFTNMILE      6.289965
+    N1002AC3  LF1002C1           30.   NOPTCLE0            1.
+    N1002AC3  CONTORD3            1.   CONTCLE3           -1.
+    N1002AC4  ACOCOSTS        1.0003   OBJECTIV        1.0003
+    N1002AC4  FUELAVAL        .94855   SYSTDEPT            1.
+    N1002AC4  ACMILES          .3145   FLAV*4         1.05384
+    N1002AC4  ATONMILE       4.71747   LFTNMILE      2.358735
+    N1002AC4  LF1002C1         11.25   NOPTCLE0            1.
+    N1002AC4  CONTORD4            1.   CONTCLE4           -1.
+    N1004AC2  ACOCOSTS       1.64736   OBJECTIV       1.64736
+    N1004AC2  FUELAVAL       2.21183   SYSTDEPT            1.
+    N1004AC2  ACMILES          .7308   ASMILES       95.73444
+    N1004AC2  LFRPMASM     57.440664   FLAV*2         1.85313
+    N1004AC2  LF1004S1           98.   CONTORD2            1.
+    N1004AC2  CONTLGA2           -1.   MSORDLGA            1.
+    N1004AC4  ACOCOSTS       1.33312   OBJECTIV       1.33312
+    N1004AC4  FUELAVAL       1.73951   SYSTDEPT            1.
+    N1004AC4  ACMILES          .7308   FLAV*4         1.85313
+    N1004AC4  ATONMILE      10.96196   LFTNMILE       5.48098
+    N1004AC4  LF1004C1         11.25   CONTORD4            1.
+    N1004AC4  CONTLGA4           -1.
+    N1006AC1  ACOCOSTS       7.17016   OBJECTIV       7.17016
+    N1006AC1  FUELAVAL       9.91398   SYSTDEPT            2.
+    N1006AC1  ACMILES         .87605   ASMILES      356.55371
+    N1006AC1  LFRPMASM    213.932226   FLAV*1         3.12813
+    N1006AC1  ATONMILE       26.2816   LFTNMILE       13.1408
+    N1006AC1  LF1006S1          305.   LF1006S2          305.
+    N1006AC1  LF1006B1           12.   LF1006B2           12.
+    N1006AC1  NOPTCLE0            2.   CONTORD1            1.
+    N1006AC1  CONTBOS1           -1.   MSORDCLE            1.
+    N1006AC1  MSORDBOS            1.   MSCLEBOS            1.
+    N1006AC2  ACOCOSTS       2.79929   OBJECTIV       2.79929
+    N1006AC2  FUELAVAL       3.07692   SYSTDEPT            2.
+    N1006AC2  ACMILES         .87605   ASMILES      114.76299
+    N1006AC2  LFRPMASM     68.857794   FLAV*2         2.58202
+    N1006AC2  LF1006S1           98.   LF1006S2           98.
+    N1006AC2  NOPTCLE0            2.   CONTORD2            1.
+    N1006AC2  CONTBOS2           -1.   MSORDCLE            1.
+    N1006AC2  MSORDBOS            1.   MSCLEBOS            1.
+    N1006AC3  ACOCOSTS       3.35591   OBJECTIV       3.35591
+    N1006AC3  FUELAVAL       3.83055   SYSTDEPT            2.
+    N1006AC3  ACMILES         .87605   FLAV*3         2.58202
+    N1006AC3  ATONMILE      35.04214   LFTNMILE      17.52107
+    N1006AC3  LF1006C1           30.   LF1006C2           30.
+    N1006AC3  NOPTCLE0            2.   CONTORD3            1.
+    N1006AC3  CONTBOS3           -1.   MCORDBOS            1.
+    N1006AC4  ACOCOSTS       2.34647   OBJECTIV       2.34647
+    N1006AC4  FUELAVAL        2.3665   SYSTDEPT            2.
+    N1006AC4  ACMILES         .87605   FLAV*4         2.58202
+    N1006AC4  ATONMILE       13.1408   LFTNMILE        6.5704
+    N1006AC4  LF1006C1         11.25   LF1006C2         11.25
+    N1006AC4  NOPTCLE0            2.   CONTORD4            1.
+    N1006AC4  CONTBOS4           -1.   MCORDBOS            1.
+    N1008AC2  ACOCOSTS       2.36783   OBJECTIV       2.36783
+    N1008AC2  FUELAVAL       3.16965   SYSTDEPT            2.
+    N1008AC2  ACMILES         .91637   ASMILES      120.04449
+    N1008AC2  LFRPMASM     72.026694   FLAV*2         2.65943
+    N1008AC2  LF1008S1           98.   LF1008S2           98.
+    N1008AC2  CONTORD2            1.   CONTBOS2           -1.
+    N1008AC2  MSORDLGA            1.   MSORDBOS            1.
+    N1008AC2  MSLGABOS            1.
+    N1008AC4  ACOCOSTS       1.90292   OBJECTIV       1.90292
+    N1008AC4  FUELAVAL        2.4431   SYSTDEPT            2.
+    N1008AC4  ACMILES         .91637   FLAV*4         2.65943
+    N1008AC4  ATONMILE      13.74556   LFTNMILE       6.87278
+    N1008AC4  LF1008C1         11.25   LF1008C2         11.25
+    N1008AC4  CONTORD4            1.   CONTBOS4           -1.
+    N1008AC4  MCORDBOS            1.
+    N1010AC2  ACOCOSTS       3.27428   OBJECTIV       3.27428
+    N1010AC2  FUELAVAL       3.70262   SYSTDEPT            3.
+    N1010AC2  ACMILES         .91722   ASMILES      120.15637
+    N1010AC2  LFRPMASM     72.093822   FLAV*2         3.11107
+    N1010AC2  LF1010S1           98.   LF1010S2           98.
+    N1010AC2  LF1010S3           98.   NOPTCLE0            2.
+    N1010AC2  CONTORD2            1.   CONTBOS2           -1.
+    N1010AC2  MSORDCLE            1.   MSORDLGA            1.
+    N1010AC2  MSORDBOS            1.   MSCLELGA            1.
+    N1010AC2  MSCLEBOS            1.   MSLGABOS            1.
+    N1010AC4  ACOCOSTS       2.71411   OBJECTIV       2.71411
+    N1010AC4  FUELAVAL       2.79573   SYSTDEPT            3.
+    N1010AC4  ACMILES         .91722   FLAV*4         3.11107
+    N1010AC4  ATONMILE      13.75836   LFTNMILE       6.87918
+    N1010AC4  LF1010C1         11.25   LF1010C2         11.25
+    N1010AC4  LF1010C3         11.25   NOPTCLE0            2.
+    N1010AC4  CONTORD4            1.   CONTBOS4           -1.
+    N1010AC4  MCORDBOS            1.
+    N1012AC2  ACOCOSTS       1.36416   OBJECTIV       1.36416
+    N1012AC2  FUELAVAL       1.49045   SYSTDEPT            1.
+    N1012AC2  ACMILES         .41715   ASMILES       54.64705
+    N1012AC2  LFRPMASM      32.78823   FLAV*2         1.25093
+    N1012AC2  LF1012S1           98.   NOPTCLE0            1.
+    N1012AC2  CONTCLE2            1.   CONTLGA2           -1.
+    N1012AC2  MSCLELGA            1.
+    N1012AC4  ACOCOSTS       1.14401   OBJECTIV       1.14401
+    N1012AC4  FUELAVAL       1.14359   SYSTDEPT            1.
+    N1012AC4  ACMILES         .41715   FLAV*4         1.25093
+    N1012AC4  ATONMILE       6.25729   LFTNMILE      3.128645
+    N1012AC4  LF1012C1         11.25   NOPTCLE0            1.
+    N1012AC4  CONTCLE4            1.   CONTLGA4           -1.
+    N1014AC2  ACOCOSTS       2.08463   OBJECTIV       2.08463
+    N1014AC2  FUELAVAL       2.44827   SYSTDEPT            2.
+    N1014AC2  ACMILES         .60273   ASMILES       78.95706
+    N1014AC2  LFRPMASM     47.374236   FLAV*2         2.05723
+    N1014AC2  LF1014S1           98.   LF1014S2           98.
+    N1014AC2  NOPTCLE0            1.   CONTCLE2            1.
+    N1014AC2  CONTBOS2           -1.   MSCLELGA            1.
+    N1014AC2  MSCLEBOS            1.   MSLGABOS            1.
+    N1014AC4  ACOCOSTS       1.71382   OBJECTIV       1.71382
+    N1014AC4  FUELAVAL       1.84718   SYSTDEPT            2.
+    N1014AC4  ACMILES         .60273   FLAV*4         2.05723
+    N1014AC4  ATONMILE       9.04089   LFTNMILE      4.520445
+    N1014AC4  LF1014C1         11.25   LF1014C2         11.25
+    N1014AC4  NOPTCLE0            1.   CONTCLE4            1.
+    N1014AC4  CONTBOS4           -1.
+    N1100AC2  ACOCOSTS       6.07357   OBJECTIV       6.07357
+    N1100AC2  FUELAVAL       6.77953   SYSTDEPT            5.
+    N1100AC2  ACMILES        1.79328   ASMILES      234.91937
+    N1100AC2  LFRPMASM    140.951622   FLAV*2         5.69309
+    N1100AC2  LF1100S1           98.   LF1100S2           98.
+    N1100AC2  LF1100S3           98.   LF1100S4           98.
+    N1100AC2  LF1100S5           98.   NOPTCLE0            4.
+    N1100AC2  MSBOSLGA            1.   MSBOSCLE            1.
+    N1100AC2  MSBOSORD            1.   MSLGACLE            1.
+    N1100AC2  MSLGAORD            1.   MSLGABOS            1.
+    N1100AC2  MSCLEORD            1.   MSORDCLE            1.
+    N1100AC2  MSORDBOS            1.   MSCLEBOS            1.
+    N1100AC4  ACOCOSTS       5.06059   OBJECTIV       5.06059
+    N1100AC4  FUELAVAL       5.16223   SYSTDEPT            5.
+    N1100AC4  ACMILES        1.79328   FLAV*4         5.69309
+    N1100AC4  ATONMILE      26.89915   LFTNMILE     13.449575
+    N1100AC4  LF1100C1         11.25   LF1100C2         11.25
+    N1100AC4  LF1100C3         11.25   LF1100C4         11.25
+    N1100AC4  LF1100C5         11.25   NOPTCLE0            4.
+    N1100AC4  MCLGAORD            1.   MCORDBOS            1.
+    N1102AC2  ACOCOSTS       5.16712   OBJECTIV       5.16712
+    N1102AC2  FUELAVAL       6.24657   SYSTDEPT            4.
+    N1102AC2  ACMILES        1.79242   ASMILES      234.80756
+    N1102AC2  LFRPMASM    140.884536   FLAV*2         5.24145
+    N1102AC2  LF1102S1           98.   LF1102S2           98.
+    N1102AC2  LF1102S3           98.   LF1102S4           98.
+    N1102AC2  NOPTCLE0            2.   MSBOSCLE            1.
+    N1102AC2  MSBOSORD            1.   MSBOSLGA            1.
+    N1102AC2  MSCLEORD            1.   MSCLELGA            1.
+    N1102AC2  MSCLEBOS            1.   MSORDLGA            1.
+    N1102AC2  MSORDBOS            1.   MSLGABOS            1.
+    N1102AC4  ACOCOSTS       4.24939   OBJECTIV       4.24939
+    N1102AC4  FUELAVAL        4.8096   SYSTDEPT            4.
+    N1102AC4  ACMILES        1.79242   FLAV*4         5.24145
+    N1102AC4  ATONMILE      26.88635   LFTNMILE     13.443175
+    N1102AC4  LF1102C1         11.25   LF1102C2         11.25
+    N1102AC4  LF1102C3         11.25   LF1102C4         11.25
+    N1102AC4  NOPTCLE0            2.   MCORDBOS            1.
+    N1200AC2  ACOCOSTS        .72047   OBJECTIV        .72047
+    N1200AC2  FUELAVAL        .95782   SYSTDEPT            1.
+    N1200AC2  ACMILES         .18557   ASMILES       24.31007
+    N1200AC2  LFRPMASM     14.586042   FLAV*2           .8063
+    N1200AC2  LF1200S1           98.   CONTBOS2            1.
+    N1200AC2  CONTLGA2           -1.   MSBOSLGA            1.
+    N1200AC4  ACOCOSTS         .5698   OBJECTIV         .5698
+    N1200AC4  FUELAVAL        .70359   SYSTDEPT            1.
+    N1200AC4  ACMILES         .18557   FLAV*4           .8063
+    N1200AC4  ATONMILE        2.7836   LFTNMILE        1.3918
+    N1200AC4  LF1200C1         11.25   CONTBOS4            1.
+    N1200AC4  CONTLGA4           -1.
+    N1201AC2  ACOCOSTS        .72047   OBJECTIV        .72047
+    N1201AC2  FUELAVAL        .95782   SYSTDEPT            1.
+    N1201AC2  ACMILES         .18557   ASMILES       24.31007
+    N1201AC2  LFRPMASM     14.586042   FLAV*2           .8063
+    N1201AC2  LF1201S1           98.   CONTLGA2            1.
+    N1201AC2  CONTBOS2           -1.   MSLGABOS            1.
+    N1201AC4  ACOCOSTS         .5698   OBJECTIV         .5698
+    N1201AC4  FUELAVAL        .70359   SYSTDEPT            1.
+    N1201AC4  ACMILES         .18557   FLAV*4           .8063
+    N1201AC4  ATONMILE        2.7836   LFTNMILE        1.3918
+    N1201AC4  LF1201C1         11.25   CONTLGA4            1.
+    N1201AC4  CONTBOS4           -1.
+RHS
+    RHS1      FUELAVAL       100000.   PASSNGRS         9431.
+    RHS1      SYSTDEPT           50.   FLAV*1             30.
+    RHS1      FLAV*2             45.   DMBOSORD          302.
+    RHS1      DMBOSLGA         2352.   DMBOSCLE          142.
+    RHS1      DMORDBOS          302.   DMORDLGA          515.
+    RHS1      DMORDCLE          619.   DMLGABOS         2743.
+    RHS1      DMLGAORD          712.   DMLGACLE          517.
+    RHS1      DMCLEBOS          131.   DMCLEORD          712.
+    RHS1      DMCLELGA          409.   MSBOSORD            3.
+    RHS1      MSBOSLGA            7.   MSBOSCLE            1.
+    RHS1      MSORDBOS            3.   MSORDLGA            4.
+    RHS1      MSORDCLE            5.   MSLGABOS            7.
+    RHS1      MSLGAORD            5.   MSLGACLE            4.
+    RHS1      MSCLEBOS            1.   MSCLEORD            6.
+    RHS1      MSCLELGA            3.   MCORDBOS            1.
+    RHS1      MCLGAORD            2.   DCBOSORD           12.
+    RHS1      DCBOSCLE           16.   DCORDBOS           24.
+    RHS1      DCORDLGA           13.   DCLGAORD           45.
+    RHS1      DCLGACLE           16.   DCCLELGA            5.
+    RHS1      NOPTCLE0           24.
+RANGES
+    RANGE1    DMBOSORD           61.   DMBOSLGA          471.
+    RANGE1    DMBOSCLE           29.   DMORDBOS           61.
+    RANGE1    DMORDLGA          103.   DMORDCLE          124.
+    RANGE1    DMLGABOS          549.   DMLGAORD          143.
+    RANGE1    DMLGACLE          104.   DMCLEBOS           27.
+    RANGE1    DMCLEORD          143.   DMCLELGA           82.
+    RANGE1    DCBOSORD           12.   DCBOSCLE           3.2
+    RANGE1    DCORDBOS           4.8   DCORDLGA           2.6
+    RANGE1    DCLGAORD            9.   DCLGACLE           3.2
+    RANGE1    DCCLELGA            5.
+BOUNDS
+ LO INTBOU    GRDTIMN1         -100.
+ UP INTBOU    GRDTIMN1            0.
+ LO INTBOU    GRDTIMN2          -90.
+ UP INTBOU    GRDTIMN2            0.
+ LO INTBOU    GRDTIMN3          -45.
+ UP INTBOU    GRDTIMN3            0.
+ LO INTBOU    GRDTIMN4          -45.
+ UP INTBOU    GRDTIMN4            0.
+ UP INTBOU    N1003AC1            7.
+ UP INTBOU    N1003AC2            7.
+ UP INTBOU    N1003AC3            2.
+ UP INTBOU    N1003AC4            2.
+ UP INTBOU    N1005AC1            7.
+ UP INTBOU    N1005AC2            7.
+ UP INTBOU    N1005AC3            2.
+ UP INTBOU    N1005AC4            2.
+ UP INTBOU    N1011AC1            7.
+ UP INTBOU    N1011AC2            7.
+ UP INTBOU    N1011AC3            2.
+ UP INTBOU    N1011AC4            2.
+ UP INTBOU    N1013AC2           14.
+ UP INTBOU    N1013AC4            2.
+ UP INTBOU    N1015AC2            7.
+ UP INTBOU    N1015AC4            2.
+ UP INTBOU    N1017AC2            7.
+ UP INTBOU    N1017AC4            2.
+ UP INTBOU    N1019AC2            7.
+ UP INTBOU    N1019AC4            2.
+ UP INTBOU    N1021AC1            7.
+ UP INTBOU    N1021AC2            7.
+ UP INTBOU    N1021AC3            2.
+ UP INTBOU    N1021AC4            2.
+ UP INTBOU    N1002AC1            7.
+ UP INTBOU    N1002AC2            7.
+ UP INTBOU    N1002AC3            2.
+ UP INTBOU    N1002AC4            2.
+ UP INTBOU    N1004AC2            7.
+ UP INTBOU    N1004AC4            2.
+ UP INTBOU    N1006AC1            7.
+ UP INTBOU    N1006AC2            7.
+ UP INTBOU    N1006AC3            2.
+ UP INTBOU    N1006AC4            2.
+ UP INTBOU    N1008AC2           14.
+ UP INTBOU    N1008AC4            2.
+ UP INTBOU    N1010AC2           14.
+ UP INTBOU    N1010AC4            2.
+ UP INTBOU    N1012AC2            7.
+ UP INTBOU    N1012AC4            2.
+ UP INTBOU    N1014AC2           14.
+ UP INTBOU    N1014AC4            2.
+ UP INTBOU    N1100AC2            7.
+ UP INTBOU    N1100AC4            7.
+ UP INTBOU    N1102AC2            7.
+ UP INTBOU    N1102AC4            7.
+ UP INTBOU    N1200AC2           14.
+ UP INTBOU    N1200AC4            7.
+ UP INTBOU    N1201AC2           14.
+ UP INTBOU    N1201AC4            7.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/ex1.mps b/demos/ppl_lpsol/examples/ex1.mps
new file mode 100644
index 0000000..125f3d9
--- /dev/null
+++ b/demos/ppl_lpsol/examples/ex1.mps
@@ -0,0 +1,19 @@
+NAME          from_lp_file
+ROWS
+ N  r_000000
+ L  C1
+ L  r_000002
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    x1        r_000000  1
+    x1        C1        2
+    x1        r_000002  -4
+    x2        r_000000  -2
+    x2        C1        1
+    x2        r_000002  4
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    RHS       C1        5
+    RHS       r_000002  5
+BOUNDS
+ENDATA
diff --git a/demos/ppl_lpsol/examples/kb2.mps b/demos/ppl_lpsol/examples/kb2.mps
new file mode 100644
index 0000000..625ceba
--- /dev/null
+++ b/demos/ppl_lpsol/examples/kb2.mps
@@ -0,0 +1,219 @@
+NAME          KB2
+ROWS
+ N  FAT7..J.
+ E  BAL...BW
+ E  BHC...BW
+ E  BLC...BW
+ E  BLV...BW
+ E  BN4...BW
+ E  BP8...BW
+ E  BTO...BW
+ E  B3E...BW
+ E  B3P...BW
+ E  B3R...BW
+ E  B3T...BW
+ E  B3E.VOBW
+ E  B3P.VOBW
+ E  B3R.VOBW
+ G  HMH.3EBW
+ G  HML.3EBW
+ G  HMM.3EBW
+ G  HRH.3EBW
+ G  HRL.3EBW
+ G  HRM.3EBW
+ G  HMH.3RBW
+ G  HML.3RBW
+ G  HMM.3RBW
+ G  HRH.3RBW
+ G  HRL.3RBW
+ G  HRM.3RBW
+ G  NOI.3EBW
+ G  NOI.3PBW
+ G  NOI.3RBW
+ E  WMO.3PBW
+ E  WRO.3PBW
+ L  XPB.3ABW
+ L  XCV.3EBW
+ L  XPB.3EBW
+ L  XRV.3EBW
+ L  X12.3EBW
+ L  XCV.3PBW
+ L  XRV.3PBW
+ L  X12.3PBW
+ L  XCV.3RBW
+ L  XPB.3RBW
+ L  XRV.3RBW
+ L  X12.3RBW
+COLUMNS
+    BAL.3EBW  BAL...BW           -1.   B3E.VOBW            1.
+    BAL.3EBW  XCV.3EBW            6.   XRV.3EBW            4.
+    BAL.3EBW  X12.3EBW          50.3   HRL.3EBW      98.70277
+    BAL.3EBW  HML.3EBW      94.63568   HRM.3EBW     102.02191
+    BAL.3EBW  HMM.3EBW      98.08976   HRH.3EBW      103.0581
+    BAL.3EBW  HMH.3EBW      99.18559
+    BHC.3EBW  BHC...BW           -1.   B3E.VOBW            1.
+    BHC.3EBW  XCV.3EBW           -2.   XRV.3EBW            .5
+    BHC.3EBW  X12.3EBW         -15.6   HRL.3EBW      92.89535
+    BHC.3EBW  HML.3EBW      79.40534   HRM.3EBW      94.57094
+    BHC.3EBW  HMM.3EBW      81.47009   HRH.3EBW      95.02163
+    BHC.3EBW  HMH.3EBW      82.04308
+    BLC.3EBW  BLC...BW           -1.   B3E.VOBW            1.
+    BLC.3EBW  XCV.3EBW            7.   XRV.3EBW           4.5
+    BLC.3EBW  X12.3EBW          57.9   HRL.3EBW      95.38345
+    BLC.3EBW  HML.3EBW      80.37873   HRM.3EBW      97.97965
+    BLC.3EBW  HMM.3EBW      83.22026   HRH.3EBW      98.64634
+    BLC.3EBW  HMH.3EBW       83.9937
+    BLV.3EBW  BLV...BW           -1.   B3E.VOBW            1.
+    BLV.3EBW  XCV.3EBW           14.   XRV.3EBW           7.2
+    BLV.3EBW  X12.3EBW         102.3   HRL.3EBW       82.8797
+    BLV.3EBW  HML.3EBW      80.36789   HRM.3EBW      87.33298
+    BLV.3EBW  HMM.3EBW       84.5191   HRH.3EBW      88.46612
+    BLV.3EBW  HMH.3EBW      85.61385
+    BN4.3EBW  BN4...BW           -1.   B3E.VOBW            1.
+    BN4.3EBW  XCV.3EBW           80.   XRV.3EBW           70.
+    BN4.3EBW  X12.3EBW          113.   HRL.3EBW      97.32996
+    BN4.3EBW  HML.3EBW      92.71594   HRM.3EBW        100.65
+    BN4.3EBW  HMM.3EBW      96.86628   HRH.3EBW     101.66321
+    BN4.3EBW  HMH.3EBW      98.06433
+    BP8.3EBW  BP8...BW           -1.   B3E.VOBW            1.
+    BP8.3EBW  XCV.3EBW            4.   XRV.3EBW           3.6
+    BP8.3EBW  X12.3EBW          28.9   HRL.3EBW     101.17309
+    BP8.3EBW  HML.3EBW      90.03844   HRM.3EBW     102.21363
+    BP8.3EBW  HMM.3EBW      91.26611   HRH.3EBW     102.51818
+    BP8.3EBW  HMH.3EBW      91.62642
+    BTO.3EBW  BTO...BW           -1.   B3E.VOBW            1.
+    BTO.3EBW  XCV.3EBW           -1.   XRV.3EBW           1.2
+    BTO.3EBW  X12.3EBW            5.   HRL.3EBW     105.47666
+    BTO.3EBW  HML.3EBW      89.10432   HRM.3EBW     106.21918
+    BTO.3EBW  HMM.3EBW      90.14887   HRH.3EBW     106.46719
+    BTO.3EBW  HMH.3EBW      90.49629
+    BAL.3PBW  BAL...BW           -1.   B3P.VOBW            1.
+    BAL.3PBW  XCV.3PBW            6.   XRV.3PBW            4.
+    BAL.3PBW  X12.3PBW          50.3   WRO.3PBW      96.13556
+    BAL.3PBW  WMO.3PBW      91.96313
+    BHC.3PBW  BHC...BW           -1.   B3P.VOBW            1.
+    BHC.3PBW  XCV.3PBW           -2.   XRV.3PBW            .5
+    BHC.3PBW  X12.3PBW         -15.6   WRO.3PBW      90.99637
+    BHC.3PBW  WMO.3PBW      78.09095
+    BLC.3PBW  BLC...BW           -1.   B3P.VOBW            1.
+    BLC.3PBW  XCV.3PBW            7.   XRV.3PBW           4.5
+    BLC.3PBW  X12.3PBW          57.9   WRO.3PBW      93.95665
+    BLC.3PBW  WMO.3PBW      80.74635
+    BLV.3PBW  BLV...BW           -1.   B3P.VOBW            1.
+    BLV.3PBW  XCV.3PBW           14.   XRV.3PBW           7.2
+    BLV.3PBW  X12.3PBW         102.3   WRO.3PBW      79.78002
+    BLV.3PBW  WMO.3PBW      77.37441
+    BN4.3PBW  BN4...BW           -1.   B3P.VOBW            1.
+    BN4.3PBW  XCV.3PBW           80.   XRV.3PBW           70.
+    BN4.3PBW  X12.3PBW          113.   WRO.3PBW      94.11062
+    BN4.3PBW  WMO.3PBW      88.35436
+    BP8.3PBW  BP8...BW           -1.   B3P.VOBW            1.
+    BP8.3PBW  XCV.3PBW            4.   XRV.3PBW           3.6
+    BP8.3PBW  X12.3PBW          28.9   WRO.3PBW      99.83178
+    BP8.3PBW  WMO.3PBW      88.58029
+    BTO.3PBW  BTO...BW           -1.   B3P.VOBW            1.
+    BTO.3PBW  XCV.3PBW           -1.   XRV.3PBW           1.2
+    BTO.3PBW  X12.3PBW            5.   WRO.3PBW     105.07558
+    BTO.3PBW  WMO.3PBW      88.18188
+    BAL.3RBW  BAL...BW           -1.   B3R.VOBW            1.
+    BAL.3RBW  XCV.3RBW            6.   XRV.3RBW            4.
+    BAL.3RBW  X12.3RBW          50.3   HRL.3RBW      99.19039
+    BAL.3RBW  HML.3RBW      95.17073   HRM.3RBW      101.0885
+    BAL.3RBW  HMM.3RBW      97.11016   HRH.3RBW      103.0581
+    BAL.3RBW  HMH.3RBW      99.18559
+    BHC.3RBW  BHC...BW           -1.   B3R.VOBW            1.
+    BHC.3RBW  XCV.3RBW           -2.   XRV.3RBW            .5
+    BHC.3RBW  X12.3RBW         -15.6   HRL.3RBW      93.16124
+    BHC.3RBW  HML.3RBW      79.72867   HRM.3RBW      94.14769
+    BHC.3RBW  HMM.3RBW      80.94047   HRH.3RBW      95.02163
+    BHC.3RBW  HMH.3RBW      82.04308
+    BLC.3RBW  BLC...BW           -1.   B3R.VOBW            1.
+    BLC.3RBW  XCV.3RBW            7.   XRV.3RBW           4.5
+    BLC.3RBW  X12.3RBW          57.9   HRL.3RBW      95.80861
+    BLC.3RBW  HML.3RBW      80.82888   HRM.3RBW      97.34183
+    BLC.3RBW  HMM.3RBW      82.49926   HRH.3RBW      98.64634
+    BLC.3RBW  HMH.3RBW       83.9937
+    BLV.3RBW  BLV...BW           -1.   B3R.VOBW            1.
+    BLV.3RBW  XCV.3RBW           14.   XRV.3RBW           7.2
+    BLV.3RBW  X12.3RBW         102.3   HRL.3RBW      83.61375
+    BLV.3RBW  HML.3RBW      81.03825   HRM.3RBW      86.24515
+    BLV.3RBW  HMM.3RBW      83.48458   HRH.3RBW      88.46612
+    BLV.3RBW  HMH.3RBW      85.61385
+    BN4.3RBW  BN4...BW           -1.   B3R.VOBW            1.
+    BN4.3RBW  XCV.3RBW           80.   XRV.3RBW           70.
+    BN4.3RBW  X12.3RBW          113.   HRL.3RBW      97.86876
+    BN4.3RBW  HML.3RBW      93.41749   HRM.3RBW      99.77765
+    BN4.3RBW  HMM.3RBW      95.86635   HRH.3RBW     101.66321
+    BN4.3RBW  HMH.3RBW      98.06433
+    BP8.3RBW  BP8...BW           -1.   B3R.VOBW            1.
+    BP8.3RBW  XCV.3RBW            4.   XRV.3RBW           3.6
+    BP8.3RBW  X12.3RBW          28.9   HRL.3RBW     101.32905
+    BP8.3RBW  HML.3RBW      90.22411   HRM.3RBW     101.93754
+    BP8.3RBW  HMM.3RBW      90.94112   HRH.3RBW     102.51818
+    BP8.3RBW  HMH.3RBW      91.62642
+    BTO.3RBW  BTO...BW           -1.   B3R.VOBW            1.
+    BTO.3RBW  XCV.3RBW           -1.   XRV.3RBW           1.2
+    BTO.3RBW  X12.3RBW            5.   HRL.3RBW     105.58392
+    BTO.3RBW  HML.3RBW      89.25587   HRM.3RBW      106.0019
+    BTO.3RBW  HMM.3RBW      89.84584   HRH.3RBW     106.46719
+    BTO.3RBW  HMH.3RBW      90.49629
+    D3T...BW  B3T...BW           -1.   FAT7..J.         -16.5
+    EAL...BW  BAL...BW            1.
+    EHC...BW  BHC...BW            1.
+    ELC...BW  BLC...BW            1.
+    ELV...BW  BLV...BW            1.
+    EN4...BW  BN4...BW            1.   FAT7..J.           12.
+    EP8...BW  BP8...BW            1.
+    ETO...BW  BTO...BW            1.   FAT7..J.           16.
+    M3..3TBW  B3T...BW            1.   B3E...BW          -.29
+    M3..3TBW  B3P...BW          -.17   B3R...BW          -.54
+    QPB73EBW  FAT7..J.        .08757   XPB.3EBW            1.
+    QPB73EBW  HRL.3EBW       2.52143   HML.3EBW       3.42918
+    QPB73EBW  HRM.3EBW       1.54954   HMM.3EBW       1.55751
+    QPB73EBW  HRH.3EBW       1.27141   HMH.3EBW       1.23842
+    QPB73EBW  XPB.3ABW            1.
+    QVO73EBW  B3E...BW            1.   B3E.VOBW           -1.
+    QVO73EBW  XCV.3EBW          -16.   XRV.3EBW          -12.
+    QVO73EBW  X12.3EBW          -61.   NOI.3EBW       -107.52
+    QVO73EBW  XPB.3EBW          -1.7   HRL.3EBW      -1.00857
+    QVO73EBW  HML.3EBW      -1.37167   HRM.3EBW       -2.0144
+    QVO73EBW  HMM.3EBW      -2.02477   HRH.3EBW      -2.16139
+    QVO73EBW  HMH.3EBW      -2.10531   XPB.3ABW          -1.5
+    QVO73PBW  B3P...BW            1.   B3P.VOBW           -1.
+    QVO73PBW  XCV.3PBW          -16.   XRV.3PBW          -12.
+    QVO73PBW  X12.3PBW          -61.   NOI.3PBW        -97.41
+    QVO73PBW  XPB.3ABW          -1.5
+    QPB73RBW  FAT7..J.        .08757   XPB.3RBW            1.
+    QPB73RBW  HRL.3RBW       4.31949   HML.3RBW       4.41873
+    QPB73RBW  HRM.3RBW       2.62696   HMM.3RBW       2.74531
+    QPB73RBW  HRH.3RBW       1.64391   HMH.3RBW       1.75028
+    QPB73RBW  XPB.3ABW            1.
+    QVO73RBW  B3R...BW            1.   B3R.VOBW           -1.
+    QVO73RBW  XCV.3RBW          -16.   XRV.3RBW          -12.
+    QVO73RBW  X12.3RBW          -61.   NOI.3RBW         -98.5
+    QVO73RBW  XPB.3RBW          -1.7   HRL.3RBW      -2.15975
+    QVO73RBW  HML.3RBW      -2.20937   HRM.3RBW      -2.62696
+    QVO73RBW  HMM.3RBW      -2.74531   HRH.3RBW      -2.79464
+    QVO73RBW  HMH.3RBW      -2.97548   XPB.3ABW          -1.5
+    WMO73EBW  NOI.3EBW           .73   HML.3EBW           -1.
+    WMO73EBW  HMM.3EBW           -1.   HMH.3EBW           -1.
+    WRO73EBW  NOI.3EBW           .41   HRL.3EBW           -1.
+    WRO73EBW  HRM.3EBW           -1.   HRH.3EBW           -1.
+    WMO73PBW  WMO.3PBW           -1.   NOI.3PBW           .84
+    WRO73PBW  WRO.3PBW           -1.   NOI.3PBW           .27
+    WMO73RBW  NOI.3RBW           .81   HML.3RBW           -1.
+    WMO73RBW  HMM.3RBW           -1.   HMH.3RBW           -1.
+    WRO73RBW  NOI.3RBW           .31   HRL.3RBW           -1.
+    WRO73RBW  HRM.3RBW           -1.   HRH.3RBW           -1.
+RHS
+BOUNDS
+ UP 77BOUND   BHC.3EBW           10.
+ UP 77BOUND   D3T...BW          200.
+ UP 77BOUND   EAL...BW           10.
+ UP 77BOUND   EHC...BW           20.
+ UP 77BOUND   ELC...BW           25.
+ UP 77BOUND   ELV...BW           12.
+ UP 77BOUND   EN4...BW          100.
+ UP 77BOUND   EP8...BW           35.
+ UP 77BOUND   ETO...BW            5.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/mip.mps b/demos/ppl_lpsol/examples/mip.mps
new file mode 100644
index 0000000..d2da1a3
--- /dev/null
+++ b/demos/ppl_lpsol/examples/mip.mps
@@ -0,0 +1,27 @@
+NAME          SAMP2
+ROWS
+ N  Z
+ G  R1
+ G  R2
+ G  R3
+COLUMNS
+    X1        R1                2.0    R2                 1.0
+    X1        R3                5.0    Z                  3.0
+    X2        R1               -1.0    R2                -1.0
+    X2        R3                3.0    Z                  7.0
+    X3        R1                1.0    R2                -6.0
+    X3        Z                -1.0
+    X4        R1               -1.0    R2                 4.0
+    X4        R3                1.0    Z                  1.0
+RHS
+    RHS1      R1                1.0
+    RHS1      R2                8.0
+    RHS1      R3                5.0
+BOUNDS
+ UP BND1      X1                4.0
+ LO BND1      X2                2.0
+ UI BND1      X2                5.0
+ BV BND1      X3
+ LO BND1      X4                3.0
+ UP BND1      X4                8.0
+ENDATA
diff --git a/demos/ppl_lpsol/examples/sample.mps b/demos/ppl_lpsol/examples/sample.mps
new file mode 100644
index 0000000..fa3cffe
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sample.mps
@@ -0,0 +1,22 @@
+* Problem:    sample
+* Rows:       3
+* Columns:    3
+* Non-zeros:  12
+*
+NAME          sample
+ROWS
+ N  R______0
+ L  p
+ L  q
+ L  r
+COLUMNS
+    x1        R______0           -10   r                    2
+              q                   10   p                    1
+    x2        R______0            -6   r                    2
+              q                    4   p                    1
+    x3        R______0            -4   r                    6
+              q                    5   p                    1
+RHS
+              p                  100   q                  600
+              r                  300
+ENDATA
diff --git a/demos/ppl_lpsol/examples/sc105.mps b/demos/ppl_lpsol/examples/sc105.mps
new file mode 100644
index 0000000..4de391e
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sc105.mps
@@ -0,0 +1,296 @@
+NAME          SC105
+ROWS
+ N  MAXIM
+ L  ROW00001
+ L  ROW00002
+ L  ROW00003
+ E  ROW00004
+ E  ROW00005
+ E  ROW00006
+ E  ROW00007
+ L  ROW00008
+ L  ROW00009
+ L  ROW00010
+ L  ROW00011
+ L  ROW00012
+ L  ROW00013
+ E  ROW00014
+ E  ROW00015
+ E  ROW00016
+ E  ROW00017
+ E  ROW00018
+ L  ROW00019
+ L  ROW00020
+ L  ROW00021
+ L  ROW00022
+ L  ROW00023
+ L  ROW00024
+ E  ROW00025
+ E  ROW00026
+ E  ROW00027
+ E  ROW00028
+ E  ROW00029
+ L  ROW00030
+ L  ROW00031
+ L  ROW00032
+ L  ROW00033
+ L  ROW00034
+ L  ROW00035
+ E  ROW00036
+ E  ROW00037
+ E  ROW00038
+ E  ROW00039
+ E  ROW00040
+ L  ROW00041
+ L  ROW00042
+ L  ROW00043
+ L  ROW00044
+ L  ROW00045
+ L  ROW00046
+ E  ROW00047
+ E  ROW00048
+ E  ROW00049
+ E  ROW00050
+ E  ROW00051
+ L  ROW00052
+ L  ROW00053
+ L  ROW00054
+ L  ROW00055
+ L  ROW00056
+ L  ROW00057
+ E  ROW00058
+ E  ROW00059
+ E  ROW00060
+ E  ROW00061
+ E  ROW00062
+ L  ROW00063
+ L  ROW00064
+ L  ROW00065
+ L  ROW00066
+ L  ROW00067
+ L  ROW00068
+ E  ROW00069
+ E  ROW00070
+ E  ROW00071
+ E  ROW00072
+ E  ROW00073
+ L  ROW00074
+ L  ROW00075
+ L  ROW00076
+ L  ROW00077
+ L  ROW00078
+ L  ROW00079
+ E  ROW00080
+ E  ROW00081
+ E  ROW00082
+ E  ROW00083
+ E  ROW00084
+ L  ROW00085
+ L  ROW00086
+ L  ROW00087
+ L  ROW00088
+ L  ROW00089
+ L  ROW00090
+ E  ROW00091
+ E  ROW00092
+ E  ROW00093
+ E  ROW00094
+ E  ROW00095
+ L  ROW00096
+ L  ROW00097
+ L  ROW00098
+ L  ROW00099
+ L  ROW00100
+ L  ROW00101
+ E  ROW00102
+ L  ROW00103
+ L  ROW00104
+ L  ROW00105
+COLUMNS
+    COL00001  ROW00001            2.   ROW00002            1.
+    COL00001  ROW00005           -1.
+    COL00002  ROW00001            1.   ROW00002            2.
+    COL00002  ROW00006           -1.
+    COL00003  ROW00001           1.5   ROW00002           1.5
+    COL00003  ROW00007           -1.
+    COL00004  MAXIM              -1.   ROW00004            1.
+    COL00004  ROW00014           1.1
+    COL00005  ROW00004           -1.   ROW00013            1.
+    COL00005  ROW00015            1.
+    COL00006  ROW00005            1.   ROW00008           -1.
+    COL00006  ROW00016           -1.
+    COL00007  ROW00006            1.   ROW00009           -1.
+    COL00007  ROW00017           -1.
+    COL00008  ROW00007            1.   ROW00010           -1.
+    COL00008  ROW00018           -1.
+    COL00009  ROW00008            1.   ROW00011           -1.
+    COL00010  ROW00009            1.   ROW00012           -1.
+    COL00011  ROW00010            1.   ROW00013           -1.
+    COL00012  ROW00011            2.   ROW00012            1.
+    COL00012  ROW00016           -1.
+    COL00013  ROW00011            1.   ROW00012            2.
+    COL00013  ROW00017           -1.
+    COL00014  ROW00011           1.5   ROW00012           1.5
+    COL00014  ROW00018           -1.
+    COL00015  ROW00014           -1.   ROW00015            1.
+    COL00015  ROW00025           1.1
+    COL00016  ROW00015           -1.   ROW00024            1.
+    COL00016  ROW00026            1.
+    COL00017  ROW00016            1.   ROW00019           -1.
+    COL00017  ROW00027           -1.
+    COL00018  ROW00017            1.   ROW00020           -1.
+    COL00018  ROW00028           -1.
+    COL00019  ROW00018            1.   ROW00021           -1.
+    COL00019  ROW00029           -1.
+    COL00020  ROW00019            1.   ROW00022           -1.
+    COL00021  ROW00020            1.   ROW00023           -1.
+    COL00022  ROW00021            1.   ROW00024           -1.
+    COL00023  ROW00022            2.   ROW00023            1.
+    COL00023  ROW00027           -1.
+    COL00024  ROW00022            1.   ROW00023            2.
+    COL00024  ROW00028           -1.
+    COL00025  ROW00022           1.5   ROW00023           1.5
+    COL00025  ROW00029           -1.
+    COL00026  ROW00025           -1.   ROW00026            1.
+    COL00026  ROW00036           1.1
+    COL00027  ROW00026           -1.   ROW00035            1.
+    COL00027  ROW00037            1.
+    COL00028  ROW00027            1.   ROW00030           -1.
+    COL00028  ROW00038           -1.
+    COL00029  ROW00028            1.   ROW00031           -1.
+    COL00029  ROW00039           -1.
+    COL00030  ROW00029            1.   ROW00032           -1.
+    COL00030  ROW00040           -1.
+    COL00031  ROW00030            1.   ROW00033           -1.
+    COL00032  ROW00031            1.   ROW00034           -1.
+    COL00033  ROW00032            1.   ROW00035           -1.
+    COL00034  ROW00033            2.   ROW00034            1.
+    COL00034  ROW00038           -1.
+    COL00035  ROW00033            1.   ROW00034            2.
+    COL00035  ROW00039           -1.
+    COL00036  ROW00033           1.5   ROW00034           1.5
+    COL00036  ROW00040           -1.
+    COL00037  ROW00036           -1.   ROW00037            1.
+    COL00037  ROW00047           1.1
+    COL00038  ROW00037           -1.   ROW00046            1.
+    COL00038  ROW00048            1.
+    COL00039  ROW00038            1.   ROW00041           -1.
+    COL00039  ROW00049           -1.
+    COL00040  ROW00039            1.   ROW00042           -1.
+    COL00040  ROW00050           -1.
+    COL00041  ROW00040            1.   ROW00043           -1.
+    COL00041  ROW00051           -1.
+    COL00042  ROW00041            1.   ROW00044           -1.
+    COL00043  ROW00042            1.   ROW00045           -1.
+    COL00044  ROW00043            1.   ROW00046           -1.
+    COL00045  ROW00044            2.   ROW00045            1.
+    COL00045  ROW00049           -1.
+    COL00046  ROW00044            1.   ROW00045            2.
+    COL00046  ROW00050           -1.
+    COL00047  ROW00044           1.5   ROW00045           1.5
+    COL00047  ROW00051           -1.
+    COL00048  ROW00047           -1.   ROW00048            1.
+    COL00048  ROW00058           1.1
+    COL00049  ROW00048           -1.   ROW00057            1.
+    COL00049  ROW00059            1.
+    COL00050  ROW00049            1.   ROW00052           -1.
+    COL00050  ROW00060           -1.
+    COL00051  ROW00050            1.   ROW00053           -1.
+    COL00051  ROW00061           -1.
+    COL00052  ROW00051            1.   ROW00054           -1.
+    COL00052  ROW00062           -1.
+    COL00053  ROW00052            1.   ROW00055           -1.
+    COL00054  ROW00053            1.   ROW00056           -1.
+    COL00055  ROW00054            1.   ROW00057           -1.
+    COL00056  ROW00055            2.   ROW00056            1.
+    COL00056  ROW00060           -1.
+    COL00057  ROW00055            1.   ROW00056            2.
+    COL00057  ROW00061           -1.
+    COL00058  ROW00055           1.5   ROW00056           1.5
+    COL00058  ROW00062           -1.
+    COL00059  ROW00058           -1.   ROW00059            1.
+    COL00059  ROW00069           1.1
+    COL00060  ROW00059           -1.   ROW00068            1.
+    COL00060  ROW00070            1.
+    COL00061  ROW00060            1.   ROW00063           -1.
+    COL00061  ROW00071           -1.
+    COL00062  ROW00061            1.   ROW00064           -1.
+    COL00062  ROW00072           -1.
+    COL00063  ROW00062            1.   ROW00065           -1.
+    COL00063  ROW00073           -1.
+    COL00064  ROW00063            1.   ROW00066           -1.
+    COL00065  ROW00064            1.   ROW00067           -1.
+    COL00066  ROW00065            1.   ROW00068           -1.
+    COL00067  ROW00066            2.   ROW00067            1.
+    COL00067  ROW00071           -1.
+    COL00068  ROW00066            1.   ROW00067            2.
+    COL00068  ROW00072           -1.
+    COL00069  ROW00066           1.5   ROW00067           1.5
+    COL00069  ROW00073           -1.
+    COL00070  ROW00069           -1.   ROW00070            1.
+    COL00070  ROW00080           1.1
+    COL00071  ROW00070           -1.   ROW00079            1.
+    COL00071  ROW00081            1.
+    COL00072  ROW00071            1.   ROW00074           -1.
+    COL00072  ROW00082           -1.
+    COL00073  ROW00072            1.   ROW00075           -1.
+    COL00073  ROW00083           -1.
+    COL00074  ROW00073            1.   ROW00076           -1.
+    COL00074  ROW00084           -1.
+    COL00075  ROW00074            1.   ROW00077           -1.
+    COL00076  ROW00075            1.   ROW00078           -1.
+    COL00077  ROW00076            1.   ROW00079           -1.
+    COL00078  ROW00077            2.   ROW00078            1.
+    COL00078  ROW00082           -1.
+    COL00079  ROW00077            1.   ROW00078            2.
+    COL00079  ROW00083           -1.
+    COL00080  ROW00077           1.5   ROW00078           1.5
+    COL00080  ROW00084           -1.
+    COL00081  ROW00080           -1.   ROW00081            1.
+    COL00081  ROW00091           1.1
+    COL00082  ROW00081           -1.   ROW00090            1.
+    COL00082  ROW00092            1.
+    COL00083  ROW00082            1.   ROW00085           -1.
+    COL00083  ROW00093           -1.
+    COL00084  ROW00083            1.   ROW00086           -1.
+    COL00084  ROW00094           -1.
+    COL00085  ROW00084            1.   ROW00087           -1.
+    COL00085  ROW00095           -1.
+    COL00086  ROW00085            1.   ROW00088           -1.
+    COL00087  ROW00086            1.   ROW00089           -1.
+    COL00088  ROW00087            1.   ROW00090           -1.
+    COL00089  ROW00088            2.   ROW00089            1.
+    COL00089  ROW00093           -1.
+    COL00090  ROW00088            1.   ROW00089            2.
+    COL00090  ROW00094           -1.
+    COL00091  ROW00088           1.5   ROW00089           1.5
+    COL00091  ROW00095           -1.
+    COL00092  ROW00091           -1.   ROW00092            1.
+    COL00092  ROW00102           1.1
+    COL00093  ROW00092           -1.   ROW00101            1.
+    COL00094  ROW00093            1.   ROW00096           -1.
+    COL00095  ROW00094            1.   ROW00097           -1.
+    COL00096  ROW00095            1.   ROW00098           -1.
+    COL00097  ROW00096            1.   ROW00099           -1.
+    COL00098  ROW00097            1.   ROW00100           -1.
+    COL00099  ROW00098            1.   ROW00101           -1.
+    COL00100  ROW00099            2.   ROW00100            1.
+    COL00100  ROW00103           -.8   ROW00104            .1
+    COL00101  ROW00099            1.   ROW00100            2.
+    COL00101  ROW00103            .1   ROW00104           -.8
+    COL00102  ROW00099           1.5   ROW00100           1.5
+    COL00102  ROW00103           .15   ROW00104           .15
+    COL00102  ROW00105           -1.
+    COL00103  ROW00102           -1.   ROW00105            1.
+RHS
+    CONST     ROW00001          200.   ROW00002          100.
+    CONST     ROW00011          200.   ROW00012          100.
+    CONST     ROW00022          200.   ROW00023          100.
+    CONST     ROW00033          200.   ROW00034          100.
+    CONST     ROW00044          200.   ROW00045          100.
+    CONST     ROW00055          200.   ROW00056          100.
+    CONST     ROW00066          200.   ROW00067          100.
+    CONST     ROW00077          200.   ROW00078          100.
+    CONST     ROW00088          200.   ROW00089          100.
+    CONST     ROW00099          200.   ROW00100          100.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/sc50a.mps b/demos/ppl_lpsol/examples/sc50a.mps
new file mode 100644
index 0000000..a59623f
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sc50a.mps
@@ -0,0 +1,141 @@
+NAME          SC50A
+ROWS
+ N  MAXIM
+ L  ROW00001
+ L  ROW00002
+ L  ROW00003
+ E  ROW00004
+ E  ROW00005
+ E  ROW00006
+ E  ROW00007
+ L  ROW00008
+ L  ROW00009
+ L  ROW00010
+ L  ROW00011
+ L  ROW00012
+ L  ROW00013
+ E  ROW00014
+ E  ROW00015
+ E  ROW00016
+ E  ROW00017
+ E  ROW00018
+ L  ROW00019
+ L  ROW00020
+ L  ROW00021
+ L  ROW00022
+ L  ROW00023
+ L  ROW00024
+ E  ROW00025
+ E  ROW00026
+ E  ROW00027
+ E  ROW00028
+ E  ROW00029
+ L  ROW00030
+ L  ROW00031
+ L  ROW00032
+ L  ROW00033
+ L  ROW00034
+ L  ROW00035
+ E  ROW00036
+ E  ROW00037
+ E  ROW00038
+ E  ROW00039
+ E  ROW00040
+ L  ROW00041
+ L  ROW00042
+ L  ROW00043
+ L  ROW00044
+ L  ROW00045
+ L  ROW00046
+ E  ROW00047
+ L  ROW00048
+ L  ROW00049
+ L  ROW00050
+COLUMNS
+    COL00001  ROW00001            2.   ROW00002            1.
+    COL00001  ROW00005           -1.
+    COL00002  ROW00001            1.   ROW00002            2.
+    COL00002  ROW00006           -1.
+    COL00003  ROW00001           1.5   ROW00002           1.5
+    COL00003  ROW00007           -1.
+    COL00004  MAXIM              -1.   ROW00004            1.
+    COL00004  ROW00014           1.1
+    COL00005  ROW00004           -1.   ROW00013            1.
+    COL00005  ROW00015            1.
+    COL00006  ROW00005            1.   ROW00008           -1.
+    COL00006  ROW00016           -1.
+    COL00007  ROW00006            1.   ROW00009           -1.
+    COL00007  ROW00017           -1.
+    COL00008  ROW00007            1.   ROW00010           -1.
+    COL00008  ROW00018           -1.
+    COL00009  ROW00008            1.   ROW00011           -1.
+    COL00010  ROW00009            1.   ROW00012           -1.
+    COL00011  ROW00010            1.   ROW00013           -1.
+    COL00012  ROW00011            2.   ROW00012            1.
+    COL00012  ROW00016           -1.
+    COL00013  ROW00011            1.   ROW00012            2.
+    COL00013  ROW00017           -1.
+    COL00014  ROW00011           1.5   ROW00012           1.5
+    COL00014  ROW00018           -1.
+    COL00015  ROW00014           -1.   ROW00015            1.
+    COL00015  ROW00025           1.1
+    COL00016  ROW00015           -1.   ROW00024            1.
+    COL00016  ROW00026            1.
+    COL00017  ROW00016            1.   ROW00019           -1.
+    COL00017  ROW00027           -1.
+    COL00018  ROW00017            1.   ROW00020           -1.
+    COL00018  ROW00028           -1.
+    COL00019  ROW00018            1.   ROW00021           -1.
+    COL00019  ROW00029           -1.
+    COL00020  ROW00019            1.   ROW00022           -1.
+    COL00021  ROW00020            1.   ROW00023           -1.
+    COL00022  ROW00021            1.   ROW00024           -1.
+    COL00023  ROW00022            2.   ROW00023            1.
+    COL00023  ROW00027           -1.
+    COL00024  ROW00022            1.   ROW00023            2.
+    COL00024  ROW00028           -1.
+    COL00025  ROW00022           1.5   ROW00023           1.5
+    COL00025  ROW00029           -1.
+    COL00026  ROW00025           -1.   ROW00026            1.
+    COL00026  ROW00036           1.1
+    COL00027  ROW00026           -1.   ROW00035            1.
+    COL00027  ROW00037            1.
+    COL00028  ROW00027            1.   ROW00030           -1.
+    COL00028  ROW00038           -1.
+    COL00029  ROW00028            1.   ROW00031           -1.
+    COL00029  ROW00039           -1.
+    COL00030  ROW00029            1.   ROW00032           -1.
+    COL00030  ROW00040           -1.
+    COL00031  ROW00030            1.   ROW00033           -1.
+    COL00032  ROW00031            1.   ROW00034           -1.
+    COL00033  ROW00032            1.   ROW00035           -1.
+    COL00034  ROW00033            2.   ROW00034            1.
+    COL00034  ROW00038           -1.
+    COL00035  ROW00033            1.   ROW00034            2.
+    COL00035  ROW00039           -1.
+    COL00036  ROW00033           1.5   ROW00034           1.5
+    COL00036  ROW00040           -1.
+    COL00037  ROW00036           -1.   ROW00037            1.
+    COL00037  ROW00047           1.1
+    COL00038  ROW00037           -1.   ROW00046            1.
+    COL00039  ROW00038            1.   ROW00041           -1.
+    COL00040  ROW00039            1.   ROW00042           -1.
+    COL00041  ROW00040            1.   ROW00043           -1.
+    COL00042  ROW00041            1.   ROW00044           -1.
+    COL00043  ROW00042            1.   ROW00045           -1.
+    COL00044  ROW00043            1.   ROW00046           -1.
+    COL00045  ROW00044            2.   ROW00045            1.
+    COL00045  ROW00048           -.8   ROW00049            .1
+    COL00046  ROW00044            1.   ROW00045            2.
+    COL00046  ROW00048            .1   ROW00049           -.8
+    COL00047  ROW00044           1.5   ROW00045           1.5
+    COL00047  ROW00048           .15   ROW00049           .15
+    COL00047  ROW00050           -1.
+    COL00048  ROW00047           -1.   ROW00050            1.
+RHS
+    CONST     ROW00001          170.   ROW00002          130.
+    CONST     ROW00011          170.   ROW00012          130.
+    CONST     ROW00022          170.   ROW00023          130.
+    CONST     ROW00033          170.   ROW00034          130.
+    CONST     ROW00044          170.   ROW00045          130.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/sc50b.mps b/demos/ppl_lpsol/examples/sc50b.mps
new file mode 100644
index 0000000..8d517ef
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sc50b.mps
@@ -0,0 +1,127 @@
+NAME          SC50B
+ROWS
+ N  MAXIM
+ L  ROW00001
+ L  ROW00002
+ L  ROW00003
+ E  ROW00004
+ E  ROW00005
+ E  ROW00006
+ E  ROW00007
+ L  ROW00008
+ L  ROW00009
+ L  ROW00010
+ L  ROW00011
+ L  ROW00012
+ L  ROW00013
+ E  ROW00014
+ E  ROW00015
+ E  ROW00016
+ E  ROW00017
+ E  ROW00018
+ L  ROW00019
+ L  ROW00020
+ L  ROW00021
+ L  ROW00022
+ L  ROW00023
+ L  ROW00024
+ E  ROW00025
+ E  ROW00026
+ E  ROW00027
+ E  ROW00028
+ E  ROW00029
+ L  ROW00030
+ L  ROW00031
+ L  ROW00032
+ L  ROW00033
+ L  ROW00034
+ L  ROW00035
+ E  ROW00036
+ E  ROW00037
+ E  ROW00038
+ E  ROW00039
+ E  ROW00040
+ L  ROW00041
+ L  ROW00042
+ L  ROW00043
+ L  ROW00044
+ L  ROW00045
+ L  ROW00046
+ E  ROW00047
+ L  ROW00048
+ L  ROW00049
+ L  ROW00050
+COLUMNS
+    COL00001  ROW00001            3.   ROW00005           -1.
+    COL00002  ROW00001            3.   ROW00006           -1.
+    COL00003  ROW00001            3.   ROW00007           -1.
+    COL00004  MAXIM              -1.   ROW00004            1.
+    COL00004  ROW00014           1.1
+    COL00005  ROW00004           -1.   ROW00012            .4
+    COL00005  ROW00013            .6   ROW00015            1.
+    COL00006  ROW00005            1.   ROW00008           -1.
+    COL00006  ROW00016           -1.
+    COL00007  ROW00006            1.   ROW00009           -1.
+    COL00007  ROW00017           -1.
+    COL00008  ROW00007            1.   ROW00010           -1.
+    COL00008  ROW00018           -1.
+    COL00009  ROW00008            1.   ROW00011           -1.
+    COL00010  ROW00009            1.   ROW00012           -1.
+    COL00011  ROW00010            1.   ROW00013           -1.
+    COL00012  ROW00011            3.   ROW00016           -1.
+    COL00013  ROW00011            3.   ROW00017           -1.
+    COL00014  ROW00011            3.   ROW00018           -1.
+    COL00015  ROW00014           -1.   ROW00015            1.
+    COL00015  ROW00025           1.1
+    COL00016  ROW00015           -1.   ROW00023            .4
+    COL00016  ROW00024            .6   ROW00026            1.
+    COL00017  ROW00016            1.   ROW00019           -1.
+    COL00017  ROW00027           -1.
+    COL00018  ROW00017            1.   ROW00020           -1.
+    COL00018  ROW00028           -1.
+    COL00019  ROW00018            1.   ROW00021           -1.
+    COL00019  ROW00029           -1.
+    COL00020  ROW00019            1.   ROW00022           -1.
+    COL00021  ROW00020            1.   ROW00023           -1.
+    COL00022  ROW00021            1.   ROW00024           -1.
+    COL00023  ROW00022            3.   ROW00027           -1.
+    COL00024  ROW00022            3.   ROW00028           -1.
+    COL00025  ROW00022            3.   ROW00029           -1.
+    COL00026  ROW00025           -1.   ROW00026            1.
+    COL00026  ROW00036           1.1
+    COL00027  ROW00026           -1.   ROW00034            .4
+    COL00027  ROW00035            .6   ROW00037            1.
+    COL00028  ROW00027            1.   ROW00030           -1.
+    COL00028  ROW00038           -1.
+    COL00029  ROW00028            1.   ROW00031           -1.
+    COL00029  ROW00039           -1.
+    COL00030  ROW00029            1.   ROW00032           -1.
+    COL00030  ROW00040           -1.
+    COL00031  ROW00030            1.   ROW00033           -1.
+    COL00032  ROW00031            1.   ROW00034           -1.
+    COL00033  ROW00032            1.   ROW00035           -1.
+    COL00034  ROW00033            3.   ROW00038           -1.
+    COL00035  ROW00033            3.   ROW00039           -1.
+    COL00036  ROW00033            3.   ROW00040           -1.
+    COL00037  ROW00036           -1.   ROW00037            1.
+    COL00037  ROW00047           1.1
+    COL00038  ROW00037           -1.   ROW00045            .4
+    COL00038  ROW00046            .6
+    COL00039  ROW00038            1.   ROW00041           -1.
+    COL00040  ROW00039            1.   ROW00042           -1.
+    COL00041  ROW00040            1.   ROW00043           -1.
+    COL00042  ROW00041            1.   ROW00044           -1.
+    COL00043  ROW00042            1.   ROW00045           -1.
+    COL00044  ROW00043            1.   ROW00046           -1.
+    COL00045  ROW00044            3.   ROW00048           -.7
+    COL00046  ROW00044            3.   ROW00048            .3
+    COL00046  ROW00049           -1.
+    COL00047  ROW00044            3.   ROW00048            .3
+    COL00047  ROW00050           -1.
+    COL00048  ROW00047           -1.   ROW00049            .4
+    COL00048  ROW00050            .6
+RHS
+    CONST     ROW00001          300.   ROW00011          300.
+    CONST     ROW00022          300.   ROW00033          300.
+    CONST     ROW00044          300.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/ship08l.mps b/demos/ppl_lpsol/examples/ship08l.mps
new file mode 100644
index 0000000..afb09b8
--- /dev/null
+++ b/demos/ppl_lpsol/examples/ship08l.mps
@@ -0,0 +1,9547 @@
+NAME          SHIP08L
+ROWS
+ N  COST
+ G  REGMIN
+ L  REGMAX
+ G  OVRMIN
+ L  OVRMAX
+ G  REGMIN01
+ G  REGMIN02
+ E  REGMIN03
+ G  REGMIN04
+ E  REGMIN05
+ E  REGMIN06
+ E  REGMIN07
+ E  REGMIN08
+ L  REGMAX01
+ L  REGMAX02
+ L  REGMAX04
+ G  OVRMIN01
+ G  OVRMIN02
+ E  OVRMIN03
+ G  OVRMIN04
+ E  OVRMIN05
+ E  OVRMIN06
+ E  OVRMIN07
+ E  OVRMIN08
+ L  OVRMAX01
+ L  OVRMAX02
+ L  OVRMAX04
+ L  TRAN0101
+ L  TRAN0102
+ L  TRAN0103
+ L  TRAN0104
+ L  TRAN0105
+ L  TRAN0106
+ L  TRAN0107
+ L  TRAN0108
+ L  TRAN0201
+ L  TRAN0202
+ L  TRAN0203
+ L  TRAN0204
+ L  TRAN0205
+ L  TRAN0206
+ L  TRAN0207
+ L  TRAN0208
+ L  TRAN0301
+ L  TRAN0302
+ L  TRAN0303
+ L  TRAN0304
+ L  TRAN0305
+ L  TRAN0306
+ L  TRAN0307
+ L  TRAN0308
+ L  TRAN0401
+ L  TRAN0402
+ L  TRAN0403
+ L  TRAN0404
+ L  TRAN0405
+ L  TRAN0406
+ L  TRAN0407
+ L  TRAN0408
+ L  TRAN0501
+ L  TRAN0502
+ L  TRAN0503
+ L  TRAN0504
+ L  TRAN0505
+ L  TRAN0506
+ L  TRAN0507
+ L  TRAN0508
+ L  TRAN0601
+ L  TRAN0602
+ L  TRAN0603
+ L  TRAN0604
+ L  TRAN0605
+ L  TRAN0606
+ L  TRAN0607
+ L  TRAN0608
+ L  TRAN0701
+ L  TRAN0702
+ L  TRAN0703
+ L  TRAN0704
+ L  TRAN0705
+ L  TRAN0706
+ L  TRAN0707
+ L  TRAN0708
+ L  TRAN0801
+ L  TRAN0802
+ L  TRAN0803
+ L  TRAN0804
+ L  TRAN0805
+ L  TRAN0806
+ L  TRAN0807
+ L  TRAN0808
+ E  BAL0101
+ E  BAL0102
+ E  BAL0103
+ E  BAL0104
+ E  BAL0105
+ E  BAL0106
+ E  BAL0107
+ E  BAL0108
+ E  BAL0109
+ E  BAL0110
+ E  BAL0111
+ E  BAL0112
+ E  BAL0113
+ E  BAL0114
+ E  BAL0115
+ E  BAL0116
+ E  BAL0117
+ E  BAL0118
+ E  BAL0119
+ E  BAL0120
+ E  BAL0121
+ E  BAL0122
+ E  BAL0123
+ E  BAL0124
+ E  BAL0125
+ E  BAL0126
+ E  BAL0127
+ E  BAL0128
+ E  BAL0129
+ E  BAL0130
+ E  BAL0131
+ E  BAL0132
+ E  BAL0133
+ E  BAL0134
+ E  BAL0135
+ E  BAL0136
+ E  BAL0137
+ E  BAL0138
+ E  BAL0139
+ E  BAL0140
+ E  BAL0141
+ E  BAL0142
+ E  BAL0143
+ E  BAL0144
+ E  BAL0145
+ E  BAL0146
+ E  BAL0147
+ E  BAL0148
+ E  BAL0149
+ E  BAL0150
+ E  BAL0151
+ E  BAL0152
+ E  BAL0153
+ E  BAL0154
+ E  BAL0155
+ E  BAL0156
+ E  BAL0157
+ E  BAL0158
+ E  BAL0159
+ E  BAL0160
+ E  BAL0161
+ E  BAL0162
+ E  BAL0163
+ E  BAL0164
+ E  BAL0165
+ E  BAL0166
+ E  BAL0167
+ E  BAL0168
+ E  BAL0169
+ E  BAL0170
+ E  BAL0171
+ E  BAL0172
+ E  BAL0173
+ E  BAL0174
+ E  BAL0175
+ E  BAL0176
+ E  BAL0177
+ E  BAL0178
+ E  BAL0179
+ E  BAL0180
+ E  BAL0181
+ E  BAL0182
+ E  BAL0183
+ E  BAL0184
+ E  BAL0185
+ E  BAL0186
+ E  BAL0201
+ E  BAL0202
+ E  BAL0203
+ E  BAL0204
+ E  BAL0205
+ E  BAL0206
+ E  BAL0207
+ E  BAL0208
+ E  BAL0209
+ E  BAL0210
+ E  BAL0211
+ E  BAL0212
+ E  BAL0213
+ E  BAL0214
+ E  BAL0215
+ E  BAL0216
+ E  BAL0217
+ E  BAL0218
+ E  BAL0219
+ E  BAL0220
+ E  BAL0221
+ E  BAL0222
+ E  BAL0223
+ E  BAL0224
+ E  BAL0225
+ E  BAL0226
+ E  BAL0227
+ E  BAL0228
+ E  BAL0229
+ E  BAL0230
+ E  BAL0231
+ E  BAL0232
+ E  BAL0233
+ E  BAL0234
+ E  BAL0235
+ E  BAL0236
+ E  BAL0237
+ E  BAL0238
+ E  BAL0239
+ E  BAL0240
+ E  BAL0241
+ E  BAL0242
+ E  BAL0243
+ E  BAL0244
+ E  BAL0245
+ E  BAL0246
+ E  BAL0247
+ E  BAL0248
+ E  BAL0249
+ E  BAL0250
+ E  BAL0251
+ E  BAL0252
+ E  BAL0253
+ E  BAL0254
+ E  BAL0255
+ E  BAL0256
+ E  BAL0257
+ E  BAL0258
+ E  BAL0259
+ E  BAL0260
+ E  BAL0261
+ E  BAL0262
+ E  BAL0263
+ E  BAL0264
+ E  BAL0265
+ E  BAL0266
+ E  BAL0267
+ E  BAL0268
+ E  BAL0269
+ E  BAL0270
+ E  BAL0271
+ E  BAL0272
+ E  BAL0273
+ E  BAL0274
+ E  BAL0275
+ E  BAL0276
+ E  BAL0277
+ E  BAL0278
+ E  BAL0279
+ E  BAL0280
+ E  BAL0281
+ E  BAL0282
+ E  BAL0283
+ E  BAL0284
+ E  BAL0285
+ E  BAL0286
+ E  BAL0301
+ E  BAL0302
+ E  BAL0303
+ E  BAL0304
+ E  BAL0305
+ E  BAL0306
+ E  BAL0307
+ E  BAL0308
+ E  BAL0309
+ E  BAL0310
+ E  BAL0311
+ E  BAL0312
+ E  BAL0313
+ E  BAL0314
+ E  BAL0315
+ E  BAL0316
+ E  BAL0317
+ E  BAL0318
+ E  BAL0319
+ E  BAL0320
+ E  BAL0321
+ E  BAL0322
+ E  BAL0323
+ E  BAL0324
+ E  BAL0325
+ E  BAL0326
+ E  BAL0327
+ E  BAL0328
+ E  BAL0329
+ E  BAL0330
+ E  BAL0331
+ E  BAL0332
+ E  BAL0333
+ E  BAL0334
+ E  BAL0335
+ E  BAL0336
+ E  BAL0337
+ E  BAL0338
+ E  BAL0339
+ E  BAL0340
+ E  BAL0341
+ E  BAL0342
+ E  BAL0343
+ E  BAL0344
+ E  BAL0345
+ E  BAL0346
+ E  BAL0347
+ E  BAL0348
+ E  BAL0349
+ E  BAL0350
+ E  BAL0351
+ E  BAL0352
+ E  BAL0353
+ E  BAL0354
+ E  BAL0355
+ E  BAL0356
+ E  BAL0357
+ E  BAL0358
+ E  BAL0359
+ E  BAL0360
+ E  BAL0361
+ E  BAL0362
+ E  BAL0363
+ E  BAL0364
+ E  BAL0365
+ E  BAL0366
+ E  BAL0367
+ E  BAL0368
+ E  BAL0369
+ E  BAL0370
+ E  BAL0371
+ E  BAL0372
+ E  BAL0373
+ E  BAL0374
+ E  BAL0375
+ E  BAL0376
+ E  BAL0377
+ E  BAL0378
+ E  BAL0379
+ E  BAL0380
+ E  BAL0381
+ E  BAL0382
+ E  BAL0383
+ E  BAL0384
+ E  BAL0385
+ E  BAL0386
+ E  BAL0401
+ E  BAL0402
+ E  BAL0403
+ E  BAL0404
+ E  BAL0405
+ E  BAL0406
+ E  BAL0407
+ E  BAL0408
+ E  BAL0409
+ E  BAL0410
+ E  BAL0411
+ E  BAL0412
+ E  BAL0413
+ E  BAL0414
+ E  BAL0415
+ E  BAL0416
+ E  BAL0417
+ E  BAL0418
+ E  BAL0419
+ E  BAL0420
+ E  BAL0421
+ E  BAL0422
+ E  BAL0423
+ E  BAL0424
+ E  BAL0425
+ E  BAL0426
+ E  BAL0427
+ E  BAL0428
+ E  BAL0429
+ E  BAL0430
+ E  BAL0431
+ E  BAL0432
+ E  BAL0433
+ E  BAL0434
+ E  BAL0435
+ E  BAL0436
+ E  BAL0437
+ E  BAL0438
+ E  BAL0439
+ E  BAL0440
+ E  BAL0441
+ E  BAL0442
+ E  BAL0443
+ E  BAL0444
+ E  BAL0445
+ E  BAL0446
+ E  BAL0447
+ E  BAL0448
+ E  BAL0449
+ E  BAL0450
+ E  BAL0451
+ E  BAL0452
+ E  BAL0453
+ E  BAL0454
+ E  BAL0455
+ E  BAL0456
+ E  BAL0457
+ E  BAL0458
+ E  BAL0459
+ E  BAL0460
+ E  BAL0461
+ E  BAL0462
+ E  BAL0463
+ E  BAL0464
+ E  BAL0465
+ E  BAL0466
+ E  BAL0467
+ E  BAL0468
+ E  BAL0469
+ E  BAL0470
+ E  BAL0471
+ E  BAL0472
+ E  BAL0473
+ E  BAL0474
+ E  BAL0475
+ E  BAL0476
+ E  BAL0477
+ E  BAL0478
+ E  BAL0479
+ E  BAL0480
+ E  BAL0481
+ E  BAL0482
+ E  BAL0483
+ E  BAL0484
+ E  BAL0485
+ E  BAL0486
+ E  BAL0501
+ E  BAL0502
+ E  BAL0503
+ E  BAL0504
+ E  BAL0505
+ E  BAL0506
+ E  BAL0507
+ E  BAL0508
+ E  BAL0509
+ E  BAL0510
+ E  BAL0511
+ E  BAL0512
+ E  BAL0513
+ E  BAL0514
+ E  BAL0515
+ E  BAL0516
+ E  BAL0517
+ E  BAL0518
+ E  BAL0519
+ E  BAL0520
+ E  BAL0521
+ E  BAL0522
+ E  BAL0523
+ E  BAL0524
+ E  BAL0525
+ E  BAL0526
+ E  BAL0527
+ E  BAL0528
+ E  BAL0529
+ E  BAL0530
+ E  BAL0531
+ E  BAL0532
+ E  BAL0533
+ E  BAL0534
+ E  BAL0535
+ E  BAL0536
+ E  BAL0537
+ E  BAL0538
+ E  BAL0539
+ E  BAL0540
+ E  BAL0541
+ E  BAL0542
+ E  BAL0543
+ E  BAL0544
+ E  BAL0545
+ E  BAL0546
+ E  BAL0547
+ E  BAL0548
+ E  BAL0549
+ E  BAL0550
+ E  BAL0551
+ E  BAL0552
+ E  BAL0553
+ E  BAL0554
+ E  BAL0555
+ E  BAL0556
+ E  BAL0557
+ E  BAL0558
+ E  BAL0559
+ E  BAL0560
+ E  BAL0561
+ E  BAL0562
+ E  BAL0563
+ E  BAL0564
+ E  BAL0565
+ E  BAL0566
+ E  BAL0567
+ E  BAL0568
+ E  BAL0569
+ E  BAL0570
+ E  BAL0571
+ E  BAL0572
+ E  BAL0573
+ E  BAL0574
+ E  BAL0575
+ E  BAL0576
+ E  BAL0577
+ E  BAL0578
+ E  BAL0579
+ E  BAL0580
+ E  BAL0581
+ E  BAL0582
+ E  BAL0583
+ E  BAL0584
+ E  BAL0585
+ E  BAL0586
+ E  BAL0601
+ E  BAL0602
+ E  BAL0603
+ E  BAL0604
+ E  BAL0605
+ E  BAL0606
+ E  BAL0607
+ E  BAL0608
+ E  BAL0609
+ E  BAL0610
+ E  BAL0611
+ E  BAL0612
+ E  BAL0613
+ E  BAL0614
+ E  BAL0615
+ E  BAL0616
+ E  BAL0617
+ E  BAL0618
+ E  BAL0619
+ E  BAL0620
+ E  BAL0621
+ E  BAL0622
+ E  BAL0623
+ E  BAL0624
+ E  BAL0625
+ E  BAL0626
+ E  BAL0627
+ E  BAL0628
+ E  BAL0629
+ E  BAL0630
+ E  BAL0631
+ E  BAL0632
+ E  BAL0633
+ E  BAL0634
+ E  BAL0635
+ E  BAL0636
+ E  BAL0637
+ E  BAL0638
+ E  BAL0639
+ E  BAL0640
+ E  BAL0641
+ E  BAL0642
+ E  BAL0643
+ E  BAL0644
+ E  BAL0645
+ E  BAL0646
+ E  BAL0647
+ E  BAL0648
+ E  BAL0649
+ E  BAL0650
+ E  BAL0651
+ E  BAL0652
+ E  BAL0653
+ E  BAL0654
+ E  BAL0655
+ E  BAL0656
+ E  BAL0657
+ E  BAL0658
+ E  BAL0659
+ E  BAL0660
+ E  BAL0661
+ E  BAL0662
+ E  BAL0663
+ E  BAL0664
+ E  BAL0665
+ E  BAL0666
+ E  BAL0667
+ E  BAL0668
+ E  BAL0669
+ E  BAL0670
+ E  BAL0671
+ E  BAL0672
+ E  BAL0673
+ E  BAL0674
+ E  BAL0675
+ E  BAL0676
+ E  BAL0677
+ E  BAL0678
+ E  BAL0679
+ E  BAL0680
+ E  BAL0681
+ E  BAL0682
+ E  BAL0683
+ E  BAL0684
+ E  BAL0685
+ E  BAL0686
+ E  BAL0701
+ E  BAL0702
+ E  BAL0703
+ E  BAL0704
+ E  BAL0705
+ E  BAL0706
+ E  BAL0707
+ E  BAL0708
+ E  BAL0709
+ E  BAL0710
+ E  BAL0711
+ E  BAL0712
+ E  BAL0713
+ E  BAL0714
+ E  BAL0715
+ E  BAL0716
+ E  BAL0717
+ E  BAL0718
+ E  BAL0719
+ E  BAL0720
+ E  BAL0721
+ E  BAL0722
+ E  BAL0723
+ E  BAL0724
+ E  BAL0725
+ E  BAL0726
+ E  BAL0727
+ E  BAL0728
+ E  BAL0729
+ E  BAL0730
+ E  BAL0731
+ E  BAL0732
+ E  BAL0733
+ E  BAL0734
+ E  BAL0735
+ E  BAL0736
+ E  BAL0737
+ E  BAL0738
+ E  BAL0739
+ E  BAL0740
+ E  BAL0741
+ E  BAL0742
+ E  BAL0743
+ E  BAL0744
+ E  BAL0745
+ E  BAL0746
+ E  BAL0747
+ E  BAL0748
+ E  BAL0749
+ E  BAL0750
+ E  BAL0751
+ E  BAL0752
+ E  BAL0753
+ E  BAL0754
+ E  BAL0755
+ E  BAL0756
+ E  BAL0757
+ E  BAL0758
+ E  BAL0759
+ E  BAL0760
+ E  BAL0761
+ E  BAL0762
+ E  BAL0763
+ E  BAL0764
+ E  BAL0765
+ E  BAL0766
+ E  BAL0767
+ E  BAL0768
+ E  BAL0769
+ E  BAL0770
+ E  BAL0771
+ E  BAL0772
+ E  BAL0773
+ E  BAL0774
+ E  BAL0775
+ E  BAL0776
+ E  BAL0777
+ E  BAL0778
+ E  BAL0779
+ E  BAL0780
+ E  BAL0781
+ E  BAL0782
+ E  BAL0783
+ E  BAL0784
+ E  BAL0785
+ E  BAL0786
+ E  BAL0801
+ E  BAL0802
+ E  BAL0803
+ E  BAL0804
+ E  BAL0805
+ E  BAL0806
+ E  BAL0807
+ E  BAL0808
+ E  BAL0809
+ E  BAL0810
+ E  BAL0811
+ E  BAL0812
+ E  BAL0813
+ E  BAL0814
+ E  BAL0815
+ E  BAL0816
+ E  BAL0817
+ E  BAL0818
+ E  BAL0819
+ E  BAL0820
+ E  BAL0821
+ E  BAL0822
+ E  BAL0823
+ E  BAL0824
+ E  BAL0825
+ E  BAL0826
+ E  BAL0827
+ E  BAL0828
+ E  BAL0829
+ E  BAL0830
+ E  BAL0831
+ E  BAL0832
+ E  BAL0833
+ E  BAL0834
+ E  BAL0835
+ E  BAL0836
+ E  BAL0837
+ E  BAL0838
+ E  BAL0839
+ E  BAL0840
+ E  BAL0841
+ E  BAL0842
+ E  BAL0843
+ E  BAL0844
+ E  BAL0845
+ E  BAL0846
+ E  BAL0847
+ E  BAL0848
+ E  BAL0849
+ E  BAL0850
+ E  BAL0851
+ E  BAL0852
+ E  BAL0853
+ E  BAL0854
+ E  BAL0855
+ E  BAL0856
+ E  BAL0857
+ E  BAL0858
+ E  BAL0859
+ E  BAL0860
+ E  BAL0861
+ E  BAL0862
+ E  BAL0863
+ E  BAL0864
+ E  BAL0865
+ E  BAL0866
+ E  BAL0867
+ E  BAL0868
+ E  BAL0869
+ E  BAL0870
+ E  BAL0871
+ E  BAL0872
+ E  BAL0873
+ E  BAL0874
+ E  BAL0875
+ E  BAL0876
+ E  BAL0877
+ E  BAL0878
+ E  BAL0879
+ E  BAL0880
+ E  BAL0881
+ E  BAL0882
+ E  BAL0883
+ E  BAL0884
+ E  BAL0885
+ E  BAL0886
+COLUMNS
+    PREG0101  COST             4862.   REGMIN        .0210855
+    PREG0101  REGMAX        .0210855   REGMIN01      .0210855
+    PREG0101  REGMAX01      .0210855   TRAN0101           -1.
+    PREG0101  BAL0101             1.
+    PREG0102  COST             4688.   REGMIN        .0175461
+    PREG0102  REGMAX        .0175461   REGMIN01      .0175461
+    PREG0102  REGMAX01      .0175461   TRAN0201           -1.
+    PREG0102  BAL0201             1.
+    PREG0103  COST             4872.   REGMIN        .0175461
+    PREG0103  REGMAX        .0175461   REGMIN01      .0175461
+    PREG0103  REGMAX01      .0175461   TRAN0301           -1.
+    PREG0103  BAL0301             1.
+    PREG0105  COST             4655.   REGMIN        .0175461
+    PREG0105  REGMAX        .0175461   REGMIN01      .0175461
+    PREG0105  REGMAX01      .0175461   TRAN0501           -1.
+    PREG0105  BAL0501             1.
+    PREG0202  COST             4196.   REGMIN        .0187961
+    PREG0202  REGMAX        .0187961   REGMIN02      .0187961
+    PREG0202  REGMAX02      .0187961   TRAN0202           -1.
+    PREG0202  BAL0202             1.
+    PREG0203  COST             4338.   REGMIN        .0328947
+    PREG0203  REGMAX        .0328947   REGMIN02      .0328947
+    PREG0203  REGMAX02      .0328947   TRAN0302           -1.
+    PREG0203  BAL0302             1.
+    PREG0205  COST             4283.   REGMIN        .0112105
+    PREG0205  REGMAX        .0112105   REGMIN02      .0112105
+    PREG0205  REGMAX02      .0112105   TRAN0502           -1.
+    PREG0205  BAL0502             1.
+    PREG0207  COST             4156.   REGMIN        .0131579
+    PREG0207  REGMAX        .0131579   REGMIN02      .0131579
+    PREG0207  REGMAX02      .0131579   TRAN0702           -1.
+    PREG0207  BAL0702             1.
+    PREG0401  COST             4691.   REGMIN        .0175461
+    PREG0401  REGMAX        .0175461   REGMIN04      .0175461
+    PREG0401  REGMAX04      .0175461   TRAN0104           -1.
+    PREG0401  BAL0104             1.
+    PREG0402  COST             4669.   REGMIN        .0181711
+    PREG0402  REGMAX        .0181711   REGMIN04      .0181711
+    PREG0402  REGMAX04      .0181711   TRAN0204           -1.
+    PREG0402  BAL0204             1.
+    PREG0404  COST             6724.   REGMIN        .0263158
+    PREG0404  REGMAX        .0263158   REGMIN04      .0263158
+    PREG0404  REGMAX04      .0263158   TRAN0404           -1.
+    PREG0404  BAL0404             1.
+    PREG0405  COST             4615.   REGMIN        .0181711
+    PREG0405  REGMAX        .0181711   REGMIN04      .0181711
+    PREG0405  REGMAX04      .0181711   TRAN0504           -1.
+    PREG0405  BAL0504             1.
+    PREG0406  COST             4148.   REGMIN        .0181711
+    PREG0406  REGMAX        .0181711   REGMIN04      .0181711
+    PREG0406  REGMAX04      .0181711   TRAN0604           -1.
+    PREG0406  BAL0604             1.
+    PREG0408  COST             6411.   REGMIN        .0239211
+    PREG0408  REGMAX        .0239211   REGMIN04      .0239211
+    PREG0408  REGMAX04      .0239211   TRAN0804           -1.
+    PREG0408  BAL0804             1.
+    POVR0101  COST             6552.   OVRMIN           3.205
+    POVR0101  OVRMAX           3.205   OVRMIN01         3.205
+    POVR0101  OVRMAX01         3.205   TRAN0101           -1.
+    POVR0101  BAL0101             1.
+    POVR0102  COST             6351.   OVRMIN           2.667
+    POVR0102  OVRMAX           2.667   OVRMIN01         2.667
+    POVR0102  OVRMAX01         2.667   TRAN0201           -1.
+    POVR0102  BAL0201             1.
+    POVR0103  COST             6554.   OVRMIN           2.667
+    POVR0103  OVRMAX           2.667   OVRMIN01         2.667
+    POVR0103  OVRMAX01         2.667   TRAN0301           -1.
+    POVR0103  BAL0301             1.
+    POVR0105  COST             6325.   OVRMIN           2.667
+    POVR0105  OVRMAX           2.667   OVRMIN01         2.667
+    POVR0105  OVRMAX01         2.667   TRAN0501           -1.
+    POVR0105  BAL0501             1.
+    POVR0202  COST             5756.   OVRMIN           2.857
+    POVR0202  OVRMAX           2.857   OVRMIN02         2.857
+    POVR0202  OVRMAX02         2.857   TRAN0202           -1.
+    POVR0202  BAL0202             1.
+    POVR0203  COST             6777.   OVRMIN              5.
+    POVR0203  OVRMAX              5.   OVRMIN02            5.
+    POVR0203  OVRMAX02            5.   TRAN0302           -1.
+    POVR0203  BAL0302             1.
+    POVR0205  COST             5844.   OVRMIN           1.704
+    POVR0205  OVRMAX           1.704   OVRMIN02         1.704
+    POVR0205  OVRMAX02         1.704   TRAN0502           -1.
+    POVR0205  BAL0502             1.
+    POVR0207  COST             5673.   OVRMIN              2.
+    POVR0207  OVRMAX              2.   OVRMIN02            2.
+    POVR0207  OVRMAX02            2.   TRAN0702           -1.
+    POVR0207  BAL0702             1.
+    POVR0401  COST             5794.   OVRMIN           2.667
+    POVR0401  OVRMAX           2.667   OVRMIN04         2.667
+    POVR0401  OVRMAX04         2.667   TRAN0104           -1.
+    POVR0401  BAL0104             1.
+    POVR0402  COST             5787.   OVRMIN           2.762
+    POVR0402  OVRMAX           2.762   OVRMIN04         2.762
+    POVR0402  OVRMAX04         2.762   TRAN0204           -1.
+    POVR0402  BAL0204             1.
+    POVR0404  COST             8111.   OVRMIN              4.
+    POVR0404  OVRMAX              4.   OVRMIN04            4.
+    POVR0404  OVRMAX04            4.   TRAN0404           -1.
+    POVR0404  BAL0404             1.
+    POVR0405  COST             5721.   OVRMIN           2.762
+    POVR0405  OVRMAX           2.762   OVRMIN04         2.762
+    POVR0405  OVRMAX04         2.762   TRAN0504           -1.
+    POVR0405  BAL0504             1.
+    POVR0406  COST             5303.   OVRMIN           2.762
+    POVR0406  OVRMAX           2.762   OVRMIN04         2.762
+    POVR0406  OVRMAX04         2.762   TRAN0604           -1.
+    POVR0406  BAL0604             1.
+    SH010201  COST            323.73   TRAN0102            1.
+    SH010201  BAL0102            -1.   BAL0101             1.
+    SH010301  COST            124.26   TRAN0103            1.
+    SH010301  BAL0103            -1.   BAL0101             1.
+    SH010401  COST            226.72   TRAN0104            1.
+    SH010401  BAL0104            -1.   BAL0101             1.
+    SH010501  COST            258.33   TRAN0105            1.
+    SH010501  BAL0105            -1.   BAL0101             1.
+    SH010601  COST            137.34   TRAN0106            1.
+    SH010601  BAL0152            -1.   BAL0101             1.
+    SH010801  COST            155.87   TRAN0108            1.
+    SH010801  BAL0183            -1.   BAL0101             1.
+    SH010102  COST            516.66   TRAN0101            1.
+    SH010102  BAL0101            -1.   BAL0102             1.
+    SH010302  COST            454.53   TRAN0103            1.
+    SH010302  BAL0103            -1.   BAL0102             1.
+    SH010402  COST            667.08   TRAN0104            1.
+    SH010402  BAL0104            -1.   BAL0102             1.
+    SH010502  COST            807.69   TRAN0105            1.
+    SH010502  BAL0105            -1.   BAL0102             1.
+    SH010602  COST            412.02   TRAN0106            1.
+    SH010602  BAL0152            -1.   BAL0102             1.
+    SH010802  COST            567.89   TRAN0108            1.
+    SH010802  BAL0183            -1.   BAL0102             1.
+    SH010103  COST            267.05   TRAN0101            1.
+    SH010103  BAL0101            -1.   BAL0103             1.
+    SH010203  COST            516.66   TRAN0102            1.
+    SH010203  BAL0102            -1.   BAL0103             1.
+    SH010403  COST            400.03   TRAN0104            1.
+    SH010403  BAL0104            -1.   BAL0103             1.
+    SH010503  COST            309.56   TRAN0105            1.
+    SH010503  BAL0105            -1.   BAL0103             1.
+    SH010603  COST              98.1   TRAN0106            1.
+    SH010603  BAL0152            -1.   BAL0103             1.
+    SH010803  COST            277.95   TRAN0108            1.
+    SH010803  BAL0183            -1.   BAL0103             1.
+    SH010104  COST            189.66   TRAN0101            1.
+    SH010104  BAL0101            -1.   BAL0104             1.
+    SH010204  COST            548.27   TRAN0102            1.
+    SH010204  BAL0102            -1.   BAL0104             1.
+    SH010304  COST            264.87   TRAN0103            1.
+    SH010304  BAL0103            -1.   BAL0104             1.
+    SH010504  COST            347.71   TRAN0105            1.
+    SH010504  BAL0105            -1.   BAL0104             1.
+    SH010604  COST            267.05   TRAN0106            1.
+    SH010604  BAL0152            -1.   BAL0104             1.
+    SH010704  COST            293.21   TRAN0107            1.
+    SH010704  BAL0164            -1.   BAL0104             1.
+    SH010804  COST             63.22   TRAN0108            1.
+    SH010804  BAL0183            -1.   BAL0104             1.
+    SH010105  COST             294.3   TRAN0101            1.
+    SH010105  BAL0101            -1.   BAL0105             1.
+    SH010205  COST            562.44   TRAN0102            1.
+    SH010205  BAL0102            -1.   BAL0105             1.
+    SH010305  COST            309.56   TRAN0103            1.
+    SH010305  BAL0103            -1.   BAL0105             1.
+    SH010405  COST            310.65   TRAN0104            1.
+    SH010405  BAL0104            -1.   BAL0105             1.
+    SH010605  COST            355.34   TRAN0106            1.
+    SH010605  BAL0152            -1.   BAL0105             1.
+    SH010705  COST            364.06   TRAN0107            1.
+    SH010705  BAL0164            -1.   BAL0105             1.
+    SH010805  COST            295.39   TRAN0108            1.
+    SH010805  BAL0183            -1.   BAL0105             1.
+    SH010106  COST            216.91   TRAN0101            1.
+    SH010106  BAL0101            -1.   BAL0106             1.
+    SH010206  COST            454.53   TRAN0102            1.
+    SH010206  BAL0102            -1.   BAL0106             1.
+    SH010306  COST            232.17   TRAN0103            1.
+    SH010306  BAL0103            -1.   BAL0106             1.
+    SH010406  COST            238.71   TRAN0104            1.
+    SH010406  BAL0104            -1.   BAL0106             1.
+    SH010506  COST            274.68   TRAN0105            1.
+    SH010506  BAL0105            -1.   BAL0106             1.
+    SH010606  COST            224.54   TRAN0106            1.
+    SH010606  BAL0152            -1.   BAL0106             1.
+    SH010706  COST              218.   TRAN0107            1.
+    SH010706  BAL0164            -1.   BAL0106             1.
+    SH010806  COST            164.59   TRAN0108            1.
+    SH010806  BAL0183            -1.   BAL0106             1.
+    SH010107  COST             22.89   TRAN0101            1.
+    SH010107  BAL0101            -1.   BAL0107             1.
+    SH010207  COST            318.28   TRAN0102            1.
+    SH010207  BAL0102            -1.   BAL0107             1.
+    SH010307  COST            135.16   TRAN0103            1.
+    SH010307  BAL0103            -1.   BAL0107             1.
+    SH010407  COST            225.63   TRAN0104            1.
+    SH010407  BAL0104            -1.   BAL0107             1.
+    SH010507  COST            249.61   TRAN0105            1.
+    SH010507  BAL0105            -1.   BAL0107             1.
+    SH010607  COST            136.25   TRAN0106            1.
+    SH010607  BAL0152            -1.   BAL0107             1.
+    SH010707  COST            252.88   TRAN0107            1.
+    SH010707  BAL0164            -1.   BAL0107             1.
+    SH010807  COST            168.95   TRAN0108            1.
+    SH010807  BAL0183            -1.   BAL0107             1.
+    SH010108  COST             71.94   TRAN0101            1.
+    SH010108  BAL0101            -1.   BAL0108             1.
+    SH010208  COST            409.84   TRAN0102            1.
+    SH010208  BAL0102            -1.   BAL0108             1.
+    SH010308  COST            153.69   TRAN0103            1.
+    SH010308  BAL0103            -1.   BAL0108             1.
+    SH010408  COST            269.23   TRAN0104            1.
+    SH010408  BAL0104            -1.   BAL0108             1.
+    SH010508  COST            198.38   TRAN0105            1.
+    SH010508  BAL0105            -1.   BAL0108             1.
+    SH010608  COST            180.94   TRAN0106            1.
+    SH010608  BAL0152            -1.   BAL0108             1.
+    SH010808  COST            203.83   TRAN0108            1.
+    SH010808  BAL0183            -1.   BAL0108             1.
+    SH010109  COST            150.42   TRAN0101            1.
+    SH010109  BAL0101            -1.   BAL0109             1.
+    SH010209  COST            417.47   TRAN0102            1.
+    SH010209  BAL0102            -1.   BAL0109             1.
+    SH010309  COST            183.12   TRAN0103            1.
+    SH010309  BAL0103            -1.   BAL0109             1.
+    SH010409  COST            275.77   TRAN0104            1.
+    SH010409  BAL0104            -1.   BAL0109             1.
+    SH010509  COST            260.51   TRAN0105            1.
+    SH010509  BAL0105            -1.   BAL0109             1.
+    SH010709  COST            213.64   TRAN0107            1.
+    SH010709  BAL0164            -1.   BAL0109             1.
+    SH010809  COST            211.46   TRAN0108            1.
+    SH010809  BAL0183            -1.   BAL0109             1.
+    SH010110  COST            269.23   TRAN0101            1.
+    SH010110  BAL0101            -1.   BAL0110             1.
+    SH010210  COST            172.22   TRAN0102            1.
+    SH010210  BAL0102            -1.   BAL0110             1.
+    SH010310  COST             261.6   TRAN0103            1.
+    SH010310  BAL0103            -1.   BAL0110             1.
+    SH010410  COST            391.31   TRAN0104            1.
+    SH010410  BAL0104            -1.   BAL0110             1.
+    SH010510  COST            419.65   TRAN0105            1.
+    SH010510  BAL0105            -1.   BAL0110             1.
+    SH010610  COST            245.25   TRAN0106            1.
+    SH010610  BAL0152            -1.   BAL0110             1.
+    SH010810  COST            332.45   TRAN0108            1.
+    SH010810  BAL0183            -1.   BAL0110             1.
+    SH010111  COST            115.54   TRAN0101            1.
+    SH010111  BAL0101            -1.   BAL0111             1.
+    SH010211  COST            539.55   TRAN0102            1.
+    SH010211  BAL0102            -1.   BAL0111             1.
+    SH010311  COST            270.32   TRAN0103            1.
+    SH010311  BAL0103            -1.   BAL0111             1.
+    SH010411  COST            151.51   TRAN0104            1.
+    SH010411  BAL0104            -1.   BAL0111             1.
+    SH010511  COST            371.69   TRAN0105            1.
+    SH010511  BAL0105            -1.   BAL0111             1.
+    SH010611  COST            213.64   TRAN0106            1.
+    SH010611  BAL0152            -1.   BAL0111             1.
+    SH010811  COST            111.18   TRAN0108            1.
+    SH010811  BAL0183            -1.   BAL0111             1.
+    SH010112  COST             95.92   TRAN0101            1.
+    SH010112  BAL0101            -1.   BAL0112             1.
+    SH010212  COST            369.51   TRAN0102            1.
+    SH010212  BAL0102            -1.   BAL0112             1.
+    SH010312  COST            159.14   TRAN0103            1.
+    SH010312  BAL0103            -1.   BAL0112             1.
+    SH010412  COST              218.   TRAN0104            1.
+    SH010412  BAL0104            -1.   BAL0112             1.
+    SH010512  COST            291.03   TRAN0105            1.
+    SH010512  BAL0105            -1.   BAL0112             1.
+    SH010612  COST            158.05   TRAN0106            1.
+    SH010612  BAL0152            -1.   BAL0112             1.
+    SH010812  COST            159.14   TRAN0108            1.
+    SH010812  BAL0183            -1.   BAL0112             1.
+    SH010114  COST            154.78   TRAN0101            1.
+    SH010114  BAL0101            -1.   BAL0114             1.
+    SH010214  COST            449.08   TRAN0102            1.
+    SH010214  BAL0102            -1.   BAL0114             1.
+    SH010314  COST            213.64   TRAN0103            1.
+    SH010314  BAL0103            -1.   BAL0114             1.
+    SH010414  COST            216.91   TRAN0104            1.
+    SH010414  BAL0104            -1.   BAL0114             1.
+    SH010514  COST            383.68   TRAN0105            1.
+    SH010514  BAL0105            -1.   BAL0114             1.
+    SH010614  COST            204.92   TRAN0106            1.
+    SH010614  BAL0152            -1.   BAL0114             1.
+    SH010814  COST            137.34   TRAN0108            1.
+    SH010814  BAL0183            -1.   BAL0114             1.
+    SH010115  COST            330.27   TRAN0101            1.
+    SH010115  BAL0101            -1.   BAL0115             1.
+    SH010215  COST            173.31   TRAN0102            1.
+    SH010215  BAL0102            -1.   BAL0115             1.
+    SH010315  COST            255.06   TRAN0103            1.
+    SH010315  BAL0103            -1.   BAL0115             1.
+    SH010415  COST            518.84   TRAN0104            1.
+    SH010415  BAL0104            -1.   BAL0115             1.
+    SH010515  COST            433.82   TRAN0105            1.
+    SH010515  BAL0105            -1.   BAL0115             1.
+    SH010615  COST            204.92   TRAN0106            1.
+    SH010615  BAL0152            -1.   BAL0115             1.
+    SH010815  COST            406.57   TRAN0108            1.
+    SH010815  BAL0183            -1.   BAL0115             1.
+    SH010116  COST            172.22   TRAN0101            1.
+    SH010116  BAL0101            -1.   BAL0116             1.
+    SH010216  COST             305.2   TRAN0102            1.
+    SH010216  BAL0102            -1.   BAL0116             1.
+    SH010316  COST            247.43   TRAN0103            1.
+    SH010316  BAL0103            -1.   BAL0116             1.
+    SH010416  COST            312.83   TRAN0104            1.
+    SH010416  BAL0104            -1.   BAL0116             1.
+    SH010516  COST            347.71   TRAN0105            1.
+    SH010516  BAL0105            -1.   BAL0116             1.
+    SH010616  COST            142.79   TRAN0106            1.
+    SH010616  BAL0152            -1.   BAL0116             1.
+    SH010816  COST            223.45   TRAN0108            1.
+    SH010816  BAL0183            -1.   BAL0116             1.
+    SH010117  COST            164.59   TRAN0101            1.
+    SH010117  BAL0101            -1.   BAL0117             1.
+    SH010217  COST            550.45   TRAN0102            1.
+    SH010217  BAL0102            -1.   BAL0117             1.
+    SH010317  COST            298.66   TRAN0103            1.
+    SH010317  BAL0103            -1.   BAL0117             1.
+    SH010417  COST             62.13   TRAN0104            1.
+    SH010417  BAL0104            -1.   BAL0117             1.
+    SH010517  COST            324.82   TRAN0105            1.
+    SH010517  BAL0105            -1.   BAL0117             1.
+    SH010717  COST            321.55   TRAN0107            1.
+    SH010717  BAL0164            -1.   BAL0117             1.
+    SH010817  COST             29.43   TRAN0108            1.
+    SH010817  BAL0183            -1.   BAL0117             1.
+    SH010118  COST            190.75   TRAN0101            1.
+    SH010118  BAL0101            -1.   BAL0118             1.
+    SH010218  COST            393.49   TRAN0102            1.
+    SH010218  BAL0102            -1.   BAL0118             1.
+    SH010318  COST             294.3   TRAN0103            1.
+    SH010318  BAL0103            -1.   BAL0118             1.
+    SH010418  COST            167.86   TRAN0104            1.
+    SH010418  BAL0104            -1.   BAL0118             1.
+    SH010518  COST            443.63   TRAN0105            1.
+    SH010518  BAL0105            -1.   BAL0118             1.
+    SH010618  COST            383.68   TRAN0106            1.
+    SH010618  BAL0152            -1.   BAL0118             1.
+    SH010818  COST            112.27   TRAN0108            1.
+    SH010818  BAL0183            -1.   BAL0118             1.
+    SH010119  COST            270.32   TRAN0101            1.
+    SH010119  BAL0101            -1.   BAL0119             1.
+    SH010219  COST            748.83   TRAN0102            1.
+    SH010219  BAL0102            -1.   BAL0119             1.
+    SH010319  COST            345.53   TRAN0103            1.
+    SH010319  BAL0103            -1.   BAL0119             1.
+    SH010419  COST            173.31   TRAN0104            1.
+    SH010419  BAL0104            -1.   BAL0119             1.
+    SH010519  COST            226.72   TRAN0105            1.
+    SH010519  BAL0105            -1.   BAL0119             1.
+    SH010619  COST            376.05   TRAN0106            1.
+    SH010619  BAL0152            -1.   BAL0119             1.
+    SH010819  COST            107.91   TRAN0108            1.
+    SH010819  BAL0183            -1.   BAL0119             1.
+    SH010120  COST            223.45   TRAN0101            1.
+    SH010120  BAL0101            -1.   BAL0120             1.
+    SH010220  COST            744.47   TRAN0102            1.
+    SH010220  BAL0102            -1.   BAL0120             1.
+    SH010320  COST            323.73   TRAN0103            1.
+    SH010320  BAL0103            -1.   BAL0120             1.
+    SH010420  COST            123.17   TRAN0104            1.
+    SH010420  BAL0104            -1.   BAL0120             1.
+    SH010520  COST            317.19   TRAN0105            1.
+    SH010520  BAL0105            -1.   BAL0120             1.
+    SH010820  COST            137.34   TRAN0108            1.
+    SH010820  BAL0183            -1.   BAL0120             1.
+    SH010121  COST            439.27   TRAN0101            1.
+    SH010121  BAL0101            -1.   BAL0121             1.
+    SH010221  COST            401.12   TRAN0102            1.
+    SH010221  BAL0102            -1.   BAL0121             1.
+    SH010321  COST            486.14   TRAN0103            1.
+    SH010321  BAL0103            -1.   BAL0121             1.
+    SH010421  COST             348.8   TRAN0104            1.
+    SH010421  BAL0104            -1.   BAL0121             1.
+    SH010521  COST             599.5   TRAN0105            1.
+    SH010521  BAL0105            -1.   BAL0121             1.
+    SH010821  COST             348.8   TRAN0108            1.
+    SH010821  BAL0183            -1.   BAL0121             1.
+    SH010122  COST            270.32   TRAN0101            1.
+    SH010122  BAL0101            -1.   BAL0122             1.
+    SH010222  COST            630.02   TRAN0102            1.
+    SH010222  BAL0102            -1.   BAL0122             1.
+    SH010322  COST            325.91   TRAN0103            1.
+    SH010322  BAL0103            -1.   BAL0122             1.
+    SH010422  COST            244.16   TRAN0104            1.
+    SH010422  BAL0104            -1.   BAL0122             1.
+    SH010522  COST            195.11   TRAN0105            1.
+    SH010522  BAL0105            -1.   BAL0122             1.
+    SH010622  COST             337.9   TRAN0106            1.
+    SH010622  BAL0152            -1.   BAL0122             1.
+    SH010822  COST            151.51   TRAN0108            1.
+    SH010822  BAL0183            -1.   BAL0122             1.
+    SH010123  COST            255.06   TRAN0101            1.
+    SH010123  BAL0101            -1.   BAL0123             1.
+    SH010223  COST            589.69   TRAN0102            1.
+    SH010223  BAL0102            -1.   BAL0123             1.
+    SH010323  COST            312.83   TRAN0103            1.
+    SH010323  BAL0103            -1.   BAL0123             1.
+    SH010423  COST            182.03   TRAN0104            1.
+    SH010423  BAL0104            -1.   BAL0123             1.
+    SH010523  COST            180.94   TRAN0105            1.
+    SH010523  BAL0105            -1.   BAL0123             1.
+    SH010823  COST            151.51   TRAN0108            1.
+    SH010823  BAL0183            -1.   BAL0123             1.
+    SH010124  COST           1565.24   TRAN0101            1.
+    SH010124  BAL0101            -1.   BAL0124             1.
+    SH010125  COST            421.83   TRAN0101            1.
+    SH010125  BAL0101            -1.   BAL0125             1.
+    SH010225  COST            465.43   TRAN0102            1.
+    SH010225  BAL0102            -1.   BAL0125             1.
+    SH010325  COST            556.99   TRAN0103            1.
+    SH010325  BAL0103            -1.   BAL0125             1.
+    SH010425  COST            379.32   TRAN0104            1.
+    SH010425  BAL0104            -1.   BAL0125             1.
+    SH010525  COST            616.94   TRAN0105            1.
+    SH010525  BAL0105            -1.   BAL0125             1.
+    SH010625  COST            439.27   TRAN0106            1.
+    SH010625  BAL0152            -1.   BAL0125             1.
+    SH010825  COST            332.45   TRAN0108            1.
+    SH010825  BAL0183            -1.   BAL0125             1.
+    SH010426  COST             294.3   TRAN0104            1.
+    SH010426  BAL0104            -1.   BAL0126             1.
+    SH010127  COST            255.06   TRAN0101            1.
+    SH010127  BAL0101            -1.   BAL0127             1.
+    SH010227  COST            309.56   TRAN0102            1.
+    SH010227  BAL0102            -1.   BAL0127             1.
+    SH010327  COST            315.01   TRAN0103            1.
+    SH010327  BAL0103            -1.   BAL0127             1.
+    SH010427  COST            365.15   TRAN0104            1.
+    SH010427  BAL0104            -1.   BAL0127             1.
+    SH010527  COST            412.02   TRAN0105            1.
+    SH010527  BAL0105            -1.   BAL0127             1.
+    SH010627  COST            292.12   TRAN0106            1.
+    SH010627  BAL0152            -1.   BAL0127             1.
+    SH010827  COST            274.68   TRAN0108            1.
+    SH010827  BAL0183            -1.   BAL0127             1.
+    SH010128  COST            264.87   TRAN0101            1.
+    SH010128  BAL0101            -1.   BAL0128             1.
+    SH010228  COST            620.21   TRAN0102            1.
+    SH010228  BAL0102            -1.   BAL0128             1.
+    SH010328  COST            322.64   TRAN0103            1.
+    SH010328  BAL0103            -1.   BAL0128             1.
+    SH010428  COST            321.55   TRAN0104            1.
+    SH010428  BAL0104            -1.   BAL0128             1.
+    SH010528  COST            111.18   TRAN0105            1.
+    SH010528  BAL0105            -1.   BAL0128             1.
+    SH010628  COST            284.49   TRAN0106            1.
+    SH010628  BAL0152            -1.   BAL0128             1.
+    SH010728  COST            116.63   TRAN0107            1.
+    SH010728  BAL0164            -1.   BAL0128             1.
+    SH010828  COST            276.86   TRAN0108            1.
+    SH010828  BAL0183            -1.   BAL0128             1.
+    SH010129  COST            243.07   TRAN0101            1.
+    SH010129  BAL0101            -1.   BAL0129             1.
+    SH010229  COST            505.76   TRAN0102            1.
+    SH010229  BAL0102            -1.   BAL0129             1.
+    SH010329  COST            262.69   TRAN0103            1.
+    SH010329  BAL0103            -1.   BAL0129             1.
+    SH010429  COST            216.91   TRAN0104            1.
+    SH010429  BAL0104            -1.   BAL0129             1.
+    SH010529  COST             468.7   TRAN0105            1.
+    SH010529  BAL0105            -1.   BAL0129             1.
+    SH010629  COST            284.49   TRAN0106            1.
+    SH010629  BAL0152            -1.   BAL0129             1.
+    SH010829  COST            156.96   TRAN0108            1.
+    SH010829  BAL0183            -1.   BAL0129             1.
+    SH010130  COST            507.94   TRAN0101            1.
+    SH010130  BAL0101            -1.   BAL0130             1.
+    SH010230  COST            475.24   TRAN0102            1.
+    SH010230  BAL0102            -1.   BAL0130             1.
+    SH010330  COST            570.07   TRAN0103            1.
+    SH010330  BAL0103            -1.   BAL0130             1.
+    SH010430  COST            331.36   TRAN0104            1.
+    SH010430  BAL0104            -1.   BAL0130             1.
+    SH010530  COST            486.14   TRAN0105            1.
+    SH010530  BAL0105            -1.   BAL0130             1.
+    SH010830  COST            416.38   TRAN0108            1.
+    SH010830  BAL0183            -1.   BAL0130             1.
+    SH010131  COST            120.99   TRAN0101            1.
+    SH010131  BAL0101            -1.   BAL0131             1.
+    SH010231  COST            382.59   TRAN0102            1.
+    SH010231  BAL0102            -1.   BAL0131             1.
+    SH010331  COST             119.9   TRAN0103            1.
+    SH010331  BAL0103            -1.   BAL0131             1.
+    SH010431  COST            275.77   TRAN0104            1.
+    SH010431  BAL0104            -1.   BAL0131             1.
+    SH010531  COST            334.63   TRAN0105            1.
+    SH010531  BAL0105            -1.   BAL0131             1.
+    SH010631  COST            122.08   TRAN0106            1.
+    SH010631  BAL0152            -1.   BAL0131             1.
+    SH010831  COST            243.07   TRAN0108            1.
+    SH010831  BAL0183            -1.   BAL0131             1.
+    SH010132  COST            325.91   TRAN0101            1.
+    SH010132  BAL0101            -1.   BAL0132             1.
+    SH010232  COST            521.02   TRAN0102            1.
+    SH010232  BAL0102            -1.   BAL0132             1.
+    SH010332  COST            461.07   TRAN0103            1.
+    SH010332  BAL0103            -1.   BAL0132             1.
+    SH010432  COST            171.13   TRAN0104            1.
+    SH010432  BAL0104            -1.   BAL0132             1.
+    SH010532  COST            427.28   TRAN0105            1.
+    SH010532  BAL0105            -1.   BAL0132             1.
+    SH010832  COST             196.2   TRAN0108            1.
+    SH010832  BAL0183            -1.   BAL0132             1.
+    SH010133  COST            537.37   TRAN0101            1.
+    SH010133  BAL0101            -1.   BAL0133             1.
+    SH010233  COST              436.   TRAN0102            1.
+    SH010233  BAL0102            -1.   BAL0133             1.
+    SH010333  COST            591.87   TRAN0103            1.
+    SH010333  BAL0103            -1.   BAL0133             1.
+    SH010433  COST            485.05   TRAN0104            1.
+    SH010433  BAL0104            -1.   BAL0133             1.
+    SH010533  COST            687.79   TRAN0105            1.
+    SH010533  BAL0105            -1.   BAL0133             1.
+    SH010833  COST            415.29   TRAN0108            1.
+    SH010833  BAL0183            -1.   BAL0133             1.
+    SH010134  COST            420.74   TRAN0101            1.
+    SH010134  BAL0101            -1.   BAL0134             1.
+    SH010234  COST            713.95   TRAN0102            1.
+    SH010234  BAL0102            -1.   BAL0134             1.
+    SH010334  COST            548.27   TRAN0103            1.
+    SH010334  BAL0103            -1.   BAL0134             1.
+    SH010434  COST            229.99   TRAN0104            1.
+    SH010434  BAL0104            -1.   BAL0134             1.
+    SH010534  COST            480.69   TRAN0105            1.
+    SH010534  BAL0105            -1.   BAL0134             1.
+    SH010834  COST            286.67   TRAN0108            1.
+    SH010834  BAL0183            -1.   BAL0134             1.
+    SH010135  COST            502.49   TRAN0101            1.
+    SH010135  BAL0101            -1.   BAL0135             1.
+    SH010235  COST            485.05   TRAN0102            1.
+    SH010235  BAL0102            -1.   BAL0135             1.
+    SH010335  COST            410.93   TRAN0103            1.
+    SH010335  BAL0103            -1.   BAL0135             1.
+    SH010435  COST            132.98   TRAN0104            1.
+    SH010435  BAL0104            -1.   BAL0135             1.
+    SH010535  COST            469.79   TRAN0105            1.
+    SH010535  BAL0105            -1.   BAL0135             1.
+    SH010835  COST            256.15   TRAN0108            1.
+    SH010835  BAL0183            -1.   BAL0135             1.
+    SH010136  COST            223.45   TRAN0101            1.
+    SH010136  BAL0101            -1.   BAL0136             1.
+    SH010236  COST            488.32   TRAN0102            1.
+    SH010236  BAL0102            -1.   BAL0136             1.
+    SH010336  COST            115.54   TRAN0103            1.
+    SH010336  BAL0103            -1.   BAL0136             1.
+    SH010436  COST             403.3   TRAN0104            1.
+    SH010436  BAL0104            -1.   BAL0136             1.
+    SH010536  COST            377.14   TRAN0105            1.
+    SH010536  BAL0105            -1.   BAL0136             1.
+    SH010636  COST             119.9   TRAN0106            1.
+    SH010636  BAL0152            -1.   BAL0136             1.
+    SH010836  COST            349.89   TRAN0108            1.
+    SH010836  BAL0183            -1.   BAL0136             1.
+    SH010137  COST            100.28   TRAN0101            1.
+    SH010137  BAL0101            -1.   BAL0137             1.
+    SH010237  COST            372.78   TRAN0102            1.
+    SH010237  BAL0102            -1.   BAL0137             1.
+    SH010337  COST            172.22   TRAN0103            1.
+    SH010337  BAL0103            -1.   BAL0137             1.
+    SH010437  COST            331.36   TRAN0104            1.
+    SH010437  BAL0104            -1.   BAL0137             1.
+    SH010537  COST            198.38   TRAN0105            1.
+    SH010537  BAL0105            -1.   BAL0137             1.
+    SH010637  COST            211.46   TRAN0106            1.
+    SH010637  BAL0152            -1.   BAL0137             1.
+    SH010837  COST            274.68   TRAN0108            1.
+    SH010837  BAL0183            -1.   BAL0137             1.
+    SH010138  COST            148.24   TRAN0101            1.
+    SH010138  BAL0101            -1.   BAL0138             1.
+    SH010238  COST            265.96   TRAN0102            1.
+    SH010238  BAL0102            -1.   BAL0138             1.
+    SH010338  COST            103.55   TRAN0103            1.
+    SH010338  BAL0103            -1.   BAL0138             1.
+    SH010438  COST            335.72   TRAN0104            1.
+    SH010438  BAL0104            -1.   BAL0138             1.
+    SH010538  COST            303.02   TRAN0105            1.
+    SH010538  BAL0105            -1.   BAL0138             1.
+    SH010638  COST             42.51   TRAN0106            1.
+    SH010638  BAL0152            -1.   BAL0138             1.
+    SH010738  COST            235.44   TRAN0107            1.
+    SH010738  BAL0164            -1.   BAL0138             1.
+    SH010838  COST            258.33   TRAN0108            1.
+    SH010838  BAL0183            -1.   BAL0138             1.
+    SH010139  COST             141.7   TRAN0101            1.
+    SH010139  BAL0101            -1.   BAL0139             1.
+    SH010239  COST            369.51   TRAN0102            1.
+    SH010239  BAL0102            -1.   BAL0139             1.
+    SH010339  COST             174.4   TRAN0103            1.
+    SH010339  BAL0103            -1.   BAL0139             1.
+    SH010439  COST            271.41   TRAN0104            1.
+    SH010439  BAL0104            -1.   BAL0139             1.
+    SH010539  COST            467.61   TRAN0105            1.
+    SH010539  BAL0105            -1.   BAL0139             1.
+    SH010639  COST            222.36   TRAN0106            1.
+    SH010639  BAL0152            -1.   BAL0139             1.
+    SH010839  COST            183.12   TRAN0108            1.
+    SH010839  BAL0183            -1.   BAL0139             1.
+    SH010140  COST            179.85   TRAN0101            1.
+    SH010140  BAL0101            -1.   BAL0140             1.
+    SH010240  COST            412.02   TRAN0102            1.
+    SH010240  BAL0102            -1.   BAL0140             1.
+    SH010340  COST            112.27   TRAN0103            1.
+    SH010340  BAL0103            -1.   BAL0140             1.
+    SH010440  COST            323.73   TRAN0104            1.
+    SH010440  BAL0104            -1.   BAL0140             1.
+    SH010540  COST            240.89   TRAN0105            1.
+    SH010540  BAL0105            -1.   BAL0140             1.
+    SH010640  COST            142.79   TRAN0106            1.
+    SH010640  BAL0152            -1.   BAL0140             1.
+    SH010840  COST            298.66   TRAN0108            1.
+    SH010840  BAL0183            -1.   BAL0140             1.
+    SH010141  COST            213.64   TRAN0101            1.
+    SH010141  BAL0101            -1.   BAL0141             1.
+    SH010241  COST              327.   TRAN0102            1.
+    SH010241  BAL0102            -1.   BAL0141             1.
+    SH010341  COST             163.5   TRAN0103            1.
+    SH010341  BAL0103            -1.   BAL0141             1.
+    SH010441  COST            353.16   TRAN0104            1.
+    SH010441  BAL0104            -1.   BAL0141             1.
+    SH010541  COST            401.12   TRAN0105            1.
+    SH010541  BAL0105            -1.   BAL0141             1.
+    SH010641  COST              109.   TRAN0106            1.
+    SH010641  BAL0152            -1.   BAL0141             1.
+    SH010841  COST            325.91   TRAN0108            1.
+    SH010841  BAL0183            -1.   BAL0141             1.
+    SH010142  COST              98.1   TRAN0101            1.
+    SH010142  BAL0101            -1.   BAL0142             1.
+    SH010242  COST            451.26   TRAN0102            1.
+    SH010242  BAL0102            -1.   BAL0142             1.
+    SH010342  COST             174.4   TRAN0103            1.
+    SH010342  BAL0103            -1.   BAL0142             1.
+    SH010442  COST            212.55   TRAN0104            1.
+    SH010442  BAL0104            -1.   BAL0142             1.
+    SH010542  COST            393.49   TRAN0105            1.
+    SH010542  BAL0105            -1.   BAL0142             1.
+    SH010642  COST            175.49   TRAN0106            1.
+    SH010642  BAL0152            -1.   BAL0142             1.
+    SH010842  COST            165.68   TRAN0108            1.
+    SH010842  BAL0183            -1.   BAL0142             1.
+    SH010143  COST            173.31   TRAN0101            1.
+    SH010143  BAL0101            -1.   BAL0143             1.
+    SH010243  COST            430.55   TRAN0102            1.
+    SH010243  BAL0102            -1.   BAL0143             1.
+    SH010343  COST             27.25   TRAN0103            1.
+    SH010343  BAL0103            -1.   BAL0143             1.
+    SH010443  COST            322.64   TRAN0104            1.
+    SH010443  BAL0104            -1.   BAL0143             1.
+    SH010543  COST            281.22   TRAN0105            1.
+    SH010543  BAL0105            -1.   BAL0143             1.
+    SH010643  COST              109.   TRAN0106            1.
+    SH010643  BAL0152            -1.   BAL0143             1.
+    SH010743  COST            262.69   TRAN0107            1.
+    SH010743  BAL0164            -1.   BAL0143             1.
+    SH010843  COST            295.39   TRAN0108            1.
+    SH010843  BAL0183            -1.   BAL0143             1.
+    SH010144  COST            173.31   TRAN0101            1.
+    SH010144  BAL0101            -1.   BAL0144             1.
+    SH010244  COST            413.11   TRAN0102            1.
+    SH010244  BAL0102            -1.   BAL0144             1.
+    SH010344  COST            139.52   TRAN0103            1.
+    SH010344  BAL0103            -1.   BAL0144             1.
+    SH010444  COST            340.08   TRAN0104            1.
+    SH010444  BAL0104            -1.   BAL0144             1.
+    SH010544  COST             337.9   TRAN0105            1.
+    SH010544  BAL0105            -1.   BAL0144             1.
+    SH010644  COST             97.01   TRAN0106            1.
+    SH010644  BAL0152            -1.   BAL0144             1.
+    SH010844  COST            324.82   TRAN0108            1.
+    SH010844  BAL0183            -1.   BAL0144             1.
+    SH010145  COST            187.48   TRAN0101            1.
+    SH010145  BAL0101            -1.   BAL0145             1.
+    SH010245  COST            475.24   TRAN0102            1.
+    SH010245  BAL0102            -1.   BAL0145             1.
+    SH010345  COST            175.49   TRAN0103            1.
+    SH010345  BAL0103            -1.   BAL0145             1.
+    SH010445  COST            318.28   TRAN0104            1.
+    SH010445  BAL0104            -1.   BAL0145             1.
+    SH010545  COST            255.06   TRAN0105            1.
+    SH010545  BAL0105            -1.   BAL0145             1.
+    SH010645  COST            208.19   TRAN0106            1.
+    SH010645  BAL0152            -1.   BAL0145             1.
+    SH010745  COST            214.73   TRAN0107            1.
+    SH010745  BAL0164            -1.   BAL0145             1.
+    SH010845  COST            332.45   TRAN0108            1.
+    SH010845  BAL0183            -1.   BAL0145             1.
+    SH010146  COST            267.05   TRAN0101            1.
+    SH010146  BAL0101            -1.   BAL0146             1.
+    SH010246  COST            297.57   TRAN0102            1.
+    SH010246  BAL0102            -1.   BAL0146             1.
+    SH010346  COST            240.89   TRAN0103            1.
+    SH010346  BAL0103            -1.   BAL0146             1.
+    SH010446  COST            487.23   TRAN0104            1.
+    SH010446  BAL0104            -1.   BAL0146             1.
+    SH010546  COST             468.7   TRAN0105            1.
+    SH010546  BAL0105            -1.   BAL0146             1.
+    SH010646  COST            280.13   TRAN0106            1.
+    SH010646  BAL0152            -1.   BAL0146             1.
+    SH010846  COST            488.32   TRAN0108            1.
+    SH010846  BAL0183            -1.   BAL0146             1.
+    SH010147  COST             119.9   TRAN0101            1.
+    SH010147  BAL0101            -1.   BAL0147             1.
+    SH010247  COST            406.57   TRAN0102            1.
+    SH010247  BAL0102            -1.   BAL0147             1.
+    SH010347  COST            173.31   TRAN0103            1.
+    SH010347  BAL0103            -1.   BAL0147             1.
+    SH010447  COST            298.66   TRAN0104            1.
+    SH010447  BAL0104            -1.   BAL0147             1.
+    SH010547  COST            253.97   TRAN0105            1.
+    SH010547  BAL0105            -1.   BAL0147             1.
+    SH010647  COST            158.05   TRAN0106            1.
+    SH010647  BAL0152            -1.   BAL0147             1.
+    SH010847  COST            265.96   TRAN0108            1.
+    SH010847  BAL0183            -1.   BAL0147             1.
+    SH010148  COST            103.55   TRAN0101            1.
+    SH010148  BAL0101            -1.   BAL0148             1.
+    SH010248  COST            369.51   TRAN0102            1.
+    SH010248  BAL0102            -1.   BAL0148             1.
+    SH010348  COST            149.33   TRAN0103            1.
+    SH010348  BAL0103            -1.   BAL0148             1.
+    SH010448  COST             250.7   TRAN0104            1.
+    SH010448  BAL0104            -1.   BAL0148             1.
+    SH010548  COST            269.23   TRAN0105            1.
+    SH010548  BAL0105            -1.   BAL0148             1.
+    SH010648  COST            125.35   TRAN0106            1.
+    SH010648  BAL0152            -1.   BAL0148             1.
+    SH010848  COST            212.55   TRAN0108            1.
+    SH010848  BAL0183            -1.   BAL0148             1.
+    SH010149  COST            358.61   TRAN0101            1.
+    SH010149  BAL0101            -1.   BAL0149             1.
+    SH010249  COST            583.15   TRAN0102            1.
+    SH010249  BAL0102            -1.   BAL0149             1.
+    SH010349  COST            361.88   TRAN0103            1.
+    SH010349  BAL0103            -1.   BAL0149             1.
+    SH010449  COST            415.29   TRAN0104            1.
+    SH010449  BAL0104            -1.   BAL0149             1.
+    SH010549  COST            165.68   TRAN0105            1.
+    SH010549  BAL0105            -1.   BAL0149             1.
+    SH010649  COST            368.42   TRAN0106            1.
+    SH010649  BAL0152            -1.   BAL0149             1.
+    SH010749  COST            146.06   TRAN0107            1.
+    SH010749  BAL0164            -1.   BAL0149             1.
+    SH010849  COST            444.72   TRAN0108            1.
+    SH010849  BAL0183            -1.   BAL0149             1.
+    SH010150  COST            262.69   TRAN0101            1.
+    SH010150  BAL0101            -1.   BAL0150             1.
+    SH010250  COST            667.08   TRAN0102            1.
+    SH010250  BAL0102            -1.   BAL0150             1.
+    SH010350  COST            268.14   TRAN0103            1.
+    SH010350  BAL0103            -1.   BAL0150             1.
+    SH010450  COST            397.85   TRAN0104            1.
+    SH010450  BAL0104            -1.   BAL0150             1.
+    SH010550  COST            256.15   TRAN0105            1.
+    SH010550  BAL0105            -1.   BAL0150             1.
+    SH010750  COST            149.33   TRAN0107            1.
+    SH010750  BAL0164            -1.   BAL0150             1.
+    SH010850  COST            442.54   TRAN0108            1.
+    SH010850  BAL0183            -1.   BAL0150             1.
+    SH010151  COST            361.88   TRAN0101            1.
+    SH010151  BAL0101            -1.   BAL0151             1.
+    SH010251  COST             599.5   TRAN0102            1.
+    SH010251  BAL0102            -1.   BAL0151             1.
+    SH010351  COST            371.69   TRAN0103            1.
+    SH010351  BAL0103            -1.   BAL0151             1.
+    SH010451  COST            368.42   TRAN0104            1.
+    SH010451  BAL0104            -1.   BAL0151             1.
+    SH010551  COST            134.07   TRAN0105            1.
+    SH010551  BAL0105            -1.   BAL0151             1.
+    SH010751  COST            107.91   TRAN0107            1.
+    SH010751  BAL0164            -1.   BAL0151             1.
+    SH010851  COST            466.52   TRAN0108            1.
+    SH010851  BAL0183            -1.   BAL0151             1.
+    SH010152  COST            122.08   TRAN0101            1.
+    SH010152  BAL0101            -1.   BAL0152             1.
+    SH010252  COST              327.   TRAN0102            1.
+    SH010252  BAL0102            -1.   BAL0152             1.
+    SH010352  COST             89.38   TRAN0103            1.
+    SH010352  BAL0103            -1.   BAL0152             1.
+    SH010452  COST            350.98   TRAN0104            1.
+    SH010452  BAL0104            -1.   BAL0152             1.
+    SH010552  COST            321.55   TRAN0105            1.
+    SH010552  BAL0105            -1.   BAL0152             1.
+    SH010852  COST            275.77   TRAN0108            1.
+    SH010852  BAL0183            -1.   BAL0152             1.
+    SH010153  COST            391.31   TRAN0101            1.
+    SH010153  BAL0101            -1.   BAL0153             1.
+    SH010253  COST            693.24   TRAN0102            1.
+    SH010253  BAL0102            -1.   BAL0153             1.
+    SH010353  COST            354.25   TRAN0103            1.
+    SH010353  BAL0103            -1.   BAL0153             1.
+    SH010453  COST            449.08   TRAN0104            1.
+    SH010453  BAL0104            -1.   BAL0153             1.
+    SH010553  COST            200.56   TRAN0105            1.
+    SH010553  BAL0105            -1.   BAL0153             1.
+    SH010653  COST            391.31   TRAN0106            1.
+    SH010653  BAL0152            -1.   BAL0153             1.
+    SH010753  COST            159.14   TRAN0107            1.
+    SH010753  BAL0164            -1.   BAL0153             1.
+    SH010853  COST            439.27   TRAN0108            1.
+    SH010853  BAL0183            -1.   BAL0153             1.
+    SH010154  COST            201.65   TRAN0101            1.
+    SH010154  BAL0101            -1.   BAL0154             1.
+    SH010254  COST            485.05   TRAN0102            1.
+    SH010254  BAL0102            -1.   BAL0154             1.
+    SH010354  COST            236.53   TRAN0103            1.
+    SH010354  BAL0103            -1.   BAL0154             1.
+    SH010454  COST            373.87   TRAN0104            1.
+    SH010454  BAL0104            -1.   BAL0154             1.
+    SH010554  COST            232.17   TRAN0105            1.
+    SH010554  BAL0105            -1.   BAL0154             1.
+    SH010654  COST            221.27   TRAN0106            1.
+    SH010654  BAL0152            -1.   BAL0154             1.
+    SH010854  COST            438.18   TRAN0108            1.
+    SH010854  BAL0183            -1.   BAL0154             1.
+    SH010155  COST            303.02   TRAN0101            1.
+    SH010155  BAL0101            -1.   BAL0155             1.
+    SH010255  COST            522.11   TRAN0102            1.
+    SH010255  BAL0102            -1.   BAL0155             1.
+    SH010355  COST            306.29   TRAN0103            1.
+    SH010355  BAL0103            -1.   BAL0155             1.
+    SH010455  COST            320.46   TRAN0104            1.
+    SH010455  BAL0104            -1.   BAL0155             1.
+    SH010555  COST            167.86   TRAN0105            1.
+    SH010555  BAL0105            -1.   BAL0155             1.
+    SH010655  COST             316.1   TRAN0106            1.
+    SH010655  BAL0152            -1.   BAL0155             1.
+    SH010755  COST            116.63   TRAN0107            1.
+    SH010755  BAL0164            -1.   BAL0155             1.
+    SH010855  COST            320.46   TRAN0108            1.
+    SH010855  BAL0183            -1.   BAL0155             1.
+    SH010156  COST             425.1   TRAN0101            1.
+    SH010156  BAL0101            -1.   BAL0156             1.
+    SH010256  COST            631.11   TRAN0102            1.
+    SH010256  BAL0102            -1.   BAL0156             1.
+    SH010356  COST            332.45   TRAN0103            1.
+    SH010356  BAL0103            -1.   BAL0156             1.
+    SH010456  COST            397.85   TRAN0104            1.
+    SH010456  BAL0104            -1.   BAL0156             1.
+    SH010556  COST            148.24   TRAN0105            1.
+    SH010556  BAL0105            -1.   BAL0156             1.
+    SH010656  COST            369.51   TRAN0106            1.
+    SH010656  BAL0152            -1.   BAL0156             1.
+    SH010756  COST            132.98   TRAN0107            1.
+    SH010756  BAL0164            -1.   BAL0156             1.
+    SH010856  COST            389.13   TRAN0108            1.
+    SH010856  BAL0183            -1.   BAL0156             1.
+    SH010157  COST            284.49   TRAN0101            1.
+    SH010157  BAL0101            -1.   BAL0157             1.
+    SH010257  COST             566.8   TRAN0102            1.
+    SH010257  BAL0102            -1.   BAL0157             1.
+    SH010357  COST             316.1   TRAN0103            1.
+    SH010357  BAL0103            -1.   BAL0157             1.
+    SH010457  COST            255.06   TRAN0104            1.
+    SH010457  BAL0104            -1.   BAL0157             1.
+    SH010557  COST            183.12   TRAN0105            1.
+    SH010557  BAL0105            -1.   BAL0157             1.
+    SH010657  COST            347.71   TRAN0106            1.
+    SH010657  BAL0152            -1.   BAL0157             1.
+    SH010757  COST            161.32   TRAN0107            1.
+    SH010757  BAL0164            -1.   BAL0157             1.
+    SH010857  COST            251.79   TRAN0108            1.
+    SH010857  BAL0183            -1.   BAL0157             1.
+    SH010158  COST            320.46   TRAN0101            1.
+    SH010158  BAL0101            -1.   BAL0158             1.
+    SH010258  COST            567.89   TRAN0102            1.
+    SH010258  BAL0102            -1.   BAL0158             1.
+    SH010358  COST            303.02   TRAN0103            1.
+    SH010358  BAL0103            -1.   BAL0158             1.
+    SH010458  COST            373.87   TRAN0104            1.
+    SH010458  BAL0104            -1.   BAL0158             1.
+    SH010558  COST             22.89   TRAN0105            1.
+    SH010558  BAL0105            -1.   BAL0158             1.
+    SH010658  COST            355.34   TRAN0106            1.
+    SH010658  BAL0152            -1.   BAL0158             1.
+    SH010758  COST             74.12   TRAN0107            1.
+    SH010758  BAL0164            -1.   BAL0158             1.
+    SH010858  COST            276.86   TRAN0108            1.
+    SH010858  BAL0183            -1.   BAL0158             1.
+    SH010159  COST            224.54   TRAN0101            1.
+    SH010159  BAL0101            -1.   BAL0159             1.
+    SH010259  COST            542.82   TRAN0102            1.
+    SH010259  BAL0102            -1.   BAL0159             1.
+    SH010359  COST            259.42   TRAN0103            1.
+    SH010359  BAL0103            -1.   BAL0159             1.
+    SH010459  COST            265.96   TRAN0104            1.
+    SH010459  BAL0104            -1.   BAL0159             1.
+    SH010559  COST            173.31   TRAN0105            1.
+    SH010559  BAL0105            -1.   BAL0159             1.
+    SH010659  COST            323.73   TRAN0106            1.
+    SH010659  BAL0152            -1.   BAL0159             1.
+    SH010759  COST            114.45   TRAN0107            1.
+    SH010759  BAL0164            -1.   BAL0159             1.
+    SH010859  COST            277.95   TRAN0108            1.
+    SH010859  BAL0183            -1.   BAL0159             1.
+    SH010160  COST            284.49   TRAN0101            1.
+    SH010160  BAL0101            -1.   BAL0160             1.
+    SH010260  COST             599.5   TRAN0102            1.
+    SH010260  BAL0102            -1.   BAL0160             1.
+    SH010360  COST            308.47   TRAN0103            1.
+    SH010360  BAL0103            -1.   BAL0160             1.
+    SH010460  COST            340.08   TRAN0104            1.
+    SH010460  BAL0104            -1.   BAL0160             1.
+    SH010560  COST            147.15   TRAN0105            1.
+    SH010560  BAL0105            -1.   BAL0160             1.
+    SH010660  COST            352.07   TRAN0106            1.
+    SH010660  BAL0152            -1.   BAL0160             1.
+    SH010760  COST             95.92   TRAN0107            1.
+    SH010760  BAL0164            -1.   BAL0160             1.
+    SH010860  COST            325.91   TRAN0108            1.
+    SH010860  BAL0183            -1.   BAL0160             1.
+    SH010163  COST            289.94   TRAN0101            1.
+    SH010163  BAL0101            -1.   BAL0163             1.
+    SH010263  COST            538.46   TRAN0102            1.
+    SH010263  BAL0102            -1.   BAL0163             1.
+    SH010363  COST            312.83   TRAN0103            1.
+    SH010363  BAL0103            -1.   BAL0163             1.
+    SH010463  COST            402.21   TRAN0104            1.
+    SH010463  BAL0104            -1.   BAL0163             1.
+    SH010563  COST            165.68   TRAN0105            1.
+    SH010563  BAL0105            -1.   BAL0163             1.
+    SH010663  COST            343.35   TRAN0106            1.
+    SH010663  BAL0152            -1.   BAL0163             1.
+    SH010763  COST            135.16   TRAN0107            1.
+    SH010763  BAL0164            -1.   BAL0163             1.
+    SH010863  COST              436.   TRAN0108            1.
+    SH010863  BAL0183            -1.   BAL0163             1.
+    SH010164  COST            216.91   TRAN0101            1.
+    SH010164  BAL0101            -1.   BAL0164             1.
+    SH010264  COST            573.34   TRAN0102            1.
+    SH010264  BAL0102            -1.   BAL0164             1.
+    SH010364  COST            243.07   TRAN0103            1.
+    SH010364  BAL0103            -1.   BAL0164             1.
+    SH010464  COST            366.24   TRAN0104            1.
+    SH010464  BAL0104            -1.   BAL0164             1.
+    SH010564  COST             63.22   TRAN0105            1.
+    SH010564  BAL0105            -1.   BAL0164             1.
+    SH010664  COST            345.53   TRAN0106            1.
+    SH010664  BAL0152            -1.   BAL0164             1.
+    SH010864  COST             272.5   TRAN0108            1.
+    SH010864  BAL0183            -1.   BAL0164             1.
+    SH010165  COST            470.88   TRAN0101            1.
+    SH010165  BAL0101            -1.   BAL0165             1.
+    SH010265  COST            334.63   TRAN0102            1.
+    SH010265  BAL0102            -1.   BAL0165             1.
+    SH010365  COST            550.45   TRAN0103            1.
+    SH010365  BAL0103            -1.   BAL0165             1.
+    SH010465  COST            422.92   TRAN0104            1.
+    SH010465  BAL0104            -1.   BAL0165             1.
+    SH010565  COST            658.36   TRAN0105            1.
+    SH010565  BAL0105            -1.   BAL0165             1.
+    SH010865  COST            452.35   TRAN0108            1.
+    SH010865  BAL0183            -1.   BAL0165             1.
+    SH010166  COST             610.4   TRAN0101            1.
+    SH010166  BAL0101            -1.   BAL0166             1.
+    SH010266  COST            282.31   TRAN0102            1.
+    SH010266  BAL0102            -1.   BAL0166             1.
+    SH010366  COST            630.02   TRAN0103            1.
+    SH010366  BAL0103            -1.   BAL0166             1.
+    SH010466  COST            606.04   TRAN0104            1.
+    SH010466  BAL0104            -1.   BAL0166             1.
+    SH010566  COST             773.9   TRAN0105            1.
+    SH010566  BAL0105            -1.   BAL0166             1.
+    SH010866  COST             610.4   TRAN0108            1.
+    SH010866  BAL0183            -1.   BAL0166             1.
+    SH010167  COST            463.25   TRAN0101            1.
+    SH010167  BAL0101            -1.   BAL0167             1.
+    SH010267  COST            252.88   TRAN0102            1.
+    SH010267  BAL0102            -1.   BAL0167             1.
+    SH010367  COST            537.37   TRAN0103            1.
+    SH010367  BAL0103            -1.   BAL0167             1.
+    SH010467  COST            498.13   TRAN0104            1.
+    SH010467  BAL0104            -1.   BAL0167             1.
+    SH010567  COST            658.36   TRAN0105            1.
+    SH010567  BAL0105            -1.   BAL0167             1.
+    SH010867  COST            499.22   TRAN0108            1.
+    SH010867  BAL0183            -1.   BAL0167             1.
+    SH010168  COST            647.46   TRAN0101            1.
+    SH010168  BAL0101            -1.   BAL0168             1.
+    SH010268  COST              436.   TRAN0102            1.
+    SH010268  BAL0102            -1.   BAL0168             1.
+    SH010368  COST             610.4   TRAN0103            1.
+    SH010368  BAL0103            -1.   BAL0168             1.
+    SH010468  COST            765.18   TRAN0104            1.
+    SH010468  BAL0104            -1.   BAL0168             1.
+    SH010568  COST           1031.14   TRAN0105            1.
+    SH010568  BAL0105            -1.   BAL0168             1.
+    SH010868  COST            818.59   TRAN0108            1.
+    SH010868  BAL0183            -1.   BAL0168             1.
+    SH010169  COST            587.51   TRAN0101            1.
+    SH010169  BAL0101            -1.   BAL0169             1.
+    SH010269  COST            240.89   TRAN0102            1.
+    SH010269  BAL0102            -1.   BAL0169             1.
+    SH010369  COST             555.9   TRAN0103            1.
+    SH010369  BAL0103            -1.   BAL0169             1.
+    SH010469  COST            677.98   TRAN0104            1.
+    SH010469  BAL0104            -1.   BAL0169             1.
+    SH010569  COST            704.14   TRAN0105            1.
+    SH010569  BAL0105            -1.   BAL0169             1.
+    SH010869  COST            717.22   TRAN0108            1.
+    SH010869  BAL0183            -1.   BAL0169             1.
+    SH010171  COST             479.6   TRAN0101            1.
+    SH010171  BAL0101            -1.   BAL0171             1.
+    SH010371  COST            571.16   TRAN0103            1.
+    SH010371  BAL0103            -1.   BAL0171             1.
+    SH010471  COST            567.89   TRAN0104            1.
+    SH010471  BAL0104            -1.   BAL0171             1.
+    SH010571  COST            633.29   TRAN0105            1.
+    SH010571  BAL0105            -1.   BAL0171             1.
+    SH010671  COST            426.19   TRAN0106            1.
+    SH010671  BAL0152            -1.   BAL0171             1.
+    SH010771  COST            767.36   TRAN0107            1.
+    SH010771  BAL0164            -1.   BAL0171             1.
+    SH010871  COST            580.97   TRAN0108            1.
+    SH010871  BAL0183            -1.   BAL0171             1.
+    SH010172  COST            639.83   TRAN0101            1.
+    SH010172  BAL0101            -1.   BAL0172             1.
+    SH010272  COST            591.87   TRAN0102            1.
+    SH010272  BAL0102            -1.   BAL0172             1.
+    SH010372  COST            672.53   TRAN0103            1.
+    SH010372  BAL0103            -1.   BAL0172             1.
+    SH010472  COST             621.3   TRAN0104            1.
+    SH010472  BAL0104            -1.   BAL0172             1.
+    SH010572  COST            831.67   TRAN0105            1.
+    SH010572  BAL0105            -1.   BAL0172             1.
+    SH010872  COST             621.3   TRAN0108            1.
+    SH010872  BAL0183            -1.   BAL0172             1.
+    SH010173  COST             425.1   TRAN0101            1.
+    SH010173  BAL0101            -1.   BAL0173             1.
+    SH010273  COST            397.85   TRAN0102            1.
+    SH010273  BAL0102            -1.   BAL0173             1.
+    SH010373  COST            368.42   TRAN0103            1.
+    SH010373  BAL0103            -1.   BAL0173             1.
+    SH010473  COST            498.13   TRAN0104            1.
+    SH010473  BAL0104            -1.   BAL0173             1.
+    SH010573  COST            614.76   TRAN0105            1.
+    SH010573  BAL0105            -1.   BAL0173             1.
+    SH010673  COST            332.45   TRAN0106            1.
+    SH010673  BAL0152            -1.   BAL0173             1.
+    SH010873  COST            549.36   TRAN0108            1.
+    SH010873  BAL0183            -1.   BAL0173             1.
+    SH010174  COST            597.32   TRAN0101            1.
+    SH010174  BAL0101            -1.   BAL0174             1.
+    SH010274  COST             228.9   TRAN0102            1.
+    SH010274  BAL0102            -1.   BAL0174             1.
+    SH010374  COST             621.3   TRAN0103            1.
+    SH010374  BAL0103            -1.   BAL0174             1.
+    SH010474  COST            694.33   TRAN0104            1.
+    SH010474  BAL0104            -1.   BAL0174             1.
+    SH010574  COST            798.97   TRAN0105            1.
+    SH010574  BAL0105            -1.   BAL0174             1.
+    SH010874  COST            674.71   TRAN0108            1.
+    SH010874  BAL0183            -1.   BAL0174             1.
+    SH010275  COST            603.86   TRAN0102            1.
+    SH010275  BAL0102            -1.   BAL0175             1.
+    SH010176  COST            503.58   TRAN0101            1.
+    SH010176  BAL0101            -1.   BAL0176             1.
+    SH010276  COST            437.09   TRAN0102            1.
+    SH010276  BAL0102            -1.   BAL0176             1.
+    SH010376  COST            439.27   TRAN0103            1.
+    SH010376  BAL0103            -1.   BAL0176             1.
+    SH010476  COST             686.7   TRAN0104            1.
+    SH010476  BAL0104            -1.   BAL0176             1.
+    SH010576  COST             686.7   TRAN0105            1.
+    SH010576  BAL0105            -1.   BAL0176             1.
+    SH010676  COST            415.29   TRAN0106            1.
+    SH010676  BAL0152            -1.   BAL0176             1.
+    SH010876  COST            846.93   TRAN0108            1.
+    SH010876  BAL0183            -1.   BAL0176             1.
+    SH010177  COST            474.15   TRAN0101            1.
+    SH010177  BAL0101            -1.   BAL0177             1.
+    SH010277  COST            296.48   TRAN0102            1.
+    SH010277  BAL0102            -1.   BAL0177             1.
+    SH010377  COST            502.49   TRAN0103            1.
+    SH010377  BAL0103            -1.   BAL0177             1.
+    SH010477  COST            437.09   TRAN0104            1.
+    SH010477  BAL0104            -1.   BAL0177             1.
+    SH010577  COST             610.4   TRAN0105            1.
+    SH010577  BAL0105            -1.   BAL0177             1.
+    SH010877  COST             348.8   TRAN0108            1.
+    SH010877  BAL0183            -1.   BAL0177             1.
+    SH010178  COST            829.49   TRAN0101            1.
+    SH010178  BAL0101            -1.   BAL0178             1.
+    SH010278  COST            481.78   TRAN0102            1.
+    SH010278  BAL0102            -1.   BAL0178             1.
+    SH010378  COST            853.47   TRAN0103            1.
+    SH010378  BAL0103            -1.   BAL0178             1.
+    SH010478  COST            746.65   TRAN0104            1.
+    SH010478  BAL0104            -1.   BAL0178             1.
+    SH010578  COST            958.11   TRAN0105            1.
+    SH010578  BAL0105            -1.   BAL0178             1.
+    SH010878  COST            834.94   TRAN0108            1.
+    SH010878  BAL0183            -1.   BAL0178             1.
+    SH010179  COST            779.35   TRAN0101            1.
+    SH010179  BAL0101            -1.   BAL0179             1.
+    SH010279  COST            293.21   TRAN0102            1.
+    SH010279  BAL0102            -1.   BAL0179             1.
+    SH010379  COST            753.19   TRAN0103            1.
+    SH010379  BAL0103            -1.   BAL0179             1.
+    SH010479  COST             784.8   TRAN0104            1.
+    SH010479  BAL0104            -1.   BAL0179             1.
+    SH010879  COST            769.54   TRAN0108            1.
+    SH010879  BAL0183            -1.   BAL0179             1.
+    SH010180  COST            345.53   TRAN0101            1.
+    SH010180  BAL0101            -1.   BAL0180             1.
+    SH010280  COST            430.55   TRAN0102            1.
+    SH010280  BAL0102            -1.   BAL0180             1.
+    SH010380  COST            476.33   TRAN0103            1.
+    SH010380  BAL0103            -1.   BAL0180             1.
+    SH010480  COST            407.66   TRAN0104            1.
+    SH010480  BAL0104            -1.   BAL0180             1.
+    SH010580  COST            550.45   TRAN0105            1.
+    SH010580  BAL0105            -1.   BAL0180             1.
+    SH010880  COST             261.6   TRAN0108            1.
+    SH010880  BAL0183            -1.   BAL0180             1.
+    SH010182  COST            634.38   TRAN0101            1.
+    SH010182  BAL0101            -1.   BAL0182             1.
+    SH010282  COST            358.61   TRAN0102            1.
+    SH010282  BAL0102            -1.   BAL0182             1.
+    SH010382  COST            713.95   TRAN0103            1.
+    SH010382  BAL0103            -1.   BAL0182             1.
+    SH010482  COST            769.54   TRAN0104            1.
+    SH010482  BAL0104            -1.   BAL0182             1.
+    SH010582  COST           1250.23   TRAN0105            1.
+    SH010582  BAL0105            -1.   BAL0182             1.
+    SH010882  COST            853.47   TRAN0108            1.
+    SH010882  BAL0183            -1.   BAL0182             1.
+    SH010183  COST            192.93   TRAN0101            1.
+    SH010183  BAL0101            -1.   BAL0183             1.
+    SH010283  COST             566.8   TRAN0102            1.
+    SH010283  BAL0102            -1.   BAL0183             1.
+    SH010383  COST            296.48   TRAN0103            1.
+    SH010383  BAL0103            -1.   BAL0183             1.
+    SH010483  COST             64.31   TRAN0104            1.
+    SH010483  BAL0104            -1.   BAL0183             1.
+    SH010583  COST            378.23   TRAN0105            1.
+    SH010583  BAL0105            -1.   BAL0183             1.
+    SH010683  COST            270.32   TRAN0106            1.
+    SH010683  BAL0152            -1.   BAL0183             1.
+    SH010184  COST            331.36   TRAN0101            1.
+    SH010184  BAL0101            -1.   BAL0184             1.
+    SH010284  COST            209.28   TRAN0102            1.
+    SH010284  BAL0102            -1.   BAL0184             1.
+    SH010384  COST            396.76   TRAN0103            1.
+    SH010384  BAL0103            -1.   BAL0184             1.
+    SH010484  COST             403.3   TRAN0104            1.
+    SH010484  BAL0104            -1.   BAL0184             1.
+    SH010584  COST             534.1   TRAN0105            1.
+    SH010584  BAL0105            -1.   BAL0184             1.
+    SH010684  COST            332.45   TRAN0106            1.
+    SH010684  BAL0152            -1.   BAL0184             1.
+    SH010884  COST            422.92   TRAN0108            1.
+    SH010884  BAL0183            -1.   BAL0184             1.
+    SH020201  COST            368.28   TRAN0202            1.
+    SH020201  BAL0202            -1.   BAL0201             1.
+    SH020301  COST            141.36   TRAN0203            1.
+    SH020301  BAL0203            -1.   BAL0201             1.
+    SH020401  COST            257.92   TRAN0204            1.
+    SH020401  BAL0204            -1.   BAL0201             1.
+    SH020501  COST            293.88   TRAN0205            1.
+    SH020501  BAL0205            -1.   BAL0201             1.
+    SH020601  COST            156.24   TRAN0206            1.
+    SH020601  BAL0252            -1.   BAL0201             1.
+    SH020801  COST            177.32   TRAN0208            1.
+    SH020801  BAL0283            -1.   BAL0201             1.
+    SH020102  COST            587.76   TRAN0201            1.
+    SH020102  BAL0201            -1.   BAL0202             1.
+    SH020302  COST            517.08   TRAN0203            1.
+    SH020302  BAL0203            -1.   BAL0202             1.
+    SH020402  COST            758.88   TRAN0204            1.
+    SH020402  BAL0204            -1.   BAL0202             1.
+    SH020502  COST            918.84   TRAN0205            1.
+    SH020502  BAL0205            -1.   BAL0202             1.
+    SH020602  COST            468.72   TRAN0206            1.
+    SH020602  BAL0252            -1.   BAL0202             1.
+    SH020802  COST            646.04   TRAN0208            1.
+    SH020802  BAL0283            -1.   BAL0202             1.
+    SH020103  COST             303.8   TRAN0201            1.
+    SH020103  BAL0201            -1.   BAL0203             1.
+    SH020203  COST            587.76   TRAN0202            1.
+    SH020203  BAL0202            -1.   BAL0203             1.
+    SH020403  COST            455.08   TRAN0204            1.
+    SH020403  BAL0204            -1.   BAL0203             1.
+    SH020503  COST            352.16   TRAN0205            1.
+    SH020503  BAL0205            -1.   BAL0203             1.
+    SH020603  COST             111.6   TRAN0206            1.
+    SH020603  BAL0252            -1.   BAL0203             1.
+    SH020803  COST             316.2   TRAN0208            1.
+    SH020803  BAL0283            -1.   BAL0203             1.
+    SH020104  COST            215.76   TRAN0201            1.
+    SH020104  BAL0201            -1.   BAL0204             1.
+    SH020204  COST            623.72   TRAN0202            1.
+    SH020204  BAL0202            -1.   BAL0204             1.
+    SH020304  COST            301.32   TRAN0203            1.
+    SH020304  BAL0203            -1.   BAL0204             1.
+    SH020504  COST            395.56   TRAN0205            1.
+    SH020504  BAL0205            -1.   BAL0204             1.
+    SH020604  COST             303.8   TRAN0206            1.
+    SH020604  BAL0252            -1.   BAL0204             1.
+    SH020704  COST            333.56   TRAN0207            1.
+    SH020704  BAL0264            -1.   BAL0204             1.
+    SH020804  COST             71.92   TRAN0208            1.
+    SH020804  BAL0283            -1.   BAL0204             1.
+    SH020105  COST             334.8   TRAN0201            1.
+    SH020105  BAL0201            -1.   BAL0205             1.
+    SH020205  COST            639.84   TRAN0202            1.
+    SH020205  BAL0202            -1.   BAL0205             1.
+    SH020305  COST            352.16   TRAN0203            1.
+    SH020305  BAL0203            -1.   BAL0205             1.
+    SH020405  COST             353.4   TRAN0204            1.
+    SH020405  BAL0204            -1.   BAL0205             1.
+    SH020605  COST            404.24   TRAN0206            1.
+    SH020605  BAL0252            -1.   BAL0205             1.
+    SH020705  COST            414.16   TRAN0207            1.
+    SH020705  BAL0264            -1.   BAL0205             1.
+    SH020805  COST            336.04   TRAN0208            1.
+    SH020805  BAL0283            -1.   BAL0205             1.
+    SH020106  COST            246.76   TRAN0201            1.
+    SH020106  BAL0201            -1.   BAL0206             1.
+    SH020206  COST            517.08   TRAN0202            1.
+    SH020206  BAL0202            -1.   BAL0206             1.
+    SH020306  COST            264.12   TRAN0203            1.
+    SH020306  BAL0203            -1.   BAL0206             1.
+    SH020406  COST            271.56   TRAN0204            1.
+    SH020406  BAL0204            -1.   BAL0206             1.
+    SH020506  COST            312.48   TRAN0205            1.
+    SH020506  BAL0205            -1.   BAL0206             1.
+    SH020606  COST            255.44   TRAN0206            1.
+    SH020606  BAL0252            -1.   BAL0206             1.
+    SH020706  COST              248.   TRAN0207            1.
+    SH020706  BAL0264            -1.   BAL0206             1.
+    SH020806  COST            187.24   TRAN0208            1.
+    SH020806  BAL0283            -1.   BAL0206             1.
+    SH020107  COST             26.04   TRAN0201            1.
+    SH020107  BAL0201            -1.   BAL0207             1.
+    SH020207  COST            362.08   TRAN0202            1.
+    SH020207  BAL0202            -1.   BAL0207             1.
+    SH020307  COST            153.76   TRAN0203            1.
+    SH020307  BAL0203            -1.   BAL0207             1.
+    SH020407  COST            256.68   TRAN0204            1.
+    SH020407  BAL0204            -1.   BAL0207             1.
+    SH020507  COST            283.96   TRAN0205            1.
+    SH020507  BAL0205            -1.   BAL0207             1.
+    SH020607  COST              155.   TRAN0206            1.
+    SH020607  BAL0252            -1.   BAL0207             1.
+    SH020707  COST            287.68   TRAN0207            1.
+    SH020707  BAL0264            -1.   BAL0207             1.
+    SH020807  COST             192.2   TRAN0208            1.
+    SH020807  BAL0283            -1.   BAL0207             1.
+    SH020108  COST             81.84   TRAN0201            1.
+    SH020108  BAL0201            -1.   BAL0208             1.
+    SH020208  COST            466.24   TRAN0202            1.
+    SH020208  BAL0202            -1.   BAL0208             1.
+    SH020308  COST            174.84   TRAN0203            1.
+    SH020308  BAL0203            -1.   BAL0208             1.
+    SH020408  COST            306.28   TRAN0204            1.
+    SH020408  BAL0204            -1.   BAL0208             1.
+    SH020508  COST            225.68   TRAN0205            1.
+    SH020508  BAL0205            -1.   BAL0208             1.
+    SH020608  COST            205.84   TRAN0206            1.
+    SH020608  BAL0252            -1.   BAL0208             1.
+    SH020808  COST            231.88   TRAN0208            1.
+    SH020808  BAL0283            -1.   BAL0208             1.
+    SH020109  COST            171.12   TRAN0201            1.
+    SH020109  BAL0201            -1.   BAL0209             1.
+    SH020209  COST            474.92   TRAN0202            1.
+    SH020209  BAL0202            -1.   BAL0209             1.
+    SH020309  COST            208.32   TRAN0203            1.
+    SH020309  BAL0203            -1.   BAL0209             1.
+    SH020409  COST            313.72   TRAN0204            1.
+    SH020409  BAL0204            -1.   BAL0209             1.
+    SH020509  COST            296.36   TRAN0205            1.
+    SH020509  BAL0205            -1.   BAL0209             1.
+    SH020709  COST            243.04   TRAN0207            1.
+    SH020709  BAL0264            -1.   BAL0209             1.
+    SH020809  COST            240.56   TRAN0208            1.
+    SH020809  BAL0283            -1.   BAL0209             1.
+    SH020110  COST            306.28   TRAN0201            1.
+    SH020110  BAL0201            -1.   BAL0210             1.
+    SH020210  COST            195.92   TRAN0202            1.
+    SH020210  BAL0202            -1.   BAL0210             1.
+    SH020310  COST             297.6   TRAN0203            1.
+    SH020310  BAL0203            -1.   BAL0210             1.
+    SH020410  COST            445.16   TRAN0204            1.
+    SH020410  BAL0204            -1.   BAL0210             1.
+    SH020510  COST             477.4   TRAN0205            1.
+    SH020510  BAL0205            -1.   BAL0210             1.
+    SH020610  COST              279.   TRAN0206            1.
+    SH020610  BAL0252            -1.   BAL0210             1.
+    SH020810  COST             378.2   TRAN0208            1.
+    SH020810  BAL0283            -1.   BAL0210             1.
+    SH020111  COST            131.44   TRAN0201            1.
+    SH020111  BAL0201            -1.   BAL0211             1.
+    SH020211  COST             613.8   TRAN0202            1.
+    SH020211  BAL0202            -1.   BAL0211             1.
+    SH020311  COST            307.52   TRAN0203            1.
+    SH020311  BAL0203            -1.   BAL0211             1.
+    SH020411  COST            172.36   TRAN0204            1.
+    SH020411  BAL0204            -1.   BAL0211             1.
+    SH020511  COST            422.84   TRAN0205            1.
+    SH020511  BAL0205            -1.   BAL0211             1.
+    SH020611  COST            243.04   TRAN0206            1.
+    SH020611  BAL0252            -1.   BAL0211             1.
+    SH020811  COST            126.48   TRAN0208            1.
+    SH020811  BAL0283            -1.   BAL0211             1.
+    SH020112  COST            109.12   TRAN0201            1.
+    SH020112  BAL0201            -1.   BAL0212             1.
+    SH020212  COST            420.36   TRAN0202            1.
+    SH020212  BAL0202            -1.   BAL0212             1.
+    SH020312  COST            181.04   TRAN0203            1.
+    SH020312  BAL0203            -1.   BAL0212             1.
+    SH020412  COST              248.   TRAN0204            1.
+    SH020412  BAL0204            -1.   BAL0212             1.
+    SH020512  COST            331.08   TRAN0205            1.
+    SH020512  BAL0205            -1.   BAL0212             1.
+    SH020612  COST             179.8   TRAN0206            1.
+    SH020612  BAL0252            -1.   BAL0212             1.
+    SH020812  COST            181.04   TRAN0208            1.
+    SH020812  BAL0283            -1.   BAL0212             1.
+    SH020114  COST            176.08   TRAN0201            1.
+    SH020114  BAL0201            -1.   BAL0214             1.
+    SH020214  COST            510.88   TRAN0202            1.
+    SH020214  BAL0202            -1.   BAL0214             1.
+    SH020314  COST            243.04   TRAN0203            1.
+    SH020314  BAL0203            -1.   BAL0214             1.
+    SH020414  COST            246.76   TRAN0204            1.
+    SH020414  BAL0204            -1.   BAL0214             1.
+    SH020514  COST            436.48   TRAN0205            1.
+    SH020514  BAL0205            -1.   BAL0214             1.
+    SH020614  COST            233.12   TRAN0206            1.
+    SH020614  BAL0252            -1.   BAL0214             1.
+    SH020814  COST            156.24   TRAN0208            1.
+    SH020814  BAL0283            -1.   BAL0214             1.
+    SH020115  COST            375.72   TRAN0201            1.
+    SH020115  BAL0201            -1.   BAL0215             1.
+    SH020215  COST            197.16   TRAN0202            1.
+    SH020215  BAL0202            -1.   BAL0215             1.
+    SH020315  COST            290.16   TRAN0203            1.
+    SH020315  BAL0203            -1.   BAL0215             1.
+    SH020415  COST            590.24   TRAN0204            1.
+    SH020415  BAL0204            -1.   BAL0215             1.
+    SH020515  COST            493.52   TRAN0205            1.
+    SH020515  BAL0205            -1.   BAL0215             1.
+    SH020615  COST            233.12   TRAN0206            1.
+    SH020615  BAL0252            -1.   BAL0215             1.
+    SH020815  COST            462.52   TRAN0208            1.
+    SH020815  BAL0283            -1.   BAL0215             1.
+    SH020116  COST            195.92   TRAN0201            1.
+    SH020116  BAL0201            -1.   BAL0216             1.
+    SH020216  COST             347.2   TRAN0202            1.
+    SH020216  BAL0202            -1.   BAL0216             1.
+    SH020316  COST            281.48   TRAN0203            1.
+    SH020316  BAL0203            -1.   BAL0216             1.
+    SH020416  COST            355.88   TRAN0204            1.
+    SH020416  BAL0204            -1.   BAL0216             1.
+    SH020516  COST            395.56   TRAN0205            1.
+    SH020516  BAL0205            -1.   BAL0216             1.
+    SH020616  COST            162.44   TRAN0206            1.
+    SH020616  BAL0252            -1.   BAL0216             1.
+    SH020816  COST             254.2   TRAN0208            1.
+    SH020816  BAL0283            -1.   BAL0216             1.
+    SH020117  COST            187.24   TRAN0201            1.
+    SH020117  BAL0201            -1.   BAL0217             1.
+    SH020217  COST             626.2   TRAN0202            1.
+    SH020217  BAL0202            -1.   BAL0217             1.
+    SH020317  COST            339.76   TRAN0203            1.
+    SH020317  BAL0203            -1.   BAL0217             1.
+    SH020417  COST             70.68   TRAN0204            1.
+    SH020417  BAL0204            -1.   BAL0217             1.
+    SH020517  COST            369.52   TRAN0205            1.
+    SH020517  BAL0205            -1.   BAL0217             1.
+    SH020717  COST             365.8   TRAN0207            1.
+    SH020717  BAL0264            -1.   BAL0217             1.
+    SH020817  COST             33.48   TRAN0208            1.
+    SH020817  BAL0283            -1.   BAL0217             1.
+    SH020118  COST              217.   TRAN0201            1.
+    SH020118  BAL0201            -1.   BAL0218             1.
+    SH020218  COST            447.64   TRAN0202            1.
+    SH020218  BAL0202            -1.   BAL0218             1.
+    SH020318  COST             334.8   TRAN0203            1.
+    SH020318  BAL0203            -1.   BAL0218             1.
+    SH020418  COST            190.96   TRAN0204            1.
+    SH020418  BAL0204            -1.   BAL0218             1.
+    SH020518  COST            504.68   TRAN0205            1.
+    SH020518  BAL0205            -1.   BAL0218             1.
+    SH020618  COST            436.48   TRAN0206            1.
+    SH020618  BAL0252            -1.   BAL0218             1.
+    SH020818  COST            127.72   TRAN0208            1.
+    SH020818  BAL0283            -1.   BAL0218             1.
+    SH020119  COST            307.52   TRAN0201            1.
+    SH020119  BAL0201            -1.   BAL0219             1.
+    SH020219  COST            851.88   TRAN0202            1.
+    SH020219  BAL0202            -1.   BAL0219             1.
+    SH020319  COST            393.08   TRAN0203            1.
+    SH020319  BAL0203            -1.   BAL0219             1.
+    SH020419  COST            197.16   TRAN0204            1.
+    SH020419  BAL0204            -1.   BAL0219             1.
+    SH020519  COST            257.92   TRAN0205            1.
+    SH020519  BAL0205            -1.   BAL0219             1.
+    SH020619  COST             427.8   TRAN0206            1.
+    SH020619  BAL0252            -1.   BAL0219             1.
+    SH020819  COST            122.76   TRAN0208            1.
+    SH020819  BAL0283            -1.   BAL0219             1.
+    SH020120  COST             254.2   TRAN0201            1.
+    SH020120  BAL0201            -1.   BAL0220             1.
+    SH020220  COST            846.92   TRAN0202            1.
+    SH020220  BAL0202            -1.   BAL0220             1.
+    SH020320  COST            368.28   TRAN0203            1.
+    SH020320  BAL0203            -1.   BAL0220             1.
+    SH020420  COST            140.12   TRAN0204            1.
+    SH020420  BAL0204            -1.   BAL0220             1.
+    SH020520  COST            360.84   TRAN0205            1.
+    SH020520  BAL0205            -1.   BAL0220             1.
+    SH020820  COST            156.24   TRAN0208            1.
+    SH020820  BAL0283            -1.   BAL0220             1.
+    SH020121  COST            499.72   TRAN0201            1.
+    SH020121  BAL0201            -1.   BAL0221             1.
+    SH020221  COST            456.32   TRAN0202            1.
+    SH020221  BAL0202            -1.   BAL0221             1.
+    SH020321  COST            553.04   TRAN0203            1.
+    SH020321  BAL0203            -1.   BAL0221             1.
+    SH020421  COST             396.8   TRAN0204            1.
+    SH020421  BAL0204            -1.   BAL0221             1.
+    SH020521  COST              682.   TRAN0205            1.
+    SH020521  BAL0205            -1.   BAL0221             1.
+    SH020821  COST             396.8   TRAN0208            1.
+    SH020821  BAL0283            -1.   BAL0221             1.
+    SH020122  COST            307.52   TRAN0201            1.
+    SH020122  BAL0201            -1.   BAL0222             1.
+    SH020222  COST            716.72   TRAN0202            1.
+    SH020222  BAL0202            -1.   BAL0222             1.
+    SH020322  COST            370.76   TRAN0203            1.
+    SH020322  BAL0203            -1.   BAL0222             1.
+    SH020422  COST            277.76   TRAN0204            1.
+    SH020422  BAL0204            -1.   BAL0222             1.
+    SH020522  COST            221.96   TRAN0205            1.
+    SH020522  BAL0205            -1.   BAL0222             1.
+    SH020622  COST             384.4   TRAN0206            1.
+    SH020622  BAL0252            -1.   BAL0222             1.
+    SH020822  COST            172.36   TRAN0208            1.
+    SH020822  BAL0283            -1.   BAL0222             1.
+    SH020123  COST            290.16   TRAN0201            1.
+    SH020123  BAL0201            -1.   BAL0223             1.
+    SH020223  COST            670.84   TRAN0202            1.
+    SH020223  BAL0202            -1.   BAL0223             1.
+    SH020323  COST            355.88   TRAN0203            1.
+    SH020323  BAL0203            -1.   BAL0223             1.
+    SH020423  COST            207.08   TRAN0204            1.
+    SH020423  BAL0204            -1.   BAL0223             1.
+    SH020523  COST            205.84   TRAN0205            1.
+    SH020523  BAL0205            -1.   BAL0223             1.
+    SH020823  COST            172.36   TRAN0208            1.
+    SH020823  BAL0283            -1.   BAL0223             1.
+    SH020124  COST           1780.64   TRAN0201            1.
+    SH020124  BAL0201            -1.   BAL0224             1.
+    SH020125  COST            479.88   TRAN0201            1.
+    SH020125  BAL0201            -1.   BAL0225             1.
+    SH020225  COST            529.48   TRAN0202            1.
+    SH020225  BAL0202            -1.   BAL0225             1.
+    SH020325  COST            633.64   TRAN0203            1.
+    SH020325  BAL0203            -1.   BAL0225             1.
+    SH020425  COST            431.52   TRAN0204            1.
+    SH020425  BAL0204            -1.   BAL0225             1.
+    SH020525  COST            701.84   TRAN0205            1.
+    SH020525  BAL0205            -1.   BAL0225             1.
+    SH020625  COST            499.72   TRAN0206            1.
+    SH020625  BAL0252            -1.   BAL0225             1.
+    SH020825  COST             378.2   TRAN0208            1.
+    SH020825  BAL0283            -1.   BAL0225             1.
+    SH020426  COST             334.8   TRAN0204            1.
+    SH020426  BAL0204            -1.   BAL0226             1.
+    SH020127  COST            290.16   TRAN0201            1.
+    SH020127  BAL0201            -1.   BAL0227             1.
+    SH020227  COST            352.16   TRAN0202            1.
+    SH020227  BAL0202            -1.   BAL0227             1.
+    SH020327  COST            358.36   TRAN0203            1.
+    SH020327  BAL0203            -1.   BAL0227             1.
+    SH020427  COST             415.4   TRAN0204            1.
+    SH020427  BAL0204            -1.   BAL0227             1.
+    SH020527  COST            468.72   TRAN0205            1.
+    SH020527  BAL0205            -1.   BAL0227             1.
+    SH020627  COST            332.32   TRAN0206            1.
+    SH020627  BAL0252            -1.   BAL0227             1.
+    SH020827  COST            312.48   TRAN0208            1.
+    SH020827  BAL0283            -1.   BAL0227             1.
+    SH020128  COST            301.32   TRAN0201            1.
+    SH020128  BAL0201            -1.   BAL0228             1.
+    SH020228  COST            705.56   TRAN0202            1.
+    SH020228  BAL0202            -1.   BAL0228             1.
+    SH020328  COST            367.04   TRAN0203            1.
+    SH020328  BAL0203            -1.   BAL0228             1.
+    SH020428  COST             365.8   TRAN0204            1.
+    SH020428  BAL0204            -1.   BAL0228             1.
+    SH020528  COST            126.48   TRAN0205            1.
+    SH020528  BAL0205            -1.   BAL0228             1.
+    SH020628  COST            323.64   TRAN0206            1.
+    SH020628  BAL0252            -1.   BAL0228             1.
+    SH020728  COST            132.68   TRAN0207            1.
+    SH020728  BAL0264            -1.   BAL0228             1.
+    SH020828  COST            314.96   TRAN0208            1.
+    SH020828  BAL0283            -1.   BAL0228             1.
+    SH020129  COST            276.52   TRAN0201            1.
+    SH020129  BAL0201            -1.   BAL0229             1.
+    SH020229  COST            575.36   TRAN0202            1.
+    SH020229  BAL0202            -1.   BAL0229             1.
+    SH020329  COST            298.84   TRAN0203            1.
+    SH020329  BAL0203            -1.   BAL0229             1.
+    SH020429  COST            246.76   TRAN0204            1.
+    SH020429  BAL0204            -1.   BAL0229             1.
+    SH020529  COST             533.2   TRAN0205            1.
+    SH020529  BAL0205            -1.   BAL0229             1.
+    SH020629  COST            323.64   TRAN0206            1.
+    SH020629  BAL0252            -1.   BAL0229             1.
+    SH020829  COST            178.56   TRAN0208            1.
+    SH020829  BAL0283            -1.   BAL0229             1.
+    SH020130  COST            577.84   TRAN0201            1.
+    SH020130  BAL0201            -1.   BAL0230             1.
+    SH020230  COST            540.64   TRAN0202            1.
+    SH020230  BAL0202            -1.   BAL0230             1.
+    SH020330  COST            648.52   TRAN0203            1.
+    SH020330  BAL0203            -1.   BAL0230             1.
+    SH020430  COST            376.96   TRAN0204            1.
+    SH020430  BAL0204            -1.   BAL0230             1.
+    SH020530  COST            553.04   TRAN0205            1.
+    SH020530  BAL0205            -1.   BAL0230             1.
+    SH020830  COST            473.68   TRAN0208            1.
+    SH020830  BAL0283            -1.   BAL0230             1.
+    SH020131  COST            137.64   TRAN0201            1.
+    SH020131  BAL0201            -1.   BAL0231             1.
+    SH020231  COST            435.24   TRAN0202            1.
+    SH020231  BAL0202            -1.   BAL0231             1.
+    SH020331  COST             136.4   TRAN0203            1.
+    SH020331  BAL0203            -1.   BAL0231             1.
+    SH020431  COST            313.72   TRAN0204            1.
+    SH020431  BAL0204            -1.   BAL0231             1.
+    SH020531  COST            380.68   TRAN0205            1.
+    SH020531  BAL0205            -1.   BAL0231             1.
+    SH020631  COST            138.88   TRAN0206            1.
+    SH020631  BAL0252            -1.   BAL0231             1.
+    SH020831  COST            276.52   TRAN0208            1.
+    SH020831  BAL0283            -1.   BAL0231             1.
+    SH020132  COST            370.76   TRAN0201            1.
+    SH020132  BAL0201            -1.   BAL0232             1.
+    SH020232  COST            592.72   TRAN0202            1.
+    SH020232  BAL0202            -1.   BAL0232             1.
+    SH020332  COST            524.52   TRAN0203            1.
+    SH020332  BAL0203            -1.   BAL0232             1.
+    SH020432  COST            194.68   TRAN0204            1.
+    SH020432  BAL0204            -1.   BAL0232             1.
+    SH020532  COST            486.08   TRAN0205            1.
+    SH020532  BAL0205            -1.   BAL0232             1.
+    SH020832  COST             223.2   TRAN0208            1.
+    SH020832  BAL0283            -1.   BAL0232             1.
+    SH020133  COST            611.32   TRAN0201            1.
+    SH020133  BAL0201            -1.   BAL0233             1.
+    SH020233  COST              496.   TRAN0202            1.
+    SH020233  BAL0202            -1.   BAL0233             1.
+    SH020333  COST            673.32   TRAN0203            1.
+    SH020333  BAL0203            -1.   BAL0233             1.
+    SH020433  COST             551.8   TRAN0204            1.
+    SH020433  BAL0204            -1.   BAL0233             1.
+    SH020533  COST            782.44   TRAN0205            1.
+    SH020533  BAL0205            -1.   BAL0233             1.
+    SH020833  COST            472.44   TRAN0208            1.
+    SH020833  BAL0283            -1.   BAL0233             1.
+    SH020134  COST            478.64   TRAN0201            1.
+    SH020134  BAL0201            -1.   BAL0234             1.
+    SH020234  COST             812.2   TRAN0202            1.
+    SH020234  BAL0202            -1.   BAL0234             1.
+    SH020334  COST            623.72   TRAN0203            1.
+    SH020334  BAL0203            -1.   BAL0234             1.
+    SH020434  COST            261.64   TRAN0204            1.
+    SH020434  BAL0204            -1.   BAL0234             1.
+    SH020534  COST            546.84   TRAN0205            1.
+    SH020534  BAL0205            -1.   BAL0234             1.
+    SH020834  COST            326.12   TRAN0208            1.
+    SH020834  BAL0283            -1.   BAL0234             1.
+    SH020135  COST            571.64   TRAN0201            1.
+    SH020135  BAL0201            -1.   BAL0235             1.
+    SH020235  COST             551.8   TRAN0202            1.
+    SH020235  BAL0202            -1.   BAL0235             1.
+    SH020335  COST            467.48   TRAN0203            1.
+    SH020335  BAL0203            -1.   BAL0235             1.
+    SH020435  COST            151.28   TRAN0204            1.
+    SH020435  BAL0204            -1.   BAL0235             1.
+    SH020535  COST            534.44   TRAN0205            1.
+    SH020535  BAL0205            -1.   BAL0235             1.
+    SH020835  COST             291.4   TRAN0208            1.
+    SH020835  BAL0283            -1.   BAL0235             1.
+    SH020136  COST             254.2   TRAN0201            1.
+    SH020136  BAL0201            -1.   BAL0236             1.
+    SH020236  COST            555.52   TRAN0202            1.
+    SH020236  BAL0202            -1.   BAL0236             1.
+    SH020336  COST            131.44   TRAN0203            1.
+    SH020336  BAL0203            -1.   BAL0236             1.
+    SH020436  COST             458.8   TRAN0204            1.
+    SH020436  BAL0204            -1.   BAL0236             1.
+    SH020536  COST            429.04   TRAN0205            1.
+    SH020536  BAL0205            -1.   BAL0236             1.
+    SH020636  COST             136.4   TRAN0206            1.
+    SH020636  BAL0252            -1.   BAL0236             1.
+    SH020836  COST            398.04   TRAN0208            1.
+    SH020836  BAL0283            -1.   BAL0236             1.
+    SH020137  COST            114.08   TRAN0201            1.
+    SH020137  BAL0201            -1.   BAL0237             1.
+    SH020237  COST            424.08   TRAN0202            1.
+    SH020237  BAL0202            -1.   BAL0237             1.
+    SH020337  COST            195.92   TRAN0203            1.
+    SH020337  BAL0203            -1.   BAL0237             1.
+    SH020437  COST            376.96   TRAN0204            1.
+    SH020437  BAL0204            -1.   BAL0237             1.
+    SH020537  COST            225.68   TRAN0205            1.
+    SH020537  BAL0205            -1.   BAL0237             1.
+    SH020637  COST            240.56   TRAN0206            1.
+    SH020637  BAL0252            -1.   BAL0237             1.
+    SH020837  COST            312.48   TRAN0208            1.
+    SH020837  BAL0283            -1.   BAL0237             1.
+    SH020138  COST            168.64   TRAN0201            1.
+    SH020138  BAL0201            -1.   BAL0238             1.
+    SH020238  COST            302.56   TRAN0202            1.
+    SH020238  BAL0202            -1.   BAL0238             1.
+    SH020338  COST             117.8   TRAN0203            1.
+    SH020338  BAL0203            -1.   BAL0238             1.
+    SH020438  COST            381.92   TRAN0204            1.
+    SH020438  BAL0204            -1.   BAL0238             1.
+    SH020538  COST            344.72   TRAN0205            1.
+    SH020538  BAL0205            -1.   BAL0238             1.
+    SH020638  COST             48.36   TRAN0206            1.
+    SH020638  BAL0252            -1.   BAL0238             1.
+    SH020738  COST            267.84   TRAN0207            1.
+    SH020738  BAL0264            -1.   BAL0238             1.
+    SH020838  COST            293.88   TRAN0208            1.
+    SH020838  BAL0283            -1.   BAL0238             1.
+    SH020139  COST             161.2   TRAN0201            1.
+    SH020139  BAL0201            -1.   BAL0239             1.
+    SH020239  COST            420.36   TRAN0202            1.
+    SH020239  BAL0202            -1.   BAL0239             1.
+    SH020339  COST             198.4   TRAN0203            1.
+    SH020339  BAL0203            -1.   BAL0239             1.
+    SH020439  COST            308.76   TRAN0204            1.
+    SH020439  BAL0204            -1.   BAL0239             1.
+    SH020539  COST            531.96   TRAN0205            1.
+    SH020539  BAL0205            -1.   BAL0239             1.
+    SH020639  COST            252.96   TRAN0206            1.
+    SH020639  BAL0252            -1.   BAL0239             1.
+    SH020839  COST            208.32   TRAN0208            1.
+    SH020839  BAL0283            -1.   BAL0239             1.
+    SH020140  COST             204.6   TRAN0201            1.
+    SH020140  BAL0201            -1.   BAL0240             1.
+    SH020240  COST            468.72   TRAN0202            1.
+    SH020240  BAL0202            -1.   BAL0240             1.
+    SH020340  COST            127.72   TRAN0203            1.
+    SH020340  BAL0203            -1.   BAL0240             1.
+    SH020440  COST            368.28   TRAN0204            1.
+    SH020440  BAL0204            -1.   BAL0240             1.
+    SH020540  COST            274.04   TRAN0205            1.
+    SH020540  BAL0205            -1.   BAL0240             1.
+    SH020640  COST            162.44   TRAN0206            1.
+    SH020640  BAL0252            -1.   BAL0240             1.
+    SH020840  COST            339.76   TRAN0208            1.
+    SH020840  BAL0283            -1.   BAL0240             1.
+    SH020141  COST            243.04   TRAN0201            1.
+    SH020141  BAL0201            -1.   BAL0241             1.
+    SH020241  COST              372.   TRAN0202            1.
+    SH020241  BAL0202            -1.   BAL0241             1.
+    SH020341  COST              186.   TRAN0203            1.
+    SH020341  BAL0203            -1.   BAL0241             1.
+    SH020441  COST            401.76   TRAN0204            1.
+    SH020441  BAL0204            -1.   BAL0241             1.
+    SH020541  COST            456.32   TRAN0205            1.
+    SH020541  BAL0205            -1.   BAL0241             1.
+    SH020641  COST              124.   TRAN0206            1.
+    SH020641  BAL0252            -1.   BAL0241             1.
+    SH020841  COST            370.76   TRAN0208            1.
+    SH020841  BAL0283            -1.   BAL0241             1.
+    SH020142  COST             111.6   TRAN0201            1.
+    SH020142  BAL0201            -1.   BAL0242             1.
+    SH020242  COST            513.36   TRAN0202            1.
+    SH020242  BAL0202            -1.   BAL0242             1.
+    SH020342  COST             198.4   TRAN0203            1.
+    SH020342  BAL0203            -1.   BAL0242             1.
+    SH020442  COST             241.8   TRAN0204            1.
+    SH020442  BAL0204            -1.   BAL0242             1.
+    SH020542  COST            447.64   TRAN0205            1.
+    SH020542  BAL0205            -1.   BAL0242             1.
+    SH020642  COST            199.64   TRAN0206            1.
+    SH020642  BAL0252            -1.   BAL0242             1.
+    SH020842  COST            188.48   TRAN0208            1.
+    SH020842  BAL0283            -1.   BAL0242             1.
+    SH020143  COST            197.16   TRAN0201            1.
+    SH020143  BAL0201            -1.   BAL0243             1.
+    SH020243  COST             489.8   TRAN0202            1.
+    SH020243  BAL0202            -1.   BAL0243             1.
+    SH020343  COST               31.   TRAN0203            1.
+    SH020343  BAL0203            -1.   BAL0243             1.
+    SH020443  COST            367.04   TRAN0204            1.
+    SH020443  BAL0204            -1.   BAL0243             1.
+    SH020543  COST            319.92   TRAN0205            1.
+    SH020543  BAL0205            -1.   BAL0243             1.
+    SH020643  COST              124.   TRAN0206            1.
+    SH020643  BAL0252            -1.   BAL0243             1.
+    SH020743  COST            298.84   TRAN0207            1.
+    SH020743  BAL0264            -1.   BAL0243             1.
+    SH020843  COST            336.04   TRAN0208            1.
+    SH020843  BAL0283            -1.   BAL0243             1.
+    SH020144  COST            197.16   TRAN0201            1.
+    SH020144  BAL0201            -1.   BAL0244             1.
+    SH020244  COST            469.96   TRAN0202            1.
+    SH020244  BAL0202            -1.   BAL0244             1.
+    SH020344  COST            158.72   TRAN0203            1.
+    SH020344  BAL0203            -1.   BAL0244             1.
+    SH020444  COST            386.88   TRAN0204            1.
+    SH020444  BAL0204            -1.   BAL0244             1.
+    SH020544  COST             384.4   TRAN0205            1.
+    SH020544  BAL0205            -1.   BAL0244             1.
+    SH020644  COST            110.36   TRAN0206            1.
+    SH020644  BAL0252            -1.   BAL0244             1.
+    SH020844  COST            369.52   TRAN0208            1.
+    SH020844  BAL0283            -1.   BAL0244             1.
+    SH020145  COST            213.28   TRAN0201            1.
+    SH020145  BAL0201            -1.   BAL0245             1.
+    SH020245  COST            540.64   TRAN0202            1.
+    SH020245  BAL0202            -1.   BAL0245             1.
+    SH020345  COST            199.64   TRAN0203            1.
+    SH020345  BAL0203            -1.   BAL0245             1.
+    SH020445  COST            362.08   TRAN0204            1.
+    SH020445  BAL0204            -1.   BAL0245             1.
+    SH020545  COST            290.16   TRAN0205            1.
+    SH020545  BAL0205            -1.   BAL0245             1.
+    SH020645  COST            236.84   TRAN0206            1.
+    SH020645  BAL0252            -1.   BAL0245             1.
+    SH020745  COST            244.28   TRAN0207            1.
+    SH020745  BAL0264            -1.   BAL0245             1.
+    SH020845  COST             378.2   TRAN0208            1.
+    SH020845  BAL0283            -1.   BAL0245             1.
+    SH020146  COST             303.8   TRAN0201            1.
+    SH020146  BAL0201            -1.   BAL0246             1.
+    SH020246  COST            338.52   TRAN0202            1.
+    SH020246  BAL0202            -1.   BAL0246             1.
+    SH020346  COST            274.04   TRAN0203            1.
+    SH020346  BAL0203            -1.   BAL0246             1.
+    SH020446  COST            554.28   TRAN0204            1.
+    SH020446  BAL0204            -1.   BAL0246             1.
+    SH020546  COST             533.2   TRAN0205            1.
+    SH020546  BAL0205            -1.   BAL0246             1.
+    SH020646  COST            318.68   TRAN0206            1.
+    SH020646  BAL0252            -1.   BAL0246             1.
+    SH020846  COST            555.52   TRAN0208            1.
+    SH020846  BAL0283            -1.   BAL0246             1.
+    SH020147  COST             136.4   TRAN0201            1.
+    SH020147  BAL0201            -1.   BAL0247             1.
+    SH020247  COST            462.52   TRAN0202            1.
+    SH020247  BAL0202            -1.   BAL0247             1.
+    SH020347  COST            197.16   TRAN0203            1.
+    SH020347  BAL0203            -1.   BAL0247             1.
+    SH020447  COST            339.76   TRAN0204            1.
+    SH020447  BAL0204            -1.   BAL0247             1.
+    SH020547  COST            288.92   TRAN0205            1.
+    SH020547  BAL0205            -1.   BAL0247             1.
+    SH020647  COST             179.8   TRAN0206            1.
+    SH020647  BAL0252            -1.   BAL0247             1.
+    SH020847  COST            302.56   TRAN0208            1.
+    SH020847  BAL0283            -1.   BAL0247             1.
+    SH020148  COST             117.8   TRAN0201            1.
+    SH020148  BAL0201            -1.   BAL0248             1.
+    SH020248  COST            420.36   TRAN0202            1.
+    SH020248  BAL0202            -1.   BAL0248             1.
+    SH020348  COST            169.88   TRAN0203            1.
+    SH020348  BAL0203            -1.   BAL0248             1.
+    SH020448  COST             285.2   TRAN0204            1.
+    SH020448  BAL0204            -1.   BAL0248             1.
+    SH020548  COST            306.28   TRAN0205            1.
+    SH020548  BAL0205            -1.   BAL0248             1.
+    SH020648  COST             142.6   TRAN0206            1.
+    SH020648  BAL0252            -1.   BAL0248             1.
+    SH020848  COST             241.8   TRAN0208            1.
+    SH020848  BAL0283            -1.   BAL0248             1.
+    SH020149  COST            407.96   TRAN0201            1.
+    SH020149  BAL0201            -1.   BAL0249             1.
+    SH020249  COST             663.4   TRAN0202            1.
+    SH020249  BAL0202            -1.   BAL0249             1.
+    SH020349  COST            411.68   TRAN0203            1.
+    SH020349  BAL0203            -1.   BAL0249             1.
+    SH020449  COST            472.44   TRAN0204            1.
+    SH020449  BAL0204            -1.   BAL0249             1.
+    SH020549  COST            188.48   TRAN0205            1.
+    SH020549  BAL0205            -1.   BAL0249             1.
+    SH020649  COST            419.12   TRAN0206            1.
+    SH020649  BAL0252            -1.   BAL0249             1.
+    SH020749  COST            166.16   TRAN0207            1.
+    SH020749  BAL0264            -1.   BAL0249             1.
+    SH020849  COST            505.92   TRAN0208            1.
+    SH020849  BAL0283            -1.   BAL0249             1.
+    SH020150  COST            298.84   TRAN0201            1.
+    SH020150  BAL0201            -1.   BAL0250             1.
+    SH020250  COST            758.88   TRAN0202            1.
+    SH020250  BAL0202            -1.   BAL0250             1.
+    SH020350  COST            305.04   TRAN0203            1.
+    SH020350  BAL0203            -1.   BAL0250             1.
+    SH020450  COST             452.6   TRAN0204            1.
+    SH020450  BAL0204            -1.   BAL0250             1.
+    SH020550  COST             291.4   TRAN0205            1.
+    SH020550  BAL0205            -1.   BAL0250             1.
+    SH020750  COST            169.88   TRAN0207            1.
+    SH020750  BAL0264            -1.   BAL0250             1.
+    SH020850  COST            503.44   TRAN0208            1.
+    SH020850  BAL0283            -1.   BAL0250             1.
+    SH020151  COST            411.68   TRAN0201            1.
+    SH020151  BAL0201            -1.   BAL0251             1.
+    SH020251  COST              682.   TRAN0202            1.
+    SH020251  BAL0202            -1.   BAL0251             1.
+    SH020351  COST            422.84   TRAN0203            1.
+    SH020351  BAL0203            -1.   BAL0251             1.
+    SH020451  COST            419.12   TRAN0204            1.
+    SH020451  BAL0204            -1.   BAL0251             1.
+    SH020551  COST            152.52   TRAN0205            1.
+    SH020551  BAL0205            -1.   BAL0251             1.
+    SH020751  COST            122.76   TRAN0207            1.
+    SH020751  BAL0264            -1.   BAL0251             1.
+    SH020851  COST            530.72   TRAN0208            1.
+    SH020851  BAL0283            -1.   BAL0251             1.
+    SH020152  COST            138.88   TRAN0201            1.
+    SH020152  BAL0201            -1.   BAL0252             1.
+    SH020252  COST              372.   TRAN0202            1.
+    SH020252  BAL0202            -1.   BAL0252             1.
+    SH020352  COST            101.68   TRAN0203            1.
+    SH020352  BAL0203            -1.   BAL0252             1.
+    SH020452  COST            399.28   TRAN0204            1.
+    SH020452  BAL0204            -1.   BAL0252             1.
+    SH020552  COST             365.8   TRAN0205            1.
+    SH020552  BAL0205            -1.   BAL0252             1.
+    SH020852  COST            313.72   TRAN0208            1.
+    SH020852  BAL0283            -1.   BAL0252             1.
+    SH020153  COST            445.16   TRAN0201            1.
+    SH020153  BAL0201            -1.   BAL0253             1.
+    SH020253  COST            788.64   TRAN0202            1.
+    SH020253  BAL0202            -1.   BAL0253             1.
+    SH020353  COST              403.   TRAN0203            1.
+    SH020353  BAL0203            -1.   BAL0253             1.
+    SH020453  COST            510.88   TRAN0204            1.
+    SH020453  BAL0204            -1.   BAL0253             1.
+    SH020553  COST            228.16   TRAN0205            1.
+    SH020553  BAL0205            -1.   BAL0253             1.
+    SH020653  COST            445.16   TRAN0206            1.
+    SH020653  BAL0252            -1.   BAL0253             1.
+    SH020753  COST            181.04   TRAN0207            1.
+    SH020753  BAL0264            -1.   BAL0253             1.
+    SH020853  COST            499.72   TRAN0208            1.
+    SH020853  BAL0283            -1.   BAL0253             1.
+    SH020154  COST             229.4   TRAN0201            1.
+    SH020154  BAL0201            -1.   BAL0254             1.
+    SH020254  COST             551.8   TRAN0202            1.
+    SH020254  BAL0202            -1.   BAL0254             1.
+    SH020354  COST            269.08   TRAN0203            1.
+    SH020354  BAL0203            -1.   BAL0254             1.
+    SH020454  COST            425.32   TRAN0204            1.
+    SH020454  BAL0204            -1.   BAL0254             1.
+    SH020554  COST            264.12   TRAN0205            1.
+    SH020554  BAL0205            -1.   BAL0254             1.
+    SH020654  COST            251.72   TRAN0206            1.
+    SH020654  BAL0252            -1.   BAL0254             1.
+    SH020854  COST            498.48   TRAN0208            1.
+    SH020854  BAL0283            -1.   BAL0254             1.
+    SH020155  COST            344.72   TRAN0201            1.
+    SH020155  BAL0201            -1.   BAL0255             1.
+    SH020255  COST            593.96   TRAN0202            1.
+    SH020255  BAL0202            -1.   BAL0255             1.
+    SH020355  COST            348.44   TRAN0203            1.
+    SH020355  BAL0203            -1.   BAL0255             1.
+    SH020455  COST            364.56   TRAN0204            1.
+    SH020455  BAL0204            -1.   BAL0255             1.
+    SH020555  COST            190.96   TRAN0205            1.
+    SH020555  BAL0205            -1.   BAL0255             1.
+    SH020655  COST             359.6   TRAN0206            1.
+    SH020655  BAL0252            -1.   BAL0255             1.
+    SH020755  COST            132.68   TRAN0207            1.
+    SH020755  BAL0264            -1.   BAL0255             1.
+    SH020855  COST            364.56   TRAN0208            1.
+    SH020855  BAL0283            -1.   BAL0255             1.
+    SH020156  COST             483.6   TRAN0201            1.
+    SH020156  BAL0201            -1.   BAL0256             1.
+    SH020256  COST            717.96   TRAN0202            1.
+    SH020256  BAL0202            -1.   BAL0256             1.
+    SH020356  COST             378.2   TRAN0203            1.
+    SH020356  BAL0203            -1.   BAL0256             1.
+    SH020456  COST             452.6   TRAN0204            1.
+    SH020456  BAL0204            -1.   BAL0256             1.
+    SH020556  COST            168.64   TRAN0205            1.
+    SH020556  BAL0205            -1.   BAL0256             1.
+    SH020656  COST            420.36   TRAN0206            1.
+    SH020656  BAL0252            -1.   BAL0256             1.
+    SH020756  COST            151.28   TRAN0207            1.
+    SH020756  BAL0264            -1.   BAL0256             1.
+    SH020856  COST            442.68   TRAN0208            1.
+    SH020856  BAL0283            -1.   BAL0256             1.
+    SH020157  COST            323.64   TRAN0201            1.
+    SH020157  BAL0201            -1.   BAL0257             1.
+    SH020257  COST             644.8   TRAN0202            1.
+    SH020257  BAL0202            -1.   BAL0257             1.
+    SH020357  COST             359.6   TRAN0203            1.
+    SH020357  BAL0203            -1.   BAL0257             1.
+    SH020457  COST            290.16   TRAN0204            1.
+    SH020457  BAL0204            -1.   BAL0257             1.
+    SH020557  COST            208.32   TRAN0205            1.
+    SH020557  BAL0205            -1.   BAL0257             1.
+    SH020657  COST            395.56   TRAN0206            1.
+    SH020657  BAL0252            -1.   BAL0257             1.
+    SH020757  COST            183.52   TRAN0207            1.
+    SH020757  BAL0264            -1.   BAL0257             1.
+    SH020857  COST            286.44   TRAN0208            1.
+    SH020857  BAL0283            -1.   BAL0257             1.
+    SH020158  COST            364.56   TRAN0201            1.
+    SH020158  BAL0201            -1.   BAL0258             1.
+    SH020258  COST            646.04   TRAN0202            1.
+    SH020258  BAL0202            -1.   BAL0258             1.
+    SH020358  COST            344.72   TRAN0203            1.
+    SH020358  BAL0203            -1.   BAL0258             1.
+    SH020458  COST            425.32   TRAN0204            1.
+    SH020458  BAL0204            -1.   BAL0258             1.
+    SH020558  COST             26.04   TRAN0205            1.
+    SH020558  BAL0205            -1.   BAL0258             1.
+    SH020658  COST            404.24   TRAN0206            1.
+    SH020658  BAL0252            -1.   BAL0258             1.
+    SH020758  COST             84.32   TRAN0207            1.
+    SH020758  BAL0264            -1.   BAL0258             1.
+    SH020858  COST            314.96   TRAN0208            1.
+    SH020858  BAL0283            -1.   BAL0258             1.
+    SH020159  COST            255.44   TRAN0201            1.
+    SH020159  BAL0201            -1.   BAL0259             1.
+    SH020259  COST            617.52   TRAN0202            1.
+    SH020259  BAL0202            -1.   BAL0259             1.
+    SH020359  COST            295.12   TRAN0203            1.
+    SH020359  BAL0203            -1.   BAL0259             1.
+    SH020459  COST            302.56   TRAN0204            1.
+    SH020459  BAL0204            -1.   BAL0259             1.
+    SH020559  COST            197.16   TRAN0205            1.
+    SH020559  BAL0205            -1.   BAL0259             1.
+    SH020659  COST            368.28   TRAN0206            1.
+    SH020659  BAL0252            -1.   BAL0259             1.
+    SH020759  COST             130.2   TRAN0207            1.
+    SH020759  BAL0264            -1.   BAL0259             1.
+    SH020859  COST             316.2   TRAN0208            1.
+    SH020859  BAL0283            -1.   BAL0259             1.
+    SH020160  COST            323.64   TRAN0201            1.
+    SH020160  BAL0201            -1.   BAL0260             1.
+    SH020260  COST              682.   TRAN0202            1.
+    SH020260  BAL0202            -1.   BAL0260             1.
+    SH020360  COST            350.92   TRAN0203            1.
+    SH020360  BAL0203            -1.   BAL0260             1.
+    SH020460  COST            386.88   TRAN0204            1.
+    SH020460  BAL0204            -1.   BAL0260             1.
+    SH020560  COST             167.4   TRAN0205            1.
+    SH020560  BAL0205            -1.   BAL0260             1.
+    SH020660  COST            400.52   TRAN0206            1.
+    SH020660  BAL0252            -1.   BAL0260             1.
+    SH020760  COST            109.12   TRAN0207            1.
+    SH020760  BAL0264            -1.   BAL0260             1.
+    SH020860  COST            370.76   TRAN0208            1.
+    SH020860  BAL0283            -1.   BAL0260             1.
+    SH020163  COST            329.84   TRAN0201            1.
+    SH020163  BAL0201            -1.   BAL0263             1.
+    SH020263  COST            612.56   TRAN0202            1.
+    SH020263  BAL0202            -1.   BAL0263             1.
+    SH020363  COST            355.88   TRAN0203            1.
+    SH020363  BAL0203            -1.   BAL0263             1.
+    SH020463  COST            457.56   TRAN0204            1.
+    SH020463  BAL0204            -1.   BAL0263             1.
+    SH020563  COST            188.48   TRAN0205            1.
+    SH020563  BAL0205            -1.   BAL0263             1.
+    SH020663  COST             390.6   TRAN0206            1.
+    SH020663  BAL0252            -1.   BAL0263             1.
+    SH020763  COST            153.76   TRAN0207            1.
+    SH020763  BAL0264            -1.   BAL0263             1.
+    SH020863  COST              496.   TRAN0208            1.
+    SH020863  BAL0283            -1.   BAL0263             1.
+    SH020164  COST            246.76   TRAN0201            1.
+    SH020164  BAL0201            -1.   BAL0264             1.
+    SH020264  COST            652.24   TRAN0202            1.
+    SH020264  BAL0202            -1.   BAL0264             1.
+    SH020364  COST            276.52   TRAN0203            1.
+    SH020364  BAL0203            -1.   BAL0264             1.
+    SH020464  COST            416.64   TRAN0204            1.
+    SH020464  BAL0204            -1.   BAL0264             1.
+    SH020564  COST             71.92   TRAN0205            1.
+    SH020564  BAL0205            -1.   BAL0264             1.
+    SH020664  COST            393.08   TRAN0206            1.
+    SH020664  BAL0252            -1.   BAL0264             1.
+    SH020864  COST              310.   TRAN0208            1.
+    SH020864  BAL0283            -1.   BAL0264             1.
+    SH020165  COST            535.68   TRAN0201            1.
+    SH020165  BAL0201            -1.   BAL0265             1.
+    SH020265  COST            380.68   TRAN0202            1.
+    SH020265  BAL0202            -1.   BAL0265             1.
+    SH020365  COST             626.2   TRAN0203            1.
+    SH020365  BAL0203            -1.   BAL0265             1.
+    SH020465  COST            481.12   TRAN0204            1.
+    SH020465  BAL0204            -1.   BAL0265             1.
+    SH020565  COST            748.96   TRAN0205            1.
+    SH020565  BAL0205            -1.   BAL0265             1.
+    SH020865  COST             514.6   TRAN0208            1.
+    SH020865  BAL0283            -1.   BAL0265             1.
+    SH020166  COST             694.4   TRAN0201            1.
+    SH020166  BAL0201            -1.   BAL0266             1.
+    SH020266  COST            321.16   TRAN0202            1.
+    SH020266  BAL0202            -1.   BAL0266             1.
+    SH020366  COST            716.72   TRAN0203            1.
+    SH020366  BAL0203            -1.   BAL0266             1.
+    SH020466  COST            689.44   TRAN0204            1.
+    SH020466  BAL0204            -1.   BAL0266             1.
+    SH020566  COST             880.4   TRAN0205            1.
+    SH020566  BAL0205            -1.   BAL0266             1.
+    SH020866  COST             694.4   TRAN0208            1.
+    SH020866  BAL0283            -1.   BAL0266             1.
+    SH020167  COST              527.   TRAN0201            1.
+    SH020167  BAL0201            -1.   BAL0267             1.
+    SH020267  COST            287.68   TRAN0202            1.
+    SH020267  BAL0202            -1.   BAL0267             1.
+    SH020367  COST            611.32   TRAN0203            1.
+    SH020367  BAL0203            -1.   BAL0267             1.
+    SH020467  COST            566.68   TRAN0204            1.
+    SH020467  BAL0204            -1.   BAL0267             1.
+    SH020567  COST            748.96   TRAN0205            1.
+    SH020567  BAL0205            -1.   BAL0267             1.
+    SH020867  COST            567.92   TRAN0208            1.
+    SH020867  BAL0283            -1.   BAL0267             1.
+    SH020168  COST            736.56   TRAN0201            1.
+    SH020168  BAL0201            -1.   BAL0268             1.
+    SH020268  COST              496.   TRAN0202            1.
+    SH020268  BAL0202            -1.   BAL0268             1.
+    SH020368  COST             694.4   TRAN0203            1.
+    SH020368  BAL0203            -1.   BAL0268             1.
+    SH020468  COST            870.48   TRAN0204            1.
+    SH020468  BAL0204            -1.   BAL0268             1.
+    SH020568  COST           1173.04   TRAN0205            1.
+    SH020568  BAL0205            -1.   BAL0268             1.
+    SH020868  COST            931.24   TRAN0208            1.
+    SH020868  BAL0283            -1.   BAL0268             1.
+    SH020169  COST            668.36   TRAN0201            1.
+    SH020169  BAL0201            -1.   BAL0269             1.
+    SH020269  COST            274.04   TRAN0202            1.
+    SH020269  BAL0202            -1.   BAL0269             1.
+    SH020369  COST             632.4   TRAN0203            1.
+    SH020369  BAL0203            -1.   BAL0269             1.
+    SH020469  COST            771.28   TRAN0204            1.
+    SH020469  BAL0204            -1.   BAL0269             1.
+    SH020569  COST            801.04   TRAN0205            1.
+    SH020569  BAL0205            -1.   BAL0269             1.
+    SH020869  COST            815.92   TRAN0208            1.
+    SH020869  BAL0283            -1.   BAL0269             1.
+    SH020171  COST             545.6   TRAN0201            1.
+    SH020171  BAL0201            -1.   BAL0271             1.
+    SH020371  COST            649.76   TRAN0203            1.
+    SH020371  BAL0203            -1.   BAL0271             1.
+    SH020471  COST            646.04   TRAN0204            1.
+    SH020471  BAL0204            -1.   BAL0271             1.
+    SH020571  COST            720.44   TRAN0205            1.
+    SH020571  BAL0205            -1.   BAL0271             1.
+    SH020671  COST            484.84   TRAN0206            1.
+    SH020671  BAL0252            -1.   BAL0271             1.
+    SH020771  COST            872.96   TRAN0207            1.
+    SH020771  BAL0264            -1.   BAL0271             1.
+    SH020871  COST            660.92   TRAN0208            1.
+    SH020871  BAL0283            -1.   BAL0271             1.
+    SH020172  COST            727.88   TRAN0201            1.
+    SH020172  BAL0201            -1.   BAL0272             1.
+    SH020272  COST            673.32   TRAN0202            1.
+    SH020272  BAL0202            -1.   BAL0272             1.
+    SH020372  COST            765.08   TRAN0203            1.
+    SH020372  BAL0203            -1.   BAL0272             1.
+    SH020472  COST             706.8   TRAN0204            1.
+    SH020472  BAL0204            -1.   BAL0272             1.
+    SH020572  COST            946.12   TRAN0205            1.
+    SH020572  BAL0205            -1.   BAL0272             1.
+    SH020872  COST             706.8   TRAN0208            1.
+    SH020872  BAL0283            -1.   BAL0272             1.
+    SH020173  COST             483.6   TRAN0201            1.
+    SH020173  BAL0201            -1.   BAL0273             1.
+    SH020273  COST             452.6   TRAN0202            1.
+    SH020273  BAL0202            -1.   BAL0273             1.
+    SH020373  COST            419.12   TRAN0203            1.
+    SH020373  BAL0203            -1.   BAL0273             1.
+    SH020473  COST            566.68   TRAN0204            1.
+    SH020473  BAL0204            -1.   BAL0273             1.
+    SH020573  COST            699.36   TRAN0205            1.
+    SH020573  BAL0205            -1.   BAL0273             1.
+    SH020673  COST             378.2   TRAN0206            1.
+    SH020673  BAL0252            -1.   BAL0273             1.
+    SH020873  COST            624.96   TRAN0208            1.
+    SH020873  BAL0283            -1.   BAL0273             1.
+    SH020174  COST            679.52   TRAN0201            1.
+    SH020174  BAL0201            -1.   BAL0274             1.
+    SH020274  COST             260.4   TRAN0202            1.
+    SH020274  BAL0202            -1.   BAL0274             1.
+    SH020374  COST             706.8   TRAN0203            1.
+    SH020374  BAL0203            -1.   BAL0274             1.
+    SH020474  COST            789.88   TRAN0204            1.
+    SH020474  BAL0204            -1.   BAL0274             1.
+    SH020574  COST            908.92   TRAN0205            1.
+    SH020574  BAL0205            -1.   BAL0274             1.
+    SH020874  COST            767.56   TRAN0208            1.
+    SH020874  BAL0283            -1.   BAL0274             1.
+    SH020275  COST            686.96   TRAN0202            1.
+    SH020275  BAL0202            -1.   BAL0275             1.
+    SH020176  COST            572.88   TRAN0201            1.
+    SH020176  BAL0201            -1.   BAL0276             1.
+    SH020276  COST            497.24   TRAN0202            1.
+    SH020276  BAL0202            -1.   BAL0276             1.
+    SH020376  COST            499.72   TRAN0203            1.
+    SH020376  BAL0203            -1.   BAL0276             1.
+    SH020476  COST             781.2   TRAN0204            1.
+    SH020476  BAL0204            -1.   BAL0276             1.
+    SH020576  COST             781.2   TRAN0205            1.
+    SH020576  BAL0205            -1.   BAL0276             1.
+    SH020676  COST            472.44   TRAN0206            1.
+    SH020676  BAL0252            -1.   BAL0276             1.
+    SH020876  COST            963.48   TRAN0208            1.
+    SH020876  BAL0283            -1.   BAL0276             1.
+    SH020177  COST             539.4   TRAN0201            1.
+    SH020177  BAL0201            -1.   BAL0277             1.
+    SH020277  COST            337.28   TRAN0202            1.
+    SH020277  BAL0202            -1.   BAL0277             1.
+    SH020377  COST            571.64   TRAN0203            1.
+    SH020377  BAL0203            -1.   BAL0277             1.
+    SH020477  COST            497.24   TRAN0204            1.
+    SH020477  BAL0204            -1.   BAL0277             1.
+    SH020577  COST             694.4   TRAN0205            1.
+    SH020577  BAL0205            -1.   BAL0277             1.
+    SH020877  COST             396.8   TRAN0208            1.
+    SH020877  BAL0283            -1.   BAL0277             1.
+    SH020178  COST            943.64   TRAN0201            1.
+    SH020178  BAL0201            -1.   BAL0278             1.
+    SH020278  COST            548.08   TRAN0202            1.
+    SH020278  BAL0202            -1.   BAL0278             1.
+    SH020378  COST            970.92   TRAN0203            1.
+    SH020378  BAL0203            -1.   BAL0278             1.
+    SH020478  COST             849.4   TRAN0204            1.
+    SH020478  BAL0204            -1.   BAL0278             1.
+    SH020578  COST           1089.96   TRAN0205            1.
+    SH020578  BAL0205            -1.   BAL0278             1.
+    SH020878  COST            949.84   TRAN0208            1.
+    SH020878  BAL0283            -1.   BAL0278             1.
+    SH020179  COST             886.6   TRAN0201            1.
+    SH020179  BAL0201            -1.   BAL0279             1.
+    SH020279  COST            333.56   TRAN0202            1.
+    SH020279  BAL0202            -1.   BAL0279             1.
+    SH020379  COST            856.84   TRAN0203            1.
+    SH020379  BAL0203            -1.   BAL0279             1.
+    SH020479  COST             892.8   TRAN0204            1.
+    SH020479  BAL0204            -1.   BAL0279             1.
+    SH020879  COST            875.44   TRAN0208            1.
+    SH020879  BAL0283            -1.   BAL0279             1.
+    SH020180  COST            393.08   TRAN0201            1.
+    SH020180  BAL0201            -1.   BAL0280             1.
+    SH020280  COST             489.8   TRAN0202            1.
+    SH020280  BAL0202            -1.   BAL0280             1.
+    SH020380  COST            541.88   TRAN0203            1.
+    SH020380  BAL0203            -1.   BAL0280             1.
+    SH020480  COST            463.76   TRAN0204            1.
+    SH020480  BAL0204            -1.   BAL0280             1.
+    SH020580  COST             626.2   TRAN0205            1.
+    SH020580  BAL0205            -1.   BAL0280             1.
+    SH020880  COST             297.6   TRAN0208            1.
+    SH020880  BAL0283            -1.   BAL0280             1.
+    SH020182  COST            721.68   TRAN0201            1.
+    SH020182  BAL0201            -1.   BAL0282             1.
+    SH020282  COST            407.96   TRAN0202            1.
+    SH020282  BAL0202            -1.   BAL0282             1.
+    SH020382  COST             812.2   TRAN0203            1.
+    SH020382  BAL0203            -1.   BAL0282             1.
+    SH020482  COST            875.44   TRAN0204            1.
+    SH020482  BAL0204            -1.   BAL0282             1.
+    SH020582  COST           1422.28   TRAN0205            1.
+    SH020582  BAL0205            -1.   BAL0282             1.
+    SH020882  COST            970.92   TRAN0208            1.
+    SH020882  BAL0283            -1.   BAL0282             1.
+    SH020183  COST            219.48   TRAN0201            1.
+    SH020183  BAL0201            -1.   BAL0283             1.
+    SH020283  COST             644.8   TRAN0202            1.
+    SH020283  BAL0202            -1.   BAL0283             1.
+    SH020383  COST            337.28   TRAN0203            1.
+    SH020383  BAL0203            -1.   BAL0283             1.
+    SH020483  COST             73.16   TRAN0204            1.
+    SH020483  BAL0204            -1.   BAL0283             1.
+    SH020583  COST            430.28   TRAN0205            1.
+    SH020583  BAL0205            -1.   BAL0283             1.
+    SH020683  COST            307.52   TRAN0206            1.
+    SH020683  BAL0252            -1.   BAL0283             1.
+    SH020184  COST            376.96   TRAN0201            1.
+    SH020184  BAL0201            -1.   BAL0284             1.
+    SH020284  COST            238.08   TRAN0202            1.
+    SH020284  BAL0202            -1.   BAL0284             1.
+    SH020384  COST            451.36   TRAN0203            1.
+    SH020384  BAL0203            -1.   BAL0284             1.
+    SH020484  COST             458.8   TRAN0204            1.
+    SH020484  BAL0204            -1.   BAL0284             1.
+    SH020584  COST             607.6   TRAN0205            1.
+    SH020584  BAL0205            -1.   BAL0284             1.
+    SH020684  COST             378.2   TRAN0206            1.
+    SH020684  BAL0252            -1.   BAL0284             1.
+    SH020884  COST            481.12   TRAN0208            1.
+    SH020884  BAL0283            -1.   BAL0284             1.
+    SH030201  COST            368.28   TRAN0302            1.
+    SH030201  BAL0302            -1.   BAL0301             1.
+    SH030301  COST            141.36   TRAN0303            1.
+    SH030301  BAL0303            -1.   BAL0301             1.
+    SH030401  COST            257.92   TRAN0304            1.
+    SH030401  BAL0304            -1.   BAL0301             1.
+    SH030501  COST            293.88   TRAN0305            1.
+    SH030501  BAL0305            -1.   BAL0301             1.
+    SH030601  COST            156.24   TRAN0306            1.
+    SH030601  BAL0352            -1.   BAL0301             1.
+    SH030801  COST            177.32   TRAN0308            1.
+    SH030801  BAL0383            -1.   BAL0301             1.
+    SH030102  COST            587.76   TRAN0301            1.
+    SH030102  BAL0301            -1.   BAL0302             1.
+    SH030302  COST            517.08   TRAN0303            1.
+    SH030302  BAL0303            -1.   BAL0302             1.
+    SH030402  COST            758.88   TRAN0304            1.
+    SH030402  BAL0304            -1.   BAL0302             1.
+    SH030502  COST            918.84   TRAN0305            1.
+    SH030502  BAL0305            -1.   BAL0302             1.
+    SH030602  COST            468.72   TRAN0306            1.
+    SH030602  BAL0352            -1.   BAL0302             1.
+    SH030802  COST            646.04   TRAN0308            1.
+    SH030802  BAL0383            -1.   BAL0302             1.
+    SH030103  COST             303.8   TRAN0301            1.
+    SH030103  BAL0301            -1.   BAL0303             1.
+    SH030203  COST            587.76   TRAN0302            1.
+    SH030203  BAL0302            -1.   BAL0303             1.
+    SH030403  COST            455.08   TRAN0304            1.
+    SH030403  BAL0304            -1.   BAL0303             1.
+    SH030503  COST            352.16   TRAN0305            1.
+    SH030503  BAL0305            -1.   BAL0303             1.
+    SH030603  COST             111.6   TRAN0306            1.
+    SH030603  BAL0352            -1.   BAL0303             1.
+    SH030803  COST             316.2   TRAN0308            1.
+    SH030803  BAL0383            -1.   BAL0303             1.
+    SH030104  COST            215.76   TRAN0301            1.
+    SH030104  BAL0301            -1.   BAL0304             1.
+    SH030204  COST            623.72   TRAN0302            1.
+    SH030204  BAL0302            -1.   BAL0304             1.
+    SH030304  COST            301.32   TRAN0303            1.
+    SH030304  BAL0303            -1.   BAL0304             1.
+    SH030504  COST            395.56   TRAN0305            1.
+    SH030504  BAL0305            -1.   BAL0304             1.
+    SH030604  COST             303.8   TRAN0306            1.
+    SH030604  BAL0352            -1.   BAL0304             1.
+    SH030704  COST            333.56   TRAN0307            1.
+    SH030704  BAL0364            -1.   BAL0304             1.
+    SH030804  COST             71.92   TRAN0308            1.
+    SH030804  BAL0383            -1.   BAL0304             1.
+    SH030105  COST             334.8   TRAN0301            1.
+    SH030105  BAL0301            -1.   BAL0305             1.
+    SH030205  COST            639.84   TRAN0302            1.
+    SH030205  BAL0302            -1.   BAL0305             1.
+    SH030305  COST            352.16   TRAN0303            1.
+    SH030305  BAL0303            -1.   BAL0305             1.
+    SH030405  COST             353.4   TRAN0304            1.
+    SH030405  BAL0304            -1.   BAL0305             1.
+    SH030605  COST            404.24   TRAN0306            1.
+    SH030605  BAL0352            -1.   BAL0305             1.
+    SH030705  COST            414.16   TRAN0307            1.
+    SH030705  BAL0364            -1.   BAL0305             1.
+    SH030805  COST            336.04   TRAN0308            1.
+    SH030805  BAL0383            -1.   BAL0305             1.
+    SH030106  COST            246.76   TRAN0301            1.
+    SH030106  BAL0301            -1.   BAL0306             1.
+    SH030206  COST            517.08   TRAN0302            1.
+    SH030206  BAL0302            -1.   BAL0306             1.
+    SH030306  COST            264.12   TRAN0303            1.
+    SH030306  BAL0303            -1.   BAL0306             1.
+    SH030406  COST            271.56   TRAN0304            1.
+    SH030406  BAL0304            -1.   BAL0306             1.
+    SH030506  COST            312.48   TRAN0305            1.
+    SH030506  BAL0305            -1.   BAL0306             1.
+    SH030606  COST            255.44   TRAN0306            1.
+    SH030606  BAL0352            -1.   BAL0306             1.
+    SH030706  COST              248.   TRAN0307            1.
+    SH030706  BAL0364            -1.   BAL0306             1.
+    SH030806  COST            187.24   TRAN0308            1.
+    SH030806  BAL0383            -1.   BAL0306             1.
+    SH030107  COST             26.04   TRAN0301            1.
+    SH030107  BAL0301            -1.   BAL0307             1.
+    SH030207  COST            362.08   TRAN0302            1.
+    SH030207  BAL0302            -1.   BAL0307             1.
+    SH030307  COST            153.76   TRAN0303            1.
+    SH030307  BAL0303            -1.   BAL0307             1.
+    SH030407  COST            256.68   TRAN0304            1.
+    SH030407  BAL0304            -1.   BAL0307             1.
+    SH030507  COST            283.96   TRAN0305            1.
+    SH030507  BAL0305            -1.   BAL0307             1.
+    SH030607  COST              155.   TRAN0306            1.
+    SH030607  BAL0352            -1.   BAL0307             1.
+    SH030707  COST            287.68   TRAN0307            1.
+    SH030707  BAL0364            -1.   BAL0307             1.
+    SH030807  COST             192.2   TRAN0308            1.
+    SH030807  BAL0383            -1.   BAL0307             1.
+    SH030108  COST             81.84   TRAN0301            1.
+    SH030108  BAL0301            -1.   BAL0308             1.
+    SH030208  COST            466.24   TRAN0302            1.
+    SH030208  BAL0302            -1.   BAL0308             1.
+    SH030308  COST            174.84   TRAN0303            1.
+    SH030308  BAL0303            -1.   BAL0308             1.
+    SH030408  COST            306.28   TRAN0304            1.
+    SH030408  BAL0304            -1.   BAL0308             1.
+    SH030508  COST            225.68   TRAN0305            1.
+    SH030508  BAL0305            -1.   BAL0308             1.
+    SH030608  COST            205.84   TRAN0306            1.
+    SH030608  BAL0352            -1.   BAL0308             1.
+    SH030808  COST            231.88   TRAN0308            1.
+    SH030808  BAL0383            -1.   BAL0308             1.
+    SH030109  COST            171.12   TRAN0301            1.
+    SH030109  BAL0301            -1.   BAL0309             1.
+    SH030209  COST            474.92   TRAN0302            1.
+    SH030209  BAL0302            -1.   BAL0309             1.
+    SH030309  COST            208.32   TRAN0303            1.
+    SH030309  BAL0303            -1.   BAL0309             1.
+    SH030409  COST            313.72   TRAN0304            1.
+    SH030409  BAL0304            -1.   BAL0309             1.
+    SH030509  COST            296.36   TRAN0305            1.
+    SH030509  BAL0305            -1.   BAL0309             1.
+    SH030709  COST            243.04   TRAN0307            1.
+    SH030709  BAL0364            -1.   BAL0309             1.
+    SH030809  COST            240.56   TRAN0308            1.
+    SH030809  BAL0383            -1.   BAL0309             1.
+    SH030110  COST            306.28   TRAN0301            1.
+    SH030110  BAL0301            -1.   BAL0310             1.
+    SH030210  COST            195.92   TRAN0302            1.
+    SH030210  BAL0302            -1.   BAL0310             1.
+    SH030310  COST             297.6   TRAN0303            1.
+    SH030310  BAL0303            -1.   BAL0310             1.
+    SH030410  COST            445.16   TRAN0304            1.
+    SH030410  BAL0304            -1.   BAL0310             1.
+    SH030510  COST             477.4   TRAN0305            1.
+    SH030510  BAL0305            -1.   BAL0310             1.
+    SH030610  COST              279.   TRAN0306            1.
+    SH030610  BAL0352            -1.   BAL0310             1.
+    SH030810  COST             378.2   TRAN0308            1.
+    SH030810  BAL0383            -1.   BAL0310             1.
+    SH030111  COST            131.44   TRAN0301            1.
+    SH030111  BAL0301            -1.   BAL0311             1.
+    SH030211  COST             613.8   TRAN0302            1.
+    SH030211  BAL0302            -1.   BAL0311             1.
+    SH030311  COST            307.52   TRAN0303            1.
+    SH030311  BAL0303            -1.   BAL0311             1.
+    SH030411  COST            172.36   TRAN0304            1.
+    SH030411  BAL0304            -1.   BAL0311             1.
+    SH030511  COST            422.84   TRAN0305            1.
+    SH030511  BAL0305            -1.   BAL0311             1.
+    SH030611  COST            243.04   TRAN0306            1.
+    SH030611  BAL0352            -1.   BAL0311             1.
+    SH030811  COST            126.48   TRAN0308            1.
+    SH030811  BAL0383            -1.   BAL0311             1.
+    SH030112  COST            109.12   TRAN0301            1.
+    SH030112  BAL0301            -1.   BAL0312             1.
+    SH030212  COST            420.36   TRAN0302            1.
+    SH030212  BAL0302            -1.   BAL0312             1.
+    SH030312  COST            181.04   TRAN0303            1.
+    SH030312  BAL0303            -1.   BAL0312             1.
+    SH030412  COST              248.   TRAN0304            1.
+    SH030412  BAL0304            -1.   BAL0312             1.
+    SH030512  COST            331.08   TRAN0305            1.
+    SH030512  BAL0305            -1.   BAL0312             1.
+    SH030612  COST             179.8   TRAN0306            1.
+    SH030612  BAL0352            -1.   BAL0312             1.
+    SH030812  COST            181.04   TRAN0308            1.
+    SH030812  BAL0383            -1.   BAL0312             1.
+    SH030114  COST            176.08   TRAN0301            1.
+    SH030114  BAL0301            -1.   BAL0314             1.
+    SH030214  COST            510.88   TRAN0302            1.
+    SH030214  BAL0302            -1.   BAL0314             1.
+    SH030314  COST            243.04   TRAN0303            1.
+    SH030314  BAL0303            -1.   BAL0314             1.
+    SH030414  COST            246.76   TRAN0304            1.
+    SH030414  BAL0304            -1.   BAL0314             1.
+    SH030514  COST            436.48   TRAN0305            1.
+    SH030514  BAL0305            -1.   BAL0314             1.
+    SH030614  COST            233.12   TRAN0306            1.
+    SH030614  BAL0352            -1.   BAL0314             1.
+    SH030814  COST            156.24   TRAN0308            1.
+    SH030814  BAL0383            -1.   BAL0314             1.
+    SH030115  COST            375.72   TRAN0301            1.
+    SH030115  BAL0301            -1.   BAL0315             1.
+    SH030215  COST            197.16   TRAN0302            1.
+    SH030215  BAL0302            -1.   BAL0315             1.
+    SH030315  COST            290.16   TRAN0303            1.
+    SH030315  BAL0303            -1.   BAL0315             1.
+    SH030415  COST            590.24   TRAN0304            1.
+    SH030415  BAL0304            -1.   BAL0315             1.
+    SH030515  COST            493.52   TRAN0305            1.
+    SH030515  BAL0305            -1.   BAL0315             1.
+    SH030615  COST            233.12   TRAN0306            1.
+    SH030615  BAL0352            -1.   BAL0315             1.
+    SH030815  COST            462.52   TRAN0308            1.
+    SH030815  BAL0383            -1.   BAL0315             1.
+    SH030116  COST            195.92   TRAN0301            1.
+    SH030116  BAL0301            -1.   BAL0316             1.
+    SH030216  COST             347.2   TRAN0302            1.
+    SH030216  BAL0302            -1.   BAL0316             1.
+    SH030316  COST            281.48   TRAN0303            1.
+    SH030316  BAL0303            -1.   BAL0316             1.
+    SH030416  COST            355.88   TRAN0304            1.
+    SH030416  BAL0304            -1.   BAL0316             1.
+    SH030516  COST            395.56   TRAN0305            1.
+    SH030516  BAL0305            -1.   BAL0316             1.
+    SH030616  COST            162.44   TRAN0306            1.
+    SH030616  BAL0352            -1.   BAL0316             1.
+    SH030816  COST             254.2   TRAN0308            1.
+    SH030816  BAL0383            -1.   BAL0316             1.
+    SH030117  COST            187.24   TRAN0301            1.
+    SH030117  BAL0301            -1.   BAL0317             1.
+    SH030217  COST             626.2   TRAN0302            1.
+    SH030217  BAL0302            -1.   BAL0317             1.
+    SH030317  COST            339.76   TRAN0303            1.
+    SH030317  BAL0303            -1.   BAL0317             1.
+    SH030417  COST             70.68   TRAN0304            1.
+    SH030417  BAL0304            -1.   BAL0317             1.
+    SH030517  COST            369.52   TRAN0305            1.
+    SH030517  BAL0305            -1.   BAL0317             1.
+    SH030717  COST             365.8   TRAN0307            1.
+    SH030717  BAL0364            -1.   BAL0317             1.
+    SH030817  COST             33.48   TRAN0308            1.
+    SH030817  BAL0383            -1.   BAL0317             1.
+    SH030118  COST              217.   TRAN0301            1.
+    SH030118  BAL0301            -1.   BAL0318             1.
+    SH030218  COST            447.64   TRAN0302            1.
+    SH030218  BAL0302            -1.   BAL0318             1.
+    SH030318  COST             334.8   TRAN0303            1.
+    SH030318  BAL0303            -1.   BAL0318             1.
+    SH030418  COST            190.96   TRAN0304            1.
+    SH030418  BAL0304            -1.   BAL0318             1.
+    SH030518  COST            504.68   TRAN0305            1.
+    SH030518  BAL0305            -1.   BAL0318             1.
+    SH030618  COST            436.48   TRAN0306            1.
+    SH030618  BAL0352            -1.   BAL0318             1.
+    SH030818  COST            127.72   TRAN0308            1.
+    SH030818  BAL0383            -1.   BAL0318             1.
+    SH030119  COST            307.52   TRAN0301            1.
+    SH030119  BAL0301            -1.   BAL0319             1.
+    SH030219  COST            851.88   TRAN0302            1.
+    SH030219  BAL0302            -1.   BAL0319             1.
+    SH030319  COST            393.08   TRAN0303            1.
+    SH030319  BAL0303            -1.   BAL0319             1.
+    SH030419  COST            197.16   TRAN0304            1.
+    SH030419  BAL0304            -1.   BAL0319             1.
+    SH030519  COST            257.92   TRAN0305            1.
+    SH030519  BAL0305            -1.   BAL0319             1.
+    SH030619  COST             427.8   TRAN0306            1.
+    SH030619  BAL0352            -1.   BAL0319             1.
+    SH030819  COST            122.76   TRAN0308            1.
+    SH030819  BAL0383            -1.   BAL0319             1.
+    SH030120  COST             254.2   TRAN0301            1.
+    SH030120  BAL0301            -1.   BAL0320             1.
+    SH030220  COST            846.92   TRAN0302            1.
+    SH030220  BAL0302            -1.   BAL0320             1.
+    SH030320  COST            368.28   TRAN0303            1.
+    SH030320  BAL0303            -1.   BAL0320             1.
+    SH030420  COST            140.12   TRAN0304            1.
+    SH030420  BAL0304            -1.   BAL0320             1.
+    SH030520  COST            360.84   TRAN0305            1.
+    SH030520  BAL0305            -1.   BAL0320             1.
+    SH030820  COST            156.24   TRAN0308            1.
+    SH030820  BAL0383            -1.   BAL0320             1.
+    SH030121  COST            499.72   TRAN0301            1.
+    SH030121  BAL0301            -1.   BAL0321             1.
+    SH030221  COST            456.32   TRAN0302            1.
+    SH030221  BAL0302            -1.   BAL0321             1.
+    SH030321  COST            553.04   TRAN0303            1.
+    SH030321  BAL0303            -1.   BAL0321             1.
+    SH030421  COST             396.8   TRAN0304            1.
+    SH030421  BAL0304            -1.   BAL0321             1.
+    SH030521  COST              682.   TRAN0305            1.
+    SH030521  BAL0305            -1.   BAL0321             1.
+    SH030821  COST             396.8   TRAN0308            1.
+    SH030821  BAL0383            -1.   BAL0321             1.
+    SH030122  COST            307.52   TRAN0301            1.
+    SH030122  BAL0301            -1.   BAL0322             1.
+    SH030222  COST            716.72   TRAN0302            1.
+    SH030222  BAL0302            -1.   BAL0322             1.
+    SH030322  COST            370.76   TRAN0303            1.
+    SH030322  BAL0303            -1.   BAL0322             1.
+    SH030422  COST            277.76   TRAN0304            1.
+    SH030422  BAL0304            -1.   BAL0322             1.
+    SH030522  COST            221.96   TRAN0305            1.
+    SH030522  BAL0305            -1.   BAL0322             1.
+    SH030622  COST             384.4   TRAN0306            1.
+    SH030622  BAL0352            -1.   BAL0322             1.
+    SH030822  COST            172.36   TRAN0308            1.
+    SH030822  BAL0383            -1.   BAL0322             1.
+    SH030123  COST            290.16   TRAN0301            1.
+    SH030123  BAL0301            -1.   BAL0323             1.
+    SH030223  COST            670.84   TRAN0302            1.
+    SH030223  BAL0302            -1.   BAL0323             1.
+    SH030323  COST            355.88   TRAN0303            1.
+    SH030323  BAL0303            -1.   BAL0323             1.
+    SH030423  COST            207.08   TRAN0304            1.
+    SH030423  BAL0304            -1.   BAL0323             1.
+    SH030523  COST            205.84   TRAN0305            1.
+    SH030523  BAL0305            -1.   BAL0323             1.
+    SH030823  COST            172.36   TRAN0308            1.
+    SH030823  BAL0383            -1.   BAL0323             1.
+    SH030124  COST           1780.64   TRAN0301            1.
+    SH030124  BAL0301            -1.   BAL0324             1.
+    SH030125  COST            479.88   TRAN0301            1.
+    SH030125  BAL0301            -1.   BAL0325             1.
+    SH030225  COST            529.48   TRAN0302            1.
+    SH030225  BAL0302            -1.   BAL0325             1.
+    SH030325  COST            633.64   TRAN0303            1.
+    SH030325  BAL0303            -1.   BAL0325             1.
+    SH030425  COST            431.52   TRAN0304            1.
+    SH030425  BAL0304            -1.   BAL0325             1.
+    SH030525  COST            701.84   TRAN0305            1.
+    SH030525  BAL0305            -1.   BAL0325             1.
+    SH030625  COST            499.72   TRAN0306            1.
+    SH030625  BAL0352            -1.   BAL0325             1.
+    SH030825  COST             378.2   TRAN0308            1.
+    SH030825  BAL0383            -1.   BAL0325             1.
+    SH030426  COST             334.8   TRAN0304            1.
+    SH030426  BAL0304            -1.   BAL0326             1.
+    SH030127  COST            290.16   TRAN0301            1.
+    SH030127  BAL0301            -1.   BAL0327             1.
+    SH030227  COST            352.16   TRAN0302            1.
+    SH030227  BAL0302            -1.   BAL0327             1.
+    SH030327  COST            358.36   TRAN0303            1.
+    SH030327  BAL0303            -1.   BAL0327             1.
+    SH030427  COST             415.4   TRAN0304            1.
+    SH030427  BAL0304            -1.   BAL0327             1.
+    SH030527  COST            468.72   TRAN0305            1.
+    SH030527  BAL0305            -1.   BAL0327             1.
+    SH030627  COST            332.32   TRAN0306            1.
+    SH030627  BAL0352            -1.   BAL0327             1.
+    SH030827  COST            312.48   TRAN0308            1.
+    SH030827  BAL0383            -1.   BAL0327             1.
+    SH030128  COST            301.32   TRAN0301            1.
+    SH030128  BAL0301            -1.   BAL0328             1.
+    SH030228  COST            705.56   TRAN0302            1.
+    SH030228  BAL0302            -1.   BAL0328             1.
+    SH030328  COST            367.04   TRAN0303            1.
+    SH030328  BAL0303            -1.   BAL0328             1.
+    SH030428  COST             365.8   TRAN0304            1.
+    SH030428  BAL0304            -1.   BAL0328             1.
+    SH030528  COST            126.48   TRAN0305            1.
+    SH030528  BAL0305            -1.   BAL0328             1.
+    SH030628  COST            323.64   TRAN0306            1.
+    SH030628  BAL0352            -1.   BAL0328             1.
+    SH030728  COST            132.68   TRAN0307            1.
+    SH030728  BAL0364            -1.   BAL0328             1.
+    SH030828  COST            314.96   TRAN0308            1.
+    SH030828  BAL0383            -1.   BAL0328             1.
+    SH030129  COST            276.52   TRAN0301            1.
+    SH030129  BAL0301            -1.   BAL0329             1.
+    SH030229  COST            575.36   TRAN0302            1.
+    SH030229  BAL0302            -1.   BAL0329             1.
+    SH030329  COST            298.84   TRAN0303            1.
+    SH030329  BAL0303            -1.   BAL0329             1.
+    SH030429  COST            246.76   TRAN0304            1.
+    SH030429  BAL0304            -1.   BAL0329             1.
+    SH030529  COST             533.2   TRAN0305            1.
+    SH030529  BAL0305            -1.   BAL0329             1.
+    SH030629  COST            323.64   TRAN0306            1.
+    SH030629  BAL0352            -1.   BAL0329             1.
+    SH030829  COST            178.56   TRAN0308            1.
+    SH030829  BAL0383            -1.   BAL0329             1.
+    SH030130  COST            577.84   TRAN0301            1.
+    SH030130  BAL0301            -1.   BAL0330             1.
+    SH030230  COST            540.64   TRAN0302            1.
+    SH030230  BAL0302            -1.   BAL0330             1.
+    SH030330  COST            648.52   TRAN0303            1.
+    SH030330  BAL0303            -1.   BAL0330             1.
+    SH030430  COST            376.96   TRAN0304            1.
+    SH030430  BAL0304            -1.   BAL0330             1.
+    SH030530  COST            553.04   TRAN0305            1.
+    SH030530  BAL0305            -1.   BAL0330             1.
+    SH030830  COST            473.68   TRAN0308            1.
+    SH030830  BAL0383            -1.   BAL0330             1.
+    SH030131  COST            137.64   TRAN0301            1.
+    SH030131  BAL0301            -1.   BAL0331             1.
+    SH030231  COST            435.24   TRAN0302            1.
+    SH030231  BAL0302            -1.   BAL0331             1.
+    SH030331  COST             136.4   TRAN0303            1.
+    SH030331  BAL0303            -1.   BAL0331             1.
+    SH030431  COST            313.72   TRAN0304            1.
+    SH030431  BAL0304            -1.   BAL0331             1.
+    SH030531  COST            380.68   TRAN0305            1.
+    SH030531  BAL0305            -1.   BAL0331             1.
+    SH030631  COST            138.88   TRAN0306            1.
+    SH030631  BAL0352            -1.   BAL0331             1.
+    SH030831  COST            276.52   TRAN0308            1.
+    SH030831  BAL0383            -1.   BAL0331             1.
+    SH030132  COST            370.76   TRAN0301            1.
+    SH030132  BAL0301            -1.   BAL0332             1.
+    SH030232  COST            592.72   TRAN0302            1.
+    SH030232  BAL0302            -1.   BAL0332             1.
+    SH030332  COST            524.52   TRAN0303            1.
+    SH030332  BAL0303            -1.   BAL0332             1.
+    SH030432  COST            194.68   TRAN0304            1.
+    SH030432  BAL0304            -1.   BAL0332             1.
+    SH030532  COST            486.08   TRAN0305            1.
+    SH030532  BAL0305            -1.   BAL0332             1.
+    SH030832  COST             223.2   TRAN0308            1.
+    SH030832  BAL0383            -1.   BAL0332             1.
+    SH030133  COST            611.32   TRAN0301            1.
+    SH030133  BAL0301            -1.   BAL0333             1.
+    SH030233  COST              496.   TRAN0302            1.
+    SH030233  BAL0302            -1.   BAL0333             1.
+    SH030333  COST            673.32   TRAN0303            1.
+    SH030333  BAL0303            -1.   BAL0333             1.
+    SH030433  COST             551.8   TRAN0304            1.
+    SH030433  BAL0304            -1.   BAL0333             1.
+    SH030533  COST            782.44   TRAN0305            1.
+    SH030533  BAL0305            -1.   BAL0333             1.
+    SH030833  COST            472.44   TRAN0308            1.
+    SH030833  BAL0383            -1.   BAL0333             1.
+    SH030134  COST            478.64   TRAN0301            1.
+    SH030134  BAL0301            -1.   BAL0334             1.
+    SH030234  COST             812.2   TRAN0302            1.
+    SH030234  BAL0302            -1.   BAL0334             1.
+    SH030334  COST            623.72   TRAN0303            1.
+    SH030334  BAL0303            -1.   BAL0334             1.
+    SH030434  COST            261.64   TRAN0304            1.
+    SH030434  BAL0304            -1.   BAL0334             1.
+    SH030534  COST            546.84   TRAN0305            1.
+    SH030534  BAL0305            -1.   BAL0334             1.
+    SH030834  COST            326.12   TRAN0308            1.
+    SH030834  BAL0383            -1.   BAL0334             1.
+    SH030135  COST            571.64   TRAN0301            1.
+    SH030135  BAL0301            -1.   BAL0335             1.
+    SH030235  COST             551.8   TRAN0302            1.
+    SH030235  BAL0302            -1.   BAL0335             1.
+    SH030335  COST            467.48   TRAN0303            1.
+    SH030335  BAL0303            -1.   BAL0335             1.
+    SH030435  COST            151.28   TRAN0304            1.
+    SH030435  BAL0304            -1.   BAL0335             1.
+    SH030535  COST            534.44   TRAN0305            1.
+    SH030535  BAL0305            -1.   BAL0335             1.
+    SH030835  COST             291.4   TRAN0308            1.
+    SH030835  BAL0383            -1.   BAL0335             1.
+    SH030136  COST             254.2   TRAN0301            1.
+    SH030136  BAL0301            -1.   BAL0336             1.
+    SH030236  COST            555.52   TRAN0302            1.
+    SH030236  BAL0302            -1.   BAL0336             1.
+    SH030336  COST            131.44   TRAN0303            1.
+    SH030336  BAL0303            -1.   BAL0336             1.
+    SH030436  COST             458.8   TRAN0304            1.
+    SH030436  BAL0304            -1.   BAL0336             1.
+    SH030536  COST            429.04   TRAN0305            1.
+    SH030536  BAL0305            -1.   BAL0336             1.
+    SH030636  COST             136.4   TRAN0306            1.
+    SH030636  BAL0352            -1.   BAL0336             1.
+    SH030836  COST            398.04   TRAN0308            1.
+    SH030836  BAL0383            -1.   BAL0336             1.
+    SH030137  COST            114.08   TRAN0301            1.
+    SH030137  BAL0301            -1.   BAL0337             1.
+    SH030237  COST            424.08   TRAN0302            1.
+    SH030237  BAL0302            -1.   BAL0337             1.
+    SH030337  COST            195.92   TRAN0303            1.
+    SH030337  BAL0303            -1.   BAL0337             1.
+    SH030437  COST            376.96   TRAN0304            1.
+    SH030437  BAL0304            -1.   BAL0337             1.
+    SH030537  COST            225.68   TRAN0305            1.
+    SH030537  BAL0305            -1.   BAL0337             1.
+    SH030637  COST            240.56   TRAN0306            1.
+    SH030637  BAL0352            -1.   BAL0337             1.
+    SH030837  COST            312.48   TRAN0308            1.
+    SH030837  BAL0383            -1.   BAL0337             1.
+    SH030138  COST            168.64   TRAN0301            1.
+    SH030138  BAL0301            -1.   BAL0338             1.
+    SH030238  COST            302.56   TRAN0302            1.
+    SH030238  BAL0302            -1.   BAL0338             1.
+    SH030338  COST             117.8   TRAN0303            1.
+    SH030338  BAL0303            -1.   BAL0338             1.
+    SH030438  COST            381.92   TRAN0304            1.
+    SH030438  BAL0304            -1.   BAL0338             1.
+    SH030538  COST            344.72   TRAN0305            1.
+    SH030538  BAL0305            -1.   BAL0338             1.
+    SH030638  COST             48.36   TRAN0306            1.
+    SH030638  BAL0352            -1.   BAL0338             1.
+    SH030738  COST            267.84   TRAN0307            1.
+    SH030738  BAL0364            -1.   BAL0338             1.
+    SH030838  COST            293.88   TRAN0308            1.
+    SH030838  BAL0383            -1.   BAL0338             1.
+    SH030139  COST             161.2   TRAN0301            1.
+    SH030139  BAL0301            -1.   BAL0339             1.
+    SH030239  COST            420.36   TRAN0302            1.
+    SH030239  BAL0302            -1.   BAL0339             1.
+    SH030339  COST             198.4   TRAN0303            1.
+    SH030339  BAL0303            -1.   BAL0339             1.
+    SH030439  COST            308.76   TRAN0304            1.
+    SH030439  BAL0304            -1.   BAL0339             1.
+    SH030539  COST            531.96   TRAN0305            1.
+    SH030539  BAL0305            -1.   BAL0339             1.
+    SH030639  COST            252.96   TRAN0306            1.
+    SH030639  BAL0352            -1.   BAL0339             1.
+    SH030839  COST            208.32   TRAN0308            1.
+    SH030839  BAL0383            -1.   BAL0339             1.
+    SH030140  COST             204.6   TRAN0301            1.
+    SH030140  BAL0301            -1.   BAL0340             1.
+    SH030240  COST            468.72   TRAN0302            1.
+    SH030240  BAL0302            -1.   BAL0340             1.
+    SH030340  COST            127.72   TRAN0303            1.
+    SH030340  BAL0303            -1.   BAL0340             1.
+    SH030440  COST            368.28   TRAN0304            1.
+    SH030440  BAL0304            -1.   BAL0340             1.
+    SH030540  COST            274.04   TRAN0305            1.
+    SH030540  BAL0305            -1.   BAL0340             1.
+    SH030640  COST            162.44   TRAN0306            1.
+    SH030640  BAL0352            -1.   BAL0340             1.
+    SH030840  COST            339.76   TRAN0308            1.
+    SH030840  BAL0383            -1.   BAL0340             1.
+    SH030141  COST            243.04   TRAN0301            1.
+    SH030141  BAL0301            -1.   BAL0341             1.
+    SH030241  COST              372.   TRAN0302            1.
+    SH030241  BAL0302            -1.   BAL0341             1.
+    SH030341  COST              186.   TRAN0303            1.
+    SH030341  BAL0303            -1.   BAL0341             1.
+    SH030441  COST            401.76   TRAN0304            1.
+    SH030441  BAL0304            -1.   BAL0341             1.
+    SH030541  COST            456.32   TRAN0305            1.
+    SH030541  BAL0305            -1.   BAL0341             1.
+    SH030641  COST              124.   TRAN0306            1.
+    SH030641  BAL0352            -1.   BAL0341             1.
+    SH030841  COST            370.76   TRAN0308            1.
+    SH030841  BAL0383            -1.   BAL0341             1.
+    SH030142  COST             111.6   TRAN0301            1.
+    SH030142  BAL0301            -1.   BAL0342             1.
+    SH030242  COST            513.36   TRAN0302            1.
+    SH030242  BAL0302            -1.   BAL0342             1.
+    SH030342  COST             198.4   TRAN0303            1.
+    SH030342  BAL0303            -1.   BAL0342             1.
+    SH030442  COST             241.8   TRAN0304            1.
+    SH030442  BAL0304            -1.   BAL0342             1.
+    SH030542  COST            447.64   TRAN0305            1.
+    SH030542  BAL0305            -1.   BAL0342             1.
+    SH030642  COST            199.64   TRAN0306            1.
+    SH030642  BAL0352            -1.   BAL0342             1.
+    SH030842  COST            188.48   TRAN0308            1.
+    SH030842  BAL0383            -1.   BAL0342             1.
+    SH030143  COST            197.16   TRAN0301            1.
+    SH030143  BAL0301            -1.   BAL0343             1.
+    SH030243  COST             489.8   TRAN0302            1.
+    SH030243  BAL0302            -1.   BAL0343             1.
+    SH030343  COST               31.   TRAN0303            1.
+    SH030343  BAL0303            -1.   BAL0343             1.
+    SH030443  COST            367.04   TRAN0304            1.
+    SH030443  BAL0304            -1.   BAL0343             1.
+    SH030543  COST            319.92   TRAN0305            1.
+    SH030543  BAL0305            -1.   BAL0343             1.
+    SH030643  COST              124.   TRAN0306            1.
+    SH030643  BAL0352            -1.   BAL0343             1.
+    SH030743  COST            298.84   TRAN0307            1.
+    SH030743  BAL0364            -1.   BAL0343             1.
+    SH030843  COST            336.04   TRAN0308            1.
+    SH030843  BAL0383            -1.   BAL0343             1.
+    SH030144  COST            197.16   TRAN0301            1.
+    SH030144  BAL0301            -1.   BAL0344             1.
+    SH030244  COST            469.96   TRAN0302            1.
+    SH030244  BAL0302            -1.   BAL0344             1.
+    SH030344  COST            158.72   TRAN0303            1.
+    SH030344  BAL0303            -1.   BAL0344             1.
+    SH030444  COST            386.88   TRAN0304            1.
+    SH030444  BAL0304            -1.   BAL0344             1.
+    SH030544  COST             384.4   TRAN0305            1.
+    SH030544  BAL0305            -1.   BAL0344             1.
+    SH030644  COST            110.36   TRAN0306            1.
+    SH030644  BAL0352            -1.   BAL0344             1.
+    SH030844  COST            369.52   TRAN0308            1.
+    SH030844  BAL0383            -1.   BAL0344             1.
+    SH030145  COST            213.28   TRAN0301            1.
+    SH030145  BAL0301            -1.   BAL0345             1.
+    SH030245  COST            540.64   TRAN0302            1.
+    SH030245  BAL0302            -1.   BAL0345             1.
+    SH030345  COST            199.64   TRAN0303            1.
+    SH030345  BAL0303            -1.   BAL0345             1.
+    SH030445  COST            362.08   TRAN0304            1.
+    SH030445  BAL0304            -1.   BAL0345             1.
+    SH030545  COST            290.16   TRAN0305            1.
+    SH030545  BAL0305            -1.   BAL0345             1.
+    SH030645  COST            236.84   TRAN0306            1.
+    SH030645  BAL0352            -1.   BAL0345             1.
+    SH030745  COST            244.28   TRAN0307            1.
+    SH030745  BAL0364            -1.   BAL0345             1.
+    SH030845  COST             378.2   TRAN0308            1.
+    SH030845  BAL0383            -1.   BAL0345             1.
+    SH030146  COST             303.8   TRAN0301            1.
+    SH030146  BAL0301            -1.   BAL0346             1.
+    SH030246  COST            338.52   TRAN0302            1.
+    SH030246  BAL0302            -1.   BAL0346             1.
+    SH030346  COST            274.04   TRAN0303            1.
+    SH030346  BAL0303            -1.   BAL0346             1.
+    SH030446  COST            554.28   TRAN0304            1.
+    SH030446  BAL0304            -1.   BAL0346             1.
+    SH030546  COST             533.2   TRAN0305            1.
+    SH030546  BAL0305            -1.   BAL0346             1.
+    SH030646  COST            318.68   TRAN0306            1.
+    SH030646  BAL0352            -1.   BAL0346             1.
+    SH030846  COST            555.52   TRAN0308            1.
+    SH030846  BAL0383            -1.   BAL0346             1.
+    SH030147  COST             136.4   TRAN0301            1.
+    SH030147  BAL0301            -1.   BAL0347             1.
+    SH030247  COST            462.52   TRAN0302            1.
+    SH030247  BAL0302            -1.   BAL0347             1.
+    SH030347  COST            197.16   TRAN0303            1.
+    SH030347  BAL0303            -1.   BAL0347             1.
+    SH030447  COST            339.76   TRAN0304            1.
+    SH030447  BAL0304            -1.   BAL0347             1.
+    SH030547  COST            288.92   TRAN0305            1.
+    SH030547  BAL0305            -1.   BAL0347             1.
+    SH030647  COST             179.8   TRAN0306            1.
+    SH030647  BAL0352            -1.   BAL0347             1.
+    SH030847  COST            302.56   TRAN0308            1.
+    SH030847  BAL0383            -1.   BAL0347             1.
+    SH030148  COST             117.8   TRAN0301            1.
+    SH030148  BAL0301            -1.   BAL0348             1.
+    SH030248  COST            420.36   TRAN0302            1.
+    SH030248  BAL0302            -1.   BAL0348             1.
+    SH030348  COST            169.88   TRAN0303            1.
+    SH030348  BAL0303            -1.   BAL0348             1.
+    SH030448  COST             285.2   TRAN0304            1.
+    SH030448  BAL0304            -1.   BAL0348             1.
+    SH030548  COST            306.28   TRAN0305            1.
+    SH030548  BAL0305            -1.   BAL0348             1.
+    SH030648  COST             142.6   TRAN0306            1.
+    SH030648  BAL0352            -1.   BAL0348             1.
+    SH030848  COST             241.8   TRAN0308            1.
+    SH030848  BAL0383            -1.   BAL0348             1.
+    SH030149  COST            407.96   TRAN0301            1.
+    SH030149  BAL0301            -1.   BAL0349             1.
+    SH030249  COST             663.4   TRAN0302            1.
+    SH030249  BAL0302            -1.   BAL0349             1.
+    SH030349  COST            411.68   TRAN0303            1.
+    SH030349  BAL0303            -1.   BAL0349             1.
+    SH030449  COST            472.44   TRAN0304            1.
+    SH030449  BAL0304            -1.   BAL0349             1.
+    SH030549  COST            188.48   TRAN0305            1.
+    SH030549  BAL0305            -1.   BAL0349             1.
+    SH030649  COST            419.12   TRAN0306            1.
+    SH030649  BAL0352            -1.   BAL0349             1.
+    SH030749  COST            166.16   TRAN0307            1.
+    SH030749  BAL0364            -1.   BAL0349             1.
+    SH030849  COST            505.92   TRAN0308            1.
+    SH030849  BAL0383            -1.   BAL0349             1.
+    SH030150  COST            298.84   TRAN0301            1.
+    SH030150  BAL0301            -1.   BAL0350             1.
+    SH030250  COST            758.88   TRAN0302            1.
+    SH030250  BAL0302            -1.   BAL0350             1.
+    SH030350  COST            305.04   TRAN0303            1.
+    SH030350  BAL0303            -1.   BAL0350             1.
+    SH030450  COST             452.6   TRAN0304            1.
+    SH030450  BAL0304            -1.   BAL0350             1.
+    SH030550  COST             291.4   TRAN0305            1.
+    SH030550  BAL0305            -1.   BAL0350             1.
+    SH030750  COST            169.88   TRAN0307            1.
+    SH030750  BAL0364            -1.   BAL0350             1.
+    SH030850  COST            503.44   TRAN0308            1.
+    SH030850  BAL0383            -1.   BAL0350             1.
+    SH030151  COST            411.68   TRAN0301            1.
+    SH030151  BAL0301            -1.   BAL0351             1.
+    SH030251  COST              682.   TRAN0302            1.
+    SH030251  BAL0302            -1.   BAL0351             1.
+    SH030351  COST            422.84   TRAN0303            1.
+    SH030351  BAL0303            -1.   BAL0351             1.
+    SH030451  COST            419.12   TRAN0304            1.
+    SH030451  BAL0304            -1.   BAL0351             1.
+    SH030551  COST            152.52   TRAN0305            1.
+    SH030551  BAL0305            -1.   BAL0351             1.
+    SH030751  COST            122.76   TRAN0307            1.
+    SH030751  BAL0364            -1.   BAL0351             1.
+    SH030851  COST            530.72   TRAN0308            1.
+    SH030851  BAL0383            -1.   BAL0351             1.
+    SH030152  COST            138.88   TRAN0301            1.
+    SH030152  BAL0301            -1.   BAL0352             1.
+    SH030252  COST              372.   TRAN0302            1.
+    SH030252  BAL0302            -1.   BAL0352             1.
+    SH030352  COST            101.68   TRAN0303            1.
+    SH030352  BAL0303            -1.   BAL0352             1.
+    SH030452  COST            399.28   TRAN0304            1.
+    SH030452  BAL0304            -1.   BAL0352             1.
+    SH030552  COST             365.8   TRAN0305            1.
+    SH030552  BAL0305            -1.   BAL0352             1.
+    SH030852  COST            313.72   TRAN0308            1.
+    SH030852  BAL0383            -1.   BAL0352             1.
+    SH030153  COST            445.16   TRAN0301            1.
+    SH030153  BAL0301            -1.   BAL0353             1.
+    SH030253  COST            788.64   TRAN0302            1.
+    SH030253  BAL0302            -1.   BAL0353             1.
+    SH030353  COST              403.   TRAN0303            1.
+    SH030353  BAL0303            -1.   BAL0353             1.
+    SH030453  COST            510.88   TRAN0304            1.
+    SH030453  BAL0304            -1.   BAL0353             1.
+    SH030553  COST            228.16   TRAN0305            1.
+    SH030553  BAL0305            -1.   BAL0353             1.
+    SH030653  COST            445.16   TRAN0306            1.
+    SH030653  BAL0352            -1.   BAL0353             1.
+    SH030753  COST            181.04   TRAN0307            1.
+    SH030753  BAL0364            -1.   BAL0353             1.
+    SH030853  COST            499.72   TRAN0308            1.
+    SH030853  BAL0383            -1.   BAL0353             1.
+    SH030154  COST             229.4   TRAN0301            1.
+    SH030154  BAL0301            -1.   BAL0354             1.
+    SH030254  COST             551.8   TRAN0302            1.
+    SH030254  BAL0302            -1.   BAL0354             1.
+    SH030354  COST            269.08   TRAN0303            1.
+    SH030354  BAL0303            -1.   BAL0354             1.
+    SH030454  COST            425.32   TRAN0304            1.
+    SH030454  BAL0304            -1.   BAL0354             1.
+    SH030554  COST            264.12   TRAN0305            1.
+    SH030554  BAL0305            -1.   BAL0354             1.
+    SH030654  COST            251.72   TRAN0306            1.
+    SH030654  BAL0352            -1.   BAL0354             1.
+    SH030854  COST            498.48   TRAN0308            1.
+    SH030854  BAL0383            -1.   BAL0354             1.
+    SH030155  COST            344.72   TRAN0301            1.
+    SH030155  BAL0301            -1.   BAL0355             1.
+    SH030255  COST            593.96   TRAN0302            1.
+    SH030255  BAL0302            -1.   BAL0355             1.
+    SH030355  COST            348.44   TRAN0303            1.
+    SH030355  BAL0303            -1.   BAL0355             1.
+    SH030455  COST            364.56   TRAN0304            1.
+    SH030455  BAL0304            -1.   BAL0355             1.
+    SH030555  COST            190.96   TRAN0305            1.
+    SH030555  BAL0305            -1.   BAL0355             1.
+    SH030655  COST             359.6   TRAN0306            1.
+    SH030655  BAL0352            -1.   BAL0355             1.
+    SH030755  COST            132.68   TRAN0307            1.
+    SH030755  BAL0364            -1.   BAL0355             1.
+    SH030855  COST            364.56   TRAN0308            1.
+    SH030855  BAL0383            -1.   BAL0355             1.
+    SH030156  COST             483.6   TRAN0301            1.
+    SH030156  BAL0301            -1.   BAL0356             1.
+    SH030256  COST            717.96   TRAN0302            1.
+    SH030256  BAL0302            -1.   BAL0356             1.
+    SH030356  COST             378.2   TRAN0303            1.
+    SH030356  BAL0303            -1.   BAL0356             1.
+    SH030456  COST             452.6   TRAN0304            1.
+    SH030456  BAL0304            -1.   BAL0356             1.
+    SH030556  COST            168.64   TRAN0305            1.
+    SH030556  BAL0305            -1.   BAL0356             1.
+    SH030656  COST            420.36   TRAN0306            1.
+    SH030656  BAL0352            -1.   BAL0356             1.
+    SH030756  COST            151.28   TRAN0307            1.
+    SH030756  BAL0364            -1.   BAL0356             1.
+    SH030856  COST            442.68   TRAN0308            1.
+    SH030856  BAL0383            -1.   BAL0356             1.
+    SH030157  COST            323.64   TRAN0301            1.
+    SH030157  BAL0301            -1.   BAL0357             1.
+    SH030257  COST             644.8   TRAN0302            1.
+    SH030257  BAL0302            -1.   BAL0357             1.
+    SH030357  COST             359.6   TRAN0303            1.
+    SH030357  BAL0303            -1.   BAL0357             1.
+    SH030457  COST            290.16   TRAN0304            1.
+    SH030457  BAL0304            -1.   BAL0357             1.
+    SH030557  COST            208.32   TRAN0305            1.
+    SH030557  BAL0305            -1.   BAL0357             1.
+    SH030657  COST            395.56   TRAN0306            1.
+    SH030657  BAL0352            -1.   BAL0357             1.
+    SH030757  COST            183.52   TRAN0307            1.
+    SH030757  BAL0364            -1.   BAL0357             1.
+    SH030857  COST            286.44   TRAN0308            1.
+    SH030857  BAL0383            -1.   BAL0357             1.
+    SH030158  COST            364.56   TRAN0301            1.
+    SH030158  BAL0301            -1.   BAL0358             1.
+    SH030258  COST            646.04   TRAN0302            1.
+    SH030258  BAL0302            -1.   BAL0358             1.
+    SH030358  COST            344.72   TRAN0303            1.
+    SH030358  BAL0303            -1.   BAL0358             1.
+    SH030458  COST            425.32   TRAN0304            1.
+    SH030458  BAL0304            -1.   BAL0358             1.
+    SH030558  COST             26.04   TRAN0305            1.
+    SH030558  BAL0305            -1.   BAL0358             1.
+    SH030658  COST            404.24   TRAN0306            1.
+    SH030658  BAL0352            -1.   BAL0358             1.
+    SH030758  COST             84.32   TRAN0307            1.
+    SH030758  BAL0364            -1.   BAL0358             1.
+    SH030858  COST            314.96   TRAN0308            1.
+    SH030858  BAL0383            -1.   BAL0358             1.
+    SH030159  COST            255.44   TRAN0301            1.
+    SH030159  BAL0301            -1.   BAL0359             1.
+    SH030259  COST            617.52   TRAN0302            1.
+    SH030259  BAL0302            -1.   BAL0359             1.
+    SH030359  COST            295.12   TRAN0303            1.
+    SH030359  BAL0303            -1.   BAL0359             1.
+    SH030459  COST            302.56   TRAN0304            1.
+    SH030459  BAL0304            -1.   BAL0359             1.
+    SH030559  COST            197.16   TRAN0305            1.
+    SH030559  BAL0305            -1.   BAL0359             1.
+    SH030659  COST            368.28   TRAN0306            1.
+    SH030659  BAL0352            -1.   BAL0359             1.
+    SH030759  COST             130.2   TRAN0307            1.
+    SH030759  BAL0364            -1.   BAL0359             1.
+    SH030859  COST             316.2   TRAN0308            1.
+    SH030859  BAL0383            -1.   BAL0359             1.
+    SH030160  COST            323.64   TRAN0301            1.
+    SH030160  BAL0301            -1.   BAL0360             1.
+    SH030260  COST              682.   TRAN0302            1.
+    SH030260  BAL0302            -1.   BAL0360             1.
+    SH030360  COST            350.92   TRAN0303            1.
+    SH030360  BAL0303            -1.   BAL0360             1.
+    SH030460  COST            386.88   TRAN0304            1.
+    SH030460  BAL0304            -1.   BAL0360             1.
+    SH030560  COST             167.4   TRAN0305            1.
+    SH030560  BAL0305            -1.   BAL0360             1.
+    SH030660  COST            400.52   TRAN0306            1.
+    SH030660  BAL0352            -1.   BAL0360             1.
+    SH030760  COST            109.12   TRAN0307            1.
+    SH030760  BAL0364            -1.   BAL0360             1.
+    SH030860  COST            370.76   TRAN0308            1.
+    SH030860  BAL0383            -1.   BAL0360             1.
+    SH030163  COST            329.84   TRAN0301            1.
+    SH030163  BAL0301            -1.   BAL0363             1.
+    SH030263  COST            612.56   TRAN0302            1.
+    SH030263  BAL0302            -1.   BAL0363             1.
+    SH030363  COST            355.88   TRAN0303            1.
+    SH030363  BAL0303            -1.   BAL0363             1.
+    SH030463  COST            457.56   TRAN0304            1.
+    SH030463  BAL0304            -1.   BAL0363             1.
+    SH030563  COST            188.48   TRAN0305            1.
+    SH030563  BAL0305            -1.   BAL0363             1.
+    SH030663  COST             390.6   TRAN0306            1.
+    SH030663  BAL0352            -1.   BAL0363             1.
+    SH030763  COST            153.76   TRAN0307            1.
+    SH030763  BAL0364            -1.   BAL0363             1.
+    SH030863  COST              496.   TRAN0308            1.
+    SH030863  BAL0383            -1.   BAL0363             1.
+    SH030164  COST            246.76   TRAN0301            1.
+    SH030164  BAL0301            -1.   BAL0364             1.
+    SH030264  COST            652.24   TRAN0302            1.
+    SH030264  BAL0302            -1.   BAL0364             1.
+    SH030364  COST            276.52   TRAN0303            1.
+    SH030364  BAL0303            -1.   BAL0364             1.
+    SH030464  COST            416.64   TRAN0304            1.
+    SH030464  BAL0304            -1.   BAL0364             1.
+    SH030564  COST             71.92   TRAN0305            1.
+    SH030564  BAL0305            -1.   BAL0364             1.
+    SH030664  COST            393.08   TRAN0306            1.
+    SH030664  BAL0352            -1.   BAL0364             1.
+    SH030864  COST              310.   TRAN0308            1.
+    SH030864  BAL0383            -1.   BAL0364             1.
+    SH030165  COST            535.68   TRAN0301            1.
+    SH030165  BAL0301            -1.   BAL0365             1.
+    SH030265  COST            380.68   TRAN0302            1.
+    SH030265  BAL0302            -1.   BAL0365             1.
+    SH030365  COST             626.2   TRAN0303            1.
+    SH030365  BAL0303            -1.   BAL0365             1.
+    SH030465  COST            481.12   TRAN0304            1.
+    SH030465  BAL0304            -1.   BAL0365             1.
+    SH030565  COST            748.96   TRAN0305            1.
+    SH030565  BAL0305            -1.   BAL0365             1.
+    SH030865  COST             514.6   TRAN0308            1.
+    SH030865  BAL0383            -1.   BAL0365             1.
+    SH030166  COST             694.4   TRAN0301            1.
+    SH030166  BAL0301            -1.   BAL0366             1.
+    SH030266  COST            321.16   TRAN0302            1.
+    SH030266  BAL0302            -1.   BAL0366             1.
+    SH030366  COST            716.72   TRAN0303            1.
+    SH030366  BAL0303            -1.   BAL0366             1.
+    SH030466  COST            689.44   TRAN0304            1.
+    SH030466  BAL0304            -1.   BAL0366             1.
+    SH030566  COST             880.4   TRAN0305            1.
+    SH030566  BAL0305            -1.   BAL0366             1.
+    SH030866  COST             694.4   TRAN0308            1.
+    SH030866  BAL0383            -1.   BAL0366             1.
+    SH030167  COST              527.   TRAN0301            1.
+    SH030167  BAL0301            -1.   BAL0367             1.
+    SH030267  COST            287.68   TRAN0302            1.
+    SH030267  BAL0302            -1.   BAL0367             1.
+    SH030367  COST            611.32   TRAN0303            1.
+    SH030367  BAL0303            -1.   BAL0367             1.
+    SH030467  COST            566.68   TRAN0304            1.
+    SH030467  BAL0304            -1.   BAL0367             1.
+    SH030567  COST            748.96   TRAN0305            1.
+    SH030567  BAL0305            -1.   BAL0367             1.
+    SH030867  COST            567.92   TRAN0308            1.
+    SH030867  BAL0383            -1.   BAL0367             1.
+    SH030168  COST            736.56   TRAN0301            1.
+    SH030168  BAL0301            -1.   BAL0368             1.
+    SH030268  COST              496.   TRAN0302            1.
+    SH030268  BAL0302            -1.   BAL0368             1.
+    SH030368  COST             694.4   TRAN0303            1.
+    SH030368  BAL0303            -1.   BAL0368             1.
+    SH030468  COST            870.48   TRAN0304            1.
+    SH030468  BAL0304            -1.   BAL0368             1.
+    SH030568  COST           1173.04   TRAN0305            1.
+    SH030568  BAL0305            -1.   BAL0368             1.
+    SH030868  COST            931.24   TRAN0308            1.
+    SH030868  BAL0383            -1.   BAL0368             1.
+    SH030169  COST            668.36   TRAN0301            1.
+    SH030169  BAL0301            -1.   BAL0369             1.
+    SH030269  COST            274.04   TRAN0302            1.
+    SH030269  BAL0302            -1.   BAL0369             1.
+    SH030369  COST             632.4   TRAN0303            1.
+    SH030369  BAL0303            -1.   BAL0369             1.
+    SH030469  COST            771.28   TRAN0304            1.
+    SH030469  BAL0304            -1.   BAL0369             1.
+    SH030569  COST            801.04   TRAN0305            1.
+    SH030569  BAL0305            -1.   BAL0369             1.
+    SH030869  COST            815.92   TRAN0308            1.
+    SH030869  BAL0383            -1.   BAL0369             1.
+    SH030171  COST             545.6   TRAN0301            1.
+    SH030171  BAL0301            -1.   BAL0371             1.
+    SH030371  COST            649.76   TRAN0303            1.
+    SH030371  BAL0303            -1.   BAL0371             1.
+    SH030471  COST            646.04   TRAN0304            1.
+    SH030471  BAL0304            -1.   BAL0371             1.
+    SH030571  COST            720.44   TRAN0305            1.
+    SH030571  BAL0305            -1.   BAL0371             1.
+    SH030671  COST            484.84   TRAN0306            1.
+    SH030671  BAL0352            -1.   BAL0371             1.
+    SH030771  COST            872.96   TRAN0307            1.
+    SH030771  BAL0364            -1.   BAL0371             1.
+    SH030871  COST            660.92   TRAN0308            1.
+    SH030871  BAL0383            -1.   BAL0371             1.
+    SH030172  COST            727.88   TRAN0301            1.
+    SH030172  BAL0301            -1.   BAL0372             1.
+    SH030272  COST            673.32   TRAN0302            1.
+    SH030272  BAL0302            -1.   BAL0372             1.
+    SH030372  COST            765.08   TRAN0303            1.
+    SH030372  BAL0303            -1.   BAL0372             1.
+    SH030472  COST             706.8   TRAN0304            1.
+    SH030472  BAL0304            -1.   BAL0372             1.
+    SH030572  COST            946.12   TRAN0305            1.
+    SH030572  BAL0305            -1.   BAL0372             1.
+    SH030872  COST             706.8   TRAN0308            1.
+    SH030872  BAL0383            -1.   BAL0372             1.
+    SH030173  COST             483.6   TRAN0301            1.
+    SH030173  BAL0301            -1.   BAL0373             1.
+    SH030273  COST             452.6   TRAN0302            1.
+    SH030273  BAL0302            -1.   BAL0373             1.
+    SH030373  COST            419.12   TRAN0303            1.
+    SH030373  BAL0303            -1.   BAL0373             1.
+    SH030473  COST            566.68   TRAN0304            1.
+    SH030473  BAL0304            -1.   BAL0373             1.
+    SH030573  COST            699.36   TRAN0305            1.
+    SH030573  BAL0305            -1.   BAL0373             1.
+    SH030673  COST             378.2   TRAN0306            1.
+    SH030673  BAL0352            -1.   BAL0373             1.
+    SH030873  COST            624.96   TRAN0308            1.
+    SH030873  BAL0383            -1.   BAL0373             1.
+    SH030174  COST            679.52   TRAN0301            1.
+    SH030174  BAL0301            -1.   BAL0374             1.
+    SH030274  COST             260.4   TRAN0302            1.
+    SH030274  BAL0302            -1.   BAL0374             1.
+    SH030374  COST             706.8   TRAN0303            1.
+    SH030374  BAL0303            -1.   BAL0374             1.
+    SH030474  COST            789.88   TRAN0304            1.
+    SH030474  BAL0304            -1.   BAL0374             1.
+    SH030574  COST            908.92   TRAN0305            1.
+    SH030574  BAL0305            -1.   BAL0374             1.
+    SH030874  COST            767.56   TRAN0308            1.
+    SH030874  BAL0383            -1.   BAL0374             1.
+    SH030275  COST            686.96   TRAN0302            1.
+    SH030275  BAL0302            -1.   BAL0375             1.
+    SH030176  COST            572.88   TRAN0301            1.
+    SH030176  BAL0301            -1.   BAL0376             1.
+    SH030276  COST            497.24   TRAN0302            1.
+    SH030276  BAL0302            -1.   BAL0376             1.
+    SH030376  COST            499.72   TRAN0303            1.
+    SH030376  BAL0303            -1.   BAL0376             1.
+    SH030476  COST             781.2   TRAN0304            1.
+    SH030476  BAL0304            -1.   BAL0376             1.
+    SH030576  COST             781.2   TRAN0305            1.
+    SH030576  BAL0305            -1.   BAL0376             1.
+    SH030676  COST            472.44   TRAN0306            1.
+    SH030676  BAL0352            -1.   BAL0376             1.
+    SH030876  COST            963.48   TRAN0308            1.
+    SH030876  BAL0383            -1.   BAL0376             1.
+    SH030177  COST             539.4   TRAN0301            1.
+    SH030177  BAL0301            -1.   BAL0377             1.
+    SH030277  COST            337.28   TRAN0302            1.
+    SH030277  BAL0302            -1.   BAL0377             1.
+    SH030377  COST            571.64   TRAN0303            1.
+    SH030377  BAL0303            -1.   BAL0377             1.
+    SH030477  COST            497.24   TRAN0304            1.
+    SH030477  BAL0304            -1.   BAL0377             1.
+    SH030577  COST             694.4   TRAN0305            1.
+    SH030577  BAL0305            -1.   BAL0377             1.
+    SH030877  COST             396.8   TRAN0308            1.
+    SH030877  BAL0383            -1.   BAL0377             1.
+    SH030178  COST            943.64   TRAN0301            1.
+    SH030178  BAL0301            -1.   BAL0378             1.
+    SH030278  COST            548.08   TRAN0302            1.
+    SH030278  BAL0302            -1.   BAL0378             1.
+    SH030378  COST            970.92   TRAN0303            1.
+    SH030378  BAL0303            -1.   BAL0378             1.
+    SH030478  COST             849.4   TRAN0304            1.
+    SH030478  BAL0304            -1.   BAL0378             1.
+    SH030578  COST           1089.96   TRAN0305            1.
+    SH030578  BAL0305            -1.   BAL0378             1.
+    SH030878  COST            949.84   TRAN0308            1.
+    SH030878  BAL0383            -1.   BAL0378             1.
+    SH030179  COST             886.6   TRAN0301            1.
+    SH030179  BAL0301            -1.   BAL0379             1.
+    SH030279  COST            333.56   TRAN0302            1.
+    SH030279  BAL0302            -1.   BAL0379             1.
+    SH030379  COST            856.84   TRAN0303            1.
+    SH030379  BAL0303            -1.   BAL0379             1.
+    SH030479  COST             892.8   TRAN0304            1.
+    SH030479  BAL0304            -1.   BAL0379             1.
+    SH030879  COST            875.44   TRAN0308            1.
+    SH030879  BAL0383            -1.   BAL0379             1.
+    SH030180  COST            393.08   TRAN0301            1.
+    SH030180  BAL0301            -1.   BAL0380             1.
+    SH030280  COST             489.8   TRAN0302            1.
+    SH030280  BAL0302            -1.   BAL0380             1.
+    SH030380  COST            541.88   TRAN0303            1.
+    SH030380  BAL0303            -1.   BAL0380             1.
+    SH030480  COST            463.76   TRAN0304            1.
+    SH030480  BAL0304            -1.   BAL0380             1.
+    SH030580  COST             626.2   TRAN0305            1.
+    SH030580  BAL0305            -1.   BAL0380             1.
+    SH030880  COST             297.6   TRAN0308            1.
+    SH030880  BAL0383            -1.   BAL0380             1.
+    SH030182  COST            721.68   TRAN0301            1.
+    SH030182  BAL0301            -1.   BAL0382             1.
+    SH030282  COST            407.96   TRAN0302            1.
+    SH030282  BAL0302            -1.   BAL0382             1.
+    SH030382  COST             812.2   TRAN0303            1.
+    SH030382  BAL0303            -1.   BAL0382             1.
+    SH030482  COST            875.44   TRAN0304            1.
+    SH030482  BAL0304            -1.   BAL0382             1.
+    SH030582  COST           1422.28   TRAN0305            1.
+    SH030582  BAL0305            -1.   BAL0382             1.
+    SH030882  COST            970.92   TRAN0308            1.
+    SH030882  BAL0383            -1.   BAL0382             1.
+    SH030183  COST            219.48   TRAN0301            1.
+    SH030183  BAL0301            -1.   BAL0383             1.
+    SH030283  COST             644.8   TRAN0302            1.
+    SH030283  BAL0302            -1.   BAL0383             1.
+    SH030383  COST            337.28   TRAN0303            1.
+    SH030383  BAL0303            -1.   BAL0383             1.
+    SH030483  COST             73.16   TRAN0304            1.
+    SH030483  BAL0304            -1.   BAL0383             1.
+    SH030583  COST            430.28   TRAN0305            1.
+    SH030583  BAL0305            -1.   BAL0383             1.
+    SH030683  COST            307.52   TRAN0306            1.
+    SH030683  BAL0352            -1.   BAL0383             1.
+    SH030184  COST            376.96   TRAN0301            1.
+    SH030184  BAL0301            -1.   BAL0384             1.
+    SH030284  COST            238.08   TRAN0302            1.
+    SH030284  BAL0302            -1.   BAL0384             1.
+    SH030384  COST            451.36   TRAN0303            1.
+    SH030384  BAL0303            -1.   BAL0384             1.
+    SH030484  COST             458.8   TRAN0304            1.
+    SH030484  BAL0304            -1.   BAL0384             1.
+    SH030584  COST             607.6   TRAN0305            1.
+    SH030584  BAL0305            -1.   BAL0384             1.
+    SH030684  COST             378.2   TRAN0306            1.
+    SH030684  BAL0352            -1.   BAL0384             1.
+    SH030884  COST            481.12   TRAN0308            1.
+    SH030884  BAL0383            -1.   BAL0384             1.
+    SH040201  COST            299.97   TRAN0402            1.
+    SH040201  BAL0402            -1.   BAL0401             1.
+    SH040301  COST            115.14   TRAN0403            1.
+    SH040301  BAL0403            -1.   BAL0401             1.
+    SH040401  COST            210.08   TRAN0404            1.
+    SH040401  BAL0404            -1.   BAL0401             1.
+    SH040501  COST            239.37   TRAN0405            1.
+    SH040501  BAL0405            -1.   BAL0401             1.
+    SH040601  COST            127.26   TRAN0406            1.
+    SH040601  BAL0452            -1.   BAL0401             1.
+    SH040801  COST            144.43   TRAN0408            1.
+    SH040801  BAL0483            -1.   BAL0401             1.
+    SH040102  COST            478.74   TRAN0401            1.
+    SH040102  BAL0401            -1.   BAL0402             1.
+    SH040302  COST            421.17   TRAN0403            1.
+    SH040302  BAL0403            -1.   BAL0402             1.
+    SH040402  COST            618.12   TRAN0404            1.
+    SH040402  BAL0404            -1.   BAL0402             1.
+    SH040502  COST            748.41   TRAN0405            1.
+    SH040502  BAL0405            -1.   BAL0402             1.
+    SH040602  COST            381.78   TRAN0406            1.
+    SH040602  BAL0452            -1.   BAL0402             1.
+    SH040802  COST            526.21   TRAN0408            1.
+    SH040802  BAL0483            -1.   BAL0402             1.
+    SH040103  COST            247.45   TRAN0401            1.
+    SH040103  BAL0401            -1.   BAL0403             1.
+    SH040203  COST            478.74   TRAN0402            1.
+    SH040203  BAL0402            -1.   BAL0403             1.
+    SH040403  COST            370.67   TRAN0404            1.
+    SH040403  BAL0404            -1.   BAL0403             1.
+    SH040503  COST            286.84   TRAN0405            1.
+    SH040503  BAL0405            -1.   BAL0403             1.
+    SH040603  COST              90.9   TRAN0406            1.
+    SH040603  BAL0452            -1.   BAL0403             1.
+    SH040803  COST            257.55   TRAN0408            1.
+    SH040803  BAL0483            -1.   BAL0403             1.
+    SH040104  COST            175.74   TRAN0401            1.
+    SH040104  BAL0401            -1.   BAL0404             1.
+    SH040204  COST            508.03   TRAN0402            1.
+    SH040204  BAL0402            -1.   BAL0404             1.
+    SH040304  COST            245.43   TRAN0403            1.
+    SH040304  BAL0403            -1.   BAL0404             1.
+    SH040504  COST            322.19   TRAN0405            1.
+    SH040504  BAL0405            -1.   BAL0404             1.
+    SH040604  COST            247.45   TRAN0406            1.
+    SH040604  BAL0452            -1.   BAL0404             1.
+    SH040704  COST            271.69   TRAN0407            1.
+    SH040704  BAL0464            -1.   BAL0404             1.
+    SH040804  COST             58.58   TRAN0408            1.
+    SH040804  BAL0483            -1.   BAL0404             1.
+    SH040105  COST             272.7   TRAN0401            1.
+    SH040105  BAL0401            -1.   BAL0405             1.
+    SH040205  COST            521.16   TRAN0402            1.
+    SH040205  BAL0402            -1.   BAL0405             1.
+    SH040305  COST            286.84   TRAN0403            1.
+    SH040305  BAL0403            -1.   BAL0405             1.
+    SH040405  COST            287.85   TRAN0404            1.
+    SH040405  BAL0404            -1.   BAL0405             1.
+    SH040605  COST            329.26   TRAN0406            1.
+    SH040605  BAL0452            -1.   BAL0405             1.
+    SH040705  COST            337.34   TRAN0407            1.
+    SH040705  BAL0464            -1.   BAL0405             1.
+    SH040805  COST            273.71   TRAN0408            1.
+    SH040805  BAL0483            -1.   BAL0405             1.
+    SH040106  COST            200.99   TRAN0401            1.
+    SH040106  BAL0401            -1.   BAL0406             1.
+    SH040206  COST            421.17   TRAN0402            1.
+    SH040206  BAL0402            -1.   BAL0406             1.
+    SH040306  COST            215.13   TRAN0403            1.
+    SH040306  BAL0403            -1.   BAL0406             1.
+    SH040406  COST            221.19   TRAN0404            1.
+    SH040406  BAL0404            -1.   BAL0406             1.
+    SH040506  COST            254.52   TRAN0405            1.
+    SH040506  BAL0405            -1.   BAL0406             1.
+    SH040606  COST            208.06   TRAN0406            1.
+    SH040606  BAL0452            -1.   BAL0406             1.
+    SH040706  COST              202.   TRAN0407            1.
+    SH040706  BAL0464            -1.   BAL0406             1.
+    SH040806  COST            152.51   TRAN0408            1.
+    SH040806  BAL0483            -1.   BAL0406             1.
+    SH040107  COST             21.21   TRAN0401            1.
+    SH040107  BAL0401            -1.   BAL0407             1.
+    SH040207  COST            294.92   TRAN0402            1.
+    SH040207  BAL0402            -1.   BAL0407             1.
+    SH040307  COST            125.24   TRAN0403            1.
+    SH040307  BAL0403            -1.   BAL0407             1.
+    SH040407  COST            209.07   TRAN0404            1.
+    SH040407  BAL0404            -1.   BAL0407             1.
+    SH040507  COST            231.29   TRAN0405            1.
+    SH040507  BAL0405            -1.   BAL0407             1.
+    SH040607  COST            126.25   TRAN0406            1.
+    SH040607  BAL0452            -1.   BAL0407             1.
+    SH040707  COST            234.32   TRAN0407            1.
+    SH040707  BAL0464            -1.   BAL0407             1.
+    SH040807  COST            156.55   TRAN0408            1.
+    SH040807  BAL0483            -1.   BAL0407             1.
+    SH040108  COST             66.66   TRAN0401            1.
+    SH040108  BAL0401            -1.   BAL0408             1.
+    SH040208  COST            379.76   TRAN0402            1.
+    SH040208  BAL0402            -1.   BAL0408             1.
+    SH040308  COST            142.41   TRAN0403            1.
+    SH040308  BAL0403            -1.   BAL0408             1.
+    SH040408  COST            249.47   TRAN0404            1.
+    SH040408  BAL0404            -1.   BAL0408             1.
+    SH040508  COST            183.82   TRAN0405            1.
+    SH040508  BAL0405            -1.   BAL0408             1.
+    SH040608  COST            167.66   TRAN0406            1.
+    SH040608  BAL0452            -1.   BAL0408             1.
+    SH040808  COST            188.87   TRAN0408            1.
+    SH040808  BAL0483            -1.   BAL0408             1.
+    SH040109  COST            139.38   TRAN0401            1.
+    SH040109  BAL0401            -1.   BAL0409             1.
+    SH040209  COST            386.83   TRAN0402            1.
+    SH040209  BAL0402            -1.   BAL0409             1.
+    SH040309  COST            169.68   TRAN0403            1.
+    SH040309  BAL0403            -1.   BAL0409             1.
+    SH040409  COST            255.53   TRAN0404            1.
+    SH040409  BAL0404            -1.   BAL0409             1.
+    SH040509  COST            241.39   TRAN0405            1.
+    SH040509  BAL0405            -1.   BAL0409             1.
+    SH040709  COST            197.96   TRAN0407            1.
+    SH040709  BAL0464            -1.   BAL0409             1.
+    SH040809  COST            195.94   TRAN0408            1.
+    SH040809  BAL0483            -1.   BAL0409             1.
+    SH040110  COST            249.47   TRAN0401            1.
+    SH040110  BAL0401            -1.   BAL0410             1.
+    SH040210  COST            159.58   TRAN0402            1.
+    SH040210  BAL0402            -1.   BAL0410             1.
+    SH040310  COST             242.4   TRAN0403            1.
+    SH040310  BAL0403            -1.   BAL0410             1.
+    SH040410  COST            362.59   TRAN0404            1.
+    SH040410  BAL0404            -1.   BAL0410             1.
+    SH040510  COST            388.85   TRAN0405            1.
+    SH040510  BAL0405            -1.   BAL0410             1.
+    SH040610  COST            227.25   TRAN0406            1.
+    SH040610  BAL0452            -1.   BAL0410             1.
+    SH040810  COST            308.05   TRAN0408            1.
+    SH040810  BAL0483            -1.   BAL0410             1.
+    SH040111  COST            107.06   TRAN0401            1.
+    SH040111  BAL0401            -1.   BAL0411             1.
+    SH040211  COST            499.95   TRAN0402            1.
+    SH040211  BAL0402            -1.   BAL0411             1.
+    SH040311  COST            250.48   TRAN0403            1.
+    SH040311  BAL0403            -1.   BAL0411             1.
+    SH040411  COST            140.39   TRAN0404            1.
+    SH040411  BAL0404            -1.   BAL0411             1.
+    SH040511  COST            344.41   TRAN0405            1.
+    SH040511  BAL0405            -1.   BAL0411             1.
+    SH040611  COST            197.96   TRAN0406            1.
+    SH040611  BAL0452            -1.   BAL0411             1.
+    SH040811  COST            103.02   TRAN0408            1.
+    SH040811  BAL0483            -1.   BAL0411             1.
+    SH040112  COST             88.88   TRAN0401            1.
+    SH040112  BAL0401            -1.   BAL0412             1.
+    SH040212  COST            342.39   TRAN0402            1.
+    SH040212  BAL0402            -1.   BAL0412             1.
+    SH040312  COST            147.46   TRAN0403            1.
+    SH040312  BAL0403            -1.   BAL0412             1.
+    SH040412  COST              202.   TRAN0404            1.
+    SH040412  BAL0404            -1.   BAL0412             1.
+    SH040512  COST            269.67   TRAN0405            1.
+    SH040512  BAL0405            -1.   BAL0412             1.
+    SH040612  COST            146.45   TRAN0406            1.
+    SH040612  BAL0452            -1.   BAL0412             1.
+    SH040812  COST            147.46   TRAN0408            1.
+    SH040812  BAL0483            -1.   BAL0412             1.
+    SH040114  COST            143.42   TRAN0401            1.
+    SH040114  BAL0401            -1.   BAL0414             1.
+    SH040214  COST            416.12   TRAN0402            1.
+    SH040214  BAL0402            -1.   BAL0414             1.
+    SH040314  COST            197.96   TRAN0403            1.
+    SH040314  BAL0403            -1.   BAL0414             1.
+    SH040414  COST            200.99   TRAN0404            1.
+    SH040414  BAL0404            -1.   BAL0414             1.
+    SH040514  COST            355.52   TRAN0405            1.
+    SH040514  BAL0405            -1.   BAL0414             1.
+    SH040614  COST            189.88   TRAN0406            1.
+    SH040614  BAL0452            -1.   BAL0414             1.
+    SH040814  COST            127.26   TRAN0408            1.
+    SH040814  BAL0483            -1.   BAL0414             1.
+    SH040115  COST            306.03   TRAN0401            1.
+    SH040115  BAL0401            -1.   BAL0415             1.
+    SH040215  COST            160.59   TRAN0402            1.
+    SH040215  BAL0402            -1.   BAL0415             1.
+    SH040315  COST            236.34   TRAN0403            1.
+    SH040315  BAL0403            -1.   BAL0415             1.
+    SH040415  COST            480.76   TRAN0404            1.
+    SH040415  BAL0404            -1.   BAL0415             1.
+    SH040515  COST            401.98   TRAN0405            1.
+    SH040515  BAL0405            -1.   BAL0415             1.
+    SH040615  COST            189.88   TRAN0406            1.
+    SH040615  BAL0452            -1.   BAL0415             1.
+    SH040815  COST            376.73   TRAN0408            1.
+    SH040815  BAL0483            -1.   BAL0415             1.
+    SH040116  COST            159.58   TRAN0401            1.
+    SH040116  BAL0401            -1.   BAL0416             1.
+    SH040216  COST             282.8   TRAN0402            1.
+    SH040216  BAL0402            -1.   BAL0416             1.
+    SH040316  COST            229.27   TRAN0403            1.
+    SH040316  BAL0403            -1.   BAL0416             1.
+    SH040416  COST            289.87   TRAN0404            1.
+    SH040416  BAL0404            -1.   BAL0416             1.
+    SH040516  COST            322.19   TRAN0405            1.
+    SH040516  BAL0405            -1.   BAL0416             1.
+    SH040616  COST            132.31   TRAN0406            1.
+    SH040616  BAL0452            -1.   BAL0416             1.
+    SH040816  COST            207.05   TRAN0408            1.
+    SH040816  BAL0483            -1.   BAL0416             1.
+    SH040117  COST            152.51   TRAN0401            1.
+    SH040117  BAL0401            -1.   BAL0417             1.
+    SH040217  COST            510.05   TRAN0402            1.
+    SH040217  BAL0402            -1.   BAL0417             1.
+    SH040317  COST            276.74   TRAN0403            1.
+    SH040317  BAL0403            -1.   BAL0417             1.
+    SH040417  COST             57.57   TRAN0404            1.
+    SH040417  BAL0404            -1.   BAL0417             1.
+    SH040517  COST            300.98   TRAN0405            1.
+    SH040517  BAL0405            -1.   BAL0417             1.
+    SH040717  COST            297.95   TRAN0407            1.
+    SH040717  BAL0464            -1.   BAL0417             1.
+    SH040817  COST             27.27   TRAN0408            1.
+    SH040817  BAL0483            -1.   BAL0417             1.
+    SH040118  COST            176.75   TRAN0401            1.
+    SH040118  BAL0401            -1.   BAL0418             1.
+    SH040218  COST            364.61   TRAN0402            1.
+    SH040218  BAL0402            -1.   BAL0418             1.
+    SH040318  COST             272.7   TRAN0403            1.
+    SH040318  BAL0403            -1.   BAL0418             1.
+    SH040418  COST            155.54   TRAN0404            1.
+    SH040418  BAL0404            -1.   BAL0418             1.
+    SH040518  COST            411.07   TRAN0405            1.
+    SH040518  BAL0405            -1.   BAL0418             1.
+    SH040618  COST            355.52   TRAN0406            1.
+    SH040618  BAL0452            -1.   BAL0418             1.
+    SH040818  COST            104.03   TRAN0408            1.
+    SH040818  BAL0483            -1.   BAL0418             1.
+    SH040119  COST            250.48   TRAN0401            1.
+    SH040119  BAL0401            -1.   BAL0419             1.
+    SH040219  COST            693.87   TRAN0402            1.
+    SH040219  BAL0402            -1.   BAL0419             1.
+    SH040319  COST            320.17   TRAN0403            1.
+    SH040319  BAL0403            -1.   BAL0419             1.
+    SH040419  COST            160.59   TRAN0404            1.
+    SH040419  BAL0404            -1.   BAL0419             1.
+    SH040519  COST            210.08   TRAN0405            1.
+    SH040519  BAL0405            -1.   BAL0419             1.
+    SH040619  COST            348.45   TRAN0406            1.
+    SH040619  BAL0452            -1.   BAL0419             1.
+    SH040819  COST             99.99   TRAN0408            1.
+    SH040819  BAL0483            -1.   BAL0419             1.
+    SH040120  COST            207.05   TRAN0401            1.
+    SH040120  BAL0401            -1.   BAL0420             1.
+    SH040220  COST            689.83   TRAN0402            1.
+    SH040220  BAL0402            -1.   BAL0420             1.
+    SH040320  COST            299.97   TRAN0403            1.
+    SH040320  BAL0403            -1.   BAL0420             1.
+    SH040420  COST            114.13   TRAN0404            1.
+    SH040420  BAL0404            -1.   BAL0420             1.
+    SH040520  COST            293.91   TRAN0405            1.
+    SH040520  BAL0405            -1.   BAL0420             1.
+    SH040820  COST            127.26   TRAN0408            1.
+    SH040820  BAL0483            -1.   BAL0420             1.
+    SH040121  COST            407.03   TRAN0401            1.
+    SH040121  BAL0401            -1.   BAL0421             1.
+    SH040221  COST            371.68   TRAN0402            1.
+    SH040221  BAL0402            -1.   BAL0421             1.
+    SH040321  COST            450.46   TRAN0403            1.
+    SH040321  BAL0403            -1.   BAL0421             1.
+    SH040421  COST             323.2   TRAN0404            1.
+    SH040421  BAL0404            -1.   BAL0421             1.
+    SH040521  COST             555.5   TRAN0405            1.
+    SH040521  BAL0405            -1.   BAL0421             1.
+    SH040821  COST             323.2   TRAN0408            1.
+    SH040821  BAL0483            -1.   BAL0421             1.
+    SH040122  COST            250.48   TRAN0401            1.
+    SH040122  BAL0401            -1.   BAL0422             1.
+    SH040222  COST            583.78   TRAN0402            1.
+    SH040222  BAL0402            -1.   BAL0422             1.
+    SH040322  COST            301.99   TRAN0403            1.
+    SH040322  BAL0403            -1.   BAL0422             1.
+    SH040422  COST            226.24   TRAN0404            1.
+    SH040422  BAL0404            -1.   BAL0422             1.
+    SH040522  COST            180.79   TRAN0405            1.
+    SH040522  BAL0405            -1.   BAL0422             1.
+    SH040622  COST             313.1   TRAN0406            1.
+    SH040622  BAL0452            -1.   BAL0422             1.
+    SH040822  COST            140.39   TRAN0408            1.
+    SH040822  BAL0483            -1.   BAL0422             1.
+    SH040123  COST            236.34   TRAN0401            1.
+    SH040123  BAL0401            -1.   BAL0423             1.
+    SH040223  COST            546.41   TRAN0402            1.
+    SH040223  BAL0402            -1.   BAL0423             1.
+    SH040323  COST            289.87   TRAN0403            1.
+    SH040323  BAL0403            -1.   BAL0423             1.
+    SH040423  COST            168.67   TRAN0404            1.
+    SH040423  BAL0404            -1.   BAL0423             1.
+    SH040523  COST            167.66   TRAN0405            1.
+    SH040523  BAL0405            -1.   BAL0423             1.
+    SH040823  COST            140.39   TRAN0408            1.
+    SH040823  BAL0483            -1.   BAL0423             1.
+    SH040124  COST           1450.36   TRAN0401            1.
+    SH040124  BAL0401            -1.   BAL0424             1.
+    SH040125  COST            390.87   TRAN0401            1.
+    SH040125  BAL0401            -1.   BAL0425             1.
+    SH040225  COST            431.27   TRAN0402            1.
+    SH040225  BAL0402            -1.   BAL0425             1.
+    SH040325  COST            516.11   TRAN0403            1.
+    SH040325  BAL0403            -1.   BAL0425             1.
+    SH040425  COST            351.48   TRAN0404            1.
+    SH040425  BAL0404            -1.   BAL0425             1.
+    SH040525  COST            571.66   TRAN0405            1.
+    SH040525  BAL0405            -1.   BAL0425             1.
+    SH040625  COST            407.03   TRAN0406            1.
+    SH040625  BAL0452            -1.   BAL0425             1.
+    SH040825  COST            308.05   TRAN0408            1.
+    SH040825  BAL0483            -1.   BAL0425             1.
+    SH040426  COST             272.7   TRAN0404            1.
+    SH040426  BAL0404            -1.   BAL0426             1.
+    SH040127  COST            236.34   TRAN0401            1.
+    SH040127  BAL0401            -1.   BAL0427             1.
+    SH040227  COST            286.84   TRAN0402            1.
+    SH040227  BAL0402            -1.   BAL0427             1.
+    SH040327  COST            291.89   TRAN0403            1.
+    SH040327  BAL0403            -1.   BAL0427             1.
+    SH040427  COST            338.35   TRAN0404            1.
+    SH040427  BAL0404            -1.   BAL0427             1.
+    SH040527  COST            381.78   TRAN0405            1.
+    SH040527  BAL0405            -1.   BAL0427             1.
+    SH040627  COST            270.68   TRAN0406            1.
+    SH040627  BAL0452            -1.   BAL0427             1.
+    SH040827  COST            254.52   TRAN0408            1.
+    SH040827  BAL0483            -1.   BAL0427             1.
+    SH040128  COST            245.43   TRAN0401            1.
+    SH040128  BAL0401            -1.   BAL0428             1.
+    SH040228  COST            574.69   TRAN0402            1.
+    SH040228  BAL0402            -1.   BAL0428             1.
+    SH040328  COST            298.96   TRAN0403            1.
+    SH040328  BAL0403            -1.   BAL0428             1.
+    SH040428  COST            297.95   TRAN0404            1.
+    SH040428  BAL0404            -1.   BAL0428             1.
+    SH040528  COST            103.02   TRAN0405            1.
+    SH040528  BAL0405            -1.   BAL0428             1.
+    SH040628  COST            263.61   TRAN0406            1.
+    SH040628  BAL0452            -1.   BAL0428             1.
+    SH040728  COST            108.07   TRAN0407            1.
+    SH040728  BAL0464            -1.   BAL0428             1.
+    SH040828  COST            256.54   TRAN0408            1.
+    SH040828  BAL0483            -1.   BAL0428             1.
+    SH040129  COST            225.23   TRAN0401            1.
+    SH040129  BAL0401            -1.   BAL0429             1.
+    SH040229  COST            468.64   TRAN0402            1.
+    SH040229  BAL0402            -1.   BAL0429             1.
+    SH040329  COST            243.41   TRAN0403            1.
+    SH040329  BAL0403            -1.   BAL0429             1.
+    SH040429  COST            200.99   TRAN0404            1.
+    SH040429  BAL0404            -1.   BAL0429             1.
+    SH040529  COST             434.3   TRAN0405            1.
+    SH040529  BAL0405            -1.   BAL0429             1.
+    SH040629  COST            263.61   TRAN0406            1.
+    SH040629  BAL0452            -1.   BAL0429             1.
+    SH040829  COST            145.44   TRAN0408            1.
+    SH040829  BAL0483            -1.   BAL0429             1.
+    SH040130  COST            470.66   TRAN0401            1.
+    SH040130  BAL0401            -1.   BAL0430             1.
+    SH040230  COST            440.36   TRAN0402            1.
+    SH040230  BAL0402            -1.   BAL0430             1.
+    SH040330  COST            528.23   TRAN0403            1.
+    SH040330  BAL0403            -1.   BAL0430             1.
+    SH040430  COST            307.04   TRAN0404            1.
+    SH040430  BAL0404            -1.   BAL0430             1.
+    SH040530  COST            450.46   TRAN0405            1.
+    SH040530  BAL0405            -1.   BAL0430             1.
+    SH040830  COST            385.82   TRAN0408            1.
+    SH040830  BAL0483            -1.   BAL0430             1.
+    SH040131  COST            112.11   TRAN0401            1.
+    SH040131  BAL0401            -1.   BAL0431             1.
+    SH040231  COST            354.51   TRAN0402            1.
+    SH040231  BAL0402            -1.   BAL0431             1.
+    SH040331  COST             111.1   TRAN0403            1.
+    SH040331  BAL0403            -1.   BAL0431             1.
+    SH040431  COST            255.53   TRAN0404            1.
+    SH040431  BAL0404            -1.   BAL0431             1.
+    SH040531  COST            310.07   TRAN0405            1.
+    SH040531  BAL0405            -1.   BAL0431             1.
+    SH040631  COST            113.12   TRAN0406            1.
+    SH040631  BAL0452            -1.   BAL0431             1.
+    SH040831  COST            225.23   TRAN0408            1.
+    SH040831  BAL0483            -1.   BAL0431             1.
+    SH040132  COST            301.99   TRAN0401            1.
+    SH040132  BAL0401            -1.   BAL0432             1.
+    SH040232  COST            482.78   TRAN0402            1.
+    SH040232  BAL0402            -1.   BAL0432             1.
+    SH040332  COST            427.23   TRAN0403            1.
+    SH040332  BAL0403            -1.   BAL0432             1.
+    SH040432  COST            158.57   TRAN0404            1.
+    SH040432  BAL0404            -1.   BAL0432             1.
+    SH040532  COST            395.92   TRAN0405            1.
+    SH040532  BAL0405            -1.   BAL0432             1.
+    SH040832  COST             181.8   TRAN0408            1.
+    SH040832  BAL0483            -1.   BAL0432             1.
+    SH040133  COST            497.93   TRAN0401            1.
+    SH040133  BAL0401            -1.   BAL0433             1.
+    SH040233  COST              404.   TRAN0402            1.
+    SH040233  BAL0402            -1.   BAL0433             1.
+    SH040333  COST            548.43   TRAN0403            1.
+    SH040333  BAL0403            -1.   BAL0433             1.
+    SH040433  COST            449.45   TRAN0404            1.
+    SH040433  BAL0404            -1.   BAL0433             1.
+    SH040533  COST            637.31   TRAN0405            1.
+    SH040533  BAL0405            -1.   BAL0433             1.
+    SH040833  COST            384.81   TRAN0408            1.
+    SH040833  BAL0483            -1.   BAL0433             1.
+    SH040134  COST            389.86   TRAN0401            1.
+    SH040134  BAL0401            -1.   BAL0434             1.
+    SH040234  COST            661.55   TRAN0402            1.
+    SH040234  BAL0402            -1.   BAL0434             1.
+    SH040334  COST            508.03   TRAN0403            1.
+    SH040334  BAL0403            -1.   BAL0434             1.
+    SH040434  COST            213.11   TRAN0404            1.
+    SH040434  BAL0404            -1.   BAL0434             1.
+    SH040534  COST            445.41   TRAN0405            1.
+    SH040534  BAL0405            -1.   BAL0434             1.
+    SH040834  COST            265.63   TRAN0408            1.
+    SH040834  BAL0483            -1.   BAL0434             1.
+    SH040135  COST            465.61   TRAN0401            1.
+    SH040135  BAL0401            -1.   BAL0435             1.
+    SH040235  COST            449.45   TRAN0402            1.
+    SH040235  BAL0402            -1.   BAL0435             1.
+    SH040335  COST            380.77   TRAN0403            1.
+    SH040335  BAL0403            -1.   BAL0435             1.
+    SH040435  COST            123.22   TRAN0404            1.
+    SH040435  BAL0404            -1.   BAL0435             1.
+    SH040535  COST            435.31   TRAN0405            1.
+    SH040535  BAL0405            -1.   BAL0435             1.
+    SH040835  COST            237.35   TRAN0408            1.
+    SH040835  BAL0483            -1.   BAL0435             1.
+    SH040136  COST            207.05   TRAN0401            1.
+    SH040136  BAL0401            -1.   BAL0436             1.
+    SH040236  COST            452.48   TRAN0402            1.
+    SH040236  BAL0402            -1.   BAL0436             1.
+    SH040336  COST            107.06   TRAN0403            1.
+    SH040336  BAL0403            -1.   BAL0436             1.
+    SH040436  COST             373.7   TRAN0404            1.
+    SH040436  BAL0404            -1.   BAL0436             1.
+    SH040536  COST            349.46   TRAN0405            1.
+    SH040536  BAL0405            -1.   BAL0436             1.
+    SH040636  COST             111.1   TRAN0406            1.
+    SH040636  BAL0452            -1.   BAL0436             1.
+    SH040836  COST            324.21   TRAN0408            1.
+    SH040836  BAL0483            -1.   BAL0436             1.
+    SH040137  COST             92.92   TRAN0401            1.
+    SH040137  BAL0401            -1.   BAL0437             1.
+    SH040237  COST            345.42   TRAN0402            1.
+    SH040237  BAL0402            -1.   BAL0437             1.
+    SH040337  COST            159.58   TRAN0403            1.
+    SH040337  BAL0403            -1.   BAL0437             1.
+    SH040437  COST            307.04   TRAN0404            1.
+    SH040437  BAL0404            -1.   BAL0437             1.
+    SH040537  COST            183.82   TRAN0405            1.
+    SH040537  BAL0405            -1.   BAL0437             1.
+    SH040637  COST            195.94   TRAN0406            1.
+    SH040637  BAL0452            -1.   BAL0437             1.
+    SH040837  COST            254.52   TRAN0408            1.
+    SH040837  BAL0483            -1.   BAL0437             1.
+    SH040138  COST            137.36   TRAN0401            1.
+    SH040138  BAL0401            -1.   BAL0438             1.
+    SH040238  COST            246.44   TRAN0402            1.
+    SH040238  BAL0402            -1.   BAL0438             1.
+    SH040338  COST             95.95   TRAN0403            1.
+    SH040338  BAL0403            -1.   BAL0438             1.
+    SH040438  COST            311.08   TRAN0404            1.
+    SH040438  BAL0404            -1.   BAL0438             1.
+    SH040538  COST            280.78   TRAN0405            1.
+    SH040538  BAL0405            -1.   BAL0438             1.
+    SH040638  COST             39.39   TRAN0406            1.
+    SH040638  BAL0452            -1.   BAL0438             1.
+    SH040738  COST            218.16   TRAN0407            1.
+    SH040738  BAL0464            -1.   BAL0438             1.
+    SH040838  COST            239.37   TRAN0408            1.
+    SH040838  BAL0483            -1.   BAL0438             1.
+    SH040139  COST             131.3   TRAN0401            1.
+    SH040139  BAL0401            -1.   BAL0439             1.
+    SH040239  COST            342.39   TRAN0402            1.
+    SH040239  BAL0402            -1.   BAL0439             1.
+    SH040339  COST             161.6   TRAN0403            1.
+    SH040339  BAL0403            -1.   BAL0439             1.
+    SH040439  COST            251.49   TRAN0404            1.
+    SH040439  BAL0404            -1.   BAL0439             1.
+    SH040539  COST            433.29   TRAN0405            1.
+    SH040539  BAL0405            -1.   BAL0439             1.
+    SH040639  COST            206.04   TRAN0406            1.
+    SH040639  BAL0452            -1.   BAL0439             1.
+    SH040839  COST            169.68   TRAN0408            1.
+    SH040839  BAL0483            -1.   BAL0439             1.
+    SH040140  COST            166.65   TRAN0401            1.
+    SH040140  BAL0401            -1.   BAL0440             1.
+    SH040240  COST            381.78   TRAN0402            1.
+    SH040240  BAL0402            -1.   BAL0440             1.
+    SH040340  COST            104.03   TRAN0403            1.
+    SH040340  BAL0403            -1.   BAL0440             1.
+    SH040440  COST            299.97   TRAN0404            1.
+    SH040440  BAL0404            -1.   BAL0440             1.
+    SH040540  COST            223.21   TRAN0405            1.
+    SH040540  BAL0405            -1.   BAL0440             1.
+    SH040640  COST            132.31   TRAN0406            1.
+    SH040640  BAL0452            -1.   BAL0440             1.
+    SH040840  COST            276.74   TRAN0408            1.
+    SH040840  BAL0483            -1.   BAL0440             1.
+    SH040141  COST            197.96   TRAN0401            1.
+    SH040141  BAL0401            -1.   BAL0441             1.
+    SH040241  COST              303.   TRAN0402            1.
+    SH040241  BAL0402            -1.   BAL0441             1.
+    SH040341  COST             151.5   TRAN0403            1.
+    SH040341  BAL0403            -1.   BAL0441             1.
+    SH040441  COST            327.24   TRAN0404            1.
+    SH040441  BAL0404            -1.   BAL0441             1.
+    SH040541  COST            371.68   TRAN0405            1.
+    SH040541  BAL0405            -1.   BAL0441             1.
+    SH040641  COST              101.   TRAN0406            1.
+    SH040641  BAL0452            -1.   BAL0441             1.
+    SH040841  COST            301.99   TRAN0408            1.
+    SH040841  BAL0483            -1.   BAL0441             1.
+    SH040142  COST              90.9   TRAN0401            1.
+    SH040142  BAL0401            -1.   BAL0442             1.
+    SH040242  COST            418.14   TRAN0402            1.
+    SH040242  BAL0402            -1.   BAL0442             1.
+    SH040342  COST             161.6   TRAN0403            1.
+    SH040342  BAL0403            -1.   BAL0442             1.
+    SH040442  COST            196.95   TRAN0404            1.
+    SH040442  BAL0404            -1.   BAL0442             1.
+    SH040542  COST            364.61   TRAN0405            1.
+    SH040542  BAL0405            -1.   BAL0442             1.
+    SH040642  COST            162.61   TRAN0406            1.
+    SH040642  BAL0452            -1.   BAL0442             1.
+    SH040842  COST            153.52   TRAN0408            1.
+    SH040842  BAL0483            -1.   BAL0442             1.
+    SH040143  COST            160.59   TRAN0401            1.
+    SH040143  BAL0401            -1.   BAL0443             1.
+    SH040243  COST            398.95   TRAN0402            1.
+    SH040243  BAL0402            -1.   BAL0443             1.
+    SH040343  COST             25.25   TRAN0403            1.
+    SH040343  BAL0403            -1.   BAL0443             1.
+    SH040443  COST            298.96   TRAN0404            1.
+    SH040443  BAL0404            -1.   BAL0443             1.
+    SH040543  COST            260.58   TRAN0405            1.
+    SH040543  BAL0405            -1.   BAL0443             1.
+    SH040643  COST              101.   TRAN0406            1.
+    SH040643  BAL0452            -1.   BAL0443             1.
+    SH040743  COST            243.41   TRAN0407            1.
+    SH040743  BAL0464            -1.   BAL0443             1.
+    SH040843  COST            273.71   TRAN0408            1.
+    SH040843  BAL0483            -1.   BAL0443             1.
+    SH040144  COST            160.59   TRAN0401            1.
+    SH040144  BAL0401            -1.   BAL0444             1.
+    SH040244  COST            382.79   TRAN0402            1.
+    SH040244  BAL0402            -1.   BAL0444             1.
+    SH040344  COST            129.28   TRAN0403            1.
+    SH040344  BAL0403            -1.   BAL0444             1.
+    SH040444  COST            315.12   TRAN0404            1.
+    SH040444  BAL0404            -1.   BAL0444             1.
+    SH040544  COST             313.1   TRAN0405            1.
+    SH040544  BAL0405            -1.   BAL0444             1.
+    SH040644  COST             89.89   TRAN0406            1.
+    SH040644  BAL0452            -1.   BAL0444             1.
+    SH040844  COST            300.98   TRAN0408            1.
+    SH040844  BAL0483            -1.   BAL0444             1.
+    SH040145  COST            173.72   TRAN0401            1.
+    SH040145  BAL0401            -1.   BAL0445             1.
+    SH040245  COST            440.36   TRAN0402            1.
+    SH040245  BAL0402            -1.   BAL0445             1.
+    SH040345  COST            162.61   TRAN0403            1.
+    SH040345  BAL0403            -1.   BAL0445             1.
+    SH040445  COST            294.92   TRAN0404            1.
+    SH040445  BAL0404            -1.   BAL0445             1.
+    SH040545  COST            236.34   TRAN0405            1.
+    SH040545  BAL0405            -1.   BAL0445             1.
+    SH040645  COST            192.91   TRAN0406            1.
+    SH040645  BAL0452            -1.   BAL0445             1.
+    SH040745  COST            198.97   TRAN0407            1.
+    SH040745  BAL0464            -1.   BAL0445             1.
+    SH040845  COST            308.05   TRAN0408            1.
+    SH040845  BAL0483            -1.   BAL0445             1.
+    SH040146  COST            247.45   TRAN0401            1.
+    SH040146  BAL0401            -1.   BAL0446             1.
+    SH040246  COST            275.73   TRAN0402            1.
+    SH040246  BAL0402            -1.   BAL0446             1.
+    SH040346  COST            223.21   TRAN0403            1.
+    SH040346  BAL0403            -1.   BAL0446             1.
+    SH040446  COST            451.47   TRAN0404            1.
+    SH040446  BAL0404            -1.   BAL0446             1.
+    SH040546  COST             434.3   TRAN0405            1.
+    SH040546  BAL0405            -1.   BAL0446             1.
+    SH040646  COST            259.57   TRAN0406            1.
+    SH040646  BAL0452            -1.   BAL0446             1.
+    SH040846  COST            452.48   TRAN0408            1.
+    SH040846  BAL0483            -1.   BAL0446             1.
+    SH040147  COST             111.1   TRAN0401            1.
+    SH040147  BAL0401            -1.   BAL0447             1.
+    SH040247  COST            376.73   TRAN0402            1.
+    SH040247  BAL0402            -1.   BAL0447             1.
+    SH040347  COST            160.59   TRAN0403            1.
+    SH040347  BAL0403            -1.   BAL0447             1.
+    SH040447  COST            276.74   TRAN0404            1.
+    SH040447  BAL0404            -1.   BAL0447             1.
+    SH040547  COST            235.33   TRAN0405            1.
+    SH040547  BAL0405            -1.   BAL0447             1.
+    SH040647  COST            146.45   TRAN0406            1.
+    SH040647  BAL0452            -1.   BAL0447             1.
+    SH040847  COST            246.44   TRAN0408            1.
+    SH040847  BAL0483            -1.   BAL0447             1.
+    SH040148  COST             95.95   TRAN0401            1.
+    SH040148  BAL0401            -1.   BAL0448             1.
+    SH040248  COST            342.39   TRAN0402            1.
+    SH040248  BAL0402            -1.   BAL0448             1.
+    SH040348  COST            138.37   TRAN0403            1.
+    SH040348  BAL0403            -1.   BAL0448             1.
+    SH040448  COST             232.3   TRAN0404            1.
+    SH040448  BAL0404            -1.   BAL0448             1.
+    SH040548  COST            249.47   TRAN0405            1.
+    SH040548  BAL0405            -1.   BAL0448             1.
+    SH040648  COST            116.15   TRAN0406            1.
+    SH040648  BAL0452            -1.   BAL0448             1.
+    SH040848  COST            196.95   TRAN0408            1.
+    SH040848  BAL0483            -1.   BAL0448             1.
+    SH040149  COST            332.29   TRAN0401            1.
+    SH040149  BAL0401            -1.   BAL0449             1.
+    SH040249  COST            540.35   TRAN0402            1.
+    SH040249  BAL0402            -1.   BAL0449             1.
+    SH040349  COST            335.32   TRAN0403            1.
+    SH040349  BAL0403            -1.   BAL0449             1.
+    SH040449  COST            384.81   TRAN0404            1.
+    SH040449  BAL0404            -1.   BAL0449             1.
+    SH040549  COST            153.52   TRAN0405            1.
+    SH040549  BAL0405            -1.   BAL0449             1.
+    SH040649  COST            341.38   TRAN0406            1.
+    SH040649  BAL0452            -1.   BAL0449             1.
+    SH040749  COST            135.34   TRAN0407            1.
+    SH040749  BAL0464            -1.   BAL0449             1.
+    SH040849  COST            412.08   TRAN0408            1.
+    SH040849  BAL0483            -1.   BAL0449             1.
+    SH040150  COST            243.41   TRAN0401            1.
+    SH040150  BAL0401            -1.   BAL0450             1.
+    SH040250  COST            618.12   TRAN0402            1.
+    SH040250  BAL0402            -1.   BAL0450             1.
+    SH040350  COST            248.46   TRAN0403            1.
+    SH040350  BAL0403            -1.   BAL0450             1.
+    SH040450  COST            368.65   TRAN0404            1.
+    SH040450  BAL0404            -1.   BAL0450             1.
+    SH040550  COST            237.35   TRAN0405            1.
+    SH040550  BAL0405            -1.   BAL0450             1.
+    SH040750  COST            138.37   TRAN0407            1.
+    SH040750  BAL0464            -1.   BAL0450             1.
+    SH040850  COST            410.06   TRAN0408            1.
+    SH040850  BAL0483            -1.   BAL0450             1.
+    SH040151  COST            335.32   TRAN0401            1.
+    SH040151  BAL0401            -1.   BAL0451             1.
+    SH040251  COST             555.5   TRAN0402            1.
+    SH040251  BAL0402            -1.   BAL0451             1.
+    SH040351  COST            344.41   TRAN0403            1.
+    SH040351  BAL0403            -1.   BAL0451             1.
+    SH040451  COST            341.38   TRAN0404            1.
+    SH040451  BAL0404            -1.   BAL0451             1.
+    SH040551  COST            124.23   TRAN0405            1.
+    SH040551  BAL0405            -1.   BAL0451             1.
+    SH040751  COST             99.99   TRAN0407            1.
+    SH040751  BAL0464            -1.   BAL0451             1.
+    SH040851  COST            432.28   TRAN0408            1.
+    SH040851  BAL0483            -1.   BAL0451             1.
+    SH040152  COST            113.12   TRAN0401            1.
+    SH040152  BAL0401            -1.   BAL0452             1.
+    SH040252  COST              303.   TRAN0402            1.
+    SH040252  BAL0402            -1.   BAL0452             1.
+    SH040352  COST             82.82   TRAN0403            1.
+    SH040352  BAL0403            -1.   BAL0452             1.
+    SH040452  COST            325.22   TRAN0404            1.
+    SH040452  BAL0404            -1.   BAL0452             1.
+    SH040552  COST            297.95   TRAN0405            1.
+    SH040552  BAL0405            -1.   BAL0452             1.
+    SH040852  COST            255.53   TRAN0408            1.
+    SH040852  BAL0483            -1.   BAL0452             1.
+    SH040153  COST            362.59   TRAN0401            1.
+    SH040153  BAL0401            -1.   BAL0453             1.
+    SH040253  COST            642.36   TRAN0402            1.
+    SH040253  BAL0402            -1.   BAL0453             1.
+    SH040353  COST            328.25   TRAN0403            1.
+    SH040353  BAL0403            -1.   BAL0453             1.
+    SH040453  COST            416.12   TRAN0404            1.
+    SH040453  BAL0404            -1.   BAL0453             1.
+    SH040553  COST            185.84   TRAN0405            1.
+    SH040553  BAL0405            -1.   BAL0453             1.
+    SH040653  COST            362.59   TRAN0406            1.
+    SH040653  BAL0452            -1.   BAL0453             1.
+    SH040753  COST            147.46   TRAN0407            1.
+    SH040753  BAL0464            -1.   BAL0453             1.
+    SH040853  COST            407.03   TRAN0408            1.
+    SH040853  BAL0483            -1.   BAL0453             1.
+    SH040154  COST            186.85   TRAN0401            1.
+    SH040154  BAL0401            -1.   BAL0454             1.
+    SH040254  COST            449.45   TRAN0402            1.
+    SH040254  BAL0402            -1.   BAL0454             1.
+    SH040354  COST            219.17   TRAN0403            1.
+    SH040354  BAL0403            -1.   BAL0454             1.
+    SH040454  COST            346.43   TRAN0404            1.
+    SH040454  BAL0404            -1.   BAL0454             1.
+    SH040554  COST            215.13   TRAN0405            1.
+    SH040554  BAL0405            -1.   BAL0454             1.
+    SH040654  COST            205.03   TRAN0406            1.
+    SH040654  BAL0452            -1.   BAL0454             1.
+    SH040854  COST            406.02   TRAN0408            1.
+    SH040854  BAL0483            -1.   BAL0454             1.
+    SH040155  COST            280.78   TRAN0401            1.
+    SH040155  BAL0401            -1.   BAL0455             1.
+    SH040255  COST            483.79   TRAN0402            1.
+    SH040255  BAL0402            -1.   BAL0455             1.
+    SH040355  COST            283.81   TRAN0403            1.
+    SH040355  BAL0403            -1.   BAL0455             1.
+    SH040455  COST            296.94   TRAN0404            1.
+    SH040455  BAL0404            -1.   BAL0455             1.
+    SH040555  COST            155.54   TRAN0405            1.
+    SH040555  BAL0405            -1.   BAL0455             1.
+    SH040655  COST             292.9   TRAN0406            1.
+    SH040655  BAL0452            -1.   BAL0455             1.
+    SH040755  COST            108.07   TRAN0407            1.
+    SH040755  BAL0464            -1.   BAL0455             1.
+    SH040855  COST            296.94   TRAN0408            1.
+    SH040855  BAL0483            -1.   BAL0455             1.
+    SH040156  COST             393.9   TRAN0401            1.
+    SH040156  BAL0401            -1.   BAL0456             1.
+    SH040256  COST            584.79   TRAN0402            1.
+    SH040256  BAL0402            -1.   BAL0456             1.
+    SH040356  COST            308.05   TRAN0403            1.
+    SH040356  BAL0403            -1.   BAL0456             1.
+    SH040456  COST            368.65   TRAN0404            1.
+    SH040456  BAL0404            -1.   BAL0456             1.
+    SH040556  COST            137.36   TRAN0405            1.
+    SH040556  BAL0405            -1.   BAL0456             1.
+    SH040656  COST            342.39   TRAN0406            1.
+    SH040656  BAL0452            -1.   BAL0456             1.
+    SH040756  COST            123.22   TRAN0407            1.
+    SH040756  BAL0464            -1.   BAL0456             1.
+    SH040856  COST            360.57   TRAN0408            1.
+    SH040856  BAL0483            -1.   BAL0456             1.
+    SH040157  COST            263.61   TRAN0401            1.
+    SH040157  BAL0401            -1.   BAL0457             1.
+    SH040257  COST             525.2   TRAN0402            1.
+    SH040257  BAL0402            -1.   BAL0457             1.
+    SH040357  COST             292.9   TRAN0403            1.
+    SH040357  BAL0403            -1.   BAL0457             1.
+    SH040457  COST            236.34   TRAN0404            1.
+    SH040457  BAL0404            -1.   BAL0457             1.
+    SH040557  COST            169.68   TRAN0405            1.
+    SH040557  BAL0405            -1.   BAL0457             1.
+    SH040657  COST            322.19   TRAN0406            1.
+    SH040657  BAL0452            -1.   BAL0457             1.
+    SH040757  COST            149.48   TRAN0407            1.
+    SH040757  BAL0464            -1.   BAL0457             1.
+    SH040857  COST            233.31   TRAN0408            1.
+    SH040857  BAL0483            -1.   BAL0457             1.
+    SH040158  COST            296.94   TRAN0401            1.
+    SH040158  BAL0401            -1.   BAL0458             1.
+    SH040258  COST            526.21   TRAN0402            1.
+    SH040258  BAL0402            -1.   BAL0458             1.
+    SH040358  COST            280.78   TRAN0403            1.
+    SH040358  BAL0403            -1.   BAL0458             1.
+    SH040458  COST            346.43   TRAN0404            1.
+    SH040458  BAL0404            -1.   BAL0458             1.
+    SH040558  COST             21.21   TRAN0405            1.
+    SH040558  BAL0405            -1.   BAL0458             1.
+    SH040658  COST            329.26   TRAN0406            1.
+    SH040658  BAL0452            -1.   BAL0458             1.
+    SH040758  COST             68.68   TRAN0407            1.
+    SH040758  BAL0464            -1.   BAL0458             1.
+    SH040858  COST            256.54   TRAN0408            1.
+    SH040858  BAL0483            -1.   BAL0458             1.
+    SH040159  COST            208.06   TRAN0401            1.
+    SH040159  BAL0401            -1.   BAL0459             1.
+    SH040259  COST            502.98   TRAN0402            1.
+    SH040259  BAL0402            -1.   BAL0459             1.
+    SH040359  COST            240.38   TRAN0403            1.
+    SH040359  BAL0403            -1.   BAL0459             1.
+    SH040459  COST            246.44   TRAN0404            1.
+    SH040459  BAL0404            -1.   BAL0459             1.
+    SH040559  COST            160.59   TRAN0405            1.
+    SH040559  BAL0405            -1.   BAL0459             1.
+    SH040659  COST            299.97   TRAN0406            1.
+    SH040659  BAL0452            -1.   BAL0459             1.
+    SH040759  COST            106.05   TRAN0407            1.
+    SH040759  BAL0464            -1.   BAL0459             1.
+    SH040859  COST            257.55   TRAN0408            1.
+    SH040859  BAL0483            -1.   BAL0459             1.
+    SH040160  COST            263.61   TRAN0401            1.
+    SH040160  BAL0401            -1.   BAL0460             1.
+    SH040260  COST             555.5   TRAN0402            1.
+    SH040260  BAL0402            -1.   BAL0460             1.
+    SH040360  COST            285.83   TRAN0403            1.
+    SH040360  BAL0403            -1.   BAL0460             1.
+    SH040460  COST            315.12   TRAN0404            1.
+    SH040460  BAL0404            -1.   BAL0460             1.
+    SH040560  COST            136.35   TRAN0405            1.
+    SH040560  BAL0405            -1.   BAL0460             1.
+    SH040660  COST            326.23   TRAN0406            1.
+    SH040660  BAL0452            -1.   BAL0460             1.
+    SH040760  COST             88.88   TRAN0407            1.
+    SH040760  BAL0464            -1.   BAL0460             1.
+    SH040860  COST            301.99   TRAN0408            1.
+    SH040860  BAL0483            -1.   BAL0460             1.
+    SH040163  COST            268.66   TRAN0401            1.
+    SH040163  BAL0401            -1.   BAL0463             1.
+    SH040263  COST            498.94   TRAN0402            1.
+    SH040263  BAL0402            -1.   BAL0463             1.
+    SH040363  COST            289.87   TRAN0403            1.
+    SH040363  BAL0403            -1.   BAL0463             1.
+    SH040463  COST            372.69   TRAN0404            1.
+    SH040463  BAL0404            -1.   BAL0463             1.
+    SH040563  COST            153.52   TRAN0405            1.
+    SH040563  BAL0405            -1.   BAL0463             1.
+    SH040663  COST            318.15   TRAN0406            1.
+    SH040663  BAL0452            -1.   BAL0463             1.
+    SH040763  COST            125.24   TRAN0407            1.
+    SH040763  BAL0464            -1.   BAL0463             1.
+    SH040863  COST              404.   TRAN0408            1.
+    SH040863  BAL0483            -1.   BAL0463             1.
+    SH040164  COST            200.99   TRAN0401            1.
+    SH040164  BAL0401            -1.   BAL0464             1.
+    SH040264  COST            531.26   TRAN0402            1.
+    SH040264  BAL0402            -1.   BAL0464             1.
+    SH040364  COST            225.23   TRAN0403            1.
+    SH040364  BAL0403            -1.   BAL0464             1.
+    SH040464  COST            339.36   TRAN0404            1.
+    SH040464  BAL0404            -1.   BAL0464             1.
+    SH040564  COST             58.58   TRAN0405            1.
+    SH040564  BAL0405            -1.   BAL0464             1.
+    SH040664  COST            320.17   TRAN0406            1.
+    SH040664  BAL0452            -1.   BAL0464             1.
+    SH040864  COST             252.5   TRAN0408            1.
+    SH040864  BAL0483            -1.   BAL0464             1.
+    SH040165  COST            436.32   TRAN0401            1.
+    SH040165  BAL0401            -1.   BAL0465             1.
+    SH040265  COST            310.07   TRAN0402            1.
+    SH040265  BAL0402            -1.   BAL0465             1.
+    SH040365  COST            510.05   TRAN0403            1.
+    SH040365  BAL0403            -1.   BAL0465             1.
+    SH040465  COST            391.88   TRAN0404            1.
+    SH040465  BAL0404            -1.   BAL0465             1.
+    SH040565  COST            610.04   TRAN0405            1.
+    SH040565  BAL0405            -1.   BAL0465             1.
+    SH040865  COST            419.15   TRAN0408            1.
+    SH040865  BAL0483            -1.   BAL0465             1.
+    SH040166  COST             565.6   TRAN0401            1.
+    SH040166  BAL0401            -1.   BAL0466             1.
+    SH040266  COST            261.59   TRAN0402            1.
+    SH040266  BAL0402            -1.   BAL0466             1.
+    SH040366  COST            583.78   TRAN0403            1.
+    SH040366  BAL0403            -1.   BAL0466             1.
+    SH040466  COST            561.56   TRAN0404            1.
+    SH040466  BAL0404            -1.   BAL0466             1.
+    SH040566  COST             717.1   TRAN0405            1.
+    SH040566  BAL0405            -1.   BAL0466             1.
+    SH040866  COST             565.6   TRAN0408            1.
+    SH040866  BAL0483            -1.   BAL0466             1.
+    SH040167  COST            429.25   TRAN0401            1.
+    SH040167  BAL0401            -1.   BAL0467             1.
+    SH040267  COST            234.32   TRAN0402            1.
+    SH040267  BAL0402            -1.   BAL0467             1.
+    SH040367  COST            497.93   TRAN0403            1.
+    SH040367  BAL0403            -1.   BAL0467             1.
+    SH040467  COST            461.57   TRAN0404            1.
+    SH040467  BAL0404            -1.   BAL0467             1.
+    SH040567  COST            610.04   TRAN0405            1.
+    SH040567  BAL0405            -1.   BAL0467             1.
+    SH040867  COST            462.58   TRAN0408            1.
+    SH040867  BAL0483            -1.   BAL0467             1.
+    SH040168  COST            599.94   TRAN0401            1.
+    SH040168  BAL0401            -1.   BAL0468             1.
+    SH040268  COST              404.   TRAN0402            1.
+    SH040268  BAL0402            -1.   BAL0468             1.
+    SH040368  COST             565.6   TRAN0403            1.
+    SH040368  BAL0403            -1.   BAL0468             1.
+    SH040468  COST            709.02   TRAN0404            1.
+    SH040468  BAL0404            -1.   BAL0468             1.
+    SH040568  COST            955.46   TRAN0405            1.
+    SH040568  BAL0405            -1.   BAL0468             1.
+    SH040868  COST            758.51   TRAN0408            1.
+    SH040868  BAL0483            -1.   BAL0468             1.
+    SH040169  COST            544.39   TRAN0401            1.
+    SH040169  BAL0401            -1.   BAL0469             1.
+    SH040269  COST            223.21   TRAN0402            1.
+    SH040269  BAL0402            -1.   BAL0469             1.
+    SH040369  COST             515.1   TRAN0403            1.
+    SH040369  BAL0403            -1.   BAL0469             1.
+    SH040469  COST            628.22   TRAN0404            1.
+    SH040469  BAL0404            -1.   BAL0469             1.
+    SH040569  COST            652.46   TRAN0405            1.
+    SH040569  BAL0405            -1.   BAL0469             1.
+    SH040869  COST            664.58   TRAN0408            1.
+    SH040869  BAL0483            -1.   BAL0469             1.
+    SH040171  COST             444.4   TRAN0401            1.
+    SH040171  BAL0401            -1.   BAL0471             1.
+    SH040371  COST            529.24   TRAN0403            1.
+    SH040371  BAL0403            -1.   BAL0471             1.
+    SH040471  COST            526.21   TRAN0404            1.
+    SH040471  BAL0404            -1.   BAL0471             1.
+    SH040571  COST            586.81   TRAN0405            1.
+    SH040571  BAL0405            -1.   BAL0471             1.
+    SH040671  COST            394.91   TRAN0406            1.
+    SH040671  BAL0452            -1.   BAL0471             1.
+    SH040771  COST            711.04   TRAN0407            1.
+    SH040771  BAL0464            -1.   BAL0471             1.
+    SH040871  COST            538.33   TRAN0408            1.
+    SH040871  BAL0483            -1.   BAL0471             1.
+    SH040172  COST            592.87   TRAN0401            1.
+    SH040172  BAL0401            -1.   BAL0472             1.
+    SH040272  COST            548.43   TRAN0402            1.
+    SH040272  BAL0402            -1.   BAL0472             1.
+    SH040372  COST            623.17   TRAN0403            1.
+    SH040372  BAL0403            -1.   BAL0472             1.
+    SH040472  COST             575.7   TRAN0404            1.
+    SH040472  BAL0404            -1.   BAL0472             1.
+    SH040572  COST            770.63   TRAN0405            1.
+    SH040572  BAL0405            -1.   BAL0472             1.
+    SH040872  COST             575.7   TRAN0408            1.
+    SH040872  BAL0483            -1.   BAL0472             1.
+    SH040173  COST             393.9   TRAN0401            1.
+    SH040173  BAL0401            -1.   BAL0473             1.
+    SH040273  COST            368.65   TRAN0402            1.
+    SH040273  BAL0402            -1.   BAL0473             1.
+    SH040373  COST            341.38   TRAN0403            1.
+    SH040373  BAL0403            -1.   BAL0473             1.
+    SH040473  COST            461.57   TRAN0404            1.
+    SH040473  BAL0404            -1.   BAL0473             1.
+    SH040573  COST            569.64   TRAN0405            1.
+    SH040573  BAL0405            -1.   BAL0473             1.
+    SH040673  COST            308.05   TRAN0406            1.
+    SH040673  BAL0452            -1.   BAL0473             1.
+    SH040873  COST            509.04   TRAN0408            1.
+    SH040873  BAL0483            -1.   BAL0473             1.
+    SH040174  COST            553.48   TRAN0401            1.
+    SH040174  BAL0401            -1.   BAL0474             1.
+    SH040274  COST             212.1   TRAN0402            1.
+    SH040274  BAL0402            -1.   BAL0474             1.
+    SH040374  COST             575.7   TRAN0403            1.
+    SH040374  BAL0403            -1.   BAL0474             1.
+    SH040474  COST            643.37   TRAN0404            1.
+    SH040474  BAL0404            -1.   BAL0474             1.
+    SH040574  COST            740.33   TRAN0405            1.
+    SH040574  BAL0405            -1.   BAL0474             1.
+    SH040874  COST            625.19   TRAN0408            1.
+    SH040874  BAL0483            -1.   BAL0474             1.
+    SH040275  COST            559.54   TRAN0402            1.
+    SH040275  BAL0402            -1.   BAL0475             1.
+    SH040176  COST            466.62   TRAN0401            1.
+    SH040176  BAL0401            -1.   BAL0476             1.
+    SH040276  COST            405.01   TRAN0402            1.
+    SH040276  BAL0402            -1.   BAL0476             1.
+    SH040376  COST            407.03   TRAN0403            1.
+    SH040376  BAL0403            -1.   BAL0476             1.
+    SH040476  COST             636.3   TRAN0404            1.
+    SH040476  BAL0404            -1.   BAL0476             1.
+    SH040576  COST             636.3   TRAN0405            1.
+    SH040576  BAL0405            -1.   BAL0476             1.
+    SH040676  COST            384.81   TRAN0406            1.
+    SH040676  BAL0452            -1.   BAL0476             1.
+    SH040876  COST            784.77   TRAN0408            1.
+    SH040876  BAL0483            -1.   BAL0476             1.
+    SH040177  COST            439.35   TRAN0401            1.
+    SH040177  BAL0401            -1.   BAL0477             1.
+    SH040277  COST            274.72   TRAN0402            1.
+    SH040277  BAL0402            -1.   BAL0477             1.
+    SH040377  COST            465.61   TRAN0403            1.
+    SH040377  BAL0403            -1.   BAL0477             1.
+    SH040477  COST            405.01   TRAN0404            1.
+    SH040477  BAL0404            -1.   BAL0477             1.
+    SH040577  COST             565.6   TRAN0405            1.
+    SH040577  BAL0405            -1.   BAL0477             1.
+    SH040877  COST             323.2   TRAN0408            1.
+    SH040877  BAL0483            -1.   BAL0477             1.
+    SH040178  COST            768.61   TRAN0401            1.
+    SH040178  BAL0401            -1.   BAL0478             1.
+    SH040278  COST            446.42   TRAN0402            1.
+    SH040278  BAL0402            -1.   BAL0478             1.
+    SH040378  COST            790.83   TRAN0403            1.
+    SH040378  BAL0403            -1.   BAL0478             1.
+    SH040478  COST            691.85   TRAN0404            1.
+    SH040478  BAL0404            -1.   BAL0478             1.
+    SH040578  COST            887.79   TRAN0405            1.
+    SH040578  BAL0405            -1.   BAL0478             1.
+    SH040878  COST            773.66   TRAN0408            1.
+    SH040878  BAL0483            -1.   BAL0478             1.
+    SH040179  COST            722.15   TRAN0401            1.
+    SH040179  BAL0401            -1.   BAL0479             1.
+    SH040279  COST            271.69   TRAN0402            1.
+    SH040279  BAL0402            -1.   BAL0479             1.
+    SH040379  COST            697.91   TRAN0403            1.
+    SH040379  BAL0403            -1.   BAL0479             1.
+    SH040479  COST             727.2   TRAN0404            1.
+    SH040479  BAL0404            -1.   BAL0479             1.
+    SH040879  COST            713.06   TRAN0408            1.
+    SH040879  BAL0483            -1.   BAL0479             1.
+    SH040180  COST            320.17   TRAN0401            1.
+    SH040180  BAL0401            -1.   BAL0480             1.
+    SH040280  COST            398.95   TRAN0402            1.
+    SH040280  BAL0402            -1.   BAL0480             1.
+    SH040380  COST            441.37   TRAN0403            1.
+    SH040380  BAL0403            -1.   BAL0480             1.
+    SH040480  COST            377.74   TRAN0404            1.
+    SH040480  BAL0404            -1.   BAL0480             1.
+    SH040580  COST            510.05   TRAN0405            1.
+    SH040580  BAL0405            -1.   BAL0480             1.
+    SH040880  COST             242.4   TRAN0408            1.
+    SH040880  BAL0483            -1.   BAL0480             1.
+    SH040182  COST            587.82   TRAN0401            1.
+    SH040182  BAL0401            -1.   BAL0482             1.
+    SH040282  COST            332.29   TRAN0402            1.
+    SH040282  BAL0402            -1.   BAL0482             1.
+    SH040382  COST            661.55   TRAN0403            1.
+    SH040382  BAL0403            -1.   BAL0482             1.
+    SH040482  COST            713.06   TRAN0404            1.
+    SH040482  BAL0404            -1.   BAL0482             1.
+    SH040582  COST           1158.47   TRAN0405            1.
+    SH040582  BAL0405            -1.   BAL0482             1.
+    SH040882  COST            790.83   TRAN0408            1.
+    SH040882  BAL0483            -1.   BAL0482             1.
+    SH040183  COST            178.77   TRAN0401            1.
+    SH040183  BAL0401            -1.   BAL0483             1.
+    SH040283  COST             525.2   TRAN0402            1.
+    SH040283  BAL0402            -1.   BAL0483             1.
+    SH040383  COST            274.72   TRAN0403            1.
+    SH040383  BAL0403            -1.   BAL0483             1.
+    SH040483  COST             59.59   TRAN0404            1.
+    SH040483  BAL0404            -1.   BAL0483             1.
+    SH040583  COST            350.47   TRAN0405            1.
+    SH040583  BAL0405            -1.   BAL0483             1.
+    SH040683  COST            250.48   TRAN0406            1.
+    SH040683  BAL0452            -1.   BAL0483             1.
+    SH040184  COST            307.04   TRAN0401            1.
+    SH040184  BAL0401            -1.   BAL0484             1.
+    SH040284  COST            193.92   TRAN0402            1.
+    SH040284  BAL0402            -1.   BAL0484             1.
+    SH040384  COST            367.64   TRAN0403            1.
+    SH040384  BAL0403            -1.   BAL0484             1.
+    SH040484  COST             373.7   TRAN0404            1.
+    SH040484  BAL0404            -1.   BAL0484             1.
+    SH040584  COST             494.9   TRAN0405            1.
+    SH040584  BAL0405            -1.   BAL0484             1.
+    SH040684  COST            308.05   TRAN0406            1.
+    SH040684  BAL0452            -1.   BAL0484             1.
+    SH040884  COST            391.88   TRAN0408            1.
+    SH040884  BAL0483            -1.   BAL0484             1.
+    SH050201  COST            490.05   TRAN0502            1.
+    SH050201  BAL0502            -1.   BAL0501             1.
+    SH050301  COST             188.1   TRAN0503            1.
+    SH050301  BAL0503            -1.   BAL0501             1.
+    SH050401  COST             343.2   TRAN0504            1.
+    SH050401  BAL0504            -1.   BAL0501             1.
+    SH050501  COST            391.05   TRAN0505            1.
+    SH050501  BAL0505            -1.   BAL0501             1.
+    SH050601  COST             207.9   TRAN0506            1.
+    SH050601  BAL0552            -1.   BAL0501             1.
+    SH050801  COST            235.95   TRAN0508            1.
+    SH050801  BAL0583            -1.   BAL0501             1.
+    SH050102  COST             782.1   TRAN0501            1.
+    SH050102  BAL0501            -1.   BAL0502             1.
+    SH050302  COST            688.05   TRAN0503            1.
+    SH050302  BAL0503            -1.   BAL0502             1.
+    SH050402  COST            1009.8   TRAN0504            1.
+    SH050402  BAL0504            -1.   BAL0502             1.
+    SH050502  COST           1222.65   TRAN0505            1.
+    SH050502  BAL0505            -1.   BAL0502             1.
+    SH050602  COST             623.7   TRAN0506            1.
+    SH050602  BAL0552            -1.   BAL0502             1.
+    SH050802  COST            859.65   TRAN0508            1.
+    SH050802  BAL0583            -1.   BAL0502             1.
+    SH050103  COST            404.25   TRAN0501            1.
+    SH050103  BAL0501            -1.   BAL0503             1.
+    SH050203  COST             782.1   TRAN0502            1.
+    SH050203  BAL0502            -1.   BAL0503             1.
+    SH050403  COST            605.55   TRAN0504            1.
+    SH050403  BAL0504            -1.   BAL0503             1.
+    SH050503  COST             468.6   TRAN0505            1.
+    SH050503  BAL0505            -1.   BAL0503             1.
+    SH050603  COST             148.5   TRAN0506            1.
+    SH050603  BAL0552            -1.   BAL0503             1.
+    SH050803  COST            420.75   TRAN0508            1.
+    SH050803  BAL0583            -1.   BAL0503             1.
+    SH050104  COST             287.1   TRAN0501            1.
+    SH050104  BAL0501            -1.   BAL0504             1.
+    SH050204  COST            829.95   TRAN0502            1.
+    SH050204  BAL0502            -1.   BAL0504             1.
+    SH050304  COST            400.95   TRAN0503            1.
+    SH050304  BAL0503            -1.   BAL0504             1.
+    SH050504  COST            526.35   TRAN0505            1.
+    SH050504  BAL0505            -1.   BAL0504             1.
+    SH050604  COST            404.25   TRAN0506            1.
+    SH050604  BAL0552            -1.   BAL0504             1.
+    SH050704  COST            443.85   TRAN0507            1.
+    SH050704  BAL0564            -1.   BAL0504             1.
+    SH050804  COST              95.7   TRAN0508            1.
+    SH050804  BAL0583            -1.   BAL0504             1.
+    SH050105  COST             445.5   TRAN0501            1.
+    SH050105  BAL0501            -1.   BAL0505             1.
+    SH050205  COST             851.4   TRAN0502            1.
+    SH050205  BAL0502            -1.   BAL0505             1.
+    SH050305  COST             468.6   TRAN0503            1.
+    SH050305  BAL0503            -1.   BAL0505             1.
+    SH050405  COST            470.25   TRAN0504            1.
+    SH050405  BAL0504            -1.   BAL0505             1.
+    SH050605  COST             537.9   TRAN0506            1.
+    SH050605  BAL0552            -1.   BAL0505             1.
+    SH050705  COST             551.1   TRAN0507            1.
+    SH050705  BAL0564            -1.   BAL0505             1.
+    SH050805  COST            447.15   TRAN0508            1.
+    SH050805  BAL0583            -1.   BAL0505             1.
+    SH050106  COST            328.35   TRAN0501            1.
+    SH050106  BAL0501            -1.   BAL0506             1.
+    SH050206  COST            688.05   TRAN0502            1.
+    SH050206  BAL0502            -1.   BAL0506             1.
+    SH050306  COST            351.45   TRAN0503            1.
+    SH050306  BAL0503            -1.   BAL0506             1.
+    SH050406  COST            361.35   TRAN0504            1.
+    SH050406  BAL0504            -1.   BAL0506             1.
+    SH050506  COST             415.8   TRAN0505            1.
+    SH050506  BAL0505            -1.   BAL0506             1.
+    SH050606  COST             339.9   TRAN0506            1.
+    SH050606  BAL0552            -1.   BAL0506             1.
+    SH050706  COST              330.   TRAN0507            1.
+    SH050706  BAL0564            -1.   BAL0506             1.
+    SH050806  COST            249.15   TRAN0508            1.
+    SH050806  BAL0583            -1.   BAL0506             1.
+    SH050107  COST             34.65   TRAN0501            1.
+    SH050107  BAL0501            -1.   BAL0507             1.
+    SH050207  COST             481.8   TRAN0502            1.
+    SH050207  BAL0502            -1.   BAL0507             1.
+    SH050307  COST             204.6   TRAN0503            1.
+    SH050307  BAL0503            -1.   BAL0507             1.
+    SH050407  COST            341.55   TRAN0504            1.
+    SH050407  BAL0504            -1.   BAL0507             1.
+    SH050507  COST            377.85   TRAN0505            1.
+    SH050507  BAL0505            -1.   BAL0507             1.
+    SH050607  COST            206.25   TRAN0506            1.
+    SH050607  BAL0552            -1.   BAL0507             1.
+    SH050707  COST             382.8   TRAN0507            1.
+    SH050707  BAL0564            -1.   BAL0507             1.
+    SH050807  COST            255.75   TRAN0508            1.
+    SH050807  BAL0583            -1.   BAL0507             1.
+    SH050108  COST             108.9   TRAN0501            1.
+    SH050108  BAL0501            -1.   BAL0508             1.
+    SH050208  COST             620.4   TRAN0502            1.
+    SH050208  BAL0502            -1.   BAL0508             1.
+    SH050308  COST            232.65   TRAN0503            1.
+    SH050308  BAL0503            -1.   BAL0508             1.
+    SH050408  COST            407.55   TRAN0504            1.
+    SH050408  BAL0504            -1.   BAL0508             1.
+    SH050508  COST             300.3   TRAN0505            1.
+    SH050508  BAL0505            -1.   BAL0508             1.
+    SH050608  COST             273.9   TRAN0506            1.
+    SH050608  BAL0552            -1.   BAL0508             1.
+    SH050808  COST            308.55   TRAN0508            1.
+    SH050808  BAL0583            -1.   BAL0508             1.
+    SH050109  COST             227.7   TRAN0501            1.
+    SH050109  BAL0501            -1.   BAL0509             1.
+    SH050209  COST            631.95   TRAN0502            1.
+    SH050209  BAL0502            -1.   BAL0509             1.
+    SH050309  COST             277.2   TRAN0503            1.
+    SH050309  BAL0503            -1.   BAL0509             1.
+    SH050409  COST            417.45   TRAN0504            1.
+    SH050409  BAL0504            -1.   BAL0509             1.
+    SH050509  COST            394.35   TRAN0505            1.
+    SH050509  BAL0505            -1.   BAL0509             1.
+    SH050709  COST             323.4   TRAN0507            1.
+    SH050709  BAL0564            -1.   BAL0509             1.
+    SH050809  COST             320.1   TRAN0508            1.
+    SH050809  BAL0583            -1.   BAL0509             1.
+    SH050110  COST            407.55   TRAN0501            1.
+    SH050110  BAL0501            -1.   BAL0510             1.
+    SH050210  COST             260.7   TRAN0502            1.
+    SH050210  BAL0502            -1.   BAL0510             1.
+    SH050310  COST              396.   TRAN0503            1.
+    SH050310  BAL0503            -1.   BAL0510             1.
+    SH050410  COST            592.35   TRAN0504            1.
+    SH050410  BAL0504            -1.   BAL0510             1.
+    SH050510  COST            635.25   TRAN0505            1.
+    SH050510  BAL0505            -1.   BAL0510             1.
+    SH050610  COST            371.25   TRAN0506            1.
+    SH050610  BAL0552            -1.   BAL0510             1.
+    SH050810  COST            503.25   TRAN0508            1.
+    SH050810  BAL0583            -1.   BAL0510             1.
+    SH050111  COST             174.9   TRAN0501            1.
+    SH050111  BAL0501            -1.   BAL0511             1.
+    SH050211  COST            816.75   TRAN0502            1.
+    SH050211  BAL0502            -1.   BAL0511             1.
+    SH050311  COST             409.2   TRAN0503            1.
+    SH050311  BAL0503            -1.   BAL0511             1.
+    SH050411  COST            229.35   TRAN0504            1.
+    SH050411  BAL0504            -1.   BAL0511             1.
+    SH050511  COST            562.65   TRAN0505            1.
+    SH050511  BAL0505            -1.   BAL0511             1.
+    SH050611  COST             323.4   TRAN0506            1.
+    SH050611  BAL0552            -1.   BAL0511             1.
+    SH050811  COST             168.3   TRAN0508            1.
+    SH050811  BAL0583            -1.   BAL0511             1.
+    SH050112  COST             145.2   TRAN0501            1.
+    SH050112  BAL0501            -1.   BAL0512             1.
+    SH050212  COST            559.35   TRAN0502            1.
+    SH050212  BAL0502            -1.   BAL0512             1.
+    SH050312  COST             240.9   TRAN0503            1.
+    SH050312  BAL0503            -1.   BAL0512             1.
+    SH050412  COST              330.   TRAN0504            1.
+    SH050412  BAL0504            -1.   BAL0512             1.
+    SH050512  COST            440.55   TRAN0505            1.
+    SH050512  BAL0505            -1.   BAL0512             1.
+    SH050612  COST            239.25   TRAN0506            1.
+    SH050612  BAL0552            -1.   BAL0512             1.
+    SH050812  COST             240.9   TRAN0508            1.
+    SH050812  BAL0583            -1.   BAL0512             1.
+    SH050114  COST             234.3   TRAN0501            1.
+    SH050114  BAL0501            -1.   BAL0514             1.
+    SH050214  COST             679.8   TRAN0502            1.
+    SH050214  BAL0502            -1.   BAL0514             1.
+    SH050314  COST             323.4   TRAN0503            1.
+    SH050314  BAL0503            -1.   BAL0514             1.
+    SH050414  COST            328.35   TRAN0504            1.
+    SH050414  BAL0504            -1.   BAL0514             1.
+    SH050514  COST             580.8   TRAN0505            1.
+    SH050514  BAL0505            -1.   BAL0514             1.
+    SH050614  COST             310.2   TRAN0506            1.
+    SH050614  BAL0552            -1.   BAL0514             1.
+    SH050814  COST             207.9   TRAN0508            1.
+    SH050814  BAL0583            -1.   BAL0514             1.
+    SH050115  COST            499.95   TRAN0501            1.
+    SH050115  BAL0501            -1.   BAL0515             1.
+    SH050215  COST            262.35   TRAN0502            1.
+    SH050215  BAL0502            -1.   BAL0515             1.
+    SH050315  COST             386.1   TRAN0503            1.
+    SH050315  BAL0503            -1.   BAL0515             1.
+    SH050415  COST             785.4   TRAN0504            1.
+    SH050415  BAL0504            -1.   BAL0515             1.
+    SH050515  COST             656.7   TRAN0505            1.
+    SH050515  BAL0505            -1.   BAL0515             1.
+    SH050615  COST             310.2   TRAN0506            1.
+    SH050615  BAL0552            -1.   BAL0515             1.
+    SH050815  COST            615.45   TRAN0508            1.
+    SH050815  BAL0583            -1.   BAL0515             1.
+    SH050116  COST             260.7   TRAN0501            1.
+    SH050116  BAL0501            -1.   BAL0516             1.
+    SH050216  COST              462.   TRAN0502            1.
+    SH050216  BAL0502            -1.   BAL0516             1.
+    SH050316  COST            374.55   TRAN0503            1.
+    SH050316  BAL0503            -1.   BAL0516             1.
+    SH050416  COST            473.55   TRAN0504            1.
+    SH050416  BAL0504            -1.   BAL0516             1.
+    SH050516  COST            526.35   TRAN0505            1.
+    SH050516  BAL0505            -1.   BAL0516             1.
+    SH050616  COST            216.15   TRAN0506            1.
+    SH050616  BAL0552            -1.   BAL0516             1.
+    SH050816  COST            338.25   TRAN0508            1.
+    SH050816  BAL0583            -1.   BAL0516             1.
+    SH050117  COST            249.15   TRAN0501            1.
+    SH050117  BAL0501            -1.   BAL0517             1.
+    SH050217  COST            833.25   TRAN0502            1.
+    SH050217  BAL0502            -1.   BAL0517             1.
+    SH050317  COST             452.1   TRAN0503            1.
+    SH050317  BAL0503            -1.   BAL0517             1.
+    SH050417  COST             94.05   TRAN0504            1.
+    SH050417  BAL0504            -1.   BAL0517             1.
+    SH050517  COST             491.7   TRAN0505            1.
+    SH050517  BAL0505            -1.   BAL0517             1.
+    SH050717  COST            486.75   TRAN0507            1.
+    SH050717  BAL0564            -1.   BAL0517             1.
+    SH050817  COST             44.55   TRAN0508            1.
+    SH050817  BAL0583            -1.   BAL0517             1.
+    SH050118  COST            288.75   TRAN0501            1.
+    SH050118  BAL0501            -1.   BAL0518             1.
+    SH050218  COST            595.65   TRAN0502            1.
+    SH050218  BAL0502            -1.   BAL0518             1.
+    SH050318  COST             445.5   TRAN0503            1.
+    SH050318  BAL0503            -1.   BAL0518             1.
+    SH050418  COST             254.1   TRAN0504            1.
+    SH050418  BAL0504            -1.   BAL0518             1.
+    SH050518  COST            671.55   TRAN0505            1.
+    SH050518  BAL0505            -1.   BAL0518             1.
+    SH050618  COST             580.8   TRAN0506            1.
+    SH050618  BAL0552            -1.   BAL0518             1.
+    SH050818  COST            169.95   TRAN0508            1.
+    SH050818  BAL0583            -1.   BAL0518             1.
+    SH050119  COST             409.2   TRAN0501            1.
+    SH050119  BAL0501            -1.   BAL0519             1.
+    SH050219  COST           1133.55   TRAN0502            1.
+    SH050219  BAL0502            -1.   BAL0519             1.
+    SH050319  COST            523.05   TRAN0503            1.
+    SH050319  BAL0503            -1.   BAL0519             1.
+    SH050419  COST            262.35   TRAN0504            1.
+    SH050419  BAL0504            -1.   BAL0519             1.
+    SH050519  COST             343.2   TRAN0505            1.
+    SH050519  BAL0505            -1.   BAL0519             1.
+    SH050619  COST            569.25   TRAN0506            1.
+    SH050619  BAL0552            -1.   BAL0519             1.
+    SH050819  COST            163.35   TRAN0508            1.
+    SH050819  BAL0583            -1.   BAL0519             1.
+    SH050120  COST            338.25   TRAN0501            1.
+    SH050120  BAL0501            -1.   BAL0520             1.
+    SH050220  COST           1126.95   TRAN0502            1.
+    SH050220  BAL0502            -1.   BAL0520             1.
+    SH050320  COST            490.05   TRAN0503            1.
+    SH050320  BAL0503            -1.   BAL0520             1.
+    SH050420  COST            186.45   TRAN0504            1.
+    SH050420  BAL0504            -1.   BAL0520             1.
+    SH050520  COST            480.15   TRAN0505            1.
+    SH050520  BAL0505            -1.   BAL0520             1.
+    SH050820  COST             207.9   TRAN0508            1.
+    SH050820  BAL0583            -1.   BAL0520             1.
+    SH050121  COST            664.95   TRAN0501            1.
+    SH050121  BAL0501            -1.   BAL0521             1.
+    SH050221  COST             607.2   TRAN0502            1.
+    SH050221  BAL0502            -1.   BAL0521             1.
+    SH050321  COST             735.9   TRAN0503            1.
+    SH050321  BAL0503            -1.   BAL0521             1.
+    SH050421  COST              528.   TRAN0504            1.
+    SH050421  BAL0504            -1.   BAL0521             1.
+    SH050521  COST             907.5   TRAN0505            1.
+    SH050521  BAL0505            -1.   BAL0521             1.
+    SH050821  COST              528.   TRAN0508            1.
+    SH050821  BAL0583            -1.   BAL0521             1.
+    SH050122  COST             409.2   TRAN0501            1.
+    SH050122  BAL0501            -1.   BAL0522             1.
+    SH050222  COST             953.7   TRAN0502            1.
+    SH050222  BAL0502            -1.   BAL0522             1.
+    SH050322  COST            493.35   TRAN0503            1.
+    SH050322  BAL0503            -1.   BAL0522             1.
+    SH050422  COST             369.6   TRAN0504            1.
+    SH050422  BAL0504            -1.   BAL0522             1.
+    SH050522  COST            295.35   TRAN0505            1.
+    SH050522  BAL0505            -1.   BAL0522             1.
+    SH050622  COST             511.5   TRAN0506            1.
+    SH050622  BAL0552            -1.   BAL0522             1.
+    SH050822  COST            229.35   TRAN0508            1.
+    SH050822  BAL0583            -1.   BAL0522             1.
+    SH050123  COST             386.1   TRAN0501            1.
+    SH050123  BAL0501            -1.   BAL0523             1.
+    SH050223  COST            892.65   TRAN0502            1.
+    SH050223  BAL0502            -1.   BAL0523             1.
+    SH050323  COST            473.55   TRAN0503            1.
+    SH050323  BAL0503            -1.   BAL0523             1.
+    SH050423  COST            275.55   TRAN0504            1.
+    SH050423  BAL0504            -1.   BAL0523             1.
+    SH050523  COST             273.9   TRAN0505            1.
+    SH050523  BAL0505            -1.   BAL0523             1.
+    SH050823  COST            229.35   TRAN0508            1.
+    SH050823  BAL0583            -1.   BAL0523             1.
+    SH050124  COST            2369.4   TRAN0501            1.
+    SH050124  BAL0501            -1.   BAL0524             1.
+    SH050125  COST            638.55   TRAN0501            1.
+    SH050125  BAL0501            -1.   BAL0525             1.
+    SH050225  COST            704.55   TRAN0502            1.
+    SH050225  BAL0502            -1.   BAL0525             1.
+    SH050325  COST            843.15   TRAN0503            1.
+    SH050325  BAL0503            -1.   BAL0525             1.
+    SH050425  COST             574.2   TRAN0504            1.
+    SH050425  BAL0504            -1.   BAL0525             1.
+    SH050525  COST             933.9   TRAN0505            1.
+    SH050525  BAL0505            -1.   BAL0525             1.
+    SH050625  COST            664.95   TRAN0506            1.
+    SH050625  BAL0552            -1.   BAL0525             1.
+    SH050825  COST            503.25   TRAN0508            1.
+    SH050825  BAL0583            -1.   BAL0525             1.
+    SH050426  COST             445.5   TRAN0504            1.
+    SH050426  BAL0504            -1.   BAL0526             1.
+    SH050127  COST             386.1   TRAN0501            1.
+    SH050127  BAL0501            -1.   BAL0527             1.
+    SH050227  COST             468.6   TRAN0502            1.
+    SH050227  BAL0502            -1.   BAL0527             1.
+    SH050327  COST            476.85   TRAN0503            1.
+    SH050327  BAL0503            -1.   BAL0527             1.
+    SH050427  COST            552.75   TRAN0504            1.
+    SH050427  BAL0504            -1.   BAL0527             1.
+    SH050527  COST             623.7   TRAN0505            1.
+    SH050527  BAL0505            -1.   BAL0527             1.
+    SH050627  COST             442.2   TRAN0506            1.
+    SH050627  BAL0552            -1.   BAL0527             1.
+    SH050827  COST             415.8   TRAN0508            1.
+    SH050827  BAL0583            -1.   BAL0527             1.
+    SH050128  COST            400.95   TRAN0501            1.
+    SH050128  BAL0501            -1.   BAL0528             1.
+    SH050228  COST            938.85   TRAN0502            1.
+    SH050228  BAL0502            -1.   BAL0528             1.
+    SH050328  COST             488.4   TRAN0503            1.
+    SH050328  BAL0503            -1.   BAL0528             1.
+    SH050428  COST            486.75   TRAN0504            1.
+    SH050428  BAL0504            -1.   BAL0528             1.
+    SH050528  COST             168.3   TRAN0505            1.
+    SH050528  BAL0505            -1.   BAL0528             1.
+    SH050628  COST            430.65   TRAN0506            1.
+    SH050628  BAL0552            -1.   BAL0528             1.
+    SH050728  COST            176.55   TRAN0507            1.
+    SH050728  BAL0564            -1.   BAL0528             1.
+    SH050828  COST             419.1   TRAN0508            1.
+    SH050828  BAL0583            -1.   BAL0528             1.
+    SH050129  COST            367.95   TRAN0501            1.
+    SH050129  BAL0501            -1.   BAL0529             1.
+    SH050229  COST             765.6   TRAN0502            1.
+    SH050229  BAL0502            -1.   BAL0529             1.
+    SH050329  COST            397.65   TRAN0503            1.
+    SH050329  BAL0503            -1.   BAL0529             1.
+    SH050429  COST            328.35   TRAN0504            1.
+    SH050429  BAL0504            -1.   BAL0529             1.
+    SH050529  COST             709.5   TRAN0505            1.
+    SH050529  BAL0505            -1.   BAL0529             1.
+    SH050629  COST            430.65   TRAN0506            1.
+    SH050629  BAL0552            -1.   BAL0529             1.
+    SH050829  COST             237.6   TRAN0508            1.
+    SH050829  BAL0583            -1.   BAL0529             1.
+    SH050130  COST             768.9   TRAN0501            1.
+    SH050130  BAL0501            -1.   BAL0530             1.
+    SH050230  COST             719.4   TRAN0502            1.
+    SH050230  BAL0502            -1.   BAL0530             1.
+    SH050330  COST            862.95   TRAN0503            1.
+    SH050330  BAL0503            -1.   BAL0530             1.
+    SH050430  COST             501.6   TRAN0504            1.
+    SH050430  BAL0504            -1.   BAL0530             1.
+    SH050530  COST             735.9   TRAN0505            1.
+    SH050530  BAL0505            -1.   BAL0530             1.
+    SH050830  COST             630.3   TRAN0508            1.
+    SH050830  BAL0583            -1.   BAL0530             1.
+    SH050131  COST            183.15   TRAN0501            1.
+    SH050131  BAL0501            -1.   BAL0531             1.
+    SH050231  COST            579.15   TRAN0502            1.
+    SH050231  BAL0502            -1.   BAL0531             1.
+    SH050331  COST             181.5   TRAN0503            1.
+    SH050331  BAL0503            -1.   BAL0531             1.
+    SH050431  COST            417.45   TRAN0504            1.
+    SH050431  BAL0504            -1.   BAL0531             1.
+    SH050531  COST            506.55   TRAN0505            1.
+    SH050531  BAL0505            -1.   BAL0531             1.
+    SH050631  COST             184.8   TRAN0506            1.
+    SH050631  BAL0552            -1.   BAL0531             1.
+    SH050831  COST            367.95   TRAN0508            1.
+    SH050831  BAL0583            -1.   BAL0531             1.
+    SH050132  COST            493.35   TRAN0501            1.
+    SH050132  BAL0501            -1.   BAL0532             1.
+    SH050232  COST             788.7   TRAN0502            1.
+    SH050232  BAL0502            -1.   BAL0532             1.
+    SH050332  COST            697.95   TRAN0503            1.
+    SH050332  BAL0503            -1.   BAL0532             1.
+    SH050432  COST            259.05   TRAN0504            1.
+    SH050432  BAL0504            -1.   BAL0532             1.
+    SH050532  COST             646.8   TRAN0505            1.
+    SH050532  BAL0505            -1.   BAL0532             1.
+    SH050832  COST              297.   TRAN0508            1.
+    SH050832  BAL0583            -1.   BAL0532             1.
+    SH050133  COST            813.45   TRAN0501            1.
+    SH050133  BAL0501            -1.   BAL0533             1.
+    SH050233  COST              660.   TRAN0502            1.
+    SH050233  BAL0502            -1.   BAL0533             1.
+    SH050333  COST            895.95   TRAN0503            1.
+    SH050333  BAL0503            -1.   BAL0533             1.
+    SH050433  COST            734.25   TRAN0504            1.
+    SH050433  BAL0504            -1.   BAL0533             1.
+    SH050533  COST           1041.15   TRAN0505            1.
+    SH050533  BAL0505            -1.   BAL0533             1.
+    SH050833  COST            628.65   TRAN0508            1.
+    SH050833  BAL0583            -1.   BAL0533             1.
+    SH050134  COST             636.9   TRAN0501            1.
+    SH050134  BAL0501            -1.   BAL0534             1.
+    SH050234  COST           1080.75   TRAN0502            1.
+    SH050234  BAL0502            -1.   BAL0534             1.
+    SH050334  COST            829.95   TRAN0503            1.
+    SH050334  BAL0503            -1.   BAL0534             1.
+    SH050434  COST            348.15   TRAN0504            1.
+    SH050434  BAL0504            -1.   BAL0534             1.
+    SH050534  COST            727.65   TRAN0505            1.
+    SH050534  BAL0505            -1.   BAL0534             1.
+    SH050834  COST            433.95   TRAN0508            1.
+    SH050834  BAL0583            -1.   BAL0534             1.
+    SH050135  COST            760.65   TRAN0501            1.
+    SH050135  BAL0501            -1.   BAL0535             1.
+    SH050235  COST            734.25   TRAN0502            1.
+    SH050235  BAL0502            -1.   BAL0535             1.
+    SH050335  COST            622.05   TRAN0503            1.
+    SH050335  BAL0503            -1.   BAL0535             1.
+    SH050435  COST             201.3   TRAN0504            1.
+    SH050435  BAL0504            -1.   BAL0535             1.
+    SH050535  COST            711.15   TRAN0505            1.
+    SH050535  BAL0505            -1.   BAL0535             1.
+    SH050835  COST            387.75   TRAN0508            1.
+    SH050835  BAL0583            -1.   BAL0535             1.
+    SH050136  COST            338.25   TRAN0501            1.
+    SH050136  BAL0501            -1.   BAL0536             1.
+    SH050236  COST             739.2   TRAN0502            1.
+    SH050236  BAL0502            -1.   BAL0536             1.
+    SH050336  COST             174.9   TRAN0503            1.
+    SH050336  BAL0503            -1.   BAL0536             1.
+    SH050436  COST             610.5   TRAN0504            1.
+    SH050436  BAL0504            -1.   BAL0536             1.
+    SH050536  COST             570.9   TRAN0505            1.
+    SH050536  BAL0505            -1.   BAL0536             1.
+    SH050636  COST             181.5   TRAN0506            1.
+    SH050636  BAL0552            -1.   BAL0536             1.
+    SH050836  COST            529.65   TRAN0508            1.
+    SH050836  BAL0583            -1.   BAL0536             1.
+    SH050137  COST             151.8   TRAN0501            1.
+    SH050137  BAL0501            -1.   BAL0537             1.
+    SH050237  COST             564.3   TRAN0502            1.
+    SH050237  BAL0502            -1.   BAL0537             1.
+    SH050337  COST             260.7   TRAN0503            1.
+    SH050337  BAL0503            -1.   BAL0537             1.
+    SH050437  COST             501.6   TRAN0504            1.
+    SH050437  BAL0504            -1.   BAL0537             1.
+    SH050537  COST             300.3   TRAN0505            1.
+    SH050537  BAL0505            -1.   BAL0537             1.
+    SH050637  COST             320.1   TRAN0506            1.
+    SH050637  BAL0552            -1.   BAL0537             1.
+    SH050837  COST             415.8   TRAN0508            1.
+    SH050837  BAL0583            -1.   BAL0537             1.
+    SH050138  COST             224.4   TRAN0501            1.
+    SH050138  BAL0501            -1.   BAL0538             1.
+    SH050238  COST             402.6   TRAN0502            1.
+    SH050238  BAL0502            -1.   BAL0538             1.
+    SH050338  COST            156.75   TRAN0503            1.
+    SH050338  BAL0503            -1.   BAL0538             1.
+    SH050438  COST             508.2   TRAN0504            1.
+    SH050438  BAL0504            -1.   BAL0538             1.
+    SH050538  COST             458.7   TRAN0505            1.
+    SH050538  BAL0505            -1.   BAL0538             1.
+    SH050638  COST             64.35   TRAN0506            1.
+    SH050638  BAL0552            -1.   BAL0538             1.
+    SH050738  COST             356.4   TRAN0507            1.
+    SH050738  BAL0564            -1.   BAL0538             1.
+    SH050838  COST            391.05   TRAN0508            1.
+    SH050838  BAL0583            -1.   BAL0538             1.
+    SH050139  COST             214.5   TRAN0501            1.
+    SH050139  BAL0501            -1.   BAL0539             1.
+    SH050239  COST            559.35   TRAN0502            1.
+    SH050239  BAL0502            -1.   BAL0539             1.
+    SH050339  COST              264.   TRAN0503            1.
+    SH050339  BAL0503            -1.   BAL0539             1.
+    SH050439  COST            410.85   TRAN0504            1.
+    SH050439  BAL0504            -1.   BAL0539             1.
+    SH050539  COST            707.85   TRAN0505            1.
+    SH050539  BAL0505            -1.   BAL0539             1.
+    SH050639  COST             336.6   TRAN0506            1.
+    SH050639  BAL0552            -1.   BAL0539             1.
+    SH050839  COST             277.2   TRAN0508            1.
+    SH050839  BAL0583            -1.   BAL0539             1.
+    SH050140  COST            272.25   TRAN0501            1.
+    SH050140  BAL0501            -1.   BAL0540             1.
+    SH050240  COST             623.7   TRAN0502            1.
+    SH050240  BAL0502            -1.   BAL0540             1.
+    SH050340  COST            169.95   TRAN0503            1.
+    SH050340  BAL0503            -1.   BAL0540             1.
+    SH050440  COST            490.05   TRAN0504            1.
+    SH050440  BAL0504            -1.   BAL0540             1.
+    SH050540  COST            364.65   TRAN0505            1.
+    SH050540  BAL0505            -1.   BAL0540             1.
+    SH050640  COST            216.15   TRAN0506            1.
+    SH050640  BAL0552            -1.   BAL0540             1.
+    SH050840  COST             452.1   TRAN0508            1.
+    SH050840  BAL0583            -1.   BAL0540             1.
+    SH050141  COST             323.4   TRAN0501            1.
+    SH050141  BAL0501            -1.   BAL0541             1.
+    SH050241  COST              495.   TRAN0502            1.
+    SH050241  BAL0502            -1.   BAL0541             1.
+    SH050341  COST             247.5   TRAN0503            1.
+    SH050341  BAL0503            -1.   BAL0541             1.
+    SH050441  COST             534.6   TRAN0504            1.
+    SH050441  BAL0504            -1.   BAL0541             1.
+    SH050541  COST             607.2   TRAN0505            1.
+    SH050541  BAL0505            -1.   BAL0541             1.
+    SH050641  COST              165.   TRAN0506            1.
+    SH050641  BAL0552            -1.   BAL0541             1.
+    SH050841  COST            493.35   TRAN0508            1.
+    SH050841  BAL0583            -1.   BAL0541             1.
+    SH050142  COST             148.5   TRAN0501            1.
+    SH050142  BAL0501            -1.   BAL0542             1.
+    SH050242  COST             683.1   TRAN0502            1.
+    SH050242  BAL0502            -1.   BAL0542             1.
+    SH050342  COST              264.   TRAN0503            1.
+    SH050342  BAL0503            -1.   BAL0542             1.
+    SH050442  COST            321.75   TRAN0504            1.
+    SH050442  BAL0504            -1.   BAL0542             1.
+    SH050542  COST            595.65   TRAN0505            1.
+    SH050542  BAL0505            -1.   BAL0542             1.
+    SH050642  COST            265.65   TRAN0506            1.
+    SH050642  BAL0552            -1.   BAL0542             1.
+    SH050842  COST             250.8   TRAN0508            1.
+    SH050842  BAL0583            -1.   BAL0542             1.
+    SH050143  COST            262.35   TRAN0501            1.
+    SH050143  BAL0501            -1.   BAL0543             1.
+    SH050243  COST            651.75   TRAN0502            1.
+    SH050243  BAL0502            -1.   BAL0543             1.
+    SH050343  COST             41.25   TRAN0503            1.
+    SH050343  BAL0503            -1.   BAL0543             1.
+    SH050443  COST             488.4   TRAN0504            1.
+    SH050443  BAL0504            -1.   BAL0543             1.
+    SH050543  COST             425.7   TRAN0505            1.
+    SH050543  BAL0505            -1.   BAL0543             1.
+    SH050643  COST              165.   TRAN0506            1.
+    SH050643  BAL0552            -1.   BAL0543             1.
+    SH050743  COST            397.65   TRAN0507            1.
+    SH050743  BAL0564            -1.   BAL0543             1.
+    SH050843  COST            447.15   TRAN0508            1.
+    SH050843  BAL0583            -1.   BAL0543             1.
+    SH050144  COST            262.35   TRAN0501            1.
+    SH050144  BAL0501            -1.   BAL0544             1.
+    SH050244  COST            625.35   TRAN0502            1.
+    SH050244  BAL0502            -1.   BAL0544             1.
+    SH050344  COST             211.2   TRAN0503            1.
+    SH050344  BAL0503            -1.   BAL0544             1.
+    SH050444  COST             514.8   TRAN0504            1.
+    SH050444  BAL0504            -1.   BAL0544             1.
+    SH050544  COST             511.5   TRAN0505            1.
+    SH050544  BAL0505            -1.   BAL0544             1.
+    SH050644  COST            146.85   TRAN0506            1.
+    SH050644  BAL0552            -1.   BAL0544             1.
+    SH050844  COST             491.7   TRAN0508            1.
+    SH050844  BAL0583            -1.   BAL0544             1.
+    SH050145  COST             283.8   TRAN0501            1.
+    SH050145  BAL0501            -1.   BAL0545             1.
+    SH050245  COST             719.4   TRAN0502            1.
+    SH050245  BAL0502            -1.   BAL0545             1.
+    SH050345  COST            265.65   TRAN0503            1.
+    SH050345  BAL0503            -1.   BAL0545             1.
+    SH050445  COST             481.8   TRAN0504            1.
+    SH050445  BAL0504            -1.   BAL0545             1.
+    SH050545  COST             386.1   TRAN0505            1.
+    SH050545  BAL0505            -1.   BAL0545             1.
+    SH050645  COST            315.15   TRAN0506            1.
+    SH050645  BAL0552            -1.   BAL0545             1.
+    SH050745  COST            325.05   TRAN0507            1.
+    SH050745  BAL0564            -1.   BAL0545             1.
+    SH050845  COST            503.25   TRAN0508            1.
+    SH050845  BAL0583            -1.   BAL0545             1.
+    SH050146  COST            404.25   TRAN0501            1.
+    SH050146  BAL0501            -1.   BAL0546             1.
+    SH050246  COST            450.45   TRAN0502            1.
+    SH050246  BAL0502            -1.   BAL0546             1.
+    SH050346  COST            364.65   TRAN0503            1.
+    SH050346  BAL0503            -1.   BAL0546             1.
+    SH050446  COST            737.55   TRAN0504            1.
+    SH050446  BAL0504            -1.   BAL0546             1.
+    SH050546  COST             709.5   TRAN0505            1.
+    SH050546  BAL0505            -1.   BAL0546             1.
+    SH050646  COST            424.05   TRAN0506            1.
+    SH050646  BAL0552            -1.   BAL0546             1.
+    SH050846  COST             739.2   TRAN0508            1.
+    SH050846  BAL0583            -1.   BAL0546             1.
+    SH050147  COST             181.5   TRAN0501            1.
+    SH050147  BAL0501            -1.   BAL0547             1.
+    SH050247  COST            615.45   TRAN0502            1.
+    SH050247  BAL0502            -1.   BAL0547             1.
+    SH050347  COST            262.35   TRAN0503            1.
+    SH050347  BAL0503            -1.   BAL0547             1.
+    SH050447  COST             452.1   TRAN0504            1.
+    SH050447  BAL0504            -1.   BAL0547             1.
+    SH050547  COST            384.45   TRAN0505            1.
+    SH050547  BAL0505            -1.   BAL0547             1.
+    SH050647  COST            239.25   TRAN0506            1.
+    SH050647  BAL0552            -1.   BAL0547             1.
+    SH050847  COST             402.6   TRAN0508            1.
+    SH050847  BAL0583            -1.   BAL0547             1.
+    SH050148  COST            156.75   TRAN0501            1.
+    SH050148  BAL0501            -1.   BAL0548             1.
+    SH050248  COST            559.35   TRAN0502            1.
+    SH050248  BAL0502            -1.   BAL0548             1.
+    SH050348  COST            226.05   TRAN0503            1.
+    SH050348  BAL0503            -1.   BAL0548             1.
+    SH050448  COST             379.5   TRAN0504            1.
+    SH050448  BAL0504            -1.   BAL0548             1.
+    SH050548  COST            407.55   TRAN0505            1.
+    SH050548  BAL0505            -1.   BAL0548             1.
+    SH050648  COST            189.75   TRAN0506            1.
+    SH050648  BAL0552            -1.   BAL0548             1.
+    SH050848  COST            321.75   TRAN0508            1.
+    SH050848  BAL0583            -1.   BAL0548             1.
+    SH050149  COST            542.85   TRAN0501            1.
+    SH050149  BAL0501            -1.   BAL0549             1.
+    SH050249  COST            882.75   TRAN0502            1.
+    SH050249  BAL0502            -1.   BAL0549             1.
+    SH050349  COST             547.8   TRAN0503            1.
+    SH050349  BAL0503            -1.   BAL0549             1.
+    SH050449  COST            628.65   TRAN0504            1.
+    SH050449  BAL0504            -1.   BAL0549             1.
+    SH050549  COST             250.8   TRAN0505            1.
+    SH050549  BAL0505            -1.   BAL0549             1.
+    SH050649  COST             557.7   TRAN0506            1.
+    SH050649  BAL0552            -1.   BAL0549             1.
+    SH050749  COST             221.1   TRAN0507            1.
+    SH050749  BAL0564            -1.   BAL0549             1.
+    SH050849  COST             673.2   TRAN0508            1.
+    SH050849  BAL0583            -1.   BAL0549             1.
+    SH050150  COST            397.65   TRAN0501            1.
+    SH050150  BAL0501            -1.   BAL0550             1.
+    SH050250  COST            1009.8   TRAN0502            1.
+    SH050250  BAL0502            -1.   BAL0550             1.
+    SH050350  COST             405.9   TRAN0503            1.
+    SH050350  BAL0503            -1.   BAL0550             1.
+    SH050450  COST            602.25   TRAN0504            1.
+    SH050450  BAL0504            -1.   BAL0550             1.
+    SH050550  COST            387.75   TRAN0505            1.
+    SH050550  BAL0505            -1.   BAL0550             1.
+    SH050750  COST            226.05   TRAN0507            1.
+    SH050750  BAL0564            -1.   BAL0550             1.
+    SH050850  COST             669.9   TRAN0508            1.
+    SH050850  BAL0583            -1.   BAL0550             1.
+    SH050151  COST             547.8   TRAN0501            1.
+    SH050151  BAL0501            -1.   BAL0551             1.
+    SH050251  COST             907.5   TRAN0502            1.
+    SH050251  BAL0502            -1.   BAL0551             1.
+    SH050351  COST            562.65   TRAN0503            1.
+    SH050351  BAL0503            -1.   BAL0551             1.
+    SH050451  COST             557.7   TRAN0504            1.
+    SH050451  BAL0504            -1.   BAL0551             1.
+    SH050551  COST            202.95   TRAN0505            1.
+    SH050551  BAL0505            -1.   BAL0551             1.
+    SH050751  COST            163.35   TRAN0507            1.
+    SH050751  BAL0564            -1.   BAL0551             1.
+    SH050851  COST             706.2   TRAN0508            1.
+    SH050851  BAL0583            -1.   BAL0551             1.
+    SH050152  COST             184.8   TRAN0501            1.
+    SH050152  BAL0501            -1.   BAL0552             1.
+    SH050252  COST              495.   TRAN0502            1.
+    SH050252  BAL0502            -1.   BAL0552             1.
+    SH050352  COST             135.3   TRAN0503            1.
+    SH050352  BAL0503            -1.   BAL0552             1.
+    SH050452  COST             531.3   TRAN0504            1.
+    SH050452  BAL0504            -1.   BAL0552             1.
+    SH050552  COST            486.75   TRAN0505            1.
+    SH050552  BAL0505            -1.   BAL0552             1.
+    SH050852  COST            417.45   TRAN0508            1.
+    SH050852  BAL0583            -1.   BAL0552             1.
+    SH050153  COST            592.35   TRAN0501            1.
+    SH050153  BAL0501            -1.   BAL0553             1.
+    SH050253  COST            1049.4   TRAN0502            1.
+    SH050253  BAL0502            -1.   BAL0553             1.
+    SH050353  COST            536.25   TRAN0503            1.
+    SH050353  BAL0503            -1.   BAL0553             1.
+    SH050453  COST             679.8   TRAN0504            1.
+    SH050453  BAL0504            -1.   BAL0553             1.
+    SH050553  COST             303.6   TRAN0505            1.
+    SH050553  BAL0505            -1.   BAL0553             1.
+    SH050653  COST            592.35   TRAN0506            1.
+    SH050653  BAL0552            -1.   BAL0553             1.
+    SH050753  COST             240.9   TRAN0507            1.
+    SH050753  BAL0564            -1.   BAL0553             1.
+    SH050853  COST            664.95   TRAN0508            1.
+    SH050853  BAL0583            -1.   BAL0553             1.
+    SH050154  COST            305.25   TRAN0501            1.
+    SH050154  BAL0501            -1.   BAL0554             1.
+    SH050254  COST            734.25   TRAN0502            1.
+    SH050254  BAL0502            -1.   BAL0554             1.
+    SH050354  COST            358.05   TRAN0503            1.
+    SH050354  BAL0503            -1.   BAL0554             1.
+    SH050454  COST            565.95   TRAN0504            1.
+    SH050454  BAL0504            -1.   BAL0554             1.
+    SH050554  COST            351.45   TRAN0505            1.
+    SH050554  BAL0505            -1.   BAL0554             1.
+    SH050654  COST            334.95   TRAN0506            1.
+    SH050654  BAL0552            -1.   BAL0554             1.
+    SH050854  COST             663.3   TRAN0508            1.
+    SH050854  BAL0583            -1.   BAL0554             1.
+    SH050155  COST             458.7   TRAN0501            1.
+    SH050155  BAL0501            -1.   BAL0555             1.
+    SH050255  COST            790.35   TRAN0502            1.
+    SH050255  BAL0502            -1.   BAL0555             1.
+    SH050355  COST            463.65   TRAN0503            1.
+    SH050355  BAL0503            -1.   BAL0555             1.
+    SH050455  COST             485.1   TRAN0504            1.
+    SH050455  BAL0504            -1.   BAL0555             1.
+    SH050555  COST             254.1   TRAN0505            1.
+    SH050555  BAL0505            -1.   BAL0555             1.
+    SH050655  COST             478.5   TRAN0506            1.
+    SH050655  BAL0552            -1.   BAL0555             1.
+    SH050755  COST            176.55   TRAN0507            1.
+    SH050755  BAL0564            -1.   BAL0555             1.
+    SH050855  COST             485.1   TRAN0508            1.
+    SH050855  BAL0583            -1.   BAL0555             1.
+    SH050156  COST             643.5   TRAN0501            1.
+    SH050156  BAL0501            -1.   BAL0556             1.
+    SH050256  COST            955.35   TRAN0502            1.
+    SH050256  BAL0502            -1.   BAL0556             1.
+    SH050356  COST            503.25   TRAN0503            1.
+    SH050356  BAL0503            -1.   BAL0556             1.
+    SH050456  COST            602.25   TRAN0504            1.
+    SH050456  BAL0504            -1.   BAL0556             1.
+    SH050556  COST             224.4   TRAN0505            1.
+    SH050556  BAL0505            -1.   BAL0556             1.
+    SH050656  COST            559.35   TRAN0506            1.
+    SH050656  BAL0552            -1.   BAL0556             1.
+    SH050756  COST             201.3   TRAN0507            1.
+    SH050756  BAL0564            -1.   BAL0556             1.
+    SH050856  COST            589.05   TRAN0508            1.
+    SH050856  BAL0583            -1.   BAL0556             1.
+    SH050157  COST            430.65   TRAN0501            1.
+    SH050157  BAL0501            -1.   BAL0557             1.
+    SH050257  COST              858.   TRAN0502            1.
+    SH050257  BAL0502            -1.   BAL0557             1.
+    SH050357  COST             478.5   TRAN0503            1.
+    SH050357  BAL0503            -1.   BAL0557             1.
+    SH050457  COST             386.1   TRAN0504            1.
+    SH050457  BAL0504            -1.   BAL0557             1.
+    SH050557  COST             277.2   TRAN0505            1.
+    SH050557  BAL0505            -1.   BAL0557             1.
+    SH050657  COST            526.35   TRAN0506            1.
+    SH050657  BAL0552            -1.   BAL0557             1.
+    SH050757  COST             244.2   TRAN0507            1.
+    SH050757  BAL0564            -1.   BAL0557             1.
+    SH050857  COST            381.15   TRAN0508            1.
+    SH050857  BAL0583            -1.   BAL0557             1.
+    SH050158  COST             485.1   TRAN0501            1.
+    SH050158  BAL0501            -1.   BAL0558             1.
+    SH050258  COST            859.65   TRAN0502            1.
+    SH050258  BAL0502            -1.   BAL0558             1.
+    SH050358  COST             458.7   TRAN0503            1.
+    SH050358  BAL0503            -1.   BAL0558             1.
+    SH050458  COST            565.95   TRAN0504            1.
+    SH050458  BAL0504            -1.   BAL0558             1.
+    SH050558  COST             34.65   TRAN0505            1.
+    SH050558  BAL0505            -1.   BAL0558             1.
+    SH050658  COST             537.9   TRAN0506            1.
+    SH050658  BAL0552            -1.   BAL0558             1.
+    SH050758  COST             112.2   TRAN0507            1.
+    SH050758  BAL0564            -1.   BAL0558             1.
+    SH050858  COST             419.1   TRAN0508            1.
+    SH050858  BAL0583            -1.   BAL0558             1.
+    SH050159  COST             339.9   TRAN0501            1.
+    SH050159  BAL0501            -1.   BAL0559             1.
+    SH050259  COST             821.7   TRAN0502            1.
+    SH050259  BAL0502            -1.   BAL0559             1.
+    SH050359  COST             392.7   TRAN0503            1.
+    SH050359  BAL0503            -1.   BAL0559             1.
+    SH050459  COST             402.6   TRAN0504            1.
+    SH050459  BAL0504            -1.   BAL0559             1.
+    SH050559  COST            262.35   TRAN0505            1.
+    SH050559  BAL0505            -1.   BAL0559             1.
+    SH050659  COST            490.05   TRAN0506            1.
+    SH050659  BAL0552            -1.   BAL0559             1.
+    SH050759  COST            173.25   TRAN0507            1.
+    SH050759  BAL0564            -1.   BAL0559             1.
+    SH050859  COST            420.75   TRAN0508            1.
+    SH050859  BAL0583            -1.   BAL0559             1.
+    SH050160  COST            430.65   TRAN0501            1.
+    SH050160  BAL0501            -1.   BAL0560             1.
+    SH050260  COST             907.5   TRAN0502            1.
+    SH050260  BAL0502            -1.   BAL0560             1.
+    SH050360  COST            466.95   TRAN0503            1.
+    SH050360  BAL0503            -1.   BAL0560             1.
+    SH050460  COST             514.8   TRAN0504            1.
+    SH050460  BAL0504            -1.   BAL0560             1.
+    SH050560  COST            222.75   TRAN0505            1.
+    SH050560  BAL0505            -1.   BAL0560             1.
+    SH050660  COST            532.95   TRAN0506            1.
+    SH050660  BAL0552            -1.   BAL0560             1.
+    SH050760  COST             145.2   TRAN0507            1.
+    SH050760  BAL0564            -1.   BAL0560             1.
+    SH050860  COST            493.35   TRAN0508            1.
+    SH050860  BAL0583            -1.   BAL0560             1.
+    SH050163  COST             438.9   TRAN0501            1.
+    SH050163  BAL0501            -1.   BAL0563             1.
+    SH050263  COST             815.1   TRAN0502            1.
+    SH050263  BAL0502            -1.   BAL0563             1.
+    SH050363  COST            473.55   TRAN0503            1.
+    SH050363  BAL0503            -1.   BAL0563             1.
+    SH050463  COST            608.85   TRAN0504            1.
+    SH050463  BAL0504            -1.   BAL0563             1.
+    SH050563  COST             250.8   TRAN0505            1.
+    SH050563  BAL0505            -1.   BAL0563             1.
+    SH050663  COST            519.75   TRAN0506            1.
+    SH050663  BAL0552            -1.   BAL0563             1.
+    SH050763  COST             204.6   TRAN0507            1.
+    SH050763  BAL0564            -1.   BAL0563             1.
+    SH050863  COST              660.   TRAN0508            1.
+    SH050863  BAL0583            -1.   BAL0563             1.
+    SH050164  COST            328.35   TRAN0501            1.
+    SH050164  BAL0501            -1.   BAL0564             1.
+    SH050264  COST             867.9   TRAN0502            1.
+    SH050264  BAL0502            -1.   BAL0564             1.
+    SH050364  COST            367.95   TRAN0503            1.
+    SH050364  BAL0503            -1.   BAL0564             1.
+    SH050464  COST             554.4   TRAN0504            1.
+    SH050464  BAL0504            -1.   BAL0564             1.
+    SH050564  COST              95.7   TRAN0505            1.
+    SH050564  BAL0505            -1.   BAL0564             1.
+    SH050664  COST            523.05   TRAN0506            1.
+    SH050664  BAL0552            -1.   BAL0564             1.
+    SH050864  COST             412.5   TRAN0508            1.
+    SH050864  BAL0583            -1.   BAL0564             1.
+    SH050165  COST             712.8   TRAN0501            1.
+    SH050165  BAL0501            -1.   BAL0565             1.
+    SH050265  COST            506.55   TRAN0502            1.
+    SH050265  BAL0502            -1.   BAL0565             1.
+    SH050365  COST            833.25   TRAN0503            1.
+    SH050365  BAL0503            -1.   BAL0565             1.
+    SH050465  COST             640.2   TRAN0504            1.
+    SH050465  BAL0504            -1.   BAL0565             1.
+    SH050565  COST             996.6   TRAN0505            1.
+    SH050565  BAL0505            -1.   BAL0565             1.
+    SH050865  COST            684.75   TRAN0508            1.
+    SH050865  BAL0583            -1.   BAL0565             1.
+    SH050166  COST              924.   TRAN0501            1.
+    SH050166  BAL0501            -1.   BAL0566             1.
+    SH050266  COST            427.35   TRAN0502            1.
+    SH050266  BAL0502            -1.   BAL0566             1.
+    SH050366  COST             953.7   TRAN0503            1.
+    SH050366  BAL0503            -1.   BAL0566             1.
+    SH050466  COST             917.4   TRAN0504            1.
+    SH050466  BAL0504            -1.   BAL0566             1.
+    SH050566  COST            1171.5   TRAN0505            1.
+    SH050566  BAL0505            -1.   BAL0566             1.
+    SH050866  COST              924.   TRAN0508            1.
+    SH050866  BAL0583            -1.   BAL0566             1.
+    SH050167  COST            701.25   TRAN0501            1.
+    SH050167  BAL0501            -1.   BAL0567             1.
+    SH050267  COST             382.8   TRAN0502            1.
+    SH050267  BAL0502            -1.   BAL0567             1.
+    SH050367  COST            813.45   TRAN0503            1.
+    SH050367  BAL0503            -1.   BAL0567             1.
+    SH050467  COST            754.05   TRAN0504            1.
+    SH050467  BAL0504            -1.   BAL0567             1.
+    SH050567  COST             996.6   TRAN0505            1.
+    SH050567  BAL0505            -1.   BAL0567             1.
+    SH050867  COST             755.7   TRAN0508            1.
+    SH050867  BAL0583            -1.   BAL0567             1.
+    SH050168  COST             980.1   TRAN0501            1.
+    SH050168  BAL0501            -1.   BAL0568             1.
+    SH050268  COST              660.   TRAN0502            1.
+    SH050268  BAL0502            -1.   BAL0568             1.
+    SH050368  COST              924.   TRAN0503            1.
+    SH050368  BAL0503            -1.   BAL0568             1.
+    SH050468  COST            1158.3   TRAN0504            1.
+    SH050468  BAL0504            -1.   BAL0568             1.
+    SH050568  COST            1560.9   TRAN0505            1.
+    SH050568  BAL0505            -1.   BAL0568             1.
+    SH050868  COST           1239.15   TRAN0508            1.
+    SH050868  BAL0583            -1.   BAL0568             1.
+    SH050169  COST            889.35   TRAN0501            1.
+    SH050169  BAL0501            -1.   BAL0569             1.
+    SH050269  COST            364.65   TRAN0502            1.
+    SH050269  BAL0502            -1.   BAL0569             1.
+    SH050369  COST             841.5   TRAN0503            1.
+    SH050369  BAL0503            -1.   BAL0569             1.
+    SH050469  COST            1026.3   TRAN0504            1.
+    SH050469  BAL0504            -1.   BAL0569             1.
+    SH050569  COST            1065.9   TRAN0505            1.
+    SH050569  BAL0505            -1.   BAL0569             1.
+    SH050869  COST            1085.7   TRAN0508            1.
+    SH050869  BAL0583            -1.   BAL0569             1.
+    SH050171  COST              726.   TRAN0501            1.
+    SH050171  BAL0501            -1.   BAL0571             1.
+    SH050371  COST             864.6   TRAN0503            1.
+    SH050371  BAL0503            -1.   BAL0571             1.
+    SH050471  COST            859.65   TRAN0504            1.
+    SH050471  BAL0504            -1.   BAL0571             1.
+    SH050571  COST            958.65   TRAN0505            1.
+    SH050571  BAL0505            -1.   BAL0571             1.
+    SH050671  COST            645.15   TRAN0506            1.
+    SH050671  BAL0552            -1.   BAL0571             1.
+    SH050771  COST            1161.6   TRAN0507            1.
+    SH050771  BAL0564            -1.   BAL0571             1.
+    SH050871  COST            879.45   TRAN0508            1.
+    SH050871  BAL0583            -1.   BAL0571             1.
+    SH050172  COST            968.55   TRAN0501            1.
+    SH050172  BAL0501            -1.   BAL0572             1.
+    SH050272  COST            895.95   TRAN0502            1.
+    SH050272  BAL0502            -1.   BAL0572             1.
+    SH050372  COST           1018.05   TRAN0503            1.
+    SH050372  BAL0503            -1.   BAL0572             1.
+    SH050472  COST             940.5   TRAN0504            1.
+    SH050472  BAL0504            -1.   BAL0572             1.
+    SH050572  COST           1258.95   TRAN0505            1.
+    SH050572  BAL0505            -1.   BAL0572             1.
+    SH050872  COST             940.5   TRAN0508            1.
+    SH050872  BAL0583            -1.   BAL0572             1.
+    SH050173  COST             643.5   TRAN0501            1.
+    SH050173  BAL0501            -1.   BAL0573             1.
+    SH050273  COST            602.25   TRAN0502            1.
+    SH050273  BAL0502            -1.   BAL0573             1.
+    SH050373  COST             557.7   TRAN0503            1.
+    SH050373  BAL0503            -1.   BAL0573             1.
+    SH050473  COST            754.05   TRAN0504            1.
+    SH050473  BAL0504            -1.   BAL0573             1.
+    SH050573  COST             930.6   TRAN0505            1.
+    SH050573  BAL0505            -1.   BAL0573             1.
+    SH050673  COST            503.25   TRAN0506            1.
+    SH050673  BAL0552            -1.   BAL0573             1.
+    SH050873  COST             831.6   TRAN0508            1.
+    SH050873  BAL0583            -1.   BAL0573             1.
+    SH050174  COST             904.2   TRAN0501            1.
+    SH050174  BAL0501            -1.   BAL0574             1.
+    SH050274  COST             346.5   TRAN0502            1.
+    SH050274  BAL0502            -1.   BAL0574             1.
+    SH050374  COST             940.5   TRAN0503            1.
+    SH050374  BAL0503            -1.   BAL0574             1.
+    SH050474  COST           1051.05   TRAN0504            1.
+    SH050474  BAL0504            -1.   BAL0574             1.
+    SH050574  COST           1209.45   TRAN0505            1.
+    SH050574  BAL0505            -1.   BAL0574             1.
+    SH050874  COST           1021.35   TRAN0508            1.
+    SH050874  BAL0583            -1.   BAL0574             1.
+    SH050275  COST             914.1   TRAN0502            1.
+    SH050275  BAL0502            -1.   BAL0575             1.
+    SH050176  COST             762.3   TRAN0501            1.
+    SH050176  BAL0501            -1.   BAL0576             1.
+    SH050276  COST            661.65   TRAN0502            1.
+    SH050276  BAL0502            -1.   BAL0576             1.
+    SH050376  COST            664.95   TRAN0503            1.
+    SH050376  BAL0503            -1.   BAL0576             1.
+    SH050476  COST            1039.5   TRAN0504            1.
+    SH050476  BAL0504            -1.   BAL0576             1.
+    SH050576  COST            1039.5   TRAN0505            1.
+    SH050576  BAL0505            -1.   BAL0576             1.
+    SH050676  COST            628.65   TRAN0506            1.
+    SH050676  BAL0552            -1.   BAL0576             1.
+    SH050876  COST           1282.05   TRAN0508            1.
+    SH050876  BAL0583            -1.   BAL0576             1.
+    SH050177  COST            717.75   TRAN0501            1.
+    SH050177  BAL0501            -1.   BAL0577             1.
+    SH050277  COST             448.8   TRAN0502            1.
+    SH050277  BAL0502            -1.   BAL0577             1.
+    SH050377  COST            760.65   TRAN0503            1.
+    SH050377  BAL0503            -1.   BAL0577             1.
+    SH050477  COST            661.65   TRAN0504            1.
+    SH050477  BAL0504            -1.   BAL0577             1.
+    SH050577  COST              924.   TRAN0505            1.
+    SH050577  BAL0505            -1.   BAL0577             1.
+    SH050877  COST              528.   TRAN0508            1.
+    SH050877  BAL0583            -1.   BAL0577             1.
+    SH050178  COST           1255.65   TRAN0501            1.
+    SH050178  BAL0501            -1.   BAL0578             1.
+    SH050278  COST             729.3   TRAN0502            1.
+    SH050278  BAL0502            -1.   BAL0578             1.
+    SH050378  COST           1291.95   TRAN0503            1.
+    SH050378  BAL0503            -1.   BAL0578             1.
+    SH050478  COST           1130.25   TRAN0504            1.
+    SH050478  BAL0504            -1.   BAL0578             1.
+    SH050578  COST           1450.35   TRAN0505            1.
+    SH050578  BAL0505            -1.   BAL0578             1.
+    SH050878  COST            1263.9   TRAN0508            1.
+    SH050878  BAL0583            -1.   BAL0578             1.
+    SH050179  COST           1179.75   TRAN0501            1.
+    SH050179  BAL0501            -1.   BAL0579             1.
+    SH050279  COST            443.85   TRAN0502            1.
+    SH050279  BAL0502            -1.   BAL0579             1.
+    SH050379  COST           1140.15   TRAN0503            1.
+    SH050379  BAL0503            -1.   BAL0579             1.
+    SH050479  COST             1188.   TRAN0504            1.
+    SH050479  BAL0504            -1.   BAL0579             1.
+    SH050879  COST            1164.9   TRAN0508            1.
+    SH050879  BAL0583            -1.   BAL0579             1.
+    SH050180  COST            523.05   TRAN0501            1.
+    SH050180  BAL0501            -1.   BAL0580             1.
+    SH050280  COST            651.75   TRAN0502            1.
+    SH050280  BAL0502            -1.   BAL0580             1.
+    SH050380  COST            721.05   TRAN0503            1.
+    SH050380  BAL0503            -1.   BAL0580             1.
+    SH050480  COST             617.1   TRAN0504            1.
+    SH050480  BAL0504            -1.   BAL0580             1.
+    SH050580  COST            833.25   TRAN0505            1.
+    SH050580  BAL0505            -1.   BAL0580             1.
+    SH050880  COST              396.   TRAN0508            1.
+    SH050880  BAL0583            -1.   BAL0580             1.
+    SH050182  COST             960.3   TRAN0501            1.
+    SH050182  BAL0501            -1.   BAL0582             1.
+    SH050282  COST            542.85   TRAN0502            1.
+    SH050282  BAL0502            -1.   BAL0582             1.
+    SH050382  COST           1080.75   TRAN0503            1.
+    SH050382  BAL0503            -1.   BAL0582             1.
+    SH050482  COST            1164.9   TRAN0504            1.
+    SH050482  BAL0504            -1.   BAL0582             1.
+    SH050582  COST           1892.55   TRAN0505            1.
+    SH050582  BAL0505            -1.   BAL0582             1.
+    SH050882  COST           1291.95   TRAN0508            1.
+    SH050882  BAL0583            -1.   BAL0582             1.
+    SH050183  COST            292.05   TRAN0501            1.
+    SH050183  BAL0501            -1.   BAL0583             1.
+    SH050283  COST              858.   TRAN0502            1.
+    SH050283  BAL0502            -1.   BAL0583             1.
+    SH050383  COST             448.8   TRAN0503            1.
+    SH050383  BAL0503            -1.   BAL0583             1.
+    SH050483  COST             97.35   TRAN0504            1.
+    SH050483  BAL0504            -1.   BAL0583             1.
+    SH050583  COST            572.55   TRAN0505            1.
+    SH050583  BAL0505            -1.   BAL0583             1.
+    SH050683  COST             409.2   TRAN0506            1.
+    SH050683  BAL0552            -1.   BAL0583             1.
+    SH050184  COST             501.6   TRAN0501            1.
+    SH050184  BAL0501            -1.   BAL0584             1.
+    SH050284  COST             316.8   TRAN0502            1.
+    SH050284  BAL0502            -1.   BAL0584             1.
+    SH050384  COST             600.6   TRAN0503            1.
+    SH050384  BAL0503            -1.   BAL0584             1.
+    SH050484  COST             610.5   TRAN0504            1.
+    SH050484  BAL0504            -1.   BAL0584             1.
+    SH050584  COST             808.5   TRAN0505            1.
+    SH050584  BAL0505            -1.   BAL0584             1.
+    SH050684  COST            503.25   TRAN0506            1.
+    SH050684  BAL0552            -1.   BAL0584             1.
+    SH050884  COST             640.2   TRAN0508            1.
+    SH050884  BAL0583            -1.   BAL0584             1.
+    SH060201  COST            365.31   TRAN0602            1.
+    SH060201  BAL0602            -1.   BAL0601             1.
+    SH060301  COST            140.22   TRAN0603            1.
+    SH060301  BAL0603            -1.   BAL0601             1.
+    SH060401  COST            255.84   TRAN0604            1.
+    SH060401  BAL0604            -1.   BAL0601             1.
+    SH060501  COST            291.51   TRAN0605            1.
+    SH060501  BAL0605            -1.   BAL0601             1.
+    SH060601  COST            154.98   TRAN0606            1.
+    SH060601  BAL0652            -1.   BAL0601             1.
+    SH060801  COST            175.89   TRAN0608            1.
+    SH060801  BAL0683            -1.   BAL0601             1.
+    SH060102  COST            583.02   TRAN0601            1.
+    SH060102  BAL0601            -1.   BAL0602             1.
+    SH060302  COST            512.91   TRAN0603            1.
+    SH060302  BAL0603            -1.   BAL0602             1.
+    SH060402  COST            752.76   TRAN0604            1.
+    SH060402  BAL0604            -1.   BAL0602             1.
+    SH060502  COST            911.43   TRAN0605            1.
+    SH060502  BAL0605            -1.   BAL0602             1.
+    SH060602  COST            464.94   TRAN0606            1.
+    SH060602  BAL0652            -1.   BAL0602             1.
+    SH060802  COST            640.83   TRAN0608            1.
+    SH060802  BAL0683            -1.   BAL0602             1.
+    SH060103  COST            301.35   TRAN0601            1.
+    SH060103  BAL0601            -1.   BAL0603             1.
+    SH060203  COST            583.02   TRAN0602            1.
+    SH060203  BAL0602            -1.   BAL0603             1.
+    SH060403  COST            451.41   TRAN0604            1.
+    SH060403  BAL0604            -1.   BAL0603             1.
+    SH060503  COST            349.32   TRAN0605            1.
+    SH060503  BAL0605            -1.   BAL0603             1.
+    SH060603  COST             110.7   TRAN0606            1.
+    SH060603  BAL0652            -1.   BAL0603             1.
+    SH060803  COST            313.65   TRAN0608            1.
+    SH060803  BAL0683            -1.   BAL0603             1.
+    SH060104  COST            214.02   TRAN0601            1.
+    SH060104  BAL0601            -1.   BAL0604             1.
+    SH060204  COST            618.69   TRAN0602            1.
+    SH060204  BAL0602            -1.   BAL0604             1.
+    SH060304  COST            298.89   TRAN0603            1.
+    SH060304  BAL0603            -1.   BAL0604             1.
+    SH060504  COST            392.37   TRAN0605            1.
+    SH060504  BAL0605            -1.   BAL0604             1.
+    SH060604  COST            301.35   TRAN0606            1.
+    SH060604  BAL0652            -1.   BAL0604             1.
+    SH060704  COST            330.87   TRAN0607            1.
+    SH060704  BAL0664            -1.   BAL0604             1.
+    SH060804  COST             71.34   TRAN0608            1.
+    SH060804  BAL0683            -1.   BAL0604             1.
+    SH060105  COST             332.1   TRAN0601            1.
+    SH060105  BAL0601            -1.   BAL0605             1.
+    SH060205  COST            634.68   TRAN0602            1.
+    SH060205  BAL0602            -1.   BAL0605             1.
+    SH060305  COST            349.32   TRAN0603            1.
+    SH060305  BAL0603            -1.   BAL0605             1.
+    SH060405  COST            350.55   TRAN0604            1.
+    SH060405  BAL0604            -1.   BAL0605             1.
+    SH060605  COST            400.98   TRAN0606            1.
+    SH060605  BAL0652            -1.   BAL0605             1.
+    SH060705  COST            410.82   TRAN0607            1.
+    SH060705  BAL0664            -1.   BAL0605             1.
+    SH060805  COST            333.33   TRAN0608            1.
+    SH060805  BAL0683            -1.   BAL0605             1.
+    SH060106  COST            244.77   TRAN0601            1.
+    SH060106  BAL0601            -1.   BAL0606             1.
+    SH060206  COST            512.91   TRAN0602            1.
+    SH060206  BAL0602            -1.   BAL0606             1.
+    SH060306  COST            261.99   TRAN0603            1.
+    SH060306  BAL0603            -1.   BAL0606             1.
+    SH060406  COST            269.37   TRAN0604            1.
+    SH060406  BAL0604            -1.   BAL0606             1.
+    SH060506  COST            309.96   TRAN0605            1.
+    SH060506  BAL0605            -1.   BAL0606             1.
+    SH060606  COST            253.38   TRAN0606            1.
+    SH060606  BAL0652            -1.   BAL0606             1.
+    SH060706  COST              246.   TRAN0607            1.
+    SH060706  BAL0664            -1.   BAL0606             1.
+    SH060806  COST            185.73   TRAN0608            1.
+    SH060806  BAL0683            -1.   BAL0606             1.
+    SH060107  COST             25.83   TRAN0601            1.
+    SH060107  BAL0601            -1.   BAL0607             1.
+    SH060207  COST            359.16   TRAN0602            1.
+    SH060207  BAL0602            -1.   BAL0607             1.
+    SH060307  COST            152.52   TRAN0603            1.
+    SH060307  BAL0603            -1.   BAL0607             1.
+    SH060407  COST            254.61   TRAN0604            1.
+    SH060407  BAL0604            -1.   BAL0607             1.
+    SH060507  COST            281.67   TRAN0605            1.
+    SH060507  BAL0605            -1.   BAL0607             1.
+    SH060607  COST            153.75   TRAN0606            1.
+    SH060607  BAL0652            -1.   BAL0607             1.
+    SH060707  COST            285.36   TRAN0607            1.
+    SH060707  BAL0664            -1.   BAL0607             1.
+    SH060807  COST            190.65   TRAN0608            1.
+    SH060807  BAL0683            -1.   BAL0607             1.
+    SH060108  COST             81.18   TRAN0601            1.
+    SH060108  BAL0601            -1.   BAL0608             1.
+    SH060208  COST            462.48   TRAN0602            1.
+    SH060208  BAL0602            -1.   BAL0608             1.
+    SH060308  COST            173.43   TRAN0603            1.
+    SH060308  BAL0603            -1.   BAL0608             1.
+    SH060408  COST            303.81   TRAN0604            1.
+    SH060408  BAL0604            -1.   BAL0608             1.
+    SH060508  COST            223.86   TRAN0605            1.
+    SH060508  BAL0605            -1.   BAL0608             1.
+    SH060608  COST            204.18   TRAN0606            1.
+    SH060608  BAL0652            -1.   BAL0608             1.
+    SH060808  COST            230.01   TRAN0608            1.
+    SH060808  BAL0683            -1.   BAL0608             1.
+    SH060109  COST            169.74   TRAN0601            1.
+    SH060109  BAL0601            -1.   BAL0609             1.
+    SH060209  COST            471.09   TRAN0602            1.
+    SH060209  BAL0602            -1.   BAL0609             1.
+    SH060309  COST            206.64   TRAN0603            1.
+    SH060309  BAL0603            -1.   BAL0609             1.
+    SH060409  COST            311.19   TRAN0604            1.
+    SH060409  BAL0604            -1.   BAL0609             1.
+    SH060509  COST            293.97   TRAN0605            1.
+    SH060509  BAL0605            -1.   BAL0609             1.
+    SH060709  COST            241.08   TRAN0607            1.
+    SH060709  BAL0664            -1.   BAL0609             1.
+    SH060809  COST            238.62   TRAN0608            1.
+    SH060809  BAL0683            -1.   BAL0609             1.
+    SH060110  COST            303.81   TRAN0601            1.
+    SH060110  BAL0601            -1.   BAL0610             1.
+    SH060210  COST            194.34   TRAN0602            1.
+    SH060210  BAL0602            -1.   BAL0610             1.
+    SH060310  COST             295.2   TRAN0603            1.
+    SH060310  BAL0603            -1.   BAL0610             1.
+    SH060410  COST            441.57   TRAN0604            1.
+    SH060410  BAL0604            -1.   BAL0610             1.
+    SH060510  COST            473.55   TRAN0605            1.
+    SH060510  BAL0605            -1.   BAL0610             1.
+    SH060610  COST            276.75   TRAN0606            1.
+    SH060610  BAL0652            -1.   BAL0610             1.
+    SH060810  COST            375.15   TRAN0608            1.
+    SH060810  BAL0683            -1.   BAL0610             1.
+    SH060111  COST            130.38   TRAN0601            1.
+    SH060111  BAL0601            -1.   BAL0611             1.
+    SH060211  COST            608.85   TRAN0602            1.
+    SH060211  BAL0602            -1.   BAL0611             1.
+    SH060311  COST            305.04   TRAN0603            1.
+    SH060311  BAL0603            -1.   BAL0611             1.
+    SH060411  COST            170.97   TRAN0604            1.
+    SH060411  BAL0604            -1.   BAL0611             1.
+    SH060511  COST            419.43   TRAN0605            1.
+    SH060511  BAL0605            -1.   BAL0611             1.
+    SH060611  COST            241.08   TRAN0606            1.
+    SH060611  BAL0652            -1.   BAL0611             1.
+    SH060811  COST            125.46   TRAN0608            1.
+    SH060811  BAL0683            -1.   BAL0611             1.
+    SH060112  COST            108.24   TRAN0601            1.
+    SH060112  BAL0601            -1.   BAL0612             1.
+    SH060212  COST            416.97   TRAN0602            1.
+    SH060212  BAL0602            -1.   BAL0612             1.
+    SH060312  COST            179.58   TRAN0603            1.
+    SH060312  BAL0603            -1.   BAL0612             1.
+    SH060412  COST              246.   TRAN0604            1.
+    SH060412  BAL0604            -1.   BAL0612             1.
+    SH060512  COST            328.41   TRAN0605            1.
+    SH060512  BAL0605            -1.   BAL0612             1.
+    SH060612  COST            178.35   TRAN0606            1.
+    SH060612  BAL0652            -1.   BAL0612             1.
+    SH060812  COST            179.58   TRAN0608            1.
+    SH060812  BAL0683            -1.   BAL0612             1.
+    SH060114  COST            174.66   TRAN0601            1.
+    SH060114  BAL0601            -1.   BAL0614             1.
+    SH060214  COST            506.76   TRAN0602            1.
+    SH060214  BAL0602            -1.   BAL0614             1.
+    SH060314  COST            241.08   TRAN0603            1.
+    SH060314  BAL0603            -1.   BAL0614             1.
+    SH060414  COST            244.77   TRAN0604            1.
+    SH060414  BAL0604            -1.   BAL0614             1.
+    SH060514  COST            432.96   TRAN0605            1.
+    SH060514  BAL0605            -1.   BAL0614             1.
+    SH060614  COST            231.24   TRAN0606            1.
+    SH060614  BAL0652            -1.   BAL0614             1.
+    SH060814  COST            154.98   TRAN0608            1.
+    SH060814  BAL0683            -1.   BAL0614             1.
+    SH060115  COST            372.69   TRAN0601            1.
+    SH060115  BAL0601            -1.   BAL0615             1.
+    SH060215  COST            195.57   TRAN0602            1.
+    SH060215  BAL0602            -1.   BAL0615             1.
+    SH060315  COST            287.82   TRAN0603            1.
+    SH060315  BAL0603            -1.   BAL0615             1.
+    SH060415  COST            585.48   TRAN0604            1.
+    SH060415  BAL0604            -1.   BAL0615             1.
+    SH060515  COST            489.54   TRAN0605            1.
+    SH060515  BAL0605            -1.   BAL0615             1.
+    SH060615  COST            231.24   TRAN0606            1.
+    SH060615  BAL0652            -1.   BAL0615             1.
+    SH060815  COST            458.79   TRAN0608            1.
+    SH060815  BAL0683            -1.   BAL0615             1.
+    SH060116  COST            194.34   TRAN0601            1.
+    SH060116  BAL0601            -1.   BAL0616             1.
+    SH060216  COST             344.4   TRAN0602            1.
+    SH060216  BAL0602            -1.   BAL0616             1.
+    SH060316  COST            279.21   TRAN0603            1.
+    SH060316  BAL0603            -1.   BAL0616             1.
+    SH060416  COST            353.01   TRAN0604            1.
+    SH060416  BAL0604            -1.   BAL0616             1.
+    SH060516  COST            392.37   TRAN0605            1.
+    SH060516  BAL0605            -1.   BAL0616             1.
+    SH060616  COST            161.13   TRAN0606            1.
+    SH060616  BAL0652            -1.   BAL0616             1.
+    SH060816  COST            252.15   TRAN0608            1.
+    SH060816  BAL0683            -1.   BAL0616             1.
+    SH060117  COST            185.73   TRAN0601            1.
+    SH060117  BAL0601            -1.   BAL0617             1.
+    SH060217  COST            621.15   TRAN0602            1.
+    SH060217  BAL0602            -1.   BAL0617             1.
+    SH060317  COST            337.02   TRAN0603            1.
+    SH060317  BAL0603            -1.   BAL0617             1.
+    SH060417  COST             70.11   TRAN0604            1.
+    SH060417  BAL0604            -1.   BAL0617             1.
+    SH060517  COST            366.54   TRAN0605            1.
+    SH060517  BAL0605            -1.   BAL0617             1.
+    SH060717  COST            362.85   TRAN0607            1.
+    SH060717  BAL0664            -1.   BAL0617             1.
+    SH060817  COST             33.21   TRAN0608            1.
+    SH060817  BAL0683            -1.   BAL0617             1.
+    SH060118  COST            215.25   TRAN0601            1.
+    SH060118  BAL0601            -1.   BAL0618             1.
+    SH060218  COST            444.03   TRAN0602            1.
+    SH060218  BAL0602            -1.   BAL0618             1.
+    SH060318  COST             332.1   TRAN0603            1.
+    SH060318  BAL0603            -1.   BAL0618             1.
+    SH060418  COST            189.42   TRAN0604            1.
+    SH060418  BAL0604            -1.   BAL0618             1.
+    SH060518  COST            500.61   TRAN0605            1.
+    SH060518  BAL0605            -1.   BAL0618             1.
+    SH060618  COST            432.96   TRAN0606            1.
+    SH060618  BAL0652            -1.   BAL0618             1.
+    SH060818  COST            126.69   TRAN0608            1.
+    SH060818  BAL0683            -1.   BAL0618             1.
+    SH060119  COST            305.04   TRAN0601            1.
+    SH060119  BAL0601            -1.   BAL0619             1.
+    SH060219  COST            845.01   TRAN0602            1.
+    SH060219  BAL0602            -1.   BAL0619             1.
+    SH060319  COST            389.91   TRAN0603            1.
+    SH060319  BAL0603            -1.   BAL0619             1.
+    SH060419  COST            195.57   TRAN0604            1.
+    SH060419  BAL0604            -1.   BAL0619             1.
+    SH060519  COST            255.84   TRAN0605            1.
+    SH060519  BAL0605            -1.   BAL0619             1.
+    SH060619  COST            424.35   TRAN0606            1.
+    SH060619  BAL0652            -1.   BAL0619             1.
+    SH060819  COST            121.77   TRAN0608            1.
+    SH060819  BAL0683            -1.   BAL0619             1.
+    SH060120  COST            252.15   TRAN0601            1.
+    SH060120  BAL0601            -1.   BAL0620             1.
+    SH060220  COST            840.09   TRAN0602            1.
+    SH060220  BAL0602            -1.   BAL0620             1.
+    SH060320  COST            365.31   TRAN0603            1.
+    SH060320  BAL0603            -1.   BAL0620             1.
+    SH060420  COST            138.99   TRAN0604            1.
+    SH060420  BAL0604            -1.   BAL0620             1.
+    SH060520  COST            357.93   TRAN0605            1.
+    SH060520  BAL0605            -1.   BAL0620             1.
+    SH060820  COST            154.98   TRAN0608            1.
+    SH060820  BAL0683            -1.   BAL0620             1.
+    SH060121  COST            495.69   TRAN0601            1.
+    SH060121  BAL0601            -1.   BAL0621             1.
+    SH060221  COST            452.64   TRAN0602            1.
+    SH060221  BAL0602            -1.   BAL0621             1.
+    SH060321  COST            548.58   TRAN0603            1.
+    SH060321  BAL0603            -1.   BAL0621             1.
+    SH060421  COST             393.6   TRAN0604            1.
+    SH060421  BAL0604            -1.   BAL0621             1.
+    SH060521  COST             676.5   TRAN0605            1.
+    SH060521  BAL0605            -1.   BAL0621             1.
+    SH060821  COST             393.6   TRAN0608            1.
+    SH060821  BAL0683            -1.   BAL0621             1.
+    SH060122  COST            305.04   TRAN0601            1.
+    SH060122  BAL0601            -1.   BAL0622             1.
+    SH060222  COST            710.94   TRAN0602            1.
+    SH060222  BAL0602            -1.   BAL0622             1.
+    SH060322  COST            367.77   TRAN0603            1.
+    SH060322  BAL0603            -1.   BAL0622             1.
+    SH060422  COST            275.52   TRAN0604            1.
+    SH060422  BAL0604            -1.   BAL0622             1.
+    SH060522  COST            220.17   TRAN0605            1.
+    SH060522  BAL0605            -1.   BAL0622             1.
+    SH060622  COST             381.3   TRAN0606            1.
+    SH060622  BAL0652            -1.   BAL0622             1.
+    SH060822  COST            170.97   TRAN0608            1.
+    SH060822  BAL0683            -1.   BAL0622             1.
+    SH060123  COST            287.82   TRAN0601            1.
+    SH060123  BAL0601            -1.   BAL0623             1.
+    SH060223  COST            665.43   TRAN0602            1.
+    SH060223  BAL0602            -1.   BAL0623             1.
+    SH060323  COST            353.01   TRAN0603            1.
+    SH060323  BAL0603            -1.   BAL0623             1.
+    SH060423  COST            205.41   TRAN0604            1.
+    SH060423  BAL0604            -1.   BAL0623             1.
+    SH060523  COST            204.18   TRAN0605            1.
+    SH060523  BAL0605            -1.   BAL0623             1.
+    SH060823  COST            170.97   TRAN0608            1.
+    SH060823  BAL0683            -1.   BAL0623             1.
+    SH060124  COST           1766.28   TRAN0601            1.
+    SH060124  BAL0601            -1.   BAL0624             1.
+    SH060125  COST            476.01   TRAN0601            1.
+    SH060125  BAL0601            -1.   BAL0625             1.
+    SH060225  COST            525.21   TRAN0602            1.
+    SH060225  BAL0602            -1.   BAL0625             1.
+    SH060325  COST            628.53   TRAN0603            1.
+    SH060325  BAL0603            -1.   BAL0625             1.
+    SH060425  COST            428.04   TRAN0604            1.
+    SH060425  BAL0604            -1.   BAL0625             1.
+    SH060525  COST            696.18   TRAN0605            1.
+    SH060525  BAL0605            -1.   BAL0625             1.
+    SH060625  COST            495.69   TRAN0606            1.
+    SH060625  BAL0652            -1.   BAL0625             1.
+    SH060825  COST            375.15   TRAN0608            1.
+    SH060825  BAL0683            -1.   BAL0625             1.
+    SH060426  COST             332.1   TRAN0604            1.
+    SH060426  BAL0604            -1.   BAL0626             1.
+    SH060127  COST            287.82   TRAN0601            1.
+    SH060127  BAL0601            -1.   BAL0627             1.
+    SH060227  COST            349.32   TRAN0602            1.
+    SH060227  BAL0602            -1.   BAL0627             1.
+    SH060327  COST            355.47   TRAN0603            1.
+    SH060327  BAL0603            -1.   BAL0627             1.
+    SH060427  COST            412.05   TRAN0604            1.
+    SH060427  BAL0604            -1.   BAL0627             1.
+    SH060527  COST            464.94   TRAN0605            1.
+    SH060527  BAL0605            -1.   BAL0627             1.
+    SH060627  COST            329.64   TRAN0606            1.
+    SH060627  BAL0652            -1.   BAL0627             1.
+    SH060827  COST            309.96   TRAN0608            1.
+    SH060827  BAL0683            -1.   BAL0627             1.
+    SH060128  COST            298.89   TRAN0601            1.
+    SH060128  BAL0601            -1.   BAL0628             1.
+    SH060228  COST            699.87   TRAN0602            1.
+    SH060228  BAL0602            -1.   BAL0628             1.
+    SH060328  COST            364.08   TRAN0603            1.
+    SH060328  BAL0603            -1.   BAL0628             1.
+    SH060428  COST            362.85   TRAN0604            1.
+    SH060428  BAL0604            -1.   BAL0628             1.
+    SH060528  COST            125.46   TRAN0605            1.
+    SH060528  BAL0605            -1.   BAL0628             1.
+    SH060628  COST            321.03   TRAN0606            1.
+    SH060628  BAL0652            -1.   BAL0628             1.
+    SH060728  COST            131.61   TRAN0607            1.
+    SH060728  BAL0664            -1.   BAL0628             1.
+    SH060828  COST            312.42   TRAN0608            1.
+    SH060828  BAL0683            -1.   BAL0628             1.
+    SH060129  COST            274.29   TRAN0601            1.
+    SH060129  BAL0601            -1.   BAL0629             1.
+    SH060229  COST            570.72   TRAN0602            1.
+    SH060229  BAL0602            -1.   BAL0629             1.
+    SH060329  COST            296.43   TRAN0603            1.
+    SH060329  BAL0603            -1.   BAL0629             1.
+    SH060429  COST            244.77   TRAN0604            1.
+    SH060429  BAL0604            -1.   BAL0629             1.
+    SH060529  COST             528.9   TRAN0605            1.
+    SH060529  BAL0605            -1.   BAL0629             1.
+    SH060629  COST            321.03   TRAN0606            1.
+    SH060629  BAL0652            -1.   BAL0629             1.
+    SH060829  COST            177.12   TRAN0608            1.
+    SH060829  BAL0683            -1.   BAL0629             1.
+    SH060130  COST            573.18   TRAN0601            1.
+    SH060130  BAL0601            -1.   BAL0630             1.
+    SH060230  COST            536.28   TRAN0602            1.
+    SH060230  BAL0602            -1.   BAL0630             1.
+    SH060330  COST            643.29   TRAN0603            1.
+    SH060330  BAL0603            -1.   BAL0630             1.
+    SH060430  COST            373.92   TRAN0604            1.
+    SH060430  BAL0604            -1.   BAL0630             1.
+    SH060530  COST            548.58   TRAN0605            1.
+    SH060530  BAL0605            -1.   BAL0630             1.
+    SH060830  COST            469.86   TRAN0608            1.
+    SH060830  BAL0683            -1.   BAL0630             1.
+    SH060131  COST            136.53   TRAN0601            1.
+    SH060131  BAL0601            -1.   BAL0631             1.
+    SH060231  COST            431.73   TRAN0602            1.
+    SH060231  BAL0602            -1.   BAL0631             1.
+    SH060331  COST             135.3   TRAN0603            1.
+    SH060331  BAL0603            -1.   BAL0631             1.
+    SH060431  COST            311.19   TRAN0604            1.
+    SH060431  BAL0604            -1.   BAL0631             1.
+    SH060531  COST            377.61   TRAN0605            1.
+    SH060531  BAL0605            -1.   BAL0631             1.
+    SH060631  COST            137.76   TRAN0606            1.
+    SH060631  BAL0652            -1.   BAL0631             1.
+    SH060831  COST            274.29   TRAN0608            1.
+    SH060831  BAL0683            -1.   BAL0631             1.
+    SH060132  COST            367.77   TRAN0601            1.
+    SH060132  BAL0601            -1.   BAL0632             1.
+    SH060232  COST            587.94   TRAN0602            1.
+    SH060232  BAL0602            -1.   BAL0632             1.
+    SH060332  COST            520.29   TRAN0603            1.
+    SH060332  BAL0603            -1.   BAL0632             1.
+    SH060432  COST            193.11   TRAN0604            1.
+    SH060432  BAL0604            -1.   BAL0632             1.
+    SH060532  COST            482.16   TRAN0605            1.
+    SH060532  BAL0605            -1.   BAL0632             1.
+    SH060832  COST             221.4   TRAN0608            1.
+    SH060832  BAL0683            -1.   BAL0632             1.
+    SH060133  COST            606.39   TRAN0601            1.
+    SH060133  BAL0601            -1.   BAL0633             1.
+    SH060233  COST              492.   TRAN0602            1.
+    SH060233  BAL0602            -1.   BAL0633             1.
+    SH060333  COST            667.89   TRAN0603            1.
+    SH060333  BAL0603            -1.   BAL0633             1.
+    SH060433  COST            547.35   TRAN0604            1.
+    SH060433  BAL0604            -1.   BAL0633             1.
+    SH060533  COST            776.13   TRAN0605            1.
+    SH060533  BAL0605            -1.   BAL0633             1.
+    SH060833  COST            468.63   TRAN0608            1.
+    SH060833  BAL0683            -1.   BAL0633             1.
+    SH060134  COST            474.78   TRAN0601            1.
+    SH060134  BAL0601            -1.   BAL0634             1.
+    SH060234  COST            805.65   TRAN0602            1.
+    SH060234  BAL0602            -1.   BAL0634             1.
+    SH060334  COST            618.69   TRAN0603            1.
+    SH060334  BAL0603            -1.   BAL0634             1.
+    SH060434  COST            259.53   TRAN0604            1.
+    SH060434  BAL0604            -1.   BAL0634             1.
+    SH060534  COST            542.43   TRAN0605            1.
+    SH060534  BAL0605            -1.   BAL0634             1.
+    SH060834  COST            323.49   TRAN0608            1.
+    SH060834  BAL0683            -1.   BAL0634             1.
+    SH060135  COST            567.03   TRAN0601            1.
+    SH060135  BAL0601            -1.   BAL0635             1.
+    SH060235  COST            547.35   TRAN0602            1.
+    SH060235  BAL0602            -1.   BAL0635             1.
+    SH060335  COST            463.71   TRAN0603            1.
+    SH060335  BAL0603            -1.   BAL0635             1.
+    SH060435  COST            150.06   TRAN0604            1.
+    SH060435  BAL0604            -1.   BAL0635             1.
+    SH060535  COST            530.13   TRAN0605            1.
+    SH060535  BAL0605            -1.   BAL0635             1.
+    SH060835  COST            289.05   TRAN0608            1.
+    SH060835  BAL0683            -1.   BAL0635             1.
+    SH060136  COST            252.15   TRAN0601            1.
+    SH060136  BAL0601            -1.   BAL0636             1.
+    SH060236  COST            551.04   TRAN0602            1.
+    SH060236  BAL0602            -1.   BAL0636             1.
+    SH060336  COST            130.38   TRAN0603            1.
+    SH060336  BAL0603            -1.   BAL0636             1.
+    SH060436  COST             455.1   TRAN0604            1.
+    SH060436  BAL0604            -1.   BAL0636             1.
+    SH060536  COST            425.58   TRAN0605            1.
+    SH060536  BAL0605            -1.   BAL0636             1.
+    SH060636  COST             135.3   TRAN0606            1.
+    SH060636  BAL0652            -1.   BAL0636             1.
+    SH060836  COST            394.83   TRAN0608            1.
+    SH060836  BAL0683            -1.   BAL0636             1.
+    SH060137  COST            113.16   TRAN0601            1.
+    SH060137  BAL0601            -1.   BAL0637             1.
+    SH060237  COST            420.66   TRAN0602            1.
+    SH060237  BAL0602            -1.   BAL0637             1.
+    SH060337  COST            194.34   TRAN0603            1.
+    SH060337  BAL0603            -1.   BAL0637             1.
+    SH060437  COST            373.92   TRAN0604            1.
+    SH060437  BAL0604            -1.   BAL0637             1.
+    SH060537  COST            223.86   TRAN0605            1.
+    SH060537  BAL0605            -1.   BAL0637             1.
+    SH060637  COST            238.62   TRAN0606            1.
+    SH060637  BAL0652            -1.   BAL0637             1.
+    SH060837  COST            309.96   TRAN0608            1.
+    SH060837  BAL0683            -1.   BAL0637             1.
+    SH060138  COST            167.28   TRAN0601            1.
+    SH060138  BAL0601            -1.   BAL0638             1.
+    SH060238  COST            300.12   TRAN0602            1.
+    SH060238  BAL0602            -1.   BAL0638             1.
+    SH060338  COST            116.85   TRAN0603            1.
+    SH060338  BAL0603            -1.   BAL0638             1.
+    SH060438  COST            378.84   TRAN0604            1.
+    SH060438  BAL0604            -1.   BAL0638             1.
+    SH060538  COST            341.94   TRAN0605            1.
+    SH060538  BAL0605            -1.   BAL0638             1.
+    SH060638  COST             47.97   TRAN0606            1.
+    SH060638  BAL0652            -1.   BAL0638             1.
+    SH060738  COST            265.68   TRAN0607            1.
+    SH060738  BAL0664            -1.   BAL0638             1.
+    SH060838  COST            291.51   TRAN0608            1.
+    SH060838  BAL0683            -1.   BAL0638             1.
+    SH060139  COST             159.9   TRAN0601            1.
+    SH060139  BAL0601            -1.   BAL0639             1.
+    SH060239  COST            416.97   TRAN0602            1.
+    SH060239  BAL0602            -1.   BAL0639             1.
+    SH060339  COST             196.8   TRAN0603            1.
+    SH060339  BAL0603            -1.   BAL0639             1.
+    SH060439  COST            306.27   TRAN0604            1.
+    SH060439  BAL0604            -1.   BAL0639             1.
+    SH060539  COST            527.67   TRAN0605            1.
+    SH060539  BAL0605            -1.   BAL0639             1.
+    SH060639  COST            250.92   TRAN0606            1.
+    SH060639  BAL0652            -1.   BAL0639             1.
+    SH060839  COST            206.64   TRAN0608            1.
+    SH060839  BAL0683            -1.   BAL0639             1.
+    SH060140  COST            202.95   TRAN0601            1.
+    SH060140  BAL0601            -1.   BAL0640             1.
+    SH060240  COST            464.94   TRAN0602            1.
+    SH060240  BAL0602            -1.   BAL0640             1.
+    SH060340  COST            126.69   TRAN0603            1.
+    SH060340  BAL0603            -1.   BAL0640             1.
+    SH060440  COST            365.31   TRAN0604            1.
+    SH060440  BAL0604            -1.   BAL0640             1.
+    SH060540  COST            271.83   TRAN0605            1.
+    SH060540  BAL0605            -1.   BAL0640             1.
+    SH060640  COST            161.13   TRAN0606            1.
+    SH060640  BAL0652            -1.   BAL0640             1.
+    SH060840  COST            337.02   TRAN0608            1.
+    SH060840  BAL0683            -1.   BAL0640             1.
+    SH060141  COST            241.08   TRAN0601            1.
+    SH060141  BAL0601            -1.   BAL0641             1.
+    SH060241  COST              369.   TRAN0602            1.
+    SH060241  BAL0602            -1.   BAL0641             1.
+    SH060341  COST             184.5   TRAN0603            1.
+    SH060341  BAL0603            -1.   BAL0641             1.
+    SH060441  COST            398.52   TRAN0604            1.
+    SH060441  BAL0604            -1.   BAL0641             1.
+    SH060541  COST            452.64   TRAN0605            1.
+    SH060541  BAL0605            -1.   BAL0641             1.
+    SH060641  COST              123.   TRAN0606            1.
+    SH060641  BAL0652            -1.   BAL0641             1.
+    SH060841  COST            367.77   TRAN0608            1.
+    SH060841  BAL0683            -1.   BAL0641             1.
+    SH060142  COST             110.7   TRAN0601            1.
+    SH060142  BAL0601            -1.   BAL0642             1.
+    SH060242  COST            509.22   TRAN0602            1.
+    SH060242  BAL0602            -1.   BAL0642             1.
+    SH060342  COST             196.8   TRAN0603            1.
+    SH060342  BAL0603            -1.   BAL0642             1.
+    SH060442  COST            239.85   TRAN0604            1.
+    SH060442  BAL0604            -1.   BAL0642             1.
+    SH060542  COST            444.03   TRAN0605            1.
+    SH060542  BAL0605            -1.   BAL0642             1.
+    SH060642  COST            198.03   TRAN0606            1.
+    SH060642  BAL0652            -1.   BAL0642             1.
+    SH060842  COST            186.96   TRAN0608            1.
+    SH060842  BAL0683            -1.   BAL0642             1.
+    SH060143  COST            195.57   TRAN0601            1.
+    SH060143  BAL0601            -1.   BAL0643             1.
+    SH060243  COST            485.85   TRAN0602            1.
+    SH060243  BAL0602            -1.   BAL0643             1.
+    SH060343  COST             30.75   TRAN0603            1.
+    SH060343  BAL0603            -1.   BAL0643             1.
+    SH060443  COST            364.08   TRAN0604            1.
+    SH060443  BAL0604            -1.   BAL0643             1.
+    SH060543  COST            317.34   TRAN0605            1.
+    SH060543  BAL0605            -1.   BAL0643             1.
+    SH060643  COST              123.   TRAN0606            1.
+    SH060643  BAL0652            -1.   BAL0643             1.
+    SH060743  COST            296.43   TRAN0607            1.
+    SH060743  BAL0664            -1.   BAL0643             1.
+    SH060843  COST            333.33   TRAN0608            1.
+    SH060843  BAL0683            -1.   BAL0643             1.
+    SH060144  COST            195.57   TRAN0601            1.
+    SH060144  BAL0601            -1.   BAL0644             1.
+    SH060244  COST            466.17   TRAN0602            1.
+    SH060244  BAL0602            -1.   BAL0644             1.
+    SH060344  COST            157.44   TRAN0603            1.
+    SH060344  BAL0603            -1.   BAL0644             1.
+    SH060444  COST            383.76   TRAN0604            1.
+    SH060444  BAL0604            -1.   BAL0644             1.
+    SH060544  COST             381.3   TRAN0605            1.
+    SH060544  BAL0605            -1.   BAL0644             1.
+    SH060644  COST            109.47   TRAN0606            1.
+    SH060644  BAL0652            -1.   BAL0644             1.
+    SH060844  COST            366.54   TRAN0608            1.
+    SH060844  BAL0683            -1.   BAL0644             1.
+    SH060145  COST            211.56   TRAN0601            1.
+    SH060145  BAL0601            -1.   BAL0645             1.
+    SH060245  COST            536.28   TRAN0602            1.
+    SH060245  BAL0602            -1.   BAL0645             1.
+    SH060345  COST            198.03   TRAN0603            1.
+    SH060345  BAL0603            -1.   BAL0645             1.
+    SH060445  COST            359.16   TRAN0604            1.
+    SH060445  BAL0604            -1.   BAL0645             1.
+    SH060545  COST            287.82   TRAN0605            1.
+    SH060545  BAL0605            -1.   BAL0645             1.
+    SH060645  COST            234.93   TRAN0606            1.
+    SH060645  BAL0652            -1.   BAL0645             1.
+    SH060745  COST            242.31   TRAN0607            1.
+    SH060745  BAL0664            -1.   BAL0645             1.
+    SH060845  COST            375.15   TRAN0608            1.
+    SH060845  BAL0683            -1.   BAL0645             1.
+    SH060146  COST            301.35   TRAN0601            1.
+    SH060146  BAL0601            -1.   BAL0646             1.
+    SH060246  COST            335.79   TRAN0602            1.
+    SH060246  BAL0602            -1.   BAL0646             1.
+    SH060346  COST            271.83   TRAN0603            1.
+    SH060346  BAL0603            -1.   BAL0646             1.
+    SH060446  COST            549.81   TRAN0604            1.
+    SH060446  BAL0604            -1.   BAL0646             1.
+    SH060546  COST             528.9   TRAN0605            1.
+    SH060546  BAL0605            -1.   BAL0646             1.
+    SH060646  COST            316.11   TRAN0606            1.
+    SH060646  BAL0652            -1.   BAL0646             1.
+    SH060846  COST            551.04   TRAN0608            1.
+    SH060846  BAL0683            -1.   BAL0646             1.
+    SH060147  COST             135.3   TRAN0601            1.
+    SH060147  BAL0601            -1.   BAL0647             1.
+    SH060247  COST            458.79   TRAN0602            1.
+    SH060247  BAL0602            -1.   BAL0647             1.
+    SH060347  COST            195.57   TRAN0603            1.
+    SH060347  BAL0603            -1.   BAL0647             1.
+    SH060447  COST            337.02   TRAN0604            1.
+    SH060447  BAL0604            -1.   BAL0647             1.
+    SH060547  COST            286.59   TRAN0605            1.
+    SH060547  BAL0605            -1.   BAL0647             1.
+    SH060647  COST            178.35   TRAN0606            1.
+    SH060647  BAL0652            -1.   BAL0647             1.
+    SH060847  COST            300.12   TRAN0608            1.
+    SH060847  BAL0683            -1.   BAL0647             1.
+    SH060148  COST            116.85   TRAN0601            1.
+    SH060148  BAL0601            -1.   BAL0648             1.
+    SH060248  COST            416.97   TRAN0602            1.
+    SH060248  BAL0602            -1.   BAL0648             1.
+    SH060348  COST            168.51   TRAN0603            1.
+    SH060348  BAL0603            -1.   BAL0648             1.
+    SH060448  COST             282.9   TRAN0604            1.
+    SH060448  BAL0604            -1.   BAL0648             1.
+    SH060548  COST            303.81   TRAN0605            1.
+    SH060548  BAL0605            -1.   BAL0648             1.
+    SH060648  COST            141.45   TRAN0606            1.
+    SH060648  BAL0652            -1.   BAL0648             1.
+    SH060848  COST            239.85   TRAN0608            1.
+    SH060848  BAL0683            -1.   BAL0648             1.
+    SH060149  COST            404.67   TRAN0601            1.
+    SH060149  BAL0601            -1.   BAL0649             1.
+    SH060249  COST            658.05   TRAN0602            1.
+    SH060249  BAL0602            -1.   BAL0649             1.
+    SH060349  COST            408.36   TRAN0603            1.
+    SH060349  BAL0603            -1.   BAL0649             1.
+    SH060449  COST            468.63   TRAN0604            1.
+    SH060449  BAL0604            -1.   BAL0649             1.
+    SH060549  COST            186.96   TRAN0605            1.
+    SH060549  BAL0605            -1.   BAL0649             1.
+    SH060649  COST            415.74   TRAN0606            1.
+    SH060649  BAL0652            -1.   BAL0649             1.
+    SH060749  COST            164.82   TRAN0607            1.
+    SH060749  BAL0664            -1.   BAL0649             1.
+    SH060849  COST            501.84   TRAN0608            1.
+    SH060849  BAL0683            -1.   BAL0649             1.
+    SH060150  COST            296.43   TRAN0601            1.
+    SH060150  BAL0601            -1.   BAL0650             1.
+    SH060250  COST            752.76   TRAN0602            1.
+    SH060250  BAL0602            -1.   BAL0650             1.
+    SH060350  COST            302.58   TRAN0603            1.
+    SH060350  BAL0603            -1.   BAL0650             1.
+    SH060450  COST            448.95   TRAN0604            1.
+    SH060450  BAL0604            -1.   BAL0650             1.
+    SH060550  COST            289.05   TRAN0605            1.
+    SH060550  BAL0605            -1.   BAL0650             1.
+    SH060750  COST            168.51   TRAN0607            1.
+    SH060750  BAL0664            -1.   BAL0650             1.
+    SH060850  COST            499.38   TRAN0608            1.
+    SH060850  BAL0683            -1.   BAL0650             1.
+    SH060151  COST            408.36   TRAN0601            1.
+    SH060151  BAL0601            -1.   BAL0651             1.
+    SH060251  COST             676.5   TRAN0602            1.
+    SH060251  BAL0602            -1.   BAL0651             1.
+    SH060351  COST            419.43   TRAN0603            1.
+    SH060351  BAL0603            -1.   BAL0651             1.
+    SH060451  COST            415.74   TRAN0604            1.
+    SH060451  BAL0604            -1.   BAL0651             1.
+    SH060551  COST            151.29   TRAN0605            1.
+    SH060551  BAL0605            -1.   BAL0651             1.
+    SH060751  COST            121.77   TRAN0607            1.
+    SH060751  BAL0664            -1.   BAL0651             1.
+    SH060851  COST            526.44   TRAN0608            1.
+    SH060851  BAL0683            -1.   BAL0651             1.
+    SH060152  COST            137.76   TRAN0601            1.
+    SH060152  BAL0601            -1.   BAL0652             1.
+    SH060252  COST              369.   TRAN0602            1.
+    SH060252  BAL0602            -1.   BAL0652             1.
+    SH060352  COST            100.86   TRAN0603            1.
+    SH060352  BAL0603            -1.   BAL0652             1.
+    SH060452  COST            396.06   TRAN0604            1.
+    SH060452  BAL0604            -1.   BAL0652             1.
+    SH060552  COST            362.85   TRAN0605            1.
+    SH060552  BAL0605            -1.   BAL0652             1.
+    SH060852  COST            311.19   TRAN0608            1.
+    SH060852  BAL0683            -1.   BAL0652             1.
+    SH060153  COST            441.57   TRAN0601            1.
+    SH060153  BAL0601            -1.   BAL0653             1.
+    SH060253  COST            782.28   TRAN0602            1.
+    SH060253  BAL0602            -1.   BAL0653             1.
+    SH060353  COST            399.75   TRAN0603            1.
+    SH060353  BAL0603            -1.   BAL0653             1.
+    SH060453  COST            506.76   TRAN0604            1.
+    SH060453  BAL0604            -1.   BAL0653             1.
+    SH060553  COST            226.32   TRAN0605            1.
+    SH060553  BAL0605            -1.   BAL0653             1.
+    SH060653  COST            441.57   TRAN0606            1.
+    SH060653  BAL0652            -1.   BAL0653             1.
+    SH060753  COST            179.58   TRAN0607            1.
+    SH060753  BAL0664            -1.   BAL0653             1.
+    SH060853  COST            495.69   TRAN0608            1.
+    SH060853  BAL0683            -1.   BAL0653             1.
+    SH060154  COST            227.55   TRAN0601            1.
+    SH060154  BAL0601            -1.   BAL0654             1.
+    SH060254  COST            547.35   TRAN0602            1.
+    SH060254  BAL0602            -1.   BAL0654             1.
+    SH060354  COST            266.91   TRAN0603            1.
+    SH060354  BAL0603            -1.   BAL0654             1.
+    SH060454  COST            421.89   TRAN0604            1.
+    SH060454  BAL0604            -1.   BAL0654             1.
+    SH060554  COST            261.99   TRAN0605            1.
+    SH060554  BAL0605            -1.   BAL0654             1.
+    SH060654  COST            249.69   TRAN0606            1.
+    SH060654  BAL0652            -1.   BAL0654             1.
+    SH060854  COST            494.46   TRAN0608            1.
+    SH060854  BAL0683            -1.   BAL0654             1.
+    SH060155  COST            341.94   TRAN0601            1.
+    SH060155  BAL0601            -1.   BAL0655             1.
+    SH060255  COST            589.17   TRAN0602            1.
+    SH060255  BAL0602            -1.   BAL0655             1.
+    SH060355  COST            345.63   TRAN0603            1.
+    SH060355  BAL0603            -1.   BAL0655             1.
+    SH060455  COST            361.62   TRAN0604            1.
+    SH060455  BAL0604            -1.   BAL0655             1.
+    SH060555  COST            189.42   TRAN0605            1.
+    SH060555  BAL0605            -1.   BAL0655             1.
+    SH060655  COST             356.7   TRAN0606            1.
+    SH060655  BAL0652            -1.   BAL0655             1.
+    SH060755  COST            131.61   TRAN0607            1.
+    SH060755  BAL0664            -1.   BAL0655             1.
+    SH060855  COST            361.62   TRAN0608            1.
+    SH060855  BAL0683            -1.   BAL0655             1.
+    SH060156  COST             479.7   TRAN0601            1.
+    SH060156  BAL0601            -1.   BAL0656             1.
+    SH060256  COST            712.17   TRAN0602            1.
+    SH060256  BAL0602            -1.   BAL0656             1.
+    SH060356  COST            375.15   TRAN0603            1.
+    SH060356  BAL0603            -1.   BAL0656             1.
+    SH060456  COST            448.95   TRAN0604            1.
+    SH060456  BAL0604            -1.   BAL0656             1.
+    SH060556  COST            167.28   TRAN0605            1.
+    SH060556  BAL0605            -1.   BAL0656             1.
+    SH060656  COST            416.97   TRAN0606            1.
+    SH060656  BAL0652            -1.   BAL0656             1.
+    SH060756  COST            150.06   TRAN0607            1.
+    SH060756  BAL0664            -1.   BAL0656             1.
+    SH060856  COST            439.11   TRAN0608            1.
+    SH060856  BAL0683            -1.   BAL0656             1.
+    SH060157  COST            321.03   TRAN0601            1.
+    SH060157  BAL0601            -1.   BAL0657             1.
+    SH060257  COST             639.6   TRAN0602            1.
+    SH060257  BAL0602            -1.   BAL0657             1.
+    SH060357  COST             356.7   TRAN0603            1.
+    SH060357  BAL0603            -1.   BAL0657             1.
+    SH060457  COST            287.82   TRAN0604            1.
+    SH060457  BAL0604            -1.   BAL0657             1.
+    SH060557  COST            206.64   TRAN0605            1.
+    SH060557  BAL0605            -1.   BAL0657             1.
+    SH060657  COST            392.37   TRAN0606            1.
+    SH060657  BAL0652            -1.   BAL0657             1.
+    SH060757  COST            182.04   TRAN0607            1.
+    SH060757  BAL0664            -1.   BAL0657             1.
+    SH060857  COST            284.13   TRAN0608            1.
+    SH060857  BAL0683            -1.   BAL0657             1.
+    SH060158  COST            361.62   TRAN0601            1.
+    SH060158  BAL0601            -1.   BAL0658             1.
+    SH060258  COST            640.83   TRAN0602            1.
+    SH060258  BAL0602            -1.   BAL0658             1.
+    SH060358  COST            341.94   TRAN0603            1.
+    SH060358  BAL0603            -1.   BAL0658             1.
+    SH060458  COST            421.89   TRAN0604            1.
+    SH060458  BAL0604            -1.   BAL0658             1.
+    SH060558  COST             25.83   TRAN0605            1.
+    SH060558  BAL0605            -1.   BAL0658             1.
+    SH060658  COST            400.98   TRAN0606            1.
+    SH060658  BAL0652            -1.   BAL0658             1.
+    SH060758  COST             83.64   TRAN0607            1.
+    SH060758  BAL0664            -1.   BAL0658             1.
+    SH060858  COST            312.42   TRAN0608            1.
+    SH060858  BAL0683            -1.   BAL0658             1.
+    SH060159  COST            253.38   TRAN0601            1.
+    SH060159  BAL0601            -1.   BAL0659             1.
+    SH060259  COST            612.54   TRAN0602            1.
+    SH060259  BAL0602            -1.   BAL0659             1.
+    SH060359  COST            292.74   TRAN0603            1.
+    SH060359  BAL0603            -1.   BAL0659             1.
+    SH060459  COST            300.12   TRAN0604            1.
+    SH060459  BAL0604            -1.   BAL0659             1.
+    SH060559  COST            195.57   TRAN0605            1.
+    SH060559  BAL0605            -1.   BAL0659             1.
+    SH060659  COST            365.31   TRAN0606            1.
+    SH060659  BAL0652            -1.   BAL0659             1.
+    SH060759  COST            129.15   TRAN0607            1.
+    SH060759  BAL0664            -1.   BAL0659             1.
+    SH060859  COST            313.65   TRAN0608            1.
+    SH060859  BAL0683            -1.   BAL0659             1.
+    SH060160  COST            321.03   TRAN0601            1.
+    SH060160  BAL0601            -1.   BAL0660             1.
+    SH060260  COST             676.5   TRAN0602            1.
+    SH060260  BAL0602            -1.   BAL0660             1.
+    SH060360  COST            348.09   TRAN0603            1.
+    SH060360  BAL0603            -1.   BAL0660             1.
+    SH060460  COST            383.76   TRAN0604            1.
+    SH060460  BAL0604            -1.   BAL0660             1.
+    SH060560  COST            166.05   TRAN0605            1.
+    SH060560  BAL0605            -1.   BAL0660             1.
+    SH060660  COST            397.29   TRAN0606            1.
+    SH060660  BAL0652            -1.   BAL0660             1.
+    SH060760  COST            108.24   TRAN0607            1.
+    SH060760  BAL0664            -1.   BAL0660             1.
+    SH060860  COST            367.77   TRAN0608            1.
+    SH060860  BAL0683            -1.   BAL0660             1.
+    SH060163  COST            327.18   TRAN0601            1.
+    SH060163  BAL0601            -1.   BAL0663             1.
+    SH060263  COST            607.62   TRAN0602            1.
+    SH060263  BAL0602            -1.   BAL0663             1.
+    SH060363  COST            353.01   TRAN0603            1.
+    SH060363  BAL0603            -1.   BAL0663             1.
+    SH060463  COST            453.87   TRAN0604            1.
+    SH060463  BAL0604            -1.   BAL0663             1.
+    SH060563  COST            186.96   TRAN0605            1.
+    SH060563  BAL0605            -1.   BAL0663             1.
+    SH060663  COST            387.45   TRAN0606            1.
+    SH060663  BAL0652            -1.   BAL0663             1.
+    SH060763  COST            152.52   TRAN0607            1.
+    SH060763  BAL0664            -1.   BAL0663             1.
+    SH060863  COST              492.   TRAN0608            1.
+    SH060863  BAL0683            -1.   BAL0663             1.
+    SH060164  COST            244.77   TRAN0601            1.
+    SH060164  BAL0601            -1.   BAL0664             1.
+    SH060264  COST            646.98   TRAN0602            1.
+    SH060264  BAL0602            -1.   BAL0664             1.
+    SH060364  COST            274.29   TRAN0603            1.
+    SH060364  BAL0603            -1.   BAL0664             1.
+    SH060464  COST            413.28   TRAN0604            1.
+    SH060464  BAL0604            -1.   BAL0664             1.
+    SH060564  COST             71.34   TRAN0605            1.
+    SH060564  BAL0605            -1.   BAL0664             1.
+    SH060664  COST            389.91   TRAN0606            1.
+    SH060664  BAL0652            -1.   BAL0664             1.
+    SH060864  COST             307.5   TRAN0608            1.
+    SH060864  BAL0683            -1.   BAL0664             1.
+    SH060165  COST            531.36   TRAN0601            1.
+    SH060165  BAL0601            -1.   BAL0665             1.
+    SH060265  COST            377.61   TRAN0602            1.
+    SH060265  BAL0602            -1.   BAL0665             1.
+    SH060365  COST            621.15   TRAN0603            1.
+    SH060365  BAL0603            -1.   BAL0665             1.
+    SH060465  COST            477.24   TRAN0604            1.
+    SH060465  BAL0604            -1.   BAL0665             1.
+    SH060565  COST            742.92   TRAN0605            1.
+    SH060565  BAL0605            -1.   BAL0665             1.
+    SH060865  COST            510.45   TRAN0608            1.
+    SH060865  BAL0683            -1.   BAL0665             1.
+    SH060166  COST             688.8   TRAN0601            1.
+    SH060166  BAL0601            -1.   BAL0666             1.
+    SH060266  COST            318.57   TRAN0602            1.
+    SH060266  BAL0602            -1.   BAL0666             1.
+    SH060366  COST            710.94   TRAN0603            1.
+    SH060366  BAL0603            -1.   BAL0666             1.
+    SH060466  COST            683.88   TRAN0604            1.
+    SH060466  BAL0604            -1.   BAL0666             1.
+    SH060566  COST             873.3   TRAN0605            1.
+    SH060566  BAL0605            -1.   BAL0666             1.
+    SH060866  COST             688.8   TRAN0608            1.
+    SH060866  BAL0683            -1.   BAL0666             1.
+    SH060167  COST            522.75   TRAN0601            1.
+    SH060167  BAL0601            -1.   BAL0667             1.
+    SH060267  COST            285.36   TRAN0602            1.
+    SH060267  BAL0602            -1.   BAL0667             1.
+    SH060367  COST            606.39   TRAN0603            1.
+    SH060367  BAL0603            -1.   BAL0667             1.
+    SH060467  COST            562.11   TRAN0604            1.
+    SH060467  BAL0604            -1.   BAL0667             1.
+    SH060567  COST            742.92   TRAN0605            1.
+    SH060567  BAL0605            -1.   BAL0667             1.
+    SH060867  COST            563.34   TRAN0608            1.
+    SH060867  BAL0683            -1.   BAL0667             1.
+    SH060168  COST            730.62   TRAN0601            1.
+    SH060168  BAL0601            -1.   BAL0668             1.
+    SH060268  COST              492.   TRAN0602            1.
+    SH060268  BAL0602            -1.   BAL0668             1.
+    SH060368  COST             688.8   TRAN0603            1.
+    SH060368  BAL0603            -1.   BAL0668             1.
+    SH060468  COST            863.46   TRAN0604            1.
+    SH060468  BAL0604            -1.   BAL0668             1.
+    SH060568  COST           1163.58   TRAN0605            1.
+    SH060568  BAL0605            -1.   BAL0668             1.
+    SH060868  COST            923.73   TRAN0608            1.
+    SH060868  BAL0683            -1.   BAL0668             1.
+    SH060169  COST            662.97   TRAN0601            1.
+    SH060169  BAL0601            -1.   BAL0669             1.
+    SH060269  COST            271.83   TRAN0602            1.
+    SH060269  BAL0602            -1.   BAL0669             1.
+    SH060369  COST             627.3   TRAN0603            1.
+    SH060369  BAL0603            -1.   BAL0669             1.
+    SH060469  COST            765.06   TRAN0604            1.
+    SH060469  BAL0604            -1.   BAL0669             1.
+    SH060569  COST            794.58   TRAN0605            1.
+    SH060569  BAL0605            -1.   BAL0669             1.
+    SH060869  COST            809.34   TRAN0608            1.
+    SH060869  BAL0683            -1.   BAL0669             1.
+    SH060171  COST             541.2   TRAN0601            1.
+    SH060171  BAL0601            -1.   BAL0671             1.
+    SH060371  COST            644.52   TRAN0603            1.
+    SH060371  BAL0603            -1.   BAL0671             1.
+    SH060471  COST            640.83   TRAN0604            1.
+    SH060471  BAL0604            -1.   BAL0671             1.
+    SH060571  COST            714.63   TRAN0605            1.
+    SH060571  BAL0605            -1.   BAL0671             1.
+    SH060671  COST            480.93   TRAN0606            1.
+    SH060671  BAL0652            -1.   BAL0671             1.
+    SH060771  COST            865.92   TRAN0607            1.
+    SH060771  BAL0664            -1.   BAL0671             1.
+    SH060871  COST            655.59   TRAN0608            1.
+    SH060871  BAL0683            -1.   BAL0671             1.
+    SH060172  COST            722.01   TRAN0601            1.
+    SH060172  BAL0601            -1.   BAL0672             1.
+    SH060272  COST            667.89   TRAN0602            1.
+    SH060272  BAL0602            -1.   BAL0672             1.
+    SH060372  COST            758.91   TRAN0603            1.
+    SH060372  BAL0603            -1.   BAL0672             1.
+    SH060472  COST             701.1   TRAN0604            1.
+    SH060472  BAL0604            -1.   BAL0672             1.
+    SH060572  COST            938.49   TRAN0605            1.
+    SH060572  BAL0605            -1.   BAL0672             1.
+    SH060872  COST             701.1   TRAN0608            1.
+    SH060872  BAL0683            -1.   BAL0672             1.
+    SH060173  COST             479.7   TRAN0601            1.
+    SH060173  BAL0601            -1.   BAL0673             1.
+    SH060273  COST            448.95   TRAN0602            1.
+    SH060273  BAL0602            -1.   BAL0673             1.
+    SH060373  COST            415.74   TRAN0603            1.
+    SH060373  BAL0603            -1.   BAL0673             1.
+    SH060473  COST            562.11   TRAN0604            1.
+    SH060473  BAL0604            -1.   BAL0673             1.
+    SH060573  COST            693.72   TRAN0605            1.
+    SH060573  BAL0605            -1.   BAL0673             1.
+    SH060673  COST            375.15   TRAN0606            1.
+    SH060673  BAL0652            -1.   BAL0673             1.
+    SH060873  COST            619.92   TRAN0608            1.
+    SH060873  BAL0683            -1.   BAL0673             1.
+    SH060174  COST            674.04   TRAN0601            1.
+    SH060174  BAL0601            -1.   BAL0674             1.
+    SH060274  COST             258.3   TRAN0602            1.
+    SH060274  BAL0602            -1.   BAL0674             1.
+    SH060374  COST             701.1   TRAN0603            1.
+    SH060374  BAL0603            -1.   BAL0674             1.
+    SH060474  COST            783.51   TRAN0604            1.
+    SH060474  BAL0604            -1.   BAL0674             1.
+    SH060574  COST            901.59   TRAN0605            1.
+    SH060574  BAL0605            -1.   BAL0674             1.
+    SH060874  COST            761.37   TRAN0608            1.
+    SH060874  BAL0683            -1.   BAL0674             1.
+    SH060275  COST            681.42   TRAN0602            1.
+    SH060275  BAL0602            -1.   BAL0675             1.
+    SH060176  COST            568.26   TRAN0601            1.
+    SH060176  BAL0601            -1.   BAL0676             1.
+    SH060276  COST            493.23   TRAN0602            1.
+    SH060276  BAL0602            -1.   BAL0676             1.
+    SH060376  COST            495.69   TRAN0603            1.
+    SH060376  BAL0603            -1.   BAL0676             1.
+    SH060476  COST             774.9   TRAN0604            1.
+    SH060476  BAL0604            -1.   BAL0676             1.
+    SH060576  COST             774.9   TRAN0605            1.
+    SH060576  BAL0605            -1.   BAL0676             1.
+    SH060676  COST            468.63   TRAN0606            1.
+    SH060676  BAL0652            -1.   BAL0676             1.
+    SH060876  COST            955.71   TRAN0608            1.
+    SH060876  BAL0683            -1.   BAL0676             1.
+    SH060177  COST            535.05   TRAN0601            1.
+    SH060177  BAL0601            -1.   BAL0677             1.
+    SH060277  COST            334.56   TRAN0602            1.
+    SH060277  BAL0602            -1.   BAL0677             1.
+    SH060377  COST            567.03   TRAN0603            1.
+    SH060377  BAL0603            -1.   BAL0677             1.
+    SH060477  COST            493.23   TRAN0604            1.
+    SH060477  BAL0604            -1.   BAL0677             1.
+    SH060577  COST             688.8   TRAN0605            1.
+    SH060577  BAL0605            -1.   BAL0677             1.
+    SH060877  COST             393.6   TRAN0608            1.
+    SH060877  BAL0683            -1.   BAL0677             1.
+    SH060178  COST            936.03   TRAN0601            1.
+    SH060178  BAL0601            -1.   BAL0678             1.
+    SH060278  COST            543.66   TRAN0602            1.
+    SH060278  BAL0602            -1.   BAL0678             1.
+    SH060378  COST            963.09   TRAN0603            1.
+    SH060378  BAL0603            -1.   BAL0678             1.
+    SH060478  COST            842.55   TRAN0604            1.
+    SH060478  BAL0604            -1.   BAL0678             1.
+    SH060578  COST           1081.17   TRAN0605            1.
+    SH060578  BAL0605            -1.   BAL0678             1.
+    SH060878  COST            942.18   TRAN0608            1.
+    SH060878  BAL0683            -1.   BAL0678             1.
+    SH060179  COST            879.45   TRAN0601            1.
+    SH060179  BAL0601            -1.   BAL0679             1.
+    SH060279  COST            330.87   TRAN0602            1.
+    SH060279  BAL0602            -1.   BAL0679             1.
+    SH060379  COST            849.93   TRAN0603            1.
+    SH060379  BAL0603            -1.   BAL0679             1.
+    SH060479  COST             885.6   TRAN0604            1.
+    SH060479  BAL0604            -1.   BAL0679             1.
+    SH060879  COST            868.38   TRAN0608            1.
+    SH060879  BAL0683            -1.   BAL0679             1.
+    SH060180  COST            389.91   TRAN0601            1.
+    SH060180  BAL0601            -1.   BAL0680             1.
+    SH060280  COST            485.85   TRAN0602            1.
+    SH060280  BAL0602            -1.   BAL0680             1.
+    SH060380  COST            537.51   TRAN0603            1.
+    SH060380  BAL0603            -1.   BAL0680             1.
+    SH060480  COST            460.02   TRAN0604            1.
+    SH060480  BAL0604            -1.   BAL0680             1.
+    SH060580  COST            621.15   TRAN0605            1.
+    SH060580  BAL0605            -1.   BAL0680             1.
+    SH060880  COST             295.2   TRAN0608            1.
+    SH060880  BAL0683            -1.   BAL0680             1.
+    SH060182  COST            715.86   TRAN0601            1.
+    SH060182  BAL0601            -1.   BAL0682             1.
+    SH060282  COST            404.67   TRAN0602            1.
+    SH060282  BAL0602            -1.   BAL0682             1.
+    SH060382  COST            805.65   TRAN0603            1.
+    SH060382  BAL0603            -1.   BAL0682             1.
+    SH060482  COST            868.38   TRAN0604            1.
+    SH060482  BAL0604            -1.   BAL0682             1.
+    SH060582  COST           1410.81   TRAN0605            1.
+    SH060582  BAL0605            -1.   BAL0682             1.
+    SH060882  COST            963.09   TRAN0608            1.
+    SH060882  BAL0683            -1.   BAL0682             1.
+    SH060183  COST            217.71   TRAN0601            1.
+    SH060183  BAL0601            -1.   BAL0683             1.
+    SH060283  COST             639.6   TRAN0602            1.
+    SH060283  BAL0602            -1.   BAL0683             1.
+    SH060383  COST            334.56   TRAN0603            1.
+    SH060383  BAL0603            -1.   BAL0683             1.
+    SH060483  COST             72.57   TRAN0604            1.
+    SH060483  BAL0604            -1.   BAL0683             1.
+    SH060583  COST            426.81   TRAN0605            1.
+    SH060583  BAL0605            -1.   BAL0683             1.
+    SH060683  COST            305.04   TRAN0606            1.
+    SH060683  BAL0652            -1.   BAL0683             1.
+    SH060184  COST            373.92   TRAN0601            1.
+    SH060184  BAL0601            -1.   BAL0684             1.
+    SH060284  COST            236.16   TRAN0602            1.
+    SH060284  BAL0602            -1.   BAL0684             1.
+    SH060384  COST            447.72   TRAN0603            1.
+    SH060384  BAL0603            -1.   BAL0684             1.
+    SH060484  COST             455.1   TRAN0604            1.
+    SH060484  BAL0604            -1.   BAL0684             1.
+    SH060584  COST             602.7   TRAN0605            1.
+    SH060584  BAL0605            -1.   BAL0684             1.
+    SH060684  COST            375.15   TRAN0606            1.
+    SH060684  BAL0652            -1.   BAL0684             1.
+    SH060884  COST            477.24   TRAN0608            1.
+    SH060884  BAL0683            -1.   BAL0684             1.
+    SH070201  COST            323.73   TRAN0702            1.
+    SH070201  BAL0702            -1.   BAL0701             1.
+    SH070301  COST            124.26   TRAN0703            1.
+    SH070301  BAL0703            -1.   BAL0701             1.
+    SH070401  COST            226.72   TRAN0704            1.
+    SH070401  BAL0704            -1.   BAL0701             1.
+    SH070501  COST            258.33   TRAN0705            1.
+    SH070501  BAL0705            -1.   BAL0701             1.
+    SH070601  COST            137.34   TRAN0706            1.
+    SH070601  BAL0752            -1.   BAL0701             1.
+    SH070801  COST            155.87   TRAN0708            1.
+    SH070801  BAL0783            -1.   BAL0701             1.
+    SH070102  COST            516.66   TRAN0701            1.
+    SH070102  BAL0701            -1.   BAL0702             1.
+    SH070302  COST            454.53   TRAN0703            1.
+    SH070302  BAL0703            -1.   BAL0702             1.
+    SH070402  COST            667.08   TRAN0704            1.
+    SH070402  BAL0704            -1.   BAL0702             1.
+    SH070502  COST            807.69   TRAN0705            1.
+    SH070502  BAL0705            -1.   BAL0702             1.
+    SH070602  COST            412.02   TRAN0706            1.
+    SH070602  BAL0752            -1.   BAL0702             1.
+    SH070802  COST            567.89   TRAN0708            1.
+    SH070802  BAL0783            -1.   BAL0702             1.
+    SH070103  COST            267.05   TRAN0701            1.
+    SH070103  BAL0701            -1.   BAL0703             1.
+    SH070203  COST            516.66   TRAN0702            1.
+    SH070203  BAL0702            -1.   BAL0703             1.
+    SH070403  COST            400.03   TRAN0704            1.
+    SH070403  BAL0704            -1.   BAL0703             1.
+    SH070503  COST            309.56   TRAN0705            1.
+    SH070503  BAL0705            -1.   BAL0703             1.
+    SH070603  COST              98.1   TRAN0706            1.
+    SH070603  BAL0752            -1.   BAL0703             1.
+    SH070803  COST            277.95   TRAN0708            1.
+    SH070803  BAL0783            -1.   BAL0703             1.
+    SH070104  COST            189.66   TRAN0701            1.
+    SH070104  BAL0701            -1.   BAL0704             1.
+    SH070204  COST            548.27   TRAN0702            1.
+    SH070204  BAL0702            -1.   BAL0704             1.
+    SH070304  COST            264.87   TRAN0703            1.
+    SH070304  BAL0703            -1.   BAL0704             1.
+    SH070504  COST            347.71   TRAN0705            1.
+    SH070504  BAL0705            -1.   BAL0704             1.
+    SH070604  COST            267.05   TRAN0706            1.
+    SH070604  BAL0752            -1.   BAL0704             1.
+    SH070704  COST            293.21   TRAN0707            1.
+    SH070704  BAL0764            -1.   BAL0704             1.
+    SH070804  COST             63.22   TRAN0708            1.
+    SH070804  BAL0783            -1.   BAL0704             1.
+    SH070105  COST             294.3   TRAN0701            1.
+    SH070105  BAL0701            -1.   BAL0705             1.
+    SH070205  COST            562.44   TRAN0702            1.
+    SH070205  BAL0702            -1.   BAL0705             1.
+    SH070305  COST            309.56   TRAN0703            1.
+    SH070305  BAL0703            -1.   BAL0705             1.
+    SH070405  COST            310.65   TRAN0704            1.
+    SH070405  BAL0704            -1.   BAL0705             1.
+    SH070605  COST            355.34   TRAN0706            1.
+    SH070605  BAL0752            -1.   BAL0705             1.
+    SH070705  COST            364.06   TRAN0707            1.
+    SH070705  BAL0764            -1.   BAL0705             1.
+    SH070805  COST            295.39   TRAN0708            1.
+    SH070805  BAL0783            -1.   BAL0705             1.
+    SH070106  COST            216.91   TRAN0701            1.
+    SH070106  BAL0701            -1.   BAL0706             1.
+    SH070206  COST            454.53   TRAN0702            1.
+    SH070206  BAL0702            -1.   BAL0706             1.
+    SH070306  COST            232.17   TRAN0703            1.
+    SH070306  BAL0703            -1.   BAL0706             1.
+    SH070406  COST            238.71   TRAN0704            1.
+    SH070406  BAL0704            -1.   BAL0706             1.
+    SH070506  COST            274.68   TRAN0705            1.
+    SH070506  BAL0705            -1.   BAL0706             1.
+    SH070606  COST            224.54   TRAN0706            1.
+    SH070606  BAL0752            -1.   BAL0706             1.
+    SH070706  COST              218.   TRAN0707            1.
+    SH070706  BAL0764            -1.   BAL0706             1.
+    SH070806  COST            164.59   TRAN0708            1.
+    SH070806  BAL0783            -1.   BAL0706             1.
+    SH070107  COST             22.89   TRAN0701            1.
+    SH070107  BAL0701            -1.   BAL0707             1.
+    SH070207  COST            318.28   TRAN0702            1.
+    SH070207  BAL0702            -1.   BAL0707             1.
+    SH070307  COST            135.16   TRAN0703            1.
+    SH070307  BAL0703            -1.   BAL0707             1.
+    SH070407  COST            225.63   TRAN0704            1.
+    SH070407  BAL0704            -1.   BAL0707             1.
+    SH070507  COST            249.61   TRAN0705            1.
+    SH070507  BAL0705            -1.   BAL0707             1.
+    SH070607  COST            136.25   TRAN0706            1.
+    SH070607  BAL0752            -1.   BAL0707             1.
+    SH070707  COST            252.88   TRAN0707            1.
+    SH070707  BAL0764            -1.   BAL0707             1.
+    SH070807  COST            168.95   TRAN0708            1.
+    SH070807  BAL0783            -1.   BAL0707             1.
+    SH070108  COST             71.94   TRAN0701            1.
+    SH070108  BAL0701            -1.   BAL0708             1.
+    SH070208  COST            409.84   TRAN0702            1.
+    SH070208  BAL0702            -1.   BAL0708             1.
+    SH070308  COST            153.69   TRAN0703            1.
+    SH070308  BAL0703            -1.   BAL0708             1.
+    SH070408  COST            269.23   TRAN0704            1.
+    SH070408  BAL0704            -1.   BAL0708             1.
+    SH070508  COST            198.38   TRAN0705            1.
+    SH070508  BAL0705            -1.   BAL0708             1.
+    SH070608  COST            180.94   TRAN0706            1.
+    SH070608  BAL0752            -1.   BAL0708             1.
+    SH070808  COST            203.83   TRAN0708            1.
+    SH070808  BAL0783            -1.   BAL0708             1.
+    SH070109  COST            150.42   TRAN0701            1.
+    SH070109  BAL0701            -1.   BAL0709             1.
+    SH070209  COST            417.47   TRAN0702            1.
+    SH070209  BAL0702            -1.   BAL0709             1.
+    SH070309  COST            183.12   TRAN0703            1.
+    SH070309  BAL0703            -1.   BAL0709             1.
+    SH070409  COST            275.77   TRAN0704            1.
+    SH070409  BAL0704            -1.   BAL0709             1.
+    SH070509  COST            260.51   TRAN0705            1.
+    SH070509  BAL0705            -1.   BAL0709             1.
+    SH070709  COST            213.64   TRAN0707            1.
+    SH070709  BAL0764            -1.   BAL0709             1.
+    SH070809  COST            211.46   TRAN0708            1.
+    SH070809  BAL0783            -1.   BAL0709             1.
+    SH070110  COST            269.23   TRAN0701            1.
+    SH070110  BAL0701            -1.   BAL0710             1.
+    SH070210  COST            172.22   TRAN0702            1.
+    SH070210  BAL0702            -1.   BAL0710             1.
+    SH070310  COST             261.6   TRAN0703            1.
+    SH070310  BAL0703            -1.   BAL0710             1.
+    SH070410  COST            391.31   TRAN0704            1.
+    SH070410  BAL0704            -1.   BAL0710             1.
+    SH070510  COST            419.65   TRAN0705            1.
+    SH070510  BAL0705            -1.   BAL0710             1.
+    SH070610  COST            245.25   TRAN0706            1.
+    SH070610  BAL0752            -1.   BAL0710             1.
+    SH070810  COST            332.45   TRAN0708            1.
+    SH070810  BAL0783            -1.   BAL0710             1.
+    SH070111  COST            115.54   TRAN0701            1.
+    SH070111  BAL0701            -1.   BAL0711             1.
+    SH070211  COST            539.55   TRAN0702            1.
+    SH070211  BAL0702            -1.   BAL0711             1.
+    SH070311  COST            270.32   TRAN0703            1.
+    SH070311  BAL0703            -1.   BAL0711             1.
+    SH070411  COST            151.51   TRAN0704            1.
+    SH070411  BAL0704            -1.   BAL0711             1.
+    SH070511  COST            371.69   TRAN0705            1.
+    SH070511  BAL0705            -1.   BAL0711             1.
+    SH070611  COST            213.64   TRAN0706            1.
+    SH070611  BAL0752            -1.   BAL0711             1.
+    SH070811  COST            111.18   TRAN0708            1.
+    SH070811  BAL0783            -1.   BAL0711             1.
+    SH070112  COST             95.92   TRAN0701            1.
+    SH070112  BAL0701            -1.   BAL0712             1.
+    SH070212  COST            369.51   TRAN0702            1.
+    SH070212  BAL0702            -1.   BAL0712             1.
+    SH070312  COST            159.14   TRAN0703            1.
+    SH070312  BAL0703            -1.   BAL0712             1.
+    SH070412  COST              218.   TRAN0704            1.
+    SH070412  BAL0704            -1.   BAL0712             1.
+    SH070512  COST            291.03   TRAN0705            1.
+    SH070512  BAL0705            -1.   BAL0712             1.
+    SH070612  COST            158.05   TRAN0706            1.
+    SH070612  BAL0752            -1.   BAL0712             1.
+    SH070812  COST            159.14   TRAN0708            1.
+    SH070812  BAL0783            -1.   BAL0712             1.
+    SH070114  COST            154.78   TRAN0701            1.
+    SH070114  BAL0701            -1.   BAL0714             1.
+    SH070214  COST            449.08   TRAN0702            1.
+    SH070214  BAL0702            -1.   BAL0714             1.
+    SH070314  COST            213.64   TRAN0703            1.
+    SH070314  BAL0703            -1.   BAL0714             1.
+    SH070414  COST            216.91   TRAN0704            1.
+    SH070414  BAL0704            -1.   BAL0714             1.
+    SH070514  COST            383.68   TRAN0705            1.
+    SH070514  BAL0705            -1.   BAL0714             1.
+    SH070614  COST            204.92   TRAN0706            1.
+    SH070614  BAL0752            -1.   BAL0714             1.
+    SH070814  COST            137.34   TRAN0708            1.
+    SH070814  BAL0783            -1.   BAL0714             1.
+    SH070115  COST            330.27   TRAN0701            1.
+    SH070115  BAL0701            -1.   BAL0715             1.
+    SH070215  COST            173.31   TRAN0702            1.
+    SH070215  BAL0702            -1.   BAL0715             1.
+    SH070315  COST            255.06   TRAN0703            1.
+    SH070315  BAL0703            -1.   BAL0715             1.
+    SH070415  COST            518.84   TRAN0704            1.
+    SH070415  BAL0704            -1.   BAL0715             1.
+    SH070515  COST            433.82   TRAN0705            1.
+    SH070515  BAL0705            -1.   BAL0715             1.
+    SH070615  COST            204.92   TRAN0706            1.
+    SH070615  BAL0752            -1.   BAL0715             1.
+    SH070815  COST            406.57   TRAN0708            1.
+    SH070815  BAL0783            -1.   BAL0715             1.
+    SH070116  COST            172.22   TRAN0701            1.
+    SH070116  BAL0701            -1.   BAL0716             1.
+    SH070216  COST             305.2   TRAN0702            1.
+    SH070216  BAL0702            -1.   BAL0716             1.
+    SH070316  COST            247.43   TRAN0703            1.
+    SH070316  BAL0703            -1.   BAL0716             1.
+    SH070416  COST            312.83   TRAN0704            1.
+    SH070416  BAL0704            -1.   BAL0716             1.
+    SH070516  COST            347.71   TRAN0705            1.
+    SH070516  BAL0705            -1.   BAL0716             1.
+    SH070616  COST            142.79   TRAN0706            1.
+    SH070616  BAL0752            -1.   BAL0716             1.
+    SH070816  COST            223.45   TRAN0708            1.
+    SH070816  BAL0783            -1.   BAL0716             1.
+    SH070117  COST            164.59   TRAN0701            1.
+    SH070117  BAL0701            -1.   BAL0717             1.
+    SH070217  COST            550.45   TRAN0702            1.
+    SH070217  BAL0702            -1.   BAL0717             1.
+    SH070317  COST            298.66   TRAN0703            1.
+    SH070317  BAL0703            -1.   BAL0717             1.
+    SH070417  COST             62.13   TRAN0704            1.
+    SH070417  BAL0704            -1.   BAL0717             1.
+    SH070517  COST            324.82   TRAN0705            1.
+    SH070517  BAL0705            -1.   BAL0717             1.
+    SH070717  COST            321.55   TRAN0707            1.
+    SH070717  BAL0764            -1.   BAL0717             1.
+    SH070817  COST             29.43   TRAN0708            1.
+    SH070817  BAL0783            -1.   BAL0717             1.
+    SH070118  COST            190.75   TRAN0701            1.
+    SH070118  BAL0701            -1.   BAL0718             1.
+    SH070218  COST            393.49   TRAN0702            1.
+    SH070218  BAL0702            -1.   BAL0718             1.
+    SH070318  COST             294.3   TRAN0703            1.
+    SH070318  BAL0703            -1.   BAL0718             1.
+    SH070418  COST            167.86   TRAN0704            1.
+    SH070418  BAL0704            -1.   BAL0718             1.
+    SH070518  COST            443.63   TRAN0705            1.
+    SH070518  BAL0705            -1.   BAL0718             1.
+    SH070618  COST            383.68   TRAN0706            1.
+    SH070618  BAL0752            -1.   BAL0718             1.
+    SH070818  COST            112.27   TRAN0708            1.
+    SH070818  BAL0783            -1.   BAL0718             1.
+    SH070119  COST            270.32   TRAN0701            1.
+    SH070119  BAL0701            -1.   BAL0719             1.
+    SH070219  COST            748.83   TRAN0702            1.
+    SH070219  BAL0702            -1.   BAL0719             1.
+    SH070319  COST            345.53   TRAN0703            1.
+    SH070319  BAL0703            -1.   BAL0719             1.
+    SH070419  COST            173.31   TRAN0704            1.
+    SH070419  BAL0704            -1.   BAL0719             1.
+    SH070519  COST            226.72   TRAN0705            1.
+    SH070519  BAL0705            -1.   BAL0719             1.
+    SH070619  COST            376.05   TRAN0706            1.
+    SH070619  BAL0752            -1.   BAL0719             1.
+    SH070819  COST            107.91   TRAN0708            1.
+    SH070819  BAL0783            -1.   BAL0719             1.
+    SH070120  COST            223.45   TRAN0701            1.
+    SH070120  BAL0701            -1.   BAL0720             1.
+    SH070220  COST            744.47   TRAN0702            1.
+    SH070220  BAL0702            -1.   BAL0720             1.
+    SH070320  COST            323.73   TRAN0703            1.
+    SH070320  BAL0703            -1.   BAL0720             1.
+    SH070420  COST            123.17   TRAN0704            1.
+    SH070420  BAL0704            -1.   BAL0720             1.
+    SH070520  COST            317.19   TRAN0705            1.
+    SH070520  BAL0705            -1.   BAL0720             1.
+    SH070820  COST            137.34   TRAN0708            1.
+    SH070820  BAL0783            -1.   BAL0720             1.
+    SH070121  COST            439.27   TRAN0701            1.
+    SH070121  BAL0701            -1.   BAL0721             1.
+    SH070221  COST            401.12   TRAN0702            1.
+    SH070221  BAL0702            -1.   BAL0721             1.
+    SH070321  COST            486.14   TRAN0703            1.
+    SH070321  BAL0703            -1.   BAL0721             1.
+    SH070421  COST             348.8   TRAN0704            1.
+    SH070421  BAL0704            -1.   BAL0721             1.
+    SH070521  COST             599.5   TRAN0705            1.
+    SH070521  BAL0705            -1.   BAL0721             1.
+    SH070821  COST             348.8   TRAN0708            1.
+    SH070821  BAL0783            -1.   BAL0721             1.
+    SH070122  COST            270.32   TRAN0701            1.
+    SH070122  BAL0701            -1.   BAL0722             1.
+    SH070222  COST            630.02   TRAN0702            1.
+    SH070222  BAL0702            -1.   BAL0722             1.
+    SH070322  COST            325.91   TRAN0703            1.
+    SH070322  BAL0703            -1.   BAL0722             1.
+    SH070422  COST            244.16   TRAN0704            1.
+    SH070422  BAL0704            -1.   BAL0722             1.
+    SH070522  COST            195.11   TRAN0705            1.
+    SH070522  BAL0705            -1.   BAL0722             1.
+    SH070622  COST             337.9   TRAN0706            1.
+    SH070622  BAL0752            -1.   BAL0722             1.
+    SH070822  COST            151.51   TRAN0708            1.
+    SH070822  BAL0783            -1.   BAL0722             1.
+    SH070123  COST            255.06   TRAN0701            1.
+    SH070123  BAL0701            -1.   BAL0723             1.
+    SH070223  COST            589.69   TRAN0702            1.
+    SH070223  BAL0702            -1.   BAL0723             1.
+    SH070323  COST            312.83   TRAN0703            1.
+    SH070323  BAL0703            -1.   BAL0723             1.
+    SH070423  COST            182.03   TRAN0704            1.
+    SH070423  BAL0704            -1.   BAL0723             1.
+    SH070523  COST            180.94   TRAN0705            1.
+    SH070523  BAL0705            -1.   BAL0723             1.
+    SH070823  COST            151.51   TRAN0708            1.
+    SH070823  BAL0783            -1.   BAL0723             1.
+    SH070124  COST           1565.24   TRAN0701            1.
+    SH070124  BAL0701            -1.   BAL0724             1.
+    SH070125  COST            421.83   TRAN0701            1.
+    SH070125  BAL0701            -1.   BAL0725             1.
+    SH070225  COST            465.43   TRAN0702            1.
+    SH070225  BAL0702            -1.   BAL0725             1.
+    SH070325  COST            556.99   TRAN0703            1.
+    SH070325  BAL0703            -1.   BAL0725             1.
+    SH070425  COST            379.32   TRAN0704            1.
+    SH070425  BAL0704            -1.   BAL0725             1.
+    SH070525  COST            616.94   TRAN0705            1.
+    SH070525  BAL0705            -1.   BAL0725             1.
+    SH070625  COST            439.27   TRAN0706            1.
+    SH070625  BAL0752            -1.   BAL0725             1.
+    SH070825  COST            332.45   TRAN0708            1.
+    SH070825  BAL0783            -1.   BAL0725             1.
+    SH070426  COST             294.3   TRAN0704            1.
+    SH070426  BAL0704            -1.   BAL0726             1.
+    SH070127  COST            255.06   TRAN0701            1.
+    SH070127  BAL0701            -1.   BAL0727             1.
+    SH070227  COST            309.56   TRAN0702            1.
+    SH070227  BAL0702            -1.   BAL0727             1.
+    SH070327  COST            315.01   TRAN0703            1.
+    SH070327  BAL0703            -1.   BAL0727             1.
+    SH070427  COST            365.15   TRAN0704            1.
+    SH070427  BAL0704            -1.   BAL0727             1.
+    SH070527  COST            412.02   TRAN0705            1.
+    SH070527  BAL0705            -1.   BAL0727             1.
+    SH070627  COST            292.12   TRAN0706            1.
+    SH070627  BAL0752            -1.   BAL0727             1.
+    SH070827  COST            274.68   TRAN0708            1.
+    SH070827  BAL0783            -1.   BAL0727             1.
+    SH070128  COST            264.87   TRAN0701            1.
+    SH070128  BAL0701            -1.   BAL0728             1.
+    SH070228  COST            620.21   TRAN0702            1.
+    SH070228  BAL0702            -1.   BAL0728             1.
+    SH070328  COST            322.64   TRAN0703            1.
+    SH070328  BAL0703            -1.   BAL0728             1.
+    SH070428  COST            321.55   TRAN0704            1.
+    SH070428  BAL0704            -1.   BAL0728             1.
+    SH070528  COST            111.18   TRAN0705            1.
+    SH070528  BAL0705            -1.   BAL0728             1.
+    SH070628  COST            284.49   TRAN0706            1.
+    SH070628  BAL0752            -1.   BAL0728             1.
+    SH070728  COST            116.63   TRAN0707            1.
+    SH070728  BAL0764            -1.   BAL0728             1.
+    SH070828  COST            276.86   TRAN0708            1.
+    SH070828  BAL0783            -1.   BAL0728             1.
+    SH070129  COST            243.07   TRAN0701            1.
+    SH070129  BAL0701            -1.   BAL0729             1.
+    SH070229  COST            505.76   TRAN0702            1.
+    SH070229  BAL0702            -1.   BAL0729             1.
+    SH070329  COST            262.69   TRAN0703            1.
+    SH070329  BAL0703            -1.   BAL0729             1.
+    SH070429  COST            216.91   TRAN0704            1.
+    SH070429  BAL0704            -1.   BAL0729             1.
+    SH070529  COST             468.7   TRAN0705            1.
+    SH070529  BAL0705            -1.   BAL0729             1.
+    SH070629  COST            284.49   TRAN0706            1.
+    SH070629  BAL0752            -1.   BAL0729             1.
+    SH070829  COST            156.96   TRAN0708            1.
+    SH070829  BAL0783            -1.   BAL0729             1.
+    SH070130  COST            507.94   TRAN0701            1.
+    SH070130  BAL0701            -1.   BAL0730             1.
+    SH070230  COST            475.24   TRAN0702            1.
+    SH070230  BAL0702            -1.   BAL0730             1.
+    SH070330  COST            570.07   TRAN0703            1.
+    SH070330  BAL0703            -1.   BAL0730             1.
+    SH070430  COST            331.36   TRAN0704            1.
+    SH070430  BAL0704            -1.   BAL0730             1.
+    SH070530  COST            486.14   TRAN0705            1.
+    SH070530  BAL0705            -1.   BAL0730             1.
+    SH070830  COST            416.38   TRAN0708            1.
+    SH070830  BAL0783            -1.   BAL0730             1.
+    SH070131  COST            120.99   TRAN0701            1.
+    SH070131  BAL0701            -1.   BAL0731             1.
+    SH070231  COST            382.59   TRAN0702            1.
+    SH070231  BAL0702            -1.   BAL0731             1.
+    SH070331  COST             119.9   TRAN0703            1.
+    SH070331  BAL0703            -1.   BAL0731             1.
+    SH070431  COST            275.77   TRAN0704            1.
+    SH070431  BAL0704            -1.   BAL0731             1.
+    SH070531  COST            334.63   TRAN0705            1.
+    SH070531  BAL0705            -1.   BAL0731             1.
+    SH070631  COST            122.08   TRAN0706            1.
+    SH070631  BAL0752            -1.   BAL0731             1.
+    SH070831  COST            243.07   TRAN0708            1.
+    SH070831  BAL0783            -1.   BAL0731             1.
+    SH070132  COST            325.91   TRAN0701            1.
+    SH070132  BAL0701            -1.   BAL0732             1.
+    SH070232  COST            521.02   TRAN0702            1.
+    SH070232  BAL0702            -1.   BAL0732             1.
+    SH070332  COST            461.07   TRAN0703            1.
+    SH070332  BAL0703            -1.   BAL0732             1.
+    SH070432  COST            171.13   TRAN0704            1.
+    SH070432  BAL0704            -1.   BAL0732             1.
+    SH070532  COST            427.28   TRAN0705            1.
+    SH070532  BAL0705            -1.   BAL0732             1.
+    SH070832  COST             196.2   TRAN0708            1.
+    SH070832  BAL0783            -1.   BAL0732             1.
+    SH070133  COST            537.37   TRAN0701            1.
+    SH070133  BAL0701            -1.   BAL0733             1.
+    SH070233  COST              436.   TRAN0702            1.
+    SH070233  BAL0702            -1.   BAL0733             1.
+    SH070333  COST            591.87   TRAN0703            1.
+    SH070333  BAL0703            -1.   BAL0733             1.
+    SH070433  COST            485.05   TRAN0704            1.
+    SH070433  BAL0704            -1.   BAL0733             1.
+    SH070533  COST            687.79   TRAN0705            1.
+    SH070533  BAL0705            -1.   BAL0733             1.
+    SH070833  COST            415.29   TRAN0708            1.
+    SH070833  BAL0783            -1.   BAL0733             1.
+    SH070134  COST            420.74   TRAN0701            1.
+    SH070134  BAL0701            -1.   BAL0734             1.
+    SH070234  COST            713.95   TRAN0702            1.
+    SH070234  BAL0702            -1.   BAL0734             1.
+    SH070334  COST            548.27   TRAN0703            1.
+    SH070334  BAL0703            -1.   BAL0734             1.
+    SH070434  COST            229.99   TRAN0704            1.
+    SH070434  BAL0704            -1.   BAL0734             1.
+    SH070534  COST            480.69   TRAN0705            1.
+    SH070534  BAL0705            -1.   BAL0734             1.
+    SH070834  COST            286.67   TRAN0708            1.
+    SH070834  BAL0783            -1.   BAL0734             1.
+    SH070135  COST            502.49   TRAN0701            1.
+    SH070135  BAL0701            -1.   BAL0735             1.
+    SH070235  COST            485.05   TRAN0702            1.
+    SH070235  BAL0702            -1.   BAL0735             1.
+    SH070335  COST            410.93   TRAN0703            1.
+    SH070335  BAL0703            -1.   BAL0735             1.
+    SH070435  COST            132.98   TRAN0704            1.
+    SH070435  BAL0704            -1.   BAL0735             1.
+    SH070535  COST            469.79   TRAN0705            1.
+    SH070535  BAL0705            -1.   BAL0735             1.
+    SH070835  COST            256.15   TRAN0708            1.
+    SH070835  BAL0783            -1.   BAL0735             1.
+    SH070136  COST            223.45   TRAN0701            1.
+    SH070136  BAL0701            -1.   BAL0736             1.
+    SH070236  COST            488.32   TRAN0702            1.
+    SH070236  BAL0702            -1.   BAL0736             1.
+    SH070336  COST            115.54   TRAN0703            1.
+    SH070336  BAL0703            -1.   BAL0736             1.
+    SH070436  COST             403.3   TRAN0704            1.
+    SH070436  BAL0704            -1.   BAL0736             1.
+    SH070536  COST            377.14   TRAN0705            1.
+    SH070536  BAL0705            -1.   BAL0736             1.
+    SH070636  COST             119.9   TRAN0706            1.
+    SH070636  BAL0752            -1.   BAL0736             1.
+    SH070836  COST            349.89   TRAN0708            1.
+    SH070836  BAL0783            -1.   BAL0736             1.
+    SH070137  COST            100.28   TRAN0701            1.
+    SH070137  BAL0701            -1.   BAL0737             1.
+    SH070237  COST            372.78   TRAN0702            1.
+    SH070237  BAL0702            -1.   BAL0737             1.
+    SH070337  COST            172.22   TRAN0703            1.
+    SH070337  BAL0703            -1.   BAL0737             1.
+    SH070437  COST            331.36   TRAN0704            1.
+    SH070437  BAL0704            -1.   BAL0737             1.
+    SH070537  COST            198.38   TRAN0705            1.
+    SH070537  BAL0705            -1.   BAL0737             1.
+    SH070637  COST            211.46   TRAN0706            1.
+    SH070637  BAL0752            -1.   BAL0737             1.
+    SH070837  COST            274.68   TRAN0708            1.
+    SH070837  BAL0783            -1.   BAL0737             1.
+    SH070138  COST            148.24   TRAN0701            1.
+    SH070138  BAL0701            -1.   BAL0738             1.
+    SH070238  COST            265.96   TRAN0702            1.
+    SH070238  BAL0702            -1.   BAL0738             1.
+    SH070338  COST            103.55   TRAN0703            1.
+    SH070338  BAL0703            -1.   BAL0738             1.
+    SH070438  COST            335.72   TRAN0704            1.
+    SH070438  BAL0704            -1.   BAL0738             1.
+    SH070538  COST            303.02   TRAN0705            1.
+    SH070538  BAL0705            -1.   BAL0738             1.
+    SH070638  COST             42.51   TRAN0706            1.
+    SH070638  BAL0752            -1.   BAL0738             1.
+    SH070738  COST            235.44   TRAN0707            1.
+    SH070738  BAL0764            -1.   BAL0738             1.
+    SH070838  COST            258.33   TRAN0708            1.
+    SH070838  BAL0783            -1.   BAL0738             1.
+    SH070139  COST             141.7   TRAN0701            1.
+    SH070139  BAL0701            -1.   BAL0739             1.
+    SH070239  COST            369.51   TRAN0702            1.
+    SH070239  BAL0702            -1.   BAL0739             1.
+    SH070339  COST             174.4   TRAN0703            1.
+    SH070339  BAL0703            -1.   BAL0739             1.
+    SH070439  COST            271.41   TRAN0704            1.
+    SH070439  BAL0704            -1.   BAL0739             1.
+    SH070539  COST            467.61   TRAN0705            1.
+    SH070539  BAL0705            -1.   BAL0739             1.
+    SH070639  COST            222.36   TRAN0706            1.
+    SH070639  BAL0752            -1.   BAL0739             1.
+    SH070839  COST            183.12   TRAN0708            1.
+    SH070839  BAL0783            -1.   BAL0739             1.
+    SH070140  COST            179.85   TRAN0701            1.
+    SH070140  BAL0701            -1.   BAL0740             1.
+    SH070240  COST            412.02   TRAN0702            1.
+    SH070240  BAL0702            -1.   BAL0740             1.
+    SH070340  COST            112.27   TRAN0703            1.
+    SH070340  BAL0703            -1.   BAL0740             1.
+    SH070440  COST            323.73   TRAN0704            1.
+    SH070440  BAL0704            -1.   BAL0740             1.
+    SH070540  COST            240.89   TRAN0705            1.
+    SH070540  BAL0705            -1.   BAL0740             1.
+    SH070640  COST            142.79   TRAN0706            1.
+    SH070640  BAL0752            -1.   BAL0740             1.
+    SH070840  COST            298.66   TRAN0708            1.
+    SH070840  BAL0783            -1.   BAL0740             1.
+    SH070141  COST            213.64   TRAN0701            1.
+    SH070141  BAL0701            -1.   BAL0741             1.
+    SH070241  COST              327.   TRAN0702            1.
+    SH070241  BAL0702            -1.   BAL0741             1.
+    SH070341  COST             163.5   TRAN0703            1.
+    SH070341  BAL0703            -1.   BAL0741             1.
+    SH070441  COST            353.16   TRAN0704            1.
+    SH070441  BAL0704            -1.   BAL0741             1.
+    SH070541  COST            401.12   TRAN0705            1.
+    SH070541  BAL0705            -1.   BAL0741             1.
+    SH070641  COST              109.   TRAN0706            1.
+    SH070641  BAL0752            -1.   BAL0741             1.
+    SH070841  COST            325.91   TRAN0708            1.
+    SH070841  BAL0783            -1.   BAL0741             1.
+    SH070142  COST              98.1   TRAN0701            1.
+    SH070142  BAL0701            -1.   BAL0742             1.
+    SH070242  COST            451.26   TRAN0702            1.
+    SH070242  BAL0702            -1.   BAL0742             1.
+    SH070342  COST             174.4   TRAN0703            1.
+    SH070342  BAL0703            -1.   BAL0742             1.
+    SH070442  COST            212.55   TRAN0704            1.
+    SH070442  BAL0704            -1.   BAL0742             1.
+    SH070542  COST            393.49   TRAN0705            1.
+    SH070542  BAL0705            -1.   BAL0742             1.
+    SH070642  COST            175.49   TRAN0706            1.
+    SH070642  BAL0752            -1.   BAL0742             1.
+    SH070842  COST            165.68   TRAN0708            1.
+    SH070842  BAL0783            -1.   BAL0742             1.
+    SH070143  COST            173.31   TRAN0701            1.
+    SH070143  BAL0701            -1.   BAL0743             1.
+    SH070243  COST            430.55   TRAN0702            1.
+    SH070243  BAL0702            -1.   BAL0743             1.
+    SH070343  COST             27.25   TRAN0703            1.
+    SH070343  BAL0703            -1.   BAL0743             1.
+    SH070443  COST            322.64   TRAN0704            1.
+    SH070443  BAL0704            -1.   BAL0743             1.
+    SH070543  COST            281.22   TRAN0705            1.
+    SH070543  BAL0705            -1.   BAL0743             1.
+    SH070643  COST              109.   TRAN0706            1.
+    SH070643  BAL0752            -1.   BAL0743             1.
+    SH070743  COST            262.69   TRAN0707            1.
+    SH070743  BAL0764            -1.   BAL0743             1.
+    SH070843  COST            295.39   TRAN0708            1.
+    SH070843  BAL0783            -1.   BAL0743             1.
+    SH070144  COST            173.31   TRAN0701            1.
+    SH070144  BAL0701            -1.   BAL0744             1.
+    SH070244  COST            413.11   TRAN0702            1.
+    SH070244  BAL0702            -1.   BAL0744             1.
+    SH070344  COST            139.52   TRAN0703            1.
+    SH070344  BAL0703            -1.   BAL0744             1.
+    SH070444  COST            340.08   TRAN0704            1.
+    SH070444  BAL0704            -1.   BAL0744             1.
+    SH070544  COST             337.9   TRAN0705            1.
+    SH070544  BAL0705            -1.   BAL0744             1.
+    SH070644  COST             97.01   TRAN0706            1.
+    SH070644  BAL0752            -1.   BAL0744             1.
+    SH070844  COST            324.82   TRAN0708            1.
+    SH070844  BAL0783            -1.   BAL0744             1.
+    SH070145  COST            187.48   TRAN0701            1.
+    SH070145  BAL0701            -1.   BAL0745             1.
+    SH070245  COST            475.24   TRAN0702            1.
+    SH070245  BAL0702            -1.   BAL0745             1.
+    SH070345  COST            175.49   TRAN0703            1.
+    SH070345  BAL0703            -1.   BAL0745             1.
+    SH070445  COST            318.28   TRAN0704            1.
+    SH070445  BAL0704            -1.   BAL0745             1.
+    SH070545  COST            255.06   TRAN0705            1.
+    SH070545  BAL0705            -1.   BAL0745             1.
+    SH070645  COST            208.19   TRAN0706            1.
+    SH070645  BAL0752            -1.   BAL0745             1.
+    SH070745  COST            214.73   TRAN0707            1.
+    SH070745  BAL0764            -1.   BAL0745             1.
+    SH070845  COST            332.45   TRAN0708            1.
+    SH070845  BAL0783            -1.   BAL0745             1.
+    SH070146  COST            267.05   TRAN0701            1.
+    SH070146  BAL0701            -1.   BAL0746             1.
+    SH070246  COST            297.57   TRAN0702            1.
+    SH070246  BAL0702            -1.   BAL0746             1.
+    SH070346  COST            240.89   TRAN0703            1.
+    SH070346  BAL0703            -1.   BAL0746             1.
+    SH070446  COST            487.23   TRAN0704            1.
+    SH070446  BAL0704            -1.   BAL0746             1.
+    SH070546  COST             468.7   TRAN0705            1.
+    SH070546  BAL0705            -1.   BAL0746             1.
+    SH070646  COST            280.13   TRAN0706            1.
+    SH070646  BAL0752            -1.   BAL0746             1.
+    SH070846  COST            488.32   TRAN0708            1.
+    SH070846  BAL0783            -1.   BAL0746             1.
+    SH070147  COST             119.9   TRAN0701            1.
+    SH070147  BAL0701            -1.   BAL0747             1.
+    SH070247  COST            406.57   TRAN0702            1.
+    SH070247  BAL0702            -1.   BAL0747             1.
+    SH070347  COST            173.31   TRAN0703            1.
+    SH070347  BAL0703            -1.   BAL0747             1.
+    SH070447  COST            298.66   TRAN0704            1.
+    SH070447  BAL0704            -1.   BAL0747             1.
+    SH070547  COST            253.97   TRAN0705            1.
+    SH070547  BAL0705            -1.   BAL0747             1.
+    SH070647  COST            158.05   TRAN0706            1.
+    SH070647  BAL0752            -1.   BAL0747             1.
+    SH070847  COST            265.96   TRAN0708            1.
+    SH070847  BAL0783            -1.   BAL0747             1.
+    SH070148  COST            103.55   TRAN0701            1.
+    SH070148  BAL0701            -1.   BAL0748             1.
+    SH070248  COST            369.51   TRAN0702            1.
+    SH070248  BAL0702            -1.   BAL0748             1.
+    SH070348  COST            149.33   TRAN0703            1.
+    SH070348  BAL0703            -1.   BAL0748             1.
+    SH070448  COST             250.7   TRAN0704            1.
+    SH070448  BAL0704            -1.   BAL0748             1.
+    SH070548  COST            269.23   TRAN0705            1.
+    SH070548  BAL0705            -1.   BAL0748             1.
+    SH070648  COST            125.35   TRAN0706            1.
+    SH070648  BAL0752            -1.   BAL0748             1.
+    SH070848  COST            212.55   TRAN0708            1.
+    SH070848  BAL0783            -1.   BAL0748             1.
+    SH070149  COST            358.61   TRAN0701            1.
+    SH070149  BAL0701            -1.   BAL0749             1.
+    SH070249  COST            583.15   TRAN0702            1.
+    SH070249  BAL0702            -1.   BAL0749             1.
+    SH070349  COST            361.88   TRAN0703            1.
+    SH070349  BAL0703            -1.   BAL0749             1.
+    SH070449  COST            415.29   TRAN0704            1.
+    SH070449  BAL0704            -1.   BAL0749             1.
+    SH070549  COST            165.68   TRAN0705            1.
+    SH070549  BAL0705            -1.   BAL0749             1.
+    SH070649  COST            368.42   TRAN0706            1.
+    SH070649  BAL0752            -1.   BAL0749             1.
+    SH070749  COST            146.06   TRAN0707            1.
+    SH070749  BAL0764            -1.   BAL0749             1.
+    SH070849  COST            444.72   TRAN0708            1.
+    SH070849  BAL0783            -1.   BAL0749             1.
+    SH070150  COST            262.69   TRAN0701            1.
+    SH070150  BAL0701            -1.   BAL0750             1.
+    SH070250  COST            667.08   TRAN0702            1.
+    SH070250  BAL0702            -1.   BAL0750             1.
+    SH070350  COST            268.14   TRAN0703            1.
+    SH070350  BAL0703            -1.   BAL0750             1.
+    SH070450  COST            397.85   TRAN0704            1.
+    SH070450  BAL0704            -1.   BAL0750             1.
+    SH070550  COST            256.15   TRAN0705            1.
+    SH070550  BAL0705            -1.   BAL0750             1.
+    SH070750  COST            149.33   TRAN0707            1.
+    SH070750  BAL0764            -1.   BAL0750             1.
+    SH070850  COST            442.54   TRAN0708            1.
+    SH070850  BAL0783            -1.   BAL0750             1.
+    SH070151  COST            361.88   TRAN0701            1.
+    SH070151  BAL0701            -1.   BAL0751             1.
+    SH070251  COST             599.5   TRAN0702            1.
+    SH070251  BAL0702            -1.   BAL0751             1.
+    SH070351  COST            371.69   TRAN0703            1.
+    SH070351  BAL0703            -1.   BAL0751             1.
+    SH070451  COST            368.42   TRAN0704            1.
+    SH070451  BAL0704            -1.   BAL0751             1.
+    SH070551  COST            134.07   TRAN0705            1.
+    SH070551  BAL0705            -1.   BAL0751             1.
+    SH070751  COST            107.91   TRAN0707            1.
+    SH070751  BAL0764            -1.   BAL0751             1.
+    SH070851  COST            466.52   TRAN0708            1.
+    SH070851  BAL0783            -1.   BAL0751             1.
+    SH070152  COST            122.08   TRAN0701            1.
+    SH070152  BAL0701            -1.   BAL0752             1.
+    SH070252  COST              327.   TRAN0702            1.
+    SH070252  BAL0702            -1.   BAL0752             1.
+    SH070352  COST             89.38   TRAN0703            1.
+    SH070352  BAL0703            -1.   BAL0752             1.
+    SH070452  COST            350.98   TRAN0704            1.
+    SH070452  BAL0704            -1.   BAL0752             1.
+    SH070552  COST            321.55   TRAN0705            1.
+    SH070552  BAL0705            -1.   BAL0752             1.
+    SH070852  COST            275.77   TRAN0708            1.
+    SH070852  BAL0783            -1.   BAL0752             1.
+    SH070153  COST            391.31   TRAN0701            1.
+    SH070153  BAL0701            -1.   BAL0753             1.
+    SH070253  COST            693.24   TRAN0702            1.
+    SH070253  BAL0702            -1.   BAL0753             1.
+    SH070353  COST            354.25   TRAN0703            1.
+    SH070353  BAL0703            -1.   BAL0753             1.
+    SH070453  COST            449.08   TRAN0704            1.
+    SH070453  BAL0704            -1.   BAL0753             1.
+    SH070553  COST            200.56   TRAN0705            1.
+    SH070553  BAL0705            -1.   BAL0753             1.
+    SH070653  COST            391.31   TRAN0706            1.
+    SH070653  BAL0752            -1.   BAL0753             1.
+    SH070753  COST            159.14   TRAN0707            1.
+    SH070753  BAL0764            -1.   BAL0753             1.
+    SH070853  COST            439.27   TRAN0708            1.
+    SH070853  BAL0783            -1.   BAL0753             1.
+    SH070154  COST            201.65   TRAN0701            1.
+    SH070154  BAL0701            -1.   BAL0754             1.
+    SH070254  COST            485.05   TRAN0702            1.
+    SH070254  BAL0702            -1.   BAL0754             1.
+    SH070354  COST            236.53   TRAN0703            1.
+    SH070354  BAL0703            -1.   BAL0754             1.
+    SH070454  COST            373.87   TRAN0704            1.
+    SH070454  BAL0704            -1.   BAL0754             1.
+    SH070554  COST            232.17   TRAN0705            1.
+    SH070554  BAL0705            -1.   BAL0754             1.
+    SH070654  COST            221.27   TRAN0706            1.
+    SH070654  BAL0752            -1.   BAL0754             1.
+    SH070854  COST            438.18   TRAN0708            1.
+    SH070854  BAL0783            -1.   BAL0754             1.
+    SH070155  COST            303.02   TRAN0701            1.
+    SH070155  BAL0701            -1.   BAL0755             1.
+    SH070255  COST            522.11   TRAN0702            1.
+    SH070255  BAL0702            -1.   BAL0755             1.
+    SH070355  COST            306.29   TRAN0703            1.
+    SH070355  BAL0703            -1.   BAL0755             1.
+    SH070455  COST            320.46   TRAN0704            1.
+    SH070455  BAL0704            -1.   BAL0755             1.
+    SH070555  COST            167.86   TRAN0705            1.
+    SH070555  BAL0705            -1.   BAL0755             1.
+    SH070655  COST             316.1   TRAN0706            1.
+    SH070655  BAL0752            -1.   BAL0755             1.
+    SH070755  COST            116.63   TRAN0707            1.
+    SH070755  BAL0764            -1.   BAL0755             1.
+    SH070855  COST            320.46   TRAN0708            1.
+    SH070855  BAL0783            -1.   BAL0755             1.
+    SH070156  COST             425.1   TRAN0701            1.
+    SH070156  BAL0701            -1.   BAL0756             1.
+    SH070256  COST            631.11   TRAN0702            1.
+    SH070256  BAL0702            -1.   BAL0756             1.
+    SH070356  COST            332.45   TRAN0703            1.
+    SH070356  BAL0703            -1.   BAL0756             1.
+    SH070456  COST            397.85   TRAN0704            1.
+    SH070456  BAL0704            -1.   BAL0756             1.
+    SH070556  COST            148.24   TRAN0705            1.
+    SH070556  BAL0705            -1.   BAL0756             1.
+    SH070656  COST            369.51   TRAN0706            1.
+    SH070656  BAL0752            -1.   BAL0756             1.
+    SH070756  COST            132.98   TRAN0707            1.
+    SH070756  BAL0764            -1.   BAL0756             1.
+    SH070856  COST            389.13   TRAN0708            1.
+    SH070856  BAL0783            -1.   BAL0756             1.
+    SH070157  COST            284.49   TRAN0701            1.
+    SH070157  BAL0701            -1.   BAL0757             1.
+    SH070257  COST             566.8   TRAN0702            1.
+    SH070257  BAL0702            -1.   BAL0757             1.
+    SH070357  COST             316.1   TRAN0703            1.
+    SH070357  BAL0703            -1.   BAL0757             1.
+    SH070457  COST            255.06   TRAN0704            1.
+    SH070457  BAL0704            -1.   BAL0757             1.
+    SH070557  COST            183.12   TRAN0705            1.
+    SH070557  BAL0705            -1.   BAL0757             1.
+    SH070657  COST            347.71   TRAN0706            1.
+    SH070657  BAL0752            -1.   BAL0757             1.
+    SH070757  COST            161.32   TRAN0707            1.
+    SH070757  BAL0764            -1.   BAL0757             1.
+    SH070857  COST            251.79   TRAN0708            1.
+    SH070857  BAL0783            -1.   BAL0757             1.
+    SH070158  COST            320.46   TRAN0701            1.
+    SH070158  BAL0701            -1.   BAL0758             1.
+    SH070258  COST            567.89   TRAN0702            1.
+    SH070258  BAL0702            -1.   BAL0758             1.
+    SH070358  COST            303.02   TRAN0703            1.
+    SH070358  BAL0703            -1.   BAL0758             1.
+    SH070458  COST            373.87   TRAN0704            1.
+    SH070458  BAL0704            -1.   BAL0758             1.
+    SH070558  COST             22.89   TRAN0705            1.
+    SH070558  BAL0705            -1.   BAL0758             1.
+    SH070658  COST            355.34   TRAN0706            1.
+    SH070658  BAL0752            -1.   BAL0758             1.
+    SH070758  COST             74.12   TRAN0707            1.
+    SH070758  BAL0764            -1.   BAL0758             1.
+    SH070858  COST            276.86   TRAN0708            1.
+    SH070858  BAL0783            -1.   BAL0758             1.
+    SH070159  COST            224.54   TRAN0701            1.
+    SH070159  BAL0701            -1.   BAL0759             1.
+    SH070259  COST            542.82   TRAN0702            1.
+    SH070259  BAL0702            -1.   BAL0759             1.
+    SH070359  COST            259.42   TRAN0703            1.
+    SH070359  BAL0703            -1.   BAL0759             1.
+    SH070459  COST            265.96   TRAN0704            1.
+    SH070459  BAL0704            -1.   BAL0759             1.
+    SH070559  COST            173.31   TRAN0705            1.
+    SH070559  BAL0705            -1.   BAL0759             1.
+    SH070659  COST            323.73   TRAN0706            1.
+    SH070659  BAL0752            -1.   BAL0759             1.
+    SH070759  COST            114.45   TRAN0707            1.
+    SH070759  BAL0764            -1.   BAL0759             1.
+    SH070859  COST            277.95   TRAN0708            1.
+    SH070859  BAL0783            -1.   BAL0759             1.
+    SH070160  COST            284.49   TRAN0701            1.
+    SH070160  BAL0701            -1.   BAL0760             1.
+    SH070260  COST             599.5   TRAN0702            1.
+    SH070260  BAL0702            -1.   BAL0760             1.
+    SH070360  COST            308.47   TRAN0703            1.
+    SH070360  BAL0703            -1.   BAL0760             1.
+    SH070460  COST            340.08   TRAN0704            1.
+    SH070460  BAL0704            -1.   BAL0760             1.
+    SH070560  COST            147.15   TRAN0705            1.
+    SH070560  BAL0705            -1.   BAL0760             1.
+    SH070660  COST            352.07   TRAN0706            1.
+    SH070660  BAL0752            -1.   BAL0760             1.
+    SH070760  COST             95.92   TRAN0707            1.
+    SH070760  BAL0764            -1.   BAL0760             1.
+    SH070860  COST            325.91   TRAN0708            1.
+    SH070860  BAL0783            -1.   BAL0760             1.
+    SH070163  COST            289.94   TRAN0701            1.
+    SH070163  BAL0701            -1.   BAL0763             1.
+    SH070263  COST            538.46   TRAN0702            1.
+    SH070263  BAL0702            -1.   BAL0763             1.
+    SH070363  COST            312.83   TRAN0703            1.
+    SH070363  BAL0703            -1.   BAL0763             1.
+    SH070463  COST            402.21   TRAN0704            1.
+    SH070463  BAL0704            -1.   BAL0763             1.
+    SH070563  COST            165.68   TRAN0705            1.
+    SH070563  BAL0705            -1.   BAL0763             1.
+    SH070663  COST            343.35   TRAN0706            1.
+    SH070663  BAL0752            -1.   BAL0763             1.
+    SH070763  COST            135.16   TRAN0707            1.
+    SH070763  BAL0764            -1.   BAL0763             1.
+    SH070863  COST              436.   TRAN0708            1.
+    SH070863  BAL0783            -1.   BAL0763             1.
+    SH070164  COST            216.91   TRAN0701            1.
+    SH070164  BAL0701            -1.   BAL0764             1.
+    SH070264  COST            573.34   TRAN0702            1.
+    SH070264  BAL0702            -1.   BAL0764             1.
+    SH070364  COST            243.07   TRAN0703            1.
+    SH070364  BAL0703            -1.   BAL0764             1.
+    SH070464  COST            366.24   TRAN0704            1.
+    SH070464  BAL0704            -1.   BAL0764             1.
+    SH070564  COST             63.22   TRAN0705            1.
+    SH070564  BAL0705            -1.   BAL0764             1.
+    SH070664  COST            345.53   TRAN0706            1.
+    SH070664  BAL0752            -1.   BAL0764             1.
+    SH070864  COST             272.5   TRAN0708            1.
+    SH070864  BAL0783            -1.   BAL0764             1.
+    SH070165  COST            470.88   TRAN0701            1.
+    SH070165  BAL0701            -1.   BAL0765             1.
+    SH070265  COST            334.63   TRAN0702            1.
+    SH070265  BAL0702            -1.   BAL0765             1.
+    SH070365  COST            550.45   TRAN0703            1.
+    SH070365  BAL0703            -1.   BAL0765             1.
+    SH070465  COST            422.92   TRAN0704            1.
+    SH070465  BAL0704            -1.   BAL0765             1.
+    SH070565  COST            658.36   TRAN0705            1.
+    SH070565  BAL0705            -1.   BAL0765             1.
+    SH070865  COST            452.35   TRAN0708            1.
+    SH070865  BAL0783            -1.   BAL0765             1.
+    SH070166  COST             610.4   TRAN0701            1.
+    SH070166  BAL0701            -1.   BAL0766             1.
+    SH070266  COST            282.31   TRAN0702            1.
+    SH070266  BAL0702            -1.   BAL0766             1.
+    SH070366  COST            630.02   TRAN0703            1.
+    SH070366  BAL0703            -1.   BAL0766             1.
+    SH070466  COST            606.04   TRAN0704            1.
+    SH070466  BAL0704            -1.   BAL0766             1.
+    SH070566  COST             773.9   TRAN0705            1.
+    SH070566  BAL0705            -1.   BAL0766             1.
+    SH070866  COST             610.4   TRAN0708            1.
+    SH070866  BAL0783            -1.   BAL0766             1.
+    SH070167  COST            463.25   TRAN0701            1.
+    SH070167  BAL0701            -1.   BAL0767             1.
+    SH070267  COST            252.88   TRAN0702            1.
+    SH070267  BAL0702            -1.   BAL0767             1.
+    SH070367  COST            537.37   TRAN0703            1.
+    SH070367  BAL0703            -1.   BAL0767             1.
+    SH070467  COST            498.13   TRAN0704            1.
+    SH070467  BAL0704            -1.   BAL0767             1.
+    SH070567  COST            658.36   TRAN0705            1.
+    SH070567  BAL0705            -1.   BAL0767             1.
+    SH070867  COST            499.22   TRAN0708            1.
+    SH070867  BAL0783            -1.   BAL0767             1.
+    SH070168  COST            647.46   TRAN0701            1.
+    SH070168  BAL0701            -1.   BAL0768             1.
+    SH070268  COST              436.   TRAN0702            1.
+    SH070268  BAL0702            -1.   BAL0768             1.
+    SH070368  COST             610.4   TRAN0703            1.
+    SH070368  BAL0703            -1.   BAL0768             1.
+    SH070468  COST            765.18   TRAN0704            1.
+    SH070468  BAL0704            -1.   BAL0768             1.
+    SH070568  COST           1031.14   TRAN0705            1.
+    SH070568  BAL0705            -1.   BAL0768             1.
+    SH070868  COST            818.59   TRAN0708            1.
+    SH070868  BAL0783            -1.   BAL0768             1.
+    SH070169  COST            587.51   TRAN0701            1.
+    SH070169  BAL0701            -1.   BAL0769             1.
+    SH070269  COST            240.89   TRAN0702            1.
+    SH070269  BAL0702            -1.   BAL0769             1.
+    SH070369  COST             555.9   TRAN0703            1.
+    SH070369  BAL0703            -1.   BAL0769             1.
+    SH070469  COST            677.98   TRAN0704            1.
+    SH070469  BAL0704            -1.   BAL0769             1.
+    SH070569  COST            704.14   TRAN0705            1.
+    SH070569  BAL0705            -1.   BAL0769             1.
+    SH070869  COST            717.22   TRAN0708            1.
+    SH070869  BAL0783            -1.   BAL0769             1.
+    SH070171  COST             479.6   TRAN0701            1.
+    SH070171  BAL0701            -1.   BAL0771             1.
+    SH070371  COST            571.16   TRAN0703            1.
+    SH070371  BAL0703            -1.   BAL0771             1.
+    SH070471  COST            567.89   TRAN0704            1.
+    SH070471  BAL0704            -1.   BAL0771             1.
+    SH070571  COST            633.29   TRAN0705            1.
+    SH070571  BAL0705            -1.   BAL0771             1.
+    SH070671  COST            426.19   TRAN0706            1.
+    SH070671  BAL0752            -1.   BAL0771             1.
+    SH070771  COST            767.36   TRAN0707            1.
+    SH070771  BAL0764            -1.   BAL0771             1.
+    SH070871  COST            580.97   TRAN0708            1.
+    SH070871  BAL0783            -1.   BAL0771             1.
+    SH070172  COST            639.83   TRAN0701            1.
+    SH070172  BAL0701            -1.   BAL0772             1.
+    SH070272  COST            591.87   TRAN0702            1.
+    SH070272  BAL0702            -1.   BAL0772             1.
+    SH070372  COST            672.53   TRAN0703            1.
+    SH070372  BAL0703            -1.   BAL0772             1.
+    SH070472  COST             621.3   TRAN0704            1.
+    SH070472  BAL0704            -1.   BAL0772             1.
+    SH070572  COST            831.67   TRAN0705            1.
+    SH070572  BAL0705            -1.   BAL0772             1.
+    SH070872  COST             621.3   TRAN0708            1.
+    SH070872  BAL0783            -1.   BAL0772             1.
+    SH070173  COST             425.1   TRAN0701            1.
+    SH070173  BAL0701            -1.   BAL0773             1.
+    SH070273  COST            397.85   TRAN0702            1.
+    SH070273  BAL0702            -1.   BAL0773             1.
+    SH070373  COST            368.42   TRAN0703            1.
+    SH070373  BAL0703            -1.   BAL0773             1.
+    SH070473  COST            498.13   TRAN0704            1.
+    SH070473  BAL0704            -1.   BAL0773             1.
+    SH070573  COST            614.76   TRAN0705            1.
+    SH070573  BAL0705            -1.   BAL0773             1.
+    SH070673  COST            332.45   TRAN0706            1.
+    SH070673  BAL0752            -1.   BAL0773             1.
+    SH070873  COST            549.36   TRAN0708            1.
+    SH070873  BAL0783            -1.   BAL0773             1.
+    SH070174  COST            597.32   TRAN0701            1.
+    SH070174  BAL0701            -1.   BAL0774             1.
+    SH070274  COST             228.9   TRAN0702            1.
+    SH070274  BAL0702            -1.   BAL0774             1.
+    SH070374  COST             621.3   TRAN0703            1.
+    SH070374  BAL0703            -1.   BAL0774             1.
+    SH070474  COST            694.33   TRAN0704            1.
+    SH070474  BAL0704            -1.   BAL0774             1.
+    SH070574  COST            798.97   TRAN0705            1.
+    SH070574  BAL0705            -1.   BAL0774             1.
+    SH070874  COST            674.71   TRAN0708            1.
+    SH070874  BAL0783            -1.   BAL0774             1.
+    SH070275  COST            603.86   TRAN0702            1.
+    SH070275  BAL0702            -1.   BAL0775             1.
+    SH070176  COST            503.58   TRAN0701            1.
+    SH070176  BAL0701            -1.   BAL0776             1.
+    SH070276  COST            437.09   TRAN0702            1.
+    SH070276  BAL0702            -1.   BAL0776             1.
+    SH070376  COST            439.27   TRAN0703            1.
+    SH070376  BAL0703            -1.   BAL0776             1.
+    SH070476  COST             686.7   TRAN0704            1.
+    SH070476  BAL0704            -1.   BAL0776             1.
+    SH070576  COST             686.7   TRAN0705            1.
+    SH070576  BAL0705            -1.   BAL0776             1.
+    SH070676  COST            415.29   TRAN0706            1.
+    SH070676  BAL0752            -1.   BAL0776             1.
+    SH070876  COST            846.93   TRAN0708            1.
+    SH070876  BAL0783            -1.   BAL0776             1.
+    SH070177  COST            474.15   TRAN0701            1.
+    SH070177  BAL0701            -1.   BAL0777             1.
+    SH070277  COST            296.48   TRAN0702            1.
+    SH070277  BAL0702            -1.   BAL0777             1.
+    SH070377  COST            502.49   TRAN0703            1.
+    SH070377  BAL0703            -1.   BAL0777             1.
+    SH070477  COST            437.09   TRAN0704            1.
+    SH070477  BAL0704            -1.   BAL0777             1.
+    SH070577  COST             610.4   TRAN0705            1.
+    SH070577  BAL0705            -1.   BAL0777             1.
+    SH070877  COST             348.8   TRAN0708            1.
+    SH070877  BAL0783            -1.   BAL0777             1.
+    SH070178  COST            829.49   TRAN0701            1.
+    SH070178  BAL0701            -1.   BAL0778             1.
+    SH070278  COST            481.78   TRAN0702            1.
+    SH070278  BAL0702            -1.   BAL0778             1.
+    SH070378  COST            853.47   TRAN0703            1.
+    SH070378  BAL0703            -1.   BAL0778             1.
+    SH070478  COST            746.65   TRAN0704            1.
+    SH070478  BAL0704            -1.   BAL0778             1.
+    SH070578  COST            958.11   TRAN0705            1.
+    SH070578  BAL0705            -1.   BAL0778             1.
+    SH070878  COST            834.94   TRAN0708            1.
+    SH070878  BAL0783            -1.   BAL0778             1.
+    SH070179  COST            779.35   TRAN0701            1.
+    SH070179  BAL0701            -1.   BAL0779             1.
+    SH070279  COST            293.21   TRAN0702            1.
+    SH070279  BAL0702            -1.   BAL0779             1.
+    SH070379  COST            753.19   TRAN0703            1.
+    SH070379  BAL0703            -1.   BAL0779             1.
+    SH070479  COST             784.8   TRAN0704            1.
+    SH070479  BAL0704            -1.   BAL0779             1.
+    SH070879  COST            769.54   TRAN0708            1.
+    SH070879  BAL0783            -1.   BAL0779             1.
+    SH070180  COST            345.53   TRAN0701            1.
+    SH070180  BAL0701            -1.   BAL0780             1.
+    SH070280  COST            430.55   TRAN0702            1.
+    SH070280  BAL0702            -1.   BAL0780             1.
+    SH070380  COST            476.33   TRAN0703            1.
+    SH070380  BAL0703            -1.   BAL0780             1.
+    SH070480  COST            407.66   TRAN0704            1.
+    SH070480  BAL0704            -1.   BAL0780             1.
+    SH070580  COST            550.45   TRAN0705            1.
+    SH070580  BAL0705            -1.   BAL0780             1.
+    SH070880  COST             261.6   TRAN0708            1.
+    SH070880  BAL0783            -1.   BAL0780             1.
+    SH070182  COST            634.38   TRAN0701            1.
+    SH070182  BAL0701            -1.   BAL0782             1.
+    SH070282  COST            358.61   TRAN0702            1.
+    SH070282  BAL0702            -1.   BAL0782             1.
+    SH070382  COST            713.95   TRAN0703            1.
+    SH070382  BAL0703            -1.   BAL0782             1.
+    SH070482  COST            769.54   TRAN0704            1.
+    SH070482  BAL0704            -1.   BAL0782             1.
+    SH070582  COST           1250.23   TRAN0705            1.
+    SH070582  BAL0705            -1.   BAL0782             1.
+    SH070882  COST            853.47   TRAN0708            1.
+    SH070882  BAL0783            -1.   BAL0782             1.
+    SH070183  COST            192.93   TRAN0701            1.
+    SH070183  BAL0701            -1.   BAL0783             1.
+    SH070283  COST             566.8   TRAN0702            1.
+    SH070283  BAL0702            -1.   BAL0783             1.
+    SH070383  COST            296.48   TRAN0703            1.
+    SH070383  BAL0703            -1.   BAL0783             1.
+    SH070483  COST             64.31   TRAN0704            1.
+    SH070483  BAL0704            -1.   BAL0783             1.
+    SH070583  COST            378.23   TRAN0705            1.
+    SH070583  BAL0705            -1.   BAL0783             1.
+    SH070683  COST            270.32   TRAN0706            1.
+    SH070683  BAL0752            -1.   BAL0783             1.
+    SH070184  COST            331.36   TRAN0701            1.
+    SH070184  BAL0701            -1.   BAL0784             1.
+    SH070284  COST            209.28   TRAN0702            1.
+    SH070284  BAL0702            -1.   BAL0784             1.
+    SH070384  COST            396.76   TRAN0703            1.
+    SH070384  BAL0703            -1.   BAL0784             1.
+    SH070484  COST             403.3   TRAN0704            1.
+    SH070484  BAL0704            -1.   BAL0784             1.
+    SH070584  COST             534.1   TRAN0705            1.
+    SH070584  BAL0705            -1.   BAL0784             1.
+    SH070684  COST            332.45   TRAN0706            1.
+    SH070684  BAL0752            -1.   BAL0784             1.
+    SH070884  COST            422.92   TRAN0708            1.
+    SH070884  BAL0783            -1.   BAL0784             1.
+    SH080201  COST            513.81   TRAN0802            1.
+    SH080201  BAL0802            -1.   BAL0801             1.
+    SH080301  COST            197.22   TRAN0803            1.
+    SH080301  BAL0803            -1.   BAL0801             1.
+    SH080401  COST            359.84   TRAN0804            1.
+    SH080401  BAL0804            -1.   BAL0801             1.
+    SH080501  COST            410.01   TRAN0805            1.
+    SH080501  BAL0805            -1.   BAL0801             1.
+    SH080601  COST            217.98   TRAN0806            1.
+    SH080601  BAL0852            -1.   BAL0801             1.
+    SH080801  COST            247.39   TRAN0808            1.
+    SH080801  BAL0883            -1.   BAL0801             1.
+    SH080102  COST            820.02   TRAN0801            1.
+    SH080102  BAL0801            -1.   BAL0802             1.
+    SH080302  COST            721.41   TRAN0803            1.
+    SH080302  BAL0803            -1.   BAL0802             1.
+    SH080402  COST           1058.76   TRAN0804            1.
+    SH080402  BAL0804            -1.   BAL0802             1.
+    SH080502  COST           1281.93   TRAN0805            1.
+    SH080502  BAL0805            -1.   BAL0802             1.
+    SH080602  COST            653.94   TRAN0806            1.
+    SH080602  BAL0852            -1.   BAL0802             1.
+    SH080802  COST            901.33   TRAN0808            1.
+    SH080802  BAL0883            -1.   BAL0802             1.
+    SH080103  COST            423.85   TRAN0801            1.
+    SH080103  BAL0801            -1.   BAL0803             1.
+    SH080203  COST            820.02   TRAN0802            1.
+    SH080203  BAL0802            -1.   BAL0803             1.
+    SH080403  COST            634.91   TRAN0804            1.
+    SH080403  BAL0804            -1.   BAL0803             1.
+    SH080503  COST            491.32   TRAN0805            1.
+    SH080503  BAL0805            -1.   BAL0803             1.
+    SH080603  COST             155.7   TRAN0806            1.
+    SH080603  BAL0852            -1.   BAL0803             1.
+    SH080803  COST            441.15   TRAN0808            1.
+    SH080803  BAL0883            -1.   BAL0803             1.
+    SH080104  COST            301.02   TRAN0801            1.
+    SH080104  BAL0801            -1.   BAL0804             1.
+    SH080204  COST            870.19   TRAN0802            1.
+    SH080204  BAL0802            -1.   BAL0804             1.
+    SH080304  COST            420.39   TRAN0803            1.
+    SH080304  BAL0803            -1.   BAL0804             1.
+    SH080504  COST            551.87   TRAN0805            1.
+    SH080504  BAL0805            -1.   BAL0804             1.
+    SH080604  COST            423.85   TRAN0806            1.
+    SH080604  BAL0852            -1.   BAL0804             1.
+    SH080704  COST            465.37   TRAN0807            1.
+    SH080704  BAL0864            -1.   BAL0804             1.
+    SH080804  COST            100.34   TRAN0808            1.
+    SH080804  BAL0883            -1.   BAL0804             1.
+    SH080105  COST             467.1   TRAN0801            1.
+    SH080105  BAL0801            -1.   BAL0805             1.
+    SH080205  COST            892.68   TRAN0802            1.
+    SH080205  BAL0802            -1.   BAL0805             1.
+    SH080305  COST            491.32   TRAN0803            1.
+    SH080305  BAL0803            -1.   BAL0805             1.
+    SH080405  COST            493.05   TRAN0804            1.
+    SH080405  BAL0804            -1.   BAL0805             1.
+    SH080605  COST            563.98   TRAN0806            1.
+    SH080605  BAL0852            -1.   BAL0805             1.
+    SH080705  COST            577.82   TRAN0807            1.
+    SH080705  BAL0864            -1.   BAL0805             1.
+    SH080805  COST            468.83   TRAN0808            1.
+    SH080805  BAL0883            -1.   BAL0805             1.
+    SH080106  COST            344.27   TRAN0801            1.
+    SH080106  BAL0801            -1.   BAL0806             1.
+    SH080206  COST            721.41   TRAN0802            1.
+    SH080206  BAL0802            -1.   BAL0806             1.
+    SH080306  COST            368.49   TRAN0803            1.
+    SH080306  BAL0803            -1.   BAL0806             1.
+    SH080406  COST            378.87   TRAN0804            1.
+    SH080406  BAL0804            -1.   BAL0806             1.
+    SH080506  COST            435.96   TRAN0805            1.
+    SH080506  BAL0805            -1.   BAL0806             1.
+    SH080606  COST            356.38   TRAN0806            1.
+    SH080606  BAL0852            -1.   BAL0806             1.
+    SH080706  COST              346.   TRAN0807            1.
+    SH080706  BAL0864            -1.   BAL0806             1.
+    SH080806  COST            261.23   TRAN0808            1.
+    SH080806  BAL0883            -1.   BAL0806             1.
+    SH080107  COST             36.33   TRAN0801            1.
+    SH080107  BAL0801            -1.   BAL0807             1.
+    SH080207  COST            505.16   TRAN0802            1.
+    SH080207  BAL0802            -1.   BAL0807             1.
+    SH080307  COST            214.52   TRAN0803            1.
+    SH080307  BAL0803            -1.   BAL0807             1.
+    SH080407  COST            358.11   TRAN0804            1.
+    SH080407  BAL0804            -1.   BAL0807             1.
+    SH080507  COST            396.17   TRAN0805            1.
+    SH080507  BAL0805            -1.   BAL0807             1.
+    SH080607  COST            216.25   TRAN0806            1.
+    SH080607  BAL0852            -1.   BAL0807             1.
+    SH080707  COST            401.36   TRAN0807            1.
+    SH080707  BAL0864            -1.   BAL0807             1.
+    SH080807  COST            268.15   TRAN0808            1.
+    SH080807  BAL0883            -1.   BAL0807             1.
+    SH080108  COST            114.18   TRAN0801            1.
+    SH080108  BAL0801            -1.   BAL0808             1.
+    SH080208  COST            650.48   TRAN0802            1.
+    SH080208  BAL0802            -1.   BAL0808             1.
+    SH080308  COST            243.93   TRAN0803            1.
+    SH080308  BAL0803            -1.   BAL0808             1.
+    SH080408  COST            427.31   TRAN0804            1.
+    SH080408  BAL0804            -1.   BAL0808             1.
+    SH080508  COST            314.86   TRAN0805            1.
+    SH080508  BAL0805            -1.   BAL0808             1.
+    SH080608  COST            287.18   TRAN0806            1.
+    SH080608  BAL0852            -1.   BAL0808             1.
+    SH080808  COST            323.51   TRAN0808            1.
+    SH080808  BAL0883            -1.   BAL0808             1.
+    SH080109  COST            238.74   TRAN0801            1.
+    SH080109  BAL0801            -1.   BAL0809             1.
+    SH080209  COST            662.59   TRAN0802            1.
+    SH080209  BAL0802            -1.   BAL0809             1.
+    SH080309  COST            290.64   TRAN0803            1.
+    SH080309  BAL0803            -1.   BAL0809             1.
+    SH080409  COST            437.69   TRAN0804            1.
+    SH080409  BAL0804            -1.   BAL0809             1.
+    SH080509  COST            413.47   TRAN0805            1.
+    SH080509  BAL0805            -1.   BAL0809             1.
+    SH080709  COST            339.08   TRAN0807            1.
+    SH080709  BAL0864            -1.   BAL0809             1.
+    SH080809  COST            335.62   TRAN0808            1.
+    SH080809  BAL0883            -1.   BAL0809             1.
+    SH080110  COST            427.31   TRAN0801            1.
+    SH080110  BAL0801            -1.   BAL0810             1.
+    SH080210  COST            273.34   TRAN0802            1.
+    SH080210  BAL0802            -1.   BAL0810             1.
+    SH080310  COST             415.2   TRAN0803            1.
+    SH080310  BAL0803            -1.   BAL0810             1.
+    SH080410  COST            621.07   TRAN0804            1.
+    SH080410  BAL0804            -1.   BAL0810             1.
+    SH080510  COST            666.05   TRAN0805            1.
+    SH080510  BAL0805            -1.   BAL0810             1.
+    SH080610  COST            389.25   TRAN0806            1.
+    SH080610  BAL0852            -1.   BAL0810             1.
+    SH080810  COST            527.65   TRAN0808            1.
+    SH080810  BAL0883            -1.   BAL0810             1.
+    SH080111  COST            183.38   TRAN0801            1.
+    SH080111  BAL0801            -1.   BAL0811             1.
+    SH080211  COST            856.35   TRAN0802            1.
+    SH080211  BAL0802            -1.   BAL0811             1.
+    SH080311  COST            429.04   TRAN0803            1.
+    SH080311  BAL0803            -1.   BAL0811             1.
+    SH080411  COST            240.47   TRAN0804            1.
+    SH080411  BAL0804            -1.   BAL0811             1.
+    SH080511  COST            589.93   TRAN0805            1.
+    SH080511  BAL0805            -1.   BAL0811             1.
+    SH080611  COST            339.08   TRAN0806            1.
+    SH080611  BAL0852            -1.   BAL0811             1.
+    SH080811  COST            176.46   TRAN0808            1.
+    SH080811  BAL0883            -1.   BAL0811             1.
+    SH080112  COST            152.24   TRAN0801            1.
+    SH080112  BAL0801            -1.   BAL0812             1.
+    SH080212  COST            586.47   TRAN0802            1.
+    SH080212  BAL0802            -1.   BAL0812             1.
+    SH080312  COST            252.58   TRAN0803            1.
+    SH080312  BAL0803            -1.   BAL0812             1.
+    SH080412  COST              346.   TRAN0804            1.
+    SH080412  BAL0804            -1.   BAL0812             1.
+    SH080512  COST            461.91   TRAN0805            1.
+    SH080512  BAL0805            -1.   BAL0812             1.
+    SH080612  COST            250.85   TRAN0806            1.
+    SH080612  BAL0852            -1.   BAL0812             1.
+    SH080812  COST            252.58   TRAN0808            1.
+    SH080812  BAL0883            -1.   BAL0812             1.
+    SH080114  COST            245.66   TRAN0801            1.
+    SH080114  BAL0801            -1.   BAL0814             1.
+    SH080214  COST            712.76   TRAN0802            1.
+    SH080214  BAL0802            -1.   BAL0814             1.
+    SH080314  COST            339.08   TRAN0803            1.
+    SH080314  BAL0803            -1.   BAL0814             1.
+    SH080414  COST            344.27   TRAN0804            1.
+    SH080414  BAL0804            -1.   BAL0814             1.
+    SH080514  COST            608.96   TRAN0805            1.
+    SH080514  BAL0805            -1.   BAL0814             1.
+    SH080614  COST            325.24   TRAN0806            1.
+    SH080614  BAL0852            -1.   BAL0814             1.
+    SH080814  COST            217.98   TRAN0808            1.
+    SH080814  BAL0883            -1.   BAL0814             1.
+    SH080115  COST            524.19   TRAN0801            1.
+    SH080115  BAL0801            -1.   BAL0815             1.
+    SH080215  COST            275.07   TRAN0802            1.
+    SH080215  BAL0802            -1.   BAL0815             1.
+    SH080315  COST            404.82   TRAN0803            1.
+    SH080315  BAL0803            -1.   BAL0815             1.
+    SH080415  COST            823.48   TRAN0804            1.
+    SH080415  BAL0804            -1.   BAL0815             1.
+    SH080515  COST            688.54   TRAN0805            1.
+    SH080515  BAL0805            -1.   BAL0815             1.
+    SH080615  COST            325.24   TRAN0806            1.
+    SH080615  BAL0852            -1.   BAL0815             1.
+    SH080815  COST            645.29   TRAN0808            1.
+    SH080815  BAL0883            -1.   BAL0815             1.
+    SH080116  COST            273.34   TRAN0801            1.
+    SH080116  BAL0801            -1.   BAL0816             1.
+    SH080216  COST             484.4   TRAN0802            1.
+    SH080216  BAL0802            -1.   BAL0816             1.
+    SH080316  COST            392.71   TRAN0803            1.
+    SH080316  BAL0803            -1.   BAL0816             1.
+    SH080416  COST            496.51   TRAN0804            1.
+    SH080416  BAL0804            -1.   BAL0816             1.
+    SH080516  COST            551.87   TRAN0805            1.
+    SH080516  BAL0805            -1.   BAL0816             1.
+    SH080616  COST            226.63   TRAN0806            1.
+    SH080616  BAL0852            -1.   BAL0816             1.
+    SH080816  COST            354.65   TRAN0808            1.
+    SH080816  BAL0883            -1.   BAL0816             1.
+    SH080117  COST            261.23   TRAN0801            1.
+    SH080117  BAL0801            -1.   BAL0817             1.
+    SH080217  COST            873.65   TRAN0802            1.
+    SH080217  BAL0802            -1.   BAL0817             1.
+    SH080317  COST            474.02   TRAN0803            1.
+    SH080317  BAL0803            -1.   BAL0817             1.
+    SH080417  COST             98.61   TRAN0804            1.
+    SH080417  BAL0804            -1.   BAL0817             1.
+    SH080517  COST            515.54   TRAN0805            1.
+    SH080517  BAL0805            -1.   BAL0817             1.
+    SH080717  COST            510.35   TRAN0807            1.
+    SH080717  BAL0864            -1.   BAL0817             1.
+    SH080817  COST             46.71   TRAN0808            1.
+    SH080817  BAL0883            -1.   BAL0817             1.
+    SH080118  COST            302.75   TRAN0801            1.
+    SH080118  BAL0801            -1.   BAL0818             1.
+    SH080218  COST            624.53   TRAN0802            1.
+    SH080218  BAL0802            -1.   BAL0818             1.
+    SH080318  COST             467.1   TRAN0803            1.
+    SH080318  BAL0803            -1.   BAL0818             1.
+    SH080418  COST            266.42   TRAN0804            1.
+    SH080418  BAL0804            -1.   BAL0818             1.
+    SH080518  COST            704.11   TRAN0805            1.
+    SH080518  BAL0805            -1.   BAL0818             1.
+    SH080618  COST            608.96   TRAN0806            1.
+    SH080618  BAL0852            -1.   BAL0818             1.
+    SH080818  COST            178.19   TRAN0808            1.
+    SH080818  BAL0883            -1.   BAL0818             1.
+    SH080119  COST            429.04   TRAN0801            1.
+    SH080119  BAL0801            -1.   BAL0819             1.
+    SH080219  COST           1188.51   TRAN0802            1.
+    SH080219  BAL0802            -1.   BAL0819             1.
+    SH080319  COST            548.41   TRAN0803            1.
+    SH080319  BAL0803            -1.   BAL0819             1.
+    SH080419  COST            275.07   TRAN0804            1.
+    SH080419  BAL0804            -1.   BAL0819             1.
+    SH080519  COST            359.84   TRAN0805            1.
+    SH080519  BAL0805            -1.   BAL0819             1.
+    SH080619  COST            596.85   TRAN0806            1.
+    SH080619  BAL0852            -1.   BAL0819             1.
+    SH080819  COST            171.27   TRAN0808            1.
+    SH080819  BAL0883            -1.   BAL0819             1.
+    SH080120  COST            354.65   TRAN0801            1.
+    SH080120  BAL0801            -1.   BAL0820             1.
+    SH080220  COST           1181.59   TRAN0802            1.
+    SH080220  BAL0802            -1.   BAL0820             1.
+    SH080320  COST            513.81   TRAN0803            1.
+    SH080320  BAL0803            -1.   BAL0820             1.
+    SH080420  COST            195.49   TRAN0804            1.
+    SH080420  BAL0804            -1.   BAL0820             1.
+    SH080520  COST            503.43   TRAN0805            1.
+    SH080520  BAL0805            -1.   BAL0820             1.
+    SH080820  COST            217.98   TRAN0808            1.
+    SH080820  BAL0883            -1.   BAL0820             1.
+    SH080121  COST            697.19   TRAN0801            1.
+    SH080121  BAL0801            -1.   BAL0821             1.
+    SH080221  COST            636.64   TRAN0802            1.
+    SH080221  BAL0802            -1.   BAL0821             1.
+    SH080321  COST            771.58   TRAN0803            1.
+    SH080321  BAL0803            -1.   BAL0821             1.
+    SH080421  COST             553.6   TRAN0804            1.
+    SH080421  BAL0804            -1.   BAL0821             1.
+    SH080521  COST             951.5   TRAN0805            1.
+    SH080521  BAL0805            -1.   BAL0821             1.
+    SH080821  COST             553.6   TRAN0808            1.
+    SH080821  BAL0883            -1.   BAL0821             1.
+    SH080122  COST            429.04   TRAN0801            1.
+    SH080122  BAL0801            -1.   BAL0822             1.
+    SH080222  COST            999.94   TRAN0802            1.
+    SH080222  BAL0802            -1.   BAL0822             1.
+    SH080322  COST            517.27   TRAN0803            1.
+    SH080322  BAL0803            -1.   BAL0822             1.
+    SH080422  COST            387.52   TRAN0804            1.
+    SH080422  BAL0804            -1.   BAL0822             1.
+    SH080522  COST            309.67   TRAN0805            1.
+    SH080522  BAL0805            -1.   BAL0822             1.
+    SH080622  COST             536.3   TRAN0806            1.
+    SH080622  BAL0852            -1.   BAL0822             1.
+    SH080822  COST            240.47   TRAN0808            1.
+    SH080822  BAL0883            -1.   BAL0822             1.
+    SH080123  COST            404.82   TRAN0801            1.
+    SH080123  BAL0801            -1.   BAL0823             1.
+    SH080223  COST            935.93   TRAN0802            1.
+    SH080223  BAL0802            -1.   BAL0823             1.
+    SH080323  COST            496.51   TRAN0803            1.
+    SH080323  BAL0803            -1.   BAL0823             1.
+    SH080423  COST            288.91   TRAN0804            1.
+    SH080423  BAL0804            -1.   BAL0823             1.
+    SH080523  COST            287.18   TRAN0805            1.
+    SH080523  BAL0805            -1.   BAL0823             1.
+    SH080823  COST            240.47   TRAN0808            1.
+    SH080823  BAL0883            -1.   BAL0823             1.
+    SH080124  COST           2484.28   TRAN0801            1.
+    SH080124  BAL0801            -1.   BAL0824             1.
+    SH080125  COST            669.51   TRAN0801            1.
+    SH080125  BAL0801            -1.   BAL0825             1.
+    SH080225  COST            738.71   TRAN0802            1.
+    SH080225  BAL0802            -1.   BAL0825             1.
+    SH080325  COST            884.03   TRAN0803            1.
+    SH080325  BAL0803            -1.   BAL0825             1.
+    SH080425  COST            602.04   TRAN0804            1.
+    SH080425  BAL0804            -1.   BAL0825             1.
+    SH080525  COST            979.18   TRAN0805            1.
+    SH080525  BAL0805            -1.   BAL0825             1.
+    SH080625  COST            697.19   TRAN0806            1.
+    SH080625  BAL0852            -1.   BAL0825             1.
+    SH080825  COST            527.65   TRAN0808            1.
+    SH080825  BAL0883            -1.   BAL0825             1.
+    SH080426  COST             467.1   TRAN0804            1.
+    SH080426  BAL0804            -1.   BAL0826             1.
+    SH080127  COST            404.82   TRAN0801            1.
+    SH080127  BAL0801            -1.   BAL0827             1.
+    SH080227  COST            491.32   TRAN0802            1.
+    SH080227  BAL0802            -1.   BAL0827             1.
+    SH080327  COST            499.97   TRAN0803            1.
+    SH080327  BAL0803            -1.   BAL0827             1.
+    SH080427  COST            579.55   TRAN0804            1.
+    SH080427  BAL0804            -1.   BAL0827             1.
+    SH080527  COST            653.94   TRAN0805            1.
+    SH080527  BAL0805            -1.   BAL0827             1.
+    SH080627  COST            463.64   TRAN0806            1.
+    SH080627  BAL0852            -1.   BAL0827             1.
+    SH080827  COST            435.96   TRAN0808            1.
+    SH080827  BAL0883            -1.   BAL0827             1.
+    SH080128  COST            420.39   TRAN0801            1.
+    SH080128  BAL0801            -1.   BAL0828             1.
+    SH080228  COST            984.37   TRAN0802            1.
+    SH080228  BAL0802            -1.   BAL0828             1.
+    SH080328  COST            512.08   TRAN0803            1.
+    SH080328  BAL0803            -1.   BAL0828             1.
+    SH080428  COST            510.35   TRAN0804            1.
+    SH080428  BAL0804            -1.   BAL0828             1.
+    SH080528  COST            176.46   TRAN0805            1.
+    SH080528  BAL0805            -1.   BAL0828             1.
+    SH080628  COST            451.53   TRAN0806            1.
+    SH080628  BAL0852            -1.   BAL0828             1.
+    SH080728  COST            185.11   TRAN0807            1.
+    SH080728  BAL0864            -1.   BAL0828             1.
+    SH080828  COST            439.42   TRAN0808            1.
+    SH080828  BAL0883            -1.   BAL0828             1.
+    SH080129  COST            385.79   TRAN0801            1.
+    SH080129  BAL0801            -1.   BAL0829             1.
+    SH080229  COST            802.72   TRAN0802            1.
+    SH080229  BAL0802            -1.   BAL0829             1.
+    SH080329  COST            416.93   TRAN0803            1.
+    SH080329  BAL0803            -1.   BAL0829             1.
+    SH080429  COST            344.27   TRAN0804            1.
+    SH080429  BAL0804            -1.   BAL0829             1.
+    SH080529  COST             743.9   TRAN0805            1.
+    SH080529  BAL0805            -1.   BAL0829             1.
+    SH080629  COST            451.53   TRAN0806            1.
+    SH080629  BAL0852            -1.   BAL0829             1.
+    SH080829  COST            249.12   TRAN0808            1.
+    SH080829  BAL0883            -1.   BAL0829             1.
+    SH080130  COST            806.18   TRAN0801            1.
+    SH080130  BAL0801            -1.   BAL0830             1.
+    SH080230  COST            754.28   TRAN0802            1.
+    SH080230  BAL0802            -1.   BAL0830             1.
+    SH080330  COST            904.79   TRAN0803            1.
+    SH080330  BAL0803            -1.   BAL0830             1.
+    SH080430  COST            525.92   TRAN0804            1.
+    SH080430  BAL0804            -1.   BAL0830             1.
+    SH080530  COST            771.58   TRAN0805            1.
+    SH080530  BAL0805            -1.   BAL0830             1.
+    SH080830  COST            660.86   TRAN0808            1.
+    SH080830  BAL0883            -1.   BAL0830             1.
+    SH080131  COST            192.03   TRAN0801            1.
+    SH080131  BAL0801            -1.   BAL0831             1.
+    SH080231  COST            607.23   TRAN0802            1.
+    SH080231  BAL0802            -1.   BAL0831             1.
+    SH080331  COST             190.3   TRAN0803            1.
+    SH080331  BAL0803            -1.   BAL0831             1.
+    SH080431  COST            437.69   TRAN0804            1.
+    SH080431  BAL0804            -1.   BAL0831             1.
+    SH080531  COST            531.11   TRAN0805            1.
+    SH080531  BAL0805            -1.   BAL0831             1.
+    SH080631  COST            193.76   TRAN0806            1.
+    SH080631  BAL0852            -1.   BAL0831             1.
+    SH080831  COST            385.79   TRAN0808            1.
+    SH080831  BAL0883            -1.   BAL0831             1.
+    SH080132  COST            517.27   TRAN0801            1.
+    SH080132  BAL0801            -1.   BAL0832             1.
+    SH080232  COST            826.94   TRAN0802            1.
+    SH080232  BAL0802            -1.   BAL0832             1.
+    SH080332  COST            731.79   TRAN0803            1.
+    SH080332  BAL0803            -1.   BAL0832             1.
+    SH080432  COST            271.61   TRAN0804            1.
+    SH080432  BAL0804            -1.   BAL0832             1.
+    SH080532  COST            678.16   TRAN0805            1.
+    SH080532  BAL0805            -1.   BAL0832             1.
+    SH080832  COST             311.4   TRAN0808            1.
+    SH080832  BAL0883            -1.   BAL0832             1.
+    SH080133  COST            852.89   TRAN0801            1.
+    SH080133  BAL0801            -1.   BAL0833             1.
+    SH080233  COST              692.   TRAN0802            1.
+    SH080233  BAL0802            -1.   BAL0833             1.
+    SH080333  COST            939.39   TRAN0803            1.
+    SH080333  BAL0803            -1.   BAL0833             1.
+    SH080433  COST            769.85   TRAN0804            1.
+    SH080433  BAL0804            -1.   BAL0833             1.
+    SH080533  COST           1091.63   TRAN0805            1.
+    SH080533  BAL0805            -1.   BAL0833             1.
+    SH080833  COST            659.13   TRAN0808            1.
+    SH080833  BAL0883            -1.   BAL0833             1.
+    SH080134  COST            667.78   TRAN0801            1.
+    SH080134  BAL0801            -1.   BAL0834             1.
+    SH080234  COST           1133.15   TRAN0802            1.
+    SH080234  BAL0802            -1.   BAL0834             1.
+    SH080334  COST            870.19   TRAN0803            1.
+    SH080334  BAL0803            -1.   BAL0834             1.
+    SH080434  COST            365.03   TRAN0804            1.
+    SH080434  BAL0804            -1.   BAL0834             1.
+    SH080534  COST            762.93   TRAN0805            1.
+    SH080534  BAL0805            -1.   BAL0834             1.
+    SH080834  COST            454.99   TRAN0808            1.
+    SH080834  BAL0883            -1.   BAL0834             1.
+    SH080135  COST            797.53   TRAN0801            1.
+    SH080135  BAL0801            -1.   BAL0835             1.
+    SH080235  COST            769.85   TRAN0802            1.
+    SH080235  BAL0802            -1.   BAL0835             1.
+    SH080335  COST            652.21   TRAN0803            1.
+    SH080335  BAL0803            -1.   BAL0835             1.
+    SH080435  COST            211.06   TRAN0804            1.
+    SH080435  BAL0804            -1.   BAL0835             1.
+    SH080535  COST            745.63   TRAN0805            1.
+    SH080535  BAL0805            -1.   BAL0835             1.
+    SH080835  COST            406.55   TRAN0808            1.
+    SH080835  BAL0883            -1.   BAL0835             1.
+    SH080136  COST            354.65   TRAN0801            1.
+    SH080136  BAL0801            -1.   BAL0836             1.
+    SH080236  COST            775.04   TRAN0802            1.
+    SH080236  BAL0802            -1.   BAL0836             1.
+    SH080336  COST            183.38   TRAN0803            1.
+    SH080336  BAL0803            -1.   BAL0836             1.
+    SH080436  COST             640.1   TRAN0804            1.
+    SH080436  BAL0804            -1.   BAL0836             1.
+    SH080536  COST            598.58   TRAN0805            1.
+    SH080536  BAL0805            -1.   BAL0836             1.
+    SH080636  COST             190.3   TRAN0806            1.
+    SH080636  BAL0852            -1.   BAL0836             1.
+    SH080836  COST            555.33   TRAN0808            1.
+    SH080836  BAL0883            -1.   BAL0836             1.
+    SH080137  COST            159.16   TRAN0801            1.
+    SH080137  BAL0801            -1.   BAL0837             1.
+    SH080237  COST            591.66   TRAN0802            1.
+    SH080237  BAL0802            -1.   BAL0837             1.
+    SH080337  COST            273.34   TRAN0803            1.
+    SH080337  BAL0803            -1.   BAL0837             1.
+    SH080437  COST            525.92   TRAN0804            1.
+    SH080437  BAL0804            -1.   BAL0837             1.
+    SH080537  COST            314.86   TRAN0805            1.
+    SH080537  BAL0805            -1.   BAL0837             1.
+    SH080637  COST            335.62   TRAN0806            1.
+    SH080637  BAL0852            -1.   BAL0837             1.
+    SH080837  COST            435.96   TRAN0808            1.
+    SH080837  BAL0883            -1.   BAL0837             1.
+    SH080138  COST            235.28   TRAN0801            1.
+    SH080138  BAL0801            -1.   BAL0838             1.
+    SH080238  COST            422.12   TRAN0802            1.
+    SH080238  BAL0802            -1.   BAL0838             1.
+    SH080338  COST            164.35   TRAN0803            1.
+    SH080338  BAL0803            -1.   BAL0838             1.
+    SH080438  COST            532.84   TRAN0804            1.
+    SH080438  BAL0804            -1.   BAL0838             1.
+    SH080538  COST            480.94   TRAN0805            1.
+    SH080538  BAL0805            -1.   BAL0838             1.
+    SH080638  COST             67.47   TRAN0806            1.
+    SH080638  BAL0852            -1.   BAL0838             1.
+    SH080738  COST            373.68   TRAN0807            1.
+    SH080738  BAL0864            -1.   BAL0838             1.
+    SH080838  COST            410.01   TRAN0808            1.
+    SH080838  BAL0883            -1.   BAL0838             1.
+    SH080139  COST             224.9   TRAN0801            1.
+    SH080139  BAL0801            -1.   BAL0839             1.
+    SH080239  COST            586.47   TRAN0802            1.
+    SH080239  BAL0802            -1.   BAL0839             1.
+    SH080339  COST             276.8   TRAN0803            1.
+    SH080339  BAL0803            -1.   BAL0839             1.
+    SH080439  COST            430.77   TRAN0804            1.
+    SH080439  BAL0804            -1.   BAL0839             1.
+    SH080539  COST            742.17   TRAN0805            1.
+    SH080539  BAL0805            -1.   BAL0839             1.
+    SH080639  COST            352.92   TRAN0806            1.
+    SH080639  BAL0852            -1.   BAL0839             1.
+    SH080839  COST            290.64   TRAN0808            1.
+    SH080839  BAL0883            -1.   BAL0839             1.
+    SH080140  COST            285.45   TRAN0801            1.
+    SH080140  BAL0801            -1.   BAL0840             1.
+    SH080240  COST            653.94   TRAN0802            1.
+    SH080240  BAL0802            -1.   BAL0840             1.
+    SH080340  COST            178.19   TRAN0803            1.
+    SH080340  BAL0803            -1.   BAL0840             1.
+    SH080440  COST            513.81   TRAN0804            1.
+    SH080440  BAL0804            -1.   BAL0840             1.
+    SH080540  COST            382.33   TRAN0805            1.
+    SH080540  BAL0805            -1.   BAL0840             1.
+    SH080640  COST            226.63   TRAN0806            1.
+    SH080640  BAL0852            -1.   BAL0840             1.
+    SH080840  COST            474.02   TRAN0808            1.
+    SH080840  BAL0883            -1.   BAL0840             1.
+    SH080141  COST            339.08   TRAN0801            1.
+    SH080141  BAL0801            -1.   BAL0841             1.
+    SH080241  COST              519.   TRAN0802            1.
+    SH080241  BAL0802            -1.   BAL0841             1.
+    SH080341  COST             259.5   TRAN0803            1.
+    SH080341  BAL0803            -1.   BAL0841             1.
+    SH080441  COST            560.52   TRAN0804            1.
+    SH080441  BAL0804            -1.   BAL0841             1.
+    SH080541  COST            636.64   TRAN0805            1.
+    SH080541  BAL0805            -1.   BAL0841             1.
+    SH080641  COST              173.   TRAN0806            1.
+    SH080641  BAL0852            -1.   BAL0841             1.
+    SH080841  COST            517.27   TRAN0808            1.
+    SH080841  BAL0883            -1.   BAL0841             1.
+    SH080142  COST             155.7   TRAN0801            1.
+    SH080142  BAL0801            -1.   BAL0842             1.
+    SH080242  COST            716.22   TRAN0802            1.
+    SH080242  BAL0802            -1.   BAL0842             1.
+    SH080342  COST             276.8   TRAN0803            1.
+    SH080342  BAL0803            -1.   BAL0842             1.
+    SH080442  COST            337.35   TRAN0804            1.
+    SH080442  BAL0804            -1.   BAL0842             1.
+    SH080542  COST            624.53   TRAN0805            1.
+    SH080542  BAL0805            -1.   BAL0842             1.
+    SH080642  COST            278.53   TRAN0806            1.
+    SH080642  BAL0852            -1.   BAL0842             1.
+    SH080842  COST            262.96   TRAN0808            1.
+    SH080842  BAL0883            -1.   BAL0842             1.
+    SH080143  COST            275.07   TRAN0801            1.
+    SH080143  BAL0801            -1.   BAL0843             1.
+    SH080243  COST            683.35   TRAN0802            1.
+    SH080243  BAL0802            -1.   BAL0843             1.
+    SH080343  COST             43.25   TRAN0803            1.
+    SH080343  BAL0803            -1.   BAL0843             1.
+    SH080443  COST            512.08   TRAN0804            1.
+    SH080443  BAL0804            -1.   BAL0843             1.
+    SH080543  COST            446.34   TRAN0805            1.
+    SH080543  BAL0805            -1.   BAL0843             1.
+    SH080643  COST              173.   TRAN0806            1.
+    SH080643  BAL0852            -1.   BAL0843             1.
+    SH080743  COST            416.93   TRAN0807            1.
+    SH080743  BAL0864            -1.   BAL0843             1.
+    SH080843  COST            468.83   TRAN0808            1.
+    SH080843  BAL0883            -1.   BAL0843             1.
+    SH080144  COST            275.07   TRAN0801            1.
+    SH080144  BAL0801            -1.   BAL0844             1.
+    SH080244  COST            655.67   TRAN0802            1.
+    SH080244  BAL0802            -1.   BAL0844             1.
+    SH080344  COST            221.44   TRAN0803            1.
+    SH080344  BAL0803            -1.   BAL0844             1.
+    SH080444  COST            539.76   TRAN0804            1.
+    SH080444  BAL0804            -1.   BAL0844             1.
+    SH080544  COST             536.3   TRAN0805            1.
+    SH080544  BAL0805            -1.   BAL0844             1.
+    SH080644  COST            153.97   TRAN0806            1.
+    SH080644  BAL0852            -1.   BAL0844             1.
+    SH080844  COST            515.54   TRAN0808            1.
+    SH080844  BAL0883            -1.   BAL0844             1.
+    SH080145  COST            297.56   TRAN0801            1.
+    SH080145  BAL0801            -1.   BAL0845             1.
+    SH080245  COST            754.28   TRAN0802            1.
+    SH080245  BAL0802            -1.   BAL0845             1.
+    SH080345  COST            278.53   TRAN0803            1.
+    SH080345  BAL0803            -1.   BAL0845             1.
+    SH080445  COST            505.16   TRAN0804            1.
+    SH080445  BAL0804            -1.   BAL0845             1.
+    SH080545  COST            404.82   TRAN0805            1.
+    SH080545  BAL0805            -1.   BAL0845             1.
+    SH080645  COST            330.43   TRAN0806            1.
+    SH080645  BAL0852            -1.   BAL0845             1.
+    SH080745  COST            340.81   TRAN0807            1.
+    SH080745  BAL0864            -1.   BAL0845             1.
+    SH080845  COST            527.65   TRAN0808            1.
+    SH080845  BAL0883            -1.   BAL0845             1.
+    SH080146  COST            423.85   TRAN0801            1.
+    SH080146  BAL0801            -1.   BAL0846             1.
+    SH080246  COST            472.29   TRAN0802            1.
+    SH080246  BAL0802            -1.   BAL0846             1.
+    SH080346  COST            382.33   TRAN0803            1.
+    SH080346  BAL0803            -1.   BAL0846             1.
+    SH080446  COST            773.31   TRAN0804            1.
+    SH080446  BAL0804            -1.   BAL0846             1.
+    SH080546  COST             743.9   TRAN0805            1.
+    SH080546  BAL0805            -1.   BAL0846             1.
+    SH080646  COST            444.61   TRAN0806            1.
+    SH080646  BAL0852            -1.   BAL0846             1.
+    SH080846  COST            775.04   TRAN0808            1.
+    SH080846  BAL0883            -1.   BAL0846             1.
+    SH080147  COST             190.3   TRAN0801            1.
+    SH080147  BAL0801            -1.   BAL0847             1.
+    SH080247  COST            645.29   TRAN0802            1.
+    SH080247  BAL0802            -1.   BAL0847             1.
+    SH080347  COST            275.07   TRAN0803            1.
+    SH080347  BAL0803            -1.   BAL0847             1.
+    SH080447  COST            474.02   TRAN0804            1.
+    SH080447  BAL0804            -1.   BAL0847             1.
+    SH080547  COST            403.09   TRAN0805            1.
+    SH080547  BAL0805            -1.   BAL0847             1.
+    SH080647  COST            250.85   TRAN0806            1.
+    SH080647  BAL0852            -1.   BAL0847             1.
+    SH080847  COST            422.12   TRAN0808            1.
+    SH080847  BAL0883            -1.   BAL0847             1.
+    SH080148  COST            164.35   TRAN0801            1.
+    SH080148  BAL0801            -1.   BAL0848             1.
+    SH080248  COST            586.47   TRAN0802            1.
+    SH080248  BAL0802            -1.   BAL0848             1.
+    SH080348  COST            237.01   TRAN0803            1.
+    SH080348  BAL0803            -1.   BAL0848             1.
+    SH080448  COST             397.9   TRAN0804            1.
+    SH080448  BAL0804            -1.   BAL0848             1.
+    SH080548  COST            427.31   TRAN0805            1.
+    SH080548  BAL0805            -1.   BAL0848             1.
+    SH080648  COST            198.95   TRAN0806            1.
+    SH080648  BAL0852            -1.   BAL0848             1.
+    SH080848  COST            337.35   TRAN0808            1.
+    SH080848  BAL0883            -1.   BAL0848             1.
+    SH080149  COST            569.17   TRAN0801            1.
+    SH080149  BAL0801            -1.   BAL0849             1.
+    SH080249  COST            925.55   TRAN0802            1.
+    SH080249  BAL0802            -1.   BAL0849             1.
+    SH080349  COST            574.36   TRAN0803            1.
+    SH080349  BAL0803            -1.   BAL0849             1.
+    SH080449  COST            659.13   TRAN0804            1.
+    SH080449  BAL0804            -1.   BAL0849             1.
+    SH080549  COST            262.96   TRAN0805            1.
+    SH080549  BAL0805            -1.   BAL0849             1.
+    SH080649  COST            584.74   TRAN0806            1.
+    SH080649  BAL0852            -1.   BAL0849             1.
+    SH080749  COST            231.82   TRAN0807            1.
+    SH080749  BAL0864            -1.   BAL0849             1.
+    SH080849  COST            705.84   TRAN0808            1.
+    SH080849  BAL0883            -1.   BAL0849             1.
+    SH080150  COST            416.93   TRAN0801            1.
+    SH080150  BAL0801            -1.   BAL0850             1.
+    SH080250  COST           1058.76   TRAN0802            1.
+    SH080250  BAL0802            -1.   BAL0850             1.
+    SH080350  COST            425.58   TRAN0803            1.
+    SH080350  BAL0803            -1.   BAL0850             1.
+    SH080450  COST            631.45   TRAN0804            1.
+    SH080450  BAL0804            -1.   BAL0850             1.
+    SH080550  COST            406.55   TRAN0805            1.
+    SH080550  BAL0805            -1.   BAL0850             1.
+    SH080750  COST            237.01   TRAN0807            1.
+    SH080750  BAL0864            -1.   BAL0850             1.
+    SH080850  COST            702.38   TRAN0808            1.
+    SH080850  BAL0883            -1.   BAL0850             1.
+    SH080151  COST            574.36   TRAN0801            1.
+    SH080151  BAL0801            -1.   BAL0851             1.
+    SH080251  COST             951.5   TRAN0802            1.
+    SH080251  BAL0802            -1.   BAL0851             1.
+    SH080351  COST            589.93   TRAN0803            1.
+    SH080351  BAL0803            -1.   BAL0851             1.
+    SH080451  COST            584.74   TRAN0804            1.
+    SH080451  BAL0804            -1.   BAL0851             1.
+    SH080551  COST            212.79   TRAN0805            1.
+    SH080551  BAL0805            -1.   BAL0851             1.
+    SH080751  COST            171.27   TRAN0807            1.
+    SH080751  BAL0864            -1.   BAL0851             1.
+    SH080851  COST            740.44   TRAN0808            1.
+    SH080851  BAL0883            -1.   BAL0851             1.
+    SH080152  COST            193.76   TRAN0801            1.
+    SH080152  BAL0801            -1.   BAL0852             1.
+    SH080252  COST              519.   TRAN0802            1.
+    SH080252  BAL0802            -1.   BAL0852             1.
+    SH080352  COST            141.86   TRAN0803            1.
+    SH080352  BAL0803            -1.   BAL0852             1.
+    SH080452  COST            557.06   TRAN0804            1.
+    SH080452  BAL0804            -1.   BAL0852             1.
+    SH080552  COST            510.35   TRAN0805            1.
+    SH080552  BAL0805            -1.   BAL0852             1.
+    SH080852  COST            437.69   TRAN0808            1.
+    SH080852  BAL0883            -1.   BAL0852             1.
+    SH080153  COST            621.07   TRAN0801            1.
+    SH080153  BAL0801            -1.   BAL0853             1.
+    SH080253  COST           1100.28   TRAN0802            1.
+    SH080253  BAL0802            -1.   BAL0853             1.
+    SH080353  COST            562.25   TRAN0803            1.
+    SH080353  BAL0803            -1.   BAL0853             1.
+    SH080453  COST            712.76   TRAN0804            1.
+    SH080453  BAL0804            -1.   BAL0853             1.
+    SH080553  COST            318.32   TRAN0805            1.
+    SH080553  BAL0805            -1.   BAL0853             1.
+    SH080653  COST            621.07   TRAN0806            1.
+    SH080653  BAL0852            -1.   BAL0853             1.
+    SH080753  COST            252.58   TRAN0807            1.
+    SH080753  BAL0864            -1.   BAL0853             1.
+    SH080853  COST            697.19   TRAN0808            1.
+    SH080853  BAL0883            -1.   BAL0853             1.
+    SH080154  COST            320.05   TRAN0801            1.
+    SH080154  BAL0801            -1.   BAL0854             1.
+    SH080254  COST            769.85   TRAN0802            1.
+    SH080254  BAL0802            -1.   BAL0854             1.
+    SH080354  COST            375.41   TRAN0803            1.
+    SH080354  BAL0803            -1.   BAL0854             1.
+    SH080454  COST            593.39   TRAN0804            1.
+    SH080454  BAL0804            -1.   BAL0854             1.
+    SH080554  COST            368.49   TRAN0805            1.
+    SH080554  BAL0805            -1.   BAL0854             1.
+    SH080654  COST            351.19   TRAN0806            1.
+    SH080654  BAL0852            -1.   BAL0854             1.
+    SH080854  COST            695.46   TRAN0808            1.
+    SH080854  BAL0883            -1.   BAL0854             1.
+    SH080155  COST            480.94   TRAN0801            1.
+    SH080155  BAL0801            -1.   BAL0855             1.
+    SH080255  COST            828.67   TRAN0802            1.
+    SH080255  BAL0802            -1.   BAL0855             1.
+    SH080355  COST            486.13   TRAN0803            1.
+    SH080355  BAL0803            -1.   BAL0855             1.
+    SH080455  COST            508.62   TRAN0804            1.
+    SH080455  BAL0804            -1.   BAL0855             1.
+    SH080555  COST            266.42   TRAN0805            1.
+    SH080555  BAL0805            -1.   BAL0855             1.
+    SH080655  COST             501.7   TRAN0806            1.
+    SH080655  BAL0852            -1.   BAL0855             1.
+    SH080755  COST            185.11   TRAN0807            1.
+    SH080755  BAL0864            -1.   BAL0855             1.
+    SH080855  COST            508.62   TRAN0808            1.
+    SH080855  BAL0883            -1.   BAL0855             1.
+    SH080156  COST             674.7   TRAN0801            1.
+    SH080156  BAL0801            -1.   BAL0856             1.
+    SH080256  COST           1001.67   TRAN0802            1.
+    SH080256  BAL0802            -1.   BAL0856             1.
+    SH080356  COST            527.65   TRAN0803            1.
+    SH080356  BAL0803            -1.   BAL0856             1.
+    SH080456  COST            631.45   TRAN0804            1.
+    SH080456  BAL0804            -1.   BAL0856             1.
+    SH080556  COST            235.28   TRAN0805            1.
+    SH080556  BAL0805            -1.   BAL0856             1.
+    SH080656  COST            586.47   TRAN0806            1.
+    SH080656  BAL0852            -1.   BAL0856             1.
+    SH080756  COST            211.06   TRAN0807            1.
+    SH080756  BAL0864            -1.   BAL0856             1.
+    SH080856  COST            617.61   TRAN0808            1.
+    SH080856  BAL0883            -1.   BAL0856             1.
+    SH080157  COST            451.53   TRAN0801            1.
+    SH080157  BAL0801            -1.   BAL0857             1.
+    SH080257  COST             899.6   TRAN0802            1.
+    SH080257  BAL0802            -1.   BAL0857             1.
+    SH080357  COST             501.7   TRAN0803            1.
+    SH080357  BAL0803            -1.   BAL0857             1.
+    SH080457  COST            404.82   TRAN0804            1.
+    SH080457  BAL0804            -1.   BAL0857             1.
+    SH080557  COST            290.64   TRAN0805            1.
+    SH080557  BAL0805            -1.   BAL0857             1.
+    SH080657  COST            551.87   TRAN0806            1.
+    SH080657  BAL0852            -1.   BAL0857             1.
+    SH080757  COST            256.04   TRAN0807            1.
+    SH080757  BAL0864            -1.   BAL0857             1.
+    SH080857  COST            399.63   TRAN0808            1.
+    SH080857  BAL0883            -1.   BAL0857             1.
+    SH080158  COST            508.62   TRAN0801            1.
+    SH080158  BAL0801            -1.   BAL0858             1.
+    SH080258  COST            901.33   TRAN0802            1.
+    SH080258  BAL0802            -1.   BAL0858             1.
+    SH080358  COST            480.94   TRAN0803            1.
+    SH080358  BAL0803            -1.   BAL0858             1.
+    SH080458  COST            593.39   TRAN0804            1.
+    SH080458  BAL0804            -1.   BAL0858             1.
+    SH080558  COST             36.33   TRAN0805            1.
+    SH080558  BAL0805            -1.   BAL0858             1.
+    SH080658  COST            563.98   TRAN0806            1.
+    SH080658  BAL0852            -1.   BAL0858             1.
+    SH080758  COST            117.64   TRAN0807            1.
+    SH080758  BAL0864            -1.   BAL0858             1.
+    SH080858  COST            439.42   TRAN0808            1.
+    SH080858  BAL0883            -1.   BAL0858             1.
+    SH080159  COST            356.38   TRAN0801            1.
+    SH080159  BAL0801            -1.   BAL0859             1.
+    SH080259  COST            861.54   TRAN0802            1.
+    SH080259  BAL0802            -1.   BAL0859             1.
+    SH080359  COST            411.74   TRAN0803            1.
+    SH080359  BAL0803            -1.   BAL0859             1.
+    SH080459  COST            422.12   TRAN0804            1.
+    SH080459  BAL0804            -1.   BAL0859             1.
+    SH080559  COST            275.07   TRAN0805            1.
+    SH080559  BAL0805            -1.   BAL0859             1.
+    SH080659  COST            513.81   TRAN0806            1.
+    SH080659  BAL0852            -1.   BAL0859             1.
+    SH080759  COST            181.65   TRAN0807            1.
+    SH080759  BAL0864            -1.   BAL0859             1.
+    SH080859  COST            441.15   TRAN0808            1.
+    SH080859  BAL0883            -1.   BAL0859             1.
+    SH080160  COST            451.53   TRAN0801            1.
+    SH080160  BAL0801            -1.   BAL0860             1.
+    SH080260  COST             951.5   TRAN0802            1.
+    SH080260  BAL0802            -1.   BAL0860             1.
+    SH080360  COST            489.59   TRAN0803            1.
+    SH080360  BAL0803            -1.   BAL0860             1.
+    SH080460  COST            539.76   TRAN0804            1.
+    SH080460  BAL0804            -1.   BAL0860             1.
+    SH080560  COST            233.55   TRAN0805            1.
+    SH080560  BAL0805            -1.   BAL0860             1.
+    SH080660  COST            558.79   TRAN0806            1.
+    SH080660  BAL0852            -1.   BAL0860             1.
+    SH080760  COST            152.24   TRAN0807            1.
+    SH080760  BAL0864            -1.   BAL0860             1.
+    SH080860  COST            517.27   TRAN0808            1.
+    SH080860  BAL0883            -1.   BAL0860             1.
+    SH080163  COST            460.18   TRAN0801            1.
+    SH080163  BAL0801            -1.   BAL0863             1.
+    SH080263  COST            854.62   TRAN0802            1.
+    SH080263  BAL0802            -1.   BAL0863             1.
+    SH080363  COST            496.51   TRAN0803            1.
+    SH080363  BAL0803            -1.   BAL0863             1.
+    SH080463  COST            638.37   TRAN0804            1.
+    SH080463  BAL0804            -1.   BAL0863             1.
+    SH080563  COST            262.96   TRAN0805            1.
+    SH080563  BAL0805            -1.   BAL0863             1.
+    SH080663  COST            544.95   TRAN0806            1.
+    SH080663  BAL0852            -1.   BAL0863             1.
+    SH080763  COST            214.52   TRAN0807            1.
+    SH080763  BAL0864            -1.   BAL0863             1.
+    SH080863  COST              692.   TRAN0808            1.
+    SH080863  BAL0883            -1.   BAL0863             1.
+    SH080164  COST            344.27   TRAN0801            1.
+    SH080164  BAL0801            -1.   BAL0864             1.
+    SH080264  COST            909.98   TRAN0802            1.
+    SH080264  BAL0802            -1.   BAL0864             1.
+    SH080364  COST            385.79   TRAN0803            1.
+    SH080364  BAL0803            -1.   BAL0864             1.
+    SH080464  COST            581.28   TRAN0804            1.
+    SH080464  BAL0804            -1.   BAL0864             1.
+    SH080564  COST            100.34   TRAN0805            1.
+    SH080564  BAL0805            -1.   BAL0864             1.
+    SH080664  COST            548.41   TRAN0806            1.
+    SH080664  BAL0852            -1.   BAL0864             1.
+    SH080864  COST             432.5   TRAN0808            1.
+    SH080864  BAL0883            -1.   BAL0864             1.
+    SH080165  COST            747.36   TRAN0801            1.
+    SH080165  BAL0801            -1.   BAL0865             1.
+    SH080265  COST            531.11   TRAN0802            1.
+    SH080265  BAL0802            -1.   BAL0865             1.
+    SH080365  COST            873.65   TRAN0803            1.
+    SH080365  BAL0803            -1.   BAL0865             1.
+    SH080465  COST            671.24   TRAN0804            1.
+    SH080465  BAL0804            -1.   BAL0865             1.
+    SH080565  COST           1044.92   TRAN0805            1.
+    SH080565  BAL0805            -1.   BAL0865             1.
+    SH080865  COST            717.95   TRAN0808            1.
+    SH080865  BAL0883            -1.   BAL0865             1.
+    SH080166  COST             968.8   TRAN0801            1.
+    SH080166  BAL0801            -1.   BAL0866             1.
+    SH080266  COST            448.07   TRAN0802            1.
+    SH080266  BAL0802            -1.   BAL0866             1.
+    SH080366  COST            999.94   TRAN0803            1.
+    SH080366  BAL0803            -1.   BAL0866             1.
+    SH080466  COST            961.88   TRAN0804            1.
+    SH080466  BAL0804            -1.   BAL0866             1.
+    SH080566  COST            1228.3   TRAN0805            1.
+    SH080566  BAL0805            -1.   BAL0866             1.
+    SH080866  COST             968.8   TRAN0808            1.
+    SH080866  BAL0883            -1.   BAL0866             1.
+    SH080167  COST            735.25   TRAN0801            1.
+    SH080167  BAL0801            -1.   BAL0867             1.
+    SH080267  COST            401.36   TRAN0802            1.
+    SH080267  BAL0802            -1.   BAL0867             1.
+    SH080367  COST            852.89   TRAN0803            1.
+    SH080367  BAL0803            -1.   BAL0867             1.
+    SH080467  COST            790.61   TRAN0804            1.
+    SH080467  BAL0804            -1.   BAL0867             1.
+    SH080567  COST           1044.92   TRAN0805            1.
+    SH080567  BAL0805            -1.   BAL0867             1.
+    SH080867  COST            792.34   TRAN0808            1.
+    SH080867  BAL0883            -1.   BAL0867             1.
+    SH080168  COST           1027.62   TRAN0801            1.
+    SH080168  BAL0801            -1.   BAL0868             1.
+    SH080268  COST              692.   TRAN0802            1.
+    SH080268  BAL0802            -1.   BAL0868             1.
+    SH080368  COST             968.8   TRAN0803            1.
+    SH080368  BAL0803            -1.   BAL0868             1.
+    SH080468  COST           1214.46   TRAN0804            1.
+    SH080468  BAL0804            -1.   BAL0868             1.
+    SH080568  COST           1636.58   TRAN0805            1.
+    SH080568  BAL0805            -1.   BAL0868             1.
+    SH080868  COST           1299.23   TRAN0808            1.
+    SH080868  BAL0883            -1.   BAL0868             1.
+    SH080169  COST            932.47   TRAN0801            1.
+    SH080169  BAL0801            -1.   BAL0869             1.
+    SH080269  COST            382.33   TRAN0802            1.
+    SH080269  BAL0802            -1.   BAL0869             1.
+    SH080369  COST             882.3   TRAN0803            1.
+    SH080369  BAL0803            -1.   BAL0869             1.
+    SH080469  COST           1076.06   TRAN0804            1.
+    SH080469  BAL0804            -1.   BAL0869             1.
+    SH080569  COST           1117.58   TRAN0805            1.
+    SH080569  BAL0805            -1.   BAL0869             1.
+    SH080869  COST           1138.34   TRAN0808            1.
+    SH080869  BAL0883            -1.   BAL0869             1.
+    SH080171  COST             761.2   TRAN0801            1.
+    SH080171  BAL0801            -1.   BAL0871             1.
+    SH080371  COST            906.52   TRAN0803            1.
+    SH080371  BAL0803            -1.   BAL0871             1.
+    SH080471  COST            901.33   TRAN0804            1.
+    SH080471  BAL0804            -1.   BAL0871             1.
+    SH080571  COST           1005.13   TRAN0805            1.
+    SH080571  BAL0805            -1.   BAL0871             1.
+    SH080671  COST            676.43   TRAN0806            1.
+    SH080671  BAL0852            -1.   BAL0871             1.
+    SH080771  COST           1217.92   TRAN0807            1.
+    SH080771  BAL0864            -1.   BAL0871             1.
+    SH080871  COST            922.09   TRAN0808            1.
+    SH080871  BAL0883            -1.   BAL0871             1.
+    SH080172  COST           1015.51   TRAN0801            1.
+    SH080172  BAL0801            -1.   BAL0872             1.
+    SH080272  COST            939.39   TRAN0802            1.
+    SH080272  BAL0802            -1.   BAL0872             1.
+    SH080372  COST           1067.41   TRAN0803            1.
+    SH080372  BAL0803            -1.   BAL0872             1.
+    SH080472  COST             986.1   TRAN0804            1.
+    SH080472  BAL0804            -1.   BAL0872             1.
+    SH080572  COST           1319.99   TRAN0805            1.
+    SH080572  BAL0805            -1.   BAL0872             1.
+    SH080872  COST             986.1   TRAN0808            1.
+    SH080872  BAL0883            -1.   BAL0872             1.
+    SH080173  COST             674.7   TRAN0801            1.
+    SH080173  BAL0801            -1.   BAL0873             1.
+    SH080273  COST            631.45   TRAN0802            1.
+    SH080273  BAL0802            -1.   BAL0873             1.
+    SH080373  COST            584.74   TRAN0803            1.
+    SH080373  BAL0803            -1.   BAL0873             1.
+    SH080473  COST            790.61   TRAN0804            1.
+    SH080473  BAL0804            -1.   BAL0873             1.
+    SH080573  COST            975.72   TRAN0805            1.
+    SH080573  BAL0805            -1.   BAL0873             1.
+    SH080673  COST            527.65   TRAN0806            1.
+    SH080673  BAL0852            -1.   BAL0873             1.
+    SH080873  COST            871.92   TRAN0808            1.
+    SH080873  BAL0883            -1.   BAL0873             1.
+    SH080174  COST            948.04   TRAN0801            1.
+    SH080174  BAL0801            -1.   BAL0874             1.
+    SH080274  COST             363.3   TRAN0802            1.
+    SH080274  BAL0802            -1.   BAL0874             1.
+    SH080374  COST             986.1   TRAN0803            1.
+    SH080374  BAL0803            -1.   BAL0874             1.
+    SH080474  COST           1102.01   TRAN0804            1.
+    SH080474  BAL0804            -1.   BAL0874             1.
+    SH080574  COST           1268.09   TRAN0805            1.
+    SH080574  BAL0805            -1.   BAL0874             1.
+    SH080874  COST           1070.87   TRAN0808            1.
+    SH080874  BAL0883            -1.   BAL0874             1.
+    SH080275  COST            958.42   TRAN0802            1.
+    SH080275  BAL0802            -1.   BAL0875             1.
+    SH080176  COST            799.26   TRAN0801            1.
+    SH080176  BAL0801            -1.   BAL0876             1.
+    SH080276  COST            693.73   TRAN0802            1.
+    SH080276  BAL0802            -1.   BAL0876             1.
+    SH080376  COST            697.19   TRAN0803            1.
+    SH080376  BAL0803            -1.   BAL0876             1.
+    SH080476  COST            1089.9   TRAN0804            1.
+    SH080476  BAL0804            -1.   BAL0876             1.
+    SH080576  COST            1089.9   TRAN0805            1.
+    SH080576  BAL0805            -1.   BAL0876             1.
+    SH080676  COST            659.13   TRAN0806            1.
+    SH080676  BAL0852            -1.   BAL0876             1.
+    SH080876  COST           1344.21   TRAN0808            1.
+    SH080876  BAL0883            -1.   BAL0876             1.
+    SH080177  COST            752.55   TRAN0801            1.
+    SH080177  BAL0801            -1.   BAL0877             1.
+    SH080277  COST            470.56   TRAN0802            1.
+    SH080277  BAL0802            -1.   BAL0877             1.
+    SH080377  COST            797.53   TRAN0803            1.
+    SH080377  BAL0803            -1.   BAL0877             1.
+    SH080477  COST            693.73   TRAN0804            1.
+    SH080477  BAL0804            -1.   BAL0877             1.
+    SH080577  COST             968.8   TRAN0805            1.
+    SH080577  BAL0805            -1.   BAL0877             1.
+    SH080877  COST             553.6   TRAN0808            1.
+    SH080877  BAL0883            -1.   BAL0877             1.
+    SH080178  COST           1316.53   TRAN0801            1.
+    SH080178  BAL0801            -1.   BAL0878             1.
+    SH080278  COST            764.66   TRAN0802            1.
+    SH080278  BAL0802            -1.   BAL0878             1.
+    SH080378  COST           1354.59   TRAN0803            1.
+    SH080378  BAL0803            -1.   BAL0878             1.
+    SH080478  COST           1185.05   TRAN0804            1.
+    SH080478  BAL0804            -1.   BAL0878             1.
+    SH080578  COST           1520.67   TRAN0805            1.
+    SH080578  BAL0805            -1.   BAL0878             1.
+    SH080878  COST           1325.18   TRAN0808            1.
+    SH080878  BAL0883            -1.   BAL0878             1.
+    SH080179  COST           1236.95   TRAN0801            1.
+    SH080179  BAL0801            -1.   BAL0879             1.
+    SH080279  COST            465.37   TRAN0802            1.
+    SH080279  BAL0802            -1.   BAL0879             1.
+    SH080379  COST           1195.43   TRAN0803            1.
+    SH080379  BAL0803            -1.   BAL0879             1.
+    SH080479  COST            1245.6   TRAN0804            1.
+    SH080479  BAL0804            -1.   BAL0879             1.
+    SH080879  COST           1221.38   TRAN0808            1.
+    SH080879  BAL0883            -1.   BAL0879             1.
+    SH080180  COST            548.41   TRAN0801            1.
+    SH080180  BAL0801            -1.   BAL0880             1.
+    SH080280  COST            683.35   TRAN0802            1.
+    SH080280  BAL0802            -1.   BAL0880             1.
+    SH080380  COST            756.01   TRAN0803            1.
+    SH080380  BAL0803            -1.   BAL0880             1.
+    SH080480  COST            647.02   TRAN0804            1.
+    SH080480  BAL0804            -1.   BAL0880             1.
+    SH080580  COST            873.65   TRAN0805            1.
+    SH080580  BAL0805            -1.   BAL0880             1.
+    SH080880  COST             415.2   TRAN0808            1.
+    SH080880  BAL0883            -1.   BAL0880             1.
+    SH080182  COST           1006.86   TRAN0801            1.
+    SH080182  BAL0801            -1.   BAL0882             1.
+    SH080282  COST            569.17   TRAN0802            1.
+    SH080282  BAL0802            -1.   BAL0882             1.
+    SH080382  COST           1133.15   TRAN0803            1.
+    SH080382  BAL0803            -1.   BAL0882             1.
+    SH080482  COST           1221.38   TRAN0804            1.
+    SH080482  BAL0804            -1.   BAL0882             1.
+    SH080582  COST           1984.31   TRAN0805            1.
+    SH080582  BAL0805            -1.   BAL0882             1.
+    SH080882  COST           1354.59   TRAN0808            1.
+    SH080882  BAL0883            -1.   BAL0882             1.
+    SH080183  COST            306.21   TRAN0801            1.
+    SH080183  BAL0801            -1.   BAL0883             1.
+    SH080283  COST             899.6   TRAN0802            1.
+    SH080283  BAL0802            -1.   BAL0883             1.
+    SH080383  COST            470.56   TRAN0803            1.
+    SH080383  BAL0803            -1.   BAL0883             1.
+    SH080483  COST            102.07   TRAN0804            1.
+    SH080483  BAL0804            -1.   BAL0883             1.
+    SH080583  COST            600.31   TRAN0805            1.
+    SH080583  BAL0805            -1.   BAL0883             1.
+    SH080683  COST            429.04   TRAN0806            1.
+    SH080683  BAL0852            -1.   BAL0883             1.
+    SH080184  COST            525.92   TRAN0801            1.
+    SH080184  BAL0801            -1.   BAL0884             1.
+    SH080284  COST            332.16   TRAN0802            1.
+    SH080284  BAL0802            -1.   BAL0884             1.
+    SH080384  COST            629.72   TRAN0803            1.
+    SH080384  BAL0803            -1.   BAL0884             1.
+    SH080484  COST             640.1   TRAN0804            1.
+    SH080484  BAL0804            -1.   BAL0884             1.
+    SH080584  COST             847.7   TRAN0805            1.
+    SH080584  BAL0805            -1.   BAL0884             1.
+    SH080684  COST            527.65   TRAN0806            1.
+    SH080684  BAL0852            -1.   BAL0884             1.
+    SH080884  COST            671.24   TRAN0808            1.
+    SH080884  BAL0883            -1.   BAL0884             1.
+    TRSH0101  COST               78.   TRAN0101           -1.
+    TRSH0102  COST               78.   TRAN0201           -1.
+    TRSH0103  COST               78.   TRAN0301           -1.
+    TRSH0104  COST             101.5   TRAN0401           -1.
+    TRSH0105  COST               78.   TRAN0501           -1.
+    TRSH0106  COST               78.   TRAN0601           -1.
+    TRSH0107  COST               78.   TRAN0701           -1.
+    TRSH0108  COST             101.5   TRAN0801           -1.
+    TRSH0201  COST               78.   TRAN0102           -1.
+    TRSH0202  COST               78.   TRAN0202           -1.
+    TRSH0203  COST               78.   TRAN0302           -1.
+    TRSH0204  COST             101.5   TRAN0402           -1.
+    TRSH0205  COST               78.   TRAN0502           -1.
+    TRSH0206  COST               78.   TRAN0602           -1.
+    TRSH0207  COST               78.   TRAN0702           -1.
+    TRSH0208  COST             101.5   TRAN0802           -1.
+    TRSH0301  COST               78.   TRAN0103           -1.
+    TRSH0302  COST               78.   TRAN0203           -1.
+    TRSH0303  COST               78.   TRAN0303           -1.
+    TRSH0304  COST             101.5   TRAN0403           -1.
+    TRSH0305  COST               78.   TRAN0503           -1.
+    TRSH0306  COST               78.   TRAN0603           -1.
+    TRSH0307  COST               78.   TRAN0703           -1.
+    TRSH0308  COST             101.5   TRAN0803           -1.
+    TRSH0401  COST               78.   TRAN0104           -1.
+    TRSH0402  COST               78.   TRAN0204           -1.
+    TRSH0403  COST               78.   TRAN0304           -1.
+    TRSH0404  COST             101.5   TRAN0404           -1.
+    TRSH0405  COST               78.   TRAN0504           -1.
+    TRSH0406  COST               78.   TRAN0604           -1.
+    TRSH0407  COST               78.   TRAN0704           -1.
+    TRSH0408  COST             101.5   TRAN0804           -1.
+    TRSH0501  COST               78.   TRAN0105           -1.
+    TRSH0502  COST               78.   TRAN0205           -1.
+    TRSH0503  COST               78.   TRAN0305           -1.
+    TRSH0504  COST             101.5   TRAN0405           -1.
+    TRSH0505  COST               78.   TRAN0505           -1.
+    TRSH0506  COST               78.   TRAN0605           -1.
+    TRSH0507  COST               78.   TRAN0705           -1.
+    TRSH0508  COST             101.5   TRAN0805           -1.
+    TRSH0601  COST               78.   TRAN0106           -1.
+    TRSH0602  COST               78.   TRAN0206           -1.
+    TRSH0603  COST               78.   TRAN0306           -1.
+    TRSH0604  COST             101.5   TRAN0406           -1.
+    TRSH0605  COST               78.   TRAN0506           -1.
+    TRSH0606  COST               78.   TRAN0606           -1.
+    TRSH0607  COST               78.   TRAN0706           -1.
+    TRSH0608  COST             101.5   TRAN0806           -1.
+    TRSH0701  COST               78.   TRAN0107           -1.
+    TRSH0702  COST               78.   TRAN0207           -1.
+    TRSH0703  COST               78.   TRAN0307           -1.
+    TRSH0704  COST             101.5   TRAN0407           -1.
+    TRSH0705  COST               78.   TRAN0507           -1.
+    TRSH0706  COST               78.   TRAN0607           -1.
+    TRSH0707  COST               78.   TRAN0707           -1.
+    TRSH0708  COST             101.5   TRAN0807           -1.
+    TRSH0801  COST               78.   TRAN0108           -1.
+    TRSH0802  COST               78.   TRAN0208           -1.
+    TRSH0803  COST               78.   TRAN0308           -1.
+    TRSH0804  COST             101.5   TRAN0408           -1.
+    TRSH0805  COST               78.   TRAN0508           -1.
+    TRSH0806  COST               78.   TRAN0608           -1.
+    TRSH0807  COST               78.   TRAN0708           -1.
+    TRSH0808  COST             101.5   TRAN0808           -1.
+RHS
+    RHS       REGMAX              7.   OVRMAX            126.
+    RHS       REGMAX01            3.   REGMAX02            3.
+    RHS       REGMAX04            3.   OVRMAX01           48.
+    RHS       OVRMAX02           48.   OVRMAX04           30.
+    RHS       BAL0102        .105342   BAL0104        .316026
+    RHS       BAL0106        .263355   BAL0107        1.15876
+    RHS       BAL0108        .948077   BAL0109        .421368
+    RHS       BAL0110         .57938   BAL0111        .632051
+    RHS       BAL0112        .526709   BAL0114        .421368
+    RHS       BAL0115        1.21143   BAL0116        .948077
+    RHS       BAL0117        1.05342   BAL0118        .421368
+    RHS       BAL0119        .684722   BAL0120        1.15876
+    RHS       BAL0121        1.10609   BAL0122        .684722
+    RHS       BAL0123         .57938   BAL0124       .0526709
+    RHS       BAL0125        .684722   BAL0126        .210684
+    RHS       BAL0127        .316026   BAL0128        .895406
+    RHS       BAL0129        .474038   BAL0130        .842735
+    RHS       BAL0131         .57938   BAL0132        1.00075
+    RHS       BAL0133        1.15876   BAL0134        1.05342
+    RHS       BAL0135        .632051   BAL0136        .368697
+    RHS       BAL0137        1.94882   BAL0138        1.79081
+    RHS       BAL0139        .368697   BAL0140        1.10609
+    RHS       BAL0141        .737393   BAL0142        .263355
+    RHS       BAL0143        1.52746   BAL0144        .895406
+    RHS       BAL0145        1.36944   BAL0146        .895406
+    RHS       BAL0147        .632051   BAL0148        .526709
+    RHS       BAL0149        .368697   BAL0150        .526709
+    RHS       BAL0151        .421368   BAL0153        1.00075
+    RHS       BAL0154        .421368   BAL0155        1.10609
+    RHS       BAL0156        .790064   BAL0157        .684722
+    RHS       BAL0158         2.0015   BAL0159        1.21143
+    RHS       BAL0160        1.21143   BAL0163        .526709
+    RHS       BAL0165        .210684   BAL0166        .263355
+    RHS       BAL0167        .210684   BAL0168        .105342
+    RHS       BAL0169        .158013   BAL0171        .948077
+    RHS       BAL0172        .210684   BAL0173        .158013
+    RHS       BAL0174        .105342   BAL0175        .210684
+    RHS       BAL0176       .0526709   BAL0177        1.00075
+    RHS       BAL0178        .842735   BAL0179        .105342
+    RHS       BAL0180        .263355   BAL0182        .316026
+    RHS       BAL0184        .316026   BAL0201        .130917
+    RHS       BAL0202        .261834   BAL0204        .785501
+    RHS       BAL0206        1.17825   BAL0207        3.79659
+    RHS       BAL0208        2.74925   BAL0209          1.571
+    RHS       BAL0210        2.09467   BAL0211        1.96375
+    RHS       BAL0212        1.83284   BAL0214        1.70192
+    RHS       BAL0215        6.15309   BAL0216        2.09467
+    RHS       BAL0217        2.09467   BAL0218          1.571
+    RHS       BAL0219        3.01109   BAL0220        3.01109
+    RHS       BAL0221          3.142   BAL0222        2.22559
+    RHS       BAL0223        2.22559   BAL0224        .130917
+    RHS       BAL0225        1.30917   BAL0226        .523667
+    RHS       BAL0227        1.17825   BAL0228          1.571
+    RHS       BAL0229        1.30917   BAL0230          1.571
+    RHS       BAL0231          1.571   BAL0232        1.96375
+    RHS       BAL0233        2.74925   BAL0234        2.09467
+    RHS       BAL0235        1.30917   BAL0236        .654584
+    RHS       BAL0237        3.66567   BAL0238          3.142
+    RHS       BAL0239          1.571   BAL0240        1.70192
+    RHS       BAL0241        1.17825   BAL0242        1.30917
+    RHS       BAL0243        4.18934   BAL0244        1.17825
+    RHS       BAL0245        2.22559   BAL0246        2.09467
+    RHS       BAL0247        1.44009   BAL0248        1.04733
+    RHS       BAL0249        .654584   BAL0250        .785501
+    RHS       BAL0251        .523667   BAL0253        2.22559
+    RHS       BAL0254        .654584   BAL0255        1.83284
+    RHS       BAL0256          1.571   BAL0257        1.30917
+    RHS       BAL0258        3.27292   BAL0259         2.3565
+    RHS       BAL0260        1.83284   BAL0263        .785501
+    RHS       BAL0265        .916418   BAL0266        .916418
+    RHS       BAL0267        .785501   BAL0268        .261834
+    RHS       BAL0269        .654584   BAL0271        3.27292
+    RHS       BAL0272        .392751   BAL0273        1.04733
+    RHS       BAL0274        .523667   BAL0275        .523667
+    RHS       BAL0276        .392751   BAL0277        3.53475
+    RHS       BAL0278        2.09467   BAL0279        .392751
+    RHS       BAL0280        .654584   BAL0282        1.04733
+    RHS       BAL0284        1.30917   BAL0302        .067364
+    RHS       BAL0307        .471548   BAL0308        .404184
+    RHS       BAL0309        .134728   BAL0310        1.48201
+    RHS       BAL0311        .067364   BAL0312        .067364
+    RHS       BAL0315        7.94895   BAL0316        .202092
+    RHS       BAL0321        .134728   BAL0327        .875732
+    RHS       BAL0329        .134728   BAL0331        .269456
+    RHS       BAL0333        .269456   BAL0336        .875732
+    RHS       BAL0337        .875732   BAL0338        .134728
+    RHS       BAL0339        .134728   BAL0340         .33682
+    RHS       BAL0341        .538912   BAL0342        .067364
+    RHS       BAL0343        3.70502   BAL0344        1.54937
+    RHS       BAL0345        .404184   BAL0346        3.03138
+    RHS       BAL0347        .404184   BAL0348        .067364
+    RHS       BAL0354        .067364   BAL0355        .134728
+    RHS       BAL0358        .067364   BAL0365        .134728
+    RHS       BAL0366        1.34728   BAL0367        .404184
+    RHS       BAL0368        1.75146   BAL0369        1.88619
+    RHS       BAL0371        5.72594   BAL0372         .67364
+    RHS       BAL0373        3.70502   BAL0374        1.95356
+    RHS       BAL0375        .269456   BAL0376        1.61674
+    RHS       BAL0377        1.41464   BAL0378        2.22301
+    RHS       BAL0379        3.16611   BAL0382        11.8561
+    RHS       BAL0384        1.34728   BAL0502        .135821
+    RHS       BAL0504        .543284   BAL0506        .543284
+    RHS       BAL0507         2.5806   BAL0508        2.03731
+    RHS       BAL0509        .814925   BAL0510        2.85224
+    RHS       BAL0511        1.08657   BAL0512        1.22239
+    RHS       BAL0514        1.35821   BAL0515        5.70448
+    RHS       BAL0516        3.12388   BAL0517        1.49403
+    RHS       BAL0518        1.35821   BAL0519        1.22239
+    RHS       BAL0520        1.35821   BAL0521        6.24776
+    RHS       BAL0522        .950746   BAL0523        1.08657
+    RHS       BAL0525        2.71642   BAL0526        .407463
+    RHS       BAL0527        1.90149   BAL0528        2.17313
+    RHS       BAL0529        1.76567   BAL0530        1.22239
+    RHS       BAL0531        1.49403   BAL0532        1.62985
+    RHS       BAL0533        3.39552   BAL0534        2.03731
+    RHS       BAL0535        .814925   BAL0536        .407463
+    RHS       BAL0537        3.39552   BAL0538         2.5806
+    RHS       BAL0539        1.08657   BAL0540        2.98806
+    RHS       BAL0541        1.49403   BAL0542        .679104
+    RHS       BAL0543        4.07463   BAL0544        .814925
+    RHS       BAL0545         3.2597   BAL0546        4.34627
+    RHS       BAL0547        2.03731   BAL0548        1.90149
+    RHS       BAL0549        .543284   BAL0550        1.90149
+    RHS       BAL0551        .407463   BAL0552        .135821
+    RHS       BAL0553        1.22239   BAL0554        .950746
+    RHS       BAL0555         3.2597   BAL0556        .950746
+    RHS       BAL0557        1.49403   BAL0558        3.66716
+    RHS       BAL0559         2.5806   BAL0560        2.17313
+    RHS       BAL0563        1.62985   BAL0565        1.35821
+    RHS       BAL0566        .679104   BAL0567        1.35821
+    RHS       BAL0568        .407463   BAL0569        .679104
+    RHS       BAL0571        4.21045   BAL0572        .679104
+    RHS       BAL0573        .950746   BAL0574        .679104
+    RHS       BAL0575        .271642   BAL0576        .407463
+    RHS       BAL0577        4.61791   BAL0578        2.03731
+    RHS       BAL0579        .407463   BAL0580        .543284
+    RHS       BAL0582        1.22239   BAL0584        1.62985
+    RHS       BAL0604       .0460795   BAL0606        .153598
+    RHS       BAL0607        .122879   BAL0608        .291837
+    RHS       BAL0609        .184318   BAL0610        .307197
+    RHS       BAL0611        .291837   BAL0612       .0614393
+    RHS       BAL0614        .445435   BAL0615        .368636
+    RHS       BAL0616       .0614393   BAL0617        .138238
+    RHS       BAL0618        .122879   BAL0619        .307197
+    RHS       BAL0620        .215038   BAL0621        .522234
+    RHS       BAL0622        .153598   BAL0623        .383996
+    RHS       BAL0625        .383996   BAL0626       .0460795
+    RHS       BAL0627       .0614393   BAL0628        .368636
+    RHS       BAL0629        .122879   BAL0630       .0614393
+    RHS       BAL0631       .0767991   BAL0632        .153598
+    RHS       BAL0633        .353276   BAL0634        .245757
+    RHS       BAL0635       .0460795   BAL0636       .0307197
+    RHS       BAL0637        .583673   BAL0638        .368636
+    RHS       BAL0639       .0767991   BAL0640        .122879
+    RHS       BAL0641       .0767991   BAL0642       .0767991
+    RHS       BAL0643        .215038   BAL0644       .0460795
+    RHS       BAL0645        .491514   BAL0646        .261117
+    RHS       BAL0647        .184318   BAL0648        .184318
+    RHS       BAL0649        .138238   BAL0650        .107519
+    RHS       BAL0651        .184318   BAL0653        .568314
+    RHS       BAL0654       .0614393   BAL0655        .552954
+    RHS       BAL0656        .276477   BAL0657        .153598
+    RHS       BAL0658        .552954   BAL0659        .460795
+    RHS       BAL0660        .460795   BAL0663        .138238
+    RHS       BAL0665        .107519   BAL0666       .0767991
+    RHS       BAL0667       .0614393   BAL0668       .0614393
+    RHS       BAL0669       .0614393   BAL0671        .414715
+    RHS       BAL0672        .107519   BAL0673       .0767991
+    RHS       BAL0674       .0307197   BAL0676       .0767991
+    RHS       BAL0677        .138238   BAL0678        .291837
+    RHS       BAL0679       .0460795   BAL0680       .0460795
+    RHS       BAL0682       .0614393   BAL0684        .168958
+    RHS       BAL0706        .125786   BAL0707        .330189
+    RHS       BAL0708        .188679   BAL0709        .125786
+    RHS       BAL0710        .235849   BAL0711        .235849
+    RHS       BAL0712        .141509   BAL0714        .204403
+    RHS       BAL0715        .471698   BAL0716        .172956
+    RHS       BAL0717        .204403   BAL0718        .235849
+    RHS       BAL0719        .393082   BAL0720        .408805
+    RHS       BAL0721        .361635   BAL0722        .188679
+    RHS       BAL0723        .220126   BAL0725       .0786164
+    RHS       BAL0726       .0786164   BAL0727       .0943396
+    RHS       BAL0728        .267296   BAL0729        .157233
+    RHS       BAL0730        .393082   BAL0731        .220126
+    RHS       BAL0732        .188679   BAL0733        .204403
+    RHS       BAL0734        .172956   BAL0735        .157233
+    RHS       BAL0736       .0943396   BAL0737        .408805
+    RHS       BAL0738        .707547   BAL0739        .141509
+    RHS       BAL0740        .110063   BAL0741        .157233
+    RHS       BAL0742        .125786   BAL0743        .283019
+    RHS       BAL0744        .235849   BAL0745        .471698
+    RHS       BAL0746        .220126   BAL0747        .125786
+    RHS       BAL0748        .141509   BAL0749        .188679
+    RHS       BAL0750        .235849   BAL0751        .251572
+    RHS       BAL0753        .707547   BAL0754        .172956
+    RHS       BAL0755        .314465   BAL0756        .424528
+    RHS       BAL0757        .204403   BAL0758        .896226
+    RHS       BAL0759        .220126   BAL0760        .550314
+    RHS       BAL0763        .220126   BAL0765       .0786164
+    RHS       BAL0766       .0628931   BAL0767       .0628931
+    RHS       BAL0768       .0471698   BAL0769       .0314465
+    RHS       BAL0771       .0943396   BAL0772       .0628931
+    RHS       BAL0773       .0943396   BAL0774       .0157233
+    RHS       BAL0776       .0471698   BAL0777       .0786164
+    RHS       BAL0778        .141509   BAL0779       .0314465
+    RHS       BAL0780       .0471698   BAL0782       .0786164
+    RHS       BAL0784        .157233
+ENDATA
diff --git a/demos/ppl_lpsol/examples/unboundedmin.mps b/demos/ppl_lpsol/examples/unboundedmin.mps
new file mode 100644
index 0000000..059a663
--- /dev/null
+++ b/demos/ppl_lpsol/examples/unboundedmin.mps
@@ -0,0 +1,19 @@
+NAME          from_lp_file
+ROWS
+ N  r_000000
+ L  C1
+ L  r_000002
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    x1        r_000000  1
+    x1        C1        2
+    x1        r_000002  -4
+    x2        r_000000  -2
+    x2        C1        -1
+    x2        r_000002  -4
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    RHS       C1        0
+    RHS       r_000002  0
+BOUNDS
+ENDATA
diff --git a/demos/ppl_lpsol/expected_int16 b/demos/ppl_lpsol/expected_int16
new file mode 100644
index 0000000..def7b7f
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int16
@@ -0,0 +1,79 @@
+*** ppl_lpsol -e -m -oobtained afiro.mps
+*** ppl_lpsol -e -M -oobtained afiro.mps
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int16_a b/demos/ppl_lpsol/expected_int16_a
new file mode 100644
index 0000000..3b5becc
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int16_a
@@ -0,0 +1,67 @@
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+*** ppl_lpsol -e -M -oobtained sample.mps
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int32 b/demos/ppl_lpsol/expected_int32
new file mode 100644
index 0000000..7017f87
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int32
@@ -0,0 +1,98 @@
+*** ppl_lpsol -e -m -oobtained afiro.mps
+*** ppl_lpsol -e -M -oobtained afiro.mps
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int32_a b/demos/ppl_lpsol/expected_int32_a
new file mode 100644
index 0000000..c147817
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int32_a
@@ -0,0 +1,96 @@
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int64 b/demos/ppl_lpsol/expected_int64
new file mode 100644
index 0000000..7017f87
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int64
@@ -0,0 +1,98 @@
+*** ppl_lpsol -e -m -oobtained afiro.mps
+*** ppl_lpsol -e -M -oobtained afiro.mps
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int64_a b/demos/ppl_lpsol/expected_int64_a
new file mode 100644
index 0000000..c147817
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int64_a
@@ -0,0 +1,96 @@
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int8 b/demos/ppl_lpsol/expected_int8
new file mode 100644
index 0000000..08d6efc
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int8
@@ -0,0 +1,56 @@
+*** ppl_lpsol -e -m -oobtained afiro.mps
+*** ppl_lpsol -e -M -oobtained afiro.mps
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+*** ppl_lpsol -e -M -oobtained sample.mps
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+*** ppl_lpsol -s -M -oobtained ex1.mps
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -s -m -oobtained sample.mps
+*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int8_a b/demos/ppl_lpsol/expected_int8_a
new file mode 100644
index 0000000..4cbf25d
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int8_a
@@ -0,0 +1,54 @@
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+*** ppl_lpsol -e -M -oobtained sample.mps
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+*** ppl_lpsol -s -M -oobtained ex1.mps
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -s -m -oobtained sample.mps
+*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_mpz b/demos/ppl_lpsol/expected_mpz
new file mode 100644
index 0000000..4b5e468
--- /dev/null
+++ b/demos/ppl_lpsol/expected_mpz
@@ -0,0 +1,1980 @@
+*** ppl_lpsol -e -m -oobtained afiro.mps
+Optimum value: -464.7531429
+Optimum location:
+X01 = 80
+X02 = 25.5
+X03 = 54.5
+X04 = 84.8
+X06 = 18.21428571
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 18.21428571
+X15 = 0
+X16 = 19.30714286
+X22 = 500
+X23 = 475.92
+X24 = 24.08
+X25 = 0
+X26 = 215
+X28 = 0
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 339.9428571
+X37 = 383.9428571
+X38 = 0
+X39 = 0
+*** ppl_lpsol -e -M -oobtained afiro.mps
+Optimum value: 3438.2921
+Optimum location:
+X01 = 54.5
+X02 = 0
+X03 = 54.5
+X04 = 57.77
+X06 = 0
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 0
+X15 = 0
+X16 = 0
+X22 = 500
+X23 = 483.5955
+X24 = 16.4045
+X25 = 0
+X26 = 215
+X28 = 0
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 345.4253571
+X37 = 0
+X38 = 0
+X39 = 389.4253571
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+Optimum value: 225494.9632
+Optimum location:
+...100 = 22.85454545
+...101 = 0.5454545455
+...102 = 4.62693727
+...103 = 0
+...104 = 0
+...105 = 35.10714286
+...106 = 4.793014706
+...107 = 2.942801288
+...108 = 0
+...109 = 44.40554954
+...110 = 0
+...111 = 9.884315099
+...112 = 0
+...113 = 0
+...114 = 108
+...115 = 0
+...116 = 0
+...117 = 0
+...118 = 0
+...119 = 0
+...120 = 13
+...121 = 0
+...122 = 0
+...123 = 0
+...124 = 73.92849567
+...125 = 51.29498565
+...126 = 139.7765187
+...127 = 0
+...128 = 0
+...129 = 109.3391662
+...130 = 3.803724425
+...131 = 3.920125575
+...132 = 134
+...133 = 0
+...134 = 0
+...135 = 0
+...136 = 31
+...137 = 0
+...138 = 0
+...139 = 0
+...140 = 0
+...141 = 60
+...142 = 111.7272727
+...143 = 0
+...144 = 51.90909091
+...145 = 29.86330761
+...146 = 4.136692391
+...147 = 0
+...148 = 0
+...149 = 41.5
+...150 = 0
+...151 = 15.4788166
+...152 = 0
+...153 = 15
+...154 = 0
+...155 = 0
+...156 = 3.1
+...157 = 0
+...158 = 0.6909090909
+...159 = 0
+...160 = 0
+...161 = 175.4447167
+...162 = 0
+...163 = 9.806141065
+...164 = 0
+...165 = 0
+...166 = 33.46836966
+...167 = 9.531630344
+...168 = 10.29307503
+...169 = 8.906924975
+...170 = 0
+...171 = 0
+...172 = 6.1
+...173 = 0
+...174 = 9.792857143
+...175 = 313.1973528
+...176 = 55.43167804
+...177 = 264.5552833
+...178 = 0
+...179 = 13.2
+...180 = 0
+...181 = 1.314479773
+...182 = 0.5032608696
+...183 = 0
+...184 = 0
+...185 = 0
+...186 = 0
+...187 = 0
+...188 = 0
+...189 = 0
+...190 = 0
+...191 = 13.5
+...192 = 8.737073136
+...193 = 0
+...194 = 31.2
+...195 = 0
+...196 = 0
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+Unbounded problem.
+*** ppl_lpsol -s -m -oobtained afiro.mps
+Optimum value: -464.7531429
+Optimum location:
+X01 = 80
+X02 = 25.5
+X03 = 54.5
+X04 = 84.8
+X06 = 58.1560164
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 18.21428571
+X15 = 39.94173069
+X16 = 61.64537738
+X22 = 500
+X23 = 475.92
+X24 = 24.08
+X25 = 0
+X26 = 215
+X28 = 366.4378962
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 339.9428571
+X37 = 17.50496094
+X38 = 157.5682954
+X39 = 0
+*** ppl_lpsol -s -M -oobtained afiro.mps
+Optimum value: 3438.2921
+Optimum location:
+X01 = 54.5
+X02 = 0
+X03 = 54.5
+X04 = 57.77
+X06 = 0
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 0
+X15 = 0
+X16 = 0
+X22 = 500
+X23 = 483.5955
+X24 = 16.4045
+X25 = 0
+X26 = 215
+X28 = 0
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 345.4253571
+X37 = 0
+X38 = 0
+X39 = 389.4253571
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -s -m -oobtained blend.mps
+Optimum value: -30.81214985
+Optimum location:
+1 = 20.94480195
+2 = 10.17092161
+3 = 11.24735865
+4 = 2.981097124
+5 = 0.6597035933
+6 = 0.4759263446
+7 = 0
+8 = 10.10117614
+9 = 0
+10 = 1.679178924
+11 = 0
+12 = 10.10117614
+13 = 0
+14 = 11.78035507
+15 = 0
+16 = 0.4067430357
+17 = 0
+18 = 2.173256964
+19 = 2.018559906
+20 = 4.843256964
+21 = 0
+22 = 3.13818313
+23 = 1.149909949
+24 = 1.396291081
+25 = 0
+26 = 0
+27 = 0
+28 = 0
+29 = 0.3835003722
+30 = 0
+31 = 4.424431137
+32 = 0
+33 = 1.149909949
+34 = 1.396291081
+35 = 0.7485700927
+36 = 21.63838697
+37 = 8.102702633
+38 = 0.7107761404
+39 = 0.4817893472
+40 = 0
+41 = 4.892936372
+42 = 0
+43 = 0.4416752608
+44 = 14.28573702
+45 = 6.527177121
+46 = 2.005816841
+47 = 0
+48 = 0
+49 = 0.7713285688
+50 = 4.87625743
+51 = 0.2242247192
+52 = 1.811155615
+53 = 7.877627559
+54 = 0.3201545422
+55 = 0.9892470535
+56 = 0.4439079385
+57 = 1.433154992
+58 = 0
+59 = 0
+60 = 0
+61 = 3.079217438
+62 = 0.795583754
+63 = 3.874801192
+64 = 0.7749576722
+65 = 1.83076589
+66 = 0
+67 = 0
+68 = 0.06587344195
+69 = 0.7889117798
+70 = 3.460508784
+71 = 2.750888679
+72 = 0
+73 = 0
+74 = 0
+75 = 0
+76 = 0
+77 = 0.1693961964
+78 = 0
+79 = 1.154801147
+80 = 0
+81 = 0.8033012352
+82 = 26.03036862
+83 = 87.09497412
+*** ppl_lpsol -s -M -oobtained blend.mps
+Unbounded problem.
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+Optimum value: -335.2135675
+Optimum location:
+PBOSHNL0 = 0
+PBOSHNL1 = 12
+PBOSHNL7 = 0
+PBOSHNL8 = 0
+PBOSLAX0 = 14
+PBOSLAX1 = 0
+PBOSLAX7 = 0
+PBOSSEA0 = 0
+PBOSSEA1 = 0
+PBOSSEA2 = 49
+PBOSSFO0 = 73
+PBOSSFO1 = 60
+PBOSTPE1 = 1
+PBOSTPE2 = 0
+PBOSTYO1 = 3
+PBOSTYO2 = 0
+PBOSYUL0 = 28.13380282
+PBOSYUL1 = 347.7678621
+PBOSYUL2 = 0.325
+PBOSYUL3 = 336.7733351
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 0
+PBOSYVR2 = 26
+PBOSYWG0 = 0
+PBOSYWG1 = 0
+PBOSYWG7 = 37
+PBOSYYZ0 = 19.03169014
+PBOSYYZ1 = 195.9683099
+PBUROAK0 = 11
+PBUROAK1 = 16
+PBURSEA0 = 83
+PBURSEA1 = 0
+PBURSFO0 = 278
+PHNLLAX0 = 104.0482353
+PHNLLAX1 = 33.04
+PHNLLAX2 = 68.20588235
+PHNLLAX3 = 98
+PHNLLON0 = 0
+PHNLLON6 = 5
+PHNLPAR0 = 0
+PHNLPAR6 = 1
+PHNLSEA0 = 0
+PHNLSEA1 = 157.7943925
+PHNLSEA2 = 0
+PHNLSFO0 = 35
+PHNLSFO1 = 0
+PHNLSFO7 = 0
+PHNLYVR0 = 94.20560748
+PHNLYVR1 = 0
+PHNLYVR7 = 39.79439252
+PLASSEA0 = 33.01327253
+PLASSEA1 = 342.9867275
+PLASYVR0 = 37
+PLASYVR6 = 0
+PLAXOAK0 = 32
+PLAXOAK1 = 0
+PLAXOAK2 = 46
+PLAXSEA0 = 0
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 546.0147059
+PLAXSEA4 = 3.720588235
+PLAXSEA5 = 139
+PLAXSEA6 = 66.26744186
+PLAXSEA7 = 0
+PLAXSEA8 = 75
+PLAXSEA9 = 5.415868673
+PLAXSFO0 = 33.04
+PLAXSFO1 = 260.8488372
+PLAXSFO2 = 839.9632721
+PLAXSFO3 = 87.90697674
+PLAXSFO4 = 168
+PLAXSFO5 = 98
+PLAXSFO6 = 1464.240914
+PLAXTPE0 = 8.581395349
+PLAXTPE1 = 0
+PLAXTPE2 = 0
+PLAXTPE8 = 22.41860465
+PLAXTYO0 = 41
+PLAXTYO1 = 0
+PLAXTYO2 = 0
+PLAXTYO8 = 0
+PLAXYVR0 = 0
+PLAXYVR1 = 153.755814
+PLAXYVR2 = 39.24418605
+PLONPAR0 = 0
+PLONPAR1 = 0
+PLONPAR2 = 2
+PLONSEA0 = 0
+PLONSEA1 = 151
+PLONYVR0 = 0
+PLONYVR1 = 0
+PLONYVR7 = 51
+POAKONT0 = 0
+POAKONT1 = 13
+POAKSEA0 = 37.89108456
+POAKSEA1 = 77.15303309
+POAKSEA2 = 6.955882353
+PONTSFO0 = 177
+PONTSEA0 = 23.10431985
+PONTSEA1 = 24.89568015
+PONTSEA2 = 0
+PPARSEA0 = 0
+PPARSEA1 = 68
+PPARYVR0 = 0
+PPARYVR1 = 0
+PPARYVR7 = 24
+PRNOSEA0 = 0
+PRNOSEA1 = 291
+PRNOYVR0 = 67
+PSEASFO0 = 0
+PSEASFO1 = 839.9632721
+PSEASFO2 = 146.6809139
+PSEASFO3 = 236.6
+PSEASFO4 = 0
+PSEASFO5 = 50.75581395
+PSEASFO6 = 145
+PSEATPE0 = 75.80232558
+PSEATPE1 = 0
+PSEATPE2 = 0
+PSEATPE3 = 1.61627907
+PSEATYO0 = 0
+PSEATYO1 = 0
+PSEATYO2 = 0
+PSEATYO3 = 138
+PSEAYVR0 = 164.8598131
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 392
+PSEAYVR4 = 0
+PSEAYVR5 = 33.01327253
+PSEAYVR6 = 0
+PSEAYVR7 = 50.75581395
+PSEAYVR8 = 47.16549296
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 6
+PSFOTPE8 = 0
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 17
+PSFOTYO8 = 0
+PSFOYVR0 = 260.8488372
+PSFOYVR1 = 37.15116279
+PTPETYO0 = 51.01162791
+PTPETYO1 = 0
+PTPETYO2 = 59.98837209
+PTPETYO3 = 0
+PTPEYVR0 = 57
+PTYOYVR0 = 91
+PYULYVR0 = 36.4084507
+PYULYVR1 = 134.1343917
+PYULYVR2 = 139.6904909
+PYULYVR3 = 4.766666667
+PYULYWG0 = 0
+PYULYWG1 = 271.3172923
+PYULYWG2 = 0
+PYULYWG3 = 178.6827077
+PYULYYZ0 = 0
+PYULYYZ1 = 266.6818464
+PYULYYZ2 = 0
+PYULYYZ3 = 431.9057717
+PYULYYZ4 = 1913.412382
+PYVRYWG0 = 14.67957746
+PYVRYWG1 = 271.3172923
+PYVRYWG2 = 138.0031303
+PYVRYYZ0 = 4.352112676
+PYVRYYZ1 = 241.2835753
+PYVRYYZ2 = 126.3643121
+PYWGYYZ0 = 14.67957746
+PYWGYYZ1 = 138.0031303
+PYWGYYZ2 = 0
+PYWGYYZ3 = 125.3172923
+PBOSOAK0 = 11
+PBOSOAK6 = 0
+PBOSBUR1 = 7
+PBOSBUR2 = 0
+PBOSONT1 = 4
+PBOSONT2 = 0
+PBURYVR1 = 26
+PBURTYO1 = 2
+PBURTPE1 = 1
+PBURHNL0 = 11
+PBURHNL6 = 0
+PHNLOAK0 = 0
+PHNLOAK1 = 24
+PHNLOAK2 = 0
+PHNLOAK8 = 0
+PHNLONT0 = 9.705882353
+PHNLONT6 = 6.294117647
+PHNLYWG1 = 3
+PHNLYYZ1 = 24
+PHNLYUL1 = 40
+PLASTYO1 = 5
+PLASTPE1 = 1
+PLAXLON0 = 13
+PLAXLON6 = 0
+PLAXLON7 = 0
+PLAXPAR0 = 8
+PLAXPAR6 = 0
+PLAXPAR7 = 0
+PBURLON1 = 1
+PBURPAR1 = 1
+PLONONT1 = 1
+PLONOAK1 = 1
+POAKPAR1 = 2
+POAKTYO1 = 7
+POAKTPE1 = 2
+PONTPAR1 = 2
+PONTTYO1 = 2
+PONTTPE1 = 1
+PPARSFO1 = 2
+PRNOTYO1 = 5
+PRNOTPE1 = 2
+PTPEYWG1 = 21
+PTPEYYZ1 = 13
+PTPEYUL1 = 6
+PTYOYUL1 = 7
+PTYOYYZ1 = 17
+PTYOYWG1 = 25
+PLAXONT0 = 6.294117647
+GRDTIMO1 = 0
+GRDTIMN1 = -49.01286158
+GRDTIMO2 = 0
+GRDTIMN2 = 0
+GRDTIMO3 = 0
+GRDTIMN3 = -47
+GRDTIMO4 = 0
+GRDTIMN4 = 0
+GRDTIMO5 = 0
+GRDTIMN5 = -47.24353963
+GRDTIMO6 = 0
+GRDTIMN6 = -81
+N1001AC1 = 0
+N1001AC2 = 0
+N1001AC3 = 0
+N1002AC1 = 0
+N1002AC2 = 0
+N1002AC3 = 2.355140187
+N1003AC1 = 0
+N1003AC2 = 0.1603208556
+N1003AC3 = 0.7214438503
+N1004AC1 = 0.28
+N1004AC2 = 0
+N1004AC3 = 0
+N1005AC3 = 0.0859375
+N1105AC3 = 0.8382352941
+N1006AC3 = 0.07582720588
+N1007AC1 = 0
+N1007AC2 = 0
+N1007AC3 = 0
+N1008AC1 = 0
+N1008AC2 = 0
+N1008AC3 = 0
+N1008AC4 = 0
+N1008AC5 = 0
+N1008AC6 = 4.65801495
+N1009AC1 = 0
+N1009AC2 = 0.07488107822
+N1009AC3 = 0
+N1009AC4 = 0
+N1009AC5 = 1.921947674
+N1010AC1 = 0
+N1010AC2 = 0
+N1010AC3 = 0
+N1010AC4 = 0
+N1010AC5 = 0
+N1010AC6 = 7
+N1011AC1 = 0
+N1011AC2 = 3.085065997
+N1011AC3 = 0.6951730225
+N1011AC4 = 0
+N1011AC5 = 3.897217245
+N1011AC6 = 0
+N1012AC1 = 1.510832058
+N1012AC2 = 0
+N1012AC3 = 0
+N1012AC4 = 0
+N1012AC5 = 2.417331293
+N1013AC3 = 0
+N1013AC4 = 0
+N1013AC5 = 0
+N1013AC6 = 0.9241727941
+N1014AC3 = 0
+N1014AC4 = 0
+N1014AC5 = 1.691245404
+N1014AC6 = 0.2228170956
+N1015AC3 = 0
+N1015AC4 = 0.7048194146
+N1015AC5 = 0.1595430366
+N1015AC6 = 2.135637549
+N1016AC3 = 0
+N1016AC4 = 0
+N1016AC5 = 0.7
+N1016AC6 = 3.3
+N1017AC3 = 0
+N1017AC4 = 0
+N1017AC5 = 0
+N1017AC6 = 0.1617647059
+N1018AC1 = 0
+N1018AC2 = 0
+N1018AC3 = 0
+N1018AC4 = 0
+N1018AC5 = 0
+N1018AC6 = 1.196428571
+N1019AC1 = 0
+N1019AC2 = 0
+N1019AC3 = 0
+N1019AC4 = 0.2345133807
+N1019AC5 = 0.7654866193
+N1020AC1 = 0.2228332753
+N1020AC2 = 0
+N1020AC3 = 0
+N1020AC4 = 0
+N1020AC5 = 3.200696136
+N1020AC6 = 0
+N1021AC1 = 0.664202377
+N1021AC2 = 0
+N1021AC3 = 0
+N1021AC4 = 0
+N1021AC5 = 2.453858782
+N1022AC1 = 0
+N1023AC1 = 0
+N1026AC1 = 1
+N1027AC1 = 0.476744186
+N1028AC1 = 0
+N1029AC1 = 0.523255814
+N1030AC1 = 1
+N1032AC1 = 0
+N1032AC2 = 0
+N1032AC3 = 0
+N1032AC4 = 0.8274647887
+N1032AC5 = 0
+N1033AC1 = 0.4860357966
+N1033AC2 = 0.500476922
+N1033AC3 = 0
+N1033AC4 = 0
+N1033AC5 = 2.061996183
+N1034AC1 = 0
+N1034AC2 = 0
+N1034AC3 = 3.174783885
+N1035AC1 = 0.6827679474
+N1035AC2 = 0
+N1035AC3 = 0
+N1035AC4 = 0.7269371829
+N1035AC5 = 0.2529831862
+N1036AC1 = 0.1083333333
+N1036AC2 = 0
+N1036AC3 = 0
+N1037AC4 = 0
+N1037AC5 = 0
+N1038AC4 = 0.2383968781
+N1038AC5 = 1.271450017
+N1039AC4 = 0
+N1039AC5 = 2.077705904
+N1040AC4 = 0
+N1040AC5 = 0
+N1040AC6 = 9.513243659
+N1041AC4 = 8.856901224
+N1041AC5 = 0
+N1041AC6 = 20
+N1042AC4 = 0
+N1042AC5 = 0
+N1042AC6 = 0
+N1043AC1 = 0.1725352113
+N1043AC2 = 0
+N1043AC3 = 0
+N1044AC1 = 0
+N1044AC2 = 0
+N1044AC3 = 1
+N1046AC3 = 1
+N1047AC1 = 0
+N1047AC2 = 0
+N1047AC3 = 1
+N1050AC3 = 0
+N1050AC4 = 0
+N1050AC5 = 0.0731874145
+N1051AC1 = 0
+N1051AC2 = 0
+N1051AC3 = 0
+N1051AC4 = 0
+N1051AC5 = 4.651904242
+N1051AC6 = 20
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+Optimum value: 286.9746573
+Optimum location:
+PBOSHNL0 = 0
+PBOSHNL1 = 10
+PBOSHNL7 = 0
+PBOSHNL8 = 0
+PBOSLAX0 = 0
+PBOSLAX1 = 0
+PBOSLAX7 = 12
+PBOSSEA0 = 0
+PBOSSEA1 = 40
+PBOSSEA2 = 0
+PBOSSFO0 = 73
+PBOSSFO1 = 48
+PBOSTPE1 = 0
+PBOSTPE2 = 0
+PBOSTYO1 = 0
+PBOSTYO2 = 0
+PBOSYUL0 = 383.9469027
+PBOSYUL1 = 224.0530973
+PBOSYUL2 = 0
+PBOSYUL3 = 0
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 23
+PBOSYVR2 = 0
+PBOSYWG0 = 33
+PBOSYWG1 = 0
+PBOSYWG7 = 0
+PBOSYYZ0 = 0
+PBOSYYZ1 = 193
+PBUROAK0 = 9
+PBUROAK1 = 15
+PBURSEA0 = 69
+PBURSEA1 = 0
+PBURSFO0 = 243
+PHNLLAX0 = 0
+PHNLLAX1 = 126.296875
+PHNLLAX2 = 100.03125
+PHNLLAX3 = 104.4375
+PHNLLON0 = 0
+PHNLLON6 = 0
+PHNLPAR0 = 0
+PHNLPAR6 = 0
+PHNLSEA0 = 0
+PHNLSEA1 = 135.2523364
+PHNLSEA2 = 0
+PHNLSFO0 = 0
+PHNLSFO1 = 0
+PHNLSFO7 = 31
+PHNLYVR0 = 80.74766355
+PHNLYVR1 = 0
+PHNLYVR7 = 35.25233645
+PLASSEA0 = 365
+PLASSEA1 = 0
+PLASYVR0 = 0
+PLASYVR6 = 33
+PLAXOAK0 = 42.765625
+PLAXOAK1 = 0
+PLAXOAK2 = 46
+PLAXSEA0 = 295.96875
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 0
+PLAXSEA4 = 6
+PLAXSEA5 = 139
+PLAXSEA6 = 0
+PLAXSEA7 = 139
+PLAXSEA8 = 139
+PLAXSEA9 = 12.03125
+PLAXSFO0 = 164.828125
+PLAXSFO1 = 1090
+PLAXSFO2 = 0
+PLAXSFO3 = 20
+PLAXSFO4 = 68
+PLAXSFO5 = 144
+PLAXSFO6 = 1212.171875
+PLAXTPE0 = 0
+PLAXTPE1 = 18
+PLAXTPE2 = 9
+PLAXTPE8 = 0
+PLAXTYO0 = 0
+PLAXTYO1 = 9
+PLAXTYO2 = 27
+PLAXTYO8 = 0
+PLAXYVR0 = 116
+PLAXYVR1 = 0
+PLAXYVR2 = 57
+PLONPAR0 = 0
+PLONPAR1 = 0
+PLONPAR2 = 0
+PLONSEA0 = 0
+PLONSEA1 = 127
+PLONYVR0 = 0
+PLONYVR1 = 0
+PLONYVR7 = 45
+POAKONT0 = 0
+POAKONT1 = 11
+POAKSEA0 = 41
+POAKSEA1 = 57
+POAKSEA2 = 0
+PONTSFO0 = 155
+PONTSEA0 = 25
+PONTSEA1 = 12
+PONTSEA2 = 0
+PPARSEA0 = 0
+PPARSEA1 = 53
+PPARYVR0 = 0
+PPARYVR1 = 0
+PPARYVR7 = 21
+PRNOSEA0 = 255
+PRNOSEA1 = 0
+PRNOYVR0 = 60
+PSEASFO0 = 822
+PSEASFO1 = 0
+PSEASFO2 = 156
+PSEASFO3 = 224
+PSEASFO4 = 0
+PSEASFO5 = 20
+PSEASFO6 = 68
+PSEATPE0 = 0
+PSEATPE1 = 0
+PSEATPE2 = 42
+PSEATPE3 = 0
+PSEATYO0 = 0
+PSEATYO1 = 0
+PSEATYO2 = 117
+PSEATYO3 = 0
+PSEAYVR0 = 0
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 649.2523364
+PSEAYVR4 = 0
+PSEAYVR5 = 0
+PSEAYVR6 = 0
+PSEAYVR7 = 0
+PSEAYVR8 = 0
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 0
+PSFOTPE8 = 0
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 0
+PSFOTYO8 = 15
+PSFOYVR0 = 268
+PSFOYVR1 = 0
+PTPETYO0 = 0
+PTPETYO1 = 0
+PTPETYO2 = 99
+PTPETYO3 = 0
+PTPEYVR0 = 44
+PTYOYVR0 = 74
+PYULYVR0 = 182
+PYULYVR1 = 88
+PYULYVR2 = 0
+PYULYVR3 = 0
+PYULYWG0 = 161.3018868
+PYULYWG1 = 178
+PYULYWG2 = 31.69811321
+PYULYWG3 = 0
+PYULYYZ0 = 0
+PYULYYZ1 = 0
+PYULYYZ2 = 245.3018868
+PYULYYZ3 = 1997
+PYULYYZ4 = 107.6981132
+PYVRYWG0 = 194.3018868
+PYVRYWG1 = 178
+PYVRYWG2 = 4.698113208
+PYVRYYZ0 = 328.6981132
+PYVRYYZ1 = 0
+PYVRYYZ2 = 4.301886792
+PYWGYYZ0 = 0
+PYWGYYZ1 = 4.698113208
+PYWGYYZ2 = 245.3018868
+PYWGYYZ3 = 0
+PBOSOAK0 = 9
+PBOSOAK6 = 0
+PBOSBUR1 = 0
+PBOSBUR2 = 0
+PBOSONT1 = 0
+PBOSONT2 = 0
+PBURYVR1 = 23
+PBURTYO1 = 0
+PBURTPE1 = 0
+PBURHNL0 = 9
+PBURHNL6 = 0
+PHNLOAK0 = 0
+PHNLOAK1 = 2.234375
+PHNLOAK2 = 0
+PHNLOAK8 = 18.765625
+PHNLONT0 = 0
+PHNLONT6 = 14
+PHNLYWG1 = 0
+PHNLYYZ1 = 21
+PHNLYUL1 = 35
+PLASTYO1 = 0
+PLASTPE1 = 0
+PLAXLON0 = 11
+PLAXLON6 = 0
+PLAXLON7 = 0
+PLAXPAR0 = 0
+PLAXPAR6 = 0
+PLAXPAR7 = 0
+PBURLON1 = 0
+PBURPAR1 = 0
+PLONONT1 = 0
+PLONOAK1 = 0
+POAKPAR1 = 0
+POAKTYO1 = 0
+POAKTPE1 = 0
+PONTPAR1 = 0
+PONTTYO1 = 0
+PONTTPE1 = 0
+PPARSFO1 = 0
+PRNOTYO1 = 0
+PRNOTPE1 = 0
+PTPEYWG1 = 18
+PTPEYYZ1 = 11
+PTPEYUL1 = 0
+PTYOYUL1 = 0
+PTYOYYZ1 = 15
+PTYOYWG1 = 22
+PLAXONT0 = 14
+GRDTIMO1 = 0
+GRDTIMN1 = -105
+GRDTIMO2 = 0
+GRDTIMN2 = -91
+GRDTIMO3 = 0
+GRDTIMN3 = -47
+GRDTIMO4 = 0
+GRDTIMN4 = -43.5
+GRDTIMO5 = 0
+GRDTIMN5 = -87
+GRDTIMO6 = 0
+GRDTIMN6 = -81
+N1001AC1 = 0
+N1001AC2 = 0
+N1001AC3 = 0
+N1002AC1 = 0
+N1002AC2 = 2.018691589
+N1002AC3 = 0
+N1003AC1 = 0
+N1003AC2 = 0
+N1003AC3 = 0
+N1004AC1 = 0
+N1004AC2 = 1.0703125
+N1004AC3 = 0
+N1005AC3 = 0.0703125
+N1105AC3 = 0.9296875
+N1006AC3 = 0
+N1007AC1 = 0
+N1007AC2 = 0
+N1007AC3 = 0
+N1008AC1 = 5.28156777
+N1008AC2 = 0
+N1008AC3 = 1.986798017
+N1008AC4 = 0
+N1008AC5 = 0
+N1008AC6 = 0
+N1009AC1 = 0
+N1009AC2 = 0
+N1009AC3 = 0
+N1009AC4 = 0
+N1009AC5 = 0
+N1010AC1 = 7
+N1010AC2 = 7
+N1010AC3 = 7
+N1010AC4 = 7
+N1010AC5 = 7
+N1010AC6 = 7
+N1011AC1 = 0
+N1011AC2 = 0
+N1011AC3 = 0
+N1011AC4 = 0
+N1011AC5 = 0
+N1011AC6 = 0
+N1012AC1 = 0
+N1012AC2 = 0
+N1012AC3 = 0
+N1012AC4 = 0
+N1012AC5 = 0
+N1013AC3 = 0
+N1013AC4 = 0
+N1013AC5 = 0
+N1013AC6 = 1
+N1014AC3 = 0
+N1014AC4 = 0
+N1014AC5 = 0
+N1014AC6 = 1.909090909
+N1015AC3 = 0
+N1015AC4 = 0
+N1015AC5 = 0
+N1015AC6 = 3
+N1016AC3 = 0
+N1016AC4 = 0
+N1016AC5 = 0
+N1016AC6 = 4
+N1017AC3 = 0
+N1017AC4 = 0
+N1017AC5 = 0
+N1017AC6 = 0.09090909091
+N1018AC1 = 3.782713662
+N1018AC2 = 6.749720383
+N1018AC3 = 7
+N1018AC4 = 0
+N1018AC5 = 4.039001304
+N1018AC6 = 0
+N1019AC1 = 0
+N1019AC2 = 1.412371134
+N1019AC3 = 0
+N1019AC4 = 2.587628866
+N1019AC5 = 0
+N1020AC1 = 0
+N1020AC2 = 0
+N1020AC3 = 0
+N1020AC4 = 0
+N1020AC5 = 0
+N1020AC6 = 0
+N1021AC1 = 0
+N1021AC2 = 0
+N1021AC3 = 0
+N1021AC4 = 0
+N1021AC5 = 0
+N1022AC1 = 0
+N1023AC1 = 0
+N1026AC1 = 1
+N1027AC1 = 0
+N1028AC1 = 0
+N1029AC1 = 1
+N1030AC1 = 1
+N1032AC1 = 1
+N1032AC2 = 1
+N1032AC3 = 1
+N1032AC4 = 1
+N1032AC5 = 1
+N1033AC1 = 0
+N1033AC2 = 1.371681416
+N1033AC3 = 0
+N1033AC4 = 0.6283185841
+N1033AC5 = 0
+N1034AC1 = 0
+N1034AC2 = 0
+N1034AC3 = 0
+N1035AC1 = 0
+N1035AC2 = 0.04608448823
+N1035AC3 = 0
+N1035AC4 = 0.01051928536
+N1035AC5 = 0
+N1036AC1 = 0
+N1036AC2 = 0
+N1036AC3 = 0
+N1037AC4 = 0
+N1037AC5 = 3.220930233
+N1038AC4 = 0
+N1038AC5 = 0
+N1039AC4 = 0
+N1039AC5 = 0
+N1040AC4 = 10
+N1040AC5 = 10
+N1040AC6 = 10
+N1041AC4 = 5.793776249
+N1041AC5 = 20
+N1041AC6 = 20
+N1042AC4 = 20
+N1042AC5 = 20
+N1042AC6 = 20
+N1043AC1 = 0
+N1043AC2 = 0
+N1043AC3 = 0
+N1044AC1 = 0
+N1044AC2 = 1
+N1044AC3 = 0
+N1046AC3 = 1
+N1047AC1 = 0
+N1047AC2 = 1
+N1047AC3 = 0
+N1050AC3 = 0.109375
+N1050AC4 = 0
+N1050AC5 = 0
+N1051AC1 = 20
+N1051AC2 = 20
+N1051AC3 = 20
+N1051AC4 = 0
+N1051AC5 = 20
+N1051AC6 = 11.52971853
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+Optimum value: -315.018728
+Optimum location:
+PBOSORD0 = 302
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 0
+PBOSLGA0 = 712
+PBOSLGA1 = 268
+PBOSLGA2 = 0
+PBOSLGA3 = 1372
+PBOSCLE0 = 0
+PBOSCLE1 = 142
+PBOSCLE2 = 0
+PBOSCLE3 = 0
+PORDBOS0 = 182.705314
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 119.294686
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 515
+PORDLGA2 = 0
+PORDLGA3 = 0
+PORDCLE0 = 12.29468599
+PORDCLE1 = 0
+PORDCLE2 = 458
+PORDCLE3 = 148.705314
+PLGABOS0 = 913
+PLGABOS1 = 458
+PLGABOS2 = 0
+PLGABOS3 = 0
+PLGABOS4 = 0
+PLGABOS5 = 1372
+PLGAORD0 = 712
+PLGAORD1 = 0
+PLGAORD2 = 0
+PLGAORD3 = 0
+PLGACLE0 = 0
+PLGACLE1 = 249
+PLGACLE2 = 268
+PCLEBOS0 = 0
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 131
+PCLEBOS4 = 0
+PCLEORD0 = 178.5972891
+PCLEORD1 = 249
+PCLEORD2 = 16.40271092
+PCLEORD3 = 268
+PCLEORD4 = 0
+PCLELGA0 = 409
+PCLELGA1 = 0
+PCLELGA2 = 0
+PCLELGA3 = 0
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0.1616272102
+BBOSCLE1 = 7.026778587
+BORDBOS0 = 3.188405797
+CBOSORD0 = 12
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 8.811594203
+CBOSCLE2 = 0
+CBOSCLE3 = 0
+CORDBOS0 = 20.8115942
+CORDBOS1 = 0
+CORDBOS2 = 0
+CORDBOS3 = 0
+CORDBOS4 = 0
+CORDLGA0 = 13
+CORDLGA1 = 0
+CORDLGA2 = 0
+CORDLGA3 = 0
+CLGAORD0 = 22.5
+CLGAORD1 = 22.5
+CLGAORD2 = 0
+CLGAORD3 = 0
+CLGACLE0 = 16
+CLGACLE1 = 0
+CLGACLE2 = 0
+CCLELGA0 = 0
+CCLELGA1 = 5
+CCLELGA2 = 0
+CCLELGA3 = 0
+GRDTIMO1 = 0
+GRDTIMN1 = 0
+GRDTIMO2 = 0
+GRDTIMN2 = -76.79770851
+GRDTIMN3 = -10.27177739
+GRDTIMN4 = -21.60844089
+N1003AC1 = 0
+N1003AC2 = 6.724489796
+N1003AC3 = 0.4
+N1003AC4 = 0
+N1005AC1 = 0.01346893419
+N1005AC2 = 0
+N1005AC3 = 0
+N1005AC4 = 0
+N1011AC1 = 0.5855648822
+N1011AC2 = 0
+N1011AC3 = 0.2937198068
+N1011AC4 = 0
+N1013AC2 = 7.265306122
+N1013AC4 = 2
+N1015AC2 = 0
+N1015AC4 = 1.422222222
+N1017AC2 = 0
+N1017AC4 = 2
+N1019AC2 = 2.540816327
+N1019AC4 = 0
+N1021AC1 = 0.01346893419
+N1021AC2 = 0.1254559795
+N1021AC3 = 0
+N1021AC4 = 0
+N1002AC1 = 0
+N1002AC2 = 0.1254559795
+N1002AC3 = 0
+N1002AC4 = 0
+N1004AC2 = 2.540816327
+N1004AC4 = 2
+N1006AC1 = 0.5990338164
+N1006AC2 = 0
+N1006AC3 = 0.6937198068
+N1006AC4 = 0
+N1008AC2 = 9.316326531
+N1008AC4 = 2
+N1010AC2 = 4.673469388
+N1010AC4 = 0
+N1012AC2 = 0
+N1012AC4 = 1.422222222
+N1014AC2 = 0
+N1014AC4 = 0
+N1100AC2 = 2.734693878
+N1100AC4 = 0
+N1102AC2 = 0
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0
+N1201AC2 = 14
+N1201AC4 = 0
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+Optimum value: -73.36896911
+Optimum location:
+PBOSORD0 = 277
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 0
+PBOSLGA0 = 258.2518987
+PBOSLGA1 = 686
+PBOSLGA2 = 35.74810133
+PBOSLGA3 = 1372
+PBOSCLE0 = 0
+PBOSCLE1 = 0
+PBOSCLE2 = 0
+PBOSCLE3 = 142
+PORDBOS0 = 302
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 0
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 0
+PORDLGA2 = 515
+PORDLGA3 = 0
+PORDCLE0 = 0
+PORDCLE1 = 619
+PORDCLE2 = 0
+PORDCLE3 = 0
+PLGABOS0 = 0
+PLGABOS1 = 712
+PLGABOS2 = 517
+PLGABOS3 = 686
+PLGABOS4 = 426.7481013
+PLGABOS5 = 401.2518987
+PLGAORD0 = 258.2518987
+PLGAORD1 = 0
+PLGAORD2 = 453.7481013
+PLGAORD3 = 0
+PLGACLE0 = 517
+PLGACLE1 = 0
+PLGACLE2 = 0
+PCLEBOS0 = 131
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 0
+PCLEBOS4 = 0
+PCLEORD0 = 0
+PCLEORD1 = 0
+PCLEORD2 = 712
+PCLEORD3 = 0
+PCLEORD4 = 0
+PCLELGA0 = 0
+PCLELGA1 = 0
+PCLELGA2 = 18
+PCLELGA3 = 391
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0
+BBOSCLE1 = 0
+BORDBOS0 = 0
+CBOSORD0 = 0
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 0
+CBOSCLE2 = 12.8
+CBOSCLE3 = 0
+CORDBOS0 = 0
+CORDBOS1 = 0
+CORDBOS2 = 0
+CORDBOS3 = 19.2
+CORDBOS4 = 0
+CORDLGA0 = 0
+CORDLGA1 = 0
+CORDLGA2 = 10.4
+CORDLGA3 = 0
+CLGAORD0 = 0
+CLGAORD1 = 0
+CLGAORD2 = 20.1
+CLGAORD3 = 15.9
+CLGACLE0 = 10.4
+CLGACLE1 = 2.4
+CLGACLE2 = 0
+CCLELGA0 = 0
+CCLELGA1 = 0
+CCLELGA2 = 0
+CCLELGA3 = 0
+GRDTIMO1 = 73.01076
+GRDTIMN1 = -100
+GRDTIMO2 = 0
+GRDTIMN2 = -90
+GRDTIMN3 = -45
+GRDTIMN4 = -45
+N1003AC1 = 7
+N1003AC2 = 0
+N1003AC3 = 0.6856076556
+N1003AC4 = 0
+N1005AC1 = 0
+N1005AC2 = 0
+N1005AC3 = 0
+N1005AC4 = 0
+N1011AC1 = 0
+N1011AC2 = 0
+N1011AC3 = 1.314392344
+N1011AC4 = 0
+N1013AC2 = 2.635223456
+N1013AC4 = 0
+N1015AC2 = 5.275510204
+N1015AC4 = 0.9244444444
+N1017AC2 = 0
+N1017AC4 = 0
+N1019AC2 = 4.630082667
+N1019AC4 = 2
+N1021AC1 = 7
+N1021AC2 = 0
+N1021AC3 = 2
+N1021AC4 = 0.9244444444
+N1002AC1 = 7
+N1002AC2 = 0
+N1002AC3 = 2
+N1002AC4 = 2
+N1004AC2 = 0
+N1004AC4 = 0
+N1006AC1 = 7
+N1006AC2 = 0
+N1006AC3 = 2
+N1006AC4 = 0
+N1008AC2 = 0
+N1008AC4 = 0
+N1010AC2 = 7.265306122
+N1010AC4 = 0.9244444444
+N1012AC2 = 0
+N1012AC4 = 2
+N1014AC2 = 5.275510204
+N1014AC4 = 0
+N1100AC2 = 7
+N1100AC4 = 5.274621909
+N1102AC2 = 4.354572463
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0.9244444444
+N1201AC2 = 4.094407129
+N1201AC4 = 0
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+Optimum value: -1749.90013
+Optimum location:
+BAL.3EBW = 0.8118235251
+BHC.3EBW = 0
+BLC.3EBW = 0
+BLV.3EBW = 0
+BN4.3EBW = 4.672552268
+BP8.3EBW = 25.06112421
+BTO.3EBW = 5
+BAL.3PBW = 0
+BHC.3PBW = 0
+BLC.3PBW = 9.550968074
+BLV.3PBW = 0
+BN4.3PBW = 2.506552313
+BP8.3PBW = 8.779496855
+BTO.3PBW = 0
+BAL.3RBW = 9.188176475
+BHC.3RBW = 20
+BLC.3RBW = 15.44903193
+BLV.3RBW = 12
+BN4.3RBW = 8.391585075
+BP8.3RBW = 1.159378938
+BTO.3RBW = 0
+D3T...BW = 122.5706897
+EAL...BW = 10
+EHC...BW = 20
+ELC...BW = 25
+ELV...BW = 12
+EN4...BW = 15.57068966
+EP8...BW = 35
+ETO...BW = 5
+M3..3TBW = 122.5706897
+QPB73EBW = 15.05088823
+QVO73EBW = 35.5455
+QVO73PBW = 20.83701724
+QPB73RBW = 49.6741722
+QVO73RBW = 66.18817241
+WMO73EBW = 3214.889184
+WRO73EBW = 3597.519648
+WMO73PBW = 1770.361014
+WRO73PBW = 2009.742955
+WMO73RBW = 5651.99315
+WRO73RBW = 6262.646874
+*** ppl_lpsol -s -M -oobtained kb2.mps
+Optimum value: 0
+Optimum location:
+BAL.3EBW = 0
+BHC.3EBW = 0
+BLC.3EBW = 0
+BLV.3EBW = 0
+BN4.3EBW = 0
+BP8.3EBW = 0
+BTO.3EBW = 0
+BAL.3PBW = 0
+BHC.3PBW = 0
+BLC.3PBW = 0
+BLV.3PBW = 0
+BN4.3PBW = 0
+BP8.3PBW = 0
+BTO.3PBW = 0
+BAL.3RBW = 0
+BHC.3RBW = 0
+BLC.3RBW = 0
+BLV.3RBW = 0
+BN4.3RBW = 0
+BP8.3RBW = 0
+BTO.3RBW = 0
+D3T...BW = 0
+EAL...BW = 0
+EHC...BW = 0
+ELC...BW = 0
+ELV...BW = 0
+EN4...BW = 0
+EP8...BW = 0
+ETO...BW = 0
+M3..3TBW = 0
+QPB73EBW = 0
+QVO73EBW = 0
+QVO73PBW = 0
+QPB73RBW = 0
+QVO73RBW = 0
+WMO73EBW = 0
+WRO73EBW = 0
+WMO73PBW = 0
+WRO73PBW = 0
+WMO73RBW = 0
+WRO73RBW = 0
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -s -m -oobtained sc105.mps
+Optimum value: -52.20206121
+Optimum location:
+COL00001 = 0
+COL00002 = 10.84845409
+COL00003 = 52.20206121
+COL00004 = 52.20206121
+COL00005 = 52.20206121
+COL00006 = 0
+COL00007 = 10.84845409
+COL00008 = 52.20206121
+COL00009 = 0
+COL00010 = 10.84845409
+COL00011 = 52.20206121
+COL00012 = 0
+COL00013 = 12.35752655
+COL00014 = 57.42226733
+COL00015 = 57.42226733
+COL00016 = 109.6243285
+COL00017 = 0
+COL00018 = 23.20598064
+COL00019 = 109.6243285
+COL00020 = 0
+COL00021 = 23.20598064
+COL00022 = 109.6243285
+COL00023 = 0
+COL00024 = 14.22961977
+COL00025 = 63.16449407
+COL00026 = 63.16449407
+COL00027 = 172.7888226
+COL00028 = 0
+COL00029 = 37.43560041
+COL00030 = 172.7888226
+COL00031 = 0
+COL00032 = 37.43560041
+COL00033 = 172.7888226
+COL00034 = 0
+COL00035 = 16.6070926
+COL00036 = 69.48094347
+COL00037 = 69.48094347
+COL00038 = 242.2697661
+COL00039 = 0
+COL00040 = 54.042693
+COL00041 = 242.2697661
+COL00042 = 0
+COL00043 = 54.042693
+COL00044 = 242.2697661
+COL00045 = 0
+COL00046 = 19.69956814
+COL00047 = 76.42903782
+COL00048 = 76.42903782
+COL00049 = 318.6988039
+COL00050 = 0
+COL00051 = 73.74226114
+COL00052 = 318.6988039
+COL00053 = 0
+COL00054 = 73.74226114
+COL00055 = 318.6988039
+COL00056 = 0
+COL00057 = 23.81717437
+COL00058 = 84.0719416
+COL00059 = 84.0719416
+COL00060 = 402.7707455
+COL00061 = 0
+COL00062 = 97.55943551
+COL00063 = 402.7707455
+COL00064 = 0
+COL00065 = 97.55943551
+COL00066 = 402.7707455
+COL00067 = 17.9865343
+COL00068 = 20.42709879
+COL00069 = 92.47913576
+COL00070 = 92.47913576
+COL00071 = 495.2498813
+COL00072 = 17.9865343
+COL00073 = 117.9865343
+COL00074 = 495.2498813
+COL00075 = 17.9865343
+COL00076 = 117.9865343
+COL00077 = 495.2498813
+COL00078 = 21.79865343
+COL00079 = 21.79865343
+COL00080 = 101.7270493
+COL00081 = 101.7270493
+COL00082 = 596.9769306
+COL00083 = 39.78518773
+COL00084 = 139.7851877
+COL00085 = 596.9769306
+COL00086 = 39.78518773
+COL00087 = 139.7851877
+COL00088 = 596.9769306
+COL00089 = 23.97851877
+COL00090 = 23.97851877
+COL00091 = 111.8997543
+COL00092 = 111.8997543
+COL00093 = 708.8766849
+COL00094 = 63.7637065
+COL00095 = 163.7637065
+COL00096 = 708.8766849
+COL00097 = 63.7637065
+COL00098 = 163.7637065
+COL00099 = 708.8766849
+COL00100 = 26.37637065
+COL00101 = 26.37637065
+COL00102 = 123.0897297
+COL00103 = 123.0897297
+*** ppl_lpsol -s -M -oobtained sc105.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 50
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 50
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 50
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 100
+COL00019 = 0
+COL00020 = 0
+COL00021 = 27.27272727
+COL00022 = 0
+COL00023 = 0
+COL00024 = 63.63636364
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 163.6363636
+COL00030 = 0
+COL00031 = 0
+COL00032 = 163.6363636
+COL00033 = 0
+COL00034 = 45.45454545
+COL00035 = 109.0909091
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 45.45454545
+COL00040 = 272.7272727
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 100
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+COL00049 = 0
+COL00050 = 145.4545455
+COL00051 = 272.7272727
+COL00052 = 0
+COL00053 = 0
+COL00054 = 0
+COL00055 = 0
+COL00056 = 100
+COL00057 = 0
+COL00058 = 0
+COL00059 = 0
+COL00060 = 0
+COL00061 = 245.4545455
+COL00062 = 272.7272727
+COL00063 = 0
+COL00064 = 0
+COL00065 = 0
+COL00066 = 0
+COL00067 = 100
+COL00068 = 0
+COL00069 = 0
+COL00070 = 0
+COL00071 = 0
+COL00072 = 345.4545455
+COL00073 = 272.7272727
+COL00074 = 0
+COL00075 = 0
+COL00076 = 272.7272727
+COL00077 = 0
+COL00078 = 9.090909091
+COL00079 = 181.8181818
+COL00080 = 0
+COL00081 = 0
+COL00082 = 0
+COL00083 = 354.5454545
+COL00084 = 454.5454545
+COL00085 = 0
+COL00086 = 354.5454545
+COL00087 = 454.5454545
+COL00088 = 0
+COL00089 = 0
+COL00090 = 0
+COL00091 = 369.6969697
+COL00092 = 0
+COL00093 = 0
+COL00094 = 354.5454545
+COL00095 = 454.5454545
+COL00096 = 369.6969697
+COL00097 = 0
+COL00098 = 100
+COL00099 = 0
+COL00100 = 20
+COL00101 = 20
+COL00102 = 93.33333333
+COL00103 = 0
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+Optimum value: -64.57507706
+Optimum location:
+COL00001 = 0
+COL00002 = 16.56869221
+COL00003 = 64.57507706
+COL00004 = 64.57507706
+COL00005 = 64.57507706
+COL00006 = 0
+COL00007 = 16.56869221
+COL00008 = 64.57507706
+COL00009 = 0
+COL00010 = 16.56869221
+COL00011 = 64.57507706
+COL00012 = 0
+COL00013 = 20.00990753
+COL00014 = 71.03258476
+COL00015 = 71.03258476
+COL00016 = 135.6076618
+COL00017 = 0
+COL00018 = 36.57859974
+COL00019 = 135.6076618
+COL00020 = 0
+COL00021 = 36.57859974
+COL00022 = 135.6076618
+COL00023 = 14.17734478
+COL00024 = 17.59874505
+COL00025 = 78.13584324
+COL00026 = 78.13584324
+COL00027 = 213.7435051
+COL00028 = 14.17734478
+COL00029 = 54.17734478
+COL00030 = 213.7435051
+COL00031 = 14.17734478
+COL00032 = 54.17734478
+COL00033 = 213.7435051
+COL00034 = 18.41773448
+COL00035 = 18.41773448
+COL00036 = 85.94942756
+COL00037 = 85.94942756
+COL00038 = 299.6929326
+COL00039 = 32.59507926
+COL00040 = 72.59507926
+COL00041 = 299.6929326
+COL00042 = 32.59507926
+COL00043 = 72.59507926
+COL00044 = 299.6929326
+COL00045 = 20.25950793
+COL00046 = 20.25950793
+COL00047 = 94.54437032
+COL00048 = 94.54437032
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 20
+COL00002 = 55
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 20
+COL00007 = 55
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 70
+COL00013 = 30
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 90
+COL00018 = 85
+COL00019 = 0
+COL00020 = 0
+COL00021 = 85
+COL00022 = 0
+COL00023 = 41.66666667
+COL00024 = 86.66666667
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 131.6666667
+COL00029 = 171.6666667
+COL00030 = 0
+COL00031 = 131.6666667
+COL00032 = 171.6666667
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 201.1111111
+COL00037 = 0
+COL00038 = 0
+COL00039 = 131.6666667
+COL00040 = 171.6666667
+COL00041 = 201.1111111
+COL00042 = 0
+COL00043 = 40
+COL00044 = 0
+COL00045 = 17
+COL00046 = 17
+COL00047 = 79.33333333
+COL00048 = 0
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+Optimum value: -70
+Optimum location:
+COL00001 = 30
+COL00002 = 28
+COL00003 = 42
+COL00004 = 70
+COL00005 = 70
+COL00006 = 30
+COL00007 = 28
+COL00008 = 42
+COL00009 = 30
+COL00010 = 28
+COL00011 = 42
+COL00012 = 33
+COL00013 = 30.8
+COL00014 = 46.2
+COL00015 = 77
+COL00016 = 147
+COL00017 = 63
+COL00018 = 58.8
+COL00019 = 88.2
+COL00020 = 63
+COL00021 = 58.8
+COL00022 = 88.2
+COL00023 = 36.3
+COL00024 = 33.88
+COL00025 = 50.82
+COL00026 = 84.7
+COL00027 = 231.7
+COL00028 = 99.3
+COL00029 = 92.68
+COL00030 = 139.02
+COL00031 = 99.3
+COL00032 = 92.68
+COL00033 = 139.02
+COL00034 = 39.93
+COL00035 = 37.268
+COL00036 = 55.902
+COL00037 = 93.17
+COL00038 = 324.87
+COL00039 = 139.23
+COL00040 = 129.948
+COL00041 = 194.922
+COL00042 = 139.23
+COL00043 = 129.948
+COL00044 = 194.922
+COL00045 = 43.923
+COL00046 = 40.9948
+COL00047 = 61.4922
+COL00048 = 102.487
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 100
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 100
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 100
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 200
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 100
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 200
+COL00041 = 100
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_mpz_a b/demos/ppl_lpsol/expected_mpz_a
new file mode 100644
index 0000000..ffb6e8d
--- /dev/null
+++ b/demos/ppl_lpsol/expected_mpz_a
@@ -0,0 +1,1910 @@
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+Optimum value: 225494.9632
+Optimum location:
+...100 = 22.85454545
+...101 = 0.5454545455
+...102 = 4.62693727
+...103 = 0
+...104 = 0
+...105 = 35.10714286
+...106 = 4.793014706
+...107 = 2.942801288
+...108 = 0
+...109 = 44.40554954
+...110 = 0
+...111 = 9.884315099
+...112 = 0
+...113 = 0
+...114 = 108
+...115 = 0
+...116 = 0
+...117 = 0
+...118 = 0
+...119 = 0
+...120 = 13
+...121 = 0
+...122 = 0
+...123 = 0
+...124 = 73.92849567
+...125 = 51.29498565
+...126 = 139.7765187
+...127 = 0
+...128 = 0
+...129 = 109.3391662
+...130 = 3.803724425
+...131 = 3.920125575
+...132 = 134
+...133 = 0
+...134 = 0
+...135 = 0
+...136 = 31
+...137 = 0
+...138 = 0
+...139 = 0
+...140 = 0
+...141 = 60
+...142 = 111.7272727
+...143 = 0
+...144 = 51.90909091
+...145 = 29.86330761
+...146 = 4.136692391
+...147 = 0
+...148 = 0
+...149 = 41.5
+...150 = 0
+...151 = 15.4788166
+...152 = 0
+...153 = 15
+...154 = 0
+...155 = 0
+...156 = 3.1
+...157 = 0
+...158 = 0.6909090909
+...159 = 0
+...160 = 0
+...161 = 175.4447167
+...162 = 0
+...163 = 9.806141065
+...164 = 0
+...165 = 0
+...166 = 33.46836966
+...167 = 9.531630344
+...168 = 10.29307503
+...169 = 8.906924975
+...170 = 0
+...171 = 0
+...172 = 6.1
+...173 = 0
+...174 = 9.792857143
+...175 = 313.1973528
+...176 = 55.43167804
+...177 = 264.5552833
+...178 = 0
+...179 = 13.2
+...180 = 0
+...181 = 1.314479773
+...182 = 0.5032608696
+...183 = 0
+...184 = 0
+...185 = 0
+...186 = 0
+...187 = 0
+...188 = 0
+...189 = 0
+...190 = 0
+...191 = 13.5
+...192 = 8.737073136
+...193 = 0
+...194 = 31.2
+...195 = 0
+...196 = 0
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+Unbounded problem.
+*** ppl_lpsol -s -m -oobtained afiro.mps
+Optimum value: -464.7531429
+Optimum location:
+X01 = 80
+X02 = 25.5
+X03 = 54.5
+X04 = 84.8
+X06 = 58.1560164
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 18.21428571
+X15 = 39.94173069
+X16 = 61.64537738
+X22 = 500
+X23 = 475.92
+X24 = 24.08
+X25 = 0
+X26 = 215
+X28 = 366.4378962
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 339.9428571
+X37 = 17.50496094
+X38 = 157.5682954
+X39 = 0
+*** ppl_lpsol -s -M -oobtained afiro.mps
+Optimum value: 3438.2921
+Optimum location:
+X01 = 54.5
+X02 = 0
+X03 = 54.5
+X04 = 57.77
+X06 = 0
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 0
+X15 = 0
+X16 = 0
+X22 = 500
+X23 = 483.5955
+X24 = 16.4045
+X25 = 0
+X26 = 215
+X28 = 0
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 345.4253571
+X37 = 0
+X38 = 0
+X39 = 389.4253571
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -s -m -oobtained blend.mps
+Optimum value: -30.81214985
+Optimum location:
+1 = 20.94480195
+2 = 10.17092161
+3 = 11.24735865
+4 = 2.981097124
+5 = 0.6597035933
+6 = 0.4759263446
+7 = 0
+8 = 10.10117614
+9 = 0
+10 = 1.679178924
+11 = 0
+12 = 10.10117614
+13 = 0
+14 = 11.78035507
+15 = 0
+16 = 0.4067430357
+17 = 0
+18 = 2.173256964
+19 = 2.018559906
+20 = 4.843256964
+21 = 0
+22 = 3.13818313
+23 = 1.149909949
+24 = 1.396291081
+25 = 0
+26 = 0
+27 = 0
+28 = 0
+29 = 0.3835003722
+30 = 0
+31 = 4.424431137
+32 = 0
+33 = 1.149909949
+34 = 1.396291081
+35 = 0.7485700927
+36 = 21.63838697
+37 = 8.102702633
+38 = 0.7107761404
+39 = 0.4817893472
+40 = 0
+41 = 4.892936372
+42 = 0
+43 = 0.4416752608
+44 = 14.28573702
+45 = 6.527177121
+46 = 2.005816841
+47 = 0
+48 = 0
+49 = 0.7713285688
+50 = 4.87625743
+51 = 0.2242247192
+52 = 1.811155615
+53 = 7.877627559
+54 = 0.3201545422
+55 = 0.9892470535
+56 = 0.4439079385
+57 = 1.433154992
+58 = 0
+59 = 0
+60 = 0
+61 = 3.079217438
+62 = 0.795583754
+63 = 3.874801192
+64 = 0.7749576722
+65 = 1.83076589
+66 = 0
+67 = 0
+68 = 0.06587344195
+69 = 0.7889117798
+70 = 3.460508784
+71 = 2.750888679
+72 = 0
+73 = 0
+74 = 0
+75 = 0
+76 = 0
+77 = 0.1693961964
+78 = 0
+79 = 1.154801147
+80 = 0
+81 = 0.8033012352
+82 = 26.03036862
+83 = 87.09497412
+*** ppl_lpsol -s -M -oobtained blend.mps
+Unbounded problem.
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+Optimum value: -335.2135675
+Optimum location:
+PBOSHNL0 = 0
+PBOSHNL1 = 12
+PBOSHNL7 = 0
+PBOSHNL8 = 0
+PBOSLAX0 = 14
+PBOSLAX1 = 0
+PBOSLAX7 = 0
+PBOSSEA0 = 0
+PBOSSEA1 = 0
+PBOSSEA2 = 49
+PBOSSFO0 = 73
+PBOSSFO1 = 60
+PBOSTPE1 = 1
+PBOSTPE2 = 0
+PBOSTYO1 = 3
+PBOSTYO2 = 0
+PBOSYUL0 = 28.13380282
+PBOSYUL1 = 347.7678621
+PBOSYUL2 = 0.325
+PBOSYUL3 = 336.7733351
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 0
+PBOSYVR2 = 26
+PBOSYWG0 = 0
+PBOSYWG1 = 0
+PBOSYWG7 = 37
+PBOSYYZ0 = 19.03169014
+PBOSYYZ1 = 195.9683099
+PBUROAK0 = 11
+PBUROAK1 = 16
+PBURSEA0 = 83
+PBURSEA1 = 0
+PBURSFO0 = 278
+PHNLLAX0 = 104.0482353
+PHNLLAX1 = 33.04
+PHNLLAX2 = 68.20588235
+PHNLLAX3 = 98
+PHNLLON0 = 0
+PHNLLON6 = 5
+PHNLPAR0 = 0
+PHNLPAR6 = 1
+PHNLSEA0 = 0
+PHNLSEA1 = 157.7943925
+PHNLSEA2 = 0
+PHNLSFO0 = 35
+PHNLSFO1 = 0
+PHNLSFO7 = 0
+PHNLYVR0 = 94.20560748
+PHNLYVR1 = 0
+PHNLYVR7 = 39.79439252
+PLASSEA0 = 33.01327253
+PLASSEA1 = 342.9867275
+PLASYVR0 = 37
+PLASYVR6 = 0
+PLAXOAK0 = 32
+PLAXOAK1 = 0
+PLAXOAK2 = 46
+PLAXSEA0 = 0
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 546.0147059
+PLAXSEA4 = 3.720588235
+PLAXSEA5 = 139
+PLAXSEA6 = 66.26744186
+PLAXSEA7 = 0
+PLAXSEA8 = 75
+PLAXSEA9 = 5.415868673
+PLAXSFO0 = 33.04
+PLAXSFO1 = 260.8488372
+PLAXSFO2 = 839.9632721
+PLAXSFO3 = 87.90697674
+PLAXSFO4 = 168
+PLAXSFO5 = 98
+PLAXSFO6 = 1464.240914
+PLAXTPE0 = 8.581395349
+PLAXTPE1 = 0
+PLAXTPE2 = 0
+PLAXTPE8 = 22.41860465
+PLAXTYO0 = 41
+PLAXTYO1 = 0
+PLAXTYO2 = 0
+PLAXTYO8 = 0
+PLAXYVR0 = 0
+PLAXYVR1 = 153.755814
+PLAXYVR2 = 39.24418605
+PLONPAR0 = 0
+PLONPAR1 = 0
+PLONPAR2 = 2
+PLONSEA0 = 0
+PLONSEA1 = 151
+PLONYVR0 = 0
+PLONYVR1 = 0
+PLONYVR7 = 51
+POAKONT0 = 0
+POAKONT1 = 13
+POAKSEA0 = 37.89108456
+POAKSEA1 = 77.15303309
+POAKSEA2 = 6.955882353
+PONTSFO0 = 177
+PONTSEA0 = 23.10431985
+PONTSEA1 = 24.89568015
+PONTSEA2 = 0
+PPARSEA0 = 0
+PPARSEA1 = 68
+PPARYVR0 = 0
+PPARYVR1 = 0
+PPARYVR7 = 24
+PRNOSEA0 = 0
+PRNOSEA1 = 291
+PRNOYVR0 = 67
+PSEASFO0 = 0
+PSEASFO1 = 839.9632721
+PSEASFO2 = 146.6809139
+PSEASFO3 = 236.6
+PSEASFO4 = 0
+PSEASFO5 = 50.75581395
+PSEASFO6 = 145
+PSEATPE0 = 75.80232558
+PSEATPE1 = 0
+PSEATPE2 = 0
+PSEATPE3 = 1.61627907
+PSEATYO0 = 0
+PSEATYO1 = 0
+PSEATYO2 = 0
+PSEATYO3 = 138
+PSEAYVR0 = 164.8598131
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 392
+PSEAYVR4 = 0
+PSEAYVR5 = 33.01327253
+PSEAYVR6 = 0
+PSEAYVR7 = 50.75581395
+PSEAYVR8 = 47.16549296
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 6
+PSFOTPE8 = 0
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 17
+PSFOTYO8 = 0
+PSFOYVR0 = 260.8488372
+PSFOYVR1 = 37.15116279
+PTPETYO0 = 51.01162791
+PTPETYO1 = 0
+PTPETYO2 = 59.98837209
+PTPETYO3 = 0
+PTPEYVR0 = 57
+PTYOYVR0 = 91
+PYULYVR0 = 36.4084507
+PYULYVR1 = 134.1343917
+PYULYVR2 = 139.6904909
+PYULYVR3 = 4.766666667
+PYULYWG0 = 0
+PYULYWG1 = 271.3172923
+PYULYWG2 = 0
+PYULYWG3 = 178.6827077
+PYULYYZ0 = 0
+PYULYYZ1 = 266.6818464
+PYULYYZ2 = 0
+PYULYYZ3 = 431.9057717
+PYULYYZ4 = 1913.412382
+PYVRYWG0 = 14.67957746
+PYVRYWG1 = 271.3172923
+PYVRYWG2 = 138.0031303
+PYVRYYZ0 = 4.352112676
+PYVRYYZ1 = 241.2835753
+PYVRYYZ2 = 126.3643121
+PYWGYYZ0 = 14.67957746
+PYWGYYZ1 = 138.0031303
+PYWGYYZ2 = 0
+PYWGYYZ3 = 125.3172923
+PBOSOAK0 = 11
+PBOSOAK6 = 0
+PBOSBUR1 = 7
+PBOSBUR2 = 0
+PBOSONT1 = 4
+PBOSONT2 = 0
+PBURYVR1 = 26
+PBURTYO1 = 2
+PBURTPE1 = 1
+PBURHNL0 = 11
+PBURHNL6 = 0
+PHNLOAK0 = 0
+PHNLOAK1 = 24
+PHNLOAK2 = 0
+PHNLOAK8 = 0
+PHNLONT0 = 9.705882353
+PHNLONT6 = 6.294117647
+PHNLYWG1 = 3
+PHNLYYZ1 = 24
+PHNLYUL1 = 40
+PLASTYO1 = 5
+PLASTPE1 = 1
+PLAXLON0 = 13
+PLAXLON6 = 0
+PLAXLON7 = 0
+PLAXPAR0 = 8
+PLAXPAR6 = 0
+PLAXPAR7 = 0
+PBURLON1 = 1
+PBURPAR1 = 1
+PLONONT1 = 1
+PLONOAK1 = 1
+POAKPAR1 = 2
+POAKTYO1 = 7
+POAKTPE1 = 2
+PONTPAR1 = 2
+PONTTYO1 = 2
+PONTTPE1 = 1
+PPARSFO1 = 2
+PRNOTYO1 = 5
+PRNOTPE1 = 2
+PTPEYWG1 = 21
+PTPEYYZ1 = 13
+PTPEYUL1 = 6
+PTYOYUL1 = 7
+PTYOYYZ1 = 17
+PTYOYWG1 = 25
+PLAXONT0 = 6.294117647
+GRDTIMO1 = 0
+GRDTIMN1 = -49.01286158
+GRDTIMO2 = 0
+GRDTIMN2 = 0
+GRDTIMO3 = 0
+GRDTIMN3 = -47
+GRDTIMO4 = 0
+GRDTIMN4 = 0
+GRDTIMO5 = 0
+GRDTIMN5 = -47.24353963
+GRDTIMO6 = 0
+GRDTIMN6 = -81
+N1001AC1 = 0
+N1001AC2 = 0
+N1001AC3 = 0
+N1002AC1 = 0
+N1002AC2 = 0
+N1002AC3 = 2.355140187
+N1003AC1 = 0
+N1003AC2 = 0.1603208556
+N1003AC3 = 0.7214438503
+N1004AC1 = 0.28
+N1004AC2 = 0
+N1004AC3 = 0
+N1005AC3 = 0.0859375
+N1105AC3 = 0.8382352941
+N1006AC3 = 0.07582720588
+N1007AC1 = 0
+N1007AC2 = 0
+N1007AC3 = 0
+N1008AC1 = 0
+N1008AC2 = 0
+N1008AC3 = 0
+N1008AC4 = 0
+N1008AC5 = 0
+N1008AC6 = 4.65801495
+N1009AC1 = 0
+N1009AC2 = 0.07488107822
+N1009AC3 = 0
+N1009AC4 = 0
+N1009AC5 = 1.921947674
+N1010AC1 = 0
+N1010AC2 = 0
+N1010AC3 = 0
+N1010AC4 = 0
+N1010AC5 = 0
+N1010AC6 = 7
+N1011AC1 = 0
+N1011AC2 = 3.085065997
+N1011AC3 = 0.6951730225
+N1011AC4 = 0
+N1011AC5 = 3.897217245
+N1011AC6 = 0
+N1012AC1 = 1.510832058
+N1012AC2 = 0
+N1012AC3 = 0
+N1012AC4 = 0
+N1012AC5 = 2.417331293
+N1013AC3 = 0
+N1013AC4 = 0
+N1013AC5 = 0
+N1013AC6 = 0.9241727941
+N1014AC3 = 0
+N1014AC4 = 0
+N1014AC5 = 1.691245404
+N1014AC6 = 0.2228170956
+N1015AC3 = 0
+N1015AC4 = 0.7048194146
+N1015AC5 = 0.1595430366
+N1015AC6 = 2.135637549
+N1016AC3 = 0
+N1016AC4 = 0
+N1016AC5 = 0.7
+N1016AC6 = 3.3
+N1017AC3 = 0
+N1017AC4 = 0
+N1017AC5 = 0
+N1017AC6 = 0.1617647059
+N1018AC1 = 0
+N1018AC2 = 0
+N1018AC3 = 0
+N1018AC4 = 0
+N1018AC5 = 0
+N1018AC6 = 1.196428571
+N1019AC1 = 0
+N1019AC2 = 0
+N1019AC3 = 0
+N1019AC4 = 0.2345133807
+N1019AC5 = 0.7654866193
+N1020AC1 = 0.2228332753
+N1020AC2 = 0
+N1020AC3 = 0
+N1020AC4 = 0
+N1020AC5 = 3.200696136
+N1020AC6 = 0
+N1021AC1 = 0.664202377
+N1021AC2 = 0
+N1021AC3 = 0
+N1021AC4 = 0
+N1021AC5 = 2.453858782
+N1022AC1 = 0
+N1023AC1 = 0
+N1026AC1 = 1
+N1027AC1 = 0.476744186
+N1028AC1 = 0
+N1029AC1 = 0.523255814
+N1030AC1 = 1
+N1032AC1 = 0
+N1032AC2 = 0
+N1032AC3 = 0
+N1032AC4 = 0.8274647887
+N1032AC5 = 0
+N1033AC1 = 0.4860357966
+N1033AC2 = 0.500476922
+N1033AC3 = 0
+N1033AC4 = 0
+N1033AC5 = 2.061996183
+N1034AC1 = 0
+N1034AC2 = 0
+N1034AC3 = 3.174783885
+N1035AC1 = 0.6827679474
+N1035AC2 = 0
+N1035AC3 = 0
+N1035AC4 = 0.7269371829
+N1035AC5 = 0.2529831862
+N1036AC1 = 0.1083333333
+N1036AC2 = 0
+N1036AC3 = 0
+N1037AC4 = 0
+N1037AC5 = 0
+N1038AC4 = 0.2383968781
+N1038AC5 = 1.271450017
+N1039AC4 = 0
+N1039AC5 = 2.077705904
+N1040AC4 = 0
+N1040AC5 = 0
+N1040AC6 = 9.513243659
+N1041AC4 = 8.856901224
+N1041AC5 = 0
+N1041AC6 = 20
+N1042AC4 = 0
+N1042AC5 = 0
+N1042AC6 = 0
+N1043AC1 = 0.1725352113
+N1043AC2 = 0
+N1043AC3 = 0
+N1044AC1 = 0
+N1044AC2 = 0
+N1044AC3 = 1
+N1046AC3 = 1
+N1047AC1 = 0
+N1047AC2 = 0
+N1047AC3 = 1
+N1050AC3 = 0
+N1050AC4 = 0
+N1050AC5 = 0.0731874145
+N1051AC1 = 0
+N1051AC2 = 0
+N1051AC3 = 0
+N1051AC4 = 0
+N1051AC5 = 4.651904242
+N1051AC6 = 20
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+Optimum value: 286.9746573
+Optimum location:
+PBOSHNL0 = 0
+PBOSHNL1 = 10
+PBOSHNL7 = 0
+PBOSHNL8 = 0
+PBOSLAX0 = 0
+PBOSLAX1 = 0
+PBOSLAX7 = 12
+PBOSSEA0 = 0
+PBOSSEA1 = 40
+PBOSSEA2 = 0
+PBOSSFO0 = 73
+PBOSSFO1 = 48
+PBOSTPE1 = 0
+PBOSTPE2 = 0
+PBOSTYO1 = 0
+PBOSTYO2 = 0
+PBOSYUL0 = 383.9469027
+PBOSYUL1 = 224.0530973
+PBOSYUL2 = 0
+PBOSYUL3 = 0
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 23
+PBOSYVR2 = 0
+PBOSYWG0 = 33
+PBOSYWG1 = 0
+PBOSYWG7 = 0
+PBOSYYZ0 = 0
+PBOSYYZ1 = 193
+PBUROAK0 = 9
+PBUROAK1 = 15
+PBURSEA0 = 69
+PBURSEA1 = 0
+PBURSFO0 = 243
+PHNLLAX0 = 0
+PHNLLAX1 = 126.296875
+PHNLLAX2 = 100.03125
+PHNLLAX3 = 104.4375
+PHNLLON0 = 0
+PHNLLON6 = 0
+PHNLPAR0 = 0
+PHNLPAR6 = 0
+PHNLSEA0 = 0
+PHNLSEA1 = 135.2523364
+PHNLSEA2 = 0
+PHNLSFO0 = 0
+PHNLSFO1 = 0
+PHNLSFO7 = 31
+PHNLYVR0 = 80.74766355
+PHNLYVR1 = 0
+PHNLYVR7 = 35.25233645
+PLASSEA0 = 365
+PLASSEA1 = 0
+PLASYVR0 = 0
+PLASYVR6 = 33
+PLAXOAK0 = 42.765625
+PLAXOAK1 = 0
+PLAXOAK2 = 46
+PLAXSEA0 = 295.96875
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 0
+PLAXSEA4 = 6
+PLAXSEA5 = 139
+PLAXSEA6 = 0
+PLAXSEA7 = 139
+PLAXSEA8 = 139
+PLAXSEA9 = 12.03125
+PLAXSFO0 = 164.828125
+PLAXSFO1 = 1090
+PLAXSFO2 = 0
+PLAXSFO3 = 20
+PLAXSFO4 = 68
+PLAXSFO5 = 144
+PLAXSFO6 = 1212.171875
+PLAXTPE0 = 0
+PLAXTPE1 = 18
+PLAXTPE2 = 9
+PLAXTPE8 = 0
+PLAXTYO0 = 0
+PLAXTYO1 = 9
+PLAXTYO2 = 27
+PLAXTYO8 = 0
+PLAXYVR0 = 116
+PLAXYVR1 = 0
+PLAXYVR2 = 57
+PLONPAR0 = 0
+PLONPAR1 = 0
+PLONPAR2 = 0
+PLONSEA0 = 0
+PLONSEA1 = 127
+PLONYVR0 = 0
+PLONYVR1 = 0
+PLONYVR7 = 45
+POAKONT0 = 0
+POAKONT1 = 11
+POAKSEA0 = 41
+POAKSEA1 = 57
+POAKSEA2 = 0
+PONTSFO0 = 155
+PONTSEA0 = 25
+PONTSEA1 = 12
+PONTSEA2 = 0
+PPARSEA0 = 0
+PPARSEA1 = 53
+PPARYVR0 = 0
+PPARYVR1 = 0
+PPARYVR7 = 21
+PRNOSEA0 = 255
+PRNOSEA1 = 0
+PRNOYVR0 = 60
+PSEASFO0 = 822
+PSEASFO1 = 0
+PSEASFO2 = 156
+PSEASFO3 = 224
+PSEASFO4 = 0
+PSEASFO5 = 20
+PSEASFO6 = 68
+PSEATPE0 = 0
+PSEATPE1 = 0
+PSEATPE2 = 42
+PSEATPE3 = 0
+PSEATYO0 = 0
+PSEATYO1 = 0
+PSEATYO2 = 117
+PSEATYO3 = 0
+PSEAYVR0 = 0
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 649.2523364
+PSEAYVR4 = 0
+PSEAYVR5 = 0
+PSEAYVR6 = 0
+PSEAYVR7 = 0
+PSEAYVR8 = 0
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 0
+PSFOTPE8 = 0
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 0
+PSFOTYO8 = 15
+PSFOYVR0 = 268
+PSFOYVR1 = 0
+PTPETYO0 = 0
+PTPETYO1 = 0
+PTPETYO2 = 99
+PTPETYO3 = 0
+PTPEYVR0 = 44
+PTYOYVR0 = 74
+PYULYVR0 = 182
+PYULYVR1 = 88
+PYULYVR2 = 0
+PYULYVR3 = 0
+PYULYWG0 = 161.3018868
+PYULYWG1 = 178
+PYULYWG2 = 31.69811321
+PYULYWG3 = 0
+PYULYYZ0 = 0
+PYULYYZ1 = 0
+PYULYYZ2 = 245.3018868
+PYULYYZ3 = 1997
+PYULYYZ4 = 107.6981132
+PYVRYWG0 = 194.3018868
+PYVRYWG1 = 178
+PYVRYWG2 = 4.698113208
+PYVRYYZ0 = 328.6981132
+PYVRYYZ1 = 0
+PYVRYYZ2 = 4.301886792
+PYWGYYZ0 = 0
+PYWGYYZ1 = 4.698113208
+PYWGYYZ2 = 245.3018868
+PYWGYYZ3 = 0
+PBOSOAK0 = 9
+PBOSOAK6 = 0
+PBOSBUR1 = 0
+PBOSBUR2 = 0
+PBOSONT1 = 0
+PBOSONT2 = 0
+PBURYVR1 = 23
+PBURTYO1 = 0
+PBURTPE1 = 0
+PBURHNL0 = 9
+PBURHNL6 = 0
+PHNLOAK0 = 0
+PHNLOAK1 = 2.234375
+PHNLOAK2 = 0
+PHNLOAK8 = 18.765625
+PHNLONT0 = 0
+PHNLONT6 = 14
+PHNLYWG1 = 0
+PHNLYYZ1 = 21
+PHNLYUL1 = 35
+PLASTYO1 = 0
+PLASTPE1 = 0
+PLAXLON0 = 11
+PLAXLON6 = 0
+PLAXLON7 = 0
+PLAXPAR0 = 0
+PLAXPAR6 = 0
+PLAXPAR7 = 0
+PBURLON1 = 0
+PBURPAR1 = 0
+PLONONT1 = 0
+PLONOAK1 = 0
+POAKPAR1 = 0
+POAKTYO1 = 0
+POAKTPE1 = 0
+PONTPAR1 = 0
+PONTTYO1 = 0
+PONTTPE1 = 0
+PPARSFO1 = 0
+PRNOTYO1 = 0
+PRNOTPE1 = 0
+PTPEYWG1 = 18
+PTPEYYZ1 = 11
+PTPEYUL1 = 0
+PTYOYUL1 = 0
+PTYOYYZ1 = 15
+PTYOYWG1 = 22
+PLAXONT0 = 14
+GRDTIMO1 = 0
+GRDTIMN1 = -105
+GRDTIMO2 = 0
+GRDTIMN2 = -91
+GRDTIMO3 = 0
+GRDTIMN3 = -47
+GRDTIMO4 = 0
+GRDTIMN4 = -43.5
+GRDTIMO5 = 0
+GRDTIMN5 = -87
+GRDTIMO6 = 0
+GRDTIMN6 = -81
+N1001AC1 = 0
+N1001AC2 = 0
+N1001AC3 = 0
+N1002AC1 = 0
+N1002AC2 = 2.018691589
+N1002AC3 = 0
+N1003AC1 = 0
+N1003AC2 = 0
+N1003AC3 = 0
+N1004AC1 = 0
+N1004AC2 = 1.0703125
+N1004AC3 = 0
+N1005AC3 = 0.0703125
+N1105AC3 = 0.9296875
+N1006AC3 = 0
+N1007AC1 = 0
+N1007AC2 = 0
+N1007AC3 = 0
+N1008AC1 = 5.28156777
+N1008AC2 = 0
+N1008AC3 = 1.986798017
+N1008AC4 = 0
+N1008AC5 = 0
+N1008AC6 = 0
+N1009AC1 = 0
+N1009AC2 = 0
+N1009AC3 = 0
+N1009AC4 = 0
+N1009AC5 = 0
+N1010AC1 = 7
+N1010AC2 = 7
+N1010AC3 = 7
+N1010AC4 = 7
+N1010AC5 = 7
+N1010AC6 = 7
+N1011AC1 = 0
+N1011AC2 = 0
+N1011AC3 = 0
+N1011AC4 = 0
+N1011AC5 = 0
+N1011AC6 = 0
+N1012AC1 = 0
+N1012AC2 = 0
+N1012AC3 = 0
+N1012AC4 = 0
+N1012AC5 = 0
+N1013AC3 = 0
+N1013AC4 = 0
+N1013AC5 = 0
+N1013AC6 = 1
+N1014AC3 = 0
+N1014AC4 = 0
+N1014AC5 = 0
+N1014AC6 = 1.909090909
+N1015AC3 = 0
+N1015AC4 = 0
+N1015AC5 = 0
+N1015AC6 = 3
+N1016AC3 = 0
+N1016AC4 = 0
+N1016AC5 = 0
+N1016AC6 = 4
+N1017AC3 = 0
+N1017AC4 = 0
+N1017AC5 = 0
+N1017AC6 = 0.09090909091
+N1018AC1 = 3.782713662
+N1018AC2 = 6.749720383
+N1018AC3 = 7
+N1018AC4 = 0
+N1018AC5 = 4.039001304
+N1018AC6 = 0
+N1019AC1 = 0
+N1019AC2 = 1.412371134
+N1019AC3 = 0
+N1019AC4 = 2.587628866
+N1019AC5 = 0
+N1020AC1 = 0
+N1020AC2 = 0
+N1020AC3 = 0
+N1020AC4 = 0
+N1020AC5 = 0
+N1020AC6 = 0
+N1021AC1 = 0
+N1021AC2 = 0
+N1021AC3 = 0
+N1021AC4 = 0
+N1021AC5 = 0
+N1022AC1 = 0
+N1023AC1 = 0
+N1026AC1 = 1
+N1027AC1 = 0
+N1028AC1 = 0
+N1029AC1 = 1
+N1030AC1 = 1
+N1032AC1 = 1
+N1032AC2 = 1
+N1032AC3 = 1
+N1032AC4 = 1
+N1032AC5 = 1
+N1033AC1 = 0
+N1033AC2 = 1.371681416
+N1033AC3 = 0
+N1033AC4 = 0.6283185841
+N1033AC5 = 0
+N1034AC1 = 0
+N1034AC2 = 0
+N1034AC3 = 0
+N1035AC1 = 0
+N1035AC2 = 0.04608448823
+N1035AC3 = 0
+N1035AC4 = 0.01051928536
+N1035AC5 = 0
+N1036AC1 = 0
+N1036AC2 = 0
+N1036AC3 = 0
+N1037AC4 = 0
+N1037AC5 = 3.220930233
+N1038AC4 = 0
+N1038AC5 = 0
+N1039AC4 = 0
+N1039AC5 = 0
+N1040AC4 = 10
+N1040AC5 = 10
+N1040AC6 = 10
+N1041AC4 = 5.793776249
+N1041AC5 = 20
+N1041AC6 = 20
+N1042AC4 = 20
+N1042AC5 = 20
+N1042AC6 = 20
+N1043AC1 = 0
+N1043AC2 = 0
+N1043AC3 = 0
+N1044AC1 = 0
+N1044AC2 = 1
+N1044AC3 = 0
+N1046AC3 = 1
+N1047AC1 = 0
+N1047AC2 = 1
+N1047AC3 = 0
+N1050AC3 = 0.109375
+N1050AC4 = 0
+N1050AC5 = 0
+N1051AC1 = 20
+N1051AC2 = 20
+N1051AC3 = 20
+N1051AC4 = 0
+N1051AC5 = 20
+N1051AC6 = 11.52971853
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+Optimum value: -315.018728
+Optimum location:
+PBOSORD0 = 302
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 0
+PBOSLGA0 = 712
+PBOSLGA1 = 268
+PBOSLGA2 = 0
+PBOSLGA3 = 1372
+PBOSCLE0 = 0
+PBOSCLE1 = 142
+PBOSCLE2 = 0
+PBOSCLE3 = 0
+PORDBOS0 = 182.705314
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 119.294686
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 515
+PORDLGA2 = 0
+PORDLGA3 = 0
+PORDCLE0 = 12.29468599
+PORDCLE1 = 0
+PORDCLE2 = 458
+PORDCLE3 = 148.705314
+PLGABOS0 = 913
+PLGABOS1 = 458
+PLGABOS2 = 0
+PLGABOS3 = 0
+PLGABOS4 = 0
+PLGABOS5 = 1372
+PLGAORD0 = 712
+PLGAORD1 = 0
+PLGAORD2 = 0
+PLGAORD3 = 0
+PLGACLE0 = 0
+PLGACLE1 = 249
+PLGACLE2 = 268
+PCLEBOS0 = 0
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 131
+PCLEBOS4 = 0
+PCLEORD0 = 178.5972891
+PCLEORD1 = 249
+PCLEORD2 = 16.40271092
+PCLEORD3 = 268
+PCLEORD4 = 0
+PCLELGA0 = 409
+PCLELGA1 = 0
+PCLELGA2 = 0
+PCLELGA3 = 0
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0.1616272102
+BBOSCLE1 = 7.026778587
+BORDBOS0 = 3.188405797
+CBOSORD0 = 12
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 8.811594203
+CBOSCLE2 = 0
+CBOSCLE3 = 0
+CORDBOS0 = 20.8115942
+CORDBOS1 = 0
+CORDBOS2 = 0
+CORDBOS3 = 0
+CORDBOS4 = 0
+CORDLGA0 = 13
+CORDLGA1 = 0
+CORDLGA2 = 0
+CORDLGA3 = 0
+CLGAORD0 = 22.5
+CLGAORD1 = 22.5
+CLGAORD2 = 0
+CLGAORD3 = 0
+CLGACLE0 = 16
+CLGACLE1 = 0
+CLGACLE2 = 0
+CCLELGA0 = 0
+CCLELGA1 = 5
+CCLELGA2 = 0
+CCLELGA3 = 0
+GRDTIMO1 = 0
+GRDTIMN1 = 0
+GRDTIMO2 = 0
+GRDTIMN2 = -76.79770851
+GRDTIMN3 = -10.27177739
+GRDTIMN4 = -21.60844089
+N1003AC1 = 0
+N1003AC2 = 6.724489796
+N1003AC3 = 0.4
+N1003AC4 = 0
+N1005AC1 = 0.01346893419
+N1005AC2 = 0
+N1005AC3 = 0
+N1005AC4 = 0
+N1011AC1 = 0.5855648822
+N1011AC2 = 0
+N1011AC3 = 0.2937198068
+N1011AC4 = 0
+N1013AC2 = 7.265306122
+N1013AC4 = 2
+N1015AC2 = 0
+N1015AC4 = 1.422222222
+N1017AC2 = 0
+N1017AC4 = 2
+N1019AC2 = 2.540816327
+N1019AC4 = 0
+N1021AC1 = 0.01346893419
+N1021AC2 = 0.1254559795
+N1021AC3 = 0
+N1021AC4 = 0
+N1002AC1 = 0
+N1002AC2 = 0.1254559795
+N1002AC3 = 0
+N1002AC4 = 0
+N1004AC2 = 2.540816327
+N1004AC4 = 2
+N1006AC1 = 0.5990338164
+N1006AC2 = 0
+N1006AC3 = 0.6937198068
+N1006AC4 = 0
+N1008AC2 = 9.316326531
+N1008AC4 = 2
+N1010AC2 = 4.673469388
+N1010AC4 = 0
+N1012AC2 = 0
+N1012AC4 = 1.422222222
+N1014AC2 = 0
+N1014AC4 = 0
+N1100AC2 = 2.734693878
+N1100AC4 = 0
+N1102AC2 = 0
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0
+N1201AC2 = 14
+N1201AC4 = 0
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+Optimum value: -73.36896911
+Optimum location:
+PBOSORD0 = 277
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 0
+PBOSLGA0 = 258.2518987
+PBOSLGA1 = 686
+PBOSLGA2 = 35.74810133
+PBOSLGA3 = 1372
+PBOSCLE0 = 0
+PBOSCLE1 = 0
+PBOSCLE2 = 0
+PBOSCLE3 = 142
+PORDBOS0 = 302
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 0
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 0
+PORDLGA2 = 515
+PORDLGA3 = 0
+PORDCLE0 = 0
+PORDCLE1 = 619
+PORDCLE2 = 0
+PORDCLE3 = 0
+PLGABOS0 = 0
+PLGABOS1 = 712
+PLGABOS2 = 517
+PLGABOS3 = 686
+PLGABOS4 = 426.7481013
+PLGABOS5 = 401.2518987
+PLGAORD0 = 258.2518987
+PLGAORD1 = 0
+PLGAORD2 = 453.7481013
+PLGAORD3 = 0
+PLGACLE0 = 517
+PLGACLE1 = 0
+PLGACLE2 = 0
+PCLEBOS0 = 131
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 0
+PCLEBOS4 = 0
+PCLEORD0 = 0
+PCLEORD1 = 0
+PCLEORD2 = 712
+PCLEORD3 = 0
+PCLEORD4 = 0
+PCLELGA0 = 0
+PCLELGA1 = 0
+PCLELGA2 = 18
+PCLELGA3 = 391
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0
+BBOSCLE1 = 0
+BORDBOS0 = 0
+CBOSORD0 = 0
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 0
+CBOSCLE2 = 12.8
+CBOSCLE3 = 0
+CORDBOS0 = 0
+CORDBOS1 = 0
+CORDBOS2 = 0
+CORDBOS3 = 19.2
+CORDBOS4 = 0
+CORDLGA0 = 0
+CORDLGA1 = 0
+CORDLGA2 = 10.4
+CORDLGA3 = 0
+CLGAORD0 = 0
+CLGAORD1 = 0
+CLGAORD2 = 20.1
+CLGAORD3 = 15.9
+CLGACLE0 = 10.4
+CLGACLE1 = 2.4
+CLGACLE2 = 0
+CCLELGA0 = 0
+CCLELGA1 = 0
+CCLELGA2 = 0
+CCLELGA3 = 0
+GRDTIMO1 = 73.01076
+GRDTIMN1 = -100
+GRDTIMO2 = 0
+GRDTIMN2 = -90
+GRDTIMN3 = -45
+GRDTIMN4 = -45
+N1003AC1 = 7
+N1003AC2 = 0
+N1003AC3 = 0.6856076556
+N1003AC4 = 0
+N1005AC1 = 0
+N1005AC2 = 0
+N1005AC3 = 0
+N1005AC4 = 0
+N1011AC1 = 0
+N1011AC2 = 0
+N1011AC3 = 1.314392344
+N1011AC4 = 0
+N1013AC2 = 2.635223456
+N1013AC4 = 0
+N1015AC2 = 5.275510204
+N1015AC4 = 0.9244444444
+N1017AC2 = 0
+N1017AC4 = 0
+N1019AC2 = 4.630082667
+N1019AC4 = 2
+N1021AC1 = 7
+N1021AC2 = 0
+N1021AC3 = 2
+N1021AC4 = 0.9244444444
+N1002AC1 = 7
+N1002AC2 = 0
+N1002AC3 = 2
+N1002AC4 = 2
+N1004AC2 = 0
+N1004AC4 = 0
+N1006AC1 = 7
+N1006AC2 = 0
+N1006AC3 = 2
+N1006AC4 = 0
+N1008AC2 = 0
+N1008AC4 = 0
+N1010AC2 = 7.265306122
+N1010AC4 = 0.9244444444
+N1012AC2 = 0
+N1012AC4 = 2
+N1014AC2 = 5.275510204
+N1014AC4 = 0
+N1100AC2 = 7
+N1100AC4 = 5.274621909
+N1102AC2 = 4.354572463
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0.9244444444
+N1201AC2 = 4.094407129
+N1201AC4 = 0
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+Optimum value: -1749.90013
+Optimum location:
+BAL.3EBW = 0.8118235251
+BHC.3EBW = 0
+BLC.3EBW = 0
+BLV.3EBW = 0
+BN4.3EBW = 4.672552268
+BP8.3EBW = 25.06112421
+BTO.3EBW = 5
+BAL.3PBW = 0
+BHC.3PBW = 0
+BLC.3PBW = 9.550968074
+BLV.3PBW = 0
+BN4.3PBW = 2.506552313
+BP8.3PBW = 8.779496855
+BTO.3PBW = 0
+BAL.3RBW = 9.188176475
+BHC.3RBW = 20
+BLC.3RBW = 15.44903193
+BLV.3RBW = 12
+BN4.3RBW = 8.391585075
+BP8.3RBW = 1.159378938
+BTO.3RBW = 0
+D3T...BW = 122.5706897
+EAL...BW = 10
+EHC...BW = 20
+ELC...BW = 25
+ELV...BW = 12
+EN4...BW = 15.57068966
+EP8...BW = 35
+ETO...BW = 5
+M3..3TBW = 122.5706897
+QPB73EBW = 15.05088823
+QVO73EBW = 35.5455
+QVO73PBW = 20.83701724
+QPB73RBW = 49.6741722
+QVO73RBW = 66.18817241
+WMO73EBW = 3214.889184
+WRO73EBW = 3597.519648
+WMO73PBW = 1770.361014
+WRO73PBW = 2009.742955
+WMO73RBW = 5651.99315
+WRO73RBW = 6262.646874
+*** ppl_lpsol -s -M -oobtained kb2.mps
+Optimum value: 0
+Optimum location:
+BAL.3EBW = 0
+BHC.3EBW = 0
+BLC.3EBW = 0
+BLV.3EBW = 0
+BN4.3EBW = 0
+BP8.3EBW = 0
+BTO.3EBW = 0
+BAL.3PBW = 0
+BHC.3PBW = 0
+BLC.3PBW = 0
+BLV.3PBW = 0
+BN4.3PBW = 0
+BP8.3PBW = 0
+BTO.3PBW = 0
+BAL.3RBW = 0
+BHC.3RBW = 0
+BLC.3RBW = 0
+BLV.3RBW = 0
+BN4.3RBW = 0
+BP8.3RBW = 0
+BTO.3RBW = 0
+D3T...BW = 0
+EAL...BW = 0
+EHC...BW = 0
+ELC...BW = 0
+ELV...BW = 0
+EN4...BW = 0
+EP8...BW = 0
+ETO...BW = 0
+M3..3TBW = 0
+QPB73EBW = 0
+QVO73EBW = 0
+QVO73PBW = 0
+QPB73RBW = 0
+QVO73RBW = 0
+WMO73EBW = 0
+WRO73EBW = 0
+WMO73PBW = 0
+WRO73PBW = 0
+WMO73RBW = 0
+WRO73RBW = 0
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -s -m -oobtained sc105.mps
+Optimum value: -52.20206121
+Optimum location:
+COL00001 = 0
+COL00002 = 10.84845409
+COL00003 = 52.20206121
+COL00004 = 52.20206121
+COL00005 = 52.20206121
+COL00006 = 0
+COL00007 = 10.84845409
+COL00008 = 52.20206121
+COL00009 = 0
+COL00010 = 10.84845409
+COL00011 = 52.20206121
+COL00012 = 0
+COL00013 = 12.35752655
+COL00014 = 57.42226733
+COL00015 = 57.42226733
+COL00016 = 109.6243285
+COL00017 = 0
+COL00018 = 23.20598064
+COL00019 = 109.6243285
+COL00020 = 0
+COL00021 = 23.20598064
+COL00022 = 109.6243285
+COL00023 = 0
+COL00024 = 14.22961977
+COL00025 = 63.16449407
+COL00026 = 63.16449407
+COL00027 = 172.7888226
+COL00028 = 0
+COL00029 = 37.43560041
+COL00030 = 172.7888226
+COL00031 = 0
+COL00032 = 37.43560041
+COL00033 = 172.7888226
+COL00034 = 0
+COL00035 = 16.6070926
+COL00036 = 69.48094347
+COL00037 = 69.48094347
+COL00038 = 242.2697661
+COL00039 = 0
+COL00040 = 54.042693
+COL00041 = 242.2697661
+COL00042 = 0
+COL00043 = 54.042693
+COL00044 = 242.2697661
+COL00045 = 0
+COL00046 = 19.69956814
+COL00047 = 76.42903782
+COL00048 = 76.42903782
+COL00049 = 318.6988039
+COL00050 = 0
+COL00051 = 73.74226114
+COL00052 = 318.6988039
+COL00053 = 0
+COL00054 = 73.74226114
+COL00055 = 318.6988039
+COL00056 = 0
+COL00057 = 23.81717437
+COL00058 = 84.0719416
+COL00059 = 84.0719416
+COL00060 = 402.7707455
+COL00061 = 0
+COL00062 = 97.55943551
+COL00063 = 402.7707455
+COL00064 = 0
+COL00065 = 97.55943551
+COL00066 = 402.7707455
+COL00067 = 17.9865343
+COL00068 = 20.42709879
+COL00069 = 92.47913576
+COL00070 = 92.47913576
+COL00071 = 495.2498813
+COL00072 = 17.9865343
+COL00073 = 117.9865343
+COL00074 = 495.2498813
+COL00075 = 17.9865343
+COL00076 = 117.9865343
+COL00077 = 495.2498813
+COL00078 = 21.79865343
+COL00079 = 21.79865343
+COL00080 = 101.7270493
+COL00081 = 101.7270493
+COL00082 = 596.9769306
+COL00083 = 39.78518773
+COL00084 = 139.7851877
+COL00085 = 596.9769306
+COL00086 = 39.78518773
+COL00087 = 139.7851877
+COL00088 = 596.9769306
+COL00089 = 23.97851877
+COL00090 = 23.97851877
+COL00091 = 111.8997543
+COL00092 = 111.8997543
+COL00093 = 708.8766849
+COL00094 = 63.7637065
+COL00095 = 163.7637065
+COL00096 = 708.8766849
+COL00097 = 63.7637065
+COL00098 = 163.7637065
+COL00099 = 708.8766849
+COL00100 = 26.37637065
+COL00101 = 26.37637065
+COL00102 = 123.0897297
+COL00103 = 123.0897297
+*** ppl_lpsol -s -M -oobtained sc105.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 50
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 50
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 50
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 100
+COL00019 = 0
+COL00020 = 0
+COL00021 = 27.27272727
+COL00022 = 0
+COL00023 = 0
+COL00024 = 63.63636364
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 163.6363636
+COL00030 = 0
+COL00031 = 0
+COL00032 = 163.6363636
+COL00033 = 0
+COL00034 = 45.45454545
+COL00035 = 109.0909091
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 45.45454545
+COL00040 = 272.7272727
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 100
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+COL00049 = 0
+COL00050 = 145.4545455
+COL00051 = 272.7272727
+COL00052 = 0
+COL00053 = 0
+COL00054 = 0
+COL00055 = 0
+COL00056 = 100
+COL00057 = 0
+COL00058 = 0
+COL00059 = 0
+COL00060 = 0
+COL00061 = 245.4545455
+COL00062 = 272.7272727
+COL00063 = 0
+COL00064 = 0
+COL00065 = 0
+COL00066 = 0
+COL00067 = 100
+COL00068 = 0
+COL00069 = 0
+COL00070 = 0
+COL00071 = 0
+COL00072 = 345.4545455
+COL00073 = 272.7272727
+COL00074 = 0
+COL00075 = 0
+COL00076 = 272.7272727
+COL00077 = 0
+COL00078 = 9.090909091
+COL00079 = 181.8181818
+COL00080 = 0
+COL00081 = 0
+COL00082 = 0
+COL00083 = 354.5454545
+COL00084 = 454.5454545
+COL00085 = 0
+COL00086 = 354.5454545
+COL00087 = 454.5454545
+COL00088 = 0
+COL00089 = 0
+COL00090 = 0
+COL00091 = 369.6969697
+COL00092 = 0
+COL00093 = 0
+COL00094 = 354.5454545
+COL00095 = 454.5454545
+COL00096 = 369.6969697
+COL00097 = 0
+COL00098 = 100
+COL00099 = 0
+COL00100 = 20
+COL00101 = 20
+COL00102 = 93.33333333
+COL00103 = 0
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+Optimum value: -64.57507706
+Optimum location:
+COL00001 = 0
+COL00002 = 16.56869221
+COL00003 = 64.57507706
+COL00004 = 64.57507706
+COL00005 = 64.57507706
+COL00006 = 0
+COL00007 = 16.56869221
+COL00008 = 64.57507706
+COL00009 = 0
+COL00010 = 16.56869221
+COL00011 = 64.57507706
+COL00012 = 0
+COL00013 = 20.00990753
+COL00014 = 71.03258476
+COL00015 = 71.03258476
+COL00016 = 135.6076618
+COL00017 = 0
+COL00018 = 36.57859974
+COL00019 = 135.6076618
+COL00020 = 0
+COL00021 = 36.57859974
+COL00022 = 135.6076618
+COL00023 = 14.17734478
+COL00024 = 17.59874505
+COL00025 = 78.13584324
+COL00026 = 78.13584324
+COL00027 = 213.7435051
+COL00028 = 14.17734478
+COL00029 = 54.17734478
+COL00030 = 213.7435051
+COL00031 = 14.17734478
+COL00032 = 54.17734478
+COL00033 = 213.7435051
+COL00034 = 18.41773448
+COL00035 = 18.41773448
+COL00036 = 85.94942756
+COL00037 = 85.94942756
+COL00038 = 299.6929326
+COL00039 = 32.59507926
+COL00040 = 72.59507926
+COL00041 = 299.6929326
+COL00042 = 32.59507926
+COL00043 = 72.59507926
+COL00044 = 299.6929326
+COL00045 = 20.25950793
+COL00046 = 20.25950793
+COL00047 = 94.54437032
+COL00048 = 94.54437032
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 20
+COL00002 = 55
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 20
+COL00007 = 55
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 70
+COL00013 = 30
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 90
+COL00018 = 85
+COL00019 = 0
+COL00020 = 0
+COL00021 = 85
+COL00022 = 0
+COL00023 = 41.66666667
+COL00024 = 86.66666667
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 131.6666667
+COL00029 = 171.6666667
+COL00030 = 0
+COL00031 = 131.6666667
+COL00032 = 171.6666667
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 201.1111111
+COL00037 = 0
+COL00038 = 0
+COL00039 = 131.6666667
+COL00040 = 171.6666667
+COL00041 = 201.1111111
+COL00042 = 0
+COL00043 = 40
+COL00044 = 0
+COL00045 = 17
+COL00046 = 17
+COL00047 = 79.33333333
+COL00048 = 0
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+Optimum value: -70
+Optimum location:
+COL00001 = 30
+COL00002 = 28
+COL00003 = 42
+COL00004 = 70
+COL00005 = 70
+COL00006 = 30
+COL00007 = 28
+COL00008 = 42
+COL00009 = 30
+COL00010 = 28
+COL00011 = 42
+COL00012 = 33
+COL00013 = 30.8
+COL00014 = 46.2
+COL00015 = 77
+COL00016 = 147
+COL00017 = 63
+COL00018 = 58.8
+COL00019 = 88.2
+COL00020 = 63
+COL00021 = 58.8
+COL00022 = 88.2
+COL00023 = 36.3
+COL00024 = 33.88
+COL00025 = 50.82
+COL00026 = 84.7
+COL00027 = 231.7
+COL00028 = 99.3
+COL00029 = 92.68
+COL00030 = 139.02
+COL00031 = 99.3
+COL00032 = 92.68
+COL00033 = 139.02
+COL00034 = 39.93
+COL00035 = 37.268
+COL00036 = 55.902
+COL00037 = 93.17
+COL00038 = 324.87
+COL00039 = 139.23
+COL00040 = 129.948
+COL00041 = 194.922
+COL00042 = 139.23
+COL00043 = 129.948
+COL00044 = 194.922
+COL00045 = 43.923
+COL00046 = 40.9948
+COL00047 = 61.4922
+COL00048 = 102.487
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 100
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 100
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 100
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 200
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 100
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 200
+COL00041 = 100
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/ppl_lpsol.c b/demos/ppl_lpsol/ppl_lpsol.c
new file mode 100644
index 0000000..cc55b39
--- /dev/null
+++ b/demos/ppl_lpsol/ppl_lpsol.c
@@ -0,0 +1,895 @@
+/* Solve linear programming problems by either vertex/point enumeration
+   or the primal simplex algorithm. Just a toy to test the C interface
+   of the library.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "config.h"
+#include "ppl_c.h"
+#include <gmp.h>
+#include <glpk.h>
+#include <stdio.h>
+#include <assert.h>
+#include <time.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+
+#ifdef HAVE_GETOPT_H
+# include <getopt.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+/* Include this for `getopt()': especially important if we do not have
+   <getopt.h>.  */
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef HAVE_SYS_RESOURCE_H
+/* This should be included after <time.h> and <sys/time.h> so as to make
+   sure we have the definitions for, e.g., `ru_utime'.  */
+# include <sys/resource.h>
+#endif
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 8
+# error "PPL version 0.8 or following is required"
+#endif
+
+static const char* ppl_source_version = PPL_VERSION;
+
+#ifdef __GNUC__
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#else
+# define ATTRIBUTE_UNUSED
+#endif
+
+#ifdef HAVE_GETOPT_H
+static struct option long_options[] = {
+  {"check",          no_argument,       0, 'c'},
+  {"help",           no_argument,       0, 'h'},
+  {"version",        no_argument,       0, 'V'},
+  {"min",            no_argument,       0, 'm'},
+  {"max",            no_argument,       0, 'M'},
+  {"max-cpu",        required_argument, 0, 'C'},
+  {"max-memory",     required_argument, 0, 'R'},
+  {"output",         required_argument, 0, 'o'},
+  {"enumerate",      no_argument,       0, 'e'},
+  {"simplex",        no_argument,       0, 's'},
+  {"timings",        no_argument,       0, 't'},
+  {"verbose",        no_argument,       0, 'v'},
+  {0, 0, 0, 0}
+};
+#endif
+
+static const char* usage_string
+= "Usage: %s [OPTION]... [FILE]...\n\n"
+"  -c, --check             checks plausibility of the optimum value found\n"
+"  -m, --min               minimizes the objective function\n"
+"  -M, --max               maximizes the objective function (default)\n"
+"  -CSECS, --max-cpu=SECS  limits CPU usage to SECS seconds\n"
+"  -RMB, --max-memory=MB   limits memory usage to MB megabytes\n"
+"  -h, --help              prints this help text to stdout\n"
+"  -V, --version           prints version information to stdout\n"
+"  -oPATH, --output=PATH   appends output to PATH\n"
+"  -e, --enumerate         use the (expensive!) enumeration method\n"
+"  -s, --simplex           use the simplex method\n"
+"  -t, --timings           prints timings to stderr\n"
+"  -v, --verbose           outputs also the constraints "
+"and objective function\n"
+#ifndef HAVE_GETOPT_H
+"\n"
+"NOTE: this version does not support long options.\n"
+#endif
+;
+
+#define OPTION_LETTERS "bcemMC:R:hVo:stv"
+
+static const char* program_name = 0;
+
+static unsigned long max_seconds_of_cpu_time = 0;
+static unsigned long max_bytes_of_virtual_memory = 0;
+static const char* output_argument = 0;
+FILE* output_file = NULL;
+static int check_optimum = 0;
+static int use_simplex = 0;
+static int print_timings = 0;
+static int verbose = 0;
+static int maximize = 1;
+
+static void
+my_exit(int status) {
+  (void) ppl_finalize();
+  exit(status);
+}
+
+static void
+fatal(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: ", program_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+  my_exit(1);
+}
+
+static const char*
+get_ppl_version() {
+  const char* p;
+  (void) ppl_version(&p);
+  return p;
+}
+
+static const char*
+get_ppl_banner() {
+  const char* p;
+  (void) ppl_banner(&p);
+  return p;
+}
+
+static void
+process_options(int argc, char* argv[]) {
+#ifdef HAVE_GETOPT_H
+  int option_index;
+#endif
+  int enumerate_required = 0;
+  int simplex_required = 0;
+  int c;
+  char* endptr;
+  long l;
+
+  while (1) {
+#ifdef HAVE_GETOPT_H
+    option_index = 0;
+    c = getopt_long(argc, argv, OPTION_LETTERS, long_options, &option_index);
+#else
+    c = getopt(argc, argv, OPTION_LETTERS);
+#endif
+    if (c == EOF)
+      break;
+
+    switch (c) {
+    case 0:
+      break;
+
+    case 'c':
+      check_optimum = 1;
+      break;
+
+    case 'm':
+      maximize = 0;
+      break;
+
+    case 'M':
+      maximize = 1;
+      break;
+
+    case '?':
+    case 'h':
+      fprintf(stdout, usage_string, argv[0]);
+      my_exit(0);
+      break;
+
+    case 'V':
+      fprintf(stdout, "%s\n", PPL_VERSION);
+      exit(0);
+      break;
+
+    case 'C':
+      l = strtol(optarg, &endptr, 10);
+      if (*endptr || l < 0)
+	fatal("a non-negative integer must follow `-C'");
+      else
+	max_seconds_of_cpu_time = l;
+      break;
+
+    case 'R':
+      l = strtol(optarg, &endptr, 10);
+      if (*endptr || l < 0)
+	fatal("a non-negative integer must follow `-R'");
+      else
+	max_bytes_of_virtual_memory = l*1024*1024;
+      break;
+
+    case 'o':
+      output_argument = optarg;
+      break;
+
+    case 'e':
+      enumerate_required = 1;
+      break;
+
+    case 's':
+      simplex_required = 1;
+      break;
+
+    case 't':
+      print_timings = 1;
+      break;
+
+    case 'v':
+      verbose = 1;
+      break;
+
+    default:
+      abort();
+    }
+  }
+
+  if (enumerate_required && simplex_required)
+    fatal("--enumerate and --simplex are incompatible options");
+
+  if (enumerate_required)
+    use_simplex = 0;
+  else if (simplex_required)
+    use_simplex = 1;
+
+  if (optind >= argc) {
+    if (verbose)
+      fprintf(stderr,
+	      "Parma Polyhedra Library version:\n%s\n\n"
+	      "Parma Polyhedra Library banner:\n%s",
+	      get_ppl_version(),
+	      get_ppl_banner());
+    else
+      fatal("no input files");
+  }
+
+  if (argc - optind > 1)
+    /* We have multiple input files. */
+    fatal("only one input file is accepted");
+
+  if (output_argument) {
+    output_file = fopen(output_argument, "a");
+    if (output_file == NULL)
+      fatal("cannot open output file `%s'", output_argument);
+  }
+  else
+    output_file = stdout;
+}
+
+/* To save the time when start_clock is called. */
+static struct timeval saved_ru_utime;
+
+static void
+start_clock() {
+  struct rusage rsg;
+  if (getrusage(RUSAGE_SELF, &rsg) != 0)
+    fatal("getrusage failed: %s", strerror(errno));
+  else
+    saved_ru_utime = rsg.ru_utime;
+}
+
+static void
+print_clock(FILE* f) {
+  struct rusage rsg;
+  if (getrusage(RUSAGE_SELF, &rsg) != 0)
+    fatal("getrusage failed: %s", strerror(errno));
+  else {
+    time_t current_secs = rsg.ru_utime.tv_sec;
+    time_t current_usecs = rsg.ru_utime.tv_usec;
+    time_t saved_secs = saved_ru_utime.tv_sec;
+    time_t saved_usecs = saved_ru_utime.tv_usec;
+    int secs;
+    int hsecs;
+    if (current_usecs < saved_usecs) {
+      hsecs = (((1000000 + current_usecs) - saved_usecs) + 5000) / 10000;
+      secs = (current_secs - saved_secs) -1;
+    }
+    else {
+      hsecs = ((current_usecs - saved_usecs) + 5000) / 10000;
+      secs = current_secs - saved_secs;
+    }
+    assert(hsecs >= 0 && hsecs < 100 && secs >= 0);
+    fprintf(f, "%d.%.2d", secs, hsecs);
+  }
+}
+
+void
+set_alarm_on_cpu_time(unsigned seconds, void (*handler)(int)) {
+  sigset_t mask;
+  struct sigaction s;
+  struct rlimit t;
+
+  sigemptyset(&mask);
+
+  s.sa_handler = handler;
+  s.sa_mask = mask;
+#if defined(SA_ONESHOT)
+  s.sa_flags = SA_ONESHOT;
+#elif defined(SA_RESETHAND)
+  s.sa_flags = SA_RESETHAND;
+#else
+  #error "Either SA_ONESHOT or SA_RESETHAND must be defined."
+#endif
+
+  if (sigaction(SIGXCPU, &s, 0) != 0)
+    fatal("sigaction failed: %s", strerror(errno));
+
+  if (getrlimit(RLIMIT_CPU, &t) != 0)
+    fatal("getrlimit failed: %s", strerror(errno));
+
+  if (seconds < t.rlim_cur) {
+    t.rlim_cur = seconds;
+    if (setrlimit(RLIMIT_CPU, &t) != 0)
+      fatal("setrlimit failed: %s", strerror(errno));
+  }
+}
+
+#if HAVE_DECL_RLIMIT_AS
+void
+limit_virtual_memory(unsigned bytes) {
+  struct rlimit t;
+
+  if (getrlimit(RLIMIT_AS, &t) != 0)
+    fatal("getrlimit failed: %s", strerror(errno));
+
+  if (bytes < t.rlim_cur) {
+    t.rlim_cur = bytes;
+    if (setrlimit(RLIMIT_AS, &t) != 0)
+      fatal("setrlimit failed: %s", strerror(errno));
+  }
+}
+#else
+void
+limit_virtual_memory(unsigned bytes ATTRIBUTE_UNUSED) {
+}
+#endif /* !HAVE_DECL_RLIMIT_AS */
+
+static void
+my_timeout(int dummy ATTRIBUTE_UNUSED) {
+  fprintf(stderr, "TIMEOUT\n");
+  if (output_argument)
+    fprintf(output_file, "TIMEOUT\n");
+  my_exit(0);
+}
+
+static mpz_t tmp_z;
+static mpq_t tmp1_q;
+static mpq_t tmp2_q;
+static ppl_Coefficient_t ppl_coeff;
+static LPX* lp;
+
+static const char*
+variable_output_function(ppl_dimension_type var) {
+  const char* name = lpx_get_col_name(lp, var+1);
+  if (name != NULL)
+    return name;
+  else
+    return 0;
+}
+
+static void
+add_constraints(ppl_Linear_Expression_t ppl_le,
+		int type, mpq_t rational_lb, mpq_t rational_ub, mpz_t den_lcm,
+		ppl_Constraint_System_t ppl_cs) {
+  ppl_Constraint_t ppl_c;
+  ppl_Linear_Expression_t ppl_le2;
+  switch (type) {
+  case LPX_FR:
+    break;
+
+  case LPX_LO:
+    mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb));
+    mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb));
+    mpz_neg(tmp_z, tmp_z);
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+    ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
+    ppl_new_Constraint(&ppl_c, ppl_le,
+		       PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL);
+    if (verbose) {
+      ppl_io_fprint_Constraint(output_file, ppl_c);
+      fprintf(output_file, "\n");
+    }
+    ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+    ppl_delete_Constraint(ppl_c);
+    break;
+
+  case LPX_UP:
+    mpz_mul(tmp_z, den_lcm, mpq_numref(rational_ub));
+    mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_ub));
+    mpz_neg(tmp_z, tmp_z);
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+    ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
+    ppl_new_Constraint(&ppl_c, ppl_le,
+		       PPL_CONSTRAINT_TYPE_LESS_THAN_OR_EQUAL);
+    if (verbose) {
+      ppl_io_fprint_Constraint(output_file, ppl_c);
+      fprintf(output_file, "\n");
+    }
+    ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+    ppl_delete_Constraint(ppl_c);
+    break;
+
+  case LPX_DB:
+    ppl_new_Linear_Expression_from_Linear_Expression(&ppl_le2, ppl_le);
+
+    mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb));
+    mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb));
+    mpz_neg(tmp_z, tmp_z);
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+    ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
+    ppl_new_Constraint(&ppl_c, ppl_le,
+		       PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL);
+    if (verbose) {
+      ppl_io_fprint_Constraint(output_file, ppl_c);
+      fprintf(output_file, "\n");
+    }
+    ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+    ppl_delete_Constraint(ppl_c);
+
+    mpz_mul(tmp_z, den_lcm, mpq_numref(rational_ub));
+    mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_ub));
+    mpz_neg(tmp_z, tmp_z);
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+    ppl_Linear_Expression_add_to_inhomogeneous(ppl_le2, ppl_coeff);
+    ppl_new_Constraint(&ppl_c, ppl_le2,
+		       PPL_CONSTRAINT_TYPE_LESS_THAN_OR_EQUAL);
+    ppl_delete_Linear_Expression(ppl_le2);
+    if (verbose) {
+      ppl_io_fprint_Constraint(output_file, ppl_c);
+      fprintf(output_file, "\n");
+    }
+    ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+    ppl_delete_Constraint(ppl_c);
+    break;
+
+  case LPX_FX:
+    mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb));
+    mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb));
+    mpz_neg(tmp_z, tmp_z);
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+    ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
+    ppl_new_Constraint(&ppl_c, ppl_le,
+		       PPL_CONSTRAINT_TYPE_EQUAL);
+    if (verbose) {
+      ppl_io_fprint_Constraint(output_file, ppl_c);
+      fprintf(output_file, "\n");
+    }
+    ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+    ppl_delete_Constraint(ppl_c);
+    break;
+
+ default:
+    fatal("internal error");
+    break;
+  }
+}
+
+static int
+solve_with_generators(ppl_const_Constraint_System_t ppl_cs,
+		      ppl_const_Linear_Expression_t ppl_objective_le,
+		      ppl_Coefficient_t optimum_n,
+		      ppl_Coefficient_t optimum_d,
+		      ppl_Generator_t point) {
+  ppl_Polyhedron_t ppl_ph;
+  int empty;
+  int unbounded;
+  int included;
+  int ok;
+
+  /* Create the polyhedron. */
+  ppl_new_C_Polyhedron_from_Constraint_System(&ppl_ph, ppl_cs);
+
+  if (print_timings) {
+    fprintf(stderr, "Time to create a PPL polyhedron: ");
+    print_clock(stderr);
+    fprintf(stderr, " s\n");
+    start_clock();
+  }
+
+  empty = ppl_Polyhedron_is_empty(ppl_ph);
+
+  if (print_timings) {
+    fprintf(stderr, "Time to check for emptiness: ");
+    print_clock(stderr);
+    fprintf(stderr, " s\n");
+    start_clock();
+  }
+
+  if (empty) {
+    fprintf(output_file, "Unfeasible problem.\n");
+    /* FIXME: check!!! */
+    return 0;
+  }
+
+  /* Check whether the problem is unbounded. */
+  unbounded = maximize
+    ? !ppl_Polyhedron_bounds_from_above(ppl_ph, ppl_objective_le)
+    : !ppl_Polyhedron_bounds_from_below(ppl_ph, ppl_objective_le);
+
+  if (print_timings) {
+    fprintf(stderr, "Time to check for unboundedness: ");
+    print_clock(stderr);
+    fprintf(stderr, " s\n");
+    start_clock();
+  }
+
+  if (unbounded) {
+    fprintf(output_file, "Unbounded problem.\n");
+    /* FIXME: check!!! */
+    return 0;
+  }
+
+  ok = maximize
+    ? ppl_Polyhedron_maximize(ppl_ph, ppl_objective_le,
+			      optimum_n, optimum_d, &included,
+			      point)
+    : ppl_Polyhedron_minimize(ppl_ph, ppl_objective_le,
+			      optimum_n, optimum_d, &included,
+			      point);
+
+  if (!ok)
+    fatal("internal error");
+
+  ppl_delete_Polyhedron(ppl_ph);
+
+  if (print_timings) {
+    fprintf(stderr, "Time to find the optimum: ");
+    print_clock(stderr);
+    fprintf(stderr, " s\n");
+    start_clock();
+  }
+
+  if (!included)
+    fatal("internal error");
+
+  return 1;
+}
+
+static int
+solve_with_simplex(ppl_const_Constraint_System_t cs,
+		   ppl_const_Linear_Expression_t objective,
+		   ppl_Coefficient_t optimum_n,
+		   ppl_Coefficient_t optimum_d,
+		   ppl_Generator_t point) {
+  int status;
+
+  ppl_LP_Problem_t lp;
+  int mode = maximize
+    ? PPL_LP_PROBLEM_MAXIMIZATION : PPL_LP_PROBLEM_MINIMIZATION;
+  ppl_new_LP_Problem(&lp, cs, objective, mode);
+  status = ppl_LP_Problem_solve(lp);
+
+  if (print_timings) {
+    fprintf(stderr, "Time to solve the LP problem: ");
+    print_clock(stderr);
+    fprintf(stderr, " s\n");
+    start_clock();
+  }
+
+  if (status == PPL_LP_PROBLEM_STATUS_UNFEASIBLE) {
+    fprintf(output_file, "Unfeasible problem.\n");
+    /* FIXME: check!!! */
+    return 0;
+  }
+  else if (status == PPL_LP_PROBLEM_STATUS_UNBOUNDED) {
+    fprintf(output_file, "Unbounded problem.\n");
+    /* FIXME: check!!! */
+    return 0;
+  }
+  else if (status == PPL_LP_PROBLEM_STATUS_OPTIMIZED) {
+    ppl_LP_Problem_optimal_value(lp, optimum_n, optimum_d);
+    ppl_const_Generator_t g;
+    ppl_LP_Problem_optimizing_point(lp, &g);
+    ppl_assign_Generator_from_Generator(point, g);
+    return 1;
+  }
+  else
+    fatal("internal error");
+}
+
+static void
+check_feasibility(ppl_const_Constraint_System_t cs,
+		  ppl_const_Generator_t g) {
+  ppl_Polyhedron_t ph;
+  unsigned int relation;
+  ppl_new_C_Polyhedron_from_Constraint_System(&ph, cs);
+  relation = ppl_Polyhedron_relation_with_Generator(ph, g);
+  ppl_delete_Polyhedron(ph);
+  if (relation != PPL_POLY_GEN_RELATION_SUBSUMES)
+    fprintf(stderr, "The computed optimum is NOT a feasible point!\n");
+}
+
+static void
+solve(char* file_name) {
+  ppl_Constraint_System_t ppl_cs;
+  ppl_Generator_t optimum_value;
+  ppl_Linear_Expression_t ppl_le;
+  int dimension, row, num_rows, column, nz, i, type;
+  int* coefficient_index;
+  double lb, ub;
+  double* coefficient_value;
+  mpq_t rational_lb, rational_ub;
+  mpq_t* rational_coefficient;
+  mpq_t* objective;
+  ppl_Linear_Expression_t ppl_objective_le;
+  ppl_Coefficient_t optimum_n;
+  ppl_Coefficient_t optimum_d;
+  mpq_t optimum;
+  mpz_t den_lcm;
+  int optimum_found;
+
+  if (print_timings)
+    start_clock();
+
+  lp = lpx_read_mps(file_name);
+  if (lp == NULL)
+    fatal("cannot read MPS file `%s'", file_name);
+
+  if (print_timings) {
+    fprintf(stderr, "Time to read the input file: ");
+    print_clock(stderr);
+    fprintf(stderr, " s\n");
+    start_clock();
+  }
+
+  dimension = lpx_get_num_cols(lp);
+
+  coefficient_index = (int*) malloc((dimension+1)*sizeof(int));
+  coefficient_value = (double*) malloc((dimension+1)*sizeof(double));
+  rational_coefficient = (mpq_t*) malloc((dimension+1)*sizeof(mpq_t));
+
+
+  ppl_new_Constraint_System(&ppl_cs);
+
+  mpq_init(rational_lb);
+  mpq_init(rational_ub);
+  for (i = 1; i <= dimension; ++i)
+    mpq_init(rational_coefficient[i]);
+
+  mpz_init(den_lcm);
+
+  if (verbose)
+    fprintf(output_file, "Constraints:\n");
+
+  /* Set up the row (ordinary) constraints. */
+  num_rows = lpx_get_num_rows(lp);
+  for (row = 1; row <= num_rows; ++row) {
+    /* Initialize the least common multiple computation. */
+    mpz_set_si(den_lcm, 1);
+    /* Set `nz' to the number of non-zero coefficients. */
+    nz = lpx_get_mat_row(lp, row, coefficient_index, coefficient_value);
+    for (i = 1; i <= nz; ++i) {
+      mpq_set_d(rational_coefficient[i], coefficient_value[i]);
+      /* Update den_lcm. */
+      mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_coefficient[i]));
+    }
+    lpx_get_row_bnds(lp, row, &type, &lb, &ub);
+    mpq_set_d(rational_lb, lb);
+    mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_lb));
+    mpq_set_d(rational_ub, ub);
+    mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_ub));
+
+    ppl_new_Linear_Expression_with_dimension(&ppl_le, dimension);
+
+    for (i = 1; i <= nz; ++i) {
+      mpz_mul(tmp_z, den_lcm, mpq_numref(rational_coefficient[i]));
+      mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_coefficient[i]));
+      ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+      ppl_Linear_Expression_add_to_coefficient(ppl_le, coefficient_index[i]-1,
+					       ppl_coeff);
+    }
+
+    add_constraints(ppl_le, type, rational_lb, rational_ub, den_lcm, ppl_cs);
+
+    ppl_delete_Linear_Expression(ppl_le);
+  }
+
+  free(coefficient_value);
+  for (i = 1; i <= dimension; ++i)
+    mpq_clear(rational_coefficient[i]);
+  free(rational_coefficient);
+  free(coefficient_index);
+
+  /*
+    FIXME: here we could build the polyhedron and minimize it before
+    adding the variable bounds.
+  */
+
+  /* Set up the columns constraints, i.e., variable bounds. */
+  for (column = 1; column <= dimension; ++column) {
+
+    lpx_get_col_bnds(lp, column, &type, &lb, &ub);
+
+    mpq_set_d(rational_lb, lb);
+    mpq_set_d(rational_ub, ub);
+
+    /* Initialize the least common multiple computation. */
+    mpz_set_si(den_lcm, 1);
+    mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_lb));
+    mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_ub));
+
+    ppl_new_Linear_Expression_with_dimension(&ppl_le, dimension);
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, den_lcm);
+    ppl_Linear_Expression_add_to_coefficient(ppl_le, column-1, ppl_coeff);
+
+    add_constraints(ppl_le, type, rational_lb, rational_ub, den_lcm, ppl_cs);
+
+    ppl_delete_Linear_Expression(ppl_le);
+  }
+
+  mpq_clear(rational_ub);
+  mpq_clear(rational_lb);
+
+  /* Deal with the objective function. */
+  objective = (mpq_t*) malloc((dimension+1)*sizeof(mpq_t));
+
+  /* Initialize the least common multiple computation. */
+  mpz_set_si(den_lcm, 1);
+
+  mpq_init(objective[0]);
+  mpq_set_d(objective[0], lpx_get_obj_coef(lp, 0));
+  for (i = 1; i <= dimension; ++i) {
+    mpq_init(objective[i]);
+    mpq_set_d(objective[i], lpx_get_obj_coef(lp, i));
+    /* Update den_lcm. */
+    mpz_lcm(den_lcm, den_lcm, mpq_denref(objective[i]));
+  }
+
+  /* Set the ppl_objective_le to be the objective function. */
+  ppl_new_Linear_Expression_with_dimension(&ppl_objective_le, dimension);
+  /* The inhomogeneous term is completely useless for our purpose. */
+  for (i = 1; i <= dimension; ++i) {
+    mpz_mul(tmp_z, den_lcm, mpq_numref(objective[i]));
+    mpz_divexact(tmp_z, tmp_z, mpq_denref(objective[i]));
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+    ppl_Linear_Expression_add_to_coefficient(ppl_objective_le, i-1, ppl_coeff);
+  }
+
+  if (verbose) {
+    fprintf(output_file, "Objective function:\n");
+    ppl_io_fprint_Linear_Expression(output_file, ppl_objective_le);
+  }
+
+  for (i = 0; i <= dimension; ++i)
+    mpq_clear(objective[i]);
+  free(objective);
+
+  if (verbose) {
+    if (mpz_cmp_si(den_lcm, 1) != 0) {
+      fprintf(output_file, ")/");
+      mpz_out_str(output_file, 10, den_lcm);
+    }
+    fprintf(output_file, "\n%s\n",
+	    (maximize ? "Maximizing." : "Minimizing."));
+  }
+
+  ppl_new_Coefficient(&optimum_n);
+  ppl_new_Coefficient(&optimum_d);
+  ppl_new_Generator_zero_dim_point(&optimum_value);
+
+  optimum_found = use_simplex
+    ? solve_with_simplex(ppl_cs,
+			 ppl_objective_le,
+			 optimum_n,
+			 optimum_d,
+			 optimum_value)
+    : solve_with_generators(ppl_cs,
+			    ppl_objective_le,
+			    optimum_n,
+			    optimum_d,
+			    optimum_value);
+
+  if (optimum_found) {
+    mpq_init(optimum);
+    ppl_Coefficient_to_mpz_t(optimum_n, tmp_z);
+    mpq_set_num(optimum, tmp_z);
+    ppl_Coefficient_to_mpz_t(optimum_d, tmp_z);
+    mpz_mul(tmp_z, tmp_z, den_lcm);
+    mpq_set_den(optimum, tmp_z);
+    fprintf(output_file, "Optimum value: %.10g\n", mpq_get_d(optimum));
+    mpq_clear(optimum);
+    fprintf(output_file, "Optimum location:\n");
+    ppl_Generator_divisor(optimum_value, ppl_coeff);
+    ppl_Coefficient_to_mpz_t(ppl_coeff, tmp_z);
+    for (i = 0; i < dimension; ++i) {
+      mpz_set(mpq_denref(tmp1_q), tmp_z);
+      ppl_Generator_coefficient(optimum_value, i, ppl_coeff);
+      ppl_Coefficient_to_mpz_t(ppl_coeff, mpq_numref(tmp1_q));
+      ppl_io_fprint_variable(output_file, i);
+      fprintf(output_file, " = %.10g\n", mpq_get_d(tmp1_q));
+    }
+    if (check_optimum) {
+      // TODO: currently checking only feasibility.
+      // Find a way to also check for optimality.
+      check_feasibility(ppl_cs, optimum_value);
+    }
+  }
+
+  ppl_delete_Constraint_System(ppl_cs);
+  ppl_delete_Linear_Expression(ppl_objective_le);
+  ppl_delete_Coefficient(optimum_d);
+  ppl_delete_Coefficient(optimum_n);
+  ppl_delete_Generator(optimum_value);
+
+  lpx_delete_prob(lp);
+}
+
+static void
+error_handler(enum ppl_enum_error_code code,
+	      const char* description) {
+  fatal("PPL error code %d\n%s", code, description);
+}
+
+#if !CXX_SUPPORTS_ATTRIBUTE_WEAK
+void
+set_GMP_memory_allocation_functions(void) {
+}
+#endif
+
+int
+main(int argc, char* argv[]) {
+  program_name = argv[0];
+  if (ppl_initialize() < 0)
+    fatal("cannot initialize the Parma Polyhedra Library");
+
+  if (ppl_set_error_handler(error_handler) < 0)
+    fatal("cannot install the custom error handler");
+
+  if (strcmp(ppl_source_version, get_ppl_version()) != 0)
+    fatal("was compiled with PPL version %s, but linked with version %s",
+	  ppl_source_version, get_ppl_version());
+
+  if (ppl_io_set_variable_output_function(variable_output_function) < 0)
+    fatal("cannot install the custom variable output function");
+
+  /* Process command line options. */
+  process_options(argc, argv);
+
+  /* Initialize globals. */
+  mpz_init(tmp_z);
+  mpq_init(tmp1_q);
+  mpq_init(tmp2_q);
+  ppl_new_Coefficient(&ppl_coeff);
+
+  if (max_seconds_of_cpu_time > 0)
+    set_alarm_on_cpu_time(max_seconds_of_cpu_time, my_timeout);
+
+  if (max_bytes_of_virtual_memory > 0)
+    limit_virtual_memory(max_bytes_of_virtual_memory);
+
+  while (optind < argc)
+    solve(argv[optind++]);
+
+  /* Finalize globals. */
+  ppl_delete_Coefficient(ppl_coeff);
+  mpq_clear(tmp2_q);
+  mpq_clear(tmp1_q);
+  mpz_clear(tmp_z);
+
+  /* Close output file, if any. */
+  if (output_argument)
+    fclose(output_file);
+
+  my_exit(0);
+
+  return 0;
+}
diff --git a/depcomp b/depcomp
new file mode 100755
index 0000000..011ebd9
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,530 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2005-07-09.11
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva at dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputing dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> $depfile
+    echo >> $depfile
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> $depfile
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+  tmpdepfile="$stripped.u"
+  if test "$libtool" = yes; then
+    "$@" -Wc,-M
+  else
+    "$@" -M
+  fi
+  stat=$?
+
+  if test -f "$tmpdepfile"; then :
+  else
+    stripped=`echo "$stripped" | sed 's,^.*/,,'`
+    tmpdepfile="$stripped.u"
+  fi
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+
+  if test -f "$tmpdepfile"; then
+    outname="$stripped.o"
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mecanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no
+  for arg in "$@"; do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix="`echo $object | sed 's/^.*\././'`"
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  "$@" || exit $?
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+	set fnord "$@"
+	shift
+	shift
+	;;
+    *)
+	set fnord "$@" "$arg"
+	shift
+	shift
+	;;
+    esac
+  done
+  "$@" -E |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..bae44e2
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,284 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+abs_srcdir = @abs_srcdir@
+
+# All the documentation in docdir.
+docdir = @docdir@
+htmldir = $(docdir)
+pdfdir = $(docdir)
+psdir = $(docdir)
+txtdir = $(docdir)
+
+DOXYGEN = doxygen
+
+PDF_LICENSES = \
+gpl.pdf \
+fdl.pdf
+
+PS_LICENSES = \
+gpl.ps.gz \
+fdl.ps.gz
+
+TXT_LICENSES = \
+gpl.txt \
+fdl.txt
+
+LICENSES = \
+$(PDF_LICENSES) \
+$(TXT_LICENSES) \
+$(PS_LICENSES)
+
+HTML_MANUALS = \
+ppl-user- at VERSION@-html.tar.gz \
+ppl-devref- at VERSION@-html.tar.gz
+
+PDF_MANUALS = \
+ppl-user- at VERSION@.pdf \
+ppl-devref- at VERSION@.pdf
+
+PS_MANUALS = \
+ppl-user- at VERSION@.ps.gz \
+ppl-devref- at VERSION@.ps.gz
+
+MANUALS = \
+$(HTML_MANUALS) \
+$(PDF_MANUALS) \
+$(PS_MANUALS)
+
+HTML_DIRS = \
+ppl-user- at VERSION@-html \
+ppl-devref- at VERSION@-html
+
+TEMP_HTML_DIRS = \
+user.html-dir \
+devref.html-dir
+
+DIST_HTML_DOCS = \
+ppl-user- at VERSION@-html.tar.gz
+
+DIST_PDF_DOCS = \
+$(PDF_LICENSES) \
+ppl-user- at VERSION@.pdf
+
+DIST_PS_DOCS = \
+$(PS_LICENSES) \
+ppl-user- at VERSION@.ps.gz
+
+DIST_TXT_DOCS = \
+$(TXT_LICENSES)
+
+# We distribute some preprocessed user's documentation.
+DIST_DOCS = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(DIST_TXT_DOCS)
+
+ALL_TARGETS = \
+$(HTML_DIRS) \
+$(PDF_LICENSES) \
+$(PS_LICENSES) \
+$(MANUALS)
+
+dist_man_MANS = \
+ppl-config.1 \
+ppl_lcdd.1 \
+ppl_lpsol.1
+
+# Do nothing by default.
+all:
+
+user: ppl-user- at VERSION@.pdf
+
+world: $(ALL_TARGETS)
+
+install-data-local: \
+install-html \
+install-pdf \
+install-ps \
+install-txt
+
+installdirs-local: \
+installdirs-html \
+installdirs-pdf \
+installdirs-ps \
+installdirs-txt
+
+uninstall-local: \
+uninstall-html \
+uninstall-pdf \
+uninstall-ps \
+uninstall-txt
+
+# Installation and uninstallation of HTML documentation.
+install-html:
+	for ball in $(DIST_HTML_DOCS); do \
+	  test -f $$ball || test -f $(srcdir)/$$ball || $(MAKE) $$ball; \
+	  dir=`basename $$ball .tar.gz`; \
+	  $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+	  gunzip -c `if test -f $$ball; then echo .; else echo $(srcdir); fi`/$$ball | tar xf - ; \
+	  for file in $$dir/*; do \
+	    $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/$$dir/`basename $$file`; \
+	  done; \
+	done
+
+installdirs-html:
+	for ball in $(DIST_HTML_DOCS); do \
+	  dir=`basename $$ball .tar.gz`; \
+	  $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+	done
+
+uninstall-html:
+	for ball in $(DIST_HTML_DOCS); do \
+	  dir=`basename $$ball .tar.gz`; \
+	  rm -rf $(DESTDIR)$(htmldir)/$$dir; \
+	done
+
+# Installation and uninstallation of PDF documentation.
+install-pdf:
+	$(mkinstalldirs) $(DESTDIR)$(pdfdir)
+	for file in $(DIST_PDF_DOCS); do \
+	  test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \
+	  $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(pdfdir)/$$file; \
+	done
+
+installdirs-pdf:
+	$(mkinstalldirs) $(DESTDIR)$(pdfdir)
+
+uninstall-pdf:
+	rm -f $(DESTDIR)$(pdfdir)/*.pdf
+
+# Installation and uninstallation of PostScript documentation.
+install-ps:
+	$(mkinstalldirs) $(DESTDIR)$(psdir)
+	for file in $(DIST_PS_DOCS); do \
+	  test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \
+	  $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(psdir)/$$file; \
+	done
+
+installdirs-ps:
+	$(mkinstalldirs) $(DESTDIR)$(psdir)
+
+uninstall-ps:
+	rm -f $(DESTDIR)$(psdir)/*.ps.gz
+
+# Installation and uninstallation of pure text documentation.
+install-txt:
+	$(mkinstalldirs) $(DESTDIR)$(txtdir)
+	for file in $(srcdir)/*.txt $(srcdir)/README.doc; do \
+	  $(INSTALL_DATA) $$file $(DESTDIR)$(txtdir)/`basename $$file`; \
+	done
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure ; do \
+	  $(INSTALL_DATA) $(srcdir)/../$$file $(DESTDIR)$(txtdir)/$$file; \
+	done
+
+installdirs-txt:
+	$(mkinstalldirs) $(DESTDIR)$(txtdir)
+
+uninstall-txt:
+	rm -f $(DESTDIR)$(txtdir)/*.txt $(DESTDIR)$(txtdir)/README.doc
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure ; do \
+	  rm -f $(DESTDIR)$(txtdir)/$$file; \
+	done
+
+PPL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc)
+
+DOX_FILES = \
+definitions.dox \
+../interfaces/Prolog/Prolog_interface.dox \
+gpl.dox \
+fdl.dox
+
+USER_STUFF = \
+$(DOX_FILES) \
+user.tex \
+ppl.sty \
+$(top_builddir)/src/ppl.hh \
+../interfaces/C/ppl_c.h
+
+DEVREF_STUFF = \
+$(DOX_FILES) \
+devref.tex \
+ppl.sty \
+$(PPL_SOURCE_FILES)
+
+LATEX_DIRS = \
+user.latex-dir \
+devref.latex-dir
+
+TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS)
+
+.SECONDARY: $(LATEX_DIRS)
+
+user.latex-dir: user.doxyconf-latex $(USER_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+devref.latex-dir: devref.doxyconf-latex $(DEVREF_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+ppl-user- at VERSION@.pdf: user.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-devref- at VERSION@.pdf: devref.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-user- at VERSION@-html: user.doxyconf-html $(DEVREF_STUFF)
+	rm -rf user.html-dir
+	$(TEX_ENV) $(DOXYGEN) $< && rm -rf $@ && mv -f user.html-dir $@
+
+ppl-devref- at VERSION@-html: devref.doxyconf-html $(DEVREF_STUFF)
+	rm -rf devref.html-dir
+	$(TEX_ENV) $(DOXYGEN) $< && rm -rf $@ && mv -f devref.html-dir $@
+
+%.tar: %
+	tar cf $@ $<
+
+%.gz: %
+	gzip --best --force $<
+
+%.pdf: %.tex
+	$(TEX_ENV) pdflatex $<
+
+%.ps:	%.pdf
+	pdftops $< $@
+
+EXTRA_DIST= \
+$(DIST_DOCS) \
+$(DOX_FILES) \
+user.doxyconf-latex \
+devref.doxyconf-latex \
+user.doxyconf-html \
+devref.doxyconf-html \
+user.tex \
+devref.tex \
+gpl.tex \
+fdl.tex \
+ppl.sty \
+README.doc
+
+mostlyclean-local:
+	rm -rf $(ALL_TARGETS) $(LATEX_DIRS) $(TEMP_HTML_DIRS) *.aux *.log
+
+CLEANFILES = $(DIST_HTML_DOCS) $(DIST_PDF_DOCS) $(DIST_PS_DOCS)
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..6eb3fae
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,766 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(srcdir)/devref.doxyconf-html.in \
+	$(srcdir)/devref.doxyconf-latex.in \
+	$(srcdir)/user.doxyconf-html.in \
+	$(srcdir)/user.doxyconf-latex.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = user.doxyconf-latex devref.doxyconf-latex \
+	user.doxyconf-html devref.doxyconf-html
+SOURCES =
+DIST_SOURCES =
+man1dir = $(mandir)/man1
+am__installdirs = "$(DESTDIR)$(man1dir)"
+NROFF = nroff
+MANS = $(dist_man_MANS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+
+# All the documentation in docdir.
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+abs_srcdir = @abs_srcdir@
+htmldir = $(docdir)
+pdfdir = $(docdir)
+psdir = $(docdir)
+txtdir = $(docdir)
+DOXYGEN = doxygen
+PDF_LICENSES = \
+gpl.pdf \
+fdl.pdf
+
+PS_LICENSES = \
+gpl.ps.gz \
+fdl.ps.gz
+
+TXT_LICENSES = \
+gpl.txt \
+fdl.txt
+
+LICENSES = \
+$(PDF_LICENSES) \
+$(TXT_LICENSES) \
+$(PS_LICENSES)
+
+HTML_MANUALS = \
+ppl-user- at VERSION@-html.tar.gz \
+ppl-devref- at VERSION@-html.tar.gz
+
+PDF_MANUALS = \
+ppl-user- at VERSION@.pdf \
+ppl-devref- at VERSION@.pdf
+
+PS_MANUALS = \
+ppl-user- at VERSION@.ps.gz \
+ppl-devref- at VERSION@.ps.gz
+
+MANUALS = \
+$(HTML_MANUALS) \
+$(PDF_MANUALS) \
+$(PS_MANUALS)
+
+HTML_DIRS = \
+ppl-user- at VERSION@-html \
+ppl-devref- at VERSION@-html
+
+TEMP_HTML_DIRS = \
+user.html-dir \
+devref.html-dir
+
+DIST_HTML_DOCS = \
+ppl-user- at VERSION@-html.tar.gz
+
+DIST_PDF_DOCS = \
+$(PDF_LICENSES) \
+ppl-user- at VERSION@.pdf
+
+DIST_PS_DOCS = \
+$(PS_LICENSES) \
+ppl-user- at VERSION@.ps.gz
+
+DIST_TXT_DOCS = \
+$(TXT_LICENSES)
+
+
+# We distribute some preprocessed user's documentation.
+DIST_DOCS = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(DIST_TXT_DOCS)
+
+ALL_TARGETS = \
+$(HTML_DIRS) \
+$(PDF_LICENSES) \
+$(PS_LICENSES) \
+$(MANUALS)
+
+dist_man_MANS = \
+ppl-config.1 \
+ppl_lcdd.1 \
+ppl_lpsol.1
+
+PPL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc)
+DOX_FILES = \
+definitions.dox \
+../interfaces/Prolog/Prolog_interface.dox \
+gpl.dox \
+fdl.dox
+
+USER_STUFF = \
+$(DOX_FILES) \
+user.tex \
+ppl.sty \
+$(top_builddir)/src/ppl.hh \
+../interfaces/C/ppl_c.h
+
+DEVREF_STUFF = \
+$(DOX_FILES) \
+devref.tex \
+ppl.sty \
+$(PPL_SOURCE_FILES)
+
+LATEX_DIRS = \
+user.latex-dir \
+devref.latex-dir
+
+TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS)
+EXTRA_DIST = \
+$(DIST_DOCS) \
+$(DOX_FILES) \
+user.doxyconf-latex \
+devref.doxyconf-latex \
+user.doxyconf-html \
+devref.doxyconf-html \
+user.tex \
+devref.tex \
+gpl.tex \
+fdl.tex \
+ppl.sty \
+README.doc
+
+CLEANFILES = $(DIST_HTML_DOCS) $(DIST_PDF_DOCS) $(DIST_PS_DOCS)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  doc/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+user.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/user.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user.doxyconf-html: $(top_builddir)/config.status $(srcdir)/user.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref.doxyconf-html: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+	@$(NORMAL_INSTALL)
+	test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+	@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.1*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+	  else file=$$i; fi; \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    1*) ;; \
+	    *) ext='1' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	  $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+	done
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+	for i in $$l2; do \
+	  case "$$i" in \
+	    *.1*) list="$$list $$i" ;; \
+	  esac; \
+	done; \
+	for i in $$list; do \
+	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+	  case "$$ext" in \
+	    1*) ;; \
+	    *) ext='1' ;; \
+	  esac; \
+	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
+	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+	  echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+	  rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	$(mkdir_p) $(distdir)/../interfaces/Prolog
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(MANS)
+installdirs: installdirs-local
+	for dir in "$(DESTDIR)$(man1dir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-man
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool \
+	mostlyclean-local
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-local uninstall-man
+
+uninstall-man: uninstall-man1
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-data-local install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-man1 install-strip installcheck installcheck-am \
+	installdirs installdirs-local maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool mostlyclean-local pdf pdf-am ps ps-am \
+	uninstall uninstall-am uninstall-info-am uninstall-local \
+	uninstall-man uninstall-man1
+
+
+# Do nothing by default.
+all:
+
+user: ppl-user- at VERSION@.pdf
+
+world: $(ALL_TARGETS)
+
+install-data-local: \
+install-html \
+install-pdf \
+install-ps \
+install-txt
+
+installdirs-local: \
+installdirs-html \
+installdirs-pdf \
+installdirs-ps \
+installdirs-txt
+
+uninstall-local: \
+uninstall-html \
+uninstall-pdf \
+uninstall-ps \
+uninstall-txt
+
+# Installation and uninstallation of HTML documentation.
+install-html:
+	for ball in $(DIST_HTML_DOCS); do \
+	  test -f $$ball || test -f $(srcdir)/$$ball || $(MAKE) $$ball; \
+	  dir=`basename $$ball .tar.gz`; \
+	  $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+	  gunzip -c `if test -f $$ball; then echo .; else echo $(srcdir); fi`/$$ball | tar xf - ; \
+	  for file in $$dir/*; do \
+	    $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/$$dir/`basename $$file`; \
+	  done; \
+	done
+
+installdirs-html:
+	for ball in $(DIST_HTML_DOCS); do \
+	  dir=`basename $$ball .tar.gz`; \
+	  $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+	done
+
+uninstall-html:
+	for ball in $(DIST_HTML_DOCS); do \
+	  dir=`basename $$ball .tar.gz`; \
+	  rm -rf $(DESTDIR)$(htmldir)/$$dir; \
+	done
+
+# Installation and uninstallation of PDF documentation.
+install-pdf:
+	$(mkinstalldirs) $(DESTDIR)$(pdfdir)
+	for file in $(DIST_PDF_DOCS); do \
+	  test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \
+	  $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(pdfdir)/$$file; \
+	done
+
+installdirs-pdf:
+	$(mkinstalldirs) $(DESTDIR)$(pdfdir)
+
+uninstall-pdf:
+	rm -f $(DESTDIR)$(pdfdir)/*.pdf
+
+# Installation and uninstallation of PostScript documentation.
+install-ps:
+	$(mkinstalldirs) $(DESTDIR)$(psdir)
+	for file in $(DIST_PS_DOCS); do \
+	  test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \
+	  $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(psdir)/$$file; \
+	done
+
+installdirs-ps:
+	$(mkinstalldirs) $(DESTDIR)$(psdir)
+
+uninstall-ps:
+	rm -f $(DESTDIR)$(psdir)/*.ps.gz
+
+# Installation and uninstallation of pure text documentation.
+install-txt:
+	$(mkinstalldirs) $(DESTDIR)$(txtdir)
+	for file in $(srcdir)/*.txt $(srcdir)/README.doc; do \
+	  $(INSTALL_DATA) $$file $(DESTDIR)$(txtdir)/`basename $$file`; \
+	done
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure ; do \
+	  $(INSTALL_DATA) $(srcdir)/../$$file $(DESTDIR)$(txtdir)/$$file; \
+	done
+
+installdirs-txt:
+	$(mkinstalldirs) $(DESTDIR)$(txtdir)
+
+uninstall-txt:
+	rm -f $(DESTDIR)$(txtdir)/*.txt $(DESTDIR)$(txtdir)/README.doc
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure ; do \
+	  rm -f $(DESTDIR)$(txtdir)/$$file; \
+	done
+
+.SECONDARY: $(LATEX_DIRS)
+
+user.latex-dir: user.doxyconf-latex $(USER_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+devref.latex-dir: devref.doxyconf-latex $(DEVREF_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) $<
+
+ppl-user- at VERSION@.pdf: user.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-devref- at VERSION@.pdf: devref.latex-dir
+	$(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-user- at VERSION@-html: user.doxyconf-html $(DEVREF_STUFF)
+	rm -rf user.html-dir
+	$(TEX_ENV) $(DOXYGEN) $< && rm -rf $@ && mv -f user.html-dir $@
+
+ppl-devref- at VERSION@-html: devref.doxyconf-html $(DEVREF_STUFF)
+	rm -rf devref.html-dir
+	$(TEX_ENV) $(DOXYGEN) $< && rm -rf $@ && mv -f devref.html-dir $@
+
+%.tar: %
+	tar cf $@ $<
+
+%.gz: %
+	gzip --best --force $<
+
+%.pdf: %.tex
+	$(TEX_ENV) pdflatex $<
+
+%.ps:	%.pdf
+	pdftops $< $@
+
+mostlyclean-local:
+	rm -rf $(ALL_TARGETS) $(LATEX_DIRS) $(TEMP_HTML_DIRS) *.aux *.log
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/README.doc b/doc/README.doc
new file mode 100644
index 0000000..7dcd420
--- /dev/null
+++ b/doc/README.doc
@@ -0,0 +1,139 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+See below for the copying conditions.
+
+How To Get (More) PPL Documentation
+===================================
+
+Do you have all the documentation you need? If you don't or if you are
+unsure, the following is for you.
+
+There are two versions of the Parma Polyhedra Library's documentation:
+
+  + a `user' manual, containing all and only the information needed by
+    people wishing to use the library;
+  + a `devref' (developer reference) manual, also containing details
+    about the library implementation.
+
+Each of these versions can be obtained in several formats:
+
+  + a PDF file suitable for browsing on the screen;
+  + a (gzipped) PostScript file suitable for printing;
+  + a (tarred and gzipped) collection of HTML pages suitable for browsing.
+
+
+The Documentation You May Already Have
+======================================
+
+First of all, you may already have some documentation and all you need
+to do is to find it.
+
+If you have downloaded a source (tar or zip) archive for PPL version
+X.Y.Z, you will find in the doc subdirectory the following set of user
+manuals:
+
+  ppl-user-X.Y.Z.pdf
+  ppl-user-X.Y.Z.ps.gz
+
+If you have installed a binary RPM package, then you have the same set
+of manuals. You can find them with the command `rpm -ql ppl' which
+will print, among other things, something like
+
+  /usr/share/doc/ppl-X.Y.Z
+  /usr/share/doc/ppl-X.Y.Z/README
+  /usr/share/doc/ppl-X.Y.Z/ppl-user-X.Y.Z.pdf
+  /usr/share/doc/ppl-X.Y.Z/ppl-user-X.Y.Z.ps.gz
+
+
+The Documentation You May Download
+==================================
+
+If you are using the latest released version of the library, you will
+find all the documentation in all formats at
+http://www.cs.unipr.it/ppl/Documentation/ .
+
+
+The Documentation You May Build Yourself
+========================================
+
+When all else fails (which is the case, for example, when you are
+using a CVS version [1]) then you may build the documentation by
+yourself. In order to do that, you should have a recent version of
+Doxygen [2] and, if you want to build the HTML documentation, a recent
+version of Graphviz [3].  When you have all the tools installed and
+running, you should follow the following procedure.
+
+First, you should determine which version of the library you are
+working with. The safest way is to go to the top source directory of
+the library and to locate the unique line in the file configure.ac
+containing the string "AC_INIT". This will look like
+
+  AC_INIT([the Parma Polyhedra Library], 0.6.3pre4, ppl-devel at cs.unipr.it, ppl)
+
+from which you determine that the version is 0.6.3pre4 (a.k.a. the 4th
+beta version before release 0.6.3).
+
+Then, if you have not yet done it, build the library itself (see the
+building instructions in the file INSTALL [4] in the top source
+directory.  The default build process, while essential in order to
+produce the documentation, will not generate it directly. For this
+reason you should go to the doc subdirectory of your build directory
+(i.e., the one where you compiled the library) and build all the
+documents you want by executing a command of the form
+
+    make doc1 doc2 ...
+
+Here, doc1, doc2 and so forth are the names of the documents to be built.
+Document names may be obtained from the following list by replacing
+X.Y.Z with the version number you have already determined, and by
+replacing KIND with either `user' or `devref':
+
+    ppl-KIND-X.Y.Z.pdf
+    ppl-KIND-X.Y.Z.ps.gz
+    ppl-KIND-X.Y.Z-html.tar.gz
+
+For example, the command
+
+    make ppl-user-0.6.3pre4.pdf ppl-devref-0.6.3pre4.pdf
+
+will build both kinds of manuals in a PDF format.  Alternatively, the
+command `make world' will build all the available documentation in all
+of the above formats.
+
+--------
+
+[1] http://www.cs.unipr.it/ppl/Download/cvs
+[2] http://www.doxygen.org/
+[3] http://www.research.att.com/sw/tools/graphviz/
+
+
+--------
+
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files called `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files are called `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ .
diff --git a/doc/definitions.dox b/doc/definitions.dox
new file mode 100644
index 0000000..00dd01e
--- /dev/null
+++ b/doc/definitions.dox
@@ -0,0 +1,3502 @@
+//  Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+//
+//  This document describes the Parma Polyhedra Library (PPL).
+//
+//  Permission is granted to copy, distribute and/or modify this document
+//  under the terms of the GNU Free Documentation License, Version 1.1 or
+//  any later version published by the Free Software Foundation; with no
+//  Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+//  Texts.
+//
+//  The PPL is free software; you can redistribute it and/or modify it
+//  under the terms of the GNU General Public License as published by the
+//  Free Software Foundation; either version 2
+//  of the License, or (at your option) any later version.
+//
+//  The PPL is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  For the most up-to-date information see the Parma Polyhedra Library
+//  site: http://www.cs.unipr.it/ppl/
+
+/*!
+  \defgroup PPL_CXX_interface C++ Language Interface
+  \brief
+  The core implementation of the Parma Polyhedra Library
+  is written in C++.
+
+  See Namespace, Hierarchical and Compound indexes
+  for additional information about each single data type.
+*/
+
+/*! \mainpage General Information on the PPL
+\section preamble The Main Features
+
+The Parma Polyhedra Library (PPL) is a modern C++ library for the
+manipulation of numerical information that can be represented by
+points in some \f$n\f$-dimensional vector space. For instance, one of
+the key domains the PPL supports is that of rational convex polyhedra
+(Section \ref convex_polys). Such domains
+are employed in several systems for the analysis and verification of
+hardware and software components, with applications spanning
+imperative, functional and logic programming languages, synchronous
+languages and synchronization protocols, real-time and hybrid systems.
+Even though the PPL library is not meant to target a particular
+problem, the design of its interface has been largely influenced by
+the needs of the above class of applications.  That is the reason why
+the library implements a few operators that are more or less specific
+to static analysis applications, while lacking some other operators
+that might be useful when working, e.g., in the field of computational
+geometry.
+
+The main features of the library are the following:
+- it is user friendly:
+  you write <CODE>x + 2*y + 5*z \<= 7</CODE> when you mean it;
+- it is fully dynamic:
+  available virtual memory is the only limitation to the
+  dimension of anything;
+- it provides full support for the manipulation of convex polyhedra
+  that are not topologically closed;
+- it is written in standard C++: meant to be portable;
+- it is exception-safe: never leaks resources or leaves invalid object
+  fragments around;
+- it is rather efficient: and we hope to make it even more so;
+- it is thoroughly documented:
+  perhaps not literate programming but close enough;
+- it has interfaces to other programming languages: including C and a number of
+  Prolog systems;
+- it is free software: distributed under the terms of the
+  GNU General Public License.
+
+In addition to the basic domains, we also provide generic support for
+constructing new domains from pre-existing domains.
+The following domains and domain constructors are provided by the PPL:
+- the domain of topologically closed, rational convex polyhedra;
+- the domain of rational convex polyhedra that are not necessarily closed;
+- the domain of topologically closed, rational bounded difference shapes;
+- the powerset construction;
+- the powerset construction, instantiated for convex polyhedra.
+
+In the following sections we describe these domains and domain
+constructors together with their representations and operations
+that are available to the PPL user.
+
+In the final section of this chapter (Section \ref use_of_library),
+we provide some additional advice on the use of the library.
+
+\section convex_polys Convex Polyhedra
+
+In this section we introduce convex polyhedra,
+as considered by the library, in more detail.
+For more information about the definitions and results stated here see
+\ref BRZH02b "[BRZH02b]",
+\ref Fuk98 "[Fuk98]",
+\ref NW88 "[NW88]", and
+\ref Wil93 "[Wil93]".
+
+\subsection Vectors_Matrices_and_Scalar_Products Vectors, Matrices and Scalar Products
+
+We denote by \f$\Rset^n\f$ the \f$n\f$-dimensional vector space on the field
+of real numbers \f$\Rset\f$, endowed with the standard topology.
+The set of all non-negative reals is denoted by \f$\nonnegRset\f$.
+For each \f$i \in \{0, \ldots, n-1\}\f$, \f$v_i\f$ denotes
+the \f$i\f$-th component of the (column) vector
+\f$\vect{v} = (v_0, \ldots, v_{n-1})^\transpose \in \Rset^n\f$.
+We denote by \f$\vect{0}\f$ the vector of \f$\Rset^n\f$,
+called <EM>the origin</EM>, having all components equal to zero.
+A vector \f$\vect{v} \in \Rset^n\f$ can be also interpreted
+as a matrix in \f$\Rset^{n \times 1}\f$ and manipulated accordingly
+using the usual definitions for addition, multiplication
+(both by a scalar and by another matrix), and transposition,
+denoted by \f$\vect{v}^\transpose\f$.
+
+The <EM>scalar product</EM> of \f$\vect{v},\vect{w} \in \Rset^n\f$,
+denoted \f$\langle \vect{v}, \vect{w} \rangle\f$,
+is the real number
+\f[
+  \vect{v}^\transpose \vect{w} = \sum_{i=0}^{n-1} v_i w_i.
+\f]
+
+For any \f$S_1, S_2 \sseq \Rset^n\f$, the <EM>Minkowski's sum</EM> of
+\f$S_1\f$ and \f$S_2\f$ is:
+\f$S_1 + S_2 = \{\, \vect{v}_1 + \vect{v}_2 \mid
+                \vect{v}_1 \in S_1, \vect{v}_2 \in S_2 \,\}.\f$
+
+
+\subsection Affine_Hyperplanes_and_Half_spaces Affine Hyperplanes and Half-spaces
+
+For each vector \f$\vect{a} \in \Rset^n\f$ and scalar \f$b \in \Rset\f$,
+where \f$\vect{a} \neq \vect{0}\f$,
+and for each relation symbol \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$,
+the linear constraint \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+defines:
+- an affine hyperplane if it is an equality constraint,
+  i.e., if \f$\mathord{\relsym} \in \{ = \}\f$;
+- a topologically closed affine half-space if it is
+  a non-strict inequality constraint,
+  i.e., if \f$\mathord{\relsym} \in \{ \geq \}\f$;
+- a topologically open affine half-space if it is
+  a strict inequality constraint,
+  i.e., if \f$\mathord{\relsym} \in \{ > \}\f$.
+
+Note that each hyperplane \f$\langle \vect{a}, \vect{x} \rangle = b\f$
+can be defined as the intersection of the two closed affine half-spaces
+\f$\langle \vect{a}, \vect{x} \rangle \geq b\f$ and
+\f$\langle -\vect{a}, \vect{x} \rangle \geq -b\f$.
+Also note that, when \f$\vect{a} = \vect{0}\f$,
+the constraint \f$\langle \vect{0}, \vect{x} \rangle \relsym b\f$
+is either a tautology (i.e., always true)
+or inconsistent (i.e., always false), so that it defines
+either the whole vector space \f$\Rset^n\f$ or the empty set \f$\emptyset\f$.
+
+
+\subsection Convex_Polyhedra Convex Polyhedra
+
+The set \f$\cP \sseq \Rset^n\f$ is a
+<EM>not necessarily closed convex polyhedron</EM>
+(<EM>NNC polyhedron</EM>, for short) if and only if either
+\f$\cP\f$ can be expressed as the intersection of a finite number
+of (open or closed) affine half-spaces of \f$\Rset^n\f$
+or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+The set of all NNC polyhedra on the vector space \f$\Rset^n\f$
+is denoted \f$\Pset_n\f$.
+
+The set \f$\cP \in \Pset_n\f$ is a <EM>closed convex polyhedron</EM>
+(<EM>closed polyhedron</EM>, for short) if and only if either
+\f$\cP\f$ can be expressed as the intersection of a finite number
+of closed affine half-spaces of \f$\Rset^n\f$
+or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+The set of all closed polyhedra on the vector space \f$\Rset^n\f$
+is denoted \f$\CPset_n\f$.
+
+When ordering NNC polyhedra by the set inclusion relation,
+the empty set \f$\emptyset\f$ and the vector space \f$\Rset^n\f$
+are, respectively, the smallest and the biggest elements of both
+\f$\Pset_n\f$ and \f$\CPset_n\f$.
+The vector space \f$\Rset^n\f$ is also called the <EM>universe</EM> polyhedron.
+
+In theoretical terms,
+\f$\Pset_n\f$ is a <EM>lattice</EM> under set inclusion and
+\f$\CPset_n\f$ is a <EM>sub-lattice</EM> of \f$\Pset_n\f$.
+
+\note
+In the following, we will usually specify operators on the domain
+\f$\Pset_n\f$ of NNC polyhedra. Unless an explicit distinction is
+made, these operators are provided with the same specification when
+applied to the domain \f$\CPset_n\f$ of topologically closed
+polyhedra.  The implementation maintains a clearer separation between
+the two domains of polyhedra
+(see \ref Topologies_and_Topological_compatibility "Topologies and Topological-compatibility"):
+while computing polyhedra in \f$\Pset_n\f$ may provide more precise
+results, polyhedra in \f$\CPset_n\f$ can be represented and
+manipulated more efficiently.  As a rule of thumb, if your application
+will only manipulate polyhedra that are topologically closed, then it
+should use the simpler domain \f$\CPset_n\f$. Using NNC polyhedra is
+only recommended if you are going to actually benefit from the
+increased accuracy.
+
+
+\subsection Bounded_Polyhedra Bounded Polyhedra
+
+An NNC polyhedron \f$\cP \in \Pset_n\f$ is <EM>bounded</EM>
+if there exists a \f$\lambda \in \nonnegRset\f$ such that
+\f[
+  \cP
+    \sseq
+      \bigl\{\,
+        \vect{x} \in \Rset^n
+      \bigm|
+        - \lambda \leq x_j \leq \lambda \text{ for } j = 0, \ldots, n-1
+      \,\bigr\}.
+\f]
+A bounded polyhedron is also called a <EM>polytope</EM>.
+
+
+\section representation Representations of Convex Polyhedra
+
+NNC polyhedra can be specified by using two possible representations,
+the constraints (or implicit) representation and
+the generators (or parametric) representation.
+
+
+\subsection Constraints_Representation Constraints Representation
+
+In the sequel, we will simply write ``equality'' and ``inequality''
+to mean ``linear equality'' and ``linear inequality'', respectively;
+also, we will refer to either an equality or an inequality
+as a <EM>constraint</EM>.
+
+By definition, each polyhedron \f$\cP \in \Pset_n\f$ is the set of solutions
+to a <EM>constraint system</EM>, i.e., a finite number of constraints.
+By using matrix notation, we have
+\f[
+  \cP
+    \defeq
+      \{\,
+        \vect{x} \in \Rset^n
+      \mid
+        A_1 \vect{x} =    \vect{b}_1,
+        A_2 \vect{x} \geq \vect{b}_2,
+        A_3 \vect{x} >    \vect{b}_3
+      \,\},
+\f]
+where, for all \f$i \in \{1, 2, 3\}\f$,
+\f$A_i \in \Rset^{m_i} \times \Rset^n\f$ and \f$\vect{b}_i \in \Rset^{m_i}\f$,
+and \f$m_1, m_2, m_3 \in \Nset\f$ are
+the number of equalities,
+the number of non-strict inequalities, and
+the number of strict inequalities,
+respectively.
+
+
+\subsection Combinations_and_Hulls Combinations and Hulls
+
+Let \f$S = \{ \vect{x}_1, \ldots, \vect{x}_k \} \sseq \Rset^n\f$
+be a finite set of vectors.
+For all scalars \f$\lambda_1, \ldots, \lambda_k \in \Rset\f$,
+the vector \f$\vect{v} = \sum_{j=1}^k \lambda_j \vect{x}_j\f$
+is said to be a <EM>linear</EM> combination of the vectors in \f$S\f$.
+Such a combination is said to be
+- a <EM>positive</EM> (or <EM>conic</EM>) combination,
+  if \f$\forall j \in \{ 1, \ldots, k \} \itc \lambda_j \in \nonnegRset\f$;
+- an <EM>affine</EM> combination, if \f$\sum_{j = 1}^k \lambda_j = 1\f$;
+- a <EM>convex</EM> combination, if it is both positive and affine.
+
+We denote by \f$\linearhull(S)\f$
+(resp., \f$\conichull(S)\f$, \f$\affinehull(S)\f$, \f$\convexhull(S)\f$)
+the set of all the linear (resp., positive, affine, convex)
+combinations of the vectors in \f$S\f$.
+
+Let \f$P, C \sseq \Rset^n\f$, where \f$P \union C = S\f$.
+We denote by  \f$\NNChull(P, C)\f$ the set of all convex combinations
+of the vectors in \f$S\f$
+such that \f$\lambda_j > 0\f$ for some \f$\vect{x}_j \in P\f$
+(informally, we say that there exists a vector of \f$P\f$ that
+plays an active role in the convex combination).
+Note that \f$\NNChull(P, C) = \NNChull(P, P \union C)\f$
+so that, if \f$C \sseq P\f$,
+\f[
+   \convexhull(P)
+     = \NNChull(P, \emptyset)
+     = \NNChull(P, P)
+     = \NNChull(P, C).
+\f]
+It can be observed that
+\f$\linearhull(S)\f$ is an affine space,
+\f$\conichull(S)\f$ is a topologically closed convex cone,
+\f$\convexhull(S)\f$ is a topologically closed polytope, and
+\f$\NNChull(P, C)\f$ is an NNC polytope.
+
+
+\subsection Points_Closure_Points_Rays_and_Lines Points, Closure Points, Rays and Lines
+
+Let \f$\cP \in \Pset_n\f$ be an NNC polyhedron. Then
+- a vector \f$\vect{p} \in \cP\f$ is called a <EM>point</EM> of \f$\cP\f$;
+- a vector \f$\vect{c} \in \Rset^n\f$ is called a
+  <EM>closure point</EM> of \f$\cP\f$ if it is a point
+  of the topological closure of \f$\cP\f$;
+- a vector \f$\vect{r} \in \Rset^n\f$, where \f$\vect{r} \neq \vect{0}\f$,
+  is called a <EM>ray</EM> (or direction of infinity) of \f$\cP\f$
+  if \f$\cP \neq \emptyset\f$ and \f$\vect{p} + \lambda \vect{r} \in \cP\f$,
+  for all points \f$\vect{p} \in \cP\f$ and all \f$\lambda \in \nonnegRset\f$;
+- a vector \f$\vect{l} \in \Rset^n\f$ is called a <EM>line</EM> of \f$\cP\f$
+  if both \f$\vect{l}\f$ and \f$-\vect{l}\f$ are rays of \f$\cP\f$.
+
+A point of an NNC polyhedron \f$\cP \in \Pset_n\f$ is a
+<EM>vertex</EM> if and only if
+it cannot be expressed as a convex combination of any other pair of
+distinct points in \f$\cP\f$.
+A ray \f$\vect{r}\f$ of a polyhedron \f$\cP\f$ is an <EM>extreme ray</EM>
+if and only if it cannot be expressed as
+a positive combination of any other pair
+\f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ of rays of \f$\cP\f$,
+where
+\f$\vect{r} \neq \lambda \vect{r}_1\f$,
+\f$\vect{r} \neq \lambda \vect{r}_2\f$ and
+\f$\vect{r}_1 \neq \lambda \vect{r}_2\f$
+for all \f$\lambda \in \nonnegRset\f$
+(i.e., rays differing by a positive scalar factor are considered
+to be the same ray).
+
+
+\subsection Generators_Representation Generators Representation
+
+Each NNC polyhedron \f$\cP \in \Pset_n\f$ can be represented by
+finite sets of lines \f$L\f$, rays \f$R\f$,
+points \f$P\f$ and closure points \f$C\f$ of \f$\cP\f$.
+The 4-tuple \f$\cG = (L, R, P, C)\f$ is said to be
+a <EM>generator system</EM> for \f$\cP\f$,
+in the sense that
+\f[
+  \cP = \linearhull(L) + \conichull(R) + \NNChull(P, C),
+\f]
+where the symbol '\f$+\f$' denotes the Minkowski's sum.
+
+When \f$\cP \in \CPset_n\f$ is a closed polyhedron,
+then it can be represented by
+finite sets of lines \f$L\f$, rays \f$R\f$ and
+points \f$P\f$ of \f$\cP\f$.
+In this case, the 3-tuple \f$\cG = (L, R, P)\f$ is said to be
+a <EM>generator system</EM> for \f$\cP\f$ since we have
+\f[
+  \cP = \linearhull(L) + \conichull(R) + \convexhull(P).
+\f]
+Thus, in this case,
+every closure point of \f$\cP\f$ is a point of \f$\cP\f$.
+
+For any \f$\cP \in \Pset_n\f$ and generator system \f$\cG = (L, R, P, C)\f$
+for \f$\cP\f$, we have
+ \f$\cP = \emptyset\f$ if and only if \f$P = \emptyset\f$.
+Also \f$P\f$ must contain all the vertices of \f$\cP\f$
+although \f$\cP\f$ can be non-empty and have no vertices.
+In this case, as \f$P\f$ is necessarily non-empty, it must
+contain points of \f$\cP\f$ that are <EM>not</EM> vertices.
+For instance, the half-space of \f$\Rset^2\f$ corresponding to the single
+constraint \f$y \geq 0\f$ can be represented by the generator system
+\f$\cG = (L, R, P, C)\f$ such that
+\f$L = \bigl\{ (1, 0)^\transpose \bigr\}\f$,
+\f$R = \bigl\{ (0, 1)^\transpose \bigr\}\f$,
+\f$P = \bigl\{ (0, 0)^\transpose \bigr\}\f$, and
+\f$C = \emptyset\f$.
+It is also worth noting that the only ray in \f$R\f$
+is <EM>not</EM> an extreme ray of \f$\cP\f$.
+
+\subsection Minimized_Representations Minimized Representations
+
+A constraints system \f$\cC\f$ for an NNC polyhedron \f$\cP \in \Pset_n\f$
+is said to be <EM>minimized</EM> if no proper subset of \f$\cC\f$ is
+a constraint system for \f$\cP\f$.
+
+Similarly, a generator system \f$\cG = (L, R, P, C)\f$
+for an NNC polyhedron \f$\cP \in \Pset_n\f$ is said to be <EM>minimized</EM>
+if there does not exist a generator system
+\f$\cG' = (L', R', P', C') \neq \cG\f$ for \f$\cP\f$
+such that \f$L' \sseq L\f$, \f$R' \sseq R\f$, \f$P' \sseq P\f$ and
+\f$C' \sseq C\f$.
+
+
+\subsection Double_Description Double Description
+
+Any NNC polyhedron \f$\cP\f$ can be described by using
+a constraint system \f$\cC\f$, a generator system \f$\cG\f$, or
+both by means of the <EM>double description pair (DD pair)</EM>
+\f$(\cC, \cG)\f$.
+The <EM>double description method</EM> is a collection
+of well-known as well as novel theoretical results showing that,
+given one kind of representation, there are algorithms
+for computing a representation of the other kind
+and for minimizing both representations by removing
+redundant constraints/generators.
+
+Such changes of representation form a key step
+in the implementation of many operators on NNC polyhedra:
+this is because some operators, such as intersections and poly-hulls,
+are provided with a natural and efficient implementation
+when using one of the representations in a DD pair,
+while being rather cumbersome when using the other.
+
+
+\subsection Topologies_and_Topological_compatibility Topologies and Topological-compatibility
+
+As indicated above, when an NNC polyhedron \f$\cP\f$ is necessarily closed,
+we can ignore the closure points contained in its generator system
+\f$\cG = (L, R, P, C)\f$ (as every closure point is also a point)
+and represent \f$\cP\f$ by the triple \f$(L, R, P)\f$.
+Similarly, \f$\cP\f$ can be represented by a constraint system
+that has no strict inequalities.
+Thus a necessarily closed polyhedron can have a smaller representation
+than one that is not necessarily closed.
+Moreover, operators restricted to work on closed polyhedra only
+can be implemented more efficiently.
+For this reason the library provides two alternative
+``topological kinds'' for a polyhedron, <EM>NNC</EM> and <EM>C</EM>.
+We shall abuse terminology by referring to the topological kind of
+a polyhedron as its <EM>topology</EM>.
+
+In the library, the topology of each polyhedron object is fixed
+once for all at the time of its creation and must be respected
+when performing operations on the polyhedron.
+
+Unless it is otherwise stated,
+all the polyhedra, constraints and/or generators in any library operation
+must obey the following <EM>topological-compatibility</EM> rules:
+- polyhedra are topologically-compatible if and only if they have
+  the same topology;
+- all constraints except for strict inequality constraints
+  and all generators except for closure points are
+  topologically-compatible with both C and NNC polyhedra;
+- strict inequality constraints and closure points are
+  topologically-compatible with a polyhedron if and only if it is NNC.
+
+Wherever possible,
+the library provides methods that, starting from a polyhedron of
+a given topology, build the corresponding polyhedron having
+the other topology.
+
+
+\subsection Space_Dimensions_and_Dimension_Compatibility Space Dimensions and Dimension Compatibility
+
+The <EM>space dimension</EM> of an NNC polyhedron \f$\cP \in \Pset_n\f$
+(resp., a C polyhedron \f$\cP \in \CPset_n\f$) is the dimension
+\f$n \in \Nset\f$ of the corresponding vector space \f$\Rset^n\f$.
+The space dimension of constraints, generators and other objects
+of the library is defined similarly.
+
+Unless it is otherwise stated,
+all the polyhedra, constraints and/or generators in any library operation
+must obey the following (space) <EM>dimension-compatibility</EM> rules:
+- polyhedra are dimension-compatible if and only if they have
+  the same space dimension;
+- the constraint
+  \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+  where \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$
+  and \f$\vect{a}, \vect{x} \in \Rset^m\f$, is dimension-compatible
+  with a polyhedron having space dimension \f$n\f$
+  if and only if \f$m \leq n\f$;
+- the generator \f$\vect{x} \in \Rset^m\f$ is dimension-compatible
+  with a polyhedron having space dimension \f$n\f$
+  if and only if \f$m \leq n\f$;
+- a system of constraints (resp., generators) is dimension-compatible with
+  a polyhedron if and only if all the constraints (resp., generators)
+  in the system are dimension-compatible with the polyhedron.
+
+While the space dimension of a constraint, a generator or a system thereof
+is automatically adjusted when needed, the space dimension of a polyhedron
+can only be changed by explicit calls to operators provided for that
+purpose.
+
+\subsection Affine_Independence_and_Affine_Dimension Affine Independence and Affine Dimension
+
+A finite set of points
+\f$\{ \vect{x}_1, \ldots, \vect{x}_k \} \sseq \Rset^n\f$ is
+<EM>affinely independent</EM> if,
+for all \f$\lambda_1, \ldots, \lambda_k \in \Rset\f$,
+the system of equations
+\f[
+  \sum_{i = 1}^k \lambda_i \vect{x}_i = \vect{0},
+    \quad
+  \sum_{i = 1}^k \lambda_i = 0
+\f]
+implies that, for each \f$i = 1, \ldots, k\f$, \f$\lambda_i = 0\f$.
+
+The maximum number of affinely independent points in \f$\Rset^n\f$
+is \f$n + 1\f$.
+
+A <EM>non-empty</EM> NNC polyhedron \f$\cP \in \Pset_n\f$ has
+<EM>affine dimension</EM> \f$k \in \Nset\f$, denoted by \f$\pdim(\cP) = k\f$,
+if the maximum number of affinely independent points in \f$\cP\f$ is
+\f$k + 1\f$.
+
+We remark that the above definition only applies to polyhedra
+that are not empty, so that \f$0 \leq \pdim(\cP) \leq n\f$.
+By convention, the affine dimension of an empty polyhedron is 0
+(even though the ``natural'' generalization of the definition above
+would imply that the affine dimension of an empty polyhedron is \f$-1\f$).
+
+\note
+The affine dimension \f$k \leq n\f$ of an NNC polyhedron \f$\cP \in \Pset_n\f$
+must not be confused with the space dimension \f$n\f$ of \f$\cP\f$,
+which is the dimension of the enclosing vector space \f$\Rset^n\f$.
+In particular, we can have \f$\pdim(\cP) \neq \pdim(\cQ)\f$ even though
+\f$\cP\f$ and \f$\cQ\f$ are dimension-compatible;
+and vice versa, \f$\cP\f$ and \f$\cQ\f$ may be dimension-incompatible
+polyhedra even though \f$\pdim(\cP) = \pdim(\cQ)\f$.
+
+
+\subsection Rational_Polyhedra Rational Polyhedra
+
+An NNC polyhedron is called <EM>rational</EM>
+if it can be represented by a constraint system where
+all the constraints have rational coefficients.
+It has been shown that an NNC polyhedron is rational
+if and only if it can be represented by a generator system where
+all the generators have rational coefficients.
+
+The library only supports rational polyhedra.
+The restriction to rational numbers applies not only to polyhedra,
+but also to the other numeric arguments that may be required
+by the operators considered, such as the coefficients defining
+(rational) affine transformations and (rational) bounding boxes.
+
+
+\section Operations_on_Convex_Polyhedra Operations on Convex Polyhedra
+
+In this section we briefly describe operations on NNC polyhedra
+that are provided by the library.
+
+\subsection Intersection_and_Convex_Polyhedral_Hull Intersection and Convex Polyhedral Hull
+
+For any pair of NNC polyhedra \f$\cP_1, \cP_2 \in \Pset_n\f$,
+the <EM>intersection</EM> of \f$\cP_1\f$ and \f$\cP_2\f$,
+defined as the set intersection \f$\cP_1 \inters \cP_2\f$,
+is the biggest NNC polyhedron included in both \f$\cP_1\f$ and \f$\cP_2\f$;
+similarly, the <EM>convex polyhedral hull</EM> (or <EM>poly-hull</EM>)
+of \f$\cP_1\f$ and \f$\cP_2\f$, denoted by \f$\cP_1 \uplus \cP_2\f$,
+is the smallest NNC polyhedron that includes both
+\f$\cP_1\f$ and \f$\cP_2\f$.
+The intersection and poly-hull of any pair of closed polyhedra
+in \f$\CPset_n\f$ is also closed.
+
+In theoretical terms,
+the intersection and poly-hull operators defined above
+are the binary <EM>meet</EM> and the binary <EM>join</EM>
+operators on the lattices \f$\Pset_n\f$ and \f$\CPset_n\f$.
+
+\subsection Convex_Polyhedral_Difference Convex Polyhedral Difference
+
+For any pair of NNC polyhedra \f$\cP_1, \cP_2 \in \Pset_n\f$,
+the <EM>convex polyhedral difference</EM> (or <EM>poly-difference</EM>)
+of \f$\cP_1\f$ and \f$\cP_2\f$ is defined as the smallest
+convex polyhedron containing the set-theoretic difference
+of \f$\cP_1\f$ and \f$\cP_2\f$.
+
+In general, even though \f$\cP_1, \cP_2 \in \CPset_n\f$
+are topologically closed polyhedra, their poly-difference may be
+a convex polyhedron that is not topologically closed.
+For this reason, when computing the poly-difference of two
+C polyhedra, the library will enforce the topological closure
+of the result.
+
+\subsection Concatenating_Polyhedra Concatenating Polyhedra
+
+Viewing a polyhedron as a set of tuples (its points), it is sometimes
+useful to consider the set of tuples obtained by concatenating
+an ordered pair of polyhedra.
+Formally, the <EM>concatenation</EM> of the polyhedra
+\f$\cP \in \Pset_n\f$ and \f$\cQ \in \Pset_m\f$ (taken in this order)
+is the polyhedron \f$\cR \in \Pset_{n+m}\f$ such that
+\f[
+  \cR
+    \defeq
+      \Bigl\{\,
+        (x_0, \ldots, x_{n-1}, y_0, \ldots, y_{m-1})^\transpose
+          \in \Rset^{n+m}
+      \Bigm|
+        (x_0, \ldots, x_{n-1})^\transpose \in \cP,
+        (y_0, \ldots, y_{m-1})^\transpose \in \cQ
+      \,\Bigl\}.
+\f]
+Another way of seeing it is as follows: first embed polyhedron \f$\cP\f$
+into a vector space of dimension \f$n+m\f$ and then add a suitably
+renamed-apart version of the constraints defining \f$\cQ\f$.
+
+\subsection Adding_New_Dimensions_to_the_Vector_Space Adding New Dimensions to the Vector Space
+
+The library provides two operators for adding a number \f$i\f$ of
+space dimensions to an NNC polyhedron \f$\cP \in \Pset_n\f$,
+therefore transforming it into a new NNC polyhedron
+\f$\cQ \in \Pset_{n+i}\f$.
+In both cases, the added dimensions of the vector space
+are those having the highest indices.
+
+The operator <CODE>add_space_dimensions_and_embed</CODE>
+\e embeds the polyhedron \f$\cP\f$ into the new vector space of
+dimension \f$i+n\f$ and returns the polyhedron \f$\cQ\f$
+defined by all and only the constraints defining \f$\cP\f$
+(the variables corresponding to the added dimensions are unconstrained).
+For instance, when starting from a polyhedron \f$\cP \sseq \Rset^2\f$
+and adding a third space dimension, the result will be the polyhedron
+\f[
+ \cQ = \bigl\{\,
+         (x_0, x_1, x_2)^\transpose \in \Rset^3
+       \bigm|
+         (x_0, x_1)^\transpose \in \cP
+       \,\bigr\}.
+\f]
+
+In contrast, the operator  <CODE>add_space_dimensions_and_project</CODE>
+\e projects the polyhedron \f$\cP\f$ into the new vector space of
+dimension \f$i+n\f$ and returns the polyhedron \f$\cQ\f$
+whose constraint system, besides the constraints defining \f$\cP\f$,
+will include additional constraints on the added dimensions.
+Namely, the corresponding variables are all constrained to be equal to 0.
+For instance, when starting from a polyhedron \f$\cP \sseq \Rset^2\f$
+and adding a third space dimension, the result will be the polyhedron
+\f[
+  \cQ = \bigl\{\,
+          (x_0, x_1, 0)^\transpose \in \Rset^3
+        \bigm|
+          (x_0, x_1)^\transpose \in \cP
+        \,\bigr\}.
+\f]
+
+\subsection Removing_Dimensions_from_the_Vector_Space Removing Dimensions from the Vector Space
+
+The library provides two operators for removing
+space dimensions from an NNC polyhedron \f$\cP \in \Pset_n\f$,
+therefore transforming it into a new NNC polyhedron
+\f$\cQ \in \Pset_m\f$ where \f$m \leq n\f$.
+
+Given a set of variables, the operator <CODE>remove_space_dimensions</CODE>
+removes all the space dimensions specified by the variables in the set.
+For instance, letting \f$\cP \in \Pset_4\f$ be the singleton set
+\f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$,
+then after invoking this operator with the set of variables
+\f$\{x_1, x_2\}\f$ the resulting polyhedron is
+\f[
+  \cQ = \bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2.
+\f]
+
+Given a space dimension \f$m\f$ less than or equal to that of the polyhedron,
+the operator <CODE>remove_higher_space_dimensions</CODE> removes
+the space dimensions having indices greater than or equal to \f$m\f$.
+For instance, letting \f$\cP \in \Pset_4\f$ defined as before,
+by invoking this operator with \f$m = 2\f$ the resulting polyhedron
+will be
+\f[
+  \cQ = \bigl\{ (3, 1)^\transpose \bigr\} \sseq \Rset^2.
+\f]
+
+\subsection Mapping_the_Dimensions_of_the_Vector_Space Mapping the Dimensions of the Vector Space
+
+The operator <CODE>map_space_dimensions</CODE> provided by the library
+maps the dimensions of the vector space \f$\Rset^n\f$ according
+to a partial injective function \f$\pard{\rho}{\{0, \ldots, n-1\}}{\Nset}\f$
+such that \f$\rho\bigl(\{0, \ldots, n-1\}\bigr) = \{0, \ldots, m-1\}\f$
+with \f$m \leq n\f$.
+Dimensions corresponding to indices that are not mapped
+by \f$\rho\f$ are removed.
+
+If \f$m = 0\f$, i.e., if the function \f$\rho\f$ is undefined everywhere,
+then the operator projects the argument polyhedron \f$\cP \in \Pset_n\f$
+onto the zero-dimension space \f$\Rset^0\f$;
+otherwise the result is \f$\cQ \in \Pset_m\f$ given by
+\f[
+  \cQ
+    \defeq
+      \Bigl\{\,
+        \bigl(v_{\rho^{-1}(0)}, \ldots, v_{\rho^{-1}(m-1)}\bigr)^\transpose
+      \Bigm|
+        (v_0, \ldots, v_{n-1})^\transpose \in \cP
+      \,\Bigr\}.
+\f]
+
+\anchor expand_space_dimension
+\subsection Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions Expanding One Dimension of the Vector Space to Multiple Dimensions
+
+The operator <CODE>expand_space_dimension</CODE> provided by the library
+adds \f$m\f$ new space dimensions to a polyhedron \f$\cP \in \Pset_n\f$,
+with \f$n > 0\f$, so that dimensions
+\f$n\f$, \f$n+1\f$, \f$\ldots\f$, \f$n+m-1\f$
+of the result \f$\cQ\f$ are exact copies of the \f$i\f$-th space dimension
+of \f$\cP\f$.  More formally,
+\f[
+  \cQ
+    \defeq
+      \sset{
+        \vect{u} \in \Rset^{n+m}
+      }{
+        \exists \vect{v}, \vect{w} \in \cP
+          \st u_i = v_i \\
+          \qquad \mathord{} \land \forall j = n, n+1, \ldots, n+m-1
+                                     \itc u_j = w_i \\
+          \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+                                     \itc k \neq i \implies u_k = v_k = w_k
+      }.
+\f]
+This operation has been proposed in \ref GDMDRS04 "[GDMDRS04]".
+
+
+\anchor fold_space_dimensions
+\subsection Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension Folding Multiple Dimensions of the Vector Space into One Dimension
+
+The operator <CODE>fold_space_dimensions</CODE> provided by the library,
+given a polyhedron \f$\cP \in \Pset_n\f$, with \f$n > 0\f$,
+folds a set of space dimensions \f$J = \{ j_0, \ldots, j_{m-1} \}\f$,
+with \f$m < n\f$ and \f$j < n\f$ for each \f$j \in J\f$,
+into space dimension \f$i < n\f$, where \f$i \notin J\f$.
+The result is given by
+\f[
+  \cQ \defeq \biguplus_{d = 0}^m \cQ_d
+\f]
+where
+\f[
+  \cQ_m
+    \defeq
+      \sset{
+        \vect{u} \in \Rset^{n-m}
+      }{
+        \exists \vect{v} \in \cP
+          \st u_{i'} = v_i \\
+          \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+                                     \itc k \neq i \implies u_{k'} = v_k
+      }
+\f]
+and, for \f$ d = 0 \f$, \f$ \ldots \f$, \f$ m-1 \f$,
+\f[
+  \cQ_d
+    \defeq
+      \sset{
+        \vect{u} \in \Rset^{n-m}
+      }{
+        \exists \vect{v} \in \cP
+          \st u_{i'} = v_{j_d} \\
+          \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+                                     \itc k \neq i \implies u_{k'} = v_k
+      },
+\f]
+and, finally, for \f$ k = 0 \f$, \f$ \ldots \f$, \f$ n-1 \f$,
+\f[
+  k'
+    \defeq
+      k - \card \{\, j \in J \mid k > j \,\},
+\f]
+(\f$\card S\f$ denotes the cardinality of the finite set \f$S\f$).
+
+This operation has been proposed in \ref GDMDRS04 "[GDMDRS04]".
+
+
+\anchor affine_relation
+\subsection Images_and_Preimages_of_Affine_Transfer_Relations Images and Preimages of Affine Transfer Relations
+
+For each relation \f$\reld{\phi}{\Rset^n}{\Rset^m}\f$,
+we denote by \f$\phi(S) \sseq \Rset^m\f$ the <EM>image</EM>
+under \f$\phi\f$ of the set \f$S \sseq \Rset^n\f$; formally,
+\f[
+  \phi(S)
+    \defeq
+      \bigl\{\,
+        \vect{w} \in \Rset^m
+      \bigm|
+        \exists \vect{v} \in S \st
+          (\vect{v}, \vect{w}) \in \phi
+      \,\bigr\}.
+\f]
+Similarly, we denote by \f$\phi^{-1}(S') \sseq \Rset^n\f$
+the <EM>preimage</EM> under \f$\phi\f$ of \f$S' \sseq \Rset^m\f$,
+that is
+\f[
+  \phi^{-1}(S')
+    \defeq
+      \bigl\{\,
+        \vect{v} \in \Rset^n
+      \bigm|
+        \exists \vect{w} \in S' \st
+          (\vect{v}, \vect{w}) \in \phi
+      \,\bigr\}.
+\f]
+If \f$n = m\f$, then the relation \f$\phi\f$ is said to be
+<EM>space dimension preserving</EM>.
+
+The relation \f$\reld{\phi}{\Rset^n}{\Rset^m}\f$
+is said to be an <EM>affine relation</EM>
+if there exists \f$\ell \in \Nset\f$ such that
+\f[
+  \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^m
+    \itc
+      (\vect{v}, \vect{w}) \in \phi
+        \iff
+          \bigland_{i=1}^{\ell}
+            \bigl(
+              \langle \vect{c}_i, \vect{w} \rangle
+                \relsym_i
+                  \langle \vect{a}_i, \vect{v} \rangle + b_i
+            \bigr),
+\f]
+where
+\f$\vect{a}_i \in \Rset^n\f$,
+\f$\vect{c}_i \in \Rset^m\f$,
+\f$b_i \in \Rset\f$ and
+\f$\mathord{\relsym}_i \in \{ <, \leq, =, \geq, > \}\f$,
+for each \f$i = 1, \ldots, \ell\f$.
+
+As a special case, the relation \f$\reld{\phi}{\Rset^n}{\Rset^m}\f$
+is an <EM>affine function</EM> if and only if there exist
+a matrix \f$A \in \Rset^m \times \Rset^n\f$ and
+a vector \f$\vect{b} \in \Rset^m\f$ such that,
+\f[
+  \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^m
+    \itc
+      (\vect{v}, \vect{w}) \in \phi
+        \iff
+          \vect{w} = A\vect{v} + \vect{b}.
+\f]
+
+The set \f$\Pset_n\f$ of NNC polyhedra is closed under the application
+of images and preimages of any space dimension preserving affine relation.
+The same property holds for the set \f$\CPset_n\f$ of closed polyhedra,
+provided the affine relation makes no use of the strict relation symbols
+\f$<\f$ and \f$>\f$.
+Images and preimages of affine relations can be used to model
+several kinds of transition relations, including
+deterministic assignments of affine expressions,
+(affinely constrained) nondeterministic assignments and
+affine conditional guards.
+
+A space dimension preserving relation
+\f$\reld{\phi}{\Rset^n}{\Rset^n}\f$
+can be specified by means of a shorthand notation:
+ - the vector \f$\vect{x} = (x_0, \ldots, x_{n-1})^\transpose\f$
+   of <EM>unprimed</EM> variables is used to represent the
+   space dimensions of the domain of \f$\phi\f$;
+ - the vector \f$\vect{x}' = (x'_0, \ldots, x'_{n-1})^\transpose\f$
+   of <EM>primed</EM> variables is used to represent the
+   space dimensions of the range of \f$\phi\f$;
+ - any primed variable that ``does not occur'' in the shorthand
+   specification is meant to be <EM>unaffected</EM> by the relation;
+   namely, for each index \f$i \in \{0, \ldots, n-1\}\f$,
+   if in the syntactic specification of the relation
+   the primed variable \f$x'_i\f$ only occurs (if ever) with
+   coefficient 0, then it is assumed that the specification also
+   contains the constraint \f$x'_i = x_i\f$.
+
+As an example, assuming \f$\reld{\phi}{\Rset^3}{\Rset^3}\f$,
+the notation \f$x'_0 - x'_2 \geq 2 x_0 - x_1\f$, where the primed
+variable \f$x'_1\f$ does not occur, is meant to specify
+the affine relation defined by
+\f[
+  \forall \vect{v} \in \Rset^3, \vect{w} \in \Rset^3
+    \itc
+      (\vect{v}, \vect{w}) \in \phi
+        \iff
+          (w_0 + w_2 \geq 2 v_0 - v_1) \land (w_1 = v_1).
+\f]
+The same relation is specified by
+\f$x'_0 + 0 \cdot x'_1 - x'_2 \geq 2 x_0 - x_1\f$,
+since \f$x'_1\f$ occurs with coefficient 0.
+
+The library allows for the computation of images and preimages
+of polyhedra under restricted subclasses of space dimension preserving
+affine relations, as described in the following.
+
+\subsection Single_Update_Affine_Functions Single-Update Affine Functions.
+Given a primed variable \f$x'_k\f$ and an unprimed affine expression
+\f$\langle \vect{a}, \vect{x} \rangle + b\f$,
+the <EM>affine function</EM>
+\f$\fund{\phi = \bigl(x'_k = \langle \vect{a}, \vect{x} \rangle + b\bigr)}
+        {\Rset^n}{\Rset^n}\f$
+is defined by
+\f[
+  \forall \vect{v} \in \Rset^n \itc
+    \phi(\vect{v}) = A\vect{v} + \vect{b},
+\f]
+where
+\f[
+ A =
+   \begin{pmatrix}
+      1      &        &    0    &   0    & \cdots  & \cdots &    0    \\
+             & \ddots &         & \vdots &         &        & \vdots  \\
+      0      &        &    1    &   0    & \cdots  & \cdots &    0    \\
+     a_0     & \cdots & a_{k-1} &  a_k   & a_{k+1} & \cdots & a_{n-1} \\
+      0      & \cdots & \cdots  &   0    &   1     &        &    0    \\
+    \vdots   &        &         & \vdots &         & \ddots &         \\
+      0      & \cdots & \cdots  &   0    &   0     &        &    1
+   \end{pmatrix}, \qquad
+ \vect{b} =
+   \begin{pmatrix}
+     0      \\
+     \vdots \\
+     0      \\
+     b      \\
+     0      \\
+     \vdots \\
+     0
+   \end{pmatrix}
+\f]
+and the \f$a_i\f$ (resp., \f$b\f$) occur in the \f$(k+1)\f$st row
+in \f$A\f$ (resp., position in \f$\vect{b}\f$).
+Thus function \f$\phi\f$ maps any vector
+\f$(v_0, \ldots, v_{n-1})^\transpose\f$
+to
+\f[
+   \Bigl(v_0, \ldots,
+           \bigl(\textstyle{\sum_{i=0}^{n-1}} a_i v_i + b\bigr),
+             \ldots, v_{n-1}\Bigr)^\transpose.
+\f]
+
+The <EM>affine image</EM> operator computes the affine image
+of a polyhedron \f$\cP\f$ under
+\f$x'_k = \langle \vect{a}, \vect{x} \rangle + b\f$.
+For instance, suppose the polyhedron \f$\cP\f$
+to be transformed is the square in \f$\Rset^2\f$
+generated by the set of points
+\f$\bigl\{
+     (0, 0)^\transpose,
+     (0, 3)^\transpose,
+     (3, 0)^\transpose,
+     (3, 3)^\transpose
+   \bigr\}\f$.
+Then, if the primed variable is \f$x_0\f$ and
+the affine expression is \f$x_0 + 2 x_1 + 4\f$
+(so that \f$k = 0\f$, \f$a_0 = 1, a_1 = 2, b = 4\f$),
+the affine image operator will translate \f$\cP\f$
+to the parallelogram \f$\cP_1\f$ generated by the set of points
+\f$\bigl\{
+     (4, 0)^\transpose,
+     (10, 3)^\transpose,
+     (7, 0)^\transpose,
+     (13, 3)^\transpose
+   \bigr\}\f$
+with height equal to the side of the square
+and oblique sides parallel to the line \f$x_0 - 2 x_1\f$.
+If the primed variable is as before (i.e., \f$k = 0\f$)
+but the affine expression is \f$x_1\f$
+(so that \f$a_0 = 0, a_1 = 1, b = 0\f$),
+then the resulting polyhedron \f$\cP_2\f$
+is the positive diagonal of the square.
+
+The <EM>affine preimage</EM> operator computes the affine preimage
+of a polyhedron \f$\cP\f$ under
+\f$x'_k = \langle \vect{a}, \vect{x} \rangle + b\f$.
+For instance,
+suppose now that we apply the affine
+preimage operator as given in the first example
+using primed variable \f$x_0\f$
+and affine expression \f$x_0 + 2 x_1 + 4\f$
+to the parallelogram \f$\cP_1\f$;
+then we get the original square \f$\cP\f$ back.
+If, on the other hand, we apply the affine
+preimage operator as given in the second example
+using primed variable \f$x_0\f$ and affine expression \f$x_1\f$
+to \f$\cP_2\f$, then the resulting polyhedron is the stripe obtained
+by adding the line \f$(1, 0)^\transpose\f$ to polyhedron \f$\cP_2\f$.
+
+Observe that provided the coefficient \f$a_k\f$ of the considered variable
+in the affine expression is non-zero, the affine function is invertible.
+
+\subsection Single_Update_Bounded_Affine_Relations Single-Update Bounded Affine Relations.
+Given a primed variable \f$x'_k\f$ and
+two unprimed affine expressions
+\f$\mathrm{lb} = \langle \vect{a}, \vect{x} \rangle + b\f$ and
+\f$\mathrm{ub} = \langle \vect{c}, \vect{x} \rangle + d\f$,
+the <EM>bounded affine relation</EM>
+\f$\phi = (\mathrm{lb} \leq x'_k \leq \mathrm{ub})\f$
+is defined as
+\f[
+  \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^n
+    \itc
+      (\vect{v}, \vect{w}) \in \phi
+        \iff
+          \bigl(
+            \langle \vect{a}, \vect{v} \rangle + b
+              \leq w_k
+                \leq \langle \vect{c}, \vect{v} \rangle + d
+          \bigr)
+            \land
+          \Bigl(
+            \bigland_{0 \leq i < n, i \neq k}
+              w_i = v_i
+          \Bigr).
+\f]
+
+\subsection Generalized_Affine_Relations Generalized Affine Relations.
+Similarly, the <EM>generalized affine relation</EM>
+\f$\phi = (\mathrm{lhs}' \relsym \mathrm{rhs})\f$, where
+\f$\mathrm{lhs} = \langle \vect{c}, \vect{x} \rangle + d\f$ and
+\f$\mathrm{rhs} = \langle \vect{a}, \vect{x} \rangle + b\f$
+are affine expressions and
+\f$\mathord{\relsym} \in \{ <, \leq, =, \geq, > \}\f$
+is a relation symbol, is defined as
+\f[
+  \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^n
+    \itc
+      (\vect{v}, \vect{w}) \in \phi
+        \iff
+          \bigl(
+            \langle \vect{c}, \vect{w} \rangle + d
+              \relsym \langle \vect{a}, \vect{v} \rangle + b
+          \bigr)
+            \land
+          \Bigl(
+            \bigland_{0 \leq i < n, c_i = 0}
+              w_i = v_i
+          \Bigr).
+\f]
+When \f$\mathrm{lhs} = x_k\f$ and \f$\mathord{\relsym} \in \{ = \}\f$,
+then the above affine relation becomes equivalent to the
+single-update affine function \f$x'_k = \mathrm{rhs}\f$
+(hence the name given to this operator).
+It is worth stressing that the notation is not symmetric, because
+the variables occurring in expression \f$\mathrm{lhs}\f$ are interpreted
+as primed variables, whereas those occurring in \f$\mathrm{rhs}\f$
+are unprimed; for instance, the transfer relations
+\f$\mathrm{lhs}' \leq \mathrm{rhs}\f$ and
+\f$\mathrm{rhs}' \geq \mathrm{lhs}\f$
+are not equivalent in general.
+
+\subsection Time_Elapse_Operator Time-Elapse Operator
+
+The <EM>time-elapse</EM> operator has been defined in
+\ref HPR97 "[HPR97]".
+Actually, the time-elapse operator provided by the library
+is a slight generalization of that one,
+since it also works on NNC polyhedra.
+For any two NNC polyhedra \f$\cP, \cQ \in \Pset_n\f$,
+the time-elapse between \f$\cP\f$ and \f$\cQ\f$,
+denoted \f$ \cP \nearrow \cQ\f$,
+is the smallest NNC polyhedron containing the set
+\f[
+  \bigl\{\,
+    \vect{p} + \lambda \vect{q} \in \Rset^n
+  \bigm|
+    \vect{p} \in \cP, \vect{q} \in \cQ, \lambda \in \nonnegRset
+  \,\bigr\}.
+\f]
+Note that, if \f$\cP,\cQ \in \CPset_n\f$ are closed polyhedra,
+the above set is also a closed polyhedron.
+In contrast, when \f$\cQ\f$ is not topologically closed,
+the above set might not be an NNC polyhedron.
+
+\anchor relation_with
+\subsection Relation_With_Operators Relation-With Operators
+
+The library provides operators for checking the relation holding
+between an NNC polyhedron  and
+either a constraint or a generator.
+
+Suppose \f$\cP\f$ is an NNC polyhedron
+and \f$\cC\f$ an arbitrary constraint system representing \f$\cP\f$.
+Suppose also that
+\f$
+  c = \bigl(
+        \langle \vect{a}, \vect{x} \rangle \relsym b
+      \bigr)
+\f$
+is a constraint
+with \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$
+and \f$\cQ\f$ the set of points
+that satisfy \f$c\f$.
+The possible relations between \f$\cP\f$ and \f$c\f$ are as follows.
+- \f$\cP\f$ <EM>is disjoint</EM> from \f$c\f$ if
+  \f$\cP \inters \cQ = \emptyset\f$; that is, adding \f$c\f$
+  to \f$\cC\f$ gives us the empty polyhedron.
+- \f$\cP\f$ <EM>strictly intersects</EM> \f$c\f$ if
+  \f$\cP \inters \cQ \neq \emptyset\f$ and \f$\cP \inters \cQ \subset \cP\f$;
+  that is, adding \f$c\f$ to \f$\cC\f$
+  gives us a non-empty polyhedron strictly smaller than \f$\cP\f$.
+- \f$\cP\f$ <EM>is included</EM> in \f$c\f$ if \f$\cP \sseq \cQ\f$;
+  that is, adding \f$c\f$ to \f$\cC\f$
+  leaves \f$\cP\f$ unchanged.
+- \f$\cP\f$ <EM>saturates</EM> \f$c\f$ if \f$\cP \sseq \cH\f$,
+  where \f$\cH\f$ is the hyperplane induced by constraint \f$c\f$,
+  i.e., the set of points satisfying the equality constraint
+  \f$\langle \vect{a}, \vect{x} \rangle = b\f$;
+  that is, adding the constraint \f$\langle \vect{a}, \vect{x} \rangle = b\f$
+  to \f$\cC\f$ leaves \f$\cP\f$ unchanged.
+
+The polyhedron \f$\cP\f$ <EM>subsumes</EM> the generator \f$g\f$ if
+adding \f$g\f$ to any generator system representing \f$\cP\f$
+does not change \f$\cP\f$.
+
+\anchor bounding_boxes
+\subsection Intervals_Boxes_and_Bounding_Boxes Intervals, Boxes and Bounding Boxes
+
+An <EM>interval</EM> in \f$\Rset\f$ is a pair of <EM>bounds</EM>,
+called <EM>lower</EM> and <EM>upper</EM>.
+Each bound can be either (1) <EM>closed and bounded</EM>,
+(2) <EM>open and bounded</EM>, or
+(3) <EM>open and unbounded</EM>.
+If the bound is <EM>bounded</EM>, then it has a value in \f$\Rset\f$.
+An \f$n\f$-dimensional <EM>box</EM> \f$\cB\f$ in \f$\Rset^n\f$
+is a sequence of \f$n\f$ intervals in \f$\Rset\f$.
+
+The polyhedron \f$\cP\f$ <EM>represents a box \f$\cB\f$</EM> in \f$\Rset^n\f$
+if \f$\cP\f$
+is described by a constraint system in \f$\Rset^n\f$ that
+consists of one constraint for each bounded bound (lower and upper)
+in an interval in \f$\cB\f$:
+Letting \f$\vect{e}_i = (0, \ldots, 1, \ldots, 0)^\transpose\f$
+be the vector in \f$\Rset^n\f$ with 1 in the \f$i\f$'th position
+and zeroes in every other position;
+if the lower bound of the \f$i\f$'th interval in \f$\cB\f$
+is bounded, the corresponding constraint is defined as
+\f$\langle \vect{e}_i, \vect{x} \rangle \relsym b\f$,
+where \f$b\f$ is the value of the bound and
+\f$\mathord{\relsym}\f$ is \f$\mathord{\geq}\f$ if it is a closed bound and
+\f$\mathord{>}\f$ if it is an open bound.
+Similarly,
+if the upper bound of the \f$i\f$'th interval in \f$\cB\f$ is bounded,
+the corresponding constraint is defined as
+\f$\langle\vect{e}_i,\vect{x}\rangle \relsym b\f$,
+where \f$b\f$ is the value of the bound and
+\f$\mathord{\relsym}\f$ is \f$\mathord{\leq}\f$ if it is a closed bound and
+\f$\mathord{<}\f$ if it is an open bound.
+
+If every bound in the intervals
+defining a box \f$\cB\f$ is either closed and bounded
+or open and unbounded, then
+\f$\cB\f$ represents a closed polyhedron.
+
+The <EM>bounding box</EM> of an NNC polyhedron \f$\cP\f$ is
+the smallest \f$n\f$-dimensional box
+containing \f$\cP\f$.
+
+The library provides operations for computing the bounding box
+of an NNC polyhedron and conversely, for obtaining the NNC polyhedron
+representing a given bounding box.
+
+\subsection Widening_Operators Widening Operators
+
+The library provides two widening operators for the domain of polyhedra.
+\anchor H79_widening
+The first one, that we call <EM>H79-widening</EM>, mainly
+follows the specification provided in the PhD thesis of N. Halbwachs
+\ref Hal79 "[Hal79]", also described in \ref HPR97 "[HPR97]".
+Note that in the computation of the H79-widening \f$\cP \widen \cQ\f$
+of two polyhedra \f$\cP, \cQ \in \CPset_n\f$ it is required as a
+precondition that \f$\cP \sseq \cQ\f$ (the same assumption was implicitly
+present in the cited papers).
+
+\anchor BHRZ03_widening
+The second widening operator, that we call <EM>BHRZ03-widening</EM>,
+is an instance of the specification provided in \ref BHRZ03a "[BHRZ03a]".
+This operator also requires as a precondition that \f$\cP \sseq \cQ\f$
+and it is guaranteed to provide a result which is at least as precise as
+the H79-widening.
+
+Both widening operators can be applied to NNC polyhedra.
+The user is warned that, in such a case, the results may not closely
+match the geometric intuition which is at the base of the
+specification of the two widenings. The reason is that, in the current
+implementation, the widenings are not directly applied to the NNC
+polyhedra, but rather to their internal representations.
+Implementation work is in progress and future versions of the library
+may provide an even better integration of the two widenings with the
+domain of NNC polyhedra.
+
+\note
+As is the case for the other operators on polyhedra, the
+implementation overwrites one of the two polyhedra arguments with the
+result of the widening application. To avoid trivial
+misunderstandings, it is worth stressing that if polyhedra \f$\cP\f$
+and \f$\cQ\f$ (where \f$\cP \sseq \cQ\f$) are identified by program
+variables <CODE>p</CODE> and <CODE>q</CODE>, respectively, then the
+call <CODE>q.H79_widening_assign(p)</CODE> will assign the polyhedron
+\f$\cP \widen \cQ\f$ to variable <CODE>q</CODE>.  Namely, it is the
+bigger polyhedron \f$\cQ\f$ which is overwritten by the result of the
+widening. The smaller polyhedron is not modified, so as to lead to an
+easier coding of the usual convergence test
+(\f$\cP \Sseq \cP \widen \cQ\f$ can be coded as <CODE>p.contains(q)</CODE>).
+Note that, in the above context, a call such as
+<CODE>p.H79_widening_assign(q)</CODE> is likely to result in undefined
+behavior, since the precondition \f$\cQ \sseq \cP\f$ will be missed
+(unless it happens that \f$\cP = \cQ\f$).
+The same observation holds for all flavors of widenings and extrapolation
+operators that are implemented in the library and for all the foreign
+language interfaces.
+
+
+\subsection Widening_with_Tokens Widening with Tokens
+
+When approximating a fixpoint computation using widening operators,
+a common tactic to improve the precision of the final result is to delay
+the application of widening operators. The usual approach is to fix
+a parameter \f$k\f$ and only apply widenings starting from the
+\f$k\f$-th iteration.
+
+The library also supports an improved widening delay strategy,
+that we call <EM>widening with tokens</EM> \ref BHRZ03a "[BHRZ03a]".
+A token is a sort of wildcard allowing for the replacement of the widening
+application by the exact upper bound computation: the token is used
+(and thus consumed) only when the widening would have resulted in an
+actual precision loss (as opposed to the <EM>potential</EM> precision loss
+of the classical delay strategy).
+Thus, all widening operators can be supplied with an optional argument,
+recording the number of available tokens, which is decremented when
+tokens are used. The approximated fixpoint computation will start with
+a fixed number \f$k\f$ of tokens, which will be used if and when needed.
+When there are no tokens left, the widening is always applied.
+
+\subsection Extrapolation_Operators Extrapolation Operators
+
+Besides the two widening operators, the library also implements several
+<EM>extrapolation</EM> operators, which differ from widenings in that
+their use along an upper iteration sequence does not ensure convergence
+in a finite number of steps.
+
+In particular, for each of the two widenings there is a corresponding
+<EM>limited</EM> extrapolation operator, which can be used to implement
+the <EM>widening ``up to''</EM> technique as described in
+\ref HPR97 "[HPR97]".
+Each limited extrapolation operator takes a constraint system as an
+additional parameter and uses it to improve the approximation yielded
+by the corresponding widening operator. Note that a convergence guarantee
+can only be obtained by suitably restricting the set of constraints that
+can occur in this additional parameter. For instance, in \ref HPR97 "[HPR97]"
+this set is fixed once and for all before starting the computation of
+the upward iteration sequence.
+
+The <EM>bounded</EM> extrapolation operators further enhance each one
+of the limited extrapolation operators described above, by ensuring
+that their results cannot be worse than the smallest
+\ref bounding_boxes "bounding box" enclosing the two argument polyhedra.
+
+
+\section Bounded_Difference_Shapes Bounded Difference Shapes
+
+For each vector \f$\vect{a} \in \Rset^n\f$ and scalar \f$b \in \Rset\f$,
+and for each relation symbol \f$\mathord{\relsym} \in \{ =, \geq\}\f$,
+the linear constraint \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+is said to be a <EM>bounded difference</EM> if there exist two indices
+\f$i, j \in \{ 0, \ldots, n-1 \}\f$ such that:
+  - \f$a_i, a_j \in \{ -1, 0, 1 \}\f$ and \f$a_i \neq a_j\f$;
+  - \f$a_k = 0\f$, for all \f$k \notin \{ i, j \}\f$.
+
+A convex polyhedron \f$\cP \in \CPset_n\f$ is said to be a
+<EM>bounded difference shape</EM> (BDS, for short) if and only if
+either \f$\cP\f$ can be expressed as the intersection of a finite number
+of bounded difference constraints or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+
+By construction, a BDS is always topologically closed.
+Under the usual set inclusion ordering, the set of all BDSs on the vector
+space \f$\Rset^n\f$ is a lattice having the empty set \f$\emptyset\f$
+and the universe \f$\Rset^n\f$ as the smallest and the biggest elements,
+respectively.
+In theoretical terms, it is a meet sub-lattice of \f$\CPset_n\f$, meaning
+that the intersection of a finite set of BDSs is still a BDS; on the other
+hand, in general the poly-hull of two BDSs is not a BDS. The smallest BDS
+containing a finite set of BDSs is said to be their <EM>bds-hull</EM>.
+
+The PPL provides support for computations on the domain of rational
+bounded difference shapes that, in selected contexts, can achieve a
+better precision/efficiency ratio with respect to the corresponding
+computations on a domain of convex polyhedra.
+As far as the representation of the rational inhomogeneous term of
+each bounded difference is concerned, several <EM>rounding-aware</EM>
+implementation choices are available, including:
+  - bounded precision integer types;
+  - bounded precision floating point types;
+  - unbounded precision integer and rational types, as provided by GMP.
+
+The user interface for BDSs is meant to be as similar as possible to
+the one developed for the domain of closed polyhedra: in particular,
+all operators on polyhedra are also available for the domain of BDSs,
+even though they are typically characterized by a lower degree of precision.
+
+\subsection Widening_and_Extrapolation_Operators_on_BD_Shapes Widening and Extrapolation Operators on BD Shapes
+
+\anchor BHMZ05_widening
+For the domain of BDSs, the library provides a variant of the widening
+operator for convex polyhedra defined in \ref CH78 "[CH78]".
+The implementation follows the specification in \ref BHMZ05 "[BHMZ05]",
+resulting in an operator which is well-defined on the domain of BDSs
+(i.e., it does not depend on the internal representation of BDSs),
+while still ensuring convergence in a finite number of steps.
+
+\anchor CC76_extrapolation
+The library also implements an extension of the widening operator for
+intervals as defined in \ref CC76 "[CC76]". The reader is warned that
+such an extension, even though being well-defined on the domain of BDSs,
+is not provided with a convergence guarantee and is therefore an
+extrapolation operator.
+
+
+\section powerset The Powerset Construction
+
+The PPL provides the finite powerset construction; this takes a
+pre-existing domain and upgrades it to one that can represent
+disjunctive information (by using a <EM>finite</EM> number of
+disjuncts).  The construction follows the approach described in
+\ref Bag98 "[Bag98]", also summarized in \ref BHZ04 "[BHZ04]" where there
+is an account of generic widenings for the powerset domain (some of
+which are supported in the instantiation of this construction by the
+domain of convex polyhedra and described in Section \ref poly_powerset).
+
+\anchor powerset_domain
+\subsection The_Powerset_Domain The Powerset Domain
+
+The domain is built from a pre-existing base-level domain
+\f$D\f$ which must include an entailment relation `\f$\mathord{\entails}\f$',
+meet operation `\f$\mathord{\meet}\f$', a top element `\f$\true\f$' and
+bottom element `\f$\false\f$'.
+
+A set \f$\cS \in \wp(D)\f$ is called <EM>non-redundant</EM>
+with respect to `\f$\mathord{\entails}\f$' if and only if
+\f$\false \notin \cS\f$
+and \f$\forall d_1, d_2 \in \cS \itc d_1 \entails d_2 \implies d_1 = d_2\f$.
+The set of finite non-redundant subsets of \f$D\f$
+(with respect to `\f$\mathord{\entails}\f$')
+is denoted by \f$\wpfn{D}{\entails}\f$.
+The function
+\f$\fund{\nonredmap}{\wpf(D)}{\wpfn{D}{\entails}}\f$,
+called <EM>Omega-reduction</EM>,
+maps a finite set into its non-redundant counterpart;
+it is defined, for each \f$\cS \in \wpf(D)\f$, by
+\f[
+  \nonredmap(\cS)
+    \defeq
+      \cS \setdiff \{\,
+                   d \in \cS
+                 \mid
+                   d = \false \text{ or } \exists d' \in \cS \st d \sentails d'
+                 \,\}.
+\f]
+where \f$d \sentails d'\f$ denotes \f$d \entails d' \land d \ne d'\f$.
+
+As the intended semantics of a powerset domain element \f$\cS \in \wpf(D)\f$
+is that of disjunction of the semantics of \f$D\f$,
+the finite set \f$\cS\f$ is semantically equivalent
+to the non-redundant set \f$\nonredmap(\cS)\f$;
+and elements of \f$\cS\f$ will be called <EM>disjuncts</EM>.
+The restriction to the finite subsets reflects the fact that here
+disjunctions are implemented by explicit collections of disjuncts.
+As a consequence of this restriction, for any \f$\cS \in \wpf(D)\f$
+such that \f$\cS \neq \{ \false \}\f$, \f$\nonredmap(\cS)\f$ is the (finite)
+set of the maximal elements of \f$\cS\f$.
+
+The <EM>finite powerset domain</EM> over a domain \f$D\f$ is the set
+of all finite non-redundant sets of \f$D\f$ and denoted by \f$D_{\smallP}\f$.
+The domain includes an approximation ordering
+`\f$\mathord{\entailsP}\f$' defined so that,
+for any \f$\cS_1\f$ and \f$\cS_2 \in D_{\smallP}\f$,
+\f$\cS_1 \entailsP \cS_2\f$ if and only if
+\f[
+  \forall d_1 \in \cS_1 \itc
+    \exists d_2 \in \cS_2 \st
+      d_1 \entails d_2.
+\f]
+Therefore the top element is \f$\{\true\}\f$ and the bottom element is the
+emptyset.
+
+\note
+As far as Omega-reduction is concerned, the library adopts a
+<EM>lazy</EM> approach: an element of the powerset domain is
+represented by a potentially redundant sequence of disjuncts.
+Redundancies can be eliminated by explicitly invoking the operator
+<CODE>omega_reduce()</CODE>, e.g., before performing the output of a
+powerset element. Note that all the documented operators automatically
+perform Omega-reductions on their arguments, when needed or appropriate.
+
+\section ps_operations Operations on the Powerset Construction
+
+In this section we briefly describe the generic operations on Powerset Domains
+that are provided by the library for any given base-level domain \f$D\f$.
+
+\anchor ps_meet_upper_bound
+\subsection Meet_and_Upper_Bound Meet and Upper Bound
+
+Given the sets \f$\cS_1\f$ and \f$\cS_2 \in D_{\smallP}\f$, the
+<EM>meet</EM> and <EM>upper bound</EM> operators provided by the
+library returns the set
+\f$
+  \nonredmap
+    \bigl(
+      \{\,
+        d_1 \meet d_2
+      \mid
+        d_1 \in \cS_1, d_2 \in \cS_2
+      \,\}
+    \bigr)
+\f$
+and Omega-reduced set union \f$\nonredmap(\cS_1 \union \cS_2)\f$ respectively.
+
+\anchor ps_add_disjunct
+\subsection Adding_a_Disjunct Adding a Disjunct
+
+Given the powerset element \f$\cS \in D_{\smallP}\f$ and the base-level
+element \f$d \in D\f$, the <EM>add disjunct</EM> operator provided by
+the library returns the powerset element
+\f$\nonredmap\bigl(\cS \union \{d\}\bigr)\f$.
+
+\anchor ps_collapse
+\subsection Collapsing_a_Powerset_Element Collapsing a Powerset Element
+
+If the given powerset element is not empty, then the
+<EM>collapse</EM> operator returns the
+singleton powerset consisting of an upper-bound of all the disjuncts.
+
+\section poly_powerset The Polyhedra Powerset Domain
+
+The Polyhedra powerset domain \f$(\Pset_n)_{\smallP}\f$
+provided by the PPL is the finite
+powerset domain (defined in Section \ref powerset) over the domain of
+NNC polyhedra \f$\Pset_n\f$.
+
+In addition to the operations described for the generic powerset
+domain in Section \ref ps_operations, we provide some operations that
+are specific to this instantiation.  Of these, most correspond to the
+application of the equivalent operation on each of the NNC polyhedra
+that are in the given set. Here we just describe those operations that
+are particular to the polyhedra powerset domain.
+
+\anchor pps_geometric
+\subsection Geometric_Comparisons Geometric Comparisons
+
+Given the sets \f$\cS_1, \cS_2 \in (\Pset_n)_{\smallP}\f$, then
+we say that \f$\cS_1\f$ <EM>geometrically covers</EM> \f$\cS_2\f$
+if every point (in some element) in a polyhedron in \f$\cS_2\f$ is also
+a point in a polyhedron in \f$\cS_1\f$.
+If \f$\cS_1\f$ geometrically covers \f$\cS_2\f$
+and \f$\cS_2\f$ geometrically covers \f$\cS_1\f$,
+then we say that they are <EM>geometrically equal</EM>.
+
+\anchor pps_pairwise_merge
+\subsection Pairwise_Merge Pairwise Merge
+
+Given the powerset \f$\cS \in (\Pset_n)_{\smallP}\f$, then the
+<EM>pairwise merge</EM> operator takes pairs of distinct elements in
+\f$\cS\f$ whose poly-hull is the same as their set-theoretical union
+and replaces them by their union.  This replacement is done
+recursively so that, for each pair \f$\cP, \cQ\f$ of distinct
+polyhedra in the result set, we have
+\f$\cP \uplus \cQ \neq \cP \union \cQ\f$.
+
+\anchor pps_bgp99_extrapolation
+\subsection Powerset_Extrapolation_Operators Extrapolation Operators
+
+The library implements a generalization of the extrapolation operator
+for powerset domains proposed in \ref BGP99 "[BGP99]".
+The operator <CODE>BGP99_extrapolation_assign</CODE> is made parametric
+by allowing for the specification of a base-level extrapolation operator
+different from the H79 widening (e.g., the BHRZ03 widening can be used).
+Note that, in the general case, this operator cannot guarantee the
+convergence of the iteration sequence in a finite number of steps
+(for a counter-example, see \ref BHZ04 "[BHZ04]").
+
+\anchor pps_certificate_widening
+\subsection Certificate_Based_Widenings Certificate-Based Widenings
+
+The PPL library provides support for the specification of proper widening
+operators on the powerset domain of convex polyhedra. In particular,
+this version of the library implements an instance of the
+<EM>certificate-based widening framework</EM> proposed in
+\ref BHZ03b "[BHZ03b]".
+
+A <EM>finite convergence certificate</EM> for an extrapolation operator
+is a formal way of ensuring that such an operator is indeed a widening
+on the considered domain. Given a widening operator on the base-level
+domain, together with the corresponding convergence certificate,
+the BHZ03 framework shows how it is possible to lift this widening
+so as to work on the finite powerset domain, while still ensuring
+convergence in a finite number of iterations.
+
+Being highly parametric, the BHZ03 widening framework can be
+instantiated in many ways. The current implementation provides
+the templatic operator
+<CODE>BHZ03_widening_assign\<Certificate, Widening\></CODE>
+which only exploits a fraction of this generality, by allowing the
+user to specify the base-level widening function and the corresponding
+certificate. The widening strategy is fixed and uses two extrapolation
+heuristics: first, the least upper bound is tried; second, the
+\ref pps_bgp99_extrapolation "BGP99 extrapolation operator" is tried,
+possibly applying
+\ref pps_pairwise_merge "pairwise merging".
+If both heuristics fail to converge according to the convergence
+certificate, then an attempt is made to apply the base-level widening
+to the poly-hulls of the two arguments, possibly improving the result
+obtained by means of the \ref Convex_Polyhedral_Difference "poly-difference"
+operator.
+For more details and a justification of the overall approach,
+see \ref BHZ03b "[BHZ03b]" and \ref BHZ04 "[BHZ04]".
+
+The library provides two convergence certificates: while
+\ref Parma_Polyhedra_Library::BHRZ03_Certificate "BHRZ03_Certificate"
+is compatible with both the BHRZ03 and the H79 widenings,
+\ref Parma_Polyhedra_Library::H79_Certificate "H79_Certificate"
+is only compatible with the latter.
+Note that using different certificates will change the results obtained,
+even when using the same base-level widening operator.
+It is also worth stressing that it is up to the user
+to see that the widening operator is actually compatible with
+a given convergence certificate. If such a requirement is not met,
+then an extrapolation operator will be obtained.
+
+\section sect_rational_grids Rational Grids
+
+In this section we introduce rational grids
+as provided by the library.
+See also \ref BDHMZ05 "[BDHMZ05]" for a detailed description of this domain.
+
+The libary supports two representations for the grids domain;
+<EM>congruence systems</EM> and <EM>grid generator systems</EM>.
+We first describe <EM>linear congruence relations</EM> which form the elements
+of a congruence system.
+
+\subsection Congruence_Relations Congruences and Congruence Relations
+
+For any \f$a, b, f \in \Rset\f$,
+\f$a \equiv_f b\f$ denotes the <EM>congruence</EM>
+\f$\exists \mu \in \Zset \st a - b = \mu f\f$.
+
+Let \f$\Sset \in \{ \Qset, \Rset \}\f$.
+For each vector
+\f$\vect{a} \in \Sset^n \setdiff \{\vect{0}\}\f$ and scalars
+\f$b, f \in \Sset\f$,
+the notation \f$\langle \vect{a}, \vect{x} \rangle \equiv_f b\f$
+stands for the <EM>linear congruence relation in \f$\Sset^n\f$</EM>
+defined by the set of vectors
+\f[
+  \bigl\{\,
+    \vect{v} \in \Rset^n
+  \bigm|
+    \exists \mu \in \Zset \st
+      \langle \vect{a}, \vect{v} \rangle = b + \mu f
+  \,\bigr\};
+\f]
+when \f$f \neq 0\f$, the relation is said to be
+<EM>proper</EM>;
+\f$\langle \vect{a}, \vect{x} \rangle \equiv_0 b\f$ (i.e., when \f$f = 0\f$)
+denotes the equality \f$\langle \vect{a}, \vect{x} \rangle = b\f$.
+\f$f\f$ is called the <EM>frequency</EM> or <EM>modulus</EM> and
+\f$b\f$ the <EM>base value</EM> of the relation.
+Thus, provided \f$\vect{a} \neq \vect{0}\f$,
+the relation \f$\langle \vect{a}, \vect{x} \rangle \equiv_f b\f$
+defines the set of affine hyperplanes
+\f[
+  \big\{\,
+    \bigl(\langle \vect{a}, \vect{x} \rangle = b + \mu f\bigr)
+  \bigm|
+    \mu \in \Zset
+  \,\bigr\};
+\f]
+if \f$b \equiv_f 0\f$, \f$\langle \vect{0}, \vect{x} \rangle \equiv_f b\f$
+defines the universe \f$\Rset^n\f$ and the empty set, otherwise.
+
+\subsection Rational_Grids Rational Grids
+
+The set \f$\cL  \sseq \Rset^n\f$ is a <EM>rational grid</EM>
+if and only if either \f$\cL\f$ is the set of vectors in
+\f$\Rset^n\f$ that satisfy
+a finite system \f$\cC\f$ of congruence relations in \f$\Qset^n\f$
+or \f$n = 0\f$ and \f$\cL = \emptyset\f$.
+
+We also say that  <EM>\f$\cL\f$ is described by \f$\cC\f$</EM>
+and that <EM>\f$\cC\f$ is a congruence system for \f$\cL\f$</EM>.
+
+The <EM>grid domain</EM> \f$\Gset_{n}\f$ is the set of all rational grids
+described by finite sets of congruence relations in \f$\Qset^n\f$.
+
+If the congruence system \f$\cC\f$ describes the \f$\emptyset\f$,
+the <EM>empty</EM> grid,
+then we say that \f$\cC\f$ is <EM>inconsistent</EM>.
+For example, the congruence systems
+\f$\bigl\{\langle\vect{0}, \vect{x}\rangle \equiv_0 1\bigr\}\f$
+meaning that \f$0 = 1\f$ and
+\f$\bigl\{\langle\vect{a}, \vect{x}\rangle \equiv_2 0,
+     \langle\vect{a}, \vect{x}\rangle \equiv_2 1\bigr\}\f$,
+for any \f$\vect{a} \in \Rset^n\f$,
+meaning that the value of an expression must be both even and odd
+are both inconsistent since both describe the empty grid.
+
+When ordering grids by the set inclusion relation,
+the empty set \f$\emptyset\f$ and the vector space \f$\Rset^n\f$
+(which is described by the empty set of congruence relations)
+are, respectively, the smallest and the biggest elements of
+\f$\Gset_n\f$.
+The vector space \f$\Rset^n\f$ is also called the <EM>universe</EM> grid.
+
+In set theoretical terms,
+\f$\Gset_n\f$ is a <EM>lattice</EM> under set inclusion.
+
+\subsection Integer_Combinations Integer Combinations
+
+Let \f$S = \{ \vect{x}_1, \ldots, \vect{x}_k \} \sseq \Rset^n\f$
+be a finite set of vectors.
+For all scalars \f$\mu_1, \ldots, \mu_k \in \Zset\f$,
+the vector \f$\vect{v} = \sum_{j=1}^k \mu_j \vect{x}_j\f$
+is said to be a <EM>integer</EM> combination of the vectors in \f$S\f$.
+
+We denote by \f$\inthull(S)\f$
+(resp., \f$\intaffinehull(S)\f$)
+the set of all the integer (resp., integer and affine)
+combinations of the vectors in \f$S\f$.
+
+\subsection Points_Parameters_Lines Points, Parameters and Lines
+
+Let \f$\cL\f$ be a grid.
+Then
+- a vector \f$\vect{p} \in \cL\f$ is called a <EM>point</EM> of \f$\cL\f$;
+- a vector \f$\vect{q} \in \Rset^n\f$, where \f$\vect{q} \neq \vect{0}\f$,
+  is called a <EM>parameter</EM> of \f$\cL\f$
+  if \f$\cL \neq \emptyset\f$ and \f$\vect{p} + \mu \vect{q} \in \cL\f$,
+  for all points \f$\vect{p} \in \cL\f$ and all \f$\mu \in \Zset\f$;
+- a vector \f$\vect{l} \in \Rset^n\f$ is called a <EM>line</EM> of \f$\cL\f$
+  if \f$\cL \neq \emptyset\f$ and \f$\vect{p} + \lambda \vect{l} \in \cL\f$,
+  for all points \f$\vect{p} \in \cL\f$ and all \f$\lambda \in \Rset\f$.
+
+
+\subsection Grid_Generator_Representation The Grid Generator Representation
+
+We can generate any rational grid in \f$\Gset_n\f$
+from a finite subset of its points, parameters and lines;
+each point in a grid is obtained by adding a linear combination of
+its generating lines to an integral combination of its parameters
+and an integral affine combination of its generating points.
+
+If \f$L, Q, P\f$ are each finite subsets of \f$\Qset^n\f$ and
+\f[
+  \cL = \linearhull(L) + \inthull(Q) + \intaffinehull(P)
+\f]
+where the symbol '\f$+\f$' denotes the Minkowski's sum,
+then \f$\cL \in \Gset_n\f$ is a rational grid
+(see Section 4.4 in \ref Sch99 "[Sch99]" and
+also Proposition 8 in \ref BDHMZ05 "[BDHMZ05]").
+The 3-tuple \f$(L, Q, P)\f$
+is said to be a <EM>generator system</EM> for \f$\cL\f$
+and we write \f$\cL = \ggen(L, Q, P)\f$.
+
+Note that the grid \f$\cL = \ggen(L, Q, P) = \emptyset\f$
+if and only if the set of points \f$P = \emptyset\f$.
+If \f$P \neq \emptyset\f$, then
+\f$\cL = \ggen(L, \emptyset, Q_{\vect{p}} \union P)\f$
+where, for some \f$\vect{p} \in P\f$,
+\f$Q_{\vect{p}} = \{\, \vect{p} + \vect{q} \mid \vect{q} \in Q \,\}\f$.
+
+\subsection Grid_Minimized_Representations Minimized Grid Representations
+
+A <EM>minimized</EM> congruence system \f$\cC\f$ for \f$\cL\f$
+is such that, if \f$\cC'\f$ is another congruence system for \f$\cL\f$,
+then \f$\card \cC \leq \card \cC'\f$.
+Note that a minimized congruence system for a non-empty grid
+has at most \f$n\f$ congruence relations.
+
+Similarly, a <EM>minimized</EM> generator system
+\f$\cG = (L, Q, P)\f$ for \f$\cL\f$
+is such that, if \f$\cG' = (L', Q', P')\f$ is
+another generator system for \f$\cL\f$,
+then \f$\card L \leq \card L'\f$ and
+\f$\card Q + \card P \leq \card Q' + \card P'\f$.
+Note that a minimized generator system for a grid
+has no more than a total of \f$n+1\f$ lines, parameters and points.
+
+\subsection Grids_Double_Description_Grids Double Description for Grids
+
+As for convex polyhedra, any grid \f$\cL\f$ can be described by using
+a congruence system \f$\cC\f$ for \f$\cL\f$,
+a generator system \f$\cG\f$ for \f$\cL\f$, or
+both by means of the <EM>double description pair (DD pair)</EM>
+\f$(\cC, \cG)\f$.
+The <EM>double description method</EM> for grids is a collection of
+theoretical results very similar to those for convex polyhedra showing that,
+given one kind of representation, there are algorithms
+for computing a representation of the other kind
+and for minimizing both representations.
+
+As for convex polyhedra, such changes of representation form a key step
+in the implementation of many operators on grids such as, for example,
+intersection and grid join.
+
+\subsection Grid_Space_Dimensions Space Dimensions and Dimension-compatibility for Grids
+
+The <EM>space dimension</EM> of a grid \f$\cL \in \Gset_n\f$
+is the dimension
+\f$n \in \Nset\f$ of the corresponding vector space \f$\Rset^n\f$.
+The space dimension of congruence relations, generators and other objects
+of the library is defined similarly.
+
+\subsection Grid_Affine_Dimension Affine Independence and Affine Dimension for Grids
+
+A <EM>non-empty</EM> grid \f$\cL \in \Gset_n\f$ has
+<EM>affine dimension</EM> \f$k \in \Nset\f$, denoted by \f$\pdim(\cG) = k\f$,
+if the maximum number of affinely independent points in \f$\cG\f$ is
+\f$k + 1\f$.
+The affine dimension of an empty grid is defined to be 0.
+Thus we have \f$0 \leq \pdim(\cG) \leq n\f$.
+
+\section rational_grid_operations Operations on Rational Grids
+
+In this section we briefly describe operations on rational grids
+that are provided by the library.
+These are similar to those described in Section \ref Operations_on_Convex_Polyhedra.
+
+\subsection Grid_Intersection_and_Join Grid Intersection and Grid Join
+
+For any pair of grids \f$\cL_1, \cL_2 \in \Gset_n\f$,
+the <EM>intersection</EM> of \f$\cL_1\f$ and \f$\cL_2\f$,
+defined as the set intersection \f$\cL_1 \inters \cL_2\f$,
+is the largest grid included in both \f$\cL_1\f$ and \f$\cL_2\f$;
+similarly, the <EM>grid join</EM>
+of \f$\cL_1\f$ and \f$\cL_2\f$, denoted by \f$\cL_1 \uplus \cL_2\f$,
+is the smallest grid that includes both
+\f$\cL_1\f$ and \f$\cL_2\f$.
+
+In theoretical terms,
+the intersection and grid join operators defined above
+are the binary <EM>meet</EM> and the binary <EM>join</EM>
+operators on the lattice \f$\Gset_n\f$.
+
+\subsection Grid_Difference Grid Difference
+
+For any pair of grids \f$\cL_1, \cL_2 \in \Gset_n\f$,
+the <EM>grid difference</EM>
+of \f$\cL_1\f$ and \f$\cL_2\f$ is defined as the smallest
+grid containing the set-theoretic difference
+of \f$\cL_1\f$ and \f$\cL_2\f$.
+
+\subsection Grid_Concatenate Concatenating Grids
+
+Viewing a grid as a set of tuples (its points), it is sometimes
+useful to consider the set of tuples obtained by concatenating
+an ordered pair of grids.
+Formally, the <EM>concatenation</EM> of the grids
+\f$\cL_1 \in \Gset_n\f$ and \f$\cL_2 \in \Gset_m\f$ (taken in this order)
+is the grid in \f$\Gset_{n+m}\f$ defined as
+\f[
+      \Bigl\{\,
+        (x_0, \ldots, x_{n-1}, y_0, \ldots, y_{m-1})^\transpose
+          \in \Rset^{n+m}
+      \Bigm|
+        (x_0, \ldots, x_{n-1})^\transpose \in \cL_1,
+        (y_0, \ldots, y_{m-1})^\transpose \in \cL_2
+      \,\Bigl\}.
+\f]
+Another way of seeing it is as follows: first embed grid \f$\cL_1\f$
+into a vector space of dimension \f$n+m\f$ and then add a suitably
+renamed-apart version of the congruence relations defining \f$\cL_2\f$.
+
+\subsection  Grid_Add_Space_Dimensions Adding New Dimensions to the Vector Space
+
+The library provides two operators for adding a number \f$i\f$ of
+space dimensions to a grid \f$\cL \in \Gset_n\f$,
+therefore transforming it into a new grid in
+\f$\Gset_{n+i}\f$.
+In both cases, the added dimensions of the vector space
+are those having the highest indices.
+
+The operator <CODE>add_space_dimensions_and_embed</CODE>
+\e embeds the grid \f$\cL\f$ into the new vector space of
+dimension \f$i+n\f$ and returns the grid
+defined by all and only the congruences defining \f$\cL\f$
+(the variables corresponding to the added dimensions are unconstrained).
+For instance, when starting from a grid \f$\cL \sseq \Rset^2\f$
+and adding a third space dimension, the result will be the grid
+\f[
+   \bigl\{\,
+         (x_0, x_1, x_2)^\transpose \in \Rset^3
+       \bigm|
+         (x_0, x_1)^\transpose \in \cL
+       \,\bigr\}.
+\f]
+
+In contrast, the operator  <CODE>add_space_dimensions_and_project</CODE>
+\e projects the grid \f$\cL\f$ into the new vector space of
+dimension \f$i+n\f$ and returns the grid
+whose congruence system, besides the congruence relations defining \f$\cL\f$,
+will include additional equalities on the added dimensions.
+Namely, the corresponding variables are all constrained to be equal to 0.
+For instance, when starting from a grid \f$\cL \sseq \Rset^2\f$
+and adding a third space dimension, the result will be the grid
+\f[
+  \bigl\{\,
+          (x_0, x_1, 0)^\transpose \in \Rset^3
+        \bigm|
+          (x_0, x_1)^\transpose \in \cL
+        \,\bigr\}.
+\f]
+
+\subsection Grid_Remove_Space_Dimensions Removing Dimensions from the Vector Space
+
+The library provides two operators for removing
+space dimensions from a grid \f$\cL \in \Gset_n\f$,
+therefore transforming it into a new grid in
+\f$\Gset_m\f$ where \f$m \leq n\f$.
+
+Given a set of variables, the operator <CODE>remove_space_dimensions</CODE>
+removes all the space dimensions specified by the variables in the set.
+
+Given a space dimension \f$m\f$ less than or equal to that of the grid,
+the operator <CODE>remove_higher_space_dimensions</CODE> removes
+the space dimensions having indices greater than or equal to \f$m\f$.
+
+\subsection Grid_Map_Space_Dimensions Mapping the Dimensions of the Vector Space
+
+The operator <CODE>map_space_dimensions</CODE> provided by the library
+maps the dimensions of the vector space \f$\Rset^n\f$ according
+to a partial injective function \f$\pard{\rho}{\{0, \ldots, n-1\}}{\Nset}\f$
+such that
+\f[
+  \rho\bigl(\{0, \ldots, n-1\}\bigr) = \{0, \ldots, m-1\}
+\f]
+with \f$m \leq n\f$.
+Dimensions corresponding to indices that are not mapped
+by \f$\rho\f$ are removed.
+
+If \f$m = 0\f$, i.e., if the function \f$\rho\f$ is undefined everywhere,
+then the operator projects the argument grid \f$\cL \in \Gset_n\f$
+onto the zero-dimension space \f$\Rset^0\f$;
+otherwise the result is a grid in \f$\Gset_m\f$ given by
+\f[
+      \Bigl\{\,
+        \bigl(v_{\rho^{-1}(0)}, \ldots, v_{\rho^{-1}(m-1)}\bigr)^\transpose
+      \Bigm|
+        (v_0, \ldots, v_{n-1})^\transpose \in \cL
+      \,\Bigr\}.
+\f]
+
+\subsection Grid_Expand_Space_Dimension Expanding One Dimension of the Vector Space to Multiple Dimensions
+
+The operator <CODE>expand_space_dimension</CODE> provided by the library
+adds \f$m\f$ new space dimensions to a grid \f$\cL \in \Gset_n\f$,
+with \f$n > 0\f$, so that dimensions
+\f$n\f$, \f$n+1\f$, \f$\ldots\f$, \f$n+m-1\f$
+of the resulting grid are exact copies of the \f$i\f$-th space dimension
+of \f$\cL\f$.  More formally, the result is a grid in \f$\Gset_m\f$ given by
+\f[
+      \sset{
+        \vect{u} \in \Rset^{n+m}
+      }{
+        \exists \vect{v}, \vect{w} \in \cL
+          \st u_i = v_i \\
+          \qquad \mathord{} \land \forall j = n, n+1, \ldots, n+m-1
+                                     \itc u_j = w_i \\
+          \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+                                     \itc k \neq i \implies u_k = v_k = w_k
+      }.
+\f]
+
+\subsection Grid_Fold_Space_Dimensions Folding Multiple Dimensions of the Vector Space into One Dimension
+
+The operator <CODE>fold_space_dimensions</CODE> provided by the library,
+given a grid \f$\cL \in \Gset_n\f$, with \f$n > 0\f$,
+folds a subset \f$J\f$ of the set of space dimensions \f$\{0, \ldots, n-1\}\f$
+into a space dimension \f$i < n\f$, where \f$i \notin J\f$.
+Letting \f$m = \card J\f$, the result is given by the grid join
+\f[
+  \cL_0 \uplus \cdots \uplus \cL_m
+\f]
+where
+\f[
+  \cL_m
+    \defeq
+      \sset{
+        \vect{u} \in \Rset^{n-m}
+      }{
+        \exists \vect{v} \in \cL
+          \st u_{i'} = v_i \\
+          \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+                                     \itc k \neq i \implies u_{k'} = v_k
+      },
+\f]
+for \f$ d = 0 \f$, \f$ \ldots \f$, \f$ m-1 \f$,
+\f[
+  \cL_d
+    \defeq
+      \sset{
+        \vect{u} \in \Rset^{n-m}
+      }{
+        \exists \vect{v} \in \cL
+          \st u_{i'} = v_{j_d} \\
+          \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+                                     \itc k \neq i \implies u_{k'} = v_k
+      }
+\f]
+and, for \f$ k = 0 \f$, \f$ \ldots \f$, \f$ n-1 \f$,
+\f[
+  k'
+    \defeq
+      k - \card \{\, j \in J \mid k > j \,\}.
+\f]
+
+\subsection Grid_Affine_Transformation Affine Images and Preimages
+
+As for convex polyhedra (see \ref Single_Update_Affine_Functions
+"Single-Update Affine Functions"),
+the library provides affine image and preimage operators for grids:
+given a variable \f$x_k\f$ and
+linear expression \f$\mathrm{expr} = \langle \vect{a}, \vect{x} \rangle + b\f$,
+these determine the affine transformation
+\f$\fund{\phi = \bigl(x'_k = \langle \vect{a}, \vect{x} \rangle + b\bigr)}
+        {\Rset^n}{\Rset^n}\f$
+that transforms any point
+\f$(v_0, \ldots, v_{n-1})^\transpose\f$
+in a grid \f$\cL\f$ to
+\f[
+   \Bigl(v_0, \ldots, \bigl(\textstyle{\sum_{i=0}^{n-1}} a_i v_i + b\bigr),
+                   \ldots, v_{n-1}\Bigr)^\transpose.
+\f]
+
+The <EM>affine image</EM> operator computes the affine image
+of a grid \f$\cL\f$ under
+\f$x'_k = \langle \vect{a}, \vect{x} \rangle + b\f$.
+For instance,
+suppose the grid \f$\cL\f$
+to be transformed is the non-relational grid in \f$\Rset^2\f$
+generated by the set of points
+\f$\bigl\{
+     (0, 0)^\transpose,
+     (0, 3)^\transpose,
+     (3, 0)^\transpose
+   \bigr\}\f$.
+Then, if the considered variable is \f$x_0\f$ and
+the linear expression is \f$3x_0 + 2 x_1 + 1\f$
+(so that \f$k = 0\f$, \f$a_0 = 3, a_1 = 2, b = 1\f$),
+the affine image operator will translate \f$\cL\f$
+to the grid \f$\cL_1\f$ generated by the set of points
+\f$\bigl\{
+     (1, 0)^\transpose,
+     (7, 3)^\transpose,
+     (10, 0)^\transpose
+   \bigr\}\f$
+which is the grid generated by the point \f$(1, 0)\f$
+and parameters \f$(3, -3), (0, 9)\f$; or, alternatively defined by the
+congruence system \f$\{x \equiv_3 1, x + y \equiv_9 1\}\f$.
+If the considered variable is as before (i.e., \f$k = 0\f$)
+but the linear expression is  \f$x_1\f$
+(so that \f$a_0 = 0, a_1 = 1, b = 0\f$),
+then the resulting grid \f$\cL_2\f$
+is the grid containing all the points
+whose coordinates are integral multiples of 3 and lie on
+line \f$x = y\f$.
+
+The affine preimage operator computes the affine preimage
+of a grid \f$\cL\f$ under \f$\phi\f$.
+For instance,
+suppose now that we apply the affine
+preimage operator as given in the first example
+using variable \f$x_0\f$
+and linear expression \f$3x_0 + 2 x_1 + 1\f$
+to the grid \f$\cL_1\f$;
+then we get the original grid \f$\cL\f$ back.
+If, on the other hand, we apply the affine
+preimage operator as given in the second example
+using variable \f$x_0\f$ and linear expression \f$x_1\f$ to \f$\cL_2\f$,
+then the resulting grid will consist of
+all the points in \f$\Rset^2\f$ where the \f$y\f$
+coordinate is an integral multiple of 3.
+
+Observe that provided the coefficient \f$a_k\f$ of the considered variable
+in the linear expression is non-zero, the affine transformation is invertible.
+
+\subsection Grid_Generalized_Image Generalized Affine Images
+
+Similarly to convex polyhedra (see \ref Generalized_Affine_Relations
+"Generalized Affine Relations"), the library provides two other grid operators
+that are generalizations of the single update affine image and
+preimage operators for grids.
+The <EM>generalized affine image</EM> operator
+\f$\fund{\phi = (\mathrm{lhs}', \mathrm{rhs}, f)}{\Rset^n}{\Rset^n}\f$, where
+\f$\mathrm{lhs} = \langle \vect{c}, \vect{x} \rangle + d\f$ and
+\f$\mathrm{rhs} = \langle \vect{a}, \vect{x} \rangle + b\f$
+are affine expressions and \f$f \in \Qset\f$, is defined as
+\f[
+  \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^n
+    \itc
+      (\vect{v}, \vect{w}) \in \phi
+        \iff
+          \bigl(
+            \langle \vect{c}, \vect{w} \rangle + d
+              \equiv_f \langle \vect{a}, \vect{v} \rangle + b
+          \bigr)
+            \land
+          \Bigl(
+            \bigland_{0 \leq i < n, c_i = 0}
+              w_i = v_i
+          \Bigr).
+\f]
+Note that, when \f$\mathrm{lhs} = x_k\f$ and \f$f = 0\f$,
+so that the transfer function is an equality,
+then the above operator
+is equivalent to the application of the standard affine image
+of \f$\cL\f$ with respect to the variable \f$x_k\f$ and the
+affine expression \f$\mathrm{rhs}\f$.
+
+\subsection Grid_Time_Elapse Time-Elapse Operator
+
+For any two grids \f$\cL_1, \cL_2 \in \Gset_n\f$,
+the <EM>time-elapse</EM> between \f$\cL_1\f$ and \f$\cL_2\f$,
+denoted \f$ \cL_1 \nearrow \cL_2\f$,
+is the grid
+\f[
+  \bigl\{\,
+    \vect{p} + \mu \vect{q} \in \Rset^n
+  \bigm|
+    \vect{p} \in \cL_1, \vect{q} \in \cL_2, \mu \in \Zset
+  \,\bigr\}.
+\f]
+
+\subsection Grid_Relation_With Relation-with Operators
+
+The library provides operators for checking the relation holding
+between a grid  and
+either a congruence or a generator.
+
+Suppose \f$\cL\f$ is a grid
+and \f$\cC\f$ an arbitrary congruence system representing \f$\cL\f$.
+Suppose also that
+\f$
+  \cg = \bigl(
+        \langle \vect{a}, \vect{x} \rangle \equiv_f b
+      \bigr)
+\f$
+is a congruence relation
+with \f$\cL_{\cg} = \gcon\bigl(\{\cg\}\bigr)\f$.
+The possible relations between \f$\cL\f$ and \f$\cg\f$ are as follows.
+- \f$\cL\f$ <EM>is disjoint</EM> from \f$\cg\f$ if
+  \f$\cL \inters \cL_{\cg} = \emptyset\f$; that is, adding \f$\cg\f$
+  to \f$\cC\f$ gives us the empty grid.
+- \f$\cL\f$ <EM>strictly intersects</EM> \f$\cg\f$ if
+  \f$\cL \inters \cL_{\cg} \neq \emptyset\f$ and
+  \f$\cL \inters \cL_{\cg} \subset \cL\f$;
+  that is, adding \f$\cg\f$ to \f$\cC\f$
+  gives us a non-empty grid strictly smaller than \f$\cL\f$.
+- \f$\cL\f$ <EM>is included</EM> in \f$\cg\f$ if \f$\cL \sseq \cL_{\cg}\f$;
+  that is, adding \f$\cg\f$ to \f$\cC\f$ leaves \f$\cL\f$ unchanged.
+
+A grid \f$\cL\f$ <EM>subsumes</EM> a generator \f$g\f$ if
+adding \f$g\f$ to any generator system representing \f$\cL\f$
+does not change \f$\cL\f$.
+
+\subsection Rectilinear_Grids Rectilinear Grids and Covering Boxes
+
+Consider again the  \ref bounding_boxes "boxes" used for convex polyhedra.
+An \f$n\f$-dimensional <EM>rational box</EM> is a box
+\f$\cB\f$ in \f$\Qset^n\f$;
+that is, where the bounded bounds in the intervals are each in \f$\Qset\f$.
+We will say that an interval is <EM>bounded</EM> if both its bounds
+are bounded.
+
+Each bounded interval in \f$\cB\f$ determines a congruence \f$\cg\f$
+in \f$\Qset^n\f$.
+Letting \f$\vect{e}_i = (0, \ldots, 1, \ldots, 0)^\transpose\f$
+be the vector in \f$\Rset^n\f$ with 1 in the \f$i\f$'th position
+and zeroes in every other position;
+if both the bounds of the interval
+are closed, then the congruence \f$\cg\f$ is defined as
+\f$\bigl(\langle \vect{e}_i, \vect{x}  \rangle \equiv_f b\bigr)\f$,
+where \f$b\f$ is the value of the lower bound and
+\f$f\f$ is the (non-negative) difference between the lower and upper bounds.
+If one of the bounds is open,
+then \f$\cg\f$ is the congruence
+\f$\bigl(\langle \vect{0}, \vect{x}  \rangle \equiv_0 1\bigr)\f$
+representing the inconsistent equality \f$(0 = 1)\f$.
+
+Let \f$\cC\f$ be the set of congruences defined by
+the bounded intervals in a rational box \f$\cB\f$;
+then we say that \f$B\f$ <EM>represents</EM> the rational grid
+\f$\cL = \gcon(\cC)\f$.
+Any grid \f$\cL \in \Gset_n\f$ that can be represented by
+a box is said to be <EM>rectilinear</EM>.
+
+A <EM>covering box</EM> of a grid \f$\cL\f$ is a rational box
+representing the smallest rectilinear grid that contains \f$\cL\f$.
+
+As for convex polyhedra, the library will provide
+operations for computing the rectilinear grid corresponding to a given box
+and, also, a covering box for any given grid.
+
+\subsection Grid_Widening Widening Operators
+
+The library provides a <EM>grid widening</EM> operator for the domain of grids.
+This follows the specification provided in \ref BDHMZ05 "[BDHMZ05]".
+Note that, as for the widenings provided for convex polyhedra,
+the widening \f$\cL_1 \widen \cL_2\f$ of two
+grids \f$\cL_1, \cL_2 \in \Gset_n\f$ requires as a precondition that
+\f$\cL_1 \sseq \cL_2\f$.
+
+\note
+As is the case for the other operators on grids, the
+implementation overwrites one of the two grid arguments with the
+result of the widening application.
+It is worth stressing that, if grid \f$\cL_1\f$
+and \f$\cL_2\f$ (where \f$\cL_1 \sseq \cL_2\f$) are identified by program
+variables <CODE>l_1</CODE> and <CODE>l_2</CODE>, respectively, then the
+call <CODE>l_2.grid_widening_assign(l_1)</CODE> will assign the grid
+\f$\cL_1 \widen \cL_2\f$ to variable <CODE>l_2</CODE>.  Namely, it is the
+bigger grid\f$\cL_2\f$ which is overwritten by the result of the
+widening. The smaller grid is not modified.
+The same observation holds for all flavors of widenings and extrapolation
+operators that are implemented in the library and for all the foreign
+language interfaces.
+
+\subsection Grid_Widening_with_Tokens Widening with Tokens
+
+This will be as for \ref Widening_with_Tokens "widening with tokens"
+for convex polyhedra.
+
+\subsection Grid_Extrapolation Extrapolation Operators
+
+Besides the two widening operators, the library also implements several
+<EM>extrapolation</EM> operators, which differ from widenings in that
+their use along an upper iteration sequence does not ensure convergence
+in a finite number of steps.
+
+In particular, for each grid widening that is provided,
+there is a corresponding
+<EM>limited</EM> extrapolation operator, which can be used to implement
+the <EM>widening ``up to''</EM> technique as described in
+\ref HPR97 "[HPR97]".
+Each limited extrapolation operator takes a congruence system as an
+additional parameter and uses it to improve the approximation yielded
+by the corresponding widening operator. Note that,
+as in the case for convex polyhedra, a convergence guarantee
+can only be obtained by suitably restricting the set of
+congruence relations that can occur in this additional parameter.
+
+The <EM>bounded</EM> extrapolation operators further enhance each one
+of the limited extrapolation operators described above, by ensuring
+that their results cannot be worse than the smallest
+\ref Rectilinear_Grids "rectilinear grid" that contains the two argument grids.
+
+\section use_of_library Using the Library
+
+\subsection A_Note_on_the_Implementation_of_the_Operators A Note on the Implementation of the Operators
+
+When adopting the double description method for the representation of
+convex polyhedra, the implementation of most of the operators may
+require an explicit conversion from one of the two representations
+into the other one, leading to algorithms having a worst-case
+exponential complexity.  However, thanks to the adoption of lazy and
+incremental computation techniques, the library turns out to be rather
+efficient in many practical cases.
+
+In earlier versions of the library, a number of operators were introduced
+in two flavors: a <EM>lazy</EM> version and an <EM>eager</EM> version,
+the latter having the operator name ending with <CODE>_and_minimize</CODE>.
+In principle, only the lazy versions should be used.
+The eager versions were added to help a knowledgeable user obtain better
+performance in particular cases. Basically, by invoking the eager version
+of an operator, the user is trading laziness to better exploit the
+incrementality of the inner library computations.
+Starting from version 0.5, the lazy and incremental computation techniques
+have been refined to achieve a better integration: as a consequence,
+the lazy versions of the operators are now almost always more efficient
+than the eager versions.
+
+One of the cases when an eager computation still makes sense is when
+the well-known <EM>fail-first</EM> principle comes into play.
+For instance, if you have to compute the intersection of several
+polyhedra and you strongly suspect that the result will become empty
+after a few of these intersections, then you may obtain a better
+performance by calling the eager version of the intersection operator,
+since the minimization process also enforces an emptiness check.
+Note anyway that the same effect can be obtained by interleaving
+the calls of the lazy operator with explicit emptiness checks.
+
+\subsection On_Object_Orientation_and_Polymorphism_A_Disclaimer On Object-Orientation and Polymorphism: A Disclaimer
+
+The PPL library is mainly a collection of so-called ``concrete data
+types'': while providing the user with a clean and friendly interface,
+these types are not meant to --- i.e., they should not --- be used
+polymorphically (since, e.g., most of the destructors are not declared
+<CODE>virtual</CODE>). In practice, this restriction means that the
+library types should not be used as <EM>public base classes</EM> to be
+derived from. A user willing to extend the library types, adding new
+functionalities, often can do so by using <EM>containment</EM> instead
+of inheritance; even when there is the need to override a
+<CODE>protected</CODE> method, non-public inheritance should suffice.
+
+\subsection On_Const_Correctness_A_Warning_about_the_Use_of_References_and_Iterators On Const-Correctness: A Warning about the Use of References and Iterators
+
+Most operators of the library depend on one or more parameters
+that are declared ``const'', meaning that they will not be changed
+by the application of the considered operator.
+Due to the adoption of lazy computation techniques, in many cases
+such a const-correctness guarantee only holds at the semantic level,
+whereas it does not necessarily hold at the implementation level.
+For a typical example, consider the extraction from a polyhedron
+of its constraint system representation.
+While this operation is not going to change the polyhedron,
+it might actually invoke the internal conversion algorithm
+and modify the generators representation of the polyhedron object,
+e.g., by reordering the generators and removing those that are
+detected as redundant. Thus, any previously computed reference
+to the generators of the polyhedron (be it a direct reference object
+or an indirect one, such as an iterator) will no longer be valid.
+For this reason, code fragments such as the following should be
+avoided, as they may result in undefined behavior:
+\code
+// Find a reference to the first point of the non-empty polyhedron `ph'.
+const Generator_System& gs = ph.generators();
+Generator_System::const_iterator i = gs.begin();
+for (Generator_System::const_iterator gs_end = gs.end(); i != gs_end; ++i)
+  if (i->is_point())
+    break;
+const Generator& p = *i;
+// Get the constraints of `ph'.
+const Constraint_System& cs = ph.constraints();
+// Both the const iterator `i' and the reference `p'
+// are no longer valid at this point.
+cout << p.divisor() << endl;  // Undefined behavior!
+++i;                          // Undefined behavior!
+\endcode
+As a rule of thumb, if a polyhedron plays any role in a computation
+(even as a const parameter), then any previously computed reference
+to parts of the polyhedron may have been invalidated.
+Note that, in the example above, the computation of the constraint system
+could have been placed after the uses of the iterator <CODE>i</CODE>
+and the reference <CODE>p</CODE>.
+Anyway, if really needed, it is always possible to take a copy of,
+instead of a reference to, the parts of interest of the polyhedron;
+in the case above, one may have taken a copy of the generator system
+by replacing the second line of code with the following:
+\code
+Generator_System gs = ph.generators();
+\endcode
+The same observations, modulo syntactic sugar, apply to the operators
+defined in the C interface of the library.
+
+\section bibliography Bibliography
+
+<DL>
+
+<DT> [Bag98] </DT>
+<DD>
+\anchor Bag98
+R. Bagnara.
+  A hierarchy of constraint systems for data-flow analysis of
+  constraint logic-based languages.
+  <i>Science of Computer Programming</i>, 30(1-2):119-155, 1998.
+
+</DD>
+
+
+<DT> [BGP99] </DT>
+<DD>
+\anchor BGP99
+T. Bultan, R. Gerber, and W. Pugh.
+  Model-checking concurrent systems with unbounded integer variables:
+  Symbolic representations, approximations, and experimental results.
+  <i>ACM Transactions on Programming Languages and Systems</i>,
+  21(4):747-789, 1999.
+
+</DD>
+
+
+<DT> [BDHMZ05] </DT>
+<DD>
+\anchor BDHMZ05
+R. Bagnara, K. Dobson, P. M. Hill, M. Mundell, and E. Zaffanella.
+  A Linear Domain for Analyzing the Distribution of Numerical Values.
+  Technical report 2005.06, School of Computing, University of Leeds, UK, 2005.
+  Available at
+  <A HREF="http://www.comp.leeds.ac.uk/research/pubs/reports.shtml">http://www.comp.leeds.ac.uk/research/pubs/reports.shtml</A>.
+
+</DD>
+
+<DT> [BHMZ05] </DT>
+<DD>
+\anchor BHMZ05
+R. Bagnara, P. M. Hill, E. Mazzi, and E. Zaffanella.
+  Widening Operators for Weakly-Relational Numeric Abstractions.
+  In C. Hankin and I. Silveroni, editors, <i>Static Analysis:
+  Proceedings of the 12th International Symposium</i>, volume 3672 of
+  <i>Lecture Notes in Computer Science</i>, pages 3-18, London, UK, 2005.
+  Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT> [BHRZ03a] </DT>
+<DD>
+\anchor BHRZ03a
+R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella.
+  Precise widening operators for convex polyhedra.
+  In R. Cousot, editor, <i>Static Analysis: Proceedings of the 10th
+  International Symposium</i>, volume 2694 of <i>Lecture Notes in Computer
+  Science</i>, pages 337-354, San Diego, California, USA, 2003. Springer-Verlag,
+  Berlin.
+
+</DD>
+
+
+<DT> [BHRZ03b] </DT>
+<DD>
+\anchor BHRZ03b
+R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella.
+  Precise widening operators for convex polyhedra.
+  Quaderno 312, Dipartimento di Matematica, Universit� di Parma,
+  Italy, 2003.
+  Available at <A HREF="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</A>.
+
+</DD>
+
+
+<DT> [BHZ02a] </DT>
+<DD>
+\anchor BHZ02a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+  A new encoding and implementation of not necessarily closed convex
+  polyhedra.
+  Quaderno 305, Dipartimento di Matematica, Universit� di Parma,
+  Italy, 2002.
+  Available at <A HREF="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</A>.
+
+</DD>
+
+
+<DT> [BHZ02b] </DT>
+<DD>
+\anchor BHZ02b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+  A new encoding of not necessarily closed convex polyhedra.
+  In M. Carro, C. Vacheret, and K.-K. Lau, editors, <i>Proceedings of
+  the 1st CoLogNet Workshop on Component-based Software Development and
+  Implementation Technology for Computational Logic Systems</i>, pages 147-153,
+  Madrid, Spain, 2002.
+  Published as TR Number CLIP4/02.0, Universidad Polit�cnica de
+  Madrid, Facultad de Inform�tica.
+
+</DD>
+
+
+<DT> [BHZ03a] </DT>
+<DD>
+\anchor BHZ03a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+  A new encoding and implementation of not necessarily closed convex
+  polyhedra.
+  In M. Leuschel, S. Gruner, and S. Lo Presti, editors, <i>
+  Proceedings of the 3rd Workshop on Automated Verification of Critical
+  Systems</i>, pages 161-176, Southampton, UK, 2003.
+  Published as TR Number DSSE-TR-2003-2, University of Southampton.
+
+</DD>
+
+
+<DT> [BHZ03b] </DT>
+<DD>
+\anchor BHZ03b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+  Widening operators for powerset domains.
+  In B. Steffen and G. Levi, editors, <i>Proceedings of the Fifth
+  International Conference on Verification, Model Checking and Abstract
+  Interpretation (VMCAI 2004)</i>, volume 2937 of <i>Lecture Notes in Computer
+  Science</i>, pages 135-148, Venice, Italy, 2003. Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT> [BHZ04] </DT>
+<DD>
+\anchor BHZ04
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+  Widening operators for powerset domains.
+  Quaderno 349, Dipartimento di Matematica, Universit� di Parma,
+  Italy, 2004.
+  Available at <A HREF="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</A>.
+
+</DD>
+
+
+<DT> [BJT99] </DT>
+<DD>
+\anchor BJT99
+F. Besson, T. P. Jensen, and J.-P. Talpin.
+  Polyhedral analysis for synchronous languages.
+  In A. Cortesi and G. Fil�, editors, <i>Static Analysis:
+  Proceedings of the 6th International Symposium</i>, volume 1694 of <i>Lecture
+  Notes in Computer Science</i>, pages 51-68, Venice, Italy, 1999.
+  Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT> [BRZH02a] </DT>
+<DD>
+\anchor BRZH02a
+R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill.
+  Possibly not closed convex polyhedra and the Parma Polyhedra
+  Library.
+  In M. V. Hermenegildo and G. Puebla, editors, <i>Static Analysis:
+  Proceedings of the 9th International Symposium</i>, volume 2477 of <i>Lecture
+  Notes in Computer Science</i>, pages 213-229, Madrid, Spain, 2002.
+  Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT> [BRZH02b] </DT>
+<DD>
+\anchor BRZH02b
+R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill.
+  Possibly not closed convex polyhedra and the Parma Polyhedra
+  Library.
+  Quaderno 286, Dipartimento di Matematica, Universit� di Parma,
+  Italy, 2002.
+  See also \ref BRZH02c "[BRZH02c]". Available at
+  <A HREF="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</A>.
+
+</DD>
+
+
+<DT> [BRZH02c] </DT>
+<DD>
+\anchor BRZH02c
+R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill.
+  Errata for technical report ``Quaderno 286''.
+  Available at <A HREF="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</A>,
+  2002.
+  See \ref BRZH02b "[BRZH02b]".
+
+</DD>
+
+
+<DT> [CC76] </DT>
+<DD>
+\anchor CC76
+P. Cousot and R. Cousot.
+  Static Determination of Dynamic Properties of Programs.
+  In B. Robinet, editor, <i>Proceedings of the 2nd International
+  Symposium on Programming</i>, pages 106-130, Paris, France, 1976.
+
+</DD>
+
+
+<DT> [CC92] </DT>
+<DD>
+\anchor CC92
+P. Cousot and R. Cousot.
+  Comparing the Galois connection and widening/narrowing approaches
+  to abstract interpretation.
+  In M. Bruynooghe and M. Wirsing, editors, <i>Proceedings of the 4th
+  International Symposium on Programming Language Implementation and Logic
+  Programming</i>, volume 631 of <i>Lecture Notes in Computer Science</i>, pages
+  269-295, Leuven, Belgium, 1992. Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT> [CH78] </DT>
+<DD>
+\anchor CH78
+P. Cousot and N. Halbwachs.
+  Automatic discovery of linear restraints among variables of a
+  program.
+  In <i>Conference Record of the Fifth Annual ACM Symposium on
+  Principles of Programming Languages</i>, pages 84-96, Tucson, Arizona, 1978.
+  ACM Press.
+
+</DD>
+
+
+<DT> [Che64] </DT>
+<DD>
+\anchor Che64
+N. V. Chernikova.
+  Algorithm for finding a general formula for the non-negative
+  solutions of system of linear equations.
+  <i>U.S.S.R. Computational Mathematics and Mathematical Physics</i>,
+  4(4):151-158, 1964.
+
+</DD>
+
+
+<DT> [Che65] </DT>
+<DD>
+\anchor Che65
+N. V. Chernikova.
+  Algorithm for finding a general formula for the non-negative
+  solutions of system of linear inequalities.
+  <i>U.S.S.R. Computational Mathematics and Mathematical Physics</i>,
+  5(2):228-233, 1965.
+
+</DD>
+
+
+<DT> [Che68] </DT>
+<DD>
+\anchor Che68
+N. V. Chernikova.
+  Algorithm for discovering the set of all solutions of a linear
+  programming problem.
+  <i>U.S.S.R. Computational Mathematics and Mathematical Physics</i>,
+  8(6):282-293, 1968.
+
+</DD>
+
+
+<DT> [Dan63] </DT>
+<DD>
+\anchor Dan63
+G. B. Dantzig.
+  <i>Linear Programming and Extensions</i>.
+  Princeton University Press, Princeton, NJ, 1963.
+
+</DD>
+
+
+<DT> [FP96] </DT>
+<DD>
+\anchor FP96
+K. Fukuda and A. Prodon.
+  Double description method revisited.
+  In M. Deza, R. Euler, and Y. Manoussakis, editors, <i>Combinatorics
+  and Computer Science, 8th Franco-Japanese and 4th Franco-Chinese Conference,
+  Brest, France, July 3-5, 1995, Selected Papers</i>, volume 1120 of <i>Lecture
+  Notes in Computer Science</i>, pages 91-111. Springer-Verlag, Berlin, 1996.
+
+</DD>
+
+
+<DT> [Fuk98] </DT>
+<DD>
+\anchor Fuk98
+K. Fukuda.
+  Polyhedral computation FAQ.
+  Swiss Federal Institute of Technology, Lausanne and Zurich,
+  Switzerland, available at
+  <A HREF="http://www.ifor.math.ethz.ch/~fukuda/fukuda.html">http://www.ifor.math.ethz.ch/~fukuda/fukuda.html</A>, 1998.
+
+</DD>
+
+
+<DT> [GDD<sup>+</sup>04] </DT>
+<DD>
+\anchor GDMDRS04
+D. Gopan, F. DiMaio, N. Dor, T. Reps, and M. Sagiv.
+  Numeric domains with summarized dimensions.
+  In K. Jensen and A. Podelski, editors, <i>Tools and Algorithms for
+  the Construction and Analysis of Systems, 10th International Conference,
+  TACAS 2004</i>, volume 2988 of <i>Lecture Notes in Computer Science</i>, pages
+  512-529. Springer-Verlag, Berlin, 2004.
+
+</DD>
+
+
+<DT> [GJ00] </DT>
+<DD>
+\anchor GJ00
+E. Gawrilow and M. Joswig.
+  <tt>polymake</tt>: a framework for analyzing convex polytopes.
+  In G. Kalai and G. M. Ziegler, editors, <i>Polytopes -
+  Combinatorics and Computation</i>, pages 43-74. Birkh�user, 2000.
+
+</DD>
+
+
+<DT> [GJ01] </DT>
+<DD>
+\anchor GJ01
+E. Gawrilow and M. Joswig.
+  <tt>polymake</tt>: an approach to modular software design in
+  computational geometry.
+  In <i>Proceedings of the 17th Annual Symposium on Computational
+  Geometry</i>, pages 222-231, Medford, MA, USA, 2001. ACM.
+
+</DD>
+
+
+<DT> [Hal79] </DT>
+<DD>
+\anchor Hal79
+N. Halbwachs.
+  <i>D�termination Automatique de Relations Lin�aires
+  V�rifi�es par les Variables d'un Programme</i>.
+  Th�se de 3�me cycle d'informatique,
+  Universit� scientifique et m�dicale de Grenoble, Grenoble, France, March
+  1979.
+
+</DD>
+
+
+<DT> [Hal93] </DT>
+<DD>
+\anchor Hal93
+N. Halbwachs.
+  Delay analysis in synchronous programs.
+  In C. Courcoubetis, editor, <i>Computer Aided Verification:
+  Proceedings of the 5th International Conference</i>, volume 697 of <i>Lecture
+  Notes in Computer Science</i>, pages 333-346, Elounda, Greece, 1993.
+  Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT> [HH95] </DT>
+<DD>
+\anchor HH95
+T. A. Henzinger and P.-H. Ho.
+  A note on abstract interpretation strategies for hybrid automata.
+  In P. J. Antsaklis, W. Kohn, A. Nerode, and S. Sastry, editors, <i>
+  Hybrid Systems II</i>, volume 999 of <i>Lecture Notes in Computer Science</i>,
+  pages 252-264. Springer-Verlag, Berlin, 1995.
+
+</DD>
+
+
+<DT> [HKP95] </DT>
+<DD>
+\anchor HKP95
+N. Halbwachs, A. Kerbrat, and Y.-E. Proy.
+  <i>POLyhedra INtegrated Environment</i>.
+  Verimag, France, version 1.0 of POLINE edition, September 1995.
+  Documentation taken from source code.
+
+</DD>
+
+
+<DT> [HLW94] </DT>
+<DD>
+\anchor HLW94
+V. Van Dongen H. Le Verge and D. K. Wilde.
+  Loop nest synthesis using the polyhedral library.
+  <em>Publication interne</em> 830, IRISA, Campus de Beaulieu, Rennes,
+  France, 1994.
+
+</DD>
+
+
+<DT> [HPR94] </DT>
+<DD>
+\anchor HPR94
+N. Halbwachs, Y.-E. Proy, and P. Raymond.
+  Verification of linear hybrid systems by means of convex
+  approximations.
+  In B. Le Charlier, editor, <i>Static Analysis: Proceedings of the
+  1st International Symposium</i>, volume 864 of <i>Lecture Notes in Computer
+  Science</i>, pages 223-237, Namur, Belgium, 1994. Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT> [HPR97] </DT>
+<DD>
+\anchor HPR97
+N. Halbwachs, Y.-E. Proy, and P. Roumanoff.
+  Verification of real-time systems using linear relation analysis.
+  <i>Formal Methods in System Design</i>, 11(2):157-185, 1997.
+
+</DD>
+
+
+<DT> [HPWT01] </DT>
+<DD>
+\anchor HPWT01
+T. A. Henzinger, J. Preussig, and H. Wong-Toi.
+  Some lessons from the hytech experience.
+  In <i>Proceedings of the 40th Annual Conference on Decision and
+  Control</i>, pages 2887-2892. IEEE Computer Society Press, 2001.
+
+</DD>
+
+
+<DT> [Jea02] </DT>
+<DD>
+\anchor Jea02
+B. Jeannet.
+  <i>Convex Polyhedra Library</i>, release 1.1.3c edition, March 2002.
+  Documentation of the ``New Polka'' library available at
+  <A HREF="http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html">http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html</A>.
+
+</DD>
+
+
+<DT> [Kuh56] </DT>
+<DD>
+\anchor Kuh56
+H. W. Kuhn.
+  Solvability and consistency for linear equations and inequalities.
+  <i>American Mathematical Monthly</i>, 63:217-232, 1956.
+
+</DD>
+
+
+<DT> [Le 92] </DT>
+<DD>
+\anchor Le92
+H. Le Verge.
+  A note on Chernikova's algorithm.
+  <em>Publication interne</em> 635, IRISA, Campus de Beaulieu, Rennes,
+  France, 1992.
+
+</DD>
+
+
+<DT> [Loe99] </DT>
+<DD>
+\anchor Loe99
+V. Loechner.
+  <i>PolyLib</i>: A library for manipulating parameterized polyhedra.
+  Available at <A HREF="http://icps.u-strasbg.fr/~loechner/polylib/">http://icps.u-strasbg.fr/~loechner/polylib/</A>, March
+  1999.
+  Declares itself to be a continuation of \ref Wil93 "[Wil93]".
+
+</DD>
+
+
+<DT> [LW97] </DT>
+<DD>
+\anchor LW97
+V. Loechner and D. K. Wilde.
+  Parameterized polyhedra and their vertices.
+  <i>International Journal of Parallel Programming</i>, 25(6):525-549,
+  1997.
+
+</DD>
+
+
+<DT> [Mas92] </DT>
+<DD>
+\anchor Mas92
+F. Masdupuy.
+  Array operations abstraction using semantic analysis of trapezoid
+  congruences.
+  In <i>Proceedings of the 6th ACM International Conference on
+  Supercomputing</i>, pages 226-235, Washington, DC, USA, 1992. ACM Press.
+
+</DD>
+
+
+<DT> [Mas93] </DT>
+<DD>
+\anchor Mas93
+F. Masdupuy.
+  <i>Array Indices Relational Semantic Analysis Using Rational Cosets
+  and Trapezoids</i>.
+  Th�se d'informatique, �cole Polytechnique, Palaiseau, France,
+  December 1993.
+
+</DD>
+
+
+<DT> [MRTT53] </DT>
+<DD>
+\anchor MRTT53
+T. S. Motzkin, H. Raiffa, G. L. Thompson, and R. M. Thrall.
+  The double description method.
+  In H. W. Kuhn and A. W. Tucker, editors, <i>Contributions to the
+  Theory of Games - Volume II</i>, number 28 in Annals of Mathematics Studies,
+  pages 51-73. Princeton University Press, Princeton, New Jersey, 1953.
+
+</DD>
+
+
+<DT> [NR00] </DT>
+<DD>
+\anchor NR00
+S. P. K. Nookala and T. Risset.
+  A library for Z-polyhedral operations.
+  <em>Publication interne</em> 1330, IRISA, Campus de Beaulieu, Rennes,
+  France, 2000.
+
+</DD>
+
+
+<DT> [NW88] </DT>
+<DD>
+\anchor NW88
+G. L. Nemhauser and L. A. Wolsey.
+  <i>Integer and Combinatorial Optimization</i>.
+  Wiley Interscience Series in Discrete Mathematics and Optimization.
+  John Wiley & Sons, 1988.
+
+</DD>
+
+
+<DT> [Sch99] </DT>
+<DD>
+\anchor Sch99
+A. Schrijver.
+  <i>Theory of Linear and Integer Programming</i>.
+  Wiley Interscience Series in Discrete Mathematics and Optimization.
+  John Wiley & Sons, 1999.
+
+</DD>
+
+
+<DT> [Sri93] </DT>
+<DD>
+\anchor Sri93
+D. Srivastava.
+  Subsumption and indexing in constraint query languages with linear
+  arithmetic constraints.
+  <i>Annals of Mathematics and Artificial Intelligence</i>,
+  8(3-4):315-343, 1993.
+
+</DD>
+
+
+<DT> [SW70] </DT>
+<DD>
+\anchor SW70
+J. Stoer and C. Witzgall.
+  <i>Convexity and Optimization in Finite Dimensions I</i>.
+  Springer-Verlag, Berlin, 1970.
+
+</DD>
+
+
+<DT> [Wey35] </DT>
+<DD>
+\anchor Wey35
+H. Weyl.
+  Elementare theorie der konvexen polyeder.
+  <i>Commentarii Mathematici Helvetici</i>, 7:290-306, 1935.
+  English translation in \ref Wey50 "[Wey50]".
+
+</DD>
+
+
+<DT> [Wey50] </DT>
+<DD>
+\anchor Wey50
+H. Weyl.
+  The elementary theory of convex polyhedra.
+  In H. W. Kuhn, editor, <i>Contributions to the Theory of Games -
+  Volume I</i>, number 24 in Annals of Mathematics Studies, pages 3-18. Princeton
+  University Press, Princeton, New Jersey, 1950.
+  Translated from \ref Wey35 "[Wey35]" by H. W. Kuhn.
+
+</DD>
+
+
+<DT> [Wil93] </DT>
+<DD>
+\anchor Wil93
+D. K. Wilde.
+  A library for doing polyhedral operations.
+  Master's thesis, Oregon State University, Corvallis, Oregon,
+  December 1993.
+  Also published as IRISA <em>Publication interne</em> 785, Rennes,
+  France, 1993.
+
+</DD>
+</DL>
+
+
+\if Include_Implementation_Details
+
+\section prelims Further Notation and Terminology
+
+\subsection Linear_Independence Linear Independence
+
+A finite set of points
+\f$\{ \vect{x}_1, \ldots, \vect{x}_k \} \sseq \Rset^n\f$
+is <EM>linearly independent</EM> if,
+for all \f$\lambda_1, \ldots, \lambda_k \in \Rset\f$,
+the set of equations
+\f[
+  \sum_{i = 1}^k \lambda_i \vect{x}_i = \vect{0}
+\f]
+implies that, for each \f$i = 1\f$, \f$\ldots\f$, \f$k\f$,
+\f$\lambda_i = 0\f$.
+
+The maximum number of linearly independent points in \f$\Rset^n\f$ is \f$n\f$.
+Note that linear independence implies affine independence,
+but the converse is not true.
+
+<B><EM>Proposition</EM></B>
+
+If \f$A\f$ is an \f$m \times n\f$ matrix, the maximum number of
+linearly independent rows of \f$A\f$, viewed as vectors of \f$\Rset^n\f$,
+equals the maximum number of linearly independent columns of \f$A\f$,
+viewed as vectors of \f$\Rset^m\f$.
+
+\subsection Rank Rank
+
+The maximum number of linearly independent rows (columns) of a
+matrix \f$A\f$ is the <EM>rank</EM> of \f$A\f$ and is denoted by
+\f$\prank(A)\f$.
+
+<B><EM>Proposition</EM></B>
+
+A polyhedron is a convex set.
+
+\subsection Minkowskis_Theorem Minkowski's Theorem
+
+Let
+\f$\cP = \{\, \vect{x} \in \Rset^n \mid A\vect{x} \geq \vect{b} \,\}\f$
+be a non-empty polyhedron where \f$\prank(A) = n\f$.
+Let \f$V\f$ be the set of vertices and
+\f$R\f$ the set of extreme rays of \f$\cP\f$.
+Let also \f$\mathcal{V}\f$ be the set of convex combinations of \f$V\f$
+and \f$\mathcal{R}\f$ the set of positive combinations of \f$R\f$.
+Then
+\f[
+  \cP = \mathcal{V} + \mathcal{R}.
+\f]
+
+Informally, this theorem states that,
+whenever a polyhedron \f$\cP\f$ has a vertex,
+there exists a decomposition such that
+- \f$V\f$ is the set of all <EM>vertices</EM> of \f$\cP\f$;
+- \f$R\f$ is the set of all <EM>extreme</EM> rays of \f$\cP\f$; and
+- \f$L = \emptyset\f$.
+
+The conditions that \f$\cP\f$ is not empty and \f$\prank(A) = n\f$
+are equivalent to the condition that \f$\cP\f$ has a vertex.
+(See also Nemhauser and Wolsey - Integer and Combinatorial Optimization -
+propositions 4.1 and 4.2 on pages 92 and 93).
+
+<B><EM>Proposition</EM></B>
+
+Under the same hypotheses of Minkowski's theorem,
+if \f$\cP\f$ is a rational polyhedron then
+all the vertices in \f$V\f$ have rational coefficients and
+we can consider a set \f$R\f$ of extreme rays having
+rational coefficients only.
+
+The second theorem, called Weyl's theorem, states that any system of
+generators having rational coefficients defines a rational polyhedron:
+
+\subsection Weyls_Theorem Weyl's Theorem
+
+If \f$A\f$ is a rational \f$m \times n\f$ matrix,
+\f$B\f$ is a rational \f$m' \times n\f$ matrix and
+\f[
+  \cQ = \sset{
+          \vect{x} \in \Rset^n
+        }{
+          \vect{x}^\transpose = \vect{y}^\transpose A
+                                  + \vect{z}^\transpose B, \\
+          \vect{y} = (y_0, \ldots, y_{m-1})^\transpose \in \nonnegRset^{m},
+          \sum_{k=0}^{m-1} y_k = 1, \\
+	  \vect{z} \in \nonnegRset^{m'}
+        },
+\f]
+then \f$\cQ\f$ is a rational polyhedron.
+
+In fact, since \f$\cQ\f$ consists of the sum of convex combinations of
+the rows of \f$A\f$ with positive combinations of the rows of \f$B\f$,
+we can think of \f$A\f$ as the matrix of vertices and \f$B\f$ as
+the matrix of rays.
+
+\subsection Cone Cone
+
+A set \f$C \sseq \Rset^n\f$ is a <EM>cone</EM> if
+\f[
+  \vect{x} \in C \Rightarrow \lambda \vect{x} \in C
+  \text{ for all } \lambda \in \nonnegRset.
+\f]
+
+\subsection Polyhedral_Cone Polyhedral Cone
+
+The polyhedron
+\f$\cP = \{\,\vect{x} \in \Rset^n \mid A\vect{x} \geq \vect{0}\,\}\f$
+is a convex cone and is called <EM>polyhedral cone</EM>.
+
+A polyhedral cone is either <EM>pointed</EM>,
+having the origin as its only vertex, or has no vertices at all.
+
+\subsection Lineality_Space Lineality Space
+
+Given a polyhedron
+\f$\cP = \{\,\vect{x} \in \Rset^n \mid A\vect{x} \geq \vect{b}\,\}\f$,
+the <EM>lineality space</EM> of \f$\cP\f$ is the set
+\f[
+  \{\, \vect{x} \in \cP \mid A\vect{x} = \vect{0} \,\}
+\f]
+and it is denoted by \f$\linspace(\cP)\f$.
+
+
+\section homogeneous Homogeneous Systems
+
+To simplify the operations on polyhedra,
+each polyhedron is first transformed to a homogeneous cone
+in which the original polyhedron is embedded.
+
+\subsection Corresponding_Polyhedral_Cone Corresponding Polyhedral Cone
+
+The transformation changes the inhomogeneous system of constraints
+in \f$n\f$ variables, representing a polyhedron \f$\cP \in \Rset^n\f$,
+into a homogeneous system in \f$n + 1\f$ variables, representing a
+polyhedral cone \f$C \in \Rset^{n + 1}\f$,
+so that each point \f$\vect{x} \in \cP\f$
+corresponds to a point
+\f$\vect{x}' = (\xi \vect{x}^\transpose, \xi)^\transpose \in C\f$
+where \f$\xi \geq 0\f$. That is,
+\f[
+  \cP = \{\,\vect{x} \mid A\vect{x} \geq \vect{b}\,\}
+      = \{\,\vect{x} \mid A\vect{x} - \vect{b} \geq \vect{0}\,\}
+\f]
+\f[
+  C = \{\,
+           (\xi \vect{x}^\transpose, \xi)^\transpose
+      \mid
+           \xi A\vect{x} - \xi \vect{b}
+	   \geq \vect{0}, \xi \geq 0
+      \,\}
+    = \{\,\vect{x}' \mid A'\vect{x}' \geq \vect{0}\,\}
+\f]
+where:
+\f$\vect{x}' = (\xi \vect{x}^\transpose, \xi)^\transpose \in \Rset^{n + 1}\f$;
+\f$A'\f$ is the \f$(m+1) \times (n+1)\f$ matrix having, for
+its first \f$m\f$ rows, the submatrix
+\f$(A, -\vect{b}) \in \Rset^m \times \Rset^{n + 1}\f$;
+and, for the (\f$m + 1\f$)'st row,
+\f$(\vect{0}^\transpose, 1)\f$ where \f$\vect{0} \in \Rset^n\f$.
+We call  \f$C\f$ the
+<EM>corresponding polyhedral cone for \f$\cP\f$</EM>.
+
+The (\f$m+1\f$)'st row
+\f$(\vect{0}^\transpose, 1)\f$
+represents the <EM>positivity constraint</EM> \f$1 \geq 0\f$.
+
+Note that \f$\cP\f$ is contained in \f$C\f$
+since the intersection of \f$C\f$ with
+the hyperplane defined by the equality \f$\xi = 1\f$ is \f$\cP\f$.
+Therefore, it is always possible to
+transform  a polyhedron \f$\cP\f$ to its corresponding polyhedral cone
+\f$C\f$ and then recover \f$\cP\f$ by means of this intersection.
+
+As  \f$C\f$ always includes the origin and, hence, is non-empty,
+by Minkowski's theorem,
+it can also be represented by a system of generators.
+
+The systems of generators for \f$\cP\f$ and \f$C\f$ are such that:
+- Each vertex \f$\vect{v}\f$ in \f$\cP\f$
+  corresponds to a ray \f$(\vect{v}^\transpose, d)^\transpose\f$
+  with \f$d \neq 0\f$, in \f$C\f$.
+- Each ray \f$\vect{r}\f$ in \f$\cP\f$
+  corresponds to the ray \f$(\vect{r}^\transpose, 0)^\transpose\f$
+  in \f$C\f$.
+- Every ray in \f$C\f$ corresponds to a vertex or ray in \f$\cP\f$.
+- The origin in \f$\Rset^{n+1}\f$ is a point in \f$C\f$.
+
+Thus, in the cone \f$C\f$, a ray derived from a vertex
+in \f$\cP\f$ differs from a ray derived from a ray in \f$\cP\f$
+only in that, for a vertex,
+the (\f$n+1\f$)'st term is different from zero and,
+for a ray, it is zero.
+
+\subsection Double_Description Double Description
+
+Let \f$\cP \in \Rset^n \f$ be a polyhedron and  \f$C \in \Rset^{n+1} \f$
+the corresponding polyhedral cone.
+Then the dual representations, the systems of constraints
+and generators representing \f$C\f$, form the
+<EM>double description</EM> for \f$\cP\f$.
+
+Note that, in a double description for a non-empty polyhedron,
+the system of constraints subsumes the positivity constraint \f$1 \geq 0\f$
+while the system of generators (which has only rays and lines
+corresponding to the vertices, rays and lines for \f$\cP\f$)
+implicitly assumes the origin in \f$\Rset^{n+1}\f$
+as a point so that the cone \f$C\f$ represented by the generators is non-empty.
+
+\subsection PPL_Polyhedron_Representation PPL Polyhedron Representation
+
+In the PPL,
+a polyhedron is represented by one or both of the representations in
+its double description.
+Thus, in the sequel, by <EM>PPL representation of a polyhedra</EM>,
+we are referring to the corresponding representation of
+its corresponding polyhedral cone.
+
+\subsection Valid_Linear_Inequalities Valid Linear Inequalities
+
+Let \f$\cP\f$ be a convex polyhedron (or polytope) in
+\f$\Rset^n\f$. For a real \f$n\f$-vector \f$\vect{c}\f$ and a real number
+\f$b\f$, a linear inequality \f$\langle \vect{c}, \vect{x} \rangle \geq b\f$
+(briefly denoted by \f$(\vect{c},b)\f$) is called <EM>valid</EM>
+for \f$\cP\f$ if it is satisfied by all points \f$\vect{x} \in \cP\f$.
+
+\subsection Redundancy Redundancy
+
+-# In a system of equalities, if an equality is a linear combination
+   of the others, it is said to be <EM>dependent</EM> upon them;
+   the dependent equality is called <EM>redundant</EM>.
+   A system containing no redundant equality is called <EM>independent</EM>.
+-# In a system of inequalities, an inequality is said to be <EM>redundant</EM>
+   if it can be eliminated from the system obtaining a system
+   equivalent to the previous one, i.e., having the same solutions.
+
+Given a polyhedron \f$\cP\f$ generated by \f$V\f$ vertices,
+\f$R\f$ rays and \f$L\f$ lines, we say that:
+
+-# \f$L\f$ is <EM>irredundant</EM> if
+  \f$L\f$ is a set of linearly independent lines; and
+-# a ray \f$\vect{r}_1\in R\f$ is <EM>redundant</EM>
+  if there exists another ray \f$\vect{r}_2 \in R\f$ and
+  there exists \f$\lambda \in \Rset, \lambda > 0\f$
+  such that \f$\vect{r}_1 = \lambda \vect{r}_2\f$.
+
+Note that, in the PPL representation of a polyhedron \f$\cP\f$,
+vertices are represented as rays so that
+this concept of a redundant ray also applies to the vertices of \f$\cP\f$.
+
+
+\subsection Face Face
+
+If \f$(\vect{c},b)\f$ is a valid inequality for \f$\cP\f$, and
+\f$F = \{\,\vect{x} \in \cP \mid \langle \vect{c}, \vect{x} \rangle = b\,\}\f$,
+\f$F\f$ is called a <EM>face</EM> of \f$\cP\f$ and we say that the inequality
+represents \f$F\f$.
+A face \f$F\f$ is said to be <EM>proper</EM> if \f$F \neq \emptyset\f$ and
+\f$F \neq \cP\f$.
+
+When \f$F\f$ is non-empty, we say that \f$(\vect{c},b)\f$ <EM>supports</EM>
+\f$\cP\f$.
+
+The empty polyhedron and the universe polyhedron both have no proper faces,
+because the only face of an empty polyhedron is itself, while the faces of
+the universe polyhedron are itself and the emptyset.
+
+Let \f$\cP\f$ be a non-empty polyhedron. The set
+\f[
+  F = \{ \vect{p} \} + \linspace(\cP),
+\f]
+where \f$\vect{p}\f$ is a point of \f$\cP\f$ and the symbol
+'\f$+\f$' denotes the Minkowski's sum, is a <EM>minimal proper face</EM> of
+the polyhedron if \f$F\f$ is a proper face of \f$\cP\f$.
+
+\subsection Facet Facet
+
+A proper face \f$F\f$ of \f$\cP\f$ is a <EM>facet</EM> (or <EM>maximal proper
+face</EM>) of \f$\cP\f$ if it is not strictly included into any other proper
+face of \f$\cP\f$.
+The affine dimension of a facet is equal to \f$\pdim(\cP) - 1\f$.
+
+<B><EM>Proposition</EM></B>
+
+Let \f$\cP\f$ a polyhedron in \f$\Rset^n\f$. The set of all faces is a lattice
+under inclusion: the minimal face is the emptyset, while the maximal face
+is the polyhedron.
+
+<B><EM>Proposition</EM></B>
+
+Let \f$\cP \neq \emptyset\f$ be a polyhedron in \f$\Rset^n\f$ and
+\f$C\f$ be the polyhedral cone in \f$\Rset^{n+1}\f$ obtained from \f$\cP\f$
+by homogenization, then:
+-# the only <EM>minimal proper face</EM> of \f$C\f$ is
+   \f$\linspace(C)\f$;
+-# let \f$\vect{y} \in C\f$ be different from \f$\vect{0}\f$ and
+   \f$\cone\{\vect{y}\}\f$ be defined as
+   \f$\{\, \lambda \vect{y} \mid \lambda \geq 0 \,\}\f$. If the set
+   \f$F = \cone\{\vect{y}\} + \linspace(C)\f$ is
+   a proper face of \f$C\f$, then \f$\vect{y}\f$ is an <EM>extremal ray</EM>
+   of \f$C\f$.
+
+\subsection Ray_Space Ray Space
+
+Given the decomposition \f$\mathcal{V} + \mathcal{R} + \mathcal{L}\f$
+of a polyhedron \f$\cP\f$ the set \f$\mathcal{V} + \mathcal{R}\f$
+is called the <EM>ray space</EM> of \f$\cP\f$
+and denoted by \f$\mathop{\mathrm{ray space}}(\cP)\f$.
+
+Thus a polyhedron \f$\cP\f$ can be always decomposed in its
+\f$\linspace\f$ and its \f$\mathop{\mathrm{ray space}}\f$.
+
+Note that, since \f$\linspace(\cP)\f$ and
+\f$\mathop{\mathrm{ray space}}(\cP)\f$ are polyhedra, their
+affine dimensions can be computed using the definition of affine
+dimension given for polyhedra.
+
+The spaces defined are connected by some consistency rules shown below.
+
+\subsection Dimensionality_Rules Dimensionality Rules
+
+In \f$\Rset^n\f$
+
+- The dimension of the \f$\linspace\f$
+  is the rank of any set of lines that span the space.
+- The dimension of the polyhedron is the dimension of the
+  \f$\mathop{\mathrm{ray space}}\f$ plus the dimension of the
+  \f$\linspace\f$.
+- The dimension of the \f$\mathop{\mathrm{ray space}}\f$
+  is \f$n\f$ minus the number of irredundant
+  lines minus the number of irredundant equalities.
+
+The proofs of these properties can be obtained considering the definitions of
+affine dimension and the decomposition of a polyhedron.
+
+\subsection Saturation Saturation
+
+Let us consider a ray \f$\vect{r} \in \Rset^n\f$ and an inequality
+\f$(\vect{a}, 0)\f$ where \f$\vect{a} \in \Rset^n\f$.
+Then we say that:
+- \f$r\f$ <EM>saturates</EM> the inequality
+  if \f$\langle \vect{a}, \vect{r} \rangle = 0\f$;
+- \f$r\f$ <EM>verifies</EM>  the inequality
+  if \f$\langle \vect{a}, \vect{r} \rangle > 0\f$;
+- \f$r\f$ <EM>violates</EM>  the inequality
+  if \f$\langle \vect{a}, \vect{r} \rangle < 0\f$.
+
+Similarly, considering an equality
+\f$\langle \vect{a}, \vect{x} \rangle = 0\f$:
+- \f$\vect{r}\f$ <EM>saturates</EM> the equality
+if \f$\langle \vect{a}, \vect{r} \rangle = 0\f$;
+- \f$\vect{r}\f$ <EM>does not verify</EM> the equality
+if \f$\langle \vect{a}, \vect{r} \rangle \neq 0\f$.
+
+A constraint (i.e., an equality or an inequality) is
+<EM>satisfied</EM> by a ray if the ray saturates or verifies the constraint.
+
+<B><EM>Proposition</EM></B>
+
+Let \f$C \sseq \Rset^n\f$ be a polyhedral cone and
+\f$\vect{y}_1, \vect{y}_2 \in C\f$. If the sets
+\f$F_i = \cone\{\vect{y}_i\} + \linspace(C)\f$ with
+\f$i = 1, 2\f$ are proper faces of \f$C\f$, \f$F_1\f$ is equal to \f$F_2\f$
+if and only if the set of constraints that are saturated by \f$\vect{y}_1\f$
+is equal to the set of constraints that are saturated by \f$\vect{y}_2\f$.
+
+
+\subsection Saturation_Matrix Saturation Matrix
+
+A <EM>saturation matrix</EM> is a
+Boolean matrix that represent the connection between constraints and
+generators of a polyhedron.
+There are two kinds of saturation matrix one having rows indexed
+by constraints and columns indexed by generators (<EM>sat_g</EM>),
+and one (that is the transposed version of the previous one) having
+rows indexed by generators and columns indexed by constraints (<EM>sat_c</EM>).
+
+For instance, in the saturation matrix sat_g, the elements are defined
+as follows:
+\f[
+s_{ij} =
+\begin{cases}
+0, \text{if the constraint indexed by } i \text{ is saturated by
+   the generator indexed by } j;\\
+1, \text{if the constraint indexed by } i \text{ is only
+  verified by the generator indexed by } j.
+\end{cases}
+\f]
+For efficiency reasons, the PPL uses both the sat_g and sat_c matrices.
+
+\subsection Saturation_Rule Saturation Rule
+
+In an \f$n\f$-dimensional \f$\mathop{\mathrm{ray space}}\f$,
+-# Every inequality must be saturated by at least \f$n\f$ vertices/rays.
+-# Every vertex must saturate at least \f$n\f$ inequalities and a ray
+   must saturate at least \f$n - 1\f$ inequalities plus the
+   positivity constraint.
+-# Every equality must be saturated by all lines and vertices/rays.
+-# Every line must saturate all equalities and inequalities.
+
+These rules are a consequence of the saturation concept.
+
+<B><EM>Proposition</EM></B>
+
+Let \f$C = \{\vect{x} \mid A\vect{x} \geq \vect{0}\}\f$ be a polyhedral cone.
+Then the minimal proper face of \f$C\f$ in an \f$n\f$-dimensional space can
+also be represented as
+\f$
+  F = \{\,\vect{x} \mid A\vect{x} = \vect{0}\,\}.
+\f$
+
+To see this, note that the minimal proper face of a polyhedral cone is equal
+to its lineality space. This for definition is composed by all \f$\vect{y}\f$
+of \f$C\f$ that satisfies \f$A \vect{x} = \vect{0}.\f$
+
+\subsection Adjacent_Rays Adjacent Rays
+
+Let \f$A\f$ be representing matrix of constraints of a cone \f$C\f$
+and \f$Q\f$ the set of rays that generate \f$C\f$. Then two rays
+\f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are <EM>adjacent rays</EM> if
+-# there exists at least a row of \f$A\f$ (i.e., a constraint) that
+   is saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$
+-# and none of the rays of \f$Q\f$, except \f$\vect{r}_1\f$ and
+   \f$\vect{r}_2\f$, saturates all the constraints saturated by both
+   \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$.
+
+\subsection Independence_Rule Independence Rule
+
+-# No inequality is a positive combination of any other two inequalities
+   or equalities.
+-# No ray is a linear combination of any other two rays or lines.
+-# The set of equalities must be linearly independent.
+-# The set of lines must be linearly independent.
+
+To remove redundant constraints/generators we will use the following
+characterization:
+
+\subsection Redundancy_Rules Redundancy Rules
+
+- An inequality is not redundant if it
+  satisfies both point (1) of the saturation rule and point (1)
+  of the independence rule.
+- A vertex/ray is irredundant if it satisfies
+  both point (2) of the saturation rule and point (2) of the independence rule.
+
+It is useful to note that:
+- All rays saturate the positivity constraint and no vertex saturates
+  the positivity constraint; in fact in the homogeneous form
+  the positivity constraint is represented by the vector
+  \f$\vect{a}^\transpose = (0, \ldots, 0, 1)\f$, rays are of the form
+  \f$\vect{r} = (r_0, \ldots, r_{n-1}, 0)^\transpose\f$ and vertices
+  \f$\vect{v} = (v_0, \ldots, v_{n-1}, d)^\transpose\f$ with \f$d \neq 0\f$,
+  thus \f$\langle \vect{a}, \vect{r} \rangle = 0\f$ for each ray
+  \f$\vect{r}\f$ and \f$\langle \vect{a}, \vect{v} \rangle \neq 0\f$
+  for each vertex \f$\vect{v}\f$.
+- The positivity constraint will be irredundant if and only if
+  the size of the set
+  of rays is \f$\geq n\f$, where \f$n\f$ is the dimension of the ray space,
+  and the rank of the ray set is \f$n\f$; in fact a constraint is
+  irredundant if it is saturated by at least \f$n\f$ vertices/rays (see
+  above), but since only rays saturate the positivity constraint, then in
+  a system with \f$n\f$ vertices/rays the positivity constraint
+  is irredundant.
+
+\section integer_floats Integers Represented by Floating Point Numbers
+
+Floating point numbers can be used to represent finite families
+of integer numbers.  In this section we collect some closure properties
+of these families that are exploited in the PPL.
+
+In order not to depend on the particular family of floating point
+numbers considered, we consider an abstraction that is parametric
+in the number \f$b\f$ of bits in the mantissa and gives no limit
+to the magnitude of the exponent \f$e\f$.
+For \f$b \in \Nset \setminus \{ 0 \}\f$ let
+\f[
+\begin{aligned}
+  F_b^+
+    &=
+      \bigl\{\,
+        x \in \Nset
+      \bigm|
+        x = (1 + m / 2^b) \cdot 2^e,
+        e \in \Nset,
+        m \in \Nset \cap [0, 2^b - 1]
+      \,\bigr\}, \\
+  F_b
+    &=
+      F_b^+ \cup \{ 0 \} \cup \{\, -x \mid x \in F_b^+ \,\}.
+\end{aligned}
+\f]
+
+Let \f$\phi \colon \Rset \to \Zset\f$ denote the function defined by
+\f[
+  \phi(t)
+    =
+      \begin{cases}
+        \lfloor t \rfloor, & \text{if $t \ge 0$;} \\
+        \lceil  t \rceil,  & \text{if $t  <  0$.}
+      \end{cases}
+\f]
+Notice that \f$\phi\f$ is an <EM>odd</EM> function, that is, it satisfies
+\f$\phi(-t) = -\phi(t)\f$ for all \f$t \in \Rset\f$.
+For \f$x\f$, \f$y \in \Zset\f$ with \f$y \ne 0\f$, we also write
+\f[
+\begin{aligned}
+  x \bdiv y &= \phi(x / y), \\
+  x \brem y &= x - (x \bdiv y) y.
+\end{aligned}
+\f]
+These are the integer division and remainder function as defined by
+the C99 standard
+[ISO/IEC 9899:1999(E), Programming Languages - C (ISO and ANSI C99 Standard)].
+
+<B><EM>Proposition A</EM></B>
+If \f$x\f$, \f$y \in F_b\f$ and \f$y \ne 0\f$, then \f$x \brem y \in F_b\f$.
+
+The proof is given in the next three lemmas.
+
+<B><EM>Lemma 1</EM></B>
+Let \f$G_b = \{\, n \in F_b^+ \mid \text{$n$ is odd} \,\}\f$.
+Then \f$G_b = \{ 1, 3, 5, \ldots, 2^{b + 1} - 1 \}\f$.
+Furthermore, if \f$x \in F_b^+\f$ then there exist \f$n \in G_b\f$ and
+\f$f \in \Nset\f$ such that \f$x = n \cdot 2^f\f$.
+
+<B><EM>Proof</EM></B>
+Let \f$n \in \{ 1, 3, 5, \ldots, 2^{b + 1} - 1 \}\f$.
+There is a non negative integer \f$\beta \le b\f$ such that
+\f$2^\beta \le n < 2^{\beta + 1}\f$.
+Then \f$n = (1 + m / 2^b) \cdot 2^e\f$ with
+\f$m = (n - 2^\beta) \cdot 2^{b - \beta}\f$ and \f$e = \beta\f$.
+Here \f$m < (2^{\beta + 1} - 2^\beta) \cdot 2^{b - \beta} = 2^b\f$
+so that \f$n \in G_b\f$.
+The same argument shows that odd integers larger than \f$2^{b+1}\f$ do not
+in fact belong to \f$G_b\f$, since the corresponding value of \f$m\f$ would
+exceed the bound \f$2^b - 1\f$ in the definition.
+
+For the second part, let \f$x = (1 + m / 2^b) \cdot 2^e \in F_b^+\f$.
+Let \f$m = 2^d \cdot m_1\f$ with \f$m_1\f$ odd and \f$d < b\f$.
+Then \f$n = 2^{b - d} + m_1\f$ is an odd integer that belongs to \f$G_b\f$
+since \f$2^{b - d} + m_1 \le 2^{b - d} + (2^b - 1) / 2^d < 2^{b - d + 1}
+\le 2^{b + 1}\f$, using the first part.
+Hence we may take \f$f = e + d - b\f$ which is non negative since
+otherwise \f$m \cdot 2^{e - b} = m_1 \cdot 2^{e + d - b}\f$ would not be
+an integer as assumed.
+
+<B><EM>Lemma 2</EM></B>
+If \f$x\f$, \f$y \in F_b^+\f$ and \f$y\f$ does not divide \f$x\f$, then
+\f$x \bmod y \in F_b^+\f$.
+
+<B><EM>Proof</EM></B>
+By Lemma 1 above we may assume that \f$x = n \cdot 2^e\f$ and
+\f$y = m \cdot 2^f\f$ with \f$n\f$, \f$m \in G_b\f$ odd integers, and \f$e\f$,
+\f$f \in \Nset\f$.
+Let \f$k = \lfloor x / y \rfloor\f$.
+The goal is to prove that \f$x - k y \in F_b^+\f$: we may assume that
+\f$k > 0\f$, that is, that \f$x > y\f$ for otherwise \f$x \bmod y = x\f$
+and there is nothing to prove.
+- If \f$e < f\f$ then \f$x - k y = 2^e (n - k m \cdot 2^{f - e})\f$.
+  The integer \f$n - k m \cdot 2^{f - e}\f$ is positive, odd and smaller
+  than \f$n\f$, and therefore belongs to \f$G_b\f$.
+- If \f$e = f\f$ then \f$x - k y = 2^e (n - k m)\f$.
+  The integer \f$n - k m\f$ is positive and smaller than \f$n\f$, and therefore
+  belongs to \f$F_b^+\f$.
+- If \f$e > f\f$ then \f$x - k y = 2^f (n \cdot 2^{e - f} - k m)\f$.
+  The integer \f$n \cdot 2^{e - f} - k m\f$ is positive and smaller
+  than \f$m\f$, and therefore belongs to \f$F_b^+\f$: in fact
+  \f[
+    n \cdot 2^{e - f} - k m
+    =
+    n \cdot 2^{e - f} - \Bigl\lfloor \frac xy \Bigr\rfloor m
+    =
+    n \cdot 2^{e - f} - \Bigl\lfloor \frac{n \cdot 2^{e - f}}m \Bigr\rfloor m.
+  \f]
+  In other words, this integer is \f$n \cdot 2^{e - f} \bmod m\f$ and
+  therefore it is smaller than \f$m\f$.
+
+In all cases, we wrote \f$x - k y\f$ as the product of a power of 2 and an
+element of \f$F_b^+\f$, and this product is another element of \f$F_b^+\f$.
+
+
+<B><EM>Lemma 3</EM></B>
+For \f$x\f$, \f$y \in \Zset\f$ with \f$y \ne 0\f$, we have
+\f[
+  x \brem y
+  =
+  \begin{cases}
+       x  \brem |y|,  & \text{if $x \ge 0$;} \\
+    -(|x| \brem |y|), & \text{if $x  <  0$.}
+  \end{cases}
+\f]
+
+<B><EM>Proof</EM></B>
+Throughout the proof we write \f$x_0 = |x|\f$ and \f$y_0 = |y|\f$.
+First, assume that \f$x \ge 0\f$ and that \f$y < 0\f$.
+Let \f$k = \phi(x / y_0) = - \phi(x / y)\f$, by the property above.
+We have
+\f[
+  x \brem y
+  =
+  x - (x \bdiv y) y
+  =
+  x - (-k) y
+  =
+  x - k (-y)
+  =
+  x - k y_0.
+\f]
+Next, assume that \f$x < 0\f$ and that \f$y < 0\f$.
+Let \f$k = \phi(x_0 / y_0) = \phi(x / y)\f$.
+We have
+\f[
+  x \brem y
+  =
+  x - (x \bdiv y) y
+  =
+  x - k y
+  =
+  -( -x - k (-y))
+  =
+  -(x_0 - k y_0).
+\f]
+Finally, assume that \f$x < 0\f$ and that \f$y > 0\f$.
+Let \f$k = \phi(x_0 / y) = -\phi(x / y)\f$, again by the property above.
+We have
+\f[
+  x \brem y
+  =
+  x - (x \bdiv y) y
+  =
+  x - (-k) y
+  =
+  -( -x - k y)
+  =
+  -(x_0 - k y).
+\f]
+This completes the proof.
+
+<B><EM>Lemma 4</EM></B>
+If \f$x\f$, \f$y \in F_b^+\f$ then \f$\gcd(x, y) \in F_b^+\f$.
+
+<B><EM>Proof</EM></B>
+Let \f$x = n \cdot 2^e\f$ and \f$y = m \cdot 2^f\f$ with \f$n\f$, \f$m \in G_b\f$
+odd integers, and \f$e\f$, \f$f \in \Nset\f$.
+Then \f$\gcd(x, y) = \gcd(n, m) \cdot 2^{\min(e, f)}\f$, and therefore it
+belongs to \f$F_b^+\f$, since \f$\gcd(n, m) \le \min(n, m)\f$ so that it belongs
+to \f$G_b\f$.
+
+<B><EM>Lemma 5</EM></B>
+If \f$x\f$, \f$y \in F_b^+\f$, then \f$x / \gcd(x, y) \in F_b^+\f$.
+
+<B><EM>Proof</EM></B>
+With the same notation as in the previous Lemma, both \f$n\f$ and
+\f$\gcd(n, m) \in G_b\f$: but all positive odd integers up to and
+including \f$n\f$ belong to \f$G_b\f$, so that \f$n / \gcd(n, m)\f$
+does as well.
+By Lemma 1
+\f$x / \gcd(x, y) = n \cdot 2^e / (\gcd(n, m) \cdot 2^{\min(e, f)})
+                = (n / \gcd(n, m)) \cdot 2^{e - \min(e, f)} \in F_b^+\f$.
+
+\endif
+
+*/ /* \mainpage */
diff --git a/doc/devref.doxyconf-html b/doc/devref.doxyconf-html
new file mode 100644
index 0000000..4a11633
--- /dev/null
+++ b/doc/devref.doxyconf-html
@@ -0,0 +1,1446 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         = 0.9
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING   = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = Include_Implementation_Details
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  = ./definitions.dox \
+                         ./../src/namespaces.hh \
+                         ../src/version.hh \
+                         ./../src/version.cc \
+                         ./../src/Float.defs.hh \
+                         ./../src/Float.inlines.hh \
+                         ./../src/Float.cc \
+                         ./../src/Checked_Number.types.hh \
+                         ./../src/Checked_Number.defs.hh \
+                         ./../src/Checked_Number.inlines.hh \
+                         ./../src/Checked_Number.cc \
+                         ./../src/GMP_Integer.types.hh \
+                         ./../src/GMP_Integer.defs.hh \
+                         ./../src/GMP_Integer.inlines.hh \
+                         ./../src/Coefficient_traits_template.hh \
+                         ./../src/Coefficient.types.hh \
+                         ./../src/Coefficient.defs.hh \
+                         ./../src/Coefficient.inlines.hh \
+                         ./../src/Coefficient.cc \
+                         ./../src/Limits.hh \
+                         ./../src/checked.defs.hh \
+                         ./../src/checked.inlines.hh \
+                         ./../src/checked_float.inlines.hh \
+                         ./../src/checked_int.inlines.hh \
+                         ./../src/checked_mpq.inlines.hh \
+                         ./../src/checked_mpz.inlines.hh \
+                         ./../src/checked.cc \
+                         ./../src/Init.types.hh \
+                         ./../src/Init.defs.hh \
+                         ./../src/Init.cc \
+                         ./../src/initializer.hh \
+                         ./../src/globals.types.hh \
+                         ./../src/globals.defs.hh \
+                         ./../src/globals.inlines.hh \
+                         ./../src/globals.cc \
+                         ./../src/Topology.hh \
+                         ./../src/Row.types.hh \
+                         ./../src/Row.defs.hh \
+                         ./../src/Row.inlines.hh \
+                         ./../src/Row.cc \
+                         ./../src/Matrix.types.hh \
+                         ./../src/Matrix.defs.hh \
+                         ./../src/Matrix.inlines.hh \
+                         ./../src/Matrix.cc \
+                         ./../src/Linear_Row.types.hh \
+                         ./../src/Linear_Row.defs.hh \
+                         ./../src/Linear_Row.inlines.hh \
+                         ./../src/Linear_Row.cc \
+                         ./../src/Linear_System.types.hh \
+                         ./../src/Linear_System.defs.hh \
+                         ./../src/Linear_System.inlines.hh \
+                         ./../src/Linear_System.cc \
+                         ./../src/Saturation_Row.types.hh \
+                         ./../src/Saturation_Row.defs.hh \
+                         ./../src/Saturation_Row.inlines.hh \
+                         ./../src/Saturation_Row.cc \
+                         ./../src/Saturation_Matrix.types.hh \
+                         ./../src/Saturation_Matrix.defs.hh \
+                         ./../src/Saturation_Matrix.inlines.hh \
+                         ./../src/Saturation_Matrix.cc \
+                         ./../src/Variable.types.hh \
+                         ./../src/Variable.defs.hh \
+                         ./../src/Variable.inlines.hh \
+                         ./../src/Variable.cc \
+                         ./../src/Linear_Expression.types.hh \
+                         ./../src/Linear_Expression.defs.hh \
+                         ./../src/Linear_Expression.inlines.hh \
+                         ./../src/Linear_Expression.cc \
+                         ./../src/Constraint.types.hh \
+                         ./../src/Constraint.defs.hh \
+                         ./../src/Constraint.inlines.hh \
+                         ./../src/Constraint.cc \
+                         ./../src/Congruence.types.hh \
+                         ./../src/Congruence.defs.hh \
+                         ./../src/Congruence.inlines.hh \
+                         ./../src/Congruence.cc \
+                         ./../src/Generator.types.hh \
+                         ./../src/Generator.defs.hh \
+                         ./../src/Generator.inlines.hh \
+                         ./../src/Generator.cc \
+                         ./../src/Grid_Generator.types.hh \
+                         ./../src/Grid_Generator.defs.hh \
+                         ./../src/Grid_Generator.inlines.hh \
+                         ./../src/Grid_Generator.cc \
+                         ./../src/Constraint_System.types.hh \
+                         ./../src/Constraint_System.defs.hh \
+                         ./../src/Constraint_System.inlines.hh \
+                         ./../src/Constraint_System.cc \
+                         ./../src/Congruence_System.types.hh \
+                         ./../src/Congruence_System.defs.hh \
+                         ./../src/Congruence_System.inlines.hh \
+                         ./../src/Congruence_System.cc \
+                         ./../src/Generator_System.defs.hh \
+                         ./../src/Generator_System.types.hh \
+                         ./../src/Generator_System.inlines.hh \
+                         ./../src/Generator_System.cc \
+                         ./../src/Grid_Generator_System.defs.hh \
+                         ./../src/Grid_Generator_System.types.hh \
+                         ./../src/Grid_Generator_System.inlines.hh \
+                         ./../src/Grid_Generator_System.cc \
+                         ./../src/Scalar_Products.types.hh \
+                         ./../src/Scalar_Products.defs.hh \
+                         ./../src/Scalar_Products.inlines.hh \
+                         ./../src/Scalar_Products.cc \
+                         ./../src/Ph_Status.idefs.hh \
+                         ./../src/Ph_Status.inlines.hh \
+                         ./../src/Ph_Status.cc \
+                         ./../src/Polyhedron.types.hh \
+                         ./../src/Polyhedron.defs.hh \
+                         ./../src/Polyhedron.inlines.hh \
+                         ./../src/Polyhedron.templates.hh \
+                         ./../src/Polyhedron_public.cc \
+                         ./../src/Polyhedron_nonpublic.cc \
+                         ./../src/Polyhedron_widenings.cc \
+                         ./../src/Polyhedron_chdims.cc \
+                         ./../src/conversion.cc \
+                         ./../src/minimize.cc \
+                         ./../src/simplify.cc \
+                         ./../src/Grid.types.hh \
+                         ./../src/Grid.defs.hh \
+                         ./../src/Grid.inlines.hh \
+                         ./../src/Grid.templates.hh \
+                         ./../src/Grid_public.cc \
+                         ./../src/Grid_nonpublic.cc \
+                         ./../src/Grid_conversion.cc \
+                         ./../src/Grid_simplify.cc \
+                         ./../src/Grid_widenings.cc \
+                         ./../src/Grid_chdims.cc \
+                         ./../src/Poly_Con_Relation.types.hh \
+                         ./../src/Poly_Con_Relation.defs.hh \
+                         ./../src/Poly_Con_Relation.inlines.hh \
+                         ./../src/Poly_Con_Relation.cc \
+                         ./../src/Poly_Gen_Relation.types.hh \
+                         ./../src/Poly_Gen_Relation.defs.hh \
+                         ./../src/Poly_Gen_Relation.inlines.hh \
+                         ./../src/Poly_Gen_Relation.cc \
+                         ./../src/Interval.types.hh \
+                         ./../src/Interval.defs.hh \
+                         ./../src/Interval.inlines.hh \
+                         ./../src/Interval.cc \
+                         ./../src/Bounding_Box.types.hh \
+                         ./../src/Bounding_Box.defs.hh \
+                         ./../src/Bounding_Box.inlines.hh \
+                         ./../src/Bounding_Box.cc \
+                         ./../src/C_Polyhedron.types.hh \
+                         ./../src/C_Polyhedron.defs.hh \
+                         ./../src/C_Polyhedron.inlines.hh \
+                         ./../src/C_Polyhedron.cc \
+                         ./../src/NNC_Polyhedron.types.hh \
+                         ./../src/NNC_Polyhedron.defs.hh \
+                         ./../src/NNC_Polyhedron.inlines.hh \
+                         ./../src/NNC_Polyhedron.cc \
+                         ./../src/Widening_Function.types.hh \
+                         ./../src/Widening_Function.defs.hh \
+                         ./../src/Widening_Function.inlines.hh \
+                         ./../src/BHRZ03_Certificate.types.hh \
+                         ./../src/BHRZ03_Certificate.defs.hh \
+                         ./../src/BHRZ03_Certificate.inlines.hh \
+                         ./../src/BHRZ03_Certificate.cc \
+                         ./../src/H79_Certificate.types.hh \
+                         ./../src/H79_Certificate.defs.hh \
+                         ./../src/H79_Certificate.inlines.hh \
+                         ./../src/H79_Certificate.cc \
+                         ./../src/Grid_Certificate.types.hh \
+                         ./../src/Grid_Certificate.defs.hh \
+                         ./../src/Grid_Certificate.inlines.hh \
+                         ./../src/Grid_Certificate.cc \
+                         ./../src/Determinate.defs.hh \
+                         ./../src/Determinate.inlines.hh \
+                         ./../src/Powerset.defs.hh \
+                         ./../src/Powerset.inlines.hh \
+                         ./../src/Powerset.templates.hh \
+                         ./../src/Polyhedra_Powerset.types.hh \
+                         ./../src/Polyhedra_Powerset.defs.hh \
+                         ./../src/Polyhedra_Powerset.inlines.hh \
+                         ./../src/Polyhedra_Powerset.templates.hh \
+                         ./../src/Polyhedra_Powerset.cc \
+                         ./../src/algorithms.hh \
+                         ./../src/LP_Problem.types.hh \
+                         ./../src/LP_Problem.defs.hh \
+                         ./../src/LP_Problem.inlines.hh \
+                         ./../src/LP_Problem.cc \
+                         ./../src/DB_Row.types.hh \
+                         ./../src/DB_Row.defs.hh \
+                         ./../src/DB_Row.inlines.hh \
+                         ./../src/DB_Matrix.types.hh \
+                         ./../src/DB_Matrix.defs.hh \
+                         ./../src/DB_Matrix.inlines.hh \
+                         ./../src/BD_Shape.types.hh \
+                         ./../src/BD_Shape.defs.hh \
+                         ./../src/BD_Shape.inlines.hh \
+                         ./../src/BD_Shape.templates.hh \
+                         ./../src/BD_Shape.cc \
+                         ../interfaces/C/ppl_c.h \
+                         ./../interfaces/C/ppl_c.cc \
+                         ./../interfaces/Prolog/Prolog_interface.dox \
+                         ./../interfaces/Prolog/exceptions.hh \
+                         ./../interfaces/Prolog/track_allocation.hh \
+                         ./../interfaces/Prolog/ppl_prolog.icc \
+                         ./../interfaces/Prolog/Ciao/ppl_ciao.cc \
+                         ./../interfaces/Prolog/GNU/ppl_gprolog_sd.cc \
+                         ./../interfaces/Prolog/SICStus/ppl_sicstus_sd.cc \
+                         ./../interfaces/Prolog/SWI/ppl_swiprolog.cc \
+                         ./../interfaces/Prolog/YAP/ppl_yap.cc \
+                         ./gpl.dox \
+                         ./fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS          = *.hh \
+                         *.cc \
+                         *.dox
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.  Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.  The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = devref.html-dir
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = ./devref.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.  This is useful
+# if you want to understand what is going on.  On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = CATCH_ALL \
+                         PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#   TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#   TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH    = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT   = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/doc/devref.doxyconf-html.in b/doc/devref.doxyconf-html.in
new file mode 100644
index 0000000..e1a868b
--- /dev/null
+++ b/doc/devref.doxyconf-html.in
@@ -0,0 +1,1446 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         = @VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING   = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = Include_Implementation_Details
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  = @srcdir@/definitions.dox \
+                         @srcdir@/../src/namespaces.hh \
+                         ../src/version.hh \
+                         @srcdir@/../src/version.cc \
+                         @srcdir@/../src/Float.defs.hh \
+                         @srcdir@/../src/Float.inlines.hh \
+                         @srcdir@/../src/Float.cc \
+                         @srcdir@/../src/Checked_Number.types.hh \
+                         @srcdir@/../src/Checked_Number.defs.hh \
+                         @srcdir@/../src/Checked_Number.inlines.hh \
+                         @srcdir@/../src/Checked_Number.cc \
+                         @srcdir@/../src/GMP_Integer.types.hh \
+                         @srcdir@/../src/GMP_Integer.defs.hh \
+                         @srcdir@/../src/GMP_Integer.inlines.hh \
+                         @srcdir@/../src/Coefficient_traits_template.hh \
+                         @srcdir@/../src/Coefficient.types.hh \
+                         @srcdir@/../src/Coefficient.defs.hh \
+                         @srcdir@/../src/Coefficient.inlines.hh \
+                         @srcdir@/../src/Coefficient.cc \
+                         @srcdir@/../src/Limits.hh \
+                         @srcdir@/../src/checked.defs.hh \
+                         @srcdir@/../src/checked.inlines.hh \
+                         @srcdir@/../src/checked_float.inlines.hh \
+                         @srcdir@/../src/checked_int.inlines.hh \
+                         @srcdir@/../src/checked_mpq.inlines.hh \
+                         @srcdir@/../src/checked_mpz.inlines.hh \
+                         @srcdir@/../src/checked.cc \
+                         @srcdir@/../src/Init.types.hh \
+                         @srcdir@/../src/Init.defs.hh \
+                         @srcdir@/../src/Init.cc \
+                         @srcdir@/../src/initializer.hh \
+                         @srcdir@/../src/globals.types.hh \
+                         @srcdir@/../src/globals.defs.hh \
+                         @srcdir@/../src/globals.inlines.hh \
+                         @srcdir@/../src/globals.cc \
+                         @srcdir@/../src/Topology.hh \
+                         @srcdir@/../src/Row.types.hh \
+                         @srcdir@/../src/Row.defs.hh \
+                         @srcdir@/../src/Row.inlines.hh \
+                         @srcdir@/../src/Row.cc \
+                         @srcdir@/../src/Matrix.types.hh \
+                         @srcdir@/../src/Matrix.defs.hh \
+                         @srcdir@/../src/Matrix.inlines.hh \
+                         @srcdir@/../src/Matrix.cc \
+                         @srcdir@/../src/Linear_Row.types.hh \
+                         @srcdir@/../src/Linear_Row.defs.hh \
+                         @srcdir@/../src/Linear_Row.inlines.hh \
+                         @srcdir@/../src/Linear_Row.cc \
+                         @srcdir@/../src/Linear_System.types.hh \
+                         @srcdir@/../src/Linear_System.defs.hh \
+                         @srcdir@/../src/Linear_System.inlines.hh \
+                         @srcdir@/../src/Linear_System.cc \
+                         @srcdir@/../src/Saturation_Row.types.hh \
+                         @srcdir@/../src/Saturation_Row.defs.hh \
+                         @srcdir@/../src/Saturation_Row.inlines.hh \
+                         @srcdir@/../src/Saturation_Row.cc \
+                         @srcdir@/../src/Saturation_Matrix.types.hh \
+                         @srcdir@/../src/Saturation_Matrix.defs.hh \
+                         @srcdir@/../src/Saturation_Matrix.inlines.hh \
+                         @srcdir@/../src/Saturation_Matrix.cc \
+                         @srcdir@/../src/Variable.types.hh \
+                         @srcdir@/../src/Variable.defs.hh \
+                         @srcdir@/../src/Variable.inlines.hh \
+                         @srcdir@/../src/Variable.cc \
+                         @srcdir@/../src/Linear_Expression.types.hh \
+                         @srcdir@/../src/Linear_Expression.defs.hh \
+                         @srcdir@/../src/Linear_Expression.inlines.hh \
+                         @srcdir@/../src/Linear_Expression.cc \
+                         @srcdir@/../src/Constraint.types.hh \
+                         @srcdir@/../src/Constraint.defs.hh \
+                         @srcdir@/../src/Constraint.inlines.hh \
+                         @srcdir@/../src/Constraint.cc \
+                         @srcdir@/../src/Congruence.types.hh \
+                         @srcdir@/../src/Congruence.defs.hh \
+                         @srcdir@/../src/Congruence.inlines.hh \
+                         @srcdir@/../src/Congruence.cc \
+                         @srcdir@/../src/Generator.types.hh \
+                         @srcdir@/../src/Generator.defs.hh \
+                         @srcdir@/../src/Generator.inlines.hh \
+                         @srcdir@/../src/Generator.cc \
+                         @srcdir@/../src/Grid_Generator.types.hh \
+                         @srcdir@/../src/Grid_Generator.defs.hh \
+                         @srcdir@/../src/Grid_Generator.inlines.hh \
+                         @srcdir@/../src/Grid_Generator.cc \
+                         @srcdir@/../src/Constraint_System.types.hh \
+                         @srcdir@/../src/Constraint_System.defs.hh \
+                         @srcdir@/../src/Constraint_System.inlines.hh \
+                         @srcdir@/../src/Constraint_System.cc \
+                         @srcdir@/../src/Congruence_System.types.hh \
+                         @srcdir@/../src/Congruence_System.defs.hh \
+                         @srcdir@/../src/Congruence_System.inlines.hh \
+                         @srcdir@/../src/Congruence_System.cc \
+                         @srcdir@/../src/Generator_System.defs.hh \
+                         @srcdir@/../src/Generator_System.types.hh \
+                         @srcdir@/../src/Generator_System.inlines.hh \
+                         @srcdir@/../src/Generator_System.cc \
+                         @srcdir@/../src/Grid_Generator_System.defs.hh \
+                         @srcdir@/../src/Grid_Generator_System.types.hh \
+                         @srcdir@/../src/Grid_Generator_System.inlines.hh \
+                         @srcdir@/../src/Grid_Generator_System.cc \
+                         @srcdir@/../src/Scalar_Products.types.hh \
+                         @srcdir@/../src/Scalar_Products.defs.hh \
+                         @srcdir@/../src/Scalar_Products.inlines.hh \
+                         @srcdir@/../src/Scalar_Products.cc \
+                         @srcdir@/../src/Ph_Status.idefs.hh \
+                         @srcdir@/../src/Ph_Status.inlines.hh \
+                         @srcdir@/../src/Ph_Status.cc \
+                         @srcdir@/../src/Polyhedron.types.hh \
+                         @srcdir@/../src/Polyhedron.defs.hh \
+                         @srcdir@/../src/Polyhedron.inlines.hh \
+                         @srcdir@/../src/Polyhedron.templates.hh \
+                         @srcdir@/../src/Polyhedron_public.cc \
+                         @srcdir@/../src/Polyhedron_nonpublic.cc \
+                         @srcdir@/../src/Polyhedron_widenings.cc \
+                         @srcdir@/../src/Polyhedron_chdims.cc \
+                         @srcdir@/../src/conversion.cc \
+                         @srcdir@/../src/minimize.cc \
+                         @srcdir@/../src/simplify.cc \
+                         @srcdir@/../src/Grid.types.hh \
+                         @srcdir@/../src/Grid.defs.hh \
+                         @srcdir@/../src/Grid.inlines.hh \
+                         @srcdir@/../src/Grid.templates.hh \
+                         @srcdir@/../src/Grid_public.cc \
+                         @srcdir@/../src/Grid_nonpublic.cc \
+                         @srcdir@/../src/Grid_conversion.cc \
+                         @srcdir@/../src/Grid_simplify.cc \
+                         @srcdir@/../src/Grid_widenings.cc \
+                         @srcdir@/../src/Grid_chdims.cc \
+                         @srcdir@/../src/Poly_Con_Relation.types.hh \
+                         @srcdir@/../src/Poly_Con_Relation.defs.hh \
+                         @srcdir@/../src/Poly_Con_Relation.inlines.hh \
+                         @srcdir@/../src/Poly_Con_Relation.cc \
+                         @srcdir@/../src/Poly_Gen_Relation.types.hh \
+                         @srcdir@/../src/Poly_Gen_Relation.defs.hh \
+                         @srcdir@/../src/Poly_Gen_Relation.inlines.hh \
+                         @srcdir@/../src/Poly_Gen_Relation.cc \
+                         @srcdir@/../src/Interval.types.hh \
+                         @srcdir@/../src/Interval.defs.hh \
+                         @srcdir@/../src/Interval.inlines.hh \
+                         @srcdir@/../src/Interval.cc \
+                         @srcdir@/../src/Bounding_Box.types.hh \
+                         @srcdir@/../src/Bounding_Box.defs.hh \
+                         @srcdir@/../src/Bounding_Box.inlines.hh \
+                         @srcdir@/../src/Bounding_Box.cc \
+                         @srcdir@/../src/C_Polyhedron.types.hh \
+                         @srcdir@/../src/C_Polyhedron.defs.hh \
+                         @srcdir@/../src/C_Polyhedron.inlines.hh \
+                         @srcdir@/../src/C_Polyhedron.cc \
+                         @srcdir@/../src/NNC_Polyhedron.types.hh \
+                         @srcdir@/../src/NNC_Polyhedron.defs.hh \
+                         @srcdir@/../src/NNC_Polyhedron.inlines.hh \
+                         @srcdir@/../src/NNC_Polyhedron.cc \
+                         @srcdir@/../src/Widening_Function.types.hh \
+                         @srcdir@/../src/Widening_Function.defs.hh \
+                         @srcdir@/../src/Widening_Function.inlines.hh \
+                         @srcdir@/../src/BHRZ03_Certificate.types.hh \
+                         @srcdir@/../src/BHRZ03_Certificate.defs.hh \
+                         @srcdir@/../src/BHRZ03_Certificate.inlines.hh \
+                         @srcdir@/../src/BHRZ03_Certificate.cc \
+                         @srcdir@/../src/H79_Certificate.types.hh \
+                         @srcdir@/../src/H79_Certificate.defs.hh \
+                         @srcdir@/../src/H79_Certificate.inlines.hh \
+                         @srcdir@/../src/H79_Certificate.cc \
+                         @srcdir@/../src/Grid_Certificate.types.hh \
+                         @srcdir@/../src/Grid_Certificate.defs.hh \
+                         @srcdir@/../src/Grid_Certificate.inlines.hh \
+                         @srcdir@/../src/Grid_Certificate.cc \
+                         @srcdir@/../src/Determinate.defs.hh \
+                         @srcdir@/../src/Determinate.inlines.hh \
+                         @srcdir@/../src/Powerset.defs.hh \
+                         @srcdir@/../src/Powerset.inlines.hh \
+                         @srcdir@/../src/Powerset.templates.hh \
+                         @srcdir@/../src/Polyhedra_Powerset.types.hh \
+                         @srcdir@/../src/Polyhedra_Powerset.defs.hh \
+                         @srcdir@/../src/Polyhedra_Powerset.inlines.hh \
+                         @srcdir@/../src/Polyhedra_Powerset.templates.hh \
+                         @srcdir@/../src/Polyhedra_Powerset.cc \
+                         @srcdir@/../src/algorithms.hh \
+                         @srcdir@/../src/LP_Problem.types.hh \
+                         @srcdir@/../src/LP_Problem.defs.hh \
+                         @srcdir@/../src/LP_Problem.inlines.hh \
+                         @srcdir@/../src/LP_Problem.cc \
+                         @srcdir@/../src/DB_Row.types.hh \
+                         @srcdir@/../src/DB_Row.defs.hh \
+                         @srcdir@/../src/DB_Row.inlines.hh \
+                         @srcdir@/../src/DB_Matrix.types.hh \
+                         @srcdir@/../src/DB_Matrix.defs.hh \
+                         @srcdir@/../src/DB_Matrix.inlines.hh \
+                         @srcdir@/../src/BD_Shape.types.hh \
+                         @srcdir@/../src/BD_Shape.defs.hh \
+                         @srcdir@/../src/BD_Shape.inlines.hh \
+                         @srcdir@/../src/BD_Shape.templates.hh \
+                         @srcdir@/../src/BD_Shape.cc \
+                         ../interfaces/C/ppl_c.h \
+                         @srcdir@/../interfaces/C/ppl_c.cc \
+                         @srcdir@/../interfaces/Prolog/Prolog_interface.dox \
+                         @srcdir@/../interfaces/Prolog/exceptions.hh \
+                         @srcdir@/../interfaces/Prolog/track_allocation.hh \
+                         @srcdir@/../interfaces/Prolog/ppl_prolog.icc \
+                         @srcdir@/../interfaces/Prolog/Ciao/ppl_ciao.cc \
+                         @srcdir@/../interfaces/Prolog/GNU/ppl_gprolog_sd.cc \
+                         @srcdir@/../interfaces/Prolog/SICStus/ppl_sicstus_sd.cc \
+                         @srcdir@/../interfaces/Prolog/SWI/ppl_swiprolog.cc \
+                         @srcdir@/../interfaces/Prolog/YAP/ppl_yap.cc \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS          = *.hh \
+                         *.cc \
+                         *.dox
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.  Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.  The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = devref.html-dir
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = @srcdir@/devref.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.  This is useful
+# if you want to understand what is going on.  On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = CATCH_ALL \
+                         PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#   TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#   TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = @PERL@
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH    = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT   = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/doc/devref.doxyconf-latex b/doc/devref.doxyconf-latex
new file mode 100644
index 0000000..7aca310
--- /dev/null
+++ b/doc/devref.doxyconf-latex
@@ -0,0 +1,1446 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         = 0.9
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING   = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = Include_Implementation_Details
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  = ./definitions.dox \
+                         ./../src/namespaces.hh \
+                         ../src/version.hh \
+                         ./../src/version.cc \
+                         ./../src/Float.defs.hh \
+                         ./../src/Float.inlines.hh \
+                         ./../src/Float.cc \
+                         ./../src/Checked_Number.types.hh \
+                         ./../src/Checked_Number.defs.hh \
+                         ./../src/Checked_Number.inlines.hh \
+                         ./../src/Checked_Number.cc \
+                         ./../src/GMP_Integer.types.hh \
+                         ./../src/GMP_Integer.defs.hh \
+                         ./../src/GMP_Integer.inlines.hh \
+                         ./../src/Coefficient_traits_template.hh \
+                         ./../src/Coefficient.types.hh \
+                         ./../src/Coefficient.defs.hh \
+                         ./../src/Coefficient.inlines.hh \
+                         ./../src/Coefficient.cc \
+                         ./../src/Limits.hh \
+                         ./../src/checked.defs.hh \
+                         ./../src/checked.inlines.hh \
+                         ./../src/checked_float.inlines.hh \
+                         ./../src/checked_int.inlines.hh \
+                         ./../src/checked_mpq.inlines.hh \
+                         ./../src/checked_mpz.inlines.hh \
+                         ./../src/checked.cc \
+                         ./../src/Init.types.hh \
+                         ./../src/Init.defs.hh \
+                         ./../src/Init.cc \
+                         ./../src/initializer.hh \
+                         ./../src/globals.defs.hh \
+                         ./../src/globals.types.hh \
+                         ./../src/globals.inlines.hh \
+                         ./../src/globals.cc \
+                         ./../src/Topology.hh \
+                         ./../src/Row.types.hh \
+                         ./../src/Row.defs.hh \
+                         ./../src/Row.inlines.hh \
+                         ./../src/Row.cc \
+                         ./../src/Matrix.types.hh \
+                         ./../src/Matrix.defs.hh \
+                         ./../src/Matrix.inlines.hh \
+                         ./../src/Matrix.cc \
+                         ./../src/Linear_Row.types.hh \
+                         ./../src/Linear_Row.defs.hh \
+                         ./../src/Linear_Row.inlines.hh \
+                         ./../src/Linear_Row.cc \
+                         ./../src/Linear_System.types.hh \
+                         ./../src/Linear_System.defs.hh \
+                         ./../src/Linear_System.inlines.hh \
+                         ./../src/Linear_System.cc \
+                         ./../src/Saturation_Row.types.hh \
+                         ./../src/Saturation_Row.defs.hh \
+                         ./../src/Saturation_Row.inlines.hh \
+                         ./../src/Saturation_Row.cc \
+                         ./../src/Saturation_Matrix.types.hh \
+                         ./../src/Saturation_Matrix.defs.hh \
+                         ./../src/Saturation_Matrix.inlines.hh \
+                         ./../src/Saturation_Matrix.cc \
+                         ./../src/Variable.types.hh \
+                         ./../src/Variable.defs.hh \
+                         ./../src/Variable.inlines.hh \
+                         ./../src/Variable.cc \
+                         ./../src/Linear_Expression.types.hh \
+                         ./../src/Linear_Expression.defs.hh \
+                         ./../src/Linear_Expression.inlines.hh \
+                         ./../src/Linear_Expression.cc \
+                         ./../src/Constraint.types.hh \
+                         ./../src/Constraint.defs.hh \
+                         ./../src/Constraint.inlines.hh \
+                         ./../src/Constraint.cc \
+                         ./../src/Congruence.types.hh \
+                         ./../src/Congruence.defs.hh \
+                         ./../src/Congruence.inlines.hh \
+                         ./../src/Congruence.cc \
+                         ./../src/Generator.types.hh \
+                         ./../src/Generator.defs.hh \
+                         ./../src/Generator.inlines.hh \
+                         ./../src/Generator.cc \
+                         ./../src/Grid_Generator.types.hh \
+                         ./../src/Grid_Generator.defs.hh \
+                         ./../src/Grid_Generator.inlines.hh \
+                         ./../src/Grid_Generator.cc \
+                         ./../src/Constraint_System.types.hh \
+                         ./../src/Constraint_System.defs.hh \
+                         ./../src/Constraint_System.inlines.hh \
+                         ./../src/Constraint_System.cc \
+                         ./../src/Congruence_System.types.hh \
+                         ./../src/Congruence_System.defs.hh \
+                         ./../src/Congruence_System.inlines.hh \
+                         ./../src/Congruence_System.cc \
+                         ./../src/Generator_System.defs.hh \
+                         ./../src/Generator_System.types.hh \
+                         ./../src/Generator_System.inlines.hh \
+                         ./../src/Generator_System.cc \
+                         ./../src/Grid_Generator_System.defs.hh \
+                         ./../src/Grid_Generator_System.types.hh \
+                         ./../src/Grid_Generator_System.inlines.hh \
+                         ./../src/Grid_Generator_System.cc \
+                         ./../src/Scalar_Products.types.hh \
+                         ./../src/Scalar_Products.defs.hh \
+                         ./../src/Scalar_Products.inlines.hh \
+                         ./../src/Scalar_Products.cc \
+                         ./../src/Ph_Status.idefs.hh \
+                         ./../src/Ph_Status.inlines.hh \
+                         ./../src/Ph_Status.cc \
+                         ./../src/Polyhedron.types.hh \
+                         ./../src/Polyhedron.defs.hh \
+                         ./../src/Polyhedron.inlines.hh \
+                         ./../src/Polyhedron.templates.hh \
+                         ./../src/Polyhedron_public.cc \
+                         ./../src/Polyhedron_nonpublic.cc \
+                         ./../src/Polyhedron_widenings.cc \
+                         ./../src/Polyhedron_chdims.cc \
+                         ./../src/conversion.cc \
+                         ./../src/minimize.cc \
+                         ./../src/simplify.cc \
+                         ./../src/Grid.types.hh \
+                         ./../src/Grid.defs.hh \
+                         ./../src/Grid.inlines.hh \
+                         ./../src/Grid.templates.hh \
+                         ./../src/Grid_public.cc \
+                         ./../src/Grid_nonpublic.cc \
+                         ./../src/Grid_widenings.cc \
+                         ./../src/Grid_chdims.cc \
+                         ./../src/Grid_conversion.cc \
+                         ./../src/Grid_simplify.cc \
+                         ./../src/Poly_Con_Relation.types.hh \
+                         ./../src/Poly_Con_Relation.defs.hh \
+                         ./../src/Poly_Con_Relation.inlines.hh \
+                         ./../src/Poly_Con_Relation.cc \
+                         ./../src/Poly_Gen_Relation.types.hh \
+                         ./../src/Poly_Gen_Relation.defs.hh \
+                         ./../src/Poly_Gen_Relation.inlines.hh \
+                         ./../src/Poly_Gen_Relation.cc \
+                         ./../src/Interval.types.hh \
+                         ./../src/Interval.defs.hh \
+                         ./../src/Interval.inlines.hh \
+                         ./../src/Interval.cc \
+                         ./../src/Bounding_Box.types.hh \
+                         ./../src/Bounding_Box.defs.hh \
+                         ./../src/Bounding_Box.inlines.hh \
+                         ./../src/Bounding_Box.cc \
+                         ./../src/C_Polyhedron.types.hh \
+                         ./../src/C_Polyhedron.defs.hh \
+                         ./../src/C_Polyhedron.inlines.hh \
+                         ./../src/C_Polyhedron.cc \
+                         ./../src/NNC_Polyhedron.types.hh \
+                         ./../src/NNC_Polyhedron.defs.hh \
+                         ./../src/NNC_Polyhedron.inlines.hh \
+                         ./../src/NNC_Polyhedron.cc \
+                         ./../src/Widening_Function.types.hh \
+                         ./../src/Widening_Function.defs.hh \
+                         ./../src/Widening_Function.inlines.hh \
+                         ./../src/BHRZ03_Certificate.types.hh \
+                         ./../src/BHRZ03_Certificate.defs.hh \
+                         ./../src/BHRZ03_Certificate.inlines.hh \
+                         ./../src/BHRZ03_Certificate.cc \
+                         ./../src/H79_Certificate.types.hh \
+                         ./../src/H79_Certificate.defs.hh \
+                         ./../src/H79_Certificate.inlines.hh \
+                         ./../src/H79_Certificate.cc \
+                         ./../src/Grid_Certificate.types.hh \
+                         ./../src/Grid_Certificate.defs.hh \
+                         ./../src/Grid_Certificate.inlines.hh \
+                         ./../src/Grid_Certificate.cc \
+                         ./../src/Determinate.defs.hh \
+                         ./../src/Determinate.inlines.hh \
+                         ./../src/Powerset.defs.hh \
+                         ./../src/Powerset.inlines.hh \
+                         ./../src/Powerset.templates.hh \
+                         ./../src/Polyhedra_Powerset.types.hh \
+                         ./../src/Polyhedra_Powerset.defs.hh \
+                         ./../src/Polyhedra_Powerset.inlines.hh \
+                         ./../src/Polyhedra_Powerset.templates.hh \
+                         ./../src/Polyhedra_Powerset.cc \
+                         ./../src/algorithms.hh \
+                         ./../src/LP_Problem.types.hh \
+                         ./../src/LP_Problem.defs.hh \
+                         ./../src/LP_Problem.inlines.hh \
+                         ./../src/LP_Problem.cc \
+                         ./../src/DB_Row.types.hh \
+                         ./../src/DB_Row.defs.hh \
+                         ./../src/DB_Row.inlines.hh \
+                         ./../src/DB_Matrix.types.hh \
+                         ./../src/DB_Matrix.defs.hh \
+                         ./../src/DB_Matrix.inlines.hh \
+                         ./../src/BD_Shape.types.hh \
+                         ./../src/BD_Shape.defs.hh \
+                         ./../src/BD_Shape.inlines.hh \
+                         ./../src/BD_Shape.templates.hh \
+                         ./../src/BD_Shape.cc \
+                         ../interfaces/C/ppl_c.h \
+                         ./../interfaces/C/ppl_c.cc \
+                         ./../interfaces/Prolog/Prolog_interface.dox \
+                         ./../interfaces/Prolog/exceptions.hh \
+                         ./../interfaces/Prolog/track_allocation.hh \
+                         ./../interfaces/Prolog/ppl_prolog.icc \
+                         ./../interfaces/Prolog/Ciao/ppl_ciao.cc \
+                         ./../interfaces/Prolog/GNU/ppl_gprolog_sd.cc \
+                         ./../interfaces/Prolog/SICStus/ppl_sicstus_sd.cc \
+                         ./../interfaces/Prolog/SWI/ppl_swiprolog.cc \
+                         ./../interfaces/Prolog/YAP/ppl_yap.cc \
+                         ./gpl.dox \
+                         ./fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS          = *.hh \
+                         *.cc \
+                         *.dox
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.  Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.  The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = NO
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = devref.latex-dir
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = ./devref.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.  This is useful
+# if you want to understand what is going on.  On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = CATCH_ALL \
+                         PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#   TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#   TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH    = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT   = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/doc/devref.doxyconf-latex.in b/doc/devref.doxyconf-latex.in
new file mode 100644
index 0000000..51884ad
--- /dev/null
+++ b/doc/devref.doxyconf-latex.in
@@ -0,0 +1,1446 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         = @VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING   = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = Include_Implementation_Details
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  = @srcdir@/definitions.dox \
+                         @srcdir@/../src/namespaces.hh \
+                         ../src/version.hh \
+                         @srcdir@/../src/version.cc \
+                         @srcdir@/../src/Float.defs.hh \
+                         @srcdir@/../src/Float.inlines.hh \
+                         @srcdir@/../src/Float.cc \
+                         @srcdir@/../src/Checked_Number.types.hh \
+                         @srcdir@/../src/Checked_Number.defs.hh \
+                         @srcdir@/../src/Checked_Number.inlines.hh \
+                         @srcdir@/../src/Checked_Number.cc \
+                         @srcdir@/../src/GMP_Integer.types.hh \
+                         @srcdir@/../src/GMP_Integer.defs.hh \
+                         @srcdir@/../src/GMP_Integer.inlines.hh \
+                         @srcdir@/../src/Coefficient_traits_template.hh \
+                         @srcdir@/../src/Coefficient.types.hh \
+                         @srcdir@/../src/Coefficient.defs.hh \
+                         @srcdir@/../src/Coefficient.inlines.hh \
+                         @srcdir@/../src/Coefficient.cc \
+                         @srcdir@/../src/Limits.hh \
+                         @srcdir@/../src/checked.defs.hh \
+                         @srcdir@/../src/checked.inlines.hh \
+                         @srcdir@/../src/checked_float.inlines.hh \
+                         @srcdir@/../src/checked_int.inlines.hh \
+                         @srcdir@/../src/checked_mpq.inlines.hh \
+                         @srcdir@/../src/checked_mpz.inlines.hh \
+                         @srcdir@/../src/checked.cc \
+                         @srcdir@/../src/Init.types.hh \
+                         @srcdir@/../src/Init.defs.hh \
+                         @srcdir@/../src/Init.cc \
+                         @srcdir@/../src/initializer.hh \
+                         @srcdir@/../src/globals.defs.hh \
+                         @srcdir@/../src/globals.types.hh \
+                         @srcdir@/../src/globals.inlines.hh \
+                         @srcdir@/../src/globals.cc \
+                         @srcdir@/../src/Topology.hh \
+                         @srcdir@/../src/Row.types.hh \
+                         @srcdir@/../src/Row.defs.hh \
+                         @srcdir@/../src/Row.inlines.hh \
+                         @srcdir@/../src/Row.cc \
+                         @srcdir@/../src/Matrix.types.hh \
+                         @srcdir@/../src/Matrix.defs.hh \
+                         @srcdir@/../src/Matrix.inlines.hh \
+                         @srcdir@/../src/Matrix.cc \
+                         @srcdir@/../src/Linear_Row.types.hh \
+                         @srcdir@/../src/Linear_Row.defs.hh \
+                         @srcdir@/../src/Linear_Row.inlines.hh \
+                         @srcdir@/../src/Linear_Row.cc \
+                         @srcdir@/../src/Linear_System.types.hh \
+                         @srcdir@/../src/Linear_System.defs.hh \
+                         @srcdir@/../src/Linear_System.inlines.hh \
+                         @srcdir@/../src/Linear_System.cc \
+                         @srcdir@/../src/Saturation_Row.types.hh \
+                         @srcdir@/../src/Saturation_Row.defs.hh \
+                         @srcdir@/../src/Saturation_Row.inlines.hh \
+                         @srcdir@/../src/Saturation_Row.cc \
+                         @srcdir@/../src/Saturation_Matrix.types.hh \
+                         @srcdir@/../src/Saturation_Matrix.defs.hh \
+                         @srcdir@/../src/Saturation_Matrix.inlines.hh \
+                         @srcdir@/../src/Saturation_Matrix.cc \
+                         @srcdir@/../src/Variable.types.hh \
+                         @srcdir@/../src/Variable.defs.hh \
+                         @srcdir@/../src/Variable.inlines.hh \
+                         @srcdir@/../src/Variable.cc \
+                         @srcdir@/../src/Linear_Expression.types.hh \
+                         @srcdir@/../src/Linear_Expression.defs.hh \
+                         @srcdir@/../src/Linear_Expression.inlines.hh \
+                         @srcdir@/../src/Linear_Expression.cc \
+                         @srcdir@/../src/Constraint.types.hh \
+                         @srcdir@/../src/Constraint.defs.hh \
+                         @srcdir@/../src/Constraint.inlines.hh \
+                         @srcdir@/../src/Constraint.cc \
+                         @srcdir@/../src/Congruence.types.hh \
+                         @srcdir@/../src/Congruence.defs.hh \
+                         @srcdir@/../src/Congruence.inlines.hh \
+                         @srcdir@/../src/Congruence.cc \
+                         @srcdir@/../src/Generator.types.hh \
+                         @srcdir@/../src/Generator.defs.hh \
+                         @srcdir@/../src/Generator.inlines.hh \
+                         @srcdir@/../src/Generator.cc \
+                         @srcdir@/../src/Grid_Generator.types.hh \
+                         @srcdir@/../src/Grid_Generator.defs.hh \
+                         @srcdir@/../src/Grid_Generator.inlines.hh \
+                         @srcdir@/../src/Grid_Generator.cc \
+                         @srcdir@/../src/Constraint_System.types.hh \
+                         @srcdir@/../src/Constraint_System.defs.hh \
+                         @srcdir@/../src/Constraint_System.inlines.hh \
+                         @srcdir@/../src/Constraint_System.cc \
+                         @srcdir@/../src/Congruence_System.types.hh \
+                         @srcdir@/../src/Congruence_System.defs.hh \
+                         @srcdir@/../src/Congruence_System.inlines.hh \
+                         @srcdir@/../src/Congruence_System.cc \
+                         @srcdir@/../src/Generator_System.defs.hh \
+                         @srcdir@/../src/Generator_System.types.hh \
+                         @srcdir@/../src/Generator_System.inlines.hh \
+                         @srcdir@/../src/Generator_System.cc \
+                         @srcdir@/../src/Grid_Generator_System.defs.hh \
+                         @srcdir@/../src/Grid_Generator_System.types.hh \
+                         @srcdir@/../src/Grid_Generator_System.inlines.hh \
+                         @srcdir@/../src/Grid_Generator_System.cc \
+                         @srcdir@/../src/Scalar_Products.types.hh \
+                         @srcdir@/../src/Scalar_Products.defs.hh \
+                         @srcdir@/../src/Scalar_Products.inlines.hh \
+                         @srcdir@/../src/Scalar_Products.cc \
+                         @srcdir@/../src/Ph_Status.idefs.hh \
+                         @srcdir@/../src/Ph_Status.inlines.hh \
+                         @srcdir@/../src/Ph_Status.cc \
+                         @srcdir@/../src/Polyhedron.types.hh \
+                         @srcdir@/../src/Polyhedron.defs.hh \
+                         @srcdir@/../src/Polyhedron.inlines.hh \
+                         @srcdir@/../src/Polyhedron.templates.hh \
+                         @srcdir@/../src/Polyhedron_public.cc \
+                         @srcdir@/../src/Polyhedron_nonpublic.cc \
+                         @srcdir@/../src/Polyhedron_widenings.cc \
+                         @srcdir@/../src/Polyhedron_chdims.cc \
+                         @srcdir@/../src/conversion.cc \
+                         @srcdir@/../src/minimize.cc \
+                         @srcdir@/../src/simplify.cc \
+                         @srcdir@/../src/Grid.types.hh \
+                         @srcdir@/../src/Grid.defs.hh \
+                         @srcdir@/../src/Grid.inlines.hh \
+                         @srcdir@/../src/Grid.templates.hh \
+                         @srcdir@/../src/Grid_public.cc \
+                         @srcdir@/../src/Grid_nonpublic.cc \
+                         @srcdir@/../src/Grid_widenings.cc \
+                         @srcdir@/../src/Grid_chdims.cc \
+                         @srcdir@/../src/Grid_conversion.cc \
+                         @srcdir@/../src/Grid_simplify.cc \
+                         @srcdir@/../src/Poly_Con_Relation.types.hh \
+                         @srcdir@/../src/Poly_Con_Relation.defs.hh \
+                         @srcdir@/../src/Poly_Con_Relation.inlines.hh \
+                         @srcdir@/../src/Poly_Con_Relation.cc \
+                         @srcdir@/../src/Poly_Gen_Relation.types.hh \
+                         @srcdir@/../src/Poly_Gen_Relation.defs.hh \
+                         @srcdir@/../src/Poly_Gen_Relation.inlines.hh \
+                         @srcdir@/../src/Poly_Gen_Relation.cc \
+                         @srcdir@/../src/Interval.types.hh \
+                         @srcdir@/../src/Interval.defs.hh \
+                         @srcdir@/../src/Interval.inlines.hh \
+                         @srcdir@/../src/Interval.cc \
+                         @srcdir@/../src/Bounding_Box.types.hh \
+                         @srcdir@/../src/Bounding_Box.defs.hh \
+                         @srcdir@/../src/Bounding_Box.inlines.hh \
+                         @srcdir@/../src/Bounding_Box.cc \
+                         @srcdir@/../src/C_Polyhedron.types.hh \
+                         @srcdir@/../src/C_Polyhedron.defs.hh \
+                         @srcdir@/../src/C_Polyhedron.inlines.hh \
+                         @srcdir@/../src/C_Polyhedron.cc \
+                         @srcdir@/../src/NNC_Polyhedron.types.hh \
+                         @srcdir@/../src/NNC_Polyhedron.defs.hh \
+                         @srcdir@/../src/NNC_Polyhedron.inlines.hh \
+                         @srcdir@/../src/NNC_Polyhedron.cc \
+                         @srcdir@/../src/Widening_Function.types.hh \
+                         @srcdir@/../src/Widening_Function.defs.hh \
+                         @srcdir@/../src/Widening_Function.inlines.hh \
+                         @srcdir@/../src/BHRZ03_Certificate.types.hh \
+                         @srcdir@/../src/BHRZ03_Certificate.defs.hh \
+                         @srcdir@/../src/BHRZ03_Certificate.inlines.hh \
+                         @srcdir@/../src/BHRZ03_Certificate.cc \
+                         @srcdir@/../src/H79_Certificate.types.hh \
+                         @srcdir@/../src/H79_Certificate.defs.hh \
+                         @srcdir@/../src/H79_Certificate.inlines.hh \
+                         @srcdir@/../src/H79_Certificate.cc \
+                         @srcdir@/../src/Grid_Certificate.types.hh \
+                         @srcdir@/../src/Grid_Certificate.defs.hh \
+                         @srcdir@/../src/Grid_Certificate.inlines.hh \
+                         @srcdir@/../src/Grid_Certificate.cc \
+                         @srcdir@/../src/Determinate.defs.hh \
+                         @srcdir@/../src/Determinate.inlines.hh \
+                         @srcdir@/../src/Powerset.defs.hh \
+                         @srcdir@/../src/Powerset.inlines.hh \
+                         @srcdir@/../src/Powerset.templates.hh \
+                         @srcdir@/../src/Polyhedra_Powerset.types.hh \
+                         @srcdir@/../src/Polyhedra_Powerset.defs.hh \
+                         @srcdir@/../src/Polyhedra_Powerset.inlines.hh \
+                         @srcdir@/../src/Polyhedra_Powerset.templates.hh \
+                         @srcdir@/../src/Polyhedra_Powerset.cc \
+                         @srcdir@/../src/algorithms.hh \
+                         @srcdir@/../src/LP_Problem.types.hh \
+                         @srcdir@/../src/LP_Problem.defs.hh \
+                         @srcdir@/../src/LP_Problem.inlines.hh \
+                         @srcdir@/../src/LP_Problem.cc \
+                         @srcdir@/../src/DB_Row.types.hh \
+                         @srcdir@/../src/DB_Row.defs.hh \
+                         @srcdir@/../src/DB_Row.inlines.hh \
+                         @srcdir@/../src/DB_Matrix.types.hh \
+                         @srcdir@/../src/DB_Matrix.defs.hh \
+                         @srcdir@/../src/DB_Matrix.inlines.hh \
+                         @srcdir@/../src/BD_Shape.types.hh \
+                         @srcdir@/../src/BD_Shape.defs.hh \
+                         @srcdir@/../src/BD_Shape.inlines.hh \
+                         @srcdir@/../src/BD_Shape.templates.hh \
+                         @srcdir@/../src/BD_Shape.cc \
+                         ../interfaces/C/ppl_c.h \
+                         @srcdir@/../interfaces/C/ppl_c.cc \
+                         @srcdir@/../interfaces/Prolog/Prolog_interface.dox \
+                         @srcdir@/../interfaces/Prolog/exceptions.hh \
+                         @srcdir@/../interfaces/Prolog/track_allocation.hh \
+                         @srcdir@/../interfaces/Prolog/ppl_prolog.icc \
+                         @srcdir@/../interfaces/Prolog/Ciao/ppl_ciao.cc \
+                         @srcdir@/../interfaces/Prolog/GNU/ppl_gprolog_sd.cc \
+                         @srcdir@/../interfaces/Prolog/SICStus/ppl_sicstus_sd.cc \
+                         @srcdir@/../interfaces/Prolog/SWI/ppl_swiprolog.cc \
+                         @srcdir@/../interfaces/Prolog/YAP/ppl_yap.cc \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS          = *.hh \
+                         *.cc \
+                         *.dox
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.  Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.  The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = NO
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = devref.latex-dir
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = @srcdir@/devref.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.  This is useful
+# if you want to understand what is going on.  On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = CATCH_ALL \
+                         PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#   TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#   TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = @PERL@
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH    = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT   = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/doc/devref.tex b/doc/devref.tex
new file mode 100644
index 0000000..749320b
--- /dev/null
+++ b/doc/devref.tex
@@ -0,0 +1,135 @@
+% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files called `fdl.*'.
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 2 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files are called `gpl.*'.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+% for more details.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+\documentclass[a4paper]{article}
+\nonstopmode
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{float}
+\usepackage{alltt}
+\usepackage{doxygen}
+\usepackage{times}
+\ifx\pdfoutput\undefined
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\usepackage{pspicture}
+\else
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\fi
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{1}
+\renewcommand{\footrulewidth}{0.4pt}
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Polyhedra Library \\
+Developer's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.} \\
+Patricia M. Hill\thanks{hill at comp.leeds.ac.uk,
+  School of Computing, University of Leeds, U.K.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.} \\
+\ \\
+based on previous work also by \\
+\ \\
+Elisa Ricci \\
+\ \\
+and \\
+\ \\
+Sara Bonini \\
+Andrea Pescetti \\
+Angela Stazzone \\
+Tatiana Zolo
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2006 Roberto Bagnara (bagnara at cs.unipr.it).
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 2
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/doc/fdl.dox b/doc/fdl.dox
new file mode 100644
index 0000000..d978fce
--- /dev/null
+++ b/doc/fdl.dox
@@ -0,0 +1,405 @@
+/*! \page GFDL GNU Free Documentation License
+
+Version 1.2, November 2002
+
+<PRE>
+Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA  02110-1301,  USA.
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</PRE>
+<P>
+<STRONG>0. PREAMBLE</STRONG>
+<P>
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+<P>
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+<P>
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+<P>
+
+<STRONG>1. APPLICABILITY AND DEFINITIONS</STRONG>
+<P>
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+<P>
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+<P>
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+<P>
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+<P>
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+<P>
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+<P>
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+<P>
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+<p>
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+<p>
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+<P>
+<STRONG>2. VERBATIM COPYING</STRONG>
+<P>
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+<P>
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+<P>
+
+<STRONG>3. COPYING IN QUANTITY</STRONG>
+<P>
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+<P>
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+<P>
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+<P>
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+<P>
+
+<STRONG>4. MODIFICATIONS</STRONG>
+<P>
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+<P>
+<UL>
+<LI><STRONG>A.</STRONG> Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+<LI><STRONG>B.</STRONG> List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.
+<LI><STRONG>C.</STRONG> State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+<LI><STRONG>D.</STRONG> Preserve all the copyright notices of the Document.
+<LI><STRONG>E.</STRONG> Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+<LI><STRONG>F.</STRONG> Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+<LI><STRONG>G.</STRONG> Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+<LI><STRONG>H.</STRONG> Include an unaltered copy of this License.
+<LI><STRONG>I.</STRONG> Preserve the section Entitled "History", Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+<LI><STRONG>J.</STRONG> Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+<LI><STRONG>K.</STRONG> For any section Entitled "Acknowledgements" or "Dedications",
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+<LI><STRONG>L.</STRONG> Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+<LI><STRONG>M.</STRONG> Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+<LI><STRONG>N.</STRONG> Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+<LI><STRONG>O.</STRONG> Preserve any Warranty Disclaimers.
+</UL>
+<P>
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+<P>
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+<P>
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+<P>
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+<P>
+
+<STRONG>5. COMBINING DOCUMENTS</STRONG>
+<P>
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+<P>
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+<P>
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all sections
+Entitled "Endorsements."
+<P>
+
+<STRONG>6. COLLECTIONS OF DOCUMENTS</STRONG>
+<P>
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+<P>
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+<P>
+
+
+<STRONG>7. AGGREGATION WITH INDEPENDENT WORKS</STRONG>
+<P>
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+<P>
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+<P>
+
+<STRONG>8. TRANSLATION</STRONG>
+<P>
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+<p>
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+<P>
+
+<STRONG>9. TERMINATION</STRONG>
+<P>
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document 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.
+<P>
+
+<STRONG>10. FUTURE REVISIONS OF THIS LICENSE</STRONG>
+<P>
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation 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.  See
+<A HREF="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</A>.
+<P>
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+<P>
+
+<H2>How to use this License for your documents</H2>
+<P>
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+<P>
+<PRE>
+      Copyright (c)  YEAR  YOUR NAME.
+      Permission is granted to copy, distribute and/or modify this document
+      under the terms of the GNU Free Documentation License, Version 1.2
+      or any later version published by the Free Software Foundation;
+      with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+      Texts.  A copy of the license is included in the section entitled
+      "GNU Free Documentation License".
+</PRE>
+<P>
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+<p>
+<pre>
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+</pre>
+<p>
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+<p>
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+*/
diff --git a/doc/fdl.pdf b/doc/fdl.pdf
new file mode 100644
index 0000000..01a1c3e
Binary files /dev/null and b/doc/fdl.pdf differ
diff --git a/doc/fdl.ps.gz b/doc/fdl.ps.gz
new file mode 100644
index 0000000..d00fa64
Binary files /dev/null and b/doc/fdl.ps.gz differ
diff --git a/doc/fdl.tex b/doc/fdl.tex
new file mode 100644
index 0000000..fa38f28
--- /dev/null
+++ b/doc/fdl.tex
@@ -0,0 +1,454 @@
+\documentclass[a4paper,12pt]{article}
+
+\usepackage[english]{babel}
+
+\begin{document}
+
+
+\title{GNU Free Documentation License}
+\date{}
+\author{}
+\maketitle
+
+ \begin{center}
+
+       Version 1.2, November 2002
+
+
+ Copyright \copyright 2000,2001,2002  Free Software Foundation, Inc.
+
+ \bigskip
+
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301,  USA
+
+ \bigskip
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+\end{center}
+
+
+\section*{Preamble}
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+\section{Applicability and Definitions}
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The \textbf{"Document"}, below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as \textbf{"you"}.  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A \textbf{"Modified Version"} of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A \textbf{"Secondary Section"} is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The \textbf{"Invariant Sections"} are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The \textbf{"Cover Texts"} are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A \textbf{"Transparent"} copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called \textbf{"Opaque"}.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The \textbf{"Title Page"} means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section \textbf{"Entitled XYZ"} means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as \textbf{"Acknowledgements"},
+\textbf{"Dedications"}, \textbf{"Endorsements"}, or \textbf{"History"}.)
+To \textbf{"Preserve the Title"}
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+\section{Verbatim Copying}
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+\section{Copying in Quantity}
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+\section{Modifications}
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+\begin{itemize}
+\item[A.]
+   Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+
+\item[B.]
+   List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.
+
+\item[C.]
+   State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+
+\item[D.]
+   Preserve all the copyright notices of the Document.
+
+\item[E.]
+   Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+
+\item[F.]
+   Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+
+\item[G.]
+   Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+
+\item[H.]
+   Include an unaltered copy of this License.
+
+\item[I.]
+   Preserve the section Entitled "History", Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+
+\item[J.]
+   Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+
+\item[K.]
+   For any section Entitled "Acknowledgements" or "Dedications",
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+
+\item[L.]
+   Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+
+\item[M.]
+   Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+
+\item[N.]
+   Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+
+\item[O.]
+   Preserve any Warranty Disclaimers.
+\end{itemize}
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+\section{Combining Documents}
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all sections
+Entitled "Endorsements".
+
+\section{Collections of Documents}
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+\section{Aggregation with Independent Works}
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+\section{Translation}
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+\section{Termination}
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document 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.
+
+
+\section{Future Revisions of this License}
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation 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.  See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+\section*{Addendum: How To Use this License for Your Documents}
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+\begin{quote}
+    Copyright \copyright  YEAR  YOUR NAME.
+    Permission is granted to copy, distribute and/or modify this document
+    under the terms of the GNU Free Documentation License, Version 1.2
+    or any later version published by the Free Software Foundation;
+    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+    A copy of the license is included in the section entitled "GNU
+    Free Documentation License".
+\end{quote}
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+\begin{quote}
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+\end{quote}
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+\end{document}
diff --git a/doc/fdl.txt b/doc/fdl.txt
new file mode 100644
index 0000000..4a0fe1c
--- /dev/null
+++ b/doc/fdl.txt
@@ -0,0 +1,397 @@
+		GNU Free Documentation License
+		  Version 1.2, November 2002
+
+
+ Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document 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.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation 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.  See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+    Copyright (c)  YEAR  YOUR NAME.
+    Permission is granted to copy, distribute and/or modify this document
+    under the terms of the GNU Free Documentation License, Version 1.2
+    or any later version published by the Free Software Foundation;
+    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+    A copy of the license is included in the section entitled "GNU
+    Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/doc/gpl.dox b/doc/gpl.dox
new file mode 100644
index 0000000..42917c5
--- /dev/null
+++ b/doc/gpl.dox
@@ -0,0 +1,461 @@
+/*! \page GPL GNU General Public License
+
+Version 2, June 1991
+
+<P>
+<PRE>
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA  02110-1301,  USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</PRE>
+
+<H1>Preamble</H1>
+
+<P>
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+</P>
+<P>
+  When we speak of free software, we are referring to freedom, 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 or use pieces of it
+in new free programs; and that you know you can do these things.
+
+</P>
+<P>
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+</P>
+<P>
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+</P>
+<P>
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+</P>
+<P>
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+</P>
+<P>
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+</P>
+<P>
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+</P>
+
+
+<H1>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H1>
+
+
+<P>
+
+<STRONG>0.</STRONG>
+ This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+<P>
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+<P>
+
+<STRONG>1.</STRONG>
+ You may copy and distribute verbatim copies of the Program's
+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 give any other recipients of the Program a copy of this License
+along with the Program.
+<P>
+
+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.
+<P>
+
+<STRONG>2.</STRONG>
+ You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+<P>
+
+<UL>
+
+<LI><STRONG>a)</STRONG>
+     You must cause the modified files to carry prominent notices
+     stating that you changed the files and the date of any change.
+
+<P>
+<LI><STRONG>b)</STRONG>
+     You must cause any work that you distribute or publish, that in
+     whole or in part contains or is derived from the Program or any
+     part thereof, to be licensed as a whole at no charge to all third
+     parties under the terms of this License.
+
+<P>
+<LI><STRONG>c)</STRONG>
+     If the modified program normally reads commands interactively
+     when run, you must cause it, when started running for such
+     interactive use in the most ordinary way, to print or display an
+     announcement including an appropriate copyright notice and a
+     notice that there is no warranty (or else, saying that you provide
+     a warranty) and that users may redistribute the program under
+     these conditions, and telling the user how to view a copy of this
+     License.  (Exception: if the Program itself is interactive but
+     does not normally print such an announcement, your work based on
+     the Program is not required to print an announcement.)
+</UL>
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+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 Program, 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.
+<P>
+
+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 Program.
+<P>
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+<P>
+
+<STRONG>3.</STRONG>
+ You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+
+<!-- we use this doubled UL to get the sub-sections indented, -->
+<!-- while making the bullets as unobvious as possible. -->
+<UL>
+
+<LI><STRONG>a)</STRONG>
+     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; or,
+
+<P>
+<LI><STRONG>b)</STRONG>
+     Accompany it with a written offer, valid for at least three
+     years, to give any third party, for a charge no more than your
+     cost of physically performing source distribution, a complete
+     machine-readable copy of the corresponding source code, to be
+     distributed under the terms of Sections 1 and 2 above on a medium
+     customarily used for software interchange; or,
+
+<P>
+<LI><STRONG>c)</STRONG>
+     Accompany it with the information you received as to the offer
+     to distribute corresponding source code.  (This alternative is
+     allowed only for noncommercial distribution and only if you
+     received the program in object code or executable form with such
+     an offer, in accord with Subsection b above.)
+</UL>
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, 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 executable.  However, as a
+special exception, the source code 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.
+<P>
+
+If distribution of executable or 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 counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+<P>
+
+<STRONG>4.</STRONG>
+ You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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.
+
+<P>
+
+<STRONG>5.</STRONG>
+ 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 Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+<P>
+
+<STRONG>6.</STRONG>
+ Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program 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 to
+this License.
+
+<P>
+
+<STRONG>7.</STRONG>
+ 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 Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program 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 Program.
+<P>
+
+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.
+<P>
+
+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.
+<P>
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+<P>
+
+<STRONG>8.</STRONG>
+ If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program 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.
+
+<P>
+
+<STRONG>9.</STRONG>
+ The Free Software Foundation may publish revised and/or new versions
+of the 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.
+<P>
+
+Each version is given a distinguishing version number.  If the Program
+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 Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+<P>
+
+
+<STRONG>10.</STRONG>
+ If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, 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.
+
+
+
+<P><STRONG>NO WARRANTY</STRONG></P>
+
+<P>
+
+<STRONG>11.</STRONG>
+ BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+<P>
+
+<STRONG>12.</STRONG>
+ 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+<P>
+<STRONG>END OF TERMS AND CONDITIONS</STRONG>
+<P>
+
+
+<H1>How to Apply These Terms to Your New Programs</H1>
+
+<P>
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+</P>
+<P>
+  To do so, attach the following notices to the program.  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.
+
+</P>
+
+<PRE>
+<VAR>one line to give the program's name and an idea of what it does.</VAR>
+Copyright (C) <VAR>yyyy</VAR>  <VAR>name of author</VAR>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02111-1307, USA.
+</PRE>
+
+<P>
+Also add information on how to contact you by electronic and paper mail.
+
+</P>
+<P>
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+</P>
+
+<PRE>
+Gnomovision version 69, Copyright (C) <VAR>year</VAR> <VAR>name of author</VAR>
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'.  This is free software, and you are welcome
+to redistribute it under certain conditions; type `show c'
+for details.
+</PRE>
+
+<P>
+The hypothetical commands <CODE>`show w'</CODE> and <CODE>`show c'</CODE> should show
+the appropriate parts of the General Public License.  Of course, the
+commands you use may be called something other than <CODE>`show w'</CODE> and
+<CODE>`show c'</CODE>; they could even be mouse-clicks or menu items--whatever
+suits your program.
+
+</P>
+<P>
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+</P>
+
+<PRE>
+Yoyodyne, Inc., hereby disclaims all copyright
+interest in the program `Gnomovision'
+(which makes passes at compilers) written
+by James Hacker.
+
+<VAR>signature of Ty Coon</VAR>, 1 April 1989
+Ty Coon, President of Vice
+</PRE>
+
+<P>
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+*/
diff --git a/doc/gpl.pdf b/doc/gpl.pdf
new file mode 100644
index 0000000..27b7a06
Binary files /dev/null and b/doc/gpl.pdf differ
diff --git a/doc/gpl.ps.gz b/doc/gpl.ps.gz
new file mode 100644
index 0000000..adbcd2a
Binary files /dev/null and b/doc/gpl.ps.gz differ
diff --git a/doc/gpl.tex b/doc/gpl.tex
new file mode 100644
index 0000000..95d0718
--- /dev/null
+++ b/doc/gpl.tex
@@ -0,0 +1,380 @@
+\documentclass[a4paper]{report}
+\begin{document}
+
+\chapter*{GNU General Public License}
+
+Version 2, June 1991\\
+
+\noindent
+ Copyright \copyright\ 1989, 1991 Free Software Foundation, Inc.\\
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301,  USA.
+
+\noindent
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+\section*{Preamble}
+
+The licenses for most software are designed to take away your freedom to
+share and change it.  By contrast, the GNU General Public License is intended
+to guarantee your freedom to share and change free software---to make sure
+the software is free for all its users.  This General Public License applies
+to most of the Free Software Foundation's software and to any other program
+whose authors commit to using it.  (Some other Free Software Foundation
+software is covered by the GNU Library General Public License instead.)  You
+can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, 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 or use pieces of it in new free programs; and that
+you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to
+deny you these rights or to ask you to surrender the rights.  These
+restrictions translate to certain responsibilities for you if you distribute
+copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or
+for a fee, you must give the recipients all the rights that you have.  You
+must make sure that they, too, receive or can get the source code.  And you
+must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software.  If
+the software is modified by someone else and passed on, we want its
+recipients to know that what they have is not the original, so that any
+problems introduced by others will not reflect on the original authors'
+reputations.
+
+Finally, any free program is threatened constantly by software patents.  We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program
+proprietary.  To prevent this, we have made it clear that any patent must be
+licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+
+\section*{Terms and conditions for copying, distribution and modification}
+
+\begin{enumerate}
+
+\makeatletter \setcounter{\@listctr}{-1} \makeatother
+
+\item [0.] This License applies to any program or other work which contains a
+      notice placed by the copyright holder saying it may be distributed
+      under the terms of this General Public License.  The ``Program'',
+      below, refers to any such program or work, and a ``work based on the
+      Program'' means either the Program or any derivative work under
+      copyright law: that is to say, a work containing the Program or a
+      portion of it, either verbatim or with modifications and/or translated
+      into another language.  (Hereinafter, translation is included without
+      limitation in the term ``modification''.)  Each licensee is addressed
+      as ``you''.
+
+      Activities other than copying, distribution and modification are not
+      covered by this License; they are outside its scope.  The act of
+      running the Program is not restricted, and the output from the Program
+      is covered only if its contents constitute a work based on the Program
+      (independent of having been made by running the Program).  Whether that
+      is true depends on what the Program does.
+
+\item [1.] You may copy and distribute verbatim copies of the Program's
+      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 give any other recipients of the Program a copy of this License
+      along with the Program.
+
+      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.
+
+\item [2.] You may modify your copy or copies of the Program or any portion
+      of it, thus forming a work based on the Program, and copy and
+      distribute such modifications or work under the terms of Section 1
+      above, provided that you also meet all of these conditions:
+
+      \begin{enumerate}
+
+      \item [(a)] You must cause the modified files to carry prominent
+            notices stating that you changed the files and the date of any
+            change.
+
+      \item [(b)] You must cause any work that you distribute or publish,
+            that in whole or in part contains or is derived from the Program
+            or any part thereof, to be licensed as a whole at no charge to
+            all third parties under the terms of this License.
+
+      \item [(c)] If the modified program normally reads commands
+            interactively when run, you must cause it, when started running
+            for such interactive use in the most ordinary way, to print or
+            display an announcement including an appropriate copyright notice
+            and a notice that there is no warranty (or else, saying that you
+            provide a warranty) and that users may redistribute the program
+            under these conditions, and telling the user how to view a copy
+            of this License.  (Exception: if the Program itself is
+            interactive but does not normally print such an announcement,
+            your work based on the Program is not required to print an
+            announcement.)
+
+      \end{enumerate}
+
+      These requirements apply to the modified work as a whole.  If
+      identifiable sections of that work are not derived from the Program,
+      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 Program, 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 Program.
+
+      In addition, mere aggregation of another work not based on the Program
+      with the Program (or with a work based on the Program) on a volume of a
+      storage or distribution medium does not bring the other work under the
+      scope of this License.
+
+\item [3.] You may copy and distribute the Program (or a work based on it,
+      under Section 2) in object code or executable form under the terms of
+      Sections 1 and 2 above provided that you also do one of the following:
+
+      \begin{enumerate}
+
+      \item [(a)] 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; or,
+
+      \item [(b)] Accompany it with a written offer, valid for at least three
+            years, to give any third party, for a charge no more than your
+            cost of physically performing source distribution, a complete
+            machine-readable copy of the corresponding source code, to be
+            distributed under the terms of Sections 1 and 2 above on a medium
+            customarily used for software interchange; or,
+
+      \item [(c)] Accompany it with the information you received as to the
+            offer to distribute corresponding source code.  (This alternative
+            is allowed only for noncommercial distribution and only if you
+            received the program in object code or executable form with such
+            an offer, in accord with Subsection b above.)
+
+      \end{enumerate}
+
+      The source code for a work means the preferred form of the work for
+      making modifications to it.  For an executable work, 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 executable.  However, as a special
+      exception, the source code 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.
+
+      If distribution of executable or 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 counts as distribution of the
+      source code, even though third parties are not compelled to copy the
+      source along with the object code.
+
+\item [4.] You may not copy, modify, sublicense, or distribute the Program
+      except as expressly provided under this License.  Any attempt otherwise
+      to copy, modify, sublicense or distribute the Program 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.
+
+\item [5.] 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 Program or its derivative works.  These actions are
+      prohibited by law if you do not accept this License.  Therefore, by
+      modifying or distributing the Program (or any work based on the
+      Program), you indicate your acceptance of this License to do so, and
+      all its terms and conditions for copying, distributing or modifying the
+      Program or works based on it.
+
+\item [6.] Each time you redistribute the Program (or any work based on the
+      Program), the recipient automatically receives a license from the
+      original licensor to copy, distribute or modify the Program 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 to
+      this License.
+
+\item [7.] 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 Program at all.  For example, if a patent
+      license would not permit royalty-free redistribution of the Program 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 Program.
+
+      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.
+
+\item [8.] If the distribution and/or use of the Program is restricted in
+      certain countries either by patents or by copyrighted interfaces, the
+      original copyright holder who places the Program 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.
+
+\item [9.] The Free Software Foundation may publish revised and/or new
+      versions of the 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 Program
+      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 Program does not specify a
+      version number of this License, you may choose any version ever
+      published by the Free Software Foundation.
+
+\item [10.] If you wish to incorporate parts of the Program into other free
+      programs whose distribution conditions are different, 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.
+
+\begin{center}
+NO WARRANTY
+\end{center}
+
+\bfseries
+
+\item [11.] Because the Program is licensed free of charge, there is no
+      warranty for the Program, to the extent permitted by applicable law.
+      except when otherwise stated in writing the copyright holders and/or
+      other parties provide the program ``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
+      Program is with you.  Should the Program prove defective, you assume
+      the cost of all necessary servicing, repair or correction.
+
+\item [12.] 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 program 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
+      program (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 Program to operate with any other programs), even if
+      such holder or other party has been advised of the possibility of such
+      damages.
+
+\end{enumerate}
+
+\begin{center}
+\textbf{END OF TERMS AND CONDITIONS}
+\end{center}
+
+
+\section*{Appendix: How to Apply These Terms to Your New Programs}
+
+If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  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.
+
+\begin{verbatim}
+<one line to give the program's name and a brief idea of what it does.>
+Copyright (C) 19yy  <name of author>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+\end{verbatim}
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when
+it starts in an interactive mode:
+
+\begin{verbatim}
+Gnomovision version 69, Copyright (C) 19yy name of author
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type `show c' for details.
+\end{verbatim}
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may be
+called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a ``copyright disclaimer'' for the program, if
+necessary.  Here is a sample; alter the names:
+
+\begin{verbatim}
+Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+`Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+<signature of Ty Coon>, 1 April 1989
+Ty Coon, President of Vice
+\end{verbatim}
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General Public
+License instead of this License.
+
+\end{document}
diff --git a/doc/gpl.txt b/doc/gpl.txt
new file mode 100644
index 0000000..3912109
--- /dev/null
+++ b/doc/gpl.txt
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, 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 or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+

+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+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 give any other recipients of the Program a copy of this License
+along with the Program.
+
+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 Program or any portion
+of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+

+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+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 Program, 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 Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) 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; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, 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 executable.  However, as a
+special exception, the source code 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.
+
+If distribution of executable or 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 counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+

+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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.
+
+  5. 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 Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program 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 to
+this License.
+
+  7. 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 Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program 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 Program.
+
+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.
+

+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program 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.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the 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 Program
+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 Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, 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
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), 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 Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  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.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/doc/ppl-config.1 b/doc/ppl-config.1
new file mode 100644
index 0000000..8841b90
--- /dev/null
+++ b/doc/ppl-config.1
@@ -0,0 +1,106 @@
+.TH PPL-CONFIG "1" "January 2006" "ppl-config 0.8" "User Commands"
+.SH NAME
+ppl-config \- obtain information about an installation of the Parma Polyhedra Library
+.SH SYNOPSIS
+.B ppl-config
+[\fIOPTION\fR]...
+.SH DESCRIPTION
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+prints this help text to stdout
+.TP
+\fB\-FFMT\fR, \fB\-\-format\fR=\fIFMT\fR
+sets the output format to FMT
+(one of `plain', `makefile', `sh' or `csh')
+.TP
+\fB\-IINT\fR, \fB\-\-interface\fR=\fIINT\fR
+selects a library interface (one of `C++', `C',
+`Ciao\-Prolog', `GNU\-Prolog', `SICStus\-Prolog',
+`SWI\-Prolog', `XSB\-Prolog', `YAP\-Prolog',
+`OCaml' or `Java')
+.TP
+\fB\-A\fR, \fB\-\-application\fR
+selects output for building an application
+.TP
+\fB\-L\fR, \fB\-\-library\fR
+selects output for building a library
+.TP
+\fB\-p[PFX]\fR, \fB\-\-prefix\fR[=\fIPFX\fR]
+prints or sets library prefix information
+.TP
+\fB\-e[PFX]\fR, \fB\-\-exec\-prefix\fR[=\fIPFX\fR]
+prints or sets library exec\-prefix information
+.TP
+\fB\-O\fR, \fB\-\-configure\-options\fR
+prints configuration options
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information
+.TP
+\fB\-M\fR, \fB\-\-version\-major\fR
+prints version major number
+.TP
+\fB\-N\fR, \fB\-\-version\-minor\fR
+prints version minor number
+.TP
+\fB\-R\fR, \fB\-\-version\-revision\fR
+prints version revision number
+.TP
+\fB\-B\fR, \fB\-\-version\-beta\fR
+prints version beta number
+.TP
+\fB\-E\fR, \fB\-\-banner\fR
+prints library banner
+.TP
+\fB\-n\fR, \fB\-\-coefficients\fR
+prints type of library coefficients
+.TP
+\fB\-i\fR, \fB\-\-includedir\fR
+prints include files directory
+.TP
+\fB\-b\fR, \fB\-\-bindir\fR
+prints binary executables directory
+.TP
+\fB\-l\fR, \fB\-\-libdir\fR
+prints library files directory
+.TP
+\fB\-P\fR, \fB\-\-cppflags\fR
+prints preprocessor flags
+.TP
+\fB\-C\fR, \fB\-\-cflags\fR
+prints C compiler flags
+.TP
+\fB\-X\fR, \fB\-\-cxxflags\fR
+prints C++ compiler flags
+.TP
+\fB\-D\fR, \fB\-\-ldflags\fR
+prints linker flags
+.TP
+\fB\-g\fR, \fB\-\-license\fR
+prints synthetic licensing information
+.TP
+\fB\-c\fR, \fB\-\-copying\fR
+prints detailed licensing information
+.TP
+\fB\-u\fR, \fB\-\-bugs\fR
+prints bug reporting information
+.TP
+\fB\-r\fR, \fB\-\-credits\fR
+prints credits
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at
+
+    \fBhttp://www.cs.unipr.it/ppl/\fR
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+.SH COPYRIGHT
+Copyright (C) 2001\-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions.  There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/doc/ppl-user-0.9-html.tar.gz b/doc/ppl-user-0.9-html.tar.gz
new file mode 100644
index 0000000..6a1cf9b
Binary files /dev/null and b/doc/ppl-user-0.9-html.tar.gz differ
diff --git a/doc/ppl-user-0.9.pdf b/doc/ppl-user-0.9.pdf
new file mode 100644
index 0000000..d754838
Binary files /dev/null and b/doc/ppl-user-0.9.pdf differ
diff --git a/doc/ppl-user-0.9.ps.gz b/doc/ppl-user-0.9.ps.gz
new file mode 100644
index 0000000..43a274a
Binary files /dev/null and b/doc/ppl-user-0.9.ps.gz differ
diff --git a/doc/ppl.sty b/doc/ppl.sty
new file mode 100644
index 0000000..8050a21
--- /dev/null
+++ b/doc/ppl.sty
@@ -0,0 +1,178 @@
+%%    LaTeX package providing macros for typesetting the PPL manuals.
+%%    Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+%%
+%% This file is part of the Parma Polyhedra Library (PPL).
+%%
+%% The PPL is free software; you can redistribute it and/or modify it
+%% under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 2 of the License, or (at your
+%% option) any later version.
+%%
+%% The PPL is distributed in the hope that it will be useful, but WITHOUT
+%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+%% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License
+%% along with this program; if not, write to the Free Software Foundation,
+%% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%%
+%% For the most up-to-date information see the Parma Polyhedra Library
+%% site: http://www.cs.unipr.it/ppl/ .
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{ppl}
+\RequirePackage{amsmath}
+\RequirePackage{amssymb}
+
+%% Calligraphic alphabet
+\newcommand*{\cA}{\ensuremath{\mathcal{A}}}
+\newcommand*{\cB}{\ensuremath{\mathcal{B}}}
+\newcommand*{\cC}{\ensuremath{\mathcal{C}}}
+\newcommand*{\cD}{\ensuremath{\mathcal{D}}}
+\newcommand*{\cE}{\ensuremath{\mathcal{E}}}
+\newcommand*{\cF}{\ensuremath{\mathcal{F}}}
+\newcommand*{\cG}{\ensuremath{\mathcal{G}}}
+\newcommand*{\cH}{\ensuremath{\mathcal{H}}}
+\newcommand*{\cI}{\ensuremath{\mathcal{I}}}
+\newcommand*{\cJ}{\ensuremath{\mathcal{J}}}
+\newcommand*{\cK}{\ensuremath{\mathcal{K}}}
+\newcommand*{\cL}{\ensuremath{\mathcal{L}}}
+\newcommand*{\cM}{\ensuremath{\mathcal{M}}}
+\newcommand*{\cN}{\ensuremath{\mathcal{N}}}
+\newcommand*{\cO}{\ensuremath{\mathcal{O}}}
+\newcommand*{\cP}{\ensuremath{\mathcal{P}}}
+\newcommand*{\cQ}{\ensuremath{\mathcal{Q}}}
+\newcommand*{\cR}{\ensuremath{\mathcal{R}}}
+\newcommand*{\cS}{\ensuremath{\mathcal{S}}}
+\newcommand*{\cT}{\ensuremath{\mathcal{T}}}
+\newcommand*{\cU}{\ensuremath{\mathcal{U}}}
+\newcommand*{\cV}{\ensuremath{\mathcal{V}}}
+\newcommand*{\cW}{\ensuremath{\mathcal{W}}}
+\newcommand*{\cX}{\ensuremath{\mathcal{X}}}
+\newcommand*{\cY}{\ensuremath{\mathcal{Y}}}
+\newcommand*{\cZ}{\ensuremath{\mathcal{Z}}}
+
+%% Special letters denoting sets and algebras.
+\providecommand*{\Nset}{\mathbb{N}}            % Naturals
+\newcommand*{\extNset}{\mathbb{N}_\infty}      % Extended naturals
+\providecommand*{\Oset}{\mathbb{O}}            % Ordinals
+\providecommand*{\Qset}{\mathbb{Q}}            % Rationals
+\providecommand*{\Rset}{\mathbb{R}}            % Reals
+\providecommand*{\nonnegRset}{\mathbb{R}_{\scriptscriptstyle{+}}}
+                                               % Non-negative reals
+\newcommand*{\extRset}{\Rset_\infty}           % Extended reals
+\providecommand*{\Zset}{\mathbb{Z}}            % Integers
+\providecommand*{\CPset}{\mathbb{CP}}          % Closed polyhedra
+\providecommand*{\Pset}{\mathbb{P}}            % (NNC) polyhedra
+\providecommand*{\Sset}{\mathbb{S}}            % Reals or rationals
+
+%% Grid notation
+\providecommand*{\Gset}{\mathbb{G}}            % Grid
+\providecommand*{\cg}{\mathord{\mathrm{cg}}}   % Congruence
+\newcommand*{\gcon}{\mathop{\mathrm{gcon}}\nolimits}
+                                               % Grid from congruence system
+\newcommand*{\ggen}{\mathop{\mathrm{ggen}}\nolimits}
+                                               % Grid from generator system
+
+%% Function notation
+\newcommand*{\fund}[3]{\mathord{#1}\colon#2\rightarrow#3}
+\newcommand*{\pard}[3]{\mathord{#1}\colon#2\rightarrowtail#3}
+
+%% Relation notation
+\newcommand*{\reld}[3]{\mathord{#1}\subseteq#2\times#3}
+
+%% Set theory.
+\renewcommand*{\emptyset}{\mathord{\varnothing}}
+\newcommand*{\sseq}{\subseteq}
+\newcommand*{\sseqf}{\mathrel{\subseteq_\mathrm{f}}}
+\newcommand*{\sslt}{\subset}
+\newcommand*{\Sseq}{\supseteq}
+\newcommand*{\Ssgt}{\supset}
+\newcommand*{\inters}{\cap}
+\newcommand*{\setdiff}{\setminus}
+\newcommand*{\union}{\cup}
+\newcommand*{\card}{\mathop{\#}\nolimits}
+\newcommand*{\sset}[2]{{\renewcommand*{\arraystretch}{1.2}
+                      \left\{\,#1 \,\left|\,
+                               \begin{array}{@{}l@{}}#2\end{array}
+                      \right.   \,\right\}}}
+\newcommand*{\meet}{\mathbin{\otimes}}
+\newcommand*{\join}{\mathbin{\oplus}}
+
+%% Logic notation.
+\newcommand*{\entails}{\mathrel{\vdash}}
+\newcommand*{\sentails}{\mathrel{\Vdash}}
+\newcommand*{\Nentails}{\mathrel{\nvdash}}
+\newcommand*{\Nsentails}{\mathrel{\nVdash}}
+\newcommand*{\entailss}[1]{\mathrel{\vdash_{#1}}}
+\newcommand*{\Entailss}[1]{\mathrel{\dashv_{#1}}}
+\newcommand*{\sentailss}[1]{\mathrel{\Vdash_{#1}}}
+\newcommand*{\Nentailss}[1]{\mathrel{\nvdash_{#1}}}
+\newcommand*{\bigland}{\mathop{\bigwedge}\limits}
+\newcommand*{\biglor}{\mathop{\bigvee}\limits}
+\newcommand*{\piff}{\mathrel{\leftrightarrow}}
+\newcommand*{\pimplies}{\mathrel{\rightarrow}}
+\newcommand*{\pimplied}{\mathrel{\leftarrow}}
+\newcommand*{\st}{\mathrel{.}}
+\newcommand*{\itc}{\mathrel{:}}
+
+%% Integer division and reminder binary operators.
+\newcommand*{\bdiv}{\mathbin{\mathrm{div}}}
+\newcommand*{\brem}{\mathbin{\mathrm{rem}}}
+
+
+%% True and false
+\newcommand*{\false}{\mathord{\textbf{\textup{0}}}}
+\newcommand*{\true}{\mathord{\textbf{\textup{1}}}}
+
+%% Things that hold by definition.
+\newcommand*{\defrel}[1]{\mathrel{\buildrel \mathrm{def} \over {#1}}}
+\newcommand*{\defeq}{\defrel{=}}
+\newcommand*{\defiff}{\defrel{\Longleftrightarrow}}
+
+% Arbitrary relation symbol.
+\newcommand*{\relsym}{\mathrel{\bowtie}}
+\newcommand*{\relsyms}[1]{\mathrel{\bowtie_{#1}}}
+
+% Vectors.
+\renewcommand*{\vec}[1]{\mathchoice{\mbox{\boldmath$\displaystyle#1$}}
+{\mbox{\boldmath$\textstyle#1$}}
+{\mbox{\boldmath$\scriptstyle#1$}}
+{\mbox{\boldmath$\scriptscriptstyle#1$}}}
+
+\newcommand*{\vect}[1]{\vec{#1}}
+
+% Matrix functions.
+\newcommand*{\transpose}{\mathrm{T}}
+
+% Hulls.
+\newcommand*{\linearhull}{\mathop{\mathrm{linear.hull}}}
+\newcommand*{\conichull}{\mathop{\mathrm{conic.hull}}}
+\newcommand*{\affinehull}{\mathop{\mathrm{affine.hull}}}
+\newcommand*{\convexhull}{\mathop{\mathrm{convex.hull}}}
+\newcommand*{\NNChull}{\mathop{\mathrm{nnc.hull}}}
+\newcommand*{\inthull}{\mathop{\mathrm{int.hull}}}
+\newcommand*{\intaffinehull}{\mathop{\mathrm{int.affine.hull}}}
+
+% Polyhedron functions.
+\newcommand*{\prank}{\mathop{\mathrm{rank}}}
+\newcommand*{\pdim}{\mathop{\mathrm{dim}}}
+\newcommand*{\linspace}{\mathop{\mathrm{lin.space}}}
+\newcommand*{\cone}{\mathop{\mathrm{cone}}}
+
+% Widening
+\newcommand*{\widen}{\mathrel{\nabla}}
+
+% Powerset notation
+\newcommand*{\pnonredmap}{\mathop{\Omega^{\scriptscriptstyle\sseq}_{\scriptscriptstyle {\CPset_n}}}\nolimits}
+\newcommand*{\pnonredmapi}[1]{\mathop{\Omega^{\scriptscriptstyle\sseq}_{\scriptscriptstyle {\CPset_{#1}}}}\nolimits}
+\newcommand*{\nonredmap}{\mathop{\Omega^{\scriptscriptstyle\entails}_{\scriptscriptstyle D}}\nolimits}
+
+\newcommand*{\wpf}{\mathop{\wp_\mathrm{f}}\nolimits}
+\newcommand*{\wpfn}[2]{\mathord{\wp_\mathrm{fn}^{\scriptscriptstyle #2}}(#1)}
+
+\newcommand*{\smallP}{{\scriptscriptstyle\mathrm{P}}}
+\newcommand*{\entailsP}{\entailss{\smallP}}
+\newcommand*{\NentailsP}{\Nentailss{\smallP}}
+\newcommand*{\sentailsP}{\sentailss{\smallP}}
diff --git a/doc/ppl_lcdd.1 b/doc/ppl_lcdd.1
new file mode 100644
index 0000000..ee8267a
--- /dev/null
+++ b/doc/ppl_lcdd.1
@@ -0,0 +1,50 @@
+.TH PPL_LCDD "1" "January 2006" "ppl_lcdd 0.8" "User Commands"
+.SH NAME
+ppl_lcdd \- a PPL-based program for vertex/facet enumeration of convex polyhedra
+.SH SYNOPSIS
+.B ppl_lcdd
+[\fIOPTION\fR]... [\fIFILE\fR]...
+.SH DESCRIPTION
+.TP
+\fB\-CSECS\fR, \fB\-\-max\-cpu\fR=\fISECS\fR
+limits CPU usage to SECS seconds
+.TP
+\fB\-RMB\fR, \fB\-\-max\-memory\fR=\fIMB\fR
+limits memory usage to MB megabytes
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+prints this help text to stdout
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information to stdout
+.TP
+\fB\-oPATH\fR, \fB\-\-output\fR=\fIPATH\fR
+appends output to PATH
+.TP
+\fB\-t\fR, \fB\-\-timings\fR
+prints timings to stderr
+.TP
+\fB\-v\fR, \fB\-\-verbose\fR
+produces lots of output
+.TP
+\fB\-cPATH\fR, \fB\-\-check\fR=\fIPATH\fR
+checks if the result is equal to what is in PATH
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at
+
+    \fBhttp://www.cs.unipr.it/ppl/\fR
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+.SH COPYRIGHT
+Copyright (C) 2001\-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions.  There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "SEE ALSO"
+ppl-config (1)
diff --git a/doc/ppl_lpsol.1 b/doc/ppl_lpsol.1
new file mode 100644
index 0000000..ca8fa44
--- /dev/null
+++ b/doc/ppl_lpsol.1
@@ -0,0 +1,60 @@
+.TH PPL_LPSOL "1" "January 2006" "ppl_lpsol 0.8" "User Commands"
+.SH NAME
+ppl_lpsol \- a PPL-based linear programming problem solver
+.SH SYNOPSIS
+.B ppl_lpsol
+[\fIOPTION\fR]... [\fIFILE\fR]...
+.SH DESCRIPTION
+.TP
+\fB\-c\fR, \fB\-\-check\fR
+checks plausibility of the optimum value found
+.TP
+\fB\-m\fR, \fB\-\-min\fR
+minimizes the objective function
+.TP
+\fB\-M\fR, \fB\-\-max\fR
+maximizes the objective function (default)
+.TP
+\fB\-CSECS\fR, \fB\-\-max\-cpu\fR=\fISECS\fR
+limits CPU usage to SECS seconds
+.TP
+\fB\-RMB\fR, \fB\-\-max\-memory\fR=\fIMB\fR
+limits memory usage to MB megabytes
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+prints this help text to stdout
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information to stdout
+.TP
+\fB\-oPATH\fR, \fB\-\-output\fR=\fIPATH\fR
+appends output to PATH
+.TP
+\fB\-e\fR, \fB\-\-enumerate\fR
+use the (expensive!) enumeration method
+.TP
+\fB\-s\fR, \fB\-\-simplex\fR
+use the simplex method
+.TP
+\fB\-t\fR, \fB\-\-timings\fR
+prints timings to stderr
+.TP
+\fB\-v\fR, \fB\-\-verbose\fR
+outputs also the constraints and objective function
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at
+
+    \fBhttp://www.cs.unipr.it/ppl/\fR
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+.SH COPYRIGHT
+Copyright (C) 2001\-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions.  There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "SEE ALSO"
+ppl-config (1)
diff --git a/doc/user.doxyconf-html b/doc/user.doxyconf-html
new file mode 100644
index 0000000..040450d
--- /dev/null
+++ b/doc/user.doxyconf-html
@@ -0,0 +1,1243 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = 0.9
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# This tag can be used to specify the encoding used in the generated output. 
+# The encoding is not always determined by the language that is chosen, 
+# but also whether or not the output is meant for Windows or non-Windows users. 
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
+# forces the Windows encoding (this is the default for the Windows binary), 
+# whereas setting the tag to NO uses a Unix-style encoding (the default for 
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING   = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like the Qt-style comments (thus requiring an 
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member 
+# documentation.
+
+DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = NO
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for Java. 
+# For instance, namespaces will be presented as packages, qualified scopes 
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
+# include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = YES
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = NO
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from the 
+# version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = ./definitions.dox \
+                         ../src/ppl.hh \
+                         ../interfaces/C/ppl_c.h \
+                         ./../interfaces/Prolog/Prolog_interface.dox \
+                         ./gpl.dox \
+                         ./fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS          = 
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES (the default) 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = user.html-dir
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = ./user.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = NO
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = NO
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = NO
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
+# generate a call dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable call graphs for selected 
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = NO
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
+# this value, doxygen will try to truncate the graph, so that it fits within 
+# the specified constraint. Beware that most browsers cannot cope with very 
+# large images.
+
+MAX_DOT_GRAPH_WIDTH    = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
+# this value, doxygen will try to truncate the graph, so that it fits within 
+# the specified constraint. Beware that most browsers cannot cope with very 
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT   = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that a graph may be further truncated if the graph's 
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH 
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), 
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, which results in a white background. 
+# Warning: Depending on the platform used, enabling this option may lead to 
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/doc/user.doxyconf-html.in b/doc/user.doxyconf-html.in
new file mode 100644
index 0000000..86d92a0
--- /dev/null
+++ b/doc/user.doxyconf-html.in
@@ -0,0 +1,1243 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = @VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# This tag can be used to specify the encoding used in the generated output. 
+# The encoding is not always determined by the language that is chosen, 
+# but also whether or not the output is meant for Windows or non-Windows users. 
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
+# forces the Windows encoding (this is the default for the Windows binary), 
+# whereas setting the tag to NO uses a Unix-style encoding (the default for 
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING   = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like the Qt-style comments (thus requiring an 
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member 
+# documentation.
+
+DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = NO
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for Java. 
+# For instance, namespaces will be presented as packages, qualified scopes 
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
+# include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = YES
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = NO
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from the 
+# version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = @srcdir@/definitions.dox \
+                         ../src/ppl.hh \
+                         ../interfaces/C/ppl_c.h \
+                         @srcdir@/../interfaces/Prolog/Prolog_interface.dox \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS          = 
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES (the default) 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = user.html-dir
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = @srcdir@/user.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = @PERL@
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = NO
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = NO
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = NO
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
+# generate a call dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable call graphs for selected 
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = NO
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
+# this value, doxygen will try to truncate the graph, so that it fits within 
+# the specified constraint. Beware that most browsers cannot cope with very 
+# large images.
+
+MAX_DOT_GRAPH_WIDTH    = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
+# this value, doxygen will try to truncate the graph, so that it fits within 
+# the specified constraint. Beware that most browsers cannot cope with very 
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT   = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that a graph may be further truncated if the graph's 
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH 
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), 
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, which results in a white background. 
+# Warning: Depending on the platform used, enabling this option may lead to 
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/doc/user.doxyconf-latex b/doc/user.doxyconf-latex
new file mode 100644
index 0000000..914fb15
--- /dev/null
+++ b/doc/user.doxyconf-latex
@@ -0,0 +1,1243 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = 0.9
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# This tag can be used to specify the encoding used in the generated output. 
+# The encoding is not always determined by the language that is chosen, 
+# but also whether or not the output is meant for Windows or non-Windows users. 
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
+# forces the Windows encoding (this is the default for the Windows binary), 
+# whereas setting the tag to NO uses a Unix-style encoding (the default for 
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING   = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like the Qt-style comments (thus requiring an 
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member 
+# documentation.
+
+DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = NO
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for Java. 
+# For instance, namespaces will be presented as packages, qualified scopes 
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
+# include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = YES
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = NO
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from the 
+# version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = ./definitions.dox \
+                         ../src/ppl.hh \
+                         ../interfaces/C/ppl_c.h \
+                         ./../interfaces/Prolog/Prolog_interface.dox \
+                         ./gpl.dox \
+                         ./fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS          = 
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES (the default) 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = NO
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = user.latex-dir
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = ./user.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = NO
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = NO
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = NO
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
+# generate a call dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable call graphs for selected 
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = NO
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
+# this value, doxygen will try to truncate the graph, so that it fits within 
+# the specified constraint. Beware that most browsers cannot cope with very 
+# large images.
+
+MAX_DOT_GRAPH_WIDTH    = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
+# this value, doxygen will try to truncate the graph, so that it fits within 
+# the specified constraint. Beware that most browsers cannot cope with very 
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT   = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that a graph may be further truncated if the graph's 
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH 
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), 
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, which results in a white background. 
+# Warning: Depending on the platform used, enabling this option may lead to 
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/doc/user.doxyconf-latex.in b/doc/user.doxyconf-latex.in
new file mode 100644
index 0000000..eb06c0f
--- /dev/null
+++ b/doc/user.doxyconf-latex.in
@@ -0,0 +1,1243 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = @VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# This tag can be used to specify the encoding used in the generated output. 
+# The encoding is not always determined by the language that is chosen, 
+# but also whether or not the output is meant for Windows or non-Windows users. 
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
+# forces the Windows encoding (this is the default for the Windows binary), 
+# whereas setting the tag to NO uses a Unix-style encoding (the default for 
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING   = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like the Qt-style comments (thus requiring an 
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member 
+# documentation.
+
+DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = NO
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for Java. 
+# For instance, namespaces will be presented as packages, qualified scopes 
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
+# include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = YES
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = NO
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from the 
+# version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = @srcdir@/definitions.dox \
+                         ../src/ppl.hh \
+                         ../interfaces/C/ppl_c.h \
+                         @srcdir@/../interfaces/Prolog/Prolog_interface.dox \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS          = 
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES (the default) 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = NO
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = user.latex-dir
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = @srcdir@/user.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = @PERL@
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = NO
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = NO
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = NO
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
+# generate a call dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable call graphs for selected 
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = NO
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
+# this value, doxygen will try to truncate the graph, so that it fits within 
+# the specified constraint. Beware that most browsers cannot cope with very 
+# large images.
+
+MAX_DOT_GRAPH_WIDTH    = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
+# this value, doxygen will try to truncate the graph, so that it fits within 
+# the specified constraint. Beware that most browsers cannot cope with very 
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT   = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that a graph may be further truncated if the graph's 
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH 
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), 
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, which results in a white background. 
+# Warning: Depending on the platform used, enabling this option may lead to 
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/doc/user.tex b/doc/user.tex
new file mode 100644
index 0000000..be0b302
--- /dev/null
+++ b/doc/user.tex
@@ -0,0 +1,135 @@
+% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files called `fdl.*'.
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 2 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files are called `gpl.*'.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+% for more details.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+\documentclass[a4paper]{article}
+\nonstopmode
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{float}
+\usepackage{alltt}
+\usepackage{doxygen}
+\usepackage{times}
+\ifx\pdfoutput\undefined
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\usepackage{pspicture}
+\else
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\fi
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{1}
+\renewcommand{\footrulewidth}{0.4pt}
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Polyhedra Library \\
+User's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.} \\
+Patricia M. Hill\thanks{hill at comp.leeds.ac.uk,
+  School of Computing, University of Leeds, U.K.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy.} \\
+\ \\
+based on previous work also by \\
+\ \\
+Elisa Ricci \\
+\ \\
+and \\
+\ \\
+Sara Bonini \\
+Andrea Pescetti \\
+Angela Stazzone \\
+Tatiana Zolo
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2006 Roberto Bagnara (bagnara at cs.unipr.it).
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 2
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..0ae12c0
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,401 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-11-07.23
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+posix_glob=
+posix_mkdir=
+
+# Symbolic mode for testing mkdir with directories.
+# It is the same as 755, but also tests that "u+" works.
+test_mode=u=rwx,g=rx,o=rx,u+wx
+
+# Desired mode of installed file.
+mode=0755
+
+# Desired mode of newly created intermediate directories.
+# It is empty if not known yet.
+intermediate_mode=
+
+chmodcmd=$chmodprog
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c         (ignored)
+-d         create directories instead of installing files.
+-g GROUP   $chgrpprog installed files to GROUP.
+-m MODE    $chmodprog installed files to MODE.
+-o USER    $chownprog installed files to USER.
+-s         $stripprog installed files.
+-t DIRECTORY  install into DIRECTORY.
+-T         report an error if DSTFILE is a directory.
+--help     display this help and exit.
+--version  display version info and exit.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+  case $1 in
+    -c) shift
+        continue;;
+
+    -d) dir_arg=true
+        shift
+        continue;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+        shift
+        shift
+        continue;;
+
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
+
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
+
+    -t) dstarg=$2
+	shift
+	shift
+	continue;;
+
+    -T) no_target_directory=true
+	shift
+	continue;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    *)  # When -d is used, all remaining arguments are directories to create.
+	# When -t is used, the destination is already specified.
+	test -n "$dir_arg$dstarg" && break
+        # Otherwise, the last argument is the destination.  Remove it from $@.
+	for arg
+	do
+          if test -n "$dstarg"; then
+	    # $@ is not empty: it contains at least $arg.
+	    set fnord "$@" "$dstarg"
+	    shift # fnord
+	  fi
+	  shift # arg
+	  dstarg=$arg
+	done
+	break;;
+  esac
+done
+
+if test -z "$1"; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+test -n "$dir_arg" || trap '(exit $?); exit' 1 2 13 15
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src ;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dstarg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dstarg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst ;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dstarg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| \
+	     .       : '\(.\)' 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+		  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+		  /^X\(\/\/\)$/{ s//\1/; q; }
+		  /^X\(\/\).*/{ s//\1/; q; }
+		  s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	posix_mkdir=false
+	if $mkdirprog -m $test_mode -p -- / >/dev/null 2>&1; then
+	  posix_mkdir=true
+	else
+	  # Remove any dirs left behind by ancient mkdir implementations.
+	  rmdir ./-m "$test_mode" ./-p ./-- 2>/dev/null
+	fi ;;
+    esac
+
+    if
+      $posix_mkdir && {
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, create it using the same intermediate mode that
+	# mkdir -p would use when creating intermediate directories.
+	# POSIX says that this mode is "$(umask -S),u+wx", so use that
+	# if umask -S works.
+
+	if test -n "$dir_arg"; then
+	  mkdir_mode=$mode
+	else
+	  case $intermediate_mode in
+	    '')
+	      if umask_S=`(umask -S) 2>/dev/null`; then
+		intermediate_mode=$umask_S,u+wx
+	      else
+		intermediate_mode=$test_mode
+	      fi ;;
+	  esac
+	  mkdir_mode=$intermediate_mode
+	fi
+
+	$mkdirprog -m "$mkdir_mode" -p -- "$dstdir"
+      }
+    then :
+    else
+
+      # mkdir does not conform to POSIX, or it failed possibly due to
+      # a race condition.  Create the directory the slow way, step by
+      # step, checking for races as we go.
+
+      case $dstdir in
+	/*) pathcomp=/ ;;
+	-*) pathcomp=./ ;;
+	*)  pathcomp= ;;
+      esac
+
+      case $posix_glob in
+        '')
+	  if (set -f) 2>/dev/null; then
+	    posix_glob=true
+	  else
+	    posix_glob=false
+	  fi ;;
+      esac
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob && set -f
+      set fnord $dstdir
+      shift
+      $posix_glob && set +f
+      IFS=$oIFS
+
+      for d
+      do
+	test "x$d" = x && continue
+
+	pathcomp=$pathcomp$d
+	if test ! -d "$pathcomp"; then
+	  $mkdirprog "$pathcomp"
+	  # Don't fail if two instances are running concurrently.
+	  test -d "$pathcomp" || exit 1
+	fi
+	pathcomp=$pathcomp/
+      done
+      obsolete_mkdir_used=true
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd "$mode" "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    $doit $cpprog "$src" "$dsttmp" &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$mode" "$dsttmp"; } &&
+
+    # Now rename the file to the real destination.
+    { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \
+      || {
+	   # The rename failed, perhaps because mv can't rename something else
+	   # to itself, or perhaps because mv is so ancient that it does not
+	   # support -f.
+
+	   # Now remove or move aside any old file at destination location.
+	   # We try this two ways since rm can't unlink itself on some
+	   # systems and the destination file might be busy for other
+	   # reasons.  In this case, the final cleanup might fail but the new
+	   # file should still install successfully.
+	   {
+	     if test -f "$dst"; then
+	       $doit $rmcmd -f "$dst" 2>/dev/null \
+	       || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \
+		     && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\
+	       || {
+		 echo "$0: cannot unlink or rename $dst" >&2
+		 (exit 1); exit 1
+	       }
+	     else
+	       :
+	     fi
+	   } &&
+
+	   # Now rename the file to the real destination.
+	   $doit $mvcmd "$dsttmp" "$dst"
+	 }
+    } || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/instchk.hh b/instchk.hh
new file mode 100644
index 0000000..bd4ad1e
--- /dev/null
+++ b/instchk.hh
@@ -0,0 +1,81 @@
+/* Fake declarations to test the validity of the arguments of the
+   --enabled-instantiations option defined in configure.ac.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+class Polyhedron {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Polyhedra_Powerset_argument() {
+    return true;
+  }
+};
+
+template <typename T>
+bool
+valid_BD_Shape_argument(void);
+
+template <>
+bool
+valid_BD_Shape_argument<char>() {
+  return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<int>() {
+  return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<int8_t>() {
+  return true;
+}
+
+template <typename T>
+class BD_Shape {
+public:
+  static bool valid_instantiation() {
+    return valid_BD_Shape_argument<T>();
+  }
+};
+
+template <typename PH>
+class Polyhedra_Powerset {
+public:
+  static bool valid_instantiation() {
+    return PH::valid_Polyhedra_Powerset_argument();
+  }
+};
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/C/Makefile.am b/interfaces/C/Makefile.am
new file mode 100644
index 0000000..2012751
--- /dev/null
+++ b/interfaces/C/Makefile.am
@@ -0,0 +1,70 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+EXTRA_DIST = ppl_c.h.in ppl_c.cc
+
+if BUILD_C_INTERFACE
+
+# Libtool -version-info for libppl_c.la.
+#
+#  1. Start with version information of `0:0:0' for each libtool library.
+#
+#  2. Update the version information only immediately before a public
+#     release of your software.  More frequent updates are unnecessary,
+#     and only guarantee that the current interface number gets larger
+#     faster.
+#
+#  3. If the library source code has changed at all since the last
+#     update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+#  4. If any interfaces have been added, removed, or changed since the
+#     last update, increment CURRENT, and set REVISION to 0.
+#
+#  5. If any interfaces have been added since the last public release,
+#     then increment AGE.
+#
+#  6. If any interfaces have been removed since the last public release,
+#     then set AGE to 0.
+#
+#	PPL release		-version-info
+#	    0.1			    -----
+#	    0.2			    -----
+#	    0.3			    -----
+#	    0.4			    0:0:0
+#	    0.5			    1:0:0
+
+LIBPPL_C_LT_CURRENT =  1
+LIBPPL_C_LT_REVISION = 0
+LIBPPL_C_LT_AGE =      1
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+lib_LTLIBRARIES = libppl_c.la
+libppl_c_la_SOURCES = ppl_c.cc
+libppl_c_la_LDFLAGS = \
+-version-info $(LIBPPL_C_LT_CURRENT):$(LIBPPL_C_LT_REVISION):$(LIBPPL_C_LT_AGE)
+
+include_HEADERS = ppl_c.h
+
+endif BUILD_C_INTERFACE
diff --git a/interfaces/C/Makefile.in b/interfaces/C/Makefile.in
new file mode 100644
index 0000000..71db98a
--- /dev/null
+++ b/interfaces/C/Makefile.in
@@ -0,0 +1,644 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/C
+DIST_COMMON = $(am__include_HEADERS_DIST) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(srcdir)/ppl_c.h.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = ppl_c.h
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libppl_c_la_LIBADD =
+am__libppl_c_la_SOURCES_DIST = ppl_c.cc
+ at BUILD_C_INTERFACE_TRUE@am_libppl_c_la_OBJECTS = ppl_c.lo
+libppl_c_la_OBJECTS = $(am_libppl_c_la_OBJECTS)
+ at BUILD_C_INTERFACE_TRUE@am_libppl_c_la_rpath = -rpath $(libdir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_c_la_SOURCES)
+DIST_SOURCES = $(am__libppl_c_la_SOURCES_DIST)
+am__include_HEADERS_DIST = ppl_c.h
+includeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+EXTRA_DIST = ppl_c.h.in ppl_c.cc
+
+# Libtool -version-info for libppl_c.la.
+#
+#  1. Start with version information of `0:0:0' for each libtool library.
+#
+#  2. Update the version information only immediately before a public
+#     release of your software.  More frequent updates are unnecessary,
+#     and only guarantee that the current interface number gets larger
+#     faster.
+#
+#  3. If the library source code has changed at all since the last
+#     update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+#  4. If any interfaces have been added, removed, or changed since the
+#     last update, increment CURRENT, and set REVISION to 0.
+#
+#  5. If any interfaces have been added since the last public release,
+#     then increment AGE.
+#
+#  6. If any interfaces have been removed since the last public release,
+#     then set AGE to 0.
+#
+#	PPL release		-version-info
+#	    0.1			    -----
+#	    0.2			    -----
+#	    0.3			    -----
+#	    0.4			    0:0:0
+#	    0.5			    1:0:0
+ at BUILD_C_INTERFACE_TRUE@LIBPPL_C_LT_CURRENT = 1
+ at BUILD_C_INTERFACE_TRUE@LIBPPL_C_LT_REVISION = 0
+ at BUILD_C_INTERFACE_TRUE@LIBPPL_C_LT_AGE = 1
+ at BUILD_C_INTERFACE_TRUE@AM_CPPFLAGS = \
+ at BUILD_C_INTERFACE_TRUE@-I$(top_builddir)/src \
+ at BUILD_C_INTERFACE_TRUE@@extra_includes@
+
+ at BUILD_C_INTERFACE_TRUE@lib_LTLIBRARIES = libppl_c.la
+ at BUILD_C_INTERFACE_TRUE@libppl_c_la_SOURCES = ppl_c.cc
+ at BUILD_C_INTERFACE_TRUE@libppl_c_la_LDFLAGS = \
+ at BUILD_C_INTERFACE_TRUE@-version-info $(LIBPPL_C_LT_CURRENT):$(LIBPPL_C_LT_REVISION):$(LIBPPL_C_LT_AGE)
+
+ at BUILD_C_INTERFACE_TRUE@include_HEADERS = ppl_c.h
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/C/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/C/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+ppl_c.h: $(top_builddir)/config.status $(srcdir)/ppl_c.h.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    f=$(am__strip_dir) \
+	    echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+	    $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+	  else :; fi; \
+	done
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  p=$(am__strip_dir) \
+	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+libppl_c.la: $(libppl_c_la_OBJECTS) $(libppl_c_la_DEPENDENCIES) 
+	$(CXXLINK) $(am_libppl_c_la_rpath) $(libppl_c_la_LDFLAGS) $(libppl_c_la_OBJECTS) $(libppl_c_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)"
+	@list='$(include_HEADERS)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
+	  $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(include_HEADERS)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(includedir)/$$f"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS
+
+install-exec-am: install-libLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-includeHEADERS uninstall-info-am \
+	uninstall-libLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-libLTLIBRARIES clean-libtool ctags distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-exec \
+	install-exec-am install-includeHEADERS install-info \
+	install-info-am install-libLTLIBRARIES install-man \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags uninstall uninstall-am \
+	uninstall-includeHEADERS uninstall-info-am \
+	uninstall-libLTLIBRARIES
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/C/ppl_c.cc b/interfaces/C/ppl_c.cc
new file mode 100644
index 0000000..55a55fc
--- /dev/null
+++ b/interfaces/C/ppl_c.cc
@@ -0,0 +1,2524 @@
+/* Implementation of the C interface.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "ppl_c.h"
+#include <stdexcept>
+#include <limits>
+#include <sstream>
+#include <cstdio>
+#include <cerrno>
+#include <climits>
+
+using namespace Parma_Polyhedra_Library;
+
+//! Reinterpret an mpz_t as mpz_class.
+mpz_class&
+reinterpret_mpz_class(mpz_t n) {
+  return reinterpret_cast<mpz_class&>(*n);
+}
+
+#define DECLARE_CONVERSIONS(Type) \
+inline const Type* \
+to_const(ppl_const_ ## Type ## _t x) { \
+  return reinterpret_cast<const Type*>(x); \
+} \
+ \
+inline Type* \
+to_nonconst(ppl_ ## Type ## _t x) { \
+  return reinterpret_cast<Type*>(x); \
+} \
+ \
+inline ppl_const_ ## Type ## _t \
+to_const(const Type* x) { \
+  return reinterpret_cast<ppl_const_ ## Type ## _t>(x); \
+} \
+ \
+inline ppl_ ## Type ## _t \
+to_nonconst(Type* x) { \
+  return reinterpret_cast<ppl_ ## Type ## _t>(x); \
+}
+
+namespace {
+
+extern "C" typedef void
+(*error_handler_type)(enum ppl_enum_error_code code, const char* description);
+
+error_handler_type user_error_handler = 0;
+
+void
+notify_error(enum ppl_enum_error_code code, const char* description) {
+  if (user_error_handler != 0)
+    user_error_handler(code, description);
+}
+
+} // namespace
+
+int
+ppl_set_error_handler(error_handler_type h) {
+  user_error_handler = h;
+  return 0;
+}
+
+#define CATCH_STD_EXCEPTION(exception, code) \
+catch (const std::exception& e) {	     \
+  notify_error(code, e.what()); \
+  return code; \
+}
+
+#define CATCH_ALL \
+CATCH_STD_EXCEPTION(bad_alloc, PPL_ERROR_OUT_OF_MEMORY) \
+CATCH_STD_EXCEPTION(invalid_argument, PPL_ERROR_INVALID_ARGUMENT) \
+CATCH_STD_EXCEPTION(domain_error, PPL_ERROR_DOMAIN_ERROR) \
+CATCH_STD_EXCEPTION(length_error, PPL_ERROR_LENGTH_ERROR) \
+CATCH_STD_EXCEPTION(overflow_error, PPL_ARITHMETIC_OVERFLOW) \
+CATCH_STD_EXCEPTION(runtime_error, PPL_ERROR_INTERNAL_ERROR) \
+CATCH_STD_EXCEPTION(exception, PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION) \
+catch (...) {						     \
+  notify_error(PPL_ERROR_UNEXPECTED_ERROR, \
+	       "completely unexpected error: a bug in the PPL"); \
+  return PPL_ERROR_UNEXPECTED_ERROR; \
+}
+
+unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
+unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
+unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
+unsigned int PPL_POLY_CON_RELATION_SATURATES;
+
+unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+int PPL_LP_PROBLEM_STATUS_UNFEASIBLE;
+int PPL_LP_PROBLEM_STATUS_UNBOUNDED;
+int PPL_LP_PROBLEM_STATUS_OPTIMIZED;
+
+int PPL_LP_PROBLEM_MINIMIZATION;
+int PPL_LP_PROBLEM_MAXIMIZATION;
+
+namespace {
+
+// Holds a pointer to the init object.
+Init* init_object_ptr = 0;
+
+} // namespace
+
+
+
+namespace {
+
+extern "C" const char*
+c_variable_default_output_function(ppl_dimension_type var) {
+#if SIZEOF_SIZE_T == SIZEOF_UNSIGNED
+# define FORMAT "%u"
+# define CONVERSION (unsigned)
+#elif SIZEOF_SIZE_T == SIZEOF_UNSIGNED_LONG
+# define FORMAT "%lu"
+# define CONVERSION (unsigned long)
+#elif SIZEOF_SIZE_T == SIZEOF_UNSIGNED_LONG_LONG
+# define FORMAT "%llu"
+# define CONVERSION (unsigned long long)
+#else
+# error "Unsupported definition for `size_t'."
+#endif
+  // On a 64-bits architecture, `var' will not be more than 2^64-1,
+  // (2^64-1)/26 is written with 18 decimal digits, plus one letter,
+  // plus one terminator makes 20.
+#if defined(ULLONG_MAX) && ULLONG_MAX > 18446744073709551615ULL
+# error "Please enlarge the buffer in the following line."
+#endif
+  static char buffer[20];
+  buffer[0] = static_cast<char>('A' + var % 26);
+  if (ppl_dimension_type i = var / 26) {
+    int r = sprintf(buffer+1, FORMAT, CONVERSION i);
+    if (r < 0)
+      return 0;
+    else if (r >= 19) {
+      errno = ERANGE;
+      return 0;
+    }
+  }
+  else
+    buffer[1] = '\0';
+  return buffer;
+}
+
+// Holds a pointer to the C current output function.
+ppl_io_variable_output_function_type* c_variable_output_function;
+
+void
+cxx_Variable_output_function(std::ostream& s, const Variable& v) {
+  const char* b = c_variable_output_function(v.id());
+  if (b == 0)
+    // Something went wrong in the client's output function.
+    // Client code will know what to do: we do nothing.
+    return;
+  s << b;
+}
+
+extern "C" typedef const char*
+c_variable_output_function_type(ppl_dimension_type var);
+
+// Holds a pointer to the C++ saved output function.
+Variable::output_function_type* saved_cxx_Variable_output_function;
+
+} // namespace
+
+
+int
+ppl_initialize(void) try {
+  if (init_object_ptr != 0)
+    // Already initialized: error.
+    return PPL_ERROR_INVALID_ARGUMENT;
+
+  init_object_ptr = new Init();
+
+  PPL_POLY_CON_RELATION_IS_DISJOINT
+    = Poly_Con_Relation::is_disjoint().get_flags();
+  PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS
+    = Poly_Con_Relation::strictly_intersects().get_flags();
+  PPL_POLY_CON_RELATION_IS_INCLUDED
+    = Poly_Con_Relation::is_included().get_flags();
+  PPL_POLY_CON_RELATION_SATURATES
+    = Poly_Con_Relation::saturates().get_flags();
+
+  PPL_POLY_GEN_RELATION_SUBSUMES
+    = Poly_Gen_Relation::subsumes().get_flags();
+
+  PPL_COMPLEXITY_CLASS_POLYNOMIAL = POLYNOMIAL_COMPLEXITY;
+  PPL_COMPLEXITY_CLASS_SIMPLEX = SIMPLEX_COMPLEXITY;
+  PPL_COMPLEXITY_CLASS_ANY = ANY_COMPLEXITY;
+
+  PPL_LP_PROBLEM_STATUS_UNFEASIBLE = UNFEASIBLE_LP_PROBLEM;
+  PPL_LP_PROBLEM_STATUS_UNBOUNDED = UNBOUNDED_LP_PROBLEM;
+  PPL_LP_PROBLEM_STATUS_OPTIMIZED = OPTIMIZED_LP_PROBLEM;
+
+  PPL_LP_PROBLEM_MINIMIZATION = MINIMIZATION;
+  PPL_LP_PROBLEM_MAXIMIZATION = MAXIMIZATION;
+
+  c_variable_output_function = c_variable_default_output_function;
+  saved_cxx_Variable_output_function = Variable::get_output_function();
+  Variable::set_output_function(cxx_Variable_output_function);
+
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_finalize(void) try {
+  if (init_object_ptr == 0)
+    // Not initialized or already finalized: error.
+    return PPL_ERROR_INVALID_ARGUMENT;
+
+  delete init_object_ptr;
+  init_object_ptr = 0;
+
+  Variable::set_output_function(saved_cxx_Variable_output_function);
+
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_version_major(void) try {
+  return version_major();
+}
+CATCH_ALL
+
+int
+ppl_version_minor(void) try {
+  return version_minor();
+}
+CATCH_ALL
+
+int
+ppl_version_revision(void) try {
+  return version_revision();
+}
+CATCH_ALL
+
+int
+ppl_version_beta(void) try {
+  return version_beta();
+}
+CATCH_ALL
+
+int
+ppl_version(const char** p) try {
+  // Note: use explicit qualification to avoid clashes on, e.g.,
+  // Solaris 2.9, where `version' is the name of an enum defined in
+  // math.h.
+  *p = Parma_Polyhedra_Library::version();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_banner(const char** p) try {
+  *p = banner();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_max_space_dimension(ppl_dimension_type* m) try {
+  *m = max_space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_not_a_dimension(ppl_dimension_type* m) try {
+  *m = not_a_dimension();
+  return 0;
+}
+CATCH_ALL
+
+DECLARE_CONVERSIONS(Coefficient)
+
+DECLARE_CONVERSIONS(Linear_Expression)
+
+DECLARE_CONVERSIONS(Constraint)
+
+DECLARE_CONVERSIONS(Constraint_System)
+
+typedef Constraint_System::const_iterator Constraint_System_const_iterator;
+DECLARE_CONVERSIONS(Constraint_System_const_iterator)
+
+DECLARE_CONVERSIONS(Generator)
+
+DECLARE_CONVERSIONS(Generator_System)
+
+typedef Generator_System::const_iterator Generator_System_const_iterator;
+DECLARE_CONVERSIONS(Generator_System_const_iterator)
+
+DECLARE_CONVERSIONS(Polyhedron)
+
+DECLARE_CONVERSIONS(LP_Problem)
+
+
+int
+ppl_new_Coefficient(ppl_Coefficient_t* pc) try {
+  *pc = to_nonconst(new Coefficient(0));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Coefficient_from_mpz_t(ppl_Coefficient_t* pc, mpz_t z) try {
+  *pc = to_nonconst(new Coefficient(reinterpret_mpz_class(z)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Coefficient_from_Coefficient(ppl_Coefficient_t* pc,
+				     ppl_const_Coefficient_t c) try {
+  const Coefficient& cc = *to_const(c);
+  *pc = to_nonconst(new Coefficient(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_to_mpz_t(ppl_const_Coefficient_t c, mpz_t z) try {
+  assign_r(reinterpret_mpz_class(z), *to_const(c), ROUND_NOT_NEEDED);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Coefficient(ppl_const_Coefficient_t c) try {
+  delete to_const(c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Coefficient_from_mpz_t(ppl_Coefficient_t dst, mpz_t z) try {
+  Coefficient& ddst = *to_nonconst(dst);
+  ddst = reinterpret_mpz_class(z);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Coefficient_from_Coefficient(ppl_Coefficient_t dst,
+					ppl_const_Coefficient_t src) try {
+  const Coefficient& ssrc = *to_const(src);
+  Coefficient& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_OK(ppl_const_Coefficient_t /* c */) try {
+  return 1;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_is_bounded(void) try {
+  return std::numeric_limits<Coefficient>::is_bounded ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_min(mpz_t min) try {
+  if (std::numeric_limits<Coefficient>::is_bounded) {
+    assign_r(reinterpret_mpz_class(min),
+	     std::numeric_limits<Coefficient>::min(),
+	     ROUND_NOT_NEEDED);
+    return 1;
+  }
+  else
+    return 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_max(mpz_t max) try {
+  if (std::numeric_limits<Coefficient>::is_bounded) {
+    assign_r(reinterpret_mpz_class(max),
+	     std::numeric_limits<Coefficient>::max(),
+	     ROUND_NOT_NEEDED);
+    return 1;
+  }
+  else
+    return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression(ppl_Linear_Expression_t* ple) try {
+  *ple = to_nonconst(new Linear_Expression());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_with_dimension(ppl_Linear_Expression_t* ple,
+					 ppl_dimension_type d) try {
+  *ple = to_nonconst(d == 0
+		     ? new Linear_Expression(0)
+		     : new Linear_Expression(0*Variable(d-1)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Linear_Expression
+(ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le) try {
+  const Linear_Expression& lle = *to_const(le);
+  *ple = to_nonconst(new Linear_Expression(lle));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Linear_Expression(ppl_const_Linear_Expression_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Linear_Expression_from_Linear_Expression
+(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
+  const Linear_Expression& ssrc = *to_const(src);
+  Linear_Expression& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_add_to_coefficient(ppl_Linear_Expression_t le,
+					 ppl_dimension_type var,
+					 ppl_const_Coefficient_t n) try {
+  Linear_Expression& lle = *to_nonconst(le);
+  const Coefficient& nn = *to_const(n);
+  lle += nn * Variable(var);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_add_to_inhomogeneous(ppl_Linear_Expression_t le,
+					   ppl_const_Coefficient_t n) try {
+  Linear_Expression& lle = *to_nonconst(le);
+  const Coefficient& nn = *to_const(n);
+  lle += nn;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_add_Linear_Expression_to_Linear_Expression
+(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
+  Linear_Expression& ddst = *to_nonconst(dst);
+  const Linear_Expression& ssrc = *to_const(src);
+  ddst += ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_subtract_Linear_Expression_from_Linear_Expression
+(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
+  Linear_Expression& ddst = *to_nonconst(dst);
+  const Linear_Expression& ssrc = *to_const(src);
+  ddst -= ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_multiply_Linear_Expression_by_Coefficient(ppl_Linear_Expression_t le,
+					      ppl_const_Coefficient_t n) try {
+  Linear_Expression& lle = *to_nonconst(le);
+  const Coefficient& nn = *to_const(n);
+  lle *= nn;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_space_dimension(ppl_const_Linear_Expression_t le,
+				      ppl_dimension_type* m) try {
+  *m = to_const(le)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_coefficient(ppl_const_Linear_Expression_t le,
+				  ppl_dimension_type var,
+				  ppl_Coefficient_t n) try {
+  const Linear_Expression& lle = *to_const(le);
+  Coefficient& nn = *to_nonconst(n);
+  nn = lle.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_inhomogeneous_term(ppl_const_Linear_Expression_t le,
+					 ppl_Coefficient_t n) try {
+  const Linear_Expression& lle = *to_const(le);
+  Coefficient& nn = *to_nonconst(n);
+  nn = lle.inhomogeneous_term();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_OK(ppl_const_Linear_Expression_t /* le */) try {
+  return 1;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Constraint(ppl_Constraint_t* pc,
+		   ppl_const_Linear_Expression_t le,
+		   enum ppl_enum_Constraint_Type t) try {
+  Constraint* ppc;
+  const Linear_Expression& lle = *to_const(le);
+  switch (t) {
+  case PPL_CONSTRAINT_TYPE_EQUAL:
+    ppc = new Constraint(lle == 0);
+    break;
+  case PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL:
+    ppc = new Constraint(lle >= 0);
+    break;
+  case PPL_CONSTRAINT_TYPE_GREATER_THAN:
+    ppc = new Constraint(lle > 0);
+    break;
+  case PPL_CONSTRAINT_TYPE_LESS_THAN_OR_EQUAL:
+    ppc = new Constraint(lle <= 0);
+    break;
+  case PPL_CONSTRAINT_TYPE_LESS_THAN:
+    ppc = new Constraint(lle < 0);
+    break;
+  default:
+    throw std::invalid_argument("ppl_new_Constraint(pc, le, t): "
+				"t invalid");
+  }
+  *pc = to_nonconst(ppc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_zero_dim_false(ppl_Constraint_t* pc) try {
+  *pc = to_nonconst(new Constraint(Constraint::zero_dim_false()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_zero_dim_positivity(ppl_Constraint_t* pc) try {
+  *pc = to_nonconst(new Constraint(Constraint::zero_dim_positivity()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_from_Constraint(ppl_Constraint_t* pc,
+				   ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  *pc = to_nonconst(new Constraint(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Constraint(ppl_const_Constraint_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Constraint_from_Constraint(ppl_Constraint_t dst,
+				      ppl_const_Constraint_t src) try {
+  const Constraint& ssrc = *to_const(src);
+  Constraint& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_space_dimension(ppl_const_Constraint_t c,
+			       ppl_dimension_type* m) try {
+  *m = to_const(c)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_type(ppl_const_Constraint_t c) try {
+  switch (to_const(c)->type()) {
+  case Constraint::EQUALITY:
+    return PPL_CONSTRAINT_TYPE_EQUAL;
+  case Constraint::NONSTRICT_INEQUALITY:
+    return PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL;
+  case Constraint::STRICT_INEQUALITY:
+    return PPL_CONSTRAINT_TYPE_GREATER_THAN;
+  default:
+    throw std::runtime_error("ppl_Constraint_type()");
+  }
+}
+CATCH_ALL
+
+int
+ppl_Constraint_coefficient(ppl_const_Constraint_t c,
+			   ppl_dimension_type var,
+			   ppl_Coefficient_t n) try {
+  const Constraint& cc = *to_const(c);
+  Coefficient& nn = *to_nonconst(n);
+  nn = cc.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_inhomogeneous_term(ppl_const_Constraint_t c,
+				  ppl_Coefficient_t n) try {
+  const Constraint& cc = *to_const(c);
+  Coefficient& nn = *to_nonconst(n);
+  nn = cc.inhomogeneous_term();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_OK(ppl_const_Constraint_t /* c */) try {
+  return 1;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Constraint(ppl_Linear_Expression_t* ple,
+					  ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  *ple = to_nonconst(new Linear_Expression(cc));
+  return 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Constraint_System(ppl_Constraint_System_t* pcs) try {
+  *pcs = to_nonconst(new Constraint_System());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_System_zero_dim_empty(ppl_Constraint_System_t* pcs) try {
+  *pcs = to_nonconst(new
+		     Constraint_System(Constraint_System::zero_dim_empty()));
+  return 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Constraint_System_from_Constraint(ppl_Constraint_System_t* pcs,
+					  ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  *pcs = to_nonconst(new Constraint_System(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_System_from_Constraint_System
+(ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  *pcs = to_nonconst(new Constraint_System(ccs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Constraint_System(ppl_const_Constraint_System_t cs) try {
+  delete to_const(cs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Constraint_System_from_Constraint_System
+(ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src) try {
+  const Constraint_System& ssrc = *to_const(src);
+  Constraint_System& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_space_dimension(ppl_const_Constraint_System_t cs,
+				      ppl_dimension_type* m) try {
+  *m = to_const(cs)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_has_strict_inequalities
+(ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  return ccs.has_strict_inequalities() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_clear(ppl_Constraint_System_t cs) try {
+  to_nonconst(cs)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_insert_Constraint(ppl_Constraint_System_t cs,
+					ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  Constraint_System& ccs = *to_nonconst(cs);
+  ccs.insert(cc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_OK(ppl_const_Constraint_System_t cs) try {
+  return to_const(cs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Constraint_System_const_iterator
+(ppl_Constraint_System_const_iterator_t* pcit) try {
+  *pcit = to_nonconst(new Constraint_System::const_iterator());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+(ppl_Constraint_System_const_iterator_t* pcit,
+ ppl_const_Constraint_System_const_iterator_t cit)  try {
+  *pcit = to_nonconst(new Constraint_System::const_iterator(*to_const(cit)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Constraint_System_const_iterator
+(ppl_const_Constraint_System_const_iterator_t cit)
+  try {
+  delete to_const(cit);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+(ppl_Constraint_System_const_iterator_t dst,
+ ppl_const_Constraint_System_const_iterator_t src) try {
+  const Constraint_System::const_iterator& ssrc = *to_const(src);
+  Constraint_System::const_iterator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_begin(ppl_const_Constraint_System_t cs,
+			    ppl_Constraint_System_const_iterator_t cit) try {
+  const Constraint_System& ccs = *to_const(cs);
+  Constraint_System::const_iterator& ccit = *to_nonconst(cit);
+  ccit = ccs.begin();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_end(ppl_const_Constraint_System_t cs,
+			  ppl_Constraint_System_const_iterator_t cit) try {
+  const Constraint_System& ccs = *to_const(cs);
+  Constraint_System::const_iterator& ccit = *to_nonconst(cit);
+  ccit = ccs.end();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_const_iterator_dereference
+(ppl_const_Constraint_System_const_iterator_t cit,
+ ppl_const_Constraint_t* pc) try {
+  const Constraint_System::const_iterator& ccit = *to_const(cit);
+  const Constraint& c = *ccit;
+  *pc = to_const(&c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_const_iterator_increment
+(ppl_Constraint_System_const_iterator_t cit) try {
+  Constraint_System::const_iterator& ccit = *to_nonconst(cit);
+  ++ccit;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_const_iterator_equal_test
+(ppl_const_Constraint_System_const_iterator_t x,
+ ppl_const_Constraint_System_const_iterator_t y) try {
+  const Constraint_System::const_iterator& xx = *to_const(x);
+  const Constraint_System::const_iterator& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Generator(ppl_Generator_t* pg,
+		  ppl_const_Linear_Expression_t le,
+		  enum ppl_enum_Generator_Type t,
+		  ppl_const_Coefficient_t d) try {
+  Generator* ppg;
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  switch (t) {
+  case PPL_GENERATOR_TYPE_POINT:
+    ppg = new Generator(Generator::point(lle, dd));
+    break;
+  case PPL_GENERATOR_TYPE_CLOSURE_POINT:
+    ppg = new Generator(Generator::closure_point(lle, dd));
+    break;
+  case PPL_GENERATOR_TYPE_RAY:
+    ppg = new Generator(Generator::ray(lle));
+    break;
+  case PPL_GENERATOR_TYPE_LINE:
+    ppg = new Generator(Generator::line(lle));
+    break;
+  default:
+    throw std::invalid_argument("ppl_new_Generator(pg, le, t, d): "
+				"t invalid");
+  }
+  *pg = to_nonconst(ppg);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_zero_dim_point(ppl_Generator_t* pg) try {
+  *pg = to_nonconst(new Generator(Generator::zero_dim_point()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_zero_dim_closure_point(ppl_Generator_t* pg) try {
+  *pg = to_nonconst(new Generator(Generator::zero_dim_closure_point()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_from_Generator(ppl_Generator_t* pg,
+				 ppl_const_Generator_t g) try {
+  const Generator& gg = *to_const(g);
+  *pg = to_nonconst(new Generator(gg));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Generator(ppl_const_Generator_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Generator_from_Generator(ppl_Generator_t dst,
+				      ppl_const_Generator_t src) try {
+  const Generator& ssrc = *to_const(src);
+  Generator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_space_dimension(ppl_const_Generator_t g,
+			      ppl_dimension_type* m) try {
+  *m = to_const(g)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_type(ppl_const_Generator_t g) try {
+  switch (to_const(g)->type()) {
+  case Generator::LINE:
+    return PPL_GENERATOR_TYPE_LINE;
+  case Generator::RAY:
+    return PPL_GENERATOR_TYPE_RAY;
+  case Generator::POINT:
+    return PPL_GENERATOR_TYPE_POINT;
+  case Generator::CLOSURE_POINT:
+    return PPL_GENERATOR_TYPE_CLOSURE_POINT;
+  default:
+    throw std::runtime_error("ppl_Generator_type()");
+  }
+}
+CATCH_ALL
+
+int
+ppl_Generator_coefficient(ppl_const_Generator_t g,
+			  ppl_dimension_type var,
+			  ppl_Coefficient_t n) try {
+  const Generator& gg = *to_const(g);
+  Coefficient& nn = *to_nonconst(n);
+  nn = gg.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_divisor(ppl_const_Generator_t g,
+		      ppl_Coefficient_t n) try {
+  const Generator& gg = *to_const(g);
+  Coefficient& nn = *to_nonconst(n);
+  nn = gg.divisor();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_OK(ppl_const_Generator_t /* g */) try {
+  return 1;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Generator(ppl_Linear_Expression_t* ple,
+					 ppl_const_Generator_t g) try {
+  const Generator& gg = *to_const(g);
+  *ple = to_nonconst(new Linear_Expression(gg));
+  return 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Generator_System(ppl_Generator_System_t* pgs) try {
+  *pgs = to_nonconst(new Generator_System());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_zero_dim_univ(ppl_Generator_System_t* pgs) try {
+  *pgs = to_nonconst(new Generator_System(Generator_System::zero_dim_univ()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_from_Generator(ppl_Generator_System_t* pgs,
+			      ppl_const_Generator_t g) try {
+  const Generator& gg = *to_const(g);
+  *pgs = to_nonconst(new Generator_System(gg));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_from_Generator_System
+(ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs) try {
+  const Generator_System& ggs = *to_const(gs);
+  *pgs = to_nonconst(new Generator_System(ggs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Generator_System(ppl_const_Generator_System_t gs) try {
+  delete to_const(gs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Generator_System_from_Generator_System
+(ppl_Generator_System_t dst, ppl_const_Generator_System_t src) try {
+  const Generator_System& ssrc = *to_const(src);
+  Generator_System& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_space_dimension(ppl_const_Generator_System_t gs,
+				     ppl_dimension_type* m) try {
+  *m = to_const(gs)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_clear(ppl_Generator_System_t gs) try {
+  to_nonconst(gs)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_insert_Generator(ppl_Generator_System_t gs,
+				      ppl_const_Generator_t g) try {
+  const Generator& gg = *to_const(g);
+  Generator_System& ggs = *to_nonconst(gs);
+  ggs.insert(gg);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_OK(ppl_const_Generator_System_t gs) try {
+  return to_const(gs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Generator_System_const_iterator
+(ppl_Generator_System_const_iterator_t* pgit) try {
+  *pgit = to_nonconst(new Generator_System::const_iterator());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
+(ppl_Generator_System_const_iterator_t* pgit,
+ ppl_const_Generator_System_const_iterator_t git)  try {
+  *pgit = to_nonconst(new Generator_System::const_iterator(*to_const(git)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Generator_System_const_iterator
+(ppl_const_Generator_System_const_iterator_t git) try {
+  delete to_const(git);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
+(ppl_Generator_System_const_iterator_t dst,
+ ppl_const_Generator_System_const_iterator_t src) try {
+  const Generator_System::const_iterator& ssrc = *to_const(src);
+  Generator_System::const_iterator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_begin(ppl_const_Generator_System_t gs,
+			   ppl_Generator_System_const_iterator_t git) try {
+  const Generator_System& ggs = *to_const(gs);
+  Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ggit = ggs.begin();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_end(ppl_const_Generator_System_t gs,
+			 ppl_Generator_System_const_iterator_t git) try {
+  const Generator_System& ggs = *to_const(gs);
+  Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ggit = ggs.end();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_const_iterator_dereference
+(ppl_const_Generator_System_const_iterator_t git,
+ ppl_const_Generator_t* pg) try {
+  const Generator_System::const_iterator& ggit = *to_const(git);
+  const Generator& c = *ggit;
+  *pg = to_const(&c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_const_iterator_increment
+(ppl_Generator_System_const_iterator_t git) try {
+  Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ++ggit;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_const_iterator_equal_test
+(ppl_const_Generator_System_const_iterator_t x,
+ ppl_const_Generator_System_const_iterator_t y) try {
+  const Generator_System::const_iterator& xx = *to_const(x);
+  const Generator_System::const_iterator& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_C_Polyhedron_from_dimension(ppl_Polyhedron_t* pph,
+				    ppl_dimension_type d) try {
+  *pph = to_nonconst(new C_Polyhedron(d, UNIVERSE));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_from_dimension(ppl_Polyhedron_t* pph,
+				      ppl_dimension_type d) try {
+  *pph = to_nonconst(new NNC_Polyhedron(d, UNIVERSE));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_empty_from_dimension(ppl_Polyhedron_t* pph,
+					  ppl_dimension_type d) try {
+  *pph = to_nonconst(new C_Polyhedron(d, EMPTY));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_empty_from_dimension(ppl_Polyhedron_t* pph,
+					    ppl_dimension_type d) try {
+  *pph = to_nonconst(new NNC_Polyhedron(d, EMPTY));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t* pph,
+				       ppl_const_Polyhedron_t ph) try {
+  const C_Polyhedron& phh = *static_cast<const C_Polyhedron*>(to_const(ph));
+  *pph = to_nonconst(new C_Polyhedron(phh));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t* pph,
+					 ppl_const_Polyhedron_t ph) try {
+  const NNC_Polyhedron& phh
+    = *static_cast<const NNC_Polyhedron*>(to_const(ph));
+  *pph = to_nonconst(new C_Polyhedron(phh));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t* pph,
+					 ppl_const_Polyhedron_t ph) try {
+  const C_Polyhedron& phh = *static_cast<const C_Polyhedron*>(to_const(ph));
+  *pph = to_nonconst(new NNC_Polyhedron(phh));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t* pph,
+					   ppl_const_Polyhedron_t ph) try {
+  const NNC_Polyhedron& phh
+    = *static_cast<const NNC_Polyhedron*>(to_const(ph));
+  *pph = to_nonconst(new NNC_Polyhedron(phh));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_from_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  *pph = to_nonconst(new C_Polyhedron(ccs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_recycle_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs) try {
+  Constraint_System& ccs = *to_nonconst(cs);
+  *pph = to_nonconst(new C_Polyhedron(ccs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_from_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  *pph = to_nonconst(new NNC_Polyhedron(ccs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_recycle_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs) try {
+  Constraint_System& ccs = *to_nonconst(cs);
+  *pph = to_nonconst(new NNC_Polyhedron(ccs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_from_Generator_System
+(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs) try {
+  const Generator_System& ggs = *to_const(gs);
+  *pph = to_nonconst(new C_Polyhedron(ggs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_recycle_Generator_System(ppl_Polyhedron_t* pph,
+					      ppl_Generator_System_t gs) try {
+  Generator_System& ggs = *to_nonconst(gs);
+  *pph = to_nonconst(new C_Polyhedron(ggs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_from_Generator_System
+(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs) try {
+  const Generator_System& ggs = *to_const(gs);
+  *pph = to_nonconst(new C_Polyhedron(ggs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_recycle_Generator_System
+(ppl_Polyhedron_t* pph, ppl_Generator_System_t gs) try {
+  Generator_System& ggs = *to_nonconst(gs);
+  *pph = to_nonconst(new C_Polyhedron(ggs));
+  return 0;
+}
+CATCH_ALL
+
+namespace {
+
+class C_Build_Box {
+private:
+  ppl_dimension_type (*s_d)(void);
+  int (*i_e)(void);
+  int (*g_l_b)(ppl_dimension_type k, int closed,
+	       ppl_Coefficient_t n,
+	       ppl_Coefficient_t d);
+  int (*g_u_b)(ppl_dimension_type k, int closed,
+	       ppl_Coefficient_t n,
+	       ppl_Coefficient_t d);
+
+public:
+  C_Build_Box(ppl_dimension_type (*sd)(void),
+	      int (*ie)(void),
+	      int (*glb)(ppl_dimension_type k, int closed,
+			 ppl_Coefficient_t n,
+			 ppl_Coefficient_t d),
+	      int (*gub)(ppl_dimension_type k, int closed,
+			 ppl_Coefficient_t n,
+			 ppl_Coefficient_t d))
+    : s_d(sd), i_e(ie), g_l_b(glb), g_u_b(gub) {
+  }
+
+  ppl_dimension_type space_dimension() const {
+    return s_d();
+  }
+
+  bool is_empty(void) const {
+    return i_e() != 0;
+  }
+
+  bool get_lower_bound(ppl_dimension_type k, bool closed,
+		       Coefficient& n, Coefficient& d) const {
+    return g_l_b(k, closed, to_nonconst(&n), to_nonconst(&d)) != 0;
+  }
+
+  bool get_upper_bound(ppl_dimension_type k, bool closed,
+		       Coefficient& n, Coefficient& d) const {
+    return g_u_b(k, closed, to_nonconst(&n), to_nonconst(&d)) != 0;
+  }
+};
+
+} // namespace
+
+int
+ppl_new_C_Polyhedron_from_bounding_box
+(ppl_Polyhedron_t* pph,
+ ppl_dimension_type (*space_dimension)(void),
+ int (*is_empty)(void),
+ int (*get_lower_bound)(ppl_dimension_type k, int closed,
+			ppl_Coefficient_t n,
+			ppl_Coefficient_t d),
+ int (*get_upper_bound)(ppl_dimension_type k, int closed,
+			ppl_Coefficient_t n,
+			ppl_Coefficient_t d)) try {
+  C_Build_Box cbbox(space_dimension, is_empty,
+		    get_lower_bound, get_upper_bound);
+  *pph = to_nonconst(new C_Polyhedron(cbbox, From_Bounding_Box()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_from_bounding_box
+(ppl_Polyhedron_t* pph,
+ ppl_dimension_type (*space_dimension)(void),
+ int (*is_empty)(void),
+ int (*get_lower_bound)(ppl_dimension_type k, int closed,
+			ppl_Coefficient_t n,
+			ppl_Coefficient_t d),
+ int (*get_upper_bound)(ppl_dimension_type k, int closed,
+			ppl_Coefficient_t n,
+			ppl_Coefficient_t d)) try {
+  C_Build_Box cbbox(space_dimension, is_empty,
+		    get_lower_bound, get_upper_bound);
+  *pph = to_nonconst(new NNC_Polyhedron(cbbox, From_Bounding_Box()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Polyhedron(ppl_const_Polyhedron_t ph) try {
+  delete to_const(ph);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_C_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t dst,
+					  ppl_const_Polyhedron_t src) try {
+  const C_Polyhedron& ssrc
+    = *static_cast<const C_Polyhedron*>(to_const(src));
+  C_Polyhedron& ddst = *static_cast<C_Polyhedron*>(to_nonconst(dst));
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t dst,
+					      ppl_const_Polyhedron_t src) try {
+  const NNC_Polyhedron& ssrc
+    = *static_cast<const NNC_Polyhedron*>(to_const(src));
+  NNC_Polyhedron& ddst = *static_cast<NNC_Polyhedron*>(to_nonconst(dst));
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_space_dimension(ppl_const_Polyhedron_t ph,
+			       ppl_dimension_type* m) try {
+  *m = to_const(ph)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_affine_dimension(ppl_const_Polyhedron_t ph,
+				ppl_dimension_type* m) try {
+  *m = to_const(ph)->affine_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_intersection_assign(ppl_Polyhedron_t x,
+				   ppl_const_Polyhedron_t y) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  xx.intersection_assign(yy);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_intersection_assign_and_minimize(ppl_Polyhedron_t x,
+						ppl_const_Polyhedron_t y) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  return xx.intersection_assign_and_minimize(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_concatenate_assign(ppl_Polyhedron_t x,
+				  ppl_const_Polyhedron_t y) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  xx.concatenate_assign(yy);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_poly_hull_assign(ppl_Polyhedron_t x,
+				ppl_const_Polyhedron_t y) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  xx.poly_hull_assign(yy);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_poly_hull_assign_and_minimize(ppl_Polyhedron_t x,
+					     ppl_const_Polyhedron_t y) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  return xx.poly_hull_assign_and_minimize(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_poly_difference_assign(ppl_Polyhedron_t x,
+				      ppl_const_Polyhedron_t y) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  xx.poly_difference_assign(yy);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(ppl_Polyhedron_t x,
+						  ppl_const_Polyhedron_t y,
+						  unsigned* tp) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  xx.BHRZ03_widening_assign(yy, tp);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_BHRZ03_widening_assign(ppl_Polyhedron_t x,
+				      ppl_const_Polyhedron_t y) try {
+  return ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(x, y, 0);
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  const Constraint_System& ccs = *to_const(cs);
+  xx.limited_BHRZ03_extrapolation_assign(yy, ccs, tp);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs) try {
+  return ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(x, y,
+									cs, 0);
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  const Constraint_System& ccs = *to_const(cs);
+  xx.bounded_BHRZ03_extrapolation_assign(yy, ccs, tp);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs) try {
+  return ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(x, y,
+									cs, 0);
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_H79_widening_assign_with_tokens(ppl_Polyhedron_t x,
+					       ppl_const_Polyhedron_t y,
+					       unsigned* tp) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  xx.H79_widening_assign(yy, tp);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_H79_widening_assign(ppl_Polyhedron_t x,
+				   ppl_const_Polyhedron_t y) try {
+  return ppl_Polyhedron_H79_widening_assign_with_tokens(x, y, 0);
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  const Constraint_System& ccs = *to_const(cs);
+  xx.limited_H79_extrapolation_assign(yy, ccs, tp);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs) try {
+  return ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(x, y,
+								     cs, 0);
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  const Constraint_System& ccs = *to_const(cs);
+  xx.bounded_H79_extrapolation_assign(yy, ccs, tp);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs) try {
+  return ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(x, y,
+								     cs, 0);
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_time_elapse_assign(ppl_Polyhedron_t x,
+				  ppl_const_Polyhedron_t y) try {
+  Polyhedron& xx = *to_nonconst(x);
+  const Polyhedron& yy = *to_const(y);
+  xx.time_elapse_assign(yy);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_constraints(ppl_const_Polyhedron_t ph,
+			   ppl_const_Constraint_System_t* pcs) try {
+  const Polyhedron& pph = *to_const(ph);
+  const Constraint_System& cs = pph.constraints();
+  *pcs = to_const(&cs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_minimized_constraints(ppl_const_Polyhedron_t ph,
+				     ppl_const_Constraint_System_t* pcs) try {
+  const Polyhedron& pph = *to_const(ph);
+  const Constraint_System& cs = pph.minimized_constraints();
+  *pcs = to_const(&cs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_generators(ppl_const_Polyhedron_t ph,
+			  ppl_const_Generator_System_t* pgs) try {
+  const Polyhedron& pph = *to_const(ph);
+  const Generator_System& gs = pph.generators();
+  *pgs = to_const(&gs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_minimized_generators(ppl_const_Polyhedron_t ph,
+				    ppl_const_Generator_System_t* pgs) try {
+  const Polyhedron& pph = *to_const(ph);
+  const Generator_System& gs = pph.minimized_generators();
+  *pgs = to_const(&gs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_constraint(ppl_Polyhedron_t ph,
+			      ppl_const_Constraint_t c) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Constraint& cc = *to_const(c);
+  pph.add_constraint(cc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_constraint_and_minimize(ppl_Polyhedron_t ph,
+					   ppl_const_Constraint_t c) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Constraint& cc = *to_const(c);
+  pph.add_constraint_and_minimize(cc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_generator(ppl_Polyhedron_t ph,
+			     ppl_const_Generator_t g) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Generator& gg = *to_const(g);
+  pph.add_generator(gg);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_generator_and_minimize(ppl_Polyhedron_t ph,
+					  ppl_const_Generator_t g) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Generator& gg = *to_const(g);
+  pph.add_generator_and_minimize(gg);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_constraints(ppl_Polyhedron_t ph,
+			       ppl_const_Constraint_System_t cs) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Constraint_System& ccs = *to_const(cs);
+  pph.add_constraints(ccs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_constraints_and_minimize
+(ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Constraint_System& ccs = *to_const(cs);
+  return pph.add_constraints_and_minimize(ccs) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_generators(ppl_Polyhedron_t ph,
+			      ppl_const_Generator_System_t gs) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Generator_System& ggs = *to_const(gs);
+  pph.add_generators(ggs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_generators_and_minimize
+(ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Generator_System& ggs = *to_const(gs);
+  return pph.add_generators_and_minimize(ggs) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_recycled_constraints(ppl_Polyhedron_t ph,
+					ppl_Constraint_System_t cs) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  Constraint_System& ccs = *to_nonconst(cs);
+  pph.add_recycled_constraints(ccs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_recycled_constraints_and_minimize
+(ppl_Polyhedron_t ph, ppl_Constraint_System_t cs) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  Constraint_System& ccs = *to_nonconst(cs);
+  return pph.add_recycled_constraints_and_minimize(ccs) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_recycled_generators(ppl_Polyhedron_t ph,
+				       ppl_Generator_System_t gs) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  Generator_System& ggs = *to_nonconst(gs);
+  pph.add_recycled_generators(ggs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_recycled_generators_and_minimize(ppl_Polyhedron_t ph,
+						    ppl_Generator_System_t gs)
+try {
+  Polyhedron& pph = *to_nonconst(ph);
+  Generator_System& ggs = *to_nonconst(gs);
+  return pph.add_recycled_generators_and_minimize(ggs) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_space_dimensions_and_embed(ppl_Polyhedron_t ph,
+					      ppl_dimension_type d) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  pph.add_space_dimensions_and_embed(d);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_space_dimensions_and_project(ppl_Polyhedron_t ph,
+						ppl_dimension_type d) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  pph.add_space_dimensions_and_project(d);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_remove_space_dimensions(ppl_Polyhedron_t ph,
+				       ppl_dimension_type ds[],
+				       size_t n) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  Variables_Set to_be_removed;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    to_be_removed.insert(Variable(ds[i]));
+  pph.remove_space_dimensions(to_be_removed);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_remove_higher_space_dimensions(ppl_Polyhedron_t ph,
+					      ppl_dimension_type d) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  pph.remove_higher_space_dimensions(d);
+  return 0;
+}
+CATCH_ALL
+
+namespace {
+
+class PIFunc {
+private:
+  //! Holds the vector implementing the map.
+  dimension_type* vec;
+
+  //! Holds the size of \p vec.
+  size_t vec_size;
+
+  //! Cache for computing the maximum dimension in the codomain.
+  mutable dimension_type max_in_codomain_;
+
+  //! Cache for computing emptiness:
+  //! -1 if we still don't know, 0 if not empty, 1 if empty.
+  mutable int empty;
+
+public:
+  PIFunc(dimension_type* v, size_t n)
+    : vec(v), vec_size(n), max_in_codomain_(not_a_dimension()), empty(-1) {
+  }
+
+  bool has_empty_codomain() const {
+    if (empty < 0) {
+      empty = 1;
+      for (size_t i = vec_size; i-- > 0; )
+	if (vec[i] != not_a_dimension()) {
+	  empty = 0;
+	  break;
+	}
+    }
+    return empty;
+  }
+
+  dimension_type max_in_codomain() const {
+    if (max_in_codomain_ == not_a_dimension()) {
+      for (size_t i = vec_size; i-- > 0; ) {
+	dimension_type vec_i = vec[i];
+	if (vec_i != not_a_dimension()
+	    && (max_in_codomain_ == not_a_dimension()
+		|| vec_i > max_in_codomain_))
+	  max_in_codomain_ = vec_i;
+      }
+    }
+    return max_in_codomain_;
+  }
+
+  bool maps(dimension_type i, dimension_type& j) const {
+    if (i >= vec_size)
+      return false;
+    dimension_type vec_i = vec[i];
+    if (vec_i == not_a_dimension())
+      return false;
+    j = vec_i;
+    return true;
+  }
+};
+
+} // namespace
+
+int
+ppl_Polyhedron_map_space_dimensions(ppl_Polyhedron_t ph,
+				    ppl_dimension_type maps[],
+				    size_t n) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  PIFunc pifunc(maps, n);
+  pph.map_space_dimensions(pifunc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_expand_space_dimension(ppl_Polyhedron_t ph,
+				      ppl_dimension_type d,
+				      ppl_dimension_type m) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  pph.expand_space_dimension(Variable(d), m);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_fold_space_dimensions(ppl_Polyhedron_t ph,
+				     ppl_dimension_type ds[],
+				     size_t n,
+				     ppl_dimension_type d) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  Variables_Set to_be_folded;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    to_be_folded.insert(Variable(ds[i]));
+  pph.fold_space_dimensions(to_be_folded, Variable(d));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_affine_image(ppl_Polyhedron_t ph,
+			    ppl_dimension_type var,
+			    ppl_const_Linear_Expression_t le,
+			    ppl_const_Coefficient_t d) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  pph.affine_image(Variable(var), lle, dd);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_affine_preimage(ppl_Polyhedron_t ph,
+			       ppl_dimension_type var,
+			       ppl_const_Linear_Expression_t le,
+			       ppl_const_Coefficient_t d) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  pph.affine_preimage(Variable(var), lle, dd);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_bounded_affine_image(ppl_Polyhedron_t ph,
+				    ppl_dimension_type var,
+				    ppl_const_Linear_Expression_t lb,
+				    ppl_const_Linear_Expression_t ub,
+				    ppl_const_Coefficient_t d) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Linear_Expression& llb = *to_const(lb);
+  const Linear_Expression& uub = *to_const(ub);
+  const Coefficient& dd = *to_const(d);
+  pph.bounded_affine_image(Variable(var), llb, uub, dd);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_bounded_affine_preimage(ppl_Polyhedron_t ph,
+				       ppl_dimension_type var,
+				       ppl_const_Linear_Expression_t lb,
+				       ppl_const_Linear_Expression_t ub,
+				       ppl_const_Coefficient_t d) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Linear_Expression& llb = *to_const(lb);
+  const Linear_Expression& uub = *to_const(ub);
+  const Coefficient& dd = *to_const(d);
+  pph.bounded_affine_preimage(Variable(var), llb, uub, dd);
+  return 0;
+}
+CATCH_ALL
+
+namespace {
+
+inline Relation_Symbol
+relation_symbol(enum ppl_enum_Constraint_Type t) {
+  switch (t) {
+  case PPL_CONSTRAINT_TYPE_LESS_THAN:
+    return LESS_THAN;
+  case PPL_CONSTRAINT_TYPE_LESS_THAN_OR_EQUAL:
+    return LESS_THAN_OR_EQUAL;
+  case PPL_CONSTRAINT_TYPE_EQUAL:
+    return EQUAL;
+  case PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL:
+    return GREATER_THAN_OR_EQUAL;
+  case PPL_CONSTRAINT_TYPE_GREATER_THAN:
+    return GREATER_THAN;
+  default:
+    return static_cast<Relation_Symbol>(t);
+  }
+}
+
+} // namespace
+
+int
+ppl_Polyhedron_generalized_affine_image(ppl_Polyhedron_t ph,
+					ppl_dimension_type var,
+					enum ppl_enum_Constraint_Type relsym,
+					ppl_const_Linear_Expression_t le,
+					ppl_const_Coefficient_t d) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  pph.generalized_affine_image(Variable(var), relation_symbol(relsym), lle,
+			       dd);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_generalized_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  pph.generalized_affine_preimage(Variable(var), relation_symbol(relsym), lle,
+				  dd);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_generalized_affine_image_lhs_rhs
+(ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Linear_Expression& llhs = *to_const(lhs);
+  const Linear_Expression& rrhs = *to_const(rhs);
+  pph.generalized_affine_image(llhs, relation_symbol(relsym), rrhs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+(ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  const Linear_Expression& llhs = *to_const(lhs);
+  const Linear_Expression& rrhs = *to_const(rhs);
+  pph.generalized_affine_preimage(llhs, relation_symbol(relsym), rrhs);
+  return 0;
+}
+CATCH_ALL
+
+
+namespace {
+
+class C_Shrink_Box {
+private:
+  void (*s_e)(void);
+  void (*r_l_b)(ppl_dimension_type k, int closed,
+		ppl_const_Coefficient_t n,
+		ppl_const_Coefficient_t d);
+  void (*l_u_b)(ppl_dimension_type k, int closed,
+		ppl_const_Coefficient_t n,
+		ppl_const_Coefficient_t d);
+
+public:
+  C_Shrink_Box(void (*se)(void),
+	       void (*rlb)(ppl_dimension_type k, int closed,
+			   ppl_const_Coefficient_t n,
+			   ppl_const_Coefficient_t d),
+	       void (*lub)(ppl_dimension_type k, int closed,
+			   ppl_const_Coefficient_t n,
+			   ppl_const_Coefficient_t d))
+    : s_e(se), r_l_b(rlb), l_u_b(lub) {
+  }
+
+  void set_empty() {
+    s_e();
+  }
+
+  void raise_lower_bound(ppl_dimension_type k, bool closed,
+			 const Coefficient& n, const Coefficient& d) {
+    r_l_b(k, closed, to_const(&n), to_const(&d));
+  }
+
+  void lower_upper_bound(ppl_dimension_type k, bool closed,
+			 const Coefficient& n, const Coefficient& d) {
+    l_u_b(k, closed, to_const(&n), to_const(&d));
+  }
+};
+
+} // namespace
+
+int
+ppl_Polyhedron_shrink_bounding_box
+(ppl_const_Polyhedron_t ph,
+ unsigned int complexity,
+ void (*set_empty)(void),
+ void (*raise_lower_bound)(ppl_dimension_type k, int closed,
+			   ppl_const_Coefficient_t n,
+			   ppl_const_Coefficient_t d),
+ void (*lower_upper_bound)(ppl_dimension_type k, int closed,
+			   ppl_const_Coefficient_t n,
+			   ppl_const_Coefficient_t d)) try {
+  if (complexity != POLYNOMIAL_COMPLEXITY
+      && complexity != SIMPLEX_COMPLEXITY
+      && complexity != ANY_COMPLEXITY)
+    return PPL_ERROR_INVALID_ARGUMENT;
+
+  const Polyhedron& pph = *to_const(ph);
+  C_Shrink_Box csbox(set_empty, raise_lower_bound, lower_upper_bound);
+  pph.shrink_bounding_box(csbox, Complexity_Class(complexity));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_relation_with_Constraint(ppl_const_Polyhedron_t ph,
+					ppl_const_Constraint_t c) try {
+  const Polyhedron& pph = *to_const(ph);
+  const Constraint& cc = *to_const(c);
+  return pph.relation_with(cc).get_flags();
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_relation_with_Generator(ppl_const_Polyhedron_t ph,
+				       ppl_const_Generator_t g) try {
+  const Polyhedron& pph = *to_const(ph);
+  const Generator& gg = *to_const(g);
+  return pph.relation_with(gg).get_flags();
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_is_empty(ppl_const_Polyhedron_t ph) try {
+  const Polyhedron& pph = *to_const(ph);
+  return pph.is_empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_is_universe(ppl_const_Polyhedron_t ph) try {
+  const Polyhedron& pph = *to_const(ph);
+  return pph.is_universe() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_is_bounded(ppl_const_Polyhedron_t ph) try {
+  const Polyhedron& pph = *to_const(ph);
+  return pph.is_bounded() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_bounds_from_above(ppl_const_Polyhedron_t ph,
+				 ppl_const_Linear_Expression_t le) try {
+  const Polyhedron& pph = *to_const(ph);
+  const Linear_Expression& lle = *to_const(le);
+  return pph.bounds_from_above(lle) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_bounds_from_below(ppl_const_Polyhedron_t ph,
+				 ppl_const_Linear_Expression_t le) try {
+  const Polyhedron& pph = *to_const(ph);
+  const Linear_Expression& lle = *to_const(le);
+  return pph.bounds_from_below(lle) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_maximize(ppl_const_Polyhedron_t ph,
+			ppl_const_Linear_Expression_t le,
+			ppl_Coefficient_t sup_n,
+			ppl_Coefficient_t sup_d,
+			int* pmaximum,
+			ppl_Generator_t point) try {
+  const Polyhedron& pph = *to_const(ph);
+  const Linear_Expression& lle = *to_const(le);
+  Coefficient& ssup_n = *to_nonconst(sup_n);
+  Coefficient& ssup_d = *to_nonconst(sup_d);
+  Generator& ppoint = *to_nonconst(point);
+  bool maximum;
+  bool ok = pph.maximize(lle, ssup_n, ssup_d, maximum, ppoint);
+  if (ok)
+    *pmaximum = maximum ? 1 : 0;
+  return ok ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_minimize(ppl_const_Polyhedron_t ph,
+			ppl_const_Linear_Expression_t le,
+			ppl_Coefficient_t inf_n,
+			ppl_Coefficient_t inf_d,
+			int* pminimum,
+			ppl_Generator_t point) try {
+  const Polyhedron& pph = *to_const(ph);
+  const Linear_Expression& lle = *to_const(le);
+  Coefficient& iinf_n = *to_nonconst(inf_n);
+  Coefficient& iinf_d = *to_nonconst(inf_d);
+  Generator& ppoint = *to_nonconst(point);
+  bool minimum;
+  bool ok = pph.minimize(lle, iinf_n, iinf_d, minimum, ppoint);
+  if (ok)
+    *pminimum = minimum ? 1 : 0;
+  return ok ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_is_topologically_closed(ppl_const_Polyhedron_t ph) try {
+  const Polyhedron& pph = *to_const(ph);
+  return pph.is_topologically_closed() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_topological_closure_assign(ppl_Polyhedron_t ph) try {
+  Polyhedron& pph = *to_nonconst(ph);
+  pph.topological_closure_assign();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_contains_Polyhedron(ppl_const_Polyhedron_t x,
+				   ppl_const_Polyhedron_t y) try {
+  const Polyhedron& xx = *to_const(x);
+  const Polyhedron& yy = *to_const(y);
+  return xx.contains(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_strictly_contains_Polyhedron(ppl_const_Polyhedron_t x,
+					    ppl_const_Polyhedron_t y) try {
+  const Polyhedron& xx = *to_const(x);
+  const Polyhedron& yy = *to_const(y);
+  return xx.strictly_contains(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_is_disjoint_from_Polyhedron(ppl_const_Polyhedron_t x,
+					   ppl_const_Polyhedron_t y) try {
+  const Polyhedron& xx = *to_const(x);
+  const Polyhedron& yy = *to_const(y);
+  return xx.is_disjoint_from(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_equals_Polyhedron(ppl_const_Polyhedron_t x,
+				 ppl_const_Polyhedron_t y) try {
+  const Polyhedron& xx = *to_const(x);
+  const Polyhedron& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_OK(ppl_const_Polyhedron_t ph) try {
+  return to_const(ph)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_LP_Problem_trivial(ppl_LP_Problem_t* plp) try {
+  *plp = to_nonconst(new LP_Problem());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_LP_Problem(ppl_LP_Problem_t* plp, ppl_const_Constraint_System_t cs,
+		   ppl_const_Linear_Expression_t le, int m) try {
+  const Constraint_System& ccs = *to_const(cs);
+  const Linear_Expression& lle = *to_const(le);
+  Optimization_Mode mm = (m == PPL_LP_PROBLEM_MINIMIZATION)
+    ? MINIMIZATION : MAXIMIZATION;
+  *plp = to_nonconst(new LP_Problem(ccs, lle, mm));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_LP_Problem_from_LP_Problem(ppl_LP_Problem_t* plp,
+				   ppl_const_LP_Problem_t lp) try {
+  const LP_Problem& llp = *to_const(lp);
+  *plp = to_nonconst(new LP_Problem(llp));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_LP_Problem(ppl_const_LP_Problem_t lp) try {
+  delete to_const(lp);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_LP_Problem_from_LP_Problem(ppl_LP_Problem_t dst,
+				      ppl_const_LP_Problem_t src) try {
+  const LP_Problem& ssrc = *to_const(src);
+  LP_Problem& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_space_dimension(ppl_const_LP_Problem_t lp,
+			       ppl_dimension_type* m) try {
+  *m = to_const(lp)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_constraints(ppl_const_LP_Problem_t lp,
+			   ppl_const_Constraint_System_t* pcs) try {
+  const Constraint_System& cs = to_const(lp)->constraints();
+  *pcs = to_const(&cs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_objective_function(ppl_const_LP_Problem_t lp,
+				  ppl_const_Linear_Expression_t* ple) try {
+  const Linear_Expression& le = to_const(lp)->objective_function();
+  *ple = to_const(&le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_optimization_mode(ppl_const_LP_Problem_t lp) try {
+  return to_const(lp)->optimization_mode();
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_clear(ppl_LP_Problem_t lp) try {
+  to_nonconst(lp)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_add_constraint(ppl_LP_Problem_t lp,
+			      ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  LP_Problem& llp = *to_nonconst(lp);
+  llp.add_constraint(cc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_add_constraints(ppl_LP_Problem_t lp,
+			       ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  LP_Problem& llp = *to_nonconst(lp);
+  llp.add_constraints(ccs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_set_objective_function(ppl_LP_Problem_t lp,
+				      ppl_const_Linear_Expression_t le) try {
+  const Linear_Expression& lle = *to_const(le);
+  LP_Problem& llp = *to_nonconst(lp);
+  llp.set_objective_function(lle);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_set_optimization_mode(ppl_LP_Problem_t lp, int mode) try {
+  LP_Problem& llp = *to_nonconst(lp);
+  Optimization_Mode m = (mode == PPL_LP_PROBLEM_MINIMIZATION)
+    ? MINIMIZATION : MAXIMIZATION;
+  llp.set_optimization_mode(m);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_is_satisfiable(ppl_const_LP_Problem_t lp) try {
+  return to_const(lp)->is_satisfiable() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_solve(ppl_const_LP_Problem_t lp) try {
+  return to_const(lp)->solve();
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_evaluate_objective_function(ppl_const_LP_Problem_t lp,
+					   ppl_const_Generator_t g,
+					   ppl_Coefficient_t num,
+					   ppl_Coefficient_t den) try {
+  const LP_Problem& llp = *to_const(lp);
+  const Generator& gg = *to_const(g);
+  Coefficient& nnum = *to_nonconst(num);
+  Coefficient& dden = *to_nonconst(den);
+  llp.evaluate_objective_function(gg, nnum, dden);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_feasible_point(ppl_const_LP_Problem_t lp,
+			      ppl_const_Generator_t* pg) try {
+  const Generator& g = to_const(lp)->feasible_point();
+  *pg = to_const(&g);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_optimizing_point(ppl_const_LP_Problem_t lp,
+				ppl_const_Generator_t* pg) try {
+  const Generator& g = to_const(lp)->optimizing_point();
+  *pg = to_const(&g);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_optimal_value(ppl_const_LP_Problem_t lp,
+			     ppl_Coefficient_t num,
+			     ppl_Coefficient_t den) try {
+  Coefficient& nnum = *to_nonconst(num);
+  Coefficient& dden = *to_nonconst(den);
+  to_const(lp)->optimal_value(nnum, dden);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_OK(ppl_const_LP_Problem_t lp) try {
+  return to_const(lp)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_io_print_variable(ppl_dimension_type var) try {
+  const char* b = c_variable_output_function(var);
+  if (b == 0 || puts(b) < 0)
+    return PPL_STDIO_ERROR;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_io_fprint_variable(FILE* stream, ppl_dimension_type var) try {
+  const char* b = c_variable_output_function(var);
+  if (b == 0 || fputs(b, stream) < 0)
+    return PPL_STDIO_ERROR;
+  return 0;
+}
+CATCH_ALL
+
+#define DEFINE_PRINT_FUNCTIONS(Type) \
+int \
+ppl_io_print_ ## Type(ppl_const_ ## Type ## _t x) try { \
+  using namespace IO_Operators; \
+  std::ostringstream s; \
+  s << *to_const(x); \
+  if (puts(s.str().c_str()) < 0) \
+    return PPL_STDIO_ERROR; \
+  return 0; \
+} \
+CATCH_ALL \
+ \
+int \
+ppl_io_fprint_ ## Type(FILE* stream, ppl_const_ ## Type ## _t x) try { \
+  using namespace IO_Operators; \
+  std::ostringstream s; \
+  s << *to_const(x); \
+  if (fputs(s.str().c_str(), stream) < 0) \
+    return PPL_STDIO_ERROR; \
+  return 0; \
+} \
+CATCH_ALL
+
+DEFINE_PRINT_FUNCTIONS(Coefficient)
+
+DEFINE_PRINT_FUNCTIONS(Linear_Expression)
+
+DEFINE_PRINT_FUNCTIONS(Constraint)
+
+DEFINE_PRINT_FUNCTIONS(Constraint_System)
+
+DEFINE_PRINT_FUNCTIONS(Generator)
+
+DEFINE_PRINT_FUNCTIONS(Generator_System)
+
+DEFINE_PRINT_FUNCTIONS(Polyhedron)
+
+int
+ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p)
+try {
+  c_variable_output_function = p;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp)
+try {
+  *pp = c_variable_output_function;
+  return 0;
+}
+CATCH_ALL
diff --git a/interfaces/C/ppl_c.h b/interfaces/C/ppl_c.h
new file mode 100644
index 0000000..0a7f51e
--- /dev/null
+++ b/interfaces/C/ppl_c.h
@@ -0,0 +1,2695 @@
+/* Header file for the C interface.  -*- C -*-
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_c_h
+#define PPL_ppl_c_h 1
+
+/*! \defgroup PPL_C_interface C Language Interface
+
+\brief
+\ref CInterfaceDetails "Some details about the C Interface".
+
+\anchor CInterfaceDetails
+All the declarations needed for using the PPL's C interface
+(preprocessor symbols, data types, variables and
+functions) are collected in the header file <CODE>ppl_c.h</CODE>.
+This file, which is designed to work with pre-ANSI and ANSI C compilers
+as well as C99 and C++ compilers, should be included, either directly
+or via some other header file, with the directive
+\code
+#include <ppl_c.h>
+\endcode
+If this directive does not work, then your compiler is unable to find
+the file <CODE>ppl_c.h</CODE>. So check that the library is installed
+(if it is not installed, you may want to <CODE>make install</CODE>,
+perhaps with root privileges) in the right place
+(if not you may want to reconfigure the library using the appropriate
+pathname for the <CODE>--prefix</CODE> option); and that your compiler
+knows where it is installed (if not you should add the path to the
+directory where <CODE>ppl_c.h</CODE> is located to the compiler's
+include file search path; this is usually done with the
+<CODE>-I</CODE> option).
+
+The name space of the PPL's C interface is <CODE>PPL_*</CODE> for
+preprocessor symbols, enumeration values and variables; and
+<CODE>ppl_*</CODE> for data types and function names. The interface
+systematically uses <EM>opaque data types</EM> (generic pointers that
+completely hide the internal representations from the client code) and
+provides all required access functions. By using just the interface,
+the client code can exploit all the functionalities of the library yet
+avoid directly manipulating the library's data structures.  The advantages
+are that (1) applications do not depend on the internals of the library
+(these may change from release to release), and (2) the interface
+invariants can be thoroughly checked (by the access functions).
+
+The PPL's C interface is initialized by means of the
+<CODE>ppl_initialize</CODE> function.  This function must
+be called <EM>before using any other interface of the library</EM>.
+The application can release the resources allocated by the library by
+calling the <CODE>ppl_finalize</CODE> function. After this function
+is called <EM>no other interface of the library may be used</EM>
+until the interface is re-initialized using <CODE>ppl_initialize</CODE>.
+
+Any application using the PPL should make sure that only the
+intended version(s) of the library are ever used.  The version used can be
+checked at compile-time thanks to the macros PPL_VERSION_MAJOR,
+PPL_VERSION_MINOR, PPL_VERSION_REVISION and PPL_VERSION_BETA, which
+give, respectively major, minor, revision and beta numbers of the PPL
+version.  This is an example of their use:
+\code
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6
+# error "PPL version 0.6 or following is required"
+#endif
+\endcode
+Compile-time checking, however, is not normally enough, particularly in
+an environment where there is dynamic linking.  Run-time checking can
+be performed by means of the functions <CODE>ppl_version_major</CODE>,
+<CODE>ppl_version_minor</CODE>, <CODE>ppl_version_revision</CODE>, and
+<CODE>ppl_version_beta</CODE>. The PPL's C interface also provides
+functions <CODE>ppl_version</CODE>, returning character string
+containing the full version number, and <CODE>ppl_banner</CODE>,
+returning a string that, in addition, provides (pointers to) other
+useful information for the library user.
+
+All programs using the PPL's C interface must link with the
+following libraries: <CODE>libppl_c</CODE> (PPL's C interface),
+<CODE>libppl</CODE> (PPL's core), <CODE>libgmpxx</CODE> (GMP's C++
+interface), and <CODE>libgmp</CODE> (GMP's library core).  On most
+Unix-like systems, this is done by adding <CODE>-lppl_c</CODE>,
+<CODE>-lppl</CODE>, <CODE>-lgmpxx</CODE>, and <CODE>-lgmp</CODE> to
+the compiler's or linker's command line.  For example:
+\verbatim
+gcc myprogram.o -lppl_c -lppl -lgmpxx -lgmp
+\endverbatim
+If this does not work, it means that your compiler/linker is not
+finding the libraries where it expects.  Again, this could be because you
+forgot to install the library or you installed it in a non-standard
+location.  In the latter case you will need to use the appropriate
+options (usually <CODE>-L</CODE>) and, if you use shared libraries,
+some sort of run-time path selection mechanisms.  Consult your
+compiler's documentation for details.  Notice that the PPL is built
+using <A HREF="http://www.gnu.org/software/libtool/">Libtool</A> and
+an application can exploit this fact to significantly simplify the
+linking phase.  See Libtool's documentation for details.  Those
+working under Linux can find a lot of useful information on how to use
+program libraries (including static, shared, and dynamically loaded
+libraries) in the
+<A HREF="http://www.dwheeler.com/program-library/">Program Library
+HOWTO</A>.
+
+For examples on how to use the functions provided by the C interface,
+you are referred to the directory <CODE>demos/ppl_lpsol/</CODE> in
+the source distribution.  It contains a <EM>Linear Programming</EM>
+solver written in C.  In order to use this solver you will need to install
+<A HREF="http://www.gnu.org/software/glpk/">GLPK</A> (the GNU Linear
+Programming Kit): this is used to read linear programs in MPS format.
+*/
+
+/*
+  For some reason, GMP up to and including version 4.1.3 requires
+  <stdio.h> to be included before <gmp.h>.
+*/
+/*@{*/ /* \defgroup PPL_C_interface */
+
+#include <stdio.h>
+#include <gmp.h>
+#include <stddef.h>
+
+/*
+  PPL_PROTO is a macro used to wrap function prototypes, so that
+  compilers that don't understand ANSI C prototypes still work, and
+  ANSI C compilers can issue warnings about type mismatches.
+*/
+#if defined(__STDC__)                              \
+  || defined(__cplusplus)                          \
+  || defined (_AIX)                                \
+  || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
+  || defined(_WIN32)
+# define PPL_PROTO(protos) protos
+#else
+# define PPL_PROTO(protos) ()
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*! \brief
+  Defines the error codes that any function may return.
+*/
+enum ppl_enum_error_code {
+  /*! \hideinitializer
+    The virtual memory available to the process has been exhausted. */
+  PPL_ERROR_OUT_OF_MEMORY = -2,
+  /*! \hideinitializer
+    A function has been invoked with an invalid argument. */
+  PPL_ERROR_INVALID_ARGUMENT = -3,
+  /*! \hideinitializer
+    A function has been invoked outside its domain of definition. */
+  PPL_ERROR_DOMAIN_ERROR = -4,
+  /*! \hideinitializer
+    The construction of an object that would exceed its maximum
+    permitted size was attempted. */
+  PPL_ERROR_LENGTH_ERROR = -5,
+  /*! \hideinitializer
+    An arithmetic overflow occurred and the computation was consequently
+    interrupted.  This can <EM>only</EM> happen in library's incarnations
+    using bounded integers as coefficients. */
+  PPL_ARITHMETIC_OVERFLOW = -6,
+  /*! \hideinitializer
+    An error occurred during a C input/output operation.  A more
+    precise indication of what went wrong is available via
+    <CODE>errno</CODE>. */
+  PPL_STDIO_ERROR = -7,
+  /*! \hideinitializer
+    An internal error that was diagnosed by the PPL itself.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_INTERNAL_ERROR = -8,
+  /*! \hideinitializer
+    A standard exception has been raised by the C++ run-time environment.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION = -9,
+  /*! \hideinitializer
+    A totally unknown, totally unexpected error happened.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_UNEXPECTED_ERROR = -10
+};
+
+/*! \name Version Checking */
+/*@{*/
+
+/*! \brief
+  The major number of the PPL version.
+*/
+#define PPL_VERSION_MAJOR 0
+
+/*! \brief
+  The minor number of the PPL version.
+*/
+#define PPL_VERSION_MINOR 9
+
+/*! \brief
+  The revision number of the PPL version.
+*/
+#define PPL_VERSION_REVISION 0
+
+/*! \brief
+  The beta number of the PPL version.  This is zero for official
+  releases and nonzero for development snapshots.
+*/
+#define PPL_VERSION_BETA 0
+
+/*! \brief
+  A string containing the PPL version.
+
+  Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+  to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively.  The
+  format of PPL_VERSION is <CODE>M "." m</CODE> if both
+  PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+  (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+  PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+  <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+  PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+  neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "0.9"
+
+/*! \brief
+  Returns the major number of the PPL version.
+*/
+int
+ppl_version_major PPL_PROTO((void));
+
+/*! \brief
+  Returns the minor number of the PPL version.
+*/
+int
+ppl_version_minor PPL_PROTO((void));
+
+/*! \brief
+  Returns the revision number of the PPL version.
+*/
+int
+ppl_version_revision PPL_PROTO((void));
+
+/*! \brief
+  Returns the beta number of the PPL version.
+*/
+int
+ppl_version_beta PPL_PROTO((void));
+
+/*! \brief
+  Writes to \c *p a pointer to a character string containing the
+  PPL version.
+*/
+int
+ppl_version PPL_PROTO((const char** p));
+
+/*! \brief
+  Writes to \c *p a pointer to a character string containing the PPL banner.
+
+  The banner provides information about the PPL version, the licensing,
+  the lack of any warranty whatsoever, the C++ compiler used to build
+  the library, where to report bugs and where to look for further
+  information.
+*/
+int
+ppl_banner PPL_PROTO((const char** p));
+
+/*@}*/ /* Version Checking */
+
+/*! \brief
+  An unsigned integral type for representing space dimensions.
+*/
+typedef size_t ppl_dimension_type;
+
+/*! \name Initialization, Error Handling and Auxiliary Functions */
+/*@{*/
+
+/*! \brief
+  Writes to \p m the maximum space dimension this library can handle.
+*/
+int
+ppl_max_space_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+  Writes to \p m a value that does not designate a valid dimension.
+*/
+int
+ppl_not_a_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+  Initializes the Parma Polyhedra Library.
+  This function must be called before any other function.
+
+  \return
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+  was already initialized.
+*/
+int
+ppl_initialize PPL_PROTO((void));
+
+/*! \brief
+  Finalizes the Parma Polyhedra Library.
+  This function must be called after any other function.
+
+  \return
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+  was already finalized.
+*/
+int
+ppl_finalize PPL_PROTO((void));
+
+/*! \brief
+  Installs the user-defined error handler pointed at by \p h.
+
+  The error handler takes an error code and a textual description that
+  gives further information about the actual error.  The C string
+  containing the textual description is read-only and its existence is
+  not guaranteed after the handler has returned.
+*/
+int
+ppl_set_error_handler PPL_PROTO((void (*h)(enum ppl_enum_error_code code,
+					   const char* description)));
+
+/*@}*/ /* Initialization, Error Handling and Auxiliary Functions */
+
+#undef PPL_TYPE_DECLARATION
+
+#define PPL_TYPE_DECLARATION(Type) /*! \brief Opaque pointer. */ typedef struct ppl_ ## Type ## _tag* ppl_ ## Type ## _t; /*! \brief Opaque pointer to const object. */ typedef struct ppl_ ## Type ## _tag const* ppl_const_ ## Type ## _t
+
+PPL_TYPE_DECLARATION(Coefficient);
+
+PPL_TYPE_DECLARATION(Linear_Expression);
+
+PPL_TYPE_DECLARATION(Constraint);
+
+PPL_TYPE_DECLARATION(Constraint_System);
+
+PPL_TYPE_DECLARATION(Constraint_System_const_iterator);
+
+PPL_TYPE_DECLARATION(Generator);
+
+PPL_TYPE_DECLARATION(Generator_System);
+
+PPL_TYPE_DECLARATION(Generator_System_const_iterator);
+
+PPL_TYPE_DECLARATION(Polyhedron);
+
+PPL_TYPE_DECLARATION(LP_Problem);
+
+#undef PPL_TYPE_DECLARATION
+
+/*! \name Functions Related to Coefficients */
+/*@{*/
+
+/*! \brief
+  Creates a new coefficient with value 0 and writes a handle for the
+  newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient PPL_PROTO((ppl_Coefficient_t* pc));
+
+/*! \brief
+  Creates a new coefficient with the value given by the GMP integer
+  \p z and writes a handle for the newly created coefficient
+  at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t* pc, mpz_t z));
+
+/*! \brief
+  Builds a coefficient that is a copy of \p c; writes a handle
+  for the newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_Coefficient PPL_PROTO((ppl_Coefficient_t* pc,
+						ppl_const_Coefficient_t c));
+
+/*! \brief
+  Assign to \p dst the value given by the GMP integer \p z.
+*/
+int
+ppl_assign_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t dst, mpz_t z));
+
+/*! \brief
+  Assigns a copy of the coefficient \p src to \p dst.
+*/
+int
+ppl_assign_Coefficient_from_Coefficient
+PPL_PROTO((ppl_Coefficient_t dst, ppl_const_Coefficient_t src));
+
+/*! \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Coefficient PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*! \brief
+  Sets the value of the GMP integer \p z to the value of \p c.
+*/
+int
+ppl_Coefficient_to_mpz_t PPL_PROTO((ppl_const_Coefficient_t c, mpz_t z));
+
+/*! \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Coefficient_OK PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*! \brief
+  Returns a positive integer if coefficients are bounded; returns 0
+  otherwise.
+*/
+int
+ppl_Coefficient_is_bounded PPL_PROTO((void));
+
+/*! \brief
+  Returns a positive integer if coefficients are bounded, in which case
+  \p min is set to their minimum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_min PPL_PROTO((mpz_t min));
+
+/*! \brief
+  Returns a positive integer if coefficients are bounded, in which case
+  \p max is set to their maximum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_max PPL_PROTO((mpz_t max));
+
+/*@}*/ /* Functions Related to Coefficients */
+
+/*! \name Functions Related to Linear Expressions */
+/*@{*/
+
+/*! \brief
+  Creates a new linear expression corresponding to the constant 0 in a
+  zero-dimensional space; writes a handle for the new linear
+  expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression PPL_PROTO((ppl_Linear_Expression_t* ple));
+
+/*! \brief
+  Creates a new linear expression corresponding to the constant 0 in a
+  <TT>d</TT>-dimensional space; writes a handle for the new linear
+  expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_with_dimension
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_dimension_type d));
+
+/*! \brief
+  Builds a linear expression that is a copy of \p le; writes a handle
+  for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Builds a linear expression corresponding to constraint \p c;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Constraint
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Constraint_t c));
+
+/*! \brief
+  Builds a linear expression corresponding to generator \p g;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Generator
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Generator_t g));
+
+/*! \brief
+  Invalidates the handle \p le: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Linear_Expression PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Assigns a copy of the linear expression \p src to \p dst.
+*/
+int
+ppl_assign_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \brief
+  Adds \p n to the coefficient of variable \p var in the linear
+  expression \p le.  The space dimension is set to be the maximum
+  between \p var + 1 and the old space dimension.
+*/
+int
+ppl_Linear_Expression_add_to_coefficient
+PPL_PROTO((ppl_Linear_Expression_t le,
+	   ppl_dimension_type var,
+	   ppl_const_Coefficient_t n));
+
+/*! \brief
+  Adds \p n to the inhomogeneous term of the linear expression
+  \p le.
+*/
+int
+ppl_Linear_Expression_add_to_inhomogeneous
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*! \brief
+  Adds the linear expression \p src to \p dst.
+*/
+int
+ppl_add_Linear_Expression_to_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \brief
+  Subtracts the linear expression \p src from \p dst.
+*/
+int
+ppl_subtract_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \brief
+  Multiply the linear expression \p dst by \p n.
+*/
+int
+ppl_multiply_Linear_Expression_by_Coefficient
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*! \brief
+  Writes to \p m the space dimension of \p le.
+*/
+int
+ppl_Linear_Expression_space_dimension
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_dimension_type* m));
+
+/*! \brief
+  Copies into \p n the coefficient of variable \p var in
+  the linear expression \p le.
+*/
+int
+ppl_Linear_Expression_coefficient PPL_PROTO((ppl_const_Linear_Expression_t le,
+					     ppl_dimension_type var,
+					     ppl_Coefficient_t n));
+
+/*! \brief
+  Copies into \p n the inhomogeneous term of linear expression \p le.
+*/
+int
+ppl_Linear_Expression_inhomogeneous_term
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_Coefficient_t n));
+
+/*! \brief
+  Returns a positive integer if \p le is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p le is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Linear_Expression_OK PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*@}*/ /* Functions Related to Linear Expressions */
+
+/*! \brief
+  Describes the relations represented by a constraint.
+*/
+enum ppl_enum_Constraint_Type {
+  /*! The constraint is of the form \f$e < 0\f$. */
+  PPL_CONSTRAINT_TYPE_LESS_THAN,
+  /*! The constraint is of the form \f$e \leq 0\f$. */
+  PPL_CONSTRAINT_TYPE_LESS_THAN_OR_EQUAL,
+  /*! The constraint is of the form \f$e = 0\f$. */
+  PPL_CONSTRAINT_TYPE_EQUAL,
+  /*! The constraint is of the form \f$e \geq 0\f$. */
+  PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL,
+  /*! The constraint is of the form \f$e > 0\f$. */
+  PPL_CONSTRAINT_TYPE_GREATER_THAN
+};
+
+
+/*! \name Functions Related to Constraints */
+/*@{*/
+
+/*! \brief
+  Creates the new constraint `\p le \p rel 0' and writes a handle for
+  it at address \p pc.  The space dimension of the new constraint is
+  equal to the space dimension of \p le.
+*/
+int
+ppl_new_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+			      ppl_const_Linear_Expression_t le,
+			      enum ppl_enum_Constraint_Type rel));
+
+/*! \brief
+  Creates the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$
+  and writes a handle for it at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_false PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \brief
+  Creates the true (zero-dimension space) constraint \f$0 \leq 1\f$,
+  also known as <EM>positivity constraint</EM>.
+  A handle for the newly created constraint is written at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_positivity PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \brief
+  Builds a constraint that is a copy of \p c; writes a handle
+  for the newly created constraint at address \p pc.
+*/
+int
+ppl_new_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+					      ppl_const_Constraint_t c));
+
+/*! \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint PPL_PROTO((ppl_const_Constraint_t c));
+
+/*! \brief
+  Assigns a copy of the constraint \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t dst,
+						 ppl_const_Constraint_t src));
+
+/*! \brief
+  Writes to \p m the space dimension of \p c.
+*/
+int
+ppl_Constraint_space_dimension PPL_PROTO((ppl_const_Constraint_t c,
+					  ppl_dimension_type* m));
+
+/*! \brief
+  Returns the type of constraint \p c.
+*/
+int
+ppl_Constraint_type PPL_PROTO((ppl_const_Constraint_t c));
+
+/*! \brief
+  Copies into \p n the coefficient of variable \p var in
+  constraint \p c.
+*/
+int
+ppl_Constraint_coefficient PPL_PROTO((ppl_const_Constraint_t c,
+				      ppl_dimension_type var,
+				      ppl_Coefficient_t n));
+
+/*! \brief
+  Copies into \p n the inhomogeneous term of constraint \p c.
+*/
+int
+ppl_Constraint_inhomogeneous_term PPL_PROTO((ppl_const_Constraint_t c,
+					     ppl_Coefficient_t n));
+
+/*! \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Constraint_OK PPL_PROTO((ppl_const_Constraint_t c));
+
+/*@}*/ /* Functions Related to Constraints */
+
+/*! \name Functions Related to Constraint Systems */
+/*@{*/
+
+/*! \brief
+  Builds an empty system of constraints and writes a handle to it at
+  address \p pcs.
+*/
+int
+ppl_new_Constraint_System PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \brief
+  Builds a zero-dimensional, unsatisfiable constraint system and
+  writes a handle to it at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_zero_dim_empty
+PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \brief
+  Builds the singleton constraint system containing only a copy of
+  constraint \p c; writes a handle for the newly created system at
+  address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_t c));
+
+/*! \brief
+  Builds a constraint system that is a copy of \p cs; writes a handle
+  for the newly created system at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Invalidates the handle \p cs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Assigns a copy of the constraint system \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p cs.
+*/
+int
+ppl_Constraint_System_space_dimension
+PPL_PROTO((ppl_const_Constraint_System_t cs, ppl_dimension_type* m));
+
+/*! \brief
+  Returns a positive integer if \p cs contains any (non-trivial) strict
+  inequality; returns 0 otherwise.
+*/
+int
+ppl_Constraint_System_has_strict_inequalities
+PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Removes all the constraints from the constraint system \p cs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Constraint_System_clear PPL_PROTO((ppl_Constraint_System_t cs));
+
+/*! \brief
+  Inserts a copy of the constraint \p c into \p cs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Constraint_System_insert_Constraint PPL_PROTO((ppl_Constraint_System_t cs,
+						   ppl_const_Constraint_t c));
+
+/*! \brief
+  Returns a positive integer if \p cs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p cs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Constraint_System_OK PPL_PROTO((ppl_const_Constraint_System_t c));
+
+
+/*! \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit));
+
+/*! \brief
+  Builds a const iterator that is a copy of \p cit; writes an
+  handle for the newly created const iterator at address \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit,
+	   ppl_const_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Invalidates the handle \p cit: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System_const_iterator
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t dst,
+	   ppl_const_Constraint_System_const_iterator_t src));
+
+/*! \brief
+  Assigns to \p cit a const iterator "pointing" to the beginning of
+  the constraint system \p cs.
+*/
+int
+ppl_Constraint_System_begin
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+	   ppl_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Assigns to \p cit a const iterator "pointing" past the end of the
+  constraint system \p cs.
+*/
+int
+ppl_Constraint_System_end
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+	   ppl_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Dereference \p cit writing a const handle to the resulting
+  constraint at address \p pc.
+*/
+int
+ppl_Constraint_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit,
+	   ppl_const_Constraint_t* pc));
+
+/*! \brief
+  Increment \p cit so that it "points" to the next constraint.
+*/
+int
+ppl_Constraint_System_const_iterator_increment
+PPL_PROTO((ppl_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Constraint_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t x,
+	   ppl_const_Constraint_System_const_iterator_t y));
+
+/*@}*/ /* Functions Related to Constraint Systems */
+
+/*! \brief
+  Describes the different kinds of generators.
+*/
+enum ppl_enum_Generator_Type {
+  /*! The generator is a line. */
+  PPL_GENERATOR_TYPE_LINE,
+  /*! The generator is a ray. */
+  PPL_GENERATOR_TYPE_RAY,
+  /*! The generator is a point. */
+  PPL_GENERATOR_TYPE_POINT,
+  /*! The generator is a closure point. */
+  PPL_GENERATOR_TYPE_CLOSURE_POINT
+};
+
+
+/*! \name Functions Related to Generators */
+/*@{*/
+
+/*! \brief
+  Creates a new generator of direction \p le and type \p t.  If the
+  generator to be created is a point or a closure point, the divisor
+  \p d is applied to \p le.  For other types of generators \p d is
+  simply disregarded.  A handle for the new generator is written at
+  address \p pg.  The space dimension of the new generator is equal to
+  the space dimension of \p le.
+*/
+int
+ppl_new_Generator PPL_PROTO((ppl_Generator_t* pg,
+			     ppl_const_Linear_Expression_t le,
+			     enum ppl_enum_Generator_Type t,
+			     ppl_const_Coefficient_t d));
+
+/*! \brief
+  Creates the point that is the origin of the zero-dimensional space
+  \f$\Rset^0\f$.  Writes a handle for the new generator at address
+  \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \brief
+  Creates, as a closure point, the point that is the origin of the
+  zero-dimensional space \f$\Rset^0\f$.  Writes a handle for the new
+  generator at address \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_closure_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \brief
+  Builds a generator that is a copy of \p g; writes a handle
+  for the newly created generator at address \p pg.
+*/
+int
+ppl_new_Generator_from_Generator PPL_PROTO((ppl_Generator_t* pg,
+					    ppl_const_Generator_t g));
+
+/*! \brief
+  Invalidates the handle \p g: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator PPL_PROTO((ppl_const_Generator_t g));
+
+/*! \brief
+  Assigns a copy of the generator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_from_Generator PPL_PROTO((ppl_Generator_t dst,
+					       ppl_const_Generator_t src));
+
+/*! \brief
+  Writes to \p m the space dimension of \p g.
+*/
+int
+ppl_Generator_space_dimension PPL_PROTO((ppl_const_Generator_t g,
+					 ppl_dimension_type* m));
+
+/*! \brief
+  Returns the type of generator \p g.
+*/
+int
+ppl_Generator_type PPL_PROTO((ppl_const_Generator_t g));
+
+/*! \brief
+  Copies into \p n the coefficient of variable \p var in
+  generator \p g.
+*/
+int
+ppl_Generator_coefficient PPL_PROTO((ppl_const_Generator_t g,
+				     ppl_dimension_type var,
+				     ppl_Coefficient_t n));
+
+/*! \brief
+  If \p g is a point or a closure point assigns its divisor to \p n.
+*/
+int
+ppl_Generator_divisor PPL_PROTO((ppl_const_Generator_t g,
+				 ppl_Coefficient_t n));
+
+/*! \brief
+  Returns a positive integer if \p g is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p g is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Generator_OK PPL_PROTO((ppl_const_Generator_t g));
+
+/*@}*/ /* Functions Related to Generators */
+
+/*! \name Functions Related to Generator Systems */
+/*@{*/
+
+/*! \brief
+  Builds an empty system of generators and writes a handle to it at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*
+  Creates the universe zero-dimensional system of generators (i.e.,
+  containing the origin only).  Writes a handle to the new system at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System_zero_dim_univ
+PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*! \brief
+  Builds the singleton generator system containing only a copy of
+  generator \p g; writes a handle for the newly created system at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator PPL_PROTO((ppl_Generator_System_t* pgs,
+						   ppl_const_Generator_t g));
+
+/*! \brief
+  Builds a generator system that is a copy of \p gs; writes a handle
+  for the newly created system at address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Invalidates the handle \p gs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Assigns a copy of the generator system \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t dst, ppl_const_Generator_System_t src));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p gs.
+*/
+int
+ppl_Generator_System_space_dimension
+PPL_PROTO((ppl_const_Generator_System_t gs, ppl_dimension_type* m));
+
+/*! \brief
+  Removes all the generators from the generator system \p gs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Generator_System_clear PPL_PROTO((ppl_Generator_System_t gs));
+
+/*! \brief
+  Inserts a copy of the generator \p g into \p gs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Generator_System_insert_Generator PPL_PROTO((ppl_Generator_System_t gs,
+						 ppl_const_Generator_t g));
+
+/*! \brief
+  Returns a positive integer if \p gs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p gs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Generator_System_OK PPL_PROTO((ppl_const_Generator_System_t c));
+
+
+/*! \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit));
+
+/*! \brief
+  Builds a const iterator that is a copy of \p git; writes an
+  handle for the newly created const iterator at address \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit,
+	   ppl_const_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Invalidates the handle \p git: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System_const_iterator
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t dst,
+	   ppl_const_Generator_System_const_iterator_t src));
+
+/*! \brief
+  Assigns to \p git a const iterator "pointing" to the beginning of
+  the generator system \p gs.
+*/
+int
+ppl_Generator_System_begin
+PPL_PROTO((ppl_const_Generator_System_t gs,
+	   ppl_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Assigns to \p git a const iterator "pointing" past the end of the
+  generator system \p gs.
+*/
+int
+ppl_Generator_System_end
+PPL_PROTO((ppl_const_Generator_System_t gs,
+	   ppl_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Dereference \p git writing a const handle to the resulting
+  generator at address \p pg.
+*/
+int
+ppl_Generator_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git,
+	   ppl_const_Generator_t* pg));
+
+/*! \brief
+  Increment \p git so that it "points" to the next generator.
+*/
+int
+ppl_Generator_System_const_iterator_increment
+PPL_PROTO((ppl_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Generator_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t x,
+	   ppl_const_Generator_System_const_iterator_t y));
+
+/*@}*/ /* Functions Related to Generator Systems */
+
+/*! \brief
+  Code of the worst-case polynomial complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+
+/*! \brief
+  Code of the worst-case exponential but typically polynomial
+  complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+
+/*! \brief
+  Code of the universal complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+/*! \brief
+  Code of the "unfeasible LP problem" status.
+*/
+extern int PPL_LP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \brief
+  Code of the "unbounded LP problem" status.
+*/
+extern int PPL_LP_PROBLEM_STATUS_UNBOUNDED;
+
+/*! \brief
+  Code of the "optimized LP problem" status.
+*/
+extern int PPL_LP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \brief
+  Code of the "maximization" optimization mode.
+*/
+extern int PPL_LP_PROBLEM_MAXIMIZATION;
+
+/*! \brief
+  Code of the "minimization" optimization mode.
+*/
+extern int PPL_LP_PROBLEM_MINIMIZATION;
+
+/*! \brief
+  Individual bit saying that the polyhedron and the set of points
+  satisfying the constraint are disjoint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
+
+/*! \brief
+  Individual bit saying that the polyhedron intersects the set of
+  points satisfying the constraint, but it is not included in it.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
+
+/*! \brief
+  Individual bit saying that the polyhedron is included in the set of
+  points satisfying the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
+
+/*! \brief
+  Individual bit saying that the polyhedron is included in the set of
+  points saturating the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_SATURATES;
+
+/*! \brief
+  Individual bit saying that adding the generator would not change the
+  polyhedron.
+*/
+extern unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+/*! \name Functions Related to Polyhedra */
+/*@{*/
+
+/*! \brief
+  Builds a universe C polyhedron of dimension \p d and writes an
+  handle to it at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+					       ppl_dimension_type d));
+
+/*! \brief
+  Builds a universe NNC polyhedron of dimension \p d and writes an
+  handle to it at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+						 ppl_dimension_type d));
+
+/*! \brief
+  Builds an empty C polyhedron of space dimension \p d and writes an
+  handle to it at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_empty_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+						     ppl_dimension_type d));
+
+/*! \brief
+  Builds an empty NNC polyhedron of space dimension \p d and writes an
+  handle to it at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_empty_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+						       ppl_dimension_type d));
+
+/*! \brief
+  Builds a C polyhedron that is a copy of \p ph; writes a handle
+  for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron PPL_PROTO((ppl_Polyhedron_t* pph,
+						  ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Builds a C polyhedron that is a copy of of the NNC polyhedron \p ph;
+  writes a handle for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Builds an NNC polyhedron that is a copy of the C polyhedron \p ph;
+  writes a handle for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Builds an NNC polyhedron that is a copy of \p ph; writes a handle
+  for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Builds a new C polyhedron from the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_C_Polyhedron_from_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Builds a new C polyhedron recycling the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  Since \p cs will be <EM>the</EM> system of constraints of the new
+  polyhedron, the space dimension is also inherited.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
+
+/*! \brief
+  Builds a new NNC polyhedron from the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Builds a new NNC polyhedron recycling the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  Since \p cs will be <EM>the</EM> system of constraints of the new
+  polyhedron, the space dimension is also inherited.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
+
+/*! \brief
+  Builds a new C polyhedron from the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p gs.
+*/
+int
+ppl_new_C_Polyhedron_from_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Builds a new C polyhedron recycling the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  Since \p gs will be <EM>the</EM> system of generators of the new
+  polyhedron, the space dimension is also inherited.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t gs));
+
+/*! \brief
+  Builds a new NNC polyhedron from the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p gs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Builds a new NNC polyhedron recycling the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  Since \p gs will be <EM>the</EM> system of generators of the new
+  polyhedron, the space dimension is also inherited.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t gs));
+
+/*! \brief
+  Builds a new C polyhedron corresponding to an interval-based
+  bounding box, writing a handle for the newly created polyhedron at
+  address \p pph.
+
+  If an interval of the bounding box is provided with any finite
+  but open bound, then the polyhedron is not built and the value
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> is returned.
+  The bounding box is accessed by using the following functions,
+  passed as arguments:
+    \code
+      ppl_dimension_type space_dimension()
+    \endcode
+    returns the dimension of the vector space enclosing the polyhedron
+    represented by the bounding box.
+    \code
+      int is_empty()
+    \endcode
+    returns 0 if and only if the bounding box describes a non-empty set.
+    The function <CODE>is_empty()</CODE> will always be called before the
+    other functions. However, if <CODE>is_empty()</CODE> does not
+    return 0, none of the functions below will be called.
+    \code
+      int get_lower_bound(ppl_dimension_type k, int closed,
+                          ppl_Coefficient_t n, ppl_Coefficient_t d)
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return 0.
+    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+    lower boundary of \f$I\f$ is open and is set to a value different
+    from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
+    assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
+    fraction \f$n/d\f$ corresponds to the greatest lower bound of
+    \f$I\f$.  The fraction \f$n/d\f$ is in canonical form if and only
+    if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
+    positive, \f$0/1\f$ being the unique representation for zero.
+    \code
+      int get_upper_bound(ppl_dimension_type k, int closed,
+                          ppl_Coefficient_t n, ppl_Coefficient_t d)
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return 0.
+    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+    upper boundary of \f$I\f$ is open and is set to a value different
+    from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
+    the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
+    \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
+*/
+int
+ppl_new_C_Polyhedron_from_bounding_box
+PPL_PROTO((ppl_Polyhedron_t* pph,
+	   ppl_dimension_type (*space_dimension)(void),
+	   int (*is_empty)(void),
+	   int (*get_lower_bound)(ppl_dimension_type k, int closed,
+				  ppl_Coefficient_t n,
+				  ppl_Coefficient_t d),
+	   int (*get_upper_bound)(ppl_dimension_type k, int closed,
+				  ppl_Coefficient_t n,
+				  ppl_Coefficient_t d)));
+
+/*! \brief
+  Builds a new NNC polyhedron corresponding to an interval-based
+  bounding box, writing a handle for the newly created polyhedron at
+  address \p pph.
+
+  The bounding box is accessed by using the following functions,
+  passed as arguments:
+    \code
+      ppl_dimension_type space_dimension()
+    \endcode
+    returns the dimension of the vector space enclosing the polyhedron
+    represented by the bounding box.
+    \code
+      int is_empty()
+    \endcode
+    returns 0 if and only if the bounding box describes a non-empty set.
+    The function <CODE>is_empty()</CODE> will always be called before the
+    other functions. However, if <CODE>is_empty()</CODE> does not
+    return 0, none of the functions below will be called.
+    \code
+      int get_lower_bound(ppl_dimension_type k, int closed,
+                          ppl_Coefficient_t n, ppl_Coefficient_t d)
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return 0.
+    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+    lower boundary of \f$I\f$ is open and is set to a value different
+    from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
+    assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
+    fraction \f$n/d\f$ corresponds to the greatest lower bound of
+    \f$I\f$.  The fraction \f$n/d\f$ is in canonical form if and only
+    if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
+    positive, \f$0/1\f$ being the unique representation for zero.
+    \code
+      int get_upper_bound(ppl_dimension_type k, int closed,
+                          ppl_Coefficient_t n, ppl_Coefficient_t d)
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return 0.
+    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+    upper boundary of \f$I\f$ is open and is set to a value different
+    from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
+    the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
+    \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
+*/
+int
+ppl_new_NNC_Polyhedron_from_bounding_box
+PPL_PROTO((ppl_Polyhedron_t* pph,
+	   ppl_dimension_type (*space_dimension)(void),
+	   int (*is_empty)(void),
+	   int (*get_lower_bound)(ppl_dimension_type k, int closed,
+				  ppl_Coefficient_t n,
+				  ppl_Coefficient_t d),
+	   int (*get_upper_bound)(ppl_dimension_type k, int closed,
+				  ppl_Coefficient_t n,
+				  ppl_Coefficient_t d)));
+
+/*! \brief
+  Assigns a copy of the C polyhedron \p src to the C polyhedron \p dst.
+*/
+int
+ppl_assign_C_Polyhedron_from_C_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
+
+/*! \brief
+  Assigns a copy of the NNC polyhedron \p src to the NNC
+  polyhedron \p dst.
+*/
+int
+ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
+
+/*! \brief
+  Invalidates the handle \p ph: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p ph.
+*/
+int
+ppl_Polyhedron_space_dimension PPL_PROTO((ppl_const_Polyhedron_t ph,
+					  ppl_dimension_type* m));
+
+/*! \brief
+  Writes to \p m the affine dimension of \p ph (not to be confused with the
+  dimension of its enclosing vector space) or 0, if \p ph is empty.
+*/
+int
+ppl_Polyhedron_affine_dimension PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Writes a const handle to the constraint system defining the
+  polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_constraints PPL_PROTO((ppl_const_Polyhedron_t ph,
+				      ppl_const_Constraint_System_t* pcs));
+
+/*! \brief
+  Writes a const handle to the minimized constraint system defining the
+  polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_minimized_constraints
+PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs));
+
+/*! \brief
+  Writes a const handle to the generator system defining the
+  polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_generators PPL_PROTO((ppl_const_Polyhedron_t ph,
+				     ppl_const_Generator_System_t* pgs));
+
+/*! \brief
+  Writes a const handle to the minimized generator system defining the
+  polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_minimized_generators
+PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs));
+
+/*! \brief
+  Checks the relation between the polyhedron \p ph and the constraint \p c.
+
+  If successful, returns a non-negative integer that is
+  obtained as the bitwise or of the bits (chosen among
+  PPL_POLY_CON_RELATION_IS_DISJOINT
+  PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS,
+  PPL_POLY_CON_RELATION_IS_INCLUDED, and
+  PPL_POLY_CON_RELATION_SATURATES) that describe the relation between
+  \p ph and \p c.
+*/
+int
+ppl_Polyhedron_relation_with_Constraint PPL_PROTO((ppl_const_Polyhedron_t ph,
+						   ppl_const_Constraint_t c));
+
+/*! \brief
+  Checks the relation between the polyhedron \p ph and the generator \p g.
+
+  If successful, returns a non-negative integer that is
+  obtained as the bitwise or of the bits (only
+  PPL_POLY_GEN_RELATION_SUBSUMES, at present) that describe the
+  relation between \p ph and \p g.
+*/
+int
+ppl_Polyhedron_relation_with_Generator PPL_PROTO((ppl_const_Polyhedron_t ph,
+						  ppl_const_Generator_t g));
+
+/*! \brief
+  Use \p ph to shrink a generic, interval-based bounding box.
+  The bounding box is abstractly provided by means of the parameters.
+
+  \param ph
+  The polyhedron that is used to shrink the bounding box;
+
+  \param complexity
+  The code of the complexity class of the algorithm to be used.
+  Must be one of PPL_COMPLEXITY_CLASS_POLYNOMIAL,
+  PPL_COMPLEXITY_CLASS_SIMPLEX, or PPL_COMPLEXITY_CLASS_ANY;
+
+  \param set_empty
+  A pointer to a void function with no arguments that causes the bounding
+  box to become empty, i.e., to represent the empty set;
+
+  \param raise_lower_bound
+  A pointer to a void function with arguments
+  <CODE>(ppl_dimension_type k, int closed,
+         ppl_const_Coefficient_t n, ppl_const_Coefficient_t d)</CODE>
+  that intersects the interval corresponding to the <CODE>k</CODE>-th
+  space dimension with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is non-zero,
+  with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is zero.
+  The fraction \f$n/d\f$ is in canonical form, that is, \f$n\f$
+  and \f$d\f$ have no common factors and \f$d\f$ is positive, \f$0/1\f$
+  being the unique representation for zero;
+
+  \param lower_upper_bound
+  a pointer to a void function with argument
+  <CODE>(ppl_dimension_type k, int closed,
+         ppl_const_Coefficient_t n, ppl_const_Coefficient_t d)</CODE>
+  that intersects the interval corresponding to the <CODE>k</CODE>-th
+  space dimension with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is non-zero,
+  with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE> is zero.
+  The fraction \f$n/d\f$ is in canonical form.
+*/
+int
+ppl_Polyhedron_shrink_bounding_box
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+	   unsigned int complexity,
+	   void (*set_empty)(void),
+	   void (*raise_lower_bound)(ppl_dimension_type k, int closed,
+				     ppl_const_Coefficient_t n,
+				     ppl_const_Coefficient_t d),
+	   void (*lower_upper_bound)(ppl_dimension_type k, int closed,
+				     ppl_const_Coefficient_t n,
+				     ppl_const_Coefficient_t d)));
+
+/*! \brief
+  Returns a positive integer if \p ph is empty; returns 0 if \p ph is
+  not empty.
+*/
+int
+ppl_Polyhedron_is_empty PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Returns a positive integer if \p ph is a universe polyhedron;
+  returns 0 if it is not.
+*/
+int
+ppl_Polyhedron_is_universe PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Returns a positive integer if \p ph is bounded; returns 0 if \p ph is
+  unbounded.
+*/
+int
+ppl_Polyhedron_is_bounded PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Returns a positive integer if \p le is bounded from above in \p ph;
+  returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_bounds_from_above PPL_PROTO((ppl_const_Polyhedron_t ph,
+					    ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Returns a positive integer if \p le is bounded from below in \p ph;
+  returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_bounds_from_below PPL_PROTO((ppl_const_Polyhedron_t ph,
+					    ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Returns a positive integer if \p ph is not empty
+  and \p le is bounded from above in \p ph, in which case
+  the supremum value and a point where \p le reaches it are computed.
+
+  \param ph
+  The polyhedron constraining \p le;
+
+  \param le
+  The linear expression to be maximized subject to \p ph;
+
+  \param sup_n
+  Will be assigned the numerator of the supremum value;
+
+  \param sup_d
+  Will be assigned the denominator of the supremum value;
+
+  \param pmaximum
+  Will store 1 in this location if the supremum is also the maximum,
+  will store 0 otherwise;
+
+  \param point
+  Will be assigned the point or closure point where \p le reaches the
+  extremum value.
+
+  If \p ph is empty or \p le is not bounded from above,
+  0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
+  will be left untouched.
+*/
+int
+ppl_Polyhedron_maximize PPL_PROTO((ppl_const_Polyhedron_t ph,
+				   ppl_const_Linear_Expression_t le,
+				   ppl_Coefficient_t sup_n,
+				   ppl_Coefficient_t sup_d,
+				   int* pmaximum,
+				   ppl_Generator_t point));
+
+/*! \brief
+  Returns a positive integer if  \p ph is not empty
+  and \p le is bounded from below in \p ph, in which case
+  the infimum value and a point where \p le reaches it are computed.
+
+  \param ph
+  The polyhedron constraining \p le;
+
+  \param le
+  The linear expression to be minimized subject to \p ph;
+
+  \param inf_n
+  Will be assigned the numerator of the infimum value;
+
+  \param inf_d
+  Will be assigned the denominator of the infimum value;
+
+  \param pminimum
+  Will store 1 in this location if the infimum is also the minimum,
+  will store 0 otherwise;
+
+  \param point
+  Will be assigned the point or closure point where \p le reaches the
+  extremum value.
+
+  If \p ph is empty or \p le is not bounded from below,
+  0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
+  will be left untouched.
+*/
+int
+ppl_Polyhedron_minimize PPL_PROTO((ppl_const_Polyhedron_t ph,
+				   ppl_const_Linear_Expression_t le,
+				   ppl_Coefficient_t inf_n,
+				   ppl_Coefficient_t inf_d,
+				   int* pminimum,
+				   ppl_Generator_t point));
+
+/*! \brief
+  Returns a positive integer if \p ph is topologically closed;
+  returns 0 if \p ph is not topologically closed.
+*/
+int
+ppl_Polyhedron_is_topologically_closed PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Returns a positive integer if \p x contains or is equal to \p y;
+  returns 0 if it does not.
+*/
+int
+ppl_Polyhedron_contains_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t x,
+					      ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Returns a positive integer if \p x strictly contains \p y; returns 0
+  if it does not.
+*/
+int
+ppl_Polyhedron_strictly_contains_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Returns a positive integer if \p x and \p y are disjoint; returns 0
+  if they are not.
+*/
+int
+ppl_Polyhedron_is_disjoint_from_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Returns a positive integer if \p x and \p y are the same polyhedron;
+  returns 0 if they are different.
+
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value 0 is returned.
+*/
+int
+ppl_Polyhedron_equals_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t x,
+					    ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Returns a positive integer if \p ph is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p ph is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Polyhedron_OK PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Adds a copy of the constraint \p c to the system of constraints of
+  \p ph.
+*/
+int
+ppl_Polyhedron_add_constraint PPL_PROTO((ppl_Polyhedron_t ph,
+					 ppl_const_Constraint_t c));
+
+/*! \brief
+  Adds a copy of the constraint \p c to the system of constraints of
+  \p ph.  Returns a positive integer if the resulting polyhedron is
+  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
+  is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_constraint_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Constraint_t c));
+
+/*! \brief
+  Adds a copy of the generator \p g to the system of generators of
+  \p ph.
+*/
+int
+ppl_Polyhedron_add_generator PPL_PROTO((ppl_Polyhedron_t ph,
+					ppl_const_Generator_t g));
+
+/*! \brief
+  Adds a copy of the generator \p g to the system of generators of
+  \p ph.  Returns a positive integer if the resulting polyhedron is
+  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
+  is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_generator_and_minimize PPL_PROTO((ppl_Polyhedron_t ph,
+						     ppl_const_Generator_t g));
+
+/*! \brief
+  Adds a copy of the system of constraints \p cs to the system of
+  constraints of \p ph.
+*/
+int
+ppl_Polyhedron_add_constraints PPL_PROTO((ppl_Polyhedron_t ph,
+					  ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Adds a copy of the system of constraints \p cs to the system of
+  constraints of \p ph.  Returns a positive integer if the resulting
+  polyhedron is non-empty; returns 0 if it is empty.  Upon successful
+  return, \p ph is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_constraints_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Adds a copy of the system of generators \p gs to the system of
+  generators of \p ph.
+*/
+int
+ppl_Polyhedron_add_generators PPL_PROTO((ppl_Polyhedron_t ph,
+					 ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Adds a copy of the system of generators \p gs to the system of
+  generators of \p ph.  Returns a positive integer if the resulting
+  polyhedron is non-empty; returns 0 if it is empty.  Upon successful
+  return, \p ph is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_generators_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Adds the system of constraints \p cs to the system of constraints of
+  \p ph.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_constraints
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_Constraint_System_t cs));
+
+/*! \brief
+  Adds the system of constraints \p cs to the system of constraints of
+  \p ph.  Returns a positive integer if the resulting polyhedron is
+  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
+  is guaranteed to be minimized.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_constraints_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_Constraint_System_t cs));
+
+/*! \brief
+  Adds the system of generators \p gs to the system of generators of
+  \p ph.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_generators PPL_PROTO((ppl_Polyhedron_t ph,
+						  ppl_Generator_System_t gs));
+
+/*! \brief
+  Adds the system of generators \p gs to the system of generators of
+  \p ph.  Returns a positive integer if the resulting polyhedron is
+  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
+  is guaranteed to be minimized.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_generators_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_Generator_System_t gs));
+
+/*! \brief
+  Intersects \p x with polyhedron \p y and assigns the result to \p x.
+*/
+int
+ppl_Polyhedron_intersection_assign PPL_PROTO((ppl_Polyhedron_t x,
+					      ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Intersects \p x with polyhedron \p y and assigns the result to \p x.
+  Returns a positive integer if the resulting polyhedron is non-empty;
+  returns 0 if it is empty.  Upon successful return, \p x is also
+  guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_intersection_assign_and_minimize
+PPL_PROTO((ppl_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Assigns to \p x the poly-hull of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_hull_assign PPL_PROTO((ppl_Polyhedron_t x,
+					   ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Assigns to \p x the poly-hull of \p x and \p y. Returns a positive
+  integer if the resulting polyhedron is non-empty; returns 0 if it is
+  empty. Upon successful return, \p x is also guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_poly_hull_assign_and_minimize
+PPL_PROTO((ppl_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Assigns to \p x the \ref Convex_Polyhedral_Difference "poly-difference"
+  of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_difference_assign PPL_PROTO((ppl_Polyhedron_t x,
+						 ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Transforms the polyhedron \p ph, assigning an affine expression
+  to the specified variable.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable to which the affine expression is assigned;
+
+  \param le
+  The numerator of the affine expression;
+
+  \param d
+  The denominator of the affine expression.
+*/
+int
+ppl_Polyhedron_affine_image PPL_PROTO((ppl_Polyhedron_t ph,
+				       ppl_dimension_type var,
+				       ppl_const_Linear_Expression_t le,
+				       ppl_const_Coefficient_t d));
+
+/*! \brief
+  Transforms the polyhedron \p ph, substituting an affine expression
+  to the specified variable.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable to which the affine expression is substituted;
+
+  \param le
+  The numerator of the affine expression;
+
+  \param d
+  The denominator of the affine expression.
+*/
+int
+ppl_Polyhedron_affine_preimage PPL_PROTO((ppl_Polyhedron_t ph,
+					  ppl_dimension_type var,
+					  ppl_const_Linear_Expression_t le,
+					  ppl_const_Coefficient_t d));
+
+/*! \brief
+  Assigns to \p ph the image of \p ph with respect to the
+  \ref Generalized_Affine_Relations "generalized affine transfer relation"
+  \f$\frac{\mathrm{lb}}{\mathrm{d}}
+       \leq \mathrm{var}'
+         \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable bounded by the generalized affine transfer relation;
+
+  \param lb
+  The numerator of the lower bounding affine expression;
+
+  \param ub
+  The numerator of the upper bounding affine expression;
+
+  \param d
+  The (common) denominator of the lower and upper bounding affine expressions.
+*/
+int
+ppl_Polyhedron_bounded_affine_image
+PPL_PROTO((ppl_Polyhedron_t ph,
+	   ppl_dimension_type var,
+	   ppl_const_Linear_Expression_t lb,
+	   ppl_const_Linear_Expression_t ub,
+	   ppl_const_Coefficient_t d));
+
+/*! \brief
+  Assigns to \p ph the preimage of \p ph with respect to the
+  \ref Generalized_Affine_Relations "generalized affine transfer relation"
+  \f$\frac{\mathrm{lb}}{\mathrm{d}}
+       \leq \mathrm{var}'
+         \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable bounded by the generalized affine transfer relation;
+
+  \param lb
+  The numerator of the lower bounding affine expression;
+
+  \param ub
+  The numerator of the upper bounding affine expression;
+
+  \param d
+  The (common) denominator of the lower and upper bounding affine expressions.
+*/
+int
+ppl_Polyhedron_bounded_affine_preimage
+PPL_PROTO((ppl_Polyhedron_t ph,
+	   ppl_dimension_type var,
+	   ppl_const_Linear_Expression_t lb,
+	   ppl_const_Linear_Expression_t ub,
+	   ppl_const_Coefficient_t d));
+
+/*! \brief
+  Assigns to \p ph the image of \p ph with respect to the
+  \ref Generalized_Affine_Relations "generalized affine transfer relation"
+  \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
+  where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+  by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The left hand side variable of the generalized affine transfer relation;
+
+  \param relsym
+  The relation symbol;
+
+  \param le
+  The numerator of the right hand side affine expression;
+
+  \param d
+  The denominator of the right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_image
+PPL_PROTO((ppl_Polyhedron_t ph,
+	   ppl_dimension_type var,
+	   enum ppl_enum_Constraint_Type relsym,
+	   ppl_const_Linear_Expression_t le,
+	   ppl_const_Coefficient_t d));
+
+/*! \brief
+  Assigns to \p ph the preimage of \p ph with respect to the
+  \ref Generalized_Affine_Relations "generalized affine transfer relation"
+  \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
+  where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+  by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The left hand side variable of the generalized affine transfer relation;
+
+  \param relsym
+  The relation symbol;
+
+  \param le
+  The numerator of the right hand side affine expression;
+
+  \param d
+  The denominator of the right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_preimage
+PPL_PROTO((ppl_Polyhedron_t ph,
+	   ppl_dimension_type var,
+	   enum ppl_enum_Constraint_Type relsym,
+	   ppl_const_Linear_Expression_t le,
+	   ppl_const_Coefficient_t d));
+
+/*! \brief
+  Assigns to \p ph the image of \p ph with respect to the
+  \ref Generalized_Affine_Relations "generalized affine transfer relation"
+  \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+  \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param lhs
+  The left hand side affine expression;
+
+  \param relsym
+  The relation symbol;
+
+  \param rhs
+  The right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Polyhedron_t ph,
+	   ppl_const_Linear_Expression_t lhs,
+	   enum ppl_enum_Constraint_Type relsym,
+	   ppl_const_Linear_Expression_t rhs));
+
+/*! \brief
+  Assigns to \p ph the preimage of \p ph with respect to the
+  \ref Generalized_Affine_Relations "generalized affine transfer relation"
+  \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+  \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param lhs
+  The left hand side affine expression;
+
+  \param relsym
+  The relation symbol;
+
+  \param rhs
+  The right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Polyhedron_t ph,
+	   ppl_const_Linear_Expression_t lhs,
+	   enum ppl_enum_Constraint_Type relsym,
+	   ppl_const_Linear_Expression_t rhs));
+
+/*! \brief
+  Assigns to \p x the \ref Time_Elapse_Operator "time-elapse" between
+  the polyhedra \p x and \p y.
+*/
+int
+ppl_Polyhedron_time_elapse_assign PPL_PROTO((ppl_Polyhedron_t x,
+					     ppl_const_Polyhedron_t y));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+  \p x and \p y.  If \p tp is not the null pointer, the
+  \ref Widening_with_Tokens "widening with tokens" delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   unsigned* tp));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+  \p x and \p y.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign PPL_PROTO((ppl_Polyhedron_t x,
+						 ppl_const_Polyhedron_t y));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x.  If \p tp is not the null pointer,
+  the \ref Widening_with_Tokens "widening with tokens" delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs,
+	   unsigned* tp));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p
+  x. If \p tp is not the null pointer,
+  the \ref Widening_with_Tokens "widening with tokens" delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs,
+	   unsigned* tp));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+  and \p y.  If \p tp is not the null pointer, the
+  \ref Widening_with_Tokens "widening with tokens" delay technique is
+  applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_H79_widening_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   unsigned* tp));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+  and \p y.
+*/
+int
+ppl_Polyhedron_H79_widening_assign PPL_PROTO((ppl_Polyhedron_t x,
+					      ppl_const_Polyhedron_t y));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x. If \p tp is not the null
+  pointer, the \ref Widening_with_Tokens "widening with tokens" delay
+  technique is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs,
+	   unsigned* tp));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+  If \p tp is not the null pointer,
+  the \ref Widening_with_Tokens "widening with tokens" delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs,
+	   unsigned* tp));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p
+  x.
+*/
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Assigns to \p ph its topological closure.
+*/
+int
+ppl_Polyhedron_topological_closure_assign PPL_PROTO((ppl_Polyhedron_t ph));
+
+/*! \brief
+  Adds \p d new dimensions to the space enclosing the polyhedron \p ph
+  and to \p ph itself.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
+
+/*! \brief
+  Adds \p d new dimensions to the space enclosing the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_project
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
+
+/*! \brief
+  Seeing a polyhedron as a set of tuples (its points), assigns
+  to \p x all the tuples that can be obtained by concatenating,
+  in the order given, a tuple of \p x with a tuple of \p y.
+*/
+int
+ppl_Polyhedron_concatenate_assign PPL_PROTO((ppl_Polyhedron_t x,
+					     ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Removes from the vector space enclosing \p ph the space dimensions that
+  are specified in first \p n positions of the array \p ds.  The presence
+  of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_Polyhedron_remove_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
+						  ppl_dimension_type ds[],
+						  size_t n));
+
+/*! \brief
+  Removes the higher dimensions from the vector space enclosing \p ph
+  so that, upon successful return, the new space dimension is \p d.
+*/
+int
+ppl_Polyhedron_remove_higher_space_dimensions
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
+
+/*! \brief
+  Remaps the dimensions of the vector space according to a
+  \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+  This function is specified by means of the \p maps array,
+  which has \p n entries.
+
+  The partial function is defined on dimension <CODE>i</CODE>
+  if <CODE>i < n</CODE> and <CODE>maps[i] != ppl_not_a_dimension</CODE>;
+  otherwise it is undefined on dimension <CODE>i</CODE>.
+  If the function is defined on dimension <CODE>i</CODE>, then dimension
+  <CODE>i</CODE> is mapped onto dimension <CODE>maps[i]</CODE>.
+
+  The result is undefined if \p maps does not encode a partial
+  function with the properties described in the
+  \ref Mapping_the_Dimensions_of_the_Vector_Space
+  "specification of the mapping operator".
+*/
+int
+ppl_Polyhedron_map_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
+					       ppl_dimension_type maps[],
+					       size_t n));
+
+/*! \brief
+  \ref expand_space_dimension "Expands" the \f$d\f$-th dimension of
+  the vector space enclosing \p ph to \p m new space dimensions.
+*/
+int
+ppl_Polyhedron_expand_space_dimension PPL_PROTO((ppl_Polyhedron_t ph,
+						 ppl_dimension_type d,
+						 ppl_dimension_type m));
+
+/*! \brief
+  Modifies \p ph by \ref fold_space_dimensions "folding" the
+  space dimensions contained in the first \p n positions of the array \p ds
+  into dimension \p d.  The presence of duplicates in \p ds is a waste
+  but an innocuous one.
+*/
+int
+ppl_Polyhedron_fold_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
+						ppl_dimension_type ds[],
+						size_t n,
+						ppl_dimension_type d));
+
+/*@}*/ /* Functions Related to Polyhedra */
+
+
+/*! \name Functions Related to LP Problems */
+/*@{*/
+
+/*! \brief
+  Builds a trivial LP problem and writes a handle to it at address \p plp.
+*/
+int
+ppl_new_LP_Problem_trivial PPL_PROTO((ppl_LP_Problem_t* plp));
+
+/*! \brief
+  Builds an LP problem having feasible region \p cs, objective function
+  \p le and optimization mode \p m; writes a handle to it at address \p plp.
+*/
+int
+ppl_new_LP_Problem PPL_PROTO((ppl_LP_Problem_t* plp,
+			      ppl_const_Constraint_System_t cs,
+			      ppl_const_Linear_Expression_t le,
+			      int m));
+
+/*! \brief
+  Builds an LP problem that is a copy of \p lp; writes a handle
+  for the newly created system at address \p plp.
+*/
+int
+ppl_new_LP_Problem_from_LP_Problem
+PPL_PROTO((ppl_LP_Problem_t* plp, ppl_const_LP_Problem_t lp));
+
+/*! \brief
+  Invalidates the handle \p lp: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_LP_Problem PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+  Assigns a copy of the LP problem \p src to \p dst.
+*/
+int
+ppl_assign_LP_Problem_from_LP_Problem
+PPL_PROTO((ppl_LP_Problem_t dst, ppl_const_LP_Problem_t src));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p lp.
+*/
+int
+ppl_LP_Problem_space_dimension
+PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_dimension_type* m));
+
+/*! \brief
+  Writes a const handle to the constraint system defining the
+  feasible region of the LP problem \p lp at address \p pcs.
+*/
+int
+ppl_LP_Problem_constraints PPL_PROTO((ppl_const_LP_Problem_t lp,
+				      ppl_const_Constraint_System_t* pcs));
+
+/*! \brief
+  Writes a const handle to the linear expression defining the
+  objective function of the LP problem \p lp at address \p ple.
+*/
+int
+ppl_LP_Problem_objective_function
+PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_const_Linear_Expression_t* ple));
+
+/*! \brief
+  Returns the optimization mode of the LP problem \p lp.
+*/
+int
+ppl_LP_Problem_optimization_mode PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+  Resets the LP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_LP_Problem_clear PPL_PROTO((ppl_LP_Problem_t lp));
+
+/*! \brief
+  Modifies the feasible region of the LP problem \p lp by adding a copy
+  of the constraint \p c; the space dimension is increased, if necessary.
+*/
+int
+ppl_LP_Problem_add_constraint PPL_PROTO((ppl_LP_Problem_t lp,
+					 ppl_const_Constraint_t c));
+
+/*! \brief
+  Modifies the feasible region of the LP problem \p lp by adding a copy
+  of the constraints in \p cs; the space dimension is increased, if necessary.
+*/
+int
+ppl_LP_Problem_add_constraints PPL_PROTO((ppl_LP_Problem_t lp,
+					  ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Sets the objective function of the LP problem \p lp to a copy of \p le.
+*/
+int
+ppl_LP_Problem_set_objective_function
+PPL_PROTO((ppl_LP_Problem_t lp, ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Sets the optimization mode of the LP problem \p lp to \p mode.
+*/
+int
+ppl_LP_Problem_set_optimization_mode PPL_PROTO((ppl_LP_Problem_t lp,
+						int mode));
+
+/*! \brief
+  Returns a positive integer if \p lp is satisfiable; returns 0 otherwise.
+*/
+int
+ppl_LP_Problem_is_satisfiable PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+  Solves the LP problem \p lp, returning an exit status.
+
+  \return
+  <CODE>PPL_LP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the LP problem
+  is not satisfiable;
+  <CODE>PPL_LP_PROBLEM_STATUS_UNBOUNDED</CODE> if the LP problem
+  is satisfiable but there is no finite bound to the value of
+  the objective function;
+  <CODE>PPL_LP_PROBLEM_STATUS_OPTIMIZED</CODE> if the LP problem
+  admits an optimal solution.
+*/
+int
+ppl_LP_Problem_solve PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+  Evaluates the objective function of \p lp on point \p g.
+
+  \param lp
+  The LP problem defining the objective function;
+
+  \param g
+  The generator on which the objective function will be evaluated;
+
+  \param num
+  Will be assigned the numerator of the objective function value;
+
+  \param den
+  Will be assigned the denominator of the objective function value;
+*/
+int
+ppl_LP_Problem_evaluate_objective_function
+PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_const_Generator_t g,
+	   ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \brief
+  Writes a const handle to a feasible point for the LP problem \p lp
+  at address \p pg.
+*/
+int
+ppl_LP_Problem_feasible_point PPL_PROTO((ppl_const_LP_Problem_t lp,
+					 ppl_const_Generator_t* pg));
+
+/*! \brief
+  Writes a const handle to an optimizing point for the LP problem \p lp
+  at address \p pg.
+*/
+int
+ppl_LP_Problem_optimizing_point PPL_PROTO((ppl_const_LP_Problem_t lp,
+					   ppl_const_Generator_t* pg));
+
+/*! \brief
+  Returns the optimal value for \p lp.
+
+  \param lp
+  The LP problem;
+
+  \param num
+  Will be assigned the numerator of the optimal value;
+
+  \param den
+  Will be assigned the denominator of the optimal value.
+*/
+int
+ppl_LP_Problem_optimal_value
+PPL_PROTO((ppl_const_LP_Problem_t lp,
+	   ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \brief
+  Returns a positive integer if \p lp is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p lp is broken.  Useful for debugging purposes.
+*/
+int
+ppl_LP_Problem_OK PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*@}*/ /* Functions Related to LP Problems */
+
+
+/*! \name Simple I/O Functions */
+/*@{*/
+
+/*! \brief Pretty-prints \p var to <CODE>stdout</CODE>. */
+int
+ppl_io_print_variable PPL_PROTO((ppl_dimension_type var));
+
+/*! \brief Pretty-prints \p var to the given output \p stream. */
+int
+ppl_io_fprint_variable PPL_PROTO((FILE* stream, ppl_dimension_type var));
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+
+#define PPL_DECLARE_PRINT_FUNCTIONS(Type) \
+/*! \brief Prints \p x to <CODE>stdout</CODE>. */ \
+int \
+ppl_io_print_ ## Type PPL_PROTO((ppl_const_ ## Type ## _t x)); \
+ \
+/*! \brief Prints \p x to the given output \p stream. */ \
+int \
+ppl_io_fprint_ ## Type PPL_PROTO((FILE* stream, ppl_const_ ## Type ## _t x));
+
+PPL_DECLARE_PRINT_FUNCTIONS(Coefficient)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Linear_Expression)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Constraint)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Constraint_System)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Generator)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Generator_System)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Polyhedron)
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+
+/*! \brief
+  The type of output functions used for printing variables.
+
+  An output function for variables must write a textual representation
+  for \p var to a character buffer, null-terminate it, and return a
+  pointer to the beginning of the buffer.  In case the operation fails,
+  0 should be returned and perhaps <CODE>errno</CODE> should be set
+  in a meaningful way.  The library does nothing with the buffer, besides
+  printing its contents.
+*/
+typedef const char*
+ppl_io_variable_output_function_type(ppl_dimension_type var);
+
+/*! \brief
+  Sets the output function to be used for printing variables to \p p.
+*/
+int
+ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p);
+
+/*! \brief
+  Writes a pointer to the current variable output function to \p pp.
+*/
+int
+ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp);
+
+/*@}*/ /* Simple I/O Functions */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#undef PPL_PROTO
+
+/*@}*/ /* \defgroup PPL_C_interface */
+
+#endif /* !defined(PPL_ppl_c_h) */
diff --git a/interfaces/C/ppl_c.h.in b/interfaces/C/ppl_c.h.in
new file mode 100644
index 0000000..ce466e7
--- /dev/null
+++ b/interfaces/C/ppl_c.h.in
@@ -0,0 +1,2695 @@
+/* Header file for the C interface.  -*- C -*-
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_c_h
+#define PPL_ppl_c_h 1
+
+/*! \defgroup PPL_C_interface C Language Interface
+
+\brief
+\ref CInterfaceDetails "Some details about the C Interface".
+
+\anchor CInterfaceDetails
+All the declarations needed for using the PPL's C interface
+(preprocessor symbols, data types, variables and
+functions) are collected in the header file <CODE>ppl_c.h</CODE>.
+This file, which is designed to work with pre-ANSI and ANSI C compilers
+as well as C99 and C++ compilers, should be included, either directly
+or via some other header file, with the directive
+\code
+#include <ppl_c.h>
+\endcode
+If this directive does not work, then your compiler is unable to find
+the file <CODE>ppl_c.h</CODE>. So check that the library is installed
+(if it is not installed, you may want to <CODE>make install</CODE>,
+perhaps with root privileges) in the right place
+(if not you may want to reconfigure the library using the appropriate
+pathname for the <CODE>--prefix</CODE> option); and that your compiler
+knows where it is installed (if not you should add the path to the
+directory where <CODE>ppl_c.h</CODE> is located to the compiler's
+include file search path; this is usually done with the
+<CODE>-I</CODE> option).
+
+The name space of the PPL's C interface is <CODE>PPL_*</CODE> for
+preprocessor symbols, enumeration values and variables; and
+<CODE>ppl_*</CODE> for data types and function names. The interface
+systematically uses <EM>opaque data types</EM> (generic pointers that
+completely hide the internal representations from the client code) and
+provides all required access functions. By using just the interface,
+the client code can exploit all the functionalities of the library yet
+avoid directly manipulating the library's data structures.  The advantages
+are that (1) applications do not depend on the internals of the library
+(these may change from release to release), and (2) the interface
+invariants can be thoroughly checked (by the access functions).
+
+The PPL's C interface is initialized by means of the
+<CODE>ppl_initialize</CODE> function.  This function must
+be called <EM>before using any other interface of the library</EM>.
+The application can release the resources allocated by the library by
+calling the <CODE>ppl_finalize</CODE> function. After this function
+is called <EM>no other interface of the library may be used</EM>
+until the interface is re-initialized using <CODE>ppl_initialize</CODE>.
+
+Any application using the PPL should make sure that only the
+intended version(s) of the library are ever used.  The version used can be
+checked at compile-time thanks to the macros PPL_VERSION_MAJOR,
+PPL_VERSION_MINOR, PPL_VERSION_REVISION and PPL_VERSION_BETA, which
+give, respectively major, minor, revision and beta numbers of the PPL
+version.  This is an example of their use:
+\code
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6
+# error "PPL version 0.6 or following is required"
+#endif
+\endcode
+Compile-time checking, however, is not normally enough, particularly in
+an environment where there is dynamic linking.  Run-time checking can
+be performed by means of the functions <CODE>ppl_version_major</CODE>,
+<CODE>ppl_version_minor</CODE>, <CODE>ppl_version_revision</CODE>, and
+<CODE>ppl_version_beta</CODE>. The PPL's C interface also provides
+functions <CODE>ppl_version</CODE>, returning character string
+containing the full version number, and <CODE>ppl_banner</CODE>,
+returning a string that, in addition, provides (pointers to) other
+useful information for the library user.
+
+All programs using the PPL's C interface must link with the
+following libraries: <CODE>libppl_c</CODE> (PPL's C interface),
+<CODE>libppl</CODE> (PPL's core), <CODE>libgmpxx</CODE> (GMP's C++
+interface), and <CODE>libgmp</CODE> (GMP's library core).  On most
+Unix-like systems, this is done by adding <CODE>-lppl_c</CODE>,
+<CODE>-lppl</CODE>, <CODE>-lgmpxx</CODE>, and <CODE>-lgmp</CODE> to
+the compiler's or linker's command line.  For example:
+\verbatim
+gcc myprogram.o -lppl_c -lppl -lgmpxx -lgmp
+\endverbatim
+If this does not work, it means that your compiler/linker is not
+finding the libraries where it expects.  Again, this could be because you
+forgot to install the library or you installed it in a non-standard
+location.  In the latter case you will need to use the appropriate
+options (usually <CODE>-L</CODE>) and, if you use shared libraries,
+some sort of run-time path selection mechanisms.  Consult your
+compiler's documentation for details.  Notice that the PPL is built
+using <A HREF="http://www.gnu.org/software/libtool/">Libtool</A> and
+an application can exploit this fact to significantly simplify the
+linking phase.  See Libtool's documentation for details.  Those
+working under Linux can find a lot of useful information on how to use
+program libraries (including static, shared, and dynamically loaded
+libraries) in the
+<A HREF="http://www.dwheeler.com/program-library/">Program Library
+HOWTO</A>.
+
+For examples on how to use the functions provided by the C interface,
+you are referred to the directory <CODE>demos/ppl_lpsol/</CODE> in
+the source distribution.  It contains a <EM>Linear Programming</EM>
+solver written in C.  In order to use this solver you will need to install
+<A HREF="http://www.gnu.org/software/glpk/">GLPK</A> (the GNU Linear
+Programming Kit): this is used to read linear programs in MPS format.
+*/
+
+/*
+  For some reason, GMP up to and including version 4.1.3 requires
+  <stdio.h> to be included before <gmp.h>.
+*/
+/*@{*/ /* \defgroup PPL_C_interface */
+
+#include <stdio.h>
+#include <gmp.h>
+#include <stddef.h>
+
+/*
+  PPL_PROTO is a macro used to wrap function prototypes, so that
+  compilers that don't understand ANSI C prototypes still work, and
+  ANSI C compilers can issue warnings about type mismatches.
+*/
+#if defined(__STDC__)                              \
+  || defined(__cplusplus)                          \
+  || defined (_AIX)                                \
+  || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
+  || defined(_WIN32)
+# define PPL_PROTO(protos) protos
+#else
+# define PPL_PROTO(protos) ()
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*! \brief
+  Defines the error codes that any function may return.
+*/
+enum ppl_enum_error_code {
+  /*! \hideinitializer
+    The virtual memory available to the process has been exhausted. */
+  PPL_ERROR_OUT_OF_MEMORY = -2,
+  /*! \hideinitializer
+    A function has been invoked with an invalid argument. */
+  PPL_ERROR_INVALID_ARGUMENT = -3,
+  /*! \hideinitializer
+    A function has been invoked outside its domain of definition. */
+  PPL_ERROR_DOMAIN_ERROR = -4,
+  /*! \hideinitializer
+    The construction of an object that would exceed its maximum
+    permitted size was attempted. */
+  PPL_ERROR_LENGTH_ERROR = -5,
+  /*! \hideinitializer
+    An arithmetic overflow occurred and the computation was consequently
+    interrupted.  This can <EM>only</EM> happen in library's incarnations
+    using bounded integers as coefficients. */
+  PPL_ARITHMETIC_OVERFLOW = -6,
+  /*! \hideinitializer
+    An error occurred during a C input/output operation.  A more
+    precise indication of what went wrong is available via
+    <CODE>errno</CODE>. */
+  PPL_STDIO_ERROR = -7,
+  /*! \hideinitializer
+    An internal error that was diagnosed by the PPL itself.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_INTERNAL_ERROR = -8,
+  /*! \hideinitializer
+    A standard exception has been raised by the C++ run-time environment.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION = -9,
+  /*! \hideinitializer
+    A totally unknown, totally unexpected error happened.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_UNEXPECTED_ERROR = -10
+};
+
+/*! \name Version Checking */
+/*@{*/
+
+/*! \brief
+  The major number of the PPL version.
+*/
+#define PPL_VERSION_MAJOR @PPL_VERSION_MAJOR@
+
+/*! \brief
+  The minor number of the PPL version.
+*/
+#define PPL_VERSION_MINOR @PPL_VERSION_MINOR@
+
+/*! \brief
+  The revision number of the PPL version.
+*/
+#define PPL_VERSION_REVISION @PPL_VERSION_REVISION@
+
+/*! \brief
+  The beta number of the PPL version.  This is zero for official
+  releases and nonzero for development snapshots.
+*/
+#define PPL_VERSION_BETA @PPL_VERSION_BETA@
+
+/*! \brief
+  A string containing the PPL version.
+
+  Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+  to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively.  The
+  format of PPL_VERSION is <CODE>M "." m</CODE> if both
+  PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+  (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+  PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+  <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+  PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+  neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "@VERSION@"
+
+/*! \brief
+  Returns the major number of the PPL version.
+*/
+int
+ppl_version_major PPL_PROTO((void));
+
+/*! \brief
+  Returns the minor number of the PPL version.
+*/
+int
+ppl_version_minor PPL_PROTO((void));
+
+/*! \brief
+  Returns the revision number of the PPL version.
+*/
+int
+ppl_version_revision PPL_PROTO((void));
+
+/*! \brief
+  Returns the beta number of the PPL version.
+*/
+int
+ppl_version_beta PPL_PROTO((void));
+
+/*! \brief
+  Writes to \c *p a pointer to a character string containing the
+  PPL version.
+*/
+int
+ppl_version PPL_PROTO((const char** p));
+
+/*! \brief
+  Writes to \c *p a pointer to a character string containing the PPL banner.
+
+  The banner provides information about the PPL version, the licensing,
+  the lack of any warranty whatsoever, the C++ compiler used to build
+  the library, where to report bugs and where to look for further
+  information.
+*/
+int
+ppl_banner PPL_PROTO((const char** p));
+
+/*@}*/ /* Version Checking */
+
+/*! \brief
+  An unsigned integral type for representing space dimensions.
+*/
+typedef size_t ppl_dimension_type;
+
+/*! \name Initialization, Error Handling and Auxiliary Functions */
+/*@{*/
+
+/*! \brief
+  Writes to \p m the maximum space dimension this library can handle.
+*/
+int
+ppl_max_space_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+  Writes to \p m a value that does not designate a valid dimension.
+*/
+int
+ppl_not_a_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+  Initializes the Parma Polyhedra Library.
+  This function must be called before any other function.
+
+  \return
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+  was already initialized.
+*/
+int
+ppl_initialize PPL_PROTO((void));
+
+/*! \brief
+  Finalizes the Parma Polyhedra Library.
+  This function must be called after any other function.
+
+  \return
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+  was already finalized.
+*/
+int
+ppl_finalize PPL_PROTO((void));
+
+/*! \brief
+  Installs the user-defined error handler pointed at by \p h.
+
+  The error handler takes an error code and a textual description that
+  gives further information about the actual error.  The C string
+  containing the textual description is read-only and its existence is
+  not guaranteed after the handler has returned.
+*/
+int
+ppl_set_error_handler PPL_PROTO((void (*h)(enum ppl_enum_error_code code,
+					   const char* description)));
+
+/*@}*/ /* Initialization, Error Handling and Auxiliary Functions */
+
+#undef PPL_TYPE_DECLARATION
+
+#define PPL_TYPE_DECLARATION(Type) /*! \brief Opaque pointer. */ typedef struct ppl_ ## Type ## _tag* ppl_ ## Type ## _t; /*! \brief Opaque pointer to const object. */ typedef struct ppl_ ## Type ## _tag const* ppl_const_ ## Type ## _t
+
+PPL_TYPE_DECLARATION(Coefficient);
+
+PPL_TYPE_DECLARATION(Linear_Expression);
+
+PPL_TYPE_DECLARATION(Constraint);
+
+PPL_TYPE_DECLARATION(Constraint_System);
+
+PPL_TYPE_DECLARATION(Constraint_System_const_iterator);
+
+PPL_TYPE_DECLARATION(Generator);
+
+PPL_TYPE_DECLARATION(Generator_System);
+
+PPL_TYPE_DECLARATION(Generator_System_const_iterator);
+
+PPL_TYPE_DECLARATION(Polyhedron);
+
+PPL_TYPE_DECLARATION(LP_Problem);
+
+#undef PPL_TYPE_DECLARATION
+
+/*! \name Functions Related to Coefficients */
+/*@{*/
+
+/*! \brief
+  Creates a new coefficient with value 0 and writes a handle for the
+  newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient PPL_PROTO((ppl_Coefficient_t* pc));
+
+/*! \brief
+  Creates a new coefficient with the value given by the GMP integer
+  \p z and writes a handle for the newly created coefficient
+  at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t* pc, mpz_t z));
+
+/*! \brief
+  Builds a coefficient that is a copy of \p c; writes a handle
+  for the newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_Coefficient PPL_PROTO((ppl_Coefficient_t* pc,
+						ppl_const_Coefficient_t c));
+
+/*! \brief
+  Assign to \p dst the value given by the GMP integer \p z.
+*/
+int
+ppl_assign_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t dst, mpz_t z));
+
+/*! \brief
+  Assigns a copy of the coefficient \p src to \p dst.
+*/
+int
+ppl_assign_Coefficient_from_Coefficient
+PPL_PROTO((ppl_Coefficient_t dst, ppl_const_Coefficient_t src));
+
+/*! \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Coefficient PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*! \brief
+  Sets the value of the GMP integer \p z to the value of \p c.
+*/
+int
+ppl_Coefficient_to_mpz_t PPL_PROTO((ppl_const_Coefficient_t c, mpz_t z));
+
+/*! \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Coefficient_OK PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*! \brief
+  Returns a positive integer if coefficients are bounded; returns 0
+  otherwise.
+*/
+int
+ppl_Coefficient_is_bounded PPL_PROTO((void));
+
+/*! \brief
+  Returns a positive integer if coefficients are bounded, in which case
+  \p min is set to their minimum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_min PPL_PROTO((mpz_t min));
+
+/*! \brief
+  Returns a positive integer if coefficients are bounded, in which case
+  \p max is set to their maximum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_max PPL_PROTO((mpz_t max));
+
+/*@}*/ /* Functions Related to Coefficients */
+
+/*! \name Functions Related to Linear Expressions */
+/*@{*/
+
+/*! \brief
+  Creates a new linear expression corresponding to the constant 0 in a
+  zero-dimensional space; writes a handle for the new linear
+  expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression PPL_PROTO((ppl_Linear_Expression_t* ple));
+
+/*! \brief
+  Creates a new linear expression corresponding to the constant 0 in a
+  <TT>d</TT>-dimensional space; writes a handle for the new linear
+  expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_with_dimension
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_dimension_type d));
+
+/*! \brief
+  Builds a linear expression that is a copy of \p le; writes a handle
+  for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Builds a linear expression corresponding to constraint \p c;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Constraint
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Constraint_t c));
+
+/*! \brief
+  Builds a linear expression corresponding to generator \p g;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Generator
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Generator_t g));
+
+/*! \brief
+  Invalidates the handle \p le: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Linear_Expression PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Assigns a copy of the linear expression \p src to \p dst.
+*/
+int
+ppl_assign_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \brief
+  Adds \p n to the coefficient of variable \p var in the linear
+  expression \p le.  The space dimension is set to be the maximum
+  between \p var + 1 and the old space dimension.
+*/
+int
+ppl_Linear_Expression_add_to_coefficient
+PPL_PROTO((ppl_Linear_Expression_t le,
+	   ppl_dimension_type var,
+	   ppl_const_Coefficient_t n));
+
+/*! \brief
+  Adds \p n to the inhomogeneous term of the linear expression
+  \p le.
+*/
+int
+ppl_Linear_Expression_add_to_inhomogeneous
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*! \brief
+  Adds the linear expression \p src to \p dst.
+*/
+int
+ppl_add_Linear_Expression_to_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \brief
+  Subtracts the linear expression \p src from \p dst.
+*/
+int
+ppl_subtract_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \brief
+  Multiply the linear expression \p dst by \p n.
+*/
+int
+ppl_multiply_Linear_Expression_by_Coefficient
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*! \brief
+  Writes to \p m the space dimension of \p le.
+*/
+int
+ppl_Linear_Expression_space_dimension
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_dimension_type* m));
+
+/*! \brief
+  Copies into \p n the coefficient of variable \p var in
+  the linear expression \p le.
+*/
+int
+ppl_Linear_Expression_coefficient PPL_PROTO((ppl_const_Linear_Expression_t le,
+					     ppl_dimension_type var,
+					     ppl_Coefficient_t n));
+
+/*! \brief
+  Copies into \p n the inhomogeneous term of linear expression \p le.
+*/
+int
+ppl_Linear_Expression_inhomogeneous_term
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_Coefficient_t n));
+
+/*! \brief
+  Returns a positive integer if \p le is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p le is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Linear_Expression_OK PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*@}*/ /* Functions Related to Linear Expressions */
+
+/*! \brief
+  Describes the relations represented by a constraint.
+*/
+enum ppl_enum_Constraint_Type {
+  /*! The constraint is of the form \f$e < 0\f$. */
+  PPL_CONSTRAINT_TYPE_LESS_THAN,
+  /*! The constraint is of the form \f$e \leq 0\f$. */
+  PPL_CONSTRAINT_TYPE_LESS_THAN_OR_EQUAL,
+  /*! The constraint is of the form \f$e = 0\f$. */
+  PPL_CONSTRAINT_TYPE_EQUAL,
+  /*! The constraint is of the form \f$e \geq 0\f$. */
+  PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL,
+  /*! The constraint is of the form \f$e > 0\f$. */
+  PPL_CONSTRAINT_TYPE_GREATER_THAN
+};
+
+
+/*! \name Functions Related to Constraints */
+/*@{*/
+
+/*! \brief
+  Creates the new constraint `\p le \p rel 0' and writes a handle for
+  it at address \p pc.  The space dimension of the new constraint is
+  equal to the space dimension of \p le.
+*/
+int
+ppl_new_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+			      ppl_const_Linear_Expression_t le,
+			      enum ppl_enum_Constraint_Type rel));
+
+/*! \brief
+  Creates the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$
+  and writes a handle for it at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_false PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \brief
+  Creates the true (zero-dimension space) constraint \f$0 \leq 1\f$,
+  also known as <EM>positivity constraint</EM>.
+  A handle for the newly created constraint is written at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_positivity PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \brief
+  Builds a constraint that is a copy of \p c; writes a handle
+  for the newly created constraint at address \p pc.
+*/
+int
+ppl_new_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+					      ppl_const_Constraint_t c));
+
+/*! \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint PPL_PROTO((ppl_const_Constraint_t c));
+
+/*! \brief
+  Assigns a copy of the constraint \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t dst,
+						 ppl_const_Constraint_t src));
+
+/*! \brief
+  Writes to \p m the space dimension of \p c.
+*/
+int
+ppl_Constraint_space_dimension PPL_PROTO((ppl_const_Constraint_t c,
+					  ppl_dimension_type* m));
+
+/*! \brief
+  Returns the type of constraint \p c.
+*/
+int
+ppl_Constraint_type PPL_PROTO((ppl_const_Constraint_t c));
+
+/*! \brief
+  Copies into \p n the coefficient of variable \p var in
+  constraint \p c.
+*/
+int
+ppl_Constraint_coefficient PPL_PROTO((ppl_const_Constraint_t c,
+				      ppl_dimension_type var,
+				      ppl_Coefficient_t n));
+
+/*! \brief
+  Copies into \p n the inhomogeneous term of constraint \p c.
+*/
+int
+ppl_Constraint_inhomogeneous_term PPL_PROTO((ppl_const_Constraint_t c,
+					     ppl_Coefficient_t n));
+
+/*! \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Constraint_OK PPL_PROTO((ppl_const_Constraint_t c));
+
+/*@}*/ /* Functions Related to Constraints */
+
+/*! \name Functions Related to Constraint Systems */
+/*@{*/
+
+/*! \brief
+  Builds an empty system of constraints and writes a handle to it at
+  address \p pcs.
+*/
+int
+ppl_new_Constraint_System PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \brief
+  Builds a zero-dimensional, unsatisfiable constraint system and
+  writes a handle to it at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_zero_dim_empty
+PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \brief
+  Builds the singleton constraint system containing only a copy of
+  constraint \p c; writes a handle for the newly created system at
+  address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_t c));
+
+/*! \brief
+  Builds a constraint system that is a copy of \p cs; writes a handle
+  for the newly created system at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Invalidates the handle \p cs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Assigns a copy of the constraint system \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p cs.
+*/
+int
+ppl_Constraint_System_space_dimension
+PPL_PROTO((ppl_const_Constraint_System_t cs, ppl_dimension_type* m));
+
+/*! \brief
+  Returns a positive integer if \p cs contains any (non-trivial) strict
+  inequality; returns 0 otherwise.
+*/
+int
+ppl_Constraint_System_has_strict_inequalities
+PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Removes all the constraints from the constraint system \p cs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Constraint_System_clear PPL_PROTO((ppl_Constraint_System_t cs));
+
+/*! \brief
+  Inserts a copy of the constraint \p c into \p cs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Constraint_System_insert_Constraint PPL_PROTO((ppl_Constraint_System_t cs,
+						   ppl_const_Constraint_t c));
+
+/*! \brief
+  Returns a positive integer if \p cs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p cs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Constraint_System_OK PPL_PROTO((ppl_const_Constraint_System_t c));
+
+
+/*! \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit));
+
+/*! \brief
+  Builds a const iterator that is a copy of \p cit; writes an
+  handle for the newly created const iterator at address \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit,
+	   ppl_const_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Invalidates the handle \p cit: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System_const_iterator
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t dst,
+	   ppl_const_Constraint_System_const_iterator_t src));
+
+/*! \brief
+  Assigns to \p cit a const iterator "pointing" to the beginning of
+  the constraint system \p cs.
+*/
+int
+ppl_Constraint_System_begin
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+	   ppl_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Assigns to \p cit a const iterator "pointing" past the end of the
+  constraint system \p cs.
+*/
+int
+ppl_Constraint_System_end
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+	   ppl_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Dereference \p cit writing a const handle to the resulting
+  constraint at address \p pc.
+*/
+int
+ppl_Constraint_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit,
+	   ppl_const_Constraint_t* pc));
+
+/*! \brief
+  Increment \p cit so that it "points" to the next constraint.
+*/
+int
+ppl_Constraint_System_const_iterator_increment
+PPL_PROTO((ppl_Constraint_System_const_iterator_t cit));
+
+/*! \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Constraint_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t x,
+	   ppl_const_Constraint_System_const_iterator_t y));
+
+/*@}*/ /* Functions Related to Constraint Systems */
+
+/*! \brief
+  Describes the different kinds of generators.
+*/
+enum ppl_enum_Generator_Type {
+  /*! The generator is a line. */
+  PPL_GENERATOR_TYPE_LINE,
+  /*! The generator is a ray. */
+  PPL_GENERATOR_TYPE_RAY,
+  /*! The generator is a point. */
+  PPL_GENERATOR_TYPE_POINT,
+  /*! The generator is a closure point. */
+  PPL_GENERATOR_TYPE_CLOSURE_POINT
+};
+
+
+/*! \name Functions Related to Generators */
+/*@{*/
+
+/*! \brief
+  Creates a new generator of direction \p le and type \p t.  If the
+  generator to be created is a point or a closure point, the divisor
+  \p d is applied to \p le.  For other types of generators \p d is
+  simply disregarded.  A handle for the new generator is written at
+  address \p pg.  The space dimension of the new generator is equal to
+  the space dimension of \p le.
+*/
+int
+ppl_new_Generator PPL_PROTO((ppl_Generator_t* pg,
+			     ppl_const_Linear_Expression_t le,
+			     enum ppl_enum_Generator_Type t,
+			     ppl_const_Coefficient_t d));
+
+/*! \brief
+  Creates the point that is the origin of the zero-dimensional space
+  \f$\Rset^0\f$.  Writes a handle for the new generator at address
+  \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \brief
+  Creates, as a closure point, the point that is the origin of the
+  zero-dimensional space \f$\Rset^0\f$.  Writes a handle for the new
+  generator at address \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_closure_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \brief
+  Builds a generator that is a copy of \p g; writes a handle
+  for the newly created generator at address \p pg.
+*/
+int
+ppl_new_Generator_from_Generator PPL_PROTO((ppl_Generator_t* pg,
+					    ppl_const_Generator_t g));
+
+/*! \brief
+  Invalidates the handle \p g: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator PPL_PROTO((ppl_const_Generator_t g));
+
+/*! \brief
+  Assigns a copy of the generator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_from_Generator PPL_PROTO((ppl_Generator_t dst,
+					       ppl_const_Generator_t src));
+
+/*! \brief
+  Writes to \p m the space dimension of \p g.
+*/
+int
+ppl_Generator_space_dimension PPL_PROTO((ppl_const_Generator_t g,
+					 ppl_dimension_type* m));
+
+/*! \brief
+  Returns the type of generator \p g.
+*/
+int
+ppl_Generator_type PPL_PROTO((ppl_const_Generator_t g));
+
+/*! \brief
+  Copies into \p n the coefficient of variable \p var in
+  generator \p g.
+*/
+int
+ppl_Generator_coefficient PPL_PROTO((ppl_const_Generator_t g,
+				     ppl_dimension_type var,
+				     ppl_Coefficient_t n));
+
+/*! \brief
+  If \p g is a point or a closure point assigns its divisor to \p n.
+*/
+int
+ppl_Generator_divisor PPL_PROTO((ppl_const_Generator_t g,
+				 ppl_Coefficient_t n));
+
+/*! \brief
+  Returns a positive integer if \p g is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p g is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Generator_OK PPL_PROTO((ppl_const_Generator_t g));
+
+/*@}*/ /* Functions Related to Generators */
+
+/*! \name Functions Related to Generator Systems */
+/*@{*/
+
+/*! \brief
+  Builds an empty system of generators and writes a handle to it at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*
+  Creates the universe zero-dimensional system of generators (i.e.,
+  containing the origin only).  Writes a handle to the new system at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System_zero_dim_univ
+PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*! \brief
+  Builds the singleton generator system containing only a copy of
+  generator \p g; writes a handle for the newly created system at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator PPL_PROTO((ppl_Generator_System_t* pgs,
+						   ppl_const_Generator_t g));
+
+/*! \brief
+  Builds a generator system that is a copy of \p gs; writes a handle
+  for the newly created system at address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Invalidates the handle \p gs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Assigns a copy of the generator system \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t dst, ppl_const_Generator_System_t src));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p gs.
+*/
+int
+ppl_Generator_System_space_dimension
+PPL_PROTO((ppl_const_Generator_System_t gs, ppl_dimension_type* m));
+
+/*! \brief
+  Removes all the generators from the generator system \p gs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Generator_System_clear PPL_PROTO((ppl_Generator_System_t gs));
+
+/*! \brief
+  Inserts a copy of the generator \p g into \p gs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Generator_System_insert_Generator PPL_PROTO((ppl_Generator_System_t gs,
+						 ppl_const_Generator_t g));
+
+/*! \brief
+  Returns a positive integer if \p gs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p gs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Generator_System_OK PPL_PROTO((ppl_const_Generator_System_t c));
+
+
+/*! \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit));
+
+/*! \brief
+  Builds a const iterator that is a copy of \p git; writes an
+  handle for the newly created const iterator at address \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit,
+	   ppl_const_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Invalidates the handle \p git: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System_const_iterator
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t dst,
+	   ppl_const_Generator_System_const_iterator_t src));
+
+/*! \brief
+  Assigns to \p git a const iterator "pointing" to the beginning of
+  the generator system \p gs.
+*/
+int
+ppl_Generator_System_begin
+PPL_PROTO((ppl_const_Generator_System_t gs,
+	   ppl_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Assigns to \p git a const iterator "pointing" past the end of the
+  generator system \p gs.
+*/
+int
+ppl_Generator_System_end
+PPL_PROTO((ppl_const_Generator_System_t gs,
+	   ppl_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Dereference \p git writing a const handle to the resulting
+  generator at address \p pg.
+*/
+int
+ppl_Generator_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git,
+	   ppl_const_Generator_t* pg));
+
+/*! \brief
+  Increment \p git so that it "points" to the next generator.
+*/
+int
+ppl_Generator_System_const_iterator_increment
+PPL_PROTO((ppl_Generator_System_const_iterator_t git));
+
+/*! \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Generator_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t x,
+	   ppl_const_Generator_System_const_iterator_t y));
+
+/*@}*/ /* Functions Related to Generator Systems */
+
+/*! \brief
+  Code of the worst-case polynomial complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+
+/*! \brief
+  Code of the worst-case exponential but typically polynomial
+  complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+
+/*! \brief
+  Code of the universal complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+/*! \brief
+  Code of the "unfeasible LP problem" status.
+*/
+extern int PPL_LP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \brief
+  Code of the "unbounded LP problem" status.
+*/
+extern int PPL_LP_PROBLEM_STATUS_UNBOUNDED;
+
+/*! \brief
+  Code of the "optimized LP problem" status.
+*/
+extern int PPL_LP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \brief
+  Code of the "maximization" optimization mode.
+*/
+extern int PPL_LP_PROBLEM_MAXIMIZATION;
+
+/*! \brief
+  Code of the "minimization" optimization mode.
+*/
+extern int PPL_LP_PROBLEM_MINIMIZATION;
+
+/*! \brief
+  Individual bit saying that the polyhedron and the set of points
+  satisfying the constraint are disjoint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
+
+/*! \brief
+  Individual bit saying that the polyhedron intersects the set of
+  points satisfying the constraint, but it is not included in it.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
+
+/*! \brief
+  Individual bit saying that the polyhedron is included in the set of
+  points satisfying the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
+
+/*! \brief
+  Individual bit saying that the polyhedron is included in the set of
+  points saturating the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_SATURATES;
+
+/*! \brief
+  Individual bit saying that adding the generator would not change the
+  polyhedron.
+*/
+extern unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+/*! \name Functions Related to Polyhedra */
+/*@{*/
+
+/*! \brief
+  Builds a universe C polyhedron of dimension \p d and writes an
+  handle to it at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+					       ppl_dimension_type d));
+
+/*! \brief
+  Builds a universe NNC polyhedron of dimension \p d and writes an
+  handle to it at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+						 ppl_dimension_type d));
+
+/*! \brief
+  Builds an empty C polyhedron of space dimension \p d and writes an
+  handle to it at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_empty_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+						     ppl_dimension_type d));
+
+/*! \brief
+  Builds an empty NNC polyhedron of space dimension \p d and writes an
+  handle to it at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_empty_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+						       ppl_dimension_type d));
+
+/*! \brief
+  Builds a C polyhedron that is a copy of \p ph; writes a handle
+  for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron PPL_PROTO((ppl_Polyhedron_t* pph,
+						  ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Builds a C polyhedron that is a copy of of the NNC polyhedron \p ph;
+  writes a handle for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Builds an NNC polyhedron that is a copy of the C polyhedron \p ph;
+  writes a handle for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Builds an NNC polyhedron that is a copy of \p ph; writes a handle
+  for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Builds a new C polyhedron from the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_C_Polyhedron_from_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Builds a new C polyhedron recycling the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  Since \p cs will be <EM>the</EM> system of constraints of the new
+  polyhedron, the space dimension is also inherited.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
+
+/*! \brief
+  Builds a new NNC polyhedron from the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Builds a new NNC polyhedron recycling the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  Since \p cs will be <EM>the</EM> system of constraints of the new
+  polyhedron, the space dimension is also inherited.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
+
+/*! \brief
+  Builds a new C polyhedron from the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p gs.
+*/
+int
+ppl_new_C_Polyhedron_from_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Builds a new C polyhedron recycling the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  Since \p gs will be <EM>the</EM> system of generators of the new
+  polyhedron, the space dimension is also inherited.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t gs));
+
+/*! \brief
+  Builds a new NNC polyhedron from the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p gs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Builds a new NNC polyhedron recycling the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  Since \p gs will be <EM>the</EM> system of generators of the new
+  polyhedron, the space dimension is also inherited.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t gs));
+
+/*! \brief
+  Builds a new C polyhedron corresponding to an interval-based
+  bounding box, writing a handle for the newly created polyhedron at
+  address \p pph.
+
+  If an interval of the bounding box is provided with any finite
+  but open bound, then the polyhedron is not built and the value
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> is returned.
+  The bounding box is accessed by using the following functions,
+  passed as arguments:
+    \code
+      ppl_dimension_type space_dimension()
+    \endcode
+    returns the dimension of the vector space enclosing the polyhedron
+    represented by the bounding box.
+    \code
+      int is_empty()
+    \endcode
+    returns 0 if and only if the bounding box describes a non-empty set.
+    The function <CODE>is_empty()</CODE> will always be called before the
+    other functions. However, if <CODE>is_empty()</CODE> does not
+    return 0, none of the functions below will be called.
+    \code
+      int get_lower_bound(ppl_dimension_type k, int closed,
+                          ppl_Coefficient_t n, ppl_Coefficient_t d)
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return 0.
+    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+    lower boundary of \f$I\f$ is open and is set to a value different
+    from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
+    assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
+    fraction \f$n/d\f$ corresponds to the greatest lower bound of
+    \f$I\f$.  The fraction \f$n/d\f$ is in canonical form if and only
+    if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
+    positive, \f$0/1\f$ being the unique representation for zero.
+    \code
+      int get_upper_bound(ppl_dimension_type k, int closed,
+                          ppl_Coefficient_t n, ppl_Coefficient_t d)
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return 0.
+    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+    upper boundary of \f$I\f$ is open and is set to a value different
+    from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
+    the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
+    \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
+*/
+int
+ppl_new_C_Polyhedron_from_bounding_box
+PPL_PROTO((ppl_Polyhedron_t* pph,
+	   ppl_dimension_type (*space_dimension)(void),
+	   int (*is_empty)(void),
+	   int (*get_lower_bound)(ppl_dimension_type k, int closed,
+				  ppl_Coefficient_t n,
+				  ppl_Coefficient_t d),
+	   int (*get_upper_bound)(ppl_dimension_type k, int closed,
+				  ppl_Coefficient_t n,
+				  ppl_Coefficient_t d)));
+
+/*! \brief
+  Builds a new NNC polyhedron corresponding to an interval-based
+  bounding box, writing a handle for the newly created polyhedron at
+  address \p pph.
+
+  The bounding box is accessed by using the following functions,
+  passed as arguments:
+    \code
+      ppl_dimension_type space_dimension()
+    \endcode
+    returns the dimension of the vector space enclosing the polyhedron
+    represented by the bounding box.
+    \code
+      int is_empty()
+    \endcode
+    returns 0 if and only if the bounding box describes a non-empty set.
+    The function <CODE>is_empty()</CODE> will always be called before the
+    other functions. However, if <CODE>is_empty()</CODE> does not
+    return 0, none of the functions below will be called.
+    \code
+      int get_lower_bound(ppl_dimension_type k, int closed,
+                          ppl_Coefficient_t n, ppl_Coefficient_t d)
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return 0.
+    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+    lower boundary of \f$I\f$ is open and is set to a value different
+    from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
+    assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
+    fraction \f$n/d\f$ corresponds to the greatest lower bound of
+    \f$I\f$.  The fraction \f$n/d\f$ is in canonical form if and only
+    if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
+    positive, \f$0/1\f$ being the unique representation for zero.
+    \code
+      int get_upper_bound(ppl_dimension_type k, int closed,
+                          ppl_Coefficient_t n, ppl_Coefficient_t d)
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return 0.
+    Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+    <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+    upper boundary of \f$I\f$ is open and is set to a value different
+    from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
+    the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
+    \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
+*/
+int
+ppl_new_NNC_Polyhedron_from_bounding_box
+PPL_PROTO((ppl_Polyhedron_t* pph,
+	   ppl_dimension_type (*space_dimension)(void),
+	   int (*is_empty)(void),
+	   int (*get_lower_bound)(ppl_dimension_type k, int closed,
+				  ppl_Coefficient_t n,
+				  ppl_Coefficient_t d),
+	   int (*get_upper_bound)(ppl_dimension_type k, int closed,
+				  ppl_Coefficient_t n,
+				  ppl_Coefficient_t d)));
+
+/*! \brief
+  Assigns a copy of the C polyhedron \p src to the C polyhedron \p dst.
+*/
+int
+ppl_assign_C_Polyhedron_from_C_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
+
+/*! \brief
+  Assigns a copy of the NNC polyhedron \p src to the NNC
+  polyhedron \p dst.
+*/
+int
+ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
+
+/*! \brief
+  Invalidates the handle \p ph: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p ph.
+*/
+int
+ppl_Polyhedron_space_dimension PPL_PROTO((ppl_const_Polyhedron_t ph,
+					  ppl_dimension_type* m));
+
+/*! \brief
+  Writes to \p m the affine dimension of \p ph (not to be confused with the
+  dimension of its enclosing vector space) or 0, if \p ph is empty.
+*/
+int
+ppl_Polyhedron_affine_dimension PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Writes a const handle to the constraint system defining the
+  polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_constraints PPL_PROTO((ppl_const_Polyhedron_t ph,
+				      ppl_const_Constraint_System_t* pcs));
+
+/*! \brief
+  Writes a const handle to the minimized constraint system defining the
+  polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_minimized_constraints
+PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs));
+
+/*! \brief
+  Writes a const handle to the generator system defining the
+  polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_generators PPL_PROTO((ppl_const_Polyhedron_t ph,
+				     ppl_const_Generator_System_t* pgs));
+
+/*! \brief
+  Writes a const handle to the minimized generator system defining the
+  polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_minimized_generators
+PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs));
+
+/*! \brief
+  Checks the relation between the polyhedron \p ph and the constraint \p c.
+
+  If successful, returns a non-negative integer that is
+  obtained as the bitwise or of the bits (chosen among
+  PPL_POLY_CON_RELATION_IS_DISJOINT
+  PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS,
+  PPL_POLY_CON_RELATION_IS_INCLUDED, and
+  PPL_POLY_CON_RELATION_SATURATES) that describe the relation between
+  \p ph and \p c.
+*/
+int
+ppl_Polyhedron_relation_with_Constraint PPL_PROTO((ppl_const_Polyhedron_t ph,
+						   ppl_const_Constraint_t c));
+
+/*! \brief
+  Checks the relation between the polyhedron \p ph and the generator \p g.
+
+  If successful, returns a non-negative integer that is
+  obtained as the bitwise or of the bits (only
+  PPL_POLY_GEN_RELATION_SUBSUMES, at present) that describe the
+  relation between \p ph and \p g.
+*/
+int
+ppl_Polyhedron_relation_with_Generator PPL_PROTO((ppl_const_Polyhedron_t ph,
+						  ppl_const_Generator_t g));
+
+/*! \brief
+  Use \p ph to shrink a generic, interval-based bounding box.
+  The bounding box is abstractly provided by means of the parameters.
+
+  \param ph
+  The polyhedron that is used to shrink the bounding box;
+
+  \param complexity
+  The code of the complexity class of the algorithm to be used.
+  Must be one of PPL_COMPLEXITY_CLASS_POLYNOMIAL,
+  PPL_COMPLEXITY_CLASS_SIMPLEX, or PPL_COMPLEXITY_CLASS_ANY;
+
+  \param set_empty
+  A pointer to a void function with no arguments that causes the bounding
+  box to become empty, i.e., to represent the empty set;
+
+  \param raise_lower_bound
+  A pointer to a void function with arguments
+  <CODE>(ppl_dimension_type k, int closed,
+         ppl_const_Coefficient_t n, ppl_const_Coefficient_t d)</CODE>
+  that intersects the interval corresponding to the <CODE>k</CODE>-th
+  space dimension with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is non-zero,
+  with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is zero.
+  The fraction \f$n/d\f$ is in canonical form, that is, \f$n\f$
+  and \f$d\f$ have no common factors and \f$d\f$ is positive, \f$0/1\f$
+  being the unique representation for zero;
+
+  \param lower_upper_bound
+  a pointer to a void function with argument
+  <CODE>(ppl_dimension_type k, int closed,
+         ppl_const_Coefficient_t n, ppl_const_Coefficient_t d)</CODE>
+  that intersects the interval corresponding to the <CODE>k</CODE>-th
+  space dimension with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is non-zero,
+  with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE> is zero.
+  The fraction \f$n/d\f$ is in canonical form.
+*/
+int
+ppl_Polyhedron_shrink_bounding_box
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+	   unsigned int complexity,
+	   void (*set_empty)(void),
+	   void (*raise_lower_bound)(ppl_dimension_type k, int closed,
+				     ppl_const_Coefficient_t n,
+				     ppl_const_Coefficient_t d),
+	   void (*lower_upper_bound)(ppl_dimension_type k, int closed,
+				     ppl_const_Coefficient_t n,
+				     ppl_const_Coefficient_t d)));
+
+/*! \brief
+  Returns a positive integer if \p ph is empty; returns 0 if \p ph is
+  not empty.
+*/
+int
+ppl_Polyhedron_is_empty PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Returns a positive integer if \p ph is a universe polyhedron;
+  returns 0 if it is not.
+*/
+int
+ppl_Polyhedron_is_universe PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Returns a positive integer if \p ph is bounded; returns 0 if \p ph is
+  unbounded.
+*/
+int
+ppl_Polyhedron_is_bounded PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Returns a positive integer if \p le is bounded from above in \p ph;
+  returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_bounds_from_above PPL_PROTO((ppl_const_Polyhedron_t ph,
+					    ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Returns a positive integer if \p le is bounded from below in \p ph;
+  returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_bounds_from_below PPL_PROTO((ppl_const_Polyhedron_t ph,
+					    ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Returns a positive integer if \p ph is not empty
+  and \p le is bounded from above in \p ph, in which case
+  the supremum value and a point where \p le reaches it are computed.
+
+  \param ph
+  The polyhedron constraining \p le;
+
+  \param le
+  The linear expression to be maximized subject to \p ph;
+
+  \param sup_n
+  Will be assigned the numerator of the supremum value;
+
+  \param sup_d
+  Will be assigned the denominator of the supremum value;
+
+  \param pmaximum
+  Will store 1 in this location if the supremum is also the maximum,
+  will store 0 otherwise;
+
+  \param point
+  Will be assigned the point or closure point where \p le reaches the
+  extremum value.
+
+  If \p ph is empty or \p le is not bounded from above,
+  0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
+  will be left untouched.
+*/
+int
+ppl_Polyhedron_maximize PPL_PROTO((ppl_const_Polyhedron_t ph,
+				   ppl_const_Linear_Expression_t le,
+				   ppl_Coefficient_t sup_n,
+				   ppl_Coefficient_t sup_d,
+				   int* pmaximum,
+				   ppl_Generator_t point));
+
+/*! \brief
+  Returns a positive integer if  \p ph is not empty
+  and \p le is bounded from below in \p ph, in which case
+  the infimum value and a point where \p le reaches it are computed.
+
+  \param ph
+  The polyhedron constraining \p le;
+
+  \param le
+  The linear expression to be minimized subject to \p ph;
+
+  \param inf_n
+  Will be assigned the numerator of the infimum value;
+
+  \param inf_d
+  Will be assigned the denominator of the infimum value;
+
+  \param pminimum
+  Will store 1 in this location if the infimum is also the minimum,
+  will store 0 otherwise;
+
+  \param point
+  Will be assigned the point or closure point where \p le reaches the
+  extremum value.
+
+  If \p ph is empty or \p le is not bounded from below,
+  0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
+  will be left untouched.
+*/
+int
+ppl_Polyhedron_minimize PPL_PROTO((ppl_const_Polyhedron_t ph,
+				   ppl_const_Linear_Expression_t le,
+				   ppl_Coefficient_t inf_n,
+				   ppl_Coefficient_t inf_d,
+				   int* pminimum,
+				   ppl_Generator_t point));
+
+/*! \brief
+  Returns a positive integer if \p ph is topologically closed;
+  returns 0 if \p ph is not topologically closed.
+*/
+int
+ppl_Polyhedron_is_topologically_closed PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Returns a positive integer if \p x contains or is equal to \p y;
+  returns 0 if it does not.
+*/
+int
+ppl_Polyhedron_contains_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t x,
+					      ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Returns a positive integer if \p x strictly contains \p y; returns 0
+  if it does not.
+*/
+int
+ppl_Polyhedron_strictly_contains_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Returns a positive integer if \p x and \p y are disjoint; returns 0
+  if they are not.
+*/
+int
+ppl_Polyhedron_is_disjoint_from_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Returns a positive integer if \p x and \p y are the same polyhedron;
+  returns 0 if they are different.
+
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value 0 is returned.
+*/
+int
+ppl_Polyhedron_equals_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t x,
+					    ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Returns a positive integer if \p ph is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p ph is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Polyhedron_OK PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+  Adds a copy of the constraint \p c to the system of constraints of
+  \p ph.
+*/
+int
+ppl_Polyhedron_add_constraint PPL_PROTO((ppl_Polyhedron_t ph,
+					 ppl_const_Constraint_t c));
+
+/*! \brief
+  Adds a copy of the constraint \p c to the system of constraints of
+  \p ph.  Returns a positive integer if the resulting polyhedron is
+  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
+  is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_constraint_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Constraint_t c));
+
+/*! \brief
+  Adds a copy of the generator \p g to the system of generators of
+  \p ph.
+*/
+int
+ppl_Polyhedron_add_generator PPL_PROTO((ppl_Polyhedron_t ph,
+					ppl_const_Generator_t g));
+
+/*! \brief
+  Adds a copy of the generator \p g to the system of generators of
+  \p ph.  Returns a positive integer if the resulting polyhedron is
+  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
+  is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_generator_and_minimize PPL_PROTO((ppl_Polyhedron_t ph,
+						     ppl_const_Generator_t g));
+
+/*! \brief
+  Adds a copy of the system of constraints \p cs to the system of
+  constraints of \p ph.
+*/
+int
+ppl_Polyhedron_add_constraints PPL_PROTO((ppl_Polyhedron_t ph,
+					  ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Adds a copy of the system of constraints \p cs to the system of
+  constraints of \p ph.  Returns a positive integer if the resulting
+  polyhedron is non-empty; returns 0 if it is empty.  Upon successful
+  return, \p ph is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_constraints_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Adds a copy of the system of generators \p gs to the system of
+  generators of \p ph.
+*/
+int
+ppl_Polyhedron_add_generators PPL_PROTO((ppl_Polyhedron_t ph,
+					 ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Adds a copy of the system of generators \p gs to the system of
+  generators of \p ph.  Returns a positive integer if the resulting
+  polyhedron is non-empty; returns 0 if it is empty.  Upon successful
+  return, \p ph is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_generators_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs));
+
+/*! \brief
+  Adds the system of constraints \p cs to the system of constraints of
+  \p ph.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_constraints
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_Constraint_System_t cs));
+
+/*! \brief
+  Adds the system of constraints \p cs to the system of constraints of
+  \p ph.  Returns a positive integer if the resulting polyhedron is
+  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
+  is guaranteed to be minimized.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_constraints_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_Constraint_System_t cs));
+
+/*! \brief
+  Adds the system of generators \p gs to the system of generators of
+  \p ph.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_generators PPL_PROTO((ppl_Polyhedron_t ph,
+						  ppl_Generator_System_t gs));
+
+/*! \brief
+  Adds the system of generators \p gs to the system of generators of
+  \p ph.  Returns a positive integer if the resulting polyhedron is
+  non-empty; returns 0 if it is empty.  Upon successful return, \p ph
+  is guaranteed to be minimized.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_generators_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_Generator_System_t gs));
+
+/*! \brief
+  Intersects \p x with polyhedron \p y and assigns the result to \p x.
+*/
+int
+ppl_Polyhedron_intersection_assign PPL_PROTO((ppl_Polyhedron_t x,
+					      ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Intersects \p x with polyhedron \p y and assigns the result to \p x.
+  Returns a positive integer if the resulting polyhedron is non-empty;
+  returns 0 if it is empty.  Upon successful return, \p x is also
+  guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_intersection_assign_and_minimize
+PPL_PROTO((ppl_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Assigns to \p x the poly-hull of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_hull_assign PPL_PROTO((ppl_Polyhedron_t x,
+					   ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Assigns to \p x the poly-hull of \p x and \p y. Returns a positive
+  integer if the resulting polyhedron is non-empty; returns 0 if it is
+  empty. Upon successful return, \p x is also guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_poly_hull_assign_and_minimize
+PPL_PROTO((ppl_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Assigns to \p x the \ref Convex_Polyhedral_Difference "poly-difference"
+  of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_difference_assign PPL_PROTO((ppl_Polyhedron_t x,
+						 ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Transforms the polyhedron \p ph, assigning an affine expression
+  to the specified variable.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable to which the affine expression is assigned;
+
+  \param le
+  The numerator of the affine expression;
+
+  \param d
+  The denominator of the affine expression.
+*/
+int
+ppl_Polyhedron_affine_image PPL_PROTO((ppl_Polyhedron_t ph,
+				       ppl_dimension_type var,
+				       ppl_const_Linear_Expression_t le,
+				       ppl_const_Coefficient_t d));
+
+/*! \brief
+  Transforms the polyhedron \p ph, substituting an affine expression
+  to the specified variable.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable to which the affine expression is substituted;
+
+  \param le
+  The numerator of the affine expression;
+
+  \param d
+  The denominator of the affine expression.
+*/
+int
+ppl_Polyhedron_affine_preimage PPL_PROTO((ppl_Polyhedron_t ph,
+					  ppl_dimension_type var,
+					  ppl_const_Linear_Expression_t le,
+					  ppl_const_Coefficient_t d));
+
+/*! \brief
+  Assigns to \p ph the image of \p ph with respect to the
+  \ref Generalized_Affine_Relations "generalized affine transfer relation"
+  \f$\frac{\mathrm{lb}}{\mathrm{d}}
+       \leq \mathrm{var}'
+         \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable bounded by the generalized affine transfer relation;
+
+  \param lb
+  The numerator of the lower bounding affine expression;
+
+  \param ub
+  The numerator of the upper bounding affine expression;
+
+  \param d
+  The (common) denominator of the lower and upper bounding affine expressions.
+*/
+int
+ppl_Polyhedron_bounded_affine_image
+PPL_PROTO((ppl_Polyhedron_t ph,
+	   ppl_dimension_type var,
+	   ppl_const_Linear_Expression_t lb,
+	   ppl_const_Linear_Expression_t ub,
+	   ppl_const_Coefficient_t d));
+
+/*! \brief
+  Assigns to \p ph the preimage of \p ph with respect to the
+  \ref Generalized_Affine_Relations "generalized affine transfer relation"
+  \f$\frac{\mathrm{lb}}{\mathrm{d}}
+       \leq \mathrm{var}'
+         \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable bounded by the generalized affine transfer relation;
+
+  \param lb
+  The numerator of the lower bounding affine expression;
+
+  \param ub
+  The numerator of the upper bounding affine expression;
+
+  \param d
+  The (common) denominator of the lower and upper bounding affine expressions.
+*/
+int
+ppl_Polyhedron_bounded_affine_preimage
+PPL_PROTO((ppl_Polyhedron_t ph,
+	   ppl_dimension_type var,
+	   ppl_const_Linear_Expression_t lb,
+	   ppl_const_Linear_Expression_t ub,
+	   ppl_const_Coefficient_t d));
+
+/*! \brief
+  Assigns to \p ph the image of \p ph with respect to the
+  \ref Generalized_Affine_Relations "generalized affine transfer relation"
+  \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
+  where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+  by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The left hand side variable of the generalized affine transfer relation;
+
+  \param relsym
+  The relation symbol;
+
+  \param le
+  The numerator of the right hand side affine expression;
+
+  \param d
+  The denominator of the right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_image
+PPL_PROTO((ppl_Polyhedron_t ph,
+	   ppl_dimension_type var,
+	   enum ppl_enum_Constraint_Type relsym,
+	   ppl_const_Linear_Expression_t le,
+	   ppl_const_Coefficient_t d));
+
+/*! \brief
+  Assigns to \p ph the preimage of \p ph with respect to the
+  \ref Generalized_Affine_Relations "generalized affine transfer relation"
+  \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
+  where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+  by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The left hand side variable of the generalized affine transfer relation;
+
+  \param relsym
+  The relation symbol;
+
+  \param le
+  The numerator of the right hand side affine expression;
+
+  \param d
+  The denominator of the right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_preimage
+PPL_PROTO((ppl_Polyhedron_t ph,
+	   ppl_dimension_type var,
+	   enum ppl_enum_Constraint_Type relsym,
+	   ppl_const_Linear_Expression_t le,
+	   ppl_const_Coefficient_t d));
+
+/*! \brief
+  Assigns to \p ph the image of \p ph with respect to the
+  \ref Generalized_Affine_Relations "generalized affine transfer relation"
+  \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+  \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param lhs
+  The left hand side affine expression;
+
+  \param relsym
+  The relation symbol;
+
+  \param rhs
+  The right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Polyhedron_t ph,
+	   ppl_const_Linear_Expression_t lhs,
+	   enum ppl_enum_Constraint_Type relsym,
+	   ppl_const_Linear_Expression_t rhs));
+
+/*! \brief
+  Assigns to \p ph the preimage of \p ph with respect to the
+  \ref Generalized_Affine_Relations "generalized affine transfer relation"
+  \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+  \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param lhs
+  The left hand side affine expression;
+
+  \param relsym
+  The relation symbol;
+
+  \param rhs
+  The right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Polyhedron_t ph,
+	   ppl_const_Linear_Expression_t lhs,
+	   enum ppl_enum_Constraint_Type relsym,
+	   ppl_const_Linear_Expression_t rhs));
+
+/*! \brief
+  Assigns to \p x the \ref Time_Elapse_Operator "time-elapse" between
+  the polyhedra \p x and \p y.
+*/
+int
+ppl_Polyhedron_time_elapse_assign PPL_PROTO((ppl_Polyhedron_t x,
+					     ppl_const_Polyhedron_t y));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+  \p x and \p y.  If \p tp is not the null pointer, the
+  \ref Widening_with_Tokens "widening with tokens" delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   unsigned* tp));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+  \p x and \p y.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign PPL_PROTO((ppl_Polyhedron_t x,
+						 ppl_const_Polyhedron_t y));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x.  If \p tp is not the null pointer,
+  the \ref Widening_with_Tokens "widening with tokens" delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs,
+	   unsigned* tp));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p
+  x. If \p tp is not the null pointer,
+  the \ref Widening_with_Tokens "widening with tokens" delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs,
+	   unsigned* tp));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+  and \p y.  If \p tp is not the null pointer, the
+  \ref Widening_with_Tokens "widening with tokens" delay technique is
+  applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_H79_widening_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   unsigned* tp));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+  and \p y.
+*/
+int
+ppl_Polyhedron_H79_widening_assign PPL_PROTO((ppl_Polyhedron_t x,
+					      ppl_const_Polyhedron_t y));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x. If \p tp is not the null
+  pointer, the \ref Widening_with_Tokens "widening with tokens" delay
+  technique is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs,
+	   unsigned* tp));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+  If \p tp is not the null pointer,
+  the \ref Widening_with_Tokens "widening with tokens" delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs,
+	   unsigned* tp));
+
+/*! \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p
+  x.
+*/
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+	   ppl_const_Polyhedron_t y,
+	   ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Assigns to \p ph its topological closure.
+*/
+int
+ppl_Polyhedron_topological_closure_assign PPL_PROTO((ppl_Polyhedron_t ph));
+
+/*! \brief
+  Adds \p d new dimensions to the space enclosing the polyhedron \p ph
+  and to \p ph itself.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
+
+/*! \brief
+  Adds \p d new dimensions to the space enclosing the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_project
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
+
+/*! \brief
+  Seeing a polyhedron as a set of tuples (its points), assigns
+  to \p x all the tuples that can be obtained by concatenating,
+  in the order given, a tuple of \p x with a tuple of \p y.
+*/
+int
+ppl_Polyhedron_concatenate_assign PPL_PROTO((ppl_Polyhedron_t x,
+					     ppl_const_Polyhedron_t y));
+
+/*! \brief
+  Removes from the vector space enclosing \p ph the space dimensions that
+  are specified in first \p n positions of the array \p ds.  The presence
+  of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_Polyhedron_remove_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
+						  ppl_dimension_type ds[],
+						  size_t n));
+
+/*! \brief
+  Removes the higher dimensions from the vector space enclosing \p ph
+  so that, upon successful return, the new space dimension is \p d.
+*/
+int
+ppl_Polyhedron_remove_higher_space_dimensions
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
+
+/*! \brief
+  Remaps the dimensions of the vector space according to a
+  \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+  This function is specified by means of the \p maps array,
+  which has \p n entries.
+
+  The partial function is defined on dimension <CODE>i</CODE>
+  if <CODE>i < n</CODE> and <CODE>maps[i] != ppl_not_a_dimension</CODE>;
+  otherwise it is undefined on dimension <CODE>i</CODE>.
+  If the function is defined on dimension <CODE>i</CODE>, then dimension
+  <CODE>i</CODE> is mapped onto dimension <CODE>maps[i]</CODE>.
+
+  The result is undefined if \p maps does not encode a partial
+  function with the properties described in the
+  \ref Mapping_the_Dimensions_of_the_Vector_Space
+  "specification of the mapping operator".
+*/
+int
+ppl_Polyhedron_map_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
+					       ppl_dimension_type maps[],
+					       size_t n));
+
+/*! \brief
+  \ref expand_space_dimension "Expands" the \f$d\f$-th dimension of
+  the vector space enclosing \p ph to \p m new space dimensions.
+*/
+int
+ppl_Polyhedron_expand_space_dimension PPL_PROTO((ppl_Polyhedron_t ph,
+						 ppl_dimension_type d,
+						 ppl_dimension_type m));
+
+/*! \brief
+  Modifies \p ph by \ref fold_space_dimensions "folding" the
+  space dimensions contained in the first \p n positions of the array \p ds
+  into dimension \p d.  The presence of duplicates in \p ds is a waste
+  but an innocuous one.
+*/
+int
+ppl_Polyhedron_fold_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
+						ppl_dimension_type ds[],
+						size_t n,
+						ppl_dimension_type d));
+
+/*@}*/ /* Functions Related to Polyhedra */
+
+
+/*! \name Functions Related to LP Problems */
+/*@{*/
+
+/*! \brief
+  Builds a trivial LP problem and writes a handle to it at address \p plp.
+*/
+int
+ppl_new_LP_Problem_trivial PPL_PROTO((ppl_LP_Problem_t* plp));
+
+/*! \brief
+  Builds an LP problem having feasible region \p cs, objective function
+  \p le and optimization mode \p m; writes a handle to it at address \p plp.
+*/
+int
+ppl_new_LP_Problem PPL_PROTO((ppl_LP_Problem_t* plp,
+			      ppl_const_Constraint_System_t cs,
+			      ppl_const_Linear_Expression_t le,
+			      int m));
+
+/*! \brief
+  Builds an LP problem that is a copy of \p lp; writes a handle
+  for the newly created system at address \p plp.
+*/
+int
+ppl_new_LP_Problem_from_LP_Problem
+PPL_PROTO((ppl_LP_Problem_t* plp, ppl_const_LP_Problem_t lp));
+
+/*! \brief
+  Invalidates the handle \p lp: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_LP_Problem PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+  Assigns a copy of the LP problem \p src to \p dst.
+*/
+int
+ppl_assign_LP_Problem_from_LP_Problem
+PPL_PROTO((ppl_LP_Problem_t dst, ppl_const_LP_Problem_t src));
+
+/*! \brief
+  Writes to \p m the dimension of the vector space enclosing \p lp.
+*/
+int
+ppl_LP_Problem_space_dimension
+PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_dimension_type* m));
+
+/*! \brief
+  Writes a const handle to the constraint system defining the
+  feasible region of the LP problem \p lp at address \p pcs.
+*/
+int
+ppl_LP_Problem_constraints PPL_PROTO((ppl_const_LP_Problem_t lp,
+				      ppl_const_Constraint_System_t* pcs));
+
+/*! \brief
+  Writes a const handle to the linear expression defining the
+  objective function of the LP problem \p lp at address \p ple.
+*/
+int
+ppl_LP_Problem_objective_function
+PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_const_Linear_Expression_t* ple));
+
+/*! \brief
+  Returns the optimization mode of the LP problem \p lp.
+*/
+int
+ppl_LP_Problem_optimization_mode PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+  Resets the LP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_LP_Problem_clear PPL_PROTO((ppl_LP_Problem_t lp));
+
+/*! \brief
+  Modifies the feasible region of the LP problem \p lp by adding a copy
+  of the constraint \p c; the space dimension is increased, if necessary.
+*/
+int
+ppl_LP_Problem_add_constraint PPL_PROTO((ppl_LP_Problem_t lp,
+					 ppl_const_Constraint_t c));
+
+/*! \brief
+  Modifies the feasible region of the LP problem \p lp by adding a copy
+  of the constraints in \p cs; the space dimension is increased, if necessary.
+*/
+int
+ppl_LP_Problem_add_constraints PPL_PROTO((ppl_LP_Problem_t lp,
+					  ppl_const_Constraint_System_t cs));
+
+/*! \brief
+  Sets the objective function of the LP problem \p lp to a copy of \p le.
+*/
+int
+ppl_LP_Problem_set_objective_function
+PPL_PROTO((ppl_LP_Problem_t lp, ppl_const_Linear_Expression_t le));
+
+/*! \brief
+  Sets the optimization mode of the LP problem \p lp to \p mode.
+*/
+int
+ppl_LP_Problem_set_optimization_mode PPL_PROTO((ppl_LP_Problem_t lp,
+						int mode));
+
+/*! \brief
+  Returns a positive integer if \p lp is satisfiable; returns 0 otherwise.
+*/
+int
+ppl_LP_Problem_is_satisfiable PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+  Solves the LP problem \p lp, returning an exit status.
+
+  \return
+  <CODE>PPL_LP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the LP problem
+  is not satisfiable;
+  <CODE>PPL_LP_PROBLEM_STATUS_UNBOUNDED</CODE> if the LP problem
+  is satisfiable but there is no finite bound to the value of
+  the objective function;
+  <CODE>PPL_LP_PROBLEM_STATUS_OPTIMIZED</CODE> if the LP problem
+  admits an optimal solution.
+*/
+int
+ppl_LP_Problem_solve PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+  Evaluates the objective function of \p lp on point \p g.
+
+  \param lp
+  The LP problem defining the objective function;
+
+  \param g
+  The generator on which the objective function will be evaluated;
+
+  \param num
+  Will be assigned the numerator of the objective function value;
+
+  \param den
+  Will be assigned the denominator of the objective function value;
+*/
+int
+ppl_LP_Problem_evaluate_objective_function
+PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_const_Generator_t g,
+	   ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \brief
+  Writes a const handle to a feasible point for the LP problem \p lp
+  at address \p pg.
+*/
+int
+ppl_LP_Problem_feasible_point PPL_PROTO((ppl_const_LP_Problem_t lp,
+					 ppl_const_Generator_t* pg));
+
+/*! \brief
+  Writes a const handle to an optimizing point for the LP problem \p lp
+  at address \p pg.
+*/
+int
+ppl_LP_Problem_optimizing_point PPL_PROTO((ppl_const_LP_Problem_t lp,
+					   ppl_const_Generator_t* pg));
+
+/*! \brief
+  Returns the optimal value for \p lp.
+
+  \param lp
+  The LP problem;
+
+  \param num
+  Will be assigned the numerator of the optimal value;
+
+  \param den
+  Will be assigned the denominator of the optimal value.
+*/
+int
+ppl_LP_Problem_optimal_value
+PPL_PROTO((ppl_const_LP_Problem_t lp,
+	   ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \brief
+  Returns a positive integer if \p lp is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p lp is broken.  Useful for debugging purposes.
+*/
+int
+ppl_LP_Problem_OK PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*@}*/ /* Functions Related to LP Problems */
+
+
+/*! \name Simple I/O Functions */
+/*@{*/
+
+/*! \brief Pretty-prints \p var to <CODE>stdout</CODE>. */
+int
+ppl_io_print_variable PPL_PROTO((ppl_dimension_type var));
+
+/*! \brief Pretty-prints \p var to the given output \p stream. */
+int
+ppl_io_fprint_variable PPL_PROTO((FILE* stream, ppl_dimension_type var));
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+
+#define PPL_DECLARE_PRINT_FUNCTIONS(Type) \
+/*! \brief Prints \p x to <CODE>stdout</CODE>. */ \
+int \
+ppl_io_print_ ## Type PPL_PROTO((ppl_const_ ## Type ## _t x)); \
+ \
+/*! \brief Prints \p x to the given output \p stream. */ \
+int \
+ppl_io_fprint_ ## Type PPL_PROTO((FILE* stream, ppl_const_ ## Type ## _t x));
+
+PPL_DECLARE_PRINT_FUNCTIONS(Coefficient)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Linear_Expression)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Constraint)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Constraint_System)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Generator)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Generator_System)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Polyhedron)
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+
+/*! \brief
+  The type of output functions used for printing variables.
+
+  An output function for variables must write a textual representation
+  for \p var to a character buffer, null-terminate it, and return a
+  pointer to the beginning of the buffer.  In case the operation fails,
+  0 should be returned and perhaps <CODE>errno</CODE> should be set
+  in a meaningful way.  The library does nothing with the buffer, besides
+  printing its contents.
+*/
+typedef const char*
+ppl_io_variable_output_function_type(ppl_dimension_type var);
+
+/*! \brief
+  Sets the output function to be used for printing variables to \p p.
+*/
+int
+ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p);
+
+/*! \brief
+  Writes a pointer to the current variable output function to \p pp.
+*/
+int
+ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp);
+
+/*@}*/ /* Simple I/O Functions */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#undef PPL_PROTO
+
+/*@}*/ /* \defgroup PPL_C_interface */
+
+#endif /* !defined(PPL_ppl_c_h) */
diff --git a/interfaces/Makefile.am b/interfaces/Makefile.am
new file mode 100644
index 0000000..e133934
--- /dev/null
+++ b/interfaces/Makefile.am
@@ -0,0 +1,23 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SUBDIRS = C Prolog
diff --git a/interfaces/Makefile.in b/interfaces/Makefile.in
new file mode 100644
index 0000000..4c864c6
--- /dev/null
+++ b/interfaces/Makefile.in
@@ -0,0 +1,594 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+SUBDIRS = C Prolog
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+	clean clean-generic clean-libtool clean-recursive ctags \
+	ctags-recursive distclean distclean-generic distclean-libtool \
+	distclean-recursive distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic maintainer-clean-recursive \
+	mostlyclean mostlyclean-generic mostlyclean-libtool \
+	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/Ciao/Makefile.am b/interfaces/Prolog/Ciao/Makefile.am
new file mode 100644
index 0000000..c3871b1
--- /dev/null
+++ b/interfaces/Prolog/Ciao/Makefile.am
@@ -0,0 +1,168 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+abs_srcdir = @abs_srcdir@
+
+EXTRA_DIST = ppl_ciao.pl ciao_clpq.pl ciao_clpq2.pl ciao_pl_check.pl
+
+if BUILD_CIAO_PROLOG_INTERFACE
+if ENABLE_SHARED
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog/src \
+ at extra_includes@
+
+pkglib_LTLIBRARIES = libppl_ciao.la
+libppl_ciao_la_SOURCES = ppl_ciao.cc
+libppl_ciao_la_LIBADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/Watchdog/src/libpwl.la \
+ at extra_libraries@
+libppl_ciao_la_LDFLAGS = -module -avoid-version
+
+pkglib_DATA = ppl_ciao.po
+
+ppl_ciao.po: ppl_ciao.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/ppl_ciao.pl .; \
+	fi
+	ciaoc -c ppl_ciao.pl
+
+# All the invocations of `ciaoc' to build `ciao_pl_check', `ciao_clpq'
+# and `ciao_clpq2' will try to build identical glue files (e.g.,
+# `ppl_ciao_LINUXi86.so').  On parallel builds, this may cause errors.
+# This is why we make `ciao_clpq' and `ciao_clpq2' depend on `ciao_pl_check':
+# building the latter will build the glue files once and for all;  after
+# that, `ciao_clpq' and `ciao_clpq2' can be built in parallel.
+ciao_pl_check: .libs/libppl_ciao.so ppl_ciao.po ciao_pl_check.pl ../tests/pl_check.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/ciao_pl_check.pl .; \
+	fi
+	cp -f $(srcdir)/../tests/pl_check.pl .
+	ciaoc -o $@ ciao_pl_check.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f ciao_pl_check.pl; \
+	fi
+	rm -f pl_check.pl
+
+ciao_clpq: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq.pl | ciao_pl_check
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/ciao_clpq.pl .; \
+	fi
+	cp -f $(srcdir)/../tests/clpq.pl .
+	ciaoc -o $@ ciao_clpq.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f ciao_clpq.pl; \
+	fi
+	rm -f clpq.pl
+
+ciao_clpq2: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq2.pl | ciao_pl_check
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/ciao_clpq2.pl .; \
+	fi
+	cp -f $(srcdir)/../tests/clpq2.pl .
+	ciaoc -o $@ ciao_clpq2.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f ciao_clpq2.pl; \
+	fi
+	rm -f clpq2.pl
+
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test
+
+pl_check_test: ciao_pl_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK)
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		-dlopen libppl_ciao.la \
+		./ciao_pl_check \
+			 >obtained_pchk
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ) 
+	LANG=C; \
+	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+	GLOBALSTKSIZE=1000000 \
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		-dlopen libppl_ciao.la \
+		./ciao_clpq \
+			<$(srcdir)/../tests/script_clpq >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: ciao_clpq2$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq2 $(EXPECTED_CLPQ2)
+	LANG=C; \
+	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+	GLOBALSTKSIZE=100000 \
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		-dlopen libppl_ciao.la \
+		./ciao_clpq2 \
+			<$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+MOSTLYCLEANFILES = \
+*.itf *.po *.c *.so \
+ciao_clpq ciao_clpq2 ciao_pl_check \
+obtained_clpq obtained_clpq2 obtained_pchk \
+$(CLPQ_TESTS)
+
+mostlyclean-local:
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f ppl_ciao.pl; \
+	fi
+
+endif ENABLE_SHARED
+endif BUILD_CIAO_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/Ciao/Makefile.in b/interfaces/Prolog/Ciao/Makefile.in
new file mode 100644
index 0000000..7d6ae06
--- /dev/null
+++ b/interfaces/Prolog/Ciao/Makefile.in
@@ -0,0 +1,734 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog/Ciao
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"
+pkglibLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at libppl_ciao_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
+am__libppl_ciao_la_SOURCES_DIST = ppl_ciao.cc
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_libppl_ciao_la_OBJECTS = ppl_ciao.lo
+libppl_ciao_la_OBJECTS = $(am_libppl_ciao_la_OBJECTS)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_libppl_ciao_la_rpath =  \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	-rpath \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(pkglibdir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_ciao_la_SOURCES)
+DIST_SOURCES = $(am__libppl_ciao_la_SOURCES_DIST)
+pkglibDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkglib_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+abs_srcdir = @abs_srcdir@
+EXTRA_DIST = ppl_ciao.pl ciao_clpq.pl ciao_clpq2.pl ciao_pl_check.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at AM_CPPFLAGS = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_builddir)/src \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_builddir)/Watchdog/src \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@extra_includes@
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_LTLIBRARIES = libppl_ciao.la
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at libppl_ciao_la_SOURCES = ppl_ciao.cc
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at libppl_ciao_la_LIBADD = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@extra_libraries@
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at libppl_ciao_la_LDFLAGS = -module -avoid-version
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_DATA = ppl_ciao.po
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS_NONSTRICT = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ack.clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ackn.clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at fib.clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at mc91.clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at smm.clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at sumto.clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at tak.clpq
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS_STRICT = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at schedule.clpq
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at MOSTLYCLEANFILES = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@*.itf *.po *.c *.so \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ciao_clpq ciao_clpq2 ciao_pl_check \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at obtained_clpq obtained_clpq2 obtained_pchk \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(CLPQ_TESTS)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Prolog/Ciao/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Prolog/Ciao/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    f=$(am__strip_dir) \
+	    echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	    $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	  else :; fi; \
+	done
+
+uninstall-pkglibLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  p=$(am__strip_dir) \
+	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+	done
+
+clean-pkglibLTLIBRARIES:
+	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+libppl_ciao.la: $(libppl_ciao_la_OBJECTS) $(libppl_ciao_la_DEPENDENCIES) 
+	$(CXXLINK) $(am_libppl_ciao_la_rpath) $(libppl_ciao_la_LDFLAGS) $(libppl_ciao_la_OBJECTS) $(libppl_ciao_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ciao.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-pkglibDATA: $(pkglib_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	@list='$(pkglib_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+uninstall-pkglibDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+ at BUILD_CIAO_PROLOG_INTERFACE_FALSE@check-local:
+ at ENABLE_SHARED_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+ at BUILD_CIAO_PROLOG_INTERFACE_FALSE@mostlyclean-local:
+ at ENABLE_SHARED_FALSE@mostlyclean-local:
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-pkglibDATA install-pkglibLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool mostlyclean-local
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkglibDATA \
+	uninstall-pkglibLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+	clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-pkglibDATA \
+	install-pkglibLTLIBRARIES install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
+	pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am \
+	uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_ciao.po: ppl_ciao.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	  cp -f $(srcdir)/ppl_ciao.pl .; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	ciaoc -c ppl_ciao.pl
+
+# All the invocations of `ciaoc' to build `ciao_pl_check', `ciao_clpq'
+# and `ciao_clpq2' will try to build identical glue files (e.g.,
+# `ppl_ciao_LINUXi86.so').  On parallel builds, this may cause errors.
+# This is why we make `ciao_clpq' and `ciao_clpq2' depend on `ciao_pl_check':
+# building the latter will build the glue files once and for all;  after
+# that, `ciao_clpq' and `ciao_clpq2' can be built in parallel.
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ciao_pl_check: .libs/libppl_ciao.so ppl_ciao.po ciao_pl_check.pl ../tests/pl_check.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	  cp -f $(srcdir)/ciao_pl_check.pl .; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	cp -f $(srcdir)/../tests/pl_check.pl .
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	ciaoc -o $@ ciao_pl_check.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	  rm -f ciao_pl_check.pl; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	rm -f pl_check.pl
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ciao_clpq: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq.pl | ciao_pl_check
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	  cp -f $(srcdir)/ciao_clpq.pl .; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	cp -f $(srcdir)/../tests/clpq.pl .
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	ciaoc -o $@ ciao_clpq.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	  rm -f ciao_clpq.pl; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	rm -f clpq.pl
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ciao_clpq2: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq2.pl | ciao_pl_check
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	  cp -f $(srcdir)/ciao_clpq2.pl .; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	cp -f $(srcdir)/../tests/clpq2.pl .
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	ciaoc -o $@ ciao_clpq2.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	  rm -f ciao_clpq2.pl; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	rm -f clpq2.pl
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at check-local: pl_check_test clpq_test clpq2_test
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pl_check_test: ciao_pl_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen libppl_ciao.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		./ciao_pl_check \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			 >obtained_pchk
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ) 
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	LANG=C; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	GLOBALSTKSIZE=1000000 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen libppl_ciao.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		./ciao_clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			<$(srcdir)/../tests/script_clpq >obtained_clpq
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at clpq2_test: ciao_clpq2$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq2 $(EXPECTED_CLPQ2)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	LANG=C; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	GLOBALSTKSIZE=100000 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen libppl_ciao.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		./ciao_clpq2 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			<$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at mostlyclean-local:
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	  rm -f ppl_ciao.pl; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	fi
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/Ciao/ciao_clpq.pl b/interfaces/Prolog/Ciao/ciao_clpq.pl
new file mode 100644
index 0000000..1f36f09
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_clpq.pl
@@ -0,0 +1,55 @@
+/* Prolog main program for the toy PPL/CIAO-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- module(_, [main/0], []).
+:- use_module(library(debugger)).
+:- use_module(library(dynamic)).
+:- use_module(library(lists)).
+:- use_module(library(prolog_sys)).
+:- use_module(library(read)).
+:- use_module(library(write)).
+:- use_module(ppl_ciao, [
+	ppl_initialize/0,
+	ppl_finalize/0,
+	ppl_new_C_Polyhedron_from_space_dimension/3,
+	ppl_new_NNC_Polyhedron_from_space_dimension/3,
+	ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_delete_Polyhedron/1,
+	ppl_Polyhedron_space_dimension/2,
+	ppl_Polyhedron_get_constraints/2,
+	ppl_Polyhedron_add_constraints_and_minimize/2,
+	ppl_Polyhedron_add_space_dimensions_and_embed/2,
+	ppl_Polyhedron_remove_higher_space_dimensions/2
+]).
+
+:- set_prolog_flag(multi_arity_warnings, off).
+
+eat_eol.
+
+:- include('clpq.pl').
+
+main :-
+    ppl_initialize,
+    common_main.
diff --git a/interfaces/Prolog/Ciao/ciao_clpq2.pl b/interfaces/Prolog/Ciao/ciao_clpq2.pl
new file mode 100644
index 0000000..1b02d26
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_clpq2.pl
@@ -0,0 +1,56 @@
+/* Prolog main program for the 2nd toy PPL/CIAO-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- module(_, [main/0], []).
+:- use_module(library(debugger)).
+:- use_module(library(dynamic)).
+:- use_module(library(iso_misc)).
+:- use_module(library(lists)).
+:- use_module(library(prolog_sys)).
+:- use_module(library(read)).
+:- use_module(library(sort)).
+:- use_module(library(write)).
+:- use_module(ppl_ciao, [
+	ppl_initialize/0,
+	ppl_finalize/0,
+	ppl_new_C_Polyhedron_from_space_dimension/3,
+	ppl_new_NNC_Polyhedron_from_space_dimension/3,
+	ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_delete_Polyhedron/1,
+	ppl_Polyhedron_space_dimension/2,
+	ppl_Polyhedron_get_constraints/2,
+	ppl_Polyhedron_add_constraints_and_minimize/2,
+	ppl_Polyhedron_add_space_dimensions_and_embed/2,
+	ppl_Polyhedron_remove_space_dimensions/2,
+	ppl_Polyhedron_remove_higher_space_dimensions/2
+]).
+
+:- set_prolog_flag(multi_arity_warnings, off).
+
+eat_eol.
+
+:- include('clpq2.pl').
+
+main :-
+    ppl_initialize,
+    common_main.
diff --git a/interfaces/Prolog/Ciao/ciao_pl_check.pl b/interfaces/Prolog/Ciao/ciao_pl_check.pl
new file mode 100644
index 0000000..7f5c0cb
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_pl_check.pl
@@ -0,0 +1,163 @@
+/* Prolog main program for the toy PPL/CIAO-Prolog predicate checker.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- module(_, [main/0], []).
+:- use_module(library(debugger)).
+:- use_module(library(dynamic)).
+:- use_module(library(lists)).
+:- use_module(library(prolog_sys)).
+:- use_module(library(read)).
+:- use_module(library(write)).
+:- use_module(ppl_ciao, [
+	ppl_version_major/1,
+	ppl_version_minor/1,
+	ppl_version_revision/1,
+	ppl_version_beta/1,
+	ppl_version/1,
+	ppl_banner/1,
+	ppl_max_space_dimension/1,
+	ppl_Coefficient_is_bounded/0,
+	ppl_Coefficient_max/1,
+	ppl_Coefficient_min/1,
+	ppl_initialize/0,
+	ppl_finalize/0,
+	ppl_set_timeout_exception_atom/1,
+	ppl_timeout_exception_atom/1,
+	ppl_set_timeout/1,
+	ppl_reset_timeout/0,
+	ppl_new_C_Polyhedron_from_space_dimension/3,
+	ppl_new_NNC_Polyhedron_from_space_dimension/3,
+	ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_new_C_Polyhedron_from_constraints/2,
+	ppl_new_NNC_Polyhedron_from_constraints/2,
+	ppl_new_C_Polyhedron_from_generators/2,
+	ppl_new_NNC_Polyhedron_from_generators/2,
+	ppl_new_C_Polyhedron_from_bounding_box/2,
+	ppl_new_NNC_Polyhedron_from_bounding_box/2,
+	ppl_Polyhedron_swap/2,
+	ppl_delete_Polyhedron/1,
+	ppl_Polyhedron_space_dimension/2,
+	ppl_Polyhedron_affine_dimension/2,
+	ppl_Polyhedron_get_constraints/2,
+	ppl_Polyhedron_get_minimized_constraints/2,
+	ppl_Polyhedron_get_generators/2,
+	ppl_Polyhedron_get_minimized_generators/2,
+	ppl_Polyhedron_relation_with_constraint/3,
+	ppl_Polyhedron_relation_with_generator/3,
+        ppl_Polyhedron_get_bounding_box/3,
+	ppl_Polyhedron_is_empty/1,
+	ppl_Polyhedron_is_universe/1,
+	ppl_Polyhedron_is_bounded/1,
+	ppl_Polyhedron_bounds_from_above/2,
+	ppl_Polyhedron_bounds_from_below/2,
+	ppl_Polyhedron_maximize/5,
+	ppl_Polyhedron_maximize_with_point/6,
+	ppl_Polyhedron_minimize/5,
+	ppl_Polyhedron_minimize_with_point/6,
+        ppl_Polyhedron_is_topologically_closed/1,
+	ppl_Polyhedron_contains_Polyhedron/2,
+	ppl_Polyhedron_strictly_contains_Polyhedron/2,
+	ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+        ppl_Polyhedron_equals_Polyhedron/2,
+	ppl_Polyhedron_OK/1,
+	ppl_Polyhedron_add_constraint/2,
+	ppl_Polyhedron_add_constraint_and_minimize/2,
+	ppl_Polyhedron_add_generator/2,
+	ppl_Polyhedron_add_generator_and_minimize/2,
+	ppl_Polyhedron_add_constraints/2,
+	ppl_Polyhedron_add_constraints_and_minimize/2,
+	ppl_Polyhedron_add_generators/2,
+	ppl_Polyhedron_add_generators_and_minimize/2,
+	ppl_Polyhedron_intersection_assign/2,
+	ppl_Polyhedron_intersection_assign_and_minimize/2,
+	ppl_Polyhedron_poly_hull_assign/2,
+	ppl_Polyhedron_poly_hull_assign_and_minimize/2,
+	ppl_Polyhedron_poly_difference_assign/2,
+	ppl_Polyhedron_affine_image/4,
+	ppl_Polyhedron_affine_preimage/4,
+	ppl_Polyhedron_bounded_affine_image/5,
+	ppl_Polyhedron_bounded_affine_preimage/5,
+	ppl_Polyhedron_generalized_affine_image/5,
+	ppl_Polyhedron_generalized_affine_preimage/5,
+	ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+	ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
+	ppl_Polyhedron_time_elapse_assign/2,
+        ppl_Polyhedron_topological_closure_assign/1,
+	ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4,
+	ppl_Polyhedron_BHRZ03_widening_assign/2,
+	ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
+	ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+	ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
+	ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+	ppl_Polyhedron_H79_widening_assign_with_tokens/4,
+	ppl_Polyhedron_H79_widening_assign/2,
+	ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
+	ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+	ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
+	ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
+	ppl_Polyhedron_add_space_dimensions_and_project/2,
+	ppl_Polyhedron_add_space_dimensions_and_embed/2,
+	ppl_Polyhedron_concatenate_assign/2,
+	ppl_Polyhedron_remove_space_dimensions/2,
+	ppl_Polyhedron_remove_higher_space_dimensions/2,
+	ppl_Polyhedron_expand_space_dimension/3,
+	ppl_Polyhedron_fold_space_dimensions/3,
+	ppl_Polyhedron_map_space_dimensions/2,
+        ppl_new_LP_Problem_trivial/1,
+        ppl_new_LP_Problem/4,
+        ppl_new_LP_Problem_from_LP_Problem/2,
+        ppl_LP_Problem_swap/2,
+        ppl_delete_LP_Problem/1,
+        ppl_LP_Problem_space_dimension/2,
+        ppl_LP_Problem_constraints/2,
+        ppl_LP_Problem_objective_function/2,
+        ppl_LP_Problem_optimization_mode/2,
+        ppl_LP_Problem_clear/1,
+        ppl_LP_Problem_add_constraint/2,
+        ppl_LP_Problem_add_constraints/2,
+        ppl_LP_Problem_set_objective_function/2,
+        ppl_LP_Problem_set_optimization_mode/2,
+        ppl_LP_Problem_is_satisfiable/1,
+        ppl_LP_Problem_solve/2,
+        ppl_LP_Problem_feasible_point/2,
+        ppl_LP_Problem_optimizing_point/2,
+        ppl_LP_Problem_optimal_value/3,
+        ppl_LP_Problem_evaluate_objective_function/4,
+        ppl_LP_Problem_OK/1
+]).
+
+:- set_prolog_flag(multi_arity_warnings, off).
+
+:- include('pl_check.pl').
+
+prolog_system('Ciao').
+
+main:-
+   (check_all ->
+        write('OK')
+   ;
+        write('FAILURE')
+   ),
+   nl.
diff --git a/interfaces/Prolog/Ciao/ppl_ciao.cc b/interfaces/Prolog/Ciao/ppl_ciao.cc
new file mode 100644
index 0000000..f90fcf4
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ppl_ciao.cc
@@ -0,0 +1,412 @@
+/* Ciao Prolog interface: system-dependent part.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+#include <ciao_prolog.h>
+#include <cassert>
+#include <sstream>
+
+typedef ciao_term Prolog_term_ref;
+typedef const char* Prolog_atom;
+typedef ciao_bool Prolog_foreign_return_type;
+
+namespace {
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = 1;
+const Prolog_foreign_return_type PROLOG_FAILURE = 0;
+
+} // namespace
+
+#include "../exceptions.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = true;
+  Prolog_min_integer = 0;
+  Prolog_max_integer = 0;
+}
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return 0;
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+  t = u;
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+  t = ciao_integer(l);
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+  if (ul < INT_MAX)
+    t = ciao_integer(ul);
+  else {
+    std::ostringstream s;
+    s << ul;
+    // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
+    t = ciao_put_number_chars(const_cast<char*>(s.str().c_str()));
+  }
+  return 1;
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+  t = ciao_atom(s);
+  return 1;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+  t = ciao_atom(a);
+  return 1;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+  t = ciao_pointer_to_address(ciao_implicit_state, p);
+  return 1;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return ciao_atom_name(ciao_atom(s));
+}
+
+Prolog_term_ref args[4];
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1) {
+  args[0] = a1;
+  t = ciao_structure_a(f, 1, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2) {
+  args[0] = a1;
+  args[1] = a2;
+  t = ciao_structure_a(f, 2, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3) {
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  t = ciao_structure_a(f, 3, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3, Prolog_term_ref a4) {
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  args[3] = a4;
+  t = ciao_structure_a(f, 4, args);
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+		      Prolog_term_ref h, Prolog_term_ref t) {
+  c = ciao_list(h, t);
+  return 1;
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  ciao_raise_exception(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return ciao_is_variable(t);
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return ciao_is_atom(t);
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return ciao_is_integer(t);
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  return ciao_is_address(ciao_implicit_state, t);
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return ciao_is_structure(t);
+}
+
+/*!
+  Return true if \p t is a Prolog list, false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  return ciao_is_list(t);
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(ciao_is_integer(t));
+  if (ciao_fits_in_int(t)) {
+    *lp = ciao_to_integer(t);
+    return 1;
+  }
+  else {
+    char* s = ciao_get_number_chars(t);
+    mpz_class n(s);
+    ciao_free(s);
+    PPL::Result r = PPL::assign_r(*lp, n, PPL::ROUND_NOT_NEEDED);
+    return r == PPL::V_EQ ? 1 : 0;
+  }
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  *vpp = ciao_address_to_pointer(ciao_implicit_state, t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  *ap = ciao_atom_name(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  *ap = ciao_structure_name(t);
+  *ip = ciao_structure_arity(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+  assert(Prolog_is_compound(t));
+  a = ciao_structure_arg(t, i);
+  return 1;
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+  assert(Prolog_is_cons(c));
+  h = ciao_list_head(c);
+  t = ciao_list_tail(c);
+  return 1;
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return ciao_unify(t, u);
+}
+
+PPL::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+  assert(ciao_is_integer(t));
+  if (ciao_fits_in_int(t))
+    return PPL::Coefficient(ciao_to_integer(t));
+  else {
+    char* s;
+    s = ciao_get_number_chars(t);
+    PPL::Coefficient n(s);
+    ciao_free(s);
+    return n;
+  }
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const PPL::Coefficient& n) {
+  int i = 0;
+  if (PPL::assign_r(i, n, PPL::ROUND_NOT_NEEDED) == PPL::V_EQ)
+    return ciao_integer(i);
+  else {
+    std::ostringstream s;
+    s << n;
+    // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
+    return ciao_put_number_chars(const_cast<char*>(s.str().c_str()));
+  }
+}
+
+} // namespace
+
+#include "../ppl_prolog.icc"
+
+extern "C" void
+init() {
+  ppl_initialize();
+}
diff --git a/interfaces/Prolog/Ciao/ppl_ciao.pl b/interfaces/Prolog/Ciao/ppl_ciao.pl
new file mode 100644
index 0000000..bd9239a
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ppl_ciao.pl
@@ -0,0 +1,1683 @@
+/* Ciao Prolog interface: Ciao Prolog part.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- module(ppl_ciao,
+[
+        ppl_version_major/1,
+        ppl_version_minor/1,
+        ppl_version_revision/1,
+        ppl_version_beta/1,
+        ppl_version/1,
+        ppl_banner/1,
+        ppl_max_space_dimension/1,
+        ppl_Coefficient_is_bounded/0,
+        ppl_Coefficient_max/1,
+        ppl_Coefficient_min/1,
+        ppl_initialize/0,
+        ppl_finalize/0,
+        ppl_set_timeout_exception_atom/1,
+        ppl_timeout_exception_atom/1,
+        ppl_set_timeout/1,
+        ppl_reset_timeout/0,
+	ppl_new_C_Polyhedron_from_space_dimension/3,
+	ppl_new_NNC_Polyhedron_from_space_dimension/3,
+	ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_new_C_Polyhedron_from_constraints/2,
+	ppl_new_NNC_Polyhedron_from_constraints/2,
+	ppl_new_C_Polyhedron_from_generators/2,
+	ppl_new_NNC_Polyhedron_from_generators/2,
+	ppl_new_C_Polyhedron_from_bounding_box/2,
+	ppl_new_NNC_Polyhedron_from_bounding_box/2,
+        ppl_Polyhedron_swap/2,
+        ppl_delete_Polyhedron/1,
+        ppl_Polyhedron_space_dimension/2,
+        ppl_Polyhedron_affine_dimension/2,
+        ppl_Polyhedron_get_constraints/2,
+        ppl_Polyhedron_get_minimized_constraints/2,
+        ppl_Polyhedron_get_generators/2,
+        ppl_Polyhedron_get_minimized_generators/2,
+        ppl_Polyhedron_relation_with_constraint/3,
+        ppl_Polyhedron_relation_with_generator/3,
+        ppl_Polyhedron_get_bounding_box/3,
+        ppl_Polyhedron_is_empty/1,
+        ppl_Polyhedron_is_universe/1,
+        ppl_Polyhedron_is_bounded/1,
+        ppl_Polyhedron_bounds_from_above/2,
+        ppl_Polyhedron_bounds_from_below/2,
+        ppl_Polyhedron_maximize/5,
+        ppl_Polyhedron_maximize_with_point/6,
+        ppl_Polyhedron_minimize/5,
+        ppl_Polyhedron_minimize_with_point/6,
+        ppl_Polyhedron_is_topologically_closed/1,
+        ppl_Polyhedron_contains_Polyhedron/2,
+        ppl_Polyhedron_strictly_contains_Polyhedron/2,
+        ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+        ppl_Polyhedron_equals_Polyhedron/2,
+        ppl_Polyhedron_OK/1,
+        ppl_Polyhedron_add_constraint/2,
+        ppl_Polyhedron_add_constraint_and_minimize/2,
+        ppl_Polyhedron_add_generator/2,
+        ppl_Polyhedron_add_generator_and_minimize/2,
+        ppl_Polyhedron_add_constraints/2,
+        ppl_Polyhedron_add_constraints_and_minimize/2,
+        ppl_Polyhedron_add_generators/2,
+        ppl_Polyhedron_add_generators_and_minimize/2,
+        ppl_Polyhedron_intersection_assign/2,
+        ppl_Polyhedron_intersection_assign_and_minimize/2,
+        ppl_Polyhedron_poly_hull_assign/2,
+        ppl_Polyhedron_poly_hull_assign_and_minimize/2,
+        ppl_Polyhedron_poly_difference_assign/2,
+        ppl_Polyhedron_affine_image/4,
+        ppl_Polyhedron_affine_preimage/4,
+        ppl_Polyhedron_bounded_affine_image/5,
+        ppl_Polyhedron_bounded_affine_preimage/5,
+        ppl_Polyhedron_generalized_affine_image/5,
+        ppl_Polyhedron_generalized_affine_preimage/5,
+        ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+        ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
+        ppl_Polyhedron_time_elapse_assign/2,
+        ppl_Polyhedron_topological_closure_assign/1,
+        ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4,
+        ppl_Polyhedron_BHRZ03_widening_assign/2,
+        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+        ppl_Polyhedron_H79_widening_assign_with_tokens/4,
+        ppl_Polyhedron_H79_widening_assign/2,
+        ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+        ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
+        ppl_Polyhedron_add_space_dimensions_and_project/2,
+        ppl_Polyhedron_add_space_dimensions_and_embed/2,
+        ppl_Polyhedron_concatenate_assign/2,
+        ppl_Polyhedron_remove_space_dimensions/2,
+        ppl_Polyhedron_remove_higher_space_dimensions/2,
+        ppl_Polyhedron_expand_space_dimension/3,
+        ppl_Polyhedron_fold_space_dimensions/3,
+        ppl_Polyhedron_map_space_dimensions/2,
+	ppl_new_LP_Problem_trivial/1,
+	ppl_new_LP_Problem/4,
+	ppl_new_LP_Problem_from_LP_Problem/2,
+	ppl_LP_Problem_swap/2,
+	ppl_delete_LP_Problem/1,
+	ppl_LP_Problem_space_dimension/2,
+	ppl_LP_Problem_constraints/2,
+	ppl_LP_Problem_objective_function/2,
+	ppl_LP_Problem_optimization_mode/2,
+	ppl_LP_Problem_clear/1,
+	ppl_LP_Problem_add_constraint/2,
+	ppl_LP_Problem_add_constraints/2,
+	ppl_LP_Problem_set_objective_function/2,
+	ppl_LP_Problem_set_optimization_mode/2,
+	ppl_LP_Problem_is_satisfiable/1,
+	ppl_LP_Problem_solve/2,
+	ppl_LP_Problem_feasible_point/2,
+	ppl_LP_Problem_optimizing_point/2,
+	ppl_LP_Problem_optimal_value/3,
+	ppl_LP_Problem_evaluate_objective_function/4,
+	ppl_LP_Problem_OK/1
+],
+[
+        assertions,
+        basicmodes,
+        regtypes,
+        foreign_interface
+]).
+
+
+:- true pred ppl_version_major_2(in(Version),
+                               go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_version_major)).
+
+ppl_version_major(Version) :-
+   ppl_version_major_2(Version, 1).
+
+:- true pred ppl_version_minor_2(in(Version),
+                               go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_version_minor)).
+
+ppl_version_minor(Version) :-
+   ppl_version_minor_2(Version, 1).
+
+:- true pred ppl_version_revision_2(in(Version),
+                               go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_version_revision)).
+
+ppl_version_revision(Version) :-
+   ppl_version_revision_2(Version, 1).
+
+:- true pred ppl_version_beta_2(in(Version),
+                               go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_version_beta)).
+
+ppl_version_beta(Version) :-
+   ppl_version_beta_2(Version, 1).
+
+:- true pred ppl_version_2(in(Version),
+                               go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_version)).
+
+ppl_version(Version) :-
+   ppl_version_2(Version, 1).
+
+
+:- true pred ppl_banner_2(in(Banner),
+                               go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_banner)).
+
+ppl_banner(Banner) :-
+   ppl_banner_2(Banner, 1).
+
+:- true pred ppl_max_space_dimension_2(in(Dimension),
+                                       go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_max_space_dimension)).
+
+ppl_max_space_dimension(Dimension) :-
+   ppl_max_space_dimension_2(Dimension, 1).
+
+:- true pred ppl_Coefficient_is_bounded_1(go(Success))
+          :: int
+  + (returns(Success), foreign(ppl_Coefficient_is_bounded)).
+
+ppl_Coefficient_is_bounded :-
+   ppl_Coefficient_is_bounded_1(1).
+
+:- true pred ppl_Coefficient_max_2(in(Max),
+                                       go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_Coefficient_max)).
+
+ppl_Coefficient_max(Max) :-
+   ppl_Coefficient_max_2(Max, 1).
+
+:- true pred ppl_Coefficient_min_2(in(Min),
+                                       go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_Coefficient_min)).
+
+ppl_Coefficient_min(Min) :-
+   ppl_Coefficient_min_2(Min, 1).
+
+:- true pred ppl_initialize + foreign.
+
+:- true pred ppl_finalize + foreign.
+
+:- true pred ppl_set_timeout_exception_atom(in(Atom))
+             :: any_term + foreign.
+
+:- true pred ppl_timeout_exception_atom_2(in(Atom),
+                                     go(Success))
+  :: any_term * int
+  + (returns(Success), foreign(ppl_timeout_exception_atom)).
+
+ppl_timeout_exception_atom(Atom) :-
+   ppl_timeout_exception_atom_2(Atom, 1).
+
+:- true pred ppl_set_timeout(in(Time))
+             :: any_term + foreign.
+
+:- true pred ppl_reset_timeout + foreign.
+
+:- true pred ppl_new_C_Polyhedron_from_space_dimension_2(in(Dimension),
+                                                 in(Atom),
+                                                 in(Handle),
+                                                 go(Success))
+  :: any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_C_Polyhedron_from_space_dimension)).
+
+ppl_new_C_Polyhedron_from_space_dimension(Dimension, Atom, Handle) :-
+   ppl_new_C_Polyhedron_from_space_dimension_2(Dimension, Atom, Handle, 1).
+
+:- true pred ppl_new_NNC_Polyhedron_from_space_dimension_2(in(Dimension),
+                                                 in(Atom),
+                                                 in(Handle),
+                                                 go(Success))
+  :: any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_space_dimension)).
+
+ppl_new_NNC_Polyhedron_from_space_dimension(Dimension, Atom, Handle) :-
+   ppl_new_NNC_Polyhedron_from_space_dimension_2(Dimension, Atom, Handle, 1).
+
+
+:- true pred ppl_new_C_Polyhedron_from_C_Polyhedron_2(in(Srd_Handle),
+						  in(Dst_Handle),
+						  go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_C_Polyhedron_from_C_Polyhedron)).
+
+ppl_new_C_Polyhedron_from_C_Polyhedron(Src_Handle, Dst_Handle) :-
+   ppl_new_C_Polyhedron_from_C_Polyhedron_2(
+               Src_Handle, Dst_Handle, 1).
+
+:- true pred ppl_new_C_Polyhedron_from_NNC_Polyhedron_2(in(Srd_Handle),
+						  in(Dst_Handle),
+						  go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_C_Polyhedron_from_NNC_Polyhedron)).
+
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(Src_Handle, Dst_Handle) :-
+   ppl_new_C_Polyhedron_from_NNC_Polyhedron_2(
+               Src_Handle, Dst_Handle, 1).
+
+:- true pred ppl_new_NNC_Polyhedron_from_C_Polyhedron_2(in(Srd_Handle),
+						  in(Dst_Handle),
+						  go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_C_Polyhedron)).
+
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(Src_Handle, Dst_Handle) :-
+   ppl_new_NNC_Polyhedron_from_C_Polyhedron_2(
+               Src_Handle, Dst_Handle, 1).
+
+:- true pred ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_2(in(Srd_Handle),
+						  in(Dst_Handle),
+						  go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron)).
+
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Src_Handle, Dst_Handle) :-
+   ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_2(
+               Src_Handle, Dst_Handle, 1).
+
+:- true pred ppl_new_C_Polyhedron_from_constraints_2(in(CList),
+                                                   in(Handle),
+                                                   go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_C_Polyhedron_from_constraints)).
+
+ppl_new_C_Polyhedron_from_constraints(CList, Handle) :-
+   ppl_new_C_Polyhedron_from_constraints_2(CList, Handle, 1).
+
+:- true pred ppl_new_NNC_Polyhedron_from_constraints_2(in(CList),
+                                                   in(Handle),
+                                                   go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_constraints)).
+
+ppl_new_NNC_Polyhedron_from_constraints(CList, Handle) :-
+   ppl_new_NNC_Polyhedron_from_constraints_2(CList, Handle, 1).
+
+:- true pred ppl_new_C_Polyhedron_from_generators_2(in(GList),
+                                                  in(Handle),
+                                                  go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_C_Polyhedron_from_generators)).
+
+ppl_new_C_Polyhedron_from_generators(GList, Handle) :-
+   ppl_new_C_Polyhedron_from_generators_2(GList, Handle, 1).
+
+:- true pred ppl_new_NNC_Polyhedron_from_generators_2(in(GList),
+                                                  in(Handle),
+                                                  go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_generators)).
+
+ppl_new_NNC_Polyhedron_from_generators(GList, Handle) :-
+   ppl_new_NNC_Polyhedron_from_generators_2(GList, Handle, 1).
+
+
+:- true pred ppl_new_C_Polyhedron_from_bounding_box_2(in(BBox),
+                                               in(Handle),
+                                               go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_C_Polyhedron_from_bounding_box)).
+
+ppl_new_C_Polyhedron_from_bounding_box(BBox, Handle) :-
+   ppl_new_C_Polyhedron_from_bounding_box_2(BBox, Handle, 1).
+
+:- true pred ppl_new_NNC_Polyhedron_from_bounding_box_2(in(BBox),
+                                               in(Handle),
+                                               go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_bounding_box)).
+
+ppl_new_NNC_Polyhedron_from_bounding_box(BBox, Handle) :-
+   ppl_new_NNC_Polyhedron_from_bounding_box_2(BBox, Handle, 1).
+
+:- true pred ppl_Polyhedron_swap(in(Handle1),
+                                 in(Handle2))
+  :: any_term * any_term + foreign.
+
+:- true pred ppl_delete_Polyhedron(in(Handle))
+  :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_space_dimension_2(in(Handle),
+                                              in(Dimension),
+                                              go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_space_dimension)).
+
+ppl_Polyhedron_space_dimension(Handle, Dimension) :-
+        ppl_Polyhedron_space_dimension_2(Handle, Dimension, 1).
+
+:- true pred ppl_Polyhedron_affine_dimension_2(in(Handle),
+					       in(Dimension),
+					       go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_affine_dimension)).
+
+ppl_Polyhedron_affine_dimension(Handle, Dimension) :-
+        ppl_Polyhedron_affine_dimension_2(Handle, Dimension, 1).
+
+:- true pred ppl_Polyhedron_get_constraints_2(in(Handle),
+                                              in(CList),
+                                              go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_get_constraints)).
+
+ppl_Polyhedron_get_constraints(Handle, CList) :-
+        ppl_Polyhedron_get_constraints_2(Handle, CList, 1).
+
+
+:- true pred ppl_Polyhedron_get_minimized_constraints_2(in(Handle),
+                                                        in(CList),
+                                                        go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_get_minimized_constraints)).
+
+ppl_Polyhedron_get_minimized_constraints(Handle, CList) :-
+        ppl_Polyhedron_get_minimized_constraints_2(Handle, CList, 1).
+
+:- true pred ppl_Polyhedron_get_generators_2(in(Handle),
+                                             in(GList),
+                                             go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_get_generators)).
+
+ppl_Polyhedron_get_generators(Handle, GList) :-
+        ppl_Polyhedron_get_generators_2(Handle, GList, 1).
+
+
+:- true pred ppl_Polyhedron_get_minimized_generators_2(in(Handle),
+                                                       in(GList),
+                                                       go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_get_minimized_generators)).
+
+ppl_Polyhedron_get_minimized_generators(Handle, GList) :-
+        ppl_Polyhedron_get_minimized_generators_2(Handle, GList, 1).
+
+:- true pred ppl_Polyhedron_relation_with_constraint_2(in(Handle),
+                                                       in(Constraint),
+                                                       in(RList),
+                                                       go(Success))
+  :: any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_relation_with_constraint)).
+
+ppl_Polyhedron_relation_with_constraint(Handle, Constraint, RList) :-
+        ppl_Polyhedron_relation_with_constraint_2(Handle, Constraint,
+                                                  RList, 1).
+
+:- true pred ppl_Polyhedron_relation_with_generator_2(in(Handle),
+                                                     in(Generator),
+                                                     in(RList),
+                                                     go(Success))
+  :: any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_relation_with_generator)).
+
+ppl_Polyhedron_relation_with_generator(Handle, Generator, RList) :-
+        ppl_Polyhedron_relation_with_generator_2(Handle, Generator, RList, 1).
+
+:- true pred ppl_Polyhedron_get_bounding_box_2(in(Handle),
+                                               in(Relation),
+                                               in(BBox),
+                                               go(Success))
+  :: any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_get_bounding_box)).
+
+ppl_Polyhedron_get_bounding_box(Handle, Relation, BBox) :-
+        ppl_Polyhedron_get_bounding_box_2(Handle, Relation, BBox, 1).
+
+:- true pred ppl_Polyhedron_is_empty_2(in(Handle),
+                                       go(Success))
+  :: any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_is_empty)).
+
+ppl_Polyhedron_is_empty(Handle) :-
+	ppl_Polyhedron_is_empty_2(Handle, 1).
+
+:- true pred ppl_Polyhedron_is_universe_2(in(Handle),
+                                          go(Success))
+  :: any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_is_universe)).
+
+ppl_Polyhedron_is_universe(Handle) :-
+	ppl_Polyhedron_is_universe_2(Handle, 1).
+
+:- true pred ppl_Polyhedron_is_bounded_2(in(Handle),
+                                         go(Success))
+  :: any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_is_bounded)).
+
+ppl_Polyhedron_is_bounded(Handle) :-
+	ppl_Polyhedron_is_bounded_2(Handle, 1).
+
+:- true pred ppl_Polyhedron_bounds_from_above_2(in(Handle),
+                                                in(Linear_Expression),
+                                                go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_bounds_from_above)).
+
+ppl_Polyhedron_bounds_from_above(Handle, Linear_Expression) :-
+	ppl_Polyhedron_bounds_from_above_2(Handle, Linear_Expression, 1).
+
+:- true pred ppl_Polyhedron_bounds_from_below_2(in(Handle),
+                                                in(Linear_Expression),
+                                                go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_bounds_from_below)).
+
+ppl_Polyhedron_bounds_from_below(Handle, Linear_Expression) :-
+	ppl_Polyhedron_bounds_from_below_2(Handle, Linear_Expression, 1).
+
+:- true pred ppl_Polyhedron_maximize_2(in(Handle),
+                                       in(Linear_Expression),
+                                       in(Num),
+                                       in(Den),
+                                       in(Max),
+                                       go(Success))
+  :: any_term * any_term * any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_maximize)).
+
+ppl_Polyhedron_maximize(Handle, Linear_Expression, Num, Den, Max) :-
+	ppl_Polyhedron_maximize_2(Handle, Linear_Expression, Num, Den, Max, 1).
+
+:- true pred ppl_Polyhedron_maximize_with_point_2(in(Handle),
+                                       in(Linear_Expression),
+                                       in(Num),
+                                       in(Den),
+                                       in(Max),
+                                       in(Point),
+                                       go(Success))
+  :: any_term * any_term * any_term * any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_maximize_with_point)).
+
+ppl_Polyhedron_maximize_with_point(Handle, Linear_Expression,
+				   Num, Den, Max, Point) :-
+	ppl_Polyhedron_maximize_with_point_2(Handle, Linear_Expression,
+					     Num, Den, Max, Point, 1).
+
+:- true pred ppl_Polyhedron_minimize_2(in(Handle),
+                                       in(Linear_Expression),
+                                       in(Num),
+                                       in(Den),
+                                       in(Min),
+                                       go(Success))
+  :: any_term * any_term * any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_minimize)).
+
+ppl_Polyhedron_minimize(Handle, Linear_Expression, Num, Den, Min) :-
+	ppl_Polyhedron_minimize_2(Handle, Linear_Expression, Num, Den, Min, 1).
+
+:- true pred ppl_Polyhedron_minimize_with_point_2(in(Handle),
+                                       in(Linear_Expression),
+                                       in(Num),
+                                       in(Den),
+                                       in(Min),
+                                       in(Point),
+                                       go(Success))
+  :: any_term * any_term * any_term * any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_minimize_with_point)).
+
+ppl_Polyhedron_minimize_with_point(Handle, Linear_Expression,
+				   Num, Den, Min, Point) :-
+	ppl_Polyhedron_minimize_with_point_2(Handle, Linear_Expression,
+					     Num, Den, Min, Point, 1).
+
+:- true pred ppl_Polyhedron_is_topologically_closed_2(in(Handle),
+                                                      go(Success))
+  :: any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_is_topologically_closed)).
+
+ppl_Polyhedron_is_topologically_closed(Handle) :-
+	ppl_Polyhedron_is_topologically_closed_2(Handle, 1).
+
+
+:- true pred ppl_Polyhedron_contains_Polyhedron_2(in(Handle1),
+                                                  in(Handle2),
+                                                  go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_contains_Polyhedron)).
+
+ppl_Polyhedron_contains_Polyhedron(Handle1, Handle2) :-
+	ppl_Polyhedron_contains_Polyhedron_2(Handle1, Handle2, 1).
+
+
+:- true pred ppl_Polyhedron_strictly_contains_Polyhedron_2(in(Handle1),
+                                                           in(Handle2),
+                                                           go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_strictly_contains_Polyhedron)).
+
+ppl_Polyhedron_strictly_contains_Polyhedron(Handle1, Handle2) :-
+	ppl_Polyhedron_strictly_contains_Polyhedron_2(Handle1, Handle2, 1).
+
+:- true pred ppl_Polyhedron_is_disjoint_from_Polyhedron_2(in(Handle1),
+                                                          in(Handle2),
+                                                          go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_is_disjoint_from_Polyhedron)).
+
+ppl_Polyhedron_is_disjoint_from_Polyhedron(Handle1, Handle2) :-
+	ppl_Polyhedron_is_disjoint_from_Polyhedron_2(Handle1, Handle2, 1).
+
+
+:- true pred ppl_Polyhedron_equals_Polyhedron_2(in(Handle1),
+                                                in(Handle2),
+                                                go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_equals_Polyhedron)).
+
+ppl_Polyhedron_equals_Polyhedron(Handle1, Handle2) :-
+	ppl_Polyhedron_equals_Polyhedron_2(Handle1, Handle2, 1).
+
+:- true pred ppl_Polyhedron_OK_2(in(Handle),
+                                 go(Success))
+  :: any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_OK)).
+
+ppl_Polyhedron_OK(Handle) :-
+	ppl_Polyhedron_OK_2(Handle, 1).
+
+:- true pred ppl_Polyhedron_add_constraint(in(Handle), in(Constraint))
+  :: any_term * any_term + foreign.
+
+
+:- true pred ppl_Polyhedron_add_constraint_and_minimize_2(in(Handle),
+                                                          in(Constraint),
+                                                          go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_add_constraint_and_minimize)).
+
+ppl_Polyhedron_add_constraint_and_minimize(Handle, Constraint) :-
+        ppl_Polyhedron_add_constraint_and_minimize_2(Handle, Constraint, 1).
+
+:- true pred ppl_Polyhedron_add_generator(in(Handle), in(Generator))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_generator_and_minimize_2(in(Handle),
+                                                         in(Generator),
+                                                         go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_add_generator_and_minimize)).
+
+ppl_Polyhedron_add_generator_and_minimize(Handle, Generator) :-
+        ppl_Polyhedron_add_generator_and_minimize_2(Handle, Generator, 1).
+
+:- true pred ppl_Polyhedron_add_constraints(in(Handle), in(CList))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_constraints_and_minimize_2(in(Handle),
+                                                           in(CList),
+                                                           go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_add_constraints_and_minimize)).
+
+ppl_Polyhedron_add_constraints_and_minimize(Handle, CList) :-
+        ppl_Polyhedron_add_constraints_and_minimize_2(Handle, CList, 1).
+
+:- true pred ppl_Polyhedron_add_generators(in(Handle), in(GList))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_generators_and_minimize_2(in(Handle),
+                                                          in(GList),
+                                                          go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_add_generators_and_minimize)).
+
+ppl_Polyhedron_add_generators_and_minimize(Handle, GList) :-
+        ppl_Polyhedron_add_generators_and_minimize_2(Handle, GList, 1).
+
+
+:- true pred ppl_Polyhedron_intersection_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_intersection_assign_and_minimize_2(in(Handle1),
+                                                          in(Handle2),
+                                                          go(Success))
+  :: any_term * any_term * int
+  + (returns(Success),
+	foreign(ppl_Polyhedron_intersection_assign_and_minimize)).
+
+ppl_Polyhedron_intersection_assign_and_minimize(Handle1, Handle2) :-
+        ppl_Polyhedron_intersection_assign_and_minimize_2(Handle1, Handle2, 1).
+
+:- true pred ppl_Polyhedron_poly_hull_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_poly_hull_assign_and_minimize_2(in(Handle1),
+                                                          in(Handle2),
+                                                          go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_poly_hull_assign_and_minimize)).
+
+ppl_Polyhedron_poly_hull_assign_and_minimize(Handle1, Handle2) :-
+        ppl_Polyhedron_poly_hull_assign_and_minimize_2(Handle1, Handle2, 1).
+
+:- true pred ppl_Polyhedron_poly_difference_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_affine_image(in(Handle), in(Var),
+                                         in(Linear_Expression), in(Divisor))
+             :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_affine_preimage(in(Handle), in(Var),
+                                            in(Linear_Expression), in(Divisor))
+             :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_affine_image(in(Handle), in(Var),
+                                                 in(Lower_Bound),
+                                                 in(Upper_Bound),
+                                                 in(Divisor))
+  :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_affine_preimage(in(Handle), in(Var),
+                                                    in(Lower_Bound),
+                                                    in(Upper_Bound),
+                                                    in(Divisor))
+  :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_image(in(Handle),
+                                                     in(Var), in(Rel),
+                                                     in(Linear_Expression),
+                                                     in(Divisor))
+  :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_preimage(in(Handle),
+                                                        in(Var), in(Rel),
+                                                        in(Linear_Expression),
+                                                        in(Divisor))
+  :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_image_lhs_rhs(
+                 in(Handle), in(LHS), in(Rel), in(RHS))
+  :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(
+                 in(Handle), in(LHS), in(Rel), in(RHS))
+  :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_time_elapse_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_topological_closure_assign(in(Handle))
+             :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_BHRZ03_widening_assign_with_tokens_2(
+                 in(Handle1), in(Handle2), in(Tokens1), in(Tokens2),
+                 go(Success))
+  :: any_term * any_term * any_term * any_term * int
+  + (returns(Success),
+      foreign(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens)).
+
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(
+                  Handle1, Handle2, Tokens1, Tokens2) :-
+      ppl_Polyhedron_BHRZ03_widening_assign_with_tokens_2(
+                  Handle1, Handle2, Tokens1, Tokens2, 1).
+
+:- true pred ppl_Polyhedron_BHRZ03_widening_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens_2(
+                 in(Handle1), in(Handle2), in(CList), in(Tokens1), in(Tokens2),
+                 go(Success))
+  :: any_term * any_term * any_term * any_term * any_term * int
+  + (returns(Success),
+      foreign(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens)).
+
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+                  Handle1, Handle2, CList, Tokens1, Tokens2) :-
+      ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens_2(
+                  Handle1, Handle2, CList, Tokens1, Tokens2, 1).
+
+:- true pred ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(in(Handle1),
+                                                               in(CList),
+                                                                in(Handle2))
+  :: any_term * any_term * any_term + foreign.
+
+
+:- true pred ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens_2(
+                 in(Handle1), in(Handle2), in(CList), in(Tokens1), in(Tokens2),
+                 go(Success))
+  :: any_term * any_term * any_term * any_term * any_term * int
+  + (returns(Success),
+      foreign(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens)).
+
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+                  Handle1, Handle2, CList, Tokens1, Tokens2) :-
+      ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens_2(
+                  Handle1, Handle2, CList, Tokens1, Tokens2, 1).
+
+:- true pred ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(in(Handle1),
+                                                               in(CList),
+                                                                in(Handle2))
+             :: any_term * any_term * any_term + foreign.
+
+
+:- true pred ppl_Polyhedron_H79_widening_assign_with_tokens_2(
+                 in(Handle1), in(Handle2), in(Tokens1), in(Tokens2),
+                 go(Success))
+  :: any_term * any_term * any_term * any_term * int
+  + (returns(Success), 
+      foreign(ppl_Polyhedron_H79_widening_assign_with_tokens)).
+
+ppl_Polyhedron_H79_widening_assign_with_tokens(
+                  Handle1, Handle2, Tokens1, Tokens2) :-
+      ppl_Polyhedron_H79_widening_assign_with_tokens_2(
+                  Handle1, Handle2, Tokens1, Tokens2, 1).
+
+:- true pred ppl_Polyhedron_H79_widening_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens_2(
+                 in(Handle1), in(Handle2), in(CList), in(Tokens1), in(Tokens2),
+                 go(Success))
+  :: any_term * any_term * any_term * any_term * any_term * int
+  + (returns(Success),
+      foreign(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens)).
+
+ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(Handle1,
+                                                           Handle2,
+                                                           CList,
+                                                           Tokens1,
+                                                           Tokens2) :-
+  ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens_2(Handle1,
+                                                               Handle2,
+                                                               CList,
+                                                               Tokens1,
+                                                               Tokens2,
+                                                               1).
+
+:- true pred ppl_Polyhedron_limited_H79_extrapolation_assign(in(Handle1),
+                                                             in(Handle2),
+                                                             in(CList))
+  :: any_term * any_term * any_term + foreign.
+
+:- true pred
+  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens_2(in(Handle1),
+                                                               in(Handle2),
+                                                               in(CList),
+                                                               in(Tokens1),
+                                                               in(Tokens2),
+                                                               go(Success))
+  :: any_term * any_term * any_term * any_term * any_term * int
+  + (returns(Success),
+    foreign(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens)).
+
+ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(Handle1,
+                                                           Handle2,
+                                                           CList,
+                                                           Tokens1,
+                                                           Tokens2) :-
+  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens_2(Handle1,
+                                                               Handle2,
+                                                               CList,
+                                                               Tokens1,
+                                                               Tokens2,
+                                                               1).
+
+:- true pred ppl_Polyhedron_bounded_H79_extrapolation_assign(in(Handle1),
+                                                             in(Handle2),
+                                                             in(CList))
+  :: any_term * any_term * any_term + foreign.
+
+:- true pred
+   ppl_Polyhedron_add_space_dimensions_and_project(in(Handle),
+                                                   in(NDimensions_To_Add))
+  :: any_term * any_term + foreign.
+
+:- true pred
+   ppl_Polyhedron_add_space_dimensions_and_embed(in(Handle),
+                                                 in(NDimensions_To_Add))
+  :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_concatenate_assign(in(Handle1), in(Handle2))
+  :: any_term * any_term + foreign.
+
+ppl_Polyhedron_remove_space_dimensions(Handle, VList) :-
+	ppl_Polyhedron_remove_space_dimensions_2(Handle, VList, 1).
+
+:- true pred ppl_Polyhedron_remove_space_dimensions_2(in(Handle), in(VList),
+                                                go(Success))
+  :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_remove_space_dimensions)).
+
+:- true pred ppl_Polyhedron_remove_higher_space_dimensions(in(Handle),
+                                                           in(Dimensions))
+  :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_expand_space_dimension(in(Handle),
+                                                   in(Var),
+                                                   in(Dimensions))
+  :: any_term * any_term * any_term + foreign.
+
+ppl_Polyhedron_fold_space_dimensions(Handle, VList, Var) :-
+	ppl_Polyhedron_fold_space_dimensions_2(Handle, VList, Var, 1).
+
+:- true pred ppl_Polyhedron_fold_space_dimensions_2(in(Handle),
+                                                 in(VList),
+                                                 in(Var),
+                                                go(Success))
+  :: any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_fold_space_dimensions)).
+
+
+ppl_Polyhedron_map_space_dimensions(Handle, PIFunc) :-
+	ppl_Polyhedron_map_space_dimensions_2(Handle, PIFunc, 1).
+
+:- true pred ppl_Polyhedron_map_space_dimensions_2(in(Handle),
+                                                 in(PIFunc),
+                                                go(Success))
+  :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_Polyhedron_map_space_dimensions)).
+
+:- true pred ppl_new_LP_Problem_trivial_2(in(Term1), go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_new_LP_Problem_trivial)).
+ 
+ppl_new_LP_Problem_trivial(Term1) :-
+   ppl_new_LP_Problem_trivial_2(Term1, 1).
+
+:- true pred ppl_new_LP_Problem_2(in(Term1), in(Term2), in(Term3), in(Term4), go(Success))
+          :: any_term * any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_LP_Problem)).
+ 
+ppl_new_LP_Problem(Term1, Term2, Term3, Term4) :-
+   ppl_new_LP_Problem_2(Term1, Term2, Term3, Term4, 1).
+
+:- true pred ppl_new_LP_Problem_from_LP_Problem_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_new_LP_Problem_from_LP_Problem)).
+ 
+ppl_new_LP_Problem_from_LP_Problem(Term1, Term2) :-
+   ppl_new_LP_Problem_from_LP_Problem_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_swap_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_swap)).
+ 
+ppl_LP_Problem_swap(Term1, Term2) :-
+   ppl_LP_Problem_swap_2(Term1, Term2, 1).
+
+:- true pred ppl_delete_LP_Problem_2(in(Term1), go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_delete_LP_Problem)).
+ 
+ppl_delete_LP_Problem(Term1) :-
+   ppl_delete_LP_Problem_2(Term1, 1).
+
+:- true pred ppl_LP_Problem_space_dimension_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_space_dimension)).
+ 
+ppl_LP_Problem_space_dimension(Term1, Term2) :-
+   ppl_LP_Problem_space_dimension_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_constraints_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_constraints)).
+ 
+ppl_LP_Problem_constraints(Term1, Term2) :-
+   ppl_LP_Problem_constraints_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_objective_function_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_objective_function)).
+ 
+ppl_LP_Problem_objective_function(Term1, Term2) :-
+   ppl_LP_Problem_objective_function_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_optimization_mode_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_optimization_mode)).
+ 
+ppl_LP_Problem_optimization_mode(Term1, Term2) :-
+   ppl_LP_Problem_optimization_mode_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_clear_2(in(Term1), go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_clear)).
+ 
+ppl_LP_Problem_clear(Term1) :-
+   ppl_LP_Problem_clear_2(Term1, 1).
+
+:- true pred ppl_LP_Problem_add_constraint_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_add_constraint)).
+ 
+ppl_LP_Problem_add_constraint(Term1, Term2) :-
+   ppl_LP_Problem_add_constraint_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_add_constraints_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_add_constraints)).
+ 
+ppl_LP_Problem_add_constraints(Term1, Term2) :-
+   ppl_LP_Problem_add_constraints_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_set_objective_function_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_set_objective_function)).
+ 
+ppl_LP_Problem_set_objective_function(Term1, Term2) :-
+   ppl_LP_Problem_set_objective_function_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_set_optimization_mode_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_set_optimization_mode)).
+ 
+ppl_LP_Problem_set_optimization_mode(Term1, Term2) :-
+   ppl_LP_Problem_set_optimization_mode_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_is_satisfiable_2(in(Term1), go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_is_satisfiable)).
+ 
+ppl_LP_Problem_is_satisfiable(Term1) :-
+   ppl_LP_Problem_is_satisfiable_2(Term1, 1).
+
+:- true pred ppl_LP_Problem_solve_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_solve)).
+ 
+ppl_LP_Problem_solve(Term1, Term2) :-
+   ppl_LP_Problem_solve_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_feasible_point_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_feasible_point)).
+ 
+ppl_LP_Problem_feasible_point(Term1, Term2) :-
+   ppl_LP_Problem_feasible_point_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_optimizing_point_2(in(Term1), in(Term2), go(Success))
+          :: any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_optimizing_point)).
+ 
+ppl_LP_Problem_optimizing_point(Term1, Term2) :-
+   ppl_LP_Problem_optimizing_point_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_optimal_value_2(in(Term1), in(Term2), in(Term3), go(Success))
+          :: any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_optimal_value)).
+ 
+ppl_LP_Problem_optimal_value(Term1, Term2, Term3) :-
+   ppl_LP_Problem_optimal_value_2(Term1, Term2, Term3, 1).
+
+:- true pred ppl_LP_Problem_evaluate_objective_function_2(in(Term1), in(Term2), in(Term3), in(Term4), go(Success))
+          :: any_term * any_term * any_term * any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_evaluate_objective_function)).
+ 
+ppl_LP_Problem_evaluate_objective_function(Term1, Term2, Term3, Term4) :-
+   ppl_LP_Problem_evaluate_objective_function_2(Term1, Term2, Term3, Term4, 1).
+
+:- true pred ppl_LP_Problem_OK_2(in(Term1), go(Success))
+          :: any_term * int
+  + (returns(Success), foreign(ppl_LP_Problem_OK)).
+ 
+ppl_LP_Problem_OK(Term1) :-
+   ppl_LP_Problem_OK_2(Term1, 1).
+
+:- extra_linker_opts('-L.libs').
+:- use_foreign_library(ppl_ciao).
+
+:- impl_defined(
+[
+        ppl_version_major_2/2,
+%        ppl_version_major/1,
+        ppl_version_minor_2/2,
+%        ppl_version_minor/1,
+        ppl_version_revision_2/2,
+%        ppl_version_revision/1,
+        ppl_version_beta_2/2,
+%        ppl_version_beta/1,
+        ppl_version_2/2,
+%        ppl_version/1,
+        ppl_banner_2/2,
+%        ppl_banner/1,
+        ppl_max_space_dimension_2/2,
+%        ppl_max_space_dimension/1,
+        ppl_Coefficient_is_bounded_1/1,
+        ppl_Coefficient_max_2/2,
+        ppl_Coefficient_min_2/2,
+        ppl_initialize/0,
+        ppl_finalize/0,
+        ppl_set_timeout_exception_atom/1,
+%        ppl_timeout_exception_atom/1,
+        ppl_timeout_exception_atom_2/2,
+        ppl_set_timeout/1,
+        ppl_reset_timeout/0,
+%        ppl_new_Polyhedron_from_space_dimension/4,
+        ppl_new_C_Polyhedron_from_space_dimension_2/4,
+        ppl_new_NNC_Polyhedron_from_space_dimension_2/4,
+%        ppl_new_Polyhedron_from_Polyhedron/4,
+        ppl_new_C_Polyhedron_from_C_Polyhedron_2/3,
+        ppl_new_C_Polyhedron_from_NNC_Polyhedron_2/3,
+        ppl_new_NNC_Polyhedron_from_C_Polyhedron_2/3,
+        ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_2/3,
+%        ppl_new_Polyhedron_from_constraints/3,
+        ppl_new_C_Polyhedron_from_constraints_2/3,
+        ppl_new_NNC_Polyhedron_from_constraints_2/3,
+%        ppl_new_Polyhedron_from_generators/3,
+        ppl_new_C_Polyhedron_from_generators_2/3,
+        ppl_new_NNC_Polyhedron_from_generators_2/3,
+%        ppl_new_Polyhedron_from_bounding_box/3,
+        ppl_new_C_Polyhedron_from_bounding_box_2/3,
+        ppl_new_NNC_Polyhedron_from_bounding_box_2/3,
+        ppl_Polyhedron_swap/2,
+        ppl_delete_Polyhedron/1,
+%        ppl_Polyhedron_space_dimension/2,
+        ppl_Polyhedron_space_dimension_2/3,
+%        ppl_Polyhedron_affine_dimension/2,
+        ppl_Polyhedron_affine_dimension_2/3,
+%        ppl_Polyhedron_get_constraints/2,
+        ppl_Polyhedron_get_constraints_2/3,
+%        ppl_Polyhedron_get_minimized_constraints/2,
+        ppl_Polyhedron_get_minimized_constraints_2/3,
+%        ppl_Polyhedron_get_generators/2,
+        ppl_Polyhedron_get_generators_2/3,
+%        ppl_Polyhedron_get_minimized_generators/2,
+        ppl_Polyhedron_get_minimized_generators_2/3,
+%        ppl_Polyhedron_relation_with_constraint/3,
+        ppl_Polyhedron_relation_with_constraint_2/4,
+%        ppl_Polyhedron_relation_with_generator/3,
+        ppl_Polyhedron_relation_with_generator_2/4,
+%        ppl_Polyhedron_get_bounding_box/3,
+        ppl_Polyhedron_get_bounding_box_2/4,
+%        ppl_Polyhedron_is_empty/1,
+        ppl_Polyhedron_is_empty_2/2,
+%        ppl_Polyhedron_is_universe/1,
+        ppl_Polyhedron_is_universe_2/2,
+%        ppl_Polyhedron_is_bounded/1,
+        ppl_Polyhedron_is_bounded_2/2,
+%        ppl_Polyhedron_bounds_from_above/2,
+        ppl_Polyhedron_bounds_from_above_2/3,
+%        ppl_Polyhedron_bounds_from_below/2,
+        ppl_Polyhedron_bounds_from_below_2/3,
+%        ppl_Polyhedron_maximize/5,
+        ppl_Polyhedron_maximize_2/6,
+%        ppl_Polyhedron_maximize_with_point/6,
+        ppl_Polyhedron_maximize_with_point_2/7,
+%        ppl_Polyhedron_minimize/5,
+        ppl_Polyhedron_minimize_2/6,
+%        ppl_Polyhedron_minimize_with_point/6,
+        ppl_Polyhedron_minimize_with_point_2/7,
+%        ppl_Polyhedron_is_topologically_closed/1,
+        ppl_Polyhedron_is_topologically_closed_2/2,
+%        ppl_Polyhedron_contains_Polyhedron/2,
+        ppl_Polyhedron_contains_Polyhedron_2/3,
+%        ppl_Polyhedron_strictly_contains_Polyhedron/2,
+        ppl_Polyhedron_strictly_contains_Polyhedron_2/3,
+%        ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+        ppl_Polyhedron_is_disjoint_from_Polyhedron_2/3,
+%        ppl_Polyhedron_equals_Polyhedron/2,
+        ppl_Polyhedron_equals_Polyhedron_2/3,
+%        ppl_Polyhedron_OK/1,
+        ppl_Polyhedron_OK_2/2,
+        ppl_Polyhedron_add_constraint/2,
+%        ppl_Polyhedron_add_constraint_and_minimize/2,
+        ppl_Polyhedron_add_constraint_and_minimize_2/3,
+        ppl_Polyhedron_add_generator/2,
+%        ppl_Polyhedron_add_generator_and_minimize/2,
+        ppl_Polyhedron_add_generator_and_minimize_2/3,
+        ppl_Polyhedron_add_constraints/2,
+%        ppl_Polyhedron_add_constraints_and_minimize/2,
+        ppl_Polyhedron_add_constraints_and_minimize_2/3,
+        ppl_Polyhedron_add_generators/2,
+%        ppl_Polyhedron_add_generators_and_minimize/2,
+        ppl_Polyhedron_add_generators_and_minimize_2/3,
+        ppl_Polyhedron_intersection_assign/2,
+%        ppl_Polyhedron_intersection_assign_and_minimize/2,
+        ppl_Polyhedron_intersection_assign_and_minimize_2/3,
+        ppl_Polyhedron_poly_hull_assign/2,
+%        ppl_Polyhedron_poly_hull_assign_and_minimize/2,
+        ppl_Polyhedron_poly_hull_assign_and_minimize_2/3,
+        ppl_Polyhedron_poly_difference_assign/2,
+        ppl_Polyhedron_affine_image/4,
+        ppl_Polyhedron_affine_preimage/4,
+        ppl_Polyhedron_bounded_affine_image/5,
+        ppl_Polyhedron_bounded_affine_preimage/5,
+        ppl_Polyhedron_generalized_affine_image/5,
+        ppl_Polyhedron_generalized_affine_preimage/5,
+        ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+        ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
+        ppl_Polyhedron_time_elapse_assign/2,
+        ppl_Polyhedron_topological_closure_assign/1,
+%        ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4,
+        ppl_Polyhedron_BHRZ03_widening_assign_with_tokens_2/5,
+        ppl_Polyhedron_BHRZ03_widening_assign/2,
+%        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens_2/6,
+        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+%        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens_2/6,
+        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+%        ppl_Polyhedron_H79_widening_assign_with_tokens/4,
+        ppl_Polyhedron_H79_widening_assign_with_tokens_2/5,
+        ppl_Polyhedron_H79_widening_assign/2,
+%        ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens_2/6,
+        ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+%        ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens_2/6,
+        ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
+        ppl_Polyhedron_add_space_dimensions_and_project/2,
+        ppl_Polyhedron_add_space_dimensions_and_embed/2,
+        ppl_Polyhedron_concatenate_assign/2,
+%        ppl_Polyhedron_remove_space_dimensions/2,
+        ppl_Polyhedron_remove_space_dimensions_2/3,
+        ppl_Polyhedron_remove_higher_space_dimensions/2,
+        ppl_Polyhedron_expand_space_dimension/3,
+%        ppl_Polyhedron_fold_space_dimensions/3,
+        ppl_Polyhedron_fold_space_dimensions_2/4,
+%        ppl_Polyhedron_map_space_dimensions/2
+        ppl_Polyhedron_map_space_dimensions_2/3,
+	ppl_new_LP_Problem_trivial_2/2,
+	ppl_new_LP_Problem_2/5,
+	ppl_new_LP_Problem_from_LP_Problem_2/3,
+	ppl_LP_Problem_swap_2/3,
+	ppl_delete_LP_Problem_2/2,
+	ppl_LP_Problem_space_dimension_2/3,
+	ppl_LP_Problem_constraints_2/3,
+	ppl_LP_Problem_objective_function_2/3,
+	ppl_LP_Problem_optimization_mode_2/3,
+	ppl_LP_Problem_clear_2/2,
+	ppl_LP_Problem_add_constraint_2/3,
+	ppl_LP_Problem_add_constraints_2/3,
+	ppl_LP_Problem_set_objective_function_2/3,
+	ppl_LP_Problem_set_optimization_mode_2/3,
+	ppl_LP_Problem_is_satisfiable_2/2,
+	ppl_LP_Problem_solve_2/3,
+	ppl_LP_Problem_feasible_point_2/3,
+	ppl_LP_Problem_optimizing_point_2/3,
+	ppl_LP_Problem_optimal_value_2/4,
+	ppl_LP_Problem_evaluate_objective_function_2/5,
+	ppl_LP_Problem_OK_2/2
+]).
+
+:- comment(version_maintenance,off).
+
+/*
+***********************************************
+This commnted code has been kept for future use
+since the above version of this is temporary.
+***********************************************
+
+:- true ppl_version_major(in(Version))
+             :: any_term + foreign.
+
+:- true ppl_version_minor
+             :: any_term + foreign.
+
+:- true ppl_version_revision
+             :: any_term + foreign.
+
+:- true ppl_version_beta
+             :: any_term + foreign.
+
+:- true ppl_version
+             :: any_term + foreign.
+
+:- true ppl_max_space_dimension
+             :: any_term + foreign.
+
+:- true pred ppl_initialize + foreign.
+
+:- true pred ppl_finalize + foreign.
+
+:- true pred ppl_set_timeout_exception_atom(in(Atom))
+             :: any_term + foreign.
+
+:- true pred ppl_timeout_exception_atom(in(Term))
+             :: any_term + foreign.
+
+:- true pred ppl_set_timeout(in(Time))
+             :: any_term + foreign.
+
+:- true pred ppl_reset_timeout + foreign.
+
+:- true pred ppl_new_Polyhedron_from_space_dimension(in(Kind),
+                                               in(Dimension),
+                                               in(Atom),
+                                               in(Handle))
+             :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_new_Polyhedron_from_Polyhedron(in(Src_Kind),
+                                                in(Src_Handle),
+                                                in(Dst_Kind),
+                                                in(Dst_Handle))
+             :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_new_Polyhedron_from_constraints(in(Kind),
+                                                 in(CList),
+                                                 in(Handle))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_new_Polyhedron_from_generators(in(Kind),
+                                                in(GList),
+                                                in(Handle))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_new_Polyhedron_from_bounding_box(in(Kind),
+                                                  in(BBox),
+                                                  in(Handle))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_swap(in(Handle1),
+                                 in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_delete_Polyhedron(in(Handle))
+             :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_space_dimension(in(Handle), in(Dimension))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_affine_dimension(in(Handle), in(Dimension))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_get_constraints(in(Handle), in(CList))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_get_minimized_constraints(in(Handle), in(CList))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_get_generators(in(Handle), in(CList))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_get_minimized_generators(in(Handle), in(CList))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_relation_with_constraint(in(Handle),
+                                                     in(Constraint),
+                                                     in(RList))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_relation_with_generator(in(Handle),
+                                                    in(Generator),
+                                                    in(RList))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_get_bounding_box(in(Handle),
+                                             in(Relation),
+                                             in(BBox))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_is_empty(in(Handle))
+             :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_is_universe(in(Handle))
+             :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_is_bounded(in(Handle))
+             :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounds_from_above(in(Handle), in(Linear_Expression))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounds_from_below(in(Handle), in(Linear_Expression))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_maximize(in(Handle),
+                                     in(Linear_Expression),
+                                     in(Num),
+                                     in(Den),
+                                     in(Max))
+             :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_maximize_with_point(in(Handle),
+                                     in(Linear_Expression),
+                                     in(Num),
+                                     in(Den),
+                                     in(Max),
+                                     in(Point))
+             :: any_term * any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_minimize(in(Handle),
+                                     in(Linear_Expression),
+                                     in(Num),
+                                     in(Den),
+                                     in(Min))
+             :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_minimize_with_point(in(Handle),
+                                     in(Linear_Expression),
+                                     in(Num),
+                                     in(Den),
+                                     in(Min),
+                                     in(Point))
+             :: any_term * any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_is_topologically_closed(in(Handle))
+             :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_contains_Polyhedron(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_strictly_contains_Polyhedron(in(Handle1),
+                                                         in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_is_disjoint_from_Polyhedron(in(Handle1),
+                                                        in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_equals_Polyhedron(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_OK(in(Handle))
+             :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_constraint(in(Handle), in(Constraint))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_constraint_and_minimize(in(Handle), in(Constraint))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_generator(in(Handle), in(Generator))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_generator_and_minimize(in(Handle), in(Generator))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_constraints(in(Handle), in(CList))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_constraints_and_minimize(in(Handle), in(CList))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_generators(in(Handle), in(GList))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_generators_and_minimize(in(Handle), in(GList))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_intersection_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_intersection_assign_and_minimize(in(Handle1),
+                                                             in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_poly_hull_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_poly_hull_assign_and_minimize(in(Handle1),
+                                                             in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_poly_difference_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_affine_image(in(Handle), in(Var),
+                                         in(Linear_Expression), in(Divisor))
+             :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_affine_preimage(in(Handle), in(Var),
+                                            in(Linear_Expression), in(Divisor))
+             :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_affine_image(in(Handle), in(Var),
+                                                 in(Lower_Bound),
+                                                 in(Upper_Bound),
+                                                 in(Divisor))
+             :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_affine_preimage(in(Handle), in(Var),
+                                                    in(Lower_Bound),
+                                                    in(Upper_Bound),
+                                                    in(Divisor))
+             :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_image(in(Handle),
+                                                     in(Var), in(Rel),
+                                                     in(Linear_Expression),
+                                                     in(Divisor))
+             :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_preimage(in(Handle),
+                                                        in(Var), in(Rel),
+                                                        in(Linear_Expression),
+                                                        in(Divisor))
+             :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_image_lhs_rhs(in(Handle),
+                                                             in(LHS),
+                                                             in(Rel), in(RHS))
+             :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(in(Handle),
+                                                                in(LHS),
+                                                                in(Rel),
+                                                                in(RHS))
+             :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_time_elapse_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_topological_closure_assign(in(Handle))
+             :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_BHRZ03_widening_assign_with_token(in(Handle1),
+                                                               in(Handle2),
+                                                               in(Tokens))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_BHRZ03_widening_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_token(in(Handle1),
+                                                                in(Handle2),
+                                                               in(CList),
+                                                               in(Tokens))
+             :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(in(Handle1),
+                                                               in(CList),
+                                                                in(Handle2))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_token(in(Handle1),
+                                                                in(Handle2),
+                                                               in(CList),
+                                                               in(Tokens))
+             :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(in(Handle1),
+                                                                in(Handle2),
+                                                               in(CList))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_H79_widening_assign_with_token(in(Handle1),
+                                                            in(Handle2),
+                                                            in(Tokens))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_H79_widening_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_limited_H79_extrapolation_assign_with_token(in(Handle1),
+                                                             in(Handle2),
+                                                               in(CList),
+                                                            in(Tokens))
+             :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_limited_H79_extrapolation_assign(in(Handle1),
+                                                             in(Handle2),
+                                                               in(CList))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token(in(Handle1),
+                                                                in(Handle2),
+                                                               in(CList),
+                                                            in(Tokens))
+             :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_H79_extrapolation_assign(in(Handle1),
+                                                                in(Handle2),
+                                                               in(CList))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred
+   ppl_Polyhedron_add_space_dimensions_and_project(in(Handle),
+                                                   in(NDimensions_To_Add))
+             :: any_term * any_term + foreign.
+
+:- true pred
+   ppl_Polyhedron_add_space_dimensions_and_embed(in(Handle),
+                                                 in(NDimensions_To_Add))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_concatenate_assign(in(Handle1), in(Handle2))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_remove_space_dimensions(in(Handle), in(VList))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_remove_higher_space_dimensions(in(Handle),
+                                                           in(Dimensions))
+             :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_expand_space_dimension(in(Handle),
+                                                   in(Var),
+                                                   in(Dimensions))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_fold_space_dimensions(in(Handle),
+                                                  in(VList),
+                                                  in(Var))
+             :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_map_space_dimensions(in(Handle),
+                                                 in(PIFunc))
+             :: any_term * any_term + foreign.
+
+:- extra_linker_opts('-L.libs').
+:- use_foreign_library(ppl_ciao).
+
+:- impl_defined(
+[
+        ppl_version_major/1,
+        ppl_version_minor/1,
+        ppl_version_revision/1,
+        ppl_version_beta/1,
+        ppl_version/1,
+        ppl_banner/1,
+        ppl_max_space_dimension/1,
+        ppl_initialize/0,
+        ppl_finalize/0,
+        ppl_set_timeout_exception_atom/1,
+        ppl_timeout_exception_atom/1,
+        ppl_set_timeout/1,
+        ppl_reset_timeout/0,
+        ppl_new_Polyhedron_from_space_dimension/4,
+        ppl_new_Polyhedron_from_Polyhedron/4,
+        ppl_new_Polyhedron_from_constraints/3,
+        ppl_new_Polyhedron_from_generators/3,
+        ppl_new_Polyhedron_from_bounding_box/3,
+        ppl_Polyhedron_swap/2,
+        ppl_delete_Polyhedron/1,
+        ppl_Polyhedron_space_dimension/2,
+        ppl_Polyhedron_affine_dimension/2,
+        ppl_Polyhedron_get_constraints/2,
+        ppl_Polyhedron_get_minimized_constraints/2,
+        ppl_Polyhedron_get_generators/2,
+        ppl_Polyhedron_get_minimized_generators/2,
+        ppl_Polyhedron_relation_with_constraint/3,
+        ppl_Polyhedron_relation_with_generator/3,
+        ppl_Polyhedron_get_bounding_box/3,
+        ppl_Polyhedron_is_empty/1,
+        ppl_Polyhedron_is_universe/1,
+        ppl_Polyhedron_is_bounded/1,
+        ppl_Polyhedron_bounds_from_above/2,
+        ppl_Polyhedron_bounds_from_below/2,
+        ppl_Polyhedron_maximize/5,
+        ppl_Polyhedron_maximize_with_point/6,
+        ppl_Polyhedron_minimize/5,
+        ppl_Polyhedron_minimize_with_point/6,
+        ppl_Polyhedron_is_topologically_closed/1,
+        ppl_Polyhedron_contains_Polyhedron/2,
+        ppl_Polyhedron_strictly_contains_Polyhedron/2,
+        ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+        ppl_Polyhedron_equals_Polyhedron/2,
+        ppl_Polyhedron_OK/1,
+        ppl_Polyhedron_add_constraint/2,
+        ppl_Polyhedron_add_constraint_and_minimize/2,
+        ppl_Polyhedron_add_generator/2,
+        ppl_Polyhedron_add_generator_and_minimize/2,
+        ppl_Polyhedron_add_constraints/2,
+        ppl_Polyhedron_add_constraints_and_minimize/2,
+        ppl_Polyhedron_add_generators/2,
+        ppl_Polyhedron_add_generators_and_minimize/2,
+        ppl_Polyhedron_intersection_assign/2,
+        ppl_Polyhedron_intersection_assign_and_minimize/2,
+        ppl_Polyhedron_poly_hull_assign/2,
+        ppl_Polyhedron_poly_hull_assign_and_minimize/2,
+        ppl_Polyhedron_poly_difference_assign/2,
+        ppl_Polyhedron_affine_image/4,
+        ppl_Polyhedron_affine_preimage/4,
+        ppl_Polyhedron_bounded_affine_image/5,
+        ppl_Polyhedron_bounded_affine_preimage/5,
+        ppl_Polyhedron_generalized_affine_image/5,
+        ppl_Polyhedron_generalized_affine_preimage/5,
+        ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+        ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
+        ppl_Polyhedron_time_elapse_assign/2,
+        ppl_Polyhedron_topological_closure_assign/1,
+        ppl_Polyhedron_BHRZ03_widening_assign_with_token/3,
+        ppl_Polyhedron_BHRZ03_widening_assign/2,
+        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_token/4,
+        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_token/4,
+        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+        ppl_Polyhedron_H79_widening_assign_with_token/3,
+        ppl_Polyhedron_H79_widening_assign/2,
+        ppl_Polyhedron_limited_H79_extrapolation_assign_with_token/4,
+        ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+        ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token/4,
+        ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
+        ppl_Polyhedron_add_space_dimensions_and_project/2,
+        ppl_Polyhedron_add_space_dimensions_and_embed/2,
+        ppl_Polyhedron_concatenate_assign/2,
+        ppl_Polyhedron_remove_space_dimensions/2,
+        ppl_Polyhedron_remove_higher_space_dimensions/2,
+        ppl_Polyhedron_expand_space_dimension/3
+        ppl_Polyhedron_fold_space_dimensions/3
+        ppl_Polyhedron_map_space_dimensions/2
+]).
+
+:- comment(version_maintenance,off).
+
+
+*/
diff --git a/interfaces/Prolog/GNU/Makefile.am b/interfaces/Prolog/GNU/Makefile.am
new file mode 100644
index 0000000..24f65f4
--- /dev/null
+++ b/interfaces/Prolog/GNU/Makefile.am
@@ -0,0 +1,153 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+EXTRA_DIST = ppl_gprolog_sd.cc ppl_gprolog.pl gp_clpq.pl gnu_pl_check.pl
+
+if BUILD_GNU_PROLOG_INTERFACE
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog/src \
+ at extra_includes@
+
+bin_PROGRAMS = ppl_gprolog
+ppl_gprolog_SOURCES =
+
+pkglib_LTLIBRARIES = libppl_gprolog.la
+libppl_gprolog_la_SOURCES = ppl_gprolog_sd.cc
+libppl_gprolog_la_LIBADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/Watchdog/src/libpwl.la \
+ at extra_libraries@
+libppl_gprolog_la_LDFLAGS = -module -avoid-version
+
+pkglib_DATA = ppl_gprolog.pl
+
+if ENABLE_SHARED
+
+LIBPPL_GPROLOG = .libs/libppl_gprolog.so
+
+else !ENABLE_SHARED
+
+LIBPPL_GPROLOG = .libs/libppl_gprolog.a
+
+endif !ENABLE_SHARED
+
+ppl_gprolog$(EXEEXT): libppl_gprolog.la ppl_gprolog.pl
+	gplc --c-compiler $(CXX) -o $@ \
+		$(srcdir)/ppl_gprolog.pl $(LIBPPL_GPROLOG) \
+		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+
+gp_clpq: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq.pl
+	gplc --c-compiler $(CXX) -o $@ \
+		$(srcdir)/ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+		$(srcdir)/../tests/clpq.pl $(LIBPPL_GPROLOG) \
+		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+
+gp_clpq2: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq2.pl
+	gplc --c-compiler $(CXX) -o $@ \
+		$(srcdir)/ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+		$(srcdir)/../tests/clpq2.pl $(LIBPPL_GPROLOG) \
+		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+SCRIPT_CLPQ= $(srcdir)/../tests/script_clpq
+
+if USE_INT8
+
+SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2_int8
+
+else !USE_INT8
+
+SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2
+
+endif !USE_INT8
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test
+
+pl_check_test: gnu_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+	echo "['$(srcdir)/../tests/pl_check.pl', '$(srcdir)/gnu_pl_check.pl']." \
+		>script_pchk
+	echo "main." >>script_pchk
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		-dlopen libppl_gprolog.la \
+		./ppl_gprolog <script_pchk
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+clpq_test: gp_clpq ../tests/script_clpq $(EXPECTED_CLPQ) 
+	LANG=C; \
+	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		-dlopen libppl_gprolog.la \
+		./gp_clpq <$(SCRIPT_CLPQ) >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: gp_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2)
+	LANG=C; \
+	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		-dlopen libppl_gprolog.la \
+		./gp_clpq2 <$(SCRIPT_CLPQ2) >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+MOSTLYCLEANFILES = \
+gp_clpq gp_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk \
+$(CLPQ_TESTS) \
+script_pchk
+
+endif BUILD_GNU_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/GNU/Makefile.in b/interfaces/Prolog/GNU/Makefile.in
new file mode 100644
index 0000000..fa9cf1d
--- /dev/null
+++ b/interfaces/Prolog/GNU/Makefile.in
@@ -0,0 +1,751 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@bin_PROGRAMS = ppl_gprolog$(EXEEXT)
+subdir = interfaces/Prolog/GNU
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(pkglibdir)"
+pkglibLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
+am__libppl_gprolog_la_SOURCES_DIST = ppl_gprolog_sd.cc
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@am_libppl_gprolog_la_OBJECTS =  \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	ppl_gprolog_sd.lo
+libppl_gprolog_la_OBJECTS = $(am_libppl_gprolog_la_OBJECTS)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@am_libppl_gprolog_la_rpath = -rpath \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	$(pkglibdir)
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_gprolog_OBJECTS =
+ppl_gprolog_OBJECTS = $(am_ppl_gprolog_OBJECTS)
+ppl_gprolog_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_gprolog_la_SOURCES) $(ppl_gprolog_SOURCES)
+DIST_SOURCES = $(am__libppl_gprolog_la_SOURCES_DIST) \
+	$(ppl_gprolog_SOURCES)
+pkglibDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkglib_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+EXTRA_DIST = ppl_gprolog_sd.cc ppl_gprolog.pl gp_clpq.pl gnu_pl_check.pl
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@AM_CPPFLAGS = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/src \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/Watchdog/src \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@extra_includes@
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ppl_gprolog_SOURCES = 
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@pkglib_LTLIBRARIES = libppl_gprolog.la
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_SOURCES = ppl_gprolog_sd.cc
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_LIBADD = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@extra_libraries@
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_LDFLAGS = -module -avoid-version
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@pkglib_DATA = ppl_gprolog.pl
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_FALSE at LIBPPL_GPROLOG = .libs/libppl_gprolog.a
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at LIBPPL_GPROLOG = .libs/libppl_gprolog.so
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_NONSTRICT = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ack.clpq \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ackn.clpq \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@fib.clpq \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@mc91.clpq \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@smm.clpq \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@sumto.clpq \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@tak.clpq
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_STRICT = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@schedule.clpq
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@SCRIPT_CLPQ = $(srcdir)/../tests/script_clpq
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@USE_INT8_FALSE at SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@USE_INT8_TRUE at SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2_int8
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@MOSTLYCLEANFILES = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@gp_clpq gp_clpq2 \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@obtained_clpq obtained_clpq2 obtained_pchk \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@$(CLPQ_TESTS) \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@script_pchk
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Prolog/GNU/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Prolog/GNU/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    f=$(am__strip_dir) \
+	    echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	    $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	  else :; fi; \
+	done
+
+uninstall-pkglibLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  p=$(am__strip_dir) \
+	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+	done
+
+clean-pkglibLTLIBRARIES:
+	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+libppl_gprolog.la: $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_DEPENDENCIES) 
+	$(CXXLINK) $(am_libppl_gprolog_la_rpath) $(libppl_gprolog_la_LDFLAGS) $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	     || test -f $$p1 \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+ at BUILD_GNU_PROLOG_INTERFACE_FALSE@ppl_gprolog$(EXEEXT): $(ppl_gprolog_OBJECTS) $(ppl_gprolog_DEPENDENCIES) 
+ at BUILD_GNU_PROLOG_INTERFACE_FALSE@	@rm -f ppl_gprolog$(EXEEXT)
+ at BUILD_GNU_PROLOG_INTERFACE_FALSE@	$(LINK) $(ppl_gprolog_LDFLAGS) $(ppl_gprolog_OBJECTS) $(ppl_gprolog_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_gprolog_sd.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-pkglibDATA: $(pkglib_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	@list='$(pkglib_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+uninstall-pkglibDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+ at BUILD_GNU_PROLOG_INTERFACE_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+	clean-pkglibLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS install-pkglibDATA \
+	install-pkglibLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
+	uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+	clean-binPROGRAMS clean-generic clean-libtool \
+	clean-pkglibLTLIBRARIES ctags distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-binPROGRAMS install-data install-data-am install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-pkglibDATA install-pkglibLTLIBRARIES install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-binPROGRAMS \
+	uninstall-info-am uninstall-pkglibDATA \
+	uninstall-pkglibLTLIBRARIES
+
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ppl_gprolog$(EXEEXT): libppl_gprolog.la ppl_gprolog.pl
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	gplc --c-compiler $(CXX) -o $@ \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(srcdir)/ppl_gprolog.pl $(LIBPPL_GPROLOG) \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@gp_clpq: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq.pl
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	gplc --c-compiler $(CXX) -o $@ \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(srcdir)/ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(srcdir)/../tests/clpq.pl $(LIBPPL_GPROLOG) \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@gp_clpq2: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq2.pl
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	gplc --c-compiler $(CXX) -o $@ \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(srcdir)/ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		$(srcdir)/../tests/clpq2.pl $(LIBPPL_GPROLOG) \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@check-local: pl_check_test clpq_test clpq2_test
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@pl_check_test: gnu_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	echo "['$(srcdir)/../tests/pl_check.pl', '$(srcdir)/gnu_pl_check.pl']." \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		>script_pchk
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	echo "main." >>script_pchk
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen libppl_gprolog.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		./ppl_gprolog <script_pchk
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@clpq_test: gp_clpq ../tests/script_clpq $(EXPECTED_CLPQ) 
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	LANG=C; \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen libppl_gprolog.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		./gp_clpq <$(SCRIPT_CLPQ) >obtained_clpq
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@clpq2_test: gp_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	LANG=C; \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		-dlopen libppl_gprolog.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@		./gp_clpq2 <$(SCRIPT_CLPQ2) >obtained_clpq2
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/GNU/README b/interfaces/Prolog/GNU/README
new file mode 100644
index 0000000..aed4eca
--- /dev/null
+++ b/interfaces/Prolog/GNU/README
@@ -0,0 +1,32 @@
+The only GNU Prolog version that is known to work with the PPL is a
+patched version of the "unstable version" available at
+
+  ftp://ftp.inria.fr/INRIA/Projects/contraintes/gprolog/unstable/gprolog-20040608.tgz
+
+(which unpacks to a directory called `gprolog-1.2.18').
+The patch to be applied is given below.
+
+So that it can be used with the GNU Prolog PPL interface (and, for
+that matter, with any foreign code), the GNU Prolog installation must
+be configured with the `--disable-regs' option.
+
+
+*** gprolog-1.2.18/src/TopComp/top_comp.c.orig	Fri Jun  4 18:05:02 2004
+--- gprolog-1.2.18/src/TopComp/top_comp.c	Sun Jul  3 11:24:36 2005
+***************
+*** 1085,1091 ****
+  	      if (++i >= argc)
+  		Fatal_Error("FILE missing after %s option", last_opt);
+
+! 	      cmd_cc.exe_name = argv[i];
+  	      continue;
+  	    }
+
+--- 1085,1091 ----
+  	      if (++i >= argc)
+  		Fatal_Error("FILE missing after %s option", last_opt);
+
+! 	      cmd_cc.exe_name = cmd_link.exe_name = argv[i];
+  	      continue;
+  	    }
+
diff --git a/interfaces/Prolog/GNU/gnu_pl_check.pl b/interfaces/Prolog/GNU/gnu_pl_check.pl
new file mode 100644
index 0000000..ec8fb17
--- /dev/null
+++ b/interfaces/Prolog/GNU/gnu_pl_check.pl
@@ -0,0 +1,36 @@
+/* Prolog main program for the PPL/GNU-Prolog predicate checker.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+prolog_system('GNU').
+
+main :-
+    current_output(Old_Stream),
+    open(obtained_pchk, write, Stream),
+    set_output(Stream),
+    (check_all ->
+	write('OK')
+    ;
+	write('FAILURE')
+    ),
+    nl,
+    close(Stream),
+    set_output(Old_Stream).
diff --git a/interfaces/Prolog/GNU/gp_clpq.pl b/interfaces/Prolog/GNU/gp_clpq.pl
new file mode 100644
index 0000000..16832da
--- /dev/null
+++ b/interfaces/Prolog/GNU/gp_clpq.pl
@@ -0,0 +1,31 @@
+/* Main program for the toy PPL/GNU-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- initialization(main).
+
+eat_eol.
+
+main :-
+    ppl_initialize,
+    common_main,
+    ppl_finalize,
+    halt.
diff --git a/interfaces/Prolog/GNU/ppl_gprolog.pl b/interfaces/Prolog/GNU/ppl_gprolog.pl
new file mode 100644
index 0000000..f755eed
--- /dev/null
+++ b/interfaces/Prolog/GNU/ppl_gprolog.pl
@@ -0,0 +1,182 @@
+/* GNU Prolog interface: GNU Prolog part.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- foreign(ppl_version_major(+term)).
+:- foreign(ppl_version_minor(+term)).
+:- foreign(ppl_version_revision(+term)).
+:- foreign(ppl_version_beta(+term)).
+:- foreign(ppl_version(+term)).
+:- foreign(ppl_banner(+term)).
+:- foreign(ppl_max_space_dimension(+term)).
+:- foreign(ppl_Coefficient_is_bounded).
+:- foreign(ppl_Coefficient_max(+term)).
+:- foreign(ppl_Coefficient_min(+term)).
+:- foreign(ppl_initialize).
+:- foreign(ppl_finalize).
+:- foreign(ppl_set_timeout_exception_atom(+term)).
+:- foreign(ppl_timeout_exception_atom(+term)).
+:- foreign(ppl_set_timeout(+term)).
+:- foreign(ppl_reset_timeout).
+:- foreign(ppl_new_C_Polyhedron_from_space_dimension(+term, +term,
+                                                            +term)).
+:- foreign(ppl_new_NNC_Polyhedron_from_space_dimension(+term, +term,
+                                                            +term)).
+:- foreign(ppl_new_C_Polyhedron_from_C_Polyhedron(+term, +term)).
+:- foreign(ppl_new_C_Polyhedron_from_NNC_Polyhedron(+term, +term)).
+:- foreign(ppl_new_NNC_Polyhedron_from_C_Polyhedron(+term, +term)).
+:- foreign(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+term, +term)).
+:- foreign(ppl_new_C_Polyhedron_from_constraints(+term, +term)).
+:- foreign(ppl_new_NNC_Polyhedron_from_constraints(+term, +term)).
+:- foreign(ppl_new_C_Polyhedron_from_generators(+term, +term)).
+:- foreign(ppl_new_NNC_Polyhedron_from_generators(+term, +term)).
+:- foreign(ppl_new_C_Polyhedron_from_bounding_box(+term, +term)).
+:- foreign(ppl_new_NNC_Polyhedron_from_bounding_box(+term, +term)).
+:- foreign(ppl_Polyhedron_swap(+term, +term)).
+:- foreign(ppl_delete_Polyhedron(+term)).
+:- foreign(ppl_Polyhedron_space_dimension(+term, +term)).
+:- foreign(ppl_Polyhedron_affine_dimension(+term, +term)).
+:- foreign(ppl_Polyhedron_get_constraints(+term, +term)).
+:- foreign(ppl_Polyhedron_get_minimized_constraints(+term, +term)).
+:- foreign(ppl_Polyhedron_get_generators(+term, +term)).
+:- foreign(ppl_Polyhedron_get_minimized_generators(+term, +term)).
+:- foreign(ppl_Polyhedron_relation_with_constraint(+term, +term, +term)).
+:- foreign(ppl_Polyhedron_relation_with_generator(+term, +term, +term)).
+:- foreign(ppl_Polyhedron_get_bounding_box(+term, +term, +term)).
+:- foreign(ppl_Polyhedron_is_empty(+term)).
+:- foreign(ppl_Polyhedron_is_universe(+term)).
+:- foreign(ppl_Polyhedron_is_bounded(+term)).
+:- foreign(ppl_Polyhedron_bounds_from_above(+term, +term)).
+:- foreign(ppl_Polyhedron_bounds_from_below(+term, +term)).
+:- foreign(ppl_Polyhedron_maximize(+term, +term, +term, +term, +term)).
+:- foreign(ppl_Polyhedron_minimize(+term, +term, +term, +term, +term)).
+:- foreign(ppl_Polyhedron_maximize_with_point(+term, +term, +term, +term,
+                                              +term, +term)).
+:- foreign(ppl_Polyhedron_minimize_with_point(+term, +term, +term, +term,
+                                              +term, +term)).
+:- foreign(ppl_Polyhedron_is_topologically_closed(+term)).
+:- foreign(ppl_Polyhedron_contains_Polyhedron(+term, +term)).
+:- foreign(ppl_Polyhedron_strictly_contains_Polyhedron(+term, +term)).
+:- foreign(ppl_Polyhedron_is_disjoint_from_Polyhedron(+term, +term)).
+:- foreign(ppl_Polyhedron_equals_Polyhedron(+term, +term)).
+:- foreign(ppl_Polyhedron_OK(+term)).
+:- foreign(ppl_Polyhedron_add_constraint(+term, +term)).
+:- foreign(ppl_Polyhedron_add_constraint_and_minimize(+term, +term)).
+:- foreign(ppl_Polyhedron_add_generator(+term, +term)).
+:- foreign(ppl_Polyhedron_add_generator_and_minimize(+term, +term)).
+:- foreign(ppl_Polyhedron_add_constraints(+term, +term)).
+:- foreign(ppl_Polyhedron_add_constraints_and_minimize(+term, +term)).
+:- foreign(ppl_Polyhedron_add_generators(+term, +term)).
+:- foreign(ppl_Polyhedron_add_generators_and_minimize(+term, +term)).
+:- foreign(ppl_Polyhedron_intersection_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_intersection_assign_and_minimize(+term, +term)).
+:- foreign(ppl_Polyhedron_poly_hull_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_poly_hull_assign_and_minimize(+term, +term)).
+:- foreign(ppl_Polyhedron_poly_difference_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_affine_image(+term, +term, +term, +term)).
+:- foreign(ppl_Polyhedron_affine_preimage(+term, +term, +term, +term)).
+:- foreign(ppl_Polyhedron_bounded_affine_image(+term, +term,
+                                               +term, +term, +term)).
+:- foreign(ppl_Polyhedron_bounded_affine_preimage(+term, +term,
+                                                  +term, +term, +term)).
+:- foreign(ppl_Polyhedron_generalized_affine_image(+term, +term,
+						   +term, +term, +term)).
+:- foreign(ppl_Polyhedron_generalized_affine_preimage(+term, +term,
+						      +term, +term, +term)).
+:- foreign(ppl_Polyhedron_generalized_affine_image_lhs_rhs(+term, +term,
+							   +term, +term)).
+:- foreign(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(+term, +term,
+							      +term, +term)).
+:- foreign(ppl_Polyhedron_time_elapse_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_topological_closure_assign(+term)).
+:- foreign(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+term,
+							    +term,
+							    +term,
+							    +term)).
+:- foreign(ppl_Polyhedron_BHRZ03_widening_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+                                                              +term,
+							      +term,
+							      +term,
+							      +term,
+							      +term)).
+:- foreign(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+term,
+							      +term,
+							      +term)).
+:- foreign(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+                                                              +term,
+							      +term,
+							      +term,
+							      +term,
+							      +term)).
+:- foreign(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+term,
+							      +term,
+							      +term)).
+:- foreign(ppl_Polyhedron_H79_widening_assign_with_tokens(+term,
+							 +term,
+							 +term,
+							 +term)).
+:- foreign(ppl_Polyhedron_H79_widening_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(+term,
+							   +term,
+							   +term,
+							   +term,
+							   +term)).
+:- foreign(ppl_Polyhedron_limited_H79_extrapolation_assign(+term,
+							   +term,
+							   +term)).
+:- foreign(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(+term,
+							   +term,
+							   +term,
+							   +term,
+							   +term)).
+:- foreign(ppl_Polyhedron_bounded_H79_extrapolation_assign(+term,
+							   +term,
+							   +term)).
+:- foreign(ppl_Polyhedron_add_space_dimensions_and_project(+term, +term)).
+:- foreign(ppl_Polyhedron_add_space_dimensions_and_embed(+term, +term)).
+:- foreign(ppl_Polyhedron_concatenate_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_remove_space_dimensions(+term, +term)).
+:- foreign(ppl_Polyhedron_remove_higher_space_dimensions(+term, +term)).
+:- foreign(ppl_Polyhedron_expand_space_dimension(+term, +term, +term)).
+:- foreign(ppl_Polyhedron_fold_space_dimensions(+term, +term, +term)).
+:- foreign(ppl_Polyhedron_map_space_dimensions(+term, +term)).
+:- foreign(ppl_new_LP_Problem_trivial(+term)).
+:- foreign(ppl_new_LP_Problem(+term, +term, +term, +term)).
+:- foreign(ppl_new_LP_Problem_from_LP_Problem(+term, +term)).
+:- foreign(ppl_LP_Problem_swap(+term, +term)).
+:- foreign(ppl_delete_LP_Problem(+term)).
+:- foreign(ppl_LP_Problem_space_dimension(+term, +term)).
+:- foreign(ppl_LP_Problem_constraints(+term, +term)).
+:- foreign(ppl_LP_Problem_objective_function(+term, +term)).
+:- foreign(ppl_LP_Problem_optimization_mode(+term, +term)).
+:- foreign(ppl_LP_Problem_clear(+term)).
+:- foreign(ppl_LP_Problem_add_constraint(+term, +term)).
+:- foreign(ppl_LP_Problem_add_constraints(+term, +term)).
+:- foreign(ppl_LP_Problem_set_objective_function(+term, +term)).
+:- foreign(ppl_LP_Problem_set_optimization_mode(+term, +term)).
+:- foreign(ppl_LP_Problem_is_satisfiable(+term)).
+:- foreign(ppl_LP_Problem_solve(+term, +term)).
+:- foreign(ppl_LP_Problem_feasible_point(+term, +term)).
+:- foreign(ppl_LP_Problem_optimizing_point(+term, +term)).
+:- foreign(ppl_LP_Problem_optimal_value(+term, +term, +term)).
+:- foreign(ppl_LP_Problem_evaluate_objective_function(+term, +term, +term, +term)).
+:- foreign(ppl_LP_Problem_OK(+term)).
diff --git a/interfaces/Prolog/GNU/ppl_gprolog_sd.cc b/interfaces/Prolog/GNU/ppl_gprolog_sd.cc
new file mode 100644
index 0000000..a160358
--- /dev/null
+++ b/interfaces/Prolog/GNU/ppl_gprolog_sd.cc
@@ -0,0 +1,438 @@
+/* GNU Prolog interface: system-dependent part.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+#include <gprolog.h>
+#include <cassert>
+
+typedef PlTerm Prolog_term_ref;
+typedef int Prolog_atom;
+typedef Bool Prolog_foreign_return_type;
+
+namespace {
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+} // namespace
+
+#include "../exceptions.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+Prolog_atom a_dollar_address;
+Prolog_atom a_throw;
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+long Prolog_max_integer;
+
+#include <iostream>
+using namespace std;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = false;
+  Prolog_min_integer = INT_LOWEST_VALUE;
+  Prolog_max_integer = INT_GREATEST_VALUE;
+
+  a_dollar_address = Create_Allocate_Atom("$address");
+  a_throw = Find_Atom("throw");
+}
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return 0;
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+  t = u;
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+  if (l < Prolog_min_integer || l > Prolog_max_integer)
+    throw PPL_integer_out_of_range(l);
+  t = Mk_Integer(l);
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+  if (ul > static_cast<unsigned long>(Prolog_max_integer))
+    throw PPL_integer_out_of_range(ul);
+  t = Mk_Integer(ul);
+  return 1;
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+  // TODO: remove the const_cast when the GNU Prolog people fix gprolog.h.
+  // NOTE: at the time of writing this comment (January 14, 2006), and since
+  // a long time before, "GNU Prolog people" stands for the empty set.
+  t = Mk_Atom(Create_Allocate_Atom(const_cast<char*>(s)));
+  return 1;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+  t = Mk_Atom(a);
+  return 1;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  // TODO: remove the const_cast when the GNU Prolog people fix gprolog.h.
+  return Create_Allocate_Atom(const_cast<char*>(s));
+}
+
+Prolog_term_ref args[4];
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1) {
+  args[0] = a1;
+  t = Mk_Compound(f, 1, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2) {
+  args[0] = a1;
+  args[1] = a2;
+  t = Mk_Compound(f, 2, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3) {
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  t = Mk_Compound(f, 3, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3, Prolog_term_ref a4) {
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  args[3] = a4;
+  t = Mk_Compound(f, 4, args);
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+		      Prolog_term_ref h, Prolog_term_ref t) {
+  args[0] = h;
+  args[1] = t;
+  c = Mk_List(args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+  union {
+    unsigned long l;
+    unsigned short s[2];
+  } u;
+  u.l = reinterpret_cast<unsigned long>(p);
+  return Prolog_construct_compound(t, a_dollar_address,
+				   Mk_Positive(u.s[0]), Mk_Positive(u.s[1]));
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  Pl_Exec_Continuation(a_throw, 1, &t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return Blt_Var(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return Blt_Atom(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return Blt_Integer(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return Blt_Compound(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog list, false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  if (Blt_Compound(t) == FALSE)
+    return 0;
+  Prolog_atom name;
+  int arity;
+  Rd_Compound(t, &name, &arity);
+  return name == ATOM_CHAR('.') && arity == 2;
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  *lp = Rd_Integer_Check(t);
+  return 1;
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  if (!Prolog_is_compound(t))
+    return 0;
+  Prolog_atom name;
+  int arity;
+  Prolog_term_ref* a = Rd_Compound_Check(t, &name, &arity);
+  if (name != a_dollar_address || arity != 2)
+    return 0;
+  for (int i = 0; i <= 1; ++i) {
+    if (!Prolog_is_integer(a[i]))
+      return 0;
+    long l;
+    if (!Prolog_get_long(a[i], &l))
+      return 0;
+    if (l < 0 || l > USHRT_MAX)
+      return 0;
+  }
+  return 1;
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  static Prolog_atom dummy_name;
+  static int dummy_arity;
+  Prolog_term_ref* a = Rd_Compound_Check(t, &dummy_name, &dummy_arity);
+  union {
+    unsigned long l;
+    unsigned short s[2];
+  } u;
+  u.s[0] = Rd_Integer_Check(a[0]);
+  u.s[1] = Rd_Integer_Check(a[1]);
+  *vpp = reinterpret_cast<void*>(u.l);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  *ap = Rd_Atom_Check(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  Rd_Compound_Check(t, ap, ip);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+  assert(Prolog_is_compound(t));
+  static Prolog_atom dummy_name;
+  static int dummy_arity;
+  a = Rd_Compound_Check(t, &dummy_name, &dummy_arity)[i-1];
+  return 1;
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+  assert(Prolog_is_cons(c));
+  Prolog_term_ref* ht = Rd_List_Check(c);
+  h = ht[0];
+  t = ht[1];
+  return 1;
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return Unify(t, u) != FALSE;
+}
+
+PPL::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+  long v;
+  Prolog_get_long(t, &v);
+  return PPL::Coefficient(v);
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const PPL::Coefficient& n) {
+  long l = 0;
+  if (PPL::assign_r(l, n, PPL::ROUND_NOT_NEEDED) != PPL::V_EQ)
+    throw PPL_integer_out_of_range(n);
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_put_long(t, l);
+  return t;
+}
+
+} // namespace
+
+#undef CS
+
+#include "../ppl_prolog.icc"
diff --git a/interfaces/Prolog/Makefile.am b/interfaces/Prolog/Makefile.am
new file mode 100644
index 0000000..b84e0fd
--- /dev/null
+++ b/interfaces/Prolog/Makefile.am
@@ -0,0 +1,25 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SUBDIRS = Ciao GNU SICStus SWI XSB YAP tests
+
+noinst_HEADERS = ppl_prolog.icc exceptions.hh track_allocation.hh
diff --git a/interfaces/Prolog/Makefile.in b/interfaces/Prolog/Makefile.in
new file mode 100644
index 0000000..20fef71
--- /dev/null
+++ b/interfaces/Prolog/Makefile.in
@@ -0,0 +1,598 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+SUBDIRS = Ciao GNU SICStus SWI XSB YAP tests
+noinst_HEADERS = ppl_prolog.icc exceptions.hh track_allocation.hh
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Prolog/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Prolog/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+	clean clean-generic clean-libtool clean-recursive ctags \
+	ctags-recursive distclean distclean-generic distclean-libtool \
+	distclean-recursive distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic maintainer-clean-recursive \
+	mostlyclean mostlyclean-generic mostlyclean-libtool \
+	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/Prolog_interface.dox b/interfaces/Prolog/Prolog_interface.dox
new file mode 100644
index 0000000..af930b4
--- /dev/null
+++ b/interfaces/Prolog/Prolog_interface.dox
@@ -0,0 +1,2175 @@
+/* Documentation for the Prolog interfaces.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+/*! \defgroup PrologInterface Prolog Language Interface
+
+The Parma Polyhedra Library comes equipped with a Prolog interface.
+Despite the lack of standardization of Prolog's foreign language interfaces,
+the PPL Prolog interface supports several Prolog systems and, to the
+extent this is possible, provides a uniform view of the library from
+each such systems.
+
+The system-independent features of the library are described in
+Section \ref PI_SI_Features "System-Independent Features".
+Section \ref PI_Compilation "Compilation and Installation"
+explains how the various incarnations of the Prolog interface
+are compiled and installed.
+Section \ref PI_SD_Features "System-Dependent Features"
+illustrates the system-dependent features of the interface
+for all the supported systems.
+
+In the sequel, <CODE>prefix</CODE> is the prefix under which
+you have installed the library (typically <CODE>/usr</CODE>
+or <CODE>/usr/local</CODE>).
+
+
+\anchor PI_SI_Features
+<H1>System-Independent Features</H1>
+
+The Prolog interface provides access to the PPL polyhedra.
+A general introduction to convex polyhedra, their representation in the PPL
+and the operations provided by the PPL is given in Sections
+\ref preamble, \ref convex_polys, \ref representation
+and \ref Operations_on_Convex_Polyhedra of this manual.
+Here we just describe those aspects that are specific to the Prolog interface.
+
+<H2>Overview</H2>
+
+First, here is a list of notes with general information and advice
+on the use of the interface.
+
+- The Prolog interface files are all installed in the directory
+  <CODE>prefix/lib/ppl</CODE>.  Since this includes shared and
+  dynamically loaded libraries, you must make your dynamic
+  linker/loader aware of this fact.  If you use a GNU/Linux system,
+  try the commands <CODE>man ld.so</CODE> and <CODE>man ldconfig</CODE>
+  for more information.
+- The Prolog interface to the PPL is initialized and finalized by the
+  predicates <CODE>ppl_initialize/0</CODE> and <CODE>ppl_finalize/0</CODE>.
+  Thus the only interface predicates callable after
+  <CODE>ppl_finalize/0</CODE> are <CODE>ppl_finalize/0</CODE> itself
+  (this further call has no effect) and <CODE>ppl_initialize/0</CODE>,
+  after which the interface's services are usable again.
+  Some Prolog systems allow the specification of initialization
+  and deinitialization functions in their foreign language interfaces.
+  The corresponding incarnations of the PPL-Prolog interface
+  have been written so that <CODE>ppl_initialize/0</CODE> and/or
+  <CODE>ppl_finalize/0</CODE> are called automatically.
+  Section \ref PI_SD_Features "System-Dependent Features" will detail
+  in which cases initialization and finalization is automatically
+  performed or is left to the Prolog programmer's responsibility.
+  However, for portable applications, it is best
+  to invoke <CODE>ppl_initialize/0</CODE> and <CODE>ppl_finalize/0</CODE>
+  explicitly: since they can be called multiple times without problems,
+  this will result in enhanced portability at a cost that is, by all means,
+  negligible.
+
+- A PPL polyhedron can only be accessed by means of a Prolog term
+  called a <EM>handle</EM>.
+  Note, however, that the data structure of a handle,
+  is implementation-dependent, system-dependent and
+  version-dependent, and, for this reason, deliberately left unspecified.
+  What we do guarantee is that the handle requires very little memory.
+
+- A Prolog term can be bound to a valid handle by using
+  predicates such as
+\code
+  ppl_new_C_Polyhedron_from_space_dimension/3,
+  ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+  ppl_new_C_Polyhedron_from_constraints/2,
+  ppl_new_C_Polyhedron_from_generators/2,
+  ppl_new_C_Polyhedron_from_bounding_box/2.
+\endcode
+  These predicates will create or copy a PPL polyhedron
+  and construct a valid handle for referencing it.
+  The last argument is a Prolog term that is
+  unified with a new valid handle for accessing this polyhedron.
+
+- As soon as a PPL polyhedron is no longer required,
+  the memory occupied by it should be released
+  using the PPL predicate <CODE>ppl_delete_Polyhedron/1</CODE>.
+  To understand why this is important,
+  consider a Prolog program and a variable that is bound to
+  a Herbrand term.
+  When the variable dies (goes out of scope) or is uninstantiated
+  (on backtracking) the term it is bound to is amenable to garbage collection.
+  But this only applies for the standard domain of the language:
+  Herbrand terms.
+  In Prolog+PPL, when a variable bound to a handle for a PPL Polyhedron dies
+  or is uninstantiated,
+  the handle can be garbage-collected, but the polyhedra to which
+  the handle refers will not be released.
+  Once a handle has been used as an argument in
+  <CODE>ppl_delete_Polyhedron/1</CODE>,
+  it becomes invalid.
+
+- For a PPL polyhedron with space dimension \p k,
+  the identifiers used for the PPL variables
+  must lie between 0 and \f$k-1\f$ and correspond to the indices of the
+  associated Cartesian axes.
+  When using the predicates that combine PPL polyhedra
+  or add constraints or generators to a representation of
+  a PPL polyhedron,
+  the polyhedra referenced and any constraints or generators in the call
+  should follow all the (space) dimension-compatibility rules stated in
+  Section \ref representation.
+
+- As explained above, a polyhedron has a fixed topology C or NNC,
+  that is determined at the time of its initialization.
+  All subsequent operations on the polyhedron must respect all the
+  topological compatibility rules stated in Section \ref representation.
+
+- Any application using the PPL should make sure that only the
+  intended version(s) of the library are ever used.
+  Predicates
+\code
+  ppl_version_major/1,
+  ppl_version_minor/1,
+  ppl_version_revision/1,
+  ppl_version_beta/1,
+  ppl_version/1,
+  ppl_banner.
+\endcode
+  allow run-time checking of information about the version being used.
+
+<H2>PPL Predicate List</H2>
+
+Here is a list of all the PPL predicates provided by the Prolog interface.
+
+<CODE>
+  ppl_version_major(?C_int)
+</CODE>
+
+<CODE>
+  ppl_version_minor(?C_int)
+</CODE>
+
+<CODE>
+  ppl_version_revision(?C_int)
+</CODE>
+
+<CODE>
+  ppl_version_beta(?C_int)
+</CODE>
+
+<CODE>
+  ppl_version(?Atom)
+</CODE>
+
+<CODE>
+  ppl_banner(?Atom)
+</CODE>
+
+<CODE>
+  ppl_max_space_dimension(?Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Coefficient_is_bounded
+</CODE>
+
+<CODE>
+  ppl_Coefficient_max(?Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Coefficient_min(?Coefficient)
+</CODE>
+
+<CODE>
+  ppl_initialize
+</CODE>
+
+<CODE>
+  ppl_finalize
+</CODE>
+
+<CODE>
+  ppl_set_timeout_exception_atom(+Atom)
+</CODE>
+
+<CODE>
+  ppl_set_timeout(+C_unsigned)
+</CODE>
+
+<CODE>
+  ppl_reset_timeout
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_constraints(+Constraint_System, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_generators(+Generator_System, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_C_Polyhedron_from_bounding_box(+Box, -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_NNC_Polyhedron_from_bounding_box(+Box, -Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_swap(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_delete_Polyhedron(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_constraints(+Handle, -Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_minimized_constraints(+Handle, -Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_generators(+Handle, -Generator_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_minimized_generators(+Handle, -Generator_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint, -Relation)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_relation_with_generator(+Handle, +Generator, -Relation)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_get_bounding_box(+Handle, +Complexity, -Box)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_empty(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_universe(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_bounded(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounds_from_above(+Handle, +Lin_Expr)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounds_from_below(+Handle, +Lin_Expr)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_maximize(+Handle, +Lin_Expr,
+                          ?Coefficient_1, ?Coefficient_2, ?Boolean)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr,
+                                     ?Coefficient_1, ?Coefficient_2,
+                                     ?Boolean, ?Point)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_minimize(+Handle, +Lin_Expr,
+                          ?Coefficient_1, ?Coefficient_2, ?Boolean)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr,
+                                     ?Coefficient_1, ?Coefficient_2,
+                                     ?Boolean, ?Point)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_topologically_closed(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_OK(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_constraint(+Handle, +Constraint)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_constraint_and_minimize(+Handle, +Constraint)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_generator(+Handle, +Generator)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_generator_and_minimize(+Handle, +Generator)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_constraints(+Handle, +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_constraints_and_minimize(+Handle, +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_generators(+Handle, +Generator_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_generators_and_minimize(+Handle, +Generator_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_intersection_assign_and_minimize(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_poly_hull_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_poly_hull_assign_and_minimize(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_poly_difference_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_affine_image(+Handle,
+                                      +PPL_Var,
+                                      +Lin_Expr_1,
+                                      +Lin_Expr_2,
+                                      +Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_generalized_affine_image(+Handle,
+					  +PPL_Var,
+					  +Relation_Symbol,
+					  +Lin_Expr,
+					  +Coefficient)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle,
+						  +Lin_Expr_1,
+						  +Relation_Symbol,
+						  +Lin_Expr_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1, +Handle_2,
+					+C_unsigned_1, ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(+Handle_1,
+                                                     +Handle_2,
+						     +Constraint_System,
+						     +C_unsigned_1,
+						     ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2,
+						     +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(+Handle_1,
+                                                     +Handle_2,
+						     +Constraint_System,
+						     +C_unsigned_1,
+						     ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2,
+						     +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1, +Handle_2,
+						+C_unsigned_1,
+						?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_H79_widening_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(+Handle_1,
+                                                  +Handle_2,
+						  +Constraint_System,
+						   +C_unsigned_1,
+						   ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1, +Handle_2,
+						  +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(+Handle_1,
+                                                  +Handle_2,
+						  +Constraint_System,
+						  +C_unsigned_1,
+						  ?C_unsigned_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1, +Handle_2,
+						  +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_topological_closure_assign(+Handle)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_space_dimensions_and_embed(+Handle, +Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_add_space_dimensions_and_project(+Handle, +Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_remove_space_dimensions(+Handle, +List_of_PPL_Vars)
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type))
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type))
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var))
+</CODE>
+
+<CODE>
+  ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func))
+</CODE>
+
+<CODE>
+  ppl_new_LP_Problem_trivial(-Handle)
+</CODE>
+
+<CODE>
+  ppl_new_LP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode,
+                     -Handle)
+</CODE>
+
+<CODE>
+  ppl_new_LP_Problem_from_LP_Problem(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_swap(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+  ppl_delete_LP_Problem(+Handle)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_constraints(+Handle, -Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_objective_function(+Handle, -Lin_Expr)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_clear(+Handle)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_add_constraint(+Handle, +Constraint)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_set_objective_function(+Handle, +Lin_Expr)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_is_satisfiable(+Handle)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_solve(+Handle, ?LP_Problem_Status)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_feasible_point(+Handle, -Generator)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_optimizing_point(+Handle, -Generator)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_optimal_value(+Handle, ?Coefficient_1, ?Coefficient_2)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_evaluate_objective_function(+Handle, +Generator,
+                                             ?Coefficient_1, ?Coefficient_2)
+</CODE>
+
+<CODE>
+  ppl_LP_Problem_OK(+Handle)
+</CODE>
+
+
+<H2>PPL Predicate Specifications</H2>
+
+The PPL predicates provided by the Prolog interface are specified below.
+The specification uses the following grammar rules:
+\code
+
+ Number      --> unsigned integer	ranging from 0 to an upper bound
+					depending on the actual Prolog system.
+
+ C_int       --> Number | - Number	C integer
+
+ C_unsigned  --> Number			C unsigned integer
+
+ Coefficient --> Number			used in linear expressions;
+					the upper bound will depend on how
+					the PPL has been configured
+
+ Dimension_Type
+             --> Number			used for the number of affine and
+					space dimensions and the names of
+ 					the dimensions;
+					the upper bound will depend on
+					the maximum number of dimensions
+					allowed by the PPL
+					(see ppl_max_space_dimensions/1)
+
+ Boolean     --> true | false
+
+ Handle      --> Prolog term		used to identify a Polyhedron
+
+ Topology    --> c | nnc		Polyhedral kind;
+					c is closed and nnc is NNC
+
+ VarId       --> Dimension_Type 	variable identifier
+
+ PPL_Var     --> '$VAR'(VarId)		PPL variable
+
+ Lin_Expr    --> PPL_Var		PPL variable
+            | Coefficient
+            | Lin_Expr			unary plus
+            | - Lin_Expr		unary minus
+            | Lin_Expr + Lin_Expr	addition
+            | Lin_Expr - Lin_Expr	subtraction
+            | Coefficient * Lin_Expr	multiplication
+            | Lin_Expr * Coefficient	multiplication
+
+ Relation_Symbol
+	     --> =			equals
+            | =< 			less than or equal
+            | >=			greater than or equal
+            | < 			strictly less than
+            | > 			strictly greater than
+
+ Constraint  --> Lin_Expr Relation_Symbol Lin_Expr
+					constraint
+
+ Constraint_System			list of constraints
+             --> []
+            | [Constraint | Constraint_System]
+
+ Generator_Denominator --> Coefficient	must be non-zero
+	    | Coefficient
+            | - Coefficient
+
+ Generator   --> point(Lin_Expr)	point
+            | point(Lin_Expr, Generator_Denominator)
+					point
+            | closure_point(Lin_Expr)	closure point
+            | closure_point(Lin_Expr, Generator_Denominator)
+					closure point
+            | ray(Lin_Expr)		ray
+            | line(Lin_Expr)		line
+
+ Generator_System			list of generators
+             --> []
+	    | [Generator | Generator_System]
+
+ Atom        --> Prolog atom
+
+ Universe_or_Empty			polyhedron
+             --> universe
+            | empty
+
+ Poly_Relation				polyhedron relation:
+             --> is_disjoint		with a constraint
+	    | strictly_intersects	with a constraint
+	    | is_included		with a constraint
+	    | saturates			with a constraint
+            | subsumes			with a generator
+
+ Poly_Relation_List			list of polyhedron relations
+	     --> []
+	    | [Poly_Relation | Poly_Relation_List]
+
+ Complexity  --> polynomial | simplex | any
+
+ Rational_Numerator
+	     --> Coefficient | - Coefficient
+
+ Rational_Denominator
+	     --> Coefficient		must be non-zero
+
+ Rational    --> Rational_Numerator	rational number
+	    | Rational_Numerator/Rational_Denominator
+
+ Bound       --> c(Rational)		closed rational limit
+            | o(Rational)		open rational limit
+            | o(pinf)			unbounded in the positive direction
+            | o(minf)			unbounded in the negative direction
+
+ Interval    --> i(Bound, Bound)	rational interval
+
+ Box         --> []			list of intervals
+            | [Interval | Box]
+
+ Vars_Pair   --> PPLVar - PPLVar        map relation
+
+ P_Func      --> []    			list of map relations
+            | [Vars_Pair | P_Func].
+
+ Optimization_Mode
+             --> max | min
+
+ LP_Problem_Status
+             --> unfeasible | unbounded | optimized
+\endcode
+
+\anchor predicates
+Below is a short description of each of the interface predicates.
+For full definitions of terminology used here, see Sections
+\ref preamble, \ref convex_polys, \ref representation
+and \ref Operations_on_Convex_Polyhedra of this manual.
+
+
+<H2><CODE> ppl_version_major(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the major number of the PPL version.
+
+<H2><CODE> ppl_version_minor(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the minor number of the PPL version.
+
+<H2><CODE> ppl_version_revision(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the revision number
+  of the PPL version.
+
+<H2><CODE> ppl_version_beta(?C_int) </CODE></H2>
+  Unifies <CODE>C_int</CODE> with the beta number of the PPL version.
+
+<H2><CODE> ppl_version(?Atom) </CODE></H2>
+  Unifies <CODE>Atom</CODE> with the PPL version.
+
+<H2><CODE> ppl_banner(?Atom) </CODE></H2>
+  Unifies <CODE>Atom</CODE> with
+  information about the PPL version, the licensing, the lack of any
+  warranty whatsoever, the C++ compiler used to build the library,
+  where to report bugs and where to look for further information.
+
+<H2><CODE> ppl_Coefficient_is_bounded </CODE></H2>
+
+  Succeeds if and only if the Coefficients in the C++ interface are bounded.
+
+<H2><CODE> ppl_Coefficient_max(Max) </CODE></H2>
+
+  If the Coefficients in the C++ interface are bounded,
+  then the maximum coefficient the C++ interface can handle is
+  unified with <CODE>Max</Code>.
+  If the Prolog system cannot handle this coefficient, then
+  an exception is thrown.
+  It fails if the Coefficients in the C++ interface are unbounded.
+
+<H2><CODE> ppl_Coefficient_min(Min) </CODE></H2>
+
+  If the Coefficients in the C++ interface are bounded,
+  then the minimum coefficient the C++ interface can handle is
+  unified with <CODE>Min</Code>.
+  If the Prolog system cannot handle this coefficient, then
+  an exception is thrown.
+  It fails if the Coefficients in the C++ interface are unbounded.
+
+<H2><CODE> ppl_max_space_dimension(?Dimension_Type) </CODE></H2>
+
+  Unifies <CODE>Dimension_Type</CODE> with the maximum space dimension
+  this library can handle.
+
+<H2><CODE>
+  ppl_initialize
+ </CODE></H2>
+
+  Initializes the PPL interface.
+  Multiple calls to <CODE>ppl_initialize</CODE> does no harm.
+
+<H2><CODE>
+  ppl_finalize
+ </CODE></H2>
+
+  Finalizes the PPL interface.
+  Once this is executed, the next call to an interface predicate must
+  either be to <CODE>ppl_initialize</CODE> or to <CODE>ppl_finalize</CODE>.
+  Multiple calls to <CODE>ppl_finalize</CODE> does no harm.
+
+<H2><CODE> ppl_set_timeout_exception_atom(+Atom) </CODE></H2>
+
+   Sets the atom to be thrown by timeout exceptions
+   to <CODE>Atom</CODE>.
+   The default value is <CODE>time_out</CODE>.
+
+<H2><CODE> ppl_timeout_exception_atom(?Atom) </CODE></H2>
+
+   The atom to be thrown by timeout exceptions
+   is unified with <CODE>Atom</CODE>.
+
+<H2><CODE> ppl_set_timeout(+C_unsigned) </CODE></H2>
+
+   Computations taking exponential time will be interrupted
+   some time after <CODE>C_unsigned</CODE> ms after that call.
+   If the computation is interrupted that way, the current timeout
+   exception atom will be thrown.
+   <CODE>C_unsigned</CODE> must be strictly greater than zero.
+
+<H2><CODE> ppl_reset_timeout </CODE></H2>
+
+   Resets the timeout time so that the computation is not interrupted.
+
+<H2><CODE>
+  ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+</H2>
+
+   Creates a C polyhedron \f$\cP\f$
+   with <CODE>Dimension_Type</CODE> dimensions; it is empty
+   or the universe polyhedron depending on whether <CODE>Atom</CODE>
+   is <CODE>empty</CODE> or <CODE>universe</CODE>, respectively.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+   Thus the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X).
+\endcode
+   creates the C polyhedron defining the 3-dimensional vector space
+   \f$\Rset^3\f$ with \p X bound to a valid handle for accessing it.
+
+<H2><CODE>
+  ppl_new_NNC_Polyhedron_from_space_dimension(+Dimension_Type,
+                                          +Universe_or_Empty, -Handle)
+</CODE>
+</H2>
+
+   Creates an NNC polyhedron \f$\cP\f$
+   with <CODE>Dimension_Type</CODE> dimensions; it is empty
+   or the universe polyhedron depending on whether <CODE>Atom</CODE>
+   is <CODE>empty</CODE> or <CODE>universe</CODE>, respectively.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+   Thus the query
+\code
+   ?- ppl_new_NNC_Polyhedron_from_space_dimension(3, empty, X).
+\endcode
+   creates an empty NNC polyhedron embedded in \f$\Rset^3\f$ with
+   \p X bound to a valid handle for accessing it.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to a C polyhedron \f$\cP_1\f$,
+   then this creates a copy \f$\cP_2\f$ of \f$\cP_1\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to an NNC polyhedron \f$\cP_1\f$,
+   then this creates a copy of \f$\cP_1\f$ as a C polyhedron \f$\cP_2\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+   Thus the query
+\code
+   ?- ppl_new_NNC_Polyhedron_from_space_dimension(3, empty, X),
+      ppl_new_C_Polyhedron_from_NNC_Polyhedron(X, Y).
+\endcode
+   creates an empty NNC polyhedron embedded in \f$\Rset^3\f$
+   referenced by \p X
+   and then makes a copy, converting the topology to a C polyhedron.
+   with \p Y bound to a valid handle for accessing it.
+
+   When using <CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron/2</CODE>,
+   care must be taken that the source polyhedron referenced by
+   <CODE>Handle_1</CODE> is topologically closed.
+
+<H2><CODE>
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to a C polyhedron \f$\cP_1\f$,
+   then this creates a copy of \f$\cP_1\f$ as an NNC polyhedron \f$\cP_2\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+   If <CODE>Handle_1</CODE> refers to a NNC polyhedron \f$\cP_1\f$,
+   then this creates a copy \f$\cP_2\f$ of \f$\cP_1\f$.
+   <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)
+ </CODE></H2>
+
+   Creates a C polyhedron \f$\cP\f$ represented by
+   <CODE>Constraint_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_NNC_Polyhedron_from_constraints(+Constraint_System, -Handle)
+ </CODE></H2>
+
+   Creates an NNC polyhedron \f$\cP\f$ represented by
+   <CODE>Constraint_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)
+ </CODE></H2>
+
+   Creates a C polyhedron \f$\cP\f$ represented by
+   <CODE>Generator_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_NNC_Polyhedron_from_generators(+Generator_System, -Handle)
+ </CODE></H2>
+
+   Creates an NNC polyhedron \f$\cP\f$ represented by
+   <CODE>Generator_System</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_bounding_box(+Box, -Handle)
+ </CODE></H2>
+
+   Creates a C polyhedron \f$\cP\f$ represented by <CODE>Box</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+   There must be no bounds of the form <CODE>o(Rational)</CODE>
+   in an interval in <CODE>Box</CODE>.
+
+<H2><CODE>
+   ppl_new_NNC_Polyhedron_from_bounding_box(+Box, -Handle)
+ </CODE></H2>
+
+   Creates an NNC polyhedron \f$\cP\f$ represented by <CODE>Box</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE> ppl_Polyhedron_swap(+Handle_1, +Handle_2) </CODE></H2>
+
+   Swaps the polyhedron referenced by <CODE>Handle_1</CODE>
+   with the one referenced by <CODE>Handle_2</CODE>.
+   The polyhedra \f$\cP\f$ and \f$\cQ\f$ must have the same topology.
+
+<H2><CODE> ppl_delete_Polyhedron(+Handle) </CODE></H2>
+
+   Deletes the polyhedron referenced by <CODE>Handle</CODE>.
+   After execution,
+   <CODE>Handle</CODE> is no longer a valid handle for a PPL polyhedron.
+
+<H2><CODE> ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type) </CODE></H2>
+
+   Unifies the dimension of the vector space in which the
+   polyhedron referenced by
+   <CODE>Handle</CODE> is embedded with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type) </CODE></H2>
+
+   Unifies the actual dimension of the polyhedron referenced by
+   <CODE>Handle</CODE> with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_constraints(+Handle, ?Constraint_System)
+ </CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a list of
+   the constraints in the constraints system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_minimized_constraints(+Handle,
+                                                   ?Constraint_System)
+ </CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a minimized list of
+   the constraints in the constraints system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_generators(+Handle, ?Generator_System)
+ </CODE></H2>
+
+   Unifies <CODE>Generator_System</CODE> with a list of
+   the generators in the generators system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_minimized_generators(+Handle,
+                                                  ?Generator_System)
+ </CODE></H2>
+
+   Unifies <CODE>Generator_System</CODE> with a minimized list of
+   the generators in the generators system
+   representing the polyhedron referenced by <CODE>Handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint,
+               ?Poly_Relation_List) </CODE></H2>
+
+Unifies <CODE>Poly_Relation_List</CODE> with the list of relations the
+polyhedron referenced by <CODE>Handle</CODE> has with
+<CODE>Constraint</CODE>.  The possible relations are listed in the
+grammar rules above; their meaning is given in Section
+\ref relation_with "specifying the relation_with operations".
+
+<H2><CODE> ppl_Polyhedron_relation_with_generator(+Handle, +Generator,
+               ?Poly_Relation_List) </CODE></H2>
+
+Unifies <CODE>Poly_Relation_List</CODE> with the list of relations the
+polyhedron referenced by <CODE>Handle</CODE> has with
+<CODE>Generator</CODE>.  The possible relations are listed in the
+grammar rules above; their meaning is given in
+Section \ref relation_with "specifying the relation_with operations".
+
+<H2><CODE> ppl_Polyhedron_get_bounding_box(+Handle,
+                                          +Complexity,
+            	                          ?Box) </CODE></H2>
+
+   Succeeds if and only if the bounding box
+   of the polyhedron referenced by
+   <CODE>Handle</CODE>
+   unifies with the box defined by <CODE>Box</CODE>.
+   E.g.,
+\code
+   ?- A = '$VAR'(0), B = '$VAR'(1),
+      ppl_new_NNC_Polyhedron_from_constraints([B > 0, 4*A =< 2], X),
+      ppl_Polyhedron_get_bounding_box(X, any, Box).
+
+   Box = [i(o(minf), c(1/2)), i(o(0), o(pinf))].
+\endcode
+Note that the rational numbers in <CODE>Box</CODE> are in canonical form.
+E.g., the following will fail:
+\code
+   ?- A = '$VAR'(0), B = '$VAR'(1),
+      ppl_new_NNC_Polyhedron_from_constraints([B > 0, 4*A =< 2], X),
+      ppl_Polyhedron_get_bounding_box(X, any, Box),
+      Box = [i(o(minf), c(2/4)), i(o(0), o(pinf))].
+\endcode
+
+The complexity class <CODE>Complexity</CODE> determining the algorithm
+to be used has the following meaning:
+- <CODE>polynomial</CODE> allows
+  code of the worst-case polynomial complexity class;
+- <CODE>simplex</CODE> allows
+  code of the worst-case exponential but typically polynomial
+  complexity class;
+- <CODE>any</CODE> allows
+  code of the universal complexity class.
+
+<H2><CODE> ppl_Polyhedron_is_empty(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is empty.
+
+<H2><CODE> ppl_Polyhedron_is_universe(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is the universe.
+
+<H2><CODE> ppl_Polyhedron_is_bounded(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is bounded.
+
+<H2><CODE> ppl_Polyhedron_bounds_from_above(+Handle,
+                                   +Lin_Expr) </CODE></H2>
+
+   Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from above in
+   the polyhedron referenced by <CODE>Handle</CODE>.
+
+
+<H2><CODE> ppl_Polyhedron_bounds_from_below(+Handle,
+                                   +Lin_Expr) </CODE></H2>
+
+   Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from below in
+   the polyhedron referenced by <CODE>Handle</CODE>.
+
+
+<H3><CODE>
+  ppl_Polyhedron_maximize(+Handle, +Lin_Expr, ?Coefficient_1,
+  			  ?Coefficient_2, ?Boolean)
+ </CODE></H3>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from above in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of
+  the supremum value and <CODE>Coefficient_2</CODE> with the denominator
+  of the supremum value.
+  If the supremum is also the maximum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr, ?Coefficient_1,
+  			             ?Coefficient_2, ?Boolean, ?Point)
+ </CODE></H2>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from above in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of
+  the supremum value,
+  <CODE>Coefficient_2</CODE> with the denominator of the supremum value,
+  and <CODE>Point</CODE> with a point or closure point where
+  <CODE>Lin_Expr</CODE> reaches this value.
+  If the supremum is also the maximum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_minimize(+Handle, +Lin_Expr, ?Coefficient_1,
+			  ?Coefficient_2, ?Boolean)
+</CODE></H2>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from below in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of the infimum value
+  and <CODE>Coefficient_2</CODE> with the denominator of the infimum value.
+  If the infimum is also the minimum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr, ?Coefficient_1,
+  			             ?Coefficient_2, ?Boolean, ?Point)
+</CODE></H2>
+
+  Succeeds if and only if the polyhedron \f$P\f$ referenced by
+  <CODE>Handle</CODE> is not empty
+  and <CODE>Lin_Expr</CODE> is bounded from below in \f$P\f$.
+
+  <CODE>Coefficient_1</CODE> is unified with the numerator of the
+  infimum value, <CODE>Coefficient_2</CODE> with the denominator of
+  the infimum value, and <CODE>Point</CODE> with  a point or
+  closure point where <CODE>Lin_Expr</CODE> reaches this value.
+  If the infimum is also the minimum,
+  <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+  and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE> ppl_Polyhedron_is_topologically_closed(+Handle) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle</CODE> is topologically closed.
+
+<H2><CODE> ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_2</CODE> is included in or
+   equal to the polyhedron referenced by <CODE>Handle_1</CODE>.
+
+<H2><CODE> ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_2</CODE> is included in but not
+   equal to the polyhedron referenced by <CODE>Handle_1</CODE>.
+
+<H2><CODE> ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)
+     </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_1</CODE> is disjoint from
+   the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+   Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_1</CODE> is
+   equal to the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_OK(+Handle) </CODE></H2>
+
+   Succeeds only if the polyhedron referenced by
+   <CODE>Handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants.  Useful for debugging purposes.
+
+<H2><CODE> ppl_Polyhedron_add_constraint(+Handle, +Constraint) </CODE></H2>
+
+<H2><CODE> ppl_Polyhedron_add_constraint_and_minimize(+Handle, +Constraint) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding
+   <CODE>Constraint</CODE> to its constraint system.
+   Thus, the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_constraint(X, 4*A + B - 2*C >= 5).
+\endcode
+    will update the polyhedron with handle \p X to consist of
+    the set of points
+    in the vector space \f$\Rset^3\f$ satisfying the constraint
+    \f$4x + y - 2z >= 5\f$.
+
+   Note that <CODE>ppl_Polyhedron_add_constraint_and_minimize/2</CODE>
+   will fail if, after adding the constraint, the polyhedron is empty.
+
+<H2><CODE> ppl_Polyhedron_add_generator(+Handle, +Generator) </CODE></H2>
+
+<H2><CODE> ppl_Polyhedron_add_generator_and_minimize(+Handle, +Generator) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding
+   <CODE>Generator</CODE> to its generator system.
+   Thus, after the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_generator(X, point(-100*A - 5*B, 8)).
+\endcode
+    will update the polyhedron with handle \p X to be the single point
+    \f$(-12.5, -0.625, 0)^\transpose\f$ in the vector space \f$\Rset^3\f$.
+
+<H2><CODE> ppl_Polyhedron_add_constraints(+Handle, +Constraint_System)
+ </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its constraint system the constraints in
+   <CODE>Constraint_System</CODE>.
+   E.g.,
+\code
+   | ?- ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+        A = '$VAR'(0), B = '$VAR'(1),
+        ppl_Polyhedron_add_constraints(X, [4*A + B >= 3, A = 1]),
+        ppl_Polyhedron_get_constraints(X, CS).
+
+   CS = [4*A+1*B>=3,1*A=1] ?
+\endcode
+The updated polyhedron referenced by <CODE>Handle</CODE> can be empty
+and a query will succeed even when
+<CODE>Constraint_System</CODE> is unsatisfiable.
+
+<H2><CODE> ppl_Polyhedron_add_constraints_and_minimize(+Handle,
+                                   +Constraint_System) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its constraint system the constraints in
+   <CODE>Constraint_System</CODE>.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1),
+      ppl_Polyhedron_add_constraints_and_minimize(X, [4*A + B >= 3, A = 1]),
+      ppl_Polyhedron_get_constraints(X, CS).
+
+   CS = [1*B>= -1,1*A=1]
+\endcode                                                                          This will fail if, after adding the constraints, the polyhedron is empty.
+   E.g., the following will fail,
+\code
+   ?- A = '$VAR'(0), B = '$VAR'(1),
+      ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+      ppl_Polyhedron_add_constraints_and_minimize(X,
+        [4*A + B >= 3, A = 0, B =< 0]),
+      ppl_Polyhedron_get_constraints(X, CS).
+\endcode
+<H2><CODE> ppl_C_Polyhedron_add_generators(+Handle, +Generator_System)
+ </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its generator system the generators in
+   <CODE>Generator_System</CODE>.
+
+   If the system of generators representing a polyhedron
+   is non-empty, then it must include a point
+   (see Section \ref Generators_Representation).
+   Thus care must be taken to ensure that, before calling this
+   predicate, either the polyhedron referenced by <CODE>Handle</CODE>
+   is non-empty or that whenever <CODE>Generator_System</CODE> is
+   non-empty the first element defines a point.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+      A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_generators(X,
+        [point(1*A + 1*B + 1*C, 1), ray(1*A), ray(2*A)]),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   GS = [ray(2*A), point(1*A+1*B+1*C), ray(1*A)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_add_generators_and_minimize(+Handle,
+                                   +Generator_System) </CODE></H2>
+
+   Updates the polyhedron referenced by <CODE>Handle</CODE> to
+   one obtained by adding to its generator system the generators in
+   <CODE>Generator_System</CODE>.
+
+   Unlike the predicate <CODE>ppl_add_generators</CODE>,
+   the order of the generators in
+   <CODE>Generator_System</CODE> is not important.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+      A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_add_generators_and_minimize(X,
+        [ray(1*A), ray(2*A), point(1*A + 1*B + 1*C, 1)]),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   GS = [point(1*A+1*B+1*C), ray(1*A)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2) </CODE></H2>
+<H2><CODE> ppl_Polyhedron_intersection_assign_and_minimize(+Handle_1,
+                     +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   its intersection with the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_poly_hull_assign(+Handle_1, +Handle_2) </CODE></H2>
+<H2><CODE> ppl_Polyhedron_poly_hull_assign_and_minimize(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   its poly-hull with the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_poly_difference_assign(+Handle_1, +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle_1</CODE>
+   its poly-difference with the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_image(+Handle, +PPL_Var,
+               +Lin_Expr, +Coefficient) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the affine expression
+   <CODE>Lin_Expr</CODE>/<CODE>Coefficient</CODE> to <CODE>PPL_Var</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var,
+               +Lin_Expr, +Coefficient) </CODE></H2>
+
+This is the inverse transformation to that for <CODE>ppl_affine_image</CODE>.
+
+<H2><CODE> ppl_Polyhedron_bounded_affine_image(+Handle,
+               +PPL_Var,
+               +Lin_Expr_1,
+               +Lin_Expr_2,
+               +Coefficient) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the image with respect to the transfer relation
+   <CODE>Lin_Expr_1/Coefficient <= PPL_Var <= Lin_Expr_2/Coefficient</CODE>.
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image(+Handle,
+               +PPL_Var,
+               +Relation_Symbol
+               +Lin_Expr,
+               +Coefficient) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the generalized
+   affine image with respect to the transfer function
+   <CODE>PPL_Var</CODE> <CODE>Relation_Symbol</CODE>
+   <CODE>Lin_Expr</CODE>/<CODE>Coefficient</CODE>.
+
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle,
+               +Lin_Expr_1,
+               +Relation_Symbol
+               +Lin_Expr_2) </CODE></H2>
+
+   Transforms the polyhedron referenced by <CODE>Handle</CODE>
+   assigning the generalized
+   affine image with respect to the transfer function
+   <CODE>Lin_Expr_1</CODE> <CODE>Relation_Symbol</CODE>
+   <CODE>Lin_Expr_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2) </CODE></H2>
+
+   Assigns to the polyhedron \f$\cP\f$ referenced by <CODE>Handle_1</CODE>
+   the time-elapse \f$ (\cP \nearrow \cQ)\f$
+   with the polyhedron \f$\cQ\f$ referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the BHRZ03-widening of \f$\cP_1\f$ with \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1,
+               +Handle_2, +C_unsigned_1, ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-widening of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE>.
+
+<H2><CODE> ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-extrapolation of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   improved by enforcing those constraints in <CODE>Constraint_System</CODE>.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-extrapolation of \f$\cP_1\f$ with
+   \f$\cP_2\f$, improved by enforcing those constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_H79_widening_assign(+Handle_1,
+               +Handle_2) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the H79-widening of \f$\cP_1\f$ with \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1,
+               +Handle_2, +C_unsigned_1, ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-widening of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE>.
+
+<H2><CODE> ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-extrapolation of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   improved by enforcing those constraints in <CODE>Constraint_System</CODE>.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to  \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1,
+               +Handle_2,
+               +Constraint_System) </CODE></H2>
+
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>Handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   then <CODE>Handle_1</CODE> will refer to
+   the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+               +Handle_1,
+               +Handle_2,
+               +Constraint_System,
+               +C_unsigned_1,
+               ?C_unsigned_2) </CODE></H2>
+
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>Handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>Handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-extrapolation of \f$\cP_1\f$ with
+   \f$\cP_2\f$, improved by enforcing those constraints in
+   <CODE>Constraint_System</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+   is the number of tokens available,
+   <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+   <BR>
+   If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+   will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+   depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+   <BR>
+   If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+   and the polyhedron referenced by <CODE>Handle_1</CODE> is
+   updated to \f$\cP\f$.
+   <BR>
+   In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+   will remain unchanged as  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_topological_closure_assign(+Handle) </CODE></H2>
+
+   Assigns to the polyhedron referenced by <CODE>Handle</CODE>
+   its topological closure.
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_embed(
+             +Handle, +Dimension_Type)
+ </CODE></H2>
+
+   Embeds the polyhedron  referenced by <CODE>Handle</CODE>
+   in a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(0, empty, X),
+      ppl_Polyhedron_add_space_dimensions_and_embed(X, 2),
+      ppl_Polyhedron_get_constraints(X, CS),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   CS = [],
+   GS = [point(0),line(1*A),line(1*B)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2) </CODE></H2>
+
+   Updates the polyhedron \f$\cP_1\f$ referenced  by <CODE>Handle_1</CODE>
+   by first embedding \f$\cP_1\f$ in a new space enlarged by
+   the space dimensions
+   of the polyhedron \f$\cP_2\f$ referenced by <CODE>Handle_2</CODE>,
+   and then adds to its system of constraints
+   a renamed-apart version of the constraints of  \f$\cP_2\f$.
+
+   E.g.,
+\code
+   ?- ppl_new_NNC_Polyhedron_from_space_dimension(2, universe, X),
+      A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      D = '$VAR'(3), E = '$VAR'(4),
+      ppl_new_NNC_Polyhedron_from_constraints([A > 1, B >= 0, C >= 0], Y),
+      ppl_Polyhedron_concatenate_assign(X, Y),
+      ppl_Polyhedron_get_constraints(X, CS).
+
+   CS = [1*C > 1, 1*D >= 0, 1*E >= 0]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_project(+Handle,
+                   +Dimension_Type)
+ </CODE></H2>
+
+   Projects the polyhedron  referenced by <CODE>Handle</CODE>
+   onto a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(0, empty, X),
+      ppl_Polyhedron_add_space_dimensions_and_project(X, 2),
+      ppl_Polyhedron_get_constraints(X, CS),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   CS = [1*A = 0, 1*B = 0],
+   GS = [point(0)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_remove_space_dimensions(+Handle,
+               +List_of_PPL_Vars) </CODE></H2>
+
+   Removes the space dimensions given by the identifiers of the
+   PPL variables in list <CODE>List_of_PPL_Vars</CODE>
+   from the polyhedron  referenced by <CODE>Handle</CODE>.
+   The identifiers for the remaining PPL variables are renumbered so that
+   they are consecutive and the maximum index is less than the number
+   of dimensions.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+      A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+      ppl_Polyhedron_remove_space_dimensions(X, [B]),
+      ppl_Polyhedron_space_dimension(X, K),
+      ppl_Polyhedron_get_generators(X, GS).
+
+   K = 2,
+   GS = [point(0),line(1*A),line(1*B),line(0)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type)) </CODE></H2>
+
+   Projects the polyhedron  referenced to by <CODE>Handle</CODE>
+   onto  the first <CODE>Dimension_Type</CODE> dimension.
+   E.g.,
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(5, empty, X),
+      ppl_Polyhedron_remove_higher_space_dimensions(X, 3),
+      ppl_Polyhedron_space_dimension(X, K).
+\endcode
+
+<H2><CODE>
+  ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type))
+</CODE></H2>
+
+   <CODE>Dimension_Type</CODE> copies of the space dimension referenced by
+   <CODE>PPL_Var</CODE> are added to the polyhedron
+   referenced to by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var))
+</CODE></H2>
+
+   The space dimensions referenced by the PPL variables in list
+   <CODE>List_of_PPL_Vars</CODE> are folded into the dimension referenced
+   by <CODE>PPL_Var</CODE> and removed.
+   The result is undefined if <CODE>List_of_PPL_Vars</CODE>
+   does not have the properties described in
+   Section \ref fold_space_dimensions.
+
+<H2><CODE> ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func)) </CODE></H2>
+
+   Maps the space dimensions of the polyhedron referenced by
+   <CODE>Handle</CODE>
+   using the partial function defined by <CODE>P_Func</CODE>.
+   The result is undefined if \p P_Func does not encode a partial
+   function with the properties described in
+   Section \ref Mapping_the_Dimensions_of_the_Vector_Space
+   "specifying the map_space_dimensions operator".
+
+<H2><CODE>
+  ppl_new_LP_Problem_trivial(-Handle)
+</CODE></H2>
+
+   Creates an LP Problem \f$\mathrm{LP}\f$ with
+   the feasible region the \f$0\f$-dimensional universe,
+   objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{LP}\f$.
+
+<H2><CODE>
+  ppl_new_LP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode,
+                     -Handle)
+</CODE></H2>
+
+   Creates an LP Problem \f$\mathrm{LP}\f$ with
+   the feasible region represented by <CODE>Constraint_System</CODE>,
+   objective function <CODE>Lin_Expr</CODE> and optimization mode
+   <CODE>Optimization_Mode</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{LP}\f$.
+
+<H2><CODE>
+  ppl_LP_Problem_swap(+Handle_1, +Handle_2)
+</CODE></H2>
+
+   Swaps the LP Problem referenced by <CODE>Handle_1</CODE>
+   with the one referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE>
+  ppl_delete_LP_Problem(+Handle)
+</CODE></H2>
+
+   Deletes the LP Problem referenced by <CODE>Handle</CODE>.
+   After execution,
+   <CODE>Handle</CODE> is no longer a valid handle for a PPL LP Problem.
+
+<H2><CODE>
+  ppl_LP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE></H2>
+
+   Unifies the dimension of the vector space in which the
+   LP Problem referenced by <CODE>Handle</CODE> is embedded
+   with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_constraints(+Handle, -Constraint_System)
+</CODE></H2>
+
+   Unifies <CODE>Constraint_System</CODE> with a list of
+   the constraints in the constraints system
+   representing the feasible region for the LP Problem
+   referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_objective_function(+Handle, -Lin_Expr)
+</CODE></H2>
+
+   Unifies <CODE>Lin_Expr</CODE> with the objective function
+   for the LP Problem referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
+</CODE></H2>
+
+   Unifies <CODE>Optimization_Mode</CODE> with the optimization mode
+   for the LP Problem referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_clear(+Handle)
+</CODE></H2>
+
+  Resets the LP problem referenced by <CODE>Handle</CODE>
+  to be the trivial problem with
+  the feasible region the \f$0\f$-dimensional universe,
+  objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_add_constraint(+Handle, +Constraint)
+</CODE></H2>
+
+   Updates the LP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with the constraint <CODE>Constraint</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE></H2>
+
+   Updates the LP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with all the constraints in <CODE>Constraint_System</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_set_objective_function(+Handle, +Lin_Expr)
+</CODE></H2>
+
+   Updates the LP Problem referenced by <CODE>Handle</CODE>
+   so that the objective function is changed to <CODE>Lin_Expr</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
+</CODE></H2>
+
+   Updates the LP Problem referenced by <CODE>Handle</CODE>
+   so that the optimization mode is changed to <CODE>Optimization_Mode</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_is_satisfiable(+Handle)
+</CODE></H2>
+
+  Succeeds if and only if the LP Problem referenced by
+  <CODE>Handle</CODE> is satisfiable.
+
+<H2><CODE>
+  ppl_LP_Problem_solve(+Handle, ?LP_Problem_Status)
+</CODE></H2>
+
+  Solves the LP problem  referenced by
+  <CODE>Handle</CODE> and unifies <CODE>LP_Problem_Status</CODE>
+  with:
+  <CODE>unfeasible</CODE>, if the LP problem is not satisfiable;
+  <CODE>unbounded</CODE>, if the LP problem is satisfiable but
+  there is no finite bound to the value of the objective function;
+  <CODE>optimized</CODE>, if the LP problem admits an optimal solution.
+
+<H2><CODE>
+  ppl_LP_Problem_feasible_point(+Handle, ?Generator)
+</CODE></H2>
+
+  Unifies  <CODE>Generator</CODE> with a feasible point for the LP problem
+  referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_optimizing_point(+Handle, ?Generator)
+</CODE></H2>
+
+  Unifies  <CODE>Generator</CODE> with an optimizing point for the LP problem
+  referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_optimal_value(+Handle, ?Coefficient_1, ?Coefficient_2)
+</CODE></H2>
+
+  Unifies <CODE>Coefficient_1</CODE> and <CODE>Coefficient_2</CODE>
+  with the numerator and denominator, respectively, for the optimal value
+  for the LP problem  referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_evaluate_objective_function(+Handle, +Generator,
+                                             ?Coefficient_1, ?Coefficient_2)
+</CODE></H2>
+  Evaluates the objective function of the LP problem  referenced by
+  <CODE>Handle</CODE> at point <CODE>Generator</CODE>.
+  <CODE>Coefficient_1</CODE> is unified with the numerator and
+  <CODE>Coefficient_2</CODE> is unified with the denominator of the
+  objective function value at <CODE>Generator</CODE>.
+
+<H2><CODE>
+  ppl_LP_Problem_OK(+Handle)
+</CODE></H2>
+
+   Succeeds only if the LP Problem referenced by
+   <CODE>Handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants.  Useful for debugging purposes.
+
+\anchor PI_Compilation
+<H1>Compilation and Installation</H1>
+
+When the Parma Polyhedra Library is configured, it tests for the existence
+of each supported Prolog system.  If a supported Prolog system is
+correctly installed in a standard location, things are arranged
+so that the corresponding interface is built and installed.
+
+As an option, the Prolog interface can track the creation and disposal
+of polyhedra.  In fact, differently from native Prolog data, PPL polyhedra
+must be explicitly disposed and forgetting to do so is a very common mistake.
+To enable this option, configure the library adding
+<CODE>-DPROLOG_TRACK_ALLOCATION</CODE> to the options passed to the
+C++ compiler.
+Your configure command would then look like
+\code
+  path/to/configure --with-cxxflags="-DPROLOG_TRACK_ALLOCATION" ...
+\endcode
+
+
+\anchor PI_SD_Features
+<H1>System-Dependent Features</H1>
+
+<H2>CIAO Prolog</H2>
+
+The Ciao Prolog interface to the PPL is available
+both as ``PPL enhanced'' Ciao Prolog interpreter
+and as a library that can be linked to Ciao Prolog programs.
+Only Ciao Prolog versions 1.10 #5 and later are supported.
+
+So that it can be used with the Ciao Prolog PPL interface, the
+Ciao Prolog installation must be configured with the
+<CODE>--disable-regs</CODE> option.
+
+<H3>The <CODE>ppl_ciao</CODE> Executable</H3>
+
+If an appropriate version of Ciao Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_ciao</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_ciao</CODE> executable is simply the Ciao Prolog
+interpreter with the Parma Polyhedra Library linked in.
+The only thing you should do to use the library is to
+call <CODE>ppl_initialize/0</CODE> before any other PPL predicate
+and to call <CODE>ppl_finalize/0</CODE> when you are done with the
+library.
+
+<H3>Linking the Library To Ciao Prolog Programs</H3>
+
+In order to allow linking Ciao Prolog programs to the PPL,
+the following files are installed in the directory
+<CODE>prefix/lib/ppl</CODE>:
+<CODE>ppl_ciao.pl</CODE> contains the required foreign declarations;
+<CODE>libppl_ciao.*</CODE> contain the executable code for the
+Ciao Prolog interface in various formats (static library, shared library,
+libtool library).
+If your Ciao Prolog program is constituted by, say, <CODE>source1.pl</CODE>
+and <CODE>source2.pl</CODE> and you want to create the executable
+<CODE>myprog</CODE>, your compilation command may look like
+\code
+ciaoc -o myprog prefix/lib/ppl/ppl_ciao.pl ciao_pl_check.pl \
+  -L '-Lprefix/lib/ppl -lppl_ciao -Lprefix/lib -lppl -lgmpxx -lgmp -lstdc++'
+\endcode
+
+<H2>GNU Prolog</H2>
+
+The GNU Prolog interface to the PPL is available both as a
+``PPL enhanced'' GNU Prolog interpreter and as a library that can be
+linked to GNU Prolog programs.
+The only GNU Prolog version that is known to work is a patched
+version of the ``unstable version'' tagged
+<A HREF="ftp://ftp.inria.fr/INRIA/Projects/contraintes/gprolog/unstable/gprolog-20040608.tgz">20040608</A>
+(which unpacks to a directory called <CODE>gprolog-1.2.18</CODE>).
+The patch is contained in the
+<CODE>interfaces/Prolog/GNU/README</CODE> file of the PPL's distribution.
+
+So that it can be used with the GNU Prolog PPL interface
+(and, for that matter, with any foreign code),
+the GNU Prolog installation must be configured with the
+<CODE>--disable-regs</CODE> option.
+
+<H3>The <CODE>ppl_gprolog</CODE> Executable</H3>
+
+If an appropriate version of GNU Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_gprolog</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_gprolog</CODE> executable is simply the GNU Prolog
+interpreter with the Parma Polyhedra Library linked in.
+The only thing you should do to use the library is to
+call <CODE>ppl_initialize/0</CODE> before any other PPL predicate
+and to call <CODE>ppl_finalize/0</CODE> when you are done with the
+library.
+
+<H3>Linking the Library To GNU Prolog Programs</H3>
+
+In order to allow linking GNU Prolog programs to the PPL,
+the following files are installed in the directory
+<CODE>prefix/lib/ppl</CODE>:
+<CODE>ppl_gprolog.pl</CODE> contains the required foreign declarations;
+<CODE>libppl_gprolog.*</CODE> contain the executable code for the
+GNU Prolog interface in various formats (static library, shared library,
+libtool library).
+If your GNU Prolog program is constituted by, say, <CODE>source1.pl</CODE>
+and <CODE>source2.pl</CODE> and you want to create the executable
+<CODE>myprog</CODE>, your compilation command may look like
+\code
+gplc -o myprog prefix/lib/ppl/ppl_gprolog.pl source1.pl source2.pl \
+  -L '-Lprefix/lib/ppl -lppl_gprolog -Lprefix/lib -lppl -lgmpxx -lgmp -lstdc++'
+\endcode
+
+
+<H2>SICStus Prolog</H2>
+
+The SICStus Prolog interface to the PPL is available
+both as a statically linked module or as a dynamically linked one.
+Only SICStus Prolog versions 3.9.0 and later are supported.
+
+<H3>The Statically Linked <CODE>ppl_sicstus</CODE> Executable</H3>
+
+If an appropriate version of SICStus Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_sicstus</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_sicstus</CODE> executable is simply the SICStus Prolog
+system with the Parma Polyhedra Library statically linked.
+The only thing you should do to use the library is to
+load <CODE>prefix/lib/ppl/ppl_sicstus.pl</CODE>.
+
+<H3>Loading the SICStus Interface Dynamically</H3>
+
+In order to dynamically load the library from SICStus Prolog you should
+simply load <CODE>prefix/lib/ppl/ppl_sicstus.pl</CODE>.
+Notice that, for dynamic linking to work, you should have configured
+the library with the <CODE>--enable-shared</CODE> option.
+
+
+<H2>SWI-Prolog</H2>
+
+The SWI-Prolog interface to the PPL is available
+both as a statically linked module or as a dynamically linked one.
+Only SWI-Prolog version 5.6.0 and later versions are supported.
+
+<H3>The <CODE>ppl_pl</CODE> Executable</H3>
+
+If an appropriate version of SWI-Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_pl</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_pl</CODE> executable is simply the SWI-Prolog
+shell with the Parma Polyhedra Library statically linked:
+from within <CODE>ppl_pl</CODE> all the services of the library
+are available without further action.
+
+<H3>Loading the SWI-Prolog Interface Dynamically</H3>
+
+In order to dynamically load the library from SWI-Prolog you should
+simply load <CODE>prefix/lib/ppl/ppl_swiprolog.pl</CODE>.
+This will invoke <CODE>ppl_initialize/0</CODE> and
+<CODE>ppl_finalize/0</CODE> automatically.
+Alternatively, you can load the library directly with
+\code
+:- load_foreign_library('prefix/lib/ppl/libppl_swiprolog').
+\endcode
+This will call <CODE>ppl_initialize/0</CODE> automatically.
+Analogously,
+\code
+:- unload_foreign_library('prefix/lib/ppl/libppl_swiprolog').
+\endcode
+will, as part of the unload process, invoke <CODE>ppl_finalize/0</CODE>.
+
+Notice that, for dynamic linking to work, you should have configured
+the library with the <CODE>--enable-shared</CODE> option.
+
+
+<H2>XSB</H2>
+
+The XSB Prolog interface to the PPL is available
+as a dynamically linked module.
+Only some CVS versions of XSB starting from 2 July 2005 are known to work.
+CVS versions starting from 11 November 2005 are known not to work.
+
+In order to dynamically load the library from XSB you should
+load the <CODE>ppl_xsb</CODE> module and import the predicates
+you need.
+For things to work, you may have to copy the files
+<CODE>prefix/lib/ppl/ppl_xsb.xwam</CODE>
+and
+<CODE>prefix/lib/ppl/ppl_xsb.so</CODE>
+in your current directory or in one of the XSB library directories.
+
+
+<H2>YAP</H2>
+
+The YAP Prolog interface to the PPL is available
+as a dynamically linked module.
+Only YAP versions following 5.1.0 and CVS HEAD versions starting from
+4 January 2006 are supported.  Notice that support for unbounded
+integers in YAP is young and may have errors that could affect
+programs using the PPL (see, e.g.,
+<A HREF="http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007780.html">http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007780.html</A>).
+
+In order to dynamically load the library from YAP you should
+simply load <CODE>prefix/lib/ppl/ppl_yap.pl</CODE>.
+This will invoke <CODE>ppl_initialize/0</CODE> automatically;
+it is the programmer's responsibility to call <CODE>ppl_finalize/0</CODE>
+when the PPL library is no longer needed.
+Notice that, for dynamic linking to work, you should have configured
+the library with the <CODE>--enable-shared</CODE> option.
+
+*/ /* \defgroup PrologInterface */
diff --git a/interfaces/Prolog/SICStus/Makefile.am b/interfaces/Prolog/SICStus/Makefile.am
new file mode 100644
index 0000000..e5db3ea
--- /dev/null
+++ b/interfaces/Prolog/SICStus/Makefile.am
@@ -0,0 +1,162 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SICSTUS_CFLI_FILES = sicstus_cfli.h sicstus_cfli.ic sicstus_cfli.cc
+
+EXTRA_DIST = \
+$(SICSTUS_CFLI_FILES) \
+ppl_sicstus_sd.cc \
+ppl_sicstus.pl \
+sp_clpq.pl \
+sp_pl_check.pl
+
+if BUILD_SICSTUS_PROLOG_INTERFACE
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog/src \
+$(SICSTUS_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+bin_PROGRAMS = ppl_sicstus
+ppl_sicstus_SOURCES =
+
+if ENABLE_SHARED
+
+pkglib_DATA = ppl_sicstus.pl ppl_sicstus.s.o
+
+ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la $(top_builddir)/Watchdog/src/libpwl.la .libs/ppl_sicstus_sd.o
+	$(LIBTOOL) --mode=link --tag=CXX \
+	splfr $(srcdir)/ppl_sicstus.pl .libs/ppl_sicstus_sd.o -o $@ \
+		$(top_builddir)/src/libppl.la \
+		$(top_builddir)/Watchdog/src/libpwl.la \
+		@extra_libraries@
+
+install-data-local: ppl_sicstus.so
+	$(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) \
+		$< $(DESTDIR)$(pkglibdir)/$<
+
+else !ENABLE_SHARED
+
+pkglib_DATA = ppl_sicstus.pl
+
+endif !ENABLE_SHARED
+
+noinst_LTLIBRARIES = ppl_sicstus_sd.la
+ppl_sicstus_sd_la_SOURCES = ppl_sicstus_sd.cc
+ppl_sicstus_sd_la_LDFLAGS = -module -avoid-version
+
+ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la $(top_builddir)/Watchdog/src/libpwl.la
+	$(LIBTOOL) --mode=link --tag=CXX \
+	spld --main=prolog \
+		--cflag=`echo '$(AM_CXXFLAGS) $(CXXFLAGS)' | tr " " ","` \
+		--resources=ppl_sicstus.s.o -o $@ \
+		$(top_builddir)/src/libppl.la \
+		$(top_builddir)/Watchdog/src/libpwl.la \
+		@extra_libraries@
+
+if ENABLE_STATIC
+
+ppl_sicstus.s.o: ppl_sicstus.pl ppl_sicstus_sd.o
+	splfr --static $(srcdir)/ppl_sicstus.pl ppl_sicstus_sd.o
+
+else !ENABLE_STATIC
+
+ppl_sicstus.s.o: ppl_sicstus.pl .libs/ppl_sicstus_sd.o
+	splfr --static $(srcdir)/ppl_sicstus.pl .libs/ppl_sicstus_sd.o
+
+endif !ENABLE_STATIC
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test
+
+pl_check_test: ppl_sicstus ppl_sicstus.pl sp_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+	if [ $(srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/../tests/pl_check.pl . ;\
+	fi
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		 ./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \
+        --goal "main."  \
+			>obtained_pchk
+	if [ $(srcdir) != `pwd` ]; then \
+	  rm -f pl_check.pl ;\
+	fi
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+# FIXME: the last prerequisite is to get around a bug of `spld': see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html
+clpq_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) | pl_check_test
+	LANG=C; \
+	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+	$(LIBTOOL) --mode=execute -dlopen ../../../src/libppl.la \
+	  ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+	    --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq')." \
+	      <$(srcdir)/../tests/script_clpq >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+# FIXME: the last prerequisite is to get around a bug of `spld': see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html
+clpq2_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) | clpq_test
+	LANG=C; \
+	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+	$(LIBTOOL) --mode=execute -dlopen ../../../src/libppl.la \
+	  ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+	    --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq2')." \
+	      <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+MOSTLYCLEANFILES = \
+ppl_sicstus.s.o ppl_sicstus.so \
+$(CLPQ_TESTS) \
+obtained_clpq obtained_clpq2 obtained_pchk
+
+endif BUILD_SICSTUS_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/SICStus/Makefile.in b/interfaces/Prolog/SICStus/Makefile.in
new file mode 100644
index 0000000..5f0bc02
--- /dev/null
+++ b/interfaces/Prolog/SICStus/Makefile.in
@@ -0,0 +1,742 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@bin_PROGRAMS =  \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	ppl_sicstus$(EXEEXT)
+subdir = interfaces/Prolog/SICStus
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+ppl_sicstus_sd_la_LIBADD =
+am__ppl_sicstus_sd_la_SOURCES_DIST = ppl_sicstus_sd.cc
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@am_ppl_sicstus_sd_la_OBJECTS =  \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	ppl_sicstus_sd.lo
+ppl_sicstus_sd_la_OBJECTS = $(am_ppl_sicstus_sd_la_OBJECTS)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@am_ppl_sicstus_sd_la_rpath =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_sicstus_OBJECTS =
+ppl_sicstus_OBJECTS = $(am_ppl_sicstus_OBJECTS)
+ppl_sicstus_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ppl_sicstus_sd_la_SOURCES) $(ppl_sicstus_SOURCES)
+DIST_SOURCES = $(am__ppl_sicstus_sd_la_SOURCES_DIST) \
+	$(ppl_sicstus_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+pkglibDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkglib_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+SICSTUS_CFLI_FILES = sicstus_cfli.h sicstus_cfli.ic sicstus_cfli.cc
+EXTRA_DIST = \
+$(SICSTUS_CFLI_FILES) \
+ppl_sicstus_sd.cc \
+ppl_sicstus.pl \
+sp_clpq.pl \
+sp_pl_check.pl
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@AM_CPPFLAGS = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/src \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/Watchdog/src \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@$(SICSTUS_PROLOG_INCLUDE_OPTIONS) \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@extra_includes@
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus_SOURCES = 
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_FALSE at pkglib_DATA = ppl_sicstus.pl
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_DATA = ppl_sicstus.pl ppl_sicstus.s.o
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@noinst_LTLIBRARIES = ppl_sicstus_sd.la
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus_sd_la_SOURCES = ppl_sicstus_sd.cc
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus_sd_la_LDFLAGS = -module -avoid-version
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_NONSTRICT = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ack.clpq \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ackn.clpq \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@fib.clpq \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@mc91.clpq \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@smm.clpq \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@sumto.clpq \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@tak.clpq
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_STRICT = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@schedule.clpq
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@MOSTLYCLEANFILES = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus.s.o ppl_sicstus.so \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@$(CLPQ_TESTS) \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@obtained_clpq obtained_clpq2 obtained_pchk
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Prolog/SICStus/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Prolog/SICStus/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+ppl_sicstus_sd.la: $(ppl_sicstus_sd_la_OBJECTS) $(ppl_sicstus_sd_la_DEPENDENCIES) 
+	$(CXXLINK) $(am_ppl_sicstus_sd_la_rpath) $(ppl_sicstus_sd_la_LDFLAGS) $(ppl_sicstus_sd_la_OBJECTS) $(ppl_sicstus_sd_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	     || test -f $$p1 \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+ at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@ppl_sicstus$(EXEEXT): $(ppl_sicstus_OBJECTS) $(ppl_sicstus_DEPENDENCIES) 
+ at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@	@rm -f ppl_sicstus$(EXEEXT)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@	$(LINK) $(ppl_sicstus_LDFLAGS) $(ppl_sicstus_OBJECTS) $(ppl_sicstus_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_sicstus_sd.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-pkglibDATA: $(pkglib_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	@list='$(pkglib_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+uninstall-pkglibDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+ at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+ at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@install-data-local:
+ at ENABLE_SHARED_FALSE@install-data-local:
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+	clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local
+
+install-exec-am: install-binPROGRAMS install-pkglibDATA
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
+	uninstall-pkglibDATA
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+	clean-binPROGRAMS clean-generic clean-libtool \
+	clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-binPROGRAMS install-data install-data-am \
+	install-data-local install-exec install-exec-am install-info \
+	install-info-am install-man install-pkglibDATA install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-binPROGRAMS \
+	uninstall-info-am uninstall-pkglibDATA
+
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la $(top_builddir)/Watchdog/src/libpwl.la .libs/ppl_sicstus_sd.o
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=link --tag=CXX \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	splfr $(srcdir)/ppl_sicstus.pl .libs/ppl_sicstus_sd.o -o $@ \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$(top_builddir)/src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		@extra_libraries@
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at install-data-local: ppl_sicstus.so
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		$< $(DESTDIR)$(pkglibdir)/$<
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la $(top_builddir)/Watchdog/src/libpwl.la
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=link --tag=CXX \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	spld --main=prolog \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		--cflag=`echo '$(AM_CXXFLAGS) $(CXXFLAGS)' | tr " " ","` \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		--resources=ppl_sicstus.s.o -o $@ \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		$(top_builddir)/src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		@extra_libraries@
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE at ppl_sicstus.s.o: ppl_sicstus.pl ppl_sicstus_sd.o
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE@	splfr --static $(srcdir)/ppl_sicstus.pl ppl_sicstus_sd.o
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE at ppl_sicstus.s.o: ppl_sicstus.pl .libs/ppl_sicstus_sd.o
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE@	splfr --static $(srcdir)/ppl_sicstus.pl .libs/ppl_sicstus_sd.o
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@check-local: pl_check_test clpq_test clpq2_test
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@pl_check_test: ppl_sicstus ppl_sicstus.pl sp_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	if [ $(srcdir) != `pwd` ]; then \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	  cp -f $(srcdir)/../tests/pl_check.pl . ;\
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	fi
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@		 ./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@        --goal "main."  \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@			>obtained_pchk
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	if [ $(srcdir) != `pwd` ]; then \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	  rm -f pl_check.pl ;\
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	fi
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+# FIXME: the last prerequisite is to get around a bug of `spld': see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@clpq_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) | pl_check_test
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	LANG=C; \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute -dlopen ../../../src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	  ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	    --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq')." \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	      <$(srcdir)/../tests/script_clpq >obtained_clpq
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+# FIXME: the last prerequisite is to get around a bug of `spld': see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@clpq2_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) | clpq_test
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	LANG=C; \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute -dlopen ../../../src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	  ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	    --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq2')." \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	      <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/SICStus/ppl_sicstus.pl b/interfaces/Prolog/SICStus/ppl_sicstus.pl
new file mode 100644
index 0000000..7f9904d
--- /dev/null
+++ b/interfaces/Prolog/SICStus/ppl_sicstus.pl
@@ -0,0 +1,29 @@
+/* Loader for the SICStus Prolog interface.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+foreign_resource(ppl_sicstus,
+[
+	init(ppl_sicstus_init),
+	deinit(ppl_sicstus_deinit)
+]).
+
+:- load_foreign_resource(ppl_sicstus).
diff --git a/interfaces/Prolog/SICStus/ppl_sicstus_sd.cc b/interfaces/Prolog/SICStus/ppl_sicstus_sd.cc
new file mode 100644
index 0000000..4ff3ab7
--- /dev/null
+++ b/interfaces/Prolog/SICStus/ppl_sicstus_sd.cc
@@ -0,0 +1,474 @@
+/* SICStus Prolog interface: system-dependent part.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+#include "sicstus_cfli.h"
+#include "../exceptions.hh"
+#include <cassert>
+#include <sstream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = true;
+  Prolog_min_integer = 0;
+  Prolog_max_integer = 0;
+}
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+PPL::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+  assert(SP_is_integer(t));
+  long v;
+  if (SP_get_integer(t, &v) != 0)
+    return PPL::Coefficient(v);
+  else {
+    char* s;
+    if (SP_get_number_chars(t, &s) != 0)
+      return PPL::Coefficient(s);
+    else
+      throw unknown_interface_error("integer_term_to_Coefficient");
+  }
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const PPL::Coefficient& n) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  long l = 0;
+  if (PPL::assign_r(l, n, PPL::ROUND_NOT_NEEDED) == PPL::V_EQ) {
+    if (SP_put_integer(t, l) == 0)
+      throw unknown_interface_error("Coefficient_to_integer_term()");
+  } else {
+    std::ostringstream s;
+    s << n;
+    if (SP_put_number_chars(t, s.str().c_str()) == 0)
+      throw unknown_interface_error("Coefficient_to_integer_term()");
+  }
+  return t;
+}
+
+} // namespace
+
+#include "../ppl_prolog.icc"
+
+#define SP_STUB_0(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref /* goal */, void*) { \
+  return name(); \
+}
+
+#define SP_STUB_1(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  return name(arg1); \
+}
+
+#define SP_STUB_2(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2); \
+}
+
+#define SP_STUB_3(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3); \
+}
+
+#define SP_STUB_4(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(4, goal, arg4)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3, arg4); \
+}
+
+#define SP_STUB_5(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(4, goal, arg4)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg5 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(5, goal, arg5)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3, arg4, arg5); \
+}
+
+#define SP_STUB_6(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(4, goal, arg4)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg5 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(5, goal, arg5)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg6 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(6, goal, arg6)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3, arg4, arg5, arg6); \
+}
+
+SP_STUB_1(ppl_version_major)
+SP_STUB_1(ppl_version_minor)
+SP_STUB_1(ppl_version_revision)
+SP_STUB_1(ppl_version_beta)
+SP_STUB_1(ppl_version)
+SP_STUB_1(ppl_banner)
+SP_STUB_1(ppl_max_space_dimension)
+SP_STUB_0(ppl_Coefficient_is_bounded)
+SP_STUB_1(ppl_Coefficient_max)
+SP_STUB_1(ppl_Coefficient_min)
+SP_STUB_0(ppl_initialize)
+SP_STUB_0(ppl_finalize)
+SP_STUB_1(ppl_set_timeout_exception_atom)
+SP_STUB_1(ppl_timeout_exception_atom)
+SP_STUB_1(ppl_set_timeout)
+SP_STUB_0(ppl_reset_timeout)
+SP_STUB_3(ppl_new_C_Polyhedron_from_space_dimension)
+SP_STUB_3(ppl_new_NNC_Polyhedron_from_space_dimension)
+SP_STUB_2(ppl_new_C_Polyhedron_from_C_Polyhedron)
+SP_STUB_2(ppl_new_C_Polyhedron_from_NNC_Polyhedron)
+SP_STUB_2(ppl_new_NNC_Polyhedron_from_C_Polyhedron)
+SP_STUB_2(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron)
+SP_STUB_2(ppl_new_C_Polyhedron_from_constraints)
+SP_STUB_2(ppl_new_NNC_Polyhedron_from_constraints)
+SP_STUB_2(ppl_new_C_Polyhedron_from_generators)
+SP_STUB_2(ppl_new_NNC_Polyhedron_from_generators)
+SP_STUB_2(ppl_new_C_Polyhedron_from_bounding_box)
+SP_STUB_2(ppl_new_NNC_Polyhedron_from_bounding_box)
+SP_STUB_2(ppl_Polyhedron_swap)
+SP_STUB_1(ppl_delete_Polyhedron)
+SP_STUB_2(ppl_Polyhedron_space_dimension)
+SP_STUB_2(ppl_Polyhedron_affine_dimension)
+SP_STUB_2(ppl_Polyhedron_get_constraints)
+SP_STUB_2(ppl_Polyhedron_get_minimized_constraints)
+SP_STUB_2(ppl_Polyhedron_get_generators)
+SP_STUB_2(ppl_Polyhedron_get_minimized_generators)
+SP_STUB_3(ppl_Polyhedron_relation_with_constraint)
+SP_STUB_3(ppl_Polyhedron_relation_with_generator)
+SP_STUB_3(ppl_Polyhedron_get_bounding_box)
+SP_STUB_1(ppl_Polyhedron_is_empty)
+SP_STUB_1(ppl_Polyhedron_is_universe)
+SP_STUB_1(ppl_Polyhedron_is_bounded)
+SP_STUB_2(ppl_Polyhedron_bounds_from_above)
+SP_STUB_2(ppl_Polyhedron_bounds_from_below)
+SP_STUB_5(ppl_Polyhedron_maximize)
+SP_STUB_6(ppl_Polyhedron_maximize_with_point)
+SP_STUB_5(ppl_Polyhedron_minimize)
+SP_STUB_6(ppl_Polyhedron_minimize_with_point)
+SP_STUB_1(ppl_Polyhedron_is_topologically_closed)
+SP_STUB_2(ppl_Polyhedron_contains_Polyhedron)
+SP_STUB_2(ppl_Polyhedron_strictly_contains_Polyhedron)
+SP_STUB_2(ppl_Polyhedron_is_disjoint_from_Polyhedron)
+SP_STUB_2(ppl_Polyhedron_equals_Polyhedron)
+SP_STUB_1(ppl_Polyhedron_OK)
+SP_STUB_2(ppl_Polyhedron_add_constraint)
+SP_STUB_2(ppl_Polyhedron_add_constraint_and_minimize)
+SP_STUB_2(ppl_Polyhedron_add_generator)
+SP_STUB_2(ppl_Polyhedron_add_generator_and_minimize)
+SP_STUB_2(ppl_Polyhedron_add_constraints)
+SP_STUB_2(ppl_Polyhedron_add_constraints_and_minimize)
+SP_STUB_2(ppl_Polyhedron_add_generators)
+SP_STUB_2(ppl_Polyhedron_add_generators_and_minimize)
+SP_STUB_2(ppl_Polyhedron_intersection_assign)
+SP_STUB_2(ppl_Polyhedron_intersection_assign_and_minimize)
+SP_STUB_2(ppl_Polyhedron_poly_hull_assign)
+SP_STUB_2(ppl_Polyhedron_poly_hull_assign_and_minimize)
+SP_STUB_2(ppl_Polyhedron_poly_difference_assign)
+SP_STUB_4(ppl_Polyhedron_affine_image)
+SP_STUB_4(ppl_Polyhedron_affine_preimage)
+SP_STUB_5(ppl_Polyhedron_bounded_affine_image)
+SP_STUB_5(ppl_Polyhedron_bounded_affine_preimage)
+SP_STUB_5(ppl_Polyhedron_generalized_affine_image)
+SP_STUB_5(ppl_Polyhedron_generalized_affine_preimage)
+SP_STUB_4(ppl_Polyhedron_generalized_affine_image_lhs_rhs)
+SP_STUB_4(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs)
+SP_STUB_2(ppl_Polyhedron_time_elapse_assign)
+SP_STUB_1(ppl_Polyhedron_topological_closure_assign)
+SP_STUB_4(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens)
+SP_STUB_2(ppl_Polyhedron_BHRZ03_widening_assign)
+SP_STUB_5(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens)
+SP_STUB_3(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign)
+SP_STUB_5(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens)
+SP_STUB_3(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign)
+SP_STUB_4(ppl_Polyhedron_H79_widening_assign_with_tokens)
+SP_STUB_2(ppl_Polyhedron_H79_widening_assign)
+SP_STUB_5(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens)
+SP_STUB_3(ppl_Polyhedron_limited_H79_extrapolation_assign)
+SP_STUB_5(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens)
+SP_STUB_3(ppl_Polyhedron_bounded_H79_extrapolation_assign)
+SP_STUB_2(ppl_Polyhedron_add_space_dimensions_and_project)
+SP_STUB_2(ppl_Polyhedron_add_space_dimensions_and_embed)
+SP_STUB_2(ppl_Polyhedron_concatenate_assign)
+SP_STUB_2(ppl_Polyhedron_remove_space_dimensions)
+SP_STUB_2(ppl_Polyhedron_remove_higher_space_dimensions)
+SP_STUB_3(ppl_Polyhedron_expand_space_dimension)
+SP_STUB_3(ppl_Polyhedron_fold_space_dimensions)
+SP_STUB_2(ppl_Polyhedron_map_space_dimensions)
+SP_STUB_1(ppl_new_LP_Problem_trivial)
+SP_STUB_4(ppl_new_LP_Problem)
+SP_STUB_2(ppl_new_LP_Problem_from_LP_Problem)
+SP_STUB_2(ppl_LP_Problem_swap)
+SP_STUB_1(ppl_delete_LP_Problem)
+SP_STUB_2(ppl_LP_Problem_space_dimension)
+SP_STUB_2(ppl_LP_Problem_constraints)
+SP_STUB_2(ppl_LP_Problem_objective_function)
+SP_STUB_2(ppl_LP_Problem_optimization_mode)
+SP_STUB_1(ppl_LP_Problem_clear)
+SP_STUB_2(ppl_LP_Problem_add_constraint)
+SP_STUB_2(ppl_LP_Problem_add_constraints)
+SP_STUB_2(ppl_LP_Problem_set_objective_function)
+SP_STUB_2(ppl_LP_Problem_set_optimization_mode)
+SP_STUB_1(ppl_LP_Problem_is_satisfiable)
+SP_STUB_2(ppl_LP_Problem_solve)
+SP_STUB_2(ppl_LP_Problem_feasible_point)
+SP_STUB_2(ppl_LP_Problem_optimizing_point)
+SP_STUB_3(ppl_LP_Problem_optimal_value)
+SP_STUB_4(ppl_LP_Problem_evaluate_objective_function)
+SP_STUB_1(ppl_LP_Problem_OK)
+
+#define SP_DEFINE_C_PREDICATE(name, arity) \
+  SP_define_c_predicate(#name, arity, "user", sp_stub_##name, NULL)
+
+extern "C" void
+ppl_sicstus_init(int /* when */) {
+  ppl_initialize();
+  for (size_t i = 0; i < sizeof(prolog_atoms)/sizeof(prolog_atoms[0]); ++i) {
+    if (SP_register_atom(*prolog_atoms[i].p_atom) == 0) {
+      Prolog_term_ref et = Prolog_new_term_ref();
+      Prolog_put_atom_chars(et, "Cannot initialize the PPL interface");
+      Prolog_raise_exception(et);
+      return;
+    }
+  }
+  SP_DEFINE_C_PREDICATE(ppl_version_major, 1);
+  SP_DEFINE_C_PREDICATE(ppl_version_minor, 1);
+  SP_DEFINE_C_PREDICATE(ppl_version_revision, 1);
+  SP_DEFINE_C_PREDICATE(ppl_version_beta, 1);
+  SP_DEFINE_C_PREDICATE(ppl_version, 1);
+  SP_DEFINE_C_PREDICATE(ppl_banner, 1);
+  SP_DEFINE_C_PREDICATE(ppl_max_space_dimension, 1);
+  SP_DEFINE_C_PREDICATE(ppl_Coefficient_is_bounded, 0);
+  SP_DEFINE_C_PREDICATE(ppl_Coefficient_max, 1);
+  SP_DEFINE_C_PREDICATE(ppl_Coefficient_min, 1);
+  SP_DEFINE_C_PREDICATE(ppl_initialize, 0);
+  SP_DEFINE_C_PREDICATE(ppl_finalize, 0);
+  SP_DEFINE_C_PREDICATE(ppl_set_timeout_exception_atom, 1);
+  SP_DEFINE_C_PREDICATE(ppl_timeout_exception_atom, 1);
+  SP_DEFINE_C_PREDICATE(ppl_set_timeout, 1);
+  SP_DEFINE_C_PREDICATE(ppl_reset_timeout, 0);
+  SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_space_dimension, 3);
+  SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_space_dimension, 3);
+  SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_C_Polyhedron, 2);
+  SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_NNC_Polyhedron, 2);
+  SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_C_Polyhedron, 2);
+  SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron, 2);
+  SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_constraints, 2);
+  SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_constraints, 2);
+  SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_generators, 2);
+  SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_generators, 2);
+  SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_bounding_box, 2);
+  SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_bounding_box, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_swap, 2);
+  SP_DEFINE_C_PREDICATE(ppl_delete_Polyhedron, 1);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_space_dimension, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_affine_dimension, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_constraints, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_minimized_constraints, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_generators, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_minimized_generators, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_relation_with_constraint, 3);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_relation_with_generator, 3);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_bounding_box, 3);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_empty, 1);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_universe, 1);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_bounded, 1);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounds_from_above, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounds_from_below, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_maximize, 5);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_maximize_with_point, 6);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_minimize, 5);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_minimize_with_point, 6);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_topologically_closed, 1);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_contains_Polyhedron, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_strictly_contains_Polyhedron, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_disjoint_from_Polyhedron, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_equals_Polyhedron, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_OK, 1);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_constraint, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_constraint_and_minimize, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_generator, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_generator_and_minimize, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_constraints, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_constraints_and_minimize, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_generators, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_generators_and_minimize, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_intersection_assign, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_intersection_assign_and_minimize, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_poly_hull_assign, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_poly_hull_assign_and_minimize, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_poly_difference_assign, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_affine_image, 4);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_affine_preimage, 4);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounded_affine_image, 5);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounded_affine_preimage, 5);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_generalized_affine_image, 5);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_generalized_affine_preimage, 5);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_generalized_affine_image_lhs_rhs, 4);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs, 4);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_time_elapse_assign, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_topological_closure_assign, 1);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens, 4);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_BHRZ03_widening_assign, 2);
+  SP_DEFINE_C_PREDICATE(
+           ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens, 5);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign, 3);
+  SP_DEFINE_C_PREDICATE(
+           ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens, 5);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign, 3);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_H79_widening_assign_with_tokens, 4);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_H79_widening_assign, 2);
+  SP_DEFINE_C_PREDICATE(
+           ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens, 5);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_limited_H79_extrapolation_assign, 3);
+  SP_DEFINE_C_PREDICATE(
+           ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens, 5);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounded_H79_extrapolation_assign, 3);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_space_dimensions_and_project, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_space_dimensions_and_embed, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_concatenate_assign, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_remove_space_dimensions, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_remove_higher_space_dimensions, 2);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_expand_space_dimension, 3);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_fold_space_dimensions, 3);
+  SP_DEFINE_C_PREDICATE(ppl_Polyhedron_map_space_dimensions, 2);
+  SP_DEFINE_C_PREDICATE(ppl_new_LP_Problem_trivial, 1);
+  SP_DEFINE_C_PREDICATE(ppl_new_LP_Problem, 4);
+  SP_DEFINE_C_PREDICATE(ppl_new_LP_Problem_from_LP_Problem, 2);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_swap, 2);
+  SP_DEFINE_C_PREDICATE(ppl_delete_LP_Problem, 1);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_space_dimension, 2);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_constraints, 2);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_objective_function, 2);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_optimization_mode, 2);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_clear, 1);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_add_constraint, 2);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_add_constraints, 2);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_set_objective_function, 2);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_set_optimization_mode, 2);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_is_satisfiable, 1);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_solve, 2);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_feasible_point, 2);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_optimizing_point, 2);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_optimal_value, 3);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_evaluate_objective_function, 4);
+  SP_DEFINE_C_PREDICATE(ppl_LP_Problem_OK, 1);
+}
+
+extern "C" void
+ppl_sicstus_deinit(int /* when */) {
+  for (size_t i = 0; i < sizeof(prolog_atoms)/sizeof(prolog_atoms[0]); ++i)
+    // SP_unregister_atom can fail.
+    // We ignore such failures: what else can we do?
+    (void) SP_unregister_atom(*prolog_atoms[i].p_atom);
+  ppl_finalize();
+}
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.cc b/interfaces/Prolog/SICStus/sicstus_cfli.cc
new file mode 100644
index 0000000..7797624
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.cc
@@ -0,0 +1,27 @@
+/* SICStus Prolog Common Foreign Language Interface: implementation.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "sicstus_cfli.h"
+
+#ifndef PCFLI_EXTERN_INLINE
+#include "sicstus_cfli.ic"
+#endif
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.h b/interfaces/Prolog/SICStus/sicstus_cfli.h
new file mode 100644
index 0000000..f1d209d
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.h
@@ -0,0 +1,155 @@
+/* SICStus Prolog Common Foreign Language Interface: declarations.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PCFLI_sicstus_cfli_h
+#define PCFLI_sicstus_cfli_h 1
+
+#include <sicstus/sicstus.h>
+
+#ifdef __GNUC__
+# define PCFLI_EXTERN_INLINE  extern __inline__
+# define PCFLI_INLINE_PROTOTYPES  1
+#endif
+
+#if defined (__cplusplus) && ! defined (PCFLI_EXTERN_INLINE)
+# define PCFLI_EXTERN_INLINE  inline
+#endif
+
+#ifdef PCFLI_EXTERN_INLINE
+# ifndef PCFLI_INLINE_PROTOTYPES
+#  define PCFLI_INLINE_PROTOTYPES  0
+# endif
+#else
+# define PCFLI_INLINE_PROTOTYPES  1
+#endif
+
+/* Temporary. */
+#define PCFLI_DECLSPEC
+
+#ifdef __cplusplus
+//extern "C" {
+#endif
+
+typedef SP_term_ref Prolog_term_ref;
+typedef SP_atom Prolog_atom;
+typedef int Prolog_foreign_return_type;
+static const Prolog_foreign_return_type PROLOG_SUCCESS = SP_SUCCESS;
+static const Prolog_foreign_return_type PROLOG_FAILURE = SP_FAILURE;
+
+
+#if PCFLI_INLINE_PROTOTYPES
+
+PCFLI_DECLSPEC Prolog_term_ref
+Prolog_new_term_ref();
+
+PCFLI_DECLSPEC int
+Prolog_put_term(Prolog_term_ref t, Prolog_term_ref u);
+
+PCFLI_DECLSPEC int
+Prolog_put_long(Prolog_term_ref t, long i);
+
+PCFLI_DECLSPEC int
+Prolog_put_atom_chars(Prolog_term_ref t, const char* s);
+
+PCFLI_DECLSPEC int
+Prolog_put_atom(Prolog_term_ref t, Prolog_atom a);
+
+PCFLI_DECLSPEC int
+Prolog_put_address(Prolog_term_ref t, void* p);
+
+Prolog_atom
+Prolog_atom_from_string(const char* s);
+
+PCFLI_DECLSPEC int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1);
+
+PCFLI_DECLSPEC int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2);
+
+PCFLI_DECLSPEC int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3);
+
+PCFLI_DECLSPEC int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3, Prolog_term_ref a4);
+
+PCFLI_DECLSPEC int
+Prolog_construct_cons(Prolog_term_ref c,
+		      Prolog_term_ref h, Prolog_term_ref t);
+
+PCFLI_DECLSPEC void
+Prolog_raise_exception(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_variable(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_atom(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_integer(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_address(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_compound(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_cons(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_get_long(Prolog_term_ref t, long& v);
+
+PCFLI_DECLSPEC int
+Prolog_get_address(Prolog_term_ref t, void*& p);
+
+PCFLI_DECLSPEC int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom& name);
+
+PCFLI_DECLSPEC int
+Prolog_get_compound_name_arity(Prolog_term_ref t,
+			       Prolog_atom& name, int& arity);
+
+PCFLI_DECLSPEC int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref a);
+
+PCFLI_DECLSPEC int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref h, Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u);
+
+#endif /* !PCFLI_INLINE_PROTOTYPES */
+
+#include "sicstus_cfli.ic"
+
+#ifdef __cplusplus
+//} /* extern "C" */
+#endif
+
+#endif // !defined(PCFLI_sicstus_cfli_h)
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.ic b/interfaces/Prolog/SICStus/sicstus_cfli.ic
new file mode 100644
index 0000000..fe735b5
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.ic
@@ -0,0 +1,299 @@
+/* SICStus Common Foreign Language Interface: definitions. -*- C -*-
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <assert.h>
+#include <limits.h>
+
+/*!
+  Return a new term reference.
+*/
+PCFLI_EXTERN_INLINE Prolog_term_ref
+Prolog_new_term_ref() {
+  return SP_new_term_ref();
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_term(Prolog_term_ref t, Prolog_term_ref u) {
+  return SP_put_term(t, u);
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_long(Prolog_term_ref t, long l) {
+  return SP_put_integer(t, l);
+}
+
+static int
+Prolog_put_big_ulong(Prolog_term_ref t, unsigned long ul) {
+  static unsigned char uc_buffer[sizeof(unsigned long) + 1];
+  static unsigned n;
+#if SIZEOF_LONG_LONG > SIZEOF_UNSIGNED_LONG
+  static long long ll_buffer;
+#endif
+
+#if SIZEOF_LONG_LONG > SIZEOF_UNSIGNED_LONG
+  ll_buffer = ul;
+  if (SP_put_integer_bytes(t, &ll_buffer, sizeof(ll_buffer), 1))
+    return 1;
+#endif
+  n = 0;
+  do {
+    uc_buffer[n++] = ul & 0xff;
+    ul >>= 8;
+  } while (ul);
+  if (uc_buffer[n-1] & 0x80)
+    uc_buffer[n++] = 0;
+  return SP_put_integer_bytes(t, &uc_buffer, n, 0);
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_ulong(Prolog_term_ref t, unsigned long ul) {
+  return
+    (ul <= LONG_MAX)
+    ? SP_put_integer(t, (long) ul)
+    : Prolog_put_big_ulong(t, ul);
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_atom_chars(Prolog_term_ref t, const char* s) {
+  return SP_put_string(t, s);
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_atom(Prolog_term_ref t, Prolog_atom a) {
+  return SP_put_atom(t, a);
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_address(Prolog_term_ref t, void* p) {
+  return SP_put_address(t, p);
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return SP_atom_from_string(s);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1) {
+  return SP_cons_functor(t, f, 1, a1);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2) {
+  return SP_cons_functor(t, f, 2, a1, a2);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3) {
+  return SP_cons_functor(t, f, 3, a1, a2, a3);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3, Prolog_term_ref a4) {
+  return SP_cons_functor(t, f, 4, a1, a2, a3, a4);
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_cons(Prolog_term_ref c,
+		      Prolog_term_ref h, Prolog_term_ref t) {
+  return SP_cons_list(c, h, t);
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+PCFLI_EXTERN_INLINE void
+Prolog_raise_exception(Prolog_term_ref t) {
+  SP_raise_exception(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_variable(Prolog_term_ref t) {
+  return SP_is_variable(t);
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_atom(Prolog_term_ref t) {
+  return SP_is_atom(t);
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_integer(Prolog_term_ref t) {
+  return SP_is_integer(t);
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_address(Prolog_term_ref t) {
+  return SP_is_integer(t);
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_compound(Prolog_term_ref t) {
+  return SP_is_compound(t);
+}
+
+/*!
+  Return true if \p t is a Prolog list, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_cons(Prolog_term_ref t) {
+  return SP_is_list(t);
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  return SP_get_integer(t, lp);
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into to \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  return SP_get_address(t, vpp);
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  return SP_get_atom(t, ap);
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  return SP_get_functor(t, ap, ip);
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref a) {
+  assert(Prolog_is_compound(t));
+  return SP_get_arg(i, t, a);
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref h, Prolog_term_ref t) {
+  assert(Prolog_is_cons(c));
+  return SP_get_list(c, h, t);
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return SP_unify(t, u);
+}
diff --git a/interfaces/Prolog/SICStus/sp_clpq.pl b/interfaces/Prolog/SICStus/sp_clpq.pl
new file mode 100644
index 0000000..113c3d5
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sp_clpq.pl
@@ -0,0 +1,35 @@
+/* Main program for the toy PPL/SICStus-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- set_prolog_flag(language, iso).
+
+:- ensure_loaded('ppl_sicstus.pl').
+:- use_module(library(lists), [append/3, member/2]).
+
+eat_eol :-
+	get_code(user_input, _EOL).
+
+main(CLPQ) :-
+    ensure_loaded(CLPQ),
+    set_prolog_flag(language, iso),	% FIXME: this is not ISO Prolog
+    nofileerrors,			% FIXME: this is not ISO Prolog
+    common_main.
diff --git a/interfaces/Prolog/SICStus/sp_pl_check.pl b/interfaces/Prolog/SICStus/sp_pl_check.pl
new file mode 100644
index 0000000..14e8dfe
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sp_pl_check.pl
@@ -0,0 +1,40 @@
+/* Main program for the toy PPL/SICStus-Prolog CLP(Q) predicate checker.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- set_prolog_flag(language, iso).
+
+prolog_system('SICStus').
+
+:- ensure_loaded('ppl_sicstus.pl').
+:- use_module(library(lists), [append/3, member/2]).
+
+main :-
+    ensure_loaded('pl_check.pl'),
+    set_prolog_flag(language, iso),	% FIXME: this is not ISO Prolog
+    nofileerrors,
+    (check_all ->
+	write('OK')
+    ;
+	write('FAILURE')
+    ),
+    nl,
+    halt.
diff --git a/interfaces/Prolog/SWI/Makefile.am b/interfaces/Prolog/SWI/Makefile.am
new file mode 100644
index 0000000..13240cc
--- /dev/null
+++ b/interfaces/Prolog/SWI/Makefile.am
@@ -0,0 +1,151 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+EXTRA_DIST = \
+ppl_swiprolog.cc \
+ppl_swiprolog.pl \
+pl_clpq.cc \
+pl_clpq.pl \
+swi_pl_check.pl
+
+if BUILD_SWI_PROLOG_INTERFACE
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog/src \
+$(SWI_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+pkglib_LTLIBRARIES = libppl_swiprolog.la
+libppl_swiprolog_la_SOURCES = ppl_swiprolog.cc
+libppl_swiprolog_la_LIBADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/Watchdog/src/libpwl.la \
+ at extra_libraries@
+libppl_swiprolog_la_LDFLAGS = -module -avoid-version
+
+bin_PROGRAMS = ppl_pl
+ppl_pl_SOURCES = ppl_pl.cc
+
+pkglib_DATA = ppl_swiprolog.pl
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+check_PROGRAMS = pl_clpq pl_clpq2
+pl_clpq_SOURCES = pl_clpq.cc
+pl_clpq2_SOURCES = pl_clpq.cc
+
+# Notice: we are linking statically until we understand whether
+# and if libtool and plld can interoperate.
+ppl_pl$(EXEEXT): ppl_swiprolog.o ppl_pl.o | libppl_swiprolog.la
+	plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
+		-o $@ $+ \
+		-L$(top_builddir)/src/.libs -lppl \
+		-L$(top_builddir)/Watchdog/src/.libs -lpwl \
+		@extra_libraries@
+
+pl_clpq$(EXEEXT): ppl_swiprolog.o pl_clpq.o pl_clpq.pl ../tests/clpq.pl | libppl_swiprolog.la 
+	plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
+		-o $@ $+ \
+		-L$(top_builddir)/src/.libs -lppl \
+		-L$(top_builddir)/Watchdog/src/.libs -lpwl \
+		@extra_libraries@
+
+pl_clpq2$(EXEEXT): ppl_swiprolog.o pl_clpq.o pl_clpq.pl ../tests/clpq2.pl | libppl_swiprolog.la 
+	plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
+		-o $@ $+ \
+		-L$(top_builddir)/src/.libs -lppl \
+		-L$(top_builddir)/Watchdog/src/.libs -lpwl \
+		@extra_libraries@
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test
+
+pl_check_test: swi_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+	if [ $(srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/../tests/pl_check.pl . ; \
+	fi ;\
+        echo "ensure_loaded('$(srcdir)/swi_pl_check'). main." > script_pchk
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+                ./ppl_pl < script_pchk
+	if [ $(srcdir) != `pwd` ]; then \
+	  rm -f pl_check.pl; \
+	fi
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+clpq_test: pl_clpq ../tests/script_clpq $(EXPECTED_CLPQ)
+	LANG=C; \
+	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		./pl_clpq <$(srcdir)/../tests/script_clpq >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: pl_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2)
+	LANG=C; \
+	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		./pl_clpq2 <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+MOSTLYCLEANFILES = \
+pl_clpq pl_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk \
+$(CLPQ_TESTS) \
+script_pchk
+
+endif BUILD_SWI_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/SWI/Makefile.in b/interfaces/Prolog/SWI/Makefile.in
new file mode 100644
index 0000000..0246497
--- /dev/null
+++ b/interfaces/Prolog/SWI/Makefile.in
@@ -0,0 +1,789 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@bin_PROGRAMS = ppl_pl$(EXEEXT)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@check_PROGRAMS = pl_clpq$(EXEEXT) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	pl_clpq2$(EXEEXT)
+subdir = interfaces/Prolog/SWI
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(pkglibdir)"
+pkglibLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
+am__libppl_swiprolog_la_SOURCES_DIST = ppl_swiprolog.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@am_libppl_swiprolog_la_OBJECTS =  \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	ppl_swiprolog.lo
+libppl_swiprolog_la_OBJECTS = $(am_libppl_swiprolog_la_OBJECTS)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@am_libppl_swiprolog_la_rpath =  \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	-rpath $(pkglibdir)
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am__pl_clpq_SOURCES_DIST = pl_clpq.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@am_pl_clpq_OBJECTS =  \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	pl_clpq.$(OBJEXT)
+pl_clpq_OBJECTS = $(am_pl_clpq_OBJECTS)
+pl_clpq_LDADD = $(LDADD)
+am__pl_clpq2_SOURCES_DIST = pl_clpq.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@am_pl_clpq2_OBJECTS =  \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	pl_clpq.$(OBJEXT)
+pl_clpq2_OBJECTS = $(am_pl_clpq2_OBJECTS)
+pl_clpq2_LDADD = $(LDADD)
+am__ppl_pl_SOURCES_DIST = ppl_pl.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@am_ppl_pl_OBJECTS = ppl_pl.$(OBJEXT)
+ppl_pl_OBJECTS = $(am_ppl_pl_OBJECTS)
+ppl_pl_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_swiprolog_la_SOURCES) $(pl_clpq_SOURCES) \
+	$(pl_clpq2_SOURCES) $(ppl_pl_SOURCES)
+DIST_SOURCES = $(am__libppl_swiprolog_la_SOURCES_DIST) \
+	$(am__pl_clpq_SOURCES_DIST) $(am__pl_clpq2_SOURCES_DIST) \
+	$(am__ppl_pl_SOURCES_DIST)
+pkglibDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkglib_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+EXTRA_DIST = \
+ppl_swiprolog.cc \
+ppl_swiprolog.pl \
+pl_clpq.cc \
+pl_clpq.pl \
+swi_pl_check.pl
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@AM_CPPFLAGS = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/src \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/Watchdog/src \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(SWI_PROLOG_INCLUDE_OPTIONS) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@@extra_includes@
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pkglib_LTLIBRARIES = libppl_swiprolog.la
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_SOURCES = ppl_swiprolog.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_LIBADD = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@@extra_libraries@
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_LDFLAGS = -module -avoid-version
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ppl_pl_SOURCES = ppl_pl.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pkglib_DATA = ppl_swiprolog.pl
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_NONSTRICT = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ack.clpq \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ackn.clpq \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@fib.clpq \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@mc91.clpq \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@smm.clpq \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@sumto.clpq \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@tak.clpq
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_STRICT = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@schedule.clpq
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq_SOURCES = pl_clpq.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq2_SOURCES = pl_clpq.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@MOSTLYCLEANFILES = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq pl_clpq2 \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@obtained_clpq obtained_clpq2 obtained_pchk \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(CLPQ_TESTS) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@script_pchk
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Prolog/SWI/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Prolog/SWI/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    f=$(am__strip_dir) \
+	    echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	    $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	  else :; fi; \
+	done
+
+uninstall-pkglibLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  p=$(am__strip_dir) \
+	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+	done
+
+clean-pkglibLTLIBRARIES:
+	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+libppl_swiprolog.la: $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_DEPENDENCIES) 
+	$(CXXLINK) $(am_libppl_swiprolog_la_rpath) $(libppl_swiprolog_la_LDFLAGS) $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	     || test -f $$p1 \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@pl_clpq$(EXEEXT): $(pl_clpq_OBJECTS) $(pl_clpq_DEPENDENCIES) 
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@	@rm -f pl_clpq$(EXEEXT)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@	$(CXXLINK) $(pl_clpq_LDFLAGS) $(pl_clpq_OBJECTS) $(pl_clpq_LDADD) $(LIBS)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@pl_clpq2$(EXEEXT): $(pl_clpq2_OBJECTS) $(pl_clpq2_DEPENDENCIES) 
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@	@rm -f pl_clpq2$(EXEEXT)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@	$(CXXLINK) $(pl_clpq2_LDFLAGS) $(pl_clpq2_OBJECTS) $(pl_clpq2_LDADD) $(LIBS)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@ppl_pl$(EXEEXT): $(ppl_pl_OBJECTS) $(ppl_pl_DEPENDENCIES) 
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@	@rm -f ppl_pl$(EXEEXT)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@	$(CXXLINK) $(ppl_pl_LDFLAGS) $(ppl_pl_OBJECTS) $(ppl_pl_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pl_clpq.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_pl.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_swiprolog.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-pkglibDATA: $(pkglib_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	@list='$(pkglib_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+uninstall-pkglibDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+	clean-libtool clean-pkglibLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS install-pkglibDATA \
+	install-pkglibLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
+	uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+	clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+	clean-libtool clean-pkglibLTLIBRARIES ctags distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-pkglibDATA \
+	install-pkglibLTLIBRARIES install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-binPROGRAMS \
+	uninstall-info-am uninstall-pkglibDATA \
+	uninstall-pkglibLTLIBRARIES
+
+
+# Notice: we are linking statically until we understand whether
+# and if libtool and plld can interoperate.
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ppl_pl$(EXEEXT): ppl_swiprolog.o ppl_pl.o | libppl_swiprolog.la
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-o $@ $+ \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-L$(top_builddir)/src/.libs -lppl \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-L$(top_builddir)/Watchdog/src/.libs -lpwl \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		@extra_libraries@
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq$(EXEEXT): ppl_swiprolog.o pl_clpq.o pl_clpq.pl ../tests/clpq.pl | libppl_swiprolog.la 
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-o $@ $+ \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-L$(top_builddir)/src/.libs -lppl \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-L$(top_builddir)/Watchdog/src/.libs -lpwl \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		@extra_libraries@
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq2$(EXEEXT): ppl_swiprolog.o pl_clpq.o pl_clpq.pl ../tests/clpq2.pl | libppl_swiprolog.la 
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-o $@ $+ \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-L$(top_builddir)/src/.libs -lppl \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-L$(top_builddir)/Watchdog/src/.libs -lpwl \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		@extra_libraries@
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@check-local: pl_check_test clpq_test clpq2_test
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_check_test: swi_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	if [ $(srcdir) != `pwd` ]; then \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	  cp -f $(srcdir)/../tests/pl_check.pl . ; \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	fi ;\
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@        echo "ensure_loaded('$(srcdir)/swi_pl_check'). main." > script_pchk
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@                ./ppl_pl < script_pchk
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	if [ $(srcdir) != `pwd` ]; then \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	  rm -f pl_check.pl; \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	fi
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@clpq_test: pl_clpq ../tests/script_clpq $(EXPECTED_CLPQ)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	LANG=C; \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		./pl_clpq <$(srcdir)/../tests/script_clpq >obtained_clpq
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@clpq2_test: pl_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	LANG=C; \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@		./pl_clpq2 <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/SWI/pl_clpq.cc b/interfaces/Prolog/SWI/pl_clpq.cc
new file mode 100644
index 0000000..5a34f4f
--- /dev/null
+++ b/interfaces/Prolog/SWI/pl_clpq.cc
@@ -0,0 +1,42 @@
+/* C++ main program for the toy PPL/SWI-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <SWI-Prolog.h>
+
+extern "C" install_t install();
+extern "C" install_t uninstall();
+
+int
+main(int, char** argv) {
+  char* pl_args[2];
+  pl_args[0] = argv[0];
+  pl_args[1] = 0;
+  if (!PL_initialise(1, pl_args))
+    PL_halt(1);
+
+  install();
+  predicate_t pred = PL_predicate("main", 0, "user");
+  term_t h0 = PL_new_term_refs(0);
+  int ret_val = PL_call_predicate(0, PL_Q_NORMAL, pred, h0);
+  uninstall();
+  PL_halt(ret_val ? 0 : 1);
+}
diff --git a/interfaces/Prolog/SWI/pl_clpq.pl b/interfaces/Prolog/SWI/pl_clpq.pl
new file mode 100644
index 0000000..b8cbf2c
--- /dev/null
+++ b/interfaces/Prolog/SWI/pl_clpq.pl
@@ -0,0 +1,32 @@
+/* Prolog main program for the toy PPL/SWI-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+eat_eol.
+
+main :-
+  % FIXME: clearing the prompt as it is done here is a temporary workaround.
+  % In SWI-Prolog versions up to and including 5.4.1, the prompt is written
+  % to the output stream even if it is not connected to an actual terminal.
+  % See http://www.cs.unipr.it/pipermail/ppl-devel/2004-October/005078.html.
+  prompt(Old_Prompt, ''),
+  common_main,
+  prompt(_, Old_Prompt).
diff --git a/interfaces/Prolog/SWI/ppl_pl.cc b/interfaces/Prolog/SWI/ppl_pl.cc
new file mode 100644
index 0000000..df982a9
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_pl.cc
@@ -0,0 +1,38 @@
+/* Main program for SWI-Prolog with the PPL statically linked.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <SWI-Prolog.h>
+
+extern "C" install_t install();
+extern "C" install_t uninstall();
+
+int
+main(int argc, char **argv) {
+  if (!PL_initialise(argc, argv))
+    PL_halt(1);
+  PL_install_readline();
+
+  install();
+  int ret_val = PL_toplevel();
+  uninstall();
+  PL_halt(ret_val ? 0 : 1);
+}
diff --git a/interfaces/Prolog/SWI/ppl_swiprolog.cc b/interfaces/Prolog/SWI/ppl_swiprolog.cc
new file mode 100644
index 0000000..5a30db5
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_swiprolog.cc
@@ -0,0 +1,524 @@
+/* SWI Prolog interface.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+
+// Include gmp.h before SWI-Prolog.h.  This is required in order
+// to get access to interface functions dealing with GMP numbers
+// and SWI-Prolog terms.
+#include <gmp.h>
+#include <SWI-Prolog.h>
+#include <cassert>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+typedef term_t Prolog_term_ref;
+typedef atom_t Prolog_atom;
+typedef foreign_t Prolog_foreign_return_type;
+
+namespace {
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+} // namespace
+
+#include "../exceptions.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+long Prolog_max_integer;
+
+/*!
+  Temporary used to communicate big integers between C++ and Prolog.
+*/
+mpz_class tmp_mpz_class;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = true;
+  Prolog_min_integer = 0;
+  Prolog_max_integer = 0;
+}
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return PL_new_term_ref();
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref t, Prolog_term_ref u) {
+  PL_put_term(t, u);
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref t, long l) {
+  PL_put_integer(t, l);
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref t, unsigned long ul) {
+  if (ul <= LONG_MAX)
+    PL_put_integer(t, ul);
+  else if (ul <= static_cast<uint64_t>(std::numeric_limits<int64_t>::max()))
+    PL_put_int64(t, static_cast<int64_t>(ul));
+  else {
+    PPL::assign_r(tmp_mpz_class, ul, PPL::ROUND_NOT_NEEDED);
+    PL_unify_mpz(t, tmp_mpz_class.get_mpz_t());
+  }
+  return 1;
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref t, const char* s) {
+  PL_put_atom_chars(t, s);
+  return 1;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref t, Prolog_atom a) {
+  PL_put_atom(t, a);
+  return 1;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref t, void* p) {
+  PL_put_pointer(t, p);
+  return 1;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return PL_new_atom(s);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1) {
+  PL_cons_functor(t, PL_new_functor(f, 1), a1);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2) {
+  PL_cons_functor(t, PL_new_functor(f, 2), a1, a2);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3) {
+  PL_cons_functor(t, PL_new_functor(f, 3), a1, a2, a3);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3, Prolog_term_ref a4) {
+  PL_cons_functor(t, PL_new_functor(f, 4), a1, a2, a3, a4);
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref c,
+		      Prolog_term_ref h, Prolog_term_ref t) {
+  PL_cons_list(c, h, t);
+  return 1;
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  (void) PL_raise_exception(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return PL_is_variable(t);
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return PL_is_atom(t);
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return PL_is_integer(t);
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  return PL_is_integer(t);
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return PL_is_compound(t);
+}
+
+/*!
+  Return true if \p t is a Prolog list, false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  return !PL_is_atom(t) && PL_is_list(t);
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  return PL_get_long(t, lp);
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  return PL_get_pointer(t, vpp);
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  return PL_get_atom(t, ap);
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  return PL_get_name_arity(t, ap, ip);
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref a) {
+  assert(Prolog_is_compound(t));
+  return PL_get_arg(i, t, a);
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref h, Prolog_term_ref t) {
+  assert(Prolog_is_cons(c));
+  return PL_get_list(c, h, t);
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return PL_unify(t, u);
+}
+
+PPL::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+  assert(Prolog_is_integer(t));
+  PL_get_mpz(t, tmp_mpz_class.get_mpz_t());
+  return PPL::Coefficient(tmp_mpz_class);
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const PPL::Coefficient& n) {
+  PPL::assign_r(tmp_mpz_class, n, PPL::ROUND_NOT_NEEDED);
+  Prolog_term_ref t = Prolog_new_term_ref();
+  PL_unify_mpz(t, tmp_mpz_class.get_mpz_t());
+  return t;
+}
+
+} // namespace
+
+#include "../ppl_prolog.icc"
+
+#define PL_EXTENSION_ENTRY(name, arity) { #name, arity, (void*) name, 0 },
+
+namespace {
+
+PL_extension predicates[] = {
+  PL_EXTENSION_ENTRY(ppl_version_major, 1)
+  PL_EXTENSION_ENTRY(ppl_version_minor, 1)
+  PL_EXTENSION_ENTRY(ppl_version_revision, 1)
+  PL_EXTENSION_ENTRY(ppl_version_beta, 1)
+  PL_EXTENSION_ENTRY(ppl_version, 1)
+  PL_EXTENSION_ENTRY(ppl_banner, 1)
+  PL_EXTENSION_ENTRY(ppl_max_space_dimension, 1)
+  PL_EXTENSION_ENTRY(ppl_Coefficient_is_bounded, 0)
+  PL_EXTENSION_ENTRY(ppl_Coefficient_max, 1)
+  PL_EXTENSION_ENTRY(ppl_Coefficient_min, 1)
+  PL_EXTENSION_ENTRY(ppl_initialize, 0)
+  PL_EXTENSION_ENTRY(ppl_finalize, 0)
+  PL_EXTENSION_ENTRY(ppl_set_timeout_exception_atom, 1)
+  PL_EXTENSION_ENTRY(ppl_timeout_exception_atom, 1)
+  PL_EXTENSION_ENTRY(ppl_set_timeout, 1)
+  PL_EXTENSION_ENTRY(ppl_reset_timeout, 0)
+  PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_space_dimension, 3)
+  PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_space_dimension, 3)
+  PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_C_Polyhedron, 2)
+  PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_NNC_Polyhedron, 2)
+  PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_C_Polyhedron, 2)
+  PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron, 2)
+  PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_constraints, 2)
+  PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_constraints, 2)
+  PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_generators, 2)
+  PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_generators, 2)
+  PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_bounding_box, 2)
+  PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_bounding_box, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_swap, 2)
+  PL_EXTENSION_ENTRY(ppl_delete_Polyhedron, 1)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_space_dimension, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_affine_dimension, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_get_constraints, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_get_minimized_constraints, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_get_generators, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_get_minimized_generators, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_relation_with_constraint, 3)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_relation_with_generator, 3)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_get_bounding_box, 3)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_is_empty, 1)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_is_universe, 1)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_is_bounded, 1)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_bounds_from_above, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_bounds_from_below, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_maximize, 5)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_maximize_with_point, 6)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_minimize, 5)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_minimize_with_point, 6)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_is_topologically_closed, 1)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_topological_closure_assign, 1)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_contains_Polyhedron, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_strictly_contains_Polyhedron, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_is_disjoint_from_Polyhedron, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_equals_Polyhedron, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_OK, 1)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_constraint, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_constraint_and_minimize, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_generator, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_generator_and_minimize, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_constraints, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_constraints_and_minimize, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_generators, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_generators_and_minimize, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_intersection_assign, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_intersection_assign_and_minimize, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_poly_hull_assign, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_poly_hull_assign_and_minimize, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_poly_difference_assign, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_affine_image, 4)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_affine_preimage, 4)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_bounded_affine_image, 5)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_bounded_affine_preimage, 5)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_generalized_affine_image, 5)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_generalized_affine_preimage, 5)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_generalized_affine_image_lhs_rhs, 4)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs, 4)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_time_elapse_assign, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens, 4)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_BHRZ03_widening_assign, 2)
+  PL_EXTENSION_ENTRY(
+           ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens, 5)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign, 3)
+  PL_EXTENSION_ENTRY(
+           ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens, 5)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign, 3)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_H79_widening_assign_with_tokens, 4)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_H79_widening_assign, 2)
+  PL_EXTENSION_ENTRY(
+           ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens, 5)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_limited_H79_extrapolation_assign, 3)
+  PL_EXTENSION_ENTRY(
+           ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens, 5)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_bounded_H79_extrapolation_assign, 3)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_space_dimensions_and_project, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_add_space_dimensions_and_embed, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_concatenate_assign, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_remove_space_dimensions, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_remove_higher_space_dimensions, 2)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_expand_space_dimension, 3)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_fold_space_dimensions, 3)
+  PL_EXTENSION_ENTRY(ppl_Polyhedron_map_space_dimensions, 2)
+  PL_EXTENSION_ENTRY(ppl_new_LP_Problem_trivial, 1)
+  PL_EXTENSION_ENTRY(ppl_new_LP_Problem, 4)
+  PL_EXTENSION_ENTRY(ppl_new_LP_Problem_from_LP_Problem, 2)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_swap, 2)
+  PL_EXTENSION_ENTRY(ppl_delete_LP_Problem, 1)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_space_dimension, 2)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_constraints, 2)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_objective_function, 2)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_optimization_mode, 2)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_clear, 1)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_add_constraint, 2)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_add_constraints, 2)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_set_objective_function, 2)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_set_optimization_mode, 2)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_is_satisfiable, 1)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_solve, 2)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_feasible_point, 2)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_optimizing_point, 2)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_optimal_value, 3)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_evaluate_objective_function, 4)
+  PL_EXTENSION_ENTRY(ppl_LP_Problem_OK, 1)
+  { NULL, 0, NULL, 0 }
+};
+
+} // namespace
+
+extern "C" install_t
+install() {
+  ppl_initialize();
+  PL_register_extensions(predicates);
+}
+
+extern "C" install_t
+uninstall() {
+  ppl_finalize();
+}
diff --git a/interfaces/Prolog/SWI/ppl_swiprolog.pl b/interfaces/Prolog/SWI/ppl_swiprolog.pl
new file mode 100644
index 0000000..946b999
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_swiprolog.pl
@@ -0,0 +1,23 @@
+/* Loader for the SWI-Prolog interface.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- load_foreign_library('libppl_swiprolog').
diff --git a/interfaces/Prolog/SWI/swi_pl_check.pl b/interfaces/Prolog/SWI/swi_pl_check.pl
new file mode 100644
index 0000000..a4a9004
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_pl_check.pl
@@ -0,0 +1,38 @@
+/* Main program for the toy PPL/SICStus-Prolog CLP(Q) predicate checker.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:-  ensure_loaded('pl_check.pl').
+
+prolog_system('SWI').
+
+main :-
+    current_output(Old_Stream),
+    open(obtained_pchk, write, Stream),
+    set_output(Stream),
+    (check_all ->
+	write('OK')
+    ;
+	write('FAILURE')
+    ),
+    nl,
+    close(Stream),
+    set_output(Old_Stream).
diff --git a/interfaces/Prolog/XSB/Makefile.am b/interfaces/Prolog/XSB/Makefile.am
new file mode 100644
index 0000000..3e19fe6
--- /dev/null
+++ b/interfaces/Prolog/XSB/Makefile.am
@@ -0,0 +1,171 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+abs_srcdir = @abs_srcdir@
+
+EXTRA_DIST = \
+ppl_xsb.cc \
+ppl_xsb.H \
+xsb_clpq.P \
+xsb_clpq2.P \
+xsb_pl_check.P \
+expected_clpq_mpz expected_clpq2_mpz expected_pchk_mpz \
+expected_clpq_int8 expected_clpq2_int8 expected_pchk_int8 \
+expected_clpq_int16 expected_clpq2_int16 expected_pchk_int16 \
+expected_clpq_int32 expected_clpq2_int32 expected_pchk_int32 \
+expected_clpq_int64 expected_clpq2_int64 expected_pchk_int64 \
+expected_clpq_mpz_a expected_clpq2_mpz_a expected_pchk_mpz_a \
+expected_clpq_int8_a expected_clpq2_int8_a expected_pchk_int8_a \
+expected_clpq_int16_a expected_clpq2_int16_a expected_pchk_int16_a \
+expected_clpq_int32_a expected_clpq2_int32_a expected_pchk_int32_a \
+expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a
+
+if BUILD_XSB_PROLOG_INTERFACE
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog/src \
+$(XSB_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+pkglib_LTLIBRARIES = ppl_xsb.la
+ppl_xsb_la_SOURCES = ppl_xsb.cc
+ppl_xsb_la_LIBADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/Watchdog/src/libpwl.la \
+ at extra_libraries@
+ppl_xsb_la_LDFLAGS = -module -avoid-version
+
+pkglib_DATA = ppl_xsb.xwam
+
+ppl_xsb.xwam: ppl_xsb.H ppl_xsb.cc ppl_xsb.la Makefile
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/ppl_xsb.H . ; \
+	fi
+	cp -f $(srcdir)/ppl_xsb.cc ppl_xsb.c
+	echo "consult(ppl_xsb," \
+	  "[cc('$(CXX)'), cc_opts('$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) " \
+	    "$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)')])." \
+		| $(LIBTOOL) --mode=execute \
+			-dlopen ../../../src/libppl.la \
+			-dlopen ../../../Watchdog/src/libpwl.la \
+			xsb
+	rm -f ppl_xsb.c
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f ppl_xsb.H; \
+	fi
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+# FIXME: we are checking against special versions of `expected_clpq'
+#        and `expected_clpq2'.  This is due to the fact that XSB 2.6
+#        and previous versions do not support control escape
+#        sequences.
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: ppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clpq2.P ../tests/clpq2.pl ../tests/script_clpq2 pl_check_test 
+	LANG=C; \
+	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/xsb_clpq.P . ; \
+	fi
+	cp -f $(srcdir)/../tests/clpq.pl .
+	rm -f xsb_clpq.xwam
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		-dlopen ppl_xsb.la \
+		xsb xsb_clpq \
+			<$(srcdir)/../tests/script_clpq >obtained_clpq
+	rm -f clpq.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f xsb_clpq.P; \
+	fi
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/xsb_clpq2.P . ; \
+	fi
+	cp -f $(srcdir)/../tests/clpq2.pl .
+	rm -f xsb_clpq2.xwam
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		-dlopen ppl_xsb.la \
+		xsb xsb_clpq2 \
+			<$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+	rm -f clpq2.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f xsb_clpq2.P; \
+	fi
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+pl_check_test: ppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/xsb_pl_check.P . ; \
+	fi
+	cp -f $(srcdir)/../tests/pl_check.pl .
+	rm -f xsb_pl_check.xwam
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		-dlopen ppl_xsb.la \
+		xsb xsb_pl_check \
+			>obtained_pchk
+	rm -f pl_check.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f xsb_pl_check.P; \
+	fi
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+MOSTLYCLEANFILES = \
+ppl_xsb.xwam ppl_xsb.so \
+xsb_clpq.xwam xsb_clpq2.xwam xsb_pl_check.xwam \
+$(CLPQ_TESTS) obtained_clpq obtained_clpq2 obtained_pchk
+
+endif BUILD_XSB_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/XSB/Makefile.in b/interfaces/Prolog/XSB/Makefile.in
new file mode 100644
index 0000000..e6361e1
--- /dev/null
+++ b/interfaces/Prolog/XSB/Makefile.in
@@ -0,0 +1,737 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog/XSB
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"
+pkglibLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
+am__ppl_xsb_la_SOURCES_DIST = ppl_xsb.cc
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@am_ppl_xsb_la_OBJECTS = ppl_xsb.lo
+ppl_xsb_la_OBJECTS = $(am_ppl_xsb_la_OBJECTS)
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@am_ppl_xsb_la_rpath = -rpath \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	$(pkglibdir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ppl_xsb_la_SOURCES)
+DIST_SOURCES = $(am__ppl_xsb_la_SOURCES_DIST)
+pkglibDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkglib_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+abs_srcdir = @abs_srcdir@
+EXTRA_DIST = \
+ppl_xsb.cc \
+ppl_xsb.H \
+xsb_clpq.P \
+xsb_clpq2.P \
+xsb_pl_check.P \
+expected_clpq_mpz expected_clpq2_mpz expected_pchk_mpz \
+expected_clpq_int8 expected_clpq2_int8 expected_pchk_int8 \
+expected_clpq_int16 expected_clpq2_int16 expected_pchk_int16 \
+expected_clpq_int32 expected_clpq2_int32 expected_pchk_int32 \
+expected_clpq_int64 expected_clpq2_int64 expected_pchk_int64 \
+expected_clpq_mpz_a expected_clpq2_mpz_a expected_pchk_mpz_a \
+expected_clpq_int8_a expected_clpq2_int8_a expected_pchk_int8_a \
+expected_clpq_int16_a expected_clpq2_int16_a expected_pchk_int16_a \
+expected_clpq_int32_a expected_clpq2_int32_a expected_pchk_int32_a \
+expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@AM_CPPFLAGS = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/src \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/Watchdog/src \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(XSB_PROLOG_INCLUDE_OPTIONS) \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@@extra_includes@
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@pkglib_LTLIBRARIES = ppl_xsb.la
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb_la_SOURCES = ppl_xsb.cc
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb_la_LIBADD = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@@extra_libraries@
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb_la_LDFLAGS = -module -avoid-version
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@pkglib_DATA = ppl_xsb.xwam
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_NONSTRICT = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ack.clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ackn.clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@fib.clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@mc91.clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@smm.clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@sumto.clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@tak.clpq
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_STRICT = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@schedule.clpq
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+# FIXME: we are checking against special versions of `expected_clpq'
+#        and `expected_clpq2'.  This is due to the fact that XSB 2.6
+#        and previous versions do not support control escape
+#        sequences.
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@MOSTLYCLEANFILES = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb.xwam ppl_xsb.so \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@xsb_clpq.xwam xsb_clpq2.xwam xsb_pl_check.xwam \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(CLPQ_TESTS) obtained_clpq obtained_clpq2 obtained_pchk
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Prolog/XSB/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Prolog/XSB/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    f=$(am__strip_dir) \
+	    echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	    $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	  else :; fi; \
+	done
+
+uninstall-pkglibLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  p=$(am__strip_dir) \
+	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+	done
+
+clean-pkglibLTLIBRARIES:
+	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+ppl_xsb.la: $(ppl_xsb_la_OBJECTS) $(ppl_xsb_la_DEPENDENCIES) 
+	$(CXXLINK) $(am_ppl_xsb_la_rpath) $(ppl_xsb_la_LDFLAGS) $(ppl_xsb_la_OBJECTS) $(ppl_xsb_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_xsb.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-pkglibDATA: $(pkglib_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	@list='$(pkglib_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+uninstall-pkglibDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+ at BUILD_XSB_PROLOG_INTERFACE_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-pkglibDATA install-pkglibLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkglibDATA \
+	uninstall-pkglibLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+	clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-pkglibDATA \
+	install-pkglibLTLIBRARIES install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-info-am \
+	uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb.xwam: ppl_xsb.H ppl_xsb.cc ppl_xsb.la Makefile
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	  cp -f $(srcdir)/ppl_xsb.H . ; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	cp -f $(srcdir)/ppl_xsb.cc ppl_xsb.c
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	echo "consult(ppl_xsb," \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	  "[cc('$(CXX)'), cc_opts('$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) " \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	    "$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)')])." \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		| $(LIBTOOL) --mode=execute \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@			-dlopen ../../../src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@			-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@			xsb
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f ppl_xsb.c
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	  rm -f ppl_xsb.H; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@check-local: ppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clpq2.P ../tests/clpq2.pl ../tests/script_clpq2 pl_check_test 
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	LANG=C; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	  cp -f $(srcdir)/xsb_clpq.P . ; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	cp -f $(srcdir)/../tests/clpq.pl .
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f xsb_clpq.xwam
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ppl_xsb.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		xsb xsb_clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@			<$(srcdir)/../tests/script_clpq >obtained_clpq
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f clpq.pl
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	  rm -f xsb_clpq.P; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	  cp -f $(srcdir)/xsb_clpq2.P . ; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	cp -f $(srcdir)/../tests/clpq2.pl .
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f xsb_clpq2.xwam
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ppl_xsb.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		xsb xsb_clpq2 \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@			<$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f clpq2.pl
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	  rm -f xsb_clpq2.P; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@pl_check_test: ppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	  cp -f $(srcdir)/xsb_pl_check.P . ; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	cp -f $(srcdir)/../tests/pl_check.pl .
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f xsb_pl_check.xwam
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		-dlopen ppl_xsb.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@		xsb xsb_pl_check \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@			>obtained_pchk
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	rm -f pl_check.pl
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	  rm -f xsb_pl_check.P; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int16 b/interfaces/Prolog/XSB/expected_clpq2_int16
new file mode 100644
index 0000000..9debe48
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int16
@@ -0,0 +1,102 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Unknown result due to negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int16_a b/interfaces/Prolog/XSB/expected_clpq2_int16_a
new file mode 100644
index 0000000..8f18e66
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int16_a
@@ -0,0 +1,103 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Unknown result due to negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int32 b/interfaces/Prolog/XSB/expected_clpq2_int32
new file mode 100644
index 0000000..667acc1
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int32
@@ -0,0 +1,109 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int32_a b/interfaces/Prolog/XSB/expected_clpq2_int32_a
new file mode 100644
index 0000000..636a1bc
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int32_a
@@ -0,0 +1,102 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int64 b/interfaces/Prolog/XSB/expected_clpq2_int64
new file mode 100644
index 0000000..667acc1
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int64
@@ -0,0 +1,109 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int64_a b/interfaces/Prolog/XSB/expected_clpq2_int64_a
new file mode 100644
index 0000000..667acc1
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int64_a
@@ -0,0 +1,109 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int8 b/interfaces/Prolog/XSB/expected_clpq2_int8
new file mode 100644
index 0000000..0cc3daf
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int8
@@ -0,0 +1,101 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int8_a b/interfaces/Prolog/XSB/expected_clpq2_int8_a
new file mode 100644
index 0000000..0cc3daf
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int8_a
@@ -0,0 +1,101 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_mpz b/interfaces/Prolog/XSB/expected_clpq2_mpz
new file mode 100644
index 0000000..667acc1
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_mpz
@@ -0,0 +1,109 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_mpz_a b/interfaces/Prolog/XSB/expected_clpq2_mpz_a
new file mode 100644
index 0000000..667acc1
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_mpz_a
@@ -0,0 +1,109 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int16 b/interfaces/Prolog/XSB/expected_clpq_int16
new file mode 100644
index 0000000..91ca9e6
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int16
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- R = 45
+O = 9
+M = 45
+D = 9
+N = 55
+E = 10
+S = 10
+Y = 8
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int16_a b/interfaces/Prolog/XSB/expected_clpq_int16_a
new file mode 100644
index 0000000..91ca9e6
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int16_a
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- R = 45
+O = 9
+M = 45
+D = 9
+N = 55
+E = 10
+S = 10
+Y = 8
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int32 b/interfaces/Prolog/XSB/expected_clpq_int32
new file mode 100644
index 0000000..bd1676d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int32
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int32_a b/interfaces/Prolog/XSB/expected_clpq_int32_a
new file mode 100644
index 0000000..bd1676d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int32_a
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int64 b/interfaces/Prolog/XSB/expected_clpq_int64
new file mode 100644
index 0000000..bd1676d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int64
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int64_a b/interfaces/Prolog/XSB/expected_clpq_int64_a
new file mode 100644
index 0000000..bd1676d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int64_a
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int8 b/interfaces/Prolog/XSB/expected_clpq_int8
new file mode 100644
index 0000000..5bb478c
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int8
@@ -0,0 +1,29 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_int8_a b/interfaces/Prolog/XSB/expected_clpq_int8_a
new file mode 100644
index 0000000..5bb478c
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int8_a
@@ -0,0 +1,29 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_mpz b/interfaces/Prolog/XSB/expected_clpq_mpz
new file mode 100644
index 0000000..bd1676d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_mpz
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq_mpz_a b/interfaces/Prolog/XSB/expected_clpq_mpz_a
new file mode 100644
index 0000000..bd1676d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_mpz_a
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\nPPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_pchk_int16 b/interfaces/Prolog/XSB/expected_pchk_int16
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int16
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int16_a b/interfaces/Prolog/XSB/expected_pchk_int16_a
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int16_a
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int32 b/interfaces/Prolog/XSB/expected_pchk_int32
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int32
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int32_a b/interfaces/Prolog/XSB/expected_pchk_int32_a
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int32_a
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int64 b/interfaces/Prolog/XSB/expected_pchk_int64
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int64
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int64_a b/interfaces/Prolog/XSB/expected_pchk_int64_a
new file mode 100644
index 0000000..2aed667
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int64_a
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int8 b/interfaces/Prolog/XSB/expected_pchk_int8
new file mode 100644
index 0000000..b19de5d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int8
@@ -0,0 +1,9 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int8_a b/interfaces/Prolog/XSB/expected_pchk_int8_a
new file mode 100644
index 0000000..f6b1402
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int8_a
@@ -0,0 +1,9 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_mpz b/interfaces/Prolog/XSB/expected_pchk_mpz
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_mpz
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_mpz_a b/interfaces/Prolog/XSB/expected_pchk_mpz_a
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_mpz_a
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/XSB/ppl_xsb.H b/interfaces/Prolog/XSB/ppl_xsb.H
new file mode 100644
index 0000000..8ee38fb
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_xsb.H
@@ -0,0 +1,143 @@
+/* XSB Prolog interface: declarations.  -*- Prolog -*-
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- export
+	ppl_version_major/1,
+	ppl_version_minor/1,
+	ppl_version_revision/1,
+	ppl_version_beta/1,
+	ppl_version/1,
+	ppl_banner/1,
+	ppl_max_space_dimension/1,
+	ppl_Coefficient_is_bounded/0,
+	ppl_Coefficient_max/1,
+	ppl_Coefficient_min/1,
+	ppl_initialize/0,
+	ppl_finalize/0,
+	ppl_set_timeout_exception_atom/1,
+	ppl_timeout_exception_atom/1,
+	ppl_set_timeout/1,
+	ppl_reset_timeout/0,
+	ppl_new_C_Polyhedron_from_space_dimension/3,
+	ppl_new_NNC_Polyhedron_from_space_dimension/3,
+	ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_new_C_Polyhedron_from_constraints/2,
+	ppl_new_NNC_Polyhedron_from_constraints/2,
+	ppl_new_C_Polyhedron_from_generators/2,
+	ppl_new_NNC_Polyhedron_from_generators/2,
+	ppl_new_C_Polyhedron_from_bounding_box/2,
+	ppl_new_NNC_Polyhedron_from_bounding_box/2,
+	ppl_Polyhedron_swap/2,
+	ppl_delete_Polyhedron/1,
+	ppl_Polyhedron_space_dimension/2,
+	ppl_Polyhedron_affine_dimension/2,
+	ppl_Polyhedron_get_constraints/2,
+	ppl_Polyhedron_get_minimized_constraints/2,
+	ppl_Polyhedron_get_generators/2,
+	ppl_Polyhedron_get_minimized_generators/2,
+	ppl_Polyhedron_relation_with_constraint/3,
+	ppl_Polyhedron_relation_with_generator/3,
+        ppl_Polyhedron_get_bounding_box/3,
+	ppl_Polyhedron_is_empty/1,
+	ppl_Polyhedron_is_universe/1,
+	ppl_Polyhedron_is_bounded/1,
+	ppl_Polyhedron_bounds_from_above/2,
+	ppl_Polyhedron_bounds_from_below/2,
+	ppl_Polyhedron_maximize/5,
+	ppl_Polyhedron_maximize_with_point/6,
+	ppl_Polyhedron_minimize/5,
+	ppl_Polyhedron_minimize_with_point/6,
+        ppl_Polyhedron_is_topologically_closed/1,
+	ppl_Polyhedron_contains_Polyhedron/2,
+	ppl_Polyhedron_strictly_contains_Polyhedron/2,
+	ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+        ppl_Polyhedron_equals_Polyhedron/2,
+	ppl_Polyhedron_OK/1,
+	ppl_Polyhedron_add_constraint/2,
+	ppl_Polyhedron_add_constraint_and_minimize/2,
+	ppl_Polyhedron_add_generator/2,
+	ppl_Polyhedron_add_generator_and_minimize/2,
+	ppl_Polyhedron_add_constraints/2,
+	ppl_Polyhedron_add_constraints_and_minimize/2,
+	ppl_Polyhedron_add_generators/2,
+	ppl_Polyhedron_add_generators_and_minimize/2,
+	ppl_Polyhedron_intersection_assign/2,
+	ppl_Polyhedron_intersection_assign_and_minimize/2,
+	ppl_Polyhedron_poly_hull_assign/2,
+	ppl_Polyhedron_poly_hull_assign_and_minimize/2,
+	ppl_Polyhedron_poly_difference_assign/2,
+	ppl_Polyhedron_affine_image/4,
+	ppl_Polyhedron_affine_preimage/4,
+	ppl_Polyhedron_bounded_affine_image/5,
+	ppl_Polyhedron_bounded_affine_preimage/5,
+	ppl_Polyhedron_generalized_affine_image/5,
+	ppl_Polyhedron_generalized_affine_preimage/5,
+	ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+	ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
+	ppl_Polyhedron_time_elapse_assign/2,
+        ppl_Polyhedron_topological_closure_assign/1,
+	ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4,
+	ppl_Polyhedron_BHRZ03_widening_assign/2,
+	ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
+	ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+	ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
+	ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+	ppl_Polyhedron_H79_widening_assign_with_tokens/4,
+	ppl_Polyhedron_H79_widening_assign/2,
+	ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
+	ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+	ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
+	ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
+	ppl_Polyhedron_add_space_dimensions_and_project/2,
+	ppl_Polyhedron_add_space_dimensions_and_embed/2,
+	ppl_Polyhedron_concatenate_assign/2,
+	ppl_Polyhedron_remove_space_dimensions/2,
+	ppl_Polyhedron_remove_higher_space_dimensions/2,
+	ppl_Polyhedron_expand_space_dimension/3,
+	ppl_Polyhedron_fold_space_dimensions/3,
+	ppl_Polyhedron_map_space_dimensions/2,
+	ppl_new_LP_Problem_trivial/1,
+	ppl_new_LP_Problem/4,
+	ppl_new_LP_Problem_from_LP_Problem/2,
+	ppl_LP_Problem_swap/2,
+	ppl_delete_LP_Problem/1,
+	ppl_LP_Problem_space_dimension/2,
+	ppl_LP_Problem_constraints/2,
+	ppl_LP_Problem_objective_function/2,
+	ppl_LP_Problem_optimization_mode/2,
+	ppl_LP_Problem_clear/1,
+	ppl_LP_Problem_add_constraint/2,
+	ppl_LP_Problem_add_constraints/2,
+	ppl_LP_Problem_set_objective_function/2,
+	ppl_LP_Problem_set_optimization_mode/2,
+	ppl_LP_Problem_is_satisfiable/1,
+	ppl_LP_Problem_solve/2,
+	ppl_LP_Problem_feasible_point/2,
+	ppl_LP_Problem_optimizing_point/2,
+	ppl_LP_Problem_optimal_value/3,
+	ppl_LP_Problem_evaluate_objective_function/4,
+	ppl_LP_Problem_OK/1.
+
+:- ldoption('-L../../../src/.libs -lppl -L../../../Watchdog/src/.libs -lpwl -lgmp -lgmpxx').
diff --git a/interfaces/Prolog/XSB/ppl_xsb.cc b/interfaces/Prolog/XSB/ppl_xsb.cc
new file mode 100644
index 0000000..41d06ff
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_xsb.cc
@@ -0,0 +1,834 @@
+/* XSB Prolog interface: system-dependent part.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+#include <cinterf.h>
+
+// In XSB versions up to and including 2.7.1, <error_xsb.h> does not
+// come with the extern "C" wrapper.
+extern "C" {
+#include <error_xsb.h>
+}
+
+#include <cassert>
+
+typedef prolog_term Prolog_term_ref;
+typedef char* Prolog_atom;
+typedef xsbBool Prolog_foreign_return_type;
+
+namespace {
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+} // namespace
+
+#include "../exceptions.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = false;
+  // XSB people claim XSB supports 32-bit integers.  However, experiments
+  // suggest this is not the case.
+  // See http://sourceforge.net/tracker/index.php?func=detail&aid=1400271&group_id=1176&atid=101176
+#if 0
+  Prolog_min_integer = -2147483647-1;
+  Prolog_max_integer = 2147483647;
+#else
+  Prolog_min_integer = -268435456;
+  Prolog_max_integer = 268435455;
+#endif
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return p2p_new();
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+  t = u;
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+  assert(is_var(t) == TRUE);
+  if (l < Prolog_min_integer || l > Prolog_max_integer)
+    throw PPL_integer_out_of_range(l);
+  return c2p_int(l, t) != FALSE;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+  assert(is_var(t) == TRUE);
+  if (ul > static_cast<unsigned long>(Prolog_max_integer))
+    throw PPL_integer_out_of_range(ul);
+  return c2p_int(ul, t) != FALSE;
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+  assert(is_var(t) == TRUE);
+  // TODO: remove the const_cast when the XSB people fix cinterf.h.
+  return c2p_string(string_find(const_cast<char*>(s), 1), t) != FALSE;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+  assert(is_var(t) == TRUE);
+  return c2p_string(a, t) != FALSE;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+  assert(is_var(t) == TRUE);
+  return c2p_int(reinterpret_cast<long>(p), t) != FALSE;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  // TODO: remove the const_cast when the XSB people fix cinterf.h.
+  return string_find(const_cast<char*>(s), 1);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1) {
+  prolog_term new_compound = p2p_new();
+  c2p_functor(f, 1, new_compound);
+  p2p_unify(p2p_arg(new_compound, 1), a1);
+  t = new_compound;
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2) {
+  prolog_term new_compound = p2p_new();
+  c2p_functor(f, 2, new_compound);
+  p2p_unify(p2p_arg(new_compound, 1), a1);
+  p2p_unify(p2p_arg(new_compound, 2), a2);
+  t = new_compound;
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3) {
+  prolog_term new_compound = p2p_new();
+  c2p_functor(f, 3, new_compound);
+  p2p_unify(p2p_arg(new_compound, 1), a1);
+  p2p_unify(p2p_arg(new_compound, 2), a2);
+  p2p_unify(p2p_arg(new_compound, 3), a3);
+  t = new_compound;
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3, Prolog_term_ref a4) {
+  prolog_term new_compound = p2p_new();
+  c2p_functor(f, 4, new_compound);
+  p2p_unify(p2p_arg(new_compound, 1), a1);
+  p2p_unify(p2p_arg(new_compound, 2), a2);
+  p2p_unify(p2p_arg(new_compound, 3), a3);
+  p2p_unify(p2p_arg(new_compound, 4), a4);
+  t = new_compound;
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+		      Prolog_term_ref h, Prolog_term_ref t) {
+  prolog_term new_cons = p2p_new();
+  c2p_list(new_cons);
+  p2p_unify(p2p_car(new_cons), h);
+  p2p_unify(p2p_cdr(new_cons), t);
+  c = new_cons;
+  return 1;
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  xsb_throw(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return is_var(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return is_string(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return is_int(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  return is_int(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return is_functor(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog list, false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  return is_list(t) != FALSE;
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  *lp = p2c_int(t);
+  return 1;
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  *vpp = reinterpret_cast<void*>(p2c_int(t));
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  *ap = p2c_string(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  *ap = p2c_functor(t);
+  *ip = p2c_arity(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+  assert(Prolog_is_compound(t));
+  a = p2p_arg(t, i);
+  return 1;
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+  assert(Prolog_is_cons(c));
+  h = p2p_car(c);
+  t = p2p_cdr(c);
+  return 1;
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return p2p_unify(t, u) != FALSE;
+ }
+
+PPL::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+  // XSB supports only 32-bit integers.
+  long v;
+  Prolog_get_long(t, &v);
+  return PPL::Coefficient(v);
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const PPL::Coefficient& n) {
+  long l = 0;
+  if (PPL::assign_r(l, n, PPL::ROUND_NOT_NEEDED) != PPL::V_EQ)
+    throw PPL_integer_out_of_range(n);
+  Prolog_term_ref t = p2p_new();
+  Prolog_put_long(t, l);
+  return t;
+}
+
+} // namespace
+
+#define ppl_version_major xsb_stub_ppl_version_major
+#define ppl_version_minor xsb_stub_ppl_version_minor
+#define ppl_version_revision xsb_stub_ppl_version_revision
+#define ppl_version_beta xsb_stub_ppl_version_beta
+#define ppl_version xsb_stub_ppl_version
+#define ppl_banner xsb_stub_ppl_banner
+#define ppl_max_space_dimension xsb_stub_ppl_max_space_dimension
+#define ppl_Coefficient_is_bounded xsb_stub_ppl_Coefficient_is_bounded
+#define ppl_Coefficient_max xsb_stub_ppl_Coefficient_max
+#define ppl_Coefficient_min xsb_stub_ppl_Coefficient_min
+#define ppl_initialize xsb_stub_ppl_initialize
+#define ppl_finalize xsb_stub_ppl_finalize
+#define ppl_set_timeout_exception_atom xsb_stub_ppl_set_timeout_exception_atom
+#define ppl_timeout_exception_atom xsb_stub_ppl_timeout_exception_atom
+#define ppl_set_timeout xsb_stub_ppl_set_timeout
+#define ppl_reset_timeout xsb_stub_ppl_reset_timeout
+#define ppl_new_C_Polyhedron_from_space_dimension xsb_stub_ppl_new_C_Polyhedron_from_space_dimension
+#define ppl_new_NNC_Polyhedron_from_space_dimension xsb_stub_ppl_new_NNC_Polyhedron_from_space_dimension
+#define ppl_new_C_Polyhedron_from_C_Polyhedron xsb_stub_ppl_new_C_Polyhedron_from_C_Polyhedron
+#define ppl_new_C_Polyhedron_from_NNC_Polyhedron xsb_stub_ppl_new_C_Polyhedron_from_NNC_Polyhedron
+#define ppl_new_NNC_Polyhedron_from_C_Polyhedron xsb_stub_ppl_new_NNC_Polyhedron_from_C_Polyhedron
+#define ppl_new_NNC_Polyhedron_from_NNC_Polyhedron xsb_stub_ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
+#define ppl_new_C_Polyhedron_from_constraints xsb_stub_ppl_new_C_Polyhedron_from_constraints
+#define ppl_new_NNC_Polyhedron_from_constraints xsb_stub_ppl_new_NNC_Polyhedron_from_constraints
+#define ppl_new_C_Polyhedron_from_generators xsb_stub_ppl_new_C_Polyhedron_from_generators
+#define ppl_new_NNC_Polyhedron_from_generators xsb_stub_ppl_new_NNC_Polyhedron_from_generators
+#define ppl_new_C_Polyhedron_from_bounding_box xsb_stub_ppl_new_C_Polyhedron_from_bounding_box
+#define ppl_new_NNC_Polyhedron_from_bounding_box xsb_stub_ppl_new_NNC_Polyhedron_from_bounding_box
+#define ppl_Polyhedron_swap xsb_stub_ppl_Polyhedron_swap
+#define ppl_delete_Polyhedron xsb_stub_ppl_delete_Polyhedron
+#define ppl_Polyhedron_space_dimension xsb_stub_ppl_Polyhedron_space_dimension
+#define ppl_Polyhedron_affine_dimension xsb_stub_ppl_Polyhedron_affine_dimension
+#define ppl_Polyhedron_get_constraints xsb_stub_ppl_Polyhedron_get_constraints
+#define ppl_Polyhedron_get_minimized_constraints xsb_stub_ppl_Polyhedron_get_minimized_constraints
+#define ppl_Polyhedron_get_generators xsb_stub_ppl_Polyhedron_get_generators
+#define ppl_Polyhedron_get_minimized_generators xsb_stub_ppl_Polyhedron_get_minimized_generators
+#define ppl_Polyhedron_relation_with_constraint xsb_stub_ppl_Polyhedron_relation_with_constraint
+#define ppl_Polyhedron_relation_with_generator xsb_stub_ppl_Polyhedron_relation_with_generator
+#define ppl_Polyhedron_get_bounding_box xsb_stub_ppl_Polyhedron_get_bounding_box
+#define ppl_Polyhedron_is_empty xsb_stub_ppl_Polyhedron_is_empty
+#define ppl_Polyhedron_is_universe xsb_stub_ppl_Polyhedron_is_universe
+#define ppl_Polyhedron_is_bounded xsb_stub_ppl_Polyhedron_is_bounded
+#define ppl_Polyhedron_bounds_from_above xsb_stub_ppl_Polyhedron_bounds_from_above
+#define ppl_Polyhedron_bounds_from_below xsb_stub_ppl_Polyhedron_bounds_from_below
+#define ppl_Polyhedron_maximize xsb_stub_ppl_Polyhedron_maximize
+#define ppl_Polyhedron_maximize_with_point xsb_stub_ppl_Polyhedron_maximize_with_point
+#define ppl_Polyhedron_minimize xsb_stub_ppl_Polyhedron_minimize
+#define ppl_Polyhedron_minimize_with_point xsb_stub_ppl_Polyhedron_minimize_with_point
+#define ppl_Polyhedron_is_topologically_closed xsb_stub_ppl_Polyhedron_is_topologically_closed
+#define ppl_Polyhedron_contains_Polyhedron xsb_stub_ppl_Polyhedron_contains_Polyhedron
+#define ppl_Polyhedron_strictly_contains_Polyhedron xsb_stub_ppl_Polyhedron_strictly_contains_Polyhedron
+#define ppl_Polyhedron_is_disjoint_from_Polyhedron xsb_stub_ppl_Polyhedron_is_disjoint_from_Polyhedron
+#define ppl_Polyhedron_equals_Polyhedron xsb_stub_ppl_Polyhedron_equals_Polyhedron
+#define ppl_Polyhedron_OK xsb_stub_ppl_Polyhedron_OK
+#define ppl_Polyhedron_add_constraint xsb_stub_ppl_Polyhedron_add_constraint
+#define ppl_Polyhedron_add_constraint_and_minimize xsb_stub_ppl_Polyhedron_add_constraint_and_minimize
+#define ppl_Polyhedron_add_generator xsb_stub_ppl_Polyhedron_add_generator
+#define ppl_Polyhedron_add_generator_and_minimize xsb_stub_ppl_Polyhedron_add_generator_and_minimize
+#define ppl_Polyhedron_add_constraints xsb_stub_ppl_Polyhedron_add_constraints
+#define ppl_Polyhedron_add_constraints_and_minimize xsb_stub_ppl_Polyhedron_add_constraints_and_minimize
+#define ppl_Polyhedron_add_generators xsb_stub_ppl_Polyhedron_add_generators
+#define ppl_Polyhedron_add_generators_and_minimize xsb_stub_ppl_Polyhedron_add_generators_and_minimize
+#define ppl_Polyhedron_intersection_assign xsb_stub_ppl_Polyhedron_intersection_assign
+#define ppl_Polyhedron_intersection_assign_and_minimize xsb_stub_ppl_Polyhedron_intersection_assign_and_minimize
+#define ppl_Polyhedron_poly_hull_assign xsb_stub_ppl_Polyhedron_poly_hull_assign
+#define ppl_Polyhedron_poly_hull_assign_and_minimize xsb_stub_ppl_Polyhedron_poly_hull_assign_and_minimize
+#define ppl_Polyhedron_poly_difference_assign xsb_stub_ppl_Polyhedron_poly_difference_assign
+#define ppl_Polyhedron_affine_image xsb_stub_ppl_Polyhedron_affine_image
+#define ppl_Polyhedron_affine_preimage xsb_stub_ppl_Polyhedron_affine_preimage
+#define ppl_Polyhedron_bounded_affine_image xsb_stub_ppl_Polyhedron_bounded_affine_image
+#define ppl_Polyhedron_bounded_affine_preimage xsb_stub_ppl_Polyhedron_bounded_affine_preimage
+#define ppl_Polyhedron_generalized_affine_image xsb_stub_ppl_Polyhedron_generalized_affine_image
+#define ppl_Polyhedron_generalized_affine_preimage xsb_stub_ppl_Polyhedron_generalized_affine_preimage
+#define ppl_Polyhedron_generalized_affine_image_lhs_rhs xsb_stub_ppl_Polyhedron_generalized_affine_image_lhs_rhs
+#define ppl_Polyhedron_generalized_affine_preimage_lhs_rhs xsb_stub_ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+#define ppl_Polyhedron_time_elapse_assign xsb_stub_ppl_Polyhedron_time_elapse_assign
+#define ppl_Polyhedron_topological_closure_assign xsb_stub_ppl_Polyhedron_topological_closure_assign
+#define ppl_Polyhedron_BHRZ03_widening_assign_with_tokens xsb_stub_ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
+#define ppl_Polyhedron_BHRZ03_widening_assign xsb_stub_ppl_Polyhedron_BHRZ03_widening_assign
+#define ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens xsb_stub_ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+#define ppl_Polyhedron_limited_BHRZ03_extrapolation_assign xsb_stub_ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+#define ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens xsb_stub_ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+#define ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign xsb_stub_ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+#define ppl_Polyhedron_H79_widening_assign_with_tokens xsb_stub_ppl_Polyhedron_H79_widening_assign_with_tokens
+#define ppl_Polyhedron_H79_widening_assign xsb_stub_ppl_Polyhedron_H79_widening_assign
+#define ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens xsb_stub_ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+#define ppl_Polyhedron_limited_H79_extrapolation_assign xsb_stub_ppl_Polyhedron_limited_H79_extrapolation_assign
+#define ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens xsb_stub_ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+#define ppl_Polyhedron_bounded_H79_extrapolation_assign xsb_stub_ppl_Polyhedron_bounded_H79_extrapolation_assign
+#define ppl_Polyhedron_add_space_dimensions_and_project xsb_stub_ppl_Polyhedron_add_space_dimensions_and_project
+#define ppl_Polyhedron_add_space_dimensions_and_embed xsb_stub_ppl_Polyhedron_add_space_dimensions_and_embed
+#define ppl_Polyhedron_concatenate_assign xsb_stub_ppl_Polyhedron_concatenate_assign
+#define ppl_Polyhedron_remove_space_dimensions xsb_stub_ppl_Polyhedron_remove_space_dimensions
+#define ppl_Polyhedron_remove_higher_space_dimensions xsb_stub_ppl_Polyhedron_remove_higher_space_dimensions
+#define ppl_Polyhedron_expand_space_dimension xsb_stub_ppl_Polyhedron_expand_space_dimension
+#define ppl_Polyhedron_fold_space_dimensions xsb_stub_ppl_Polyhedron_fold_space_dimensions
+#define ppl_Polyhedron_map_space_dimensions xsb_stub_ppl_Polyhedron_map_space_dimensions
+#define ppl_new_LP_Problem_trivial xsb_stub_ppl_new_LP_Problem_trivial
+#define ppl_new_LP_Problem xsb_stub_ppl_new_LP_Problem
+#define ppl_new_LP_Problem_from_LP_Problem xsb_stub_ppl_new_LP_Problem_from_LP_Problem
+#define ppl_LP_Problem_swap xsb_stub_ppl_LP_Problem_swap
+#define ppl_delete_LP_Problem xsb_stub_ppl_delete_LP_Problem
+#define ppl_LP_Problem_space_dimension xsb_stub_ppl_LP_Problem_space_dimension
+#define ppl_LP_Problem_constraints xsb_stub_ppl_LP_Problem_constraints
+#define ppl_LP_Problem_objective_function xsb_stub_ppl_LP_Problem_objective_function
+#define ppl_LP_Problem_optimization_mode xsb_stub_ppl_LP_Problem_optimization_mode
+#define ppl_LP_Problem_clear xsb_stub_ppl_LP_Problem_clear
+#define ppl_LP_Problem_add_constraint xsb_stub_ppl_LP_Problem_add_constraint
+#define ppl_LP_Problem_add_constraints xsb_stub_ppl_LP_Problem_add_constraints
+#define ppl_LP_Problem_set_objective_function xsb_stub_ppl_LP_Problem_set_objective_function
+#define ppl_LP_Problem_set_optimization_mode xsb_stub_ppl_LP_Problem_set_optimization_mode
+#define ppl_LP_Problem_is_satisfiable xsb_stub_ppl_LP_Problem_is_satisfiable
+#define ppl_LP_Problem_solve xsb_stub_ppl_LP_Problem_solve
+#define ppl_LP_Problem_feasible_point xsb_stub_ppl_LP_Problem_feasible_point
+#define ppl_LP_Problem_optimizing_point xsb_stub_ppl_LP_Problem_optimizing_point
+#define ppl_LP_Problem_optimal_value xsb_stub_ppl_LP_Problem_optimal_value
+#define ppl_LP_Problem_evaluate_objective_function xsb_stub_ppl_LP_Problem_evaluate_objective_function
+#define ppl_LP_Problem_OK xsb_stub_ppl_LP_Problem_OK
+
+#include "../ppl_prolog.icc"
+
+#undef ppl_version_major
+#undef ppl_version_minor
+#undef ppl_version_revision
+#undef ppl_version_beta
+#undef ppl_version
+#undef ppl_banner
+#undef ppl_max_space_dimension
+#undef ppl_Coefficient_is_bounded
+#undef ppl_Coefficient_max
+#undef ppl_Coefficient_min
+#undef ppl_initialize
+#undef ppl_finalize
+#undef ppl_set_timeout_exception_atom
+#undef ppl_timeout_exception_atom
+#undef ppl_set_timeout
+#undef ppl_reset_timeout
+#undef ppl_new_C_Polyhedron_from_space_dimension
+#undef ppl_new_NNC_Polyhedron_from_space_dimension
+#undef ppl_new_C_Polyhedron_from_C_Polyhedron
+#undef ppl_new_C_Polyhedron_from_NNC_Polyhedron
+#undef ppl_new_NNC_Polyhedron_from_C_Polyhedron
+#undef ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
+#undef ppl_new_C_Polyhedron_from_constraints
+#undef ppl_new_NNC_Polyhedron_from_constraints
+#undef ppl_new_C_Polyhedron_from_generators
+#undef ppl_new_NNC_Polyhedron_from_generators
+#undef ppl_new_C_Polyhedron_from_bounding_box
+#undef ppl_new_NNC_Polyhedron_from_bounding_box
+#undef ppl_Polyhedron_swap
+#undef ppl_delete_Polyhedron
+#undef ppl_Polyhedron_space_dimension
+#undef ppl_Polyhedron_affine_dimension
+#undef ppl_Polyhedron_get_constraints
+#undef ppl_Polyhedron_get_minimized_constraints
+#undef ppl_Polyhedron_get_generators
+#undef ppl_Polyhedron_get_minimized_generators
+#undef ppl_Polyhedron_relation_with_constraint
+#undef ppl_Polyhedron_relation_with_generator
+#undef ppl_Polyhedron_get_bounding_box
+#undef ppl_Polyhedron_is_empty
+#undef ppl_Polyhedron_is_universe
+#undef ppl_Polyhedron_is_bounded
+#undef ppl_Polyhedron_bounds_from_above
+#undef ppl_Polyhedron_bounds_from_below
+#undef ppl_Polyhedron_maximize
+#undef ppl_Polyhedron_maximize_with_point
+#undef ppl_Polyhedron_minimize
+#undef ppl_Polyhedron_minimize_with_point
+#undef ppl_Polyhedron_is_topologically_closed
+#undef ppl_Polyhedron_contains_Polyhedron
+#undef ppl_Polyhedron_strictly_contains_Polyhedron
+#undef ppl_Polyhedron_is_disjoint_from_Polyhedron
+#undef ppl_Polyhedron_equals_Polyhedron
+#undef ppl_Polyhedron_OK
+#undef ppl_Polyhedron_add_constraint
+#undef ppl_Polyhedron_add_constraint_and_minimize
+#undef ppl_Polyhedron_add_generator
+#undef ppl_Polyhedron_add_generator_and_minimize
+#undef ppl_Polyhedron_add_constraints
+#undef ppl_Polyhedron_add_constraints_and_minimize
+#undef ppl_Polyhedron_add_generators
+#undef ppl_Polyhedron_add_generators_and_minimize
+#undef ppl_Polyhedron_intersection_assign
+#undef ppl_Polyhedron_intersection_assign_and_minimize
+#undef ppl_Polyhedron_poly_hull_assign
+#undef ppl_Polyhedron_poly_hull_assign_and_minimize
+#undef ppl_Polyhedron_poly_difference_assign
+#undef ppl_Polyhedron_affine_image
+#undef ppl_Polyhedron_affine_preimage
+#undef ppl_Polyhedron_bounded_affine_image
+#undef ppl_Polyhedron_bounded_affine_preimage
+#undef ppl_Polyhedron_generalized_affine_image
+#undef ppl_Polyhedron_generalized_affine_preimage
+#undef ppl_Polyhedron_generalized_affine_image_lhs_rhs
+#undef ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+#undef ppl_Polyhedron_time_elapse_assign
+#undef ppl_Polyhedron_topological_closure_assign
+#undef ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
+#undef ppl_Polyhedron_BHRZ03_widening_assign
+#undef ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+#undef ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+#undef ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+#undef ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+#undef ppl_Polyhedron_H79_widening_assign_with_tokens
+#undef ppl_Polyhedron_H79_widening_assign
+#undef ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+#undef ppl_Polyhedron_limited_H79_extrapolation_assign
+#undef ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+#undef ppl_Polyhedron_bounded_H79_extrapolation_assign
+#undef ppl_Polyhedron_add_space_dimensions_and_project
+#undef ppl_Polyhedron_add_space_dimensions_and_embed
+#undef ppl_Polyhedron_concatenate_assign
+#undef ppl_Polyhedron_remove_space_dimensions
+#undef ppl_Polyhedron_remove_higher_space_dimensions
+#undef ppl_Polyhedron_expand_space_dimension
+#undef ppl_Polyhedron_fold_space_dimensions
+#undef ppl_Polyhedron_map_space_dimensions
+#undef ppl_new_LP_Problem_trivial
+#undef ppl_new_LP_Problem
+#undef ppl_new_LP_Problem_from_LP_Problem
+#undef ppl_LP_Problem_swap
+#undef ppl_delete_LP_Problem
+#undef ppl_LP_Problem_space_dimension
+#undef ppl_LP_Problem_constraints
+#undef ppl_LP_Problem_objective_function
+#undef ppl_LP_Problem_optimization_mode
+#undef ppl_LP_Problem_clear
+#undef ppl_LP_Problem_add_constraint
+#undef ppl_LP_Problem_add_constraints
+#undef ppl_LP_Problem_set_objective_function
+#undef ppl_LP_Problem_set_optimization_mode
+#undef ppl_LP_Problem_is_satisfiable
+#undef ppl_LP_Problem_solve
+#undef ppl_LP_Problem_feasible_point
+#undef ppl_LP_Problem_optimizing_point
+#undef ppl_LP_Problem_optimal_value
+#undef ppl_LP_Problem_evaluate_objective_function
+#undef ppl_LP_Problem_OK
+
+#define XSB_ENTRY_0(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  return xsb_stub_##name(); \
+}
+
+#define XSB_ENTRY_1(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  return xsb_stub_##name(arg1); \
+}
+
+#define XSB_ENTRY_2(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  return xsb_stub_##name(arg1, arg2); \
+}
+
+#define XSB_ENTRY_3(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  return xsb_stub_##name(arg1, arg2, arg3); \
+}
+
+#define XSB_ENTRY_4(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  Prolog_term_ref arg4 = reg_term(4); \
+  return xsb_stub_##name(arg1, arg2, arg3, arg4); \
+}
+
+#define XSB_ENTRY_5(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  Prolog_term_ref arg4 = reg_term(4); \
+  Prolog_term_ref arg5 = reg_term(5); \
+  return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5); \
+}
+
+#define XSB_ENTRY_6(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  Prolog_term_ref arg4 = reg_term(4); \
+  Prolog_term_ref arg5 = reg_term(5); \
+  Prolog_term_ref arg6 = reg_term(6); \
+  return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5, arg6); \
+}
+
+XSB_ENTRY_1(ppl_version_major)
+XSB_ENTRY_1(ppl_version_minor)
+XSB_ENTRY_1(ppl_version_revision)
+XSB_ENTRY_1(ppl_version_beta)
+XSB_ENTRY_1(ppl_version)
+XSB_ENTRY_1(ppl_banner)
+XSB_ENTRY_1(ppl_max_space_dimension)
+XSB_ENTRY_0(ppl_Coefficient_is_bounded)
+XSB_ENTRY_1(ppl_Coefficient_max)
+XSB_ENTRY_1(ppl_Coefficient_min)
+XSB_ENTRY_0(ppl_initialize)
+XSB_ENTRY_0(ppl_finalize)
+XSB_ENTRY_1(ppl_set_timeout_exception_atom)
+XSB_ENTRY_1(ppl_timeout_exception_atom)
+XSB_ENTRY_1(ppl_set_timeout)
+XSB_ENTRY_0(ppl_reset_timeout)
+XSB_ENTRY_3(ppl_new_C_Polyhedron_from_space_dimension)
+XSB_ENTRY_3(ppl_new_NNC_Polyhedron_from_space_dimension)
+XSB_ENTRY_2(ppl_new_C_Polyhedron_from_C_Polyhedron)
+XSB_ENTRY_2(ppl_new_C_Polyhedron_from_NNC_Polyhedron)
+XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_C_Polyhedron)
+XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron)
+XSB_ENTRY_2(ppl_new_C_Polyhedron_from_constraints)
+XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_constraints)
+XSB_ENTRY_2(ppl_new_C_Polyhedron_from_generators)
+XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_generators)
+XSB_ENTRY_2(ppl_new_C_Polyhedron_from_bounding_box)
+XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_bounding_box)
+XSB_ENTRY_2(ppl_Polyhedron_swap)
+XSB_ENTRY_1(ppl_delete_Polyhedron)
+XSB_ENTRY_2(ppl_Polyhedron_space_dimension)
+XSB_ENTRY_2(ppl_Polyhedron_affine_dimension)
+XSB_ENTRY_2(ppl_Polyhedron_get_constraints)
+XSB_ENTRY_2(ppl_Polyhedron_get_minimized_constraints)
+XSB_ENTRY_2(ppl_Polyhedron_get_generators)
+XSB_ENTRY_2(ppl_Polyhedron_get_minimized_generators)
+XSB_ENTRY_3(ppl_Polyhedron_relation_with_constraint)
+XSB_ENTRY_3(ppl_Polyhedron_relation_with_generator)
+XSB_ENTRY_3(ppl_Polyhedron_get_bounding_box)
+XSB_ENTRY_1(ppl_Polyhedron_is_empty)
+XSB_ENTRY_1(ppl_Polyhedron_is_universe)
+XSB_ENTRY_1(ppl_Polyhedron_is_bounded)
+XSB_ENTRY_2(ppl_Polyhedron_bounds_from_above)
+XSB_ENTRY_2(ppl_Polyhedron_bounds_from_below)
+XSB_ENTRY_5(ppl_Polyhedron_maximize)
+XSB_ENTRY_6(ppl_Polyhedron_maximize_with_point)
+XSB_ENTRY_5(ppl_Polyhedron_minimize)
+XSB_ENTRY_6(ppl_Polyhedron_minimize_with_point)
+XSB_ENTRY_1(ppl_Polyhedron_is_topologically_closed)
+XSB_ENTRY_2(ppl_Polyhedron_contains_Polyhedron)
+XSB_ENTRY_2(ppl_Polyhedron_strictly_contains_Polyhedron)
+XSB_ENTRY_2(ppl_Polyhedron_is_disjoint_from_Polyhedron)
+XSB_ENTRY_2(ppl_Polyhedron_equals_Polyhedron)
+XSB_ENTRY_1(ppl_Polyhedron_OK)
+XSB_ENTRY_2(ppl_Polyhedron_add_constraint)
+XSB_ENTRY_2(ppl_Polyhedron_add_constraint_and_minimize)
+XSB_ENTRY_2(ppl_Polyhedron_add_generator)
+XSB_ENTRY_2(ppl_Polyhedron_add_generator_and_minimize)
+XSB_ENTRY_2(ppl_Polyhedron_add_constraints)
+XSB_ENTRY_2(ppl_Polyhedron_add_constraints_and_minimize)
+XSB_ENTRY_2(ppl_Polyhedron_add_generators)
+XSB_ENTRY_2(ppl_Polyhedron_add_generators_and_minimize)
+XSB_ENTRY_2(ppl_Polyhedron_intersection_assign)
+XSB_ENTRY_2(ppl_Polyhedron_intersection_assign_and_minimize)
+XSB_ENTRY_2(ppl_Polyhedron_poly_hull_assign)
+XSB_ENTRY_2(ppl_Polyhedron_poly_hull_assign_and_minimize)
+XSB_ENTRY_2(ppl_Polyhedron_poly_difference_assign)
+XSB_ENTRY_4(ppl_Polyhedron_affine_image)
+XSB_ENTRY_4(ppl_Polyhedron_affine_preimage)
+XSB_ENTRY_5(ppl_Polyhedron_bounded_affine_image)
+XSB_ENTRY_5(ppl_Polyhedron_bounded_affine_preimage)
+XSB_ENTRY_5(ppl_Polyhedron_generalized_affine_image)
+XSB_ENTRY_5(ppl_Polyhedron_generalized_affine_preimage)
+XSB_ENTRY_4(ppl_Polyhedron_generalized_affine_image_lhs_rhs)
+XSB_ENTRY_4(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs)
+XSB_ENTRY_2(ppl_Polyhedron_time_elapse_assign)
+XSB_ENTRY_1(ppl_Polyhedron_topological_closure_assign)
+XSB_ENTRY_4(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens)
+XSB_ENTRY_2(ppl_Polyhedron_BHRZ03_widening_assign)
+XSB_ENTRY_5(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens)
+XSB_ENTRY_3(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign)
+XSB_ENTRY_5(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens)
+XSB_ENTRY_3(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign)
+XSB_ENTRY_4(ppl_Polyhedron_H79_widening_assign_with_tokens)
+XSB_ENTRY_2(ppl_Polyhedron_H79_widening_assign)
+XSB_ENTRY_5(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens)
+XSB_ENTRY_3(ppl_Polyhedron_limited_H79_extrapolation_assign)
+XSB_ENTRY_5(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens)
+XSB_ENTRY_3(ppl_Polyhedron_bounded_H79_extrapolation_assign)
+XSB_ENTRY_2(ppl_Polyhedron_add_space_dimensions_and_project)
+XSB_ENTRY_2(ppl_Polyhedron_add_space_dimensions_and_embed)
+XSB_ENTRY_2(ppl_Polyhedron_concatenate_assign)
+XSB_ENTRY_2(ppl_Polyhedron_remove_space_dimensions)
+XSB_ENTRY_2(ppl_Polyhedron_remove_higher_space_dimensions)
+XSB_ENTRY_3(ppl_Polyhedron_expand_space_dimension)
+XSB_ENTRY_3(ppl_Polyhedron_fold_space_dimensions)
+XSB_ENTRY_2(ppl_Polyhedron_map_space_dimensions)
+XSB_ENTRY_1(ppl_new_LP_Problem_trivial)
+XSB_ENTRY_4(ppl_new_LP_Problem)
+XSB_ENTRY_2(ppl_new_LP_Problem_from_LP_Problem)
+XSB_ENTRY_2(ppl_LP_Problem_swap)
+XSB_ENTRY_1(ppl_delete_LP_Problem)
+XSB_ENTRY_2(ppl_LP_Problem_space_dimension)
+XSB_ENTRY_2(ppl_LP_Problem_constraints)
+XSB_ENTRY_2(ppl_LP_Problem_objective_function)
+XSB_ENTRY_2(ppl_LP_Problem_optimization_mode)
+XSB_ENTRY_1(ppl_LP_Problem_clear)
+XSB_ENTRY_2(ppl_LP_Problem_add_constraint)
+XSB_ENTRY_2(ppl_LP_Problem_add_constraints)
+XSB_ENTRY_2(ppl_LP_Problem_set_objective_function)
+XSB_ENTRY_2(ppl_LP_Problem_set_optimization_mode)
+XSB_ENTRY_1(ppl_LP_Problem_is_satisfiable)
+XSB_ENTRY_2(ppl_LP_Problem_solve)
+XSB_ENTRY_2(ppl_LP_Problem_feasible_point)
+XSB_ENTRY_2(ppl_LP_Problem_optimizing_point)
+XSB_ENTRY_3(ppl_LP_Problem_optimal_value)
+XSB_ENTRY_4(ppl_LP_Problem_evaluate_objective_function)
+XSB_ENTRY_1(ppl_LP_Problem_OK)
+
+extern "C" void
+init() {
+  ppl_initialize();
+}
diff --git a/interfaces/Prolog/XSB/xsb_clpq.P b/interfaces/Prolog/XSB/xsb_clpq.P
new file mode 100644
index 0000000..b09b9fe
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_clpq.P
@@ -0,0 +1,52 @@
+/* Prolog main program for the toy PPL/XSB-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- compiler_options([xpp_on]).
+:- import xpp_include_dir/1 from parse.
+:- assert(xpp_include_dir('.')).
+
+:- import append/3, length/2, member/2 from basics.
+:- import
+	ppl_initialize/0,
+	ppl_finalize/0,
+	ppl_new_C_Polyhedron_from_space_dimension/3,
+	ppl_new_NNC_Polyhedron_from_space_dimension/3,
+	ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_delete_Polyhedron/1,
+	ppl_Polyhedron_space_dimension/2,
+	ppl_Polyhedron_get_constraints/2,
+	ppl_Polyhedron_add_constraints_and_minimize/2,
+	ppl_Polyhedron_add_space_dimensions_and_embed/2,
+	ppl_Polyhedron_remove_higher_space_dimensions/2
+   from ppl_xsb.
+
+:- [ppl_xsb].
+
+#include "clpq.pl"
+
+eat_eol.
+
+main :-
+    common_main.
+
+:- ppl_initialize, main, ppl_finalize.
diff --git a/interfaces/Prolog/XSB/xsb_clpq2.P b/interfaces/Prolog/XSB/xsb_clpq2.P
new file mode 100644
index 0000000..fa976d6
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_clpq2.P
@@ -0,0 +1,53 @@
+/* Prolog main program for the toy PPL/XSB-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- compiler_options([xpp_on]).
+:- import xpp_include_dir/1 from parse.
+:- assert(xpp_include_dir('.')).
+
+:- import append/3, length/2, member/2 from basics.
+:- import
+	ppl_initialize/0,
+	ppl_finalize/0,
+	ppl_new_C_Polyhedron_from_space_dimension/3,
+	ppl_new_NNC_Polyhedron_from_space_dimension/3,
+	ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_delete_Polyhedron/1,
+	ppl_Polyhedron_space_dimension/2,
+	ppl_Polyhedron_get_constraints/2,
+	ppl_Polyhedron_add_constraints_and_minimize/2,
+	ppl_Polyhedron_add_space_dimensions_and_embed/2,
+	ppl_Polyhedron_remove_space_dimensions/2,
+	ppl_Polyhedron_remove_higher_space_dimensions/2
+   from ppl_xsb.
+
+:- [ppl_xsb].
+
+#include "clpq2.pl"
+
+eat_eol.
+
+main :-
+    common_main.
+
+:- ppl_initialize, main, ppl_finalize.
diff --git a/interfaces/Prolog/XSB/xsb_pl_check.P b/interfaces/Prolog/XSB/xsb_pl_check.P
new file mode 100644
index 0000000..807ad36
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_pl_check.P
@@ -0,0 +1,163 @@
+/* Prolog main program for the PPL/XSB-Prolog predicate checker.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- compiler_options([xpp_on]).
+:- import xpp_include_dir/1 from parse.
+:- assert(xpp_include_dir('.')).
+
+:- import append/3, length/2, member/2 from basics.
+:- import
+	ppl_version_major/1,
+	ppl_version_minor/1,
+	ppl_version_revision/1,
+	ppl_version_beta/1,
+	ppl_version/1,
+	ppl_banner/1,
+	ppl_max_space_dimension/1,
+	ppl_Coefficient_is_bounded/0,
+	ppl_Coefficient_max/1,
+	ppl_Coefficient_min/1,
+	ppl_initialize/0,
+	ppl_finalize/0,
+	ppl_set_timeout_exception_atom/1,
+	ppl_timeout_exception_atom/1,
+	ppl_set_timeout/1,
+	ppl_reset_timeout/0,
+	ppl_new_C_Polyhedron_from_space_dimension/3,
+	ppl_new_NNC_Polyhedron_from_space_dimension/3,
+	ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
+	ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+	ppl_new_C_Polyhedron_from_constraints/2,
+	ppl_new_NNC_Polyhedron_from_constraints/2,
+	ppl_new_C_Polyhedron_from_generators/2,
+	ppl_new_NNC_Polyhedron_from_generators/2,
+	ppl_new_C_Polyhedron_from_bounding_box/2,
+	ppl_new_NNC_Polyhedron_from_bounding_box/2,
+	ppl_Polyhedron_swap/2,
+	ppl_delete_Polyhedron/1,
+	ppl_Polyhedron_space_dimension/2,
+	ppl_Polyhedron_affine_dimension/2,
+	ppl_Polyhedron_get_constraints/2,
+	ppl_Polyhedron_get_minimized_constraints/2,
+	ppl_Polyhedron_get_generators/2,
+	ppl_Polyhedron_get_minimized_generators/2,
+	ppl_Polyhedron_relation_with_constraint/3,
+	ppl_Polyhedron_relation_with_generator/3,
+        ppl_Polyhedron_get_bounding_box/3,
+	ppl_Polyhedron_is_empty/1,
+	ppl_Polyhedron_is_universe/1,
+	ppl_Polyhedron_is_bounded/1,
+	ppl_Polyhedron_bounds_from_above/2,
+	ppl_Polyhedron_bounds_from_below/2,
+	ppl_Polyhedron_maximize/5,
+	ppl_Polyhedron_maximize_with_point/6,
+	ppl_Polyhedron_minimize/5,
+	ppl_Polyhedron_minimize_with_point/6,
+        ppl_Polyhedron_is_topologically_closed/1,
+	ppl_Polyhedron_contains_Polyhedron/2,
+	ppl_Polyhedron_strictly_contains_Polyhedron/2,
+	ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+        ppl_Polyhedron_equals_Polyhedron/2,
+	ppl_Polyhedron_OK/1,
+	ppl_Polyhedron_add_constraint/2,
+	ppl_Polyhedron_add_constraint_and_minimize/2,
+	ppl_Polyhedron_add_generator/2,
+	ppl_Polyhedron_add_generator_and_minimize/2,
+	ppl_Polyhedron_add_constraints/2,
+	ppl_Polyhedron_add_constraints_and_minimize/2,
+	ppl_Polyhedron_add_generators/2,
+	ppl_Polyhedron_add_generators_and_minimize/2,
+	ppl_Polyhedron_intersection_assign/2,
+	ppl_Polyhedron_intersection_assign_and_minimize/2,
+	ppl_Polyhedron_poly_hull_assign/2,
+	ppl_Polyhedron_poly_hull_assign_and_minimize/2,
+	ppl_Polyhedron_poly_difference_assign/2,
+	ppl_Polyhedron_affine_image/4,
+	ppl_Polyhedron_affine_preimage/4,
+	ppl_Polyhedron_bounded_affine_image/5,
+	ppl_Polyhedron_bounded_affine_preimage/5,
+	ppl_Polyhedron_generalized_affine_image/5,
+	ppl_Polyhedron_generalized_affine_preimage/5,
+	ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+	ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
+	ppl_Polyhedron_time_elapse_assign/2,
+        ppl_Polyhedron_topological_closure_assign/1,
+	ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4,
+	ppl_Polyhedron_BHRZ03_widening_assign/2,
+	ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
+	ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+	ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
+	ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+	ppl_Polyhedron_H79_widening_assign_with_tokens/4,
+	ppl_Polyhedron_H79_widening_assign/2,
+	ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
+	ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+	ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
+	ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
+	ppl_Polyhedron_add_space_dimensions_and_project/2,
+	ppl_Polyhedron_add_space_dimensions_and_embed/2,
+	ppl_Polyhedron_concatenate_assign/2,
+	ppl_Polyhedron_remove_space_dimensions/2,
+	ppl_Polyhedron_remove_higher_space_dimensions/2,
+	ppl_Polyhedron_expand_space_dimension/3,
+	ppl_Polyhedron_fold_space_dimensions/3,
+	ppl_Polyhedron_map_space_dimensions/2,
+	ppl_new_LP_Problem_trivial/1,
+	ppl_new_LP_Problem/4,
+	ppl_new_LP_Problem_from_LP_Problem/2,
+	ppl_LP_Problem_swap/2,
+	ppl_delete_LP_Problem/1,
+        ppl_LP_Problem_space_dimension/2,
+        ppl_LP_Problem_constraints/2,
+        ppl_LP_Problem_objective_function/2,
+        ppl_LP_Problem_optimization_mode/2,
+        ppl_LP_Problem_clear/1,
+        ppl_LP_Problem_add_constraint/2,
+        ppl_LP_Problem_add_constraints/2,
+        ppl_LP_Problem_set_objective_function/2,
+        ppl_LP_Problem_set_optimization_mode/2,
+        ppl_LP_Problem_is_satisfiable/1,
+        ppl_LP_Problem_solve/2,
+        ppl_LP_Problem_feasible_point/2,
+        ppl_LP_Problem_optimizing_point/2,
+        ppl_LP_Problem_optimal_value/3,
+        ppl_LP_Problem_evaluate_objective_function/4,
+        ppl_LP_Problem_OK/1
+   from ppl_xsb.
+
+:- [ppl_xsb].
+
+#include "pl_check.pl"
+
+prolog_system('XSB').
+
+main :-
+    (check_all ->
+        write('OK')
+    ;
+        write('FAILURE')
+    ),
+    nl.
+
+:- main.
diff --git a/interfaces/Prolog/YAP/Makefile.am b/interfaces/Prolog/YAP/Makefile.am
new file mode 100644
index 0000000..7a8740d
--- /dev/null
+++ b/interfaces/Prolog/YAP/Makefile.am
@@ -0,0 +1,125 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+EXTRA_DIST = ppl_yap.pl yap_clpq.pl yap_clpq2.pl yap_pl_check.pl
+
+if BUILD_YAP_PROLOG_INTERFACE
+if ENABLE_SHARED
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog/src \
+ at extra_includes@
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+pkglib_LTLIBRARIES = ppl_yap.la
+ppl_yap_la_SOURCES = ppl_yap.cc
+ppl_yap_la_LIBADD = \
+-lYap \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/Watchdog/src/libpwl.la \
+ at extra_libraries@
+
+ppl_yap_la_LDFLAGS = $(NO_UNDEFINED_FLAG) -module -avoid-version
+
+pkglib_DATA = ppl_yap.pl
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test
+
+pl_check_test: yap_pl_check.pl ppl_yap.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+	echo "main." >script_pchk
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		-dlopen ppl_yap.la \
+		yap -l $(srcdir)/yap_pl_check.pl \
+			<script_pchk >obtained_pchk
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+clpq_test: yap_clpq.pl ppl_yap.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ)
+	LANG=C; \
+	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+	echo "main." >script_clpq
+	cat $(srcdir)/../tests/script_clpq >>script_clpq
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		-dlopen ppl_yap.la \
+		yap -l $(srcdir)/yap_clpq.pl \
+			<script_clpq >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: yap_clpq2.pl ppl_yap.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2)
+	LANG=C; \
+	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+	echo "main." >script_clpq2
+	cat $(srcdir)/../tests/script_clpq2 >>script_clpq2
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ../../../Watchdog/src/libpwl.la \
+		-dlopen ppl_yap.la \
+		yap -l $(srcdir)/yap_clpq2.pl \
+			<script_clpq2 >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+MOSTLYCLEANFILES = \
+script_clpq script_clpq2 script_pchk \
+obtained_clpq obtained_clpq2 obtained_pchk \
+$(CLPQ_TESTS)
+
+endif ENABLE_SHARED
+endif BUILD_YAP_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/YAP/Makefile.in b/interfaces/Prolog/YAP/Makefile.in
new file mode 100644
index 0000000..d998ca5
--- /dev/null
+++ b/interfaces/Prolog/YAP/Makefile.in
@@ -0,0 +1,685 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog/YAP
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"
+pkglibLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
+am__ppl_yap_la_SOURCES_DIST = ppl_yap.cc
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_ppl_yap_la_OBJECTS = ppl_yap.lo
+ppl_yap_la_OBJECTS = $(am_ppl_yap_la_OBJECTS)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_ppl_yap_la_rpath =  \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	-rpath \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(pkglibdir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ppl_yap_la_SOURCES)
+DIST_SOURCES = $(am__ppl_yap_la_SOURCES_DIST)
+pkglibDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkglib_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+EXTRA_DIST = ppl_yap.pl yap_clpq.pl yap_clpq2.pl yap_pl_check.pl
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at AM_CPPFLAGS = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_builddir)/src \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_builddir)/Watchdog/src \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@extra_includes@
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@NO_UNDEFINED_TRUE at NO_UNDEFINED_FLAG = -no-undefined
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_LTLIBRARIES = ppl_yap.la
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_SOURCES = ppl_yap.cc
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_LIBADD = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -lYap \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@extra_libraries@
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_LDFLAGS = $(NO_UNDEFINED_FLAG) -module -avoid-version
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_DATA = ppl_yap.pl
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS_NONSTRICT = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ack.clpq \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ackn.clpq \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at fib.clpq \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at mc91.clpq \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at smm.clpq \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at sumto.clpq \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at tak.clpq
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS_STRICT = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at schedule.clpq
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at MOSTLYCLEANFILES = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at script_clpq script_clpq2 script_pchk \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at obtained_clpq obtained_clpq2 obtained_pchk \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(CLPQ_TESTS)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Prolog/YAP/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Prolog/YAP/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    f=$(am__strip_dir) \
+	    echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	    $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	  else :; fi; \
+	done
+
+uninstall-pkglibLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  p=$(am__strip_dir) \
+	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+	done
+
+clean-pkglibLTLIBRARIES:
+	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+	@list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+ppl_yap.la: $(ppl_yap_la_OBJECTS) $(ppl_yap_la_DEPENDENCIES) 
+	$(CXXLINK) $(am_ppl_yap_la_rpath) $(ppl_yap_la_LDFLAGS) $(ppl_yap_la_OBJECTS) $(ppl_yap_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_yap.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-pkglibDATA: $(pkglib_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+	@list='$(pkglib_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+uninstall-pkglibDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+ at BUILD_YAP_PROLOG_INTERFACE_FALSE@check-local:
+ at ENABLE_SHARED_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-pkglibDATA install-pkglibLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkglibDATA \
+	uninstall-pkglibLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+	clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-pkglibDATA \
+	install-pkglibLTLIBRARIES install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-info-am \
+	uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at check-local: pl_check_test clpq_test clpq2_test
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pl_check_test: yap_pl_check.pl ppl_yap.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	echo "main." >script_pchk
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ppl_yap.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		yap -l $(srcdir)/yap_pl_check.pl \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			<script_pchk >obtained_pchk
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at clpq_test: yap_clpq.pl ppl_yap.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	LANG=C; \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	echo "main." >script_clpq
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	cat $(srcdir)/../tests/script_clpq >>script_clpq
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ppl_yap.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		yap -l $(srcdir)/yap_clpq.pl \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			<script_clpq >obtained_clpq
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at clpq2_test: yap_clpq2.pl ppl_yap.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	LANG=C; \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	echo "main." >script_clpq2
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	cat $(srcdir)/../tests/script_clpq2 >>script_clpq2
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		-dlopen ppl_yap.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@		yap -l $(srcdir)/yap_clpq2.pl \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@			<script_clpq2 >obtained_clpq2
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/YAP/ppl_yap.cc b/interfaces/Prolog/YAP/ppl_yap.cc
new file mode 100644
index 0000000..9bd77fb
--- /dev/null
+++ b/interfaces/Prolog/YAP/ppl_yap.cc
@@ -0,0 +1,725 @@
+/* YAP Prolog interface: system-dependent part.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+#include <Yap/YapInterface.h>
+#include <cassert>
+#include <cassert>
+#include <climits>
+
+typedef YAP_Term Prolog_term_ref;
+typedef YAP_Atom Prolog_atom;
+typedef YAP_Bool Prolog_foreign_return_type;
+
+namespace {
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+} // namespace
+
+#include "../exceptions.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+Prolog_atom a_throw;
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+long Prolog_max_integer;
+
+/*!
+  Temporary used to communicate big integers between C++ and Prolog.
+*/
+mpz_class tmp_mpz_class;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = true;
+  Prolog_min_integer = 0;
+  Prolog_max_integer = 0;
+
+  a_throw = YAP_LookupAtom("throw");
+}
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return 0;
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+  t = u;
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+  t = YAP_MkIntTerm(l);
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+  if (ul <= LONG_MAX)
+    t = YAP_MkIntTerm(ul);
+  else {
+    tmp_mpz_class = ul;
+    t = YAP_MkBigNumTerm(tmp_mpz_class.get_mpz_t());
+  }
+  return 1;
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+  t = YAP_MkAtomTerm(YAP_FullLookupAtom(s));
+  return 1;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+  t = YAP_MkAtomTerm(a);
+  return 1;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+  t = YAP_MkIntTerm(reinterpret_cast<long>(p));
+  return 1;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return YAP_FullLookupAtom(s);
+}
+
+Prolog_term_ref args[4];
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1) {
+  args[0] = a1;
+  t = YAP_MkApplTerm(YAP_MkFunctor(f, 1), 1, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2) {
+  args[0] = a1;
+  args[1] = a2;
+  t = YAP_MkApplTerm(YAP_MkFunctor(f, 2), 2, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3) {
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  t = YAP_MkApplTerm(YAP_MkFunctor(f, 3), 3, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+			  Prolog_term_ref a1, Prolog_term_ref a2,
+			  Prolog_term_ref a3, Prolog_term_ref a4) {
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  args[3] = a4;
+  t = YAP_MkApplTerm(YAP_MkFunctor(f, 4), 4, args);
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+		      Prolog_term_ref h, Prolog_term_ref t) {
+  c = YAP_MkPairTerm(h, t);
+  return 1;
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  YAP_Throw(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return YAP_IsVarTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return YAP_IsAtomTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return YAP_IsIntTerm(t) != FALSE || YAP_IsBigNumTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  return YAP_IsIntTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return YAP_IsApplTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog list, false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  return YAP_IsPairTerm(t) != FALSE;
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  if (YAP_IsBigNumTerm(t) != FALSE) {
+    YAP_BigNumOfTerm(t, tmp_mpz_class.get_mpz_t());
+    if (tmp_mpz_class >= LONG_MIN && tmp_mpz_class <= LONG_MAX)
+      PPL::assign_r(*lp, tmp_mpz_class, PPL::ROUND_NOT_NEEDED);
+    else
+      return 0;
+  }
+  else
+    *lp = YAP_IntOfTerm(t);
+  return 1;
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  *vpp = reinterpret_cast<void*>(YAP_IntOfTerm(t));
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  *ap = YAP_AtomOfTerm(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  YAP_Functor f = YAP_FunctorOfTerm(t);
+  *ap = YAP_NameOfFunctor(f);
+  *ip = YAP_ArityOfFunctor(f);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+  assert(Prolog_is_compound(t));
+  a = YAP_ArgOfTerm(i, t);
+  return 1;
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+  assert(Prolog_is_cons(c));
+  h = YAP_HeadOfTerm(c);
+  t = YAP_TailOfTerm(c);
+  return 1;
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return YAP_Unify(t, u) != FALSE;
+}
+
+PPL::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+  PPL::Coefficient n;
+  if (YAP_IsBigNumTerm(t) != FALSE) {
+    YAP_BigNumOfTerm(t, tmp_mpz_class.get_mpz_t());
+    n = tmp_mpz_class;
+  }
+  else
+    n = YAP_IntOfTerm(t);
+  return n;
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const PPL::Coefficient& n) {
+  if (n >= LONG_MIN && n <= LONG_MAX) {
+    long l = 0;
+    PPL::assign_r(l, n, PPL::ROUND_NOT_NEEDED);
+    return YAP_MkIntTerm(l);
+  }
+  else {
+    PPL::assign_r(tmp_mpz_class, n, PPL::ROUND_NOT_NEEDED);
+    return YAP_MkBigNumTerm(tmp_mpz_class.get_mpz_t());
+  }
+}
+
+} // namespace
+
+#include "../ppl_prolog.icc"
+
+#define YAP_STUB_0(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  return name(); \
+}
+
+#define YAP_STUB_1(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  return name(arg1); \
+}
+
+#define YAP_STUB_2(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  return name(arg1, arg2); \
+}
+
+#define YAP_STUB_3(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  return name(arg1, arg2, arg3); \
+}
+
+#define YAP_STUB_4(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  Prolog_term_ref arg4 = YAP_ARG4; \
+  return name(arg1, arg2, arg3, arg4); \
+}
+
+#define YAP_STUB_5(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  Prolog_term_ref arg4 = YAP_ARG4; \
+  Prolog_term_ref arg5 = YAP_ARG5; \
+  return name(arg1, arg2, arg3, arg4, arg5); \
+}
+
+#define YAP_STUB_6(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  Prolog_term_ref arg4 = YAP_ARG4; \
+  Prolog_term_ref arg5 = YAP_ARG5; \
+  Prolog_term_ref arg6 = YAP_ARG6; \
+  return name(arg1, arg2, arg3, arg4, arg5, arg6); \
+}
+
+YAP_STUB_1(ppl_version_major)
+YAP_STUB_1(ppl_version_minor)
+YAP_STUB_1(ppl_version_revision)
+YAP_STUB_1(ppl_version_beta)
+YAP_STUB_1(ppl_version)
+YAP_STUB_1(ppl_banner)
+YAP_STUB_1(ppl_max_space_dimension)
+YAP_STUB_0(ppl_Coefficient_is_bounded)
+YAP_STUB_1(ppl_Coefficient_max)
+YAP_STUB_1(ppl_Coefficient_min)
+YAP_STUB_0(ppl_initialize)
+YAP_STUB_0(ppl_finalize)
+YAP_STUB_1(ppl_set_timeout_exception_atom)
+YAP_STUB_1(ppl_timeout_exception_atom)
+YAP_STUB_1(ppl_set_timeout)
+YAP_STUB_0(ppl_reset_timeout)
+YAP_STUB_3(ppl_new_C_Polyhedron_from_space_dimension)
+YAP_STUB_3(ppl_new_NNC_Polyhedron_from_space_dimension)
+YAP_STUB_2(ppl_new_C_Polyhedron_from_C_Polyhedron)
+YAP_STUB_2(ppl_new_C_Polyhedron_from_NNC_Polyhedron)
+YAP_STUB_2(ppl_new_NNC_Polyhedron_from_C_Polyhedron)
+YAP_STUB_2(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron)
+YAP_STUB_2(ppl_new_C_Polyhedron_from_constraints)
+YAP_STUB_2(ppl_new_NNC_Polyhedron_from_constraints)
+YAP_STUB_2(ppl_new_C_Polyhedron_from_generators)
+YAP_STUB_2(ppl_new_NNC_Polyhedron_from_generators)
+YAP_STUB_2(ppl_new_C_Polyhedron_from_bounding_box)
+YAP_STUB_2(ppl_new_NNC_Polyhedron_from_bounding_box)
+YAP_STUB_2(ppl_Polyhedron_swap)
+YAP_STUB_1(ppl_delete_Polyhedron)
+YAP_STUB_2(ppl_Polyhedron_space_dimension)
+YAP_STUB_2(ppl_Polyhedron_affine_dimension)
+YAP_STUB_2(ppl_Polyhedron_get_constraints)
+YAP_STUB_2(ppl_Polyhedron_get_minimized_constraints)
+YAP_STUB_2(ppl_Polyhedron_get_generators)
+YAP_STUB_2(ppl_Polyhedron_get_minimized_generators)
+YAP_STUB_3(ppl_Polyhedron_relation_with_constraint)
+YAP_STUB_3(ppl_Polyhedron_relation_with_generator)
+YAP_STUB_3(ppl_Polyhedron_get_bounding_box)
+YAP_STUB_1(ppl_Polyhedron_is_empty)
+YAP_STUB_1(ppl_Polyhedron_is_universe)
+YAP_STUB_1(ppl_Polyhedron_is_bounded)
+YAP_STUB_2(ppl_Polyhedron_bounds_from_above)
+YAP_STUB_2(ppl_Polyhedron_bounds_from_below)
+YAP_STUB_5(ppl_Polyhedron_maximize)
+YAP_STUB_6(ppl_Polyhedron_maximize_with_point)
+YAP_STUB_5(ppl_Polyhedron_minimize)
+YAP_STUB_6(ppl_Polyhedron_minimize_with_point)
+YAP_STUB_1(ppl_Polyhedron_is_topologically_closed)
+YAP_STUB_2(ppl_Polyhedron_contains_Polyhedron)
+YAP_STUB_2(ppl_Polyhedron_strictly_contains_Polyhedron)
+YAP_STUB_2(ppl_Polyhedron_is_disjoint_from_Polyhedron)
+YAP_STUB_2(ppl_Polyhedron_equals_Polyhedron)
+YAP_STUB_1(ppl_Polyhedron_OK)
+YAP_STUB_2(ppl_Polyhedron_add_constraint)
+YAP_STUB_2(ppl_Polyhedron_add_constraint_and_minimize)
+YAP_STUB_2(ppl_Polyhedron_add_generator)
+YAP_STUB_2(ppl_Polyhedron_add_generator_and_minimize)
+YAP_STUB_2(ppl_Polyhedron_add_constraints)
+YAP_STUB_2(ppl_Polyhedron_add_constraints_and_minimize)
+YAP_STUB_2(ppl_Polyhedron_add_generators)
+YAP_STUB_2(ppl_Polyhedron_add_generators_and_minimize)
+YAP_STUB_2(ppl_Polyhedron_intersection_assign)
+YAP_STUB_2(ppl_Polyhedron_intersection_assign_and_minimize)
+YAP_STUB_2(ppl_Polyhedron_poly_hull_assign)
+YAP_STUB_2(ppl_Polyhedron_poly_hull_assign_and_minimize)
+YAP_STUB_2(ppl_Polyhedron_poly_difference_assign)
+YAP_STUB_4(ppl_Polyhedron_affine_image)
+YAP_STUB_4(ppl_Polyhedron_affine_preimage)
+YAP_STUB_5(ppl_Polyhedron_bounded_affine_image)
+YAP_STUB_5(ppl_Polyhedron_bounded_affine_preimage)
+YAP_STUB_5(ppl_Polyhedron_generalized_affine_image)
+YAP_STUB_5(ppl_Polyhedron_generalized_affine_preimage)
+YAP_STUB_4(ppl_Polyhedron_generalized_affine_image_lhs_rhs)
+YAP_STUB_4(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs)
+YAP_STUB_2(ppl_Polyhedron_time_elapse_assign)
+YAP_STUB_1(ppl_Polyhedron_topological_closure_assign)
+YAP_STUB_4(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens)
+YAP_STUB_2(ppl_Polyhedron_BHRZ03_widening_assign)
+YAP_STUB_5(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens)
+YAP_STUB_3(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign)
+YAP_STUB_5(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens)
+YAP_STUB_3(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign)
+YAP_STUB_4(ppl_Polyhedron_H79_widening_assign_with_tokens)
+YAP_STUB_2(ppl_Polyhedron_H79_widening_assign)
+YAP_STUB_5(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens)
+YAP_STUB_3(ppl_Polyhedron_limited_H79_extrapolation_assign)
+YAP_STUB_5(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens)
+YAP_STUB_3(ppl_Polyhedron_bounded_H79_extrapolation_assign)
+YAP_STUB_2(ppl_Polyhedron_add_space_dimensions_and_project)
+YAP_STUB_2(ppl_Polyhedron_add_space_dimensions_and_embed)
+YAP_STUB_2(ppl_Polyhedron_concatenate_assign)
+YAP_STUB_2(ppl_Polyhedron_remove_space_dimensions)
+YAP_STUB_2(ppl_Polyhedron_remove_higher_space_dimensions)
+YAP_STUB_3(ppl_Polyhedron_expand_space_dimension)
+YAP_STUB_3(ppl_Polyhedron_fold_space_dimensions)
+YAP_STUB_2(ppl_Polyhedron_map_space_dimensions)
+YAP_STUB_1(ppl_new_LP_Problem_trivial)
+YAP_STUB_4(ppl_new_LP_Problem)
+YAP_STUB_2(ppl_new_LP_Problem_from_LP_Problem)
+YAP_STUB_2(ppl_LP_Problem_swap)
+YAP_STUB_1(ppl_delete_LP_Problem)
+YAP_STUB_2(ppl_LP_Problem_space_dimension)
+YAP_STUB_2(ppl_LP_Problem_constraints)
+YAP_STUB_2(ppl_LP_Problem_objective_function)
+YAP_STUB_2(ppl_LP_Problem_optimization_mode)
+YAP_STUB_1(ppl_LP_Problem_clear)
+YAP_STUB_2(ppl_LP_Problem_add_constraint)
+YAP_STUB_2(ppl_LP_Problem_add_constraints)
+YAP_STUB_2(ppl_LP_Problem_set_objective_function)
+YAP_STUB_2(ppl_LP_Problem_set_optimization_mode)
+YAP_STUB_1(ppl_LP_Problem_is_satisfiable)
+YAP_STUB_2(ppl_LP_Problem_solve)
+YAP_STUB_2(ppl_LP_Problem_feasible_point)
+YAP_STUB_2(ppl_LP_Problem_optimizing_point)
+YAP_STUB_3(ppl_LP_Problem_optimal_value)
+YAP_STUB_4(ppl_LP_Problem_evaluate_objective_function)
+YAP_STUB_1(ppl_LP_Problem_OK)
+
+#define YAP_USER_C_PREDICATE(name, arity) \
+ YAP_UserCPredicate(#name, reinterpret_cast<int(*)()>(yap_stub_##name), arity)
+
+extern "C" void
+init() {
+  ppl_initialize();
+  YAP_USER_C_PREDICATE(ppl_version_major, 1);
+  YAP_USER_C_PREDICATE(ppl_version_minor, 1);
+  YAP_USER_C_PREDICATE(ppl_version_revision, 1);
+  YAP_USER_C_PREDICATE(ppl_version_beta, 1);
+  YAP_USER_C_PREDICATE(ppl_version, 1);
+  YAP_USER_C_PREDICATE(ppl_banner, 1);
+  YAP_USER_C_PREDICATE(ppl_max_space_dimension, 1);
+  YAP_USER_C_PREDICATE(ppl_Coefficient_is_bounded, 0);
+  YAP_USER_C_PREDICATE(ppl_Coefficient_max, 1);
+  YAP_USER_C_PREDICATE(ppl_Coefficient_min, 1);
+  YAP_USER_C_PREDICATE(ppl_initialize, 0);
+  YAP_USER_C_PREDICATE(ppl_finalize, 0);
+  YAP_USER_C_PREDICATE(ppl_set_timeout_exception_atom, 1);
+  YAP_USER_C_PREDICATE(ppl_timeout_exception_atom, 1);
+  YAP_USER_C_PREDICATE(ppl_set_timeout, 1);
+  YAP_USER_C_PREDICATE(ppl_reset_timeout, 0);
+  YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_space_dimension, 3);
+  YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_space_dimension, 3);
+  YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_C_Polyhedron, 2);
+  YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_NNC_Polyhedron, 2);
+  YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_C_Polyhedron, 2);
+  YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron, 2);
+  YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_constraints, 2);
+  YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_constraints, 2);
+  YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_generators, 2);
+  YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_generators, 2);
+  YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_bounding_box, 2);
+  YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_bounding_box, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_swap, 2);
+  YAP_USER_C_PREDICATE(ppl_delete_Polyhedron, 1);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_space_dimension, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_affine_dimension, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_get_constraints, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_get_minimized_constraints, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_get_generators, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_get_minimized_generators, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_relation_with_constraint, 3);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_relation_with_generator, 3);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_get_bounding_box, 3);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_is_empty, 1);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_is_universe, 1);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_is_bounded, 1);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_bounds_from_above, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_bounds_from_below, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_maximize, 5);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_maximize_with_point, 6);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_minimize, 5);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_minimize_with_point, 6);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_is_topologically_closed, 1);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_contains_Polyhedron, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_strictly_contains_Polyhedron, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_is_disjoint_from_Polyhedron, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_equals_Polyhedron, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_OK, 1);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_constraint, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_constraint_and_minimize, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_generator, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_generator_and_minimize, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_constraints, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_constraints_and_minimize, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_generators, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_generators_and_minimize, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_intersection_assign, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_intersection_assign_and_minimize, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_poly_hull_assign, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_poly_hull_assign_and_minimize, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_poly_difference_assign, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_affine_image, 4);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_affine_preimage, 4);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_bounded_affine_image, 5);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_bounded_affine_preimage, 5);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_generalized_affine_image, 5);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_generalized_affine_preimage, 5);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_generalized_affine_image_lhs_rhs, 4);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs, 4);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_time_elapse_assign, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_topological_closure_assign, 1);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens, 4);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_BHRZ03_widening_assign, 2);
+  YAP_USER_C_PREDICATE(
+          ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens, 5);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign, 3);
+  YAP_USER_C_PREDICATE(
+          ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens, 5);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign, 3);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_H79_widening_assign_with_tokens, 4);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_H79_widening_assign, 2);
+  YAP_USER_C_PREDICATE(
+          ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens, 5);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_limited_H79_extrapolation_assign, 3);
+  YAP_USER_C_PREDICATE(
+          ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens, 5);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_bounded_H79_extrapolation_assign, 3);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_space_dimensions_and_project, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_add_space_dimensions_and_embed, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_concatenate_assign, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_remove_space_dimensions, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_remove_higher_space_dimensions, 2);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_expand_space_dimension, 3);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_fold_space_dimensions, 3);
+  YAP_USER_C_PREDICATE(ppl_Polyhedron_map_space_dimensions, 2);
+  YAP_USER_C_PREDICATE(ppl_new_LP_Problem_trivial, 1);
+  YAP_USER_C_PREDICATE(ppl_new_LP_Problem, 4);
+  YAP_USER_C_PREDICATE(ppl_new_LP_Problem_from_LP_Problem, 2);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_swap, 2);
+  YAP_USER_C_PREDICATE(ppl_delete_LP_Problem, 1);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_space_dimension, 2);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_constraints, 2);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_objective_function, 2);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_optimization_mode, 2);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_clear, 1);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_add_constraint, 2);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_add_constraints, 2);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_set_objective_function, 2);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_set_optimization_mode, 2);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_is_satisfiable, 1);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_solve, 2);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_feasible_point, 2);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_optimizing_point, 2);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_optimal_value, 3);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_evaluate_objective_function, 4);
+  YAP_USER_C_PREDICATE(ppl_LP_Problem_OK, 1);
+}
diff --git a/interfaces/Prolog/YAP/ppl_yap.pl b/interfaces/Prolog/YAP/ppl_yap.pl
new file mode 100644
index 0000000..2420b2a
--- /dev/null
+++ b/interfaces/Prolog/YAP/ppl_yap.pl
@@ -0,0 +1,23 @@
+/* Loader for the YAP Prolog interface.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- load_foreign_files(['ppl_yap'],[],init).
diff --git a/interfaces/Prolog/YAP/yap_clpq.pl b/interfaces/Prolog/YAP/yap_clpq.pl
new file mode 100644
index 0000000..83e6c56
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_clpq.pl
@@ -0,0 +1,30 @@
+/* Prolog main program for the toy PPL/YAP-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- ensure_loaded('ppl_yap.pl').
+:- ensure_loaded('../tests/clpq.pl').
+:- use_module(library(lists), [append/3, member/2]).
+
+eat_eol.
+
+main :-
+    common_main.
diff --git a/interfaces/Prolog/YAP/yap_clpq2.pl b/interfaces/Prolog/YAP/yap_clpq2.pl
new file mode 100644
index 0000000..95dfb2f
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_clpq2.pl
@@ -0,0 +1,30 @@
+/* Prolog main program for the 2nd toy PPL/YAP-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- ensure_loaded('ppl_yap.pl').
+:- ensure_loaded('../tests/clpq2.pl').
+:- use_module(library(lists), [append/3, member/2]).
+
+eat_eol.
+
+main :-
+    common_main.
diff --git a/interfaces/Prolog/YAP/yap_pl_check.pl b/interfaces/Prolog/YAP/yap_pl_check.pl
new file mode 100644
index 0000000..7df31e1
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_pl_check.pl
@@ -0,0 +1,34 @@
+/* Prolog main program for the PPL/YAP-Prolog predicate checker.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- ensure_loaded('ppl_yap.pl').
+:- ensure_loaded('../tests/pl_check.pl').
+
+prolog_system('YAP').
+
+main :-
+    (check_all ->
+	write('OK')
+    ;
+	write('FAILURE')
+    ),
+    nl.
diff --git a/interfaces/Prolog/exceptions.hh b/interfaces/Prolog/exceptions.hh
new file mode 100644
index 0000000..51e5322
--- /dev/null
+++ b/interfaces/Prolog/exceptions.hh
@@ -0,0 +1,174 @@
+/* Exceptions used internally by the Prolog interfaces.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+class internal_exception {
+private:
+  Prolog_term_ref tr;
+
+public:
+  explicit internal_exception(Prolog_term_ref t)
+    : tr(t) {
+  }
+
+  virtual ~internal_exception() {
+  }
+
+  virtual Prolog_term_ref term() const {
+    return tr;
+  }
+};
+
+class Prolog_unsigned_out_of_range : public internal_exception {
+private:
+  unsigned long m;
+
+public:
+  explicit Prolog_unsigned_out_of_range(Prolog_term_ref t, unsigned long max)
+    : internal_exception(t),
+      m(max) {
+  }
+
+  unsigned long max() const {
+    return m;
+  }
+
+};
+
+class non_linear : public internal_exception {
+private:
+  const char* w;
+
+public:
+  explicit non_linear(const char* s, Prolog_term_ref t)
+    : internal_exception(t), w(s) {
+  }
+
+  const char* where() const {
+    return w;
+  }
+};
+
+class not_an_integer : public internal_exception {
+public:
+  explicit not_an_integer(Prolog_term_ref t)
+    : internal_exception(t) {
+  }
+};
+
+class not_unsigned_integer : public internal_exception {
+public:
+  explicit not_unsigned_integer(Prolog_term_ref t)
+    : internal_exception(t) {
+  }
+};
+
+class not_a_variable : public internal_exception {
+public:
+  explicit not_a_variable(Prolog_term_ref t)
+    : internal_exception(t) {
+  }
+};
+
+class not_a_polyhedron_kind : public internal_exception {
+public:
+  explicit not_a_polyhedron_kind(Prolog_term_ref t)
+    : internal_exception(t) {
+  }
+};
+
+class not_a_polyhedron_handle : public internal_exception {
+public:
+  explicit not_a_polyhedron_handle(Prolog_term_ref t)
+    : internal_exception(t) {
+  }
+};
+
+class not_an_optimization_mode : public internal_exception {
+public:
+  explicit not_an_optimization_mode(Prolog_term_ref t)
+    : internal_exception(t) {
+  }
+};
+
+class not_an_lp_problem_handle : public internal_exception {
+public:
+  explicit not_an_lp_problem_handle(Prolog_term_ref t)
+    : internal_exception(t) {
+  }
+};
+
+class not_a_complexity_class : public internal_exception {
+public:
+  explicit not_a_complexity_class(Prolog_term_ref t)
+    : internal_exception(t) {
+  }
+};
+
+class not_universe_or_empty : public internal_exception {
+public:
+  explicit not_universe_or_empty(Prolog_term_ref t)
+    : internal_exception(t) {
+  }
+};
+
+class not_a_relation : public internal_exception {
+public:
+  explicit not_a_relation(Prolog_term_ref t)
+    : internal_exception(t) {
+  }
+};
+
+class not_a_nil_terminated_list : public internal_exception {
+public:
+  explicit not_a_nil_terminated_list(Prolog_term_ref t)
+    : internal_exception(t) {
+  }
+};
+
+class PPL_integer_out_of_range {
+private:
+  Parma_Polyhedra_Library::Coefficient n;
+
+public:
+  explicit
+  PPL_integer_out_of_range(const Parma_Polyhedra_Library::Coefficient& i)
+    : n(i) {
+  }
+
+  const Parma_Polyhedra_Library::Coefficient i() const {
+    return n;
+  }
+};
+
+class unknown_interface_error {
+private:
+  const char* w;
+
+public:
+  unknown_interface_error(const char* s)
+    : w(s) {
+  }
+
+  const char* where() const {
+    return w;
+  }
+};
diff --git a/interfaces/Prolog/ppl_prolog.icc b/interfaces/Prolog/ppl_prolog.icc
new file mode 100644
index 0000000..eb8df70
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog.icc
@@ -0,0 +1,3483 @@
+/* Common part of the Prolog interfaces.  -*- C++ -*-
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+#include "track_allocation.hh"
+#include <set>
+#include <vector>
+#include <exception>
+#include <stdexcept>
+#include <sstream>
+#include <climits>
+
+using namespace Parma_Polyhedra_Library;
+
+namespace {
+
+Prolog_atom out_of_memory_exception_atom;
+
+// For Prolog lists.
+Prolog_atom a_nil;
+
+// For variables.
+Prolog_atom a_dollar_VAR;
+
+// For linear expressions.
+Prolog_atom a_plus;
+Prolog_atom a_minus;
+Prolog_atom a_asterisk;
+
+// To represent rational numbers as fractions.
+Prolog_atom a_slash;
+
+// For constraints.
+Prolog_atom a_less_than;
+Prolog_atom a_equal_less_than;
+Prolog_atom a_equal;
+Prolog_atom a_greater_than_equal;
+Prolog_atom a_greater_than;
+
+// For generators.
+Prolog_atom a_line;
+Prolog_atom a_ray;
+Prolog_atom a_point;
+Prolog_atom a_closure_point;
+
+// For the relation between a polyhedron and a constraint.
+Prolog_atom a_is_disjoint;
+Prolog_atom a_strictly_intersects;
+Prolog_atom a_is_included;
+Prolog_atom a_saturates;
+
+// For the relation between a polyhedron and a generator.
+Prolog_atom a_subsumes;
+
+// Denotes a closed interval boundary.
+Prolog_atom a_c;
+
+// Denotes the empty set such as the empty interval or polyhedron.
+Prolog_atom a_empty;
+
+// Denotes the universe polyhedron.
+Prolog_atom a_universe;
+
+// Denotes the maximization mode for optimization problems.
+Prolog_atom a_max;
+
+// Denotes the minimization mode for optimization problems.
+Prolog_atom a_min;
+
+// Denote possible outcomes of LP problems solution attempts.
+Prolog_atom a_unfeasible;
+Prolog_atom a_unbounded;
+Prolog_atom a_optimized;
+
+// Denotes an open interval boundary.
+Prolog_atom a_o;
+
+// Denotes the constructor that turns two boundaries into a proper interval.
+Prolog_atom a_i;
+
+// Denote the -infinity and +infinity interval boundaries.
+Prolog_atom a_minf;
+Prolog_atom a_pinf;
+
+// Denote complexity classes.
+Prolog_atom a_polynomial;
+Prolog_atom a_simplex;
+Prolog_atom a_any;
+
+// Default timeout exception atom.
+Prolog_atom a_time_out;
+
+// "Out of memory" exception atom.
+Prolog_atom a_out_of_memory;
+
+// Boolean constants.
+Prolog_atom a_true;
+Prolog_atom a_false;
+
+// To build exception terms.
+Prolog_atom a_ppl_invalid_argument;
+Prolog_atom a_ppl_overflow_error;
+Prolog_atom a_ppl_domain_error;
+Prolog_atom a_ppl_length_error;
+Prolog_atom a_ppl_representation_error;
+Prolog_atom a_expected;
+Prolog_atom a_found;
+Prolog_atom a_where;
+
+struct {
+  Prolog_atom* p_atom;
+  const char* name;
+} const prolog_atoms[] = {
+  { &a_nil,                      "[]" },
+
+  { &a_dollar_VAR,               "$VAR" },
+
+  { &a_plus,                     "+" },
+  { &a_minus,                    "-" },
+  { &a_asterisk,                 "*" },
+
+  { &a_slash,                    "/" },
+
+  { &a_equal,                    "=" },
+  { &a_greater_than_equal,       ">=" },
+  { &a_equal_less_than,          "=<" },
+  { &a_greater_than,             ">" },
+  { &a_less_than,                "<" },
+
+  { &a_line,                     "line" },
+  { &a_ray,                      "ray" },
+  { &a_point,                    "point" },
+  { &a_closure_point,            "closure_point" },
+
+  { &a_is_disjoint,              "is_disjoint" },
+  { &a_strictly_intersects,      "strictly_intersects" },
+  { &a_is_included,              "is_included" },
+  { &a_saturates,                "saturates" },
+
+  { &a_subsumes,                 "subsumes" },
+
+  { &a_c,                        "c" },
+
+  { &a_empty,                    "empty" },
+  { &a_universe,                 "universe" },
+
+  { &a_max,                      "max" },
+  { &a_min,                      "min" },
+
+  { &a_unfeasible,               "unfeasible" },
+  { &a_unbounded,                "unbounded" },
+  { &a_optimized,                "optimized" },
+
+  { &a_o,                        "o" },
+  { &a_i,                        "i" },
+
+  { &a_minf,                     "minf" },
+  { &a_pinf,                     "pinf" },
+
+  { &a_polynomial,               "polynomial" },
+  { &a_simplex,                  "simplex" },
+  { &a_any,                      "any" },
+
+  { &a_time_out,                 "time_out" },
+  { &a_out_of_memory,            "out_of_memory" },
+
+  { &a_true,                     "true" },
+  { &a_false,                    "false" },
+
+  { &a_ppl_invalid_argument,     "ppl_invalid_argument" },
+  { &a_ppl_overflow_error,       "ppl_overflow_error" },
+  { &a_ppl_domain_error,         "ppl_domain_error" },
+  { &a_ppl_length_error,         "ppl_length_error" },
+  { &a_ppl_representation_error, "ppl_representation_error" },
+  { &a_expected,                 "expected" },
+  { &a_found,                    "found" },
+  { &a_where,                    "where" }
+};
+
+Prolog_term_ref
+Prolog_atom_term_from_string(const char* s) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_put_atom(t, Prolog_atom_from_string(s));
+  return t;
+}
+
+void
+handle_exception(const Prolog_unsigned_out_of_range& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref max = Prolog_new_term_ref();
+  Prolog_put_ulong(max, e.max());
+  Prolog_construct_compound(max,
+			    Prolog_atom_from_string("unsigned_integer"
+						    "_less_than_or_equal_to"),
+			    max);
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected, max);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string("term_to_unsigned"));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_unsigned_integer& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+			    Prolog_atom_term_from_string("unsigned_integer"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string("term_to_unsigned"));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const non_linear& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+			    Prolog_atom_term_from_string
+			    ("linear_expression_or_constraint"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_variable& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found,
+			    e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+			    Prolog_atom_term_from_string
+			    ("$VAR(unsigned_integer)"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string("term_to_Variable"));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_an_integer& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+			    Prolog_atom_term_from_string("integer"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string
+			    ("term_to_Coefficient"));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_polyhedron_handle& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+			    Prolog_atom_term_from_string("polyhedron_handle"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string
+			    ("term_to_polyhedron_handle"));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_an_optimization_mode& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("max"), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("min"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string
+			    ("term_to_optimization_mode"));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_an_lp_problem_handle& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+			    Prolog_atom_term_from_string("lp_problem_handle"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string
+			    ("term_to_lp_problem_handle"));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_complexity_class& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("polynomial"), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("simplex"), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("any"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string
+			    ("term_to_complexity_class"));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_universe_or_empty& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("universe"), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("empty"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string
+			    ("term_to_universe_or_empty"));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_relation& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("="), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string(">="), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("=<"), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string(">"), expected);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string("<"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string
+			    ("term_to_relation"));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_nil_terminated_list& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+			Prolog_atom_term_from_string
+                        ("Prolog_list"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string
+			    ("check_nil_terminating"));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			    found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const PPL_integer_out_of_range& e) {
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+			    Prolog_atom_term_from_string
+			    ("Coefficient_to_integer_term"));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  std::ostringstream s;
+  s << e.i();
+  Prolog_construct_compound(exception_term, a_ppl_representation_error,
+			    Prolog_atom_term_from_string(s.str().c_str()),
+			    where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const unknown_interface_error& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom_chars(et, e.where());
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::overflow_error& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_construct_compound(et, a_ppl_overflow_error,
+			    Prolog_atom_term_from_string(e.what()));
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::length_error& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_construct_compound(et, a_ppl_length_error,
+			    Prolog_atom_term_from_string(e.what()));
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::bad_alloc&) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom(et, out_of_memory_exception_atom);
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::exception& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom_chars(et, e.what());
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception() {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom_chars(et, "PPL bug: unknown exception raised");
+  Prolog_raise_exception(et);
+}
+
+class timeout_exception : public Throwable {
+public:
+  void throw_me() const {
+    throw *this;
+  }
+  int priority() const {
+    return 0;
+  }
+  timeout_exception() {
+  }
+};
+
+Prolog_atom timeout_exception_atom;
+
+Parma_Watchdog_Library::Watchdog* p_timeout_object = 0;
+
+void
+reset_timeout() {
+  if (p_timeout_object) {
+    delete p_timeout_object;
+    p_timeout_object = 0;
+    abandon_expensive_computations = 0;
+  }
+}
+
+void
+handle_exception(const timeout_exception&) {
+  assert(p_timeout_object);
+  reset_timeout();
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom(et, timeout_exception_atom);
+  Prolog_raise_exception(et);
+}
+
+#define CATCH_ALL \
+  catch (const Prolog_unsigned_out_of_range& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_unsigned_integer& e) { \
+    handle_exception(e); \
+  } \
+  catch (const non_linear& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_variable& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_an_integer& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_polyhedron_handle& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_an_optimization_mode& e) {	\
+    handle_exception(e); \
+  } \
+  catch (const not_an_lp_problem_handle& e) {	\
+    handle_exception(e); \
+  } \
+  catch (const not_a_complexity_class& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_universe_or_empty& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_relation& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_nil_terminated_list& e) { \
+    handle_exception(e); \
+  } \
+  catch (const PPL_integer_out_of_range& e) { \
+    handle_exception(e); \
+  } \
+  catch (const unknown_interface_error& e) { \
+    handle_exception(e); \
+  } \
+  catch (const timeout_exception& e) { \
+    handle_exception(e); \
+  } \
+  catch(const std::overflow_error& e) { \
+    handle_exception(e); \
+  } \
+  catch(const std::length_error& e) { \
+    handle_exception(e); \
+  } \
+  catch (const std::bad_alloc& e) { \
+    handle_exception(e); \
+  } \
+  catch (const std::exception& e) { \
+    handle_exception(e); \
+  } \
+  catch (...) { \
+    handle_exception(); \
+  } \
+  return PROLOG_FAILURE
+
+Prolog_term_ref
+variable_term(dimension_type varid) {
+  Prolog_term_ref v = Prolog_new_term_ref();
+  Prolog_put_ulong(v, varid);
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_construct_compound(t, a_dollar_VAR, v);
+  return t;
+}
+
+#if 0
+unsigned int
+get_unsigned_int(long n) {
+  if (n >= 0 && static_cast<unsigned long>(n) <= UINT_MAX)
+    return n;
+  else {
+    Prolog_term_ref n_term = Prolog_new_term_ref();
+    Prolog_put_long(n_term, n);
+    throw not_unsigned_integer(n_term);
+  }
+}
+#endif
+
+template <typename U>
+U
+term_to_unsigned(Prolog_term_ref t) {
+  if (!Prolog_is_integer(t))
+    throw not_unsigned_integer(t);
+
+  U d = 0;
+  long l;
+  if (Prolog_get_long(t, &l))
+    if (l < 0)
+      throw not_unsigned_integer(t);
+    else if (static_cast<unsigned long>(l) > std::numeric_limits<U>::max())
+      throw Prolog_unsigned_out_of_range(t, std::numeric_limits<U>::max());
+    else
+      d = l;
+  else {
+    Coefficient v = integer_term_to_Coefficient(t);
+    if (v < 0)
+      throw not_unsigned_integer(t);
+    if (assign_r(d, raw_value(v), ROUND_NOT_NEEDED) != V_EQ)
+      throw Prolog_unsigned_out_of_range(t, std::numeric_limits<U>::max());
+  }
+  return d;
+}
+
+Prolog_atom
+term_to_universe_or_empty(Prolog_term_ref t) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+	&& (name == a_universe || name == a_empty))
+      return name;
+  }
+  throw not_universe_or_empty(t);
+}
+
+Linear_Expression
+build_linear_expression(Prolog_term_ref t) {
+  if (Prolog_is_integer(t))
+    return Linear_Expression(integer_term_to_Coefficient(t));
+  else if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    switch (arity) {
+    case 1:
+      {
+	Prolog_term_ref arg = Prolog_new_term_ref();
+	Prolog_get_arg(1, t, arg);
+	if (functor == a_minus)
+	  // Unary minus.
+	  return -build_linear_expression(arg);
+	else if (functor == a_dollar_VAR)
+	  // Variable.
+	  return Variable(term_to_unsigned<dimension_type>(arg));
+      }
+      break;
+    case 2:
+      {
+	Prolog_term_ref arg1 = Prolog_new_term_ref();
+	Prolog_term_ref arg2 = Prolog_new_term_ref();
+	Prolog_get_arg(1, t, arg1);
+	Prolog_get_arg(2, t, arg2);
+	if (functor == a_plus)
+	  // Plus.
+	  if (Prolog_is_integer(arg1))
+	    return integer_term_to_Coefficient(arg1)
+	      + build_linear_expression(arg2);
+	  else if (Prolog_is_integer(arg2))
+	    return build_linear_expression(arg1)
+	      + integer_term_to_Coefficient(arg2);
+	  else
+	    return build_linear_expression(arg1)
+	      + build_linear_expression(arg2);
+	else if (functor == a_minus)
+	  // Minus.
+	  if (Prolog_is_integer(arg1))
+	    return integer_term_to_Coefficient(arg1)
+	      - build_linear_expression(arg2);
+	  else if (Prolog_is_integer(arg2))
+	    return build_linear_expression(arg1)
+	      - integer_term_to_Coefficient(arg2);
+	  else
+	    return build_linear_expression(arg1)
+	      - build_linear_expression(arg2);
+	else if (functor == a_asterisk)
+	  // Times.
+	  if (Prolog_is_integer(arg1))
+	    return integer_term_to_Coefficient(arg1)
+	      * build_linear_expression(arg2);
+	  else if (Prolog_is_integer(arg2))
+	    return build_linear_expression(arg1)
+	      * integer_term_to_Coefficient(arg2);
+      }
+    }
+  }
+  // Invalid.
+  throw non_linear("build_linear_expression", t);
+}
+
+
+Constraint
+build_constraint(Prolog_term_ref t) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (arity == 2) {
+      Prolog_term_ref arg1 = Prolog_new_term_ref();
+      Prolog_term_ref arg2 = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg1);
+      Prolog_get_arg(2, t, arg2);
+      if (functor == a_equal)
+	// =
+	if (Prolog_is_integer(arg1))
+	  return integer_term_to_Coefficient(arg1)
+	    == build_linear_expression(arg2);
+	else if (Prolog_is_integer(arg2))
+	  return build_linear_expression(arg1)
+	    == integer_term_to_Coefficient(arg2);
+	else
+	  return build_linear_expression(arg1)
+	    == build_linear_expression(arg2);
+      else if (functor == a_equal_less_than)
+	// =<
+	if (Prolog_is_integer(arg1))
+	  return integer_term_to_Coefficient(arg1)
+	    <= build_linear_expression(arg2);
+	else if (Prolog_is_integer(arg2))
+	  return build_linear_expression(arg1)
+	    <= integer_term_to_Coefficient(arg2);
+	else
+	  return build_linear_expression(arg1)
+	    <= build_linear_expression(arg2);
+      else if (functor == a_greater_than_equal)
+	// >=
+	if (Prolog_is_integer(arg1))
+	  return integer_term_to_Coefficient(arg1)
+	    >= build_linear_expression(arg2);
+	else if (Prolog_is_integer(arg2))
+	  return build_linear_expression(arg1)
+	    >= integer_term_to_Coefficient(arg2);
+	else
+	  return build_linear_expression(arg1)
+	    >= build_linear_expression(arg2);
+      else if (functor == a_less_than)
+	// <
+	if (Prolog_is_integer(arg1))
+	  return integer_term_to_Coefficient(arg1)
+	    < build_linear_expression(arg2);
+	else if (Prolog_is_integer(arg2))
+	  return build_linear_expression(arg1)
+	    < integer_term_to_Coefficient(arg2);
+	else
+	  return build_linear_expression(arg1)
+	    < build_linear_expression(arg2);
+      else if (functor == a_greater_than)
+	// >
+	if (Prolog_is_integer(arg1))
+	  return integer_term_to_Coefficient(arg1)
+	    > build_linear_expression(arg2);
+	else if (Prolog_is_integer(arg2))
+	  return build_linear_expression(arg1)
+	    > integer_term_to_Coefficient(arg2);
+	else
+	  return build_linear_expression(arg1)
+	    > build_linear_expression(arg2);
+    }
+  }
+  // Invalid.
+  throw non_linear("build_constraint", t);
+}
+
+Generator
+build_generator(Prolog_term_ref t) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (arity == 1) {
+      Prolog_term_ref arg = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg);
+      if (functor == a_line)
+	return Generator::line(build_linear_expression(arg));
+      else if (functor == a_ray)
+	return Generator::ray(build_linear_expression(arg));
+      else if (functor == a_point)
+	return Generator::point(build_linear_expression(arg));
+      else if (functor == a_closure_point)
+	return Generator::closure_point(build_linear_expression(arg));
+    }
+    else if (arity == 2) {
+      Prolog_term_ref arg1 = Prolog_new_term_ref();
+      Prolog_term_ref arg2 = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg1);
+      Prolog_get_arg(2, t, arg2);
+      if (Prolog_is_integer(arg2)) {
+        if (functor == a_point)
+	  return Generator::point(build_linear_expression(arg1),
+				  integer_term_to_Coefficient(arg2));
+        else if (functor == a_closure_point)
+	  return Generator::closure_point(build_linear_expression(arg1),
+					  integer_term_to_Coefficient(arg2));
+      }
+    }
+  }
+  // Invalid.
+  throw non_linear("build_generator", t);
+}
+
+template <typename R>
+Prolog_term_ref
+get_linear_expression(const R& r) {
+  Prolog_term_ref so_far = Prolog_new_term_ref();
+  Coefficient coefficient;
+  dimension_type varid = 0;
+  dimension_type space_dimension = r.space_dimension();
+  while (varid < space_dimension
+	 && (coefficient = r.coefficient(Variable(varid))) == 0)
+    ++varid;
+  if (varid >= space_dimension) {
+    Prolog_put_long(so_far, 0);
+  }
+  else {
+    Prolog_construct_compound(so_far, a_asterisk,
+			      Coefficient_to_integer_term(coefficient),
+			      variable_term(varid));
+    while (true) {
+      ++varid;
+      while (varid < space_dimension
+	     && (coefficient = r.coefficient(Variable(varid))) == 0)
+	++varid;
+      if (varid >= space_dimension)
+	break;
+      else {
+	Prolog_term_ref addendum = Prolog_new_term_ref();
+	Prolog_construct_compound(addendum, a_asterisk,
+				  Coefficient_to_integer_term(coefficient),
+				  variable_term(varid));
+	Prolog_term_ref new_so_far = Prolog_new_term_ref();
+	Prolog_construct_compound(new_so_far, a_plus,
+				  so_far, addendum);
+	so_far = new_so_far;
+      }
+    }
+  }
+  return so_far;
+}
+
+Prolog_term_ref
+constraint_term(const Constraint& c) {
+  Prolog_atom relation = 0;
+  switch (c.type()) {
+  case Constraint::EQUALITY:
+    relation = a_equal;
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    relation = a_greater_than_equal;
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    relation = a_greater_than;
+    break;
+  default:
+    throw unknown_interface_error("generator_term()");
+  }
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_construct_compound
+    (t,
+     relation,
+     get_linear_expression(c),
+     Coefficient_to_integer_term(-c.inhomogeneous_term()));
+  return t;
+}
+
+Prolog_term_ref
+generator_term(const Generator& g) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_atom constructor = 0;
+  switch (g.type()) {
+  case Generator::LINE:
+    constructor = a_line;
+    break;
+  case Generator::RAY:
+    constructor = a_ray;
+    break;
+  case Generator::POINT:
+    {
+      constructor = a_point;
+      const Coefficient& divisor = g.divisor();
+      if (divisor == 1)
+	break;
+      else {
+	Prolog_construct_compound(t, constructor,
+				  get_linear_expression(g),
+				  Coefficient_to_integer_term(divisor));
+	return t;
+      }
+    }
+  case Generator::CLOSURE_POINT:
+    {
+      constructor = a_closure_point;
+      const Coefficient& divisor = g.divisor();
+      if (divisor == 1)
+	break;
+      else {
+	Prolog_construct_compound(t, constructor,
+				  get_linear_expression(g),
+				  Coefficient_to_integer_term(divisor));
+	return t;
+      }
+    }
+  default:
+    throw unknown_interface_error("generator_term()");
+  }
+  Prolog_construct_compound(t, constructor, get_linear_expression(g));
+  return t;
+}
+
+Variable
+term_to_Variable(Prolog_term_ref t) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (functor == a_dollar_VAR && arity == 1) {
+      Prolog_term_ref arg = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg);
+      return Variable(term_to_unsigned<dimension_type>(arg));
+    }
+  }
+  throw not_a_variable(t);
+}
+
+Coefficient
+term_to_Coefficient(Prolog_term_ref t) {
+  if (Prolog_is_integer(t))
+    return integer_term_to_Coefficient(t);
+  else
+    throw not_an_integer(t);
+}
+
+Polyhedron*
+term_to_polyhedron_handle(Prolog_term_ref t_ph) {
+  if (Prolog_is_address(t_ph)) {
+    void* p;
+    if (Prolog_get_address(t_ph, &p))
+      return static_cast<Polyhedron*>(p);
+  }
+  throw not_a_polyhedron_handle(t_ph);
+}
+
+LP_Problem*
+term_to_lp_problem_handle(Prolog_term_ref t_lp) {
+  if (Prolog_is_address(t_lp)) {
+    void* p;
+    if (Prolog_get_address(t_lp, &p))
+      return static_cast<LP_Problem*>(p);
+  }
+  throw not_an_lp_problem_handle(t_lp);
+}
+
+Prolog_atom
+term_to_optimization_mode(Prolog_term_ref t) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+	&& (name == a_max || name == a_min))
+      return name;
+  }
+  throw not_an_optimization_mode(t);
+}
+
+bool Prolog_interface_initialized = false;
+
+bool
+unify_long(Prolog_term_ref t, long l) {
+  Prolog_term_ref t_l = Prolog_new_term_ref();
+  return Prolog_put_long(t_l, l) && Prolog_unify(t, t_l);
+}
+
+bool
+unify_ulong(Prolog_term_ref t, unsigned long l) {
+  Prolog_term_ref t_l = Prolog_new_term_ref();
+  return Prolog_put_ulong(t_l, l) && Prolog_unify(t, t_l);
+}
+
+void
+check_nil_terminating(Prolog_term_ref t) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom a;
+    Prolog_get_atom_name(t, &a);
+    if (a == a_nil)
+      return;
+  }
+    throw not_a_nil_terminated_list(t);
+}
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_version_major(Prolog_term_ref t_v) {
+  try {
+    if (unify_ulong(t_v, version_major()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version_minor(Prolog_term_ref t_v) {
+  try {
+    if (unify_ulong(t_v, version_minor()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version_revision(Prolog_term_ref t_v) {
+  try {
+    if (unify_ulong(t_v, version_revision()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version_beta(Prolog_term_ref t_v) {
+  try {
+    if (unify_ulong(t_v, version_beta()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version(Prolog_term_ref t_v) {
+  try {
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_atom_chars(tmp, version());
+    if (Prolog_unify(t_v, tmp))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_banner(Prolog_term_ref t_b) {
+  try {
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_atom_chars(tmp, banner());
+    if (Prolog_unify(t_b, tmp))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+namespace {
+
+inline dimension_type
+max_representable_dimension(dimension_type d) {
+  return
+    Prolog_has_unbounded_integers
+    ? d
+    : std::min(d, static_cast<dimension_type>(Prolog_max_integer));
+}
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_max_space_dimension(Prolog_term_ref t_msd) {
+  try {
+    if (unify_ulong(t_msd, max_representable_dimension(max_space_dimension())))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_initialize() {
+  try {
+    if (Prolog_interface_initialized)
+      return PROLOG_SUCCESS;
+    for (size_t
+	   i = sizeof(prolog_atoms)/sizeof(prolog_atoms[0]); i-- > 0; ) {
+      Prolog_atom a = Prolog_atom_from_string(prolog_atoms[i].name);
+      *prolog_atoms[i].p_atom = a;
+    }
+    timeout_exception_atom = a_time_out;
+    out_of_memory_exception_atom = a_out_of_memory;
+    ppl_Prolog_sysdep_init();
+    Prolog_interface_initialized = true;
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_finalize() {
+  try {
+    if (!Prolog_interface_initialized)
+      return PROLOG_SUCCESS;
+
+    Prolog_interface_initialized = false;
+    // Release the pending timeout object, if any.
+    reset_timeout();
+    ppl_Prolog_sysdep_deinit();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout_exception_atom(Prolog_term_ref t_tea) {
+  try {
+    if (Prolog_is_atom(t_tea)) {
+      Prolog_atom tea;
+      if (Prolog_get_atom_name(t_tea, &tea)) {
+	timeout_exception_atom = tea;
+	return PROLOG_SUCCESS;
+      }
+    }
+    Prolog_term_ref found = Prolog_new_term_ref();
+    Prolog_construct_compound(found, a_found, t_tea);
+
+    Prolog_term_ref expected = Prolog_new_term_ref();
+    Prolog_construct_compound(expected, a_expected,
+			      Prolog_atom_term_from_string("atom"));
+
+    Prolog_term_ref where = Prolog_new_term_ref();
+    Prolog_construct_compound(where, a_where,
+			      Prolog_atom_term_from_string
+			      ("ppl_set_timeout_exception_atom"));
+
+    Prolog_term_ref exception_term = Prolog_new_term_ref();
+    Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+			      found, expected, where);
+    Prolog_raise_exception(exception_term);
+    return PROLOG_FAILURE;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_timeout_exception_atom(Prolog_term_ref t) {
+  try {
+    Prolog_term_ref t_tea = Prolog_new_term_ref();
+    Prolog_put_atom(t_tea, timeout_exception_atom);
+    return Prolog_unify(t_tea, t) ? PROLOG_SUCCESS : PROLOG_FAILURE;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout(Prolog_term_ref t_time) {
+  try {
+    // In case a timeout was already set.
+    reset_timeout();
+    static timeout_exception e;
+    unsigned hundredth_secs = term_to_unsigned<unsigned>(t_time);
+    p_timeout_object =
+      new Parma_Watchdog_Library::Watchdog(hundredth_secs,
+					   abandon_expensive_computations,
+					   e);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_reset_timeout() {
+  try {
+    reset_timeout();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_is_bounded() {
+  try {
+    if (std::numeric_limits<Coefficient>::is_bounded)
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_min(Prolog_term_ref t_min) {
+  try {
+    if (std::numeric_limits<Coefficient>::is_bounded) {
+      Coefficient min = std::numeric_limits<Coefficient>::min();
+      if (Prolog_has_unbounded_integers
+	  || (min >= Prolog_min_integer && min <= Prolog_min_integer))
+	return Prolog_unify(t_min, Coefficient_to_integer_term(min));
+    }
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_max(Prolog_term_ref t_max) {
+  try {
+    if (std::numeric_limits<Coefficient>::is_bounded) {
+      Coefficient max = std::numeric_limits<Coefficient>::max();
+      if (Prolog_has_unbounded_integers
+	  || (max >= Prolog_min_integer && max <= Prolog_min_integer))
+	return Prolog_unify(t_max, Coefficient_to_integer_term(max));
+    }
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_C_Polyhedron_from_space_dimension(Prolog_term_ref t_nd,
+					  Prolog_term_ref t_uoe,
+					  Prolog_term_ref t_ph) {
+  try {
+    Polyhedron* ph;
+    Prolog_atom uoe = term_to_universe_or_empty(t_uoe);
+
+    if (uoe == a_empty)
+        ph = new C_Polyhedron(term_to_unsigned<dimension_type>(t_nd),
+			      EMPTY);
+      else
+        ph = new C_Polyhedron(term_to_unsigned<dimension_type>(t_nd));
+
+
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_NNC_Polyhedron_from_space_dimension(Prolog_term_ref t_nd,
+					    Prolog_term_ref t_uoe,
+					    Prolog_term_ref t_ph) {
+  try {
+    Polyhedron* ph;
+    Prolog_atom uoe = term_to_universe_or_empty(t_uoe);
+
+    if (uoe == a_empty)
+        ph = new NNC_Polyhedron(term_to_unsigned<dimension_type>(t_nd),
+			      EMPTY);
+      else
+        ph = new NNC_Polyhedron(term_to_unsigned<dimension_type>(t_nd));
+
+
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_C_Polyhedron_from_C_Polyhedron(Prolog_term_ref t_ph_source,
+				       Prolog_term_ref t_ph) {
+  try {
+    Polyhedron* ph;
+    const C_Polyhedron* ph_source
+	= static_cast<const C_Polyhedron*>
+	(term_to_polyhedron_handle(t_ph_source));
+    CHECK(ph_source);
+        ph = new C_Polyhedron(*ph_source);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(Prolog_term_ref t_ph_source,
+					 Prolog_term_ref t_ph) {
+  try {
+    Polyhedron* ph;
+    const C_Polyhedron* ph_source
+	= static_cast<const C_Polyhedron*>
+	(term_to_polyhedron_handle(t_ph_source));
+    CHECK(ph_source);
+        ph = new NNC_Polyhedron(*ph_source);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(Prolog_term_ref t_ph_source,
+					 Prolog_term_ref t_ph) {
+  try {
+    Polyhedron* ph;
+    const NNC_Polyhedron* ph_source
+	= static_cast<const NNC_Polyhedron*>
+	(term_to_polyhedron_handle(t_ph_source));
+    CHECK(ph_source);
+        ph = new C_Polyhedron(*ph_source);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Prolog_term_ref t_ph_source,
+					   Prolog_term_ref t_ph) {
+  try {
+    Polyhedron* ph;
+    const NNC_Polyhedron* ph_source
+	= static_cast<const NNC_Polyhedron*>
+	(term_to_polyhedron_handle(t_ph_source));
+    CHECK(ph_source);
+        ph = new NNC_Polyhedron(*ph_source);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_C_Polyhedron_from_constraints(Prolog_term_ref t_clist,
+				      Prolog_term_ref t_ph) {
+  try {
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist);
+
+    Polyhedron* ph;
+    ph = new C_Polyhedron(cs);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_NNC_Polyhedron_from_constraints(Prolog_term_ref t_clist,
+					Prolog_term_ref t_ph) {
+  try {
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist);
+
+    Polyhedron* ph;
+    ph = new NNC_Polyhedron(cs);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_C_Polyhedron_from_generators(Prolog_term_ref t_glist,
+				     Prolog_term_ref t_ph) {
+  try {
+    Generator_System gs;
+    Prolog_term_ref g = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_glist)) {
+      Prolog_get_cons(t_glist, g, t_glist);
+      gs.insert(build_generator(g));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_glist);
+
+    Polyhedron* ph;
+    ph = new C_Polyhedron(gs);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_NNC_Polyhedron_from_generators(Prolog_term_ref t_glist,
+				       Prolog_term_ref t_ph) {
+  try {
+    Generator_System gs;
+    Prolog_term_ref g = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_glist)) {
+      Prolog_get_cons(t_glist, g, t_glist);
+      gs.insert(build_generator(g));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_glist);
+
+    Polyhedron* ph;
+    ph = new NNC_Polyhedron(gs);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+namespace {
+
+enum Boundary_Kind {
+  LOWER,
+  UPPER
+};
+
+bool
+term_to_boundary(Prolog_term_ref t_b, Boundary_Kind kind,
+		 bool& finite, bool& closed,
+		 Coefficient& n, Coefficient& d) {
+  if (!Prolog_is_compound(t_b))
+    return false;
+
+  Prolog_atom functor;
+  int arity;
+
+  Prolog_get_compound_name_arity(t_b, &functor, &arity);
+  // A boundary term is either of the form c(Limit) or o(Limit).
+  if (arity != 1 || (functor != a_c && functor != a_o))
+    return false;
+
+  Prolog_atom open_closed_atom = functor;
+
+  Prolog_term_ref t_limit = Prolog_new_term_ref();
+  Prolog_get_arg(1, t_b, t_limit);
+  if (Prolog_is_integer(t_limit)) {
+    // A finite, integral limit.
+    finite = true;
+    closed = (open_closed_atom == a_c);
+    n = integer_term_to_Coefficient(t_limit);
+    d = 1;
+  }
+  else if (Prolog_is_atom(t_limit)) {
+    Prolog_atom a;
+    Prolog_get_atom_name(t_limit, &a);
+    Prolog_atom allowed_infinity = (kind == LOWER ? a_minf : a_pinf);
+    // Only open bounds may be unbounded.
+    if (a != allowed_infinity || open_closed_atom != a_o)
+      return false;
+
+    finite = false;
+  }
+  else if (Prolog_is_compound(t_limit)) {
+    Prolog_get_compound_name_arity(t_limit, &functor, &arity);
+    if (arity != 2 || functor != a_slash)
+      return false;
+
+    Prolog_term_ref t_n = Prolog_new_term_ref();
+    Prolog_term_ref t_d = Prolog_new_term_ref();
+    Prolog_get_arg(1, t_limit, t_n);
+    Prolog_get_arg(2, t_limit, t_d);
+
+    if (!Prolog_is_integer(t_n) || !Prolog_is_integer(t_d))
+      return false;
+    else {
+      finite = true;
+      closed = (open_closed_atom == a_c);
+      n = integer_term_to_Coefficient(t_n);
+      d = integer_term_to_Coefficient(t_d);
+      // Catch negative denominators and divisions by zero here.
+      if (d <= 0)
+        return false;
+    }
+  }
+  return true;
+}
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_new_C_Polyhedron_from_bounding_box(Prolog_term_ref t_bb,
+				       Prolog_term_ref t_ph) {
+  try {
+    // Compute the space dimension.
+    Prolog_term_ref t_l = Prolog_new_term_ref();
+    Prolog_term_ref t_interval = Prolog_new_term_ref();
+    Prolog_put_term(t_l, t_bb);
+    dimension_type dimension;
+    for (dimension = 0; Prolog_is_cons(t_l); ++dimension)
+      Prolog_get_cons(t_l, t_interval, t_l);
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_l);
+
+    Bounding_Box bbox(dimension);
+    // Set bbox to reflect its Prolog representation.
+    for (dimension_type i = 0; i < dimension; ++i) {
+      Prolog_get_cons(t_bb, t_interval, t_bb);
+      // An interval is either the atom empty or of the form
+      // i(Lower_Bound, Upper_Bound).
+      if (Prolog_is_atom(t_interval)) {
+	Prolog_atom name;
+	if (Prolog_get_atom_name(t_interval, &name) && name == a_empty) {
+	  bbox.set_empty();
+	  continue;
+	}
+	else
+	  return PROLOG_FAILURE;
+      }
+
+      if (!Prolog_is_compound(t_interval))
+	return PROLOG_FAILURE;
+
+      Prolog_atom functor;
+      int arity;
+      Prolog_get_compound_name_arity(t_interval, &functor, &arity);
+      if (arity != 2 || functor != a_i)
+	return PROLOG_FAILURE;
+
+      bool finite;
+      bool closed;
+      Coefficient n;
+      Coefficient d;
+      Prolog_term_ref t_bound = Prolog_new_term_ref();
+
+      // Get and raise the lower bound.
+      Prolog_get_arg(1, t_interval, t_bound);
+      if (!term_to_boundary(t_bound, LOWER, finite, closed, n, d))
+	return PROLOG_FAILURE;
+      if (finite)
+	bbox.raise_lower_bound(i, closed, n, d);
+
+      // Get and lower the upper bound.
+      Prolog_get_arg(2, t_interval, t_bound);
+      if (!term_to_boundary(t_bound, UPPER, finite, closed, n, d))
+	return PROLOG_FAILURE;
+      if (finite)
+	bbox.lower_upper_bound(i, closed, n, d);
+    }
+
+    Polyhedron* ph;
+    ph = new C_Polyhedron(bbox, From_Bounding_Box());
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_NNC_Polyhedron_from_bounding_box(Prolog_term_ref t_bb,
+					 Prolog_term_ref t_ph) {
+  try {
+    // Compute the space dimension.
+    Prolog_term_ref t_l = Prolog_new_term_ref();
+    Prolog_term_ref t_interval = Prolog_new_term_ref();
+    Prolog_put_term(t_l, t_bb);
+    dimension_type dimension;
+    for (dimension = 0; Prolog_is_cons(t_l); ++dimension)
+      Prolog_get_cons(t_l, t_interval, t_l);
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_l);
+
+    Bounding_Box bbox(dimension);
+    // Set bbox to reflect its Prolog representation.
+    for (dimension_type i = 0; i < dimension; ++i) {
+      Prolog_get_cons(t_bb, t_interval, t_bb);
+      // An interval is either the atom empty or of the form
+      // i(Lower_Bound, Upper_Bound).
+      if (Prolog_is_atom(t_interval)) {
+	Prolog_atom name;
+	if (Prolog_get_atom_name(t_interval, &name) && name == a_empty) {
+	  bbox.set_empty();
+	  continue;
+	}
+	else
+	  return PROLOG_FAILURE;
+      }
+
+      if (!Prolog_is_compound(t_interval))
+	return PROLOG_FAILURE;
+
+      Prolog_atom functor;
+      int arity;
+      Prolog_get_compound_name_arity(t_interval, &functor, &arity);
+      if (arity != 2 || functor != a_i)
+	return PROLOG_FAILURE;
+
+      bool finite;
+      bool closed;
+      Coefficient n;
+      Coefficient d;
+      Prolog_term_ref t_bound = Prolog_new_term_ref();
+
+      // Get and raise the lower bound.
+      Prolog_get_arg(1, t_interval, t_bound);
+      if (!term_to_boundary(t_bound, LOWER, finite, closed, n, d))
+	return PROLOG_FAILURE;
+      if (finite)
+	bbox.raise_lower_bound(i, closed, n, d);
+
+      // Get and lower the upper bound.
+      Prolog_get_arg(2, t_interval, t_bound);
+      if (!term_to_boundary(t_bound, UPPER, finite, closed, n, d))
+	return PROLOG_FAILURE;
+      if (finite)
+	bbox.lower_upper_bound(i, closed, n, d);
+    }
+
+    Polyhedron* ph;
+    ph = new NNC_Polyhedron(bbox, From_Bounding_Box());
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  try {
+    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    lhs->swap(*rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_Polyhedron(Prolog_term_ref t_ph) {
+  try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    UNREGISTER(ph);
+    delete ph;
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_space_dimension(Prolog_term_ref t_ph, Prolog_term_ref t_sd) {
+  try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    if (unify_ulong(t_sd, ph->space_dimension()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_affine_dimension(Prolog_term_ref t_ph, Prolog_term_ref t_sd) {
+  try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    if (unify_ulong(t_sd, ph->affine_dimension()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_get_constraints(Prolog_term_ref t_ph,
+			       Prolog_term_ref t_clist) {
+  try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const Constraint_System& cs = ph->constraints();
+    for (Constraint_System::const_iterator i = cs.begin(),
+	   cs_end = cs.end(); i != cs_end; ++i)
+      Prolog_construct_cons(tail, constraint_term(*i), tail);
+
+    if (Prolog_unify(t_clist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_get_minimized_constraints(Prolog_term_ref t_ph,
+					 Prolog_term_ref t_clist) {
+  try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const Constraint_System& cs = ph->minimized_constraints();
+    for (Constraint_System::const_iterator i = cs.begin(),
+	   cs_end = cs.end(); i != cs_end; ++i)
+      Prolog_construct_cons(tail, constraint_term(*i), tail);
+
+    if (Prolog_unify(t_clist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_get_generators(Prolog_term_ref t_ph,
+			      Prolog_term_ref t_glist) {
+  try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const Generator_System& gs = ph->generators();
+    for (Generator_System::const_iterator i = gs.begin(),
+	   gs_end = gs.end(); i != gs_end; ++i)
+      Prolog_construct_cons(tail, generator_term(*i), tail);
+
+    if (Prolog_unify(t_glist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_get_minimized_generators(Prolog_term_ref t_ph,
+					Prolog_term_ref t_glist) {
+  try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const Generator_System& gs = ph->minimized_generators();
+    for (Generator_System::const_iterator i = gs.begin(),
+	   gs_end = gs.end(); i != gs_end; ++i)
+      Prolog_construct_cons(tail, generator_term(*i), tail);
+
+    if (Prolog_unify(t_glist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_relation_with_constraint(Prolog_term_ref t_ph,
+					Prolog_term_ref t_c,
+					Prolog_term_ref t_r) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Poly_Con_Relation r = ph->relation_with(build_constraint(t_c));
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    while (r != Poly_Con_Relation::nothing()) {
+      if (r.implies(Poly_Con_Relation::is_disjoint())) {
+        Prolog_term_ref t_dis = Prolog_new_term_ref();
+	Prolog_put_atom(t_dis, a_is_disjoint);
+        Prolog_construct_cons(tail, t_dis, tail);
+	r = r - Poly_Con_Relation::is_disjoint();
+      }
+      else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+        Prolog_term_ref t_sin = Prolog_new_term_ref();
+	Prolog_put_atom(t_sin, a_strictly_intersects);
+        Prolog_construct_cons(tail, t_sin, tail);
+	r = r - Poly_Con_Relation::strictly_intersects();
+      }
+      else if (r.implies(Poly_Con_Relation::is_included())) {
+        Prolog_term_ref t_inc = Prolog_new_term_ref();
+	Prolog_put_atom(t_inc, a_is_included);
+        Prolog_construct_cons(tail, t_inc, tail);
+	r = r - Poly_Con_Relation::is_included();
+      }
+      else if (r.implies(Poly_Con_Relation::saturates())) {
+        Prolog_term_ref t_sat = Prolog_new_term_ref();
+	Prolog_put_atom(t_sat, a_saturates);
+        Prolog_construct_cons(tail, t_sat, tail);
+	r = r - Poly_Con_Relation::saturates();
+      }
+    }
+    if (Prolog_unify(t_r, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_relation_with_generator(Prolog_term_ref t_ph,
+				       Prolog_term_ref t_g,
+				       Prolog_term_ref t_r) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Poly_Gen_Relation r = ph->relation_with(build_generator(t_g));
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    while (r != Poly_Gen_Relation::nothing()) {
+      if (r.implies(Poly_Gen_Relation::subsumes())) {
+        Prolog_term_ref t_sub = Prolog_new_term_ref();
+	Prolog_put_atom(t_sub, a_subsumes);
+        Prolog_construct_cons(tail, t_sub, tail);
+	r = r - Poly_Gen_Relation::subsumes();
+      }
+    }
+    if (Prolog_unify(t_r, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+namespace {
+
+Prolog_term_ref
+extended_rational_term(const ERational& e) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  if (is_plus_infinity(e))
+    Prolog_put_atom(t, a_pinf);
+  else if (is_minus_infinity(e))
+    Prolog_put_atom(t, a_minf);
+  else {
+    Coefficient numerator = raw_value(e).get_num();
+    Coefficient denominator = raw_value(e).get_den();
+    if (denominator == 1)
+      Prolog_put_term(t, Coefficient_to_integer_term(numerator));
+    else
+      Prolog_construct_compound(t, a_slash,
+				Coefficient_to_integer_term(numerator),
+				Coefficient_to_integer_term(denominator));
+  }
+  return t;
+}
+
+Prolog_term_ref
+interval_term(const Interval& i) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  if (i.is_empty())
+    Prolog_put_atom(t, a_empty);
+  else {
+    // Lower bound.
+    const LBoundary& l = i.lower_bound();
+    Prolog_term_ref lt = Prolog_new_term_ref();
+    if (l.is_closed())
+      Prolog_construct_compound(lt, a_c, extended_rational_term(l.bound()));
+    else
+      Prolog_construct_compound(lt, a_o, extended_rational_term(l.bound()));
+
+    // Upper bound.
+    const UBoundary& u = i.upper_bound();
+    Prolog_term_ref ut = Prolog_new_term_ref();
+    if (u.is_closed())
+      Prolog_construct_compound(ut, a_c, extended_rational_term(u.bound()));
+    else
+      Prolog_construct_compound(ut, a_o, extended_rational_term(u.bound()));
+
+    Prolog_construct_compound(t, a_i, lt, ut);
+  }
+  return t;
+}
+
+Prolog_atom
+term_to_complexity_class(Prolog_term_ref t) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+	&& (name == a_polynomial || name == a_simplex || name == a_any))
+      return name;
+  }
+  throw not_a_complexity_class(t);
+}
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_get_bounding_box(Prolog_term_ref t_ph,
+				Prolog_term_ref t_cc,
+				Prolog_term_ref t_bb) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+
+    Prolog_atom p_cc = term_to_complexity_class(t_cc);
+    Complexity_Class cc;
+    if (p_cc == a_polynomial)
+      cc = POLYNOMIAL_COMPLEXITY;
+    else if (p_cc == a_simplex)
+      cc = SIMPLEX_COMPLEXITY;
+    else
+      cc = ANY_COMPLEXITY;
+
+    dimension_type dimension = ph->space_dimension();
+    Bounding_Box bbox(dimension);
+    ph->shrink_bounding_box(bbox, cc);
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    for (dimension_type i = dimension; i-- > 0; )
+      Prolog_construct_cons(tail, interval_term(bbox[i]), tail);
+    if (Prolog_unify(t_bb, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_is_empty(Prolog_term_ref t_ph) {
+  try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    if (ph->is_empty())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_is_universe(Prolog_term_ref t_ph) {
+  try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    if (ph->is_universe())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_is_bounded(Prolog_term_ref t_ph) {
+  try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    if (ph->is_bounded())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounds_from_above(Prolog_term_ref t_ph,
+				 Prolog_term_ref t_expr) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Linear_Expression l = build_linear_expression(t_expr);
+    if (ph->bounds_from_above(l))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounds_from_below(Prolog_term_ref t_ph,
+				 Prolog_term_ref t_expr) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Linear_Expression l = build_linear_expression(t_expr);
+    if (ph->bounds_from_below(l))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_maximize(Prolog_term_ref t_ph,
+			Prolog_term_ref t_le_expr,
+                        Prolog_term_ref t_n,
+                        Prolog_term_ref t_d,
+                        Prolog_term_ref t_max) {
+ try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    const Linear_Expression le = build_linear_expression(t_le_expr);
+    Coefficient n;
+    Coefficient d;
+    bool max;
+    if (ph->maximize(le, n, d, max)) {
+      Prolog_term_ref t = Prolog_new_term_ref();
+      Prolog_atom a = (max ? a_true : a_false);
+      Prolog_put_atom(t, a);
+      if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
+	  && Prolog_unify(t_d, Coefficient_to_integer_term(d))
+	  && Prolog_unify(t_max, t))
+	return PROLOG_SUCCESS;
+    }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_maximize_with_point(Prolog_term_ref t_ph,
+				   Prolog_term_ref t_le_expr,
+				   Prolog_term_ref t_n,
+				   Prolog_term_ref t_d,
+				   Prolog_term_ref t_max,
+				   Prolog_term_ref t_g) {
+ try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    const Linear_Expression le = build_linear_expression(t_le_expr);
+    Coefficient n;
+    Coefficient d;
+    bool max;
+    Generator g(point());
+    if (ph->maximize(le, n, d, max, g)) {
+      Prolog_term_ref t = Prolog_new_term_ref();
+      Prolog_atom a = (max ? a_true : a_false);
+      Prolog_put_atom(t, a);
+      if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
+	  && Prolog_unify(t_d, Coefficient_to_integer_term(d))
+	  && Prolog_unify(t_max, t)
+	  && Prolog_unify(t_g, generator_term(g)))
+	return PROLOG_SUCCESS;
+    }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_minimize(Prolog_term_ref t_ph,
+			Prolog_term_ref t_le_expr,
+                        Prolog_term_ref t_n,
+                        Prolog_term_ref t_d,
+                        Prolog_term_ref t_min) {
+ try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    const Linear_Expression le = build_linear_expression(t_le_expr);
+    Coefficient n;
+    Coefficient d;
+    bool min;
+    if (ph->minimize(le, n, d, min)) {
+      Prolog_term_ref t = Prolog_new_term_ref();
+      Prolog_atom a = (min ? a_true : a_false);
+      Prolog_put_atom(t, a);
+      if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
+	  && Prolog_unify(t_d, Coefficient_to_integer_term(d))
+	  && Prolog_unify(t_min, t))
+	return PROLOG_SUCCESS;
+    }
+ }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_minimize_with_point(Prolog_term_ref t_ph,
+				   Prolog_term_ref t_le_expr,
+				   Prolog_term_ref t_n,
+				   Prolog_term_ref t_d,
+				   Prolog_term_ref t_min,
+				   Prolog_term_ref t_g) {
+ try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    const Linear_Expression le = build_linear_expression(t_le_expr);
+    Coefficient n;
+    Coefficient d;
+    bool min;
+    Generator g(point());
+    if (ph->minimize(le, n, d, min, g)) {
+      Prolog_term_ref t = Prolog_new_term_ref();
+      Prolog_atom a = (min ? a_true : a_false);
+      Prolog_put_atom(t, a);
+      if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
+	  && Prolog_unify(t_d, Coefficient_to_integer_term(d))
+	  && Prolog_unify(t_min, t)
+	  && Prolog_unify(t_g, generator_term(g)))
+	return PROLOG_SUCCESS;
+    }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_is_topologically_closed(Prolog_term_ref t_ph) {
+  try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    if (ph->is_topologically_closed())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_topological_closure_assign(Prolog_term_ref t_ph) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    ph->topological_closure_assign();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_contains_Polyhedron(Prolog_term_ref t_lhs,
+				   Prolog_term_ref t_rhs) {
+  try {
+    const Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    if (lhs->contains(*rhs))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_strictly_contains_Polyhedron(Prolog_term_ref t_lhs,
+					    Prolog_term_ref t_rhs) {
+  try {
+    const Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    if (lhs->strictly_contains(*rhs))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_is_disjoint_from_Polyhedron(Prolog_term_ref t_lhs,
+					   Prolog_term_ref t_rhs) {
+  try {
+    const Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    if (lhs->is_disjoint_from(*rhs))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_equals_Polyhedron(Prolog_term_ref t_lhs,
+				 Prolog_term_ref t_rhs) {
+  try {
+    const Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    if (*lhs == *rhs)
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_OK(Prolog_term_ref t_ph) {
+  try {
+    const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    if (ph->OK())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_constraint(Prolog_term_ref t_ph, Prolog_term_ref t_c) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    ph->add_constraint(build_constraint(t_c));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_constraint_and_minimize(Prolog_term_ref t_ph,
+					   Prolog_term_ref t_c) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    if (ph->add_constraint_and_minimize(build_constraint(t_c)))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_generator(Prolog_term_ref t_ph, Prolog_term_ref t_g) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    ph->add_generator(build_generator(t_g));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_generator_and_minimize(Prolog_term_ref t_ph,
+					  Prolog_term_ref t_g) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    if (ph->add_generator_and_minimize(build_generator(t_g)))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_constraints(Prolog_term_ref t_ph,
+			       Prolog_term_ref t_clist) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist);
+
+    ph->add_constraints(cs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_constraints_and_minimize(Prolog_term_ref t_ph,
+					    Prolog_term_ref t_clist) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist);
+
+    if (ph->add_constraints_and_minimize(cs))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_generators(Prolog_term_ref t_ph,
+			      Prolog_term_ref t_glist) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Generator_System gs;
+    Prolog_term_ref g = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_glist)) {
+      Prolog_get_cons(t_glist, g, t_glist);
+      gs.insert(build_generator(g));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_glist);
+
+    ph->add_generators(gs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_generators_and_minimize(Prolog_term_ref t_ph,
+					   Prolog_term_ref t_glist) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Generator_System gs;
+    Prolog_term_ref g = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_glist)) {
+      Prolog_get_cons(t_glist, g, t_glist);
+      gs.insert(build_generator(g));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_glist);
+
+    if (ph->add_generators_and_minimize(gs))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+namespace {
+
+Prolog_foreign_return_type
+bop_assign(Prolog_term_ref t_lhs,
+	   Prolog_term_ref t_rhs,
+	   void (Polyhedron::* bop_assign)(const Polyhedron&)) {
+  try {
+    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    (lhs->*bop_assign)(*rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+Prolog_foreign_return_type
+bop_assign_and_minimize(Prolog_term_ref t_lhs,
+			Prolog_term_ref t_rhs,
+			bool (Polyhedron::*
+			      bop_assign_and_minimize)(const Polyhedron&)) {
+  try {
+    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    if ((lhs->*bop_assign_and_minimize)(*rhs))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_intersection_assign(Prolog_term_ref t_lhs,
+				   Prolog_term_ref t_rhs) {
+  return bop_assign(t_lhs, t_rhs,
+		    &Polyhedron::intersection_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_intersection_assign_and_minimize(Prolog_term_ref t_lhs,
+						Prolog_term_ref t_rhs) {
+  return bop_assign_and_minimize(t_lhs, t_rhs,
+		    &Polyhedron::intersection_assign_and_minimize);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_poly_hull_assign(Prolog_term_ref t_lhs,
+				Prolog_term_ref t_rhs) {
+  return bop_assign(t_lhs, t_rhs,
+		    &Polyhedron::poly_hull_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_poly_hull_assign_and_minimize(Prolog_term_ref t_lhs,
+					     Prolog_term_ref t_rhs) {
+  return bop_assign_and_minimize(t_lhs, t_rhs,
+				 &Polyhedron::poly_hull_assign_and_minimize);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_poly_difference_assign(Prolog_term_ref t_lhs,
+				      Prolog_term_ref t_rhs) {
+  return bop_assign(t_lhs, t_rhs,
+		    &Polyhedron::poly_difference_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_time_elapse_assign(Prolog_term_ref t_lhs,
+				  Prolog_term_ref t_rhs) {
+  return bop_assign(t_lhs, t_rhs,
+		    &Polyhedron::time_elapse_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_affine_image(Prolog_term_ref t_ph, Prolog_term_ref t_v,
+			    Prolog_term_ref t_le, Prolog_term_ref t_d) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    ph->affine_image(term_to_Variable(t_v),
+		     build_linear_expression(t_le),
+		     term_to_Coefficient(t_d));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_affine_preimage(Prolog_term_ref t_ph, Prolog_term_ref t_v,
+			       Prolog_term_ref t_le, Prolog_term_ref t_d) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    ph->affine_preimage(term_to_Variable(t_v),
+			build_linear_expression(t_le),
+			term_to_Coefficient(t_d));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+namespace {
+
+Prolog_atom
+term_to_relation(Prolog_term_ref t) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+	&& (name == a_equal || name == a_greater_than_equal ||
+            name == a_equal_less_than || name == a_greater_than ||
+            name == a_less_than))
+      return name;
+  }
+  throw not_a_relation(t);
+}
+
+Relation_Symbol
+term_to_relation_symbol(Prolog_term_ref t_r) {
+  Prolog_atom ra = term_to_relation(t_r);
+  Relation_Symbol r;
+  if (ra == a_less_than)
+	  r = LESS_THAN;
+  else if (ra == a_equal_less_than)
+	  r = LESS_THAN_OR_EQUAL;
+  else if (ra == a_equal)
+	  r = EQUAL;
+  else if (ra == a_greater_than_equal)
+	  r = GREATER_THAN_OR_EQUAL;
+  else r = GREATER_THAN;
+
+  return r;
+}
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_generalized_affine_image(Prolog_term_ref t_ph,
+					Prolog_term_ref t_v,
+					Prolog_term_ref t_r,
+					Prolog_term_ref t_le,
+					Prolog_term_ref t_d) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Relation_Symbol r = term_to_relation_symbol(t_r);
+    ph->generalized_affine_image(term_to_Variable(t_v),
+				 r,
+				 build_linear_expression(t_le),
+				 term_to_Coefficient(t_d));
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_generalized_affine_preimage(Prolog_term_ref t_ph,
+					   Prolog_term_ref t_v,
+					   Prolog_term_ref t_r,
+					   Prolog_term_ref t_le,
+					   Prolog_term_ref t_d) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Relation_Symbol r = term_to_relation_symbol(t_r);
+    ph->generalized_affine_preimage(term_to_Variable(t_v),
+				    r,
+				    build_linear_expression(t_le),
+				    term_to_Coefficient(t_d));
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_generalized_affine_image_lhs_rhs(Prolog_term_ref t_ph,
+						Prolog_term_ref t_lhs,
+						Prolog_term_ref t_r,
+						Prolog_term_ref t_rhs) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Relation_Symbol r = term_to_relation_symbol(t_r);
+    ph->generalized_affine_image(build_linear_expression(t_lhs),
+				 r,
+				 build_linear_expression(t_rhs));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(Prolog_term_ref t_ph,
+						   Prolog_term_ref t_lhs,
+						   Prolog_term_ref t_r,
+						   Prolog_term_ref t_rhs) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Relation_Symbol r = term_to_relation_symbol(t_r);
+    ph->generalized_affine_preimage(build_linear_expression(t_lhs),
+				    r,
+				    build_linear_expression(t_rhs));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounded_affine_image(Prolog_term_ref t_ph,
+				    Prolog_term_ref t_v,
+				    Prolog_term_ref t_lb_le,
+				    Prolog_term_ref t_ub_le,
+				    Prolog_term_ref t_d) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    ph->bounded_affine_image(term_to_Variable(t_v),
+			     build_linear_expression(t_lb_le),
+			     build_linear_expression(t_ub_le),
+			     term_to_Coefficient(t_d));
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounded_affine_preimage(Prolog_term_ref t_ph,
+				       Prolog_term_ref t_v,
+				       Prolog_term_ref t_lb_le,
+				       Prolog_term_ref t_ub_le,
+				       Prolog_term_ref t_d) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    ph->bounded_affine_preimage(term_to_Variable(t_v),
+				build_linear_expression(t_lb_le),
+				build_linear_expression(t_ub_le),
+				term_to_Coefficient(t_d));
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+namespace {
+
+Prolog_foreign_return_type
+widening_assign(Prolog_term_ref t_lhs,
+		Prolog_term_ref t_rhs,
+		void (Polyhedron::* widening_assign)(const Polyhedron&,
+						     unsigned* tp)) {
+  try {
+    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    (lhs->*widening_assign)(*rhs, 0);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+Prolog_foreign_return_type
+widening_assign_with_tokens(Prolog_term_ref t_lhs,
+			    Prolog_term_ref t_rhs,
+			    Prolog_term_ref t_ti,
+			    Prolog_term_ref t_to,
+			    void (Polyhedron::*
+				  widening_assign)(const Polyhedron&,
+						   unsigned* tp)) {
+  try {
+    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    unsigned t = term_to_unsigned<unsigned>(t_ti);
+    (lhs->*widening_assign)(*rhs, &t);
+      if (unify_long(t_to, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+Prolog_foreign_return_type
+widening_assign_with_token(Prolog_term_ref t_lhs,
+			   Prolog_term_ref t_rhs,
+			   Prolog_term_ref t_t,
+			   void (Polyhedron::*
+				 widening_assign)(const Polyhedron&,
+						  unsigned* tp)) {
+  try {
+    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    unsigned t = 1;
+    (lhs->*widening_assign)(*rhs, &t);
+    if (unify_long(t_t, 1-t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+Prolog_foreign_return_type
+limited_extrapolation_assign(Prolog_term_ref t_lhs,
+			 Prolog_term_ref t_rhs,
+			 Prolog_term_ref t_clist,
+			 void (Polyhedron::*
+			       limited_extrap_assign)(const Polyhedron&,
+						      const Constraint_System&,
+						      unsigned* tp)) {
+  try {
+    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist);
+
+    (lhs->*limited_extrap_assign)(*rhs, cs, 0);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+Prolog_foreign_return_type
+limited_extrapolation_assign_with_tokens(Prolog_term_ref t_lhs,
+			 Prolog_term_ref t_rhs,
+			 Prolog_term_ref t_clist,
+	  		 Prolog_term_ref t_ti,
+	  		 Prolog_term_ref t_to,
+			 void (Polyhedron::*
+			       limited_extrap_assign)(const Polyhedron&,
+						      const Constraint_System&,
+						      unsigned* tp)) {
+  try {
+    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist);
+
+    unsigned t = term_to_unsigned<unsigned>(t_ti);
+   (lhs->*limited_extrap_assign)(*rhs, cs, &t);
+      if (unify_long(t_to, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(Prolog_term_ref t_lhs,
+						  Prolog_term_ref t_rhs,
+						  Prolog_term_ref t_ti,
+						  Prolog_term_ref t_to) {
+  return widening_assign_with_tokens(t_lhs, t_rhs, t_ti, t_to,
+				    &Polyhedron::BHRZ03_widening_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_BHRZ03_widening_assign_with_token(Prolog_term_ref t_lhs,
+						 Prolog_term_ref t_rhs,
+						 Prolog_term_ref t_t) {
+  return widening_assign_with_token(t_lhs, t_rhs, t_t,
+				    &Polyhedron::BHRZ03_widening_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_BHRZ03_widening_assign(Prolog_term_ref t_lhs,
+				      Prolog_term_ref t_rhs) {
+  return widening_assign(t_lhs, t_rhs, &Polyhedron::BHRZ03_widening_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+                                    Prolog_term_ref t_lhs,
+				    Prolog_term_ref t_rhs,
+				    Prolog_term_ref t_clist,
+				    Prolog_term_ref t_ti,
+				    Prolog_term_ref t_to) {
+  return limited_extrapolation_assign_with_tokens(t_lhs,
+				      t_rhs,
+				      t_clist,
+				      t_ti,
+				      t_to,
+				      &Polyhedron::
+				      limited_BHRZ03_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(Prolog_term_ref t_lhs,
+						   Prolog_term_ref t_rhs,
+						   Prolog_term_ref t_clist) {
+  return limited_extrapolation_assign(t_lhs,
+				      t_rhs,
+				      t_clist,
+				      &Polyhedron::
+				      limited_BHRZ03_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+                                                   Prolog_term_ref t_lhs,
+						   Prolog_term_ref t_rhs,
+						   Prolog_term_ref t_clist,
+				                   Prolog_term_ref t_ti,
+				                   Prolog_term_ref t_to) {
+  return limited_extrapolation_assign_with_tokens(t_lhs,
+				      t_rhs,
+				      t_clist,
+				      t_ti,
+				      t_to,
+				      &Polyhedron::
+				      bounded_BHRZ03_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(Prolog_term_ref t_lhs,
+						   Prolog_term_ref t_rhs,
+						   Prolog_term_ref t_clist) {
+  return limited_extrapolation_assign(t_lhs,
+				      t_rhs,
+				      t_clist,
+				      &Polyhedron::
+				      bounded_BHRZ03_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_H79_widening_assign_with_tokens(Prolog_term_ref t_lhs,
+					       Prolog_term_ref t_rhs,
+					       Prolog_term_ref t_ti,
+					       Prolog_term_ref t_to) {
+  return widening_assign_with_tokens(t_lhs, t_rhs, t_ti, t_to,
+				    &Polyhedron::H79_widening_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_H79_widening_assign(Prolog_term_ref t_lhs,
+				   Prolog_term_ref t_rhs) {
+  return widening_assign(t_lhs, t_rhs, &Polyhedron::H79_widening_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+                                                Prolog_term_ref t_lhs,
+						Prolog_term_ref t_rhs,
+						Prolog_term_ref t_clist,
+				                Prolog_term_ref t_ti,
+				                Prolog_term_ref t_to) {
+  return limited_extrapolation_assign_with_tokens(t_lhs,
+				      t_rhs,
+				      t_clist,
+				      t_ti,
+				      t_to,
+				      &Polyhedron::
+				      limited_H79_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_limited_H79_extrapolation_assign(Prolog_term_ref t_lhs,
+						Prolog_term_ref t_rhs,
+						Prolog_term_ref t_clist) {
+  return limited_extrapolation_assign(t_lhs,
+				      t_rhs,
+				      t_clist,
+				      &Polyhedron::
+				      limited_H79_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+                                                   Prolog_term_ref t_lhs,
+						   Prolog_term_ref t_rhs,
+						   Prolog_term_ref t_clist,
+				                   Prolog_term_ref t_ti,
+				                   Prolog_term_ref t_to) {
+  return limited_extrapolation_assign_with_tokens(t_lhs,
+				      t_rhs,
+				      t_clist,
+				      t_ti,
+				      t_to,
+				      &Polyhedron::
+				      bounded_H79_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounded_H79_extrapolation_assign(Prolog_term_ref t_lhs,
+						   Prolog_term_ref t_rhs,
+						   Prolog_term_ref t_clist) {
+  return limited_extrapolation_assign(t_lhs,
+				      t_rhs,
+				      t_clist,
+				      &Polyhedron::
+				      bounded_H79_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_space_dimensions_and_project(Prolog_term_ref t_ph,
+						Prolog_term_ref t_nnd) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    dimension_type d = term_to_unsigned<dimension_type>(t_nnd);
+      ph->add_space_dimensions_and_project(d);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_space_dimensions_and_embed(Prolog_term_ref t_ph,
+					      Prolog_term_ref t_nnd) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    dimension_type d = term_to_unsigned<dimension_type>(t_nnd);
+    ph->add_space_dimensions_and_embed(d);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_concatenate_assign(Prolog_term_ref t_lhs,
+				  Prolog_term_ref t_rhs) {
+  try {
+    Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+    const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    lhs->concatenate_assign(*rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_remove_space_dimensions(Prolog_term_ref t_ph,
+				       Prolog_term_ref t_vlist) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Variables_Set dead_variables;
+    Prolog_term_ref v = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_vlist)) {
+      Prolog_get_cons(t_vlist, v, t_vlist);
+      dead_variables.insert(term_to_Variable(v));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vlist);
+
+    ph->remove_space_dimensions(dead_variables);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_remove_higher_space_dimensions(Prolog_term_ref t_ph,
+					      Prolog_term_ref t_nd) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    ph->remove_higher_space_dimensions(term_to_unsigned<dimension_type>(t_nd));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_expand_space_dimension(Prolog_term_ref t_ph,
+				      Prolog_term_ref t_v,
+				      Prolog_term_ref t_nd) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    ph->expand_space_dimension(term_to_Variable(t_v),
+			       term_to_unsigned<dimension_type>(t_nd));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_fold_space_dimensions(Prolog_term_ref t_ph,
+				     Prolog_term_ref t_vlist,
+				     Prolog_term_ref t_v) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    CHECK(ph);
+    Variables_Set fold_variables;
+    Prolog_term_ref v = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_vlist)) {
+      Prolog_get_cons(t_vlist, v, t_vlist);
+      fold_variables.insert(term_to_Variable(v));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vlist);
+
+    ph->fold_space_dimensions(fold_variables, term_to_Variable(t_v));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+namespace {
+
+class PFunc {
+private:
+  std::set<dimension_type> codomain;
+  std::vector<dimension_type> vec;
+
+public:
+  PFunc() {
+  }
+
+  bool has_empty_codomain() const {
+    return codomain.empty();
+  }
+
+  dimension_type max_in_codomain() const {
+    if (codomain.empty())
+      throw unknown_interface_error("PFunc::max_in_codomain()");
+    return *codomain.rbegin();
+  }
+
+  bool maps(dimension_type i, dimension_type& j) const {
+    if (i >= vec.size())
+      return false;
+    dimension_type vec_i = vec[i];
+    if (vec_i == not_a_dimension())
+      return false;
+    j = vec_i;
+    return true;
+  }
+
+  bool insert(dimension_type i, dimension_type j) {
+    std::pair<std::set<dimension_type>::iterator, bool> s
+      = codomain.insert(j);
+    if (!s.second)
+      // *this is not injective!
+      return false;
+    if (i > vec.size())
+      vec.insert(vec.end(), i - vec.size(), not_a_dimension());
+    if (i == vec.size()) {
+      vec.insert(vec.end(), j);
+      return true;
+    }
+    dimension_type& vec_i = vec[i];
+    if (vec_i != not_a_dimension())
+      // Already mapped: *this is not a function!
+      return false;
+    vec_i = j;
+    return true;
+  }
+};
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_map_space_dimensions(Prolog_term_ref t_ph,
+				    Prolog_term_ref t_pfunc) {
+  try {
+    Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+    dimension_type space_dim = ph->space_dimension();
+    CHECK(ph);
+    PFunc pfunc;
+    Prolog_term_ref t_pair = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_pfunc)) {
+      Prolog_get_cons(t_pfunc, t_pair, t_pfunc);
+      Prolog_atom functor;
+      int arity;
+      Prolog_get_compound_name_arity(t_pair, &functor, &arity);
+      if (arity != 2 || functor != a_minus)
+	return PROLOG_FAILURE;
+      Prolog_term_ref t_i = Prolog_new_term_ref();
+      Prolog_term_ref t_j = Prolog_new_term_ref();
+      Prolog_get_arg(1, t_pair, t_i);
+      Prolog_get_arg(2, t_pair, t_j);
+      dimension_type i = term_to_Variable(t_i).id();
+      dimension_type j = term_to_Variable(t_j).id();
+      if (i >= space_dim || !pfunc.insert(i, j))
+	return PROLOG_FAILURE;
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_pfunc);
+
+    ph->map_space_dimensions(pfunc);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+
+}
+
+
+extern "C" Prolog_foreign_return_type
+ppl_new_LP_Problem_trivial(Prolog_term_ref t_lp) {
+  try {
+    LP_Problem* lp = new LP_Problem;
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, lp);
+    if (Prolog_unify(t_lp, tmp)) {
+      REGISTER(lp);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete lp;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_LP_Problem(Prolog_term_ref t_clist,
+		   Prolog_term_ref t_le_expr,
+		   Prolog_term_ref t_opt,
+		   Prolog_term_ref t_lp) {
+  try {
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c));
+    }
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist);
+
+    const Linear_Expression le = build_linear_expression(t_le_expr);
+    Prolog_atom opt = term_to_optimization_mode(t_opt);
+    Optimization_Mode mode = (opt == a_max) ? MAXIMIZATION : MINIMIZATION;
+
+    LP_Problem* lp = new LP_Problem(cs, le, mode);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, lp);
+    if (Prolog_unify(t_lp, tmp)) {
+      REGISTER(lp);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete lp;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_LP_Problem_from_LP_Problem(Prolog_term_ref t_lp_source,
+				   Prolog_term_ref t_lp) {
+  try {
+    const LP_Problem* lp_source
+      = static_cast<const LP_Problem*>
+        (term_to_lp_problem_handle(t_lp_source));
+    CHECK(lp_source);
+    LP_Problem* lp = new LP_Problem(*lp_source);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, lp);
+    if (Prolog_unify(t_lp, tmp)) {
+      REGISTER(lp);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete lp;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  try {
+    LP_Problem* lhs = term_to_lp_problem_handle(t_lhs);
+    LP_Problem* rhs = term_to_lp_problem_handle(t_rhs);
+    CHECK(lhs);
+    CHECK(rhs);
+    lhs->swap(*rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_LP_Problem(Prolog_term_ref t_lp) {
+  try {
+    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    UNREGISTER(lp);
+    delete lp;
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_space_dimension(Prolog_term_ref t_lp, Prolog_term_ref t_sd) {
+  try {
+    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+    if (unify_ulong(t_sd, lp->space_dimension()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_constraints(Prolog_term_ref t_lp,
+			   Prolog_term_ref t_clist) {
+  try {
+    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const Constraint_System& cs = lp->constraints();
+    for (Constraint_System::const_iterator i = cs.begin(),
+	   cs_end = cs.end(); i != cs_end; ++i)
+      Prolog_construct_cons(tail, constraint_term(*i), tail);
+
+    if (Prolog_unify(t_clist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_objective_function(Prolog_term_ref t_lp,
+				  Prolog_term_ref t_le_expr) {
+  try {
+    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+
+    const Linear_Expression& le = lp->objective_function();
+    Prolog_term_ref t = get_linear_expression(le);
+
+    if (Prolog_unify(t_le_expr, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_optimization_mode(Prolog_term_ref t_lp,
+				 Prolog_term_ref t_opt) {
+  try {
+    LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+
+    Optimization_Mode mode = lp->optimization_mode();
+    Prolog_term_ref t = Prolog_new_term_ref();
+    Prolog_atom a = (mode == MAXIMIZATION) ? a_max : a_min;
+    Prolog_put_atom(t, a);
+    if (Prolog_unify(t_opt, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_clear(Prolog_term_ref t_lp) {
+  try {
+    LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+    lp->clear();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_add_constraint(Prolog_term_ref t_lp, Prolog_term_ref t_c) {
+  try {
+    LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+    lp->add_constraint(build_constraint(t_c));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_add_constraints(Prolog_term_ref t_lp,
+			       Prolog_term_ref t_clist) {
+  try {
+    LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist);
+
+    lp->add_constraints(cs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_set_objective_function(Prolog_term_ref t_lp,
+				      Prolog_term_ref t_le_expr) {
+  try {
+    LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+    lp->set_objective_function(build_linear_expression(t_le_expr));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_set_optimization_mode(Prolog_term_ref t_lp,
+				     Prolog_term_ref t_opt) {
+  try {
+    LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+
+    Prolog_atom opt = term_to_optimization_mode(t_opt);
+    Optimization_Mode mode = (opt == a_max) ? MAXIMIZATION : MINIMIZATION;
+    lp->set_optimization_mode(mode);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_is_satisfiable(Prolog_term_ref t_lp) {
+  try {
+    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+    if (lp->is_satisfiable())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_solve(Prolog_term_ref t_lp, Prolog_term_ref t_status) {
+  try {
+    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+
+    Prolog_atom a;
+    switch (lp->solve()) {
+    case UNFEASIBLE_LP_PROBLEM:
+      a = a_unfeasible;
+      break;
+    case UNBOUNDED_LP_PROBLEM:
+      a = a_unbounded;
+      break;
+    case OPTIMIZED_LP_PROBLEM:
+      a = a_optimized;
+      break;
+    default:
+      throw unknown_interface_error("ppl_LP_Problem_solve()");
+    }
+    Prolog_term_ref t = Prolog_new_term_ref();
+    Prolog_put_atom(t, a);
+    if (Prolog_unify(t_status, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_feasible_point(Prolog_term_ref t_lp,
+			      Prolog_term_ref t_g) {
+ try {
+    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+    const Generator& g = lp->feasible_point();
+    if (Prolog_unify(t_g, generator_term(g)))
+      return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_optimizing_point(Prolog_term_ref t_lp,
+				Prolog_term_ref t_g) {
+ try {
+    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+    const Generator& g = lp->optimizing_point();
+    if (Prolog_unify(t_g, generator_term(g)))
+      return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_optimal_value(Prolog_term_ref t_lp,
+			     Prolog_term_ref t_n,
+			     Prolog_term_ref t_d) {
+ try {
+    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+    Coefficient n;
+    Coefficient d;
+    lp->optimal_value(n, d);
+    if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
+	&& Prolog_unify(t_d, Coefficient_to_integer_term(d)))
+      return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_evaluate_objective_function(Prolog_term_ref t_lp,
+					   Prolog_term_ref t_g,
+					   Prolog_term_ref t_n,
+					   Prolog_term_ref t_d) {
+ try {
+    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+    Coefficient n;
+    Coefficient d;
+    lp->evaluate_objective_function(build_generator(t_g), n, d);
+    if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
+	&& Prolog_unify(t_d, Coefficient_to_integer_term(d)))
+      return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_OK(Prolog_term_ref t_lp) {
+  try {
+    const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+    CHECK(lp);
+    if (lp->OK())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
diff --git a/interfaces/Prolog/tests/Makefile.am b/interfaces/Prolog/tests/Makefile.am
new file mode 100644
index 0000000..6522380
--- /dev/null
+++ b/interfaces/Prolog/tests/Makefile.am
@@ -0,0 +1,51 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+EXTRA_DIST = \
+clpq.pl script_clpq \
+clpq2.pl script_clpq2 script_clpq2_int8 \
+$(CLPQ_TESTS) \
+pl_check.pl \
+expected_clpq_mpz expected_clpq2_mpz expected_pchk_mpz \
+expected_clpq_int8 expected_clpq2_int8 expected_pchk_int8 \
+expected_clpq_int16 expected_clpq2_int16 expected_pchk_int16 \
+expected_clpq_int32 expected_clpq2_int32 expected_pchk_int32 \
+expected_clpq_int64 expected_clpq2_int64 expected_pchk_int64 \
+expected_clpq_mpz_a expected_clpq2_mpz_a expected_pchk_mpz_a \
+expected_clpq_int8_a expected_clpq2_int8_a expected_pchk_int8_a \
+expected_clpq_int16_a expected_clpq2_int16_a expected_pchk_int16_a \
+expected_clpq_int32_a expected_clpq2_int32_a expected_pchk_int32_a \
+expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a
diff --git a/interfaces/Prolog/tests/Makefile.in b/interfaces/Prolog/tests/Makefile.in
new file mode 100644
index 0000000..0a111d0
--- /dev/null
+++ b/interfaces/Prolog/tests/Makefile.in
@@ -0,0 +1,465 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog/tests
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+EXTRA_DIST = \
+clpq.pl script_clpq \
+clpq2.pl script_clpq2 script_clpq2_int8 \
+$(CLPQ_TESTS) \
+pl_check.pl \
+expected_clpq_mpz expected_clpq2_mpz expected_pchk_mpz \
+expected_clpq_int8 expected_clpq2_int8 expected_pchk_int8 \
+expected_clpq_int16 expected_clpq2_int16 expected_pchk_int16 \
+expected_clpq_int32 expected_clpq2_int32 expected_pchk_int32 \
+expected_clpq_int64 expected_clpq2_int64 expected_pchk_int64 \
+expected_clpq_mpz_a expected_clpq2_mpz_a expected_pchk_mpz_a \
+expected_clpq_int8_a expected_clpq2_int8_a expected_pchk_int8_a \
+expected_clpq_int16_a expected_clpq2_int16_a expected_pchk_int16_a \
+expected_clpq_int32_a expected_clpq2_int32_a expected_pchk_int32_a \
+expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  interfaces/Prolog/tests/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  interfaces/Prolog/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+	uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/tests/ack.clpq b/interfaces/Prolog/tests/ack.clpq
new file mode 100644
index 0000000..9e3c4e3
--- /dev/null
+++ b/interfaces/Prolog/tests/ack.clpq
@@ -0,0 +1,5 @@
+ack(0, N, N+1).
+ack(M, 0, R) :-
+   { M >= 1 }, ack(M-1, 1, R).
+ack(M, N, R) :-
+   { M >= 1, N >= 1 }, ack(M, N-1, T), ack(M-1, T, R).
diff --git a/interfaces/Prolog/tests/ackn.clpq b/interfaces/Prolog/tests/ackn.clpq
new file mode 100644
index 0000000..3f25deb
--- /dev/null
+++ b/interfaces/Prolog/tests/ackn.clpq
@@ -0,0 +1,6 @@
+ack(M, N, R) :-
+   { M = 0, R = N+1 }.
+ack(M, N, R) :-
+   { M >= 1, N = 0, M = M1+1 }, ack(M1, 1, R).
+ack(M, N, R) :-
+   { M >= 1, N >= 1, M = M1+1, N = N1+1 }, ack(M, N1, T), ack(M1, T, R).
diff --git a/interfaces/Prolog/tests/clpq.pl b/interfaces/Prolog/tests/clpq.pl
new file mode 100644
index 0000000..ed75fea
--- /dev/null
+++ b/interfaces/Prolog/tests/clpq.pl
@@ -0,0 +1,801 @@
+% A toy, non-ground meta-interpreter for CLP(Q)
+% for testing the Parma Polyhedra Library and its Prolog interface.
+%
+% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This file is part of the Parma Polyhedra Library (PPL).
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 2 of the License, or (at your
+% option) any later version.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+% Object-level clauses are stored as user_clause(Head, Body) facts.
+:- dynamic(user_clause/2).
+
+% Used to store the names of variables occurring in the original goal
+% as a list of the form [ Name1 = Variable1, ... ]
+:- dynamic(original_goal_variables/1).
+
+
+% solve(+Goals, +Variable_Names)
+%
+% Tries to solve the query `Goals' and to present the results
+% to the user by referring to the original variable names
+% contained in `Variable_Names'.
+
+solve(Goals, Variable_Names) :-
+    numvars(Goals, 0, Dims),
+    assertz(original_goal_variables(Variable_Names)),
+    % The initial polyhedron is initialised with
+    % `Dims' dimensions, the number of variables in `Goals'.
+    ppl_new_C_Polyhedron_from_space_dimension(Dims, universe, Polyhedron),
+    % Try to reduce `Goals' to the empty continuation.
+    (solve(Goals, true, Polyhedron) ->
+	Failed = no
+    ;
+	Failed = yes
+    ),
+    % On failure, cleanup must occur anyway.
+    % The one who creates the polyhedron must delete it.
+    ppl_delete_Polyhedron(Polyhedron),
+    % Further cleaning.
+    retract(original_goal_variables(_)),
+    Failed == no.
+
+
+solve(true, true, Polyhedron) :-
+    !,
+    % It is time to print the result and see if the user
+    % wants to look for more solutions.
+    ppl_new_C_Polyhedron_from_C_Polyhedron(Polyhedron, Q),
+    original_goal_variables(Variable_Names),
+    length(Variable_Names, Dims),
+    ppl_Polyhedron_remove_higher_space_dimensions(Q, Dims),
+    ppl_Polyhedron_get_constraints(Q, CS),
+    write_constraints(CS, Variable_Names),
+    ppl_delete_Polyhedron(Q),
+    % More?
+    % If query_next_solution succeeds,
+    % then no more solutions are required.
+    query_next_solution.
+
+solve(true, (G, Goals), Polyhedron) :-
+    !,
+    solve(G, Goals, Polyhedron).
+
+solve((A, B), Goals, Polyhedron) :-
+    !,
+    solve(A, (B, Goals), Polyhedron).
+
+solve({}, Goals, Polyhedron) :-
+    !,
+    % The empty set of constraints is equivalent to true.
+    solve(true, Goals, Polyhedron).
+
+solve({ Constraints }, Goals, Polyhedron) :-
+    !,
+    % Solve the constraints using the constraint solver.
+    solve_constraints(Constraints, Polyhedron),
+    solve(true, Goals, Polyhedron).
+
+% Built-ins may be added here.
+
+solve(Atom, Goals, Polyhedron) :-
+    % Here is a choicepoint: possibly different clauses
+    % will be selected on backtracking.
+    % NOTE: we may fail to find (another) clause,
+    %       but we have allocated nothing yet.
+    select_clause(Atom, Head, Body),
+
+    % Copy the current polyhedron and work on the copy.
+    % NOTE: the copy is under our responsibility, i.e.,
+    %       it is our job to delete it, sooner or later.
+    ppl_new_C_Polyhedron_from_C_Polyhedron(Polyhedron, Poly_Copy),
+
+    % Rename the selected clause apart and extend the polyhedron.
+    ppl_Polyhedron_space_dimension(Poly_Copy, Dims),
+    numvars((Head, Body), Dims, New_Dims),
+    Added_Dims is New_Dims - Dims,
+    ppl_Polyhedron_add_space_dimensions_and_embed(Poly_Copy, Added_Dims),
+    % Parameter passing.
+    parameter_passing(Atom, Head, PP_Constraints),
+
+    % Try to solve the body augmented with the parameter passing equations.
+    (solve(PP_Constraints, (Body, Goals), Poly_Copy) ->
+	Failed = no
+    ;
+	Failed = yes
+    ),
+    % Our copy must be thrown anyway.
+    ppl_delete_Polyhedron(Poly_Copy),
+    Failed == no.
+
+
+parameter_passing(Atom, Head, PP_Constraints) :-
+    Atom =.. [_|Actuals],
+    Head =.. [_|Formals],
+    (Actuals == [] ->
+	PP_Constraints = true
+    ;
+	build_pp_constraints(Actuals, Formals, Equations),
+	PP_Constraints = ({ Equations })
+    ).
+
+build_pp_constraints([A|Actuals], [F|Formals], Equations) :-
+    (Actuals == [] ->
+	Equations = (A = F)
+    ;
+	Equations = ((A = F), More_Equations),
+	build_pp_constraints(Actuals, Formals, More_Equations)
+    ).
+
+select_clause(Atom, Head, Body) :-
+    functor(Atom, F, N),
+    functor(Head, F, N),
+    user_clause(Head, Body).
+
+% The constraints are solved by adding them into the polyhedron.
+solve_constraints(Constraints, Polyhedron) :-
+    listize_constraints(Constraints, Constraints_List),
+    % Fails if `Polyhedron' becomes empty.
+    ppl_Polyhedron_add_constraints_and_minimize(Polyhedron, Constraints_List).
+
+listize_constraints(C, LC) :-
+    listize_constraints(C, [], LC).
+
+listize_constraints((A, B), Rest, LC) :-
+    !,
+    listize_constraints(B, Rest, BRest),
+    listize_constraints(A, BRest, LC).
+listize_constraints(C, Rest, [C|Rest]).
+
+
+%%%%%%%%%%%%%%%%%% Query the User for More Solutions %%%%%%%%%%%%%%%%%%%
+
+query_next_solution :-
+  write(' more? '),
+  repeat,
+  flush_output(user_output),
+  get_code(user_input, C),
+  (
+    C == 59,
+    % Get rid of the EOL character.
+    get_code(user_input, _EOL)
+  ;
+    C == 10
+  ;
+    write('Action (";" for more choices, otherwise <return>): '),
+    eat_to_eol,
+    fail
+  ),
+  !,
+  C = 10.
+
+eat_to_eol :-
+  get_code(user_input, C),
+  (C == 10 ->
+    true
+  ;
+    eat_to_eol
+  ).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%% Reading Programs %%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+open_file_for_reading(File, Stream) :-
+  catch(open(File, read, Stream), _, fail).
+
+read_programs([]).
+read_programs([P|Ps]) :-
+  read_program(P),
+  read_programs(Ps).
+
+read_program(Program) :-
+  (atom(Program) ->
+    true
+  ;
+    write_error(['read_program/1 - arg 1: expected file name, found ',
+                 Program]),
+    fail
+  ),
+  (open_file_for_reading(Program, Stream) ->
+    File_Name = Program
+  ;
+    atom_concat(Program, '.clpq', File_Name),
+    (open_file_for_reading(File_Name, Stream) ->
+      true
+    ;
+      write_error(['read_program/1 - arg 1: file ',
+                   Program, ' does not exist']),
+      fail
+    )
+  ),
+  (read_clauses(Stream) ->
+    close(Stream)
+  ;
+    write_error(['read_program/1 - arg 1: syntax error reading ', Program]),
+    close(Stream),
+    fail
+  ).
+
+read_clauses(Stream) :-
+  read(Stream, Clause),
+  (Clause \== end_of_file ->
+    (Clause = (Head :- Body) ->
+      assertz(user_clause(Head, Body))
+    ;
+      assertz(user_clause(Clause, true))
+    ),
+    read_clauses(Stream)
+  ;
+    true
+  ).
+
+%%%%%%%%%%%%%%%%%%%%% The User's Interaction Loop %%%%%%%%%%%%%%%%%%%%%%
+
+write_error(Message) :-
+  write('clpq error: '),
+  write_error_aux(Message).
+
+write_error_aux([]) :-
+  nl.
+write_error_aux([H|T]) :-
+  write(H),
+  write_error_aux(T).
+
+main_loop :-
+  write('PPL clpq ?- '),
+  read_term(Command, [variable_names(VN)]),
+  % The above read leaves an EOL character in the input buffer:
+  % get rid of it.
+  eat_eol,
+  catch(do_command(Command, VN),
+	Exception,
+	(print_exception_term(Exception), main_loop_no)).
+
+print_exception_term(ppl_overflow_error(Cause)) :-
+  nl,
+  write('Error: an overflow has been detected by the PPL: '),
+  write(Cause),
+  nl,
+  !.
+
+print_exception_term(Exception) :-
+  nl,
+  writeq(Exception),
+  nl.
+
+clear_program :-
+  retract(user_clause(_, _)),
+  fail.
+clear_program.
+
+list_program :-
+  user_clause(Head, Body),
+  pp(Head, Body),
+  fail.
+list_program.
+
+pp(Head, Body) :-
+  % write(Head),
+  (Body == true ->
+    % write('.')
+    portray_clause(Head)
+  ;
+    % write(' :- '),
+    % write(Body)
+    portray_clause((Head :- Body))
+  ),
+  nl.
+
+do_command(end_of_file, _VN) :-
+  !.
+do_command(halt, _VN) :-
+  !.
+do_command(warranty, _VN) :-
+  !,
+  show_warranty,
+  main_loop_yes.
+do_command(copying, _VN) :-
+  !,
+  show_copying,
+  main_loop_yes.
+do_command(trace, _VN) :-
+  !,
+  trace,
+  main_loop_yes.
+do_command(notrace, _VN) :-
+  !,
+  notrace,
+  main_loop_yes.
+do_command(debug, _VN) :-
+  !,
+  debug,
+  main_loop_yes.
+do_command(nodebug, _VN) :-
+  !,
+  nodebug,
+  main_loop_yes.
+do_command(spy(Spec), _VN) :-
+  !,
+  spy(Spec),
+  main_loop_yes.
+do_command(nospy(Spec), _VN) :-
+  !,
+  nospy(Spec),
+  main_loop_yes.
+do_command(nospyall, _VN) :-
+  !,
+  nospyall,
+  main_loop_yes.
+do_command([], _VN) :-
+  !,
+  (read_programs([]) ; true),
+  main_loop_yes.
+do_command([H|T], _VN) :-
+  !,
+  (read_programs([H|T]) ; true),
+  main_loop_yes.
+do_command(consult(Program), _VN) :-
+  !,
+  (read_program(Program) ; true),
+  main_loop_yes.
+do_command(reconsult(Program), VN) :-
+  !,
+  clear_program,
+  do_command(consult(Program), VN).
+do_command(listing, _VN) :-
+  !,
+  list_program,
+  main_loop_yes.
+do_command(statistics, _VN) :-
+  !,
+  statistics,
+  main_loop_yes.
+do_command(Query, VN) :-
+  solve(Query, VN),
+  main_loop_yes.
+do_command(_, _VN) :-
+  main_loop_no.
+
+main_loop_no :-
+  write(no),
+  nl,
+  main_loop.
+
+main_loop_yes :-
+  write(yes),
+  nl,
+  main_loop.
+
+%%%%%%%%%%%%%%%%% Writing Computed Answer Constraints %%%%%%%%%%%%%%%%%%
+
+write_var(Var, Variable_Names) :-
+  member(Name=Var, Variable_Names),
+  !,
+  write(Name).
+
+negate_expr(Num*Var, Neg_Expr) :-
+  (Num < 0 ->
+    Neg_Num is -Num,
+    Neg_Expr = Neg_Num*Var
+  ;
+    Neg_Expr = Num*Var
+  ).
+negate_expr(Expr1 + Expr2, Neg_Expr1 + Neg_Expr2) :-
+  negate_expr(Expr1, Neg_Expr1),
+  negate_expr(Expr2, Neg_Expr2).
+
+write_expr(Num*Var, Variable_Names) :-
+  (Num =:= 1 ->
+    true
+  ;
+    (Num =:= -1 ->
+      write('-')
+    ;
+      write(Num),
+      write('*')
+    )
+  ),
+  write_var(Var, Variable_Names).
+write_expr(E + Num*Var, Variable_Names) :-
+  write_expr(E, Variable_Names),
+  (Num < 0 ->
+    write(' - '),
+    Neg_Num is -Num,
+    write_expr(Neg_Num*Var, Variable_Names)
+  ;
+    write(' + '),
+    write_expr(Num*Var, Variable_Names)
+  ).
+
+write_constraint(Expr = Num, Variable_Names) :-
+  write_expr(Expr, Variable_Names),
+  write(' = '),
+  write(Num).
+write_constraint(Expr >= Num, Variable_Names) :-
+  (Num < 0 ->
+    negate_expr(Expr, Neg_Expr),
+    write_expr(Neg_Expr, Variable_Names),
+    write(' =< '),
+    Neg_Num is -Num,
+    write(Neg_Num)
+  ;
+    write_expr(Expr, Variable_Names),
+    write(' >= '),
+    write(Num)
+  ).
+
+write_constraints([], _Variable_Names).
+write_constraints([C|CS], Variable_Names) :-
+  write_constraint(C, Variable_Names),
+  nl,
+  write_constraints(CS, Variable_Names).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%% Utility Predicates %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% numvars(?Term, +In_N, ?Out_N)
+%
+% Unifies each of the variables in Term with the special terms
+% '$VAR'(k), where k ranges from In_N to Out_N-1.
+
+numvars('$VAR'(In_N), In_N, Out_N) :-
+  !,
+  Out_N is In_N + 1.
+numvars(Term, In_N, Out_N) :-
+  Term =.. [_|Args],
+  numvars_list(Args, In_N, Out_N).
+
+numvars_list([], In_N, In_N).
+numvars_list([Arg|Args], In_N, Out_N) :-
+  numvars(Arg, In_N, Tmp_N),
+  numvars_list(Args, Tmp_N, Out_N).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Legalese %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+next_or_quit :-
+  write('---Type <return> to continue, or q <return> to quit---'),
+  flush_output(user_output),
+  get_code(user_input, C),
+  (
+    C == 10
+  ;
+    eat_eol
+  ),
+  !,
+  C \== 113.
+
+show_copying :-
+  eat_eol,
+  write('\
+                    GNU GENERAL PUBLIC LICENSE\n\
+                       Version 2, June 1991\n\
+\n\
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n\
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n\
+ Everyone is permitted to copy and distribute verbatim copies\n\
+ of this license document, but changing it is not allowed.\n\
+\n\
+                            Preamble\n\
+\n\
+  The licenses for most software are designed to take away your\n\
+freedom to share and change it.  By contrast, the GNU General Public\n\
+License is intended to guarantee your freedom to share and change free\n\
+software--to make sure the software is free for all its users.  This\n\
+General Public License applies to most of the Free Software\n\
+Foundation''s software and to any other program whose authors commit to\n\
+using it.  (Some other Free Software Foundation software is covered by\n\
+the GNU Library General Public License instead.)  You can apply it to\n\
+your programs, too.\n\
+\n\
+  When we speak of free software, we are referring to freedom, not\n\
+price.  Our General Public Licenses are designed to make sure that you\n\
+have the freedom to distribute copies of free software (and charge for\n'),
+  next_or_quit,
+  write('\
+this service if you wish), that you receive source code or can get it\n\
+if you want it, that you can change the software or use pieces of it\n\
+in new free programs; and that you know you can do these things.\n\
+\n\
+  To protect your rights, we need to make restrictions that forbid\n\
+anyone to deny you these rights or to ask you to surrender the rights.\n\
+These restrictions translate to certain responsibilities for you if you\n\
+distribute copies of the software, or if you modify it.\n\
+\n\
+  For example, if you distribute copies of such a program, whether\n\
+gratis or for a fee, you must give the recipients all the rights that\n\
+you have.  You must make sure that they, too, receive or can get the\n\
+source code.  And you must show them these terms so they know their\n\
+rights.\n\
+\n\
+  We protect your rights with two steps: (1) copyright the software, and\n\
+(2) offer you this license which gives you legal permission to copy,\n\
+distribute and/or modify the software.\n\
+\n\
+  Also, for each author''s protection and ours, we want to make certain\n\
+that everyone understands that there is no warranty for this free\n\
+software.  If the software is modified by someone else and passed on, we\n\
+want its recipients to know that what they have is not the original, so\n'),
+  next_or_quit,
+  write('\
+that any problems introduced by others will not reflect on the original\n\
+authors'' reputations.\n\
+\n\
+  Finally, any free program is threatened constantly by software\n\
+patents.  We wish to avoid the danger that redistributors of a free\n\
+program will individually obtain patent licenses, in effect making the\n\
+program proprietary.  To prevent this, we have made it clear that any\n\
+patent must be licensed for everyone''s free use or not licensed at all.\n\
+\n\
+  The precise terms and conditions for copying, distribution and\n\
+modification follow.\n\
+\n\
+                    GNU GENERAL PUBLIC LICENSE\n\
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\
+\n\
+  0. This License applies to any program or other work which contains\n\
+a notice placed by the copyright holder saying it may be distributed\n\
+under the terms of this General Public License.  The "Program", below,\n\
+refers to any such program or work, and a "work based on the Program"\n\
+means either the Program or any derivative work under copyright law:\n\
+that is to say, a work containing the Program or a portion of it,\n\
+either verbatim or with modifications and/or translated into another\n\
+language.  (Hereinafter, translation is included without limitation in\n'),
+  next_or_quit,
+  write('\
+the term "modification".)  Each licensee is addressed as "you".\n\
+\n\
+Activities other than copying, distribution and modification are not\n\
+covered by this License; they are outside its scope.  The act of\n\
+running the Program is not restricted, and the output from the Program\n\
+is covered only if its contents constitute a work based on the\n\
+Program (independent of having been made by running the Program).\n\
+Whether that is true depends on what the Program does.\n\
+\n\
+  1. You may copy and distribute verbatim copies of the Program''s\n\
+source code as you receive it, in any medium, provided that you\n\
+conspicuously and appropriately publish on each copy an appropriate\n\
+copyright notice and disclaimer of warranty; keep intact all the\n\
+notices that refer to this License and to the absence of any warranty;\n\
+and give any other recipients of the Program a copy of this License\n\
+along with the Program.\n\
+\n\
+You may charge a fee for the physical act of transferring a copy, and\n\
+you may at your option offer warranty protection in exchange for a fee.\n\
+\n\
+  2. You may modify your copy or copies of the Program or any portion\n\
+of it, thus forming a work based on the Program, and copy and\n\
+distribute such modifications or work under the terms of Section 1\n'),
+  next_or_quit,
+  write('\
+above, provided that you also meet all of these conditions:\n\
+\n\
+    a) You must cause the modified files to carry prominent notices\n\
+    stating that you changed the files and the date of any change.\n\
+\n\
+    b) You must cause any work that you distribute or publish, that in\n\
+    whole or in part contains or is derived from the Program or any\n\
+    part thereof, to be licensed as a whole at no charge to all third\n\
+    parties under the terms of this License.\n\
+\n\
+    c) If the modified program normally reads commands interactively\n\
+    when run, you must cause it, when started running for such\n\
+    interactive use in the most ordinary way, to print or display an\n\
+    announcement including an appropriate copyright notice and a\n\
+    notice that there is no warranty (or else, saying that you provide\n\
+    a warranty) and that users may redistribute the program under\n\
+    these conditions, and telling the user how to view a copy of this\n\
+    License.  (Exception: if the Program itself is interactive but\n\
+    does not normally print such an announcement, your work based on\n\
+    the Program is not required to print an announcement.)\n\
+\n\
+These requirements apply to the modified work as a whole.  If\n\
+identifiable sections of that work are not derived from the Program,\n'),
+  next_or_quit,
+  write('\
+and can be reasonably considered independent and separate works in\n\
+themselves, then this License, and its terms, do not apply to those\n\
+sections when you distribute them as separate works.  But when you\n\
+distribute the same sections as part of a whole which is a work based\n\
+on the Program, the distribution of the whole must be on the terms of\n\
+this License, whose permissions for other licensees extend to the\n\
+entire whole, and thus to each and every part regardless of who wrote it.\n\
+\n\
+Thus, it is not the intent of this section to claim rights or contest\n\
+your rights to work written entirely by you; rather, the intent is to\n\
+exercise the right to control the distribution of derivative or\n\
+collective works based on the Program.\n\
+\n\
+In addition, mere aggregation of another work not based on the Program\n\
+with the Program (or with a work based on the Program) on a volume of\n\
+a storage or distribution medium does not bring the other work under\n\
+the scope of this License.\n\
+\n\
+  3. You may copy and distribute the Program (or a work based on it,\n\
+under Section 2) in object code or executable form under the terms of\n\
+Sections 1 and 2 above provided that you also do one of the following:\n\
+\n\
+    a) Accompany it with the complete corresponding machine-readable\n'),
+  next_or_quit,
+  write('\
+    source code, which must be distributed under the terms of Sections\n\
+    1 and 2 above on a medium customarily used for software interchange; or,\n\
+\n\
+    b) Accompany it with a written offer, valid for at least three\n\
+    years, to give any third party, for a charge no more than your\n\
+    cost of physically performing source distribution, a complete\n\
+    machine-readable copy of the corresponding source code, to be\n\
+    distributed under the terms of Sections 1 and 2 above on a medium\n\
+    customarily used for software interchange; or,\n\
+\n\
+    c) Accompany it with the information you received as to the offer\n\
+    to distribute corresponding source code.  (This alternative is\n\
+    allowed only for noncommercial distribution and only if you\n\
+    received the program in object code or executable form with such\n\
+    an offer, in accord with Subsection b above.)\n\
+\n\
+The source code for a work means the preferred form of the work for\n\
+making modifications to it.  For an executable work, complete source\n\
+code means all the source code for all modules it contains, plus any\n\
+associated interface definition files, plus the scripts used to\n\
+control compilation and installation of the executable.  However, as a\n\
+special exception, the source code distributed need not include\n\
+anything that is normally distributed (in either source or binary\n'),
+  next_or_quit,
+  write('\
+form) with the major components (compiler, kernel, and so on) of the\n\
+operating system on which the executable runs, unless that component\n\
+itself accompanies the executable.\n\
+\n\
+If distribution of executable or object code is made by offering\n\
+access to copy from a designated place, then offering equivalent\n\
+access to copy the source code from the same place counts as\n\
+distribution of the source code, even though third parties are not\n\
+compelled to copy the source along with the object code.\n\
+\n\
+  4. You may not copy, modify, sublicense, or distribute the Program\n\
+except as expressly provided under this License.  Any attempt\n\
+otherwise to copy, modify, sublicense or distribute the Program is\n\
+void, and will automatically terminate your rights under this License.\n\
+However, parties who have received copies, or rights, from you under\n\
+this License will not have their licenses terminated so long as such\n\
+parties remain in full compliance.\n\
+\n\
+  5. You are not required to accept this License, since you have not\n\
+signed it.  However, nothing else grants you permission to modify or\n\
+distribute the Program or its derivative works.  These actions are\n\
+prohibited by law if you do not accept this License.  Therefore, by\n\
+modifying or distributing the Program (or any work based on the\n'),
+  next_or_quit,
+  write('\
+Program), you indicate your acceptance of this License to do so, and\n\
+all its terms and conditions for copying, distributing or modifying\n\
+the Program or works based on it.\n\
+\n\
+  6. Each time you redistribute the Program (or any work based on the\n\
+Program), the recipient automatically receives a license from the\n\
+original licensor to copy, distribute or modify the Program subject to\n\
+these terms and conditions.  You may not impose any further\n\
+restrictions on the recipients'' exercise of the rights granted herein.\n\
+You are not responsible for enforcing compliance by third parties to\n\
+this License.\n\
+\n\
+  7. If, as a consequence of a court judgment or allegation of patent\n\
+infringement or for any other reason (not limited to patent issues),\n\
+conditions are imposed on you (whether by court order, agreement or\n\
+otherwise) that contradict the conditions of this License, they do not\n\
+excuse you from the conditions of this License.  If you cannot\n\
+distribute so as to satisfy simultaneously your obligations under this\n\
+License and any other pertinent obligations, then as a consequence you\n\
+may not distribute the Program at all.  For example, if a patent\n\
+license would not permit royalty-free redistribution of the Program by\n\
+all those who receive copies directly or indirectly through you, then\n\
+the only way you could satisfy both it and this License would be to\n'),
+  next_or_quit,
+  write('\
+refrain entirely from distribution of the Program.\n\
+\n\
+If any portion of this section is held invalid or unenforceable under\n\
+any particular circumstance, the balance of the section is intended to\n\
+apply and the section as a whole is intended to apply in other\n\
+circumstances.\n\
+\n\
+It is not the purpose of this section to induce you to infringe any\n\
+patents or other property right claims or to contest validity of any\n\
+such claims; this section has the sole purpose of protecting the\n\
+integrity of the free software distribution system, which is\n\
+implemented by public license practices.  Many people have made\n\
+generous contributions to the wide range of software distributed\n\
+through that system in reliance on consistent application of that\n\
+system; it is up to the author/donor to decide if he or she is willing\n\
+to distribute software through any other system and a licensee cannot\n\
+impose that choice.\n\
+\n\
+This section is intended to make thoroughly clear what is believed to\n\
+be a consequence of the rest of this License.\n\
+\n\
+  8. If the distribution and/or use of the Program is restricted in\n\
+certain countries either by patents or by copyrighted interfaces, the\n'),
+  next_or_quit,
+  write('\
+original copyright holder who places the Program under this License\n\
+may add an explicit geographical distribution limitation excluding\n\
+those countries, so that distribution is permitted only in or among\n\
+countries not thus excluded.  In such case, this License incorporates\n\
+the limitation as if written in the body of this License.\n\
+\n\
+  9. The Free Software Foundation may publish revised and/or new versions\n\
+of the General Public License from time to time.  Such new versions will\n\
+be similar in spirit to the present version, but may differ in detail to\n\
+address new problems or concerns.\n\
+\n\
+Each version is given a distinguishing version number.  If the Program\n\
+specifies a version number of this License which applies to it and "any\n\
+later version", you have the option of following the terms and conditions\n\
+either of that version or of any later version published by the Free\n\
+Software Foundation.  If the Program does not specify a version number of\n\
+this License, you may choose any version ever published by the Free Software\n\
+Foundation.\n\
+\n\
+  10. If you wish to incorporate parts of the Program into other free\n\
+programs whose distribution conditions are different, write to the author\n\
+to ask for permission.  For software which is copyrighted by the Free\n\
+Software Foundation, write to the Free Software Foundation; we sometimes\n'),
+  next_or_quit,
+  write('\
+make exceptions for this.  Our decision will be guided by the two goals\n\
+of preserving the free status of all derivatives of our free software and\n\
+of promoting the sharing and reuse of software generally.\n'),
+    !.
+show_copying.
+
+show_warranty :-
+  write('\
+                            NO WARRANTY\n\
+\n\
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n\
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\n\
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n\
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n\
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n\
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\n\
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\n\
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n\
+REPAIR OR CORRECTION.\n\
+\n\
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n\
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n\
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n\
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n\
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n\
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n\
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n\
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n\
+POSSIBILITY OF SUCH DAMAGES.\n').
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Startup %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+common_main :-
+  write('\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\n'),
+  main_loop.
diff --git a/interfaces/Prolog/tests/clpq2.pl b/interfaces/Prolog/tests/clpq2.pl
new file mode 100644
index 0000000..5853afe
--- /dev/null
+++ b/interfaces/Prolog/tests/clpq2.pl
@@ -0,0 +1,1119 @@
+% A toy, non-ground meta-interpreter for CLP(Q)
+% for testing the Parma Polyhedra Library and its Prolog interface.
+%
+% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This file is part of the Parma Polyhedra Library (PPL).
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 2 of the License, or (at your
+% option) any later version.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+% Object-level clauses are stored as user_clause(Head, Body) facts.
+:- dynamic(user_clause/2).
+
+% solve_query(+Goals, +Variable_Name_Table, -Polyhedra)
+%
+% Tries to solve the query 'Goals'.
+% 'Variable_Name_Table' is a list of input variable names and
+% the corresponding variable.
+% 'Polyhedra' are the live polyhedra; the head of the list
+% represents the result of the computation.
+
+solve_query(Goals, VN, Polys_Out) :-
+  % The initial polyhedron is initialised with 0 dimensions
+  % We use the NNC topology so that we can handle strict constraints.
+  Topology = nnc,
+  ppl_new_NNC_Polyhedron_from_space_dimension(0, universe, Poly),
+  % On backtracking, clean up the unwanted polyhedron
+  cleanup(Poly),
+
+  % Try to reduce `Goals'.
+  solve(Topology, Goals, [Poly], Polys_Out2),
+
+  % Use the last polyhedron `Poly_Out' that has been added to the list
+  % for generating the resulting set of constraints.
+  Polys_Out2 = [Poly_Out|_],
+  ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly_Out, Q),
+  % On backtracking, clean up the unwanted polyhedron
+  cleanup(Q),
+
+  % Now find and sort all the PPL dimensions for variables
+  % that occur in bindings to external variables.
+  terms2wanted_dims(VN, [], Num_List),
+  sort(Num_List, Sorted_Num_List),
+
+  % We want to remove (project away) all other dimensions.
+  ppl_Polyhedron_space_dimension(Q, Dims),
+  get_unwanted_dims(Sorted_Num_List, Dims, Unwanted_PPL_Vars),
+  ppl_Polyhedron_remove_space_dimensions(Q, Unwanted_PPL_Vars),
+
+  % Get the constraints.
+  ppl_Polyhedron_get_constraints(Q, CS),
+
+  % Print the result.
+  write_bindings(VN, Sorted_Num_List),
+  write_constraints(CS, Sorted_Num_List, VN),
+  Polys_Out = [Q|Polys_Out2].
+
+solve(_, true, Polys, Polys) :-
+  % If the goal is true, we can return the input list of
+  % non-empty polyhedron as output.
+  % The head of the list will contain the solution to the query.
+  !.
+
+solve(T, (A, B), Polys_In, Polys_Out) :-
+  !,
+  % Conjunction is solved using the output list of non-empty
+  % polyhedra from the first component for input to the second.
+  solve(T, A, Polys_In, Polys_Tmp),
+  solve(T, B, Polys_Tmp, Polys_Out).
+
+solve(T, (A; B), Polys_In, Polys_Out) :-
+  !,
+  % Disjunction is dealt with by making a copy of the polyhedron
+  % before starting each branch.
+  Polys_In = [Poly|_],
+  (
+    (
+      ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly, Q),
+      % On backtracking, clean up the unwanted polyhedron
+      cleanup(Q),
+      solve(T, A, [Q|Polys_In], Polys_Out)
+    )
+  ;
+    (
+      ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly, Q),
+      % On backtracking, we clean up the unwanted polyhedron
+      cleanup(Q),
+      solve(T, B, [Q|Polys_In], Polys_Out)
+    )
+  ).
+
+solve(_, {}, Polys, Polys) :-
+  % If the goal is an empty set of constraints, then this is
+  % the same as for `true' and we can return the input list of
+  % non-empty polyhedron as output.
+  !.
+
+solve(_, { Constraints }, [Poly|Polys], [Poly|Polys]) :-
+  !,
+  % Solve the constraints using the constraint solver.
+  % Rename the selected clause apart and extend the polyhedron.
+  ppl_Polyhedron_space_dimension(Poly, Dims),
+
+  % Change any free variables into PPL variables.
+  term2PPLterm(Constraints, Dims, New_Dims),
+  Added_Dims is New_Dims - Dims,
+  ppl_Polyhedron_add_space_dimensions_and_embed(Poly, Added_Dims),
+
+  % Make the sequence of constraints into a list
+  % and check we do have constraints.
+  constraints2list(Constraints, Constraints_List),
+
+  % Fails if `Poly' becomes empty.
+  ppl_Polyhedron_add_constraints_and_minimize(Poly, Constraints_List).
+
+% Built-ins may be added here.
+
+% read/1
+solve(_, read(N), Polys, Polys) :-
+  !,
+  read(N),
+  get_code(user_input, _C).
+
+% write/1
+solve(_, write(Message), Polys, Polys) :-
+  !,
+  write(Message).
+
+% nl/0
+solve(_, nl, Polys, Polys) :-
+  !,
+  nl.
+
+solve(Topology, Atom, [Poly|Polys], Polys_Out) :-
+  % Here is a choicepoint: possibly different clauses
+  % will be selected on backtracking.
+  % NOTE: we may fail to find (another) clause,
+  %       but we have allocated nothing yet.
+  select_clause(Atom, Head, Body),
+  ppl_Polyhedron_space_dimension(Poly, Dims),
+
+  % Copy the current polyhedron and work on the copy.
+  ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly, Poly_Copy),
+  % On backtracking, clean up the unwanted polyhedron
+  cleanup(Poly_Copy),
+
+  % Parameter passing.
+  parameter_passing(Atom, Head, Binding_Constraints),
+
+  % Change any free variables into PPL variables.
+  terms2PPLterms(Binding_Constraints, Dims, New_Dims),
+  Added_Dims is New_Dims - Dims,
+  ppl_Polyhedron_add_space_dimensions_and_embed(Poly_Copy, Added_Dims),
+
+  % First solve the parameter passing equations.
+  ppl_Polyhedron_add_constraints_and_minimize(Poly_Copy, Binding_Constraints),
+  % Then solve the body.
+  solve(Topology, Body, [Poly_Copy, Poly|Polys], Polys_Soln_Out),
+
+  % Now remove any dimensions that are higher than
+  % previously and higher than any PPL variables in the atom.
+  term2wanted_dims(Atom, [], Num_List),
+  Max_Wanted1 is Dims - 1,
+  max(Num_List, Max_Wanted1, Max_Wanted),
+  Un_Wanted is Max_Wanted + 1,
+
+  % Copy the current polyhedron and work on the copy.
+  Polys_Soln_Out = [Poly_Soln|_],
+  ppl_new_C_Polyhedron_from_C_Polyhedron(Poly_Soln, Poly_Soln_Copy),
+  % On backtracking, clean up the unwanted polyhedron
+  cleanup(Poly_Soln_Copy),
+
+  % We want to remove (project away) all other dimensions.
+  ppl_Polyhedron_remove_higher_space_dimensions(Poly_Soln_Copy, Un_Wanted),
+
+  % The list of live polyhedra must be returned.
+  Polys_Out = [Poly_Soln_Copy|Polys_Soln_Out].
+
+parameter_passing(Atom, Head, Bindings) :-
+  Atom =.. [_|Actuals],
+  Head =.. [_|Formals],
+  parameter_passing_terms(Actuals, Formals, Bindings).
+
+% When the direct binding exists, we use unification.
+% Otherwise, we add the constraint.
+% By only adding new variables when needed, the computation
+% is much more efficient.
+parameter_passing_terms([], [], []).
+parameter_passing_terms([A|Actuals], [F|Formals], New_Bindings) :-
+  parameter_passing_terms(Actuals, Formals, Bindings),
+  (int_expr(F) ->
+    F1 is F
+  ;
+    F1 = F
+  ),
+  (A = F1 ->
+    New_Bindings = Bindings
+  ;
+    parameter_passing_term(A, F1, Bindings, New_Bindings)
+  ).
+
+parameter_passing_term(A, F, Bindings, New_Bindings) :-
+  ((int_expr(A) ; int_expr(F) ; A = '$VAR'(_) ; F = '$VAR'(_)) ->
+    New_Bindings = [(A = F)|Bindings]
+  ;
+    A =.. [AFunct|Aargs],
+    F =.. [FFunct|Fargs],
+    (AFunct == FFunct ->
+      % Functors agree so we process the arguments.
+      parameter_passing_terms(Aargs, Fargs, Bindings1),
+      append(Bindings1, Bindings, New_Bindings)
+    ;
+      % Unification fails so we force the constraints to fail.
+      New_Bindings = [0 = 1]
+    )
+  ).
+
+select_clause(Atom, Head, Body) :-
+  functor(Atom, F, N),
+  functor(Head, F, N),
+  user_clause(Head, Body).
+
+delete_all_polyhedra([]).
+delete_all_polyhedra([Polyhedron|Polyhedra]):-
+  ppl_delete_Polyhedron(Polyhedron),
+  delete_all_polyhedra(Polyhedra).
+
+% To prevent leaks:
+% First succeed and then, on backtracking,
+% remove the unwanted polyhedron before failing.
+cleanup(_Polyhedron).
+cleanup(Polyhedron) :-
+  ppl_delete_Polyhedron(Polyhedron),
+  fail.
+
+%%%%%%%%%%%%%%%%%% Query the User for More Solutions %%%%%%%%%%%%%%%%%%%
+
+query_next_solution :-
+  write(' more? '),
+  repeat,
+  flush_output(user_output),
+  get_code(user_input, C),
+  (
+    C == 59,
+    % Get rid of the EOL character.
+    get_code(user_input, _EOL)
+  ;
+    C == 10
+  ;
+    write('Action (";" for more choices, otherwise <return>): '),
+    eat_to_eol,
+    fail
+  ),
+  !,
+  C = 10.
+
+eat_to_eol :-
+  get_code(user_input, C),
+  (C == 10 ->
+    true
+  ;
+    eat_to_eol
+  ).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%% Reading Programs %%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+open_file_for_reading(File, Stream) :-
+  catch(open(File, read, Stream), _, fail).
+
+read_programs([]).
+read_programs([P|Ps]) :-
+  read_program(P),
+  read_programs(Ps).
+
+read_program(Program) :-
+  (atom(Program) ->
+    true
+  ;
+    write_error(['read_program/1 - arg 1: expected file name, found ',
+                 Program]),
+    fail
+  ),
+  (open_file_for_reading(Program, Stream) ->
+    File_Name = Program
+  ;
+    atom_concat(Program, '.clpq', File_Name),
+    (open_file_for_reading(File_Name, Stream) ->
+      true
+    ;
+      write_error(['read_program/1 - arg 1: file ',
+                   Program, ' does not exist']),
+      fail
+    )
+  ),
+  (read_clauses(Stream) ->
+    close(Stream)
+  ;
+    write_error(['read_program/1 - arg 1: syntax error reading ', Program]),
+    close(Stream),
+    fail
+  ).
+
+read_clauses(Stream) :-
+  read(Stream, Clause),
+  (Clause \== end_of_file ->
+    (Clause = (Head :- Body) ->
+      assertz(user_clause(Head, Body))
+    ;
+      assertz(user_clause(Clause, true))
+    ),
+    read_clauses(Stream)
+  ;
+    true
+  ).
+
+%%%%%%%%%%%%%%%%%%%%% The Interaction Loop %%%%%%%%%%%%%%%%%%%%%%
+
+write_error(Message) :-
+  write('clpq error: '),
+  write_error_aux(Message).
+
+write_error_aux([]) :-
+  nl.
+write_error_aux([H|T]) :-
+  write(H),
+  write_error_aux(T).
+
+main_loop :-
+  write('PPL clpq ?- '),
+  read_term(Command, [variable_names(VN)]),
+  eat_eol,
+  catch(do_command(Command, VN),
+	Exception,
+	(print_exception_term(Exception), main_loop_no)).
+
+print_exception_term(ppl_overflow_error(Cause)) :-
+  nl,
+  write('Error: an overflow has been detected by the PPL: '),
+  write(Cause),
+  nl,
+  !.
+
+print_exception_term(Exception) :-
+  nl,
+  writeq(Exception),
+  nl.
+
+clear_program :-
+  retract(user_clause(_, _)),
+  fail.
+clear_program.
+
+list_program :-
+  user_clause(Head, Body),
+  pp(Head, Body),
+  fail.
+list_program.
+
+pp(Head, Body) :-
+  % write(Head),
+  (Body == true ->
+    % write('.')
+    portray_clause(Head)
+  ;
+    % write(' :- '),
+    % write(Body)
+    portray_clause((Head :- Body))
+  ),
+  nl.
+
+do_command(end_of_file, _VN) :-
+  !.
+do_command(halt, _VN) :-
+  !,
+  clear_program.
+do_command(warranty, _VN) :-
+  !,
+  show_warranty,
+  main_loop_yes.
+do_command(copying, _VN) :-
+  !,
+  show_copying,
+  main_loop_yes.
+do_command(trace, _VN) :-
+  !,
+  trace,
+  main_loop_yes.
+do_command(notrace, _VN) :-
+  !,
+  notrace,
+  main_loop_yes.
+do_command(debug, _VN) :-
+  !,
+  debug,
+  main_loop_yes.
+do_command(nodebug, _VN) :-
+  !,
+  nodebug,
+  main_loop_yes.
+do_command(spy(Spec), _VN) :-
+  !,
+  spy(Spec),
+  main_loop_yes.
+do_command(nospy(Spec), _VN) :-
+  !,
+  nospy(Spec),
+  main_loop_yes.
+do_command(nospyall, _VN) :-
+  !,
+  nospyall,
+  main_loop_yes.
+do_command([], _VN) :-
+  !,
+  (read_programs([]) ; true),
+  main_loop_yes.
+do_command([H|T], _VN) :-
+  !,
+  (read_programs([H|T]); true),
+  main_loop_yes.
+do_command(consult(Program), _VN) :-
+  !,
+  (read_program(Program) ; true),
+  main_loop_yes.
+do_command(reconsult(Program), _VN) :-
+  !,
+  clear_program,
+  do_command(consult(Program), _VN).
+do_command(listing, _VN) :-
+  !,
+  list_program,
+  main_loop_yes.
+do_command(statistics, _VN) :-
+  !,
+  statistics,
+  main_loop_yes.
+
+do_command(Query, VN) :-
+  solve_query(Query, VN, Polys_Out),
+  % See if the user wants to look for more solutions.
+  query_next_solution,
+  % When finished, remove remaining polyhedra.
+  delete_all_polyhedra(Polys_Out),
+  main_loop_yes.
+
+do_command(_, _VN) :-
+  main_loop_no.
+
+main_loop_no :-
+  write(no),
+  nl,
+  main_loop.
+
+main_loop_yes :-
+  write(yes),
+  nl,
+  main_loop.
+
+%%%%%%%%%%%%%%%%% Writing Computed Answer Constraints %%%%%%%%%%%%%%%%%%
+
+write_var('$VAR'(N), _Name_List) :-
+  write('_'),
+  write('$VAR'(N)).
+
+negate_expr(Num*Var, Neg_Expr) :-
+  (Num < 0 ->
+    Neg_Num is -Num,
+    Neg_Expr = Neg_Num*Var
+  ;
+    Neg_Expr = Num*Var
+  ).
+negate_expr(Expr1 + Expr2, Neg_Expr1 + Neg_Expr2) :-
+  negate_expr(Expr1, Neg_Expr1),
+  negate_expr(Expr2, Neg_Expr2).
+
+write_expr('$VAR'(N), Var_List, VN) :-
+  !,
+  position2element(N, Var_List, M),
+  (member((A = '$VAR'(M)), VN) ->
+    write(A)
+  ;
+    write('_'),
+    write('$VAR'(N))
+  ).
+%write_expr('$VAR'(N), Variable_Names) :-
+%  write_var('$VAR'(N), Variable_Names).
+write_expr(Num*Var, Variable_Names, VN) :-
+  (Num =:= 1 ->
+    true
+  ;
+    (Num =:= -1 ->
+      write('-')
+    ;
+      write(Num),
+      write('*')
+    )
+  ),
+  write_expr(Var, Variable_Names, VN).
+write_expr(E + Num*Var, Variable_Names, VN) :-
+  write_expr(E, Variable_Names, VN),
+  (Num < 0 ->
+    write(' - '),
+    Neg_Num is -Num,
+    write_expr(Neg_Num*Var, Variable_Names, VN)
+  ;
+    write(' + '),
+    write_expr(Num*Var, Variable_Names, VN)
+  ).
+
+write_constraint(Expr = Num, Variable_Names, VN) :-
+  (var(Num) ->
+    fail
+  ;
+    write_expr(Expr, Variable_Names, VN),
+    write(' = '),
+    (integer(Num) ->
+      write(Num)
+    ;
+      Num = rat(Int, 1),
+      write(Int)
+    )
+  ).
+write_constraint(Expr >= Num, Variable_Names, VN) :-
+  (Num < 0 ->
+    negate_expr(Expr, Neg_Expr),
+    write_expr(Neg_Expr, Variable_Names, VN),
+    write(' =< '),
+      Neg_Num is -Num,
+    write(Neg_Num)
+  ;
+    write_expr(Expr, Variable_Names, VN),
+    write(' >= '),
+    write(Num)
+  ).
+write_constraint(Expr > Num, Variable_Names, VN) :-
+  (Num < 0 ->
+    negate_expr(Expr, Neg_Expr),
+    write_expr(Neg_Expr, Variable_Names, VN),
+    write(' < '),
+    Neg_Num is -Num,
+    write(Neg_Num)
+  ;
+    write_expr(Expr, Variable_Names, VN),
+    write(' > '),
+    write(Num)
+  ).
+
+write_constraints([], _Variable_Names, _VN).
+write_constraints([C|CS], Variable_Names, VN) :-
+  (write_constraint(C, Variable_Names, VN) ->
+    nl
+  ;
+    true
+  ),
+  write_constraints(CS, Variable_Names, VN).
+
+write_bindings([], _Var_List).
+write_bindings([(A = Term)|VN], Var_List) :-
+  (var(Term) ->
+    (write(A), write(' = '), write(Term),
+    nl)
+  ;
+    (Term = '$VAR'(_) ->
+      true
+    ;
+      (write(A),
+      write(' = '),
+      write_termexpr(Term, Var_List),
+      nl)
+    )
+  ),
+  write_bindings(VN, Var_List).
+
+write_termexpr('$VAR'(N), Var_List) :-
+  !,
+  element2position(N, Var_List, M),
+  write('_'),
+  write('$VAR'(M)).
+write_termexpr(Term, _Var_List) :-
+  int_expr(Term),
+  !,
+  N is Term,
+  write(N).
+write_termexpr(Term, Var_List) :-
+  Term = [_|_],
+  !,
+  write('['),
+  write_listexprs(Term, Var_List),
+  write(']').
+write_termexpr(Term, Var_List) :-
+  Term =.. [F|Args],
+  (Args = [] ->
+    write(F)
+  ;
+    write(F),
+    write('('),
+    write_termexprs(Args, Var_List),
+    write(')')
+  ).
+write_termexprs([], _Var_List).
+write_termexprs([Term|Terms], Var_List) :-
+  write_termexpr(Term, Var_List),
+  (Terms \= [] ->
+    write(',')
+  ;
+    true
+  ),
+  write_termexprs(Terms, Var_List).
+
+write_listexprs(Terms, _Var_List) :-
+  var(Terms),
+  !,
+  write('|'),
+  write(Terms).
+write_listexprs([], _Var_List) :-
+  !.
+write_listexprs([Term|Terms], Var_List) :-
+  write_termexpr(Term, Var_List),
+  ((Terms == []; var(Terms)) ->
+    true
+  ;
+    write(',')
+  ),
+  write_listexprs(Terms, Var_List).
+
+int_expr(I) :-
+  nonvar(I),
+  int_expr_aux(I).
+int_expr_aux(I) :-
+  integer(I),
+  !.
+int_expr_aux(I+J) :-
+  !,
+  int_expr(I),
+  int_expr(J).
+int_expr_aux(I-J) :-
+  !,
+  int_expr(I),
+  int_expr(J).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%% Utility Predicates %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% term2wanted_dims(?Term, -List_of_Integers)
+%
+% Takes a term and returns list of numbers in the PPL variables
+% of the form '$VAR'(k).
+
+term2wanted_dims(V, Ns, Ns) :-
+  var(V),
+  !.
+term2wanted_dims('$VAR'(N), Ns, [N|Ns]) :-
+  !.
+term2wanted_dims(Term, Ns_In, Ns_Out) :-
+  Term =.. [_F|Args],
+  terms2wanted_dims(Args, Ns_In, Ns_Out).
+
+terms2wanted_dims([], Ns, Ns).
+terms2wanted_dims([Arg|Args], Ns_In, Ns_Out) :-
+  term2wanted_dims(Arg, Ns_In, Ns1),
+  terms2wanted_dims(Args, Ns1, Ns_Out).
+
+constraints2list(C, LC) :-
+  constraints2list(C, [], LC).
+
+constraints2list((A, B), Rest, LC) :-
+  !,
+  constraints2list(B, Rest, BRest),
+  constraints2list(A, BRest, LC).
+constraints2list(C, Rest, Rest1) :-
+  (check_constraint(C) ->
+    Rest1 = [C|Rest]
+  ;
+    Rest1 = [0 = 1]
+  ).
+
+% term2PPLterm(?Term, +In_N, ?Out_N)
+%
+% Unifies each of the variables in Term with the special terms
+% '$VAR'(k), where k ranges from In_N to Out_N-1.
+term2PPLterm('$VAR'(In_N), In_N, Out_N) :-
+  !,
+  Out_N is In_N + 1.
+term2PPLterm(Term, In_N, Out_N) :-
+  Term =.. [_|Args],
+  terms2PPLterms(Args, In_N, Out_N).
+
+terms2PPLterms([], In_N, In_N).
+terms2PPLterms([Arg|Args], In_N, Out_N) :-
+  term2PPLterm(Arg, In_N, Tmp_N),
+  terms2PPLterms(Args, Tmp_N, Out_N).
+
+build_equality_constraints([], []).
+build_equality_constraints([Var = Num|Eqs], All_Eq_Constrs) :-
+  build_equality_constraints(Eqs, Eq_Constrs),
+  (nonvar(Num) ->
+    Num = rat(Int, 1),
+    All_Eq_Constrs = [Var = Int|Eq_Constrs]
+  ;
+    All_Eq_Constrs = Eq_Constrs
+  ).
+
+check_expr('$VAR'(_)).
+check_expr(Num) :-
+  integer(Num).
+check_expr(Num*Var) :-
+  integer(Num),
+  check_expr(Var).
+check_expr(Var*Num) :-
+  integer(Num),
+  check_expr(Var).
+check_expr(E + F) :-
+  check_expr(E),
+  check_expr(F).
+check_expr(E - F) :-
+  check_expr(E),
+  check_expr(F).
+
+check_constraint(Expr = Expr1) :-
+  check_expr(Expr),
+  check_expr(Expr1).
+check_constraint(Expr >= Expr1) :-
+  check_expr(Expr),
+  check_expr(Expr1).
+check_constraint(Expr > Expr1) :-
+  check_expr(Expr),
+  check_expr(Expr1).
+check_constraint(Expr =< Expr1) :-
+  check_expr(Expr),
+  check_expr(Expr1).
+check_constraint(Expr < Expr1) :-
+  check_expr(Expr),
+  check_expr(Expr1).
+
+get_unwanted_dims(Wanted, D, Unwanted) :-
+  get_unwanted_dims(Wanted, 0, D, Unwanted).
+
+get_unwanted_dims(_, S, D, []) :-
+  S >= D,
+  !.
+get_unwanted_dims(Wanted, S, D, Unwanted) :-
+  S1 is S + 1,
+  get_unwanted_dims(Wanted, S1, D, Unwanted1),
+  (member(S, Wanted) ->
+    Unwanted = Unwanted1
+  ;
+    Unwanted = ['$VAR'(S)|Unwanted1]
+  ).
+
+element2position(N, Ns, I) :-
+  element2position(N, Ns, 0, I).
+element2position(N, [N|_], I, I) :-
+  !.
+element2position(N, [_M|Ns], Iin, Iout) :-
+  I1 is Iin + 1,
+  element2position(N, Ns, I1, Iout).
+
+position2element(0, [N|_], N) :-
+  !.
+position2element(I, [_M|Ns], N) :-
+  I1 is I - 1,
+  position2element(I1, Ns, N).
+
+max([], M, M) :- !.
+max([L|Ls], M, Max) :-
+  L =< M,
+  !,
+  max(Ls, M, Max).
+max([L|Ls], M, Max) :-
+  L > M,
+  max(Ls, L, Max).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Legalese %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+next_or_quit :-
+  write('---Type <return> to continue, or q <return> to quit---'),
+  flush_output(user_output),
+  get_code(user_input, C),
+  (
+    C == 10
+  ;
+    eat_eol
+  ),
+  !,
+  C \== 113.
+
+show_copying :-
+  eat_eol,
+  write('\
+                    GNU GENERAL PUBLIC LICENSE\n\
+                       Version 2, June 1991\n\
+\n\
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n\
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n\
+ Everyone is permitted to copy and distribute verbatim copies\n\
+ of this license document, but changing it is not allowed.\n\
+\n\
+                            Preamble\n\
+\n\
+  The licenses for most software are designed to take away your\n\
+freedom to share and change it.  By contrast, the GNU General Public\n\
+License is intended to guarantee your freedom to share and change free\n\
+software--to make sure the software is free for all its users.  This\n\
+General Public License applies to most of the Free Software\n\
+Foundation''s software and to any other program whose authors commit to\n\
+using it.  (Some other Free Software Foundation software is covered by\n\
+the GNU Library General Public License instead.)  You can apply it to\n\
+your programs, too.\n\
+\n\
+  When we speak of free software, we are referring to freedom, not\n\
+price.  Our General Public Licenses are designed to make sure that you\n\
+have the freedom to distribute copies of free software (and charge for\n'),
+  next_or_quit,
+  write('\
+this service if you wish), that you receive source code or can get it\n\
+if you want it, that you can change the software or use pieces of it\n\
+in new free programs; and that you know you can do these things.\n\
+\n\
+  To protect your rights, we need to make restrictions that forbid\n\
+anyone to deny you these rights or to ask you to surrender the rights.\n\
+These restrictions translate to certain responsibilities for you if you\n\
+distribute copies of the software, or if you modify it.\n\
+\n\
+  For example, if you distribute copies of such a program, whether\n\
+gratis or for a fee, you must give the recipients all the rights that\n\
+you have.  You must make sure that they, too, receive or can get the\n\
+source code.  And you must show them these terms so they know their\n\
+rights.\n\
+\n\
+  We protect your rights with two steps: (1) copyright the software, and\n\
+(2) offer you this license which gives you legal permission to copy,\n\
+distribute and/or modify the software.\n\
+\n\
+  Also, for each author''s protection and ours, we want to make certain\n\
+that everyone understands that there is no warranty for this free\n\
+software.  If the software is modified by someone else and passed on, we\n\
+want its recipients to know that what they have is not the original, so\n'),
+  next_or_quit,
+  write('\
+that any problems introduced by others will not reflect on the original\n\
+authors'' reputations.\n\
+\n\
+  Finally, any free program is threatened constantly by software\n\
+patents.  We wish to avoid the danger that redistributors of a free\n\
+program will individually obtain patent licenses, in effect making the\n\
+program proprietary.  To prevent this, we have made it clear that any\n\
+patent must be licensed for everyone''s free use or not licensed at all.\n\
+\n\
+  The precise terms and conditions for copying, distribution and\n\
+modification follow.\n\
+\n\
+                    GNU GENERAL PUBLIC LICENSE\n\
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\
+\n\
+  0. This License applies to any program or other work which contains\n\
+a notice placed by the copyright holder saying it may be distributed\n\
+under the terms of this General Public License.  The "Program", below,\n\
+refers to any such program or work, and a "work based on the Program"\n\
+means either the Program or any derivative work under copyright law:\n\
+that is to say, a work containing the Program or a portion of it,\n\
+either verbatim or with modifications and/or translated into another\n\
+language.  (Hereinafter, translation is included without limitation in\n'),
+  next_or_quit,
+  write('\
+the term "modification".)  Each licensee is addressed as "you".\n\
+\n\
+Activities other than copying, distribution and modification are not\n\
+covered by this License; they are outside its scope.  The act of\n\
+running the Program is not restricted, and the output from the Program\n\
+is covered only if its contents constitute a work based on the\n\
+Program (independent of having been made by running the Program).\n\
+Whether that is true depends on what the Program does.\n\
+\n\
+  1. You may copy and distribute verbatim copies of the Program''s\n\
+source code as you receive it, in any medium, provided that you\n\
+conspicuously and appropriately publish on each copy an appropriate\n\
+copyright notice and disclaimer of warranty; keep intact all the\n\
+notices that refer to this License and to the absence of any warranty;\n\
+and give any other recipients of the Program a copy of this License\n\
+along with the Program.\n\
+\n\
+You may charge a fee for the physical act of transferring a copy, and\n\
+you may at your option offer warranty protection in exchange for a fee.\n\
+\n\
+  2. You may modify your copy or copies of the Program or any portion\n\
+of it, thus forming a work based on the Program, and copy and\n\
+distribute such modifications or work under the terms of Section 1\n'),
+  next_or_quit,
+  write('\
+above, provided that you also meet all of these conditions:\n\
+\n\
+    a) You must cause the modified files to carry prominent notices\n\
+    stating that you changed the files and the date of any change.\n\
+\n\
+    b) You must cause any work that you distribute or publish, that in\n\
+    whole or in part contains or is derived from the Program or any\n\
+    part thereof, to be licensed as a whole at no charge to all third\n\
+    parties under the terms of this License.\n\
+\n\
+    c) If the modified program normally reads commands interactively\n\
+    when run, you must cause it, when started running for such\n\
+    interactive use in the most ordinary way, to print or display an\n\
+    announcement including an appropriate copyright notice and a\n\
+    notice that there is no warranty (or else, saying that you provide\n\
+    a warranty) and that users may redistribute the program under\n\
+    these conditions, and telling the user how to view a copy of this\n\
+    License.  (Exception: if the Program itself is interactive but\n\
+    does not normally print such an announcement, your work based on\n\
+    the Program is not required to print an announcement.)\n\
+\n\
+These requirements apply to the modified work as a whole.  If\n\
+identifiable sections of that work are not derived from the Program,\n'),
+  next_or_quit,
+  write('\
+and can be reasonably considered independent and separate works in\n\
+themselves, then this License, and its terms, do not apply to those\n\
+sections when you distribute them as separate works.  But when you\n\
+distribute the same sections as part of a whole which is a work based\n\
+on the Program, the distribution of the whole must be on the terms of\n\
+this License, whose permissions for other licensees extend to the\n\
+entire whole, and thus to each and every part regardless of who wrote it.\n\
+\n\
+Thus, it is not the intent of this section to claim rights or contest\n\
+your rights to work written entirely by you; rather, the intent is to\n\
+exercise the right to control the distribution of derivative or\n\
+collective works based on the Program.\n\
+\n\
+In addition, mere aggregation of another work not based on the Program\n\
+with the Program (or with a work based on the Program) on a volume of\n\
+a storage or distribution medium does not bring the other work under\n\
+the scope of this License.\n\
+\n\
+  3. You may copy and distribute the Program (or a work based on it,\n\
+under Section 2) in object code or executable form under the terms of\n\
+Sections 1 and 2 above provided that you also do one of the following:\n\
+\n\
+    a) Accompany it with the complete corresponding machine-readable\n'),
+  next_or_quit,
+  write('\
+    source code, which must be distributed under the terms of Sections\n\
+    1 and 2 above on a medium customarily used for software interchange; or,\n\
+\n\
+    b) Accompany it with a written offer, valid for at least three\n\
+    years, to give any third party, for a charge no more than your\n\
+    cost of physically performing source distribution, a complete\n\
+    machine-readable copy of the corresponding source code, to be\n\
+    distributed under the terms of Sections 1 and 2 above on a medium\n\
+    customarily used for software interchange; or,\n\
+\n\
+    c) Accompany it with the information you received as to the offer\n\
+    to distribute corresponding source code.  (This alternative is\n\
+    allowed only for noncommercial distribution and only if you\n\
+    received the program in object code or executable form with such\n\
+    an offer, in accord with Subsection b above.)\n\
+\n\
+The source code for a work means the preferred form of the work for\n\
+making modifications to it.  For an executable work, complete source\n\
+code means all the source code for all modules it contains, plus any\n\
+associated interface definition files, plus the scripts used to\n\
+control compilation and installation of the executable.  However, as a\n\
+special exception, the source code distributed need not include\n\
+anything that is normally distributed (in either source or binary\n'),
+  next_or_quit,
+  write('\
+form) with the major components (compiler, kernel, and so on) of the\n\
+operating system on which the executable runs, unless that component\n\
+itself accompanies the executable.\n\
+\n\
+If distribution of executable or object code is made by offering\n\
+access to copy from a designated place, then offering equivalent\n\
+access to copy the source code from the same place counts as\n\
+distribution of the source code, even though third parties are not\n\
+compelled to copy the source along with the object code.\n\
+\n\
+  4. You may not copy, modify, sublicense, or distribute the Program\n\
+except as expressly provided under this License.  Any attempt\n\
+otherwise to copy, modify, sublicense or distribute the Program is\n\
+void, and will automatically terminate your rights under this License.\n\
+However, parties who have received copies, or rights, from you under\n\
+this License will not have their licenses terminated so long as such\n\
+parties remain in full compliance.\n\
+\n\
+  5. You are not required to accept this License, since you have not\n\
+signed it.  However, nothing else grants you permission to modify or\n\
+distribute the Program or its derivative works.  These actions are\n\
+prohibited by law if you do not accept this License.  Therefore, by\n\
+modifying or distributing the Program (or any work based on the\n'),
+  next_or_quit,
+  write('\
+Program), you indicate your acceptance of this License to do so, and\n\
+all its terms and conditions for copying, distributing or modifying\n\
+the Program or works based on it.\n\
+\n\
+  6. Each time you redistribute the Program (or any work based on the\n\
+Program), the recipient automatically receives a license from the\n\
+original licensor to copy, distribute or modify the Program subject to\n\
+these terms and conditions.  You may not impose any further\n\
+restrictions on the recipients'' exercise of the rights granted herein.\n\
+You are not responsible for enforcing compliance by third parties to\n\
+this License.\n\
+\n\
+  7. If, as a consequence of a court judgment or allegation of patent\n\
+infringement or for any other reason (not limited to patent issues),\n\
+conditions are imposed on you (whether by court order, agreement or\n\
+otherwise) that contradict the conditions of this License, they do not\n\
+excuse you from the conditions of this License.  If you cannot\n\
+distribute so as to satisfy simultaneously your obligations under this\n\
+License and any other pertinent obligations, then as a consequence you\n\
+may not distribute the Program at all.  For example, if a patent\n\
+license would not permit royalty-free redistribution of the Program by\n\
+all those who receive copies directly or indirectly through you, then\n\
+the only way you could satisfy both it and this License would be to\n'),
+  next_or_quit,
+  write('\
+refrain entirely from distribution of the Program.\n\
+\n\
+If any portion of this section is held invalid or unenforceable under\n\
+any particular circumstance, the balance of the section is intended to\n\
+apply and the section as a whole is intended to apply in other\n\
+circumstances.\n\
+\n\
+It is not the purpose of this section to induce you to infringe any\n\
+patents or other property right claims or to contest validity of any\n\
+such claims; this section has the sole purpose of protecting the\n\
+integrity of the free software distribution system, which is\n\
+implemented by public license practices.  Many people have made\n\
+generous contributions to the wide range of software distributed\n\
+through that system in reliance on consistent application of that\n\
+system; it is up to the author/donor to decide if he or she is willing\n\
+to distribute software through any other system and a licensee cannot\n\
+impose that choice.\n\
+\n\
+This section is intended to make thoroughly clear what is believed to\n\
+be a consequence of the rest of this License.\n\
+\n\
+  8. If the distribution and/or use of the Program is restricted in\n\
+certain countries either by patents or by copyrighted interfaces, the\n'),
+  next_or_quit,
+  write('\
+original copyright holder who places the Program under this License\n\
+may add an explicit geographical distribution limitation excluding\n\
+those countries, so that distribution is permitted only in or among\n\
+countries not thus excluded.  In such case, this License incorporates\n\
+the limitation as if written in the body of this License.\n\
+\n\
+  9. The Free Software Foundation may publish revised and/or new versions\n\
+of the General Public License from time to time.  Such new versions will\n\
+be similar in spirit to the present version, but may differ in detail to\n\
+address new problems or concerns.\n\
+\n\
+Each version is given a distinguishing version number.  If the Program\n\
+specifies a version number of this License which applies to it and "any\n\
+later version", you have the option of following the terms and conditions\n\
+either of that version or of any later version published by the Free\n\
+Software Foundation.  If the Program does not specify a version number of\n\
+this License, you may choose any version ever published by the Free Software\n\
+Foundation.\n\
+\n\
+  10. If you wish to incorporate parts of the Program into other free\n\
+programs whose distribution conditions are different, write to the author\n\
+to ask for permission.  For software which is copyrighted by the Free\n\
+Software Foundation, write to the Free Software Foundation; we sometimes\n'),
+  next_or_quit,
+  write('\
+make exceptions for this.  Our decision will be guided by the two goals\n\
+of preserving the free status of all derivatives of our free software and\n\
+of promoting the sharing and reuse of software generally.\n'),
+    !.
+show_copying.
+
+show_warranty :-
+  write('\
+                            NO WARRANTY\n\
+\n\
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n\
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\n\
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n\
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n\
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n\
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\n\
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\n\
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n\
+REPAIR OR CORRECTION.\n\
+\n\
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n\
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n\
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n\
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n\
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n\
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n\
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n\
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n\
+POSSIBILITY OF SUCH DAMAGES.\n').
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Startup %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+common_main :-
+  write('\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\n'),
+  main_loop.
diff --git a/interfaces/Prolog/tests/expected_clpq2_int16 b/interfaces/Prolog/tests/expected_clpq2_int16
new file mode 100644
index 0000000..0229065
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int16
@@ -0,0 +1,102 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Unknown result due to negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int16_a b/interfaces/Prolog/tests/expected_clpq2_int16_a
new file mode 100644
index 0000000..0d41bf6
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int16_a
@@ -0,0 +1,103 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Unknown result due to negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int32 b/interfaces/Prolog/tests/expected_clpq2_int32
new file mode 100644
index 0000000..d095df4
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int32
@@ -0,0 +1,109 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int32_a b/interfaces/Prolog/tests/expected_clpq2_int32_a
new file mode 100644
index 0000000..61d3188
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int32_a
@@ -0,0 +1,102 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int64 b/interfaces/Prolog/tests/expected_clpq2_int64
new file mode 100644
index 0000000..d095df4
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int64
@@ -0,0 +1,109 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int64_a b/interfaces/Prolog/tests/expected_clpq2_int64_a
new file mode 100644
index 0000000..d095df4
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int64_a
@@ -0,0 +1,109 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int8 b/interfaces/Prolog/tests/expected_clpq2_int8
new file mode 100644
index 0000000..f16bdf1
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int8
@@ -0,0 +1,101 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int8_a b/interfaces/Prolog/tests/expected_clpq2_int8_a
new file mode 100644
index 0000000..f16bdf1
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int8_a
@@ -0,0 +1,101 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_mpz b/interfaces/Prolog/tests/expected_clpq2_mpz
new file mode 100644
index 0000000..d095df4
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_mpz
@@ -0,0 +1,109 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_mpz_a b/interfaces/Prolog/tests/expected_clpq2_mpz_a
new file mode 100644
index 0000000..d095df4
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_mpz_a
@@ -0,0 +1,109 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int16 b/interfaces/Prolog/tests/expected_clpq_int16
new file mode 100644
index 0000000..3578056
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int16
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- R = 45
+O = 9
+M = 45
+D = 9
+N = 55
+E = 10
+S = 10
+Y = 8
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int16_a b/interfaces/Prolog/tests/expected_clpq_int16_a
new file mode 100644
index 0000000..3578056
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int16_a
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- R = 45
+O = 9
+M = 45
+D = 9
+N = 55
+E = 10
+S = 10
+Y = 8
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int32 b/interfaces/Prolog/tests/expected_clpq_int32
new file mode 100644
index 0000000..31d77fe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int32
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int32_a b/interfaces/Prolog/tests/expected_clpq_int32_a
new file mode 100644
index 0000000..31d77fe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int32_a
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int64 b/interfaces/Prolog/tests/expected_clpq_int64
new file mode 100644
index 0000000..31d77fe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int64
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int64_a b/interfaces/Prolog/tests/expected_clpq_int64_a
new file mode 100644
index 0000000..31d77fe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int64_a
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int8 b/interfaces/Prolog/tests/expected_clpq_int8
new file mode 100644
index 0000000..3c3c0b3
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int8
@@ -0,0 +1,29 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int8_a b/interfaces/Prolog/tests/expected_clpq_int8_a
new file mode 100644
index 0000000..3c3c0b3
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int8_a
@@ -0,0 +1,29 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_mpz b/interfaces/Prolog/tests/expected_clpq_mpz
new file mode 100644
index 0000000..31d77fe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_mpz
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_mpz_a b/interfaces/Prolog/tests/expected_clpq_mpz_a
new file mode 100644
index 0000000..31d77fe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_mpz_a
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_pchk_int16 b/interfaces/Prolog/tests/expected_pchk_int16
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int16
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int16_a b/interfaces/Prolog/tests/expected_pchk_int16_a
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int16_a
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int32 b/interfaces/Prolog/tests/expected_pchk_int32
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int32
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int32_a b/interfaces/Prolog/tests/expected_pchk_int32_a
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int32_a
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int64 b/interfaces/Prolog/tests/expected_pchk_int64
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int64
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int64_a b/interfaces/Prolog/tests/expected_pchk_int64_a
new file mode 100644
index 0000000..2aed667
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int64_a
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int8 b/interfaces/Prolog/tests/expected_pchk_int8
new file mode 100644
index 0000000..b19de5d
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int8
@@ -0,0 +1,9 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int8_a b/interfaces/Prolog/tests/expected_pchk_int8_a
new file mode 100644
index 0000000..f6b1402
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int8_a
@@ -0,0 +1,9 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_mpz b/interfaces/Prolog/tests/expected_pchk_mpz
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_mpz
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_mpz_a b/interfaces/Prolog/tests/expected_pchk_mpz_a
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_mpz_a
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/fib.clpq b/interfaces/Prolog/tests/fib.clpq
new file mode 100644
index 0000000..8858d5f
--- /dev/null
+++ b/interfaces/Prolog/tests/fib.clpq
@@ -0,0 +1,6 @@
+fib(X, Y) :-
+  { X >= 0, X =< 1, Y = 1 }.
+fib(X, Y) :-
+  { X >= 2, Xm1 = X-1, Xm2 = X-2, Y = Y1+Y2 },
+  fib(Xm1, Y1),
+  fib(Xm2, Y2).
diff --git a/interfaces/Prolog/tests/mc91.clpq b/interfaces/Prolog/tests/mc91.clpq
new file mode 100644
index 0000000..6827c58
--- /dev/null
+++ b/interfaces/Prolog/tests/mc91.clpq
@@ -0,0 +1,6 @@
+mc(N, M) :-
+    { N >= 101, M = N-10 }.
+mc(N, M) :-
+    { N =< 100, T = N+11 },
+    mc(T, U),
+    mc(U, M).
diff --git a/interfaces/Prolog/tests/pl_check.pl b/interfaces/Prolog/tests/pl_check.pl
new file mode 100644
index 0000000..99ba081
--- /dev/null
+++ b/interfaces/Prolog/tests/pl_check.pl
@@ -0,0 +1,3314 @@
+/* Various tests on the Prolog interface.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+
+% noisy(F)
+% When F = 1, a message is displayed if a time out occurs
+% when running the `timeout'` predicate.
+% Also, the values of the PPL versions and banner are displayed.
+% When F = 0, no 'time out' message or versions are displayed.
+% When F = 2, if a test fails and the backtracking returns to a polyhedron
+% constructor, the caught error will cause the constraint and generator systems
+% for the polyhedron to be displayed.
+% noisy/1 can be reset by calling make_noisy/0 or make_quiet/0.
+
+:- dynamic(noisy/1).
+
+% check_all
+% This executes all the test predicates which, together, check all
+% the ppl interface predicates.
+
+check_all :-
+   (noisy(_) -> true; make_quiet),
+   list_groups(Groups),
+   catch(run_all(Groups), Exception,
+       (print_exception_term(Exception), fail)).
+
+% check_quiet
+% This alo executes all the test predicates with no output.
+
+check_quiet :-
+   make_quiet,
+   check_all.
+
+% check_noisy
+% This alo executes all the test predicates but also prints some messages
+% including the banner, version numbers and expected output from
+% the exception tests.
+
+check_noisy :-
+   make_noisy,
+   check_all.
+
+check_extra_noisy :-
+   make_extra_noisy,
+   check_all.
+
+run_all([Group|Groups]):-
+   ppl_initialize,
+   (catch(run_one(Group), Exception,
+         run_exception(Group, Exception)) -> true ; run_fail(Group)),
+   !,
+   ppl_finalize,
+   run_all(Groups).
+
+run_all([]).
+
+run_all([_|_]) :-
+   error_message(['Prolog interface checks failed.']),
+   !,
+   ppl_finalize,
+   fail.
+
+run_fail(Group) :-
+   group_predicates(Group, Predicates),
+   error_message(['Error occurred while performing test', Group,
+              'which checks predicates:', nl, Predicates]),
+   !,
+   ppl_finalize,
+   fail.
+
+run_exception(Group, ppl_overflow_error(Cause)) :-
+   !,
+   group_predicates(Group, Predicates),
+   display_message(
+            ['Overflow exception occurred while performing test ', Group,
+              'which checks predicates ', nl, Predicates]),
+   print_exception_term(ppl_overflow_error(Cause)).
+
+run_exception(Group, Exception) :-
+   group_predicates(Group, Predicates),
+   display_message(
+            ['Exception occurred while performing test ', Group,
+              'which checks predicates ', nl, Predicates]),
+   print_exception_term(Exception),
+   fail.
+
+% Tests predicates that return PPL version information and the PPL banner.
+% If noisy(0) holds, there is no output but if not,
+% all the versions are printed and the banner is pretty printed.
+run_one(all_versions_and_banner) :-
+  \+ ppl_version_major(-1),
+  ppl_version_major(Vmajor),
+  ppl_version_minor(Vminor),
+  ppl_version_revision(Vrevision),
+  ppl_version_beta(Vbeta),
+  ppl_version(V),
+  ppl_banner(B),
+  (noisy(0) -> true ;
+     (
+      nl,
+      write('Version major is '), write(Vmajor), nl,
+      write('Version minor is '), write(Vminor), nl,
+      write('Version revision is '), write(Vrevision), nl,
+      write('Version beta is '), write(Vbeta), nl,
+      write('Version is '), write(V), nl,
+      banner_pp(B), nl
+     )
+  ).
+
+% Tests predicates that return the maximum allowed dimension and coefficients.
+% If noisy(0) holds, there is no output but if not, the maximums/miniumums
+% are printed.
+run_one(numeric_bounds) :-
+  max_dimension,
+  coefficient_bounds.
+
+run_one(new_polyhedron_from_dimension) :-
+  new_polyhedron_from_dim.
+
+run_one(new_polyhedron_from_polyhedron) :-
+  new_polyhedron_from_polyhedron.
+
+run_one(new_polyhedron_from_representations) :-
+  new_polyhedron_from_cons,
+  new_polyhedron_from_gens,
+  new_polyhedron_from_bounding_box.
+
+run_one(swap_polyhedra) :-
+  swap.
+
+run_one(polyhedron_dimension) :-
+   space,
+   affine_dim.
+
+run_one(basic_operators) :-
+   inters_assign,
+   inters_assign_min,
+   polyhull_assign,
+   polyhull_assign_min,
+   polydiff_assign,
+   time_elapse,
+   top_close_assign.
+
+run_one(add_to_system) :-
+   add_con,
+   add_con_min,
+   add_gen,
+   add_gen_min,
+   add_cons,
+   add_cons_min,
+   add_gens,
+   add_gens_min.
+
+run_one(revise_dimensions) :-
+   project,
+   embed,
+   conc_assign,
+   remove_dim,
+   remove_high_dim,
+   expand_dim,
+   map_dim,
+   fold_dims.
+
+run_one(transform_polyhedron) :-
+   affine_image,
+   affine_preimage,
+   bounded_affine_image,
+   bounded_affine_preimage,
+   affine_image_gen,
+   affine_preimage_gen,
+   affine_image_genlr,
+   affine_preimage_genlr.
+
+run_one(extrapolation_operators) :-
+   widen_BHRZ03,
+   widen_BHRZ03_with_tokens,
+   lim_extrapolate_BHRZ03,
+   lim_extrapolate_BHRZ03_with_tokens,
+   bound_extrapolate_BHRZ03,
+   bound_extrapolate_BHRZ03_with_tokens,
+   widen_H79,
+   widen_H79_with_tokens,
+   lim_extrapolate_H79,
+   lim_extrapolate_H79_with_tokens,
+   bound_extrapolate_H79,
+   bound_extrapolate_H79_with_tokens.
+
+run_one(get_system) :-
+   get_cons,
+   get_min_cons,
+   get_gens,
+   get_min_gens.
+
+run_one(check_polyhedron) :-
+   rel_cons,
+   rel_gens,
+   checks,
+   bounds_from_above,
+   bounds_from_below.
+
+run_one(minmax_polyhedron) :-
+   maximize,
+   minimize,
+   maximize_with_point,
+   minimize_with_point.
+
+run_one(compare_polyhedra) :-
+   contains,
+   strict_contains,
+   disjoint_from,
+   equals,
+   ok.
+
+run_one(polyhedron_boxes) :-
+   get_bounding_box.
+
+run_one(catch_time) :-
+   time_out.
+
+run_one(lp_problem) :-
+   lp_problem.
+
+% XSB has problems with large numbers - hence tests for XSB disallowed.
+% We catch the exception if it is caused by integer overflow in C++
+% and suppress output as this is expected when C++ uses checked_integers.
+run_one(large_integers) :-
+   prolog_system(Prolog_System),
+   (Prolog_System \== 'XSB' ->
+     catch(large_integers, ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause)))
+   ;
+     true
+   ).
+
+run_one(handle_exceptions) :-
+   exceptions.
+
+%%%%%%%%%%%%%%%%% numeric bounds %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+max_dimension :-
+  ppl_max_space_dimension(M),
+  (noisy(0) -> true ;
+     display_message(['Maximum possible dimension is', M, nl])
+  ).
+
+% coefficient_bounds/0
+% This is mainly to check ppl_Coefficient_is_bounded/0,
+% ppl_Coefficient_max/1, ppl_Coefficient_min/1.
+% But it has to catch the case when the numeric bounds in the
+% prolog system are smaller than any finite bounds in C++
+% As the test does not know the configuartion, all that can be tested
+% here is that the results are consistent and the bounds are
+% in a list of possible bounds.
+
+coefficient_bounds :-
+    (pl_check_prolog_flag(bounded, true) ->
+     (pl_check_prolog_flag(max_integer, PLMax),
+      pl_check_prolog_flag(min_integer, PLMin))
+   ;
+     PLMax = 0, PLMin = 0
+  ),
+  (ppl_Coefficient_is_bounded ->
+     (cpp_bounded_values(Max, Min) -> true
+      ;
+       (Max = PLMax, Min = PLMin)
+     )
+  ;
+     (cpp_unbounded_check, Max = PLMax, Min = PLMin)
+  ),
+  (noisy(0) -> true ;
+     display_message(['Maximum possible coefficient is', Max, nl]),
+     display_message(['Minimum possible coefficient is', Min, nl])
+  ).
+
+cpp_unbounded_check :-
+  \+ ppl_Coefficient_max(_),
+  \+ ppl_Coefficient_min(_).
+
+cpp_bounded_values(Max, Min) :-
+  ppl_Coefficient_max(Max),
+  ppl_Coefficient_min(Min).
+
+%%%%%%%%%%%%%%%%% New Polyhedron %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Note that throughout the tests, all "new_Polyhedron_from_...(...,P)" calls
+% are made in such a way that, if the test fails, P is deleted.
+% This is done by using special "clean_new_Polyhedron_from_...(...,P)"
+% forms of the predicates that are defined later.
+%
+% As we also delete P on success of the test, to prevent trying to
+% delete P again when a later test fails, we always have a cut before these
+% in-line calls to ppl_Polyhedron_delete(P).
+
+% Tests new_C_Polyhedron_from_space_dimension/3,
+%       new_NNC_Polyhedron_from_space_dimension/3 and
+%       ppl_delete_Polyhedron/1.
+new_polyhedron_from_dim :-
+  new_polyhedron_from_dim(c, universe),
+  new_polyhedron_from_dim(nnc, universe),
+  new_polyhedron_from_dim(c, empty),
+  new_polyhedron_from_dim(nnc, empty).
+
+% This also uses ppl_Polyhedron_is_universe/1
+% and ppl_Polyhedron_is_empty.
+new_polyhedron_from_dim(T, Universe_Or_Empty) :-
+  \+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, Universe_Or_Empty, 0),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, Universe_Or_Empty, P),
+  (Universe_Or_Empty = universe ->
+      (ppl_Polyhedron_is_universe(P),
+      \+ ppl_Polyhedron_is_empty(P))
+   ;
+      (ppl_Polyhedron_is_empty(P),
+      \+ ppl_Polyhedron_is_universe(P))
+  ),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+%       ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+%       ppl_new_NNC_Polyhedron_from_C_Polyhedron/2, and
+%       ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+new_polyhedron_from_polyhedron :-
+  new_polyhedron_from_polyhedron(c, c),
+  new_polyhedron_from_polyhedron(nnc, nnc),
+  new_polyhedron_from_polyhedron(c, nnc),
+  new_polyhedron_from_polyhedron(nnc, c).
+
+% This also uses ppl_new_Polyhedron_from_constraints/3 and
+% ppl_Polyhedron_equals_Polyhedron/2.
+new_polyhedron_from_polyhedron(T1, T2) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T1, 3, universe, P1),
+  \+ clean_ppl_new_Polyhedron_from_Polyhedron(T1, P1, T2, 0),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T1, P1, T2, P2),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T2, P2, T1, P1a),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1a),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T1, P1a, T2, P2a),
+  ppl_Polyhedron_equals_Polyhedron(P2, P2a),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P1a),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P2a),
+  make_vars(3, [A, B, C]),
+  (T1 = c
+          -> CS = [3 >= A, 4 >= A, 4*A + B - 2*C >= 5]
+          ;  CS = [3 >= A, 4 >  A, 4*A + B - 2*C >= 5]
+  ),
+  clean_ppl_new_Polyhedron_from_constraints(T1, CS, P3),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T1, P3, T2, P4),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T2, P4, T1, P3a),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T1, P3a, T2, P4a),
+  ppl_Polyhedron_equals_Polyhedron(P3, P3a),
+  ppl_Polyhedron_equals_Polyhedron(P4, P4a),
+  !,
+  ppl_delete_Polyhedron(P3),
+  ppl_delete_Polyhedron(P4),
+  ppl_delete_Polyhedron(P3a),
+  ppl_delete_Polyhedron(P4a).
+
+% Tests ppl_new_Polyhedron_from_constraints/2
+%       ppl_new_Polyhedron_from_constraints/2.
+new_polyhedron_from_cons :-
+  new_polyhedron_from_cons(c, [3 >= '$VAR'(1)]),
+  make_vars(4, [A, B, C, D]),
+  new_polyhedron_from_cons(c, [3 >= A, 4*A + B - 2*C >= 5, D = 1]),
+  new_polyhedron_from_cons(c, [B >= A, 4*A + B - 2*C >= 5, D = 1]),
+  new_polyhedron_from_cons(nnc, [3 > A, 4*A + B - 2*C >= 5, D = 1]),
+  new_polyhedron_from_cons(nnc, [B > A, 4*A + B - 2*C >= 5, D = 1]).
+
+new_polyhedron_from_cons(T, CS) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, [], P),
+  \+ clean_ppl_new_Polyhedron_from_constraints(T, [], 0),
+  ppl_Polyhedron_is_universe(P),
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, Pa),
+  \+ ppl_Polyhedron_is_universe(Pa),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Pa).
+
+% Tests ppl_new_Polyhedron_from_generators/2 and
+%       ppl_new_Polyhedron_from_generators/2.
+new_polyhedron_from_gens :-
+  make_vars(3, [A, B, C]),
+  new_polyhedron_from_gens(c,[point(A + B + C, 1), point(A + B + C)] ),
+  new_polyhedron_from_gens(nnc,  [point(A + B + C), closure_point(A + B + C)]).
+
+new_polyhedron_from_gens(T, GS) :-
+  \+ clean_ppl_new_Polyhedron_from_generators(T, [], 0),
+  clean_ppl_new_Polyhedron_from_generators(T, [], P),
+  ppl_Polyhedron_is_empty(P),
+  clean_ppl_new_Polyhedron_from_generators(T, GS, Pa),
+  \+ ppl_Polyhedron_is_empty(Pa),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Pa).
+
+% Tests ppl_new_C_Polyhedron_from_bounding_box/2 and
+%       ppl_new_NNC_Polyhedron_from_bounding_box/2.
+new_polyhedron_from_bounding_box :-
+  new_polyhedron_from_bounding_box(c, [i(c(1/2), o(pinf)), i(o(minf), c(-1/2))]),
+  new_polyhedron_from_bounding_box(c, [empty]),
+  new_polyhedron_from_bounding_box(nnc,[i(o(0/2), o(pinf)), i(o(minf), o(1))]),
+  Max = -4,
+  new_polyhedron_from_bounding_box(c, [i(c(Max), c(1)), i(c(-1), c(1))]),
+  new_polyhedron_from_bounding_box(nnc, [i(c(Max), c(1)), i(c(-1), c(1))]).
+
+new_polyhedron_from_bounding_box(T, Box) :-
+  clean_ppl_new_Polyhedron_from_bounding_box(T, Box, P),
+  ppl_Polyhedron_get_bounding_box(P, any, Box1),
+  clean_ppl_new_Polyhedron_from_bounding_box(T, Box1, P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T, Box, 0),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+             [i(x, c(1/2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+             [i(x(minf), c(1/2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+             [i(o(minf), c(1/2)), i(c(0), c(pinf))], _),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+             [i(c(minf), c(1/2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+             [i(o(minf), c(inf)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+             [i(c(minf), c(1+2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+             [i(c(minf), c(n/2)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+             [i(c(minf), c(2/d)), i(c(0), o(pinf))], _),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+             [i(c(minf), c(2/1)), i(c(n), o(pinf))], _),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+             [i(e), i(c(n), o(pinf))], _),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+             [i(c(minf), c(2/1), c(1)), i(c(n), o(pinf))], _),
+  \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+             [x(c(minf), c(2/1)), i(c(n), o(pinf))], _),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+%%%%%%%%%%%%%%%%% Swap Polyhedra %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_swap/2.
+swap :-
+  swap(c), swap(nnc).
+
+swap(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, Q),
+  ppl_Polyhedron_swap(P, Q),
+  ppl_Polyhedron_is_empty(P),
+  ppl_Polyhedron_is_universe(Q),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+%%%%%%%%%%%%%%%%%% Poly Dimension %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_space_dimension/2.
+space :-
+ space(c), space(nnc).
+
+space(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_space_dimension(P, N),
+  N = 3,
+  \+ ppl_Polyhedron_space_dimension(P, 4),
+  clean_ppl_new_Polyhedron_from_generators(T, [], Q),
+  ppl_Polyhedron_space_dimension(Q, M),
+  M == 0,
+  clean_ppl_new_Polyhedron_from_constraints(T, [], Q1),
+  ppl_Polyhedron_space_dimension(Q1, M1),
+  M1 == 0,
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q),
+  ppl_delete_Polyhedron(Q1).
+
+
+% Tests ppl_Polyhedron_affine_dimension/2.
+affine_dim :-
+ affine_dim(c), affine_dim(nnc).
+
+affine_dim(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_affine_dimension(P, N),
+  N == 3,
+  \+ ppl_Polyhedron_affine_dimension(P, 2),
+  clean_ppl_new_Polyhedron_from_generators(T, [], Q),
+  ppl_Polyhedron_affine_dimension(Q, M),
+  M == 0,
+  clean_ppl_new_Polyhedron_from_constraints(T, [], Q1),
+  ppl_Polyhedron_affine_dimension(Q1, M1),
+  M1 == 0,
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q),
+  ppl_delete_Polyhedron(Q1),
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(A), ray(B)],
+                                     P1),
+  ppl_Polyhedron_space_dimension(P1, 2),
+  ppl_Polyhedron_affine_dimension(P1, 1),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(A + B, 2)],
+                                     P2),
+  ppl_Polyhedron_space_dimension(P2, 2),
+  ppl_Polyhedron_affine_dimension(P2, 0),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B >= 0, B >= 0,
+                                       A + B =< 1, B =< 0],
+                                      P3),
+  ppl_Polyhedron_space_dimension(P3, 2),
+  ppl_Polyhedron_affine_dimension(P3, 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B >= 0, B >= 1,
+                                       A + B =< 1],
+                                      P4),
+  (T = c ->
+            ppl_Polyhedron_add_constraint(P4, B =< 0)
+         ;
+            ppl_Polyhedron_add_constraint(P4, B < 1)
+  ),
+  ppl_Polyhedron_space_dimension(P4, 2),
+  ppl_Polyhedron_affine_dimension(P4, 0),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P3),
+  ppl_delete_Polyhedron(P4).
+
+%%%%%%%%%%%%%%%% Basic Operators %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_intersection_assign/2.
+inters_assign :-
+  inters_assign(c), inters_assign(nnc).
+
+inters_assign(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(0), point(B),
+                                      point(A), point(A, 2)],
+                                     P1),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(0), point(A),
+                                      point(A + B), point(A, 2)],
+                                     P2),
+  ppl_Polyhedron_intersection_assign(P1, P2),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(A + B, 2),
+                                      point(A), point(0)],
+                                     P1a),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B >= 0, B >= 0,
+                                       A + B =< 1],
+                                      P1b),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1a),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1b),
+  clean_ppl_new_Polyhedron_from_constraints(T, [A =< -1, B =< -1], P3),
+  ppl_Polyhedron_intersection_assign(P1, P3),
+  ppl_Polyhedron_is_empty(P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P3),
+  ppl_delete_Polyhedron(P1a),
+  ppl_delete_Polyhedron(P1b).
+
+% Tests ppl_Polyhedron_intersection_assign_and_minimize/2.
+inters_assign_min :-
+  inters_assign_min(c), inters_assign_min(nnc).
+
+inters_assign_min(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(0), point(B),
+                                      point(A), point(A, 2)],
+                                     P1),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(0), point(A), point(A + B)],
+                                     P2),
+  ppl_Polyhedron_intersection_assign_and_minimize(P1, P2),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(A + B, 2),
+                                      point(A), point(0)],
+                                     P1a),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B >= 0, B >= 0,
+                                       A + B =< 1],
+                                      P1b),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1a),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1b),
+  clean_ppl_new_Polyhedron_from_constraints(T, [A =< -1, B =< -1], P3),
+  \+ppl_Polyhedron_intersection_assign_and_minimize(P1, P3),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P3),
+  ppl_delete_Polyhedron(P1a),
+  ppl_delete_Polyhedron(P1b).
+
+% Tests ppl_Polyhedron_concatenate_assign/2.
+conc_assign :-
+  conc_assign(c), conc_assign(nnc).
+
+conc_assign(T) :-
+  make_vars(5, [A, B, C, D, E]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  clean_ppl_new_Polyhedron_from_constraints(T, [A >= 1, B >= 0, C >= 0], Q),
+  ppl_Polyhedron_concatenate_assign(P, Q),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [C >= 1, D >= 0, E >= 0],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_poly_hull_assign/2.
+polyhull_assign :-
+  polyhull_assign(c), polyhull_assign(nnc).
+
+polyhull_assign(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(0), point(B),
+                                      point(A), point(A,2)],
+                                     P1),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(0), point(A),
+                                      point(A + B), point(A, 2)],
+                                     P2),
+  ppl_Polyhedron_poly_hull_assign(P1, P2),
+  clean_ppl_new_Polyhedron_from_generators(T,
+      [point(1*A+1*B), point(1*A, 2), point(1*A), point(1*B), point(0)], P1a),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+      [1*A>=0, 1*B>=0, -1*B>= -1, -1*A>= -1], P1b),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1a),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1b),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P1a),
+  ppl_delete_Polyhedron(P1b).
+
+% Tests ppl_Polyhedron_poly_hull_assign_and_minimize/2.
+polyhull_assign_min :-
+  polyhull_assign_min(c), polyhull_assign_min(nnc).
+
+polyhull_assign_min(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P2),
+  \+ ppl_Polyhedron_poly_hull_assign_and_minimize(P1, P2),
+  ppl_Polyhedron_add_generators(P1, [point(0), point(B),
+                                     point(A), point(A, 2)]),
+  ppl_Polyhedron_add_generators(P2, [point(0), point(A),
+                                     point(A + B), point(A, 2)]),
+  ppl_Polyhedron_poly_hull_assign_and_minimize(P1, P2),
+  clean_ppl_new_Polyhedron_from_generators(T,
+      [point(1*A+1*B), point(1*A, 2), point(1*A), point(1*B), point(0)], P1a),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+      [1*A>=0, 1*B>=0, -1*B>= -1, -1*A>= -1], P1b),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1a),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1b),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P1a),
+  ppl_delete_Polyhedron(P1b).
+
+% Tests ppl_Polyhedron_poly_difference_assign/2.
+polydiff_assign :-
+  make_vars(2, [A, B]),
+  GS0 = [point(2*A)],
+  GS1 = [point(0), point(2*A)],
+  GS2 = [point(0), point(A)],
+  GS3 = [point(A), point(2*A)],
+  GS4 = [closure_point(A), point(2*A)],
+  GS4a = [closure_point(A), point(3*A, 2), closure_point(2*A)],
+  polydiff_assign(c, GS1, GS2, GS3),
+  polydiff_assign(c, GS1, GS3, GS2),
+  polydiff_assign(c, GS3, GS0, GS3),
+  polydiff_assign(nnc, GS1, GS2, GS4),
+  polydiff_assign(nnc, GS1, GS4, GS2),
+  polydiff_assign(nnc, GS4, GS0, GS4a),
+  GS5 = [point(0), point(B), point(A)],
+  GS6 = [point(0), point(A), point(A + B)],
+  GS6a = [point(0), point(A), point(A + B, 2)],
+  GS7 = [point(A + B, 2), point(B), point(0)],
+  GS8 = [closure_point(A + B, 2), point(B), closure_point(0)],
+  polydiff_assign(c, GS5, GS6, GS7),
+  polydiff_assign(c, GS5, GS7, GS6a),
+  polydiff_assign(nnc, GS5, GS6, GS8),
+  polydiff_assign(nnc, GS5, GS8, GS6a),
+  GS_empty = [],
+  polydiff_assign(c, GS0, GS0, GS_empty),
+  polydiff_assign(nnc, GS4, GS4, GS_empty),
+  polydiff_assign(nnc, GS4, GS3, GS_empty).
+
+polydiff_assign(T, GS1, GS2, GS3) :-
+  clean_ppl_new_Polyhedron_from_generators(T, GS1, P1),
+  ppl_Polyhedron_space_dimension(P1, Dim),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, empty, P2),
+  ppl_Polyhedron_add_generators(P2, GS2),
+  ppl_Polyhedron_poly_difference_assign(P1, P2),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, empty, P3),
+  ppl_Polyhedron_add_generators(P3, GS3),
+  ppl_Polyhedron_equals_Polyhedron(P1, P3),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P3).
+
+% Tests ppl_Polyhedron_time_elapse_assign/2.
+time_elapse :-
+  time_elapse(c), time_elapse(nnc).
+
+% Tests ppl_Polyhedron_time_elapse for C Polyhedra.
+time_elapse(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P,
+                          [A >= 1, A =< 3, B >= 1, B =< 3]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, Q),
+  ppl_Polyhedron_add_constraints(Q, [B = 5]),
+  ppl_Polyhedron_time_elapse_assign(P, Q),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, Pa),
+  ppl_Polyhedron_add_constraints(Pa, [B >= 1]),
+  clean_ppl_new_Polyhedron_from_constraints(T, [B = 5], Qa),
+  ppl_Polyhedron_equals_Polyhedron(Q, Qa),
+  ppl_Polyhedron_equals_Polyhedron(P, Pa),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q),
+  ppl_delete_Polyhedron(Pa),
+  ppl_delete_Polyhedron(Qa).
+
+% Tests ppl_Polyhedron_topological_closure_assign/1.
+top_close_assign :-
+  make_vars(3, [A, B, C]),
+  GS_close = [point(A + B), point(0), ray(A), ray(B)],
+  GS_not_close = [point(A + B), closure_point(0), ray(A), ray(B)],
+  CS_close = [4*A + B + -2*C >= 5, A =< 3],
+  CS_not_close = [4*A + B - 2*C >= 5, A < 3],
+  top_close_assign(c, gensys, GS_close, GS_close),
+  top_close_assign(nnc, gensys, GS_not_close, GS_close),
+  top_close_assign(c, consys, CS_close, CS_close),
+  top_close_assign(nnc, consys, CS_not_close, CS_close).
+
+top_close_assign(T, gensys, GS, GS_close) :-
+  clean_ppl_new_Polyhedron_from_generators(T, GS, P),
+  ppl_Polyhedron_topological_closure_assign(P),
+  clean_ppl_new_Polyhedron_from_generators(T, GS_close, Pa),
+  ppl_Polyhedron_equals_Polyhedron(P, Pa),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Pa).
+
+top_close_assign(T, consys, CS, CS_close) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+  ppl_Polyhedron_topological_closure_assign(P),
+  clean_ppl_new_Polyhedron_from_constraints(T, CS_close, Pa),
+  ppl_Polyhedron_equals_Polyhedron(P, Pa),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Pa).
+
+
+%%%%%%%%%%%%%%%%%% Add Constraints or Generators %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_add_constraint/2.
+add_con :-
+  add_con(c), add_con(nnc).
+
+add_con(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint(P, A - B >= 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B >= 1],
+                                      Pa),
+  ppl_Polyhedron_equals_Polyhedron(P, Pa),
+  ppl_Polyhedron_add_constraint(P, A = 0),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A = 0, B =< -1],
+                                      Pb),
+  ppl_Polyhedron_equals_Polyhedron(P, Pb),
+  ppl_Polyhedron_add_constraint(P, A = 1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, Pc),
+  ppl_Polyhedron_equals_Polyhedron(P, Pc),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Pa),
+  ppl_delete_Polyhedron(Pb),
+  ppl_delete_Polyhedron(Pc).
+
+% Tests ppl_Polyhedron_add_constraint_and_minimize/2.
+add_con_min :-
+  add_con_min(c), add_con_min(nnc).
+
+add_con_min(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint_and_minimize(P, A - B >= 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B >= 1],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  \+ ppl_Polyhedron_add_constraint_and_minimize(P, A - B =< 0),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_add_generator/2.
+add_gen :-
+  add_gen(c), add_gen(nnc).
+
+add_gen(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_generator(P, point(A + B)),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(A + B), point(0),
+                                      line(A), line(B)], P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_add_generator_and_minimize/2.
+add_gen_min :-
+  add_gen_min(c), add_gen_min(nnc).
+
+add_gen_min(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P),
+  ppl_Polyhedron_add_generator(P, point(A + B)),
+  ppl_Polyhedron_add_generator(P, point(0)),
+  ppl_Polyhedron_add_generator_and_minimize(P, point(2*A + 2*B, 1)),
+  ppl_Polyhedron_get_generators(P,[_G1,_G2]),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(2*A + 2*B), point(0)],
+                                     P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_add_constraints/2.
+add_cons :-
+  make_vars(3, [A, B, C]),
+  add_cons(c, [A >= 1, B >= 0, 4*A + B - 2*C >= 5], [A =< 0]),
+  add_cons(nnc, [A > 1, B >= 0, 4*A + B - 2*C > 5], [A < 0]).
+
+add_cons(T, CS, CS1) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, CS),
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  ppl_Polyhedron_add_constraints(P, CS1),
+  ppl_Polyhedron_is_empty(P),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_add_constraints_and_minimize/2.
+add_cons_min :-
+  make_vars(2, [A, B]),
+  add_cons_min(c, [A >= 1, B >= 0], [A + B =< 0]),
+  add_cons_min(nnc, [A > 1, B >= 0], [A < 0]).
+
+add_cons_min(T, CS, CS1) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraints_and_minimize(P, CS),
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  \+ppl_Polyhedron_add_constraints_and_minimize(P, CS1),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_add_generators/2.
+add_gens :-
+  make_vars(3, [A, B, C]),
+  add_gens(c, [point(A + B + C), ray(A), ray(2*A), point(A + B + C, 1),
+               point(100*A + 5*B, -8)]),
+  add_gens(nnc, [point(A + B + C), ray(A), ray(2*A), point(A + B + C, 1),
+                 closure_point(100*A + 5*B, -8)]).
+
+add_gens(T, GS) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P),
+  ppl_Polyhedron_add_generators(P, GS),
+  clean_ppl_new_Polyhedron_from_generators(T, GS, P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_add_generators_and_minimize/2.
+add_gens_min :-
+  make_vars(3, [A, B, C]),
+  add_gens_min(c, [point(A + B + C), ray(A), ray(2*A), point(A + B + C)]),
+  add_gens_min(nnc, [point(A + B + C), ray(A), ray(2*A),
+                     closure_point(A + B + C)]).
+
+add_gens_min(T, GS) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P),
+  \+  ppl_Polyhedron_add_generators_and_minimize(P, []),
+  ppl_Polyhedron_add_generators_and_minimize(P, GS),
+  clean_ppl_new_Polyhedron_from_generators(T, GS, P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+%%%%%%%%%%%%%%%%%% Change Dimensions %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_add_space_dimensions_and_project/2.
+project :-
+  project(c), project(nnc).
+
+project(T) :-
+  make_vars(4, [A, B, C, D]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0]),
+  ppl_Polyhedron_add_space_dimensions_and_project(P, 0),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 0],
+                                      P0),
+  ppl_Polyhedron_equals_Polyhedron(P, P0),
+  ppl_delete_Polyhedron(P0),
+  ppl_Polyhedron_add_space_dimensions_and_project(P, 2),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 0, C = 0, D = 0],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_add_space_dimensions_and_embed/2.
+embed :-
+  embed(c), embed(nnc).
+
+embed(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0]),
+  ppl_Polyhedron_add_space_dimensions_and_embed(P, 0),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 0],
+                                      P0),
+  ppl_Polyhedron_equals_Polyhedron(P, P0),
+  ppl_delete_Polyhedron(P0),
+  ppl_Polyhedron_add_space_dimensions_and_embed(P, 2),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 4, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, [A >= 1, B >= 0]),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_remove_space_dimensions/2.
+remove_dim :-
+  remove_dim(c), remove_dim(nnc).
+
+remove_dim(T) :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 2]),
+  ppl_Polyhedron_remove_space_dimensions(P, []),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 0, C >= 2],
+                                      P0),
+  ppl_Polyhedron_equals_Polyhedron(P, P0),
+  ppl_delete_Polyhedron(P0),
+  ppl_Polyhedron_remove_space_dimensions(P,[B]),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 2],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  ppl_delete_Polyhedron(P1),
+  % Note: now 'B' refers to the old 'C' variable.
+  ppl_Polyhedron_remove_space_dimensions(P,[A, B]),
+  ppl_Polyhedron_space_dimension(P, 0),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_remove_higher_space_dimensions/2.
+remove_high_dim :-
+  remove_high_dim(c), remove_high_dim(nnc).
+
+remove_high_dim(T) :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 0]),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 0, C >= 0],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  ppl_Polyhedron_remove_higher_space_dimensions(P, 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1],
+                                      P2),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  ppl_Polyhedron_remove_higher_space_dimensions(P, 1),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  ppl_Polyhedron_remove_higher_space_dimensions(P, 0),
+  ppl_Polyhedron_space_dimension(P, 0),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_expand_space_dimension/3.
+expand_dim :-
+  expand_dim(c), expand_dim(nnc).
+
+expand_dim(T) :-
+  make_vars(4, [A, B, C, D]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 2]),
+  ppl_Polyhedron_expand_space_dimension(P, B, 1),
+  ppl_Polyhedron_space_dimension(P, 4),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 0, C >= 2, D >= 0],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  ppl_delete_Polyhedron(P1),
+  ppl_Polyhedron_remove_higher_space_dimensions(P, 2),
+  ppl_Polyhedron_expand_space_dimension(P, A, 2),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [D >= 1, C >= 1, A >= 1, B >= 0],
+                                      P2),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  ppl_delete_Polyhedron(P2),
+  ppl_Polyhedron_space_dimension(P, 4),
+  !,
+  ppl_delete_Polyhedron(P),
+% Example taken from [GopanDMDRS04], page 519.
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, Ptacas),
+  ppl_Polyhedron_add_generators(Ptacas,
+       [point(A + 2*B), point(A + 3*B), point(A + 4*B)]),
+  ppl_Polyhedron_expand_space_dimension(Ptacas, B, 1),
+  ppl_Polyhedron_space_dimension(Ptacas, 3),
+  clean_ppl_new_Polyhedron_from_generators(T,
+       [point(A + 2*B + 2*C), point(A + 2*B + 3*C), point(A + 2*B + 4*C),
+        point(A + 3*B + 2*C), point(A + 3*B + 3*C), point(A + 3*B + 4*C),
+        point(A + 4*B + 2*C), point(A + 4*B + 3*C), point(A + 4*B + 4*C)],
+                                      Ptacas1),
+  ppl_Polyhedron_equals_Polyhedron(Ptacas, Ptacas1),
+  !,
+  ppl_delete_Polyhedron(Ptacas1),
+  ppl_delete_Polyhedron(Ptacas).
+
+% Tests ppl_Polyhedron_fold_space_dimension/3.
+fold_dims :-
+  fold_dims(c), fold_dims(nnc).
+
+fold_dims(T) :-
+  make_vars(4, [A, B, C, D]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 4, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 2, D >= 0]),
+  ppl_Polyhedron_fold_space_dimensions(P, [D], B),
+  ppl_Polyhedron_space_dimension(P, 3),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, [A >= 1, B >= 0, C >= 2]),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_Polyhedron_fold_space_dimensions(P, [A, C], B),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 1, universe, P2),
+  ppl_Polyhedron_add_constraints(P2, [A >= 0]),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  ppl_delete_Polyhedron(P2),
+  ppl_Polyhedron_space_dimension(P, 1),
+  !,
+  ppl_delete_Polyhedron(P),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, Ptacas),
+  ppl_Polyhedron_add_constraints(Ptacas, [A >= 1, A =< 3, B >= 7, B =< 12]),
+  ppl_Polyhedron_fold_space_dimensions(Ptacas, [A], B),
+  ppl_Polyhedron_space_dimension(Ptacas, 1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 1, universe, Ptacas1),
+  ppl_Polyhedron_add_constraints(Ptacas1, [A >= 1, A =< 12]),
+  ppl_Polyhedron_equals_Polyhedron(Ptacas, Ptacas1),
+  !,
+  ppl_delete_Polyhedron(Ptacas1),
+  ppl_delete_Polyhedron(Ptacas).
+
+% Tests ppl_Polyhedron_map_space_dimensions/2.
+map_dim:-
+  map_dim(c), map_dim(nnc).
+
+map_dim(T) :-
+  make_vars(7, [A, B, C, D, E, F, G]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 2, B >= 1, C >= 0]),
+  ppl_Polyhedron_map_space_dimensions(P, [A-B, B-C, C-A]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, Q),
+  ppl_Polyhedron_add_constraints(Q, [A >= 0, B >= 2, C >= 1]),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 4, empty, P0),
+  ppl_Polyhedron_add_generators(P0, [point(2*C), line(A+B), ray(A+C)]),
+  \+ppl_Polyhedron_map_space_dimensions(P0, [A+C, C-A, B-B]), % A+C not map
+  \+ppl_Polyhedron_map_space_dimensions(P0, [A, C-A, B-B]),   % A not map
+  \+ppl_Polyhedron_map_space_dimensions(P0, [D-A, C-A, B-B]), % D not dimension
+  \+ppl_Polyhedron_map_space_dimensions(P0, [B-A, C-A, B-B]), % not injective
+  \+ppl_Polyhedron_map_space_dimensions(P0, [B-A, C-A, B-C]), % not function
+  ppl_delete_Polyhedron(P0),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 4, empty, P1),
+  ppl_Polyhedron_add_generators(P1, [point(2*C), line(A+B), ray(A+C)]),
+  ppl_Polyhedron_map_space_dimensions(P1, [A-C, C-A, B-B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, Q1),
+  ppl_Polyhedron_add_generators(Q1, [point(2*A), ray(A+C), line(B+C)]),
+  ppl_Polyhedron_equals_Polyhedron(P1, Q1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(Q1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 5, universe, P2),
+  ppl_Polyhedron_add_constraints(P2, [B = 2, E = 8]),
+  ppl_Polyhedron_add_space_dimensions_and_embed(P2, 2),
+  ppl_Polyhedron_map_space_dimensions(P2, [A-A, B-B, C-E, D-F, E-G, F-C, G-D]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 7, universe, Q2),
+  ppl_Polyhedron_add_constraints(Q2, [B = 2, G = 8]),
+  ppl_Polyhedron_equals_Polyhedron(P2, Q2),
+  !,
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(Q2).
+
+
+%%%%%%%%%%%%%%%%%% Affine Transformations %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_affine_image/4.
+affine_image :-
+  affine_image(c), affine_image(nnc).
+
+affine_image(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint(P, A - B = 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B = 1],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  ppl_Polyhedron_affine_image(P, A, A + 1, 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B = 2],
+                                      P2),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_affine_preimage/4.
+affine_preimage :-
+  affine_preimage(c), affine_preimage(nnc).
+
+affine_preimage(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint(P, A + B >= 10),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A + B >= 10],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  ppl_Polyhedron_affine_preimage(P, A, A + 1, 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A + B >= 9],
+                                      P2),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_bounded_affine_image/5
+bounded_affine_image :-
+  bounded_affine_image(c), bounded_affine_image(nnc).
+
+bounded_affine_image(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint(P, A - B = 1),
+  ppl_Polyhedron_bounded_affine_image(P, B, A - 1, A + 1, 2),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - 2*B =< 1, 2*B - A =< 1],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_bounded_affine_preimage/5
+bounded_affine_preimage :-
+  bounded_affine_preimage(c), bounded_affine_preimage(nnc).
+
+bounded_affine_preimage(T) :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+            [A >= 0, A =< 4, B >= 0, B =< 4, A - B =< 2, A - B >= -2],
+            P),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T, P, T, P1),
+  ppl_Polyhedron_add_space_dimensions_and_embed(P1, 1),
+  ppl_Polyhedron_bounded_affine_preimage(P, B, 7 - A, A + 3, 1),
+  ppl_Polyhedron_add_constraint(P1, 7 - A =< B),
+  ppl_Polyhedron_add_constraint(P1, B =< A + 3),
+  ppl_Polyhedron_remove_space_dimensions(P1, [B]),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+            [A >= 0, A =< 4, B >= 0, B =< 4, A - B =< 2, A - B >= -2],
+            Q),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T, Q, T, Q1),
+  ppl_Polyhedron_add_space_dimensions_and_embed(Q1, 1),
+  ppl_Polyhedron_bounded_affine_preimage(Q, B, 7 - 3*A + 2*B, B + 5*A - 3, 1),
+  ppl_Polyhedron_add_constraint(Q1, 7 - 3*A + 2*C =< B),
+  ppl_Polyhedron_add_constraint(Q1, B =< C + 5*A - 3),
+  ppl_Polyhedron_remove_space_dimensions(Q1, [B]),
+  ppl_Polyhedron_equals_Polyhedron(Q, Q1),
+  !,
+  ppl_delete_Polyhedron(Q1),
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_generalized_affine_image/5.
+affine_image_gen :-
+  affine_image_gen(c), affine_image_gen(nnc).
+
+affine_image_gen(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint(P, A - B = 1),
+  ppl_Polyhedron_generalized_affine_image(P, A, =<, A + 1, 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B =< 2],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_generalized_affine_preimage/5.
+affine_preimage_gen :-
+  affine_preimage_gen(c), affine_preimage_gen(nnc).
+
+affine_preimage_gen(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 0, A =< 4, B =< 5, A =< B]),
+  ppl_Polyhedron_generalized_affine_preimage(P, B, >=, A+2, 1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, [A >= 0, A =< 3]),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_generalized_affine_image_lhs_rhs/4.
+affine_image_genlr :-
+  make_vars(2, [A, B]),
+  affine_image_genlr(c, =<, [B - A =< 2], [A,B]),
+  affine_image_genlr(c, =, [B - A = 2], [A,B]),
+  affine_image_genlr(nnc, <, [B - A < 2], [A,B]),
+  affine_image_genlr(nnc, =<, [B - A =< 2], [A,B]).
+
+affine_image_genlr(T, R, CS, [A,B]) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint(P, A - B = 1),
+  ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, R, A + 1),
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+% % Tests ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4.
+affine_preimage_genlr :-
+  make_vars(2, [A, B]),
+  affine_preimage_genlr(c, B - 1, =<,  A + 1,
+      [A >= 0, A =< 4, B >= 0, B =< A], [A,B]),
+  affine_preimage_genlr(c, B + 1, =, A + 1,
+      [A >= 0, A =< 4, B >= 0, B =< A], [A,B]),
+  affine_preimage_genlr(nnc, B - 1, <, A + 1,
+      [A >= 0, A =< 4, B >= 0, B =< A], [A,B]),
+  affine_preimage_genlr(nnc, B - 1, =<, A + 1,
+      [A >= 0, A =< 4, B >= 0, B =< A], [A,B]).
+
+affine_preimage_genlr(T, LHS, R, RHS, CS, [A,_B]) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P, CS),
+  ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(P, LHS, R, RHS),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, [A >= 0, A =< 4]),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%%%% Widen and Extrapolation Operators %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_BHRZ03_widening_assign/2.
+widen_BHRZ03 :-
+  make_vars(2, [A, B]),
+  widen_BHRZ03(c, [A >= 1, B >= 0], [A >= 1, B >= 1],
+                  [A >= 1],         [A >= 1, B >= 1]
+              ),
+  widen_BHRZ03(nnc, [A > 1, B > 0], [A > 1, B > 1],
+                    [A > 1],        [A > 1, B > 1]
+              ).
+
+widen_BHRZ03(Topology, CS_P, CS_Q, CS_Pa, CS_Qa) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  ppl_Polyhedron_BHRZ03_widening_assign(P, Q),
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  widen_extrapolation_final(Q, CS_Qa, Topology).
+
+% Tests ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4.
+widen_BHRZ03_with_tokens :-
+  make_vars(2, [A, B]),
+  widen_BHRZ03_with_tokens(c, [A >= 1], [A >= 1, B >= 1],
+                             [A >= 1], [A >= 1, B >= 1], 1, 1
+                         ),
+  widen_BHRZ03_with_tokens(c, [A >= 1, B >= 0], [A >= 1, B >= 1],
+                             [A >= 1], [A >= 1, B >= 1], 1, 0
+                         ),
+  widen_BHRZ03_with_tokens(nnc, [A > 1], [A > 1, B > 1],
+                               [A > 1], [A > 1, B > 1], 2, 2
+                         ),
+  widen_BHRZ03_with_tokens(nnc, [A > 1, B >= 0], [A > 1, B >= 1],
+                               [A > 1, B >= 0], [A > 1, B >= 1], 3, 1
+                         ).
+
+widen_BHRZ03_with_tokens(Topology,
+                      CS_P, CS_Q, CS_Pa, CS_Qa, Token_i, Token_o) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  \+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q,
+                                            Token_i, 4),
+  \+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q,
+                                            Token_i, not_a_number),
+  ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q, Token_i, X),
+  ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q, X, Y),
+  Y == Token_o,
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  widen_extrapolation_final(Q, CS_Qa, Topology), !.
+
+% Tests ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3.
+lim_extrapolate_BHRZ03 :-
+  make_vars(2, [A, B]),
+  lim_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+                            [A >= 1, B >= 0], [A >= 1, B >= 0]
+                        ),
+  lim_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+                            [A >= 2],         []
+                        ),
+  lim_extrapolate_BHRZ03(nnc, [A > 1, B > 0], [A > 2, B > 1],
+                              [A > 1, B > 0], [A > 1, B > 0]
+                        ),
+  lim_extrapolate_BHRZ03(nnc, [A > 1, B >= 0], [A > 2, B >= 1],
+                              [A >= 2],        []
+                        ).
+
+lim_extrapolate_BHRZ03(Topology, CS_P, CS_Q, CS_lim, CS_Pa)  :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(P, Q, CS_lim),
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5.
+lim_extrapolate_BHRZ03_with_tokens :-
+  make_vars(2, [A, B]),
+  lim_extrapolate_BHRZ03_with_tokens(c,
+                  [A >= 1, B >= 0], [A >= 1, B >= 1],
+                  [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0
+                                   ),
+  lim_extrapolate_BHRZ03_with_tokens(nnc,
+                    [A > 1, B > 0], [A > 1, B > 1],
+                    [A > 1, B > 0], [A > 1, B > 0], 1, 0
+                                   ).
+
+lim_extrapolate_BHRZ03_with_tokens(Topology,
+                 CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  Wrong_Token is Token_i + 1,
+  \+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, Token_i, Wrong_Token),
+  \+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, Token_i, not_a_number),
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, Token_i, X),
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, X, Y),
+  Y == Token_o,
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+
+% Tests ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3.
+bound_extrapolate_BHRZ03 :-
+  make_vars(2, [A, B]),
+  bound_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+                              [A >= 1, B >= 0], [A >= 1, B >= 0]
+                          ),
+  bound_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+                              [A >= 2],         [A >= 1, B >= 0]
+                          ),
+  bound_extrapolate_BHRZ03(nnc, [A > 1, B > 0], [A > 2, B > 1],
+                                [A > 1, B > 0], [A > 1, B > 0]
+                          ),
+  bound_extrapolate_BHRZ03(nnc, [A > 1, B >= 0], [A > 2, B >= 1],
+                                [A >= 2],        [A > 1, B >= 0]
+                          ).
+
+bound_extrapolate_BHRZ03(Topology, CS_P, CS_Q, CS_lim, CS_Pa)  :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(P, Q, CS_lim),
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5.
+bound_extrapolate_BHRZ03_with_tokens :-
+  make_vars(2, [A, B]),
+  bound_extrapolate_BHRZ03_with_tokens(c,
+                            [A >= 1, B >= 0], [A >= 1, B >= 1],
+                            [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0
+                                     ),
+  bound_extrapolate_BHRZ03_with_tokens(nnc,
+                            [A > 1, B > 0], [A > 1, B > 1],
+                            [A > 1, B > 0], [A > 1, B > 0], 1, 0
+                                     ).
+
+bound_extrapolate_BHRZ03_with_tokens(Topology,
+                 CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  Wrong_Token is Token_i + 1,
+  \+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, Token_i, Wrong_Token),
+  \+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, Token_i, not-a_number),
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, Token_i, X),
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, X, Y),
+  Y == Token_o,
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_H79_widening_assign/2.
+widen_H79 :-
+  make_vars(2, [A, B]),
+  widen_H79(c,   [A >= 1, B >= 0], [A >= 1, B >= 1],
+                 [A >= 1],         [A >= 1, B >= 1]
+           ),
+  widen_H79(nnc, [A > 1, B > 0], [A > 1, B > 1],
+                 [A > 1], [A > 1, B > 1]
+           ),
+  widen_H79(c,   [A >= 0, A =< 1], [A = 0],
+                 [A >= 0],         [A = 0]
+           ),
+  widen_H79(nnc, [A >= 0, A =< 1], [A = 0],
+                 [A >= 0],         [A = 0]
+           ).
+
+widen_H79(Topology, CS_P, CS_Q, CS_Pa, CS_Qa) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  ppl_Polyhedron_H79_widening_assign(P, Q),
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  widen_extrapolation_final(Q, CS_Qa, Topology).
+
+% Tests ppl_Polyhedron_H79_widening_assign_with_tokens/4.
+widen_H79_with_tokens :-
+  make_vars(2, [A, B]),
+  widen_H79_with_tokens(c, [A >= 1], [A >= 1, B >= 1],
+                             [A >= 1], [A >= 1, B >= 1], 1, 1
+                         ),
+  widen_H79_with_tokens(c, [A >= 1, B >= 0], [A >= 1, B >= 1],
+                             [A >= 1], [A >= 1, B >= 1], 1, 0
+                         ),
+  widen_H79_with_tokens(nnc, [A > 1], [A > 1, B > 1],
+                               [A > 1], [A > 1, B > 1], 2, 2
+                         ),
+  widen_H79_with_tokens(nnc, [A > 1, B >= 0], [A > 1, B >= 1],
+                               [A > 1, B >= 0], [A > 1, B >= 1], 3, 1
+                         ).
+
+widen_H79_with_tokens(Topology,
+                      CS_P, CS_Q, CS_Pa, CS_Qa, Token_i, Token_o) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  \+ ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q,
+                                            Token_i, 4),
+  \+ ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q,
+                                            Token_i, not_a_number),
+  ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q, Token_i, X),
+  ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q, X, Y),
+  Y == Token_o,
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  widen_extrapolation_final(Q, CS_Qa, Topology), !.
+
+% Tests ppl_Polyhedron_limited_H79_extrapolation_assign/3.
+lim_extrapolate_H79 :-
+  make_vars(2, [A, B]),
+  lim_extrapolate_H79(c,   [A >= 1, B >= 0], [A >= 2, B >= 1],
+                           [A >= 1, B >= 0], [A >= 1, B >= 0]
+                     ),
+  lim_extrapolate_H79(c,   [A >= 1, B >= 0], [A >= 2, B >= 1],
+                           [A >= 2],         []
+                     ),
+  lim_extrapolate_H79(nnc, [A > 1, B > 0], [A > 2, B > 1],
+                           [A > 1, B > 0], [A > 1, B > 0]
+                     ),
+  lim_extrapolate_H79(nnc, [A > 1, B >= 0], [A > 2, B >= 1],
+                           [A >= 2],        []
+                     ),
+  lim_extrapolate_H79(c,   [A >= 0, A =< 1], [A = 0],
+                           [A >= 0], [A >= 0]
+                     ),
+  lim_extrapolate_H79(nnc, [A >= 0, A =< 1], [A = 0],
+                           [A >= 0], [A >= 0]
+                    ).
+
+lim_extrapolate_H79(Topology, CS_P, CS_Q, CS_lim, CS_Pa)  :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  ppl_Polyhedron_limited_H79_extrapolation_assign(P, Q, CS_lim),
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5.
+lim_extrapolate_H79_with_tokens :-
+  make_vars(2, [A, B]),
+  lim_extrapolate_H79_with_tokens(c,
+                  [A >= 1, B >= 0], [A >= 1, B >= 1],
+                  [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0
+                                   ),
+  lim_extrapolate_H79_with_tokens(nnc,
+                    [A > 1, B > 0], [A > 1, B > 1],
+                    [A > 1, B > 0], [A > 1, B > 0], 1, 0
+                                   ).
+
+lim_extrapolate_H79_with_tokens(Topology,
+                 CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  Wrong_Token is Token_i + 1,
+  \+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, Token_i, Wrong_Token),
+  \+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, Token_i, not_a_number),
+  ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, Token_i, X),
+  ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, X, Y),
+  Y == Token_o,
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+
+% Tests ppl_Polyhedron_bounded_H79_extrapolation_assign/3.
+bound_extrapolate_H79 :-
+  make_vars(2, [A, B]),
+  bound_extrapolate_H79(c,   [A >= 1, B >= 0], [A >= 2, B >= 1],
+                             [A >= 1, B >= 0], [A >= 1, B >= 0]
+                       ),
+  bound_extrapolate_H79(c,   [A >= 1, B >= 0], [A >= 2, B >= 1],
+                             [A >= 2],         [A >= 1, B >= 0]
+                       ),
+  bound_extrapolate_H79(nnc, [A > 1, B > 0], [A > 2, B > 1],
+                             [A > 1, B > 0], [A > 1, B > 0]
+                       ),
+  bound_extrapolate_H79(nnc, [A > 1, B >= 0], [A > 2, B >= 1],
+                             [A >= 2],        [A > 1, B >= 0]
+                       ).
+
+bound_extrapolate_H79(Topology, CS_P, CS_Q, CS_lim, CS_Pa)  :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  ppl_Polyhedron_bounded_H79_extrapolation_assign(P, Q, CS_lim),
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+
+% Tests ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5.
+bound_extrapolate_H79_with_tokens :-
+  make_vars(2, [A, B]),
+  bound_extrapolate_H79_with_tokens(c,
+                            [A >= 1, B >= 0], [A >= 1, B >= 1],
+                            [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0
+                                     ),
+  bound_extrapolate_H79_with_tokens(nnc,
+                            [A > 1, B > 0], [A > 1, B > 1],
+                            [A > 1, B > 0], [A > 1, B > 0], 1, 0
+                                     ).
+
+bound_extrapolate_H79_with_tokens(Topology,
+                 CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  Wrong_Token is Token_i + 1,
+  \+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, Token_i, Wrong_Token),
+  \+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, Token_i, not_a_number),
+  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, Token_i, X),
+  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, X, Y),
+  Y == Token_o,
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+% widen_extrapolation_init/3 and widen_extrapolation_final/3
+% are used in the tests for widening and extrapolation predicates.
+widen_extrapolation_init(P, CS, Topology):-
+  clean_ppl_new_Polyhedron_from_space_dimension(Topology, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P, CS).
+
+widen_extrapolation_final(P,CS, Topology):-
+  clean_ppl_new_Polyhedron_from_space_dimension(Topology, 2, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, CS),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+%%%%%%%%%%%%%%%%%% Get Constraint or Generator System %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_get_constraints/2.
+get_cons :-
+  get_cons(c), get_cons(nnc).
+
+get_cons(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_get_constraints(P, []),
+  ppl_Polyhedron_add_constraint(P, A - B >= 1),
+  \+  ppl_Polyhedron_get_constraints(P, []),
+  ppl_Polyhedron_get_constraints(P, [C]),
+  clean_ppl_new_Polyhedron_from_constraints(T, [C], Q),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_get_minimized_constraints/2.
+get_min_cons :-
+  get_min_cons(c), get_min_cons(nnc).
+
+get_min_cons(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_get_minimized_constraints(P, []),
+  ppl_Polyhedron_add_constraints(P, [A - B >= 1, A - B >= 0]),
+  ppl_Polyhedron_get_minimized_constraints(P, [C]),
+  clean_ppl_new_Polyhedron_from_constraints(T, [C], Q),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  ppl_Polyhedron_add_constraints(P, [A - B =< 0]),
+  \+ppl_Polyhedron_get_minimized_constraints(P, [C]),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_get_generators/2.
+get_gens :-
+  get_gens(c), get_gens(nnc).
+
+get_gens(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P),
+  ppl_Polyhedron_get_generators(P, []),
+  \+ ppl_Polyhedron_get_generators(P, [_]),
+  ppl_Polyhedron_add_generator(P, point(A+B)),
+  ppl_Polyhedron_get_generators(P, [G]),
+  clean_ppl_new_Polyhedron_from_generators(T, [G], Q),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  ppl_Polyhedron_add_generator(P, point(A+B, 2)),
+  ppl_Polyhedron_get_generators(P, GS1),
+  ppl_Polyhedron_add_generators(Q, GS1),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  ppl_Polyhedron_add_generator(P, line(A)),
+  ppl_Polyhedron_get_generators(P, GS2),
+  ppl_Polyhedron_add_generators(Q, GS2),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_get_minimized_generators/2.
+get_min_gens :-
+  get_min_gens(c), get_min_gens(nnc).
+
+get_min_gens(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P),
+  ppl_Polyhedron_add_generators(P, [point(2*A), point(A+B), point(2*B)]),
+  \+ ppl_Polyhedron_get_minimized_generators(P, [_]),
+  ppl_Polyhedron_get_minimized_generators(P, [G1, G2]),
+  clean_ppl_new_Polyhedron_from_generators(T, [G1, G2], Q),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+
+%%%%%%%%%%%%%%%%%% Polyhedral Relations %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_relation_with_constraint/3.
+rel_cons :-
+  make_vars(3, [A, B, C]),
+  rel_cons(c, [A >= 1, B >= 0, C = 0], [A, B, C]),
+  rel_cons(nnc, [A > 1, B >= 0, C = 0], [A, B, C]).
+
+rel_cons(T, CS, [A, B, C]) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, CS),
+  \+ ppl_Polyhedron_relation_with_constraint(P, A = 0, x),
+  ppl_Polyhedron_relation_with_constraint(P, A = 0, R),
+  R = [is_disjoint],
+  ppl_Polyhedron_relation_with_constraint(P, B = 0, R1),
+  R1 = [strictly_intersects],
+  ppl_Polyhedron_relation_with_constraint(P, A >= 0, R2),
+  R2 = [is_included],
+  ppl_Polyhedron_relation_with_constraint(P, C >= 0, R3),
+  (R3 = [is_included, saturates] ; R3 = [saturates, is_included]),
+  ppl_Polyhedron_relation_with_constraint(P, A = B, R4),
+  R4 = [strictly_intersects],
+  ppl_Polyhedron_add_constraint(P, A = B),
+  ppl_Polyhedron_relation_with_constraint(P, A = B, R5),
+  (R5 = [is_included, saturates] ; R5 = [saturates, is_included]),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_relation_with_generator/3.
+rel_gens :-
+  make_vars(3, [A, B, C]),
+  rel_gens(c, [point(A + B + C), ray(A)], [A, B, C]),
+  rel_gens(nnc, [point(A + B + C), ray(A)], [A, B, C]).
+
+rel_gens(T, GS, [A, _, _]) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P),
+  ppl_Polyhedron_add_generators(P, GS),
+  \+ppl_Polyhedron_relation_with_generator(P, point(A), x),
+  ppl_Polyhedron_relation_with_generator(P, point(A), R),
+  R = [],
+  ppl_Polyhedron_relation_with_generator(P, ray(A), R1),
+  R1 = [subsumes],
+  !,
+  ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%%%% Check Properties %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%  tests ppl_Polyhedron_is_universe/1,
+%        ppl_Polyhedron_is_empty/1,
+%        ppl_Polyhedron_is_bounded/1,
+%        ppl_Polyhedron_is_topologically_closed/1.
+checks :-
+  checks(c), checks(nnc).
+
+checks(T) :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P1),
+  ppl_Polyhedron_is_universe(P),
+  ppl_Polyhedron_is_empty(P1),
+  \+ppl_Polyhedron_is_universe(P1),
+  \+ppl_Polyhedron_is_empty(P),
+  ppl_Polyhedron_add_generators(P1, [point(A + B + C)]),
+  ppl_Polyhedron_is_bounded(P1),
+  ppl_Polyhedron_add_generators(P1, [ray(A + B + C)]),
+  \+ ppl_Polyhedron_is_bounded(P1),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B =< 3, A =< 2]),
+  ppl_Polyhedron_is_topologically_closed(P),
+   (T = nnc ->
+     (ppl_Polyhedron_add_constraints(P, [A > 1, B =< 3, A =< 2]),
+      \+ ppl_Polyhedron_is_topologically_closed(P),
+      ppl_Polyhedron_add_constraints(P, [A > 2]),
+      ppl_Polyhedron_is_topologically_closed(P))
+   ; true
+   ),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_contains_Polyhedron/2.
+contains :-
+  contains(c), contains(nnc).
+
+contains(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P2),
+  ppl_Polyhedron_contains_Polyhedron(P1, P2),
+  \+ppl_Polyhedron_contains_Polyhedron(P2, P1),
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+% Tests ppl_Polyhedron_strictly_contains_Polyhedron for C/2.
+strict_contains :-
+  strict_contains(c), strict_contains(nnc).
+
+strict_contains(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P2),
+  ppl_Polyhedron_strictly_contains_Polyhedron(P1, P2),
+  \+ppl_Polyhedron_strictly_contains_Polyhedron(P1, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+% Tests ppl_Polyhedron_is_disjoint_from_Polyhedron/2.
+disjoint_from :-
+  disjoint_from(c), disjoint_from(nnc).
+
+disjoint_from(T) :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [3 >= A, 4*A + B - 2*C >= 5],
+                                      P1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [4 =< A, 4*A + B - 2*C >= 5],
+                                      P2),
+  ppl_Polyhedron_is_disjoint_from_Polyhedron(P1, P2),
+  \+ppl_Polyhedron_is_disjoint_from_Polyhedron(P1, P1),
+  (T = nnc ->
+     (clean_ppl_new_Polyhedron_from_constraints(nnc,
+                                      [3 < A, 4*A + B - 2*C >= 5],
+                                      P2a),
+    ppl_Polyhedron_is_disjoint_from_Polyhedron(P1, P2a),
+    ppl_delete_Polyhedron(P2a))
+  ; true
+  ),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+% Tests ppl_Polyhedron_equals_Polyhedron/2.
+equals :-
+  equals(c), equals(nnc).
+
+equals(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P2),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P3),
+  ppl_Polyhedron_equals_Polyhedron(P1, P2),
+  \+ ppl_Polyhedron_equals_Polyhedron(P1, P3),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P3).
+
+% Tests ppl_Polyhedron_OK/1.
+ok :-
+  ok(c), ok(nnc).
+
+ok(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 0, universe, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P2),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 0, empty, P3),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P4),
+  ppl_Polyhedron_OK(P1),
+  ppl_Polyhedron_OK(P2),
+  ppl_Polyhedron_OK(P3),
+  ppl_Polyhedron_OK(P4),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P3),
+  ppl_delete_Polyhedron(P4).
+
+%%%%%%%%%%%%%%%%%%%%%%%%% Polyhedron Bounding Values %%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_get_bounding_box/3.
+
+get_bounding_box:-
+  make_vars(2, [A, B]),
+  get_bounding_box(c, [B >= 0, 4*A =< 2],
+                     [i(o(minf), c(1/2)), i(c(0), o(pinf))]),
+  get_bounding_box(c, [], [i(o(minf), o(pinf)), i(o(minf), o(pinf))]),
+  get_bounding_box(c, [1=0], [empty, empty]),
+  get_bounding_box(c, [A =< 4, B =< 4, 3*A + B >= 2],
+                     [i(c(-2/3), c(4)), i(c(-10), c(4))]),
+  get_bounding_box(nnc, [B > 0, 4*A =< 2],
+                     [i(o(minf), c(1/2)), i(o(0), o(pinf))]),
+  get_bounding_box(nnc,[A > 1, B > 1, A < 1, B < 1], [empty, empty]),
+  get_bounding_box(nnc, [A =< 4, B =< 4, 3*A + B > 2],
+                     [i(o(-2/3), c(4)), i(o(-10), c(4))]).
+
+get_bounding_box(T, CS, Box) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P, CS),
+  \+ppl_Polyhedron_get_bounding_box(P, any, box),
+  ppl_Polyhedron_get_bounding_box(P, any, Box),
+  ppl_Polyhedron_get_bounding_box(P, polynomial, Box1),
+  ppl_Polyhedron_get_bounding_box(P, simplex, Box2),
+  clean_ppl_new_Polyhedron_from_bounding_box(T, Box, P1),
+  clean_ppl_new_Polyhedron_from_bounding_box(T, Box1, P2),
+  clean_ppl_new_Polyhedron_from_bounding_box(T, Box2, P3),
+  ppl_Polyhedron_contains_Polyhedron(P1, P),
+  ppl_Polyhedron_contains_Polyhedron(P2, P1),
+  ppl_Polyhedron_contains_Polyhedron(P3, P1),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P3).
+
+% Tests ppl_Polyhedron_bounds_from_above/2.
+bounds_from_above :-
+  make_vars(2, [A, B]),
+  bounds_from_above(c, [A >= 1, B >= 0], [B =< 2], B),
+  bounds_from_above(nnc, [A > 1, B > 0, B < 1], [A < 2], A).
+
+bounds_from_above(T, CS1, CS2, Var) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS1, P),
+  \+ ppl_Polyhedron_bounds_from_above(P, Var),
+  ppl_Polyhedron_add_constraints(P, CS2),
+  ppl_Polyhedron_bounds_from_above(P, Var),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_bounds_from_below/2.
+bounds_from_below :-
+  make_vars(2, [A, B]),
+  bounds_from_below(c, [B >= 0, B =< 1], [A >= 1], A),
+  bounds_from_below(nnc, [B > 0, B < 1], [A > 2], A).
+
+bounds_from_below(T, CS1, CS2, Var) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS1, P),
+  \+ ppl_Polyhedron_bounds_from_below(P, Var),
+  ppl_Polyhedron_add_constraints(P, CS2),
+  ppl_Polyhedron_bounds_from_below(P, Var),
+  ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%%%%%%%%%%% Maximize and Minimize %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_maximize/5.
+maximize :-
+  make_vars(2, [A, B]),
+  maximize(c, [A >= -1, A =< 1, B >= -1, B =< 1], A + B, 2, 1, true),
+  maximize(c, [B >= -1, B =< 1], B, 1, 1, true),
+  maximize(nnc, [A > -1, A < 1, B > -1, B < 1], A + B -1, 1, 1, false),
+  maximize(nnc, [B > -1, B < 1], B, 1, 1, false).
+
+maximize(T, CS, LE, N, D, Max) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+  ppl_Polyhedron_maximize(P, LE, N, D, Max),
+  ppl_Polyhedron_add_generator(P, ray(LE)),
+  \+ ppl_Polyhedron_maximize(P, LE, _, _, _),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_maximize_with_point/5.
+maximize_with_point :-
+  make_vars(2, [A, B]),
+  maximize_with_point(c, [A >= -1, A =< 1, B >= -1, B =< 1],
+                                        A + B, 2, 1, true, point(A+B)),
+  maximize_with_point(c, [A =< 0],
+                                        A, 0, 1, true, point(0)),
+  maximize_with_point(nnc, [A > -1, A < 1, B > -1, B < 1],
+                                        A + B -1, 1, 1, false, point(A+B)).
+
+maximize_with_point(T, CS, LE, N, D, Max, Point) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+  ppl_Polyhedron_maximize_with_point(P, LE, N, D, Max, Point_Max),
+  (Point_Max = closure_point(E) ; Point_Max = point(E)),
+  clean_ppl_new_Polyhedron_from_generators(T, [point(E)], Pm),
+  clean_ppl_new_Polyhedron_from_generators(T, [Point], Qm),
+  ppl_Polyhedron_equals_Polyhedron(Pm, Qm),
+  !,
+  ppl_delete_Polyhedron(Pm),
+  ppl_delete_Polyhedron(Qm),
+  \+ ppl_Polyhedron_maximize_with_point(P, LE, _N, 0, _, _),
+  !,
+  ppl_delete_Polyhedron(P).
+
+
+% Tests ppl_Polyhedron_minimize/5.
+minimize :-
+  make_vars(2, [A, B]),
+  minimize(c, [A >= -1, A =< 1, B >= -1, B =< 1], A + B, -2, 1, true),
+  minimize(c, [B >= -1, B =< 1], B, -1, 1, true),
+  minimize(nnc, [A > -2, A =< 2, B > -2, B =< 2], A + B + 1, -3, 1, false),
+  minimize(nnc, [B > -1, B < 1], B, -1, 1, false).
+
+minimize(T, CS, LE, N, D, Min) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+  ppl_Polyhedron_minimize(P, LE, N, D, Min),
+  ppl_Polyhedron_add_generator(P, ray(-LE)),
+  \+ ppl_Polyhedron_minimize(P, LE, _, _, _),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_minimize_with_point/5.
+minimize_with_point :-
+  make_vars(2, [A, B]),
+  minimize_with_point(c, [A >= -1, A =< 1, B >= -1, B =< 1],
+                                        A + B, -2, 1, true, point(-A-B)),
+  minimize_with_point(c, [A >= 0],
+                                        A, 0, 1, true, point(0)),
+  minimize_with_point(nnc, [A > -2, A =< 2, B > -2, B =< 2],
+                                        A + B, -4, 1, false, point(-2*A-2*B)).
+
+minimize_with_point(T, CS, LE, N, D, Min, Point) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+  ppl_Polyhedron_minimize_with_point(P, LE, N, D, Min, Point_Min),
+  (Point_Min = closure_point(E) ; Point_Min = point(E)),
+  clean_ppl_new_Polyhedron_from_generators(T, [point(E)], Pm),
+  clean_ppl_new_Polyhedron_from_generators(T, [Point], Qm),
+  ppl_Polyhedron_equals_Polyhedron(Pm, Qm),
+  !,
+  ppl_delete_Polyhedron(Pm),
+  ppl_delete_Polyhedron(Qm),
+   \+ ppl_Polyhedron_minimize_with_point(P, LE, _N, 0, _, _),
+  !,
+  ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%%% Watchdog tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests Watchdog predicates
+% ppl_set_timeout/1
+% ppl_set_timeout_exception_atom/1
+% ppl_timeout_exception_atom/1
+% ppl_reset_timeout/0
+%
+
+time_out :-
+  time_out(c), time_out(nnc).
+
+time_out(T) :-
+  make_vars(6, [A, B, C, D, E, F]),
+  CS = [8*A - 7*B + 4*D - E - 8*F >= -3,
+        6*A + 8*B + 4*C - 6*D + 6*E + 6*F >= 5,
+        6*A + 7*B - 6*C + 3*D + 3*E + 5*F >= 4,
+        6*A + C + 8*D - 2*E - 3*F >= -6,
+        4*A - 3*B + 3*D - 3*E + 4*F >= 0,
+        3*A - 3*B - 7*C - 4*D - 7*E + 8*F >= 8,
+        -2*A + 5*B + C + 2*D - 2*E + 6*F >= -7,
+        -4*A + 7*B - 7*C + 2*D - 2*E - 7*F >= 1,
+        -5*A + 7*B + 5*C + 6*D - 5*E - 2*F >= -7,
+        -5*A + 6*B - 6*C - 2*D + 4*E - 2*F >= -5,
+        -5*A + 5*B + 8*C + D + E - 6*F >= -6],
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 6, universe, Q),
+  ppl_set_timeout_exception_atom(pl_time_out),
+  \+  ppl_timeout_exception_atom(pl_x),
+  ppl_timeout_exception_atom(pl_time_out),
+  N1 = 1,
+  ppl_set_timeout(N1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 6, universe, P),
+  time_watch(T, ppl_Polyhedron_add_constraints_and_minimize(P, CS),
+             (ppl_Polyhedron_add_constraints_and_minimize(Q, CS)),
+              (true, (display_message(
+                 ['while testing the time_out, polyhedron with topology',
+                                             T, 'timeout after', N1,ms])))),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 6, universe, Q1),
+  N2 = 10,
+  ppl_set_timeout(N2),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 6, universe, P1),
+  time_watch(T, ppl_Polyhedron_add_constraints_and_minimize(P1, CS),
+             (ppl_Polyhedron_add_constraints_and_minimize(Q1, CS)),
+              (true, display_message(
+                 ['polyhedron with topology',T,'timeout after',N2,ms]))),
+  ppl_Polyhedron_equals_Polyhedron(P1, Q1),
+  ppl_set_timeout_exception_atom(time_out),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(Q1),
+  ppl_finalize.
+
+% time_watch(+Topology, +Goal, +No_Time_Out, +Time_Out)
+% time_watch/4 makes a copy of Goal with a copy of the polyhedron
+% and executes it with the currrent timeout exception settings.
+% If the call exceeds the time allowed, it catches the exception
+% and performs the Time_Out goal.
+% If the call does not exceed the time allowed,
+% then the timeout exception time is reset and
+% then Goal is executed and then the No_Time_Out is executed.
+
+time_watch(Topology, Goal, No_Time_Out, Time_Out) :-
+   !,
+   Goal =.. [PPLFunct, Poly|Args],
+   clean_ppl_new_Polyhedron_from_Polyhedron(Topology, Poly,
+                                            Topology, Polyhedron_Copy),
+   Goal_Copy =.. [PPLFunct, Polyhedron_Copy|Args],
+   ppl_timeout_exception_atom(Time_Out_Atom),
+     (catch(Goal_Copy, Time_Out_Atom, fail) ->
+       (ppl_reset_timeout,
+        ppl_Polyhedron_swap(Poly, Polyhedron_Copy),
+        call(No_Time_Out))
+     ;
+       call(Time_Out)
+   ),
+   !,
+   ppl_delete_Polyhedron(Polyhedron_Copy).
+
+%%%%%%%%%%%%%%%%% LP_Problem tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+lp_problem :-
+  lp_trivial,
+  lp_from_cons,
+  lp_from_lp,
+  lp_swap,
+  lp_get,
+  lp_clear,
+  lp_satisfiable,
+  lp_set,
+  lp_solve,
+  lp_eval.
+
+lp_trivial :-
+  clean_ppl_new_LP_Problem_trivial(LP),
+  ppl_LP_Problem_space_dimension(LP, 0),
+  ppl_LP_Problem_objective_function(LP, Obj),
+  compare_lin_expressions(Obj, 0),
+  ppl_LP_Problem_optimization_mode(LP, max),
+  ppl_LP_Problem_constraints(LP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  ppl_Polyhedron_is_universe(PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_LP_Problem(LP).
+
+lp_from_cons :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP),
+  ppl_LP_Problem_space_dimension(LP, 3),
+  ppl_LP_Problem_constraints(LP, CS),
+  ppl_LP_Problem_objective_function(LP, Obj),
+  compare_lin_expressions(Obj, C),
+  ppl_LP_Problem_optimization_mode(LP, max),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  clean_ppl_new_Polyhedron_from_constraints(c,
+       [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_LP_Problem(LP).
+
+lp_from_lp :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP1),
+  clean_ppl_new_LP_Problem_from_LP_Problem(LP1, LP),
+  ppl_LP_Problem_objective_function(LP, Obj),
+  compare_lin_expressions(Obj, C),
+  ppl_LP_Problem_optimization_mode(LP, max),
+  ppl_LP_Problem_constraints(LP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  ppl_LP_Problem_constraints(LP1, Expect_CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, Expect_CS, Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_LP_Problem(LP1),
+  ppl_delete_LP_Problem(LP).
+
+lp_swap :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_LP_Problem_trivial(LP),
+  clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP1),
+  ppl_LP_Problem_swap(LP, LP1),
+  ppl_LP_Problem_constraints(LP, CS),
+  ppl_LP_Problem_constraints(LP1, CS1),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS1, PH1),
+  ppl_Polyhedron_is_universe(PH1),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  clean_ppl_new_Polyhedron_from_constraints(c,
+       [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(PH1),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_LP_Problem(LP1),
+  ppl_delete_LP_Problem(LP).
+
+lp_get :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP),
+  ppl_LP_Problem_constraints(LP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  clean_ppl_new_Polyhedron_from_constraints(c,
+       [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  ppl_LP_Problem_objective_function(LP, Obj),
+  compare_lin_expressions(Obj, C),
+  ppl_LP_Problem_optimization_mode(LP, Opt),
+  Opt = max,
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_LP_Problem(LP).
+
+lp_clear :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, min, LP),
+  ppl_LP_Problem_clear(LP),
+  ppl_LP_Problem_space_dimension(LP, D),
+  D == 0,
+  ppl_LP_Problem_constraints(LP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  ppl_Polyhedron_is_universe(PH),
+  ppl_LP_Problem_objective_function(LP, Obj),
+  compare_lin_expressions(Obj, 0),
+  ppl_LP_Problem_optimization_mode(LP, Opt),
+  Opt == max,
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_LP_Problem(LP).
+
+lp_satisfiable :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP),
+  ppl_LP_Problem_is_satisfiable(LP),
+  ppl_LP_Problem_add_constraint(LP, A + B =< 0),
+  \+ ppl_LP_Problem_is_satisfiable(LP),
+  !,
+  ppl_delete_LP_Problem(LP).
+
+lp_add :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_LP_Problem_trivial(LP),
+  ppl_LP_Problem_add_constraint(LP, A >= 0),
+  ppl_LP_Problem_add_constraints(LP, [A =< 3, A + B + C >= 9, B >= 5, C =< 5]),
+  clean_ppl_new_LP_Problem([A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5],
+      2*B-C, max, LP1),
+  ppl_LP_Problem_solve(LP, Status),
+  ppl_LP_Problem_solve(LP1, Status),
+  ppl_LP_Problem_optimal_value(LP, N, D),
+  ppl_LP_Problem_optimal_value(LP1, N, D),
+  ppl_LP_Problem_constraints(LP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  ppl_LP_Problem_constraints(LP1, Expect_CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, Expect_CS, Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_LP_Problem(LP),
+  ppl_delete_LP_Problem(LP1).
+
+lp_set :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_LP_Problem(
+    [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 0, max, LP),
+  ppl_LP_Problem_objective_function(LP, 0),
+  ppl_LP_Problem_optimization_mode(LP, max),
+  ppl_LP_Problem_set_objective_function(LP, 2*B-C),
+  ppl_LP_Problem_set_optimization_mode(LP, min),
+  ppl_LP_Problem_objective_function(LP, Obj),
+  compare_lin_expressions(Obj, 2*B-C),
+  ppl_LP_Problem_optimization_mode(LP, min),
+  ppl_LP_Problem_solve(LP, optimized),
+  !,
+  ppl_delete_LP_Problem(LP).
+
+lp_solve :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_LP_Problem(
+    [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 0, max, LP),
+  ppl_LP_Problem_objective_function(LP, 0),
+  ppl_LP_Problem_optimization_mode(LP, max),
+  ppl_LP_Problem_set_objective_function(LP, 2*B-C),
+  ppl_LP_Problem_set_optimization_mode(LP, min),
+  ppl_LP_Problem_solve(LP, optimized),
+  ppl_LP_Problem_set_objective_function(LP, C),
+  ppl_LP_Problem_solve(LP, unbounded),
+  ppl_LP_Problem_add_constraint(LP, B = 0),
+  ppl_LP_Problem_solve(LP, unfeasible),
+  \+ppl_LP_Problem_solve(LP, invalid_status),
+  !,
+  ppl_delete_LP_Problem(LP).
+
+lp_eval :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_LP_Problem([A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5],
+      2*B-C, min, LP),
+  \+ ppl_LP_Problem_optimizing_point(LP, closure_point(_X)),
+  ppl_LP_Problem_optimizing_point(LP, Point),
+  ppl_LP_Problem_feasible_point(LP, Point),
+  \+ ppl_LP_Problem_feasible_point(LP, point(B)),
+  clean_ppl_new_Polyhedron_from_generators(c, [Point], PH),
+  clean_ppl_new_Polyhedron_from_generators(c, [point(5*B+5*C)], Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  \+ ppl_LP_Problem_optimal_value(LP, 2, 1),
+  ppl_LP_Problem_optimal_value(LP, N, D),
+  \+ ppl_LP_Problem_evaluate_objective_function(LP, Point, 2, 1),
+  ppl_LP_Problem_evaluate_objective_function(LP, Point, N1, D1),
+  N == N1,
+  D == D1,
+  ppl_LP_Problem_OK(LP),
+  !,
+  ppl_delete_LP_Problem(LP),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_Polyhedron(PH).
+
+% compare_lin_expressions/2 checks if 2 linear expressions
+% are semantically the same.
+%
+% If we need to compare 2 linear expressions, then this is better
+% than a syntactic check- since we want 1*C equal to C.
+
+compare_lin_expressions(LE1, LE2) :-
+  clean_ppl_new_Polyhedron_from_constraints(c, [LE1 = 0], PH1),
+  clean_ppl_new_Polyhedron_from_constraints(c, [LE2 = 0], PH2),
+  ppl_Polyhedron_equals_Polyhedron(PH1, PH2),
+  !,
+  ppl_delete_Polyhedron(PH1),
+  ppl_delete_Polyhedron(PH2).
+
+%%%%%%%%%%%%%%%% Check C++ <--> Prolog numbers %%%%%%%%%%%%%%%%%%%%%%%
+
+/*
+ This test checks the transfer of large numbers between Prolog and C++.
+ We test all numbers (BigNum) which are +/- (2^E +/- A) where E is one of
+ the numbers in the list defined by large_integers_exponents/1 and
+ A is one of the numbers in the list defined by large_integers_additions/1.
+
+ Thus we pass a BigNum from the Prolog to C++ and construct a polyhedron
+ P (space dimension = 1) consisting of a single point A = BigNum.
+ We also get the constraint defining P and then construct a second
+ polyhedron P1 from this constraint; P is then compared with P1.
+ To ensure that errors from Prolog to C++ and C++ to Prolog do not cancel
+ each other out, we also construct a polyhedron P2 consisting of just
+ the point A = 1 and use affine transformations (on polyhedra) to change P2
+ to a polyhedron with the point A = BigNum; then P2 is compared with P.
+
+ To see exactly which numbers are tested, first make the test "extra noisy"
+ using make_extra_noisy/0; i.e., type:
+ make_extra_noisy, large_integers.
+*/
+
+large_integers_exponents([0, 7, 8, 15, 16, 27, 28, 29, 30, 31, 32, 63, 64]).
+
+large_integers_additions([-3, -2, -1, 0, 1, 2, 3]).
+
+large_integers :-
+  large_integers_exponents(Exps),
+  large_integers_additions(Adds),
+  out(large_int, init),
+  large_integers_prolog_cpp(Exps, Adds),
+  pl_check_prolog_flag(bounded, Y),
+  (Y == true ->
+    (out(sys_large_int, init),
+     large_integers_sys_prolog_cpp(Adds))
+   ;
+     true
+  ).
+
+large_integers_prolog_cpp([], _).
+large_integers_prolog_cpp([Exp|Exps], Adds) :-
+  pl_check_prolog_flag(bounded, F),
+  (F == true ->
+     pl_check_prolog_flag(max_integer, Max_int),
+    (Max_int >> 1 =< 1 << Exp + 3 ->
+       true
+    ;
+       large_integers_prolog_cpp1(Adds, Exp),
+       large_integers_prolog_cpp(Exps, Adds)
+    )
+  ;
+     large_integers_prolog_cpp1(Adds, Exp),
+     large_integers_prolog_cpp(Exps, Adds)
+  ).
+
+large_integers_prolog_cpp1([], _).
+large_integers_prolog_cpp1([Add|Adds], Exp) :-
+  large_integers_prolog_cpp2(Exp, Add, 1),
+  large_integers_prolog_cpp2(Exp, Add, -1),
+  large_integers_prolog_cpp1(Adds, Exp).
+
+large_integers_prolog_cpp2(Exp, Add, Sign) :-
+  Inhomo is Sign * ((1 << Exp) + Add),
+  out(large_int, Inhomo, Sign, Add, Exp),
+  make_vars(1, [A]),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A = Inhomo]),
+  ppl_Polyhedron_get_constraints(P, CS),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, CS),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P2),
+  ppl_Polyhedron_add_constraint(P2, A = 1),
+  large_integers_affine_transform_loop(Exp, P2, A),
+  ppl_Polyhedron_affine_image(P2, A, Sign * (A + Add), 1),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+large_integers_sys_prolog_cpp([]).
+large_integers_sys_prolog_cpp([Add|Adds]) :-
+  pl_check_prolog_flag(max_integer, Max_int),
+  pl_check_prolog_flag(min_integer, Min_int),
+  Max is Max_int-3,
+  Min is Min_int+3,
+  large_integers_sys_prolog_cpp2(Max, Add, 1),
+  large_integers_sys_prolog_cpp2(Min, Add, -1),
+  large_integers_sys_prolog_cpp(Adds).
+
+large_integers_sys_prolog_cpp2(MaxMin, Add, Sign) :-
+  make_vars(1, [A]),
+  Inhomo is MaxMin + Sign* Add,
+  out(sys_large_int, Inhomo),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A = Inhomo]),
+  ppl_Polyhedron_get_constraints(P, CS),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, CS),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P2),
+  InhomoDiv2 is Inhomo // 2,
+  InhomoMod2 is Inhomo mod 2,
+  ppl_Polyhedron_add_constraint(P2, A = InhomoDiv2),
+  ppl_Polyhedron_affine_image(P2, A, 2*A + Sign* InhomoMod2, 1),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+large_integers_affine_transform_loop(0, _P, _).
+large_integers_affine_transform_loop(Exp, P, A) :-
+  Exp >= 1,
+  ppl_Polyhedron_affine_image(P, A, 2*A, 1),
+  Exp1 is Exp - 1,
+  large_integers_affine_transform_loop(Exp1, P, A).
+
+%%%%%%%%%%%%%%%%% Exceptions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% exceptions/0 tests both Prolog and C++ exceptions using:
+%
+% exception_prolog(+N, +V)
+% exception_sys_prolog(+N, +V)
+% exception_cplusplus(+N, +V)
+%
+% N is the number of the test while V is a list of 3 PPL variables
+%
+% In exceptions/0, the calls to these predicates should fail
+% so that all the tests are tried on backtracking.
+% When all the tests have been tried,
+% (and, for the Prolog interface, providing the correct
+% exception message),
+% the call to exceptions/0 succeeds.
+% If one of the tests succeeds or a Prolog interface exception
+% has a wrong exception message, then exceptions/0 will fail.
+
+exceptions :-
+   current_prolog_flag(bounded, Y),
+   make_vars(3, V),
+   exception_prolog(V),
+   (Y == true -> exception_sys_prolog(V) ; true),
+   exception_cplusplus(V),
+   !.
+
+%% TEST: Prolog_unsigned_out_of_range
+exception_yap :-
+     I = 21474836470, J = 3, K = 0,
+     ppl_new_C_Polyhedron_from_generators(
+        [point('$VAR'(I)),point('$VAR'(J))], P),
+     ppl_Polyhedron_get_generators(P, GS),
+     nl, write(GS), nl,
+     ppl_new_C_Polyhedron_from_generators(
+        [point('$VAR'(I)),point('$VAR'(K))], P1),
+     ppl_Polyhedron_get_generators(P1, GS1),
+     nl, write(GS1), nl,
+     ppl_delete_Polyhedron(P),
+     ppl_delete_Polyhedron(P1).
+
+% exception_prolog(+N, +V) checks exceptions thrown by the Prolog interface.
+% It does not check those that are dependent on a specific Prolog system.
+
+exception_prolog(V) :-
+   exception_prolog1(13, V).
+
+exception_prolog1(0, _) :- !.
+exception_prolog1(N, V) :-
+   exception_prolog(N, V),
+   N1 is N - 1,
+   exception_prolog1(N1, V).
+
+%% TEST: Prolog_unsigned_out_of_range
+exception_prolog(1, _) :-
+    pl_check_prolog_flag(bounded, Y),
+   (Y == true ->
+     true
+    ;
+     (I = 21474836470,
+     must_catch(ppl_new_C_Polyhedron_from_generators([point('$VAR'(I))], _))
+      )
+   ).
+
+%% TEST: not_unsigned_integer
+exception_prolog(2, _) :-
+  must_catch(ppl_new_C_Polyhedron_from_space_dimension(n, universe, _)),
+  must_catch(ppl_new_C_Polyhedron_from_space_dimension(-1, universe,  _)),
+  must_catch(ppl_new_C_Polyhedron_from_generators([point('$VAR'(n))], _)),
+  must_catch(ppl_new_C_Polyhedron_from_generators([point('$VAR'(-1))], _)).
+
+%% TEST: not_unsigned_integer
+exception_prolog(3, _) :-
+  must_catch(ppl_set_timeout(-1)).
+
+
+%% TEST: not_unsigned_integer
+exception_prolog(4, _) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 3, universe, P),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 3, universe, Q),
+  must_catch(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(
+             Q, P, -1, _X)),
+  must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+             Q, P, [], -1, _X)),
+  must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+             Q, P, [], -1, _X)),
+  must_catch(ppl_Polyhedron_H79_widening_assign_with_tokens(
+             Q, P, -1, _X)),
+  must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+             Q, P, [], -1, _X)),
+  must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+             Q, P, [], -1, _X)),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+%% TEST: non_linear
+exception_prolog(5, [A,B,C]) :-
+  must_catch(ppl_new_C_Polyhedron_from_generators([point(B + A*C)], _)),
+  must_catch(ppl_new_C_Polyhedron_from_generators(
+                     [point(C), ray(B + C, 1)], _)),
+  must_catch(ppl_new_C_Polyhedron_from_generators(
+                     [point], _)),
+  must_catch(ppl_new_C_Polyhedron_from_generators(
+                     [point(_D)], _)),
+  must_catch(ppl_new_C_Polyhedron_from_constraints(
+                     [_E >= 3], _)),
+  must_catch(ppl_new_C_Polyhedron_from_constraints(
+                     [A*B = 0], _)),
+  must_catch(ppl_new_C_Polyhedron_from_constraints(
+                     [A], _)).
+
+%% TEST: not_a_variable
+exception_prolog(6, [A,_,_]) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 3, universe, P),
+  must_catch(ppl_Polyhedron_remove_space_dimensions(P, [A,1])),
+  !,
+  ppl_delete_Polyhedron(P).
+
+%% TEST: not_an_integer
+exception_prolog(7, [A,B,_]) :-
+  clean_ppl_new_Polyhedron_from_generators(c,
+               [point(A + B), ray(A), ray(B)], P),
+  must_catch(ppl_Polyhedron_affine_image(P, A, A + B + 1, i)),
+  !,
+  ppl_delete_Polyhedron(P).
+
+%% TEST: not_a_polyhedron_handle
+exception_prolog(8, _) :-
+  must_catch(ppl_Polyhedron_space_dimension(_, _N)).
+
+%% TEST: not_a_complexity_class
+exception_prolog(9, [A, _, _]) :-
+   clean_ppl_new_Polyhedron_from_generators(c,
+               [point(A)], P),
+   must_catch(ppl_Polyhedron_get_bounding_box(P, a, _Box)).
+
+%% TEST: not_universe_or_empty
+exception_prolog(10, _) :-
+  must_catch(ppl_new_C_Polyhedron_from_space_dimension(3, xxx, _)).
+
+%% TEST: not_relation
+exception_prolog(11, [A, B, _]) :-
+  clean_ppl_new_Polyhedron_from_generators(c,
+               [point(A)], P),
+  must_catch(ppl_Polyhedron_generalized_affine_image(P, A, x, A + 1, 1)),
+  must_catch(
+     ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, x, A + 1)),
+  must_catch(
+     ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, x + y, A + 1)).
+
+%% TEST: not_a_nil_terminated_list
+exception_prolog(12, [A, B, C]) :-
+  must_catch(ppl_new_C_Polyhedron_from_generators(
+     [point(A + B + C, 1) | not_a_list], _)),
+  must_catch(ppl_new_C_Polyhedron_from_constraints(
+     [A = 0, B >= C | not_a_list], _)),
+  must_catch(ppl_new_C_Polyhedron_from_bounding_box(0, 0)),
+  must_catch(ppl_new_NNC_Polyhedron_from_bounding_box(
+             [i(c(minf), c(2/1)), i(c(n), o(pinf)) | d], _)),
+  must_catch(ppl_new_C_Polyhedron_from_bounding_box(
+             [i(c(minf), c(2/1)), i(c(n), o(pinf)) | _], _)),
+  clean_ppl_new_Polyhedron_from_space_dimension(nnc, 3, universe, P),
+  must_catch(ppl_Polyhedron_add_constraints(P, _)),
+  must_catch(ppl_Polyhedron_add_constraints(P, not_a_list)),
+  must_catch(ppl_Polyhedron_add_constraints_and_minimize(P, not_a_list)),
+  must_catch(ppl_Polyhedron_add_generators(P, not_a_list)),
+  must_catch(ppl_Polyhedron_add_generators(P, _)),
+  must_catch(ppl_Polyhedron_add_generators_and_minimize(P, _)),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 3, empty, Q),
+  must_catch(ppl_Polyhedron_map_space_dimensions(Q, not_a_list)),
+  must_catch(ppl_Polyhedron_fold_space_dimensions(Q, not_a_list, B)),
+  must_catch(ppl_Polyhedron_remove_space_dimensions(Q, not_a_list)),
+  must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign(
+             Q, P, not_a_list)),
+  must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+             Q, P, not_a_list, 1, _)),
+  must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign(
+             Q, P, not_a_list)),
+  must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+             Q, P, not_a_list, 1, _)),
+  must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(
+             Q, P, not_a_list)),
+  must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+             Q, P, not_a_list, 1, _)),
+  must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(
+             Q, P, not_a_list)),
+  must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+             Q, P, not_a_list, 1, _)),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+%% TEST: not_an_lp_problem_handle
+exception_prolog(13, _) :-
+  must_catch(ppl_LP_Problem_space_dimension(_, _N)),
+  must_catch(ppl_LP_Problem_constraints(p, [])).
+
+% exception_sys_prolog(+N, +V) checks exceptions thrown by Prolog interfaces
+% that are dependent on a specific Prolog system.
+% These are only checked if current_prolog_flag(bounded, true) holds.
+
+exception_sys_prolog(V) :-
+   exception_sys_prolog1(4, V).
+
+exception_sys_prolog1(0, _) :- !.
+exception_sys_prolog1(N, V) :-
+   exception_sys_prolog(N, V),
+   N1 is N - 1,
+   exception_sys_prolog1(N1, V).
+
+exception_sys_prolog(1, [A,B,_]) :-
+  pl_check_prolog_flag(max_integer, Max_Int),
+  catch((
+          clean_ppl_new_Polyhedron_from_constraints(c,
+               [Max_Int * A - B =< 0, 3 >= A], P),
+          must_catch(ppl_Polyhedron_get_generators(P, _GS)),
+          !,
+          ppl_delete_Polyhedron(P)
+        ),
+        ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause))
+       ).
+
+ exception_sys_prolog(2, [A,B,_]) :-
+  pl_check_prolog_flag(min_integer, Min_Int),
+  catch((
+          clean_ppl_new_Polyhedron_from_constraints(c,
+               [Min_Int * A - B =< 0, 2 >= A], P),
+          must_catch(ppl_Polyhedron_get_generators(P, _GS)),
+          !,
+          ppl_delete_Polyhedron(P)
+        ),
+        ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause))
+       ).
+
+exception_sys_prolog(3, [A,B,_]) :-
+  pl_check_prolog_flag(max_integer, Max_Int),
+  catch((
+          clean_ppl_new_Polyhedron_from_generators(c,
+               [point(Max_Int * A + B)], P),
+          ppl_Polyhedron_affine_image(P, A, A + 1, 1),
+          must_catch(ppl_Polyhedron_get_generators(P, _GS)),
+          !,
+          ppl_delete_Polyhedron(P)
+        ),
+        ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause))
+       ).
+
+exception_sys_prolog(4, [A,B,_]) :-
+  pl_check_prolog_flag(min_integer, Min_Int),
+  catch((
+          clean_ppl_new_Polyhedron_from_generators(c,
+               [point(Min_Int * A + B)], P),
+          ppl_Polyhedron_affine_image(P, A, A - 1, 1),
+          must_catch(ppl_Polyhedron_get_generators(P, _GS)),
+          !,
+          ppl_delete_Polyhedron(P)
+        ),
+        ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause))
+       ).
+
+% exception_cplusplus(+N, +V) checks exceptions thrown by the C++
+% interface for the PPL.
+
+exception_cplusplus(V) :-
+   exception_cplusplus1(10, V).
+
+exception_cplusplus1(0, _) :- !.
+exception_cplusplus1(N, V) :-
+   exception_cplusplus(N, V),
+   N1 is N - 1,
+   exception_cplusplus1(N1, V).
+
+exception_cplusplus(1, [A,B,C]) :-
+  must_catch(ppl_new_C_Polyhedron_from_generators([point(A + B + C, 0)], _)).
+
+exception_cplusplus(2, [A,B,_]) :-
+  clean_ppl_new_Polyhedron_from_generators(c,
+               [point(A + B), ray(A), ray(B)], P),
+  must_catch(ppl_Polyhedron_affine_image(P, A, A + B + 1, 0)),
+  !,
+  ppl_delete_Polyhedron(P).
+
+exception_cplusplus(3, [A, B, _]) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 0, universe, P1),
+  clean_ppl_new_Polyhedron_from_generators(c,
+               [point(A + B)], P2),
+  must_catch(ppl_Polyhedron_poly_hull_assign_and_minimize(P1, P2)),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+exception_cplusplus(4, [A,B,C]) :-
+   must_catch(ppl_new_C_Polyhedron_from_generators([line(A + B + C)], _)).
+
+exception_cplusplus(5, [A,B,C]) :-
+  clean_ppl_new_Polyhedron_from_generators(c, [point(B + 2*C)], P),
+  ppl_Polyhedron_remove_space_dimensions(P,[C]),
+  must_catch(ppl_Polyhedron_remove_space_dimensions(P,[A,C])),
+  !,
+  ppl_delete_Polyhedron(P).
+
+exception_cplusplus(6, [A,B,_]) :-
+  clean_ppl_new_Polyhedron_from_constraints(c,
+               [A >= 1], P),
+  must_catch(ppl_Polyhedron_affine_image(P, B, A + 1, 1)),
+  !,
+  ppl_delete_Polyhedron(P).
+
+exception_cplusplus(7, [A, B, C]) :-
+  clean_ppl_new_Polyhedron_from_constraints(c,
+               [A >= 1, B>= 1], P),
+  must_catch(ppl_Polyhedron_affine_image(P, B, A + C + 1, 1)),
+  !,
+  ppl_delete_Polyhedron(P).
+
+exception_cplusplus(8, [A,B,_]) :-
+  clean_ppl_new_Polyhedron_from_constraints(c,
+               [A >= B], P),
+  must_catch(ppl_Polyhedron_affine_preimage(P, A, A + B + 1, 0)),
+  !,
+  ppl_delete_Polyhedron(P).
+
+exception_cplusplus(9, [A, B, C]) :-
+  clean_ppl_new_Polyhedron_from_generators(c,
+               [point(0), ray(A + B), ray(A)], P),
+  must_catch(ppl_Polyhedron_affine_preimage(P, C, A + 1, 1)),
+  !,
+  ppl_delete_Polyhedron(P).
+
+
+exception_cplusplus(10, [A, B, C]) :-
+  clean_ppl_new_Polyhedron_from_generators(c,
+               [point(0), point(A), line(A + B)], P),
+  must_catch(ppl_Polyhedron_affine_preimage(P, B, A + C, 1)),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% must_catch(+Call) calls Call using catch and checks exception.
+% If exception it succeeds and fails if there is no exception caught.
+
+must_catch(Call) :-
+   ( catch(Call, M0, check_exception(M0) ) -> fail ; true).
+
+% check_exception(+Exception) checks and prints the exception message;
+% and then fails.
+
+check_exception(Exception):-
+         format_exception_message(Exception), fail.
+
+%%%%%%%%%%%% predicate for making list of ppl variables %%%%%%
+
+% make_var_list(+I,+Dimension,?Variable_List)
+% constructs a list of variables with indices from I to Dimension - 1.
+% It is assumed that I =< Dimension.
+
+make_vars(Dim, Var_List):-
+  make_var_list(0, Dim, Var_List).
+make_var_list(Dim,Dim,[]):- !.
+make_var_list(I,Dim,['$VAR'(I)|Var_List]):-
+  I1 is I + 1,
+  make_var_list(I1,Dim,Var_List).
+
+%%%%%%%%%%%% predicate for safely deleting polyhedra on failure %
+
+cleanup_ppl_Polyhedron(_).
+cleanup_ppl_Polyhedron(P) :-
+  out(cs, P),
+  out(gs, P),
+  ppl_delete_Polyhedron(P), fail.
+
+cleanup_ppl_Polyhedra([]).
+cleanup_ppl_Polyhedra([_|_]).
+cleanup_ppl_Polyhedra([P|Ps]) :-
+  delete_all_ppl_Polyhedra([P|Ps]).
+
+delete_all_ppl_Polyhedra([]).
+delete_all_ppl_Polyhedra([P|Ps]) :-
+  ppl_delete_Polyhedron(P),
+  delete_all_ppl_Polyhedra(Ps).
+
+cleanup_ppl_LP_Problem(_).
+cleanup_ppl_LP_Problem(LP) :-
+  out(lp, LP),
+  ppl_delete_LP_Problem(LP), fail.
+
+out(cs, P):-
+  ((noisy(N), N < 2) -> true ;
+    ppl_Polyhedron_get_constraints(P, CS),
+    nl, write(CS), nl
+  ).
+
+out(gs, P):-
+  ((noisy(N), N < 2) -> true ;
+    ppl_Polyhedron_get_generators(P, GS),
+    nl, write(GS), nl
+  ).
+
+out(lp, LP):-
+  ((noisy(N), N < 2) -> true ;
+    ppl_LP_Problem_constraints(LP, CS),
+    ppl_LP_Problem_objective_function(LP, Obj),
+    ppl_LP_Problem_optimization_mode(LP, Opt),
+    nl,
+    write(' constraint system is: '), write(CS), nl,
+    write(' objective function is: '), write(Obj), nl,
+    write(' optimization mode is: '), write(Opt),
+    nl
+  ).
+
+out(sys_large_int, init):-
+  !,
+  prolog_system(System),
+  ((noisy(N), N < 2) -> true ;
+    nl, write_all([' At the Prolog/C++ interface, for', System, 'Prolog', nl,
+       ' the extra numbers tested are: ']),
+    nl
+  ).
+
+out(sys_large_int, Num):-
+  ((noisy(N), N < 2) -> true ;
+      write_all([Num, ',  '])
+  ).
+
+out(large_int, init):-
+  !,
+  ((noisy(N), N < 2) -> true ;
+    nl, write(' At the Prolog/C++ interface, the numbers tested are: '),
+    nl
+  ).
+
+out(large_int, Num, Sign, Add, Exp):-
+  ((noisy(N), N < 2) -> true ;
+    write_all([Num, ' = ', Sign, ' * ', '((1 << ', Exp, ') + ', Add, '),  '])
+  ).
+
+%%% predicates for ensuring new polyhedra are always deleted on failure %
+
+clean_ppl_new_Polyhedron_from_space_dimension(T, D, Universe_or_Empty, P) :-
+  (T = c ->
+    ppl_new_C_Polyhedron_from_space_dimension(D, Universe_or_Empty, P)
+  ;
+    ppl_new_NNC_Polyhedron_from_space_dimension(D, Universe_or_Empty, P)
+  ),
+  cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_Polyhedron_from_constraints(T, CS, P) :-
+  (T = c ->
+    ppl_new_C_Polyhedron_from_constraints(CS, P)
+   ;
+    ppl_new_NNC_Polyhedron_from_constraints(CS, P)
+  ),
+  cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_Polyhedron_from_generators(T, GS, P) :-
+  (T = c ->
+    ppl_new_C_Polyhedron_from_generators(GS, P)
+   ;
+    ppl_new_NNC_Polyhedron_from_generators(GS, P)
+  ),
+  cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_Polyhedron_from_Polyhedron(TQ, Q, TP, P) :-
+  ((TP == c, TQ == c) ->
+    ppl_new_C_Polyhedron_from_C_Polyhedron(Q, P)
+   ;
+    ((TP == c, TQ == nnc) ->
+      ppl_new_C_Polyhedron_from_NNC_Polyhedron(Q, P)
+    ;
+      ((TP == nnc, TQ == c) ->
+        ppl_new_NNC_Polyhedron_from_C_Polyhedron(Q, P)
+      ;
+        ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Q, P)
+      )
+    )
+  ),
+  cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_Polyhedron_from_bounding_box(T, Box, P) :-
+  (T = c ->
+    ppl_new_C_Polyhedron_from_bounding_box(Box, P)
+  ;
+    ppl_new_NNC_Polyhedron_from_bounding_box(Box, P)
+  ),
+  cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_LP_Problem_trivial(LP) :-
+  ppl_new_LP_Problem_trivial(LP),
+  cleanup_ppl_LP_Problem(LP).
+
+clean_ppl_new_LP_Problem(CS, Obj, Opt, LP) :-
+  ppl_new_LP_Problem(CS, Obj, Opt, LP),
+  cleanup_ppl_LP_Problem(LP).
+
+clean_ppl_new_LP_Problem_from_LP_Problem(LP1, LP) :-
+  ppl_new_LP_Problem_from_LP_Problem(LP1, LP),
+  cleanup_ppl_LP_Problem(LP).
+
+%%%%%%%%%%%% predicates for switching on/off output messages %
+
+make_extra_noisy :-
+  (retract(noisy(_)) ->
+      make_extra_noisy
+  ;
+      assertz(noisy(2))
+  ).
+
+make_noisy :-
+  (retract(noisy(_)) ->
+      make_noisy
+  ;
+      assertz(noisy(1))
+  ).
+
+make_quiet :-
+  (retract(noisy(_)) ->
+      make_quiet
+   ; assertz(noisy(0))
+  ).
+
+%%%%%%%%%%%% predicates for pretty printing the PPL banner %%%%%%%%%%
+%
+% The banner is read as an atom with"/n" denoting where there should
+% new lines. Here we print the banner as intended with new lines instead
+% of "/n".
+%
+
+banner_pp(B) :-
+  name(B,Bcodes),
+  nl,
+  !,
+  format_banner(Bcodes).
+
+format_banner([]) :- nl.
+format_banner([C]) :- put_code(C), nl.
+format_banner([C,C1|Chars]):-
+  ([C,C1] == "/n" ->
+     (nl,
+     format_banner(Chars))
+   ;
+     (put_code(C),
+     format_banner([C1|Chars]))
+  ).
+
+%%%%%%%%%%%% predicate for handling an unintended exception %%%%
+
+check_exception_term(ppl_overflow_error(Cause)) :-
+  ((Cause == 'Negative overflow.'; Cause == 'Positive overflow.') ->
+    true
+  ;
+    print_exception_term(ppl_overflow_error(Cause))
+  ),
+  !.
+
+print_exception_term(ppl_overflow_error(Cause)) :-
+  nl,
+  write('Error: an overflow has been detected by the PPL: '),
+  write(Cause),
+  nl,
+  !.
+
+print_exception_term(Exception) :-
+  write('exception'), nl,
+  nl,
+  writeq(Exception),
+  nl.
+
+%%%%%%%%%%%% predicate for printing exception messages %%%%%%%%%%
+
+format_exception_message(
+             ppl_invalid_argument( found(F), expected(E), where(W))
+                        ) :-
+  !,
+  display_message(['PPL Prolog Interface Exception: ', nl, '   ',
+                   F, 'is an invalid argument for', W, nl, '   ',
+                  F, 'should be', E, '.']).
+
+format_exception_message(
+             ppl_representation_error(I, where(W))
+                        ) :-
+  !,
+  display_message(['PPL Prolog Interface Exception: ', nl, '   ',
+                   'This Prolog system has bounded integers', nl, '   ',
+                   I, 'is not in the allowed range of integers', nl, '   ',
+                   'in call to', W, '.']).
+
+format_exception_message(Error) :-
+  display_message([Error]).
+
+%%%%%%%%%%%% predicates for output messages %%%%%%%%%%%%%%%%%%
+
+error_message(Message):-
+   write_all(Message),
+   fail.
+
+display_message(Message):-
+    noisy(_),
+    (noisy(0) -> true ;
+     (nl, write_all(Message))
+    ).
+
+write_all([]) :- nl.
+write_all([Phrase|Phrases]):-
+   (Phrase == nl ->
+      nl
+   ;
+      (write(Phrase),
+      write(' '))
+   ),
+   write_all(Phrases).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% list_groups(G)
+% The interface predicates are partitioned into related sets called
+% groups and here is a list of the groups.
+
+list_groups( [
+   large_integers,
+   all_versions_and_banner,
+   numeric_bounds,
+   new_polyhedron_from_dimension,
+   new_polyhedron_from_polyhedron,
+   new_polyhedron_from_representations,
+   swap_polyhedra,
+   polyhedron_dimension,
+   basic_operators,
+%   transform_polyhedron,
+   extrapolation_operators,
+   get_system,
+%   add_to_system,
+   revise_dimensions,
+   check_polyhedron,
+   minmax_polyhedron,
+   compare_polyhedra,
+   lp_problem,
+   transform_polyhedron,
+   polyhedron_boxes,
+   add_to_system,
+   catch_time,
+   handle_exceptions
+             ] ).
+
+% group_predicates(G, P)
+% P is a list of the interface predicates checked by test for group G.
+% This is used to generate more informative error and exception messages.
+
+group_predicates(all_versions_and_banner,
+  [ppl_version_major/1,
+   ppl_version_minor/1,
+   ppl_version_revision/1,
+   ppl_version_beta/1,
+   ppl_version/1,
+   ppl_banner/1
+  ]).
+
+group_predicates(numeric_bounds,
+  [ppl_max_space_dimension/1,
+   ppl_Coefficient_is_bounded/0,
+   ppl_Coefficient_max/1,
+   ppl_Coefficient_min/1
+  ]).
+
+group_predicates(new_polyhedron_from_dimension,
+  [ppl_new_C_Polyhedron_from_space_dimension/4,
+   ppl_new_NNC_Polyhedron_from_space_dimension/4,
+   ppl_Polyhedron_is_universe/1,
+   ppl_Polyhedron_is_empty/1,
+   ppl_delete_polyhedron/1
+  ]).
+
+group_predicates(new_polyhedron_from_polyhedron,
+  [ppl_new_C_Polyhedron_from_C_Polyhedrom/3,
+   ppl_new_C_Polyhedron_from_NNC_Polyhedrom/3,
+   ppl_new_NNC_Polyhedron_from_C_Polyhedrom/3,
+   ppl_new_NNC_Polyhedron_from_NNC_Polyhedrom/3,
+   ppl_new_C_Polyhedron_from_constraints/2,
+   ppl_new_NNC_Polyhedron_from_constraints/2,
+   ppl_Polyhedron_equals_Polyhedron/2
+  ]).
+
+group_predicates(new_polyhedron_from_representations,
+  [ppl_new_C_Polyhedron_from_constraints/2,
+   ppl_new_NNC_Polyhedron_from_constraints/2,
+   ppl_new_C_Polyhedron_from_genenerators/2,
+   ppl_new_NNC_Polyhedron_from_genenerators/2,
+   ppl_new_C_Polyhedron_from_bounding_box/2,
+   ppl_new_NNC_Polyhedron_from_bounding_box/2
+  ]).
+
+group_predicates(swap_polyhedra,
+  [ppl_Polyhedron_swap/2
+  ]).
+
+group_predicates(polyhedron_dimension,
+  [ppl_Polyhedron_affine_dimension/2,
+   ppl_Polyhedron_space_dimension/2]).
+
+group_predicates(basic_operators,
+  [ppl_Polyhedron_intersection_assign/2,
+   ppl_Polyhedron_intersection_assign_and_minimize/2,
+   ppl_Polyhedron_poly_hull_assign/2,
+   ppl_Polyhedron_poly_hull_assign_and_minimize/2,
+   ppl_Polyhedron_poly_difference_assign/2,
+   ppl_Polyhedron_time_elapse_assign/2,
+   ppl_Polyhedron_topological_closure_assign/1
+  ]).
+
+group_predicates(add_to_system,
+  [ppl_Polyhedron_add_constraint/2,
+   ppl_Polyhedron_add_constraint_and_minimize/2,
+   ppl_Polyhedron_add_generator/2,
+   ppl_Polyhedron_add_generator_and_minimize/2,
+   ppl_Polyhedron_add_constraints/2,
+   ppl_Polyhedron_add_constraints_and_minimize/2,
+   ppl_Polyhedron_add_generators/2,
+   ppl_Polyhedron_add_generators_and_minimize/2
+  ]).
+
+group_predicates(revise_dimensions,
+  [ppl_Polyhedron_remove_space_dimensions/2,
+   ppl_Polyhedron_remove_higher_space_dimensions/2,
+   ppl_Polyhedron_expand_space_dimension/3,
+   ppl_Polyhedron_fold_space_dimensions/3,
+   ppl_Polyhedron_map_space_dimensions/2,
+   ppl_Polyhedron_concatenate_assign/2
+  ]).
+
+group_predicates(transform_polyhedron,
+  [ppl_Polyhedron_affine_image/4,
+   ppl_Polyhedron_affine_preimage/4,
+   ppl_Polyhedron_bounded_affine_image/5,
+   ppl_Polyhedron_bounded_affine_preimage/5,
+   ppl_Polyhedron_generalized_affine_image/5,
+   ppl_Polyhedron_generalized_affine_preimage/5,
+   ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+   ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4
+  ]).
+
+group_predicates(extrapolation_operators,
+  [ppl_Polyhedron_BHRZ03_widening_assign_with_token/3,
+   ppl_Polyhedron_BHRZ03_widening_assign/2,
+   ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_token/4,
+   ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+   ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_token/4,
+   ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+   ppl_Polyhedron_H79_widening_assign_with_token/3,
+   ppl_Polyhedron_H79_widening_assign/2,
+   ppl_Polyhedron_limited_H79_extrapolation_assign_with_token/4,
+   ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+   ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token/4,
+   ppl_Polyhedron_bounded_H79_extrapolation_assign/3
+  ]).
+
+group_predicates(get_system,
+  [ppl_Polyhedron_get_constraints/2,
+   ppl_Polyhedron_get_minimized_constraints/2,
+   ppl_Polyhedron_get_generators/2,
+   ppl_Polyhedron_get_minimized_generators/2
+  ]).
+
+group_predicates(check_polyhedron,
+  [ppl_Polyhedron_relation_with_constraint/3,
+   ppl_Polyhedron_relation_with_generator/3,
+   ppl_Polyhedron_is_topologically_closed/1,
+   ppl_Polyhedron_contains_Polyhedron/2,
+   ppl_Polyhedron_strictly_contains_Polyhedron/2,
+   ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+   ppl_Polyhedron_equals_Polyhedron/2,
+   ppl_Polyhedron_OK/1
+  ]).
+
+group_predicates(minmax_polyhedron,
+  [ppl_Polyhedron_maximize/5,
+   ppl_Polyhedron_maximize_with_point/6,
+   ppl_Polyhedron_minimize/5,
+   ppl_Polyhedron_minimize_with_point/6
+  ]).
+
+group_predicates(compare_polyhedra,
+  [ppl_Polyhedron_contains_Polyhedron/2,
+   ppl_Polyhedron_strictly_contains_Polyhedron/2,
+   ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+   ppl_Polyhedron_equals_Polyhedron/2
+  ]).
+
+group_predicates(polyhedron_boxes,
+  [ppl_Polyhedron_get_bounding_box/3]).
+
+group_predicates(catch_time,
+  [ppl_set_timeout_exception_atom/1,
+   ppl_timeout_exception_atom/1,
+   ppl_set_timeout/1,
+   ppl_reset_timeout/0
+  ]).
+
+group_predicates(lp_problem,
+  ['all LP_Prolog predicates'
+  ]).
+
+group_predicates(large_integers,
+  ['large integer tests '
+  ]).
+
+group_predicates(handle_exceptions,
+  'all predicates'' exception handling.'
+  ).
+
+%%%%%%%%%%%%%%%%%%%%%%% System flags %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% pl_check_prolog_flag/2
+% returns true or false (if the 1st argument is 'bounded')
+% or (if the 1st argument is 'max_integer' or  'min_integer')
+% the maximum or minimum integer for Prolog
+% systems that have bounded integers.
+% Note that 268435456 is 2^28.
+
+pl_check_prolog_flag(bounded, TF) :-
+  \+ prolog_system('XSB'),
+  current_prolog_flag(bounded, TF).
+
+pl_check_prolog_flag(bounded, true) :-
+  prolog_system('XSB').
+
+pl_check_prolog_flag(max_integer, Max_Int) :-
+  \+ prolog_system('XSB'),
+  current_prolog_flag(max_integer, Max_Int).
+
+pl_check_prolog_flag(max_integer, Max_Int) :-
+  prolog_system('XSB'), Max_Int is 268435455.
+
+pl_check_prolog_flag(min_integer, Min_Int) :-
+  \+ prolog_system('XSB'),
+  current_prolog_flag(min_integer, Min_Int).
+
+pl_check_prolog_flag(min_integer, Min_Int) :-
+  prolog_system('XSB'), Min_Int is -268435456.
diff --git a/interfaces/Prolog/tests/schedule.clpq b/interfaces/Prolog/tests/schedule.clpq
new file mode 100644
index 0000000..6281d5b
--- /dev/null
+++ b/interfaces/Prolog/tests/schedule.clpq
@@ -0,0 +1,22 @@
+into(task(S1, D1), task(S2, D2)) :-
+  {S2 =< S1, S1 + D1 = SD1, S2 + D2 = SD2, SD1 =< SD2}.
+
+noOverlap(_, []).
+noOverlap(task(S1, D1), [task(S2, D2)|Tasks]) :-
+  (
+    {S1 + D1 = SD1, SD1 < S2}
+  ;
+    {S2 + D2 = SD2, SD2 < S1}
+  ),
+  noOverlap(task(S1, D1), Tasks).
+
+schedule([], _).
+schedule([Task|Tasks], Supertask) :-
+  into(Task, Supertask),
+  noOverlap(Task, Tasks),
+  schedule(Tasks, Supertask).
+
+test1(S) :-
+  schedule([task(0, 1), task(3, 1), task(S, 1)], task(0, 6)).
+test2(S) :-
+  schedule([task(0, 28), task(70, 40), task(S, 35)], task(0, 240)).
diff --git a/interfaces/Prolog/tests/script_clpq b/interfaces/Prolog/tests/script_clpq
new file mode 100644
index 0000000..0434ccf
--- /dev/null
+++ b/interfaces/Prolog/tests/script_clpq
@@ -0,0 +1,18 @@
+reconsult('ack.clpq').
+ack(2, 1, Z).
+
+reconsult('ackn.clpq').
+ack(X, Y, Z).
+
+reconsult('mc91.clpq').
+mc(112, Y).
+
+reconsult('fib.clpq').
+fib(5, Y).
+
+reconsult('smm.clpq').
+solve(S, E, N, D, M, O, R, Y).
+
+reconsult('sumto.clpq').
+sumto(X, 55).
+
diff --git a/interfaces/Prolog/tests/script_clpq2 b/interfaces/Prolog/tests/script_clpq2
new file mode 100644
index 0000000..9ea257c
--- /dev/null
+++ b/interfaces/Prolog/tests/script_clpq2
@@ -0,0 +1,36 @@
+reconsult('ack.clpq').
+ack(3, 1, Z).
+
+reconsult('ackn.clpq').
+ack(X, Y, Z).
+
+reconsult('mc91.clpq').
+mc(112, Y).
+
+reconsult('fib.clpq').
+fib(5, Y).
+
+reconsult('smm.clpq').
+solve(S, E, N, D, M, O, R, Y).
+
+reconsult('sumto.clpq').
+sumto(X, 55).
+
+reconsult('schedule.clpq').
+test1(X).
+;
+;
+
+test2(X).
+;
+;
+
+schedule([task(S1, D1), task(S2, D2), task(S2, D3)], task(S, D)).
+;
+;
+;
+;
+;
+;
+;
+;
diff --git a/interfaces/Prolog/tests/script_clpq2_int8 b/interfaces/Prolog/tests/script_clpq2_int8
new file mode 100644
index 0000000..4ca8087
--- /dev/null
+++ b/interfaces/Prolog/tests/script_clpq2_int8
@@ -0,0 +1,34 @@
+reconsult('ack.clpq').
+ack(3, 1, Z).
+
+reconsult('ackn.clpq').
+ack(X, Y, Z).
+
+reconsult('mc91.clpq').
+mc(112, Y).
+
+reconsult('fib.clpq').
+fib(5, Y).
+
+reconsult('smm.clpq').
+solve(S, E, N, D, M, O, R, Y).
+
+reconsult('sumto.clpq').
+sumto(X, 55).
+
+reconsult('schedule.clpq').
+test1(X).
+;
+;
+
+test2(X).
+
+schedule([task(S1, D1), task(S2, D2), task(S2, D3)], task(S, D)).
+;
+;
+;
+;
+;
+;
+;
+;
diff --git a/interfaces/Prolog/tests/smm.clpq b/interfaces/Prolog/tests/smm.clpq
new file mode 100644
index 0000000..bdfd2ff
--- /dev/null
+++ b/interfaces/Prolog/tests/smm.clpq
@@ -0,0 +1,31 @@
+% *************************************
+% CLP(R) Version 1.1 - Example Programs
+% *************************************
+%
+% The classic cryptarithmetic puzzle:
+%
+%       S E N D
+%     + M O R E
+%     ---------
+%     M O N E Y
+
+solve(S, E, N, D, M, O, R, Y) :-
+	constraints(S, E, N, D, M, O, R, Y).
+
+constraints(S, E, N, D, M, O, R, Y) :-
+{
+	S >= 0, E >= 0, N >= 0, D >= 0, M >= 0, O >= 0, R >= 0, Y >= 0,
+	S =< 9, E =< 9, N =< 9, D =< 9, M =< 9, O =< 9, R =< 9, Y =< 9,
+	S >= 1, M >= 1,
+	C1 >= 0, C2 >= 0, C3 >= 0, C4 >= 0,
+	C1 =< 1, C2 =< 1, C3 =< 1, C4 =< 1,
+	M = C1,
+	C2 + S + M = O + C1 * 10,
+	C3 + E + O = N + 10 * C2,
+	C4 + N + R = E + 10 * C3,
+	D + E = Y + 10*C4
+},
+	bit(C1), bit(C2), bit(C3), bit(C4).
+
+bit(0).
+bit(1).
diff --git a/interfaces/Prolog/tests/sumto.clpq b/interfaces/Prolog/tests/sumto.clpq
new file mode 100644
index 0000000..329ef1b
--- /dev/null
+++ b/interfaces/Prolog/tests/sumto.clpq
@@ -0,0 +1,4 @@
+sumto(N, S) :-
+  { N = 0, S = 0 }.
+sumto(N, S) :-
+  { N = N1+1, S = N+S1 }, sumto(N1, S1).
diff --git a/interfaces/Prolog/tests/tak.clpq b/interfaces/Prolog/tests/tak.clpq
new file mode 100644
index 0000000..6defd26
--- /dev/null
+++ b/interfaces/Prolog/tests/tak.clpq
@@ -0,0 +1,20 @@
+%   Evan Tick (from Lisp version by R. P. Gabriel)
+%
+%   (almost) Takeuchi function (recursive arithmetic)
+
+tak(R) :- tak(18, 12, 6, R).
+
+tak(X, Y, Z, A) :-
+    {
+      X =< Y,
+      Z = A
+    }.
+
+tak(X, Y, Z, A) :-
+    {
+      X >= Y+1
+    },
+    tak(X-1, Y,   Z,  A1),
+    tak(Y-1, Z,   X,  A2),
+    tak(Z-1, X,   Y,  A3),
+    tak(A1,  A2,  A3, A ).
diff --git a/interfaces/Prolog/track_allocation.hh b/interfaces/Prolog/track_allocation.hh
new file mode 100644
index 0000000..08604fe
--- /dev/null
+++ b/interfaces/Prolog/track_allocation.hh
@@ -0,0 +1,116 @@
+/* Code for keeping track of polyhedra allocations and deallocations.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_track_allocation_hh
+#define PPL_track_allocation_hh
+
+#ifndef PROLOG_TRACK_ALLOCATION
+#define PROLOG_TRACK_ALLOCATION 0
+#endif
+
+#if PROLOG_TRACK_ALLOCATION
+
+#include <set>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Tracker {
+public:
+  void insert(const void* pp);
+  void check(const void* pp) const;
+  void remove(const void* pp);
+
+  Poly_Tracker();
+  ~Poly_Tracker();
+
+private:
+  typedef std::set<const void*, std::less<const void*> > Set;
+  Set s;
+};
+
+inline
+Poly_Tracker::Poly_Tracker() {
+}
+
+inline
+Poly_Tracker::~Poly_Tracker() {
+  Set::size_type n = s.size();
+  if (n > 0)
+    std::cerr << "Poly_Tracker: " << n << " polyhedra leaked!" << std::endl;
+}
+
+inline void
+Poly_Tracker::insert(const void* pp) {
+  std::pair<Set::iterator, bool> stat = s.insert(pp);
+  if (!stat.second) {
+    std::cerr << "Poly_Tracker: two polyhedra at the same address "
+	      << "at the same time?!" << std::endl;
+    abort();
+  }
+}
+
+inline void
+Poly_Tracker::check(const void* pp) const {
+  if (s.find(pp) == s.end()) {
+    std::cerr << "Poly_Tracker: attempt to access an inexistent polyhedron."
+	      << std::endl;
+    abort();
+  }
+}
+
+void
+Poly_Tracker::remove(const void* pp) {
+  if (s.erase(pp) != 1) {
+    std::cerr << "Poly_Tracker: attempt to deallocate "
+	      << "an inexistent polyhedron."
+	      << std::endl;
+    abort();
+  }
+}
+
+namespace {
+
+inline Poly_Tracker&
+poly_tracker() {
+  static Poly_Tracker pt;
+  return pt;
+}
+
+} // namespace
+
+} // namespace Parma_Polyhedra_Library
+
+
+#define REGISTER(x) Parma_Polyhedra_Library::poly_tracker().insert(x)
+#define UNREGISTER(x) Parma_Polyhedra_Library::poly_tracker().remove(x)
+#define CHECK(x) Parma_Polyhedra_Library::poly_tracker().check(x)
+
+#else
+
+#define REGISTER(x)
+#define UNREGISTER(x)
+#define CHECK(x)
+
+#endif
+
+#endif // !defined(PPL_track_allocation_hh)
diff --git a/ltmain.sh b/ltmain.sh
new file mode 100644
index 0000000..06823e0
--- /dev/null
+++ b/ltmain.sh
@@ -0,0 +1,6863 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+basename="s,^.*/,,g"
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+# The name of this program:
+progname=`echo "$progpath" | $SED $basename`
+modename="$progname"
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.5.22
+TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)"
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes.
+if test -n "${ZSH_VERSION+set}" ; then
+  setopt NO_GLOB_SUBST
+fi
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell, and then maybe $echo will work.
+  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit $EXIT_SUCCESS
+fi
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  SP2NL='tr \040 \012'
+  NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  SP2NL='tr \100 \n'
+  NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+  save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+  save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+  $echo "$modename: not configured to build any kind of library" 1>&2
+  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+  exit $EXIT_FAILURE
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+duplicate_deps=no
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+#####################################
+# Shell function definitions:
+# This seems to be the best place for them
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+	# Failing that, at least try and use $RANDOM to avoid a race
+	my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+	save_mktempdir_umask=`umask`
+	umask 0077
+	$mkdir "$my_tmpdir"
+	umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || {
+        $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2
+	exit $EXIT_FAILURE
+      }
+    fi
+
+    $echo "X$my_tmpdir" | $Xsed
+}
+
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid ()
+{
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
+      $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+      win32_nmres=`eval $NM -f posix -A $1 | \
+	$SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $echo $win32_libid_type
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	case $arg in
+	  *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	CC_quoted="$CC_quoted $arg"
+      done
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	    # Double-quote args containing other shell metacharacters.
+	    case $arg in
+	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	      arg="\"$arg\""
+	      ;;
+	    esac
+	    CC_quoted="$CC_quoted $arg"
+	  done
+	    case "$@ " in
+	      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  $echo "$modename: unable to infer tagged configuration"
+	  $echo "$modename: specify a tag with \`--tag'" 1>&2
+	  exit $EXIT_FAILURE
+#        else
+#          $echo "$modename: using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+
+    $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
+    $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
+      exit $EXIT_FAILURE
+    fi
+}
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+    my_status=""
+
+    $show "${rm}r $my_gentop"
+    $run ${rm}r "$my_gentop"
+    $show "$mkdir $my_gentop"
+    $run $mkdir "$my_gentop"
+    my_status=$?
+    if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then
+      exit $my_status
+    fi
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'`
+      my_xdir="$my_gentop/$my_xlib"
+
+      $show "${rm}r $my_xdir"
+      $run ${rm}r "$my_xdir"
+      $show "$mkdir $my_xdir"
+      $run $mkdir "$my_xdir"
+      exit_status=$?
+      if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then
+	exit $exit_status
+      fi
+      case $host in
+      *-darwin*)
+	$show "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	if test -z "$run"; then
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'`
+	  darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null`
+	  if test -n "$darwin_arches"; then 
+	    darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    $show "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+      ## Okay now we have a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+	      lipo -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    ${rm}r unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd "$darwin_orig_dir"
+ 	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	fi # $run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+        ;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+    done
+    func_extract_archives_result="$my_oldobjs"
+}
+# End of Shell function definitions
+#####################################
+
+# Darwin sucks
+eval std_shrext=\"$shrext_cmds\"
+
+disable_libs=no
+
+# Parse our command line options once, thoroughly.
+while test "$#" -gt 0
+do
+  arg="$1"
+  shift
+
+  case $arg in
+  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) optarg= ;;
+  esac
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$prev"; then
+    case $prev in
+    execute_dlfiles)
+      execute_dlfiles="$execute_dlfiles $arg"
+      ;;
+    tag)
+      tagname="$arg"
+      preserve_args="${preserve_args}=$arg"
+
+      # Check whether tagname contains only valid characters
+      case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+	$echo "$progname: invalid tag name: $tagname" 1>&2
+	exit $EXIT_FAILURE
+	;;
+      esac
+
+      case $tagname in
+      CC)
+	# Don't test for the "default" C tag, as we know, it's there, but
+	# not specially marked.
+	;;
+      *)
+	if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
+	  taglist="$taglist $tagname"
+	  # Evaluate the configuration.
+	  eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
+	else
+	  $echo "$progname: ignoring unknown tag $tagname" 1>&2
+	fi
+	;;
+      esac
+      ;;
+    *)
+      eval "$prev=\$arg"
+      ;;
+    esac
+
+    prev=
+    prevopt=
+    continue
+  fi
+
+  # Have we seen a non-optional argument yet?
+  case $arg in
+  --help)
+    show_help=yes
+    ;;
+
+  --version)
+    $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+    $echo
+    $echo "Copyright (C) 2005  Free Software Foundation, Inc."
+    $echo "This is free software; see the source for copying conditions.  There is NO"
+    $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+    exit $?
+    ;;
+
+  --config)
+    ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+    done
+    exit $?
+    ;;
+
+  --debug)
+    $echo "$progname: enabling shell trace mode"
+    set -x
+    preserve_args="$preserve_args $arg"
+    ;;
+
+  --dry-run | -n)
+    run=:
+    ;;
+
+  --features)
+    $echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      $echo "enable shared libraries"
+    else
+      $echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      $echo "enable static libraries"
+    else
+      $echo "disable static libraries"
+    fi
+    exit $?
+    ;;
+
+  --finish) mode="finish" ;;
+
+  --mode) prevopt="--mode" prev=mode ;;
+  --mode=*) mode="$optarg" ;;
+
+  --preserve-dup-deps) duplicate_deps="yes" ;;
+
+  --quiet | --silent)
+    show=:
+    preserve_args="$preserve_args $arg"
+    ;;
+
+  --tag)
+    prevopt="--tag"
+    prev=tag
+    preserve_args="$preserve_args --tag"
+    ;;
+  --tag=*)
+    set tag "$optarg" ${1+"$@"}
+    shift
+    prev=tag
+    preserve_args="$preserve_args --tag"
+    ;;
+
+  -dlopen)
+    prevopt="-dlopen"
+    prev=execute_dlfiles
+    ;;
+
+  -*)
+    $echo "$modename: unrecognized option \`$arg'" 1>&2
+    $echo "$help" 1>&2
+    exit $EXIT_FAILURE
+    ;;
+
+  *)
+    nonopt="$arg"
+    break
+    ;;
+  esac
+done
+
+if test -n "$prevopt"; then
+  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+  $echo "$help" 1>&2
+  exit $EXIT_FAILURE
+fi
+
+case $disable_libs in
+no) 
+  ;;
+shared)
+  build_libtool_libs=no
+  build_old_libs=yes
+  ;;
+static)
+  build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+  ;;
+esac
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+if test -z "$show_help"; then
+
+  # Infer the operation mode.
+  if test -z "$mode"; then
+    $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
+    $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2
+    case $nonopt in
+    *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
+      mode=link
+      for arg
+      do
+	case $arg in
+	-c)
+	   mode=compile
+	   break
+	   ;;
+	esac
+      done
+      ;;
+    *db | *dbx | *strace | *truss)
+      mode=execute
+      ;;
+    *install*|cp|mv)
+      mode=install
+      ;;
+    *rm)
+      mode=uninstall
+      ;;
+    *)
+      # If we have no mode, but dlfiles were specified, then do execute mode.
+      test -n "$execute_dlfiles" && mode=execute
+
+      # Just use the default operation mode.
+      if test -z "$mode"; then
+	if test -n "$nonopt"; then
+	  $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+	else
+	  $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+	fi
+      fi
+      ;;
+    esac
+  fi
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+    $echo "$help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$modename --help --mode=$mode' for more information."
+
+  # These modes are in order of execution frequency so that they run quickly.
+  case $mode in
+  # libtool compile mode
+  compile)
+    modename="$modename: compile"
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  if test -n "$libobj" ; then
+	    $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-static | -prefer-pic | -prefer-non-pic)
+	  later="$later $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+ 	  for arg in $args; do
+	    IFS="$save_ifs"
+
+	    # Double-quote args containing other shell metacharacters.
+	    # Many Bourne shells cannot handle close brackets correctly
+	    # in scan sets, so we specify it separately.
+	    case $arg in
+	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	      arg="\"$arg\""
+	      ;;
+	    esac
+	    lastarg="$lastarg $arg"
+	  done
+	  IFS="$save_ifs"
+	  lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+	  # Add the arguments to base_compile.
+	  base_compile="$base_compile $lastarg"
+	  continue
+	  ;;
+
+	* )
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+      case $lastarg in
+      # Double-quote args containing other shell metacharacters.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, and some SunOS ksh mistreat backslash-escaping
+      # in scan sets (worked around with variable expansion),
+      # and furthermore cannot handle '|' '&' '(' ')' in scan sets 
+      # at all, so we specify them separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	lastarg="\"$lastarg\""
+	;;
+      esac
+
+      base_compile="$base_compile $lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      $echo "$modename: you must specify an argument for -Xcompile"
+      exit $EXIT_FAILURE
+      ;;
+    target)
+      $echo "$modename: you must specify a target with \`-o'" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    *)
+      # Get the name of the library object.
+      [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    xform='[cCFSifmso]'
+    case $libobj in
+    *.ada) xform=ada ;;
+    *.adb) xform=adb ;;
+    *.ads) xform=ads ;;
+    *.asm) xform=asm ;;
+    *.c++) xform=c++ ;;
+    *.cc) xform=cc ;;
+    *.ii) xform=ii ;;
+    *.class) xform=class ;;
+    *.cpp) xform=cpp ;;
+    *.cxx) xform=cxx ;;
+    *.f90) xform=f90 ;;
+    *.for) xform=for ;;
+    *.java) xform=java ;;
+    esac
+
+    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+    case $libobj in
+    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+    *)
+      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -static)
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"`
+    case $qlibobj in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	qlibobj="\"$qlibobj\"" ;;
+    esac
+    test "X$libobj" != "X$qlibobj" \
+	&& $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' 	&()|`$[]' \
+	&& $echo "$modename: libobj name \`$libobj' may not contain shell special characters."
+    objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+    xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$xdir" = "X$obj"; then
+      xdir=
+    else
+      xdir=$xdir/
+    fi
+    lobj=${xdir}$objdir/$objname
+
+    if test -z "$base_compile"; then
+      $echo "$modename: you must specify a compilation command" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    $run $rm $removelist
+    trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+      removelist="$removelist $output_obj $lockfile"
+      trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $run ln "$progpath" "$lockfile" 2>/dev/null; do
+	$show "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+      $echo "$srcfile" > "$lockfile"
+    fi
+
+    if test -n "$fix_srcfile_path"; then
+      eval srcfile=\"$fix_srcfile_path\"
+    fi
+    qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"`
+    case $qsrcfile in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+      qsrcfile="\"$qsrcfile\"" ;;
+    esac
+
+    $run $rm "$libobj" "${libobj}T"
+
+    # Create a libtool object file (analogous to a ".la" file),
+    # but don't create it if we're doing a dry run.
+    test -z "$run" && cat > ${libobj}T <<EOF
+# $libobj - a libtool object file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+EOF
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      if test ! -d "${xdir}$objdir"; then
+	$show "$mkdir ${xdir}$objdir"
+	$run $mkdir ${xdir}$objdir
+	exit_status=$?
+	if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then
+	  exit $exit_status
+	fi
+      fi
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	command="$command -o $lobj"
+      fi
+
+      $run $rm "$lobj" "$output_obj"
+
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	test -n "$output_obj" && $run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	$show "$mv $output_obj $lobj"
+	if $run $mv $output_obj $lobj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Append the name of the PIC object to the libtool object file.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object='$objdir/$objname'
+
+EOF
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+        suppress_output=' >/dev/null 2>&1'
+      fi
+    else
+      # No PIC object so indicate it doesn't exist in the libtool
+      # object file.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object=none
+
+EOF
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	command="$command -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      $run $rm "$obj" "$output_obj"
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	$show "$mv $output_obj $obj"
+	if $run $mv $output_obj $obj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Append the name of the non-PIC object the libtool object file.
+      # Only append if the libtool object file exists.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object='$objname'
+
+EOF
+    else
+      # Append the name of the non-PIC object the libtool object file.
+      # Only append if the libtool object file exists.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object=none
+
+EOF
+    fi
+
+    $run $mv "${libobj}T" "${libobj}"
+
+    # Unlock the critical section if it was locked
+    if test "$need_locks" != no; then
+      $run $rm "$lockfile"
+    fi
+
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool link mode
+  link | relink)
+    modename="$modename: link"
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args="$nonopt"
+    base_compile="$nonopt $@"
+    compile_command="$nonopt"
+    finalize_command="$nonopt"
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    notinst_path= # paths that contain not-installed libtool libraries
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -all-static | -static)
+	if test "X$arg" = "X-all-static"; then
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	else
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	fi
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+	;;
+      *) qarg=$arg ;;
+      esac
+      libtool_args="$libtool_args $qarg"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  compile_command="$compile_command @OUTPUT@"
+	  finalize_command="$finalize_command @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    compile_command="$compile_command @SYMFILE@"
+	    finalize_command="$finalize_command @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  if test ! -f "$arg"; then
+	    $echo "$modename: symbol file \`$arg' does not exist"
+	    exit $EXIT_FAILURE
+	  fi
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat $save_arg`
+	    do
+#	      moreargs="$moreargs $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		# If there is no directory component, then add one.
+		case $arg in
+		*/* | *\\*) . $arg ;;
+		*) . ./$arg ;;
+		esac
+
+		if test -z "$pic_object" || \
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none && \
+		   test "$non_pic_object" = none; then
+		  $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+		  exit $EXIT_FAILURE
+		fi
+
+		# Extract subdirectory from the argument.
+		xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+		if test "X$xdir" = "X$arg"; then
+		  xdir=
+		else
+		  xdir="$xdir/"
+		fi
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      dlfiles="$dlfiles $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    dlprefiles="$dlprefiles $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  libobjs="$libobjs $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if test -z "$run"; then
+		  $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+		  exit $EXIT_FAILURE
+		else
+		  # Dry-run case.
+
+		  # Extract subdirectory from the argument.
+		  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+		  if test "X$xdir" = "X$arg"; then
+		    xdir=
+		  else
+		    xdir="$xdir/"
+		  fi
+
+		  pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+		  non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+		  libobjs="$libobjs $pic_object"
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		fi
+	      fi
+	    done
+	  else
+	    $echo "$modename: link input file \`$save_arg' does not exist"
+	    exit $EXIT_FAILURE
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    $echo "$modename: only absolute run-paths are allowed" 1>&2
+	    exit $EXIT_FAILURE
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  compile_command="$compile_command $qarg"
+	  finalize_command="$finalize_command $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  compile_command="$compile_command $wl$qarg"
+	  finalize_command="$finalize_command $wl$qarg"
+	  continue
+	  ;;
+	xcclinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  compile_command="$compile_command $qarg"
+	  finalize_command="$finalize_command $qarg"
+	  continue
+	  ;;
+	shrext)
+  	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	darwin_framework|darwin_framework_skip)
+	  test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg"
+	  compile_command="$compile_command $arg"
+	  finalize_command="$finalize_command $arg"
+	  prev=
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  compile_command="$compile_command $link_static_flag"
+	  finalize_command="$finalize_command $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+	continue
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  $echo "$modename: more than one -exported-symbols argument is not allowed"
+	  exit $EXIT_FAILURE
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework|-arch|-isysroot)
+	case " $CC " in
+	  *" ${arg} ${1} "* | *" ${arg}	${1} "*) 
+		prev=darwin_framework_skip ;;
+	  *) compiler_flags="$compiler_flags $arg"
+	     prev=darwin_framework ;;
+	esac
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  compile_command="$compile_command $arg"
+	  finalize_command="$finalize_command $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  if test -z "$absdir"; then
+	    $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+	    absdir="$dir"
+	    notinst_path="$notinst_path $dir"
+	  fi
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    deplibs="$deplibs -framework System"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	deplibs="$deplibs $arg"
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      -model)
+	compile_command="$compile_command $arg"
+	compiler_flags="$compiler_flags $arg"
+	finalize_command="$finalize_command $arg"
+	prev=xcompiler
+	continue
+	;;
+
+     -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+	compiler_flags="$compiler_flags $arg"
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+      # -r[0-9][0-9]* specifies the processor on the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+      # +DA*, +DD* enable 64-bit mode on the HP compiler
+      # -q* pass through compiler args for the IBM compiler
+      # -m* pass through architecture-specific compiler args for GCC
+      # -m*, -t[45]*, -txscale* pass through architecture-specific
+      # compiler args for GCC
+      # -pg pass through profiling flag for GCC
+      # @file GCC response files
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \
+      -t[45]*|-txscale*|@*)
+
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+        compile_command="$compile_command $arg"
+        finalize_command="$finalize_command $arg"
+        compiler_flags="$compiler_flags $arg"
+        continue
+        ;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # in order for the loader to find any dlls it needs.
+	  $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+	  $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  $echo "$modename: only absolute run-paths are allowed" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
+
+      -static)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -Wc,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Wl,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $wl$flag"
+	  linker_flags="$linker_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # Some other compiler flag.
+      -* | +*)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+
+      *.$objext)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  # If there is no directory component, then add one.
+	  case $arg in
+	  */* | *\\*) . $arg ;;
+	  *) . ./$arg ;;
+	  esac
+
+	  if test -z "$pic_object" || \
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none && \
+	     test "$non_pic_object" = none; then
+	    $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+	  if test "X$xdir" = "X$arg"; then
+	    xdir=
+ 	  else
+	    xdir="$xdir/"
+	  fi
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		dlfiles="$dlfiles $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      dlprefiles="$dlprefiles $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    libobjs="$libobjs $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if test -z "$run"; then
+	    $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+	    exit $EXIT_FAILURE
+	  else
+	    # Dry-run case.
+
+	    # Extract subdirectory from the argument.
+	    xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+	    if test "X$xdir" = "X$arg"; then
+	      xdir=
+	    else
+	      xdir="$xdir/"
+	    fi
+
+	    pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+	    non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+	    libobjs="$libobjs $pic_object"
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+      fi
+    done # argument parsing loop
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      compile_command="$compile_command $arg"
+      finalize_command="$finalize_command $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$output_objdir" = "X$output"; then
+      output_objdir="$objdir"
+    else
+      output_objdir="$output_objdir/$objdir"
+    fi
+    # Create the object directory.
+    if test ! -d "$output_objdir"; then
+      $show "$mkdir $output_objdir"
+      $run $mkdir $output_objdir
+      exit_status=$?
+      if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then
+	exit $exit_status
+      fi
+    fi
+
+    # Determine the type of output
+    case $output in
+    "")
+      $echo "$modename: you must specify an output file" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    case $host in
+    *cygwin* | *mingw* | *pw32*)
+      # don't eliminate duplications in $postdeps and $predeps
+      duplicate_compiler_generated_deps=yes
+      ;;
+    *)
+      duplicate_compiler_generated_deps=$duplicate_deps
+      ;;
+    esac
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if test "X$duplicate_deps" = "Xyes" ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	esac
+      fi
+      libs="$libs $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+	  esac
+	  pre_post_deps="$pre_post_deps $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    case $linkmode in
+    lib)
+	passes="conv link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+	    exit $EXIT_FAILURE
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+    for pass in $passes; do
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	esac
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    compiler_flags="$compiler_flags $deplib"
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
+	    continue
+	  fi
+	  name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+	  for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if (${SED} -e '2q' $lib |
+                    grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+		  library_names=
+		  old_library=
+		  case $lib in
+		  */* | *\\*) . $lib ;;
+		  *) . ./$lib ;;
+		  esac
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+		    test "X$ladir" = "X$lib" && ladir="."
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+	        ;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    ;;
+	  *)
+	    $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    valid_a_lib=no
+	    case $deplibs_check_method in
+	      match_pattern*)
+		set dummy $deplibs_check_method
+	        match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+		if eval $echo \"$deplib\" 2>/dev/null \
+		    | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		  valid_a_lib=yes
+		fi
+		;;
+	      pass_all)
+		valid_a_lib=yes
+		;;
+            esac
+	    if test "$valid_a_lib" != yes; then
+	      $echo
+	      $echo "*** Warning: Trying to link with static lib archive $deplib."
+	      $echo "*** I have the capability to make that library automatically link in when"
+	      $echo "*** you link to this library.  But I can only do this if you have a"
+	      $echo "*** shared version of the library, which you do not appear to have"
+	      $echo "*** because the file extensions .$libext of this argument makes me believe"
+	      $echo "*** that it is just a static archive that I should not used here."
+	    else
+	      $echo
+	      $echo "*** Warning: Linking the shared library $output against the"
+	      $echo "*** static library $deplib is not portable!"
+	      deplibs="$deplib $deplibs"
+	    fi
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      newdlprefiles="$newdlprefiles $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      newdlfiles="$newdlfiles $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$ladir" = "X$lib" && ladir="."
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	case $lib in
+	*/* | *\\*) . $lib ;;
+	*) . ./$lib ;;
+	esac
+
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	      exit $EXIT_FAILURE
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+              if test "X$duplicate_deps" = "Xyes" ; then
+	        case "$tmp_libs " in
+	        *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	        esac
+              fi
+	      tmp_libs="$tmp_libs $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    $echo "$modename: \`$lib' is not a convenience library" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+	if test -z "$linklib"; then
+	  $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  else
+	    newdlfiles="$newdlfiles $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    $echo "$modename: warning: library \`$lib' was moved." 1>&2
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$libdir"
+	    absdir="$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  fi
+	fi # $installed = yes
+	name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
+	  else
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
+	  fi
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if test "X$duplicate_deps" = "Xyes" ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath " in
+	      *" $dir "*) ;;
+	      *" $absdir "*) ;;
+	      *) temp_rpath="$temp_rpath $absdir" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes ; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  if test "$installed" = no; then
+	    notinst_deplibs="$notinst_deplibs $lib"
+	    need_relink=yes
+	  fi
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on
+	  # some systems (darwin)
+	  if test "$shouldnotlink" = yes && test "$pass" = link ; then
+	    $echo
+	    if test "$linkmode" = prog; then
+	      $echo "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $echo "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $echo "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    realname="$2"
+	    shift; shift
+	    libname=`eval \\$echo \"$libname_spec\"`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw*)
+		major=`expr $current - $age`
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
+	    newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      $show "extracting exported symbol list from \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      cmds=$extract_expsyms_cmds
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      $show "generating import library for \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      cmds=$old_archive_from_expsyms_cmds
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a module then we can not link against
+		    # it, someone is ignoring the new warnings I added
+		    if /usr/bin/file -L $add 2> /dev/null |
+                      $EGREP ": [^:]* bundle" >/dev/null ; then
+		      $echo "** Warning, lib $linklib is a module, not a shared library"
+		      if test -z "$old_library" ; then
+		        $echo
+		        $echo "** And there doesn't seem to be a static archive available"
+		        $echo "** The link will probably fail, sorry"
+		      else
+		        add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      $echo "$modename: configuration error: unsupported hardcode properties"
+	      exit $EXIT_FAILURE
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes && \
+		 test "$hardcode_minus_L" != yes && \
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+	        add="$inst_prefix_dir$libdir/$linklib"
+	      else
+	        add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    $echo
+	    $echo "*** Warning: This system can not link to static lib archive $lib."
+	    $echo "*** I have the capability to make that library automatically link in when"
+	    $echo "*** you link to this library.  But I can only do this if you have a"
+	    $echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      $echo "*** But as you try to build a module library, libtool will still create "
+	      $echo "*** a static module, that should work as long as the dlopening application"
+	      $echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		$echo
+		$echo "*** However, this would only work if libtool was able to extract symbol"
+		$echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		$echo "*** not find such a program.  So, this module is probably useless."
+		$echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    if test "X$duplicate_deps" = "Xyes" ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+		dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+		test "X$dir" = "X$deplib" && dir="."
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if grep "^installed=no" $deplib > /dev/null; then
+		  path="$absdir/$objdir"
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  if test -z "$libdir"; then
+		    $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		    exit $EXIT_FAILURE
+		  fi
+		  if test "$absdir" != "$libdir"; then
+		    $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+		  fi
+		  path="$absdir"
+		fi
+		depdepl=
+		case $host in
+		*-*-darwin*)
+		  # we do not want to link against static libs,
+		  # but need to link against shared
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$path/$depdepl" ; then
+		      depdepl="$path/$depdepl"
+		    fi
+		    # do not add paths which are already there
+		    case " $newlib_search_path " in
+		    *" $path "*) ;;
+		    *) newlib_search_path="$newlib_search_path $path";;
+		    esac
+		  fi
+		  path=""
+		  ;;
+		*)
+		  path="-L$path"
+		  ;;
+		esac
+		;;
+	      -l*)
+		case $host in
+		*-*-darwin*)
+		  # Again, we only want to link against shared libraries
+		  eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
+		  for tmp in $newlib_search_path ; do
+		    if test -f "$tmp/lib$tmp_libs.dylib" ; then
+		      eval depdepl="$tmp/lib$tmp_libs.dylib"
+		      break
+		    fi
+		  done
+		  path=""
+		  ;;
+		*) continue ;;
+		esac
+		;;
+	      *) continue ;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	      case " $deplibs " in
+	      *" $depdepl "*) ;;
+	      *) deplibs="$depdepl $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  tmp_libs="$tmp_libs $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	$echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+      fi
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	if test "$module" = no; then
+	  $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+	  exit $EXIT_FAILURE
+	else
+	  $echo
+	  $echo "*** Warning: Linking the shared library $output against the non-libtool"
+	  $echo "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
+      fi
+
+      if test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+      fi
+
+      set dummy $rpath
+      if test "$#" -gt 2; then
+	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+      fi
+      install_libdir="$2"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	if test -n "$vinfo"; then
+	  $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
+	fi
+
+	if test -n "$release"; then
+	  $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+	fi
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	IFS="$save_ifs"
+
+	if test -n "$8"; then
+	  $echo "$modename: too many parameters to \`-version-info'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$2"
+	  number_minor="$3"
+	  number_revision="$4"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  darwin|linux|osf|windows)
+	    current=`expr $number_major + $number_minor`
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    current=`expr $number_major + $number_minor - 1`
+	    age="$number_minor"
+	    revision="$number_minor"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$2"
+	  revision="$3"
+	  age="$4"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  minor_current=`expr $current + 1`
+	  verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current";
+	  ;;
+
+	irix | nonstopux)
+	  major=`expr $current - $age + 1`
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    iface=`expr $revision - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  major=.`expr $current - $age`
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    iface=`expr $current - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  major=`expr $current - $age`
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  $echo "$modename: unknown library version type \`$version_type'" 1>&2
+	  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+      fi
+
+      if test "$mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$echo "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+	         if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+	         then
+		   continue
+		 fi
+	       fi
+	       removelist="$removelist $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	if test -n "$removelist"; then
+	  $show "${rm}r $removelist"
+	  $run ${rm}r $removelist
+	fi
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      for path in $notinst_path; do
+	lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"`
+	deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"`
+	dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"`
+      done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs -framework System"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+ 	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $rm conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $rm conftest
+	  $LTCC $LTCFLAGS -o conftest conftest.c $deplibs
+	  if test "$?" -eq 0 ; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      name=`expr $i : '-l\(.*\)'`
+	      # If $name is empty we are operating on a -L argument.
+              if test "$name" != "" && test "$name" -ne "0"; then
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    newdeplibs="$newdeplibs $i"
+		    i=""
+		    ;;
+		  esac
+	        fi
+		if test -n "$i" ; then
+		  libname=`eval \\$echo \"$libname_spec\"`
+		  deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		  set dummy $deplib_matches
+		  deplib_match=$2
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    $echo
+		    $echo "*** Warning: dynamic linker does not accept needed library $i."
+		    $echo "*** I have the capability to make that library automatically link in when"
+		    $echo "*** you link to this library.  But I can only do this if you have a"
+		    $echo "*** shared version of the library, which I believe you do not have"
+		    $echo "*** because a test_compile did reveal that the linker did not use it for"
+		    $echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      name=`expr $i : '-l\(.*\)'`
+	      # If $name is empty we are operating on a -L argument.
+              if test "$name" != "" && test "$name" != "0"; then
+		$rm conftest
+		$LTCC $LTCFLAGS -o conftest conftest.c $i
+		# Did it work?
+		if test "$?" -eq 0 ; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      newdeplibs="$newdeplibs $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval \\$echo \"$libname_spec\"`
+		    deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		    set dummy $deplib_matches
+		    deplib_match=$2
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      newdeplibs="$newdeplibs $i"
+		    else
+		      droppeddeps=yes
+		      $echo
+		      $echo "*** Warning: dynamic linker does not accept needed library $i."
+		      $echo "*** I have the capability to make that library automatically link in when"
+		      $echo "*** you link to this library.  But I can only do this if you have a"
+		      $echo "*** shared version of the library, which you do not appear to have"
+		      $echo "*** because a test_compile did reveal that the linker did not use this one"
+		      $echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  $echo
+		  $echo "*** Warning!  Library $i is needed by this library but I was not able to"
+		  $echo "***  make it link in!  You will probably need to install it or some"
+		  $echo "*** library that it depends on before this library will be fully"
+		  $echo "*** functional.  Installing it before continuing would be even better."
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method
+	  file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name=`expr $a_deplib : '-l\(.*\)'`
+	    # If $name is empty we are operating on a -L argument.
+            if test "$name" != "" && test  "$name" != "0"; then
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval \\$echo \"$libname_spec\"`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null \
+			 | grep " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+			 | ${SED} 10q \
+			 | $EGREP "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$echo
+		$echo "*** Warning: linker path does not have real file for library $a_deplib."
+		$echo "*** I have the capability to make that library automatically link in when"
+		$echo "*** you link to this library.  But I can only do this if you have a"
+		$echo "*** shared version of the library, which you do not appear to have"
+		$echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $echo "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $echo "*** with $libname and none of the candidates passed a file format test"
+		  $echo "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name=`expr $a_deplib : '-l\(.*\)'`
+	    # If $name is empty we are operating on a -L argument.
+	    if test -n "$name" && test "$name" != "0"; then
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval \\$echo \"$libname_spec\"`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval $echo \"$potent_lib\" 2>/dev/null \
+		        | ${SED} 10q \
+		        | $EGREP "$match_pattern_regex" > /dev/null; then
+		      newdeplibs="$newdeplibs $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$echo
+		$echo "*** Warning: linker path does not have real file for library $a_deplib."
+		$echo "*** I have the capability to make that library automatically link in when"
+		$echo "*** you link to this library.  But I can only do this if you have a"
+		$echo "*** shared version of the library, which you do not appear to have"
+		$echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $echo "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $echo "*** with $libname and none of the candidates passed a file format test"
+		  $echo "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+	    -e 's/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
+	    done
+	  fi
+	  if $echo "X $tmp_deplibs" | $Xsed -e 's/[ 	]//g' \
+	    | grep . >/dev/null; then
+	    $echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      $echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      $echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    $echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library is the System framework
+	  newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    $echo
+	    $echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $echo "*** dependencies of module $libname.  Therefore, libtool will create"
+	    $echo "*** a static module, that should work as long as the dlopening"
+	    $echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      $echo
+	      $echo "*** However, this would only work if libtool was able to extract symbol"
+	      $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      $echo "*** not find such a program.  So, this module is probably useless."
+	      $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    $echo "*** The inter-library dependencies that have been dropped here will be"
+	    $echo "*** automatically added whenever a program is linked with this library"
+	    $echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      $echo
+	      $echo "*** Since this library must not contain undefined symbols,"
+	      $echo "*** because either the platform does not support them or"
+	      $echo "*** it was explicitly requested with -no-undefined,"
+	      $echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    if test -n "$hardcode_libdir_flag_spec_ld"; then
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+	    else
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	    fi
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	realname="$2"
+	shift; shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  linknames="$linknames $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      eval cmd=\"$cmd\"
+	      if len=`expr "X$cmd" : ".*"` &&
+	       test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	        $show "$cmd"
+	        $run eval "$cmd" || exit $?
+	        skipped_export=false
+	      else
+	        # The command line is too long to execute in one step.
+	        $show "using reloadable object file for export list..."
+	        skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex"; then
+	      $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+	      $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+	      $run eval '$mv "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+		case " $convenience " in
+		*" $test_deplib "*) ;;
+		*)
+			tmp_deplibs="$tmp_deplibs $test_deplib"
+			;;
+		esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    libobjs="$libobjs $func_extract_archives_result"
+	  fi
+	fi
+	
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linker_flags="$linker_flags $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	  eval test_cmds=\"$archive_expsym_cmds\"
+	  cmds=$archive_expsym_cmds
+	else
+	  eval test_cmds=\"$archive_cmds\"
+	  cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+	   test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise.
+	  $echo "creating reloadable object files..."
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  output_la=`$echo "X$output" | $Xsed -e "$basename"`
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  delfiles=
+	  last_robj=
+	  k=1
+	  output=$output_objdir/$output_la-${k}.$objext
+	  # Loop over the list of objects to be linked.
+	  for obj in $save_libobjs
+	  do
+	    eval test_cmds=\"$reload_cmds $objlist $last_robj\"
+	    if test "X$objlist" = X ||
+	       { len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+		 test "$len" -le "$max_cmd_len"; }; then
+	      objlist="$objlist $obj"
+	    else
+	      # The command $test_cmds is almost too long, add a
+	      # command to the queue.
+	      if test "$k" -eq 1 ; then
+		# The first file doesn't have a previous command to add.
+		eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+	      else
+		# All subsequent reloadable object files will link in
+		# the last one created.
+		eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
+	      fi
+	      last_robj=$output_objdir/$output_la-${k}.$objext
+	      k=`expr $k + 1`
+	      output=$output_objdir/$output_la-${k}.$objext
+	      objlist=$obj
+	      len=1
+	    fi
+	  done
+	  # Handle the remaining objects by creating one last
+	  # reloadable object file.  All subsequent reloadable object
+	  # files will link in the last one created.
+	  test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	  eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+
+	  if ${skipped_export-false}; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    libobjs=$output
+	    # Append the command to create the export file.
+	    eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
+          fi
+
+	  # Set up a command to remove the reloadable object files
+	  # after they are used.
+	  i=0
+	  while test "$i" -lt "$k"
+	  do
+	    i=`expr $i + 1`
+	    delfiles="$delfiles $output_objdir/$output_la-${i}.$objext"
+	  done
+
+	  $echo "creating a temporary reloadable object file: $output"
+
+	  # Loop through the commands generated above and execute them.
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $concat_cmds; do
+	    IFS="$save_ifs"
+	    $show "$cmd"
+	    $run eval "$cmd" || exit $?
+	  done
+	  IFS="$save_ifs"
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    cmds=$archive_expsym_cmds
+	  else
+	    cmds=$archive_cmds
+	    fi
+	  fi
+
+	  # Append the command to remove the reloadable object files
+	  # to the just-reset $cmds.
+	  eval cmds=\"\$cmds~\$rm $delfiles\"
+	fi
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $show "$cmd"
+	  $run eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$mode" = relink; then
+	      $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      $show "${rm}r $gentop"
+	      $run ${rm}r "$gentop"
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+	    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+      fi
+
+      case $output in
+      *.lo)
+	if test -n "$objs$old_deplibs"; then
+	  $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	libobj="$output"
+	obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $run $rm $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+	else
+	  gentop="$output_objdir/${obj}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      cmds=$reload_cmds
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	eval cmd=\"$cmd\"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $run eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	cmds=$reload_cmds
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $show "$cmd"
+	  $run eval "$cmd" || exit $?
+	done
+	IFS="$save_ifs"
+      fi
+
+      if test -n "$gentop"; then
+	$show "${rm}r $gentop"
+	$run ${rm}r $gentop
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
+      esac
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+      fi
+
+      if test "$preload" = yes; then
+	if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+	   test "$dlopen_self_static" = unknown; then
+	  $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+	fi
+      fi
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	;;
+      esac
+
+      case $host in
+      *darwin*)
+        # Don't allow lazy linking, it breaks C++ global constructors
+        if test "$tagname" = CXX ; then
+        compile_command="$compile_command ${wl}-bind_at_load"
+        finalize_command="$finalize_command ${wl}-bind_at_load"
+        fi
+        ;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
+
+      dlsyms=
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	  dlsyms="${outputname}S.c"
+	else
+	  $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+	fi
+      fi
+
+      if test -n "$dlsyms"; then
+	case $dlsyms in
+	"") ;;
+	*.c)
+	  # Discover the nlist of each of the dlfiles.
+	  nlist="$output_objdir/${outputname}.nm"
+
+	  $show "$rm $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Parse the name list into a source file.
+	  $show "creating $output_objdir/$dlsyms"
+
+	  test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+	  if test "$dlself" = yes; then
+	    $show "generating symbol list for \`$output'"
+
+	    test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+	    # Add our own program objects to the symbol list.
+	    progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	    for arg in $progfiles; do
+	      $show "extracting global C symbols from \`$arg'"
+	      $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	    done
+
+	    if test -n "$exclude_expsyms"; then
+	      $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    if test -n "$export_symbols_regex"; then
+	      $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    # Prepare the list of exported symbols
+	    if test -z "$export_symbols"; then
+	      export_symbols="$output_objdir/$outputname.exp"
+	      $run $rm $export_symbols
+	      $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+              case $host in
+              *cygwin* | *mingw* )
+	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+		$run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+                ;;
+              esac
+	    else
+	      $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      $run eval 'mv "$nlist"T "$nlist"'
+              case $host in
+              *cygwin* | *mingw* )
+	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+		$run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+                ;;
+              esac
+	    fi
+	  fi
+
+	  for arg in $dlprefiles; do
+	    $show "extracting global C symbols from \`$arg'"
+	    name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
+	    $run eval '$echo ": $name " >> "$nlist"'
+	    $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -z "$run"; then
+	    # Make sure we have at least an empty file.
+	    test -f "$nlist" || : > "$nlist"
+
+	    if test -n "$exclude_expsyms"; then
+	      $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	      $mv "$nlist"T "$nlist"
+	    fi
+
+	    # Try sorting and uniquifying the output.
+	    if grep -v "^: " < "$nlist" |
+		if sort -k 3 </dev/null >/dev/null 2>&1; then
+		  sort -k 3
+		else
+		  sort +2
+		fi |
+		uniq > "$nlist"S; then
+	      :
+	    else
+	      grep -v "^: " < "$nlist" > "$nlist"S
+	    fi
+
+	    if test -f "$nlist"S; then
+	      eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+	    else
+	      $echo '/* NONE */' >> "$output_objdir/$dlsyms"
+	    fi
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+"
+
+	    case $host in
+	    *cygwin* | *mingw* )
+	  $echo >> "$output_objdir/$dlsyms" "\
+/* DATA imports from DLLs on WIN32 can't be const, because
+   runtime relocations are performed -- see ld's documentation
+   on pseudo-relocs */
+struct {
+"
+	      ;;
+	    * )
+	  $echo >> "$output_objdir/$dlsyms" "\
+const struct {
+"
+	      ;;
+	    esac
+
+
+	  $echo >> "$output_objdir/$dlsyms" "\
+  const char *name;
+  lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+  {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	  fi
+
+	  pic_flag_for_symtable=
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
+	    esac;;
+	  *-*-hpux*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag";;
+	    esac
+	  esac
+
+	  # Now compile the dynamic symbol file.
+	  $show "(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+	  $run eval '(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+	  # Clean up the generated files.
+	  $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Transform the symbol file into the correct name.
+          case $host in
+          *cygwin* | *mingw* )
+            if test -f "$output_objdir/${outputname}.def" ; then
+              compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
+              finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
+            else
+              compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+              finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+             fi
+            ;;
+          * )
+            compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+            finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+            ;;
+          esac
+	  ;;
+	*)
+	  $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+      else
+	# We keep going just in case the user didn't refer to
+	# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+	# really was required.
+
+	# Nullify the symbol file.
+	compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+	finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+      fi
+
+      if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+	# Replace the output file specification.
+	compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	$show "$link_command"
+	$run eval "$link_command"
+	exit_status=$?
+
+	# Delete the generated files.
+	if test -n "$dlsyms"; then
+	  $show "$rm $output_objdir/${outputname}S.${objext}"
+	  $run $rm "$output_objdir/${outputname}S.${objext}"
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$shlibpath_var"; then
+	# We should set the shlibpath_var
+	rpath=
+	for dir in $temp_rpath; do
+	  case $dir in
+	  [\\/]* | [A-Za-z]:[\\/]*)
+	    # Absolute path.
+	    rpath="$rpath$dir:"
+	    ;;
+	  *)
+	    # Relative path: add a thisdir entry.
+	    rpath="$rpath\$thisdir/$dir:"
+	    ;;
+	  esac
+	done
+	temp_rpath="$rpath"
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$run $rm $output
+	# Link the executable and exit
+	$show "$link_command"
+	$run eval "$link_command" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+	$echo "$modename: \`$output' will be relinked during installation" 1>&2
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      $show "$link_command"
+      $run eval "$link_command" || exit $?
+
+      # Now create the wrapper script.
+      $show "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	    relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Quote $echo for shipping.
+      if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
+	case $progpath in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+	esac
+	qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if our run command is non-null.
+      if test -z "$run"; then
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+            output_name=`basename $output`
+            output_path=`dirname $output`
+            cwrappersource="$output_path/$objdir/lt-$output_name.c"
+            cwrapper="$output_path/$output_name.exe"
+            $rm $cwrappersource $cwrapper
+            trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+
+   Currently, it simply execs the wrapper *script* "/bin/sh $output",
+   but could eventually absorb all of the scripts functionality and
+   exec $objdir/$outputname directly.
+*/
+EOF
+	    cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+        (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+/* -DDEBUG is fairly common in CFLAGS.  */
+#undef DEBUG
+#if defined DEBUGWRAPPER
+# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__)
+#else
+# define DEBUG(format, ...)
+#endif
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+const char * base_name (const char *name);
+char * find_executable(const char *wrapper);
+int    check_executable(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  DEBUG("(main) argv[0]      : %s\n",argv[0]);
+  DEBUG("(main) program_name : %s\n",program_name);
+  newargz = XMALLOC(char *, argc+2);
+EOF
+
+            cat >> $cwrappersource <<EOF
+  newargz[0] = (char *) xstrdup("$SHELL");
+EOF
+
+            cat >> $cwrappersource <<"EOF"
+  newargz[1] = find_executable(argv[0]);
+  if (newargz[1] == NULL)
+    lt_fatal("Couldn't find %s", argv[0]);
+  DEBUG("(main) found exe at : %s\n",newargz[1]);
+  /* we know the script has the same name, without the .exe */
+  /* so make sure newargz[1] doesn't end in .exe */
+  strendzap(newargz[1],".exe");
+  for (i = 1; i < argc; i++)
+    newargz[i+1] = xstrdup(argv[i]);
+  newargz[argc+1] = NULL;
+
+  for (i=0; i<argc+1; i++)
+  {
+    DEBUG("(main) newargz[%d]   : %s\n",i,newargz[i]);
+    ;
+  }
+
+EOF
+
+            case $host_os in
+              mingw*)
+                cat >> $cwrappersource <<EOF
+  execv("$SHELL",(char const **)newargz);
+EOF
+              ;;
+              *)
+                cat >> $cwrappersource <<EOF
+  execv("$SHELL",newargz);
+EOF
+              ;;
+            esac
+
+            cat >> $cwrappersource <<"EOF"
+  return 127;
+}
+
+void *
+xmalloc (size_t num)
+{
+  void * p = (void *) malloc (num);
+  if (!p)
+    lt_fatal ("Memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
+;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char)name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable(const char * path)
+{
+  struct stat st;
+
+  DEBUG("(check_executable)  : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!");
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0) &&
+      (
+        /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
+#if defined (S_IXOTH)
+       ((st.st_mode & S_IXOTH) == S_IXOTH) ||
+#endif
+#if defined (S_IXGRP)
+       ((st.st_mode & S_IXGRP) == S_IXGRP) ||
+#endif
+       ((st.st_mode & S_IXUSR) == S_IXUSR))
+      )
+    return 1;
+  else
+    return 0;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise */
+char *
+find_executable (const char* wrapper)
+{
+  int has_slash = 0;
+  const char* p;
+  const char* p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char* concat_name;
+
+  DEBUG("(find_executable)  : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':')
+  {
+    concat_name = xstrdup (wrapper);
+    if (check_executable(concat_name))
+      return concat_name;
+    XFREE(concat_name);
+  }
+  else
+  {
+#endif
+    if (IS_DIR_SEPARATOR (wrapper[0]))
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable(concat_name))
+        return concat_name;
+      XFREE(concat_name);
+    }
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+    {
+      has_slash = 1;
+      break;
+    }
+  if (!has_slash)
+  {
+    /* no slashes; search PATH */
+    const char* path = getenv ("PATH");
+    if (path != NULL)
+    {
+      for (p = path; *p; p = p_next)
+      {
+        const char* q;
+        size_t p_len;
+        for (q = p; *q; q++)
+          if (IS_PATH_SEPARATOR(*q))
+            break;
+        p_len = q - p;
+        p_next = (*q == '\0' ? q : q + 1);
+        if (p_len == 0)
+        {
+          /* empty path: current directory */
+          if (getcwd (tmp, LT_PATHMAX) == NULL)
+            lt_fatal ("getcwd failed");
+          tmp_len = strlen(tmp);
+          concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
+          memcpy (concat_name, tmp, tmp_len);
+          concat_name[tmp_len] = '/';
+          strcpy (concat_name + tmp_len + 1, wrapper);
+        }
+        else
+        {
+          concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1);
+          memcpy (concat_name, p, p_len);
+          concat_name[p_len] = '/';
+          strcpy (concat_name + p_len + 1, wrapper);
+        }
+        if (check_executable(concat_name))
+          return concat_name;
+        XFREE(concat_name);
+      }
+    }
+    /* not found in PATH; assume curdir */
+  }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal ("getcwd failed");
+  tmp_len = strlen(tmp);
+  concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable(concat_name))
+    return concat_name;
+  XFREE(concat_name);
+  return NULL;
+}
+
+char *
+strendzap(char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert(str != NULL);
+  assert(pat != NULL);
+
+  len = strlen(str);
+  patlen = strlen(pat);
+
+  if (patlen <= len)
+  {
+    str += len - patlen;
+    if (strcmp(str, pat) == 0)
+      *str = '\0';
+  }
+  return str;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+          const char * message, va_list ap)
+{
+  fprintf (stderr, "%s: %s: ", program_name, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+  va_end (ap);
+}
+EOF
+          # we should really use a build-platform specific compiler
+          # here, but OTOH, the wrappers (shell script and this C one)
+          # are only useful if you want to execute the "real" binary.
+          # Since the "real" binary is built for $host, then this
+          # wrapper might as well be built for $host, too.
+          $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource
+          ;;
+        esac
+        $rm $output
+        trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+
+	$echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variable:
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$echo are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    echo=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$echo works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$echo will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$echo >> $output "\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+  done
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $echo >> $output "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" || \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $mkdir \"\$progdir\"
+    else
+      $rm \"\$progdir/\$file\"
+    fi"
+
+	  $echo >> $output "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$echo \"\$relink_command_output\" >&2
+	$rm \"\$progdir/\$file\"
+	exit $EXIT_FAILURE
+      fi
+    fi
+
+    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $rm \"\$progdir/\$program\";
+      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $rm \"\$progdir/\$file\"
+  fi"
+	else
+	  $echo >> $output "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$echo >> $output "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $echo >> $output "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $echo >> $output "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	$echo >> $output "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2*)
+	  $echo >> $output "\
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $echo >> $output "\
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$echo >> $output "\
+      \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+      exit $EXIT_FAILURE
+    fi
+  else
+    # The program doesn't exist.
+    \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$echo \"This script is just a wrapper for \$program.\" 1>&2
+    $echo \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit $EXIT_FAILURE
+  fi
+fi\
+"
+	chmod +x $output
+      fi
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	generated="$generated $gentop"
+
+	func_extract_archives $gentop $addlibs
+	oldobjs="$oldobjs $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+       cmds=$old_archive_from_new_cmds
+      else
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      $echo "X$obj" | $Xsed -e 's%^.*/%%'
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  $echo "copying selected object files to avoid basename conflicts..."
+
+	  if test -z "$gentop"; then
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
+
+	    $show "${rm}r $gentop"
+	    $run ${rm}r "$gentop"
+	    $show "$mkdir $gentop"
+	    $run $mkdir "$gentop"
+	    exit_status=$?
+	    if test "$exit_status" -ne 0 && test ! -d "$gentop"; then
+	      exit $exit_status
+	    fi
+	  fi
+
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		counter=`expr $counter + 1`
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      $run ln "$obj" "$gentop/$newobj" ||
+	      $run cp "$obj" "$gentop/$newobj"
+	      oldobjs="$oldobjs $gentop/$newobj"
+	      ;;
+	    *) oldobjs="$oldobjs $obj" ;;
+	    esac
+	  done
+	fi
+
+	eval cmds=\"$old_archive_cmds\"
+
+	if len=`expr "X$cmds" : ".*"` &&
+	     test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  $echo "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  for obj in $save_oldobjs
+	  do
+	    oldobjs="$objlist $obj"
+	    objlist="$objlist $obj"
+	    eval test_cmds=\"$old_archive_cmds\"
+	    if len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+	       test "$len" -le "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+	        RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+        eval cmd=\"$cmd\"
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$generated"; then
+      $show "${rm}r$generated"
+      $run ${rm}r$generated
+    fi
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      $show "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	  relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+
+      # Only create the output if not a dry run.
+      if test -z "$run"; then
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		if test -z "$libdir"; then
+		  $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		  exit $EXIT_FAILURE
+		fi
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit $EXIT_FAILURE
+	      fi
+	      newdlfiles="$newdlfiles $libdir/$name"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit $EXIT_FAILURE
+	      fi
+	      newdlprefiles="$newdlprefiles $libdir/$name"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlfiles="$newdlfiles $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlprefiles="$newdlprefiles $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $rm $output
+	  # place dlname in correct position for cygwin
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	  esac
+	  $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $echo >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      fi
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool install mode
+  install)
+    modename="$modename: install"
+
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $echo "X$nonopt" | grep shtool > /dev/null; then
+      # Aesthetically quote it.
+      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$arg "
+      arg="$1"
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+    case $arg in
+    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+      arg="\"$arg\""
+      ;;
+    esac
+    install_prog="$install_prog$arg"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f) 
+      	case " $install_prog " in
+	*[\\\ /]cp\ *) ;;
+	*) prev=$arg ;;
+	esac
+	;;
+      -g | -m | -o) prev=$arg ;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$install_prog $arg"
+    done
+
+    if test -z "$install_prog"; then
+      $echo "$modename: you must specify an install program" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prev' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	$echo "$modename: no file or destination specified" 1>&2
+      else
+	$echo "$modename: you must specify a destination" 1>&2
+      fi
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Strip any trailing slash from the destination.
+    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+      test "X$destdir" = "X$dest" && destdir=.
+      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files
+      if test "$#" -gt 2; then
+	$echo "$modename: \`$dest' is not a directory" 1>&2
+	$echo "$help" 1>&2
+	exit $EXIT_FAILURE
+      fi
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	library_names=
+	old_library=
+	relink_command=
+	# If there is no directory component, then add one.
+	case $file in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+	test "X$dir" = "X$file/" && dir=
+	dir="$dir$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  if test "$inst_prefix_dir" = "$destdir"; then
+	    $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  $echo "$modename: warning: relinking \`$file'" 1>&2
+	  $show "$relink_command"
+	  if $run eval "$relink_command"; then :
+	  else
+	    $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names
+	if test -n "$2"; then
+	  realname="$2"
+	  shift
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  $show "$install_prog $dir/$srcname $destdir/$realname"
+	  $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+	  if test -n "$stripme" && test -n "$striplib"; then
+	    $show "$striplib $destdir/$realname"
+	    $run eval "$striplib $destdir/$realname" || exit $?
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      if test "$linkname" != "$realname"; then
+                $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+                $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+	      fi
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  cmds=$postinstall_cmds
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    eval cmd=\"$cmd\"
+	    $show "$cmd"
+	    $run eval "$cmd" || {
+	      lt_exit=$?
+
+	      # Restore the uninstalled library and exit
+	      if test "$mode" = relink; then
+		$run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+	      fi
+
+	      exit $lt_exit
+	    }
+	  done
+	  IFS="$save_ifs"
+	fi
+
+	# Install the pseudo-library for information purposes.
+	name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	instname="$dir/$name"i
+	$show "$install_prog $instname $destdir/$name"
+	$run eval "$install_prog $instname $destdir/$name" || exit $?
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	if test -n "$destfile"; then
+	  $show "$install_prog $file $destfile"
+	  $run eval "$install_prog $file $destfile" || exit $?
+	fi
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+	  $show "$install_prog $staticobj $staticdest"
+	  $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      file=`$echo $file|${SED} 's,.exe$,,'`
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin*|*mingw*)
+	    wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  # Note that it is not necessary on cygwin/mingw to append a dot to
+	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
+	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
+	  # `FILE.' does not work on cygwin managed mounts.
+	  #
+	  # If there is no directory component, then add one.
+	  case $wrapper in
+	  */* | *\\*) . ${wrapper} ;;
+	  *) . ./${wrapper} ;;
+	  esac
+
+	  # Check the variables that should have been set.
+	  if test -z "$notinst_deplibs"; then
+	    $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      # If there is no directory component, then add one.
+	      case $lib in
+	      */* | *\\*) . $lib ;;
+	      *) . ./$lib ;;
+	      esac
+	    fi
+	    libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  # Note that it is not necessary on cygwin/mingw to append a dot to
+	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
+	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
+	  # `FILE.' does not work on cygwin managed mounts.
+	  #
+	  # If there is no directory component, then add one.
+	  case $wrapper in
+	  */* | *\\*) . ${wrapper} ;;
+	  *) . ./${wrapper} ;;
+	  esac
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    if test "$finalize" = yes && test -z "$run"; then
+	      tmpdir=`func_mktempdir`
+	      file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
+	      outputname="$tmpdir/$file"
+	      # Replace the output file specification.
+	      relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+	      $show "$relink_command"
+	      if $run eval "$relink_command"; then :
+	      else
+		$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+		${rm}r "$tmpdir"
+		continue
+	      fi
+	      file="$outputname"
+	    else
+	      $echo "$modename: warning: cannot relink \`$file'" 1>&2
+	    fi
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway 
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
+	    ;;
+	  esac
+	  ;;
+	esac
+	$show "$install_prog$stripme $file $destfile"
+	$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+	test -n "$outputname" && ${rm}r "$tmpdir"
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      $show "$install_prog $file $oldlib"
+      $run eval "$install_prog \$file \$oldlib" || exit $?
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	$show "$old_striplib $oldlib"
+	$run eval "$old_striplib $oldlib" || exit $?
+      fi
+
+      # Do each command in the postinstall commands.
+      cmds=$old_postinstall_cmds
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	eval cmd=\"$cmd\"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$future_libdirs"; then
+      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+    fi
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      test -n "$run" && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+    ;;
+
+  # libtool finish mode
+  finish)
+    modename="$modename: finish"
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  cmds=$finish_cmds
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    eval cmd=\"$cmd\"
+	    $show "$cmd"
+	    $run eval "$cmd" || admincmds="$admincmds
+       $cmd"
+	  done
+	  IFS="$save_ifs"
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $run eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    test "$show" = : && exit $EXIT_SUCCESS
+
+    $echo "X----------------------------------------------------------------------" | $Xsed
+    $echo "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      $echo "   $libdir"
+    done
+    $echo
+    $echo "If you ever happen to want to link against installed libraries"
+    $echo "in a given directory, LIBDIR, you must either use libtool, and"
+    $echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    $echo "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      $echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      $echo "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      $echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+      $echo "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
+
+      $echo "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      $echo "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      $echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    $echo
+    $echo "See any operating system documentation about shared libraries for"
+    $echo "more information, such as the ld(1) and ld.so(8) manual pages."
+    $echo "X----------------------------------------------------------------------" | $Xsed
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool execute mode
+  execute)
+    modename="$modename: execute"
+
+    # The first argument is the command name.
+    cmd="$nonopt"
+    if test -z "$cmd"; then
+      $echo "$modename: you must specify a COMMAND" 1>&2
+      $echo "$help"
+      exit $EXIT_FAILURE
+    fi
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      if test ! -f "$file"; then
+	$echo "$modename: \`$file' is not a file" 1>&2
+	$echo "$help" 1>&2
+	exit $EXIT_FAILURE
+      fi
+
+      dir=
+      case $file in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+
+	# If there is no directory component, then add one.
+	case $file in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+	;;
+
+      *)
+	$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  # If there is no directory component, then add one.
+	  case $file in
+	  */* | *\\*) . $file ;;
+	  *) . ./$file ;;
+	  esac
+
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+      args="$args \"$file\""
+    done
+
+    if test -z "$run"; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      if test "${save_LC_ALL+set}" = set; then
+	LC_ALL="$save_LC_ALL"; export LC_ALL
+      fi
+      if test "${save_LANG+set}" = set; then
+	LANG="$save_LANG"; export LANG
+      fi
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+	$echo "export $shlibpath_var"
+      fi
+      $echo "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+    ;;
+
+  # libtool clean and uninstall mode
+  clean | uninstall)
+    modename="$modename: $mode"
+    rm="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) rm="$rm $arg"; rmforce=yes ;;
+      -*) rm="$rm $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    if test -z "$rm"; then
+      $echo "$modename: you must specify an RM program" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    rmdirs=
+
+    origobjdir="$objdir"
+    for file in $files; do
+      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+      if test "X$dir" = "X$file"; then
+	dir=.
+	objdir="$origobjdir"
+      else
+	objdir="$dir/$origobjdir"
+      fi
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+      test "$mode" = uninstall && objdir="$dir"
+
+      # Remember objdir for removal later, being careful to avoid duplicates
+      if test "$mode" = clean; then
+	case " $rmdirs " in
+	  *" $objdir "*) ;;
+	  *) rmdirs="$rmdirs $objdir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if (test -L "$file") >/dev/null 2>&1 \
+	|| (test -h "$file") >/dev/null 2>&1 \
+	|| test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  . $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles="$rmfiles $objdir/$n"
+	  done
+	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+	  case "$mode" in
+	  clean)
+	    case "  $library_names " in
+	    # "  " in the beginning catches empty $dlname
+	    *" $dlname "*) ;;
+	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
+	    esac
+	     test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      cmds=$postuninstall_cmds
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test "$?" -ne 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      cmds=$old_postuninstall_cmds
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test "$?" -ne 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+
+	  # Read the .lo file
+	  . $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" \
+	     && test "$pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" \
+	     && test "$non_pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    file=`$echo $file|${SED} 's,.exe$,,'`
+	    noexename=`$echo $name|${SED} 's,.exe$,,'`
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    rmfiles="$rmfiles $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	    relink_command=
+	    . $dir/$noexename
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      rmfiles="$rmfiles $objdir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      $show "$rm $rmfiles"
+      $run $rm $rmfiles || exit_status=1
+    done
+    objdir="$origobjdir"
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	$show "rmdir $dir"
+	$run rmdir $dir >/dev/null 2>&1
+      fi
+    done
+
+    exit $exit_status
+    ;;
+
+  "")
+    $echo "$modename: you must specify a MODE" 1>&2
+    $echo "$generic_help" 1>&2
+    exit $EXIT_FAILURE
+    ;;
+  esac
+
+  if test -z "$exec_cmd"; then
+    $echo "$modename: invalid operation mode \`$mode'" 1>&2
+    $echo "$generic_help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+  eval exec $exec_cmd
+  exit $EXIT_FAILURE
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+    --config          show all configuration variables
+    --debug           enable verbose shell tracing
+-n, --dry-run         display commands without modifying any files
+    --features        display basic configuration information and exit
+    --finish          same as \`--mode=finish'
+    --help            display this help message and exit
+    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
+    --quiet           same as \`--silent'
+    --silent          don't print informational messages
+    --tag=TAG         use configuration variables from tag TAG
+    --version         print version information
+
+MODE must be one of the following:
+
+      clean           remove files from the build directory
+      compile         compile a source file into a libtool object
+      execute         automatically set library path, then run a program
+      finish          complete the installation of libtool libraries
+      install         install libraries or executables
+      link            create a library or an executable
+      uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE.
+
+Report bugs to <bug-libtool at gnu.org>."
+  exit $EXIT_SUCCESS
+  ;;
+
+clean)
+  $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+compile)
+  $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -static           always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+  ;;
+
+execute)
+  $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+  ;;
+
+finish)
+  $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+  ;;
+
+install)
+  $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+  ;;
+
+link)
+  $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+		    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+		    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -static           do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+		    specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+  ;;
+
+uninstall)
+  $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+*)
+  $echo "$modename: invalid operation mode \`$mode'" 1>&2
+  $echo "$help" 1>&2
+  exit $EXIT_FAILURE
+  ;;
+esac
+
+$echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit $?
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+disable_libs=shared
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+disable_libs=static
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/m4/Makefile.am b/m4/Makefile.am
new file mode 100644
index 0000000..e2d31c7
--- /dev/null
+++ b/m4/Makefile.am
@@ -0,0 +1,44 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+# M4 macro files to be used by the client applications with Autoconf.
+m4datadir = $(datadir)/aclocal
+m4data_DATA = ppl.m4
+
+# M4 macro files for internal use.
+m4macros = \
+ac_check_fpu_control.m4 \
+ac_check_gmp.m4 \
+ac_check_sicstus_prolog.m4 \
+ac_check_swi_prolog.m4 \
+ac_check_xsb_prolog.m4 \
+ac_cxx_attribute_weak.m4 \
+ac_cxx_double_binary_format.m4 \
+ac_cxx_flexible_arrays.m4 \
+ac_cxx_float_binary_format.m4 \
+ac_cxx_long_double_binary_format.m4 \
+lib-ld.m4 \
+lib-link.m4 \
+lib-prefix.m4
+
+EXTRA_DIST = $(m4macros) $(m4data_DATA)
+
diff --git a/m4/Makefile.in b/m4/Makefile.in
new file mode 100644
index 0000000..d43e7d6
--- /dev/null
+++ b/m4/Makefile.in
@@ -0,0 +1,488 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = m4
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(m4datadir)"
+m4dataDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(m4data_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+
+# M4 macro files to be used by the client applications with Autoconf.
+m4datadir = $(datadir)/aclocal
+m4data_DATA = ppl.m4
+
+# M4 macro files for internal use.
+m4macros = \
+ac_check_fpu_control.m4 \
+ac_check_gmp.m4 \
+ac_check_sicstus_prolog.m4 \
+ac_check_swi_prolog.m4 \
+ac_check_xsb_prolog.m4 \
+ac_cxx_attribute_weak.m4 \
+ac_cxx_double_binary_format.m4 \
+ac_cxx_flexible_arrays.m4 \
+ac_cxx_float_binary_format.m4 \
+ac_cxx_long_double_binary_format.m4 \
+lib-ld.m4 \
+lib-link.m4 \
+lib-prefix.m4
+
+EXTRA_DIST = $(m4macros) $(m4data_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  m4/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  m4/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-m4dataDATA: $(m4data_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(m4datadir)" || $(mkdir_p) "$(DESTDIR)$(m4datadir)"
+	@list='$(m4data_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(m4dataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(m4datadir)/$$f'"; \
+	  $(m4dataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(m4datadir)/$$f"; \
+	done
+
+uninstall-m4dataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(m4data_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(m4datadir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(m4datadir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(m4datadir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-m4dataDATA
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-m4dataDATA
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-m4dataDATA install-man \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am uninstall-info-am uninstall-m4dataDATA
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/m4/ac_check_fpu_control.m4 b/m4/ac_check_fpu_control.m4
new file mode 100644
index 0000000..a658429
--- /dev/null
+++ b/m4/ac_check_fpu_control.m4
@@ -0,0 +1,51 @@
+dnl A function to check for the possibility to control the FPU.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CHECK_FPU_CONTROL],
+[
+AC_LANG_PUSH(C++)
+AC_CHECK_HEADERS([fenv.h ieeefp.h])
+AC_MSG_CHECKING([for the possibility to control the FPU])
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+int
+main() {
+#if i386
+#elif defined(HAVE_FENV_H)
+#elif sparc && defined( HAVE_IEEEFP_H)
+#else
+  choke me
+#endif
+
+  ;
+  return 0;
+}
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cv_can_control_fpu=1,
+  AC_MSG_RESULT(no)
+  ac_cv_can_control_fpu=0
+),
+AM_CONDITIONAL(CAN_CONTROL_FPU, test $ac_cv_can_control_fpu = 1)
+AC_DEFINE_UNQUOTED(PPL_CAN_CONTROL_FPU, $ac_cv_can_control_fpu,
+    [Not zero if the FPU can be controlled.])
+AC_LANG_POP(C++)
+])
diff --git a/m4/ac_check_gmp.m4 b/m4/ac_check_gmp.m4
new file mode 100644
index 0000000..3b4c9b6
--- /dev/null
+++ b/m4/ac_check_gmp.m4
@@ -0,0 +1,127 @@
+dnl A function to check for the existence and usability of GMP.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CHECK_GMP],
+[
+dnl Since libgmp and libgmpxx are usually installed in the same location,
+dnl let the prefixes default from each other.
+if test -n "$with_libgmpxx_prefix" && test -z "$with_libgmp_prefix"; then
+  with_libgmp_prefix="$with_libgmpxx_prefix"
+else
+  if test -n "$with_libgmp_prefix" && test -z "$with_libgmpxx_prefix"; then
+    with_libgmpxx_prefix="$with_libgmp_prefix"
+  fi
+fi
+
+dnl Check how to link with libgmp.
+AC_LIB_LINKFLAGS([gmp])
+
+dnl Check how to link with libgmpxx.
+AC_LIB_LINKFLAGS([gmpxx], [gmp])
+
+ac_save_LIBS="$LIBS"
+LIBS="$LIBS $LIBGMPXX"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([for the GMP library version 4.1.3 or above])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <gmpxx.h>
+
+#if __GNU_MP_VERSION < 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR < 1) || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR == 1 && __GNU_MP_VERSION_PATCHLEVEL < 3)
+#error "GMP version 4.1.3 or higher is required"
+#endif
+
+int main() {
+  mpz_class n("3141592653589793238462643383279502884");
+  return 0;
+}
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cv_have_gmp=yes,
+  AC_MSG_RESULT(no)
+  ac_cv_have_gmp=no,
+  AC_MSG_RESULT(no)
+  ac_cv_have_gmp=no)
+
+have_gmp=${ac_cv_have_gmp}
+
+if test x"$ac_cv_have_gmp" = xyes
+then
+
+AC_CHECK_SIZEOF(mp_limb_t, , [#include <gmp.h>])
+
+AC_MSG_CHECKING([whether GMP has been compiled with support for exceptions])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <gmpxx.h>
+#include <new>
+#include <cstddef>
+
+static void*
+x_malloc(size_t) {
+  throw std::bad_alloc();
+}
+
+static void*
+x_realloc(void*, size_t, size_t) {
+  throw std::bad_alloc();
+}
+
+static void
+x_free(void*, size_t) {
+}
+
+int main() {
+  mp_set_memory_functions(x_malloc, x_realloc, x_free);
+  try {
+    mpz_class n("3141592653589793238462643383279502884");
+  }
+  catch (std::bad_alloc&) {
+    return 0;
+  }
+  return 1;
+}
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cv_gmp_supports_exceptions=yes,
+  AC_MSG_RESULT(no)
+  ac_cv_gmp_supports_exceptions=no,
+  AC_MSG_RESULT(no)
+  ac_cv_gmp_supports_exceptions=no)
+
+gmp_supports_exceptions=${ac_cv_gmp_supports_exceptions}
+if test x"$gmp_supports_exceptions" = xyes
+then
+  value=1
+else
+  value=0
+fi
+AC_DEFINE_UNQUOTED(GMP_SUPPORTS_EXCEPTIONS, $value,
+  [Not zero if GMP has been compiled with support for exceptions.])
+
+fi
+
+AC_LANG_POP(C++)
+LIBS="$ac_save_LIBS"
+
+dnl We use libtool, therefore we take $LTLIBGMPXX, not $LIBGMPXX.
+gmp_library_option="$LTLIBGMPXX"
+])
diff --git a/m4/ac_check_sicstus_prolog.m4 b/m4/ac_check_sicstus_prolog.m4
new file mode 100644
index 0000000..52b8e9d
--- /dev/null
+++ b/m4/ac_check_sicstus_prolog.m4
@@ -0,0 +1,62 @@
+dnl A function to check for the existence and usability of SICStus Prolog.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CHECK_SICSTUS_PROLOG],
+[
+AC_PATH_PROG(sicstus_prolog, sicstus)
+if test x$sicstus_prolog != x
+then
+  dnl The following would fail to find the real base `sicstus'
+  dnl is a symbolic link.
+  dnl sicstus_prolog_base=$(dirname $(dirname $sicstus_prolog))
+  sicstus_prolog_base=$(dirname $($sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt."))
+  SICSTUS_PROLOG_INCLUDE_OPTIONS="-I${sicstus_prolog_base}/include"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $SICSTUS_PROLOG_INCLUDE_OPTIONS"
+  AC_LANG_PUSH(C++)
+  # We require SICStus Prolog 3.9.1 or later.
+  AC_CHECK_HEADER(sicstus/sicstus.h,
+                  AC_MSG_CHECKING([for SICStus version 3.9.1 or later])
+                  AC_EGREP_CPP(yes,
+                    [
+                      #include <sicstus/sicstus.h>
+                      #if SICSTUS_MAJOR_VERSION > 3 || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION > 9) || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION == 9 && SICSTUS_REVISION_VERSION >= 1)
+                      yes
+                      #endif
+                    ],
+                    AC_MSG_RESULT(yes),
+                    sicstus_prolog=""
+                    AC_MSG_RESULT(no)
+                  ),
+                  sicstus_prolog="")
+  AC_LANG_POP(C++)
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  AC_SUBST(SICSTUS_PROLOG_INCLUDE_OPTIONS)
+fi
+
+if test x$sicstus_prolog != x
+then
+  have_sicstus_prolog=yes
+else
+  have_sicstus_prolog=no
+fi
+])
diff --git a/m4/ac_check_swi_prolog.m4 b/m4/ac_check_swi_prolog.m4
new file mode 100644
index 0000000..3d03256
--- /dev/null
+++ b/m4/ac_check_swi_prolog.m4
@@ -0,0 +1,79 @@
+dnl A function to check for the existence and usability of SWI-Prolog.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CHECK_SWI_PROLOG],
+[
+dnl By default, SWI-Prolog is installed as `pl', though some administrators
+dnl call it `swipl' or `swi-prolog'.  In particular, on Mac OS X `pl' is
+dnl the name of another program.
+AC_PATH_PROG(swi_prolog, swi-prolog)
+if test -z $swi_prolog
+then
+  AC_PATH_PROG(swi_prolog, swipl)
+  if test -z $swi_prolog
+  then
+    AC_PATH_PROG(swi_prolog, pl)
+  fi
+fi
+if test x$swi_prolog != x
+then
+  swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\(.*\)";/\1/'`
+  swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";/\1/'`
+
+  dnl Additional version checks could be inserted here, if necessary.
+
+  SWI_PROLOG_INCLUDE_OPTIONS="-I${swi_prolog_base}/include"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $SWI_PROLOG_INCLUDE_OPTIONS"
+  AC_LANG_PUSH(C++)
+  # We require SWI-Prolog 5.6.0 or later.
+  AC_CHECK_HEADER(SWI-Prolog.h,
+                  AC_MSG_CHECKING([for SWI-Prolog version 5.6.0 or later])
+                  AC_COMPILE_IFELSE(
+[#include <SWI-Prolog.h>
+
+int
+main() {
+#if !defined(PLVERSION) || PLVERSION < 50600
+  choke me
+#endif
+
+  ;
+  return 0;
+}],
+                    AC_MSG_RESULT(yes),
+                    swi_prolog=""
+                    AC_MSG_RESULT(no)
+                  ),
+                  swi_prolog="")
+  AC_LANG_POP(C++)
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  AC_SUBST(SWI_PROLOG_INCLUDE_OPTIONS)
+fi
+
+if test x$swi_prolog != x
+then
+  have_swi_prolog=yes
+else
+  have_swi_prolog=no
+fi
+])
diff --git a/m4/ac_check_xsb_prolog.m4 b/m4/ac_check_xsb_prolog.m4
new file mode 100644
index 0000000..2e552b1
--- /dev/null
+++ b/m4/ac_check_xsb_prolog.m4
@@ -0,0 +1,49 @@
+dnl A function to check for the existence and usability of XSB Prolog.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CHECK_XSB_PROLOG],
+[
+AC_PATH_PROG(xsb_prolog, xsb)
+if test x$xsb_prolog != x
+then
+  dnl The foreign language interface include file is `cinterf.h',
+  dnl but this resides in the emulator directory and is not installed
+  dnl in any standard place.
+  xsb_emu_dir=$(xsb --nobanner --quietload --noprompt \
+                -e "write('emudir='), \
+                  xsb_configuration(emudir, X), write(X), nl, halt." \
+                    2>/dev/null | sed "s/^emudir=//g")
+  xsb_config_dir=$(xsb --nobanner --quietload --noprompt \
+                   -e "write('config_dir='), \
+                     xsb_configuration(config_dir,X), write(X), nl, halt." \
+                       2>/dev/null | sed "s/^config_dir=//g")
+  XSB_PROLOG_INCLUDE_OPTIONS="-I${xsb_emu_dir} -I${xsb_config_dir}"
+  AC_SUBST(XSB_PROLOG_INCLUDE_OPTIONS)
+fi
+
+if test x$xsb_prolog != x
+then
+  have_xsb_prolog=yes
+else
+  have_xsb_prolog=no
+fi
+])
diff --git a/m4/ac_cxx_attribute_weak.m4 b/m4/ac_cxx_attribute_weak.m4
new file mode 100644
index 0000000..7f950c5
--- /dev/null
+++ b/m4/ac_cxx_attribute_weak.m4
@@ -0,0 +1,58 @@
+dnl A function to check whether the C++ compiler supports the function
+dnl __attribute__ ((weak)).
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CXX_SUPPORTS_ATTRIBUTE_WEAK],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the C++ compiler supports __attribute__ ((weak))])
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+void
+foo() __attribute__ ((weak));
+
+void
+foo() {
+}
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cxx_supports_attribute_weak=yes,
+  AC_MSG_RESULT(no)
+  ac_cxx_supports_attribute_weak=no,
+  AC_MSG_RESULT(no)
+  ac_cxx_supports_attribute_weak=no)
+
+if test x"$ac_cxx_supports_attribute_weak" = xyes
+then
+  value=1
+else
+  value=0
+fi
+AC_DEFINE_UNQUOTED(CXX_SUPPORTS_ATTRIBUTE_WEAK, $value,
+  [Not zero if the C++ compiler supports __attribute__ ((weak)).])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_double_binary_format.m4 b/m4/ac_cxx_double_binary_format.m4
new file mode 100644
index 0000000..5e3c271
--- /dev/null
+++ b/m4/ac_cxx_double_binary_format.m4
@@ -0,0 +1,100 @@
+dnl A function to detect the binary format used by C++ doubles.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CXX_DOUBLE_BINARY_FORMAT],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([the binary format of C++ doubles])
+ac_cxx_double_binary_format=unknown
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+  union {
+    double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint32_t lsp;
+#else
+      uint32_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<double>::is_iec559
+    && (convert(0xaaacccaaUL, 0xacccaaacUL)
+	== -4.018242396032647e-103
+    &&	convert(0xcccaaaccUL, 0xcaaacccaUL)
+	  == -85705035845709846787631445265530356117787053916987832397725696.0)
+    ? 0 : 1;
+}
+
+#else // SIZEOF_DOUBLE != 8
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_DOUBLE != 8
+]])],
+  AC_DEFINE(CXX_DOUBLE_BINARY_FORMAT, float_ieee754_double,
+    [The binary format of C++ doubles, if supported; undefined otherwise.])
+  ac_cxx_double_binary_format="IEEE754 Double Precision")
+
+AC_MSG_RESULT($ac_cxx_double_binary_format)
+
+if test x"$ac_cxx_double_binary_format" = x"unknown"
+then
+  ac_supported_double=0
+else
+  ac_supported_double=1
+fi
+AM_CONDITIONAL(SUPPORTED_DOUBLE, test $ac_supported_double = 1)
+AC_DEFINE_UNQUOTED(PPL_SUPPORTED_DOUBLE, $ac_supported_double,
+  [Not zero if doubles are supported.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_flexible_arrays.m4 b/m4/ac_cxx_flexible_arrays.m4
new file mode 100644
index 0000000..283303f
--- /dev/null
+++ b/m4/ac_cxx_flexible_arrays.m4
@@ -0,0 +1,95 @@
+dnl A function to check whether the C++ compiler supports flexible arrays.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CXX_SUPPORTS_FLEXIBLE_ARRAYS],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the C++ compiler supports flexible arrays])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <new>
+#include <cstddef>
+#include <cstdlib>
+
+class A {
+private:
+  int i;
+  bool b;
+
+public:
+  A()
+    : i(0), b(false) {
+  }
+};
+
+class B {
+private:
+  int capacity;
+  A vec[];
+
+public:
+  void* operator new(size_t fixed_size, int c) {
+    return ::operator new(fixed_size + c*sizeof(B));
+  }
+
+  void operator delete(void* p) {
+    ::operator delete(p);
+  }
+
+  void operator delete(void* p, int) {
+    ::operator delete(p);
+  }
+
+  B(int s)
+    : capacity(s) {
+  }
+};
+
+int
+main() {
+  B* p = new (100) B(100);
+  delete p;
+  exit(0);
+}
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cxx_supports_flexible_arrays=yes,
+  AC_MSG_RESULT(no)
+  ac_cxx_supports_flexible_arrays=no,
+  AC_MSG_RESULT(no)
+  ac_cxx_supports_flexible_arrays=no)
+
+if test x"$ac_cxx_supports_flexible_arrays" = xyes
+then
+  value=1
+else
+  value=0
+fi
+AC_DEFINE_UNQUOTED(CXX_SUPPORTS_FLEXIBLE_ARRAYS, $value,
+  [Not zero if the C++ compiler supports flexible arrays.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_float_binary_format.m4 b/m4/ac_cxx_float_binary_format.m4
new file mode 100644
index 0000000..45edd33
--- /dev/null
+++ b/m4/ac_cxx_float_binary_format.m4
@@ -0,0 +1,91 @@
+dnl A function to detect the binary format used by C++ floats.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CXX_FLOAT_BINARY_FORMAT],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([the binary format of C++ floats])
+ac_cxx_float_binary_format=unknown
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_FLOAT == 4
+
+inline float
+convert(uint32_t x) {
+  union {
+    float value;
+    uint32_t word;
+  } u;
+
+  u.word = x;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<float>::is_iec559
+    && (convert(0xaaacccaaUL)
+	== -3.069535185924732179074680971098132431507110595703125e-13
+    &&  convert(0xcccaaaccUL)
+	== -106255968)
+  ? 0 : 1;
+}
+
+#else // SIZEOF_FLOAT != 4
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_FLOAT != 4
+]])],
+  AC_DEFINE(CXX_FLOAT_BINARY_FORMAT, float_ieee754_single,
+    [The binary format of C++ floats, if supported; undefined otherwise.])
+  ac_cxx_float_binary_format="IEEE754 Single Precision")
+
+AC_MSG_RESULT($ac_cxx_float_binary_format)
+
+if test x"$ac_cxx_float_binary_format" = x"unknown"
+then
+  ac_supported_float=0
+else
+  ac_supported_float=1
+fi
+AM_CONDITIONAL(SUPPORTED_FLOAT, test $ac_supported_float = 1)
+AC_DEFINE_UNQUOTED(PPL_SUPPORTED_FLOAT, $ac_supported_float,
+  [Not zero if floats are supported.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_long_double_binary_format.m4 b/m4/ac_cxx_long_double_binary_format.m4
new file mode 100644
index 0000000..d0a846b
--- /dev/null
+++ b/m4/ac_cxx_long_double_binary_format.m4
@@ -0,0 +1,272 @@
+dnl A function to detect the binary format used by C++ long doubles.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CXX_LONG_DOUBLE_BINARY_FORMAT],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([the binary format of C++ long doubles])
+ac_cxx_long_double_binary_format=unknown
+
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 12
+
+long double
+convert(uint32_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<long double>::is_iec559
+    && (convert(0xaaacccaaUL, 0xacccaaacccaaacccULL)
+	== -2347515119623533044836098728848844802360499059743792266553789449931714103027083147350004052130909778252174381128110073162061230391014115892328306480775581568464385654456454167018199800371311459509865035007576337091690846028483890278748770302000164922066968427857731908531920447109369397262198780877931467490364866823668872333299978555289484532591724489792080483029098529153534398647750864910040989348665150713407129673962368698401443396580325986886785546510945722073165626067034971013793 [...]
+    &&  convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL)
+        == -3.2343499084336735697883624337582367014013792003863104780702304912017160945762080887330922093527110817635309731394394027547210062178890319023095669053441067666970505933558514051896941259661008015375938113204938505791529386797054658707886845235185418061587914083787185969361328546834255817542052425946141924658766401026284322468976745836497454676411392342071395848101018687729153124540755822652406871842792438612173516670599208782361645064732617977033939815107992280307781523996574 [...]
+    ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 12
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 12
+]])],
+  AC_DEFINE(CXX_LONG_DOUBLE_BINARY_FORMAT, float_intel_double_extended,
+  [The binary format of C++ long doubles, if supported; undefined otherwise.])
+  ac_cxx_long_double_binary_format="Intel Double-Extended")
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 16
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint64_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint64_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<long double>::is_iec559
+    && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+        == -8.5585565388510043474134185399390263e-1644L
+    &&  convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+        == -1.245145811075115522107964569349668e+986L)
+    ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+]])],
+  AC_DEFINE(CXX_LONG_DOUBLE_BINARY_FORMAT, float_ieee754_quad,
+  [The binary format of C++ long doubles, if supported; undefined otherwise.])
+  ac_cxx_long_double_binary_format="IEEE754 Quad Precision")
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 16
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint64_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint64_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<long double>::is_iec559
+  && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+      == -7.604854094366020338337599887587800202175513745285694296699118737579061822543271195468213752945697068626341230960061791319756014599393179237494607606117559455091592495531339152856677735299681614113855047309039978381765251689655330467878879653297684753038610775075912700489795099693753075187209767515639593721823446001374821995460346508811516182804821576375433157503444723668976504567458418892711612877008293336291456723718701753008252854005800263180027419214648596175836662547627167 [...]
+      && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+         == -99658331877181425640389193712445288804009112642407197633229907048864350192381814628233384153539524368748305269642704450459572458913058829202094408933558533552137589226430537671503754737153845553845646099179512540696038707395491223325946106007770844660381340028079827237033670900446083793353682761885084154898636897779677124010119288945740273072415898996441722571487815052387317025675191665761918119006431828756780493604546658949166486641354783002536071366287780290680620995991797 [...]
+    ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+]])],
+  AC_DEFINE(CXX_LONG_DOUBLE_BINARY_FORMAT, float_intel_double_extended,
+    [The binary format of C++ long doubles, if supported; undefined otherwise.])
+  ac_cxx_long_double_binary_format="Intel Double-Extended")
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint32_t lsp;
+#else
+      uint32_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  return std::numeric_limits<long double>::is_iec559
+    && (convert(0xaaacccaaUL, 0xacccaaacUL)
+	== -4.018242396032647e-103
+    &&	convert(0xcccaaaccUL, 0xcaaacccaUL)
+	  == -85705035845709846787631445265530356117787053916987832397725696.0)
+    ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 8
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 8
+]])],
+  AC_DEFINE(CXX_LONG_DOUBLE_BINARY_FORMAT, float_ieee754_double,
+    [The binary format of C++ long doubles, if supported; undefined otherwise.])
+  ac_cxx_long_double_binary_format="IEEE754 Double Precision")
+fi
+
+AC_MSG_RESULT($ac_cxx_long_double_binary_format)
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+  ac_supported_long_double=0
+else
+  ac_supported_long_double=1
+fi
+AM_CONDITIONAL(SUPPORTED_LONG_DOUBLE, test $ac_supported_long_double = 1)
+AC_DEFINE_UNQUOTED(PPL_SUPPORTED_LONG_DOUBLE, $ac_supported_long_double,
+  [Not zero if long doubles are supported.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_text_md5sum.m4 b/m4/ac_text_md5sum.m4
new file mode 100644
index 0000000..15b8cdf
--- /dev/null
+++ b/m4/ac_text_md5sum.m4
@@ -0,0 +1,37 @@
+dnl A function to set the command for computing the MD5 checksum of text files.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_TEXT_MD5SUM],
+[
+AC_MSG_CHECKING([for the text md5sum command])
+if echo a | (md5sum -t) >/dev/null 2>&1
+then
+  ac_cv_prog_text_md5sum='md5sum -t'
+else
+  ac_cv_prog_text_md5sum='md5sum'
+fi
+AC_MSG_RESULT($ac_cv_prog_text_md5sum)
+TEXT_MD5SUM=$ac_cv_prog_text_md5sum
+AC_SUBST([TEXT_MD5SUM])
+])
+
+
diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4
new file mode 100644
index 0000000..96c4e2c
--- /dev/null
+++ b/m4/lib-ld.m4
@@ -0,0 +1,110 @@
+# lib-ld.m4 serial 3 (gettext-0.13)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  acl_cv_prog_gnu_ld=yes ;;
+*)
+  acl_cv_prog_gnu_ld=no ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by GCC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]* | [A-Za-z]:[\\/]*)]
+      [re_direlt='/[^/][^/]*/\.\./']
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(acl_cv_path_LD,
+[if test -z "$LD"; then
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break ;;
+      *)
+	test "$with_gnu_ld" != yes && break ;;
+      esac
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
diff --git a/m4/lib-link.m4 b/m4/lib-link.m4
new file mode 100644
index 0000000..ea0b0c4
--- /dev/null
+++ b/m4/lib-link.m4
@@ -0,0 +1,553 @@
+# lib-link.m4 serial 6 (gettext-0.14.3)
+dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ(2.50)
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  define([Name],[translit([$1],[./-], [___])])
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+    AC_LIB_LINKFLAGS_BODY([$1], [$2])
+    ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+    ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+    ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+  ])
+  LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+  LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+  INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+  dnl results of this search when this library appears as a dependency.
+  HAVE_LIB[]NAME=yes
+  undefine([Name])
+  undefine([NAME])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. If found, it
+dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
+dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  define([Name],[translit([$1],[./-], [___])])
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed lib[]Name and not disabled its use
+  dnl via --without-lib[]Name-prefix, he wants to use it.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+    ac_save_LIBS="$LIBS"
+    LIBS="$LIBS $LIB[]NAME"
+    AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
+    LIBS="$ac_save_LIBS"
+  ])
+  if test "$ac_cv_lib[]Name" = yes; then
+    HAVE_LIB[]NAME=yes
+    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
+    AC_MSG_CHECKING([how to link with lib[]$1])
+    AC_MSG_RESULT([$LIB[]NAME])
+  else
+    HAVE_LIB[]NAME=no
+    dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+    dnl $INC[]NAME either.
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LIB[]NAME=
+    LTLIB[]NAME=
+  fi
+  AC_SUBST([HAVE_LIB]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  undefine([Name])
+  undefine([NAME])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
+dnl hardcode_direct, hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+  dnl Tell automake >= 1.10 to complain if config.rpath is missing.
+  m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
+  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
+  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
+  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
+  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+  AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+  ])
+  wl="$acl_cv_wl"
+  libext="$acl_cv_libext"
+  shlibext="$acl_cv_shlibext"
+  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  hardcode_direct="$acl_cv_hardcode_direct"
+  hardcode_minus_L="$acl_cv_hardcode_minus_L"
+  dnl Determine whether the user wants rpath handling at all.
+  AC_ARG_ENABLE(rpath,
+    [  --disable-rpath         do not hardcode runtime library paths],
+    :, enable_rpath=yes)
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib$1-prefix],
+[  --with-lib$1-prefix[=DIR]  search for lib$1 in DIR/include and DIR/lib
+  --without-lib$1-prefix     don't search for lib$1 in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+])
+  dnl Search the library and its dependencies in $additional_libdir and
+  dnl $LDFLAGS. Using breadth-first-seach.
+  LIB[]NAME=
+  LTLIB[]NAME=
+  INC[]NAME=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='$1 $2'
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+        dnl or AC_LIB_HAVE_LINKFLAGS call.
+        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+          else
+            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+            dnl that this library doesn't exist. So just drop it.
+            :
+          fi
+        else
+          dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+          dnl and the already constructed $LIBNAME/$LTLIBNAME.
+          found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIB[]NAME; do
+              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+            dnl Found the library.
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+              dnl Linking with a shared library. We attempt to hardcode its
+              dnl directory into the executable's runpath, unless it's the
+              dnl standard /usr/lib.
+              if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+                dnl No hardcoding is needed.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+              else
+                dnl Use an explicit option to hardcode DIR into the resulting
+                dnl binary.
+                dnl Potentially add DIR to ltrpathdirs.
+                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                dnl The hardcoding into $LIBNAME is system dependent.
+                if test "$hardcode_direct" = yes; then
+                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+                  dnl resulting binary.
+                  LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                    dnl Use an explicit option to hardcode DIR into the resulting
+                    dnl binary.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    dnl Potentially add DIR to rpathdirs.
+                    dnl The rpathdirs will be appended to $LIBNAME at the end.
+                    haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                    dnl Rely on "-L$found_dir".
+                    dnl But don't add it if it's already contained in the LDFLAGS
+                    dnl or the already constructed $LIBNAME
+                    haveit=
+                    for x in $LDFLAGS $LIB[]NAME; do
+                      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    else
+                      dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
+                      dnl here, because this doesn't fit in flags passed to the
+                      dnl compiler. So give up. No hardcoding. This affects only
+                      dnl very old systems.
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                dnl Linking with a static library.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+              else
+                dnl We shouldn't come here, but anyway it's good to have a
+                dnl fallback.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+              fi
+            fi
+            dnl Assume the include files are nearby.
+            additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+              dnl Potentially add $additional_includedir to $INCNAME.
+              dnl But don't add it
+              dnl   1. if it's the standard /usr/include,
+              dnl   2. if it's /usr/local/include and we are using GCC on Linux,
+              dnl   3. if it's already present in $CPPFLAGS or the already
+              dnl      constructed $INCNAME,
+              dnl   4. if it doesn't exist as a directory.
+              if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INC[]NAME; do
+                    AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                      dnl Really add $additional_includedir to $INCNAME.
+                      INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+            dnl Look for dependencies.
+            if test -n "$found_la"; then
+              dnl Read the .la file. It defines the variables
+              dnl dlname, library_names, old_library, dependency_libs, current,
+              dnl age, revision, installed, dlopen, dlpreopen, libdir.
+              save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+              dnl We use only dependency_libs.
+              for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+                    dnl But don't add it
+                    dnl   1. if it's the standard /usr/lib,
+                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
+                    dnl   3. if it's already present in $LDFLAGS or the already
+                    dnl      constructed $LIBNAME,
+                    dnl   4. if it doesn't exist as a directory.
+                    if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LIBNAME.
+                            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LTLIBNAME.
+                            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                      dnl Potentially add DIR to rpathdirs.
+                      dnl The rpathdirs will be appended to $LIBNAME at the end.
+                      haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                      dnl Potentially add DIR to ltrpathdirs.
+                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                      haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                    dnl Handle this in the next round.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                    dnl Handle this in the next round. Throw away the .la's
+                    dnl directory; it is already contained in a preceding -L
+                    dnl option.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                    dnl Most likely an immediate library name.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+                    LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+            dnl Didn't find the library; assume it is in the system directories
+            dnl known to the linker and runtime loader. (All the system
+            dnl directories known to the linker should also be known to the
+            dnl runtime loader, otherwise the system is severely misconfigured.)
+            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+      dnl Weird platform: only the last -rpath option counts, the user must
+      dnl pass all path elements in one option. We can arrange that for a
+      dnl single library, but not when more than one $LIBNAMEs are used.
+      alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+      dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
+      acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+    else
+      dnl The -rpath options are cumulative.
+      for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+    dnl When using libtool, the option that works for both libraries and
+    dnl executables is -R. The -R options are cumulative.
+    for found_dir in $ltrpathdirs; do
+      LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+    done
+  fi
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+  for element in [$2]; do
+    haveit=
+    for x in $[$1]; do
+      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      [$1]="${[$1]}${[$1]:+ }$element"
+    fi
+  done
+])
diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4
new file mode 100644
index 0000000..0d895ca
--- /dev/null
+++ b/m4/lib-prefix.m4
@@ -0,0 +1,153 @@
+# lib-prefix.m4 serial 4 (gettext-0.14.2)
+dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib-prefix],
+[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+  --without-lib-prefix    don't search for libraries in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+])
+  if test $use_additional = yes; then
+    dnl Potentially add $additional_includedir to $CPPFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/include,
+    dnl   2. if it's already present in $CPPFLAGS,
+    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_includedir" != "X/usr/include"; then
+      haveit=
+      for x in $CPPFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-I$additional_includedir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_includedir" = "X/usr/local/include"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_includedir"; then
+            dnl Really add $additional_includedir to $CPPFLAGS.
+            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+          fi
+        fi
+      fi
+    fi
+    dnl Potentially add $additional_libdir to $LDFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/lib,
+    dnl   2. if it's already present in $LDFLAGS,
+    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_libdir" != "X/usr/lib"; then
+      haveit=
+      for x in $LDFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-L$additional_libdir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_libdir" = "X/usr/local/lib"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_libdir"; then
+            dnl Really add $additional_libdir to $LDFLAGS.
+            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+          fi
+        fi
+      fi
+    fi
+  fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+  dnl Unfortunately, prefix and exec_prefix get only finally determined
+  dnl at the end of configure.
+  if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  $1
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+])
diff --git a/m4/ppl.m4 b/m4/ppl.m4
new file mode 100644
index 0000000..4df7534
--- /dev/null
+++ b/m4/ppl.m4
@@ -0,0 +1,280 @@
+dnl A function to test for the existence and usability of particular
+dnl versions of the PPL, defining macros containing the required paths.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 1997 Owen Taylor
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 2 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://www.cs.unipr.it/ppl/ .
+dnl
+
+dnl AM_PATH_PPL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for PPL, and define PPL_CPPFLAGS, PPL_LDFLAGS, ... what else?
+
+AC_DEFUN([AM_PATH_PPL],
+[
+dnl Get the required information from the ppl-config program.
+AC_ARG_WITH(ppl-prefix,
+  AS_HELP_STRING([--with-ppl-prefix=PREFIX],
+    [prefix used to configure the PPL]),
+  ppl_prefix="$withval",
+  ppl_prefix="")
+AC_ARG_WITH(ppl-exec-prefix,
+  AS_HELP_STRING([--with-ppl-exec-prefix=PREFIX],
+    [exec-prefix used to configure the PPL]),
+  ppl_exec_prefix="$withval",
+  ppl_exec_prefix="")
+AC_ARG_ENABLE(ppl-test,
+  AS_HELP_STRING([--disable-ppltest],
+    [do not try to compile and run a test PPL program]),
+  ,
+  enable_ppltest=yes)
+
+if test "x$ppl_exec_prefix" != x
+then
+  ppl_config_args="$ppl_config_args --exec-prefix=$ppl_exec_prefix"
+  if test "x${PPL_CONFIG+set}" != xset
+  then
+    PPL_CONFIG="$ppl_exec_prefix/bin/ppl-config"
+  fi
+fi
+if test "x$ppl_prefix" != x
+then
+  ppl_config_args="$ppl_config_args --prefix=$ppl_prefix"
+  if test "x${PPL_CONFIG+set}" != xset
+  then
+    PPL_CONFIG="$ppl_prefix/bin/ppl-config"
+  fi
+fi
+
+AC_PATH_PROG(PPL_CONFIG, ppl-config, no)
+min_ppl_version=ifelse([$1], ,0.0,$1)
+if test \( "x$min_ppl_version" = "x0.0" \) -o \( "x$min_ppl_version" = "x0.0.0" \)
+then
+  AC_MSG_CHECKING([for the Parma Polyhedra Library])
+else
+  AC_MSG_CHECKING([for the Parma Polyhedra Library, version >= $min_ppl_version])
+fi
+no_ppl=""
+if test $PPL_CONFIG = no
+then
+  no_ppl=yes
+else
+  PPL_CPPFLAGS=`$PPL_CONFIG $ppl_config_args --cppflags`
+  PPL_LDFLAGS=`$PPL_CONFIG $ppl_config_args --ldflags`
+  ppl_config_version="`$PPL_CONFIG $ppl_config_args --version`"
+
+  if test "x$enable_ppltest" = xyes
+  then
+    ac_save_CPPFLAGS="$CPPFLAGS"
+    ac_save_LDFLAGS="$LDFLAGS"
+    CPPFLAGS="$CPPFLAGS $PPL_CPPFLAGS"
+    LDFLAGS="$PPL_LDFLAGS $LDFLAGS"
+
+dnl Now check if the installed PPL is sufficiently new.
+dnl (Also sanity checks the results of ppl-config to some extent.)
+
+    rm -f conf.ppltest
+    AC_TRY_RUN([
+#include <ppl.hh>
+#include <iostream>
+#include <cstdio>
+#include <cstdlib>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+using std::cout;
+using std::endl;
+
+int
+main() {
+  system("touch conf.ppltest");
+
+  unsigned min_ppl_major, min_ppl_minor, min_ppl_revision, min_ppl_beta;
+  int n = sscanf("$min_ppl_version",
+                 "%u.%u.%upre%u%*c",
+                 &min_ppl_major, &min_ppl_minor,
+                 &min_ppl_revision, &min_ppl_beta);
+  bool min_ppl_version_ok = true;
+  if (n == 4) {
+    if (min_ppl_beta == 0)
+      min_ppl_version_ok = false;
+  }
+  else if (n == 3) {
+    n = sscanf("$min_ppl_version",
+               "%u.%u.%u%*c",
+               &min_ppl_major, &min_ppl_minor, &min_ppl_revision);
+    if (n != 3)
+      min_ppl_version_ok = false;
+    else
+      min_ppl_beta = 0;
+  }
+  else if (n == 2) {
+    n = sscanf("$min_ppl_version",
+               "%u.%upre%u%*c",
+               &min_ppl_major, &min_ppl_minor, &min_ppl_beta);
+    if (n == 3) {
+      if (min_ppl_beta == 0)
+        min_ppl_version_ok = false;
+      else
+        min_ppl_revision = 0; 
+    }
+    else if (n == 2) {
+      n = sscanf("$min_ppl_version",
+                 "%u.%u%*c",
+                 &min_ppl_major, &min_ppl_minor);
+      if (n != 2)
+        min_ppl_version_ok = false;
+      else {
+        min_ppl_revision = 0; 
+        min_ppl_beta = 0;
+      }
+    }
+    else
+      min_ppl_version_ok = false;
+  }
+  else
+    min_ppl_version_ok = false;
+
+  if (!min_ppl_version_ok) {
+    cout << "illegal version string '$min_ppl_version'"
+         << endl;
+    exit(1);
+  }
+
+  if (strcmp("$ppl_config_version", PPL::version()) != 0)
+    cout << "\n*** 'ppl-config --version' returned $ppl_config_version, "
+            "but PPL version "
+         << PPL::version()
+         << "\n*** was found!  If ppl-config was correct, then it is best"
+            "\n*** to remove the old version of PPL."
+            "  You may also be able to fix the error"
+            "\n*** by modifying your LD_LIBRARY_PATH enviroment variable,"
+            " or by editing"
+            "\n*** /etc/ld.so.conf."
+            "  Make sure you have run ldconfig if that is"
+            "\n*** required on your system."
+            "\n*** If ppl-config was wrong, set the environment variable"
+            " PPL_CONFIG"
+            "\n*** to point to the correct copy of ppl-config,"
+            " and remove the file config.cache"
+            "\n*** before re-running configure"
+         << endl;
+  else if (strcmp(PPL_VERSION, PPL::version()) != 0)
+    cout << "\n*** PPL header file (version " PPL_VERSION ") does not match"
+         << "\n*** library (version " << PPL::version() << ")"
+         << endl;
+  else {
+    if (PPL_VERSION_MAJOR < min_ppl_major
+        || (PPL_VERSION_MAJOR == min_ppl_major
+           && PPL_VERSION_MINOR < min_ppl_minor)
+        || (PPL_VERSION_MAJOR == min_ppl_major
+           && PPL_VERSION_MINOR == min_ppl_minor
+           && PPL_VERSION_REVISION < min_ppl_revision)
+        || (PPL_VERSION_MAJOR == min_ppl_major
+           && PPL_VERSION_MINOR == min_ppl_minor
+           && PPL_VERSION_REVISION == min_ppl_revision
+           && PPL_VERSION_BETA < min_ppl_beta)) {
+      cout << "\n*** An old version of PPL (" PPL_VERSION ") was found"
+              "\n*** You need at least PPL version $min_ppl_version."
+              "  The latest version of"
+              "\n*** PPL is always available from ftp://ftp.cs.unipr.it/ppl/ ."
+              "\n***"
+              "\n*** If you have already installed a sufficiently new version,"
+              " this error"
+              "\n*** probably means that the wrong copy of the ppl-config"
+              " program is"
+              "\n*** being found.  The easiest way to fix this is to remove"
+              " the old version"
+              "\n*** of PPL, but you can also set the PPL_CONFIG environment"
+              " variable to point"
+              "\n*** to the correct copy of ppl-config.  (In this case,"
+              " you will have to"
+              "\n*** modify your LD_LIBRARY_PATH enviroment"
+              " variable or edit /etc/ld.so.conf"
+              "\n*** so that the correct libraries are found at run-time.)"
+           << endl;
+      exit(1);
+    }
+  }
+  return 0;
+}
+],, no_ppl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+       CPPFLAGS="$ac_save_CPPFLAGS"
+       LDFLAGS="$ac_save_LDFLAGS"
+  fi
+fi
+if test "x$no_ppl" = x
+then
+  AC_MSG_RESULT(yes)
+  ifelse([$2], , :, [$2])     
+else
+  AC_MSG_RESULT(no)
+  if test x"$PPL_CONFIG" = xno
+  then
+    echo "*** The ppl-config script installed by PPL could not be found."
+    echo "*** If the PPL was installed in PREFIX, make sure PREFIX/bin is in"
+    echo "*** your path, or set the PPL_CONFIG environment variable to the"
+    echo "*** full path to ppl-config."
+  else
+    if test -f conf.ppltest
+    then
+      :
+    else
+      echo "*** Could not run PPL test program, checking why..."
+      CPPFLAGS="$CPPFLAGS $PPL_CPPFLAGS"
+      LDFLAGS="$LDFLAGS $PPL_LDFLAGS"
+      AC_TRY_LINK([
+#include <ppl.hh>
+using namespace Parma_Polyhedra_Library;
+],
+[
+  return version_major() || version_minor()
+  || version_revision() || version_beta();
+],
+[
+  echo "*** The test program compiled, but did not run.  This usually means"
+  echo "*** that the run-time linker is not finding the PPL or finding the"
+  echo "*** wrong version of the PPL.  If it is not finding the PPL, you will"
+  echo "*** need to set your LD_LIBRARY_PATH environment variable, or edit"
+  echo "*** /etc/ld.so.conf to point to the installed location.  Also, make"
+  echo "*** sure you have run ldconfig if that is required on your system"
+  echo "***"
+  echo "*** If you have an old version installed, it is best to remove it,"
+  echo "*** although you may also be able to get things to work by modifying"
+  echo "*** LD_LIBRARY_PATH."
+],
+[
+  echo "*** The test program failed to compile or link. See the file"
+  echo "*** config.log for the exact error that occured.  This usually"
+  echo "*** the PPL was incorrectly installed or that someone moved the PPL"
+  echo "*** since it was installed.  In both cases you should reinstall"
+  echo "*** the library."
+])
+      CPPFLAGS="$ac_save_CPPFLAGS"
+      LDFLAGS="$ac_save_LDFLAGS"
+    fi
+  fi
+  PPL_CPPFLAGS=""
+  PPL_LDFLAGS=""
+  ifelse([$3], , :, [$3])
+fi
+AC_SUBST(PPL_CPPFLAGS)
+AC_SUBST(PPL_LDFLAGS)
+rm -f conf.ppltest
+])
diff --git a/missing b/missing
new file mode 100755
index 0000000..d84fac8
--- /dev/null
+++ b/missing
@@ -0,0 +1,359 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2005-06-08.21
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
+#   Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake at gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+  lex|yacc)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case "$f" in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+    test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f y.tab.h ]; then
+	echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+	file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+    fi
+    if [ -f "$file" ]; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit 1
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case "$firstarg" in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case "$firstarg" in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755
index 0000000..259dbfc
--- /dev/null
+++ b/mkinstalldirs
@@ -0,0 +1,158 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2005-06-29.22
+
+# Original author: Noah Friedman <friedman at prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+errstatus=0
+dirmode=
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake at gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+  case $1 in
+    -h | --help | --h*)         # -h for help
+      echo "$usage"
+      exit $?
+      ;;
+    -m)                         # -m PERM arg
+      shift
+      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+      dirmode=$1
+      shift
+      ;;
+    --version)
+      echo "$0 $scriptversion"
+      exit $?
+      ;;
+    --)                         # stop option processing
+      shift
+      break
+      ;;
+    -*)                         # unknown option
+      echo "$usage" 1>&2
+      exit 1
+      ;;
+    *)                          # first non-opt arg
+      break
+      ;;
+  esac
+done
+
+for file
+do
+  if test -d "$file"; then
+    shift
+  else
+    break
+  fi
+done
+
+case $# in
+  0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error.  This is a problem when calling mkinstalldirs
+# from a parallel make.  We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+  '')
+    if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+      echo "mkdir -p -- $*"
+      exec mkdir -p -- "$@"
+    else
+      # On NextStep and OpenStep, the `mkdir' command does not
+      # recognize any option.  It will interpret all options as
+      # directories to create, and then abort because `.' already
+      # exists.
+      test -d ./-p && rmdir ./-p
+      test -d ./--version && rmdir ./--version
+    fi
+    ;;
+  *)
+    if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+       test ! -d ./--version; then
+      echo "mkdir -m $dirmode -p -- $*"
+      exec mkdir -m "$dirmode" -p -- "$@"
+    else
+      # Clean up after NextStep and OpenStep mkdir.
+      for d in ./-m ./-p ./--version "./$dirmode";
+      do
+        test -d $d && rmdir $d
+      done
+    fi
+    ;;
+esac
+
+for file
+do
+  case $file in
+    /*) pathcomp=/ ;;
+    *)  pathcomp= ;;
+  esac
+  oIFS=$IFS
+  IFS=/
+  set fnord $file
+  shift
+  IFS=$oIFS
+
+  for d
+  do
+    test "x$d" = x && continue
+
+    pathcomp=$pathcomp$d
+    case $pathcomp in
+      -*) pathcomp=./$pathcomp ;;
+    esac
+
+    if test ! -d "$pathcomp"; then
+      echo "mkdir $pathcomp"
+
+      mkdir "$pathcomp" || lasterr=$?
+
+      if test ! -d "$pathcomp"; then
+	errstatus=$lasterr
+      else
+	if test ! -z "$dirmode"; then
+	  echo "chmod $dirmode $pathcomp"
+	  lasterr=
+	  chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+	  if test ! -z "$lasterr"; then
+	    errstatus=$lasterr
+	  fi
+	fi
+      fi
+    fi
+
+    pathcomp=$pathcomp/
+  done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/ppl.lsm.in b/ppl.lsm.in
new file mode 100644
index 0000000..0dd2e43
--- /dev/null
+++ b/ppl.lsm.in
@@ -0,0 +1,31 @@
+Begin4
+Title:		ppl
+Version:	@VERSION@
+Entered-date:	@ISODATE@
+Description:	The Parma Polyhedra Library (PPL) is a C++ library
+		for the manipulation of numerical abstractions.
+Keywords:	C++ library convex polyhedra
+Author:		Roberto Bagnara (bagnara at cs.unipr.it)
+		Patricia M. Hill (hill at comp.leeds.ac.uk)
+		Enea Zaffanella (zaffanella at cs.unipr.it)
+		Abramo Bagnara (Opera Unica)
+                Andrea Cimino (University of Parma)
+		Giordano Fracasso (University of Parma)
+                Elena Mazzi (University of Parma)
+                Matthew Mundell (University of Leeds)
+                Barbara Quartieri (University of Parma)
+		Elisa Ricci (former student of the University of Parma)
+		Sara Bonini (former student of the University of Parma)
+		Andrea Pescetti (former student of the University of Parma)
+		Angela Stazzone (former student of the University of Parma)
+		Tatiana Zolo (former student of the University of Parma)
+Maintained-by:	ppl-devel at cs.unipr.it (PPL developers)
+Primary-site:	metlab.unc.edu /pub/linux/libs
+		5850k ppl- at VERSION@.tar.gz
+		800 ppl.lsm
+Alternate-site:	
+Original-site:	http://www.cs.unipr.it/ppl/
+Platforms:      Portable; tested on Linux, FreeBSD, OpenBSD, Solaris,
+                IRIX64, Mac OS X, Cygwin, DEC OSF/1.
+Copying-policy:	GPL
+End
diff --git a/ppl.spec.in b/ppl.spec.in
new file mode 100644
index 0000000..f8b2db6
--- /dev/null
+++ b/ppl.spec.in
@@ -0,0 +1,185 @@
+%define name	ppl
+%define version @VERSION@
+%define release 1
+%define builddir $RPM_BUILD_DIR/%{name}-%{version}
+
+Name:		%{name}
+Version:	%{version}
+Release:	%{release}
+Vendor:		ppl-devel at cs.unipr.it
+Packager:	%{packager}
+URL:		http://www.cs.unipr.it/ppl/
+Source:         ftp://ftp.cs.unipr.it/pub/ppl/releases/%{version}/%{name}-%{version}.tar.gz
+#Patch:
+Group:		Development/Libraries
+License:	GPL v2
+#Icon:
+Requires:	gmp >= 4.1.3, gcc-c++ >= 4.0.2
+BuildRoot:	%{_tmppath}/%{name}-%{version}
+Prefix:		/usr
+Summary:	The Parma Polyhedra Library: a C++ library for numerical abstractions.
+%description
+The Parma Polyhedra Library (PPL) is a C++ library for the
+manipulation of (not necessarily closed) convex polyhedra and other
+numerical abstractions.  The applications of convex polyhedra include
+program analysis, optimized compilation, integer and combinatorial
+optimization and statistical data-editing.  The Parma Polyhedra
+Library is user friendly (you write `x + 2*y + 5*z <= 7' when you mean
+it), fully dynamic (available virtual memory is the only limitation to
+the dimension of anything), written in standard C++, exception-safe,
+rather efficient, thoroughly documented, and free software.
+
+%package c
+Summary:	The C interface of the Parma Polyhedra Library
+Group:		Development/Libraries
+Requires:	ppl = %{version}-%{release}
+%description c
+This package adds C support to the Parma Polyhedra Library (PPL).
+Install this package if you want to access the PPL via C.
+
+%package gprolog
+Summary:	The GNU Prolog interface of the Parma Polyhedra Library.
+Group:		Development/Libraries
+Requires:	ppl = %{version}-%{release}, ppl-pwl = %{version}-%{release}
+%description gprolog
+This package adds GNU Prolog support to the Parma Polyhedra Library (PPL).
+Install this package if you want to use the library in GNU Prolog programs.
+
+%package sicstus
+Summary:	The SICStus Prolog interface of the Parma Polyhedra Library.
+Group:		Development/Libraries
+Requires:	ppl = %{version}-%{release}, ppl-pwl = %{version}-%{release}
+%description sicstus
+This package adds SICStus Prolog support to the Parma Polyhedra Library (PPL).
+Install this package if you want to use the library in SICStus Prolog programs.
+
+%package swi
+Summary:	The SWI Prolog interface of the Parma Polyhedra Library.
+Group:		Development/Libraries
+Requires:	ppl = %{version}-%{release}, ppl-pwl = %{version}-%{release}
+%description swi
+This package adds SWI Prolog support to the Parma Polyhedra Library (PPL).
+Install this package if you want to use the library in SWI Prolog programs.
+
+%package yap
+Summary:	The YAP Prolog interface of the Parma Polyhedra Library.
+Group:		Development/Libraries
+Requires:	ppl = %{version}-%{release}, ppl-pwl = %{version}-%{release}
+%description yap
+This package adds YAP Prolog support to the Parma Polyhedra Library (PPL).
+Install this package if you want to use the library in YAP Prolog programs.
+
+%package pwl
+Summary:	The Parma Watchdog Library: a C++ library for watchdog timers.
+Group:		Development/Libraries
+Requires:	gcc-c++ >= 4.0.2
+%description pwl
+This package contains the Parma Watchdog Library (PWL).
+The library provides support for multiple, concurrent watchdog timers
+on systems providing setitimer(2).
+The PWL is currently distributed with the Parma Polyhedra Library (PPL),
+but is totally independent from it.
+
+%prep
+%setup -n %{name}-%{version}
+#%patch -p1
+
+%build
+CXXFLAGS="$RPM_OPT_FLAGS" ./configure --enable-shared \
+    --prefix=%{_prefix} --bindir=%{_bindir} --mandir=%{_mandir} \
+    --localstatedir=%{_localstatedir} --libdir=%{_libdir} \
+    --datadir=%{_datadir} --includedir=%{_includedir} \
+    --sysconfdir=%{_sysconfdir}
+make
+
+%install
+if [ -d $RPM_BUILD_ROOT ]
+then
+	rm -rf $RPM_BUILD_ROOT
+fi
+mkdir -p $RPM_BUILD_ROOT
+make prefix=$RPM_BUILD_ROOT%{_prefix} bindir=$RPM_BUILD_ROOT%{_bindir} \
+    mandir=$RPM_BUILD_ROOT%{_mandir} libdir=$RPM_BUILD_ROOT%{_libdir} \
+    localstatedir=$RPM_BUILD_ROOT%{_localstatedir} \
+    datadir=$RPM_BUILD_ROOT%{_datadir} \
+    includedir=$RPM_BUILD_ROOT%{_includedir} \
+    sysconfdir=$RPM_BUILD_ROOT%{_sysconfdir} install
+
+
+%files
+%defattr(-,root,root)
+%doc BUGS COPYING CREDITS ChangeLog NEWS README README.configure doc/README.doc doc/*.pdf* doc/*.ps.gz doc/*.txt
+%{_includedir}/ppl.hh
+%{_bindir}/ppl-config
+%{_bindir}/ppl_lcdd
+%{_bindir}/ppl_lpsol
+%{_libdir}/libppl.so.*
+%{_libdir}/libppl.so
+%{_libdir}/libppl.a
+%{_libdir}/libppl.la
+%{_mandir}/man1/ppl-config.1.gz
+%{_mandir}/man1/ppl_lcdd.1.gz
+%{_mandir}/man1/ppl_lpsol.1.gz
+
+
+%files c
+%defattr(-,root,root)
+%{_includedir}/ppl_c.h
+%{_libdir}/libppl_c.a
+%{_libdir}/libppl_c.la
+%{_libdir}/libppl_c.so*
+
+%files gprolog
+%defattr(-,root,root)
+%{_bindir}/ppl_gprolog
+%{_libdir}/ppl/ppl_gprolog.pl
+%{_libdir}/ppl/libppl_gprolog.a
+%{_libdir}/ppl/libppl_gprolog.la
+%{_libdir}/ppl/libppl_gprolog.so
+
+%files sicstus
+%defattr(-,root,root)
+# Uncomment the following line if you want to create an RPM containing
+# a version of SICStus statically linked with the PPL.
+#%{_bindir}/ppl_sicstus
+%{_libdir}/ppl/ppl_sicstus.s.o
+%{_libdir}/ppl/ppl_sicstus.so
+%{_libdir}/ppl/ppl_sicstus.pl
+
+%files swi
+%defattr(-,root,root)
+%{_bindir}/ppl_pl
+%{_libdir}/ppl/libppl_swiprolog.a
+%{_libdir}/ppl/libppl_swiprolog.la
+%{_libdir}/ppl/libppl_swiprolog.so
+
+%files yap
+%defattr(-,root,root)
+%{_libdir}/ppl/ppl_yap.a
+%{_libdir}/ppl/ppl_yap.la
+%{_libdir}/ppl/ppl_yap.pl
+%{_libdir}/ppl/ppl_yap.so
+
+%files pwl
+%defattr(-,root,root)
+%doc Watchdog/README
+%{_includedir}/pwl.hh
+%{_libdir}/libpwl.so.*
+%{_libdir}/libpwl.so
+%{_libdir}/libpwl.a
+%{_libdir}/libpwl.la
+
+%post
+/sbin/ldconfig
+
+%postun
+/sbin/ldconfig
+
+%post c
+/sbin/ldconfig
+
+%postun c
+/sbin/ldconfig
+
+%clean
+rm -rf $RPM_BUILD_ROOT
diff --git a/src/BDS_Status.idefs.hh b/src/BDS_Status.idefs.hh
new file mode 100644
index 0000000..6a27232
--- /dev/null
+++ b/src/BDS_Status.idefs.hh
@@ -0,0 +1,116 @@
+/* BD_Shape<T>::Status class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BD_Status_defs_hh
+#define PPL_BD_Status_defs_hh 1
+
+#ifndef PPL_IN_BD_Shape_CLASS
+#error "Do not include BDS_Status.idefs.hh directly; use BD_Shape.defs.hh instead."
+#endif
+
+//! A conjunctive assertion about a BD_Shape<T> object.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the BDS is the zero-dimension
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the BDS is the empty set;
+  - <EM>shortest-path closed</EM>: the BDS is represented by a shortest-path
+    closed system of bounded differences, so that all the constraints are
+    as tight as possible;
+  - <EM>shortest-path reduced</EM>: the BDS is represented by a shortest-path
+    closed system of bounded differences and each constraint in such a system
+    is marked as being either redundant or non-redundant.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>shortest-path reduced</EM> implies <EM>shortest-path closed</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_shortest_path_closed() const;
+  void reset_shortest_path_closed();
+  void set_shortest_path_closed();
+
+  bool test_shortest_path_reduced() const;
+  void reset_shortest_path_reduced();
+  void set_shortest_path_reduced();
+  //@}
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+    and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions.
+  //@{
+  static const flags_t ZERO_DIM_UNIV         = 0U;
+  static const flags_t EMPTY                 = 1U << 0;
+  static const flags_t SHORTEST_PATH_CLOSED  = 1U << 1;
+  static const flags_t SHORTEST_PATH_REDUCED = 1U << 2;
+  //@}
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+#endif // !defined(PPL_BD_Status_defs_hh)
diff --git a/src/BDS_Status.inlines.hh b/src/BDS_Status.inlines.hh
new file mode 100644
index 0000000..930d783
--- /dev/null
+++ b/src/BDS_Status.inlines.hh
@@ -0,0 +1,266 @@
+/* BD_Shape<T>::Status class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BD_Status_inlines_hh
+#define PPL_BD_Status_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+BD_Shape<T>::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+template <typename T>
+inline
+BD_Shape<T>::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_any(flags_t mask) const {
+  return flags & mask;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_empty() {
+  flags = EMPTY;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_shortest_path_closed() const {
+  return test_any(SHORTEST_PATH_CLOSED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_closed() {
+  // A system is reduced only if it is also closed.
+  reset(SHORTEST_PATH_CLOSED | SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_shortest_path_closed() {
+  set(SHORTEST_PATH_CLOSED);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_shortest_path_reduced() const {
+  return test_any(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_reduced() {
+  reset(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_shortest_path_reduced() {
+  assert(test_shortest_path_closed());
+  set(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+bool
+BD_Shape<T>::Status::OK() const {
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
+
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The empty flag is incompatible with any other one."
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // Shortest-path reduction implies shortest-path closure.
+  if (test_shortest_path_reduced())
+    if (test_shortest_path_closed())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The shortest-path reduction flag should also imply "
+		<< "the closure flag."
+		<< std::endl;
+#endif
+      return false;
+    }
+
+  // Any other case is OK.
+  return true;
+}
+
+
+namespace Implementation {
+
+namespace BD_Shapes {
+
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string sp_closed = "SPC";
+const std::string sp_reduced = "SPR";
+const char yes = '+';
+const char no = '-';
+const char sep = ' ';
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
+
+} // namespace BD_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+void
+BD_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::BD_Shapes;
+  s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ << sep
+    << (test_empty() ? yes : no) << empty << sep
+    << sep
+    << (test_shortest_path_closed() ? yes : no) << sp_closed << sep
+    << (test_shortest_path_reduced() ? yes : no) << sp_reduced << sep;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(T, BD_Shape<T>::Status);
+
+template <typename T>
+bool
+BD_Shape<T>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::BD_Shapes;
+  bool positive;
+
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
+
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, sp_closed, positive))
+    return false;
+  if (positive)
+    set_shortest_path_closed();
+  else
+    reset_shortest_path_closed();
+
+  if (!get_field(s, sp_reduced, positive))
+    return false;
+  if (positive)
+    set_shortest_path_reduced();
+  else
+    reset_shortest_path_reduced();
+
+  // Check for well-formedness.
+  assert(OK());
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BD_Status_inlines_hh)
diff --git a/src/BD_Shape.cc b/src/BD_Shape.cc
new file mode 100644
index 0000000..3f63f58
--- /dev/null
+++ b/src/BD_Shape.cc
@@ -0,0 +1,96 @@
+/* BD_Shape class implementation: non-inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "BD_Shape.defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool
+PPL::extract_bounded_difference(const Constraint& c,
+				const dimension_type c_space_dim,
+				dimension_type& c_num_vars,
+				dimension_type& c_first_var,
+				dimension_type& c_second_var,
+				Coefficient& c_coeff) {
+  // Check for preconditions.
+  assert(c.space_dimension() == c_space_dim);
+  assert(c_num_vars == 0 && c_first_var == 0 && c_second_var == 0);
+  // Store the indices of the non-zero components of `c',
+  dimension_type non_zero_index[2] = { 0, 0 };
+  // Collect the non-zero components of `c'.
+  for (dimension_type i = c_space_dim; i-- > 0; )
+    if (c.coefficient(Variable(i)) != 0)
+      if (c_num_vars <= 1)
+	non_zero_index[c_num_vars++] = i + 1;
+      else
+	// Constraint `c' is not a bounded difference.
+	return false;
+
+  // Make sure that `c' is indeed a bounded difference,
+  // i.e., it has one of the following forms:
+  //           0 <=/= b, if c_num_vars == 0;
+  //   a*x       <=/= b, if c_num_vars == 1;
+  //   a*x - a*y <=/= b, if c_num_vars == 2.
+  switch (c_num_vars) {
+  case 2:
+    {
+      const Coefficient& c0 = c.coefficient(Variable(non_zero_index[0]-1));
+      const Coefficient& c1 = c.coefficient(Variable(non_zero_index[1]-1));
+      if (sgn(c0) == sgn(c1) || c0 != -c1)
+	// Constraint `c' is not a bounded difference.
+	return false;
+      c_coeff = c1;
+    }
+    c_first_var = non_zero_index[0];
+    c_second_var = non_zero_index[1];
+    break;
+  case 1:
+    c_coeff = -c.coefficient(Variable(non_zero_index[0]-1));
+    c_first_var = non_zero_index[0];
+    break;
+  default:
+    assert(c_num_vars == 0);
+    break;
+  }
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void
+PPL::compute_leader_indices(const std::vector<dimension_type>& predecessor,
+			    std::vector<dimension_type>& indices) {
+  // The vector `indices' contains one entry for each equivalence
+  // class, storing the index of the corresponding leader in
+  // increasing order: it is used to avoid repeated tests for leadership.
+  assert(indices.size() == 0);
+  assert(0 == predecessor[0]);
+  indices.push_back(0);
+  for (dimension_type i = 1, iend = predecessor.size(); i != iend; ++i)
+    if (i == predecessor[i])
+      indices.push_back(i);
+}
diff --git a/src/BD_Shape.defs.hh b/src/BD_Shape.defs.hh
new file mode 100644
index 0000000..f93735d
--- /dev/null
+++ b/src/BD_Shape.defs.hh
@@ -0,0 +1,1342 @@
+/* BD_Shape class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BD_Shape_defs_hh
+#define PPL_BD_Shape_defs_hh 1
+
+#include "BD_Shape.types.hh"
+#include "globals.defs.hh"
+#include "Constraint.types.hh"
+#include "Generator.types.hh"
+#include "Linear_Expression.types.hh"
+#include "Constraint_System.types.hh"
+#include "Generator_System.types.hh"
+#include "Poly_Con_Relation.types.hh"
+#include "Poly_Gen_Relation.types.hh"
+#include "Polyhedron.types.hh"
+#include "Variable.defs.hh"
+#include "DB_Matrix.defs.hh"
+#include "DB_Row.defs.hh"
+#include "Checked_Number.defs.hh"
+#include <cstddef>
+#include <iosfwd>
+#include <vector>
+#include <deque>
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::BD_Shape
+  Writes a textual representation of \p bds on \p s:
+  <CODE>false</CODE> is written if \p bds is an empty polyhedron;
+  <CODE>true</CODE> is written if \p bds is the universe polyhedron;
+  a system of constraints defining \p bds is written otherwise,
+  all constraints separated by ", ".
+*/
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const BD_Shape<T>& bds);
+
+} // namespace IO_Operators
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same BDS.
+/*!
+  \relates BD_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename T>
+bool operator==(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y aren't the same BDS.
+/*!
+ \relates BD_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const BD_Shape<T>& x,
+				 const BD_Shape<T>& y,
+				 const Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const BD_Shape<T>& x,
+				 const BD_Shape<T>& y,
+				 const Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const BD_Shape<T>& x,
+				 const BD_Shape<T>& y,
+				 const Rounding_Dir dir,
+				 Temp& tmp0,
+				 Temp& tmp1,
+				 Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			       const BD_Shape<T>& x,
+			       const BD_Shape<T>& y,
+			       const Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			       const BD_Shape<T>& x,
+			       const BD_Shape<T>& y,
+			       const Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			       const BD_Shape<T>& x,
+			       const BD_Shape<T>& y,
+			       const Rounding_Dir dir,
+			       Temp& tmp0,
+			       Temp& tmp1,
+			       Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				const BD_Shape<T>& x,
+				const BD_Shape<T>& y,
+				const Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				const BD_Shape<T>& x,
+				const BD_Shape<T>& y,
+				const Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				const BD_Shape<T>& x,
+				const BD_Shape<T>& y,
+				const Rounding_Dir dir,
+				Temp& tmp0,
+				Temp& tmp1,
+				Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Decodes the constraint \p c as a bounded difference.
+/*!
+  \return
+  <CODE>true</CODE> if the constraint \p c is a
+  \ref Bounded_Difference_Shapes "bounded difference";
+  <CODE>false</CODE> otherwise.
+
+  \param c
+  The constraint to be decoded.
+
+  \param c_space_dim
+  The space dimension of the constraint \p c (it is <EM>assumed</EM>
+  to match the actual space dimension of \p c).
+
+  \param c_num_vars
+  If <CODE>true</CODE> is returned, then it will be set to the number
+  of variables having a non-zero coefficient. The only legal values
+  will therefore be 0, 1 and 2.
+
+  \param c_first_var
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the index of the first variable having
+  a non-zero coefficient in \p c.
+
+  \param c_second_var
+  If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+  then it will be set to the index of the second variable having
+  a non-zero coefficient in \p c.
+
+  \param c_coeff
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the value of the first non-zero coefficient
+  in \p c.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool extract_bounded_difference(const Constraint& c,
+				const dimension_type c_space_dim,
+				dimension_type& c_num_vars,
+				dimension_type& c_first_var,
+				dimension_type& c_second_var,
+				Coefficient& c_coeff);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extracts leader indices from the predecessor relation.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void compute_leader_indices(const std::vector<dimension_type>& predecessor,
+			    std::vector<dimension_type>& indices);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A bounded difference shape.
+/*! \ingroup PPL_CXX_interface
+  The class template BD_Shape<T> allows for the efficient representation
+  of a restricted kind of <EM>topologically closed</EM> convex polyhedra
+  called <EM>bounded difference shapes</EM> (BDSs, for short).
+  The name comes from the fact that the closed affine half-spaces that
+  characterize the polyhedron can be expressed by constraints of the form
+  \f$\pm x_i \leq k\f$ or \f$x_i - x_j \leq k\f$, where the inhomogeneous
+  term \f$k\f$ is a rational number.
+
+  Based on the class template type parameter \p T, a family of extended
+  numbers is built and used to approximate the inhomogeneous term of
+  bounded differences. These extended numbers provide a representation
+  for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+  implementations for several arithmetic functions.
+  The value of the type parameter \p T may be one of the following:
+    - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+    - a bounded precision floating point type (e.g., \c float or \c double);
+    - an unbounded integer or rational type, as provided by GMP
+      (i.e., \c mpz_class or \c mpq_class).
+
+  The user interface for BDSs is meant to be as similar as possible to
+  the one developed for the polyhedron class C_Polyhedron.  At the
+  interface level, bounded differences are specified using objects of
+  type Constraint: such a constraint is a bounded difference if it is
+  of the form
+    \f[
+      a_i x_i - a_j x_j \relsym b
+    \f]
+  where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+  \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+  \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+  The user is warned that the above Constraint object will be mapped
+  into a <EM>correct</EM> approximation that, depending on the expressive
+  power of the chosen template argument \p T, may loose some precision.
+  In particular, constraint objects that do not encode a bounded difference
+  will be simply (and safely) ignored.
+
+  For instance, a Constraint object encoding \f$3x - 3y \leq 1\f$ will be
+  approximated by:
+    - \f$x - y \leq 1\f$,
+      if \p T is a (bounded or unbounded) integer type;
+    - \f$x - y \leq \frac{1}{3}\f$,
+      if \p T is the unbounded rational type \c mpq_class;
+    - \f$x - y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+      if \p T is a floating point type (having no exact representation
+      for \f$\frac{1}{3}\f$).
+
+  On the other hand, a Constraint object encoding \f$3x - y \leq 1\f$
+  will be safely ignored in all of the above cases.
+
+  In the following examples it is assumed that the type argument \p T
+  is one of the possible instances listed above and that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE> are defined
+  (where they are used) as follows:
+  \code
+    Variable x(0);
+    Variable y(1);
+    Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a BDS corresponding to a cube in \f$\Rset^3\f$,
+  given as a system of constraints:
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 1);
+    cs.insert(y >= 0);
+    cs.insert(y <= 1);
+    cs.insert(z >= 0);
+    cs.insert(z <= 1);
+    BD_Shape<T> bd(cs);
+  \endcode
+  Since only those constraints having the syntactic form of a
+  <EM>bounded difference</EM> are considered, the following code
+  will build the same BDS as above (i.e., the constraints 7, 8, and 9
+  are ignored):
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 1);
+    cs.insert(y >= 0);
+    cs.insert(y <= 1);
+    cs.insert(z >= 0);
+    cs.insert(z <= 1);
+    cs.insert(x + y <= 0);      // 7
+    cs.insert(x - z + x >= 0);  // 8
+    cs.insert(3*z - y <= 1);    // 9
+    BD_Shape<T> bd(cs);
+  \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::BD_Shape {
+private:
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of
+    the inequalities defining a BDS.
+  */
+  typedef Checked_Number<T, Extended_Number_Policy> N;
+
+public:
+  //! The numeric base type upon which bounded differences are built.
+  typedef T base_type;
+
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of the
+    inequalities defining a BDS.
+  */
+  typedef N coefficient_type;
+
+  //! Returns the maximum space dimension that a BDS can handle.
+  static dimension_type max_space_dimension();
+
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
+
+  //! Builds a universe or empty BDS of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the BDS;
+
+    \param kind
+    Specifies whether the universe or the empty BDS has to be built.
+  */
+  explicit BD_Shape(dimension_type num_dimensions = 0,
+		    Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy-constructor.
+  BD_Shape(const BD_Shape& y);
+
+  //! Builds a conservative, upward approximation of \p y.
+  template <typename U>
+  explicit BD_Shape(const BD_Shape<U>& y);
+
+  //! Builds a BDS from the system of constraints \p cs.
+  /*!
+    The BDS inherits the space dimension of \p cs.
+
+    \param cs
+    A system of constraints: constraints that are not
+    \ref Bounded_Difference_Shapes "bounded differences"
+    are ignored (even though they may have contributed
+    to the space dimension).
+
+    \exception std::invalid_argument
+    Thrown if the system of constraints \p cs contains strict inequalities.
+  */
+  BD_Shape(const Constraint_System& cs);
+
+  //! Builds a BDS from the system of generators \p gs.
+  /*!
+    Builds the smallest BDS containing the polyhedron defined by \p gs.
+    The BDS inherits the space dimension of \p gs.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  BD_Shape(const Generator_System& gs);
+
+  //! Builds a BDS from the polyhedron \p ph.
+  /*!
+    Builds a BDS containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the BDS built is the
+    smallest one containing \p ph.
+  */
+  BD_Shape(const Polyhedron& ph, Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  BD_Shape& operator=(const BD_Shape& y);
+
+  /*! \brief
+    Swaps \p *this with \p y
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  void swap(BD_Shape& y);
+
+  //! Destructor.
+  ~BD_Shape();
+
+  //@} Constructors, Assignment, Swap and Destructor
+
+  //! \name Member Functions that Do Not Modify the BD_Shape
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns a system of constraints defining \p *this.
+  Constraint_System constraints() const;
+
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const BD_Shape& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const BD_Shape& y) const;
+
+  //! Returns the relations holding between \p *this and the constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible
+    or if \p c is a strict inequality or if \p c is not a bounded
+    difference constraint.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns the relations holding between \p *this and the generator \p g.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty BDS.
+  bool is_empty() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe BDS.
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this satisfies
+    all its invariants.
+  */
+  bool OK() const;
+
+  //@} Member Functions that Do Not Modify the BD_Shape
+
+  //! \name Space-Dimension Preserving Member Functions that May Modify the BD_Shape
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of bounded differences
+    defining \p *this.
+
+    \param c
+    The constraint to be added. If it is not a bounded difference, it
+    will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or if \p c is a strict inequality.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of bounded differences
+    defining \p *this.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param c
+    The constraint to be added. If it is not a bounded difference, it
+    will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or if \p c is a strict inequality.
+  */
+  bool add_constraint_and_minimize(const Constraint& c);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of bounded differences
+    defining \p *this.
+
+    \param  cs
+    The constraints that will be added. Constraints that are not bounded
+    differences will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or if \p cs contains a strict inequality.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of bounded differences
+    defining \p *this.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param  cs
+    The constraints that will be added. Constraints that are not bounded
+    differences will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or if \p cs contains a strict inequality.
+  */
+  bool add_constraints_and_minimize(const Constraint_System& cs);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const BD_Shape& y);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool intersection_assign_and_minimize(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest BDS containing the convex union
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void bds_hull_assign(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest BDS containing the convex union
+    of \p *this and \p y.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool bds_hull_assign_and_minimize(const BD_Shape& y);
+
+  //! Same as bds_hull_assign.
+  void upper_bound_assign(const BD_Shape& y);
+
+  /*! \brief
+    If the bds-hull of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool bds_hull_assign_if_exact(const BD_Shape& y);
+
+  //! Same as bds_hull_assign_if_exact.
+  bool upper_bound_assign_if_exact(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this
+    the \ref Convex_Polyhedral_Difference "poly-difference"
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void bds_difference_assign(const BD_Shape& y);
+
+  //! Same as bds_difference_assign.
+  void difference_assign(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		    = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator
+		       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+				Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				= Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param relsym
+    The relation symbol.
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+				Relation_Symbol relsym,
+				const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(Variable var,
+				   Relation_Symbol relsym,
+				   const Linear_Expression& expr,
+				   Coefficient_traits::const_reference
+				   denominator = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator referencing the first stop-point.
+
+    \param last
+    An iterator referencing one past the last stop-point.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_extrapolation_assign(const BD_Shape& y,
+				 Iterator first, Iterator last,
+				 unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHMZ05_widening "BHMZ05-widening" of \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened BDS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+					   const Constraint_System& cs,
+					   unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of restoring in \p y the constraints
+    of \p *this that were lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+    \param y
+    A BDS that <EM>must</EM> contain \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \note
+    As was the case for widening operators, the argument \p y is meant to
+    denote the value computed in the previous iteration step, whereas
+    \p *this denotes the value computed in the current iteration step
+    (in the <EM>descreasing</EM> iteration sequence). Hence, the call
+    <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+    the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+  */
+  void CC76_narrowing_assign(const BD_Shape& y);
+
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened BDS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const BD_Shape& y,
+					 const Constraint_System& cs,
+					 unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref H79_widening "H79-widening" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void H79_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened BDS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  */
+  void limited_H79_extrapolation_assign(const BD_Shape& y,
+					const Constraint_System& cs,
+					unsigned* tp = 0);
+
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  //! Adds \p m new dimensions and embeds the old BDS into the new space.
+  /*!
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the new
+    BDS, which is defined by a system of bounded differences in which the
+    variables running through the new dimensions are unconstrained.
+    For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the BDS
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the BDS and does not embed it in
+    the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the
+    new BDS, which is defined by a system of bounded differences in
+    which the variables running through the new dimensions are all
+    constrained to be equal to 0.
+    For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the BDS
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Seeing a BDS as a set of tuples (its points),
+    assigns to \p *this all the tuples that can be obtained by concatenating,
+    in the order given, a tuple of \p *this with a tuple of \p y.
+
+    Let \f$B \sseq \Rset^n\f$ and \f$D \sseq \Rset^m\f$ be the BDSs
+    corresponding, on entry, to \p *this and \p y, respectively.
+    Upon successful completion, \p *this will represent the BDS
+    \f$R \sseq \Rset^{n+m}\f$ such that
+    \f[
+      R \defeq
+          \Bigl\{\,
+            (x_1, \ldots, x_n, y_1, \ldots, y_m)^\transpose
+          \Bigm|
+            (x_1, \ldots, x_n)^\transpose \in B,
+            (y_1, \ldots, y_m)^\transpose \in D
+          \,\Bigl\}.
+    \f]
+    Another way of seeing it is as follows: first increases the space
+    dimension of \p *this by adding \p y.space_dimension() new
+    dimensions; then adds to the system of constraints of \p *this a
+    renamed-apart version of the constraints of \p y.
+  */
+  void concatenate_assign(const BD_Shape& y);
+
+  //! Removes all the specified dimensions.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the dimensions to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
+
+    The template class PartialFunction must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty co-domain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the co-domain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename PartialFunction>
+  void map_space_dimensions(const PartialFunction& pfunc);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
+    <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  friend bool Parma_Polyhedra_Library::operator==<T>(const BD_Shape<T>& x,
+						     const BD_Shape<T>& y);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::BD_Shape;
+
+  //! The matrix representing the system of bounded differences.
+  DB_Matrix<N> dbm;
+
+#define PPL_IN_BD_Shape_CLASS
+#include "BDS_Status.idefs.hh"
+#undef PPL_IN_BD_Shape_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  //! A matrix of Booleans indicating which constraints are redundant.
+  std::vector<std::deque<bool> > redundancy_dbm;
+
+  //! Returns <CODE>true</CODE> if the BDS is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty()const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the system of bounded differences
+    is known to be shortest-path closed.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that <CODE>this->dbm</CODE> is not shortest-path closed.
+  */
+  bool marked_shortest_path_closed()const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the system of bounded differences
+    is known to be shortest-path reduced.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that <CODE>this->dbm</CODE> is not shortest-path reduced.
+  */
+  bool marked_shortest_path_reduced()const;
+
+  //! Turns \p *this into an empty BDS.
+  void set_empty();
+
+  //! Turns \p *this into an zero-dimensional universe BDS.
+  void set_zero_dim_univ();
+
+  //! Assigns to <CODE>this->dbm</CODE> its shortest-path closure.
+  void shortest_path_closure_assign() const;
+
+  /*! \brief
+    Assigns to <CODE>this->dbm</CODE> its shortest-path closure and
+    records into <CODE>this->redundancy_dbm</CODE> which of the entries
+    in <CODE>this->dbm</CODE> are redundant.
+  */
+  void shortest_path_reduction_assign() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if <CODE>this->dbm</CODE>
+    is shortest-path closed and <CODE>this->redundancy_dbm</CODE>
+    correctly flags the redundant entries in <CODE>this->dbm</CODE>.
+  */
+  bool is_shortest_path_reduced() const;
+
+  //! Adds the constraint <CODE>dbm[i][j] \<= k</CODE>.
+  void add_dbm_constraint(dimension_type i, dimension_type j, N k);
+  //! Adds the constraint <CODE>dbm[i][j] \<= num/den</CODE>.
+  void add_dbm_constraint(dimension_type i, dimension_type j,
+			  Coefficient_traits::const_reference num,
+			  Coefficient_traits::const_reference den);
+
+  //! Removes all the constraints on row/column \p v.
+  void forget_all_dbm_constraints(dimension_type v);
+  //! Removes all binary constraints on row/column \p v.
+  void forget_binary_dbm_constraints(dimension_type v);
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each dbm index \p u (less than or equal to \p last_v and different
+    from \p v), deduce constraints of the form <CODE>v - u \<= c</CODE>,
+    starting from \p pos_sum which is an upper bound for \p v.
+
+    The shortest-path closure is able to deduce the constraint
+    <CODE>v - u \<= ub_v - lb_u</CODE>. We can be more precise if variable
+    \p u played an active role in the computation of the upper bound for
+    \p v, i.e., if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_den</CODE> is greater than zero. In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
+  */
+  void deduce_v_minus_u_bounds(dimension_type v,
+			       dimension_type last_v,
+			       const Linear_Expression& sc_expr,
+			       Coefficient_traits::const_reference sc_den,
+			       const N& pos_sum);
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each dbm index \p u (less than or equal to \p last_v and different
+    from \p v), deduce constraints of the form <CODE>u - v \<= c</CODE>,
+    starting from \p neg_sum which is a lower bound for \p v.
+
+    The shortest-path closure is able to deduce the constraint
+    <CODE>u - v \<= ub_u - lb_v</CODE>. We can be more precise if variable
+    \p u played an active role in the computation of the lower bound for
+    \p v, i.e., if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_den</CODE> is greater than zero.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>u - v \<= lb_u - lb_v</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>u - v \<= (q*lb_u + (1-q)*ub_u) - lb_v</CODE>.
+  */
+  void deduce_u_minus_v_bounds(dimension_type v,
+			       dimension_type last_v,
+			       const Linear_Expression& sc_expr,
+			       Coefficient_traits::const_reference sc_den,
+			       const N& neg_sum);
+
+  /*! \brief
+    Adds to \p limiting_shape the bounded differences in \p cs
+    that are satisfied by \p *this.
+  */
+  void get_limiting_shape(const Constraint_System& cs,
+			  BD_Shape& limiting_shape) const;
+
+  //! Compute the (zero-equivalence classes) predecessor relation.
+  /*!
+    It is assumed that the BDS is not empty and shortest-path closed.
+  */
+  void compute_predecessors(std::vector<dimension_type>& predecessor) const;
+
+  //! Compute the leaders of zero-equivalence classes.
+  /*!
+    It is assumed that the BDS is not empty and shortest-path closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& leaders) const;
+
+#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<<>(std::ostream& s,
+						      const BD_Shape<T>& c);
+#else
+  // This is too lax than wanted.
+  template <typename U>
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+						    const BD_Shape<U>& c);
+#endif
+
+  //! \name Exception Throwers
+  //@{
+  void throw_dimension_incompatible(const char* method,
+				    const BD_Shape& x) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    dimension_type required_dim) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Constraint& c) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Generator& g) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const char* name_row,
+				    const Linear_Expression& y) const;
+
+  static void throw_constraint_incompatible(const char* method);
+
+  static void throw_expression_too_complex(const char* method,
+					   const Linear_Expression& e);
+
+  static void throw_generic(const char* method, const char* reason);
+  //@} // Exception Throwers
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+void swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
+	  Parma_Polyhedra_Library::BD_Shape<T>& y);
+
+} // namespace std
+
+#include "BDS_Status.inlines.hh"
+#include "BD_Shape.inlines.hh"
+#include "BD_Shape.templates.hh"
+
+#endif // !defined(PPL_BD_Shape_defs_hh)
diff --git a/src/BD_Shape.inlines.hh b/src/BD_Shape.inlines.hh
new file mode 100644
index 0000000..ee435d1
--- /dev/null
+++ b/src/BD_Shape.inlines.hh
@@ -0,0 +1,711 @@
+/* BD_Shape class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BD_Shape_inlines_hh
+#define PPL_BD_Shape_inlines_hh 1
+
+#include "C_Polyhedron.defs.hh"
+#include "Poly_Con_Relation.defs.hh"
+#include "Poly_Gen_Relation.defs.hh"
+#include <cassert>
+#include <vector>
+#include <iostream>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+namespace BD_Shapes {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extract the numerator and denominator components of \p from.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T, typename Policy>
+inline void
+numer_denom(const Checked_Number<T, Policy>& from,
+	    Coefficient& num, Coefficient& den) {
+  assert(!is_not_a_number(from)
+	 && !is_minus_infinity(from)
+	 && !is_plus_infinity(from));
+  mpq_class q;
+  assign_r(q, from, ROUND_NOT_NEEDED);
+  num = q.get_num();
+  den = q.get_den();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Divides \p x by \p y into \p to, rounding the result towards plus infinity.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T, typename Policy>
+inline void
+div_round_up(Checked_Number<T, Policy>& to,
+	     Coefficient_traits::const_reference x,
+	     Coefficient_traits::const_reference y) {
+  mpq_class qx;
+  mpq_class qy;
+  // Note: this code assumes that a Coefficient is always convertible
+  // to an mpq_class without loss of precision.
+  assign_r(qx, x, ROUND_NOT_NEEDED);
+  assign_r(qy, y, ROUND_NOT_NEEDED);
+  div_assign_r(qx, qx, qy, ROUND_NOT_NEEDED);
+  assign_r(to, qx, ROUND_UP);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the minimum between \p x and \p y.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename N>
+inline void
+min_assign(N& x, const N& y) {
+  if (x > y)
+    x = y;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the maximum between \p x and \p y.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename N>
+inline void
+max_assign(N& x, const N& y) {
+  if (x < y)
+    x = y;
+}
+
+} // namespace BD_Shapes
+} // namespace Implementation
+
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::max_space_dimension() {
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return std::min(DB_Matrix<N>::max_num_rows() - 1,
+		  DB_Matrix<N>::max_num_columns() - 1);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_empty() const {
+  return status.test_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_empty() {
+  status.set_empty();
+  assert(OK());
+  assert(marked_empty());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_closed() const {
+  return status.test_shortest_path_closed();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_reduced() const {
+  return status.test_shortest_path_reduced();
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const dimension_type num_dimensions,
+		      const Degenerate_Element kind)
+  : dbm(num_dimensions + 1), status(), redundancy_dbm() {
+  if (kind == EMPTY)
+    set_empty();
+  else {
+    if (num_dimensions > 0)
+      // A (non zero-dim) universe BDS is closed.
+      status.set_shortest_path_closed();
+  }
+  assert(OK());
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape& y)
+  : dbm(y.dbm), status(y.status), redundancy_dbm() {
+  if (y.marked_shortest_path_reduced())
+    redundancy_dbm = y.redundancy_dbm;
+}
+
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape<U>& y)
+  : dbm(y.dbm), status(), redundancy_dbm() {
+  // TODO: handle flags properly, possibly taking special cases into account.
+  if (y.marked_empty())
+    set_empty();
+  else if (y.status.test_zero_dim_univ())
+    set_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::add_constraint_and_minimize(const Constraint& c) {
+  add_constraint(c);
+  shortest_path_closure_assign();
+  return !marked_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_constraints(const Constraint_System& cs) {
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 iend = cs.end(); i != iend; ++i)
+    add_constraint(*i);
+  assert(OK());
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::add_constraints_and_minimize(const Constraint_System& cs) {
+  add_constraints(cs);
+  shortest_path_closure_assign();
+  return !marked_empty();
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Constraint_System& cs)
+  : dbm(cs.space_dimension() + 1), status(), redundancy_dbm() {
+  if (cs.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    status.set_shortest_path_closed();
+  add_constraints(cs);
+  assert(OK());
+}
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::affine_dimension() const {
+  const dimension_type space_dim = space_dimension();
+
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return 0;
+
+  // The vector `predecessor' is used to represent equivalence classes:
+  // `predecessor[i] == i' if and only if `i' is the leader of its
+  // equivalence class (i.e., the minimum index in the class);
+  std::vector<dimension_type> predecessor;
+  compute_predecessors(predecessor);
+
+  // Due to the fictitious variable `0', the affine dimension is one
+  // less the number of equivalence classes.
+  dimension_type affine_dim = 0;
+  // Note: disregard the first equivalence class.
+  for (dimension_type i = 1; i <= space_dim; ++i)
+    if (predecessor[i] == i)
+      ++affine_dim;
+
+  return affine_dim;
+}
+
+template <typename T>
+inline BD_Shape<T>&
+BD_Shape<T>::operator=(const BD_Shape& y) {
+  dbm = y.dbm;
+  status = y.status;
+  if (y.marked_shortest_path_reduced())
+    redundancy_dbm = y.redundancy_dbm;
+  return *this;
+}
+
+template <typename T>
+inline
+BD_Shape<T>::~BD_Shape() {
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::swap(BD_Shape& y) {
+  std::swap(dbm, y.dbm);
+  std::swap(status, y.status);
+  std::swap(redundancy_dbm, y.redundancy_dbm);
+}
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::space_dimension() const {
+  return dbm.num_rows() - 1;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_empty() const {
+  shortest_path_closure_assign();
+  return marked_empty();
+}
+
+template <typename T>
+inline bool
+operator==(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0)
+    if (x.marked_empty())
+      return y.marked_empty();
+    else
+      return !y.marked_empty();
+
+  // The exact equivalence test requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal
+  // if and only if the other BDS is empty too.
+  if (x.marked_empty())
+    return y.marked_empty();
+  if (y.marked_empty())
+    return false;
+  // Check for syntactic equivalence of the two (shortest-path closed)
+  // systems of bounded differences.
+  return x.dbm == y.dbm;
+}
+
+template <typename T>
+inline bool
+operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+  return !(x == y);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const BD_Shape<T>& x,
+			    const BD_Shape<T>& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      r = PLUS_INFINITY;
+    return true;
+  }
+
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      r = PLUS_INFINITY;
+   return true;
+  }
+
+  return rectilinear_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const BD_Shape<T>& x,
+			    const BD_Shape<T>& y,
+			    const Rounding_Dir dir) {
+  static Checked_Number<Temp, Extended_Number_Policy> tmp0;
+  static Checked_Number<Temp, Extended_Number_Policy> tmp1;
+  static Checked_Number<Temp, Extended_Number_Policy> tmp2;
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const BD_Shape<T>& x,
+			    const BD_Shape<T>& y,
+			    const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const BD_Shape<T>& x,
+			  const BD_Shape<T>& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      r = PLUS_INFINITY;
+    return true;
+  }
+
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      r = PLUS_INFINITY;
+   return true;
+  }
+
+  return euclidean_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const BD_Shape<T>& x,
+			  const BD_Shape<T>& y,
+			  const Rounding_Dir dir) {
+  static Checked_Number<Temp, Extended_Number_Policy> tmp0;
+  static Checked_Number<Temp, Extended_Number_Policy> tmp1;
+  static Checked_Number<Temp, Extended_Number_Policy> tmp2;
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const BD_Shape<T>& x,
+			  const BD_Shape<T>& y,
+			  const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const BD_Shape<T>& x,
+			   const BD_Shape<T>& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      r = PLUS_INFINITY;
+    return true;
+  }
+
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      r = PLUS_INFINITY;
+   return true;
+  }
+
+  return l_infinity_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const BD_Shape<T>& x,
+			   const BD_Shape<T>& y,
+			   const Rounding_Dir dir) {
+  static Checked_Number<Temp, Extended_Number_Policy> tmp0;
+  static Checked_Number<Temp, Extended_Number_Policy> tmp1;
+  static Checked_Number<Temp, Extended_Number_Policy> tmp2;
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const BD_Shape<T>& x,
+			   const BD_Shape<T>& y,
+			   const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+				const dimension_type j,
+				N k) {
+  // Private method: the caller has to ensure the following.
+  assert(i <= space_dimension() && j <= space_dimension() && i != j);
+  N& dbm_ij = dbm[i][j];
+  if (dbm_ij > k) {
+    dbm_ij = k;
+    if (marked_shortest_path_closed())
+      status.reset_shortest_path_closed();
+  }
+  assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+				const dimension_type j,
+				Coefficient_traits::const_reference num,
+				Coefficient_traits::const_reference den) {
+  // Private method: the caller has to ensure the following.
+  assert(i <= space_dimension() && j <= space_dimension() && i != j);
+  assert(den != 0);
+  N k;
+  Implementation::BD_Shapes::div_round_up(k, num, den);
+  add_dbm_constraint(i, j, k);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::strictly_contains(const BD_Shape& y) const {
+  const BD_Shape<T>& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bds_hull_assign_and_minimize(const BD_Shape& y) {
+  bds_hull_assign(y);
+  assert(marked_empty()
+	 || space_dimension() == 0 || marked_shortest_path_closed());
+  return !marked_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::upper_bound_assign(const BD_Shape& y) {
+  bds_hull_assign(y);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bds_hull_assign_if_exact(const BD_Shape&) {
+  // TODO: this must be properly implemented.
+  return false;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::upper_bound_assign_if_exact(const BD_Shape& y) {
+  return bds_hull_assign_if_exact(y);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::difference_assign(const BD_Shape& y) {
+  bds_difference_assign(y);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::remove_higher_space_dimensions(const dimension_type new_dim) {
+  // Dimension-compatibility check: the variable having
+  // maximum index is the one occurring last in the set.
+  if (new_dim > space_dimension())
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+				 new_dim);
+
+  // The removal of no dimensions from any BDS is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a zero-dim space BDS.
+  if (new_dim == space_dimension()) {
+    assert(OK());
+    return;
+  }
+
+  // Shortest-path closure is necessary as in remove_space_dimensions().
+  shortest_path_closure_assign();
+  dbm.resize_no_copy(new_dim + 1);
+
+  // Shortest-path closure is maintained.
+  // TODO: see whether or not reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    status.reset_shortest_path_reduced();
+
+  // If we removed _all_ dimensions from a non-empty BDS,
+  // the zero-dim universe BDS has been obtained.
+  if (new_dim == 0 && !marked_empty())
+    set_zero_dim_univ();
+  assert(OK());
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::intersection_assign_and_minimize(const BD_Shape& y) {
+  intersection_assign(y);
+  shortest_path_closure_assign();
+  return !marked_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp) {
+  static N stop_points[] = {
+    N(-2, ROUND_UP),
+    N(-1, ROUND_UP),
+    N( 0, ROUND_UP),
+    N( 1, ROUND_UP),
+    N( 2, ROUND_UP)
+  };
+  CC76_extrapolation_assign(y,
+			    stop_points,
+			    stop_points
+			    + sizeof(stop_points)/sizeof(stop_points[0]),
+			    tp);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::H79_widening_assign(const BD_Shape& y, unsigned* tp) {
+  // See the documentation for polyhedra.
+  C_Polyhedron px(constraints());
+  C_Polyhedron py(y.constraints());
+  px.H79_widening_assign(py, tp);
+  BD_Shape x(px);
+  swap(x);
+  assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::limited_H79_extrapolation_assign(const BD_Shape& y,
+					      const Constraint_System& cs,
+					      unsigned* tp) {
+  // See the documentation for polyhedra.
+  C_Polyhedron px(constraints());
+  C_Polyhedron py(y.constraints());
+  px.limited_H79_extrapolation_assign(py, cs, tp);
+  BD_Shape x(px);
+  swap(x);
+  assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::time_elapse_assign(const BD_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("time_elapse_assign(y)", y);
+  // See the documentation for polyhedra.
+  C_Polyhedron px(constraints());
+  C_Polyhedron py(y.constraints());
+  px.time_elapse_assign(py);
+  BD_Shape x(px);
+  swap(x);
+  assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::forget_all_dbm_constraints(const dimension_type v) {
+  assert(0 < v && v <= dbm.num_rows());
+  DB_Row<N>& dbm_v = dbm[v];
+  for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+    dbm_v[i] = PLUS_INFINITY;
+    dbm[i][v] = PLUS_INFINITY;
+  }
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::forget_binary_dbm_constraints(const dimension_type v) {
+  assert(0 < v && v <= dbm.num_rows());
+  DB_Row<N>& dbm_v = dbm[v];
+  for (dimension_type i = dbm.num_rows()-1; i > 0; --i) {
+    dbm_v[i] = PLUS_INFINITY;
+    dbm[i][v] = PLUS_INFINITY;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
+     Parma_Polyhedra_Library::BD_Shape<T>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_BD_Shape_inlines_hh)
diff --git a/src/BD_Shape.templates.hh b/src/BD_Shape.templates.hh
new file mode 100644
index 0000000..fb9e8ac
--- /dev/null
+++ b/src/BD_Shape.templates.hh
@@ -0,0 +1,3774 @@
+/* BD_Shape class implementation: non-inline template functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BD_Shape_templates_hh
+#define PPL_BD_Shape_templates_hh 1
+
+#include "Poly_Con_Relation.defs.hh"
+#include "Poly_Gen_Relation.defs.hh"
+#include "LP_Problem.defs.hh"
+#include <cassert>
+#include <vector>
+#include <deque>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Generator_System& gs)
+  : dbm(gs.space_dimension() + 1), status(), redundancy_dbm() {
+  using Implementation::BD_Shapes::max_assign;
+  using Implementation::BD_Shapes::div_round_up;
+
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty polyhedron.
+    set_empty();
+    assert(OK());
+    return;
+  }
+
+  const dimension_type space_dim = space_dimension();
+  DB_Row<N>& dbm_0 = dbm[0];
+  N tmp;
+
+  bool dbm_initialized = false;
+  bool point_seen = false;
+  // Going through all the points and closure points.
+  for (Generator_System::const_iterator i = gs_begin; i != gs_end; ++i) {
+    const Generator& g = *i;
+    switch (g.type()) {
+    case Generator::POINT:
+      point_seen = true;
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      if (!dbm_initialized) {
+	// When handling the first (closure) point, we initialize the DBM.
+	dbm_initialized = true;
+	const Coefficient& d = g.divisor();
+	for (dimension_type i = space_dim; i > 0; --i) {
+	  const Coefficient& g_i = g.coefficient(Variable(i-1));
+	  DB_Row<N>& dbm_i = dbm[i];
+	  for (dimension_type j = space_dim; j > 0; --j)
+	    if (i != j)
+	      div_round_up(dbm_i[j], g.coefficient(Variable(j-1)) - g_i, d);
+	  div_round_up(dbm_i[0], -g_i, d);
+	}
+	for (dimension_type j = space_dim; j > 0; --j)
+	  div_round_up(dbm_0[j], g.coefficient(Variable(j-1)), d);
+	// Note: no need to initialize the first element of the main diagonal.
+      }
+      else {
+	// This is not the first point: the DBM already contains
+	// valid values and we must compute maxima.
+	const Coefficient& d = g.divisor();
+	for (dimension_type i = space_dim; i > 0; --i) {
+	  const Coefficient& g_i = g.coefficient(Variable(i-1));
+	  DB_Row<N>& dbm_i = dbm[i];
+	  // The loop correctly handles the case when i == j.
+	  for (dimension_type j = space_dim; j > 0; --j) {
+	    div_round_up(tmp, g.coefficient(Variable(j-1)) - g_i, d);
+	    max_assign(dbm_i[j], tmp);
+	  }
+	  div_round_up(tmp, -g_i, d);
+	  max_assign(dbm_i[0], tmp);
+	}
+	for (dimension_type j = space_dim; j > 0; --j) {
+	  div_round_up(tmp, g.coefficient(Variable(j-1)), d);
+	  max_assign(dbm_0[j], tmp);
+	}
+      }
+      break;
+    default:
+      // Lines and rays temporarily ignored.
+      break;
+    }
+  }
+
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw std::invalid_argument("PPL::BD_Shape<T>::BD_Shape(gs):\n"
+				"the non-empty generator system gs "
+				"contains no points.");
+
+  // Going through all the lines and rays.
+  for (Generator_System::const_iterator i = gs_begin; i != gs_end; ++i) {
+    const Generator& g = *i;
+    switch (g.type()) {
+    case Generator::LINE:
+      for (dimension_type i = space_dim; i > 0; --i) {
+	const Coefficient& g_i = g.coefficient(Variable(i-1));
+	DB_Row<N>& dbm_i = dbm[i];
+	// The loop correctly handles the case when i == j.
+	for (dimension_type j = space_dim; j > 0; --j)
+	  if (g_i != g.coefficient(Variable(j-1)))
+	    dbm_i[j] = PLUS_INFINITY;
+	if (g_i != 0)
+	  dbm_i[0] = PLUS_INFINITY;
+      }
+      for (dimension_type j = space_dim; j > 0; --j)
+	if (g.coefficient(Variable(j-1)) != 0)
+	  dbm_0[j] = PLUS_INFINITY;
+      break;
+    case Generator::RAY:
+      for (dimension_type i = space_dim; i > 0; --i) {
+	const Coefficient& g_i = g.coefficient(Variable(i-1));
+	DB_Row<N>& dbm_i = dbm[i];
+	// The loop correctly handles the case when i == j.
+	for (dimension_type j = space_dim; j > 0; --j)
+	  if (g_i < g.coefficient(Variable(j-1)))
+	    dbm_i[j] = PLUS_INFINITY;
+	if (g_i < 0)
+	  dbm_i[0] = PLUS_INFINITY;
+      }
+      for (dimension_type j = space_dim; j > 0; --j)
+	if (g.coefficient(Variable(j-1)) > 0)
+	  dbm_0[j] = PLUS_INFINITY;
+      break;
+    default:
+      // Points and closure points already dealt with.
+      break;
+    }
+  }
+  status.set_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
+  : dbm(), status(), redundancy_dbm() {
+  using Implementation::BD_Shapes::div_round_up;
+  const dimension_type num_dimensions = ph.space_dimension();
+
+  if (ph.marked_empty()) {
+    *this = BD_Shape(num_dimensions, EMPTY);
+    return;
+  }
+
+  if (num_dimensions == 0) {
+    *this = BD_Shape(num_dimensions, UNIVERSE);
+    return;
+  }
+
+  // Build from generators when we do not care about complexity
+  // or when the process has polynomial complexity.
+  if (complexity == ANY_COMPLEXITY
+      || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+    *this = BD_Shape(ph.generators());
+    return;
+  }
+
+  // We cannot afford exponential complexity, we do not have a complete set
+  // of generators for the polyhedron, and the polyhedron is not trivially
+  // empty or zero-dimensional.  Constraints, however, are up to date.
+  assert(ph.constraints_are_up_to_date());
+
+  if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+    // If the constraint system of the polyhedron is minimized,
+    // the test `is_universe()' has polynomial complexity.
+    if (ph.is_universe()) {
+      *this = BD_Shape(num_dimensions, UNIVERSE);
+      return;
+    }
+  }
+
+  // See if there is at least one inconsistent constraint in `ph.con_sys'.
+  for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+	 cs_end = ph.con_sys.end(); i != cs_end; ++i)
+    if (i->is_inconsistent()) {
+      *this = BD_Shape(num_dimensions, EMPTY);
+      return;
+    }
+
+  // If `complexity' allows it, use simplex to derive the exact (modulo
+  // the fact that our BDSs are topologically closed) variable bounds.
+  if (complexity == SIMPLEX_COMPLEXITY) {
+    LP_Problem lp;
+    lp.set_optimization_mode(MAXIMIZATION);
+
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+	     iend = ph_cs.end(); i != iend; ++i) {
+	const Constraint& c = *i;
+	lp.add_constraint(c.is_equality()
+			  ? (Linear_Expression(c) == 0)
+			  : (Linear_Expression(c) >= 0));
+      }
+
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      *this = BD_Shape(num_dimensions, EMPTY);
+      return;
+    }
+
+    // Get all the upper bounds.
+    LP_Problem_Status lp_status;
+    Generator g(point());
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
+    for (dimension_type i = 1; i <= num_dimensions; ++i) {
+      Variable x(i-1);
+      // Evaluate optimal upper bound for `x <= ub'.
+      lp.set_objective_function(x);
+      lp_status = lp.solve();
+      if (lp_status == UNBOUNDED_LP_PROBLEM)
+	dbm[0][i] = PLUS_INFINITY;
+      else {
+	assert(lp_status == OPTIMIZED_LP_PROBLEM);
+	g = lp.optimizing_point();
+	lp.evaluate_objective_function(g, num, den);
+	div_round_up(dbm[0][i], num, den);
+      }
+      // Evaluate optimal upper bound for `x - y <= ub'.
+      for (dimension_type j = 1; j <= num_dimensions; ++j) {
+	if (i == j)
+	  continue;
+	Variable y(j-1);
+	lp.set_objective_function(x - y);
+	lp_status = lp.solve();
+	if (lp_status == UNBOUNDED_LP_PROBLEM)
+	  dbm[j][i] = PLUS_INFINITY;
+	else {
+	  assert(lp_status == OPTIMIZED_LP_PROBLEM);
+	  g = lp.optimizing_point();
+	  lp.evaluate_objective_function(g, num, den);
+	  div_round_up(dbm[j][i], num, den);
+	}
+      }
+      // Evaluate optimal upper bound for `-x <= ub'.
+      lp.set_objective_function(-x);
+      lp_status = lp.solve();
+      if (lp_status == UNBOUNDED_LP_PROBLEM)
+	dbm[i][0] = PLUS_INFINITY;
+      else {
+	assert(lp_status == OPTIMIZED_LP_PROBLEM);
+	g = lp.optimizing_point();
+	lp.evaluate_objective_function(g, num, den);
+	div_round_up(dbm[i][0], num, den);
+      }
+    }
+    status.set_shortest_path_closed();
+    return;
+  }
+
+  // Extract easy-to-find bounds from constraints.
+  *this = BD_Shape(ph.con_sys);
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_constraint(const Constraint& c) {
+  using Implementation::BD_Shapes::div_round_up;
+
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", c);
+  // Strict inequalities are not allowed.
+  if (c.is_strict_inequality())
+    throw_constraint_incompatible("add_constraint(c)");
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  // Constraints that are not bounded differences are ignored.
+  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
+    return;
+
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if (c.inhomogeneous_term() < 0)
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+  N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+  if (coeff < 0)
+    coeff = -coeff;
+
+  bool changed = false;
+  // Compute the bound for `x', rounding towards plus infinity.
+  N d;
+  div_round_up(d, c.inhomogeneous_term(), coeff);
+  if (x > d) {
+    x = d;
+    changed = true;
+  }
+
+  if (c.is_equality()) {
+    // Also compute the bound for `y', rounding towards plus infinity.
+    div_round_up(d, -c.inhomogeneous_term(), coeff);
+    if (y > d) {
+      y = d;
+      changed = true;
+    }
+  }
+
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the system of bounded differences.
+  if (changed && marked_shortest_path_closed())
+    status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::concatenate_assign(const BD_Shape& y) {
+  BD_Shape& x = *this;
+
+  const dimension_type x_space_dim = x.space_dimension();
+  const dimension_type y_space_dim = y.space_dimension();
+
+  // If `y' is an empty 0-dim space system of bounded differences,
+  // let `*this' become empty.
+  if (y_space_dim == 0 && y.marked_empty()) {
+    set_empty();
+    assert(OK());
+    return;
+  }
+
+  // If `x' is an empty 0-dim space BDS, then it is sufficient to adjust
+  // the dimension of the vector space.
+  if (x_space_dim == 0 && marked_empty()) {
+    dbm.grow(y_space_dim + 1);
+    assert(OK());
+    return;
+  }
+  // First we increase the space dimension of `x' by adding
+  // `y.space_dimension()' new dimensions.
+  // The matrix for the new system of constraints is obtained
+  // by leaving the old system of constraints in the upper left-hand side
+  // and placing the constraints of `y' in the lower right-hand side,
+  // except the constraints as `y(i) >= cost' or `y(i) <= cost', that are
+  // placed in the right position on the new matrix.
+  add_space_dimensions_and_embed(y_space_dim);
+  const dimension_type new_space_dim = x_space_dim + y_space_dim;
+  for (dimension_type i = x_space_dim + 1; i <= new_space_dim; ++i) {
+    DB_Row<N>& dbm_i = dbm[i];
+    dbm_i[0] = y.dbm[i - x_space_dim][0];
+    dbm[0][i] = y.dbm[0][i - x_space_dim];
+    for (dimension_type j = x_space_dim + 1; j <= new_space_dim; ++j)
+      dbm_i[j] = y.dbm[i - x_space_dim][j - x_space_dim];
+  }
+
+  if (marked_shortest_path_closed())
+    status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::contains(const BD_Shape& y) const {
+  const BD_Shape<T>& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    throw_dimension_incompatible("contains(y)", y);
+
+  // The zero-dimensional universe shape contains any other
+  // dimension-compatible shape.
+  // The zero-dimensional empty shape only contains another
+  // zero-dimensional empty shape.
+  if (x_space_dim == 0) {
+    if (!marked_empty())
+      return true;
+    else
+      return y.marked_empty();
+  }
+
+  /*
+    The `y' system of bounded differences need be closed.
+    In fact if, for example, in `*this' we have the constraints:
+
+    x1 - x2 <= 1;
+    x1      <= 3;
+    x2      <= 2;
+
+    in `y' the constraints are:
+
+    x1 - x2 <= 0;
+    x2      <= 1;
+
+    without closure it returns "false", instead if we close `y' we have
+    the implicit constraint
+
+    x1      <= 1;
+
+    and so we obtain the right result "true".
+  */
+  y.shortest_path_closure_assign();
+
+  // An empty shape is contained in any other dimension-compatible shapes.
+  if (y.marked_empty())
+    return true;
+
+  // `*this' contains `y' if and only if every cell of `dbm'
+  // is greater than or equal to the correspondent one of `y.dbm'.
+  for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& x_dbm_i = x.dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = x_space_dim + 1; j-- > 0; )
+      if (x_dbm_i[j] < y_dbm_i[j])
+	return false;
+  }
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_universe() const {
+  if (marked_empty())
+    return false;
+
+  const dimension_type space_dim = space_dimension();
+  // If the BDS is non-empty and zero-dimensional,
+  // then it is necessarily the universe BDS.
+  if (space_dim == 0)
+    return true;
+
+  // A system of bounded differences defining the universe BDS can only
+  // contain trivial constraints.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; )
+      if (!is_plus_infinity(dbm_i[j]))
+	return false;
+  }
+  return true;
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::compute_predecessors(std::vector<dimension_type>& predecessor) const {
+  assert(!marked_empty() && marked_shortest_path_closed());
+  assert(predecessor.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `predecessor' is used to indicate which variable
+  // immediately precedes a given one in the corresponding equivalence class.
+  // The `leader' of an equivalence class is the element having minimum
+  // index: leaders are their own predecessors.
+  const dimension_type pred_size = dbm.num_rows();
+  // Initially, each variable is leader of its own zero-equivalence class.
+  predecessor.reserve(pred_size);
+  for (dimension_type i = 0; i < pred_size; ++i)
+    predecessor.push_back(i);
+  // Now compute actual predecessors.
+  for (dimension_type i = pred_size; i-- > 1; )
+    if (i == predecessor[i]) {
+      const DB_Row<N>& dbm_i = dbm[i];
+      for (dimension_type j = i; j-- > 0; )
+	if (j == predecessor[j]) {
+	  N negated_dbm_ji;
+	  if (neg_assign_r(negated_dbm_ji, dbm[j][i], ROUND_NOT_NEEDED) == V_EQ
+	      && negated_dbm_ji == dbm_i[j]) {
+	    // Choose as predecessor the variable having the smaller index.
+	    predecessor[i] = j;
+	    break;
+	  }
+	}
+    }
+}
+
+template <typename T>
+void
+BD_Shape<T>::compute_leaders(std::vector<dimension_type>& leaders) const {
+  assert(!marked_empty() && marked_shortest_path_closed());
+  assert(leaders.size() == 0);
+  // Compute predecessor information.
+  compute_predecessors(leaders);
+  // Flatten the predecessor chains so as to obtain leaders.
+  assert(leaders[0] == 0);
+  for (dimension_type i = 1, iend = leaders.size(); i != iend; ++i) {
+    const dimension_type l_i = leaders[i];
+    assert(l_i <= i);
+    if (l_i != i) {
+      const dimension_type ll_i = leaders[l_i];
+      assert(ll_i == leaders[ll_i]);
+      leaders[i] = ll_i;
+    }
+  }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_shortest_path_reduced() const {
+  // If the BDS is empty, it is also reduced.
+  if (marked_empty())
+    return true;
+
+  // A shortest-path reduced dbm is just a dbm with an indication of
+  // those constraints that are redundant. If there is no indication
+  // of the redundant constraints, then it cannot be reduced.
+  if (!marked_shortest_path_reduced())
+    return false;
+
+  const BD_Shape x_copy = *this;
+  const dimension_type x_space_dim = x_copy.space_dimension();
+  x_copy.shortest_path_closure_assign();
+  // If we just discovered emptyness, it cannot be reduced.
+  if (x_copy.marked_empty())
+    return false;
+
+  // The vector `leader' is used to indicate which variables are equivalent.
+  std::vector<dimension_type> leader(x_space_dim + 1);
+
+  // We store the leader.
+  for (dimension_type i = x_space_dim + 1; i-- > 0; )
+    leader[i] = i;
+
+  // Step 1: we store really the leader with the corrected value.
+  // We search for the equivalent or zero-equivalent variables.
+  // The variable(i-1) and variable(j-1) are equivalent if and only if
+  // m_i_j == -(m_j_i).
+  for (dimension_type i = 0; i < x_space_dim; ++i) {
+    const DB_Row<N>& xdbm_i = x_copy.dbm[i];
+    for (dimension_type j = i + 1; j <= x_space_dim; ++j) {
+      N negated_xdbm_ji;
+      if (neg_assign_r(negated_xdbm_ji, x_copy.dbm[j][i],
+		       ROUND_NOT_NEEDED) == V_EQ
+	  && negated_xdbm_ji == xdbm_i[j])
+	// Two equivalent variables have got the same leader
+	// (the smaller variable).
+	leader[j] = leader[i];
+    }
+  }
+
+  // Step 2: we check if there are redundant constraints in the zero_cycle
+  // free systems of bounded differences, considering only the leaders.
+  // A constraint `c' is redundant, when there are two constraints such that
+  // their sum is the same constraint with the inhomogeneous term
+  // less than or equal to the `c' one.
+  N c;
+  for (dimension_type k = 0; k <= x_space_dim; ++k)
+    if (leader[k] == k) {
+      const DB_Row<N>& x_k = x_copy.dbm[k];
+      for (dimension_type i = 0; i <= x_space_dim; ++i)
+	if (leader[i] == i) {
+	  const DB_Row<N>& x_i = x_copy.dbm[i];
+	  const std::deque<bool>& redundancy_i = redundancy_dbm[i];
+	  const N& x_i_k = x_i[k];
+	  for (dimension_type j = 0; j <= x_space_dim; ++j)
+	    if (leader[j] == j) {
+	      const N& x_i_j = x_i[j];
+	      if (!is_plus_infinity(x_i_j)) {
+		add_assign_r(c, x_i_k, x_k[j], ROUND_UP);
+		if (x_i_j >= c && !redundancy_i[j])
+		  return false;
+	      }
+	    }
+	}
+    }
+
+  // The vector `var_conn' is used to check if there is a single cycle
+  // that connected all zero-equivalent variables between them.
+  // The value `space_dim + 1' is used to indicate that the equivalence
+  // class contains a single variable.
+  std::vector<dimension_type> var_conn(x_space_dim + 1);
+  for (dimension_type i = x_space_dim + 1; i-- > 0; )
+    var_conn[i] = x_space_dim + 1;
+
+  // Step 3: we store really the `var_conn' with the right value, putting
+  // the variable with the selected variable is connected:
+  // we check the row of each variable:
+  // a- each leader could be connected with only zero-equivalent one,
+  // b- each no-leader with only another zero-equivalent one.
+  for (dimension_type i = 0; i <= x_space_dim; ++i) {
+    // It count with how many variables the selected variable is
+    // connected.
+    dimension_type t = 0;
+    dimension_type ld_i = leader[i];
+    // Case a: leader.
+    if (ld_i == i) {
+      for (dimension_type j = 0; j <= x_space_dim; ++j) {
+	dimension_type ld_j = leader[j];
+	// Only the connectedness with equivalent variables
+	// is considered.
+	if (j != ld_j)
+	  if (!redundancy_dbm[i][j]) {
+	    if (t == 1)
+	      // Two no-leaders couldn't connected with the same leader.
+	      return false;
+	    else
+	      if (ld_j != i)
+		// The variables isn't in the same equivalence class.
+		return false;
+	      else {
+		++t;
+		var_conn[i] = j;
+	      }
+	  }
+      }
+    }
+    // Case b: no-leader.
+    else {
+      for (dimension_type j = 0; j <= x_space_dim; ++j) {
+	if (!redundancy_dbm[i][j]) {
+	  dimension_type ld_j = leader[j];
+	  if (ld_i != ld_j)
+	    // The variables isn't in the same equivalence class.
+	    return false;
+	  else {
+	    if (t == 1)
+	      // Two variables couldn't connected with the same leader.
+	      return false;
+	    else {
+	      ++t;
+	      var_conn[i] = j;
+	    }
+	  }
+	  // A no-leader must be connected with
+	  // another variable.
+	  if (t == 0)
+	    return false;
+	}
+      }
+    }
+  }
+
+  // The vector `just_checked' is used to check if
+  // a variable is already checked.
+  std::vector<bool> just_checked(x_space_dim + 1);
+  for (dimension_type i = x_space_dim + 1; i-- > 0; )
+    just_checked[i] = false;
+
+  // Step 4: we check if there are single cycles that
+  // connected all the zero-equivalent variables between them.
+  for (dimension_type i = 0; i <= x_space_dim; ++i) {
+    bool jc_i = just_checked[i];
+    // We do not re-check the already considered single cycles.
+    if (!jc_i) {
+      dimension_type v_con = var_conn[i];
+      // We consider only the equivalence classes with
+      // 2 or plus variables.
+      if (v_con != x_space_dim + 1) {
+	// There is a single cycle if taken a variable,
+	// we return to this same variable.
+	while (v_con != i) {
+	  just_checked[v_con] = true;
+	  v_con = var_conn[v_con];
+	  // If we re-pass to an already considered variable,
+	  // then we haven't a single cycle.
+	  if (just_checked[v_con])
+	    return false;
+	}
+      }
+    }
+    just_checked[i] = true;
+  }
+
+  // The system bounded differences is just reduced.
+  return true;
+}
+
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Constraint& c) const {
+  using Implementation::BD_Shapes::div_round_up;
+
+  const dimension_type c_space_dim = c.space_dimension();
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
+
+  shortest_path_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+	|| (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_disjoint();
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  // Constraints that are not bounded differences are not compatible.
+  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
+    throw_constraint_incompatible("relation_with(c)");
+
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    switch (sgn(c.inhomogeneous_term())) {
+    case -1:
+      return Poly_Con_Relation::is_disjoint();
+    case 0:
+      if (c.is_strict_inequality())
+	return Poly_Con_Relation::saturates()
+	  && Poly_Con_Relation::is_disjoint();
+      else
+	return Poly_Con_Relation::saturates()
+	  && Poly_Con_Relation::is_included();
+    case 1:
+      return Poly_Con_Relation::is_included();
+    }
+  }
+
+  // Select the cell to be checked for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+  const N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+  if (coeff < 0)
+    coeff = -coeff;
+  N d;
+  div_round_up(d, c.inhomogeneous_term(), coeff);
+  N d1;
+  div_round_up(d1, -c.inhomogeneous_term(), coeff);
+
+  switch (c.type()) {
+  case Constraint::EQUALITY:
+    if (d == x && d1 == y)
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+    else if (d < y && d1 > x)
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::strictly_intersects();
+  case Constraint::NONSTRICT_INEQUALITY:
+    if (d >= x && d1 >= y)
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+    else if (d >= x)
+      return Poly_Con_Relation::is_included();
+    else if (d < x && d1 > y)
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::strictly_intersects();
+  case Constraint::STRICT_INEQUALITY:
+    if (d >= x && d1 >= y)
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_disjoint();
+    else if (d > x)
+      return Poly_Con_Relation::is_included();
+    else if (d <= x && d1 >= y)
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::strictly_intersects();
+  }
+  // Quiet a compiler warning: this program point is unreachable.
+  throw std::runtime_error("PPL internal error");
+}
+
+template <typename T>
+Poly_Gen_Relation
+BD_Shape<T>::relation_with(const Generator& g) const {
+  const dimension_type space_dim = space_dimension();
+  const dimension_type g_space_dim = g.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
+
+  // The empty bdiff cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe BD shape in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  const bool is_line = g.is_line();
+
+  // The relation between the bdiff and the given generator is obtained
+  // checking if the generator satisfies all the constraints in the bdiff.
+  // To check if the generator satisfies all the constraints it's enough
+  // studying the sign of the scalar product between the generator and
+  // all the constraints in the bdiff.
+
+  // We find in `*this' all the constraints.
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    for (dimension_type j = i + 1; j <= space_dim; ++j) {
+      const Variable x(j - 1);
+      const bool x_dimension_incompatible = x.space_dimension() > g_space_dim;
+      const N& dbm_ij = dbm[i][j];
+      const N& dbm_ji = dbm[j][i];
+      N negated_dbm_ji;
+      const bool is_equality
+	= neg_assign_r(negated_dbm_ji, dbm_ji, ROUND_NOT_NEEDED) == V_EQ
+	&& negated_dbm_ji == dbm_ij;
+      const bool dbm_ij_is_infinity = is_plus_infinity(dbm_ij);
+      const bool dbm_ji_is_infinity = is_plus_infinity(dbm_ji);
+      if (i != 0) {
+	const Variable y(i - 1);
+	const bool y_dimension_incompatible
+	  = y.space_dimension() > g_space_dim;
+	const bool is_trivial_zero
+	  = (x_dimension_incompatible && g.coefficient(y) == 0)
+	  || (y_dimension_incompatible && g.coefficient(x) == 0)
+	  || (x_dimension_incompatible && y_dimension_incompatible);
+	if (is_equality) {
+	  // We have one equality constraint.
+	  // The constraint has form ax - ay = b.
+	  // The scalar product has the form
+	  // 'a * y_i - a * x_j'
+	  // where y_i = g.coefficient(y) and x_j = g.coefficient(x).
+	  // It is not zero when both the coefficients of the
+	  // variables x and y are not zero or when these coefficients
+ 	  if (!is_trivial_zero && g.coefficient(x) != g.coefficient(y))
+	    return Poly_Gen_Relation::nothing();
+	}
+	else
+	  // We have the binary inequality constraints.
+	  if (!dbm_ij_is_infinity) {
+	  // The constraint has form ax - ay <= b.
+	  // The scalar product has the form
+	  // 'a * y_i - a * x_j'
+	    if (is_line
+		&& !is_trivial_zero
+		&& g.coefficient(x) != g.coefficient(y))
+	      return Poly_Gen_Relation::nothing();
+	    else
+	      if (g.coefficient(y) < g.coefficient(x))
+		return Poly_Gen_Relation::nothing();
+	  }
+	  else if (!dbm_ji_is_infinity) {
+	    // The constraint has form ay - ax <= b.
+	    // The scalar product has the form
+	    // 'a * x_j - a* y_i'.
+	    if (is_line
+		&& !is_trivial_zero
+		&& g.coefficient(x) != g.coefficient(y))
+	      return Poly_Gen_Relation::nothing();
+	    else if (g.coefficient(x) < g.coefficient(y))
+	      return Poly_Gen_Relation::nothing();
+	  }
+      }
+      else {
+	// Here i == 0.
+	if (is_equality) {
+	  // The constraint has form ax = b.
+	  // To satisfy the constraint it's necessary that the scalar product
+	  // is not zero.It happens when the coefficient of the variable 'x'
+	  // in the generator is not zero, because the scalar
+	  // product has the form:
+	  // 'a * x_i' where x_i = g.coefficient(x)..
+	  if (!x_dimension_incompatible && g.coefficient(x) != 0)
+	    return Poly_Gen_Relation::nothing();
+	}
+	else
+	  // We have the unary inequality constraints.
+	  if (!dbm_ij_is_infinity) {
+	    // The constraint has form ax <= b.
+	    // The scalar product has the form:
+	    // '-a * x_i' where x_i = g.coefficient(x).
+	    if (is_line
+		&& !x_dimension_incompatible
+		&& g.coefficient(x) != 0)
+	      return Poly_Gen_Relation::nothing();
+	    else if (g.coefficient(x) > 0)
+	      return Poly_Gen_Relation::nothing();
+	  }
+	  else if (!dbm_ji_is_infinity) {
+	    // The constraint has form -ax <= b.
+	    // The scalar product has the form:
+	    // 'a * x_i' where x_i = g.coefficient(x).
+	    if (is_line
+		&& !x_dimension_incompatible
+		&& g.coefficient(x) != 0)
+	      return Poly_Gen_Relation::nothing();
+	    else if (g.coefficient(x) < 0)
+	      return Poly_Gen_Relation::nothing();
+	  }
+      }
+    }
+  }
+  return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_closure_assign() const {
+  using Implementation::BD_Shapes::min_assign;
+
+  // Do something only if necessary.
+  if (marked_empty() || marked_shortest_path_closed())
+    return;
+  const dimension_type num_dimensions = space_dimension();
+  // Zero-dimensional BDSs are necessarily shortest-path closed.
+  if (num_dimensions == 0)
+    return;
+
+  // Even though the BDS will not change, its internal representation
+  // is going to be modified by the Floyd-Warshall algorithm.
+  BD_Shape& x = const_cast<BD_Shape<T>&>(*this);
+
+  // Fill the main diagonal with zeros.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    assert(is_plus_infinity(x.dbm[h][h]));
+    assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+  }
+
+  N sum;
+  for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+    const DB_Row<N>& xdbm_k = x.dbm[k];
+    for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+      DB_Row<N>& xdbm_i = x.dbm[i];
+      const N& xdbm_i_k = xdbm_i[k];
+      if (!is_plus_infinity(xdbm_i_k))
+	for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+	  const N& xdbm_k_j = xdbm_k[j];
+	  if (!is_plus_infinity(xdbm_k_j)) {
+	    // Rounding upward for correctness.
+	    add_assign_r(sum, xdbm_i_k, xdbm_k_j, ROUND_UP);
+	    min_assign(xdbm_i[j], sum);
+	  }
+	}
+    }
+  }
+
+  // Check for emptyness: the BDS is empty if and only if there is a
+  // negative value on the main diagonal of `dbm'.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    N& x_dbm_hh = x.dbm[h][h];
+    if (x_dbm_hh < 0) {
+      x.status.set_empty();
+      return;
+    }
+    else {
+      assert(x_dbm_hh == 0);
+      // Restore PLUS_INFINITY on the main diagonal.
+      x_dbm_hh = PLUS_INFINITY;
+    }
+  }
+
+  // The BDS is not empty and it is now shortest-path closed.
+  x.status.set_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_reduction_assign() const {
+  // Do something only if necessary.
+  if (marked_shortest_path_reduced())
+    return;
+
+  // First find the tighest constraints for this BDS.
+  shortest_path_closure_assign();
+
+  // If `*this' is empty, then there is nothing to reduce.
+  if (marked_empty())
+    return;
+
+  // Step 1: compute zero-equivalence classes.
+  // Variables corresponding to indices `i' and `j' are zero-equivalent
+  // if they lie on a zero-weight loop; since the matrix is shortest-path
+  // closed, this happens if and only if dbm[i][j] == -dbm[j][i].
+  std::vector<dimension_type> predecessor;
+  compute_predecessors(predecessor);
+  std::vector<dimension_type> leaders;
+  compute_leader_indices(predecessor, leaders);
+  const dimension_type num_leaders = leaders.size();
+
+  const dimension_type space_dim = space_dimension();
+  // TODO: directly work on `redundancy_dbm' so as to minimize allocations.
+  std::deque<bool> redundancy_row(space_dim + 1, true);
+  std::vector<std::deque<bool> > redundancy(space_dim + 1, redundancy_row);
+
+  // Step 2: flag non-redundant constraints in the (zero-cycle-free)
+  // subsystem of bounded differences having only leaders as variables.
+  N c;
+  for (dimension_type l_i = 0; l_i < num_leaders; ++l_i) {
+    const dimension_type i = leaders[l_i];
+    const DB_Row<N>& dbm_i = dbm[i];
+    std::deque<bool>& redundancy_i = redundancy[i];
+    for (dimension_type l_j = 0; l_j < num_leaders; ++l_j) {
+      const dimension_type j = leaders[l_j];
+      if (redundancy_i[j]) {
+	const N& dbm_i_j = dbm_i[j];
+	redundancy_i[j] = false;
+	for (dimension_type l_k = 0; l_k < num_leaders; ++l_k) {
+	  const dimension_type k = leaders[l_k];
+	  add_assign_r(c, dbm_i[k], dbm[k][j], ROUND_UP);
+	  if (dbm_i_j >= c) {
+	    redundancy_i[j] = true;
+	    break;
+	  }
+	}
+      }
+    }
+  }
+
+  // Step 3: flag non-redundant constraints in zero-equivalence classes.
+  // Each equivalence class must have a single 0-cycle connecting
+  // all the equivalent variables in increasing order.
+  std::deque<bool> dealt_with(space_dim + 1, false);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    // We only need to deal with non-singleton zero-equivalence classes
+    // that haven't already been dealt with.
+    if (i != predecessor[i] && !dealt_with[i]) {
+      dimension_type j = i;
+      while (true) {
+	const dimension_type pred_j = predecessor[j];
+	if (j == pred_j) {
+	  // We finally found the leader of `i'.
+	  assert(redundancy[i][j]);
+	  redundancy[i][j] = false;
+	  // Here we dealt with `j' (i.e., `pred_j'), but it is useless
+	  // to update `dealt_with' because `j' is a leader.
+	  break;
+	}
+	// We haven't found the leader of `i' yet.
+	assert(redundancy[pred_j][j]);
+	redundancy[pred_j][j] = false;
+	dealt_with[pred_j] = true;
+	j = pred_j;
+      }
+    }
+
+  // Even though shortest-path reduction is not going to change the BDS,
+  // it might change its internal representation.
+  BD_Shape<T>& x = const_cast<BD_Shape<T>&>(*this);
+  std::swap(x.redundancy_dbm, redundancy);
+  x.status.set_shortest_path_reduced();
+
+  assert(is_shortest_path_reduced());
+}
+
+template <typename T>
+void
+BD_Shape<T>::bds_hull_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("bds_hull_assign(y)", y);
+
+  // The poly-hull of a polyhedron `bd' with an empty polyhedron is `bd'.
+  y.shortest_path_closure_assign();
+  if (y.marked_empty())
+    return;
+  shortest_path_closure_assign();
+  if (marked_empty()) {
+    *this = y;
+    return;
+  }
+
+  // The bds-hull consists in constructing `*this' with the maximum
+  // elements selected from `*this' and `y'.
+  assert(space_dim == 0 || marked_shortest_path_closed());
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (dbm_ij < y_dbm_ij)
+	dbm_ij = y_dbm_ij;
+    }
+  }
+  // The result is still closed.
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::bds_difference_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("bds_difference_assign(y)", y);
+
+  BD_Shape new_bdiffs(space_dim, EMPTY);
+
+  BD_Shape& x = *this;
+
+  x.shortest_path_closure_assign();
+  // The difference of an empty system of bounded differences
+  // and of a system of bounded differences `p' is empty.
+  if (x.marked_empty())
+    return;
+  y.shortest_path_closure_assign();
+  // The difference of a system of bounded differences `p'
+  // and an empty system of bounded differences is `p'.
+  if (y.marked_empty())
+    return;
+
+  // If both systems of bounded differences are zero-dimensional,
+  // then at this point they are necessarily universe system of
+  // bounded differences, so that their difference is empty.
+  if (space_dim == 0) {
+    x.set_empty();
+    return;
+  }
+
+  // TODO: This is just an executable specification.
+  //       Have to find a more efficient method.
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
+
+  // We take a constraint of the system y at the time and we
+  // consider its complementary. Then we intersect the union
+  // of these complementaries with the system x.
+  const Constraint_System& y_cs = y.constraints();
+  for (Constraint_System::const_iterator i = y_cs.begin(),
+	 y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+    const Constraint& c = *i;
+    // If the system of bounded differences `x' is included
+    // in the system of bounded differences defined by `c',
+    // then `c' _must_ be skipped, as adding its complement to `x'
+    // would result in the empty system of bounded differences,
+    // and as we would obtain a result that is less precise
+    // than the bds-difference.
+    if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    BD_Shape z = x;
+    const Linear_Expression e = Linear_Expression(c);
+    bool change = false;
+    if (c.is_nonstrict_inequality())
+      change = z.add_constraint_and_minimize(e <= 0);
+    if (c.is_equality()) {
+      BD_Shape w = x;
+      if (w.add_constraint_and_minimize(e <= 0))
+	new_bdiffs.bds_hull_assign(w);
+      change = z.add_constraint_and_minimize(e >= 0);
+    }
+    if (change)
+      new_bdiffs.bds_hull_assign(z);
+  }
+  *this = new_bdiffs;
+  // The result is still closed, because both bds_hull_assign() and
+  // add_constraint_and_minimize() preserve closure.
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_embed(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type space_dim = space_dimension();
+  const dimension_type new_space_dim = space_dim + m;
+  const bool was_zero_dim_univ = (!marked_empty() && space_dim == 0);
+
+  // To embed an n-dimension space BDS in a (n+m)-dimension space,
+  // we just add `m' rows and columns in the system of bounded differences,
+  // initialized to PLUS_INFINITY.
+  dbm.grow(new_space_dim + 1);
+
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    status.reset_shortest_path_reduced();
+
+  // If `*this' was the zero-dim space universe BDS,
+  // the we can set the shortest-path closure flag.
+  if (was_zero_dim_univ)
+    status.set_shortest_path_closed();
+
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_project(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type space_dim = space_dimension();
+
+  // If `*this' was zero-dimensional, then we add `m' rows and columns.
+  // If it also was non-empty, then we zero all the added elements
+  // and set the flag for shortest-path closure.
+  if (space_dim == 0) {
+    dbm.grow(m + 1);
+    if (!marked_empty()) {
+      for (dimension_type i = m + 1; i-- > 0; ) {
+	DB_Row<N>& dbm_i = dbm[i];
+	for (dimension_type j = m + 1; j-- > 0; )
+	  if (i != j)
+	    assign_r(dbm_i[j], 0, ROUND_NOT_NEEDED);
+      }
+      status.set_shortest_path_closed();
+    }
+    assert(OK());
+    return;
+  }
+
+  // To project an n-dimension space system of bounded differences
+  // in a (n+m)-dimension space, we add `m' rows and columns.
+  // In the first row and column of the matrix we add `zero' from
+  // the (n+1)-th position to the end.
+  const dimension_type new_space_dim = space_dim + m;
+  dbm.grow(new_space_dim + 1);
+
+  // Bottom of the matrix and first row.
+  DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = space_dim + 1; i <= new_space_dim; ++i) {
+    assign_r(dbm[i][0], 0, ROUND_NOT_NEEDED);
+    assign_r(dbm_0[i], 0, ROUND_NOT_NEEDED);
+  }
+
+  if (marked_shortest_path_closed())
+    status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  // The removal of no dimensions from any BDS is a no-op.
+  // Note that this case also captures the only legal removal of
+  // space dimensions from a BDS in a 0-dim space.
+  if (to_be_removed.empty()) {
+    assert(OK());
+    return;
+  }
+
+  // Dimension-compatibility check: the variable having
+  // maximum cardinality is the one occurring last in the set.
+  const dimension_type max_dim_to_be_removed = to_be_removed.rbegin()->id();
+  const dimension_type old_space_dim = space_dimension();
+  if (max_dim_to_be_removed >= old_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)",
+				 max_dim_to_be_removed);
+
+  // Shortest-path closure is necessary to keep precision.
+  shortest_path_closure_assign();
+
+  // When removing _all_ dimensions from a BDS,
+  // we obtain the zero-dimensional BDS.
+  const dimension_type new_space_dim = old_space_dim - to_be_removed.size();
+  if (new_space_dim == 0) {
+    dbm.resize_no_copy(1);
+    if (!marked_empty())
+      // We set the zero_dim_univ flag.
+      set_zero_dim_univ();
+    assert(OK());
+    return;
+  }
+
+  // Shortest-path closure is maintained.
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    status.reset_shortest_path_reduced();
+
+  // For each variable to remove, we erase the corresponding column and
+  // row by shifting the other columns and rows, than are not removed,
+  // respectively left and above.
+  Variables_Set::const_iterator tbr = to_be_removed.begin();
+  Variables_Set::const_iterator tbr_end = to_be_removed.end();
+  dimension_type dst = tbr->id() + 1;
+  dimension_type src = dst + 1;
+  for (++tbr; tbr != tbr_end; ++tbr) {
+    const dimension_type tbr_next = tbr->id() + 1;
+    // All other columns and rows are moved respectively to the left
+    // and above.
+    while (src < tbr_next) {
+      dbm[dst] = dbm[src];
+      for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+	DB_Row<N>& dbm_i = dbm[i];
+	dbm_i[dst] = dbm_i[src];
+      }
+      ++dst;
+      ++src;
+    }
+    ++src;
+  }
+
+  // Moving the remaining rows and columns.
+  while (src <= old_space_dim) {
+    dbm[dst] = dbm[src];
+    for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+      DB_Row<N>& dbm_i = dbm[i];
+      dbm_i[dst] = dbm_i[src];
+    }
+    ++src;
+    ++dst;
+  }
+
+  // Update the space dimension.
+  dbm.resize_no_copy(new_space_dim + 1);
+  assert(OK());
+}
+
+template <typename T>
+template <typename PartialFunction>
+void
+BD_Shape<T>::map_space_dimensions(const PartialFunction& pfunc) {
+  const dimension_type space_dim = space_dimension();
+  // TODO: this implementation is just an executable specification.
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the BDS becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    assert(OK());
+    return;
+  }
+
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If we are going to actually reduce the space dimension,
+  // then shortest-path closure is required to keep precision.
+  if (new_space_dim < space_dim)
+    shortest_path_closure_assign();
+
+  // If the BDS is empty, then it is sufficient to adjust the
+  // space dimension of the system of bounded differences.
+  if (marked_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
+
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    status.reset_shortest_path_reduced();
+
+  // We create a new matrix with the new space dimension.
+  DB_Matrix<N> x(new_space_dim+1);
+  // First of all we must map the unary constraints, because
+  // there is the fictitious variable `zero', that can't be mapped
+  // at all.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& x_0 = x[0];
+  for (dimension_type j = 1; j <= space_dim; ++j) {
+    dimension_type new_j;
+    if (pfunc.maps(j - 1, new_j)) {
+      x_0[new_j + 1] = dbm_0[j];
+      x[new_j + 1][0] = dbm[j][0];
+    }
+  }
+  // Now we map the binary constraints, exchanging the indexes.
+  for (dimension_type i = 1; i <= space_dim; ++i) {
+    dimension_type new_i;
+    if (pfunc.maps(i - 1, new_i)) {
+      const DB_Row<N>& dbm_i = dbm[i];
+      ++new_i;
+      DB_Row<N>& x_new_i = x[new_i];
+      for (dimension_type j = i+1; j <= space_dim; ++j) {
+	dimension_type new_j;
+	if (pfunc.maps(j - 1, new_j)) {
+	  ++new_j;
+	  x_new_i[new_j] = dbm_i[j];
+	  x[new_j][new_i] = dbm[j][i];
+	}
+      }
+    }
+  }
+
+  std::swap(dbm, x);
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::intersection_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("intersection_assign(y)", y);
+
+  // If one of the two systems of bounded differences is empty,
+  // the intersection is empty.
+  if (marked_empty())
+    return;
+  if (y.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // If both systems of bounded differences are zero-dimensional,
+  // then at this point they are necessarily non-empty,
+  // so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
+
+  // To intersect two systems of bounded differences we compare
+  // the constraints and we choose the less values.
+  bool changed = false;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (dbm_ij > y_dbm_ij) {
+	dbm_ij = y_dbm_ij;
+	changed = true;
+      }
+    }
+  }
+
+  if (changed && marked_shortest_path_closed())
+    status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+template <typename Iterator>
+void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y,
+				       Iterator first, Iterator last,
+				       unsigned* tp) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // If both systems of bounded differences are zero-dimensional,
+  // since `*this' contains `y', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  shortest_path_closure_assign();
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  y.shortest_path_closure_assign();
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    BD_Shape<T> x_tmp(*this);
+    x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Compare each constraint in `y' to the corresponding one in `*this'.
+  // The constraint in `*this' is kept as is if it is stronger than or
+  // equal to the constraint in `y'; otherwise, the inhomogeneous term
+  // of the constraint in `*this' is further compared with elements taken
+  // from a sorted container (the stop-points, provided by the user), and
+  // is replaced by the first entry, if any, which is greater than or equal
+  // to the inhomogeneous term. If no such entry exists, the constraint
+  // is removed altogether.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (y_dbm_ij < dbm_ij) {
+	Iterator k = std::lower_bound(first, last, dbm_ij);
+	if (k != last) {
+	  if (dbm_ij < *k)
+	    assign_r(dbm_ij, *k, ROUND_UP);
+	}
+	else
+	  dbm_ij = PLUS_INFINITY;
+      }
+    }
+  }
+  status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::get_limiting_shape(const Constraint_System& cs,
+				BD_Shape& limiting_shape) const {
+  using Implementation::BD_Shapes::div_round_up;
+
+  const dimension_type cs_space_dim = cs.space_dimension();
+  // Private method: the caller has to ensure the following.
+  assert(cs_space_dim <= space_dimension());
+
+  bool changed = false;
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 iend = cs.end(); i != iend; ++i) {
+    const Constraint& c = *i;
+    dimension_type num_vars = 0;
+    dimension_type i = 0;
+    dimension_type j = 0;
+    TEMP_INTEGER(coeff);
+    // Constraints that are not bounded differences are ignored.
+    if (extract_bounded_difference(c, cs_space_dim, num_vars, i, j, coeff)) {
+      // Select the cell to be modified for the "<=" part of the constraint,
+      // and set `coeff' to the absolute value of itself.
+      const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+      const N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+      DB_Matrix<N>& ls_dbm = limiting_shape.dbm;
+      N& ls_x = (coeff < 0) ? ls_dbm[i][j] : ls_dbm[j][i];
+      N& ls_y = (coeff < 0) ? ls_dbm[j][i] : ls_dbm[i][j];
+      if (coeff < 0)
+	coeff = -coeff;
+      // Compute the bound for `x', rounding towards plus infinity.
+      N d;
+      div_round_up(d, c.inhomogeneous_term(), coeff);
+      if (x <= d)
+	if (c.is_inequality())
+	  if (ls_x > d) {
+	    ls_x = d;
+	    changed = true;
+	  }
+	else {
+	  // Compute the bound for `y', rounding towards plus infinity.
+	  div_round_up(d, -c.inhomogeneous_term(), coeff);
+	  if (y <= d)
+	    if (ls_y > d) {
+	      ls_y = d;
+	      changed = true;
+	    }
+
+	}
+    }
+  }
+
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure of the system of bounded differences.
+  if (changed && limiting_shape.marked_shortest_path_closed())
+    limiting_shape.status.reset_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::limited_CC76_extrapolation_assign(const BD_Shape& y,
+					       const Constraint_System& cs,
+					       unsigned* tp) {
+  // Dimension-compatibility check.
+  const dimension_type space_dim = space_dimension();
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+				 y);
+
+  // `cs' must be dimension-compatible with the two systems
+  // of bounded differences.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+  // The limited CC76-extrapolation between two systems of bounded
+  // differences in a zero-dimensional space is a system of bounded
+  // differences in a zero-dimensional space, too.
+  if (space_dim == 0)
+    return;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+  get_limiting_shape(cs, limiting_shape);
+  CC76_extrapolation_assign(y, tp);
+  intersection_assign(limiting_shape);
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // Compute the affine dimension of `y'.
+  const dimension_type y_affine_dim = y.affine_dimension();
+  // If the affine dimension of `y' is zero, then either `y' is
+  // zero-dimensional, or it is empty, or it is a singleton.
+  // In all cases, due to the inclusion hypothesis, the result is `*this'.
+  if (y_affine_dim == 0)
+    return;
+
+  // If the affine dimension has changed, due to the inclusion hypothesis,
+  // the result is `*this'.
+  const dimension_type x_affine_dim = affine_dimension();
+  assert(x_affine_dim >= y_affine_dim);
+  if (x_affine_dim != y_affine_dim)
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    BD_Shape<T> x_tmp(*this);
+    x_tmp.BHMZ05_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Here no token is available.
+  assert(marked_shortest_path_closed() && y.marked_shortest_path_closed());
+  // Minimize `y'.
+  y.shortest_path_reduction_assign();
+
+  // Extrapolate unstable bounds, taking into account redundancy in `y'.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    const std::deque<bool>& y_redundancy_i = y.redundancy_dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      // Note: in the following line the use of `!=' (as opposed to
+      // the use of `<' that would seem -but is not- equivalent) is
+      // intentional.
+      if (y_redundancy_i[j] || y_dbm_i[j] != dbm_ij)
+	dbm_ij = PLUS_INFINITY;
+    }
+  }
+  // NOTE: this will also reset the shortest-path reduction flag,
+  // even though the dbm is still in reduced form. However, the
+  // current implementation invariant requires that any reduced dbm
+  // is closed too.
+  status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+						 const Constraint_System& cs,
+						 unsigned* tp) {
+  // Dimension-compatibility check.
+  const dimension_type space_dim = space_dimension();
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+				 y);
+  // `cs' must be dimension-compatible with the two systems
+  // of bounded differences.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
+				  "(y, cs)");
+
+  // Strict inequalities are not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
+				  "(y, cs)");
+
+  // The limited BHMZ05-extrapolation between two systems of bounded
+  // differences in a zero-dimensional space is a system of bounded
+  // differences in a zero-dimensional space, too.
+  if (space_dim == 0)
+    return;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+  get_limiting_shape(cs, limiting_shape);
+  BHMZ05_widening_assign(y, tp);
+  intersection_assign(limiting_shape);
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::CC76_narrowing_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+#ifndef NDEBUG
+  {
+    // We assume that `*this' is contained in or equal to `y'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(y_copy.contains(x_copy));
+  }
+#endif
+
+  // If both systems of bounded differences are zero-dimensional,
+  // since `y' contains `*this', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  y.shortest_path_closure_assign();
+  // If `y' is empty, since `y' contains `this', `*this' is empty too.
+  if (y.marked_empty())
+    return;
+  shortest_path_closure_assign();
+  // If `*this' is empty, we return.
+  if (marked_empty())
+    return;
+
+  // Replace each constraint in `*this' by the corresponding constraint
+  // in `y' if the corresponding inhomogeneous terms are both finite.
+  bool changed = false;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (!is_plus_infinity(dbm_ij)
+	  && !is_plus_infinity(y_dbm_ij)
+	  && dbm_ij != y_dbm_ij) {
+	dbm_ij = y_dbm_ij;
+	changed = true;
+      }
+    }
+  }
+  if (changed && marked_shortest_path_closed())
+    status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::deduce_v_minus_u_bounds(const dimension_type v,
+			  const dimension_type last_v,
+			  const Linear_Expression& sc_expr,
+			  Coefficient_traits::const_reference sc_den,
+			  const N& pos_sum) {
+  // Deduce constraints of the form `v - u', where `u != v'.
+  // Note: the shortest-path closure is able to deduce the constraint
+  // `v - u <= ub_v - lb_u'. We can be more precise if variable `u'
+  // played an active role in the computation of the upper bound for `v',
+  // i.e., if the corresponding coefficient `q == expr_u/den' is
+  // greater than zero. In particular:
+  // if `q >= 1',    then `v - u <= ub_v - ub_u';
+  // if `0 < q < 1', then `v - u <= ub_v - (q*ub_u + (1-q)*lb_u)'.
+  mpq_class mpq_sc_den;
+  assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // No need to consider indices greater than `last_v'.
+  for (dimension_type u = last_v; u > 0; --u)
+    if (u != v) {
+      const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
+      if (expr_u > 0)
+	if (expr_u >= sc_den)
+	  // Deducing `v - u <= ub_v - ub_u'.
+	  sub_assign_r(dbm[u][v], pos_sum, dbm_0[u], ROUND_UP);
+	else {
+	  DB_Row<N>& dbm_u = dbm[u];
+	  const N& dbm_u0 = dbm_u[0];
+	  if (!is_plus_infinity(dbm_u0)) {
+	    // Let `ub_u' and `lb_u' be the known upper and lower bound
+	    // for `u', respectively. Letting `q = expr_u/sc_den' be the
+	    // rational coefficient of `u' in `sc_expr/sc_den',
+	    // the upper bound for `v - u' is computed as
+	    // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e.,
+	    // `pos_sum + (-lb_u) - q * (ub_u + (-lb_u))'.
+	    mpq_class minus_lb_u;
+	    assign_r(minus_lb_u, dbm_u0, ROUND_NOT_NEEDED);
+	    mpq_class q;
+	    assign_r(q, expr_u, ROUND_NOT_NEEDED);
+	    div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+	    mpq_class ub_u;
+	    assign_r(ub_u, dbm_0[u], ROUND_NOT_NEEDED);
+	    // Compute `ub_u - lb_u'.
+	    add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+	    // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+	    sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+	    N up_approx;
+	    assign_r(up_approx, minus_lb_u, ROUND_UP);
+	    // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+	    add_assign_r(dbm_u[v], pos_sum, up_approx, ROUND_UP);
+	  }
+	}
+    }
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::deduce_u_minus_v_bounds(const dimension_type v,
+			  const dimension_type last_v,
+			  const Linear_Expression& sc_expr,
+			  Coefficient_traits::const_reference sc_den,
+			  const N& neg_sum) {
+  // Deduce constraints of the form `u - v', where `u != v'.
+  // Note: the shortest-path closure is able to deduce the constraint
+  // `u - v <= ub_u - lb_v'. We can be more precise if variable `u'
+  // played an active role in the computation of the lower bound for `v',
+  // i.e., if the corresponding coefficient `q == expr_u/den' is
+  // greater than zero. In particular:
+  // if `q >= 1',    then `u - v <= lb_u - lb_v';
+  // if `0 < q < 1', then `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+  mpq_class mpq_sc_den;
+  assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& dbm_v = dbm[v];
+  // No need to consider indices greater than `last_v'.
+  for (dimension_type u = last_v; u > 0; --u)
+    if (u != v) {
+      const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
+      if (expr_u > 0)
+	if (expr_u >= sc_den)
+	  // Deducing `u - v <= lb_u - lb_v',
+	  // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+	  sub_assign_r(dbm_v[u], neg_sum, dbm[u][0], ROUND_UP);
+	else {
+	  const N& dbm_0u = dbm_0[u];
+	  if (!is_plus_infinity(dbm_0u)) {
+	    // Let `ub_u' and `lb_u' be the known upper and lower bound
+	    // for `u', respectively. Letting `q = expr_u/sc_den' be the
+	    // rational coefficient of `u' in `sc_expr/sc_den',
+	    // the upper bound for `u - v' is computed as
+	    // `(q * lb_u + (1-q) * ub_u) - lb_v', i.e.,
+	    // `ub_u - q * (ub_u + (-lb_u)) + neg_sum'.
+	    mpq_class ub_u;
+	    assign_r(ub_u, dbm_0u, ROUND_NOT_NEEDED);
+	    mpq_class q;
+	    assign_r(q, expr_u, ROUND_NOT_NEEDED);
+	    div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+	    mpq_class minus_lb_u;
+	    assign_r(minus_lb_u, dbm[u][0], ROUND_NOT_NEEDED);
+	    // Compute `ub_u - lb_u'.
+	    add_assign_r(minus_lb_u, minus_lb_u, ub_u, ROUND_NOT_NEEDED);
+	    // Compute `ub_u - q * (ub_u - lb_u)'.
+	    sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+	    N up_approx;
+	    assign_r(up_approx, ub_u, ROUND_UP);
+	    // Deducing `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+	    add_assign_r(dbm_v[u], up_approx, neg_sum, ROUND_UP);
+	  }
+	}
+    }
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_image(const Variable var,
+			  const Linear_Expression& expr,
+			  Coefficient_traits::const_reference denominator) {
+  using Implementation::BD_Shapes::div_round_up;
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of the shape.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", var.id());
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0)
+      if (t++ == 1)
+	break;
+      else
+	w = i+1;
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+  TEMP_INTEGER(minus_den);
+  neg_assign(minus_den, denominator);
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      status.reset_shortest_path_reduced();
+    // Add the constraint `var == b/denominator'.
+    add_dbm_constraint(0, v, b, denominator);
+    add_dbm_constraint(v, 0, b, minus_den);
+    assert(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.coefficient(Variable(w-1));
+    if (a == denominator || a == minus_den) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      if (w == v) {
+	// `expr' is of the form: a*v + b.
+	if (a == denominator) {
+	  if (b == 0)
+	    // The transformation is the identity function.
+	    return;
+	  else {
+	    // Translate all the constraints on `var',
+	    // adding or subtracting the value `b/denominator'.
+	    N d;
+	    div_round_up(d, b, denominator);
+	    N c;
+	    div_round_up(c, b, minus_den);
+	    DB_Row<N>& dbm_v = dbm[v];
+	    for (dimension_type i = space_dim + 1; i-- > 0; ) {
+	      N& dbm_vi = dbm_v[i];
+	      add_assign_r(dbm_vi, dbm_vi, c, ROUND_UP);
+	      N& dbm_iv = dbm[i][v];
+	      add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+	    }
+	    // Both shortest-path closure and reduction are preserved.
+	  }
+	}
+	else {
+	  // Here `a == -denominator'.
+	  // Remove the binary constraints on `var'.
+	  forget_binary_dbm_constraints(v);
+	  // Swap the unary constraints on `var'.
+	  std::swap(dbm[v][0], dbm[0][v]);
+	  // Shortest-path closure is not preserved.
+	  status.reset_shortest_path_closed();
+	  if (b != 0) {
+	    // Translate the unary constraints on `var',
+	    // adding or subtracting the value `b/denominator'.
+	    N c;
+	    div_round_up(c, b, minus_den);
+	    N& dbm_v0 = dbm[v][0];
+	    add_assign_r(dbm_v0, dbm_v0, c, ROUND_UP);
+	    N d;
+	    div_round_up(d, b, denominator);
+	    N& dbm_0v = dbm[0][v];
+	    add_assign_r(dbm_0v, dbm_0v, d, ROUND_UP);
+	  }
+	}
+      }
+      else {
+	// Here `w != v', so that `expr' is of the form
+	// +/-denominator * w + b.
+	// Remove all constraints on `var'.
+	forget_all_dbm_constraints(v);
+	// Shortest-path closure is preserved, but not reduction.
+	if (marked_shortest_path_reduced())
+	  status.reset_shortest_path_reduced();
+	if (a == denominator) {
+	  // Add the new constraint `v - w == b/denominator'.
+	  add_dbm_constraint(w, v, b, denominator);
+	  add_dbm_constraint(v, w, b, minus_den);
+	}
+	else {
+	  // Here a == -denominator, so that we should be adding
+	  // the constraint `v + w == b/denominator'.
+	  // Approximate it by computing lower and upper bounds for `w'.
+	  const N& dbm_w0 = dbm[w][0];
+	  if (!is_plus_infinity(dbm_w0)) {
+	    // Add the constraint `v <= b/denominator - lower_w'.
+	    N d;
+	    div_round_up(d, b, denominator);
+	    add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+	    status.reset_shortest_path_closed();
+	  }
+	  const N& dbm_0w = dbm[0][w];
+	  if (!is_plus_infinity(dbm_0w)) {
+	    // Add the constraint `v >= b/denominator - upper_w'.
+	    N c;
+	    div_round_up(c, b, minus_den);
+	    add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP);
+	    status.reset_shortest_path_closed();
+	  }
+	}
+      }
+      assert(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  N pos_sum;
+  N neg_sum;
+  // Indices of the variables that are unbounded in `this->dbm'.
+  // (The initializations are just to quiet a compiler warning.)
+  dimension_type pos_pinf_index = 0;
+  dimension_type neg_pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
+  dimension_type neg_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = w; i > 0; --i) {
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      N coeff_i;
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+	const N& up_approx_i = dbm_0[i];
+	if (!is_plus_infinity(up_approx_i))
+	  add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+	else {
+	  ++pos_pinf_count;
+	  pos_pinf_index = i;
+	}
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+	const N& up_approx_minus_i = dbm[i][0];
+	if (!is_plus_infinity(up_approx_minus_i))
+	  add_mul_assign_r(neg_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+	else {
+	  ++neg_pinf_count;
+	  neg_pinf_index = i;
+	}
+      }
+    }
+    else if (sign_i < 0) {
+      TEMP_INTEGER(minus_sc_i);
+      neg_assign(minus_sc_i, sc_i);
+      N minus_coeff_i;
+      assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+	const N& up_approx_minus_i = dbm[i][0];
+	if (!is_plus_infinity(up_approx_minus_i))
+	  add_mul_assign_r(pos_sum,
+			   minus_coeff_i, up_approx_minus_i, ROUND_UP);
+	else {
+	  ++pos_pinf_count;
+	  pos_pinf_index = i;
+	}
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+	const N& up_approx_i = dbm_0[i];
+	if (!is_plus_infinity(up_approx_i))
+	  add_mul_assign_r(neg_sum, minus_coeff_i, up_approx_i, ROUND_UP);
+	else {
+	  ++neg_pinf_count;
+	  neg_pinf_index = i;
+	}
+      }
+    }
+  }
+
+  // Remove all constraints on 'v'.
+  forget_all_dbm_constraints(v);
+  // Shortest-path closure is maintained, but not reduction.
+  if (marked_shortest_path_reduced())
+    status.reset_shortest_path_reduced();
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+    assert(OK());
+    return;
+  }
+
+  // In the following, shortest-path closure will be definitely lost.
+  status.reset_shortest_path_closed();
+
+  // Before computing quotients, the denominator should be approximated
+  // towards zero. Since `sc_den' is known to be positive, this amounts to
+  // rounding downwards, which is achieved as usual by rounding upwards
+  // `minus_sc_den' and negating again the result.
+  N down_sc_den;
+  assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+  neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (down_sc_den != 1)
+      div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP);
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      DB_Row<N>& dbm_0 = dbm[0];
+      assign_r(dbm_0[v], pos_sum, ROUND_UP);
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != v
+	  && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den)
+	// Add the constraint `v - pos_pinf_index <= pos_sum'.
+	assign_r(dbm[pos_pinf_index][v], pos_sum, ROUND_UP);
+  }
+
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (down_sc_den != 1)
+      div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      DB_Row<N>& dbm_v = dbm[v];
+      assign_r(dbm_v[0], neg_sum, ROUND_UP);
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != v
+	  && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den)
+	// Add the constraint `v - neg_pinf_index >= -neg_sum',
+	// i.e., `neg_pinf_index - v <= neg_sum'.
+	assign_r(dbm[v][neg_pinf_index], neg_sum, ROUND_UP);
+  }
+
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_preimage(const Variable var,
+			     const Linear_Expression& expr,
+			     Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of
+  // the systems of bounded differences.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", var.id());
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type j = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0)
+      if (t++ == 1)
+	break;
+      else
+        j = i;
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr = b, with `b' a constant;
+  // - If t == 1, then expr = a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t > 1, the `expr' is of the general form.
+  if (t == 0) {
+    // Case 1: expr = n; remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      status.reset_shortest_path_reduced();
+    assert(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.coefficient(Variable(j));
+    if (a == denominator || a == -denominator) {
+      // Case 2: expr = a*w + b, with a = +/- denominator.
+      if (j == var.id())
+	// Apply affine_image() on the inverse of this transformation.
+	affine_image(var, a*var - b, denominator);
+      else {
+	// `expr == a*w + b', where `w != v'.
+	// Remove all constraints on `var'.
+	forget_all_dbm_constraints(v);
+	// Shortest-path closure is preserved, but not reduction.
+	if (marked_shortest_path_reduced())
+	  status.reset_shortest_path_reduced();
+      }
+      assert(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t = 1, expr = a*w + b, but a <> +/- denominator.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    // The transformation is invertible.
+    Linear_Expression inverse((expr_v + denominator)*var);
+    inverse -= expr;
+    affine_image(var, inverse, expr_v);
+  }
+  else {
+    // Transformation not invertible: all constraints on `var' are lost.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      status.reset_shortest_path_reduced();
+  }
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Variable var,
+				      const Relation_Symbol relsym,
+				      const Linear_Expression& expr,
+				      Coefficient_traits::const_reference
+				      denominator) {
+  using Implementation::BD_Shapes::div_round_up;
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+				 "e", expr);
+
+  // `var' should be one of the dimensions of the BDS.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+				 var.id());
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_image(v, r, e, d)",
+  		  "r is a strict relation symbol and "
+  		  "*this is a BD_Shape");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "==":
+    // this is just an affine image computation.
+    affine_image(var, expr, denominator);
+    assert(OK());
+    return;
+  }
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0)
+      if (t++ == 1)
+	break;
+      else
+	w = i+1;
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& dbm_v = dbm[v];
+  TEMP_INTEGER(minus_den);
+  neg_assign(minus_den, denominator);
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Both shortest-path closure and reduction are lost.
+    status.reset_shortest_path_closed();
+    switch (relsym) {
+    case LESS_THAN_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      break;
+    case GREATER_THAN_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_dbm_constraint(v, 0, b, minus_den);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+      break;
+    }
+    assert(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.coefficient(Variable(w-1));
+    if (a == denominator || a == minus_den) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      N d;
+      switch (relsym) {
+      case LESS_THAN_OR_EQUAL:
+	div_round_up(d, b, denominator);
+	if (w == v) {
+	  // `expr' is of the form: a*v + b.
+	  // Shortest-path closure and reduction are not preserved.
+	  status.reset_shortest_path_closed();
+	  if (a == denominator) {
+	    // Translate each constraint `v - w <= dbm_wv'
+	    // into the constraint `v - w <= dbm_wv + b/denominator';
+	    // forget each constraint `w - v <= dbm_vw'.
+	    for (dimension_type i = space_dim + 1; i-- > 0; ) {
+	      N& dbm_iv = dbm[i][v];
+	      add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+	      dbm_v[i] = PLUS_INFINITY;
+	    }
+	  }
+	  else {
+	    // Here `a == -denominator'.
+	    // Translate the constraint `0 - v <= dbm_v0'
+	    // into the constraint `0 - v <= dbm_v0 + b/denominator'.
+	    N& dbm_v0 = dbm_v[0];
+	    add_assign_r(dbm_0[v], dbm_v0, d, ROUND_UP);
+	    // Forget all the other constraints on `v'.
+	    dbm_v0 = PLUS_INFINITY;
+	    forget_binary_dbm_constraints(v);
+	  }
+	}
+	else {
+	  // Here `w != v', so that `expr' is of the form
+	  // +/-denominator * w + b, with `w != v'.
+	  // Remove all constraints on `v'.
+	  forget_all_dbm_constraints(v);
+	  // Shortest-path closure is preserved, but not reduction.
+	  if (marked_shortest_path_reduced())
+	    status.reset_shortest_path_reduced();
+	  if (a == denominator)
+	    // Add the new constraint `v - w <= b/denominator'.
+	    add_dbm_constraint(w, v, d);
+	  else {
+	    // Here a == -denominator, so that we should be adding
+	    // the constraint `v <= b/denominator - w'.
+	    // Approximate it by computing a lower bound for `w'.
+	    const N& dbm_w0 = dbm[w][0];
+	    if (!is_plus_infinity(dbm_w0)) {
+	      // Add the constraint `v <= b/denominator - lb_w'.
+	      add_assign_r(dbm_0[v], d, dbm_w0, ROUND_UP);
+	      // Shortest-path closure is not preserved.
+	      status.reset_shortest_path_closed();
+	    }
+	  }
+	}
+	break;
+
+      case GREATER_THAN_OR_EQUAL:
+	div_round_up(d, b, minus_den);
+	if (w == v) {
+	  // `expr' is of the form: a*w + b.
+	  // Shortest-path closure and reduction are not preserved.
+	  status.reset_shortest_path_closed();
+	  if (a == denominator) {
+	    // Translate each constraint `w - v <= dbm_vw'
+	    // into the constraint `w - v <= dbm_vw - b/denominator';
+	    // forget each constraint `v - w <= dbm_wv'.
+	    for (dimension_type i = space_dim + 1; i-- > 0; ) {
+	      N& dbm_vi = dbm_v[i];
+	      add_assign_r(dbm_vi, dbm_vi, d, ROUND_UP);
+	      dbm[i][v] = PLUS_INFINITY;
+	    }
+	  }
+	  else {
+	    // Here `a == -denominator'.
+	    // Translate the constraint `0 - v <= dbm_v0'
+	    // into the constraint `0 - v <= dbm_0v - b/denominator'.
+	    N& dbm_0v = dbm_0[v];
+	    add_assign_r(dbm_v[0], dbm_0v, d, ROUND_UP);
+	    // Forget all the other constraints on `v'.
+	    dbm_0v = PLUS_INFINITY;
+	    forget_binary_dbm_constraints(v);
+	  }
+	}
+	else {
+	  // Here `w != v', so that `expr' is of the form
+	  // +/-denominator * w + b, with `w != v'.
+	  // Remove all constraints on `v'.
+	  forget_all_dbm_constraints(v);
+	  // Shortest-path closure is preserved, but not reduction.
+	  if (marked_shortest_path_reduced())
+	    status.reset_shortest_path_reduced();
+	  if (a == denominator)
+	    // Add the new constraint `v - w >= b/denominator',
+	    // i.e., `w - v <= -b/denominator'.
+	    add_dbm_constraint(v, w, d);
+	  else {
+	    // Here a == -denominator, so that we should be adding
+	    // the constraint `v >= -w + b/denominator',
+	    // i.e., `-v <= w - b/denominator'.
+	    // Approximate it by computing an upper bound for `w'.
+	    const N& dbm_0w = dbm_0[w];
+	    if (!is_plus_infinity(dbm_0w)) {
+	      // Add the constraint `-v <= ub_w - b/denominator'.
+	      add_assign_r(dbm_v[0], dbm_0w, d, ROUND_UP);
+	      // Shortest-path closure is not preserved.
+	      status.reset_shortest_path_closed();
+	    }
+	  }
+	}
+	break;
+
+      default:
+	// We already dealt with the other cases.
+	throw std::runtime_error("PPL internal error");
+	break;
+      }
+      assert(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `v' and add back
+  // a constraint providing an upper or a lower bound for `v'
+  // (depending on `relsym').
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  N sum;
+  // Index of variable that is unbounded in `this->dbm'.
+  // (The initialization is just to quiet a compiler warning.)
+  dimension_type pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
+
+  switch (relsym) {
+  case LESS_THAN_OR_EQUAL:
+    // Compute an upper approximation for `sc_expr' into `sum'.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, sc_b, ROUND_UP);
+    // Approximate the homogeneous part of `sc_expr'.
+    // Note: indices above `w' can be disregarded, as they all have
+    // a zero coefficient in `sc_expr'.
+    for (dimension_type i = w; i > 0; --i) {
+      const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+      const int sign_i = sgn(sc_i);
+      if (sign_i == 0)
+	continue;
+      // Choose carefully: we are approximating `sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
+      if (is_plus_infinity(approx_i)) {
+	if (++pinf_count > 1)
+	  break;
+	pinf_index = i;
+	continue;
+      }
+      N coeff_i;
+      if (sign_i > 0)
+	assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+	TEMP_INTEGER(minus_sc_i);
+	neg_assign(minus_sc_i, sc_i);
+	assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Remove all constraints on `v'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      status.reset_shortest_path_reduced();
+    // Return immediately if no approximation could be computed.
+    if (pinf_count > 1) {
+      assert(OK());
+      return;
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_den != 1) {
+      // Before computing the quotient, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      N down_sc_den;
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v <= sum'.
+      add_dbm_constraint(0, v, sum);
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v
+	  && expr.coefficient(Variable(pinf_index-1)) == denominator)
+	// Add the constraint `v - pinf_index <= sum'.
+	add_dbm_constraint(pinf_index, v, sum);
+    break;
+
+  case GREATER_THAN_OR_EQUAL:
+    // Compute an upper approximation for `-sc_expr' into `sum'.
+    // Note: approximating `-sc_expr' from above and then negating the
+    // result is the same as approximating `sc_expr' from below.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, minus_sc_b, ROUND_UP);
+    // Approximate the homogeneous part of `-sc_expr'.
+    for (dimension_type i = expr_space_dim + 1; i > 0; --i) {
+      const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+      const int sign_i = sgn(sc_i);
+      if (sign_i == 0)
+	continue;
+      // Choose carefully: we are approximating `-sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
+      if (is_plus_infinity(approx_i)) {
+	if (++pinf_count > 1)
+	  break;
+	pinf_index = i;
+	continue;
+      }
+      N coeff_i;
+      if (sign_i > 0)
+	assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+	TEMP_INTEGER(minus_sc_i);
+	neg_assign(minus_sc_i, sc_i);
+	assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      status.reset_shortest_path_reduced();
+    // Return immediately if no approximation could be computed.
+    if (pinf_count > 1) {
+      assert(OK());
+      return;
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_den != 1) {
+      // Before computing the quotient, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      N down_sc_den;
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+      add_dbm_constraint(v, 0, sum);
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v
+	  && expr.coefficient(Variable(pinf_index-1)) == denominator)
+	// Add the constraint `v - pinf_index >= -sum',
+	// i.e., `pinf_index - v <= sum'.
+	add_dbm_constraint(v, pinf_index, sum);
+    break;
+
+  default:
+    // We already dealt with the other cases.
+    throw std::runtime_error("PPL internal error");
+    break;
+  }
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+				      const Relation_Symbol relsym,
+				      const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e1", lhs);
+
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e2", rhs);
+
+  // Strict relation symbols are not admitted for BDSs.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_image(e1, r, e2)",
+		  "r is a strict relation symbol and "
+		  "*this is a BD_Shape");
+
+  // The image of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = 0;
+  // Compute the number of the non-zero components of `lhs'.
+  for (dimension_type i = lhs_space_dim; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0)
+      if (t_lhs++ == 1)
+	break;
+      else
+	j_lhs = i;
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+    // Note that this constraint is a bounded difference if `t_rhs <= 1'
+    // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs'. If `rhs' is of a
+    // more general form, it will be simply ignored.
+    // TODO: if it is not a bounded difference, should we compute
+    // approximations for this constraint?
+    switch (relsym) {
+    case LESS_THAN_OR_EQUAL:
+      add_constraint(lhs <= rhs);
+      break;
+    case EQUAL:
+      add_constraint(lhs == rhs);
+      break;
+    case GREATER_THAN_OR_EQUAL:
+      add_constraint(lhs >= rhs);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+      break;
+    }
+  }
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine images for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& den = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (den < 0)
+      if (relsym == LESS_THAN_OR_EQUAL)
+	new_relsym = GREATER_THAN_OR_EQUAL;
+      else if (relsym == GREATER_THAN_OR_EQUAL)
+	new_relsym = LESS_THAN_OR_EQUAL;
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_image(v, new_relsym, expr, den);
+  }
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    bool lhs_vars_intersects_rhs_vars = false;
+    std::vector<Variable> lhs_vars;
+    for (dimension_type i = lhs_space_dim; i-- > 0; )
+      if (lhs.coefficient(Variable(i)) != 0) {
+	lhs_vars.push_back(Variable(i));
+	if (rhs.coefficient(Variable(i)) != 0)
+	  lhs_vars_intersects_rhs_vars = true;
+      }
+
+    if (!lhs_vars_intersects_rhs_vars) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Cylindrificate on all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+	forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT a bounded difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_THAN_OR_EQUAL:
+	add_constraint(lhs <= rhs);
+	break;
+      case EQUAL:
+	add_constraint(lhs == rhs);
+	break;
+      case GREATER_THAN_OR_EQUAL:
+	add_constraint(lhs >= rhs);
+	break;
+      default:
+	// We already dealt with the other cases.
+	throw std::runtime_error("PPL internal error");
+	break;
+      }
+    }
+    else {
+      // Some variables in `lhs' also occur in `rhs'.
+
+#if 1 // Simplified computation (see the TODO note below).
+
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+	forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+
+#else // Currently unnecessarily complex computation.
+
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
+
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var = Variable(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of add_constraint()
+      // ensures some approximation is tried even when the constraint
+      // is not a bounded difference.
+      affine_image(new_var, rhs);
+      // Cylindrificate on all variables in the lhs.
+      // NOTE: enforce shortest-path closure for precision.
+      shortest_path_closure_assign();
+      assert(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+	forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // TODO: each one of the following constraints is definitely NOT
+      // a bounded differences (since it has 3 variables at least).
+      // Thus, the method add_constraint() will simply ignore it.
+      // Should we compute approximations for this constraint?
+      switch (relsym) {
+      case LESS_THAN_OR_EQUAL:
+	add_constraint(lhs <= new_var);
+	break;
+      case EQUAL:
+	add_constraint(lhs == new_var);
+	break;
+      case GREATER_THAN_OR_EQUAL:
+	add_constraint(lhs >= new_var);
+	break;
+      default:
+	// We already dealt with the other cases.
+	throw std::runtime_error("PPL internal error");
+	break;
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+    }
+  }
+
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Variable var,
+					 const Relation_Symbol relsym,
+					 const Linear_Expression& expr,
+					 Coefficient_traits::const_reference
+					 denominator) {
+  using Implementation::BD_Shapes::div_round_up;
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_preimage(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+				 "e", expr);
+
+  // `var' should be one of the dimensions of the BDS.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+				 var.id());
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_preimage(v, r, e, d)",
+  		  "r is a strict relation symbol and "
+  		  "*this is a BD_Shape");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "==":
+    // this is just an affine preimage computation.
+    affine_preimage(var, expr, denominator);
+    assert(OK());
+    return;
+  }
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    const Relation_Symbol reversed_relsym = (relsym == LESS_THAN_OR_EQUAL)
+      ? GREATER_THAN_OR_EQUAL : LESS_THAN_OR_EQUAL;
+    const Linear_Expression inverse
+      = expr - (expr_v + denominator)*var;
+    TEMP_INTEGER(inverse_den);
+    neg_assign(inverse_den, expr_v);
+    const Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_den)) ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse, inverse_den);
+    return;
+  }
+
+  // Here `var_coefficient == 0', so that the preimage cannot
+  // be easily computed by inverting the affine relation.
+  // Shrink the BD shape by adding the constraint induced
+  // by the affine relation.
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type j = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0)
+      if (t++ == 1)
+	break;
+      else
+	j = i+1;
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*j + b, where `j != v';
+  // - If t == 2, the `expr' is of the general form.
+  DB_Row<N>& dbm_0 = dbm[0];
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    switch (relsym) {
+    case LESS_THAN_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      break;
+    case GREATER_THAN_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_dbm_constraint(v, 0, -b, denominator);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+      break;
+    }
+  }
+  else if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& expr_j = expr.coefficient(Variable(j-1));
+    N d;
+    switch (relsym) {
+    case LESS_THAN_OR_EQUAL:
+      div_round_up(d, b, denominator);
+      // Note that: `j != v', so that `expr' is of the form
+      // expr_j * j + b, with `j != v'.
+      if (expr_j == denominator)
+	// Add the new constraint `v - j <= b/denominator'.
+	add_dbm_constraint(j, v, d);
+      else {
+	// Here expr_j != denominator, so that we should be adding
+	// the constraint `v <= b/denominator - j'.
+	N sum;
+	// Approximate the homogeneous part of `expr'.
+	const int sign_j = sgn(expr_j);
+	const N& approx_j = (sign_j > 0) ? dbm_0[j] : dbm[j][0];
+	if (!is_plus_infinity(approx_j)) {
+	  N coeff_j;
+	  if (sign_j > 0)
+	    assign_r(coeff_j, expr_j, ROUND_UP);
+	  else {
+	    TEMP_INTEGER(minus_expr_j);
+	    neg_assign(minus_expr_j, expr_j);
+	    assign_r(coeff_j, minus_expr_j, ROUND_UP);
+	  }
+	  add_mul_assign_r(sum, coeff_j, approx_j, ROUND_UP);
+	  add_dbm_constraint(0, v, sum);
+	}
+      }
+      break;
+
+    case GREATER_THAN_OR_EQUAL:
+      div_round_up(d, -b, denominator);
+      // Note that: `j != v', so that `expr' is of the form
+      // expr_j * j + b, with `j != v'.
+      if (expr_j == denominator)
+	// Add the new constraint `v - j >= b/denominator'.
+	add_dbm_constraint(j, v, d);
+      else {
+	// Here expr_j != denominator, so that we should be adding
+	// the constraint `v <= b/denominator - j'.
+	N sum;
+	// Approximate the homogeneous part of `expr_j'.
+	const int sign_j = sgn(expr_j);
+	const N& approx_j = (sign_j > 0) ? dbm_0[j] : dbm[j][0];
+	if (!is_plus_infinity(approx_j)) {
+	  N coeff_j;
+	  if (sign_j > 0)
+	    assign_r(coeff_j, expr_j, ROUND_UP);
+	  else {
+	    TEMP_INTEGER(minus_expr_j);
+	    neg_assign(minus_expr_j, expr_j);
+	    assign_r(coeff_j, minus_expr_j, ROUND_UP);
+	  }
+	  add_mul_assign_r(sum, coeff_j, approx_j, ROUND_UP);
+	  add_dbm_constraint(0, v, sum);
+	}
+      }
+      break;
+
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+      break;
+    }
+  }
+  else {
+    // Here t == 2, so that
+    // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2.
+    const bool is_sc = (denominator > 0);
+    TEMP_INTEGER(minus_b);
+    neg_assign(minus_b, b);
+    const Coefficient& sc_b = is_sc ? b : minus_b;
+    const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+    TEMP_INTEGER(minus_den);
+    neg_assign(minus_den, denominator);
+    const Coefficient& sc_den = is_sc ? denominator : minus_den;
+    const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+    // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+    // when `denominator' is negative. Do not use it unless you are sure
+    // it has been correctly assigned.
+    Linear_Expression minus_expr;
+    if (!is_sc)
+      minus_expr = -expr;
+    const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+    N sum;
+    // Index of variable that is unbounded in `this->dbm'.
+    // (The initialization is just to quiet a compiler warning.)
+    dimension_type pinf_index = 0;
+    // Number of unbounded variables found.
+    dimension_type pinf_count = 0;
+
+    switch (relsym) {
+    case LESS_THAN_OR_EQUAL:
+      // Compute an upper approximation for `expr' into `sum',
+      // taking into account the sign of `denominator'.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, sc_b, ROUND_UP);
+
+      // Approximate the homogeneous part of `sc_expr'.
+      // Note: indices above `w' can be disregarded, as they all have
+      // a zero coefficient in `expr'.
+      for (dimension_type i = j; i > 0; --i) {
+	const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+	const int sign_i = sgn(sc_i);
+	if (sign_i == 0)
+	  continue;
+	// Choose carefully: we are approximating `sc_expr'.
+	const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
+	if (is_plus_infinity(approx_i)) {
+	  if (++pinf_count > 1)
+	    break;
+	  pinf_index = i;
+	  continue;
+	}
+	N coeff_i;
+	if (sign_i > 0)
+	  assign_r(coeff_i, sc_i, ROUND_UP);
+	else {
+	  TEMP_INTEGER(minus_sc_i);
+	  neg_assign(minus_sc_i, sc_i);
+	  assign_r(coeff_i, minus_sc_i, ROUND_UP);
+	}
+	add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+      }
+
+      // Divide by the (sign corrected) denominator (if needed).
+      if (sc_den != 1) {
+	// Before computing the quotient, the denominator should be
+	// approximated towards zero. Since `sc_den' is known to be
+	// positive, this amounts to rounding downwards, which is achieved
+	// by rounding upwards `minus_sc-den' and negating again the result.
+	N down_sc_den;
+	assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+	neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+	div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+      }
+
+      if (pinf_count == 0) {
+	// Add the constraint `v <= sum'.
+	add_dbm_constraint(0, v, sum);
+	// Deduce constraints of the form `v - u', where `u != v'.
+	deduce_v_minus_u_bounds(v, j, sc_expr, sc_den, sum);
+      }
+      else if (pinf_count == 1)
+	if (expr.coefficient(Variable(pinf_index-1)) == denominator)
+	  // Add the constraint `v - pinf_index <= sum'.
+	  add_dbm_constraint(pinf_index, v, sum);
+      break;
+
+    case GREATER_THAN_OR_EQUAL:
+      // Compute an upper approximation for `-sc_expr' into `sum'.
+      // Note: approximating `-sc_expr' from above and then negating the
+      // result is the same as approximating `sc_expr' from below.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, minus_sc_b, ROUND_UP);
+
+      // Approximate the homogeneous part of `-sc_expr'.
+      for (dimension_type i = j; i > 0; --i) {
+	const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+	const int sign_i = sgn(sc_i);
+	if (sign_i == 0)
+	  continue;
+	// Choose carefully: we are approximating `-sc_expr'.
+	const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
+	if (is_plus_infinity(approx_i)) {
+	  if (++pinf_count > 1)
+	    break;
+	  pinf_index = i;
+	  continue;
+	}
+	N coeff_i;
+	if (sign_i > 0)
+	  assign_r(coeff_i, sc_i, ROUND_UP);
+	else {
+	  TEMP_INTEGER(minus_sc_i);
+	  neg_assign(minus_sc_i, sc_i);
+	  assign_r(coeff_i, minus_sc_i, ROUND_UP);
+	}
+	add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+      }
+
+      // Divide by the (sign corrected) denominator (if needed).
+      if (sc_den != 1) {
+	// Before computing the quotient, the denominator should be
+	// approximated towards zero. Since `sc_den' is known to be positive,
+	// this amounts to rounding downwards, which is achieved by rounding
+	// upwards `minus_sc_den' and negating again the result.
+	N down_sc_den;
+	assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+	neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+	div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+      }
+
+      if (pinf_count == 0) {
+	// Add the constraint `v >= -sum', i.e., `-v <= sum'.
+	add_dbm_constraint(v, 0, sum);
+	// Deduce constraints of the form `u - v', where `u != v'.
+	deduce_u_minus_v_bounds(v, j, sc_expr, sc_den, sum);
+      }
+      else if (pinf_count == 1)
+	if (pinf_index != v
+	    && expr.coefficient(Variable(pinf_index-1)) == denominator)
+	  // Add the constraint `v - pinf_index >= -sum',
+	  // i.e., `pinf_index - v <= sum'.
+	  add_dbm_constraint(v, pinf_index, sum);
+      break;
+
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+      break;
+    }
+  }
+
+  // If the shrunk BD_Shape is empty, its preimage is empty too.
+  if (is_empty())
+    return;
+  forget_all_dbm_constraints(v);
+  // Shortest-path closure is preserved, but not reduction.
+  if (marked_shortest_path_reduced())
+    status.reset_shortest_path_reduced();
+  assert(OK());
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::constraints() const {
+  using Implementation::BD_Shapes::numer_denom;
+
+  Constraint_System cs;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else if (marked_shortest_path_reduced())
+    // Disregard redundant constraints.
+    cs = minimized_constraints();
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
+
+    TEMP_INTEGER(a);
+    TEMP_INTEGER(b);
+    // Go through all the unary constraints in `dbm'.
+    const DB_Row<N>& dbm_0 = dbm[0];
+    for (dimension_type j = 1; j <= space_dim; ++j) {
+      const Variable x(j-1);
+      const N& dbm_0j = dbm_0[j];
+      const N& dbm_j0 = dbm[j][0];
+      N negated_dbm_j0;
+      if (neg_assign_r(negated_dbm_j0, dbm_j0, ROUND_NOT_NEEDED) == V_EQ
+	  && negated_dbm_j0 == dbm_0j) {
+	// We have a unary equality constraint.
+	numer_denom(dbm_0j, b, a);
+	cs.insert(a*x == b);
+      }
+      else {
+	// We have 0, 1 or 2 unary inequality constraints.
+	if (!is_plus_infinity(dbm_0j)) {
+	  numer_denom(dbm_0j, b, a);
+	  cs.insert(a*x <= b);
+	}
+	if (!is_plus_infinity(dbm_j0)) {
+	  numer_denom(dbm_j0, b, a);
+	  cs.insert(-a*x <= b);
+	}
+      }
+    }
+
+    // Go through all the binary constraints in `dbm'.
+    for (dimension_type i = 1; i <= space_dim; ++i) {
+      const Variable y(i-1);
+      const DB_Row<N>& dbm_i = dbm[i];
+      for (dimension_type j = i + 1; j <= space_dim; ++j) {
+	const Variable x(j-1);
+	const N& dbm_ij = dbm_i[j];
+	const N& dbm_ji = dbm[j][i];
+	N negated_dbm_ji;
+	if (neg_assign_r(negated_dbm_ji, dbm_ji, ROUND_NOT_NEEDED) == V_EQ
+	    && negated_dbm_ji == dbm_ij) {
+	  // We have a binary equality constraint.
+	  numer_denom(dbm_ij, b, a);
+	  cs.insert(a*x - a*y == b);
+	}
+	else {
+	  // We have 0, 1 or 2 binary inequality constraints.
+	  if (!is_plus_infinity(dbm_ij)) {
+	    numer_denom(dbm_ij, b, a);
+	    cs.insert(a*x - a*y <= b);
+	  }
+	  if (!is_plus_infinity(dbm_ji)) {
+	    numer_denom(dbm_ji, b, a);
+	    cs.insert(a*y - a*x <= b);
+	  }
+	}
+      }
+    }
+  }
+  return cs;
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::minimized_constraints() const {
+  using Implementation::BD_Shapes::numer_denom;
+
+  shortest_path_reduction_assign();
+  Constraint_System cs;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
+
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
+
+    // Compute leader information.
+    std::vector<dimension_type> leaders;
+    compute_leaders(leaders);
+    std::vector<dimension_type> leader_indices;
+    compute_leader_indices(leaders, leader_indices);
+    const dimension_type num_leaders = leader_indices.size();
+
+    // Go through the non-leaders to generate equality constraints.
+    const DB_Row<N>& dbm_0 = dbm[0];
+    for (dimension_type i = 1; i <= space_dim; ++i) {
+      const dimension_type leader = leaders[i];
+      if (i != leader)
+	// Generate the constraint relating `i' and its leader.
+	if (leader == 0) {
+	  // A unary equality has to be generated.
+	  assert(!is_plus_infinity(dbm_0[i]));
+	  numer_denom(dbm_0[i], num, den);
+	  cs.insert(den*Variable(i-1) == num);
+	}
+	else {
+	  // A binary equality has to be generated.
+	  assert(!is_plus_infinity(dbm[i][leader]));
+	  numer_denom(dbm[i][leader], num, den);
+	  cs.insert(den*Variable(leader-1) - den*Variable(i-1) == num);
+	}
+    }
+
+    // Go through the leaders to generate inequality constraints.
+    // First generate all the unary inequalities.
+    const std::deque<bool>& red_0 = redundancy_dbm[0];
+    for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+      const dimension_type i = leader_indices[l_i];
+      if (!red_0[i]) {
+	numer_denom(dbm_0[i], num, den);
+	cs.insert(den*Variable(i-1) <= num);
+      }
+      if (!redundancy_dbm[i][0]) {
+	numer_denom(dbm[i][0], num, den);
+	cs.insert(-den*Variable(i-1) <= num);
+      }
+    }
+    // Then generate all the binary inequalities.
+    for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+      const dimension_type i = leader_indices[l_i];
+      const DB_Row<N>& dbm_i = dbm[i];
+      const std::deque<bool>& red_i = redundancy_dbm[i];
+      for (dimension_type l_j = l_i + 1; l_j < num_leaders; ++l_j) {
+	const dimension_type j = leader_indices[l_j];
+	if (!red_i[j]) {
+	  numer_denom(dbm_i[j], num, den);
+	  cs.insert(den*Variable(j-1) - den*Variable(i-1) <= num);
+	}
+	if (!redundancy_dbm[j][i]) {
+	  numer_denom(dbm[j][i], num, den);
+	  cs.insert(den*Variable(i-1) - den*Variable(j-1) <= num);
+	}
+      }
+    }
+  }
+  return cs;
+}
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const BD_Shape<T>& c) {
+  typedef typename BD_Shape<T>::coefficient_type N;
+  if (c.is_universe())
+    s << "true";
+  else {
+    // We control empty system of bounded differences.
+    dimension_type n = c.space_dimension();
+    if (c.marked_empty())
+      s << "false";
+    else {
+      bool first = true;
+      for (dimension_type i = 0; i <= n; ++i)
+	for (dimension_type j = i + 1; j <= n; ++j) {
+	  const N& c_i_j = c.dbm[i][j];
+	  const N& c_j_i = c.dbm[j][i];
+	  N negated_c_ji;
+	  if (neg_assign_r(negated_c_ji, c_j_i, ROUND_NOT_NEEDED) == V_EQ
+	      && negated_c_ji == c_i_j) {
+	    // We will print an equality.
+	    if (first)
+	      first = false;
+	    else
+	      s << ", ";
+	    if (i == 0) {
+	      // We have got a equality constraint with one Variable.
+	      s << Variable(j - 1);
+	      s << " == " << c_i_j;
+	    }
+	    else {
+	      // We have got a equality constraint with two Variables.
+	      if (c_i_j >= 0) {
+		s << Variable(j - 1);
+		s << " - ";
+		s << Variable(i - 1);
+		s << " == " << c_i_j;
+	      }
+	      else {
+		s << Variable(i - 1);
+		s << " - ";
+		s << Variable(j - 1);
+		s << " == " << c_j_i;
+	      }
+	    }
+	  }
+	  else {
+	    // We will print a non-strict inequality.
+	    if (!is_plus_infinity(c_j_i)) {
+	      if (first)
+		first = false;
+	      else
+		s << ", ";
+	      if (i == 0) {
+		// We have got a constraint with an only Variable.
+		s << Variable(j - 1);
+		N v;
+		neg_assign_r(v, c_j_i, ROUND_DOWN);
+		s << " >= " << v;
+	      }
+	      else {
+		// We have got a constraint with two Variables.
+		if (c_j_i >= 0) {
+		  s << Variable(i - 1);
+		  s << " - ";
+		  s << Variable(j - 1);
+		  s << " <= " << c_j_i;
+		}
+		else {
+		  s << Variable(j - 1);
+		  s << " - ";
+		  s << Variable(i - 1);
+		  N v;
+		  neg_assign_r(v, c_j_i, ROUND_DOWN);
+		  s << " >= " << v;
+		}
+	      }
+	    }
+	    if (!is_plus_infinity(c_i_j)) {
+	      if (first)
+		first = false;
+	      else
+		s << ", ";
+	      if (i == 0) {
+		// We have got a constraint with an only Variable.
+		s << Variable(j - 1);
+		s << " <= " << c_i_j;
+	      }
+	      else {
+		// We have got a constraint with two Variables.
+		if (c_i_j >= 0) {
+		  s << Variable(j - 1);
+		  s << " - ";
+		  s << Variable(i - 1);
+		  s << " <= " << c_i_j;
+		}
+		else {
+		  s << Variable(i - 1);
+		  s << " - ";
+		  s << Variable(j - 1);
+		  N v;
+		  neg_assign_r(v, c_i_j, ROUND_DOWN);
+		  s << " >= " << v;
+		}
+	      }
+	    }
+	  }
+	}
+    }
+  }
+  return s;
+}
+
+template <typename T>
+void
+BD_Shape<T>::ascii_dump(std::ostream& s) const {
+  status.ascii_dump(s);
+  s << "\n";
+  dbm.ascii_dump(s);
+  // Redundancy info.
+  s << "\n";
+  const char separator = ' ';
+  const dimension_type nrows = redundancy_dbm.size();
+  s << nrows << separator << "\n";
+  for (dimension_type i = 0; i < nrows;  ++i) {
+    for (dimension_type j = 0; j < nrows; ++j)
+      s << redundancy_dbm[i][j] << separator;
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, BD_Shape<T>);
+
+template <typename T>
+bool
+BD_Shape<T>::ascii_load(std::istream& s) {
+  if (!status.ascii_load(s))
+    return false;
+  if (!dbm.ascii_load(s))
+    return false;
+  // Load redundancy info.
+  dimension_type nrows;
+   if (!(s >> nrows))
+    return false;
+  redundancy_dbm.clear();
+  redundancy_dbm.reserve(nrows);
+  std::deque<bool> redundancy_row(nrows, false);
+  for (dimension_type i = 0; i < nrows;  ++i) {
+    for (dimension_type j = 0; j < nrows; ++j)
+      if (!(s >> redundancy_row[j]))
+	return false;
+    redundancy_dbm.push_back(redundancy_row);
+  }
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::OK() const {
+  // Check whether the difference-bound matrix is well-formed.
+  if (!dbm.OK())
+    return false;
+
+  // Check whether the status information is legal.
+  if (!status.OK())
+    return false;
+
+  // An empty BDS is OK.
+  if (marked_empty())
+    return true;
+
+  // MINUS_INFINITY cannot occur at all.
+  for (dimension_type i = dbm.num_rows(); i-- > 0; )
+    for (dimension_type j = dbm.num_rows(); j-- > 0; )
+    if (is_minus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+      using namespace Parma_Polyhedra_Library::IO_Operators;
+      std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
+		<< dbm[i][i] << "!"
+		<< std::endl;
+#endif
+      return false;
+    }
+
+  // On the main diagonal only PLUS_INFINITY can occur.
+  for (dimension_type i = dbm.num_rows(); i-- > 0; )
+    if (!is_plus_infinity(dbm[i][i])) {
+#ifndef NDEBUG
+      using namespace Parma_Polyhedra_Library::IO_Operators;
+      std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
+		<< dbm[i][i] << "!  (+inf was expected.)"
+		<< std::endl;
+#endif
+      return false;
+    }
+
+  // Check whether the shortest-path closure information is legal.
+  if (marked_shortest_path_closed()) {
+    BD_Shape x = *this;
+    x.status.reset_shortest_path_closed();
+    x.shortest_path_closure_assign();
+    if (x.dbm != dbm) {
+#ifndef NDEBUG
+      std::cerr << "BD_Shape is marked as closed but it is not!"
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // Check whether the shortest-path reduction information is legal.
+  if (marked_shortest_path_reduced()) {
+    // A non-redundant constraint cannot be equal to PLUS_INFINITY.
+    for (dimension_type i = dbm.num_rows(); i-- > 0; )
+      for (dimension_type j = dbm.num_rows(); j-- > 0; )
+	if (!redundancy_dbm[i][j] && is_plus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+	  using namespace Parma_Polyhedra_Library::IO_Operators;
+	  std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
+		    << dbm[i][i] << " is marked as non-redundant!"
+		    << std::endl;
+#endif
+	  return false;
+	}
+
+    BD_Shape x = *this;
+    x.status.reset_shortest_path_reduced();
+    x.shortest_path_reduction_assign();
+    if (x.redundancy_dbm != redundancy_dbm) {
+#ifndef NDEBUG
+      std::cerr << "BD_Shape is marked as reduced but it is not!"
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // All checks passed.
+  return true;
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+					  const BD_Shape& y) const {
+  std::ostringstream s;
+  s << "PPL::";
+  s << "BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+					  dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::";
+  s << "BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+					  const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::";
+  s << "BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+					  const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::";
+  s << "BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_constraint_incompatible(const char* method) {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "the constraint is incompatible.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_expression_too_complex(const char* method,
+					  const Linear_Expression& e) {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << e << " is too complex.";
+  throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+					  const char* name_row,
+					  const Linear_Expression& y) const {
+  std::ostringstream s;
+  s << "PPL::";
+  s << "BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << name_row << "->space_dimension() == "
+    << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+BD_Shape<T>::throw_generic(const char* method, const char* reason) {
+  std::ostringstream s;
+  s << "PPL::";
+  s << "BD_Shape::" << method << ":" << std::endl
+    << reason;
+  throw std::invalid_argument(s.str());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BD_Shape_templates_hh)
diff --git a/src/BD_Shape.types.hh b/src/BD_Shape.types.hh
new file mode 100644
index 0000000..60aec43
--- /dev/null
+++ b/src/BD_Shape.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_BD_Shape_types_hh
+#define PPL_BD_Shape_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class BD_Shape;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BD_Shape_types_hh)
diff --git a/src/BHRZ03_Certificate.cc b/src/BHRZ03_Certificate.cc
new file mode 100644
index 0000000..654bea9
--- /dev/null
+++ b/src/BHRZ03_Certificate.cc
@@ -0,0 +1,332 @@
+/* BHRZ03_Certificate class implementation
+   (non-inline member functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "BHRZ03_Certificate.defs.hh"
+
+#include "Polyhedron.defs.hh"
+#include <cassert>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::BHRZ03_Certificate::BHRZ03_Certificate(const Polyhedron& ph)
+  : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(0),
+    num_rays_null_coord(ph.space_dimension(), 0) {
+  // TODO: provide a correct and reasonably efficient
+  // implementation for NNC polyhedra.
+
+  // The computation of the certificate requires both the
+  // constraint and the generator systems in minimal form.
+  ph.minimize();
+  // It is assumed that `ph' is not an empty polyhedron.
+  assert(!ph.marked_empty());
+
+  // The dimension of the polyhedron is obtained by subtracting
+  // the number of equalities from the space dimension.
+  // When counting constraints, for a correct reasoning, we have
+  // to disregard the low-level constraints (i.e., the positivity
+  // constraint and epsilon bounds).
+  const dimension_type space_dim = ph.space_dimension();
+  affine_dim = space_dim;
+  assert(num_constraints == 0);
+  const Constraint_System& cs = ph.minimized_constraints();
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); i != cs_end; ++i) {
+    ++num_constraints;
+    if (i->is_equality())
+      --affine_dim;
+  }
+
+  assert(lin_space_dim == 0);
+  assert(num_points == 0);
+  const Generator_System& gs = ph.minimized_generators();
+  for (Generator_System::const_iterator i = gs.begin(),
+	 gs_end = gs.end(); i != gs_end; ++i)
+    switch (i->type()) {
+    case Generator::POINT:
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      ++num_points;
+      break;
+    case Generator::RAY:
+      // For each i such that 0 <= j < space_dim,
+      // `num_rays_null_coord[j]' will be the number of rays
+      // having exactly `j' coordinates equal to 0.
+      {
+	const Generator& r = *i;
+	dimension_type num_zeroes = 0;
+	for (dimension_type j = space_dim; j-- > 0; )
+	  if (r.coefficient(Variable(j)) == 0)
+	    ++num_zeroes;
+	++num_rays_null_coord[num_zeroes];
+      }
+      break;
+    case Generator::LINE:
+      // Since the generator systems is minimized, the dimension of
+      // the lineality space is equal to the number of lines.
+      ++lin_space_dim;
+      break;
+    }
+  assert(OK());
+
+  // TODO: this is an inefficient workaround.
+  // For NNC polyhedra, constraints might be no longer up-to-date
+  // (and hence, neither minimized) due to the strong minimization
+  // process applied to generators when constructing the certificate.
+  // We have to reinforce the (normal) minimization of the constraint
+  // system. The future, lazy implementation of the strong minimization
+  // process will solve this problem.
+  if (!ph.is_necessarily_closed())
+    ph.minimize();
+}
+
+int
+PPL::BHRZ03_Certificate::compare(const BHRZ03_Certificate& y) const {
+  assert(OK() && y.OK());
+  if (affine_dim != y.affine_dim)
+    return affine_dim > y.affine_dim ? 1 : -1;
+  if (lin_space_dim != y.lin_space_dim)
+    return lin_space_dim > y.lin_space_dim ? 1 : -1;
+  if (num_constraints != y.num_constraints)
+    return num_constraints > y.num_constraints ? 1 : -1;
+  if (num_points != y.num_points)
+    return num_points > y.num_points ? 1 : -1;
+
+  const dimension_type space_dim = num_rays_null_coord.size();
+  assert(num_rays_null_coord.size() == y.num_rays_null_coord.size());
+  // Note: iterating upwards, because we have to check first
+  // the number of rays having more NON-zero coordinates.
+  for (dimension_type i = 0; i < space_dim; i++)
+    if (num_rays_null_coord[i] != y.num_rays_null_coord[i])
+      return num_rays_null_coord[i] > y.num_rays_null_coord[i] ? 1 : -1;
+  // All components are equal.
+  return 0;
+}
+
+int
+PPL::BHRZ03_Certificate::compare(const Polyhedron& ph) const {
+  assert(ph.space_dimension() == num_rays_null_coord.size());
+
+  // TODO: provide a correct and reasonably efficient
+  // implementation for NNC polyhedra.
+
+  // The computation of the certificate requires both the
+  // constraint and the generator systems in minimal form.
+  ph.minimize();
+  // It is assumed that `ph' is a polyhedron containing the
+  // polyhedron described by `*this': hence, it cannot be empty.
+  assert(!ph.marked_empty());
+
+  // The dimension of the polyhedron is obtained by subtracting
+  // the number of equalities from the space dimension.
+  // When counting constraints, for a correct reasoning, we have
+  // to disregard the low-level constraints (i.e., the positivity
+  // constraint and epsilon bounds).
+  const dimension_type space_dim = ph.space_dimension();
+  dimension_type ph_affine_dim = space_dim;
+  dimension_type ph_num_constraints = 0;
+  const Constraint_System& cs = ph.minimized_constraints();
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); i != cs_end; ++i) {
+    ++ph_num_constraints;
+    if (i->is_equality())
+      --ph_affine_dim;
+  }
+  // TODO: this is an inefficient workaround.
+  // For NNC polyhedra, constraints might be no longer up-to-date
+  // (and hence, neither minimized) due to the strong minimization
+  // process applied to generators when constructing the certificate.
+  // We have to reinforce the (normal) minimization of the constraint
+  // system. The future, lazy implementation of the strong minimization
+  // process will solve this problem.
+  if (!ph.is_necessarily_closed())
+    ph.minimize();
+
+  // If the dimension of `ph' is increasing, the chain is stabilizing.
+  if (ph_affine_dim > affine_dim)
+    return 1;
+
+  // At this point the two polyhedra must have the same dimension.
+  assert(ph_affine_dim == affine_dim);
+
+  // Speculative optimization: in order to better exploit the incrementality
+  // of the comparison, we do not compute information about rays here,
+  // hoping that the other components will be enough.
+  dimension_type ph_lin_space_dim = 0;
+  dimension_type ph_num_points = 0;
+  const Generator_System& gs = ph.minimized_generators();
+  for (Generator_System::const_iterator i = gs.begin(),
+	 gs_end = gs.end(); i != gs_end; ++i)
+    switch (i->type()) {
+    case Generator::POINT:
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      ++ph_num_points;
+      break;
+    case Generator::RAY:
+      break;
+    case Generator::LINE:
+      // Since the generator systems is minimized, the dimension of
+      // the lineality space is equal to the number of lines.
+      ++ph_lin_space_dim;
+      break;
+    }
+  // TODO: this is an inefficient workaround.
+  // For NNC polyhedra, constraints might be no longer up-to-date
+  // (and hence, neither minimized) due to the strong minimization
+  // process applied to generators when constructing the certificate.
+  // We have to reinforce the (normal) minimization of the constraint
+  // system. The future, lazy implementation of the strong minimization
+  // process will solve this problem.
+  if (!ph.is_necessarily_closed())
+    ph.minimize();
+
+  // If the dimension of the lineality space is increasing,
+  // then the chain is stabilizing.
+  if (ph_lin_space_dim > lin_space_dim)
+    return 1;
+
+  // At this point the lineality space of the two polyhedra must have
+  // the same dimension.
+  assert(ph_lin_space_dim == lin_space_dim);
+
+  // If the number of constraints of `ph' is decreasing, then the chain
+  // is stabilizing. If it is increasing, the chain is not stabilizing.
+  // If they are equal, further investigation is needed.
+  if (ph_num_constraints != num_constraints)
+    return ph_num_constraints < num_constraints ? 1 : -1;
+
+  // If the number of points of `ph' is decreasing, then the chain
+  // is stabilizing. If it is increasing, the chain is not stabilizing.
+  // If they are equal, further investigation is needed.
+  if (ph_num_points != num_points)
+    return ph_num_points < num_points ? 1 : -1;
+
+  // The speculative optimization was not worth:
+  // compute information about rays.
+  std::vector<dimension_type> ph_num_rays_null_coord(ph.space_dim, 0);
+  for (Generator_System::const_iterator i = gs.begin(),
+	 gs_end = gs.end(); i != gs_end; ++i)
+    if (i->is_ray()) {
+      const Generator& r = *i;
+      dimension_type num_zeroes = 0;
+      for (dimension_type j = space_dim; j-- > 0; )
+	if (r.coefficient(Variable(j)) == 0)
+	  ++num_zeroes;
+      ++ph_num_rays_null_coord[num_zeroes];
+    }
+  // Compare (lexicographically) the two vectors:
+  // if ph_num_rays_null_coord < num_rays_null_coord the chain is stabilizing.
+  for (dimension_type i = 0; i < space_dim; i++)
+    if (ph_num_rays_null_coord[i] != num_rays_null_coord[i])
+      return ph_num_rays_null_coord[i] < num_rays_null_coord[i] ? 1 : -1;
+
+  // All components are equal.
+  return 0;
+}
+
+bool
+PPL::BHRZ03_Certificate::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // The dimension of the vector space.
+  const dimension_type space_dim = num_rays_null_coord.size();
+
+  if (affine_dim > space_dim) {
+#ifndef NDEBUG
+    cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+	 << endl
+	 << "the affine dimension is greater than the space dimension!"
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (lin_space_dim > affine_dim) {
+#ifndef NDEBUG
+    cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+	 << endl
+	 << "the lineality space dimension is greater than "
+	 << "the affine dimension!"
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (num_constraints < space_dim - affine_dim) {
+#ifndef NDEBUG
+    cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+	 << endl
+	 << "in a vector space of dimension `n',"
+	 << "any polyhedron of affine dimension `k'" << endl
+	 << "should have `n-k' non-redundant constraints at least."
+	 << endl
+	 << "Here space_dim = " << space_dim << ", "
+	 << "affine_dim = " << affine_dim << ", "
+	 << "but num_constraints = " << num_constraints << "!"
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (num_points == 0) {
+#ifndef NDEBUG
+    cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+	 << endl
+	 << "the generator system has no points!"
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (lin_space_dim == space_dim) {
+    // This was a universe polyhedron.
+    if (num_constraints > 0) {
+#ifndef NDEBUG
+      cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+	   << endl
+	   << "a universe polyhedron has non-redundant constraints!"
+	   << endl;
+#endif
+      return false;
+    }
+
+    if (num_points != 1) {
+#ifndef NDEBUG
+      cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+	   << endl
+	   << "a universe polyhedron has more than one non-redundant point!"
+	   << endl;
+#endif
+      return false;
+    }
+  }
+
+  // All tests passed.
+  return true;
+}
diff --git a/src/BHRZ03_Certificate.defs.hh b/src/BHRZ03_Certificate.defs.hh
new file mode 100644
index 0000000..fc02296
--- /dev/null
+++ b/src/BHRZ03_Certificate.defs.hh
@@ -0,0 +1,117 @@
+/* BHRZ03_Certificate class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BHRZ03_Certificate_defs_hh
+#define PPL_BHRZ03_Certificate_defs_hh 1
+
+#include "BHRZ03_Certificate.types.hh"
+#include "Polyhedron.types.hh"
+#include "globals.types.hh"
+#include <cassert>
+#include <vector>
+
+//! The convergence certificate for the BHRZ03 widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+
+  \note
+  Each convergence certificate has to be used together with a
+  compatible widening operator. In particular, BHRZ03_Certificate
+  can certify the convergence of both the BHRZ03 and the H79 widenings.
+*/
+class Parma_Polyhedra_Library::BHRZ03_Certificate {
+public:
+  //! Default constructor.
+  BHRZ03_Certificate();
+
+  //! Constructor: computes the certificate for \p ph.
+  BHRZ03_Certificate(const Polyhedron& ph);
+
+  //! Copy constructor.
+  BHRZ03_Certificate(const BHRZ03_Certificate& y);
+
+  //! Destructor.
+  ~BHRZ03_Certificate();
+
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+
+    Compares \p *this with \p y, using a total ordering which is a
+    refinement of the limited growth ordering relation for the
+    BHRZ03 widening.
+  */
+  int compare(const BHRZ03_Certificate& y) const;
+
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  int compare(const Polyhedron& ph) const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the certificate for
+    polyhedron \p ph is strictly smaller than \p *this.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool is_stabilizing(const Polyhedron& ph) const;
+
+  //! A total ordering on BHRZ03 certificates.
+  /*! \ingroup PPL_CXX_interface
+    This binary predicate defines a total ordering on BHRZ03 certificates
+    which is used when storing information about sets of polyhedra.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const BHRZ03_Certificate& x,
+		    const BHRZ03_Certificate& y) const;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Check if gathered information is meaningful.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool OK() const;
+
+private:
+  //! Affine dimension of the polyhedron.
+  dimension_type affine_dim;
+  //! Dimension of the lineality space of the polyhedron.
+  dimension_type lin_space_dim;
+  //! Cardinality of a non-redundant constraint system for the polyhedron.
+  dimension_type num_constraints;
+  /*! \brief
+    Number of non-redundant points in a generator system
+    for the polyhedron.
+  */
+  dimension_type num_points;
+  /*! \brief
+    A vector containing, for each index `0 <= i < space_dim',
+    the number of non-redundant rays in a generator system of the
+    polyhedron having exactly `i' null coordinates.
+  */
+  std::vector<dimension_type> num_rays_null_coord;
+};
+
+#include "BHRZ03_Certificate.inlines.hh"
+
+#endif // !defined(PPL_BHRZ03_Certificate_defs_hh)
diff --git a/src/BHRZ03_Certificate.inlines.hh b/src/BHRZ03_Certificate.inlines.hh
new file mode 100644
index 0000000..3e4277f
--- /dev/null
+++ b/src/BHRZ03_Certificate.inlines.hh
@@ -0,0 +1,62 @@
+/* BHRZ03_Certificate class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BHRZ03_Certificate_inlines_hh
+#define PPL_BHRZ03_Certificate_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+BHRZ03_Certificate::BHRZ03_Certificate()
+  : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(1),
+    num_rays_null_coord() {
+  // This is the certificate for a zero-dim universe polyhedron.
+  assert(OK());
+}
+
+inline
+BHRZ03_Certificate::BHRZ03_Certificate(const BHRZ03_Certificate& y)
+  : affine_dim(y.affine_dim), lin_space_dim(y.lin_space_dim),
+    num_constraints(y.num_constraints), num_points(y.num_points),
+    num_rays_null_coord(y.num_rays_null_coord) {
+}
+
+inline
+BHRZ03_Certificate::~BHRZ03_Certificate() {
+}
+
+inline bool
+BHRZ03_Certificate::is_stabilizing(const Polyhedron& ph) const {
+  return compare(ph) == 1;
+}
+
+inline bool
+BHRZ03_Certificate::Compare::operator()(const BHRZ03_Certificate& x,
+					const BHRZ03_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this lgo relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BHRZ03_Certificate_inlines_hh)
diff --git a/src/BHRZ03_Certificate.types.hh b/src/BHRZ03_Certificate.types.hh
new file mode 100644
index 0000000..2185260
--- /dev/null
+++ b/src/BHRZ03_Certificate.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_BHRZ03_Certificate_types_hh
+#define PPL_BHRZ03_Certificate_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class BHRZ03_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BHRZ03_Certificate_types_hh)
diff --git a/src/BUGS.cc.dist b/src/BUGS.cc.dist
new file mode 100644
index 0000000..129e104
--- /dev/null
+++ b/src/BUGS.cc.dist
@@ -0,0 +1,24 @@
+extern const char* const BUGS_array[] = {
+  "",
+  "The PPL developers encourage you to report any bugs you find to",
+  "ppl-devel at cs.unipr.it.  Here `bug' should be interpreted in its",
+  "broadest sense: outright software errors, misfeatures, bad interfaces,",
+  "missing or unclear documentation... whatever is a subject for possible",
+  "improvement.",
+  "",
+  "As far as software bugs are concerned, the best reports are those that",
+  "are reproducible.  Including (or pointing us to) code that exhibits",
+  "the reported misbehavior is the best thing you can do to help us fix",
+  "the library.  Of course, this is not always possible and we will",
+  "welcome any kind of bug report.  Anyway, you may be interested to read",
+  "http://www.chiark.greenend.org.uk/~sgtatham/bugs.html on how to report",
+  "bugs effectively.",
+  "",
+  "",
+  "KNOWN BUGS",
+  "==========",
+  "",
+  "All known bugs were resolved before the release.  It is likely that",
+  "there are still bugs in the released version.  Any bugs found after",
+  "the release will be listed at http://www.cs.unipr.it/ppl/Bugs/ .",
+  0};
diff --git a/src/Bounding_Box.cc b/src/Bounding_Box.cc
new file mode 100644
index 0000000..a9b88ce
--- /dev/null
+++ b/src/Bounding_Box.cc
@@ -0,0 +1,158 @@
+/* Bounding_Box class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "Bounding_Box.defs.hh"
+#include "Variable.defs.hh"
+#include "Constraint.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+template <typename Iterator>
+void
+PPL::Bounding_Box::CC76_widening_assign(const Bounding_Box& y,
+					Iterator first, Iterator last) {
+  for (dimension_type i = vec.size(); i-- > 0; ) {
+    Interval& x_vec_i = vec[i];
+    const Interval& y_vec_i = y.vec[i];
+
+    // Upper bound.
+    UBoundary& x_ub = x_vec_i.upper_bound();
+    ERational& x_ubb = x_ub.bound();
+    const ERational& y_ubb = y_vec_i.upper_bound().bound();
+    assert(y_ubb <= x_ubb);
+    if (y_ubb < x_ubb) {
+      Iterator k = std::lower_bound(first, last, x_ubb);
+      if (k != last) {
+	if (x_ubb < *k)
+	  x_ubb = *k;
+      }
+      else
+	x_ub = UBoundary(ERational(PLUS_INFINITY), UBoundary::OPEN);
+    }
+
+    // Lower bound.
+    LBoundary& x_lb = x_vec_i.lower_bound();
+    ERational& x_lbb = x_lb.bound();
+    const ERational& y_lbb = y_vec_i.lower_bound().bound();
+    assert(y_lbb >= x_lbb);
+    if (y_lbb > x_lbb) {
+      Iterator k = std::lower_bound(first, last, x_lbb);
+      if (k != last) {
+	if (x_lbb < *k)
+	  if (k != first)
+	    x_lbb = *--k;
+	  else
+	    x_lb = LBoundary(ERational(MINUS_INFINITY), LBoundary::OPEN);
+      }
+      else
+	x_lbb = *--k;
+    }
+  }
+}
+
+void
+PPL::Bounding_Box::CC76_widening_assign(const Bounding_Box& y) {
+  static ERational stop_points[] = {
+    ERational(-2, ROUND_NOT_NEEDED),
+    ERational(-1, ROUND_NOT_NEEDED),
+    ERational(0, ROUND_NOT_NEEDED),
+    ERational(1, ROUND_NOT_NEEDED),
+    ERational(2, ROUND_NOT_NEEDED)
+  };
+  CC76_widening_assign(y,
+		       stop_points,
+		       stop_points
+		       + sizeof(stop_points)/sizeof(stop_points[0]));
+}
+
+PPL::Constraint_System
+PPL::Bounding_Box::constraints() const {
+  Constraint_System cs;
+  dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (is_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  else if (is_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
+
+    for (dimension_type k = 0; k < space_dim; ++k) {
+      bool closed = false;
+      PPL::Coefficient n;
+      PPL::Coefficient d;
+      if (get_lower_bound(k, closed, n, d)) {
+	if (closed)
+	  cs.insert(d*Variable(k) >= n);
+	else
+	  cs.insert(d*Variable(k) > n);
+      }
+      if (get_upper_bound(k, closed, n, d)) {
+	if (closed)
+	  cs.insert(d*Variable(k) <= n);
+	else
+	  cs.insert(d*Variable(k) < n);
+      }
+    }
+  }
+  return cs;
+}
+
+/*! \relates Parma_Polyhedra_Library::Bounding_Box */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const PPL::Bounding_Box& bbox) {
+  if (bbox.is_empty()) {
+    s << "empty";
+    return s;
+  }
+  const dimension_type dimension = bbox.space_dimension();
+  for (dimension_type k = 0; k < dimension; ++k) {
+    bool closed = false;
+    PPL::Coefficient n;
+    PPL::Coefficient d;
+    if (bbox.get_lower_bound(k, closed, n, d)) {
+      s << (closed ? "[" : "(")
+	<< n;
+      if (d != 1)
+	s << "/" << d;
+      s << ", ";
+    }
+    else
+      s << "(-inf, ";
+    if (bbox.get_upper_bound(k, closed, n, d)) {
+      s << n;
+      if (d != 1)
+	s << "/" << d;
+      s << (closed ? "]" : ")");
+    }
+    else
+      s << "+inf)";
+    s << "\n";
+  }
+  return s;
+}
diff --git a/src/Bounding_Box.defs.hh b/src/Bounding_Box.defs.hh
new file mode 100644
index 0000000..c8fceda
--- /dev/null
+++ b/src/Bounding_Box.defs.hh
@@ -0,0 +1,207 @@
+/* Bounding_Box class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Bounding_Box_defs_hh
+#define PPL_Bounding_Box_defs_hh 1
+
+#include "Coefficient.types.hh"
+#include "globals.types.hh"
+#include "Coefficient.defs.hh"
+#include "Interval.defs.hh"
+#include "Constraint_System.defs.hh"
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A not necessarily closed bounding-box.
+/*! \ingroup PPL_CXX_interface
+  A Bounding_Box object represents the Cartesian product of \f$n\f$
+  not necessarily closed and possibly unbounded intervals,
+  where \f$n\f$ is the space dimension of the box.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Bounding_Box {
+public:
+  //! Constructs a universe bounding box of dimension \p num_dimensions.
+  Bounding_Box(dimension_type num_dimensions);
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns a reference the interval that bounds
+    the box on the <CODE>k</CODE>-th space dimension.
+  */
+  const Interval& operator[](dimension_type k) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is empty.
+  bool is_empty() const;
+
+  /*! \brief
+    If the <CODE>k</CODE>-th space dimension is unbounded below, returns
+    <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
+    \p closed, \p n and \p d accordingly.
+
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+
+    An undefined behavior is obtained if \p k is greater than
+    or equal to the space dimension of \p *this.
+  */
+  bool get_lower_bound(dimension_type k, bool& closed,
+		       Coefficient& n, Coefficient& d) const;
+
+  /*! \brief
+    If the <CODE>k</CODE>-th space dimension is unbounded above, returns
+    <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
+    \p closed, \p n and \p d accordingly.
+
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
+
+    An undefined behavior is obtained if \p k is greater than
+    or equal to the space dimension of \p *this.
+  */
+  bool get_upper_bound(dimension_type k, bool& closed,
+		       Coefficient& n, Coefficient& d) const;
+
+  //! Causes the box to become empty, i.e., to represent the empty set.
+  void set_empty();
+
+  /*! \brief
+    Raises the lower bound of the interval corresponding
+    to the <CODE>k</CODE>-th space dimension.
+
+    Intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension
+    with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+    with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>false</CODE>.
+    An undefined behavior is obtained if \p k is greater than or equal to
+    the space dimension of \p *this or if \p d is equal to zero.
+  */
+  void raise_lower_bound(dimension_type k, bool closed,
+			 Coefficient_traits::const_reference n,
+			 Coefficient_traits::const_reference d);
+
+  /*! \brief
+    Lowers the upper bound of the interval corresponding
+    to the <CODE>k</CODE>-th space dimension.
+
+    Intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension
+    with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+    with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE>
+    is <CODE>false</CODE>.
+    An undefined behavior is obtained if \p k is greater than or equal to
+    the space dimension of \p *this or if \p d is equal to zero.
+  */
+  void lower_upper_bound(dimension_type k, bool closed,
+			 Coefficient_traits::const_reference n,
+			 Coefficient_traits::const_reference d);
+
+  //! Returns a system of constraints corresponding to \p *this.
+  Constraint_System constraints() const;
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+    \param y
+    A bounding box that <EM>must</EM> be contained in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_widening_assign(const Bounding_Box& y);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+    \param y
+    A bounding box that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator that points to the first stop-point.
+
+    \param last
+    An iterator that points one past the last stop-point.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_widening_assign(const Bounding_Box& y,
+			    Iterator first, Iterator last);
+
+private:
+  /*! \brief
+    A vector of rational intervals, one for each dimension
+    of the vector space.
+  */
+  std::vector<Interval> vec;
+  /*! \brief
+    A boolean flag indicating emptiness of the bounding box.
+    Only meaningful when \p empty_up_to_date is <CODE>true</CODE>.
+  */
+  mutable bool empty;
+  //! Tells whether or not the flag \p empty is meaningful.
+  mutable bool empty_up_to_date;
+
+  //! Records the stop points for CC76_widening_assign(const Bounding_Box&).
+  static ERational default_stop_points[];
+};
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Bounding_Box */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+std::ostream& operator<<(std::ostream& s, const Bounding_Box& bbox);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Bounding_Box.inlines.hh"
+
+#endif // !defined(PPL_Bounding_Box_defs_hh)
diff --git a/src/Bounding_Box.inlines.hh b/src/Bounding_Box.inlines.hh
new file mode 100644
index 0000000..9f41ac0
--- /dev/null
+++ b/src/Bounding_Box.inlines.hh
@@ -0,0 +1,137 @@
+/* Bounding_Box class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Bounding_Box_inlines_hh
+#define PPL_Bounding_Box_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bounding_Box::Bounding_Box(dimension_type num_dimensions)
+  : vec(num_dimensions), empty(false), empty_up_to_date(true) {
+}
+
+inline dimension_type
+Bounding_Box::space_dimension() const {
+  return vec.size();
+}
+
+inline const Interval&
+Bounding_Box::operator[](const dimension_type k) const {
+  assert(k < vec.size());
+  return vec[k];
+}
+
+inline bool
+Bounding_Box::is_empty() const {
+  if (empty_up_to_date)
+    return empty;
+  else {
+    empty_up_to_date = true;
+    for (dimension_type k = vec.size(); k-- > 0; )
+      if (vec[k].is_empty()) {
+	empty = true;
+	return true;
+      }
+    empty = false;
+    return false;
+  }
+}
+
+inline bool
+Bounding_Box::get_lower_bound(const dimension_type k, bool& closed,
+			      Coefficient& n, Coefficient& d) const {
+  assert(k < vec.size());
+  const LBoundary& lb = vec[k].lower_bound();
+  const ERational& lr = lb.bound();
+
+  if (is_plus_infinity(lr) || is_minus_infinity(lr))
+    return false;
+
+  closed = lb.is_closed();
+  n = raw_value(lr).get_num();
+  d = raw_value(lr).get_den();
+
+  return true;
+}
+
+inline bool
+Bounding_Box::get_upper_bound(const dimension_type k, bool& closed,
+			     Coefficient& n, Coefficient& d) const {
+  assert(k < vec.size());
+  const UBoundary& ub = vec[k].upper_bound();
+  const ERational& ur = ub.bound();
+
+  if (is_plus_infinity(ur) || is_minus_infinity(ur))
+    return false;
+
+  closed = ub.is_closed();
+  n = raw_value(ur).get_num();
+  d = raw_value(ur).get_den();
+
+  return true;
+}
+
+inline void
+Bounding_Box::set_empty() {
+  for (dimension_type k = vec.size(); k-- > 0; )
+    vec[k].set_empty();
+  empty = empty_up_to_date = true;
+}
+
+inline void
+Bounding_Box::raise_lower_bound(const dimension_type k, const bool closed,
+				Coefficient_traits::const_reference n,
+				Coefficient_traits::const_reference d) {
+  assert(k < vec.size());
+  assert(d != 0);
+  mpq_class q;
+  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+  q.canonicalize();
+  vec[k].raise_lower_bound(LBoundary(ERational(q, ROUND_NOT_NEEDED),
+				     (closed
+				      ? LBoundary::CLOSED
+				      : LBoundary::OPEN)));
+  empty_up_to_date = false;
+}
+
+inline void
+Bounding_Box::lower_upper_bound(const dimension_type k, const bool closed,
+				Coefficient_traits::const_reference n,
+				Coefficient_traits::const_reference d) {
+  assert(k < vec.size());
+  assert(d != 0);
+  mpq_class q;
+  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+  q.canonicalize();
+  vec[k].lower_upper_bound(UBoundary(ERational(q, ROUND_NOT_NEEDED),
+				     (closed
+				      ? UBoundary::CLOSED
+				      : UBoundary::OPEN)));
+  empty_up_to_date = false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bounding_Box_inlines_hh)
diff --git a/src/Bounding_Box.types.hh b/src/Bounding_Box.types.hh
new file mode 100644
index 0000000..8ed42d8
--- /dev/null
+++ b/src/Bounding_Box.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Bounding_Box_types_hh
+#define PPL_Bounding_Box_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Bounding_Box;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bounding_Box_types_hh)
diff --git a/src/COPYING.cc.dist b/src/COPYING.cc.dist
new file mode 100644
index 0000000..457adbb
--- /dev/null
+++ b/src/COPYING.cc.dist
@@ -0,0 +1,342 @@
+extern const char* const COPYING_array[] = {
+  "\t\t    GNU GENERAL PUBLIC LICENSE",
+  "\t\t       Version 2, June 1991",
+  "",
+  " Copyright (C) 1989, 1991 Free Software Foundation, Inc.",
+  "                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA",
+  " Everyone is permitted to copy and distribute verbatim copies",
+  " of this license document, but changing it is not allowed.",
+  "",
+  "\t\t\t    Preamble",
+  "",
+  "  The licenses for most software are designed to take away your",
+  "freedom to share and change it.  By contrast, the GNU General Public",
+  "License is intended to guarantee your freedom to share and change free",
+  "software--to make sure the software is free for all its users.  This",
+  "General Public License applies to most of the Free Software",
+  "Foundation's software and to any other program whose authors commit to",
+  "using it.  (Some other Free Software Foundation software is covered by",
+  "the GNU Library General Public License instead.)  You can apply it to",
+  "your programs, too.",
+  "",
+  "  When we speak of free software, we are referring to freedom, 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 or use pieces of it",
+  "in new free programs; and that you know you can do these things.",
+  "",
+  "  To protect your rights, we need to make restrictions that forbid",
+  "anyone to deny you these rights or to ask you to surrender the rights.",
+  "These restrictions translate to certain responsibilities for you if you",
+  "distribute copies of the software, or if you modify it.",
+  "",
+  "  For example, if you distribute copies of such a program, whether",
+  "gratis or for a fee, you must give the recipients all the rights that",
+  "you have.  You must make sure that they, too, receive or can get the",
+  "source code.  And you must show them these terms so they know their",
+  "rights.",
+  "",
+  "  We protect your rights with two steps: (1) copyright the software, and",
+  "(2) offer you this license which gives you legal permission to copy,",
+  "distribute and/or modify the software.",
+  "",
+  "  Also, for each author's protection and ours, we want to make certain",
+  "that everyone understands that there is no warranty for this free",
+  "software.  If the software is modified by someone else and passed on, we",
+  "want its recipients to know that what they have is not the original, so",
+  "that any problems introduced by others will not reflect on the original",
+  "authors' reputations.",
+  "",
+  "  Finally, any free program is threatened constantly by software",
+  "patents.  We wish to avoid the danger that redistributors of a free",
+  "program will individually obtain patent licenses, in effect making the",
+  "program proprietary.  To prevent this, we have made it clear that any",
+  "patent must be licensed for everyone's free use or not licensed at all.",
+  "",
+  "  The precise terms and conditions for copying, distribution and",
+  "modification follow.",
+  "
",
+  "\t\t    GNU GENERAL PUBLIC LICENSE",
+  "   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION",
+  "",
+  "  0. This License applies to any program or other work which contains",
+  "a notice placed by the copyright holder saying it may be distributed",
+  "under the terms of this General Public License.  The \"Program\", below,",
+  "refers to any such program or work, and a \"work based on the Program\"",
+  "means either the Program or any derivative work under copyright law:",
+  "that is to say, a work containing the Program or a portion of it,",
+  "either verbatim or with modifications and/or translated into another",
+  "language.  (Hereinafter, translation is included without limitation in",
+  "the term \"modification\".)  Each licensee is addressed as \"you\".",
+  "",
+  "Activities other than copying, distribution and modification are not",
+  "covered by this License; they are outside its scope.  The act of",
+  "running the Program is not restricted, and the output from the Program",
+  "is covered only if its contents constitute a work based on the",
+  "Program (independent of having been made by running the Program).",
+  "Whether that is true depends on what the Program does.",
+  "",
+  "  1. You may copy and distribute verbatim copies of the Program's",
+  "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 give any other recipients of the Program a copy of this License",
+  "along with the Program.",
+  "",
+  "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 Program or any portion",
+  "of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices",
+  "    stating that you changed the files and the date of any change.",
+  "",
+  "    b) You must cause any work that you distribute or publish, that in",
+  "    whole or in part contains or is derived from the Program or any",
+  "    part thereof, to be licensed as a whole at no charge to all third",
+  "    parties under the terms of this License.",
+  "",
+  "    c) If the modified program normally reads commands interactively",
+  "    when run, you must cause it, when started running for such",
+  "    interactive use in the most ordinary way, to print or display an",
+  "    announcement including an appropriate copyright notice and a",
+  "    notice that there is no warranty (or else, saying that you provide",
+  "    a warranty) and that users may redistribute the program under",
+  "    these conditions, and telling the user how to view a copy of this",
+  "    License.  (Exception: if the Program itself is interactive but",
+  "    does not normally print such an announcement, your work based on",
+  "    the Program is not required to print an announcement.)",
+  "
",
+  "These requirements apply to the modified work as a whole.  If",
+  "identifiable sections of that work are not derived from the Program,",
+  "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 Program, 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 Program.",
+  "",
+  "In addition, mere aggregation of another work not based on the Program",
+  "with the Program (or with a work based on the Program) on a volume of",
+  "a storage or distribution medium does not bring the other work under",
+  "the scope of this License.",
+  "",
+  "  3. You may copy and distribute the Program (or a work based on it,",
+  "under Section 2) in object code or executable form under the terms of",
+  "Sections 1 and 2 above provided that you also do one of the following:",
+  "",
+  "    a) 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; or,",
+  "",
+  "    b) Accompany it with a written offer, valid for at least three",
+  "    years, to give any third party, for a charge no more than your",
+  "    cost of physically performing source distribution, a complete",
+  "    machine-readable copy of the corresponding source code, to be",
+  "    distributed under the terms of Sections 1 and 2 above on a medium",
+  "    customarily used for software interchange; or,",
+  "",
+  "    c) Accompany it with the information you received as to the offer",
+  "    to distribute corresponding source code.  (This alternative is",
+  "    allowed only for noncommercial distribution and only if you",
+  "    received the program in object code or executable form with such",
+  "    an offer, in accord with Subsection b above.)",
+  "",
+  "The source code for a work means the preferred form of the work for",
+  "making modifications to it.  For an executable work, 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 executable.  However, as a",
+  "special exception, the source code 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.",
+  "",
+  "If distribution of executable or 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 counts as",
+  "distribution of the source code, even though third parties are not",
+  "compelled to copy the source along with the object code.",
+  "
",
+  "  4. You may not copy, modify, sublicense, or distribute the Program",
+  "except as expressly provided under this License.  Any attempt",
+  "otherwise to copy, modify, sublicense or distribute the Program 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.",
+  "",
+  "  5. 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 Program or its derivative works.  These actions are",
+  "prohibited by law if you do not accept this License.  Therefore, by",
+  "modifying or distributing the Program (or any work based on the",
+  "Program), you indicate your acceptance of this License to do so, and",
+  "all its terms and conditions for copying, distributing or modifying",
+  "the Program or works based on it.",
+  "",
+  "  6. Each time you redistribute the Program (or any work based on the",
+  "Program), the recipient automatically receives a license from the",
+  "original licensor to copy, distribute or modify the Program 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 to",
+  "this License.",
+  "",
+  "  7. 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 Program at all.  For example, if a patent",
+  "license would not permit royalty-free redistribution of the Program 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 Program.",
+  "",
+  "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.",
+  "
",
+  "  8. If the distribution and/or use of the Program is restricted in",
+  "certain countries either by patents or by copyrighted interfaces, the",
+  "original copyright holder who places the Program 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.",
+  "",
+  "  9. The Free Software Foundation may publish revised and/or new versions",
+  "of the 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 Program",
+  "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 Program does not specify a version number of",
+  "this License, you may choose any version ever published by the Free Software",
+  "Foundation.",
+  "",
+  "  10. If you wish to incorporate parts of the Program into other free",
+  "programs whose distribution conditions are different, 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.",
+  "",
+  "\t\t\t    NO WARRANTY",
+  "",
+  "  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY",
+  "FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN",
+  "OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES",
+  "PROVIDE THE PROGRAM \"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 PROGRAM IS WITH YOU.  SHOULD THE",
+  "PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,",
+  "REPAIR OR CORRECTION.",
+  "",
+  "  12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER",
+  "PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE",
+  "POSSIBILITY OF SUCH DAMAGES.",
+  "",
+  "\t\t     END OF TERMS AND CONDITIONS",
+  "
",
+  "\t    How to Apply These Terms to Your New Programs",
+  "",
+  "  If you develop a new program, and you want it to be of the greatest",
+  "possible use to the public, the best way to achieve this is to make it",
+  "free software which everyone can redistribute and change under these terms.",
+  "",
+  "  To do so, attach the following notices to the program.  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.",
+  "",
+  "    <one line to give the program's name and a brief idea of what it does.>",
+  "    Copyright (C) <year>  <name of author>",
+  "",
+  "    This program is free software; you can redistribute it and/or modify",
+  "    it under the terms of the GNU General Public License as published by",
+  "    the Free Software Foundation; either version 2 of the License, or",
+  "    (at your option) any later version.",
+  "",
+  "    This program is distributed in the hope that it will be useful,",
+  "    but WITHOUT ANY WARRANTY; without even the implied warranty of",
+  "    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the",
+  "    GNU General Public License for more details.",
+  "",
+  "    You should have received a copy of the GNU General Public License",
+  "    along with this program; if not, write to the Free Software",
+  "    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA",
+  "",
+  "",
+  "Also add information on how to contact you by electronic and paper mail.",
+  "",
+  "If the program is interactive, make it output a short notice like this",
+  "when it starts in an interactive mode:",
+  "",
+  "    Gnomovision version 69, Copyright (C) year name of author",
+  "    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.",
+  "    This is free software, and you are welcome to redistribute it",
+  "    under certain conditions; type `show c' for details.",
+  "",
+  "The hypothetical commands `show w' and `show c' should show the appropriate",
+  "parts of the General Public License.  Of course, the commands you use may",
+  "be called something other than `show w' and `show c'; they could even be",
+  "mouse-clicks or menu items--whatever suits your program.",
+  "",
+  "You should also get your employer (if you work as a programmer) or your",
+  "school, if any, to sign a \"copyright disclaimer\" for the program, if",
+  "necessary.  Here is a sample; alter the names:",
+  "",
+  "  Yoyodyne, Inc., hereby disclaims all copyright interest in the program",
+  "  `Gnomovision' (which makes passes at compilers) written by James Hacker.",
+  "",
+  "  <signature of Ty Coon>, 1 April 1989",
+  "  Ty Coon, President of Vice",
+  "",
+  "This General Public License does not permit incorporating your program into",
+  "proprietary programs.  If your program is a subroutine library, you may",
+  "consider it more useful to permit linking proprietary applications with the",
+  "library.  If this is what you want to do, use the GNU Library General",
+  "Public License instead of this License.",
+  0};
diff --git a/src/CREDITS.cc.dist b/src/CREDITS.cc.dist
new file mode 100644
index 0000000..7c0bc6a
--- /dev/null
+++ b/src/CREDITS.cc.dist
@@ -0,0 +1,224 @@
+extern const char* const CREDITS_array[] = {
+  "",
+  "Authors",
+  "=======",
+  "",
+  "The Parma Polyhedra Library and its documentation is being designed,",
+  "written, debugged and improved by the following people:",
+  "",
+  "",
+  "Current core development team:",
+  "------------------------------",
+  "",
+  "  Roberto Bagnara       [1] (University of Parma)",
+  "  Patricia M. Hill      [2] (University of Leeds)",
+  "  Enea Zaffanella       [3] (University of Parma)",
+  "",
+  "",
+  "Former members of the core development team:",
+  "--------------------------------------------",
+  "",
+  "  Elisa Ricci           (former student of the University of Parma) has",
+  "                        been a major contributor to the development of",
+  "                        the PPL, up until December 2002.",
+  "",
+  "",
+  "Current contributors:",
+  "---------------------",
+  "",
+  "  Abramo Bagnara        (Opera Unica) rewrote and generalized the",
+  "                        support for checked coefficients.  He also",
+  "                        wrote the support for extended numbers and is",
+  "                        currently writing a new implementation of",
+  "                        intervals.  He also helps on other design and",
+  "                        implementation issues.",
+  "",
+  "  Andrea Cimino         (University of Parma) wrote the initial version",
+  "                        of our primal simplex solver.  He is still",
+  "                        working on its refinement and optimization.",
+  "",
+  "  Katy Dobson           [4] (University of Leeds) is working on the",
+  "                        formalization and definition of algorithms",
+  "                        for rational grids.",
+  "",
+  "  Elena Mazzi           (University of Parma) has been working on our",
+  "                        first implementation of bounded differences",
+  "                        and octagons.  She also participated in the",
+  "                        theoretical and practical work concerning",
+  "                        widening operators for weakly relational",
+  "                        domains.  She is still working on this.",
+  "",
+  "  David Merchat         [5] (University of Parma) is helping us with",
+  "                        the generation of the library's documentation",
+  "                        using Doxygen.",
+  "",
+  "  Matthew Mundell       [6] (University of Leeds) is working on the",
+  "                        implementation of rational grids.  He also",
+  "                        helps on other implementation issues.",
+  "",
+  "  Andrea Pescetti       (University of Parma) is helping with the",
+  "                        library's documentation.  Andrea was also one",
+  "                        of the four students with which the PPL",
+  "                        project started.",
+  "",
+  "  Barbara Quartieri     (University of Parma) is working on the",
+  "                        implementation of bounded differences",
+  "                        and octagons.",
+  "",
+  "  Alessandro Zaccagnini [7] (University of Parma) has helped with",
+  "                        the efficient implementation of GCD and LCM",
+  "                        for checked numbers.  He is now working on the",
+  "                        definitions of interval arithmetic operations.",
+  "                        Alessandro is always a very valuable source of",
+  "                        mathematical advice.",
+  "",
+  "",
+  "Past contributors:",
+  "------------------",
+  "",
+  "  Irene Bacchi          (University of Parma) worked on a development",
+  "                        branch where she implemented several variants of",
+  "                        algorithms, checking whether or not the set-union",
+  "                        of two polyhedra is the same as their poly-hull.",
+  "",
+  "  Danilo Bonardi        (University of Parma) worked on a development",
+  "                        branch where he experimented with the use of",
+  "                        metaprogramming techniques based on",
+  "                        \"expression templates\".  The objective of this",
+  "                        work was to check the effectiveness of these",
+  "                        techniques for moving computations from",
+  "                        run-time to compile-time.",
+  "",
+  "  Sara Bonini           (former student of the University of Parma) is",
+  "                        one of the four students with which the PPL",
+  "                        project started.",
+  "",
+  "  Giordano Fracasso     (University of Parma) wrote the initial version",
+  "                        of the support for native and checked integer",
+  "                        coefficients.",
+  "",
+  "  Maximiliano Marchesi  (University of Parma) helped to improve the",
+  "                        documentation for bounded differences.",
+  "",
+  "  Angela Stazzone       (former student of the University of Parma)",
+  "                        worked on the library's documentation.",
+  "",
+  "",
+  "  Fabio Trabucchi       (University of Parma) worked on a development",
+  "                        branch where he added serializers for all the",
+  "                        objects of the PPL.  Support for serialization",
+  "                        based on Fabio's work, will be available in a",
+  "                        future release of the library.",
+  "",
+  "  Claudio Trento        (University of Pisa) worked on an experimental",
+  "                        OCaml interface for the PPL.",
+  "",
+  "  Tatiana Zolo          (former student of the University of Parma) is",
+  "                        one of the four students with which the PPL",
+  "                        project started.",
+  "",
+  "",
+  "Thanks!",
+  "=======",
+  "",
+  "The following people have given important help to the project:",
+  "",
+  "  Lucia Alessandrini    (University of Parma) provided 4 hour-long",
+  "                        lectures on convex polyhedra for the Italian",
+  "                        authors.  This was crucial for us to acquire",
+  "                        and/or refresh the notions needed for",
+  "                        developing the PPL library.",
+  "",
+  "  Marco Comini          [8] (University of Udine) allowed us to use his",
+  "                        Mac OS X machine to work on portability to",
+  "                        that platform.",
+  "",
+  "  Bruno Haible          [9] (ILOG) made it possible (by writing the",
+  "                        AC_LIB_LINKFLAGS macro and explaining how",
+  "                        to use it) to allow the use of versions of the",
+  "                        GMP library installed into nonstandard places.",
+  "",
+  "  Bertrand Jeannet      [10] (IRISA) wrote the New Polka library [11]",
+  "                        and made it available.",
+  "",
+  "  Herve' Le Verge       (r.i.p.) wrote and published an implementation",
+  "                        [12] of the Chernikova's algorithm [13] that",
+  "                        has set the stage for subsequent",
+  "                        implementation work, including our own.",
+  "",
+  "  Francesco Logozzo     [14] (Ecole Polytechnique) helped us straighten",
+  "                        out some portability issues on Cygwin.",
+  "",
+  "  Costantino Medori     [15] (University of Parma) helped us on the",
+  "                        mathematical aspects of the development.",
+  "",
+  "  Fred Mesnard          [16] (University of La Reunion), the main author",
+  "                        of cTI [17], has worked with us at one of the",
+  "                        first applications of the PPL: the \"cTI\"",
+  "                        data-flow analyzer, which performs a linear",
+  "                        size relation analysis using a domain of",
+  "                        convex polyhedra.  The China data-flow",
+  "                        analyzer [18] uses the Parma Polyhedra Library",
+  "                        to perform the same analysis.  We have been",
+  "                        running China against an old version of cTI",
+  "                        that did not use the PPL, using them to",
+  "                        analyze the same Prolog programs.  Since that",
+  "                        systems did not share a single line of code,",
+  "                        this gave us excellent opportunities for our",
+  "                        initial testing and debugging work.",
+  "",
+  "",
+  "This work has been partly supported by the following projects and",
+  "organizations:",
+  "",
+  "  1. University of Parma's FIL scientific research project (ex 60%)",
+  "     ``Pure and Applied Mathematics'';",
+  "",
+  "  2. MURST project ``Automatic Program Certification by Abstract",
+  "     Interpretation'' [19];",
+  "",
+  "  3. MURST project ``Abstract Interpretation, Type Systems and",
+  "     Control-Flow Analysis''.",
+  "",
+  "  4. MURST project ``Automatic Aggregate- and Number-Reasoning for",
+  "     Computing: from Decision Algorithms to Constraint Programming",
+  "     with Multisets, Sets, and Maps'' [20].",
+  "",
+  "  5. MURST project ``Constraint Based Verification of Reactive",
+  "     Systems'' [21].",
+  "",
+  "  6. MURST project ``AIDA - Abstract Interpretation: Design and",
+  "     Applications'' [22].",
+  "",
+  "  7. Royal Society Joint project 2004/R1-EU (UK-Italy)",
+  "     ``Automatic Detection of Unstable Numerical Computations''.",
+  "",
+  "  8. EPSRC (UK) project EP/C520726/1",
+  "     ``Numerical Domains for Software Analysis'' [23].",
+  "",
+  "--------",
+  "",
+  " [1] http://www.cs.unipr.it/~bagnara/",
+  " [2] http://www.comp.leeds.ac.uk/hill/",
+  " [3] http://www.cs.unipr.it/~zaffanella/",
+  " [4] http://www.comp.leeds.ac.uk/katyd/",
+  " [5] http://www.cs.unipr.it/~merchat/",
+  " [6] http://www.mundell.ukfsn.org/",
+  " [7] http://www.math.unipr.it/~zaccagni/",
+  " [8] http://www.dimi.uniud.it/~comini/",
+  " [9] http://www.haible.de/bruno/",
+  "[10] http://www.irisa.fr/prive/Bertrand.Jeannet/",
+  "[11] http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html",
+  "[12] http://www.cs.unipr.it/ppl/Documentation/chernikova.c",
+  "[13] http://www.cs.unipr.it/ppl/Documentation/bibliography#LeVerge92",
+  "[14] http://www.enseignement.polytechnique.fr/profs/informatique/Francesco.Logozzo/",
+  "[15] http://www.math.unipr.it/~medori/",
+  "[16] http://www.univ-reunion.fr/~fred/",
+  "[17] http://www.cs.unipr.it/cTI/",
+  "[18] http://www.cs.unipr.it/China/",
+  "[19] http://theory.sci.univr.it/p40/",
+  "[20] http://www.cs.unipr.it/Projects/COFIN01",
+  "[21] http://www.disi.unige.it/person/DelzannoG/cover/",
+  "[22] http://www.cs.unipr.it/Projects/AIDA/",
+  "[23] http://www.comp.leeds.ac.uk/hill/linda/",
+  0};
diff --git a/src/C_Polyhedron.cc b/src/C_Polyhedron.cc
new file mode 100644
index 0000000..4dcb67b
--- /dev/null
+++ b/src/C_Polyhedron.cc
@@ -0,0 +1,71 @@
+/* C_Polyhedron class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "C_Polyhedron.defs.hh"
+#include "NNC_Polyhedron.defs.hh"
+#include "algorithms.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::C_Polyhedron::C_Polyhedron(const NNC_Polyhedron& y)
+  : Polyhedron(NECESSARILY_CLOSED, y.space_dimension(), UNIVERSE) {
+  const Constraint_System& cs = y.constraints();
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); i != cs_end; ++i) {
+    const Constraint& c = *i;
+    add_constraint(c.is_strict_inequality() ? (Linear_Expression(c) >= 0) : c);
+  }
+  assert(OK());
+}
+
+PPL::C_Polyhedron::C_Polyhedron(const Congruence_System& cgs)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       cgs.space_dimension() <= max_space_dimension()
+	       ? cgs.space_dimension()
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(cgs)",
+						 "the space dimension of cgs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+	       UNIVERSE) {
+  add_congruences(cgs);
+}
+
+PPL::C_Polyhedron::C_Polyhedron(Congruence_System& cgs)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       cgs.space_dimension() <= max_space_dimension()
+	       ? cgs.space_dimension()
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(cgs)",
+						 "the space dimension of cgs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+	       UNIVERSE) {
+  add_congruences(cgs);
+}
+
+bool
+PPL::C_Polyhedron::poly_hull_assign_if_exact(const C_Polyhedron& q) {
+  return PPL::poly_hull_assign_if_exact(*this, q);
+}
diff --git a/src/C_Polyhedron.defs.hh b/src/C_Polyhedron.defs.hh
new file mode 100644
index 0000000..7dc1d7f
--- /dev/null
+++ b/src/C_Polyhedron.defs.hh
@@ -0,0 +1,213 @@
+/* C_Polyhedron class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_C_Polyhedron_defs_hh
+#define PPL_C_Polyhedron_defs_hh 1
+
+#include "C_Polyhedron.types.hh"
+#include "NNC_Polyhedron.types.hh"
+#include "Polyhedron.defs.hh"
+
+//! A closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+    An object of the class C_Polyhedron represents a
+    <EM>topologically closed</EM> convex polyhedron
+    in the vector space \f$\Rset^n\f$.
+
+    When building a closed polyhedron starting from
+    a system of constraints, an exception is thrown if the system
+    contains a <EM>strict inequality</EM> constraint.
+    Similarly, an exception is thrown when building a closed polyhedron
+    starting from a system of generators containing a <EM>closure point</EM>.
+
+    \note
+    Such an exception will be obtained even if the system of
+    constraints (resp., generators) actually defines
+    a topologically closed subset of the vector space, i.e.,
+    even if all the strict inequalities (resp., closure points)
+    in the system happen to be redundant with respect to the
+    system obtained by removing all the strict inequality constraints
+    (resp., all the closure points).
+    In contrast, when building a closed polyhedron starting from
+    an object of the class NNC_Polyhedron,
+    the precise topological closure test will be performed.
+*/
+
+class Parma_Polyhedra_Library::C_Polyhedron : public Polyhedron {
+public:
+  //! Builds either the universe or the empty C polyhedron.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the C polyhedron;
+
+    \param kind
+    Specifies whether a universe or an empty C polyhedron should be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+
+    Both parameters are optional:
+    by default, a 0-dimension space universe C polyhedron is built.
+  */
+  explicit C_Polyhedron(dimension_type num_dimensions = 0,
+			Degenerate_Element kind = UNIVERSE);
+
+  //! Builds a C polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of constraints contains strict inequalities.
+  */
+  explicit C_Polyhedron(const Constraint_System& cs);
+
+  //! Builds a C polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of constraints contains strict inequalities.
+  */
+  explicit C_Polyhedron(Constraint_System& cs);
+
+  //! Builds a C polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points,
+    or if it contains closure points.
+  */
+  explicit C_Polyhedron(const Generator_System& gs);
+
+  //! Builds a C polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points,
+    or if it contains closure points.
+  */
+  explicit C_Polyhedron(Generator_System& gs);
+
+  //! Builds a C polyhedron from a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+  */
+  explicit C_Polyhedron(const Congruence_System& cgs);
+
+  //! Builds an C polyhedron recycling a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence
+    system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+  */
+  explicit C_Polyhedron(Congruence_System& cgs);
+
+  /*! \brief
+    Builds a C polyhedron representing the topological closure
+    of the NNC polyhedron \p y.
+  */
+  explicit C_Polyhedron(const NNC_Polyhedron& y);
+
+  //! Builds a C polyhedron out of a generic, interval-based bounding box.
+  /*!
+    For a description of the methods that should be provided by
+    the template class Box, see the documentation of the protected method:
+      template \<typename Box\>
+      Polyhedron::Polyhedron(Topology topol, const Box& box);
+
+    \param box
+    The bounding box representing the polyhedron to be built;
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one from the other
+    constructors.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum allowed
+    space dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p box has intervals that are not topologically closed
+    (i.e., having some finite but open bounds).
+  */
+  template <typename Box>
+  C_Polyhedron(const Box& box, From_Bounding_Box dummy);
+
+  //! Ordinary copy-constructor.
+  C_Polyhedron(const C_Polyhedron& y);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  C_Polyhedron& operator=(const C_Polyhedron& y);
+
+  //! Assigns to \p *this the topological closure of the NNC polyhedron \p y.
+  C_Polyhedron& operator=(const NNC_Polyhedron& y);
+
+  //! Destructor.
+  ~C_Polyhedron();
+
+  /*! \brief
+    If the poly-hull of \p *this and \p y is exact it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool poly_hull_assign_if_exact(const C_Polyhedron& y);
+
+  //! Same as poly_hull_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const C_Polyhedron& y);
+};
+
+#include "C_Polyhedron.inlines.hh"
+
+#endif // !defined(PPL_C_Polyhedron_defs_hh)
diff --git a/src/C_Polyhedron.inlines.hh b/src/C_Polyhedron.inlines.hh
new file mode 100644
index 0000000..75efd0d
--- /dev/null
+++ b/src/C_Polyhedron.inlines.hh
@@ -0,0 +1,135 @@
+/* C_Polyhedron class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_C_Polyhedron_inlines_hh
+#define PPL_C_Polyhedron_inlines_hh 1
+
+#include <algorithm>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+C_Polyhedron::C_Polyhedron(dimension_type num_dimensions,
+			   Degenerate_Element kind)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       num_dimensions <= max_space_dimension()
+	       ? num_dimensions
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(n, k)",
+						 "n exceeds the maximum "
+						 "allowed space dimension"),
+		  num_dimensions),
+	       kind) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Constraint_System& cs)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       cs.space_dimension() <= max_space_dimension()
+	       ? cs
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(cs)",
+						 "the space dimension of cs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), cs)) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Constraint_System& cs)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       cs.space_dimension() <= max_space_dimension()
+	       ? cs
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(cs)",
+						 "the space dimension of cs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), cs)) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Generator_System& gs)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       gs.space_dimension() <= max_space_dimension()
+	       ? gs
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(cs)",
+						 "the space dimension of gs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), gs)){
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Generator_System& gs)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       gs.space_dimension() <= max_space_dimension()
+	       ? gs
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(cs)",
+						 "the space dimension of gs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), gs)){
+}
+
+template <typename Box>
+inline
+C_Polyhedron::C_Polyhedron(const Box& box, From_Bounding_Box)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       box.space_dimension() <= max_space_dimension()
+	       ? box
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(box): ",
+						 "the space dimension of box "
+						 "exceeds the maximum allowed "
+						 "space dimension"), box)) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const C_Polyhedron& y)
+  : Polyhedron(y) {
+}
+
+inline C_Polyhedron&
+C_Polyhedron::operator=(const C_Polyhedron& y) {
+  Polyhedron::operator=(y);
+  return *this;
+}
+
+inline C_Polyhedron&
+C_Polyhedron::operator=(const NNC_Polyhedron& y) {
+  C_Polyhedron c_y(y);
+  swap(c_y);
+  return *this;
+}
+
+inline
+C_Polyhedron::~C_Polyhedron() {
+}
+
+inline bool
+C_Polyhedron::upper_bound_assign_if_exact(const C_Polyhedron& y) {
+  return poly_hull_assign_if_exact(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_C_Polyhedron_inlines_hh)
diff --git a/src/C_Polyhedron.types.hh b/src/C_Polyhedron.types.hh
new file mode 100644
index 0000000..b048063
--- /dev/null
+++ b/src/C_Polyhedron.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_C_Polyhedron_types_hh
+#define PPL_C_Polyhedron_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class C_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_C_Polyhedron_types_hh)
diff --git a/src/Checked_Number.cc b/src/Checked_Number.cc
new file mode 100644
index 0000000..58b7ba9
--- /dev/null
+++ b/src/Checked_Number.cc
@@ -0,0 +1,89 @@
+/* Checked_Number class implementation
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "Checked_Number.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+Minus_Infinity MINUS_INFINITY;
+Plus_Infinity PLUS_INFINITY;
+Not_A_Number NOT_A_NUMBER;
+
+void
+throw_result_exception(Result r) {
+  switch (r) {
+  case V_LT:
+    throw std::logic_error("Exact result is less than computed one.");
+  case V_LE:
+    throw std::logic_error("Exact result is less than or equal to "
+			   "computed one.");
+  case V_GT:
+    throw std::logic_error("Exact result is greater than computed one.");
+  case V_GE:
+    throw std::logic_error("Exact result is greater than or equal to "
+			   "computed one.");
+  case V_NE:
+    throw std::logic_error("Exact result is less than or greater than "
+			   "computed one.");
+  case V_LGE:
+    throw std::logic_error("Exact result is less than, greater than or "
+			   "equal to computed one.");
+  case VC_MINUS_INFINITY:
+    throw std::overflow_error("Minus infinity.");
+  case V_NEG_OVERFLOW:
+    throw std::overflow_error("Negative overflow.");
+  case V_UNKNOWN_NEG_OVERFLOW:
+    throw std::overflow_error("Unknown result due to negative overflow.");
+  case VC_PLUS_INFINITY:
+    throw std::overflow_error("Plus infinity.");
+  case V_POS_OVERFLOW:
+    throw std::overflow_error("Positive overflow.");
+  case V_UNKNOWN_POS_OVERFLOW:
+    throw std::overflow_error("Unknown result due to positive overflow.");
+  case V_CVT_STR_UNK:
+    throw std::domain_error("Invalid numeric string.");
+  case V_DIV_ZERO:
+    throw std::domain_error("Division by zero.");
+  case V_INF_ADD_INF:
+    throw std::domain_error("Infinities addition.");
+  case V_INF_DIV_INF:
+    throw std::domain_error("Infinities division.");
+  case V_INF_MOD:
+    throw std::domain_error("Remainder of division of infinity.");
+  case V_INF_MUL_ZERO:
+    throw std::domain_error("Multiplication of infinity and zero.");
+  case V_INF_SUB_INF:
+    throw std::domain_error("Subtraction of infinities.");
+  case V_MOD_ZERO:
+    throw std::domain_error("Remainder of division by zero.");
+  case V_SQRT_NEG:
+    throw std::domain_error("Square root of negative number.");
+  case V_UNORD_COMP:
+    throw std::domain_error("Unordered comparison.");
+  default:
+    throw std::logic_error("Unexpected result.");
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
diff --git a/src/Checked_Number.defs.hh b/src/Checked_Number.defs.hh
new file mode 100644
index 0000000..ca73522
--- /dev/null
+++ b/src/Checked_Number.defs.hh
@@ -0,0 +1,913 @@
+/* Checked_Number class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Checked_Number_defs_hh
+#define PPL_Checked_Number_defs_hh 1
+
+#include "Checked_Number.types.hh"
+#include "checked.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Checked_Number_Transparent_Policy {
+  //! Checks for overflowed result.
+  static const int check_overflow = 0;
+
+  //! Checks for attempts to add infinities with different sign.
+  static const int check_inf_add_inf = 0;
+
+  //! Checks for attempts to sub infinities with same sign.
+  static const int check_inf_sub_inf = 0;
+
+  //! Checks for attempts to mul infinities by zero.
+  static const int check_inf_mul_zero = 0;
+
+  //! Checks for attempts to divide by zero.
+  static const int check_div_zero = 0;
+
+  //! Checks for attempts to divide infinities.
+  static const int check_inf_div_inf = 0;
+
+  //! Checks for attempts to compute remainder of infinities.
+  static const int check_inf_mod = 0;
+
+  //! Checks for attempts to take the square root of a negative number.
+  static const int check_sqrt_neg = 0;
+
+  //! Handles not-a-number special value.
+  static const int handle_nan = 0;
+
+  //! Handles infinity special values.
+  static const int handle_infinity = 0;
+
+  //! Representation is identical to primitive.
+  static const int convertible = 1;
+
+  //! Checks for FPU inexact result.
+  static const int fpu_check_inexact = 0;
+
+  //! Checks for NaN arguments
+  static const int check_nan_args = 0;
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Checked_Number_Default_Policy {
+  static const int check_overflow = 1;
+  static const int check_inf_add_inf = 0;
+  static const int check_inf_sub_inf = 0;
+  static const int check_inf_mul_zero = 0;
+  static const int check_div_zero = 0;
+  static const int check_inf_div_inf = 0;
+  static const int check_inf_mod = 0;
+  static const int check_sqrt_neg = 0;
+  static const int handle_nan = 0;
+  static const int handle_infinity = 0;
+  static const int convertible = 1;
+  static const int fpu_check_inexact = 0;
+  static const int check_nan_args = 1;
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Extended_Number_Policy {
+  static const int check_overflow = 1;
+  static const int check_inf_add_inf = 0;
+  static const int check_inf_sub_inf = 0;
+  static const int check_inf_mul_zero = 0;
+  static const int check_div_zero = 0;
+  static const int check_inf_div_inf = 0;
+  static const int check_inf_mod = 0;
+  static const int check_sqrt_neg = 0;
+  static const int handle_nan = 1;
+  static const int handle_infinity = 1;
+  // Don't uncomment the following.
+  // The compile time error on conversions is the expected behaviour.
+  // static const int convertible = 0;
+#ifdef DEBUG_ROUND_NOT_NEEDED
+  static const int fpu_check_inexact = 1;
+#else
+  static const int fpu_check_inexact = 0;
+#endif
+  static const int check_nan_args = 1;
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR_INF = ROUND_NOT_NEEDED;
+  static const Rounding_Dir ROUND_DEFAULT_ASSIGN_INF = ROUND_NOT_NEEDED;
+  // Don't uncomment the following.
+  // The compile time error is the expected behaviour.
+  // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_UP;
+  static void handle_result(Result r);
+};
+
+typedef Checked::Check_Overflow_Policy Default_To_Policy;
+typedef Checked_Number_Transparent_Policy Default_From_Policy;
+
+template <typename T>
+struct Native_Checked_From_Wrapper {
+  typedef Default_From_Policy Policy;
+  static const T& raw_value(const T& v) {
+    return v;
+  }
+};
+
+template <typename T, typename P>
+struct Native_Checked_From_Wrapper<Checked_Number<T, P> > {
+  typedef P Policy;
+  static const T& raw_value(const Checked_Number<T, P>& v) {
+    return v.raw_value();
+  }
+};
+
+template <typename T>
+struct Native_Checked_To_Wrapper {
+  typedef Default_To_Policy Policy;
+  static T& raw_value(T& v) {
+    return v;
+  }
+};
+
+template <typename T, typename P>
+struct Native_Checked_To_Wrapper<Checked_Number<T, P> > {
+  typedef P Policy;
+  static T& raw_value(Checked_Number<T, P>& v) {
+    return v.raw_value();
+  }
+};
+
+//! A wrapper for numeric types implementing a given policy.
+/*! \ingroup PPL_CXX_interface
+  The wrapper and related functions implement an interface which is common
+  to all kinds of coefficient types, therefore allowing for a uniform
+  coding style. This class also implements the policy encoded by the
+  second template parameter. The default policy is to perform the detection
+  of overflow errors.
+*/
+template <typename T, typename Policy>
+class Checked_Number {
+public:
+
+  //! \name Constructors
+  //@{
+
+  //! Default constructor.
+  Checked_Number();
+
+  //! Copy-constructor.
+  Checked_Number(const Checked_Number& y);
+
+  //! Direct initialization from a Checked_Number and rounding mode.
+  template <typename From, typename From_Policy>
+  Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed char and rounding mode.
+  Checked_Number(const signed char y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed short and rounding mode.
+  Checked_Number(const signed short y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed int and rounding mode.
+  Checked_Number(const signed int y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed long and rounding mode.
+  Checked_Number(const signed long y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed long long and rounding mode.
+  Checked_Number(const signed long long y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned char and rounding mode.
+  Checked_Number(const unsigned char y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned short and rounding mode.
+  Checked_Number(const unsigned short y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned int and rounding mode.
+  Checked_Number(const unsigned int y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned long and rounding mode.
+  Checked_Number(const unsigned long y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned long long and rounding mode.
+  Checked_Number(const unsigned long long y, Rounding_Dir dir);
+
+#if PPL_SUPPORTED_FLOAT
+  //! Direct initialization from a float and rounding mode.
+  Checked_Number(const float y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+  //! Direct initialization from a double and rounding mode.
+  Checked_Number(const double y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+  //! Direct initialization from a long double and rounding mode.
+  Checked_Number(const long double y, Rounding_Dir dir);
+#endif
+
+  //! Direct initialization from a rational and rounding mode.
+  Checked_Number(const mpq_class& y, Rounding_Dir dir);
+
+  //! Direct initialization from an unbounded integer and rounding mode.
+  Checked_Number(const mpz_class& y, Rounding_Dir dir);
+
+  //! Direct initialization from a C string and rounding mode.
+  Checked_Number(const char* y, Rounding_Dir dir);
+
+  //! Direct initialization from minus infinity and rounding mode.
+  Checked_Number(const Minus_Infinity& y, Rounding_Dir dir);
+
+  //! Direct initialization from plus infinity and rounding mode.
+  Checked_Number(const Plus_Infinity& y, Rounding_Dir dir);
+
+  //! Direct initialization from NAN and rounding mode.
+  Checked_Number(const Not_A_Number& y, Rounding_Dir dir);
+
+  //! Direct initialization from a Checked_Number, default rounding mode.
+  template <typename From, typename From_Policy>
+  explicit Checked_Number(const Checked_Number<From, From_Policy>& y);
+
+  //! Direct initialization from a signed char, default rounding mode.
+  Checked_Number(const signed char y);
+
+  //! Direct initialization from a signed short, default rounding mode.
+  Checked_Number(const signed short y);
+
+  //! Direct initialization from a signed int, default rounding mode.
+  Checked_Number(const signed int y);
+
+  //! Direct initialization from a signed long, default rounding mode.
+  Checked_Number(const signed long y);
+
+  //! Direct initialization from a signed long long, default rounding mode.
+  Checked_Number(const signed long long y);
+
+  //! Direct initialization from an unsigned char, default rounding mode.
+  Checked_Number(const unsigned char y);
+
+  //! Direct initialization from an unsigned short, default rounding mode.
+  Checked_Number(const unsigned short y);
+
+  //! Direct initialization from an unsigned int, default rounding mode.
+  Checked_Number(const unsigned int y);
+
+  //! Direct initialization from an unsigned long, default rounding mode.
+  Checked_Number(const unsigned long y);
+
+  //! Direct initialization from an unsigned long long, default rounding mode.
+  Checked_Number(const unsigned long long y);
+
+  //! Direct initialization from a float, default rounding mode.
+  Checked_Number(const float y);
+
+  //! Direct initialization from a double, default rounding mode.
+  Checked_Number(const double y);
+
+  //! Direct initialization from a long double, default rounding mode.
+  Checked_Number(const long double y);
+
+  //! Direct initialization from a rational, default rounding mode.
+  Checked_Number(const mpq_class& y);
+
+  //! Direct initialization from an unbounded integer, default rounding mode.
+  Checked_Number(const mpz_class& y);
+
+  //! Direct initialization from a C string, default rounding mode.
+  Checked_Number(const char* y);
+
+  //! Direct initialization from minus infinity, default rounding mode.
+  Checked_Number(const Minus_Infinity& y);
+
+  //! Direct initialization from plus infinity, default rounding mode.
+  Checked_Number(const Plus_Infinity& y);
+
+  //! Direct initialization from NAN, default rounding mode.
+  Checked_Number(const Not_A_Number& y);
+
+  //@} // Constructors
+
+  //! \name Accessors and Conversions
+  //@{
+
+  //! Conversion operator: returns a copy of the underlying numeric value.
+  operator T() const;
+
+  //! Returns a reference to the underlying numeric value.
+  T& raw_value();
+
+  //! Returns a const reference to the underlying numeric value.
+  const T& raw_value() const;
+
+  //@} // Accessors and Conversions
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Classifies *this.
+  /*!
+    Returns the appropriate Result characterizing:
+    - whether \p *this is NAN,
+      if \p nan is <CODE>true</CODE>;
+    - whether \p *this is a (positive or negative) infinity,
+      if \p inf is <CODE>true</CODE>;
+    - the sign of \p *this,
+      if \p sign is <CODE>true</CODE>.
+  */
+  Result classify(bool nan = true, bool inf = true, bool sign = true) const;
+
+  //! \name Assignment Operators
+  //@{
+
+  //! Assignment operator.
+  Checked_Number& operator=(const Checked_Number& y);
+
+  //! Assignment operator.
+  template <typename From, typename From_Policy>
+  Checked_Number& operator=(const Checked_Number<From, From_Policy>& y);
+
+  //! Assignment operator.
+  template <typename From>
+  Checked_Number& operator=(const From& y);
+
+  //! Assignment operator.
+  Checked_Number& operator=(const Not_A_Number& y);
+
+  //! Assignment operator.
+  Checked_Number& operator=(const Minus_Infinity& y);
+
+  //! Assignment operator.
+  Checked_Number& operator=(const Plus_Infinity& y);
+
+  //! Add and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator+=(const Checked_Number<T, From_Policy>& y);
+
+  //! Add and assign operator.
+  Checked_Number& operator+=(const T& y);
+
+  //! Add and assign operator.
+  template <typename From, typename From_Policy>
+  Checked_Number& operator+=(const Checked_Number<From, From_Policy>& y);
+
+  template <typename From>
+  Checked_Number& operator+=(const From& y);
+
+  //! Subtract and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator-=(const Checked_Number<T, From_Policy>& y);
+
+  //! Subtract and assign operator.
+  Checked_Number& operator-=(const T& y);
+
+  //! Subtract and assign operator.
+  template <typename From, typename From_Policy>
+  Checked_Number& operator-=(const Checked_Number<From, From_Policy>& y);
+
+  //! Subtract and assign operator.
+  template <typename From>
+  Checked_Number& operator-=(const From& y);
+
+  //! Multiply and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator*=(const Checked_Number<T, From_Policy>& y);
+
+  //! Multiply and assign operator.
+  Checked_Number& operator*=(const T& y);
+  template <typename From, typename From_Policy>
+
+  //! Multiply and assign operator.
+  Checked_Number& operator*=(const Checked_Number<From, From_Policy>& y);
+
+  //! Multiply and assign operator.
+  template <typename From>
+  Checked_Number& operator*=(const From& y);
+
+  //! Divide and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator/=(const Checked_Number<T, From_Policy>& y);
+
+  //! Divide and assign operator.
+  Checked_Number& operator/=(const T& y);
+
+  //! Divide and assign operator.
+  template <typename From, typename From_Policy>
+  Checked_Number& operator/=(const Checked_Number<From, From_Policy>& y);
+
+  //! Divide and assign operator.
+  template <typename From>
+  Checked_Number& operator/=(const From& y);
+
+  //! Compute remainder and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator%=(const Checked_Number<T, From_Policy>& y);
+
+  //! Compute remainder and assign operator.
+  Checked_Number& operator%=(const T& y);
+
+  //! Compute remainder and assign operator.
+  template <typename From, typename From_Policy>
+  Checked_Number& operator%=(const Checked_Number<From, From_Policy>& y);
+
+  //! Compute remainder and assign operator.
+  template <typename From>
+  Checked_Number& operator%=(const From& y);
+
+  //@} // Assignment Operators
+
+
+  //! \name Increment and Decrement Operators
+  //@{
+
+  //! Pre-increment operator.
+  Checked_Number& operator++();
+
+  //! Post-increment operator.
+  Checked_Number  operator++(int);
+
+  //! Pre-decrement operator.
+  Checked_Number& operator--();
+
+  //! Post-decrement operator.
+  Checked_Number  operator--(int);
+
+  //@} // Increment and Decrement Operators
+
+private:
+  //! The underlying numeric value.
+  T v;
+};
+
+template <typename T, typename Policy>
+bool is_not_a_number(const Checked_Number<T, Policy>& x);
+template <typename T, typename Policy>
+bool is_minus_infinity(const Checked_Number<T, Policy>& x);
+template <typename T, typename Policy>
+bool is_plus_infinity(const Checked_Number<T, Policy>& x);
+
+template <typename To>
+Result assign_r(To& to, const Minus_Infinity& x, Rounding_Dir dir);
+template <typename To>
+Result assign_r(To& to, const Plus_Infinity& x, Rounding_Dir dir);
+template <typename To>
+Result assign_r(To& to, const Not_A_Number& x, Rounding_Dir dir);
+template <typename To>
+Result assign_r(To& to, const char* x, Rounding_Dir dir);
+template <typename To, typename To_Policy>
+Result assign_r(To& to, char* x, Rounding_Dir dir);
+
+#define FUNC1(name) \
+template <typename To, typename From> \
+Result name(To& to, const From& x, Rounding_Dir dir);
+
+FUNC1(assign_r)
+FUNC1(neg_assign_r)
+FUNC1(abs_assign_r)
+FUNC1(sqrt_assign_r)
+
+#undef FUNC1
+
+#define FUNC1(name) \
+template <typename To, typename From> \
+Result name(To& to, const From& x, int exp, Rounding_Dir dir);
+
+FUNC1(mul2exp_assign_r)
+FUNC1(div2exp_assign_r)
+
+#undef FUNC1
+
+#define FUNC2(name) \
+template <typename To, typename From1, typename From2> \
+Result name(To& to, const From1& x, const From2& y, Rounding_Dir dir);
+
+FUNC2(add_assign_r)
+FUNC2(sub_assign_r)
+FUNC2(mul_assign_r)
+FUNC2(div_assign_r)
+FUNC2(rem_assign_r)
+FUNC2(gcd_assign_r)
+FUNC2(lcm_assign_r)
+FUNC2(add_mul_assign_r)
+FUNC2(sub_mul_assign_r)
+
+#undef FUNC2
+
+#define FUNC4(name) \
+template <typename To1, typename From1, typename From2,		\
+	  typename To2, typename To3>				\
+Result name(To1& to, const From1& x, const From2& y,		\
+	    To2& s, To3& t, Rounding_Dir dir);
+
+FUNC4(gcdext_assign_r)
+
+#undef FUNC4
+
+//! Swaps \p *this with \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y);
+
+//! \name Accessor Functions
+//@{
+
+//! Returns a const reference to the underlying native integer value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+const T&
+raw_value(const Checked_Number<T, Policy>& x);
+
+//! Returns a reference to the underlying native integer value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+T&
+raw_value(Checked_Number<T, Policy>& x);
+
+//@} // Accessor Functions
+
+//! \name Memory Size Inspection Functions
+//@{
+
+//! Returns the total size in bytes of the memory occupied by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+size_t
+total_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//! Returns the size in bytes of the memory managed by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+size_t
+external_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//@} // Memory Size Inspection Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Unary plus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x);
+
+//! Unary minus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x its negation.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+add_mul_assign(Checked_Number<T, Policy>& x,
+	       const Checked_Number<T, Policy>& y,
+	       const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+sub_mul_assign(Checked_Number<T, Policy>& x,
+	       const Checked_Number<T, Policy>& y,
+	       const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcd_assign(Checked_Number<T, Policy>& x,
+	   const Checked_Number<T, Policy>& y,
+	   const Checked_Number<T, Policy>& z);
+
+/*! \brief
+  Assigns to \p x the greatest common divisor of \p y and \p z,
+  setting \p s and \p t such that s*y + t*z = x = gcd(y, z).
+*/
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcdext_assign(Checked_Number<T, Policy>& x,
+	      const Checked_Number<T, Policy>& y,
+	      const Checked_Number<T, Policy>& z,
+	      Checked_Number<T, Policy>& s,
+	      Checked_Number<T, Policy>& t);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+lcm_assign(Checked_Number<T, Policy>& x,
+	   const Checked_Number<T, Policy>& y,
+	   const Checked_Number<T, Policy>& z);
+
+/*! \brief
+  If \p z divides \p y, assigns to \p x the quotient of the integer
+  division of \p y and \p z.
+
+  \relates Checked_Number
+  The behavior is undefined if \p z does not divide \p y.
+*/
+template <typename T, typename Policy>
+void
+exact_div_assign(Checked_Number<T, Policy>& x,
+		 const Checked_Number<T, Policy>& y,
+		 const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void sqrt_assign(Checked_Number<T, Policy>& x,
+		 const Checked_Number<T, Policy>& y);
+
+//@} // Arithmetic Operators
+
+
+//! \name Relational Operators and Comparison Functions
+//@{
+
+//! Equality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+bool
+operator==(const Checked_Number<T1, Policy1>& x,
+	   const Checked_Number<T2, Policy2>& y);
+
+//! Disequality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+bool
+operator!=(const Checked_Number<T1, Policy1>& x,
+	   const Checked_Number<T2, Policy2>& y);
+
+//! Greater than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+bool
+operator>=(const Checked_Number<T1, Policy1>& x,
+	   const Checked_Number<T2, Policy2>& y);
+
+//! Greater than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+bool
+operator>(const Checked_Number<T1, Policy1>& x,
+	  const Checked_Number<T2, Policy2>& y);
+
+//! Less than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+bool
+operator<=(const Checked_Number<T1, Policy1>& x,
+	   const Checked_Number<T2, Policy2>& y);
+
+//! Less than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+bool
+operator<(const Checked_Number<T1, Policy1>& x,
+	  const Checked_Number<T2, Policy2>& y);
+
+/*! \brief
+  Returns \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether the value
+  of \p x is negative, zero or positive, respectively.
+
+  \relates Checked_Number
+*/
+template <typename T, typename Policy>
+int
+sgn(const Checked_Number<T, Policy>& x);
+
+/*! \brief
+  Returns a negative, zero or positive value depending on whether
+  \p x is lower than, equal to or greater than \p y, respectively.
+
+  \relates Checked_Number
+*/
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+int
+cmp(const Checked_Number<T1, Policy1>& x,
+    const Checked_Number<T2, Policy2>& y);
+
+//@} // Relational Operators and Comparison Functions
+
+//! \name Input-Output Operators
+//@{
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Result
+output(std::ostream& os,
+       const Checked_Number<T, Policy>& x,
+       const Numeric_Format& fmt,
+       Rounding_Dir dir);
+
+//! Output operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x);
+
+//! Input function.
+/*!
+  \relates Checked_Number
+
+  \param is
+  Input stream to read from;
+
+  \param x
+  Number (possibly extended) to assign to in case of successful reading;
+
+  \param dir
+  Rounding mode to be applied.
+
+  \return
+  Result of the input operation.  Success, success with imprecision,
+  overflow, parsing error: all possibilities are taken into account,
+  checked for, and properly reported.
+
+  This function attempts reading a (possibly extended) number from the given
+  stream \p is, possibly rounding as specified by \p dir, assigning the result
+  to \p x upon success, and returning the appropriate Result.
+
+  The input syntax allows the specification of:
+  - plain base-10 integer numbers as <CODE>34976098</CODE>,
+    <CODE>-77</CODE> and <CODE>+13</CODE>;
+  - base-10 integer numbers in scientific notation as <CODE>15e2</CODE>
+    and <CODE>15*^2</CODE> (both meaning \f$15 \cdot 10^2 = 1500\f$),
+    <CODE>9200e-2</CODE> and <CODE>-18*^+11111111111111111</CODE>;
+  - base-10 rational numbers in fraction notation as
+    <CODE>15/3</CODE> and <CODE>15/-3</CODE>;
+  - base-10 rational numbers in fraction/scientific notation as
+    <CODE>15/30e-1</CODE> (meaning \f$5\f$) and <CODE>15*^-3/29e2</CODE>
+    (meaning \f$3/580000\f$);
+  - base-10 rational numbers in floating point notation as
+    <CODE>71.3</CODE> (meaning \f$713/10\f$) and
+    <CODE>-0.123456</CODE> (meaning \f$-1929/15625\f$);
+  - base-10 rational numbers in floating point scientific notation as
+    <CODE>2.2e-1</CODE> (meaning \f$11/50\f$) and <CODE>-2.20001*^+3</CODE>
+    (meaning \f$-220001/100\f$);
+  - integers and rationals (in fractional, floating point and scientific
+    notations) specified by using Mathematica-style bases, in the range
+    from 2 to 36, as
+    <CODE>2^^11</CODE> (meaning \f$3\f$),
+    <CODE>36^^z</CODE> (meaning \f$35\f$),
+    <CODE>36^^xyz</CODE> (meaning \f$44027\f$),
+    <CODE>2^^11.1</CODE> (meaning \f$7/2\f$),
+    <CODE>10^^2e3</CODE> (meaning \f$2000\f$),
+    <CODE>8^^2e3</CODE> (meaning \f$1024\f$),
+    <CODE>8^^2.1e3</CODE> (meaning \f$1088\f$),
+    <CODE>8^^20402543.120347e7</CODE> (meaning \f$9073863231288\f$),
+    <CODE>8^^2.1</CODE> (meaning \f$17/8\f$);
+    note that the base and the exponent are always written as plain
+    base-10 integer numbers; also, when an ambiguity may arise, the
+    character <CODE>e</CODE> is interpreted as a digit, so that
+    <CODE>16^^1e2</CODE> (meaning \f$482\f$) is different from
+    <CODE>16^^1*^2</CODE> (meaning \f$256\f$);
+  - the C-style hexadecimal prefix <CODE>0x</CODE> is interpreted as
+    the Mathematica-style prefix <CODE>16^^</CODE>;
+  - special values like <CODE>inf</CODE> and <CODE>+inf</CODE>
+    (meaning \f$+\infty\f$), <CODE>-inf</CODE> (meaning \f$-\infty\f$),
+    and <CODE>nan</CODE> (meaning "not a number").
+
+  The rationale behind the accepted syntax can be summarized as follows:
+  - if the syntax is accepted by Mathematica, then this function
+    accepts it with the same semantics;
+  - if the syntax is acceptable as standard C++ integer or floating point
+    literal (except for octal notation and type suffixes, which are not
+    supported), then this function accepts it with the same semantics;
+  - natural extensions of the above are accepted with the natural
+    extensions of the semantics;
+  - special values are accepted.
+
+  Valid syntax is more formally and completely specified by the
+  following grammar, with the additional provisos that everything is
+  <EM>case insensitive</EM>, that the syntactic category
+  <CODE>BDIGIT</CODE> is further restricted by the current base
+  and that for all bases above 14, any <CODE>e</CODE> is always
+  interpreted as a digit and never as a delimiter for the exponent part
+  (if such a delimiter is desired, it has to be written as <CODE>*^</CODE>).
+
+\code
+number	: NAN					INF	: 'inf'
+	| SIGN INF					;
+	| INF
+	| num					NAN	: 'nan'
+	| num DIV num					;
+	;
+						SIGN	: '-'
+num     : unum						| '+'
+        | SIGN unum					;
+
+unum	: unum1					EXP	: 'e'
+	| HEX unum1					| '*^'
+	| base BASE unum1				;
+	;
+						POINT	: '.'
+unum1	: mantissa					;
+	| mantissa EXP exponent
+	;					DIV	: '/'
+							;
+mantissa: bdigits
+        | POINT bdigits				MINUS	: '-'
+	| bdigits POINT					;
+	| bdigits POINT bdigits
+	;					PLUS	: '+'
+						;
+exponent: SIGN digits
+	| digits				HEX	: '0x'
+	;					;
+
+bdigits : BDIGIT				BASE	: '^^'
+	| bdigits BDIGIT				;
+	;
+						DIGIT   : '0' .. '9'
+digits  : DIGIT						;
+	| digits DIGIT
+	;					BDIGIT  : '0' .. '9'
+							| 'a' .. 'z'
+							;
+\endcode
+*/
+template <typename T, typename Policy>
+Result
+input(std::istream& is, Checked_Number<T, Policy>& x, Rounding_Dir dir);
+
+//! Input operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::istream&
+operator>>(std::istream& is, Checked_Number<T, Policy>& x);
+
+//@} // Input-Output Operators
+
+void throw_result_exception(Result r);
+
+template <typename T>
+T
+plus_infinity();
+
+template <typename T>
+T
+minus_infinity();
+
+template <typename T>
+T
+not_a_number();
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Checked_Number.inlines.hh"
+#include "checked_numeric_limits.hh"
+
+#endif // !defined(PPL_Checked_Number_defs_hh)
diff --git a/src/Checked_Number.inlines.hh b/src/Checked_Number.inlines.hh
new file mode 100644
index 0000000..0445da2
--- /dev/null
+++ b/src/Checked_Number.inlines.hh
@@ -0,0 +1,820 @@
+/* Checked_Number class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Checked_Number_inlines_hh
+#define PPL_Checked_Number_inlines_hh 1
+
+#include <stdexcept>
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline Rounding_Dir
+rounding_dir(Rounding_Dir dir) {
+  if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+    return ROUND_DIRECT;
+#else
+    return ROUND_IGNORE;
+#endif
+  }
+  return dir;
+}
+
+inline Result
+check_result(Result r, Rounding_Dir dir) {
+  if (dir == ROUND_NOT_NEEDED && !is_special(r)) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+    // FIXME: this is wrong. If an overflow happens the Result may be
+    // V_LT or V_GT. What's the better way to cope with that?
+    assert(r == V_EQ);
+#else
+    return V_EQ;
+#endif
+  }
+  return r;
+}
+
+
+inline void
+Checked_Number_Transparent_Policy::handle_result(Result) {
+}
+
+inline void
+Checked_Number_Default_Policy::handle_result(Result r) {
+  if (is_special(r))
+    throw_result_exception(r);
+}
+
+inline void
+Extended_Number_Policy::handle_result(Result r) {
+  if (is_special(r))
+    throw_result_exception(r);
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number()
+ : v(0) {
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Checked_Number& y) {
+  // TODO: avoid default construction of value member
+  Checked::copy<Policy>(v, y.raw_value());
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir) {
+  // TODO: avoid default construction of value member
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+				     (v,
+				      y.raw_value(),
+				      rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y) {
+  // TODO: avoid default construction of value member
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+				     (v,
+				      y.raw_value(),
+				      rounding_dir(dir)),
+				     dir));
+}
+
+// TODO: avoid default construction of value member
+#define DEF_CTOR(type) \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type x, Rounding_Dir dir) { \
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, Default_From_Policy>(v, x, rounding_dir(dir)), dir)); \
+} \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type x) { \
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; \
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, Default_From_Policy>(v, x, rounding_dir(dir)), dir)); \
+}
+
+#define COND_0(...)
+#define COND_1(...) __VA_ARGS__
+#define COND_(if, ...) COND_##if(__VA_ARGS__)
+#define COND(if, ...) COND_(if, __VA_ARGS__)
+
+DEF_CTOR(signed char)
+DEF_CTOR(signed short)
+DEF_CTOR(signed int)
+DEF_CTOR(signed long)
+DEF_CTOR(signed long long)
+DEF_CTOR(unsigned char)
+DEF_CTOR(unsigned short)
+DEF_CTOR(unsigned int)
+DEF_CTOR(unsigned long)
+DEF_CTOR(unsigned long long)
+COND(PPL_SUPPORTED_FLOAT, DEF_CTOR(float))
+COND(PPL_SUPPORTED_DOUBLE, DEF_CTOR(double))
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_CTOR(long double))
+DEF_CTOR(mpq_class&)
+DEF_CTOR(mpz_class&)
+
+#undef DEF_CTOR
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* x, Rounding_Dir dir) {
+  std::istringstream s(x);
+  Policy::handle_result(check_result(Checked::input<Policy>(v,
+							    s,
+							    rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* x) {
+  std::istringstream s(x);
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+  Policy::handle_result(check_result(Checked::input<Policy>(v,
+							    s,
+							    rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Not_A_Number& x,
+					  Rounding_Dir dir) {
+  // TODO: avoid default construction of value member
+  Policy::handle_result(check_result(Checked::assign<Policy>(v,
+							     x,
+							     rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Not_A_Number& x) {
+  // TODO: avoid default construction of value member
+  Rounding_Dir dir = ROUND_IGNORE;
+  Policy::handle_result(check_result(Checked::assign<Policy>(v,
+							     x,
+							     rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Minus_Infinity& x,
+					  Rounding_Dir dir) {
+  // TODO: avoid default construction of value member
+  Policy::handle_result(check_result(Checked::assign<Policy>(v,
+							     x,
+							     rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Minus_Infinity& x) {
+  // TODO: avoid default construction of value member
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR_INF;
+  Policy::handle_result(check_result(Checked::assign<Policy>(v,
+							     x,
+							     rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Plus_Infinity& x,
+					  Rounding_Dir dir) {
+  // TODO: avoid default construction of value member
+  Policy::handle_result(check_result(Checked::assign<Policy>(v,
+							     x,
+							     rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Plus_Infinity& x) {
+  // TODO: avoid default construction of value member
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR_INF;
+  Policy::handle_result(check_result(Checked::assign<Policy>(v,
+							     x,
+							     rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T>
+inline bool
+is_minus_infinity(const T& x) {
+  return Checked::is_minf<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline bool
+is_plus_infinity(const T& x) {
+  return Checked::is_pinf<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline bool
+is_not_a_number(const T& x) {
+  return Checked::is_nan<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline bool
+is_integer(const T& x) {
+  return Checked::is_int<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::operator T() const {
+  if (Policy::convertible)
+    return v;
+}
+
+template <typename T, typename Policy>
+inline T&
+Checked_Number<T, Policy>::raw_value() {
+  return v;
+}
+
+template <typename T, typename Policy>
+inline const T&
+Checked_Number<T, Policy>::raw_value() const {
+  return v;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline const T&
+raw_value(const Checked_Number<T, Policy>& x) {
+  return x.raw_value();
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline T&
+raw_value(Checked_Number<T, Policy>& x) {
+  return x.raw_value();
+}
+
+template <typename T, typename Policy>
+inline bool
+Checked_Number<T, Policy>::OK() const {
+  return true;
+}
+
+template <typename T, typename Policy>
+inline Result
+Checked_Number<T, Policy>::classify(bool nan, bool inf, bool sign) const {
+  return Checked::classify<Policy>(v, nan, inf, sign);
+}
+
+template <typename T, typename Policy>
+inline bool
+is_not_a_number(const Checked_Number<T, Policy>& x) {
+  return Checked::is_nan<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_minus_infinity(const Checked_Number<T, Policy>& x) {
+  return Checked::is_minf<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_plus_infinity(const Checked_Number<T, Policy>& x) {
+  return Checked::is_pinf<Policy>(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+total_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+  return Checked::total_memory_in_bytes(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+external_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+  return Checked::external_memory_in_bytes(x.raw_value());
+}
+
+template <typename To>
+inline Result
+assign_r(To& to, const Minus_Infinity& x, Rounding_Dir dir) {
+  return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
+}
+template <typename To>
+inline Result
+assign_r(To& to, const Plus_Infinity& x, Rounding_Dir dir) {
+  return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
+}
+template <typename To>
+inline Result
+assign_r(To& to, const Not_A_Number& x, Rounding_Dir dir) {
+  return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
+}
+
+template <typename To>
+inline Result
+assign_r(To& to, const char* x, Rounding_Dir dir) {
+  std::istringstream s(x);
+  return check_result(Checked::input<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), s, rounding_dir(dir)), dir);
+}
+
+#define FUNC1(name, func) \
+template <typename To, typename From> \
+inline Result \
+name(To& to, const From& x, Rounding_Dir dir) { \
+  return check_result(Checked::func<typename Native_Checked_To_Wrapper<To>::Policy, typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), Native_Checked_From_Wrapper<From>::raw_value(x), rounding_dir(dir)), dir); \
+}
+
+FUNC1(construct, construct_ext)
+FUNC1(assign_r, assign_ext)
+FUNC1(neg_assign_r, neg_ext)
+FUNC1(abs_assign_r, abs_ext)
+FUNC1(sqrt_assign_r, sqrt_ext)
+
+#undef FUNC1
+
+#define FUNC1(name, func) \
+template <typename To, typename From> \
+inline Result \
+name(To& to, const From& x, int exp, Rounding_Dir dir) { \
+  return check_result(Checked::func<typename Native_Checked_To_Wrapper<To>::Policy, typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), Native_Checked_From_Wrapper<From>::raw_value(x), exp, rounding_dir(dir)), dir); \
+}
+
+FUNC1(mul2exp_assign_r, mul2exp_ext)
+FUNC1(div2exp_assign_r, div2exp_ext)
+
+#undef FUNC1
+
+#define FUNC2(name, func) \
+template <typename To, \
+          typename From1, \
+	  typename From2> \
+inline Result \
+name(To& to, const From1& x, const From2& y, Rounding_Dir dir) { \
+  return check_result(Checked::func<typename Native_Checked_To_Wrapper<To>::Policy, typename Native_Checked_From_Wrapper<From1>::Policy, typename Native_Checked_From_Wrapper<From2>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), Native_Checked_From_Wrapper<From1>::raw_value(x), Native_Checked_From_Wrapper<From2>::raw_value(y), rounding_dir(dir)), dir); \
+}
+
+FUNC2(add_assign_r, add_ext)
+FUNC2(sub_assign_r, sub_ext)
+FUNC2(mul_assign_r, mul_ext)
+FUNC2(div_assign_r, div_ext)
+FUNC2(rem_assign_r, rem_ext)
+FUNC2(gcd_assign_r, gcd_ext)
+FUNC2(lcm_assign_r, lcm_ext)
+FUNC2(add_mul_assign_r, add_mul_ext)
+FUNC2(sub_mul_assign_r, sub_mul_ext)
+
+#undef FUNC2
+
+#define FUNC4(name, func)						\
+template <typename To1,							\
+          typename From1,						\
+          typename From2,						\
+          typename To2,							\
+	  typename To3>							\
+inline Result								\
+name(To1& to, const From1& x, const From2& y, To2& s, To3& t,		\
+     Rounding_Dir dir) {						\
+  return								\
+    check_result							\
+    (Checked::func<typename Native_Checked_To_Wrapper<To1>::Policy,	\
+                   typename Native_Checked_From_Wrapper<From1>::Policy,	\
+                   typename Native_Checked_From_Wrapper<From2>::Policy,	\
+                   typename Native_Checked_To_Wrapper<To2>::Policy,	\
+                   typename Native_Checked_To_Wrapper<To3>::Policy>	\
+     (Native_Checked_To_Wrapper<To1>::raw_value(to),			\
+      Native_Checked_From_Wrapper<From1>::raw_value(x),			\
+      Native_Checked_From_Wrapper<From2>::raw_value(y),			\
+      Native_Checked_To_Wrapper<To2>::raw_value(s),			\
+      Native_Checked_To_Wrapper<To3>::raw_value(t),			\
+      rounding_dir(dir)),						\
+     dir);								\
+}
+
+FUNC4(gcdext_assign_r, gcdext_ext)
+
+#undef FUNC4
+
+#define DEF_INCREMENT(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f() { \
+  Policy::handle_result(fun(*this, *this, T(1), \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+Checked_Number<T, Policy>::f(int) {\
+  T r = v;\
+  Policy::handle_result(fun(*this, *this, T(1), \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r;\
+}
+
+DEF_INCREMENT(operator ++, add_assign_r)
+DEF_INCREMENT(operator --, sub_assign_r)
+
+#undef DEF_INCREMENT
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline void
+swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y) {
+  std::swap(x.raw_value(), y.raw_value());
+}
+
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Checked_Number<T, Policy>& y) {
+  Checked::copy<Policy>(v, y.raw_value());
+  return *this;
+}
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>
+::operator=(const Checked_Number<From, From_Policy>& y) {
+  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
+  return *this;
+}
+template <typename T, typename Policy>
+template <typename From>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const From& y) {
+  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
+  return *this;
+}
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Not_A_Number& y) {
+  Policy::handle_result(assign_r(*this, y, ROUND_IGNORE));
+  return *this;
+}
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Minus_Infinity& y) {
+  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_ASSIGN_INF));
+  return *this;
+}
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Plus_Infinity& y) {
+  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_ASSIGN_INF));
+  return *this;
+}
+
+#define DEF_BINARY_OP_ASSIGN(f, fun) \
+template <typename T, typename Policy> \
+template <typename From_Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const Checked_Number<T, From_Policy>& y) { \
+  Policy::handle_result(fun(*this, *this, y, \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const T& y) { \
+  Policy::handle_result(fun(*this, *this, y, \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+template <typename From, typename From_Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const Checked_Number<From, From_Policy>& y) { \
+  Checked_Number<T, Policy> cy(y); \
+  Policy::handle_result(fun(*this, *this, cy, \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+template <typename From> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const From& y) { \
+  Checked_Number<T, Policy> cy(y); \
+  Policy::handle_result(fun(*this, *this, cy, \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+}
+
+DEF_BINARY_OP_ASSIGN(operator +=, add_assign_r)
+DEF_BINARY_OP_ASSIGN(operator -=, sub_assign_r)
+DEF_BINARY_OP_ASSIGN(operator *=, mul_assign_r)
+DEF_BINARY_OP_ASSIGN(operator /=, div_assign_r)
+DEF_BINARY_OP_ASSIGN(operator %=, rem_assign_r)
+
+#undef DEF_BINARY_OP_ASSIGN
+
+#define DEF_BINARY_OP_TYPE(f, fun, Type) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+f(const Type x, const Checked_Number<T, Policy>& y) { \
+  Checked_Number<T, Policy> r(x); \
+  Policy::handle_result(fun(r, r, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+f(const Checked_Number<T, Policy>& x, const Type y) { \
+  Checked_Number<T, Policy> r(y); \
+  Policy::handle_result(fun(r, x, r, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+}
+
+#define DEF_BINARY_OP(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+f(const Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+  Checked_Number<T, Policy> r; \
+  Policy::handle_result(fun(r, x, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+} \
+DEF_BINARY_OP_TYPE(f, fun, signed char) \
+DEF_BINARY_OP_TYPE(f, fun, signed short) \
+DEF_BINARY_OP_TYPE(f, fun, signed int) \
+DEF_BINARY_OP_TYPE(f, fun, signed long) \
+DEF_BINARY_OP_TYPE(f, fun, signed long long) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned char) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned short) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned int) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned long) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned long long) \
+COND(PPL_SUPPORTED_FLOAT, DEF_BINARY_OP_TYPE(f, fun, float)) \
+COND(PPL_SUPPORTED_DOUBLE, DEF_BINARY_OP_TYPE(f, fun, double)) \
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_BINARY_OP_TYPE(f, fun, long double)) \
+DEF_BINARY_OP_TYPE(f, fun, mpz_class&) \
+DEF_BINARY_OP_TYPE(f, fun, mpq_class&)
+
+DEF_BINARY_OP(operator +, add_assign_r)
+DEF_BINARY_OP(operator -, sub_assign_r)
+DEF_BINARY_OP(operator *, mul_assign_r)
+DEF_BINARY_OP(operator /, div_assign_r)
+DEF_BINARY_OP(operator %, rem_assign_r)
+
+#undef DEF_BINARY_OP_TYPE
+#undef DEF_BINARY_OP
+
+#define DEF_COMPARE_TYPE(f, fun, Type) \
+template <typename From, typename From_Policy> \
+inline bool \
+f(const Type x, const Checked_Number<From, From_Policy>& y) { \
+  return Checked::fun<Default_From_Policy, From_Policy>(x, y.raw_value()); \
+} \
+template <typename From, typename From_Policy> \
+inline bool \
+f(const Checked_Number<From, From_Policy>& x, const Type y) { \
+  return Checked::fun<From_Policy, Default_From_Policy>(x.raw_value(), y); \
+}
+
+#define DEF_COMPARE(f, fun) \
+template <typename T1, typename Policy1, \
+          typename T2, typename Policy2> \
+inline bool \
+f(const Checked_Number<T1, Policy1>& x, \
+  const Checked_Number<T2, Policy2>& y) { \
+  return Checked::fun<Policy1, Policy2>(x.raw_value(), y.raw_value()); \
+} \
+DEF_COMPARE_TYPE(f, fun, signed char) \
+DEF_COMPARE_TYPE(f, fun, signed short) \
+DEF_COMPARE_TYPE(f, fun, signed int) \
+DEF_COMPARE_TYPE(f, fun, signed long) \
+DEF_COMPARE_TYPE(f, fun, signed long long) \
+DEF_COMPARE_TYPE(f, fun, unsigned char) \
+DEF_COMPARE_TYPE(f, fun, unsigned short) \
+DEF_COMPARE_TYPE(f, fun, unsigned int) \
+DEF_COMPARE_TYPE(f, fun, unsigned long) \
+DEF_COMPARE_TYPE(f, fun, unsigned long long) \
+COND(PPL_SUPPORTED_FLOAT, DEF_COMPARE_TYPE(f, fun, float)) \
+COND(PPL_SUPPORTED_DOUBLE, DEF_COMPARE_TYPE(f, fun, double)) \
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_COMPARE_TYPE(f, fun, long double)) \
+DEF_COMPARE_TYPE(f, fun, mpz_class&) \
+DEF_COMPARE_TYPE(f, fun, mpq_class&)
+
+
+DEF_COMPARE(operator ==, eq_ext)
+DEF_COMPARE(operator !=, ne_ext)
+DEF_COMPARE(operator >=, ge_ext)
+DEF_COMPARE(operator >, gt_ext)
+DEF_COMPARE(operator <=, le_ext)
+DEF_COMPARE(operator <, lt_ext)
+
+#undef DEF_COMPARE_TYPE
+#undef DEF_COMPARE
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x) {
+  return x;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x) {
+  Checked_Number<T, Policy> r;
+  Policy::handle_result(neg_assign_r(r, x, Policy::ROUND_DEFAULT_OPERATOR));
+  return r;
+}
+
+#define DEF_ASSIGN_FUN2_1(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x) { \
+  Policy::handle_result(fun(x, x, Policy::ROUND_DEFAULT_FUNCTION));	\
+}
+
+#define DEF_ASSIGN_FUN2_2(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+  Policy::handle_result(fun(x, y, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define DEF_ASSIGN_FUN3_3(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y, \
+  const Checked_Number<T, Policy>& z) { \
+  Policy::handle_result(fun(x, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define DEF_ASSIGN_FUN5_5(f, fun)					\
+template <typename T, typename Policy>					\
+inline void								\
+f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y,	\
+  const Checked_Number<T, Policy>& z,					\
+  Checked_Number<T, Policy>& s, Checked_Number<T, Policy>& t) {		\
+  Policy::handle_result(fun(x, y, z, s, t, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+DEF_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r)
+
+DEF_ASSIGN_FUN2_1(neg_assign, neg_assign_r)
+DEF_ASSIGN_FUN2_2(neg_assign, neg_assign_r)
+
+DEF_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r)
+
+DEF_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r)
+
+DEF_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r)
+
+DEF_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r)
+
+DEF_ASSIGN_FUN3_3(lcm_assign, lcm_assign_r)
+
+#undef DEF_ASSIGN_FUN2_1
+#undef DEF_ASSIGN_FUN2_2
+#undef DEF_ASSIGN_FUN3_2
+#undef DEF_ASSIGN_FUN3_3
+
+template <typename T, typename Policy>
+inline void
+exact_div_assign(Checked_Number<T, Policy>& x,
+		 const Checked_Number<T, Policy>& y,
+		 const Checked_Number<T, Policy>& z) {
+  Policy::handle_result(div_assign_r(x, y, z, ROUND_NOT_NEEDED));
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline int
+sgn(const Checked_Number<T, Policy>& x) {
+  Result r = Checked::sgn_ext<Policy>(x.raw_value());
+  switch (r) {
+  case V_LT:
+    return -1;
+  case V_EQ:
+    return 0;
+  case V_GT:
+    return 1;
+  default:
+    throw(0);
+  }
+}
+
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+inline int
+cmp(const Checked_Number<T1, Policy1>& x,
+    const Checked_Number<T2, Policy2>& y) {
+  Result r = Checked::cmp_ext<Policy1, Policy2>(x.raw_value(), y.raw_value());
+  switch (r) {
+  case V_LT:
+    return -1;
+  case V_EQ:
+    return 0;
+  case V_GT:
+    return 1;
+  default:
+    throw(0);
+  }
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Result
+output(std::ostream& os, const Checked_Number<T, Policy>& x,
+       const Numeric_Format& fmt, Rounding_Dir dir) {
+  return check_result(Checked::output_ext<Policy>(os,
+						  x.raw_value(),
+						  fmt,
+						  rounding_dir(dir)),
+		      dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x) {
+  Policy::handle_result(output(os, x, Numeric_Format(), ROUND_IGNORE));
+  return os;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Result
+input(Checked_Number<T, Policy>& x, std::istream& is, Rounding_Dir dir) {
+  return check_result(Checked::input_ext<Policy>(x.raw_value(),
+						 is,
+						 rounding_dir(dir)),
+		      dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::istream& operator>>(std::istream& is,
+				Checked_Number<T, Policy>& x) {
+  Result r = input(x, is, Policy::ROUND_DEFAULT_INPUT);
+  if (r == V_CVT_STR_UNK)
+    is.setstate(std::ios::failbit);
+  else
+    Policy::handle_result(r);
+  return is;
+}
+
+template <typename T>
+inline T
+plus_infinity() {
+  return PLUS_INFINITY;
+}
+
+template <typename T>
+inline T
+minus_infinity() {
+  return MINUS_INFINITY;
+}
+
+template <typename T>
+inline T
+not_a_number() {
+  return NOT_A_NUMBER;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Checked_Number_inlines_hh)
diff --git a/src/Checked_Number.types.hh b/src/Checked_Number.types.hh
new file mode 100644
index 0000000..0f0ad38
--- /dev/null
+++ b/src/Checked_Number.types.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Checked_Number_types_hh
+#define PPL_Checked_Number_types_hh 1
+
+#include "Coefficient_traits_template.hh"
+
+namespace Parma_Polyhedra_Library {
+
+struct Checked_Number_Default_Policy;
+struct Extended_Number_Policy;
+
+template <typename T, typename Policy = Checked_Number_Default_Policy>
+class Checked_Number;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Checked_Number_types_hh)
diff --git a/src/Coefficient.cc b/src/Coefficient.cc
new file mode 100644
index 0000000..f1983df
--- /dev/null
+++ b/src/Coefficient.cc
@@ -0,0 +1,25 @@
+/* Coefficient class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Coefficient.defs.hh"
diff --git a/src/Coefficient.defs.hh b/src/Coefficient.defs.hh
new file mode 100644
index 0000000..6355525
--- /dev/null
+++ b/src/Coefficient.defs.hh
@@ -0,0 +1,47 @@
+/* Coefficient class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Coefficient_defs_hh
+#define PPL_Coefficient_defs_hh 1
+
+#include "Coefficient.types.hh"
+#include <iosfwd>
+
+#if defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+#include "Checked_Number.defs.hh"
+#include "checked_int.inlines.hh"
+#endif
+
+#ifdef GMP_INTEGERS
+#include "GMP_Integer.defs.hh"
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+Coefficient_traits::const_reference Coefficient_zero();
+Coefficient_traits::const_reference Coefficient_one();
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Coefficient.inlines.hh"
+
+#endif // !defined(PPL_Coefficient_defs_hh)
diff --git a/src/Coefficient.inlines.hh b/src/Coefficient.inlines.hh
new file mode 100644
index 0000000..ae5535c
--- /dev/null
+++ b/src/Coefficient.inlines.hh
@@ -0,0 +1,42 @@
+/* Coefficient class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Coefficient_inlines_hh
+#define PPL_Coefficient_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+  static Coefficient z(0);
+  return z;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+  static Coefficient o(1);
+  return o;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Coefficient_inlines_hh)
diff --git a/src/Coefficient.types.hh b/src/Coefficient.types.hh
new file mode 100644
index 0000000..5d45236
--- /dev/null
+++ b/src/Coefficient.types.hh
@@ -0,0 +1,99 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Coefficient_types_hh
+#define PPL_Coefficient_types_hh 1
+
+#include "Checked_Number.defs.hh"
+
+#if defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 8 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int8_t, Policy> > {
+  //! The type used for references to const 8 bit checked integers.
+  typedef Checked_Number<int8_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 16 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int16_t, Policy> > {
+  //! The type used for references to const 16 bit checked integers.
+  typedef Checked_Number<int16_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 32 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int32_t, Policy> > {
+  //! The type used for references to const 32 bit checked integers.
+  typedef Checked_Number<int32_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 64 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int64_t, Policy> > {
+  //! The type used for references to const 64 bit checked integers.
+  typedef const Checked_Number<int64_t, Policy>& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+
+#ifdef GMP_INTEGERS
+#include "GMP_Integer.types.hh"
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+//! An alias for easily naming the type of PPL coefficients.
+/*! \ingroup PPL_CXX_interface
+  Objects of type Coefficient are used to implement the integral valued
+  coefficients occurring in linear expressions, constraints, generators,
+  intervals, bounding boxes and so on. Depending on the chosen
+  configuration options (see file <CODE>README.configure</CODE>),
+  a Coefficient may actually be:
+    - The GMP_Integer type, which in turn is an alias for the
+      <CODE>mpz_class</CODE> type implemented by the C++ interface
+      of the GMP library (this is the default configuration);
+    - An instance of the Checked_Number class template: with its default
+      policy (Checked_Number_Default_Policy), this implements overflow
+      detection on top of a native integral type (available template
+      instances include checked integers having 8, 16, 32 or 64 bits);
+      with the Checked_Number_Transparent_Policy, this is a wrapper
+      for native integral types with no overflow detection
+      (available template instances are as above).
+*/
+typedef COEFFICIENT_TYPE Coefficient;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An alias for easily naming the coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+typedef Coefficient_traits_template<Coefficient> Coefficient_traits;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Coefficient_types_hh)
diff --git a/src/Coefficient_traits_template.hh b/src/Coefficient_traits_template.hh
new file mode 100644
index 0000000..7dff40e
--- /dev/null
+++ b/src/Coefficient_traits_template.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Coefficient_traits_template_hh
+#define PPL_Coefficient_traits_template_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Coefficient>
+struct Coefficient_traits_template {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Coefficient_traits_template_hh)
diff --git a/src/Congruence.cc b/src/Congruence.cc
new file mode 100644
index 0000000..a50c15d
--- /dev/null
+++ b/src/Congruence.cc
@@ -0,0 +1,251 @@
+/* Congruence class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Congruence.defs.hh"
+
+#include "Variable.defs.hh"
+#include <cassert>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Congruence::Congruence(const Constraint& c)
+  : Row(c.is_equality()
+	? c
+	: (throw_invalid_argument("Congruence(c)",
+				  "constraint c must be an equality."),
+	   c),
+	c.space_dimension() + 2,
+	compute_capacity(c.space_dimension() + 2, Row::max_size())) {
+
+  (*this)[size()-1] = 0;
+}
+
+PPL::Congruence::Congruence(const Constraint& c,
+			    dimension_type sz, dimension_type capacity)
+  : Row(c.is_equality()
+	? c
+	: (throw_invalid_argument("Congruence(c)",
+				  "constraint c must be an equality."),
+	   c),
+	sz,
+	capacity) {
+
+  (*this)[sz-1] = 0;
+}
+
+void
+PPL::Congruence::sign_normalize() {
+  Row& x = *this;
+  const dimension_type sz = x.size() - 1;
+  // `first_non_zero' indicates the index of the first
+  // coefficient of the row different from zero, disregarding
+  // the very first coefficient (inhomogeneous term).
+  dimension_type first_non_zero;
+  for (first_non_zero = 1; first_non_zero < sz; ++first_non_zero)
+    if (x[first_non_zero] != 0)
+      break;
+  if (first_non_zero < sz)
+    // If the first non-zero coefficient of the row is negative,
+    // negate all the coefficients and the inhomogeneous term.
+    if (x[first_non_zero] < 0) {
+      for (dimension_type j = first_non_zero; j < sz; ++j)
+	neg_assign(x[j]);
+      // Also negate the inhomogeneous term.
+      neg_assign(x[0]);
+    }
+}
+
+void
+PPL::Congruence::normalize() {
+  sign_normalize();
+
+  dimension_type sz = size();
+  if (sz == 0)
+    return;
+
+  Coefficient_traits::const_reference mod = modulus();
+  if (mod == 0)
+    return;
+
+  Coefficient& row_0 = (*this)[0];
+  // Factor the modulus out of the inhomogeneous term.
+  row_0 %= mod;
+  if (row_0 < 0)
+    // Make inhomogeneous term positive.
+    row_0 += mod;
+  return;
+}
+
+void
+PPL::Congruence::strong_normalize() {
+  normalize();
+  Row::normalize();
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+PPL::Congruence
+PPL::operator%=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  // Ensure that diff is created with capacity for the modulus.
+  dimension_type dim, e1_dim, e2_dim;
+  e1_dim = e1.space_dimension();
+  e2_dim = e2.space_dimension();
+  if (e1_dim > e2_dim)
+    dim = e1_dim;
+  else
+    dim = e2_dim;
+  Linear_Expression diff(e1_dim > e2_dim ? e1 : e2,
+			 dim + 2);
+  diff -= (e1_dim > e2_dim ? e2 : e1);
+  Congruence cg(diff, 1, false);
+  return cg;
+}
+
+void
+PPL::Congruence::throw_invalid_argument(const char* method,
+					const char* message) const {
+  std::ostringstream s;
+  s << "PPL::Congruence::" << method << ":" << std::endl
+    << message;
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Congruence::throw_dimension_incompatible(const char* method,
+					      const char* v_name,
+					      const Variable v) const {
+  std::ostringstream s;
+  s << "this->space_dimension() == " << space_dimension() << ", "
+    << v_name << ".space_dimension() == " << v.space_dimension() << ".";
+  throw_invalid_argument(method, s.str().c_str());
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Congruence& c) {
+  const int num_variables = c.space_dimension();
+  bool first = true;
+  for (int v = 0; v < num_variables; ++v) {
+    Coefficient cv = c.coefficient(Variable(v));
+    if (cv != 0) {
+      if (!first) {
+	if (cv > 0)
+	  s << " + ";
+	else {
+	  s << " - ";
+	  neg_assign(cv);
+	}
+      }
+      else
+	first = false;
+      if (cv == -1)
+	s << "-";
+      else if (cv != 1)
+	s << cv << "*";
+      s << PPL::Variable(v);
+    }
+  }
+  if (first)
+    s << Coefficient_zero();
+  s << " = " << -c.inhomogeneous_term();
+  if (c.is_proper_congruence())
+    s << " (mod " << c.modulus() << ")";
+  return s;
+}
+
+bool
+PPL::Congruence::is_trivial_true() const {
+  if ((is_equality() && inhomogeneous_term() == 0)
+      || (is_proper_congruence()
+	  && (inhomogeneous_term() % modulus() == 0))) {
+    for (unsigned i = 1; i <= space_dimension(); i++)
+      if ((*this)[i] != 0)
+	return false;
+    return true;
+  }
+  return false;
+}
+
+bool
+PPL::Congruence::is_trivial_false() const {
+  if (inhomogeneous_term() == 0
+      || (is_proper_congruence()
+	  && ((inhomogeneous_term() % modulus()) == 0)))
+    return false;
+  for (unsigned i = 1; i <= space_dimension(); i++)
+    if ((*this)[i] != 0)
+      return false;
+  return true;
+}
+
+void
+PPL::Congruence::ascii_dump(std::ostream& s) const {
+  const Row& x = *this;
+  dimension_type x_size = x.size();
+  for (dimension_type i = 0; i < x_size - 1; ++i)
+    s << x[i] << ' ';
+  if (x_size)
+    s << "m " << x[x_size - 1];
+  s << std::endl;
+}
+
+PPL_OUTPUT_DEFINITIONS(Congruence);
+
+bool
+PPL::Congruence::ascii_load(std::istream& s) {
+  std::string str;
+  Congruence& x = *this;
+  dimension_type col = 0;
+  while (col < x.size() - 1)
+    if (!(s >> x[col]))
+      return false;
+    else
+      col++;
+
+  if (!(s >> str) || str.compare("m"))
+    return false;
+
+  if (!(s >> x[col]))
+    return false;
+
+  return true;
+}
+
+bool
+PPL::Congruence::OK() const {
+  // Modulus check.
+  if (modulus() < 0) {
+#ifndef NDEBUG
+    std::cerr << "Congruence has a negative modulus " << modulus() << "."
+	      << std::endl;
+#endif
+    return false;
+  }
+
+  // All tests passed.
+  return true;
+}
diff --git a/src/Congruence.defs.hh b/src/Congruence.defs.hh
new file mode 100644
index 0000000..d4f4059
--- /dev/null
+++ b/src/Congruence.defs.hh
@@ -0,0 +1,474 @@
+/* Congruence class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Congruence_defs_hh
+#define PPL_Congruence_defs_hh 1
+
+#include "Congruence.types.hh"
+#include "Scalar_Products.types.hh"
+#include "Row.defs.hh"
+#include "Grid.types.hh"
+#include "Polyhedron.types.hh"
+#include "Variable.defs.hh"
+#include "Constraint.types.hh"
+#include "Linear_Expression.types.hh"
+#include "Linear_Row.types.hh"
+#include "Congruence_System.defs.hh"
+#include <iosfwd>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operators.
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+operator<<(std::ostream& s, const Congruence& c);
+
+// Put this in the namespace here to declare it a friend later.
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+std::ostream&
+operator<<(std::ostream& s, const Congruence_System& cgs);
+
+
+} // namespace IO_Operators
+
+// Put these in the namespace here to declare them friend later.
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator==(const Congruence& x, const Congruence& y);
+
+//! Returns <CODE>false</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator!=(const Congruence& x, const Congruence& y);
+
+//! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the congruence \f$e = n \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e,
+	   const Coefficient_traits::const_reference n);
+
+//! Returns a copy of \p cg, multiplying \p k into the copy's modulus.
+/*!
+    If \p cg represents the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then the result represents the
+    congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  \relates Congruence
+*/
+Congruence
+operator/(const Congruence& cg,
+	  const Coefficient_traits::const_reference k);
+
+//! Creates a congruence from \p c, with \p m as the modulus.
+/*! \relates Congruence */
+Congruence
+operator/(const Constraint& c,
+	  const Coefficient_traits::const_reference m);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Congruence */
+void
+swap(Parma_Polyhedra_Library::Congruence& x,
+     Parma_Polyhedra_Library::Congruence& y);
+
+} // namespace std
+
+//! A linear congruence.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Congruence is a congruence:
+  - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod m\f$
+
+  where \f$n\f$ is the dimension of the space,
+  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$,
+  \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus;
+  if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence
+  \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$
+  and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is
+  said to be a proper congruence.
+
+  \par How to build a congruence
+  Congruences \f$\pmod{1}\f$ are typically built by
+  applying the congruence symbol `<CODE>\%=</CODE>'
+  to a pair of linear expressions.
+  Congruences with modulus \p m
+  are typically constructed by building a congruence \f$\pmod{1}\f$
+  using the given pair of linear expressions
+  and then adding the modulus \p m
+  using the modulus symbol is `<CODE>/</CODE>'.
+
+  The space dimension of a congruence is defined as the maximum
+  space dimension of the arguments of its constructor.
+
+  \par
+  In the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds the equality congruence
+  \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+  \code
+  Congruence eq_cg((3*x + 5*y - z %= 0) / 0);
+  \endcode
+  The following code builds the congruence
+  \f$4x = 2y - 13 \pmod{1}\f$, having space dimension \f$2\f$:
+  \code
+  Congruence mod1_cg(4*x %= 2*y - 13);
+  \endcode
+  The following code builds the congruence
+  \f$4x = 2y - 13 \pmod{2}\f$, having space dimension \f$2\f$:
+  \code
+  Congruence mod2_cg((4*x %= 2*y - 13) / 2);
+  \endcode
+  An unsatisfiable congruence on the zero-dimension space \f$\Rset^0\f$
+  can be specified as follows:
+  \code
+  Congruence false_cg = Congruence::zero_dim_false();
+  \endcode
+  Equivalent, but more involved ways are the following:
+  \code
+  Congruence false_cg1((Linear_Expression::zero() %= 1) / 0);
+  Congruence false_cg2((Linear_Expression::zero() %= 1) / 2);
+  \endcode
+  In contrast, the following code defines an unsatisfiable congruence
+  having space dimension \f$3\f$:
+  \code
+  Congruence false_cg3((0*z %= 1) / 0);
+  \endcode
+
+  \par How to inspect a congruence
+  Several methods are provided to examine a congruence and extract
+  all the encoded information: its space dimension, its modulus
+  and the value of its integer coefficients.
+
+  \par Example 2
+  The following code shows how it is possible to access the modulus
+  as well as each of the coefficients.
+  Given a congruence with linear expression \p e and modulus \p m
+  (in this case \f$x - 5y + 3z = 4 \pmod{5}\f$), we construct a new
+  congruence with the same modulus \p m but where the linear
+  expression is \f$2 e\f$ (\f$2x - 10y + 6z = 8 \pmod{5}\f$).
+  \code
+  Congruence cg1((x - 5*y + 3*z %= 4) / 5);
+  cout << "Congruence cg1: " << cg1 << endl;
+  Coefficient m = cg1.modulus();
+  if (m == 0)
+    cout << "Congruence cg1 is an equality." << endl;
+  else {
+    Linear_Expression e;
+    for (int i = cg1.space_dimension() - 1; i >= 0; --i)
+      e += 2 * cg1.coefficient(Variable(i)) * Variable(i);
+      e += 2 * cg1.inhomogeneous_term();
+    Congruence cg2((e %= 0) / m);
+    cout << "Congruence cg2: " << cg2 << endl;
+  }
+  \endcode
+  The actual output could be the following:
+  \code
+  Congruence cg1: A - 5*B + 3*C %= 4 / 5
+  Congruence cg2: 2*A - 10*B + 6*C %= 8 / 5
+  \endcode
+  Note that, in general, the particular output obtained can be
+  syntactically different from the (semantically equivalent)
+  congruence considered.
+*/
+class Parma_Polyhedra_Library::Congruence : private Row {
+public:
+  //! Ordinary copy-constructor.
+  Congruence(const Congruence& cg);
+
+  //! Copy-constructs (modulo 0) from equality constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p c is a relation.
+  */
+  explicit Congruence(const Constraint& c);
+
+  //! Destructor.
+  ~Congruence();
+
+  //! Assignment operator.
+  Congruence& operator=(const Congruence& cg);
+
+  //! Returns the maximum space dimension a Congruence can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument thrown if the index of \p v
+    is greater than or equal to the space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns a const reference to the modulus of \p *this.
+  Coefficient_traits::const_reference modulus() const;
+
+  //! Multiplies \p k into the modulus of \p *this.
+  /*!
+    If called with \p *this representing the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then it returns with *this representing
+    the congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  */
+  Congruence&
+  operator/=(const Coefficient_traits::const_reference k);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a trivially
+    true congruence.
+
+    Trivially true congruences are of one the following two forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 == 0\f$; or
+    - a proper congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+    where n is the space dimension and m is the modulus.
+  */
+  bool is_trivial_true() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a trivially
+    false congruence.
+
+    Trivially false congruences have one of the following two forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b == 0\f$
+      where \f$b \neq 0\f$; or
+    - a congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+      where \f$b \neq 0 \pmod{m}\f$.
+  */
+  bool is_trivial_false() const;
+
+  //! Returns <CODE>true</CODE> if the modulus is greater than zero.
+  /*!
+    A congruence with a modulus of 0 is a linear equality.
+  */
+  bool is_proper_congruence() const;
+
+  //! Returns <CODE>true</CODE> if \p *this is an equality.
+  /*!
+    A modulus of zero denotes a linear equality.
+  */
+  bool is_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this is equal to \p cg in
+    dimension \p dim.
+  */
+  bool is_equal_at_dimension(dimension_type dim,
+			     const Congruence& cg) const;
+
+  /*! \brief
+    Returns a reference to the true (zero-dimension space) congruence
+    \f$0 = 1 \pmod{1}\f$, also known as the <EM>integrality
+    congruence</EM>.
+  */
+  static const Congruence& zero_dim_integrality();
+
+  /*! \brief
+    Returns a reference to the false (zero-dimension space) congruence
+    \f$0 = 1 \pmod{0}\f$.
+  */
+  static const Congruence& zero_dim_false();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation of the internal
+    representation of \p *this.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+protected:
+
+  //! Normalizes the signs.
+  /*!
+    The signs of the coefficients and the inhomogeneous term are
+    normalized, leaving the first non-zero homogeneous coefficient
+    positive.
+  */
+  void sign_normalize();
+
+  //! Normalizes signs and the inhomogeneous term.
+  /*!
+    Applies sign_normalize, then reduces the inhomogeneous term to the
+    smallest possible positive number.
+  */
+  void normalize();
+
+  //! Calls normalize, then divides out common factors.
+  /*!
+    Strongly normalized Congruences have equivalent semantics if and
+    only if their syntaxes (as output by operator<<) are equal.
+  */
+  void strong_normalize();
+
+private:
+
+  //! Returns a reference to the modulus of \p *this.
+  Coefficient& modulus();
+
+  //! Marks this congruence as a linear equality.
+  void set_is_equality();
+
+  //! Negates the elements from index \p start to index \p end.
+  void negate(dimension_type start, dimension_type end);
+
+  //! Default constructor: private and not implemented.
+  Congruence();
+
+  //! Copy-constructs with specified size and capacity.
+  Congruence(const Congruence& cg,
+	     dimension_type sz,
+	     dimension_type capacity);
+
+  //! Constructs from a constraint, with specified size and capacity.
+  Congruence(const Constraint& c,
+	     dimension_type sz,
+	     dimension_type capacity);
+
+  //! Copy-constructs from \p cg, multiplying \p k into the modulus.
+  /*!
+    If \p cg represents the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then the result represents the
+    congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  */
+  Congruence(const Congruence& cg, Coefficient_traits::const_reference k);
+
+  //! Constructs from Linear_Expression \p le, using modulus \p m.
+  /*!
+     Builds a congruence with modulus \p m, stealing the coefficients
+     from \p le.
+
+     \param le
+     The Linear_Expression holding the coefficients.
+
+     \param m
+     The modulus for the congruence.
+
+     \param capacity
+     If <CODE>true</CODE> then the size of the \p le row is expanded
+     and the modulus is stored in the extra space.  In this case it is
+     assumed that \p le has spare capacity of at least one element.
+     If <CODE>false</CODE> then the modulus is stored in the last
+     element of the \p le row.
+  */
+  Congruence(Linear_Expression& le,
+	     Coefficient_traits::const_reference m,
+	     bool capacity = true);
+
+  //! Swaps \p *this with \p y.
+  void swap(Congruence& y);
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    error message \p message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* message) const;
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+			       const char* v_name,
+			       Variable v) const;
+
+  friend Congruence
+  PPL::operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  friend Congruence
+  PPL::operator%=(const Linear_Expression& e,
+		  const Coefficient_traits::const_reference n);
+
+  friend Congruence
+  PPL::operator/(const Congruence& cg,
+		 const Coefficient_traits::const_reference k);
+
+  friend Congruence
+  PPL::operator/(const Constraint& c,
+		 const Coefficient_traits::const_reference m);
+
+  friend bool
+  PPL::operator==(const Congruence& x, const Congruence& y);
+
+  friend bool
+  PPL::operator!=(const Congruence& x, const Congruence& y);
+
+  friend std::ostream&
+  PPL::IO_Operators::operator<<(std::ostream& s,
+				const Congruence_System& cgs);
+
+  friend class PPL::Scalar_Products;
+  friend class PPL::Congruence_System;
+  friend class PPL::Congruence_System::const_iterator;
+  // FIXME: The following friend declaration is at least for
+  //        operator[] access in Grid::conversion.
+  friend class PPL::Grid;
+  friend class PPL::Linear_Expression;
+
+  friend void
+  std::swap(PPL::Congruence& x, PPL::Congruence& y);
+};
+
+#include "Congruence.inlines.hh"
+
+#endif // !defined(PPL_Congruence_defs_hh)
diff --git a/src/Congruence.inlines.hh b/src/Congruence.inlines.hh
new file mode 100644
index 0000000..e318657
--- /dev/null
+++ b/src/Congruence.inlines.hh
@@ -0,0 +1,233 @@
+/* Congruence class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Congruence_inlines_hh
+#define PPL_Congruence_inlines_hh 1
+
+#include "Constraint.defs.hh"
+#include "Linear_Expression.defs.hh"
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence::Congruence(const Congruence& cg)
+  : Row(cg) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+		       dimension_type sz, dimension_type capacity)
+  : Row(cg, sz, capacity) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+		       Coefficient_traits::const_reference k)
+  : Row(cg) {
+  if (k >= 0)
+    (*this)[size()-1] *= k;
+  else
+    (*this)[size()-1] *= -k;
+}
+
+inline
+Congruence::~Congruence() {
+}
+
+inline const Congruence&
+Congruence::zero_dim_integrality() {
+  static const Congruence zdi(Linear_Expression::zero() %= Coefficient(-1));
+  return zdi;
+}
+
+inline const Congruence&
+Congruence::zero_dim_false() {
+  static const Congruence
+    zdf((Linear_Expression::zero() %= Coefficient_one()) / 0);
+  return zdf;
+}
+
+inline Congruence&
+Congruence::operator=(const Congruence& c) {
+  Row::operator=(c);
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e,
+	   const Coefficient_traits::const_reference n) {
+  // Ensure that diff has capacity for the modulus.
+  Linear_Expression diff(e, e.space_dimension() + 2);
+  diff -= n;
+  Congruence cg(diff, 1, false);
+  return cg;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator/(const Congruence& cg,
+	  const Coefficient_traits::const_reference k) {
+  Congruence ret (cg, k);
+  return ret;
+}
+
+/*! \relates Congruence */
+inline Congruence
+operator/(const Constraint& c,
+	  const Coefficient_traits::const_reference m) {
+  Congruence ret (c);
+  return ret / m;
+}
+
+inline Congruence&
+Congruence::operator/=(const Coefficient_traits::const_reference k) {
+  if (k >= 0)
+    (*this)[size()-1] *= k;
+  else
+    (*this)[size()-1] *= -k;
+  return *this;
+}
+
+/*! \relates Congruence */
+inline bool
+operator==(const Congruence& x, const Congruence& y) {
+  Congruence x_temp(x);
+  Congruence y_temp(y);
+  x_temp.strong_normalize();
+  y_temp.strong_normalize();
+  return static_cast<const Row&>(x_temp) == static_cast<const Row&>(y_temp);
+}
+
+/*! \relates Congruence */
+inline bool
+operator!=(const Congruence& x, const Congruence& y) {
+  return !(x == y);
+}
+
+inline dimension_type
+Congruence::max_space_dimension() {
+  // The first coefficient holds the inhomogeneous term, while
+  // the last coefficient is for the modulus.
+  return max_size() - 2;
+}
+
+inline dimension_type
+Congruence::space_dimension() const {
+  return size() - 2;
+}
+
+inline Coefficient_traits::const_reference
+Congruence::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return (*this)[v.id()+1];
+}
+
+inline Coefficient_traits::const_reference
+Congruence::inhomogeneous_term() const {
+  return (*this)[0];
+}
+
+inline Coefficient_traits::const_reference
+Congruence::modulus() const {
+  assert(size() > 0);
+  return (*this)[size()-1];
+}
+
+inline Coefficient&
+Congruence::modulus() {
+  assert(size() > 0);
+  return (*this)[size()-1];
+}
+
+inline bool
+Congruence::is_proper_congruence() const {
+  return modulus() > 0;
+}
+
+inline bool
+Congruence::is_equality() const {
+  return modulus() == 0;
+}
+
+inline bool
+Congruence::is_equal_at_dimension(dimension_type dim,
+				  const Congruence& cg) const {
+  return operator[](dim) * cg.modulus() == cg[dim] * modulus();
+}
+
+inline void
+Congruence::set_is_equality() {
+  modulus() = 0;
+}
+
+inline void
+Congruence::negate(dimension_type start, dimension_type end) {
+  while (start <= end)
+    neg_assign(operator[](start++));
+}
+
+inline memory_size_type
+Congruence::external_memory_in_bytes() const {
+  return Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence::total_memory_in_bytes() const {
+  return Row::total_memory_in_bytes();
+}
+
+inline
+Congruence::Congruence(Linear_Expression& le,
+		       Coefficient_traits::const_reference m,
+		       bool capacity) {
+  Row::swap(static_cast<Row&>(le));
+  if (capacity)
+    Row::expand_within_capacity(size()+1);
+  if (m >= 0)
+    (*this)[size()-1] = m;
+  else
+    (*this)[size()-1] = -m;
+}
+
+inline void
+Congruence::swap(Congruence& y) {
+  Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline void
+swap(Parma_Polyhedra_Library::Congruence& x,
+     Parma_Polyhedra_Library::Congruence& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Congruence_inlines_hh)
diff --git a/src/Congruence.types.hh b/src/Congruence.types.hh
new file mode 100644
index 0000000..3d57459
--- /dev/null
+++ b/src/Congruence.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Congruence_types_hh
+#define PPL_Congruence_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence;
+
+}
+
+#endif // !defined(PPL_Congruence_types_hh)
diff --git a/src/Congruence_System.cc b/src/Congruence_System.cc
new file mode 100644
index 0000000..3f40eea
--- /dev/null
+++ b/src/Congruence_System.cc
@@ -0,0 +1,550 @@
+/* Congruence_System class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Congruence_System.defs.hh"
+#include "Congruence_System.inlines.hh"
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "Congruence.defs.hh"
+#include "Grid_Generator.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cassert>
+#include <string>
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Congruence_System::Congruence_System(const Constraint_System& cs)
+  : Matrix(0, 2) {
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); i != cs_end; ++i)
+    if (i->is_equality())
+      insert(*i);
+}
+
+bool
+PPL::Congruence_System::
+increase_space_dimension(const dimension_type new_space_dim) {
+  assert(space_dimension() <= new_space_dim);
+
+  dimension_type cols_to_add = new_space_dim - space_dimension();
+
+  if (cols_to_add)
+    if (num_rows()) {
+      dimension_type old_num_cols = num_columns();
+      add_zero_columns(cols_to_add);
+      // Move the moduli.
+      swap_columns(num_columns() - 1, old_num_cols - 1);
+    }
+    else
+      // Empty system.
+      add_zero_columns(cols_to_add);
+
+  assert(OK());
+  return true;
+}
+
+void
+PPL::Congruence_System::insert_verbatim(const Congruence& cg) {
+  const dimension_type old_num_columns = num_columns();
+  const dimension_type cg_size = cg.size();
+
+  if (cg_size > old_num_columns) {
+    // Resize the system, if necessary.
+    add_zero_columns(cg_size - old_num_columns);
+    if (num_rows() != 0)
+      // Move the moduli to the last column.
+      swap_columns(old_num_columns - 1, cg_size - 1);
+    add_row(cg);
+  }
+  else if (cg_size < old_num_columns) {
+    // Create a resized copy of `cg'.
+    Congruence rc(cg, old_num_columns, row_capacity);
+    // Move the modulus to its place.
+    std::swap(rc[cg_size - 1], rc[old_num_columns - 1]);
+    add_recycled_row(rc);
+  }
+  else
+    // Here cg_size == old_num_columns.
+    add_row(cg);
+
+  assert(OK());
+}
+
+void
+PPL::Congruence_System::insert(const Constraint& c) {
+  dimension_type cg_size = c.space_dimension() + 2;
+  const dimension_type old_num_columns = num_columns();
+  if (cg_size < old_num_columns) {
+    // Create a congruence of the required size from `c'.
+    Congruence cg(c, old_num_columns, row_capacity);
+    add_recycled_row(cg);
+  }
+  else {
+    if (cg_size > old_num_columns) {
+      // Resize the system, if necessary.
+      add_zero_columns(cg_size - old_num_columns);
+      if (num_rows() != 0)
+	// Move the moduli to the last column.
+	swap_columns(old_num_columns - 1, cg_size - 1);
+    }
+    Congruence cg(c, cg_size, row_capacity);
+    add_recycled_row(cg);
+  }
+  operator[](rows.size()-1).strong_normalize();
+
+  assert(OK());
+}
+
+void
+PPL::Congruence_System::recycling_insert(Congruence_System& cgs) {
+  const dimension_type old_num_rows = num_rows();
+  const dimension_type cgs_num_rows = cgs.num_rows();
+  const dimension_type old_num_cols = num_columns();
+  dimension_type cgs_num_cols = cgs.num_columns();
+  if (old_num_cols >= cgs_num_cols)
+    add_zero_rows(cgs_num_rows, Row::Flags());
+  else {
+    add_zero_rows_and_columns(cgs_num_rows,
+			      cgs_num_cols - old_num_cols,
+			      Row::Flags());
+    // Swap the modulus column into the new last column.
+    swap_columns(old_num_cols - 1, num_columns() - 1);
+  }
+  --cgs_num_cols; // Convert to modulus index.
+  const dimension_type mod_index = num_columns() - 1;
+  for (dimension_type i = cgs_num_rows; i-- > 0; ) {
+    // Swap one coefficient at a time into the newly added rows, instead
+    // of swapping each entire row.  This ensures that the added rows
+    // have the same capacities as the existing rows.
+    Congruence& new_cg = operator[](old_num_rows + i);
+    Congruence& old_cg = cgs[i];
+    for (dimension_type j = cgs_num_cols; j-- > 0; )
+      std::swap(new_cg[j], old_cg[j]);
+    std::swap(new_cg[mod_index], old_cg[cgs_num_cols]); // Modulus.
+  }
+
+  assert(OK());
+}
+
+void
+PPL::Congruence_System::insert(const Congruence_System& y) {
+  Congruence_System& x = *this;
+
+  const dimension_type x_n_rows = x.num_rows();
+  const dimension_type y_n_rows = y.num_rows();
+  const dimension_type old_n_cols = x.num_columns();
+  const dimension_type y_n_cols = y.num_columns();
+  // Grow to the required size.
+  if (old_n_cols >= y_n_cols)
+    add_zero_rows(y_n_rows, Row::Flags());
+  else {
+    add_zero_rows_and_columns(y_n_rows,
+			      y_n_cols - old_n_cols,
+			      Row::Flags());
+    // Swap the modulus column into the new last column.
+    swap_columns(old_n_cols - 1, num_columns() - 1);
+  }
+
+  // Copy the rows of `y', forcing size and capacity.
+  const dimension_type x_mod_index = x.num_columns() - 1;
+  const dimension_type y_mod_index = y_n_cols - 1;
+  for (dimension_type i = y_n_rows; i-- > 0; ) {
+    Row copy(y[i], x.row_size, x.row_capacity);
+    // Swap the modulus to the correct column.
+    std::swap(copy[x_mod_index], copy[y_mod_index]);
+    std::swap(copy, x[x_n_rows+i]);
+  }
+  assert(OK());
+}
+
+void
+PPL::Congruence_System::normalize_moduli() {
+  dimension_type row = num_rows();
+  if (row > 0) {
+    // Calculate the LCM of all the moduli.
+    TEMP_INTEGER(lcm);
+    // Find last proper congruence.
+    while (true) {
+      lcm = operator[](--row).modulus();
+      if (lcm > 0)
+	break;
+      if (row == 0)
+	// All rows are equalities.
+	return;
+    }
+    while (row > 0) {
+      TEMP_INTEGER(modulus);
+      modulus = operator[](--row).modulus();
+      if (modulus > 0)
+	lcm_assign(lcm, lcm, modulus);
+    }
+
+    // Represent every row using the LCM as the modulus.
+    dimension_type row_size = operator[](0).size();
+    for (dimension_type row = num_rows(); row-- > 0; ) {
+      TEMP_INTEGER(modulus);
+      modulus = operator[](row).modulus();
+      if (modulus <= 0 || modulus == lcm)
+	continue;
+      TEMP_INTEGER(factor);
+      factor = lcm / modulus;
+      for (dimension_type col = row_size; col-- > 0; )
+	operator[](row)[col] *= factor;
+      operator[](row)[row_size-1] = lcm;
+    }
+  }
+  assert(OK());
+}
+
+bool
+PPL::Congruence_System::is_equal_to(const Congruence_System& cgs) const {
+  if (num_rows() != cgs.num_rows())
+    return false;
+
+  for (dimension_type row = 0; row < cgs.num_rows(); ++row)
+    for (dimension_type col = 0; col < cgs.num_columns(); ++col) {
+      if (operator[](row)[col] == cgs[row][col])
+	continue;
+      return false;
+    }
+  return true;
+}
+
+bool
+PPL::Congruence_System::has_linear_equalities() const {
+  const Congruence_System& cgs = *this;
+  dimension_type modulus_index = cgs.num_columns() - 1;
+  for (dimension_type i = cgs.num_rows(); i-- > 0; )
+    if (cgs[i][modulus_index] == 0)
+      return true;
+  return false;
+}
+
+void
+PPL::Congruence_System::const_iterator::skip_forward() {
+  const Matrix::const_iterator csp_end = csp->end();
+  while (i != csp_end && (*this)->is_trivial_true())
+    ++i;
+}
+
+PPL::dimension_type
+PPL::Congruence_System::num_equalities() const {
+  const Congruence_System& cgs = *this;
+  dimension_type n = 0;
+  for (dimension_type i = num_rows(); i-- > 0 ; )
+    if (cgs[i].is_equality())
+      ++n;
+  return n;
+}
+
+PPL::dimension_type
+PPL::Congruence_System::num_proper_congruences() const {
+  const Congruence_System& cgs = *this;
+  dimension_type n = 0;
+  for (dimension_type i = num_rows(); i-- > 0 ; ) {
+    const Congruence& cg = cgs[i];
+    if (cg.is_proper_congruence())
+      ++n;
+  }
+  return n;
+}
+
+bool
+PPL::Congruence_System::
+satisfies_all_congruences(const Grid_Generator& g) const {
+  assert(g.space_dimension() <= space_dimension());
+
+  const Congruence_System& cgs = *this;
+  TEMP_INTEGER(sp);
+  if (g.is_line())
+    for (dimension_type i = cgs.num_rows(); i-- > 0; ) {
+      const Congruence& cg = cgs[i];
+      Scalar_Products::assign(sp, g, cg);
+      if (sp != 0)
+	return false;
+    }
+  else {
+    const Coefficient& divisor = g.divisor();
+    for (dimension_type i = cgs.num_rows(); i-- > 0; ) {
+      const Congruence& cg = cgs[i];
+      Scalar_Products::assign(sp, g, cg);
+      if (cg.is_equality()) {
+	if (sp != 0)
+	  return false;
+      }
+      else if (sp % (cg.modulus() * divisor) != 0)
+	return false;
+    }
+  }
+  return true;
+}
+
+bool
+PPL::Congruence_System::has_a_free_dimension() const {
+  // Search for a dimension that is free of any congruence or equality
+  // constraint.  Assumes a minimized system.
+  dimension_type space_dim = space_dimension();
+  std::vector<bool> free_dim(space_dim, true);
+  dimension_type free_dims = space_dim;
+  for (dimension_type row = num_rows(); row-- > 0; ) {
+    const Congruence& cg = operator[](row);
+    for (dimension_type dim = 0; dim < space_dim; ++dim)
+      if (free_dim[dim] && cg[dim+1] != 0) {
+	if (--free_dims == 0) {
+	  // All dimensions are constrained.
+#ifndef NDEBUG
+	  free_dim[dim] = false;
+	  // Check that there are free_dims dimensions marked free
+	  // in free_dim.
+	  dimension_type count = 0;
+	  for (dimension_type dim = 0; dim < space_dim; ++dim)
+	    count += free_dim[dim];
+	  assert(count == free_dims);
+#endif
+	  return true;
+	}
+	free_dim[dim] = false;
+      }
+  }
+  // At least one dimension is free of constraint.
+  return false;
+}
+
+void
+PPL::Congruence_System::
+affine_preimage(dimension_type v,
+		const Linear_Expression& expr,
+		Coefficient_traits::const_reference denominator) {
+  // `v' is the index of a column corresponding to a "user" variable
+  // (i.e., it cannot be the inhomogeneous term).
+  assert(v > 0 && v <= space_dimension());
+  assert(expr.space_dimension() <= space_dimension());
+  assert(denominator > 0);
+
+  const dimension_type n_columns = num_columns();
+  const dimension_type n_rows = num_rows();
+  const dimension_type expr_size = expr.size();
+  const bool not_invertible = (v >= expr_size || expr[v] == 0);
+  Congruence_System& x = *this;
+
+  if (denominator == 1)
+    // Optimized computation only considering columns having indexes <
+    // expr_size.
+    for (dimension_type i = n_rows; i-- > 0; ) {
+      Congruence& row = x[i];
+      Coefficient& row_v = row[v];
+      if (row_v != 0) {
+	for (dimension_type j = expr_size; j-- > 0; )
+	  if (j != v)
+	    // row[j] = row[j] + row_v * expr[j]
+	    add_mul_assign(row[j], row_v, expr[j]);
+	if (not_invertible)
+	  row_v = 0;
+	else
+	  row_v *= expr[v];
+      }
+    }
+  else
+    for (dimension_type i = n_rows; i-- > 0; ) {
+      Congruence& row = x[i];
+      Coefficient& row_v = row[v];
+      if (row_v != 0) {
+	for (dimension_type j = n_columns; j-- > 0; )
+	  if (j != v) {
+	    Coefficient& row_j = row[j];
+	    row_j *= denominator;
+	    if (j < expr_size)
+	      add_mul_assign(row_j, row_v, expr[j]);
+	  }
+	if (not_invertible)
+	  row_v = 0;
+	else
+	  row_v *= expr[v];
+      }
+    }
+}
+
+void
+PPL::Congruence_System::ascii_dump(std::ostream& s) const {
+  const Congruence_System& x = *this;
+  dimension_type x_num_rows = x.num_rows();
+  dimension_type x_num_columns = x.num_columns();
+  s << x_num_rows << " x " << x_num_columns
+    << std::endl;
+  if (x_num_rows && x_num_columns)
+    for (dimension_type i = 0; i < x_num_rows; ++i)
+      x[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS(Congruence_System);
+
+bool
+PPL::Congruence_System::ascii_load(std::istream& s) {
+  std::string str;
+  dimension_type nrows;
+  dimension_type ncols;
+  if (!(s >> nrows))
+    return false;
+  if (!(s >> str))
+    return false;
+  if (!(s >> ncols))
+    return false;
+  resize_no_copy(nrows, ncols);
+
+  Congruence_System& x = *this;
+  for (dimension_type i = 0; i < x.num_rows(); ++i)
+    x[i].ascii_load(s);
+
+  // Check for well-formedness.
+  assert(OK());
+  return true;
+}
+
+bool
+PPL::Congruence_System::OK() const {
+  // A Congruence_System must be a valid Matrix.
+  if (!Matrix::OK())
+    return false;
+
+  if (num_rows()) {
+    if (num_columns() < 2) {
+#ifndef NDEBUG
+      std::cerr << "Congruence_System has rows and fewer than two columns."
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // Checking each congruence in the system.
+  const Congruence_System& x = *this;
+  for (dimension_type i = num_rows(); i-- > 0; ) {
+    const Congruence& cg = x[i];
+    if (!cg.OK())
+      return false;
+  }
+
+  // All checks passed.
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Congruence_System& cgs) {
+  Congruence_System::const_iterator i = cgs.begin();
+  const Congruence_System::const_iterator cgs_end = cgs.end();
+  if (i == cgs_end)
+    return s << "true";
+  while (true) {
+    Congruence cg = *i++;
+    cg.strong_normalize();
+    s << cg;
+    if (i == cgs_end)
+      return s;
+    s << ", ";
+  }
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+bool
+PPL::operator==(const Congruence_System& x, const Congruence_System& y) {
+  if (x.num_columns() == y.num_columns()) {
+    dimension_type num_rows = x.num_rows();
+    if (num_rows == y.num_rows()) {
+      while (num_rows--) {
+	if (x[num_rows] == y[num_rows])
+	  continue;
+	return false;
+      }
+      return true;
+    }
+  }
+  return false;
+}
+
+void
+PPL::Congruence_System::add_unit_rows_and_columns(dimension_type dims) {
+  assert(num_columns() > 0);
+  dimension_type col = num_columns() - 1;
+  dimension_type old_num_rows = num_rows();
+  add_zero_rows_and_columns(dims, dims,
+			    Linear_Row::Flags(NECESSARILY_CLOSED,
+					      Linear_Row::LINE_OR_EQUALITY));
+  // Swap the modulus column into the new last column.
+  swap_columns(col, col + dims);
+
+  // Swap the added columns to the front of the matrix.
+  for (dimension_type row = old_num_rows; row-- > 0; )
+    std::swap(operator[](row), operator[](row + dims));
+
+  col += dims - 1;
+  // Set the diagonal element of each added row.
+  for (dimension_type row = 0; row < dims; ++row)
+    const_cast<Coefficient&>(operator[](row)[col - row]) = 1;
+}
+
+void
+PPL::Congruence_System::concatenate(const Congruence_System& const_cgs) {
+  // TODO: this implementation is just an executable specification.
+  Congruence_System cgs = const_cgs;
+
+  dimension_type added_rows = cgs.num_rows();
+  dimension_type added_columns = cgs.space_dimension();
+
+  if (added_rows == 0) {
+    increase_space_dimension(space_dimension() + added_columns);
+    return;
+  }
+
+  dimension_type old_num_rows = num_rows();
+  dimension_type old_modi = num_columns() - 1;
+  dimension_type old_space_dim = space_dimension();
+
+  add_zero_rows_and_columns(added_rows, added_columns,
+			    Row::Flags());
+
+  dimension_type cgs_num_columns = cgs.num_columns();
+  dimension_type modi = num_columns() - 1;
+
+  // Swap the modulus and the new last column, in the old rows.
+  for (dimension_type i = 0; i < old_num_rows; ++i) {
+    Congruence& cg = operator[](i);
+    std::swap(cg[old_modi], cg[modi]);
+  }
+
+  // Move the congruences into *this from `cgs', shifting the
+  // coefficients along into the appropriate columns.
+  for (dimension_type i = added_rows; i-- > 0; ) {
+    Congruence& cg_old = cgs[i];
+    Congruence& cg_new = operator[](old_num_rows + i);
+    // The inhomogeneous term is moved to the same column.
+    std::swap(cg_new[0], cg_old[0]);
+    // All homogeneous terms are shifted by `space_dim' columns.
+    for (dimension_type j = 1; j < cgs_num_columns; ++j)
+      std::swap(cg_old[j], cg_new[old_space_dim + j]);
+  }
+}
diff --git a/src/Congruence_System.defs.hh b/src/Congruence_System.defs.hh
new file mode 100644
index 0000000..f7f175d
--- /dev/null
+++ b/src/Congruence_System.defs.hh
@@ -0,0 +1,480 @@
+/* Congruence_System class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Congruence_System_defs_hh
+#define PPL_Congruence_System_defs_hh 1
+
+#include "Congruence_System.types.hh"
+#include "Linear_Expression.types.hh"
+#include "Constraint.types.hh"
+#include "Congruence.types.hh"
+#include "Grid_Generator.types.hh"
+#include "Matrix.defs.hh"
+#include "Grid_Certificate.types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Congruence_System
+  Writes <CODE>true</CODE> if \p cgs is empty.  Otherwise, writes on
+  \p s the congruences of \p cgs, all in one row and separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Congruence_System& cgs);
+
+} // namespace IO_Operators
+
+// Put this in the namespace here to declare it a friend later.
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence_System */
+bool
+operator==(const Congruence_System& x, const Congruence_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+void
+swap(Parma_Polyhedra_Library::Congruence_System& x,
+     Parma_Polyhedra_Library::Congruence_System& y);
+
+} // namespace std
+
+//! A system of congruences.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Congruence_System is a system of congruences,
+    i.e., a multiset of objects of the class Congruence.
+    When inserting congruences in a system, space dimensions are
+    automatically adjusted so that all the congruences in the system
+    are defined on the same vector space.
+
+    \par
+    In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code builds a system of congruences corresponding to
+    an integer grid in \f$\Rset^2\f$:
+    \code
+  Congruence_System cgs;
+  cgs.insert(x %= 0);
+  cgs.insert(y %= 0);
+    \endcode
+    Note that:
+    the congruence system is created with space dimension zero;
+    the first and second congruence insertions increase the space
+    dimension to \f$1\f$ and \f$2\f$, respectively.
+
+    \par Example 2
+    By adding to the congruence system of the previous example,
+    the congruence \f$x + y = 1 \pmod{2}\f$:
+    \code
+  cgs.insert((x + y %= 1) / 2);
+    \endcode
+    we obtain the grid containing just those integral
+    points where the sum of the \p x and \p y values is odd.
+
+    \par Example 3
+    The following code builds a system of congruences corresponding to
+    the grid in \f$\Zset^2\f$ containing just the integral points on
+    the \p x axis:
+    \code
+  Congruence_System cgs;
+  cgs.insert(x %= 0);
+  cgs.insert((y %= 0) / 0);
+    \endcode
+
+    \note
+    After inserting a multiset of congruences in a congruence system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> congruence system
+    will be available, where original congruences may have been
+    reordered, removed (if they are trivial, duplicate or
+    implied by other congruences), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Congruence_System : private Matrix {
+public:
+  //! Default constructor: builds an empty system of congruences.
+  Congruence_System();
+
+  //! Builds the singleton system containing only congruence \p cg.
+  explicit Congruence_System(const Congruence& cg);
+
+  /*! \brief
+    If \p c represents the constraint \f$ e_1 = e_2 \f$, builds the
+    singleton system containing only constraint \f$ e_1 = e_2
+    \pmod{0}\f$.
+
+    \exception std::invalid_argument
+    Thrown if \p c is not an equality constraint.
+  */
+  explicit Congruence_System(const Constraint& c);
+
+  //! Builds a system containing copies of any equalities in \p cs.
+  explicit Congruence_System(const Constraint_System& cs);
+
+  //! Ordinary copy-constructor.
+  Congruence_System(const Congruence_System& cgs);
+
+  //! Destructor.
+  ~Congruence_System();
+
+  //! Assignment operator.
+  Congruence_System& operator=(const Congruence_System& cgs);
+
+  //! Returns the maximum space dimension a Congruence_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is exactly equal
+    to \p cgs.
+  */
+  bool is_equal_to(const Congruence_System& cgs) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains one or
+    more linear equalities.
+  */
+  bool has_linear_equalities() const;
+
+  //! Removes all the congruences and sets the space dimension to 0.
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the congruence \p cg, increasing the
+    number of space dimensions if needed.
+
+    The copy of \p cg will be strongly normalized after being
+    inserted.
+  */
+  void insert(const Congruence& cg);
+
+  /*! \brief
+    Inserts in \p *this a copy of the equality constraint \p c, seen
+    as a modulo 0 congruence, increasing the number of space
+    dimensions if needed.
+
+    The modulo 0 congruence will be strongly normalized after being
+    inserted.
+
+    \exception std::invalid_argument
+    Thrown if \p c is a relation.
+  */
+  void insert(const Constraint& c);
+
+  // TODO: Consider adding a recycling_insert(cg).
+
+  /*! \brief
+    Inserts in \p *this a copy of the congruences in \p cgs,
+    increasing the number of space dimensions if needed.
+
+    The inserted copies will be strongly normalized.
+  */
+  void insert(const Congruence_System& cgs);
+
+  /*! \brief
+    Inserts into \p *this the congruences in \p cgs, increasing the
+    number of space dimensions if needed.
+  */
+  void recycling_insert(Congruence_System& cgs);
+
+  //! Returns the system containing only Congruence::zero_dim_false().
+  static const Congruence_System& zero_dim_empty();
+
+  //! An iterator over a system of congruences.
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each congruence contained in an object of Congruence_System.
+
+    \par Example
+    The following code prints the system of congruences
+    defining the grid <CODE>gr</CODE>:
+    \code
+  const Congruence_System& cgs = gr.congruences();
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    cout << *i << endl;
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+			   Congruence,
+			   ptrdiff_t,
+			   const Congruence*,
+			   const Congruence&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Congruence& operator*() const;
+
+    //! Indirect member selector.
+    const Congruence* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Congruence_System;
+
+    //! The const iterator over the matrix of congruences.
+    Matrix::const_iterator i;
+
+    //! A const pointer to the matrix of congruences.
+    const Matrix* csp;
+
+    //! Constructor.
+    const_iterator(const Matrix::const_iterator& iter,
+		   const Congruence_System& cgs);
+
+    //! \p *this skips to the next non-trivial congruence.
+    void skip_forward();
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first congruence, if \p
+    *this is not empty; otherwise, returns the past-the-end
+    const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Matrix, each row in the system is a valid Congruence and the
+    number of columns is consistent with the number of congruences.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref
+    ascii_dump) and sets \p *this accordingly.  Returns
+    <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Returns the number of equalities.
+  dimension_type num_equalities() const;
+
+  //! Returns the number of proper congruences.
+  dimension_type num_proper_congruences() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Congruence_System& cgs);
+
+  /*! \brief
+    Adds \p dims rows and \p dims columns of zeroes to the matrix,
+    initializing the added rows as in the unit congruence system.
+
+    \param dims
+    The number of rows and columns to be added: must be strictly
+    positive.
+
+    Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims) \times
+    (c+dims)\f$ matrix \f$\bigl({0 \atop A}{B \atop A}\bigr)\f$ where
+    \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+    \f$\bigl({0 \atop 1}{1 \atop 0}\bigr)\f$.  The matrix is expanded
+    avoiding reallocation whenever possible.
+  */
+  void add_unit_rows_and_columns(dimension_type dims);
+
+  /*! \brief
+    Concatenates copies of the congruences from \p cgs onto \p *this.
+
+    The matrix for the new system of congruences is obtained by
+    leaving the old system in the upper left-hand side and placing the
+    congruences of \p cgs in the lower right-hand side, and padding
+    with zeroes.
+  */
+  void concatenate(const Congruence_System& cgs);
+
+protected:
+
+  //! Returns <CODE>true</CODE> if \p g satisfies all the congruences.
+  bool satisfies_all_congruences(const Grid_Generator& g) const;
+
+private:
+
+  //! Adjusts all expressions to have the same moduli.
+  void normalize_moduli();
+
+  //! Increase the number of space dimensions to \p new_space_dim.
+  /*!
+    \p new_space_dim must at least equal to the current space
+    dimension.
+  */
+  bool increase_space_dimension(const dimension_type new_space_dim);
+
+  /*! \brief
+    Inserts in \p *this an exact copy of the congruence \p cg,
+    increasing the number of space dimensions if needed.
+
+    This method inserts a copy of \p cg in the given form, instead of
+    first strong normalizing \p cg as \ref insert would do.
+  */
+  void insert_verbatim(const Congruence& cg);
+
+  friend class const_iterator;
+  // FIXME: Reduce the dependence on this declaration.
+  friend class Grid;
+  friend class Grid_Certificate;
+
+  friend void std::swap(Parma_Polyhedra_Library::Congruence_System& x,
+			Parma_Polyhedra_Library::Congruence_System& y);
+
+  friend bool
+  Parma_Polyhedra_Library::operator==(const Congruence_System& x,
+				      const Congruence_System& y);
+
+  //! Returns the \p k- th congruence of the system.
+  Congruence& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k- th congruence of the system.
+  const Congruence& operator[](dimension_type k) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if any of the dimensions in
+    \p *this is free of constraint.
+
+    Any equality or proper congruence affecting a dimension constrains
+    that dimension.
+
+    This method assumes the system is in minimal form.
+  */
+  bool has_a_free_dimension() const;
+
+  /*! \brief
+    Substitutes a given column of coefficients by a given affine
+    expression.
+
+    \param v
+    Index of the column to which the affine transformation is
+    substituted;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We allow affine transformations (see the Section \ref
+    rational_grid_operations) to have rational
+    coefficients. Since the coefficients of linear expressions are
+    integers we also provide an integer \p denominator that will
+    be used as denominator of the affine transformation.  The
+    denominator is required to be a positive integer and its default value
+    is 1.
+
+    The affine transformation substitutes the matrix of congruences
+    by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+    the old one \f$a_{ij}\f$ as follows:
+    \f[
+      {a'}_{ij} =
+        \begin{cases}
+          a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+            \quad \text{for } j \neq v; \\
+          \mathrm{expr}[v] * a_{iv}
+            \quad \text{for } j = v.
+        \end{cases}
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_preimage(dimension_type v,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator);
+
+  //! Resizes the system without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows of the resized system;
+
+    \param new_n_columns
+    The number of columns of the resized system.
+
+    The system is expanded to the specified dimensions avoiding
+    reallocation whenever possible.
+    The contents of the original system is lost.
+  */
+  void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns);
+};
+
+// Congruence_System.inlines.hh is not included here on purpose.
+
+#endif // !defined(PPL_Congruence_System_defs_hh)
diff --git a/src/Congruence_System.inlines.hh b/src/Congruence_System.inlines.hh
new file mode 100644
index 0000000..0a3d776
--- /dev/null
+++ b/src/Congruence_System.inlines.hh
@@ -0,0 +1,211 @@
+/* Congruence_System class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Congruence_System_inlines_hh
+#define PPL_Congruence_System_inlines_hh 1
+
+#include "Congruence.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence_System::Congruence_System()
+  : Matrix(0, 2) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence& cg)
+  : Matrix(0, 2) {
+  insert(cg);
+}
+
+inline
+Congruence_System::Congruence_System(const Constraint& c)
+  : Matrix(0, 2) {
+  insert(c);
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cs)
+  : Matrix(cs) {
+}
+
+inline
+Congruence_System::~Congruence_System() {
+}
+
+inline Congruence_System&
+Congruence_System::operator=(const Congruence_System& y) {
+  Matrix::operator=(y);
+  return *this;
+}
+
+inline Congruence&
+Congruence_System::operator[](const dimension_type k) {
+  return static_cast<Congruence&>(Matrix::operator[](k));
+}
+
+inline const Congruence&
+Congruence_System::operator[](const dimension_type k) const {
+  return static_cast<const Congruence&>(Matrix::operator[](k));
+}
+
+inline dimension_type
+Congruence_System::max_space_dimension() {
+  return Matrix::max_num_columns() - 2;
+}
+
+inline dimension_type
+Congruence_System::space_dimension() const {
+  return Matrix::num_columns() - 2;
+}
+
+inline void
+Congruence_System::clear() {
+  Matrix::clear();
+  add_zero_columns(2);		// Modulus and constant term.
+}
+
+inline void
+Congruence_System::insert(const Congruence& cg) {
+  insert_verbatim(cg);
+  static_cast<Congruence&>(operator[](rows.size()-1)).strong_normalize();
+  assert(OK());
+}
+
+inline void
+Congruence_System::resize_no_copy(const dimension_type new_n_rows,
+				  const dimension_type new_n_columns) {
+  Matrix::resize_no_copy(new_n_rows, new_n_columns, Row::Flags());
+}
+
+inline const Congruence_System&
+Congruence_System::zero_dim_empty() {
+  static const Congruence_System zdf(Congruence::zero_dim_false());
+  return zdf;
+}
+
+inline
+Congruence_System::const_iterator::const_iterator()
+  : i(), csp(0) {
+}
+
+inline
+Congruence_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i), csp(y.csp) {
+}
+
+inline
+Congruence_System::const_iterator::~const_iterator() {
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  csp = y.csp;
+  return *this;
+}
+
+inline const Congruence&
+Congruence_System::const_iterator::operator*() const {
+  return static_cast<const Congruence&>(*i);
+}
+
+inline const Congruence*
+Congruence_System::const_iterator::operator->() const {
+  return static_cast<const Congruence*>(i.operator->());
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator++() {
+  ++i;
+  skip_forward();
+  return *this;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Congruence_System::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Congruence_System::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Congruence_System::const_iterator::
+const_iterator(const Matrix::const_iterator& iter,
+	       const Congruence_System& csys)
+  : i(iter), csp(&csys) {
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::begin() const {
+  const_iterator i(Matrix::begin(), *this);
+  i.skip_forward();
+  return i;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::end() const {
+  const const_iterator i(Matrix::end(), *this);
+  return i;
+}
+
+inline void
+Congruence_System::swap(Congruence_System& y) {
+  Matrix::swap(y);
+}
+
+inline memory_size_type
+Congruence_System::external_memory_in_bytes() const {
+  return Matrix::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence_System::total_memory_in_bytes() const {
+  return Matrix::total_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+inline void
+swap(Parma_Polyhedra_Library::Congruence_System& x,
+     Parma_Polyhedra_Library::Congruence_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Congruence_System_inlines_hh)
diff --git a/src/Congruence_System.types.hh b/src/Congruence_System.types.hh
new file mode 100644
index 0000000..2d8c64a
--- /dev/null
+++ b/src/Congruence_System.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Congruence_System_types_hh
+#define PPL_Congruence_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence_System;
+
+}
+
+#endif // !defined(PPL_Congruence_System_types_hh)
diff --git a/src/Constraint.cc b/src/Constraint.cc
new file mode 100644
index 0000000..95f6154
--- /dev/null
+++ b/src/Constraint.cc
@@ -0,0 +1,268 @@
+/* Constraint class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Constraint.defs.hh"
+
+#include "Variable.defs.hh"
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Constraint::throw_dimension_incompatible(const char* method,
+					      const char* name_var,
+					      const Variable v) const {
+  std::ostringstream s;
+  s << "PPL::Constraint::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << name_var << ".space_dimension() == " << v.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+PPL::Constraint
+PPL::Constraint::construct_epsilon_geq_zero() {
+  Linear_Expression e = Variable(0);
+  Constraint c(e, NONSTRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+  return c;
+}
+
+bool
+PPL::Constraint::is_tautological() const {
+  assert(size() > 0);
+  const Constraint& x = *this;
+  if (x.all_homogeneous_terms_are_zero())
+    if (is_equality())
+      return x[0] == 0;
+    else
+      // Non-strict inequality constraint.
+      return x[0] >= 0;
+  else
+    // There is a non-zero homogeneous coefficient.
+    if (is_necessarily_closed())
+      return false;
+    else {
+      // The constraint is NOT necessarily closed.
+      const dimension_type eps_index = size() - 1;
+      const int eps_sign = sgn(x[eps_index]);
+      if (eps_sign > 0)
+	// We have found the constraint epsilon >= 0.
+	return true;
+      if (eps_sign == 0)
+	// One of the `true' dimensions has a non-zero coefficient.
+	return false;
+      else {
+	// Here the epsilon coefficient is negative: strict inequality.
+	if (x[0] <= 0)
+	  // A strict inequality such as `lhs - k > 0',
+	  // where k is a non negative integer, cannot be trivially true.
+	  return false;
+	// Checking for another non-zero coefficient.
+	for (dimension_type i = eps_index; --i > 0; )
+	  if (x[i] != 0)
+	    return false;
+	// We have the inequality `k > 0',
+	// where k is a positive integer.
+	return true;
+      }
+    }
+}
+
+bool
+PPL::Constraint::is_inconsistent() const {
+  assert(size() > 0);
+  const Constraint& x = *this;
+  if (x.all_homogeneous_terms_are_zero())
+    // The inhomogeneous term is the only non-zero coefficient.
+    if (is_equality())
+      return x[0] != 0;
+    else
+      // Non-strict inequality constraint.
+      return x[0] < 0;
+  else
+    // There is a non-zero homogeneous coefficient.
+    if (is_necessarily_closed())
+      return false;
+    else {
+      // The constraint is NOT necessarily closed.
+      const dimension_type eps_index = size() - 1;
+      if (x[eps_index] >= 0)
+	// If positive, we have found the constraint epsilon >= 0.
+	// If zero, one of the `true' dimensions has a non-zero coefficient.
+	// In both cases, it is not trivially false.
+	return false;
+      else {
+	// Here the epsilon coefficient is negative: strict inequality.
+	if (x[0] > 0)
+	  // A strict inequality such as `lhs + k > 0',
+	  // where k is a positive integer, cannot be trivially false.
+	  return false;
+	// Checking for another non-zero coefficient.
+	for (dimension_type i = eps_index; --i > 0; )
+	  if (x[i] != 0)
+	    return false;
+	// We have the inequality `k > 0',
+	// where k is zero or a negative integer.
+	return true;
+      }
+    }
+}
+
+bool
+PPL::Constraint::is_equivalent_to(const Constraint& y) const {
+  const Constraint& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  const Type x_type = x.type();
+  if (x_type != y.type()) {
+    // Check for special cases.
+    if (x.is_tautological())
+      return y.is_tautological();
+    else
+      return x.is_inconsistent() && y.is_inconsistent();
+  }
+
+  if (x_type == STRICT_INEQUALITY) {
+    // Due to the presence of epsilon-coefficients, syntactically
+    // different strict inequalities may actually encode the same
+    // topologically open half-space.
+    // First, drop the epsilon-coefficient ...
+    Linear_Expression x_expr(x);
+    Linear_Expression y_expr(y);
+    // ... then, re-normalize ...
+    x_expr.normalize();
+    y_expr.normalize();
+    // ... and finally check for syntactic equality.
+    for (dimension_type i = x_space_dim + 1; i-- > 0; )
+      if (x_expr[i] != y_expr[i])
+	return false;
+    return true;
+  }
+
+  // `x' and 'y' are of the same type and they are not strict inequalities;
+  // thus, the epsilon-coefficient, if present, is zero.
+  // It is sufficient to check for syntactic equality.
+  for (dimension_type i = x_space_dim + 1; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Constraint& c) {
+  const int num_variables = c.space_dimension();
+  bool first = true;
+  for (int v = 0; v < num_variables; ++v) {
+    Coefficient cv = c.coefficient(Variable(v));
+    if (cv != 0) {
+      if (!first) {
+	if (cv > 0)
+	  s << " + ";
+	else {
+	  s << " - ";
+	  neg_assign(cv);
+	}
+      }
+      else
+	first = false;
+      if (cv == -1)
+	s << "-";
+      else if (cv != 1)
+	s << cv << "*";
+      s << PPL::Variable(v);
+    }
+  }
+  if (first)
+    s << Coefficient_zero();
+  const char* relation_symbol = 0;
+  switch (c.type()) {
+  case Constraint::EQUALITY:
+    relation_symbol = " = ";
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    relation_symbol = " >= ";
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    relation_symbol = " > ";
+    break;
+  }
+  s << relation_symbol << -c.inhomogeneous_term();
+  return s;
+}
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Constraint::Type& t) {
+  const char* n = 0;
+  switch (t) {
+  case Constraint::EQUALITY:
+    n = "EQUALITY";
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    n = "NONSTRICT_INEQUALITY";
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    n = "STRICT_INEQUALITY";
+    break;
+  }
+  s << n;
+  return s;
+}
+
+PPL_OUTPUT_DEFINITIONS(Constraint);
+
+bool
+PPL::Constraint::OK() const {
+  // Topology consistency check.
+  const dimension_type min_size = is_necessarily_closed() ? 1 : 2;
+  if (size() < min_size) {
+#ifndef NDEBUG
+    std::cerr << "Constraint has fewer coefficients than the minimum "
+	      << "allowed by its topology:"
+	      << std::endl
+	      << "size is " << size()
+	      << ", minimum is " << min_size << "."
+	      << std::endl;
+#endif
+    return false;
+  }
+
+  // Normalization check.
+  Constraint tmp = *this;
+  tmp.strong_normalize();
+  if (tmp != *this) {
+#ifndef NDEBUG
+    std::cerr << "Constraint is not strongly normalized as it should be."
+	      << std::endl;
+#endif
+    return false;
+  }
+
+  // All tests passed.
+  return true;
+}
diff --git a/src/Constraint.defs.hh b/src/Constraint.defs.hh
new file mode 100644
index 0000000..95880de
--- /dev/null
+++ b/src/Constraint.defs.hh
@@ -0,0 +1,489 @@
+/* Constraint class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Constraint_defs_hh
+#define PPL_Constraint_defs_hh 1
+
+#include "Constraint.types.hh"
+#include "Scalar_Products.types.hh"
+#include "Linear_Row.defs.hh"
+#include "Variable.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Polyhedron.types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator==(const Constraint& x, const Constraint& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator!=(const Constraint& x, const Constraint& y);
+
+//! Returns the constraint \p e1 = \p e2.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+//! Returns the constraint \p e = \p n.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+//! Returns the constraint \p n = \p e.
+/*! \relates Constraint */
+Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \<= \p e2.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+//! Returns the constraint \p e \<= \p n.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+//! Returns the constraint \p n \<= \p e.
+/*! \relates Constraint */
+Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \>= \p e2.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+//! Returns the constraint \p e \>= \p n.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+//! Returns the constraint \p n \>= \p e.
+/*! \relates Constraint */
+Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \< \p e2.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+//! Returns the constraint \p e \< \p n.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+//! Returns the constraint \p n \< \p e.
+/*! \relates Constraint */
+Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \> \p e2.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+//! Returns the constraint \p e \> \p n.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+//! Returns the constraint \p n \> \p e.
+/*! \relates Constraint */
+Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+void swap(Parma_Polyhedra_Library::Constraint& x,
+	  Parma_Polyhedra_Library::Constraint& y);
+
+} // namespace std
+
+//! A linear equality or inequality.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Constraint is either:
+  - an equality: \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$;
+  - a non-strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b \geq 0\f$; or
+  - a strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b > 0\f$;
+
+  where \f$n\f$ is the dimension of the space,
+  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$
+  and \f$b\f$ is the integer inhomogeneous term.
+
+  \par How to build a constraint
+  Constraints are typically built by applying a relation symbol
+  to a pair of linear expressions.
+  Available relation symbols are equality (<CODE>==</CODE>),
+  non-strict inequalities (<CODE>\>=</CODE> and <CODE>\<=</CODE>) and
+  strict inequalities (<CODE>\<</CODE> and <CODE>\></CODE>).
+  The space dimension of a constraint is defined as the maximum
+  space dimension of the arguments of its constructor.
+
+  \par
+  In the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds the equality constraint
+  \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+  \code
+  Constraint eq_c(3*x + 5*y - z == 0);
+  \endcode
+  The following code builds the (non-strict) inequality constraint
+  \f$4x \geq 2y - 13\f$, having space dimension \f$2\f$:
+  \code
+  Constraint ineq_c(4*x >= 2*y - 13);
+  \endcode
+  The corresponding strict inequality constraint
+  \f$4x > 2y - 13\f$ is obtained as follows:
+  \code
+  Constraint strict_ineq_c(4*x > 2*y - 13);
+  \endcode
+  An unsatisfiable constraint on the zero-dimension space \f$\Rset^0\f$
+  can be specified as follows:
+  \code
+  Constraint false_c = Constraint::zero_dim_false();
+  \endcode
+  Equivalent, but more involved ways are the following:
+  \code
+  Constraint false_c1(Linear_Expression::zero() == 1);
+  Constraint false_c2(Linear_Expression::zero() >= 1);
+  Constraint false_c3(Linear_Expression::zero() > 0);
+  \endcode
+  In contrast, the following code defines an unsatisfiable constraint
+  having space dimension \f$3\f$:
+  \code
+  Constraint false_c(0*z == 1);
+  \endcode
+
+  \par How to inspect a constraint
+  Several methods are provided to examine a constraint and extract
+  all the encoded information: its space dimension, its type
+  (equality, non-strict inequality, strict inequality) and
+  the value of its integer coefficients.
+
+  \par Example 2
+  The following code shows how it is possible to access each single
+  coefficient of a constraint. Given an inequality constraint
+  (in this case \f$x - 5y + 3z \leq 4\f$), we construct a new constraint
+  corresponding to its complement (thus, in this case we want to obtain
+  the strict inequality constraint \f$x - 5y + 3z > 4\f$).
+  \code
+  Constraint c1(x - 5*y + 3*z <= 4);
+  cout << "Constraint c1: " << c1 << endl;
+  if (c1.is_equality())
+    cout << "Constraint c1 is not an inequality." << endl;
+  else {
+    Linear_Expression e;
+    for (int i = c1.space_dimension() - 1; i >= 0; i--)
+      e += c1.coefficient(Variable(i)) * Variable(i);
+    e += c1.inhomogeneous_term();
+    Constraint c2 = c1.is_strict_inequality() ? (e <= 0) : (e < 0);
+    cout << "Complement c2: " << c2 << endl;
+  }
+  \endcode
+  The actual output is the following:
+  \code
+  Constraint c1: -A + 5*B - 3*C >= -4
+  Complement c2: A - 5*B + 3*C > 4
+  \endcode
+  Note that, in general, the particular output obtained can be
+  syntactically different from the (semantically equivalent)
+  constraint considered.
+*/
+class Parma_Polyhedra_Library::Constraint : private Linear_Row {
+public:
+  //! Ordinary copy-constructor.
+  Constraint(const Constraint& c);
+
+  //! Destructor.
+  ~Constraint();
+
+  //! Assignment operator.
+  Constraint& operator=(const Constraint& c);
+
+  //! Returns the maximum space dimension a Constraint can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! The constraint type.
+  enum Type {
+    /*! The constraint is an equality. */
+    EQUALITY,
+    /*! The constraint is a non-strict inequality. */
+    NONSTRICT_INEQUALITY,
+    /*! The constraint is a strict inequality. */
+    STRICT_INEQUALITY
+  };
+
+  //! Returns the constraint type of \p *this.
+  Type type() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is an equality constraint.
+  */
+  bool is_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is an inequality constraint (either strict or non-strict).
+  */
+  bool is_inequality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a non-strict inequality constraint.
+  */
+  bool is_nonstrict_inequality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a strict inequality constraint.
+  */
+  bool is_strict_inequality() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument thrown if the index of \p v
+    is greater than or equal to the space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! The unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+  static const Constraint& zero_dim_false();
+
+  /*! \brief
+    The true (zero-dimension space) constraint \f$0 \leq 1\f$,
+    also known as <EM>positivity constraint</EM>.
+  */
+  static const Constraint& zero_dim_positivity();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a tautology (i.e., an always true constraint).
+
+    A tautology can have either one of the following forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 = 0\f$; or
+    - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+      where \f$b \geq 0\f$; or
+    - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+      where \f$b > 0\f$.
+  */
+  bool is_tautological() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is inconsistent (i.e., an always false constraint).
+
+    An inconsistent constraint can have either one of the following forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b = 0\f$,
+      where \f$b \neq 0\f$; or
+    - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+      where \f$b < 0\f$; or
+    - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+      where \f$b \leq 0\f$.
+  */
+  bool is_inconsistent() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent constraints.
+
+    Constraints having different space dimensions are not equivalent.
+    Note that constraints having different types may nonetheless be
+    equivalent, if they both are tautologies or inconsistent.
+  */
+  bool is_equivalent_to(const Constraint& y) const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Constraint& y);
+
+private:
+  friend class Parma_Polyhedra_Library::Congruence;
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
+  friend class Parma_Polyhedra_Library::Constraint_System;
+  friend class Parma_Polyhedra_Library::Constraint_System::const_iterator;
+  // FIXME: the following friend declaration should be avoided.
+  friend class Parma_Polyhedra_Library::Polyhedron;
+
+  friend
+  Parma_Polyhedra_Library
+  ::Linear_Expression::Linear_Expression(const Constraint& c);
+
+  //! Default constructor: private and not implemented.
+  Constraint();
+
+  /*! \brief
+    Builds a constraint of type \p type and topology \p topology,
+    stealing the coefficients from \p e.
+  */
+  Constraint(Linear_Expression& e, Type type, Topology topology);
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+			       const char* name_var,
+			       Variable v) const;
+
+  friend Constraint
+  Parma_Polyhedra_Library::operator==(const Linear_Expression& e1,
+				      const Linear_Expression& e2);
+  friend Constraint
+  Parma_Polyhedra_Library::operator==(const Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+  friend Constraint
+  Parma_Polyhedra_Library::operator==(Coefficient_traits::const_reference n,
+				      const Linear_Expression& e);
+
+  friend Constraint
+  Parma_Polyhedra_Library::operator>=(const Linear_Expression& e1,
+				      const Linear_Expression& e2);
+  friend Constraint
+  Parma_Polyhedra_Library::operator>=(const Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+  friend Constraint
+  Parma_Polyhedra_Library::operator>=(Coefficient_traits::const_reference n,
+				      const Linear_Expression& e);
+
+  friend Constraint
+  Parma_Polyhedra_Library::operator<=(const Linear_Expression& e1,
+				      const Linear_Expression& e2);
+  friend Constraint
+  Parma_Polyhedra_Library::operator<=(const Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+  friend Constraint
+  Parma_Polyhedra_Library::operator<=(Coefficient_traits::const_reference n,
+				      const Linear_Expression& e);
+
+  friend Constraint
+  Parma_Polyhedra_Library::operator>(const Linear_Expression& e1,
+				     const Linear_Expression& e2);
+  friend Constraint
+  Parma_Polyhedra_Library::operator>(const Linear_Expression& e,
+				     Coefficient_traits::const_reference n);
+  friend Constraint
+  Parma_Polyhedra_Library::operator>(Coefficient_traits::const_reference n,
+				     const Linear_Expression& e);
+
+  friend Constraint
+  Parma_Polyhedra_Library::operator<(const Linear_Expression& e1,
+				     const Linear_Expression& e2);
+  friend Constraint
+  Parma_Polyhedra_Library::operator<(const Linear_Expression& e,
+				     Coefficient_traits::const_reference n);
+  friend Constraint
+  Parma_Polyhedra_Library::operator<(Coefficient_traits::const_reference n,
+				     const Linear_Expression& e);
+
+  //! Copy-constructor with given size.
+  Constraint(const Constraint& c, dimension_type sz);
+
+  /*! \brief
+    Builds a new copy of the zero-dimension space constraint
+    \f$\epsilon \geq 0\f$ (used to implement NNC polyhedra).
+  */
+  static Constraint construct_epsilon_geq_zero();
+
+  //! Returns the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+  static const Constraint& epsilon_geq_zero();
+
+  /*! \brief
+    The zero-dimension space constraint \f$\epsilon \leq 1\f$
+    (used to implement NNC polyhedra).
+  */
+  static const Constraint& epsilon_leq_one();
+
+  //! Sets the constraint type to <CODE>EQUALITY</CODE>.
+  void set_is_equality();
+
+  //! Sets the constraint to be an inequality.
+  /*!
+    Whether the constraint type will become <CODE>NONSTRICT_INEQUALITY</CODE>
+    or <CODE>STRICT_INEQUALITY</CODE> depends on the topology and the value
+    of the low-level coefficients of the constraint.
+  */
+  void set_is_inequality();
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint& c);
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Constraint.inlines.hh"
+
+#endif // !defined(PPL_Constraint_defs_hh)
diff --git a/src/Constraint.inlines.hh b/src/Constraint.inlines.hh
new file mode 100644
index 0000000..c213ecb
--- /dev/null
+++ b/src/Constraint.inlines.hh
@@ -0,0 +1,343 @@
+/* Constraint class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Constraint_inlines_hh
+#define PPL_Constraint_inlines_hh 1
+
+#include "Linear_Expression.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint::Constraint(Linear_Expression& e, Type type, Topology topology) {
+  assert(type != STRICT_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+  Linear_Row::swap(e);
+  flags() = Flags(topology, (type == EQUALITY
+			     ? LINE_OR_EQUALITY
+			     : RAY_OR_POINT_OR_INEQUALITY));
+}
+
+inline
+Constraint::Constraint(const Constraint& c)
+  : Linear_Row(c) {
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type sz)
+  : Linear_Row(c, sz, sz) {
+}
+
+inline
+Constraint::~Constraint() {
+}
+
+inline Constraint&
+Constraint::operator=(const Constraint& c) {
+  Linear_Row::operator=(c);
+  return *this;
+}
+
+inline dimension_type
+Constraint::max_space_dimension() {
+  return Linear_Row::max_space_dimension();
+}
+
+inline dimension_type
+Constraint::space_dimension() const {
+  return Linear_Row::space_dimension();
+}
+
+inline bool
+Constraint::is_equality() const {
+  return is_line_or_equality();
+}
+
+inline bool
+Constraint::is_inequality() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline Constraint::Type
+Constraint::type() const {
+  if (is_equality())
+    return EQUALITY;
+  if (is_necessarily_closed())
+    return NONSTRICT_INEQUALITY;
+  else
+    return ((*this)[size() - 1] < 0)
+      ? STRICT_INEQUALITY
+      : NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_nonstrict_inequality() const {
+  return type() == NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_strict_inequality() const {
+  return type() == STRICT_INEQUALITY;
+}
+
+inline void
+Constraint::set_is_equality() {
+  set_is_line_or_equality();
+}
+
+inline void
+Constraint::set_is_inequality() {
+  set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Constraint::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Constraint::inhomogeneous_term() const {
+  return Linear_Row::inhomogeneous_term();
+}
+
+inline memory_size_type
+Constraint::external_memory_in_bytes() const {
+  return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint::total_memory_in_bytes() const {
+  return Linear_Row::total_memory_in_bytes();
+}
+
+/*! \relates Constraint */
+inline bool
+operator==(const Constraint& x, const Constraint& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline bool
+operator!=(const Constraint& x, const Constraint& y) {
+  return !x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff = e1 - e2;
+  Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.strong_normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff = e1 - e2;
+  Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff;
+  // Setting the epsilon coefficient to -1.
+  // NOTE: this also enforces normalization.
+  const dimension_type e1_dim = e1.space_dimension();
+  const dimension_type e2_dim = e2.space_dimension();
+  if (e1_dim > e2_dim)
+    diff -= Variable(e1_dim);
+  else
+    diff -= Variable(e2_dim);
+  diff += e1;
+  diff -= e2;
+
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff = n - e;
+  Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.strong_normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff = n - e;
+  Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff;
+  // Setting the epsilon coefficient to -1.
+  // NOTE: this also enforces normalization.
+  diff -= Variable(e.space_dimension());
+  diff += n;
+  diff -= e;
+
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff = e - n;
+  Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.strong_normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff = e - n;
+  Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff;
+  // Setting the epsilon coefficient to -1.
+  // NOTE: this also enforces normalization.
+  diff -= Variable(e.space_dimension());
+  diff += e;
+  diff -= n;
+
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+  c.set_not_necessarily_closed();
+  c.set_is_inequality();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return e2 >= e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  return e >= n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n >= e;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return e2 > e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  return e > n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n > e;
+}
+
+inline const Constraint&
+Constraint::zero_dim_false() {
+  static const Constraint zdf(Linear_Expression::zero() == Coefficient_one());
+  return zdf;
+}
+
+inline const Constraint&
+Constraint::zero_dim_positivity() {
+  static const Constraint zdp(Linear_Expression::zero() <= Coefficient_one());
+  return zdp;
+}
+
+inline const Constraint&
+Constraint::epsilon_geq_zero() {
+  static const Constraint eps_geq_zero = construct_epsilon_geq_zero();
+  return eps_geq_zero;
+}
+
+inline const Constraint&
+Constraint::epsilon_leq_one() {
+  static const Constraint
+    eps_leq_one(Linear_Expression::zero() < Coefficient_one());
+  return eps_leq_one;
+}
+
+inline void
+Constraint::ascii_dump(std::ostream& s) const {
+  Linear_Row::ascii_dump(s);
+}
+
+inline bool
+Constraint::ascii_load(std::istream& s) {
+  return Linear_Row::ascii_load(s);
+}
+
+inline void
+Constraint::swap(Constraint& y) {
+  Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+inline void
+swap(Parma_Polyhedra_Library::Constraint& x,
+     Parma_Polyhedra_Library::Constraint& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Constraint_inlines_hh)
diff --git a/src/Constraint.types.hh b/src/Constraint.types.hh
new file mode 100644
index 0000000..6750d8c
--- /dev/null
+++ b/src/Constraint.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Constraint_types_hh
+#define PPL_Constraint_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constraint_types_hh)
diff --git a/src/Constraint_System.cc b/src/Constraint_System.cc
new file mode 100644
index 0000000..8ab6f17
--- /dev/null
+++ b/src/Constraint_System.cc
@@ -0,0 +1,594 @@
+/* Constraint_System class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "Generator.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cassert>
+#include <string>
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::Constraint_System::
+adjust_topology_and_space_dimension(const Topology new_topology,
+				    const dimension_type new_space_dim) {
+  assert(space_dimension() <= new_space_dim);
+
+  const dimension_type old_space_dim = space_dimension();
+  const Topology old_topology = topology();
+  dimension_type cols_to_be_added = new_space_dim - old_space_dim;
+
+  // Dealing with empty constraint systems first.
+  if (num_rows() == 0) {
+    if (num_columns() == 0)
+      if (new_topology == NECESSARILY_CLOSED) {
+	add_zero_columns(++cols_to_be_added);
+	set_necessarily_closed();
+      }
+      else {
+	cols_to_be_added += 2;
+	add_zero_columns(cols_to_be_added);
+	set_not_necessarily_closed();
+      }
+    else
+      // Here `num_columns() > 0'.
+      if (old_topology != new_topology)
+	if (new_topology == NECESSARILY_CLOSED) {
+	  switch (cols_to_be_added) {
+	  case 0:
+	    remove_trailing_columns(1);
+	    break;
+	  case 1:
+	    // Nothing to do.
+	    break;
+	  default:
+	    add_zero_columns(--cols_to_be_added);
+	  }
+	  set_necessarily_closed();
+	}
+	else {
+	  // Here old_topology == NECESSARILY_CLOSED
+	  //  and new_topology == NOT_NECESSARILY_CLOSED.
+	  add_zero_columns(++cols_to_be_added);
+	  set_not_necessarily_closed();
+	}
+      else {
+	// Here topologies agree.
+	if (cols_to_be_added > 0)
+	  add_zero_columns(cols_to_be_added);
+      }
+    assert(OK());
+    return true;
+  }
+
+  // Here `num_rows() > 0'.
+  if (cols_to_be_added > 0)
+    if (old_topology != new_topology)
+      if (new_topology == NECESSARILY_CLOSED) {
+	// A NOT_NECESSARILY_CLOSED constraint system
+	// can be converted to a NECESSARILY_CLOSED one
+	// only if it does not contain strict inequalities.
+	if (has_strict_inequalities())
+	  return false;
+	// Since there were no strict inequalities,
+	// the only constraints that may have a non-zero epsilon coefficient
+	// are the eps-leq-one and the eps-geq-zero constraints.
+	// If they are present, we erase these rows, so that the
+	// epsilon column will only contain zeroes: as a consequence,
+	// we just decrement the number of columns to be added.
+	Constraint_System& cs = *this;
+	const dimension_type eps_index = old_space_dim + 1;
+	dimension_type cs_num_rows = cs.num_rows();
+	bool was_sorted = cs.is_sorted();
+	if (was_sorted)
+	  cs.set_sorted(false);
+
+	// If we have no pending rows, we only check if
+	// we must erase some rows.
+	if (cs.num_pending_rows() == 0) {
+	  for (dimension_type i = cs_num_rows; i-- > 0; )
+	    if (cs[i][eps_index] != 0) {
+	      --cs_num_rows;
+	      std::swap(cs[i], cs[cs_num_rows]);
+	    }
+	  cs.erase_to_end(cs_num_rows);
+	  cs.unset_pending_rows();
+	}
+	else {
+	  // There are pending rows, and we cannot swap them
+	  // into the non-pending part of the matrix.
+	  // Thus, we first work on the non-pending part as if it was
+	  // an independent matrix; then we work on the pending part.
+	  const dimension_type old_first_pending = cs.first_pending_row();
+	  dimension_type new_first_pending = old_first_pending;
+	  for (dimension_type i = new_first_pending; i-- > 0; )
+	    if (cs[i][eps_index] != 0) {
+	      --new_first_pending;
+	      std::swap(cs[i], cs[new_first_pending]);
+	    }
+	  const dimension_type num_swaps
+	    = old_first_pending - new_first_pending;
+          cs.set_index_first_pending_row(new_first_pending);
+	  // Move the swapped rows to the real end of the matrix.
+	  for (dimension_type i = num_swaps; i-- > 0; )
+	    std::swap(cs[old_first_pending - i], cs[cs_num_rows - i]);
+	  cs_num_rows -= num_swaps;
+	  // Now iterate through the pending rows.
+	  for (dimension_type i = cs_num_rows; i-- > new_first_pending; )
+	    if (cs[i][eps_index] != 0) {
+	      --cs_num_rows;
+	      std::swap(cs[i], cs[cs_num_rows]);
+	    }
+	  cs.erase_to_end(cs_num_rows);
+	}
+
+	// If `cs' was sorted we sort it again.
+	if (was_sorted)
+	  cs.sort_rows();
+	if (--cols_to_be_added > 0)
+	  add_zero_columns(cols_to_be_added);
+	set_necessarily_closed();
+      }
+      else {
+	// A NECESSARILY_CLOSED constraint system is converted to
+	// a NOT_NECESSARILY_CLOSED one by adding a further column
+	// of zeroes for the epsilon coefficients.
+	add_zero_columns(++cols_to_be_added);
+	set_not_necessarily_closed();
+      }
+    else {
+      // Topologies agree: first add the required zero columns ...
+      add_zero_columns(cols_to_be_added);
+      // ... and, if needed, move the epsilon coefficients
+      // to the new last column.
+      if (old_topology == NOT_NECESSARILY_CLOSED)
+	swap_columns(old_space_dim + 1, new_space_dim + 1);
+    }
+  else
+    // Here `cols_to_be_added == 0'.
+    if (old_topology != new_topology)
+      if (new_topology == NECESSARILY_CLOSED) {
+	// A NOT_NECESSARILY_CLOSED constraint system
+	// can be converted to a NECESSARILY_CLOSED one
+	// only if it does not contain strict inequalities.
+	if (has_strict_inequalities())
+	  return false;
+	// We just remove the column of the epsilon coefficients.
+	remove_trailing_columns(1);
+	set_necessarily_closed();
+      }
+      else {
+	// We just add the column of the epsilon coefficients.
+	add_zero_columns(1);
+	set_not_necessarily_closed();
+      }
+  // We successfully adjusted space dimensions and topology.
+  assert(OK());
+  return true;
+}
+
+bool
+PPL::Constraint_System::has_strict_inequalities() const {
+  if (is_necessarily_closed())
+    return false;
+  const Constraint_System& cs = *this;
+  const dimension_type eps_index = cs.num_columns() - 1;
+  // We verify if the system has strict inequalities
+  // also in the pending part.
+  for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+    const Constraint& c = cs[i];
+    // Optimized type checking: we already know the topology;
+    // also, equalities have the epsilon coefficient equal to zero.
+    // NOTE: the constraint eps_leq_one should not be considered
+    //       a strict inequality.
+    if (c[eps_index] < 0 && !c.is_tautological())
+      return true;
+  }
+  return false;
+}
+
+void
+PPL::Constraint_System::insert(const Constraint& c) {
+  // We are sure that the matrix has no pending rows
+  // and that the new row is not a pending constraint.
+  assert(num_pending_rows() == 0);
+  if (topology() == c.topology())
+    Linear_System::insert(c);
+  else
+    // `*this' and `c' have different topologies.
+    if (is_necessarily_closed()) {
+      // Padding the matrix with a columns of zeroes
+      // corresponding to the epsilon coefficients.
+      add_zero_columns(1);
+      set_not_necessarily_closed();
+      Linear_System::insert(c);
+    }
+    else {
+      // Here `*this' is NNC and `c' is necessarily closed.
+      // Copying the constraint adding the epsilon coefficient
+      // and the missing space dimensions, if any.
+      // FIXME: provide a resizing copy-constructor taking
+      // topology and the space dimension.
+      const dimension_type new_size = 2 + std::max(c.space_dimension(),
+						   space_dimension());
+      Constraint tmp_c(c, new_size);
+      tmp_c.set_not_necessarily_closed();
+      Linear_System::insert(tmp_c);
+    }
+  assert(OK());
+}
+
+void
+PPL::Constraint_System::insert_pending(const Constraint& c) {
+  if (topology() == c.topology())
+    Linear_System::insert_pending(c);
+  else
+    // `*this' and `c' have different topologies.
+    if (is_necessarily_closed()) {
+      // Padding the matrix with a columns of zeroes
+      // corresponding to the epsilon coefficients.
+      add_zero_columns(1);
+      set_not_necessarily_closed();
+      Linear_System::insert_pending(c);
+    }
+    else {
+      // Here `*this' is NNC and `c' is necessarily closed.
+      // Copying the constraint adding the epsilon coefficient
+      // and the missing space dimensions, if any.
+      const dimension_type new_size = 2 + std::max(c.space_dimension(),
+						   space_dimension());
+      Constraint tmp_c(c, new_size);
+      tmp_c.set_not_necessarily_closed();
+      Linear_System::insert_pending(tmp_c);
+    }
+  assert(OK());
+}
+
+PPL::dimension_type
+PPL::Constraint_System::num_inequalities() const {
+  // We are sure that we call this method only when
+  // the matrix has no pending rows.
+  assert(num_pending_rows() == 0);
+  const Constraint_System& cs = *this;
+  dimension_type n = 0;
+  // If the Linear_System happens to be sorted, take advantage of the fact
+  // that inequalities are at the bottom of the system.
+  if (is_sorted())
+    for (dimension_type i = num_rows(); i > 0 && cs[--i].is_inequality(); )
+      ++n;
+  else
+    for (dimension_type i = num_rows(); i-- > 0 ; )
+      if (cs[i].is_inequality())
+	++n;
+  return n;
+}
+
+PPL::dimension_type
+PPL::Constraint_System::num_equalities() const {
+  // We are sure that we call this method only when
+  // the matrix has no pending rows.
+  assert(num_pending_rows() == 0);
+  return num_rows() - num_inequalities();
+}
+
+void
+PPL::Constraint_System::const_iterator::skip_forward() {
+  const Linear_System::const_iterator csp_end = csp->end();
+  while (i != csp_end && (*this)->is_tautological())
+    ++i;
+}
+
+bool
+PPL::Constraint_System::satisfies_all_constraints(const Generator& g) const {
+  assert(g.space_dimension() <= space_dimension());
+
+  // Setting `sps' to the appropriate scalar product sign operator.
+  // This also avoids problems when having _legal_ topology mismatches
+  // (which could also cause a mismatch in the number of columns).
+  Topology_Adjusted_Scalar_Product_Sign sps(g);
+
+  const Constraint_System& cs = *this;
+  if (cs.is_necessarily_closed()) {
+    if (g.is_line()) {
+      // Lines must saturate all constraints.
+      for (dimension_type i = cs.num_rows(); i-- > 0; )
+	if (sps(g, cs[i]) != 0)
+	  return false;
+    }
+    else
+      // `g' is either a ray, a point or a closure point.
+      for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+	const Constraint& c = cs[i];
+	const int sp_sign = sps(g, c);
+	if (c.is_inequality()) {
+	  // As `cs' is necessarily closed,
+	  // `c' is a non-strict inequality.
+	  if (sp_sign < 0)
+	    return false;
+	}
+	else
+	  // `c' is an equality.
+	  if (sp_sign != 0)
+	    return false;
+      }
+  }
+  else
+    // `cs' is not necessarily closed.
+    switch (g.type()) {
+
+    case Generator::LINE:
+      // Lines must saturate all constraints.
+      for (dimension_type i = cs.num_rows(); i-- > 0; )
+	if (sps(g, cs[i]) != 0)
+	  return false;
+      break;
+
+    case Generator::POINT:
+      // Have to perform the special test
+      // when dealing with a strict inequality.
+      for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+	const Constraint& c = cs[i];
+	const int sp_sign = sps(g, c);
+	switch (c.type()) {
+	case Constraint::EQUALITY:
+	  if (sp_sign != 0)
+	    return false;
+	  break;
+	case Constraint::NONSTRICT_INEQUALITY:
+	  if (sp_sign < 0)
+	    return false;
+	  break;
+	case Constraint::STRICT_INEQUALITY:
+	  if (sp_sign <= 0)
+	    return false;
+	  break;
+	}
+      }
+      break;
+
+    case Generator::RAY:
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+	const Constraint& c = cs[i];
+	const int sp_sign = sps(g, c);
+	if (c.is_inequality()) {
+	  // Constraint `c' is either a strict or a non-strict inequality.
+	  if (sp_sign < 0)
+	    return false;
+	}
+	else
+	  // Constraint `c' is an equality.
+	  if (sp_sign != 0)
+	    return false;
+      }
+      break;
+    }
+
+  // If we reach this point, `g' satisfies all constraints.
+  return true;
+}
+
+
+void
+PPL::Constraint_System
+::affine_preimage(const dimension_type v,
+		  const Linear_Expression& expr,
+		  Coefficient_traits::const_reference denominator) {
+  Constraint_System& x = *this;
+  // `v' is the index of a column corresponding to
+  // a "user" variable (i.e., it cannot be the inhomogeneous term,
+  // nor the epsilon dimension of NNC polyhedra).
+  assert(v > 0 && v <= x.space_dimension());
+  assert(expr.space_dimension() <= x.space_dimension());
+  assert(denominator > 0);
+
+  const dimension_type n_columns = x.num_columns();
+  const dimension_type n_rows = x.num_rows();
+  const dimension_type expr_size = expr.size();
+  const bool not_invertible = (v >= expr_size || expr[v] == 0);
+
+  if (denominator != 1)
+    for (dimension_type i = n_rows; i-- > 0; ) {
+      Constraint& row = x[i];
+      Coefficient& row_v = row[v];
+      if (row_v != 0) {
+	for (dimension_type j = n_columns; j-- > 0; )
+	  if (j != v) {
+	    Coefficient& row_j = row[j];
+	    row_j *= denominator;
+	    if (j < expr_size)
+	      add_mul_assign(row_j, row_v, expr[j]);
+	  }
+	if (not_invertible)
+	  row_v = 0;
+	else
+	  row_v *= expr[v];
+      }
+    }
+  else
+    // Here `denominator' == 1: optimized computation
+    // only considering columns having indexes < expr_size.
+    for (dimension_type i = n_rows; i-- > 0; ) {
+      Constraint& row = x[i];
+      Coefficient& row_v = row[v];
+      if (row_v != 0) {
+	for (dimension_type j = expr_size; j-- > 0; )
+	  if (j != v)
+	    add_mul_assign(row[j], row_v, expr[j]);
+	if (not_invertible)
+	  row_v = 0;
+	else
+	  row_v *= expr[v];
+      }
+    }
+  // Strong normalization also resets the sortedness flag.
+  x.strong_normalize();
+}
+
+void
+PPL::Constraint_System::ascii_dump(std::ostream& s) const {
+  const Constraint_System& x = *this;
+  const dimension_type x_num_rows = x.num_rows();
+  const dimension_type x_num_columns = x.num_columns();
+  s << "topology " << (is_necessarily_closed()
+		       ? "NECESSARILY_CLOSED"
+		       : "NOT_NECESSARILY_CLOSED")
+    << "\n"
+    << x_num_rows << " x " << x_num_columns << ' '
+    << (x.is_sorted() ? "(sorted)" : "(not_sorted)")
+    << "\n"
+    << "index_first_pending " << x.first_pending_row()
+    << "\n";
+  for (dimension_type i = 0; i < x_num_rows; ++i) {
+    const Constraint& c = x[i];
+    for (dimension_type j = 0; j < x_num_columns; ++j)
+      s << c[j] << ' ';
+    switch (c.type()) {
+    case Constraint::EQUALITY:
+      s << "=";
+      break;
+    case Constraint::NONSTRICT_INEQUALITY:
+      s << ">=";
+      break;
+    case Constraint::STRICT_INEQUALITY:
+      s << ">";
+      break;
+    }
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_DEFINITIONS(Constraint_System);
+
+bool
+PPL::Constraint_System::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str) || str != "topology")
+    return false;
+  if (!(s >> str))
+    return false;
+  if (str == "NECESSARILY_CLOSED")
+    set_necessarily_closed();
+  else {
+    if (str != "NOT_NECESSARILY_CLOSED")
+      return false;
+    set_not_necessarily_closed();
+  }
+
+  dimension_type nrows;
+  dimension_type ncols;
+  if (!(s >> nrows))
+    return false;
+  if (!(s >> str))
+    return false;
+  if (!(s >> ncols))
+      return false;
+  resize_no_copy(nrows, ncols);
+
+  if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
+    return false;
+  set_sorted(str == "(sorted)");
+  dimension_type index;
+  if (!(s >> str) || str != "index_first_pending")
+    return false;
+  if (!(s >> index))
+    return false;
+  set_index_first_pending_row(index);
+
+  Constraint_System& x = *this;
+  for (dimension_type i = 0; i < x.num_rows(); ++i) {
+    for (dimension_type j = 0; j < x.num_columns(); ++j)
+      if (!(s >> x[i][j]))
+	return false;
+
+    if (!(s >> str))
+      return false;
+    if (str == "=")
+      x[i].set_is_equality();
+    else
+      x[i].set_is_inequality();
+
+    // Checking for equality of actual and declared types.
+    switch (x[i].type()) {
+    case Constraint::EQUALITY:
+      if (str == "=")
+	continue;
+      break;
+    case Constraint::NONSTRICT_INEQUALITY:
+      if (str == ">=")
+	continue;
+      break;
+    case Constraint::STRICT_INEQUALITY:
+      if (str == ">")
+	continue;
+      break;
+    }
+    // Reaching this point means that the input was illegal.
+    return false;
+  }
+  // Check for well-formedness.
+  assert(OK());
+  return true;
+}
+
+bool
+PPL::Constraint_System::OK() const {
+  // A Constraint_System must be a valid Linear_System; do not check for
+  // strong normalization, since this will be done when
+  // checking each individual constraint.
+  if (!Linear_System::OK(false))
+    return false;
+
+  // Checking each constraint in the system.
+  const Constraint_System& x = *this;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    if (!x[i].OK())
+      return false;
+
+  // All checks passed.
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Constraint_System& cs) {
+  Constraint_System::const_iterator i = cs.begin();
+  const Constraint_System::const_iterator cs_end = cs.end();
+  if (i == cs_end)
+    s << "true";
+  else {
+    while (i != cs_end) {
+      s << *i++;
+      if (i != cs_end)
+	s << ", ";
+    }
+  }
+  return s;
+}
diff --git a/src/Constraint_System.defs.hh b/src/Constraint_System.defs.hh
new file mode 100644
index 0000000..53789bf
--- /dev/null
+++ b/src/Constraint_System.defs.hh
@@ -0,0 +1,394 @@
+/* Constraint_System class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Constraint_System_defs_hh
+#define PPL_Constraint_System_defs_hh 1
+
+#include "Constraint_System.types.hh"
+#include "Linear_Expression.types.hh"
+#include "Linear_System.defs.hh"
+#include "Generator.types.hh"
+#include "Polyhedron.types.hh"
+#include "Constraint.types.hh"
+#include "LP_Problem.types.hh"
+#include <iterator>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Constraint_System
+  Writes <CODE>true</CODE> if \p cs is empty.  Otherwise, writes on
+  \p s the constraints of \p cs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Constraint_System& cs);
+
+} // namespace IO_Operators
+
+// Put it in the namespace here to declare it friend later.
+/*! \relates Polyhedron */
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+void swap(Parma_Polyhedra_Library::Constraint_System& x,
+	  Parma_Polyhedra_Library::Constraint_System& y);
+
+} // namespace std
+
+//! A system of constraints.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Constraint_System is a system of constraints,
+    i.e., a multiset of objects of the class Constraint.
+    When inserting constraints in a system, space dimensions are
+    automatically adjusted so that all the constraints in the system
+    are defined on the same vector space.
+
+    \par
+    In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code builds a system of constraints corresponding to
+    a square in \f$\Rset^2\f$:
+    \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  cs.insert(y >= 0);
+  cs.insert(y <= 3);
+    \endcode
+    Note that:
+    the constraint system is created with space dimension zero;
+    the first and third constraint insertions increase the space
+    dimension to \f$1\f$ and \f$2\f$, respectively.
+
+    \par Example 2
+    By adding four strict inequalities to the constraint system
+    of the previous example, we can remove just the four
+    vertices from the square defined above.
+    \code
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 6);
+  cs.insert(x - y < 3);
+  cs.insert(y - x < 3);
+    \endcode
+
+    \par Example 3
+    The following code builds a system of constraints corresponding to
+    a half-strip in \f$\Rset^2\f$:
+    \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x - y <= 0);
+  cs.insert(x - y + 1 >= 0);
+    \endcode
+
+    \note
+    After inserting a multiset of constraints in a constraint system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> constraint system
+    will be available, where original constraints may have been
+    reordered, removed (if they are trivial, duplicate or
+    implied by other constraints), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Constraint_System : private Linear_System {
+public:
+  //! Default constructor: builds an empty system of constraints.
+  Constraint_System();
+
+  //! Builds the singleton system containing only constraint \p c.
+  explicit Constraint_System(const Constraint& c);
+
+  //! Ordinary copy-constructor.
+  Constraint_System(const Constraint_System& cs);
+
+  //! Destructor.
+  ~Constraint_System();
+
+  //! Assignment operator.
+  Constraint_System& operator=(const Constraint_System& y);
+
+  //! Returns the maximum space dimension a Constraint_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more strict inequality constraints.
+  */
+  bool has_strict_inequalities() const;
+
+  /*! \brief
+    Removes all the constraints from the constraint system
+    and sets its space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the constraint \p c,
+    increasing the number of space dimensions if needed.
+  */
+  void insert(const Constraint& c);
+
+  /*! \brief
+    Returns the singleton system containing only
+    Constraint::zero_dim_false().
+  */
+  static const Constraint_System& zero_dim_empty();
+
+  //! An iterator over a system of constraints.
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each constraint contained in a Constraint_System object.
+
+    \par Example
+    The following code prints the system of constraints
+    defining the polyhedron <CODE>ph</CODE>:
+    \code
+  const Constraint_System& cs = ph.constraints();
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    cout << *i << endl;
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+			   Constraint,
+			   ptrdiff_t,
+			   const Constraint*,
+			   const Constraint&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Constraint& operator*() const;
+
+    //! Indirect member selector.
+    const Constraint* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Constraint_System;
+
+    //! The const iterator over the matrix of constraints.
+    Linear_System::const_iterator i;
+
+    //! A const pointer to the matrix of constraints.
+    const Linear_System* csp;
+
+    //! Constructor.
+    const_iterator(const Linear_System::const_iterator& iter,
+		   const Constraint_System& csys);
+
+    //! \p *this skips to the next non-trivial constraint.
+    void skip_forward();
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first constraint,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Linear_System and each row in the system is a valid Constraint.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Constraint_System& y);
+
+private:
+  friend class const_iterator;
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  friend class Parma_Polyhedra_Library::LP_Problem;
+
+  friend bool
+  Parma_Polyhedra_Library::operator==(const Polyhedron& x,
+				      const Polyhedron& y);
+
+  //! Builds an empty system of constraints having the specified topology.
+  explicit Constraint_System(Topology topol);
+
+  /*! \brief
+    Builds a system of \p n_rows constraints on a \p n_columns - 1
+    dimensional space (including the \f$\epsilon\f$ dimension, if
+    \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE>).
+  */
+  Constraint_System(Topology topol,
+		    dimension_type n_rows, dimension_type n_columns);
+
+  /*! \brief
+    Adjusts \p *this so that it matches the topology and
+    the number of space dimensions given as parameters
+    (adding or removing columns if needed).
+    Returns <CODE>false</CODE> if and only if \p topol is
+    equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+    contains strict inequalities.
+  */
+  bool adjust_topology_and_space_dimension(Topology topol,
+					   dimension_type num_dimensions);
+
+  //! Returns the \p k- th constraint of the system.
+  Constraint& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k- th constraint of the system.
+  const Constraint& operator[](dimension_type k) const;
+
+  //! Returns <CODE>true</CODE> if \p g satisfies all the constraints.
+  bool satisfies_all_constraints(const Generator& g) const;
+
+  //! Substitutes a given column of coefficients by a given affine expression.
+  /*!
+    \param v
+    Index of the column to which the affine transformation is substituted.
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We want to allow affine transformations
+    (see Section \ref Images_and_Preimages_of_Affine_Transfer_Relations)
+    having any rational coefficients. Since the coefficients of the
+    constraints are integers we must also provide an integer \p
+    denominator that will be used as denominator of the affine
+    transformation.
+    The denominator is required to be a positive integer.
+
+    The affine transformation substitutes the matrix of constraints
+    by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+    the old one \f$a_{ij}\f$ as follows:
+    \f[
+      {a'}_{ij} =
+        \begin{cases}
+          a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+            \quad \text{for } j \neq v; \\
+          \mathrm{expr}[v] * a_{iv}
+            \quad \text{for } j = v.
+        \end{cases}
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_preimage(dimension_type v,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator);
+
+  //! Returns the number of equality constraints.
+  dimension_type num_equalities() const;
+
+  //! Returns the number of inequality constraints.
+  dimension_type num_inequalities() const;
+
+  /*! \brief
+    Applies Gaussian's elimination and back-substitution so as
+    to provide a partial simplification of the system of constraints.
+
+    It is assumed that the system has no pending constraints.
+  */
+  void simplify();
+
+  /*! \brief
+    Inserts in \p *this a copy of the constraint \p c,
+    increasing the number of space dimensions if needed.
+    It is a pending constraint.
+  */
+  void insert_pending(const Constraint& c);
+
+  //! Adds low-level constraints to the constraint system.
+  void add_low_level_constraints();
+};
+
+// Constraint_System.inlines.hh is not included here on purpose.
+
+#endif // !defined(PPL_Constraint_System_defs_hh)
diff --git a/src/Constraint_System.inlines.hh b/src/Constraint_System.inlines.hh
new file mode 100644
index 0000000..be17a33
--- /dev/null
+++ b/src/Constraint_System.inlines.hh
@@ -0,0 +1,220 @@
+/* Constraint_System class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Constraint_System_inlines_hh
+#define PPL_Constraint_System_inlines_hh 1
+
+#include "Constraint.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint_System::Constraint_System()
+  : Linear_System(NECESSARILY_CLOSED) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint& c)
+  : Linear_System(c.topology()) {
+  Linear_System::insert(c);
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs)
+  : Linear_System(cs) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol)
+  : Linear_System(topol) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol,
+				     const dimension_type n_rows,
+				     const dimension_type n_columns)
+  : Linear_System(topol, n_rows, n_columns) {
+}
+
+inline
+Constraint_System::~Constraint_System() {
+}
+
+inline Constraint_System&
+Constraint_System::operator=(const Constraint_System& y) {
+  Linear_System::operator=(y);
+  return *this;
+}
+
+inline Constraint&
+Constraint_System::operator[](const dimension_type k) {
+  return static_cast<Constraint&>(Linear_System::operator[](k));
+}
+
+inline const Constraint&
+Constraint_System::operator[](const dimension_type k) const {
+  return static_cast<const Constraint&>(Linear_System::operator[](k));
+}
+
+inline dimension_type
+Constraint_System::max_space_dimension() {
+  return Linear_System::max_space_dimension();
+}
+
+inline dimension_type
+Constraint_System::space_dimension() const {
+  return Linear_System::space_dimension();
+}
+
+inline void
+Constraint_System::clear() {
+  Linear_System::clear();
+}
+
+inline const Constraint_System&
+Constraint_System::zero_dim_empty() {
+  static const Constraint_System zdf(Constraint::zero_dim_false());
+  return zdf;
+}
+
+inline
+Constraint_System::const_iterator::const_iterator()
+  : i(), csp(0) {
+}
+
+inline
+Constraint_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i), csp(y.csp) {
+}
+
+inline
+Constraint_System::const_iterator::~const_iterator() {
+}
+
+inline Constraint_System::const_iterator&
+Constraint_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  csp = y.csp;
+  return *this;
+}
+
+inline const Constraint&
+Constraint_System::const_iterator::operator*() const {
+  return static_cast<const Constraint&>(*i);
+}
+
+inline const Constraint*
+Constraint_System::const_iterator::operator->() const {
+  return static_cast<const Constraint*>(i.operator->());
+}
+
+inline Constraint_System::const_iterator&
+Constraint_System::const_iterator::operator++() {
+  ++i;
+  skip_forward();
+  return *this;
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Constraint_System::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Constraint_System::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Constraint_System::const_iterator::
+const_iterator(const Linear_System::const_iterator& iter,
+	       const Constraint_System& csys)
+  : i(iter), csp(&csys) {
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::begin() const {
+  const_iterator i(Linear_System::begin(), *this);
+  i.skip_forward();
+  return i;
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::end() const {
+  const const_iterator i(Linear_System::end(), *this);
+  return i;
+}
+
+inline void
+Constraint_System::add_low_level_constraints() {
+  if (is_necessarily_closed())
+    // The positivity constraint.
+    insert(Constraint::zero_dim_positivity());
+  else {
+    // Add the epsilon constraints.
+    insert(Constraint::epsilon_leq_one());
+    insert(Constraint::epsilon_geq_zero());
+  }
+}
+
+inline void
+Constraint_System::swap(Constraint_System& y) {
+  Linear_System::swap(y);
+}
+
+inline memory_size_type
+Constraint_System::external_memory_in_bytes() const {
+  return Linear_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint_System::total_memory_in_bytes() const {
+  return Linear_System::total_memory_in_bytes();
+}
+
+inline void
+Constraint_System::simplify() {
+  Linear_System::simplify();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Constraint_System& x,
+     Parma_Polyhedra_Library::Constraint_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Constraint_System_inlines_hh)
diff --git a/src/Constraint_System.types.hh b/src/Constraint_System.types.hh
new file mode 100644
index 0000000..37b718c
--- /dev/null
+++ b/src/Constraint_System.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Constraint_System_types_hh
+#define PPL_Constraint_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint_System;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constraint_System_types_hh)
diff --git a/src/DB_Matrix.defs.hh b/src/DB_Matrix.defs.hh
new file mode 100644
index 0000000..9a76a2f
--- /dev/null
+++ b/src/DB_Matrix.defs.hh
@@ -0,0 +1,324 @@
+/* DB_Matrix class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ .  */
+
+#ifndef PPL_DB_Matrix_defs_hh
+#define PPL_DB_Matrix_defs_hh 1
+
+#include "DB_Matrix.types.hh"
+#include "globals.defs.hh"
+#include "DB_Row.defs.hh"
+#include "Checked_Number.types.hh"
+#include "Rounding_Dir.defs.hh"
+#include <vector>
+#include <cstddef>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const DB_Matrix<T>& c);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the square matrices.
+/*! \ingroup PPL_CXX_interface
+  The templatic class DB_Matrix<T> allows for the representation of
+  a square matrix of T objects.
+  Each DB_Matrix<T> object can be viewed as a multiset of DB_Row<T>.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+class Parma_Polyhedra_Library::DB_Matrix {
+public:
+  //! Returns the maximum number of rows a DB_Matrix can handle.
+  static dimension_type max_num_rows();
+
+  //! Returns the maximum number of columns a DB_Matrix can handle.
+  static dimension_type max_num_columns();
+
+  //! Builds an empty matrix.
+  /*!
+    DB_Rows' size and capacity are initialized to \f$0\f$.
+  */
+  DB_Matrix();
+
+  //! Builds a square matrix having the specified dimension.
+  explicit DB_Matrix(dimension_type n_rows);
+
+  //! Copy-constructor.
+  DB_Matrix(const DB_Matrix& y);
+
+  //! Constructs a conservative approximation of \p y.
+  template <typename U>
+  explicit DB_Matrix(const DB_Matrix<U>& y);
+
+  //! Destructor.
+  ~DB_Matrix();
+
+  //! Assignment operator.
+  DB_Matrix& operator=(const DB_Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A read-only iterator over the rows of the matrix.
+  /*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  class const_iterator {
+  private:
+    typedef typename std::vector<DB_Row<T> >::const_iterator Iter;
+    //! The const iterator on the rows' vector \p rows.
+    Iter i;
+
+  public:
+    typedef std::forward_iterator_tag iterator_category;
+    typedef typename std::iterator_traits<Iter>::value_type value_type;
+    typedef typename std::iterator_traits<Iter>::difference_type
+    difference_type;
+    typedef typename std::iterator_traits<Iter>::pointer pointer;
+    typedef typename std::iterator_traits<Iter>::reference reference;
+
+    //! Default constructor.
+    const_iterator();
+
+    /*! \brief
+      Builds a const iterator on the matrix starting from
+      an iterator \p b on the elements of the vector \p rows.
+    */
+    explicit const_iterator(const Iter& b);
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    reference operator*() const;
+
+    //! Indirect member selector.
+    pointer operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+private:
+  template <typename U> friend class DB_Matrix;
+
+  //! The rows of the matrix.
+  std::vector<DB_Row<T> > rows;
+
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
+
+  /*! \brief
+    Capacity allocated for each row, i.e., number of
+    <CODE>long</CODE> objects that each row can contain.
+  */
+  dimension_type row_capacity;
+
+public:
+  //! Swaps \p *this with \p y.
+  void swap(DB_Matrix& y);
+
+
+  //! Makes the matrix grow by adding more rows and more columns.
+  /*!
+    \param new_n_rows
+    The number of rows and columns of the resized matrix.
+
+    A new matrix, with the specified dimension, is created.
+    The contents of the old matrix are copied in the upper, left-hand
+    corner of the new matrix, which is then assigned to \p *this.
+  */
+  void grow(dimension_type new_n_rows);
+
+  //! Resizes the matrix without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows and columns of the resized matrix.
+
+    A new matrix, with the specified dimension, is created without copying
+    the content of the old matrix and assigned to \p *this.
+  */
+  void resize_no_copy(dimension_type new_n_rows);
+
+  //! Returns the number of rows in the matrix.
+  dimension_type num_rows() const;
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the \p k-th row of the matrix.
+  DB_Row<T>& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the matrix.
+  const DB_Row<T>& operator[](dimension_type k) const;
+  //@}
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+    and sets \p *this accordingly.  Returns <CODE>true</CODE>
+    if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+void swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
+	  Parma_Polyhedra_Library::DB_Matrix<T>& y);
+
+} // namespace std
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+bool operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+bool operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const DB_Matrix<T>& x,
+				 const DB_Matrix<T>& y,
+				 const Rounding_Dir dir,
+				 Temp& tmp0,
+				 Temp& tmp1,
+				 Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the Euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			       const DB_Matrix<T>& x,
+			       const DB_Matrix<T>& y,
+			       const Rounding_Dir dir,
+			       Temp& tmp0,
+			       Temp& tmp1,
+			       Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const DB_Matrix<T>& x,
+				 const DB_Matrix<T>& y,
+				 const Rounding_Dir dir,
+				 Temp& tmp0,
+				 Temp& tmp1,
+				 Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "DB_Matrix.inlines.hh"
+
+#endif // !defined(PPL_DB_Matrix_defs_hh)
diff --git a/src/DB_Matrix.inlines.hh b/src/DB_Matrix.inlines.hh
new file mode 100644
index 0000000..dbd67ff
--- /dev/null
+++ b/src/DB_Matrix.inlines.hh
@@ -0,0 +1,679 @@
+/* DB_Matrix class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_DB_Matrix_inlines_hh
+#define PPL_DB_Matrix_inlines_hh 1
+
+#include "globals.defs.hh"
+#include "Checked_Number.defs.hh"
+#include <cassert>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void
+DB_Matrix<T>::swap(DB_Matrix& y) {
+  std::swap(rows, y.rows);
+  std::swap(row_size, y.row_size);
+  std::swap(row_capacity, y.row_capacity);
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_rows() {
+  return std::vector<DB_Row<T> >().max_size();
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_columns() {
+  return DB_Row<T>::max_size();
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator()
+  : i(Iter()) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const Iter& b)
+  : i(b) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i) {
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  return *this;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::reference
+DB_Matrix<T>::const_iterator::operator*() const {
+  return *i;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::pointer
+DB_Matrix<T>::const_iterator::operator->() const {
+  return &*i;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator++() {
+  ++i;
+  return *this;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::const_iterator::operator++(int) {
+  return const_iterator(i++);
+}
+
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator!=(const const_iterator& y) const {
+  return !operator==(y);
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::begin() const {
+  return const_iterator(rows.begin());
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::end() const {
+  return const_iterator(rows.end());
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix()
+  : rows(),
+    row_size(0),
+    row_capacity(0) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::~DB_Matrix() {
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+template <typename T>
+inline const DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) const {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::num_rows() const {
+  return rows.size();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline bool
+operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+  return !(x == y);
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix(const dimension_type n_rows)
+  : rows(n_rows),
+    row_size(n_rows),
+    row_capacity(compute_capacity(n_rows, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < n_rows; ++i)
+    rows[i].construct(n_rows, row_capacity);
+  assert(OK());
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix(const DB_Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+}
+
+template <typename T>
+template <typename U>
+inline
+DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y)
+  : rows(y.rows.size()),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i)
+    rows[i].construct_upward_approximation(y[i], row_capacity);
+  assert(OK());
+}
+
+template <typename T>
+inline DB_Matrix<T>&
+DB_Matrix<T>::operator=(const DB_Matrix& y) {
+  // Without the following guard against auto-assignments we would
+  // recompute the row capacity based on row size, possibly without
+  // actually increasing the capacity of the rows.  This would lead to
+  // an inconsistent state.
+  if (this != &y) {
+    // The following assignment may do nothing on auto-assignments...
+    rows = y.rows;
+    row_size = y.row_size;
+    // ... hence the following assignment must not be done on
+    // auto-assignments.
+    row_capacity = compute_capacity(y.row_size, max_num_columns());
+  }
+  return *this;
+}
+
+template <typename T>
+void
+DB_Matrix<T>::grow(const dimension_type new_n_rows) {
+  const dimension_type old_n_rows = rows.size();
+  assert(new_n_rows >= old_n_rows);
+
+  if (new_n_rows > old_n_rows) {
+    if (new_n_rows <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+	// Reallocation will take place.
+	std::vector<DB_Row<T> > new_rows;
+	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+	new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+	// Construct the new rows.
+	dimension_type i = new_n_rows;
+	while (i-- > old_n_rows)
+	  new_rows[i].construct(new_n_rows, row_capacity);
+	// Steal the old rows.
+	++i;
+	while (i-- > 0)
+	  new_rows[i].swap(rows[i]);
+	// Put the new vector into place.
+	std::swap(rows, new_rows);
+      }
+      else {
+	// Reallocation will NOT take place.
+	rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+	  rows[i].construct(new_n_rows, row_capacity);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows.
+      DB_Matrix new_matrix;
+      new_matrix.rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+      new_matrix.rows.insert(new_matrix.rows.end(), new_n_rows, DB_Row<T>());
+      // Construct the new rows.
+      new_matrix.row_size = new_n_rows;
+      new_matrix.row_capacity = compute_capacity(new_n_rows,
+						 max_num_columns());
+      dimension_type i = new_n_rows;
+      while (i-- > old_n_rows)
+	new_matrix.rows[i].construct(new_matrix.row_size,
+				     new_matrix.row_capacity);
+      // Copy the old rows.
+      ++i;
+      while (i-- > 0) {
+	DB_Row<T> new_row(rows[i],
+			  new_matrix.row_size,
+			  new_matrix.row_capacity);
+	std::swap(new_matrix.rows[i], new_row);
+      }
+      // Put the new vector into place.
+      swap(new_matrix);
+      return;
+    }
+  }
+  // Here we have the right number of rows.
+  if (new_n_rows > row_size) {
+    // We need more columns.
+    if (new_n_rows <= row_capacity)
+      // But we have enough capacity: we resize existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+	rows[i].expand_within_capacity(new_n_rows);
+    else {
+      // Capacity exhausted: we must reallocate the rows and
+      // make sure all the rows have the same capacity.
+      const dimension_type new_row_capacity
+	= compute_capacity(new_n_rows, max_num_columns());
+      for (dimension_type i = old_n_rows; i-- > 0; ) {
+	DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity);
+	std::swap(rows[i], new_row);
+      }
+      row_capacity = new_row_capacity;
+    }
+    // Rows have grown or shrunk.
+    row_size = new_n_rows;
+  }
+}
+
+template <typename T>
+void
+DB_Matrix<T>::resize_no_copy(const dimension_type new_n_rows) {
+  dimension_type old_n_rows = rows.size();
+
+  if (new_n_rows > old_n_rows) {
+    // Rows will be inserted.
+    if (new_n_rows <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+	// Reallocation (of vector `rows') will take place.
+	std::vector<DB_Row<T> > new_rows;
+	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+	new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+	// Construct the new rows (be careful: each new row must have
+	// the same capacity as each one of the old rows).
+	dimension_type i = new_n_rows;
+	while (i-- > old_n_rows)
+	  new_rows[i].construct(new_n_rows, row_capacity);
+	// Steal the old rows.
+	++i;
+	while (i-- > 0)
+	  new_rows[i].swap(rows[i]);
+	// Put the new vector into place.
+	std::swap(rows, new_rows);
+      }
+      else {
+	// Reallocation (of vector `rows') will NOT take place.
+	rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+	// Be careful: each new row must have
+	// the same capacity as each one of the old rows.
+	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+	  rows[i].construct(new_n_rows, row_capacity);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows: allocate a new matrix and swap.
+      DB_Matrix new_matrix(new_n_rows);
+      swap(new_matrix);
+      return;
+    }
+  }
+  else if (new_n_rows < old_n_rows) {
+    // Drop some rows.
+    rows.erase(rows.begin() + new_n_rows, rows.end());
+    // Shrink the existing rows.
+    for (dimension_type i = new_n_rows; i-- > 0; )
+      rows[i].shrink(new_n_rows);
+    old_n_rows = new_n_rows;
+  }
+  // Here we have the right number of rows.
+  if (new_n_rows > row_size) {
+    // We need more columns.
+    if (new_n_rows <= row_capacity)
+      // But we have enough capacity: we resize existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+	rows[i].expand_within_capacity(new_n_rows);
+    else {
+      // Capacity exhausted: we must reallocate the rows and
+      // make sure all the rows have the same capacity.
+      const dimension_type new_row_capacity
+	= compute_capacity(new_n_rows, max_num_columns());
+      for (dimension_type i = old_n_rows; i-- > 0; ) {
+	DB_Row<T> new_row(new_n_rows, new_row_capacity);
+	std::swap(rows[i], new_row);
+      }
+      row_capacity = new_row_capacity;
+    }
+  }
+  // DB_Rows have grown or shrunk.
+  row_size = new_n_rows;
+}
+
+template <typename T>
+void
+DB_Matrix<T>::ascii_dump(std::ostream& s) const {
+  const DB_Matrix<T>& x = *this;
+  const char separator = ' ';
+  const dimension_type nrows = x.num_rows();
+  s << nrows << separator << "\n";
+  for (dimension_type i = 0; i < nrows;  ++i) {
+    for (dimension_type j = 0; j < nrows; ++j) {
+      using namespace IO_Operators;
+      s << x[i][j] << separator;
+    }
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, DB_Matrix<T>);
+
+template <typename T>
+bool
+DB_Matrix<T>::ascii_load(std::istream& s) {
+  dimension_type nrows;
+   if (!(s >> nrows))
+    return false;
+  resize_no_copy(nrows);
+  DB_Matrix& x = *this;
+  for (dimension_type i = 0; i < nrows;  ++i)
+    for (dimension_type j = 0; j < nrows; ++j) {
+      Result r = input(x[i][j], s, ROUND_UP);
+      // FIXME: V_CVT_STR_UNK is probably not the only possible error.
+      if (!s || r == V_CVT_STR_UNK)
+	return false;
+    }
+  // Check for well-formedness.
+  assert(OK());
+  return true;
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline bool
+operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows())
+    return false;
+  for (dimension_type i = x_num_rows; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+template <typename To, typename From>
+struct maybe_assign_struct {
+  static inline Result
+  function(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+    // When `To' and `From' are different types, we make the conversion
+    // and use `tmp'.
+    top = &tmp;
+    return assign_r(tmp, from, dir);
+  }
+};
+
+template <typename Type>
+struct maybe_assign_struct<Type, Type> {
+  static inline Result
+  function(const Type*& top, Type&, const Type& from, Rounding_Dir) {
+    // When the types are the same, conversion is unnecessary.
+    top = &from;
+    return V_EQ;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Assigns to \p top a pointer to a location that holds the
+  conversion, according to \p dir, of \p from to type \p To.  When
+  necessary, and only when necessary, the variable \p tmp is used to
+  hold the result of conversion.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename To, typename From>
+inline Result
+maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+  return maybe_assign_struct<To, From>::function(top, tmp, from, dir);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+		    const DB_Matrix<T>& x,
+		    const DB_Matrix<T>& y,
+		    const Rounding_Dir dir,
+		    Temp& tmp0,
+		    Temp& tmp1,
+		    Temp& tmp2) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows())
+    return false;
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (dimension_type i = x_num_rows; i-- > 0; ) {
+    const DB_Row<T>& x_i = x[i];
+    const DB_Row<T>& y_i = y[i];
+    for (dimension_type j = x_num_rows; j-- > 0; ) {
+      const T& x_i_j = x_i[j];
+      const T& y_i_j = y_i[j];
+      if (is_plus_infinity(x_i_j)) {
+	if (is_plus_infinity(y_i_j))
+	  continue;
+	else {
+	pinf:
+	  r = PLUS_INFINITY;
+	  return true;
+	}
+      }
+      else if (is_plus_infinity(y_i_j))
+	goto pinf;
+
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i_j > y_i_j) {
+	maybe_assign(tmp1p, tmp1, x_i_j, dir);
+	maybe_assign(tmp2p, tmp2, y_i_j, inverse(dir));
+      }
+      else {
+	maybe_assign(tmp1p, tmp1, y_i_j, dir);
+	maybe_assign(tmp2p, tmp2, x_i_j, inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      assert(tmp1 >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+}
+
+template <typename Temp>
+struct Rectilinear_Distance_Specialization {
+  static inline void
+  combine(Temp& running, const Temp& current, Rounding_Dir dir) {
+    add_assign_r(running, running, current, dir);
+  }
+
+  static inline void
+  finalize(Temp&, Rounding_Dir) {
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const DB_Matrix<T>& x,
+			    const DB_Matrix<T>& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  return
+    l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+								    dir,
+								    tmp0,
+								    tmp1,
+								    tmp2);
+}
+
+
+template <typename Temp>
+struct Euclidean_Distance_Specialization {
+  static inline void
+  combine(Temp& running, Temp& current, Rounding_Dir dir) {
+    mul_assign_r(current, current, current, dir);
+    add_assign_r(running, running, current, dir);
+  }
+
+  static inline void
+  finalize(Temp& running, Rounding_Dir dir) {
+    sqrt_assign_r(running, running, dir);
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const DB_Matrix<T>& x,
+			  const DB_Matrix<T>& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  return
+    l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+								  dir,
+								  tmp0,
+								  tmp1,
+								  tmp2);
+}
+
+
+template <typename Temp>
+struct L_Infinity_Distance_Specialization {
+  static inline void
+  combine(Temp& running, const Temp& current, Rounding_Dir) {
+    if (current > running)
+      running = current;
+  }
+
+  static inline void
+  finalize(Temp&, Rounding_Dir) {
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const DB_Matrix<T>& x,
+			   const DB_Matrix<T>& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  return
+    l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+								   dir,
+								   tmp0,
+								   tmp1,
+								   tmp2);
+}
+
+template <typename T>
+bool
+DB_Matrix<T>::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // The matrix must be square.
+  if (num_rows() != row_size) {
+#ifndef NDEBUG
+    cerr << "DB_Matrix has fewer columns than rows:\n"
+	 << "row_size is " << row_size
+	 << ", num_rows() is " << num_rows() << "!"
+	 << endl;
+#endif
+    return false;
+  }
+
+  const DB_Matrix& x = *this;
+  const dimension_type n_rows = x.num_rows();
+  for (dimension_type i = 0; i < n_rows; ++i) {
+    if (!x[i].OK(row_size, row_capacity))
+      return false;
+  }
+
+  // All checks passed.
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */  //FIXME!!
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const DB_Matrix<T>& c) {
+  const dimension_type n = c.num_rows();
+  for (dimension_type i = 0; i < n; ++i) {
+    for (dimension_type j = 0; j < n; ++j)
+      s << c[i][j] << " ";
+    s << "\n";
+  }
+  return s;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
+     Parma_Polyhedra_Library::DB_Matrix<T>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_DB_Matrix_inlines_hh)
diff --git a/src/DB_Matrix.types.hh b/src/DB_Matrix.types.hh
new file mode 100644
index 0000000..3163bc8
--- /dev/null
+++ b/src/DB_Matrix.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_DB_Matrix_types_hh
+#define PPL_DB_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class DB_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Matrix_types_hh)
diff --git a/src/DB_Row.defs.hh b/src/DB_Row.defs.hh
new file mode 100644
index 0000000..5ecd770
--- /dev/null
+++ b/src/DB_Row.defs.hh
@@ -0,0 +1,431 @@
+/* DB_Row class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ .*/
+
+#ifndef PPL_DB_Row_defs_hh
+#define PPL_DB_Row_defs_hh 1
+
+#include "DB_Row.types.hh"
+#include "globals.types.hh"
+#include "Ptr_Iterator.defs.hh"
+#include <cstddef>
+#include <vector>
+
+#ifndef EXTRA_ROW_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  When EXTRA_ROW_DEBUG evaluates to <CODE>true</CODE>, each instance
+  of the class DB_Row carries its own capacity; this enables extra
+  consistency checks to be performed.
+  \ingroup PPL_CXX_interface
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define EXTRA_ROW_DEBUG 0
+#endif
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The handler of the actual DB_Row implementation.
+/*! \ingroup PPL_CXX_interface
+  Exception-safety is the only responsibility of this class: it has
+  to ensure that its \p impl member is correctly deallocated.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler {
+public:
+  //! Default constructor.
+  DB_Row_Impl_Handler();
+
+  //! Destructor.
+  ~DB_Row_Impl_Handler();
+
+  class Impl;
+
+  //! A pointer to the actual implementation.
+  Impl* impl;
+
+#if EXTRA_ROW_DEBUG
+  //! The capacity of \p impl (only available during debugging).
+  dimension_type capacity_;
+#endif // EXTRA_ROW_DEBUG
+
+private:
+  //! Private and unimplemented: copy construction is not allowed.
+  DB_Row_Impl_Handler(const DB_Row_Impl_Handler&);
+
+  //! Private and unimplemented: copy assignment is not allowed.
+  DB_Row_Impl_Handler& operator=(const DB_Row_Impl_Handler&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the single rows of matrices.
+/*! \ingroup PPL_CXX_interface
+  The class template DB_Row<T> allows for the efficient representation of
+  the single rows of a DB_Matrix. It contains elements of type T stored
+  as a vector. The class T is a family of extended numbers that
+  must provide representation for
+  \f$ -\infty \f$, \f$0\f$,\f$ +\infty \f$ (and, consequently for <EM>nan</EM>,
+  <EM>not a number</EM>, since this arises as the ``result'' of
+  undefined sums like \f$ +\infty + (-\infty) \f$).
+
+  The class T must provide the following methods:
+
+  \code
+    T()
+  \endcode
+  is the default constructor: no assumption is made on the particular
+  object constructed, provided <CODE>T().OK()</CODE> gives <CODE>true</CODE>
+  (see below).
+  \code
+    ~T()
+  \endcode
+  is the destructor.
+  \code
+    bool is_nan() const
+  \endcode
+  returns <CODE>true</CODE> if and only \p *this represents
+  the  <EM>not a number</EM> value.
+  \code
+    bool OK() const
+  \endcode
+  returns <CODE>true</CODE> if and only if \p *this satisfies all
+  its invariants.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row : private DB_Row_Impl_Handler<T> {
+public:
+  //! Pre-constructs a row: construction must be completed by construct().
+  DB_Row();
+
+  //! \name Post-constructors.
+  //@{
+  //! Constructs properly a default-constructed element.
+  /*!
+    Builds a row with size \p sz and minimum capacity.
+  */
+  void construct(dimension_type sz);
+
+  //! Constructs properly a default-constructed element.
+  /*!
+    \param sz
+    The size of the row that will be constructed.
+
+    \param capacity
+    The minimum capacity of the row that will be constructed.
+
+    The row that we are constructing has a minimum capacity of
+    (i.e., it can contain at least) \p elements, \p sz of which
+    will be constructed now.
+  */
+  void construct(dimension_type sz, dimension_type capacity);
+
+  //! Constructs properly a conservative approximation of \p y.
+  /*!
+    \param y
+    A row containing the elements whose upward approximations will
+    be used to properly construct \p *this.
+
+    \param capacity
+    The capacity of the constructed row.
+
+    It is assumed that \p capacity is greater than or equal to the
+    size of \p y.
+  */
+  template <typename U>
+  void construct_upward_approximation(const DB_Row<U>& y,
+				      dimension_type capacity);
+
+  //@}
+
+  //! Tight constructor: resizing will require reallocation.
+  DB_Row(dimension_type sz);
+
+  //! Sizing constructor with capacity.
+  DB_Row(dimension_type sz, dimension_type capacity);
+
+  //! Ordinary copy constructor.
+  DB_Row(const DB_Row& y);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to \p y size.
+  */
+  DB_Row(const DB_Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is greater than or equal to the size of \p y
+    and, of course, that \p sz is less than or equal to \p capacity.
+    Any new position is initialized to \f$+\infty\f$.
+  */
+  DB_Row(const DB_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Destructor.
+  ~DB_Row();
+
+  //! Assignment operator.
+  DB_Row& operator=(const DB_Row& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(DB_Row& y);
+
+  //! Assigns the implementation of \p y to \p *this.
+  void assign(DB_Row& y);
+
+  /*! \brief
+    Allocates memory for a default constructed DB_Row object,
+    allowing for \p capacity coefficients at most.
+
+    It is assumed that no allocation has been performed before
+    (otherwise, a memory leak will occur).
+    After execution, the size of the DB_Row object is zero.
+  */
+  void allocate(dimension_type capacity);
+
+  //! Expands the row to size \p new_size.
+  /*!
+    Adds new positions to the implementation of the row
+    obtaining a new row with size \p new_size.
+    It is assumed that \p new_size is between the current size
+    and capacity of the row. The new positions are initialized
+    to \f$+\infty\f$.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    Destroys elements of the row implementation
+    from position \p new_size to the end.
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Returns the size() of the largest possible DB_Row.
+  static dimension_type max_size();
+
+  //! Gives the number of coefficients currently in use.
+  dimension_type size() const;
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the element of the row indexed by \p k.
+  T& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  const T& operator[](dimension_type k) const;
+  //@}
+
+  //! A (non const) random access iterator to access the row's elements.
+  typedef Implementation::Ptr_Iterator<T*> iterator;
+
+  //! A const random access iterator to access the row's elements.
+  typedef Implementation::Ptr_Iterator<const T*> const_iterator;
+
+  /*! \brief
+    Returns the const iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const iterator.
+  */
+  iterator begin();
+
+  //! Returns the past-the-end iterator.
+  iterator end();
+
+  /*! \brief
+    Returns the const iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::DB_Row;
+
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const DB_Row& y);
+
+#if EXTRA_ROW_DEBUG
+  //! Returns the capacity of the row (only available during debugging).
+  dimension_type capacity() const;
+#endif // defined(EXTRA_ROW_DEBUG)
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Classical comparison operators.
+//@{
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Row */
+template <typename T>
+bool operator==(const DB_Row<T>& x, const DB_Row<T>& y);
+
+/*! \relates DB_Row */
+template <typename T>
+bool operator!=(const DB_Row<T>& x, const DB_Row<T>& y);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//@}
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The real implementation of a DB_Row object.
+/*! \ingroup PPL_CXX_interface
+  The class DB_Row_Impl_Handler::Impl provides the implementation of
+  DB_Row objects and, in particular, of the corresponding memory
+  allocation functions.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler<T>::Impl {
+public:
+  //! \name Custom allocator and deallocator.
+  //@{
+
+  /*! \brief
+    Allocates a chunk of memory able to contain \p capacity T objects
+    beyond the specified \p fixed_size and returns a pointer to the new
+    allocated memory.
+  */
+  static void* operator new(size_t fixed_size, dimension_type capacity);
+
+  //! Uses the standard delete operator to free the memory \p p points to.
+  static void operator delete(void* p);
+
+  /*! \brief
+    Placement version: uses the standard operator delete to free
+    the memory \p p points to.
+  */
+  static void operator delete(void* p, dimension_type capacity);
+  //@}
+
+  //! Default constructor.
+  Impl();
+
+  //! Destructor.
+  /*!
+    Uses <CODE>shrink()</CODE> method with argument \f$0\f$
+    to delete all the row elements.
+  */
+  ~Impl();
+
+  //! Expands the row to size \p new_size.
+  /*!
+    It is assumed that \p new_size is between the current size and capacity.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const Impl& y);
+
+  /*! \brief
+    Exception-safe upward approximation construction mechanism
+    for coefficients.
+  */
+  template <typename U>
+  void construct_upward_approximation(const U& y);
+
+  //! Returns the size() of the largest possible Impl.
+  static dimension_type max_size();
+
+  //! \name Size accessors.
+  //@{
+  //! Returns the actual size of \p this.
+  dimension_type size() const;
+
+  //! Sets to \p new_sz the actual size of \p *this.
+  void set_size(dimension_type new_sz);
+
+  //! Increments the size of \p *this by 1.
+  void bump_size();
+  //@}
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the element of \p *this indexed by \p k.
+  T& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of \p *this indexed by \p k.
+  const T& operator[](dimension_type k) const;
+  //@}
+
+private:
+  //! The number of coefficients in the row.
+  dimension_type size_;
+
+  //! The vector of coefficients.
+  T vec_[
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+	       1
+#endif
+  ];
+
+  //! Private and unimplemented: copy construction is not allowed.
+  Impl(const Impl& y);
+
+  //! Private and unimplemented: assignment is not allowed.
+  Impl& operator=(const Impl&);
+
+  //! Exception-safe copy construction mechanism.
+  void copy_construct(const Impl& y);
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+void swap(Parma_Polyhedra_Library::DB_Row<T>& x,
+	  Parma_Polyhedra_Library::DB_Row<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+void iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+	       ::iterator x,
+	       typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+	       ::iterator y);
+
+} // namespace std
+
+#include "DB_Row.inlines.hh"
+
+#endif // !defined(PPL_DB_Row_defs_hh)
diff --git a/src/DB_Row.inlines.hh b/src/DB_Row.inlines.hh
new file mode 100644
index 0000000..bc246df
--- /dev/null
+++ b/src/DB_Row.inlines.hh
@@ -0,0 +1,556 @@
+/* DB_Row class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_DB_Row_inlines_hh
+#define PPL_DB_Row_inlines_hh 1
+
+#include <cassert>
+#include <algorithm>
+#include <iostream>
+#include "checked.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void*
+DB_Row_Impl_Handler<T>::Impl::operator new(const size_t fixed_size,
+					   const dimension_type capacity) {
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  return ::operator new(fixed_size + capacity*sizeof(T));
+#else
+  assert(capacity >= 1);
+  return ::operator new(fixed_size + (capacity-1)*sizeof(T));
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p) {
+  ::operator delete(p);
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p, dimension_type) {
+  ::operator delete(p);
+}
+
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::max_size() {
+  return size_t(-1)/sizeof(T);
+}
+
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::size() const {
+  return size_;
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::set_size(const dimension_type new_sz) {
+  size_ = new_sz;
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::bump_size() {
+  ++size_;
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::Impl()
+  : size_(0) {
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::~Impl() {
+  shrink(0);
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::DB_Row_Impl_Handler()
+  : impl(0) {
+#if EXTRA_ROW_DEBUG
+  capacity_ = 0;
+#endif
+}
+
+template <typename T>
+template <typename U>
+void
+DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const U& y) {
+  const dimension_type y_size = y.size();
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < y_size; ++i) {
+    construct(vec_[i], y[i], ROUND_UP);
+    bump_size();
+  }
+#else
+  assert(y_size > 0);
+  if (y_size > 0) {
+    vec_[0] = y[0];
+    bump_size();
+    // Construct in direct order: will destroy in reverse order.
+    for (dimension_type i = 1; i < y_size; ++i) {
+      construct(vec_[i], y[i], ROUND_UP);
+      bump_size();
+    }
+  }
+#endif
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::~DB_Row_Impl_Handler() {
+  delete impl;
+}
+
+template <typename T>
+inline T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) {
+  assert(k < size());
+  return vec_[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) const {
+  assert(k < size());
+  return vec_[k];
+}
+
+template <typename T>
+inline dimension_type
+DB_Row<T>::max_size() {
+  return DB_Row_Impl_Handler<T>::Impl::max_size();
+}
+
+template <typename T>
+inline dimension_type
+DB_Row<T>::size() const {
+  return this->impl->size();
+}
+
+#if EXTRA_ROW_DEBUG
+template <typename T>
+inline dimension_type
+DB_Row<T>::capacity() const {
+  return this->capacity_;
+}
+#endif // EXTRA_ROW_DEBUG
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row()
+  : DB_Row_Impl_Handler<T>() {
+}
+
+template <typename T>
+inline void
+DB_Row<T>::allocate(
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+	       const
+#endif
+	       dimension_type capacity) {
+  DB_Row<T>& x = *this;
+  assert(capacity <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (capacity == 0)
+    ++capacity;
+#endif
+  assert(x.impl == 0);
+  x.impl = new (capacity) typename DB_Row_Impl_Handler<T>::Impl();
+#if EXTRA_ROW_DEBUG
+  assert(x.capacity_ == 0);
+  x.capacity_ = capacity;
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row<T>::expand_within_capacity(const dimension_type new_size) {
+  DB_Row<T>& x = *this;
+  assert(x.impl);
+#if EXTRA_ROW_DEBUG
+  assert(new_size <= x.capacity_);
+#endif
+  x.impl->expand_within_capacity(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::copy_construct_coefficients(const DB_Row& y) {
+  DB_Row<T>& x = *this;
+  assert(x.impl && y.impl);
+#if EXTRA_ROW_DEBUG
+  assert(y.size() <= x.capacity_);
+#endif
+  x.impl->copy_construct_coefficients(*(y.impl));
+}
+
+template <typename T>
+template <typename U>
+inline void
+DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+					  const dimension_type capacity) {
+  DB_Row<T>& x = *this;
+  assert(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity);
+  assert(y.impl);
+  x.impl->construct_upward_approximation(*(y.impl));
+}
+
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz,
+		     const dimension_type capacity) {
+  assert(sz <= capacity && capacity <= max_size());
+  allocate(capacity);
+  expand_within_capacity(sz);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz) {
+  construct(sz, sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz,
+		  const dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  construct(sz, capacity);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz) {
+  construct(sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y)
+  : DB_Row_Impl_Handler<T>() {
+  if (y.impl) {
+    allocate(compute_capacity(y.size(), max_size()));
+    copy_construct_coefficients(y);
+  }
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+		  const	dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  assert(y.impl);
+  assert(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity);
+  copy_construct_coefficients(y);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+		  const dimension_type sz,
+		  const	dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  assert(y.impl);
+  assert(y.size() <= sz && sz <= capacity && capacity <= max_size());
+  allocate(capacity);
+  copy_construct_coefficients(y);
+  expand_within_capacity(sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::~DB_Row() {
+}
+
+template <typename T>
+inline void
+DB_Row<T>::shrink(const dimension_type new_size) {
+  DB_Row<T>& x = *this;
+  assert(x.impl);
+  x.impl->shrink(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::swap(DB_Row& y) {
+  DB_Row<T>& x = *this;
+  std::swap(x.impl, y.impl);
+#if EXTRA_ROW_DEBUG
+  std::swap(x.capacity_, y.capacity_);
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row<T>::assign(DB_Row& y) {
+  DB_Row<T>& x = *this;
+  x.impl = y.impl;
+#if EXTRA_ROW_DEBUG
+  x.capacity_ = y.capacity_;
+#endif
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Row<T>::operator=(const DB_Row& y) {
+  // Copy-construct `tmp' from `y'.
+  DB_Row tmp(y);
+  // Swap the implementation of `*this' with the one of `tmp'.
+  swap(tmp);
+  // Now `tmp' goes out of scope, so the old `*this' will be destroyed.
+  return *this;
+}
+
+template <typename T>
+inline T&
+DB_Row<T>::operator[](const dimension_type k) {
+  DB_Row<T>& x = *this;
+  return (*x.impl)[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row<T>::operator[](const dimension_type k) const {
+  const DB_Row<T>& x = *this;
+  return (*x.impl)[k];
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::
+Impl::expand_within_capacity(const dimension_type new_size) {
+  assert(size() <= new_size && new_size <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // vec_[0] is already constructed.
+  if (size() == 0 && new_size > 0)
+    bump_size();
+#endif
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = size(); i < new_size; ++i) {
+    new (&vec_[i]) T(PLUS_INFINITY);
+    bump_size();
+  }
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
+  const dimension_type old_size = size();
+  assert(new_size <= old_size);
+  // Since ~T() does not throw exceptions, nothing here does.
+  set_size(new_size);
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Make sure we do not try to destroy vec_[0].
+  if (new_size == 0)
+    ++new_size;
+#endif
+  // We assume construction was done "forward".
+  // We thus perform destruction "backward".
+  for (dimension_type i = old_size; i-- > new_size; )
+    vec_[i].~T();
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::copy_construct_coefficients(const Impl& y) {
+  const dimension_type y_size = y.size();
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < y_size; ++i) {
+    new (&vec_[i]) T(y.vec_[i]);
+    bump_size();
+  }
+#else
+  assert(y_size > 0);
+  if (y_size > 0) {
+    vec_[0] = y.vec_[0];
+    bump_size();
+    // Construct in direct order: will destroy in reverse order.
+    for (dimension_type i = 1; i < y_size; ++i) {
+      new (&vec_[i]) T(y.vec_[i]);
+      bump_size();
+    }
+  }
+#endif
+}
+
+template <typename T>
+typename DB_Row<T>::iterator
+DB_Row<T>::begin() {
+  DB_Row<T>& x = *this;
+  return iterator(x.impl->vec_);
+}
+
+template <typename T>
+typename DB_Row<T>::iterator
+DB_Row<T>::end() {
+  DB_Row<T>& x = *this;
+  return iterator(x.impl->vec_ + x.impl->size_);
+}
+
+template <typename T>
+typename DB_Row<T>::const_iterator
+DB_Row<T>::begin() const {
+  const DB_Row<T>& x = *this;
+  return const_iterator(x.impl->vec_);
+}
+
+template <typename T>
+typename DB_Row<T>::const_iterator
+DB_Row<T>::end() const {
+  const DB_Row<T>& x = *this;
+  return const_iterator(x.impl->vec_ + x.impl->size_);
+}
+
+template <typename T>
+inline bool
+DB_Row<T>::OK(const dimension_type row_size,
+	      const dimension_type
+#if EXTRA_ROW_DEBUG
+	      row_capacity
+#endif
+	      ) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  const DB_Row<T>& x = *this;
+
+  bool is_broken = false;
+#if EXTRA_ROW_DEBUG
+# if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (x.capacity_ == 0) {
+    cerr << "Illegal row capacity: is 0, should be at least 1"
+	 << endl;
+    is_broken = true;
+  }
+  else if (x.capacity_ == 1 && row_capacity == 0)
+    // This is fine.
+    ;
+  else
+# endif
+  if (x.capacity_ != row_capacity) {
+    cerr << "DB_Row capacity mismatch: is " << x.capacity_
+	 << ", should be " << row_capacity << "."
+	 << endl;
+    is_broken = true;
+  }
+#endif
+  if (x.size() != row_size) {
+#ifndef NDEBUG
+    cerr << "DB_Row size mismatch: is " << x.size()
+	 << ", should be " << row_size << "."
+	 << endl;
+#endif
+    is_broken = true;
+  }
+#if EXTRA_ROW_DEBUG
+  if (x.capacity_ < x.size()) {
+#ifndef NDEBUG
+    cerr << "DB_Row is completely broken: capacity is " << x.capacity_
+	 << ", size is " << x.size() << "."
+	 << endl;
+#endif
+    is_broken = true;
+  }
+#endif
+
+  for (dimension_type i = x.size(); i-- > 0; ) {
+    const T& element = x[i];
+    // Not OK is bad.
+    if (!element.OK()) {
+      is_broken = true;
+      break;
+    }
+    // In addition, nans should never occur.
+    if (is_not_a_number(element)) {
+#ifndef NDEBUG
+      cerr << "Not-a-number found in DB_Row."
+	   << endl;
+#endif
+      is_broken = true;
+      break;
+    }
+  }
+
+  return !is_broken;
+}
+
+
+/*! \relates DB_Row */
+template <typename T>
+inline bool
+operator==(const DB_Row<T>& x, const DB_Row<T>& y) {
+  if (x.size() != y.size())
+    return false;
+  for (dimension_type i = x.size(); i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline bool
+operator!=(const DB_Row<T>& x, const DB_Row<T>& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::DB_Row<T>& x,
+     Parma_Polyhedra_Library::DB_Row<T>& y) {
+  x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+template <typename T>
+inline void
+iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+	  ::iterator x,
+	  typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+	  ::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_DB_Row_inlines_hh)
diff --git a/src/DB_Row.types.hh b/src/DB_Row.types.hh
new file mode 100644
index 0000000..97cb9e8
--- /dev/null
+++ b/src/DB_Row.types.hh
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_DB_Row_types_hh
+#define PPL_DB_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename BT>
+class DB_Row_Impl_Handler;
+
+template <typename BT>
+class DB_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Row_types_hh)
diff --git a/src/Determinate.defs.hh b/src/Determinate.defs.hh
new file mode 100644
index 0000000..6fd91bb
--- /dev/null
+++ b/src/Determinate.defs.hh
@@ -0,0 +1,316 @@
+/* Determinate class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Determinate_defs_hh
+#define PPL_Determinate_defs_hh
+
+#include "Determinate.types.hh"
+#include "Constraint_System.types.hh"
+#include "Congruence_System.types.hh"
+#include "Variable.defs.hh"
+#include "globals.types.hh"
+#include <iosfwd>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are the same domain element.
+
+  \relates Determinate
+*/
+template <typename PH>
+bool operator==(const Determinate<PH>& x, const Determinate<PH>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are different domain elements.
+
+  \relates Determinate
+*/
+template <typename PH>
+bool operator!=(const Determinate<PH>& x, const Determinate<PH>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+std::ostream&
+operator<<(std::ostream&, const Determinate<PH>&);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! Wraps a PPL class into a determinate constraint system interface.
+/*! \ingroup PPL_CXX_interface */
+template <typename PH>
+class Parma_Polyhedra_Library::Determinate {
+public:
+  //! \name Constructors and Destructor
+  //@{
+
+  /*! \brief
+    Injection operator: builds the determinate constraint system element
+    corresponding to the base-level element \p p.
+  */
+  Determinate(const PH& p);
+
+  /*! \brief
+    Injection operator: builds the determinate constraint system element
+    corresponding to the base-level element represented by \p cs.
+  */
+  Determinate(const Constraint_System& cs);
+
+  //! \brief
+  //! Injection operator: builds the determinate constraint system element
+  //! corresponding to the base-level element represented by \p cgs.
+  Determinate(const Congruence_System& cgs);
+
+  //! Copy constructor.
+  Determinate(const Determinate& y);
+
+  //! Destructor.
+  ~Determinate();
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Domain Element
+  //@{
+
+  //! Returns a const reference to the embedded element.
+  const PH& element() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the top of the
+    determinate constraint system (i.e., the whole vector space).
+  */
+  bool is_top() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the bottom
+    of the determinate constraint system.
+  */
+  bool is_bottom() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this entails \p y.
+  bool definitely_entails(const Determinate& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent.
+  */
+  bool is_definitely_equivalent_to(const Determinate& y) const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} // Member Functions that Do Not Modify the Domain Element
+
+
+  //! \name Member Functions that May Modify the Domain Element
+  //@{
+
+  //! Assigns to \p *this the upper bound of \p *this and \p y.
+  void upper_bound_assign(const Determinate& y);
+
+  //! Assigns to \p *this the meet of \p *this and \p y.
+  void meet_assign(const Determinate& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+  */
+  void concatenate_assign(const Determinate& y);
+
+  //! Returns a reference to the embedded element.
+  PH& element();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    On return from this method, the representation of \p *this
+    is not shared by different Determinate objects.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  void mutate();
+
+  //! Assignment operator.
+  Determinate& operator=(const Determinate& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Determinate& y);
+
+  //@} // Member Functions that May Modify the Domain Element
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A function adapter for the Determinate class.
+  /*! \ingroup PPL_CXX_interface
+    It lifts a Binary_Operator_Assign function object, taking arguments
+    of type PH, producing the corresponding function object taking
+    arguments of type Determinate<PH>.
+
+    The template parameter Binary_Operator_Assign is supposed to
+    implement an <EM>apply and assign</EM> function, i.e., a function
+    having signature <CODE>void foo(PH& x, const PH& y)</CODE> that
+    applies an operator to \c x and \c y and assigns the result to \c x.
+    For instance, such a function object is obtained by
+    <CODE>std::mem_fun_ref(&C_Polyhedron::intersection_assign)</CODE>.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  template <typename Binary_Operator_Assign>
+  class Binary_Operator_Assign_Lifter {
+  public:
+    //! Explicit unary constructor.
+    explicit
+    Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign);
+
+    //! Function-application operator.
+    void operator()(Determinate& x, const Determinate& y) const;
+
+  private:
+    //! The function object to be lifted.
+    Binary_Operator_Assign op_assign_;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Helper function returning a Binary_Operator_Assign_Lifter object,
+    also allowing for the deduction of template arguments.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  template <typename Binary_Operator_Assign>
+  static Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+  lift_op_assign(Binary_Operator_Assign op_assign);
+
+private:
+  //! The possibly shared representation of a Determinate object.
+  /*! \ingroup PPL_CXX_interface
+    By adopting the <EM>copy-on-write</EM> technique, a single
+    representation of the base-level object may be shared by more than
+    one object of the class Determinate.
+  */
+  class Rep {
+  private:
+    /*! \brief
+      Count the number of references:
+      -   0: leaked, \p ph is non-const;
+      -   1: one reference, \p ph is non-const;
+      - > 1: more than one reference, \p ph is const.
+    */
+    mutable unsigned long references;
+
+    //! Private and unimplemented: assignment not allowed.
+    Rep& operator=(const Rep& y);
+
+    //! Private and unimplemented: copies not allowed.
+    Rep(const Rep& y);
+
+    //! Private and unimplemented: default construction not allowed.
+    Rep();
+
+  public:
+    //! A possibly shared base-level domain element.
+    PH ph;
+
+    /*! \brief
+      Builds a new representation by creating a domain element
+      of the specified kind, in the specified vector space.
+    */
+    Rep(dimension_type num_dimensions, Degenerate_Element kind);
+
+    //! Builds a new representation by copying base-level element \p p.
+    Rep(const PH& p);
+
+    //! Builds a new representation by copying the constraints in \p cs.
+    Rep(const Constraint_System& cs);
+
+    //! Builds a new representation by copying the constraints in \p cgs.
+    Rep(const Congruence_System& cgs);
+
+    //! Destructor.
+    ~Rep();
+
+    //! Registers a new reference.
+    void new_reference() const;
+
+    /*! \brief
+      Unregisters one reference; returns <CODE>true</CODE> if and only if
+      the representation has become unreferenced.
+    */
+    bool del_reference() const;
+
+    //! True if and only if this representation is currently shared.
+    bool is_shared() const;
+
+    /*! \brief
+      Returns a lower bound to the total size in bytes of the memory
+      occupied by \p *this.
+    */
+    memory_size_type total_memory_in_bytes() const;
+
+    /*! \brief
+      Returns a lower bound to the size in bytes of the memory
+      managed by \p *this.
+    */
+    memory_size_type external_memory_in_bytes() const;
+  };
+
+  /*! \brief
+    A pointer to the possibly shared representation of
+    the base-level domain element.
+  */
+  Rep* prep;
+
+  friend bool
+  operator==<PH>(const Determinate<PH>& x, const Determinate<PH>& y);
+  friend bool
+  operator!=<PH>(const Determinate<PH>& x, const Determinate<PH>& y);
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+void swap(Parma_Polyhedra_Library::Determinate<PH>& x,
+	  Parma_Polyhedra_Library::Determinate<PH>& y);
+
+} // namespace std
+
+#include "Determinate.inlines.hh"
+
+#endif // !defined(PPL_Determinate_defs_hh)
diff --git a/src/Determinate.inlines.hh b/src/Determinate.inlines.hh
new file mode 100644
index 0000000..b6d9a1f
--- /dev/null
+++ b/src/Determinate.inlines.hh
@@ -0,0 +1,291 @@
+/* Determinate class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Determinate_inlines_hh
+#define PPL_Determinate_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(dimension_type num_dimensions,
+			  Degenerate_Element kind)
+  : references(0), ph(num_dimensions, kind) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(const PH& p)
+  : references(0), ph(p) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(const Constraint_System& cs)
+  : references(0), ph(cs) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(const Congruence_System& cgs)
+  : references(0), ph(cgs) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::~Rep() {
+  assert(references == 0);
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::Rep::new_reference() const {
+  ++references;
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::Rep::del_reference() const {
+  return --references == 0;
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::Rep::is_shared() const {
+  return references > 1;
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::Rep::external_memory_in_bytes() const {
+  return ph.external_memory_in_bytes();
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::Rep::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const PH& ph)
+  : prep(new Rep(ph)) {
+  prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const Constraint_System& cs)
+  : prep(new Rep(cs)) {
+  prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const Congruence_System& cgs)
+  : prep(new Rep(cgs)) {
+  prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const Determinate& y)
+  : prep(y.prep) {
+  prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::~Determinate() {
+  if (prep->del_reference())
+    delete prep;
+}
+
+template <typename PH>
+inline Determinate<PH>&
+Determinate<PH>::operator=(const Determinate& y) {
+  y.prep->new_reference();
+  if (prep->del_reference())
+    delete prep;
+  prep = y.prep;
+  return *this;
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::swap(Determinate& y) {
+  std::swap(prep, y.prep);
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::mutate() {
+  if (prep->is_shared()) {
+    Rep* new_prep = new Rep(prep->ph);
+    (void) prep->del_reference();
+    new_prep->new_reference();
+    prep = new_prep;
+  }
+}
+
+template <typename PH>
+inline const PH&
+Determinate<PH>::element() const {
+  return prep->ph;
+}
+
+template <typename PH>
+inline PH&
+Determinate<PH>::element() {
+  mutate();
+  return prep->ph;
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::upper_bound_assign(const Determinate& y) {
+  element().upper_bound_assign(y.element());
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::meet_assign(const Determinate& y) {
+  element().intersection_assign(y.element());
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::concatenate_assign(const Determinate& y) {
+  element().concatenate_assign(y.element());
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::definitely_entails(const Determinate& y) const {
+  return prep == y.prep || y.prep->ph.contains(prep->ph);
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::is_definitely_equivalent_to(const Determinate& y) const {
+  return prep == y.prep || prep->ph == y.prep->ph;
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::is_top() const {
+  return prep->ph.is_universe();
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::is_bottom() const {
+  return prep->ph.is_empty();
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::external_memory_in_bytes() const {
+  return prep->total_memory_in_bytes();
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::OK() const {
+  return prep->ph.OK();
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+inline std::ostream&
+operator<<(std::ostream& s, const Determinate<PH>& x) {
+  s << x.element();
+  return s;
+}
+
+} // namespace IO_Operators
+
+/*! \relates Determinate */
+template <typename PH>
+inline bool
+operator==(const Determinate<PH>& x, const Determinate<PH>& y) {
+  return x.prep == y.prep || x.prep->ph == y.prep->ph;
+}
+
+/*! \relates Determinate */
+template <typename PH>
+inline bool
+operator!=(const Determinate<PH>& x, const Determinate<PH>& y) {
+  return x.prep != y.prep && x.prep->ph != y.prep->ph;
+}
+
+template <typename PH>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign)
+  : op_assign_(op_assign) {
+}
+
+template <typename PH>
+template <typename Binary_Operator_Assign>
+inline void
+Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+operator()(Determinate& x, const Determinate& y) const {
+  op_assign_(x.element(), y.element());
+}
+
+template <typename PH>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+Determinate<PH>::lift_op_assign(Binary_Operator_Assign op_assign) {
+  return Binary_Operator_Assign_Lifter<Binary_Operator_Assign>(op_assign);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+inline void
+swap(Parma_Polyhedra_Library::Determinate<PH>& x,
+     Parma_Polyhedra_Library::Determinate<PH>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Determinate_inlines_hh)
diff --git a/src/Determinate.types.hh b/src/Determinate.types.hh
new file mode 100644
index 0000000..71c514e
--- /dev/null
+++ b/src/Determinate.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Determinate_types_hh
+#define PPL_Determinate_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+class Determinate;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Determinate_types_hh)
diff --git a/src/Float.cc b/src/Float.cc
new file mode 100644
index 0000000..c6b05b1
--- /dev/null
+++ b/src/Float.cc
@@ -0,0 +1,42 @@
+/* IEC 559 floating point format related functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "Float.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+const uint64_t float_intel_double_extended::LSP_INF;
+const uint64_t float_intel_double_extended::LSP_ZERO;
+const uint64_t float_intel_double_extended::LSP_DMAX;
+const uint64_t float_intel_double_extended::LSP_NMAX;
+
+const uint64_t float_ieee754_quad::MSP_SGN_MASK;
+const uint64_t float_ieee754_quad::MSP_POS_INF;
+const uint64_t float_ieee754_quad::MSP_NEG_INF;
+const uint64_t float_ieee754_quad::MSP_POS_ZERO;
+const uint64_t float_ieee754_quad::MSP_NEG_ZERO;
+const uint64_t float_ieee754_quad::LSP_INF;
+const uint64_t float_ieee754_quad::LSP_ZERO;
+const uint64_t float_ieee754_quad::LSP_MAX;
+
+} // Parma_Polyhedra_Library
diff --git a/src/Float.defs.hh b/src/Float.defs.hh
new file mode 100644
index 0000000..de0519c
--- /dev/null
+++ b/src/Float.defs.hh
@@ -0,0 +1,249 @@
+/* IEC 559 floating point format related functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Float_defs_hh
+#define PPL_Float_defs_hh 1
+
+#include "compiler.hh"
+#include <gmp.h>
+#include <cassert>
+#include <cmath>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#ifndef NAN
+#define NAN (HUGE_VAL - HUGE_VAL)
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_ieee754_single {
+  uint32_t word;
+  static const uint32_t SGN_MASK = 0x80000000;
+  static const uint32_t EXP_MASK = 0x7f800000;
+  static const uint32_t POS_INF = 0x7f800000;
+  static const uint32_t NEG_INF = 0xff800000;
+  static const uint32_t POS_ZERO = 0x00000000;
+  static const uint32_t NEG_ZERO = 0x80000000;
+  static const unsigned int EXPONENT_BITS = 8;
+  static const unsigned int MANTISSA_BITS = 23;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+					- static_cast<int>(MANTISSA_BITS);
+  int is_inf() const;
+  int is_nan() const;
+  int is_zero() const;
+  int sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_ieee754_double {
+#ifdef WORDS_BIGENDIAN
+  uint32_t msp;
+  uint32_t lsp;
+#else
+  uint32_t lsp;
+  uint32_t msp;
+#endif
+  static const uint32_t MSP_SGN_MASK = 0x80000000;
+  static const uint32_t MSP_POS_INF = 0x7ff00000;
+  static const uint32_t MSP_NEG_INF = 0xfff00000;
+  static const uint32_t MSP_POS_ZERO = 0x00000000;
+  static const uint32_t MSP_NEG_ZERO = 0x80000000;
+  static const uint32_t LSP_INF = 0;
+  static const uint32_t LSP_ZERO = 0;
+  static const uint32_t LSP_MAX = 0xffffffff;
+  static const unsigned int EXPONENT_BITS = 11;
+  static const unsigned int MANTISSA_BITS = 52;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+					- static_cast<int>(MANTISSA_BITS);
+  int is_inf() const;
+  int is_nan() const;
+  int is_zero() const;
+  int sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_intel_double_extended {
+#ifdef WORDS_BIGENDIAN
+  uint32_t msp;
+  uint64_t lsp;
+#else
+  uint64_t lsp;
+  uint32_t msp;
+#endif
+  static const uint32_t MSP_SGN_MASK = 0x00008000;
+  static const uint32_t MSP_POS_INF = 0x00007fff;
+  static const uint32_t MSP_NEG_INF = 0x0000ffff;
+  static const uint32_t MSP_POS_ZERO = 0x00000000;
+  static const uint32_t MSP_NEG_ZERO = 0x00008000;
+  static const uint64_t LSP_INF = 0x8000000000000000ULL;
+  static const uint64_t LSP_ZERO = 0;
+  static const uint64_t LSP_DMAX = 0x7fffffffffffffffULL;
+  static const uint64_t LSP_NMAX = 0xffffffffffffffffULL;
+  static const unsigned int EXPONENT_BITS = 15;
+  static const unsigned int MANTISSA_BITS = 63;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+					- static_cast<int>(MANTISSA_BITS);
+  int is_inf() const;
+  int is_nan() const;
+  int is_zero() const;
+  int sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_ieee754_quad {
+#ifdef WORDS_BIGENDIAN
+  uint64_t msp;
+  uint64_t lsp;
+#else
+  uint64_t lsp;
+  uint64_t msp;
+#endif
+  static const uint64_t MSP_SGN_MASK = 0x8000000000000000ULL;
+  static const uint64_t MSP_POS_INF = 0x7fff000000000000ULL;
+  static const uint64_t MSP_NEG_INF = 0xffff000000000000ULL;
+  static const uint64_t MSP_POS_ZERO = 0x0000000000000000ULL;
+  static const uint64_t MSP_NEG_ZERO = 0x8000000000000000ULL;
+  static const uint64_t LSP_INF = 0;
+  static const uint64_t LSP_ZERO = 0;
+  static const uint64_t LSP_MAX = 0xffffffffffffffffULL;
+  static const unsigned int EXPONENT_BITS = 15;
+  static const unsigned int MANTISSA_BITS = 112;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+					- static_cast<int>(MANTISSA_BITS);
+  int is_inf() const;
+  int is_nan() const;
+  int is_zero() const;
+  int sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+class Float {
+public:
+  static const bool fpu_related = false;
+};
+
+#if PPL_SUPPORTED_FLOAT
+template <>
+class Float<float> {
+public:
+  typedef CXX_FLOAT_BINARY_FORMAT Binary;
+  union {
+    float number;
+    Binary binary;
+  } u;
+  Float();
+  Float(float v);
+  float value();
+  static const bool fpu_related = true;
+};
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+class Float<double> {
+public:
+  typedef CXX_DOUBLE_BINARY_FORMAT Binary;
+  union {
+    double number;
+    Binary binary;
+  } u;
+  Float();
+  Float(double v);
+  double value();
+  static const bool fpu_related = true;
+};
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <>
+class Float<long double> {
+public:
+  typedef CXX_LONG_DOUBLE_BINARY_FORMAT Binary;
+  union {
+    long double number;
+    Binary binary;
+  } u;
+  Float();
+  Float(long double v);
+  long double value();
+  static const bool fpu_related = true;
+};
+#endif
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Float.inlines.hh"
+
+#endif // !defined(PPL_Float_defs_hh)
diff --git a/src/Float.inlines.hh b/src/Float.inlines.hh
new file mode 100644
index 0000000..cb1c86c
--- /dev/null
+++ b/src/Float.inlines.hh
@@ -0,0 +1,388 @@
+/* IEC 559 floating point format related functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Float_inlines_hh
+#define PPL_Float_inlines_hh 1
+
+#include <climits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+float_ieee754_single::is_inf() const {
+  if (word == NEG_INF)
+    return -1;
+  if (word == POS_INF)
+    return 1;
+  return 0;
+}
+
+inline int
+float_ieee754_single::is_nan() const {
+  return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ieee754_single::is_zero() const {
+  if (word == NEG_ZERO)
+    return -1;
+  if (word == POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_single::negate() {
+  word ^= SGN_MASK;
+}
+
+inline int
+float_ieee754_single::sign_bit() const {
+  return !!(word & SGN_MASK);
+}
+
+inline void
+float_ieee754_single::dec() {
+  word--;
+}
+
+inline void
+float_ieee754_single::inc() {
+  word++;
+}
+
+inline void
+float_ieee754_single::set_max(bool negative) {
+  word = 0x7f7fffff;
+  if (negative)
+    word |= SGN_MASK;
+}
+
+inline void
+float_ieee754_single::build(bool negative, mpz_t mantissa, int exponent) {
+  word = mpz_get_ui(mantissa) & ((1UL << MANTISSA_BITS) - 1);
+  if (negative)
+    word |= SGN_MASK;
+  word |= static_cast<uint32_t>(exponent + EXPONENT_BIAS) << MANTISSA_BITS;
+}
+
+inline int
+float_ieee754_double::is_inf() const {
+  if (lsp != LSP_INF)
+    return 0;
+  if (msp == MSP_NEG_INF)
+    return -1;
+  if (msp == MSP_POS_INF)
+    return 1;
+  return 0;
+}
+
+inline int
+float_ieee754_double::is_nan() const {
+  uint32_t a = msp & ~MSP_SGN_MASK;
+  return a > MSP_POS_INF || (a == MSP_POS_INF && lsp != LSP_INF);
+}
+
+inline int
+float_ieee754_double::is_zero() const {
+  if (lsp != LSP_ZERO)
+    return 0;
+  if (msp == MSP_NEG_ZERO)
+    return -1;
+  if (msp == MSP_POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_double::negate() {
+  msp ^= MSP_SGN_MASK;
+}
+
+inline int
+float_ieee754_double::sign_bit() const {
+  return !!(msp & MSP_SGN_MASK);
+}
+
+inline void
+float_ieee754_double::dec() {
+  if (lsp == 0) {
+    msp--;
+    lsp = LSP_MAX;
+  }
+  else
+    lsp--;
+}
+
+inline void
+float_ieee754_double::inc() {
+  if (lsp == LSP_MAX) {
+    msp++;
+    lsp = 0;
+  }
+  else
+    lsp++;
+}
+
+inline void
+float_ieee754_double::set_max(bool negative) {
+  msp = 0x7fefffff;
+  lsp = 0xffffffff;
+  if (negative)
+    msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_double::build(bool negative, mpz_t mantissa, int exponent) {
+#if ULONG_MAX == 0xffffffffUL
+  lsp = mpz_get_ui(mantissa);
+  mpz_tdiv_q_2exp(mantissa, mantissa, 32);
+  unsigned long m = mpz_get_ui(mantissa);
+#else
+  unsigned long m = mpz_get_ui(mantissa);
+  lsp = m;
+  m >>= 32;
+#endif
+  msp = m & ((1UL << (MANTISSA_BITS - 32)) - 1);
+  if (negative)
+    msp |= MSP_SGN_MASK;
+  msp |= static_cast<uint32_t>(exponent + EXPONENT_BIAS)
+    << (MANTISSA_BITS - 32);
+}
+
+inline int
+float_intel_double_extended::is_inf() const {
+  if (lsp != LSP_INF)
+    return 0;
+  uint32_t a = msp & MSP_NEG_INF;
+  if (a == MSP_NEG_INF)
+    return -1;
+  if (a == MSP_POS_INF)
+    return 1;
+  return 0;
+}
+
+inline int
+float_intel_double_extended::is_nan() const {
+  return (msp & MSP_POS_INF) == MSP_POS_INF
+    && lsp != LSP_INF;
+}
+
+inline int
+float_intel_double_extended::is_zero() const {
+  if (lsp != LSP_ZERO)
+    return 0;
+  uint32_t a = msp & MSP_NEG_INF;
+  if (a == MSP_NEG_ZERO)
+    return -1;
+  if (a == MSP_POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_intel_double_extended::negate() {
+  msp ^= MSP_SGN_MASK;
+}
+
+inline int
+float_intel_double_extended::sign_bit() const {
+  return !!(msp & MSP_SGN_MASK);
+}
+
+inline void
+float_intel_double_extended::dec() {
+  if ((lsp & LSP_DMAX) == 0) {
+    msp--;
+    lsp = (msp & MSP_NEG_INF) == 0 ? LSP_DMAX : LSP_NMAX;
+  }
+  else
+    lsp--;
+}
+
+inline void
+float_intel_double_extended::inc() {
+  if ((lsp & LSP_DMAX) == LSP_DMAX) {
+    msp++;
+    lsp = LSP_DMAX + 1;
+  }
+  else
+    lsp++;
+}
+
+inline void
+float_intel_double_extended::set_max(bool negative) {
+  msp = 0x00007ffe;
+  lsp = 0xffffffffffffffffULL;
+  if (negative)
+    msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_intel_double_extended::build(bool negative,
+				   mpz_t mantissa, int exponent) {
+#if ULONG_MAX == 0xffffffffUL
+  mpz_export(&lsp, 0, -1, 8, 0, 0, mantissa);
+#else
+  lsp = mpz_get_ui(mantissa);
+#endif
+  msp = (negative ? MSP_SGN_MASK : 0);
+  msp |= static_cast<uint32_t>(exponent + EXPONENT_BIAS);
+}
+
+inline int
+float_ieee754_quad::is_inf() const {
+  if (lsp != LSP_INF)
+    return 0;
+  if (msp == MSP_NEG_INF)
+    return -1;
+  if (msp == MSP_POS_INF)
+    return 1;
+  return 0;
+}
+
+inline int
+float_ieee754_quad::is_nan() const {
+  return (msp & ~MSP_SGN_MASK) == MSP_POS_INF
+    && lsp != LSP_INF;
+}
+
+inline int
+float_ieee754_quad::is_zero() const {
+  if (lsp != LSP_ZERO)
+    return 0;
+  if (msp == MSP_NEG_ZERO)
+    return -1;
+  if (msp == MSP_POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_quad::negate() {
+  msp ^= MSP_SGN_MASK;
+}
+
+inline int
+float_ieee754_quad::sign_bit() const {
+  return !!(msp & MSP_SGN_MASK);
+}
+
+inline void
+float_ieee754_quad::dec() {
+  if (lsp == 0) {
+    msp--;
+    lsp = LSP_MAX;
+  }
+  else
+    lsp--;
+}
+
+inline void
+float_ieee754_quad::inc() {
+  if (lsp == LSP_MAX) {
+    msp++;
+    lsp = 0;
+  }
+  else
+    lsp++;
+}
+
+inline void
+float_ieee754_quad::set_max(bool negative) {
+  msp = 0x7ffeffffffffffffULL;
+  lsp = 0xffffffffffffffffULL;
+  if (negative)
+    msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_quad::build(bool negative, mpz_t mantissa, int exponent) {
+  uint64_t parts[2];
+  mpz_export(parts, 0, -1, 8, 0, 0, mantissa);
+  lsp = parts[0];
+  msp = parts[1];
+  msp &= ((1ULL << (MANTISSA_BITS - 64)) - 1);
+  if (negative)
+    msp |= MSP_SGN_MASK;
+  msp |= static_cast<uint64_t>(exponent + EXPONENT_BIAS)
+    << (MANTISSA_BITS - 64);
+}
+
+#ifdef CXX_FLOAT_BINARY_FORMAT
+inline
+Float<float>::Float() {
+}
+
+inline
+Float<float>::Float(float v) {
+  u.number = v;
+}
+
+inline float
+Float<float>::value() {
+  return u.number;
+}
+#endif
+
+#ifdef CXX_DOUBLE_BINARY_FORMAT
+inline
+Float<double>::Float() {
+}
+
+inline
+Float<double>::Float(double v) {
+  u.number = v;
+}
+
+inline double
+Float<double>::value() {
+  return u.number;
+}
+#endif
+
+#ifdef CXX_LONG_DOUBLE_BINARY_FORMAT
+inline
+Float<long double>::Float() {
+}
+
+inline
+Float<long double>::Float(long double v) {
+  u.number = v;
+}
+
+inline long double
+Float<long double>::value() {
+  return u.number;
+}
+#endif
+
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Float_inlines_hh)
diff --git a/src/GMP_Integer.defs.hh b/src/GMP_Integer.defs.hh
new file mode 100644
index 0000000..7d17567
--- /dev/null
+++ b/src/GMP_Integer.defs.hh
@@ -0,0 +1,136 @@
+/* GMP_Integer class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_GMP_Integer_defs_hh
+#define PPL_GMP_Integer_defs_hh 1
+
+#include "GMP_Integer.types.hh"
+#include "globals.types.hh"
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Accessor Functions
+//@{
+
+//! Returns a const reference to the underlying integer value.
+/*! \relates GMP_Integer */
+const mpz_class& raw_value(const GMP_Integer& x);
+
+//! Returns a reference to the underlying integer value.
+/*! \relates GMP_Integer */
+mpz_class& raw_value(GMP_Integer& x);
+
+//@} // Accessor Functions
+
+//! \name Memory Size Inspection Functions
+//@{
+
+//! Returns the total size in bytes of the memory occupied by \p x.
+/*! \relates GMP_Integer */
+memory_size_type total_memory_in_bytes(const GMP_Integer& x);
+
+//! Returns the size in bytes of the memory managed by \p x.
+/*! \relates GMP_Integer */
+memory_size_type external_memory_in_bytes(const GMP_Integer& x);
+
+//@} // Memory Size Inspection Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Assigns to \p x its negation.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x);
+
+//! Assigns to \p x the negation of \p y.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates GMP_Integer */
+void gcd_assign(GMP_Integer& x,
+		const GMP_Integer& y, const GMP_Integer& z);
+
+//! Extended GCD.
+/*! \relates GMP_Integer
+  Assigns to \p x the greatest common divisor of \p y and \p z, and to
+  \p s and \p t the values such that \p y * \p s + \p z * \p t = \p x.
+*/
+void gcdext_assign(GMP_Integer& x,
+		   const GMP_Integer& y, const GMP_Integer& z,
+		   GMP_Integer& s, GMP_Integer& t);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates GMP_Integer */
+void lcm_assign(GMP_Integer& x,
+		const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates GMP_Integer */
+void add_mul_assign(GMP_Integer& x,
+		    const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates GMP_Integer */
+void sub_mul_assign(GMP_Integer& x,
+		    const GMP_Integer& y, const GMP_Integer& z);
+
+/*! \brief
+  If \p z divides \p y, assigns to \p x the quotient of the integer
+  division of \p y and \p z.
+
+  \relates GMP_Integer
+  The behavior is undefined if \p z does not divide \p y.
+*/
+void exact_div_assign(GMP_Integer& x,
+		      const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates GMP_Integer */
+void sqrt_assign(GMP_Integer& x, const GMP_Integer& y);
+
+/*! \brief
+  Returns a negative, zero or positive value depending on whether
+  \p x is lower than, equal to or greater than \p y, respectively.
+
+  \relates GMP_Integer
+*/
+int cmp(const GMP_Integer& x, const GMP_Integer& y);
+
+//@} // Arithmetic Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::GMP_Integer */
+void swap(Parma_Polyhedra_Library::GMP_Integer& x,
+	  Parma_Polyhedra_Library::GMP_Integer& y);
+
+} // namespace std
+
+#include "GMP_Integer.inlines.hh"
+
+#endif // !defined(PPL_GMP_Integer_defs_hh)
diff --git a/src/GMP_Integer.inlines.hh b/src/GMP_Integer.inlines.hh
new file mode 100644
index 0000000..c301cd3
--- /dev/null
+++ b/src/GMP_Integer.inlines.hh
@@ -0,0 +1,112 @@
+/* GMP_Integer class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_GMP_Integer_inlines_hh
+#define PPL_GMP_Integer_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+neg_assign(GMP_Integer& x) {
+  mpz_neg(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+neg_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_neg(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+gcd_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_gcd(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+gcdext_assign(GMP_Integer& x,
+	      const GMP_Integer& y, const GMP_Integer& z,
+	      GMP_Integer& s, GMP_Integer& t) {
+  mpz_gcdext(x.get_mpz_t(),
+	     s.get_mpz_t(), t.get_mpz_t(),
+	     y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+lcm_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_lcm(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+add_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_addmul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sub_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_submul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+exact_div_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  assert(y % z == 0);
+  mpz_divexact(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sqrt_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_sqrt(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline int
+cmp(const GMP_Integer& x, const GMP_Integer& y) {
+  return mpz_cmp(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline const mpz_class&
+raw_value(const GMP_Integer& x) {
+  return x;
+}
+
+inline mpz_class&
+raw_value(GMP_Integer& x) {
+  return x;
+}
+
+inline memory_size_type
+external_memory_in_bytes(const GMP_Integer& x) {
+  return x.get_mpz_t()[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+total_memory_in_bytes(const GMP_Integer& x) {
+  return sizeof(x) + external_memory_in_bytes(x);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::GMP_Integer */
+inline void
+std::swap(Parma_Polyhedra_Library::GMP_Integer& x,
+	  Parma_Polyhedra_Library::GMP_Integer& y) {
+  mpz_swap(x.get_mpz_t(), y.get_mpz_t());
+}
+
+#endif // !defined(PPL_GMP_Integer_inlines_hh)
diff --git a/src/GMP_Integer.types.hh b/src/GMP_Integer.types.hh
new file mode 100644
index 0000000..37f802c
--- /dev/null
+++ b/src/GMP_Integer.types.hh
@@ -0,0 +1,43 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_GMP_Integer_types_hh
+#define PPL_GMP_Integer_types_hh 1
+
+#include "Coefficient_traits_template.hh"
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \class Parma_Polyhedra_Library::GMP_Integer
+  \brief
+  Unbounded integers as provided by the GMP library.
+
+  \ingroup PPL_CXX_interface
+  GMP_Integer is an alias for the <CODE>mpz_class</CODE> type
+  defined in the C++ interface of the GMP library.
+  For more information, see <CODE>http://www.swox.com/gmp/</CODE>
+*/
+typedef mpz_class GMP_Integer;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for unbounded integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <>
+struct Coefficient_traits_template<GMP_Integer> {
+  //! The type used for references to const unbounded integers.
+  typedef const GMP_Integer& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_GMP_Integer_types_hh)
diff --git a/src/Generator.cc b/src/Generator.cc
new file mode 100644
index 0000000..778d353
--- /dev/null
+++ b/src/Generator.cc
@@ -0,0 +1,381 @@
+/* Generator class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Generator.defs.hh"
+
+#include "Variable.defs.hh"
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Generator::throw_dimension_incompatible(const char* method,
+					     const char* name_var,
+					     const Variable v) const {
+  std::ostringstream s;
+  s << "PPL::Generator::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << name_var << ".space_dimension() == " << v.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Generator::throw_invalid_argument(const char* method,
+				       const char* reason) const {
+  std::ostringstream s;
+  s << "PPL::Generator::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::invalid_argument(s.str());
+}
+
+PPL::Generator
+PPL::Generator::point(const Linear_Expression& e,
+		      Coefficient_traits::const_reference d) {
+  if (d == 0)
+    throw std::invalid_argument("PPL::point(e, d):\n"
+				"d == 0.");
+  Linear_Expression ec = e;
+  Generator g(ec, Generator::POINT, NECESSARILY_CLOSED);
+  g[0] = d;
+
+  // If the divisor is negative, we negate it as well as
+  // all the coefficients of the point, because we want to preserve
+  // the invariant: the divisor of a point is strictly positive.
+  if (d < 0)
+    for (dimension_type i = g.size(); i-- > 0; )
+      neg_assign(g[i]);
+
+  // Enforce normalization.
+  g.normalize();
+  return g;
+}
+
+PPL::Generator
+PPL::Generator::closure_point(const Linear_Expression& e,
+			      Coefficient_traits::const_reference d) {
+  if (d == 0)
+    throw std::invalid_argument("PPL::closure_point(e, d):\n"
+				"d == 0.");
+  // Adding the epsilon dimension with coefficient 0.
+  Linear_Expression ec = 0 * Variable(e.space_dimension());
+  ec += e;
+  // A closure point is indeed a point in the higher dimension space.
+  Generator g = point(ec, d);
+  // Fix the topology.
+  g.set_not_necessarily_closed();
+  // Enforce normalization.
+  g.normalize();
+  return g;
+}
+
+PPL::Generator
+PPL::Generator::ray(const Linear_Expression& e) {
+  // The origin of the space cannot be a ray.
+  if (e.all_homogeneous_terms_are_zero())
+    throw std::invalid_argument("PPL::ray(e):\n"
+				"e == 0, but the origin cannot be a ray.");
+
+  Linear_Expression ec = e;
+  Generator g(ec, Generator::RAY, NECESSARILY_CLOSED);
+  g[0] = 0;
+  // Enforce normalization.
+  g.normalize();
+  return g;
+}
+
+PPL::Generator
+PPL::Generator::line(const Linear_Expression& e) {
+  // The origin of the space cannot be a line.
+  if (e.all_homogeneous_terms_are_zero())
+    throw std::invalid_argument("PPL::line(e):\n"
+				"e == 0, but the origin cannot be a line.");
+
+  Linear_Expression ec = e;
+  Generator g(ec, Generator::LINE, NECESSARILY_CLOSED);
+  g[0] = 0;
+  // Enforce normalization.
+  g.strong_normalize();
+  return g;
+}
+
+bool
+PPL::Generator::is_equivalent_to(const Generator& y) const {
+  const Generator& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  const Type x_type = x.type();
+  if (x_type != y.type())
+    return false;
+
+  if (x_type == POINT
+      && !(x.is_necessarily_closed() && y.is_necessarily_closed())) {
+    // Due to the presence of epsilon-coefficients, syntactically
+    // different points may actually encode the same generator.
+    // First, drop the epsilon-coefficient ...
+    Linear_Expression x_expr(x);
+    Linear_Expression y_expr(y);
+    // ... second, re-normalize ...
+    x_expr.normalize();
+    y_expr.normalize();
+    // ... and finally check for syntactic equality.
+    for (dimension_type i = x_space_dim + 1; i-- > 0; )
+      if (x_expr[i] != y_expr[i])
+	return false;
+    return true;
+  }
+
+  // Here the epsilon-coefficient, if present, is zero.
+  // It is sufficient to check for syntactic equality.
+  for (dimension_type i = x_space_dim + 1; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Generator& g) {
+  bool needed_divisor = false;
+  bool extra_parentheses = false;
+  const int num_variables = g.space_dimension();
+  Generator::Type t = g.type();
+  switch (t) {
+  case Generator::LINE:
+    s << "l(";
+    break;
+  case Generator::RAY:
+    s << "r(";
+    break;
+  case Generator::POINT:
+    s << "p(";
+    goto any_point;
+  case Generator::CLOSURE_POINT:
+    s << "c(";
+  any_point:
+    if (g[0] != 1) {
+      needed_divisor = true;
+      int num_non_zero_coefficients = 0;
+      for (int v = 0; v < num_variables; ++v)
+	if (g[v+1] != 0)
+	  if (++num_non_zero_coefficients > 1) {
+	    extra_parentheses = true;
+	    s << "(";
+	    break;
+	  }
+    }
+    break;
+  }
+
+  bool first = true;
+  for (int v = 0; v < num_variables; ++v) {
+    Coefficient gv = g[v+1];
+    if (gv != 0) {
+      if (!first) {
+	if (gv > 0)
+	  s << " + ";
+	else {
+	  s << " - ";
+	  neg_assign(gv);
+	}
+      }
+      else
+	first = false;
+      if (gv == -1)
+	s << "-";
+      else if (gv != 1)
+	s << gv << "*";
+      s << PPL::Variable(v);
+    }
+  }
+  if (first)
+    // A point or closure point in the origin.
+    s << 0;
+  if (extra_parentheses)
+    s << ")";
+  if (needed_divisor)
+    s << "/" << g[0];
+  s << ")";
+  return s;
+}
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Generator::Type& t) {
+  const char* n = 0;
+  switch (t) {
+  case Generator::LINE:
+    n = "LINE";
+    break;
+  case Generator::RAY:
+    n = "RAY";
+    break;
+  case Generator::POINT:
+    n = "POINT";
+    break;
+  case Generator::CLOSURE_POINT:
+    n = "CLOSURE_POINT";
+    break;
+  }
+  s << n;
+  return s;
+}
+
+bool
+PPL::Generator::is_matching_closure_point(const Generator& p) const {
+  assert(topology() == p.topology()
+	 && space_dimension() == p.space_dimension()
+	 && type() == CLOSURE_POINT
+	 && p.type() == POINT);
+  const Generator& cp = *this;
+  if (cp[0] == p[0]) {
+    // Divisors are equal: we can simply compare coefficients
+    // (disregarding the epsilon coefficient).
+    for (dimension_type i = cp.size() - 2; i > 0; --i)
+      if (cp[i] != p[i])
+	return false;
+    return true;
+  }
+  else {
+    // Divisors are different: divide them by their GCD
+    // to simplify the following computation.
+    TEMP_INTEGER(gcd);
+    gcd_assign(gcd, cp[0], p[0]);
+    const bool rel_prime = (gcd == 1);
+    TEMP_INTEGER(cp_0_scaled);
+    TEMP_INTEGER(p_0_scaled);
+    if (!rel_prime) {
+      exact_div_assign(cp_0_scaled, cp[0], gcd);
+      exact_div_assign(p_0_scaled, p[0], gcd);
+    }
+    const Coefficient& cp_div = rel_prime ? cp[0] : cp_0_scaled;
+    const Coefficient& p_div = rel_prime ? p[0] : p_0_scaled;
+    TEMP_INTEGER(prod1);
+    TEMP_INTEGER(prod2);
+    for (dimension_type i = cp.size() - 2; i > 0; --i) {
+      prod1 = cp[i] * p_div;
+      prod2 = p[i] * cp_div;
+      if (prod1 != prod2)
+	return false;
+    }
+    return true;
+  }
+}
+
+PPL_OUTPUT_DEFINITIONS(Generator);
+
+bool
+PPL::Generator::OK() const {
+  const Generator& g = *this;
+
+  // Topology consistency check.
+  const dimension_type min_size = is_necessarily_closed() ? 1 : 2;
+  if (size() < min_size) {
+#ifndef NDEBUG
+    std::cerr << "Generator has fewer coefficients than the minimum "
+	      << "allowed by its topology:"
+	      << std::endl
+	      << "size is " << size()
+	      << ", minimum is " << min_size << "."
+	      << std::endl;
+#endif
+    return false;
+  }
+
+  // Normalization check.
+  Generator tmp = g;
+  tmp.strong_normalize();
+  if (tmp != g) {
+#ifndef NDEBUG
+    std::cerr << "Generators should be strongly normalized!"
+	      << std::endl;
+#endif
+    return false;
+  }
+
+  switch (g.type()) {
+  case LINE:
+    // Intentionally fall through.
+  case RAY:
+    if (g[0] != 0) {
+#ifndef NDEBUG
+      std::cerr << "Lines must have a zero inhomogeneous term!"
+		<< std::endl;
+#endif
+      return false;
+    }
+    if (!g.is_necessarily_closed() && g[size() - 1] != 0) {
+#ifndef NDEBUG
+      std::cerr << "Lines and rays must have a zero coefficient "
+		<< "for the epsilon dimension!"
+		<< std::endl;
+#endif
+      return false;
+    }
+    // The following test is correct, since we already checked
+    // that the epsilon coordinate is zero.
+    if (g.all_homogeneous_terms_are_zero()) {
+#ifndef NDEBUG
+      std::cerr << "The origin of the vector space cannot be a line or a ray!"
+		<< std::endl;
+#endif
+      return false;
+    }
+    break;
+
+  case POINT:
+    if (g[0] <= 0) {
+#ifndef NDEBUG
+      std::cerr << "Points must have a positive divisor!"
+		<< std::endl;
+#endif
+      return false;
+    }
+    if (!g.is_necessarily_closed())
+      if (g[size() - 1] <= 0) {
+#ifndef NDEBUG
+	std::cerr << "In the NNC topology, points must have epsilon > 0"
+		  << std::endl;
+#endif
+	return false;
+      }
+    break;
+
+  case CLOSURE_POINT:
+    if (g[0] <= 0) {
+#ifndef NDEBUG
+      std::cerr << "Closure points must have a positive divisor!"
+		<< std::endl;
+#endif
+      return false;
+    }
+    break;
+  }
+
+  // All tests passed.
+  return true;
+}
diff --git a/src/Generator.defs.hh b/src/Generator.defs.hh
new file mode 100644
index 0000000..57caab1
--- /dev/null
+++ b/src/Generator.defs.hh
@@ -0,0 +1,508 @@
+/* Generator class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Generator_defs_hh
+#define PPL_Generator_defs_hh 1
+
+#include "Generator.types.hh"
+#include "Scalar_Products.types.hh"
+#include "Row.defs.hh"
+#include "Variable.defs.hh"
+#include "Constraint_System.types.hh"
+#include "Generator_System.defs.hh"
+#include "Congruence_System.types.hh"
+#include "Linear_Expression.defs.hh"
+#include "Polyhedron.types.hh"
+#include "Grid_Generator.types.hh"
+#include "Grid_Generator_System.types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator& g);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Generator */
+void swap(Parma_Polyhedra_Library::Generator& x,
+	  Parma_Polyhedra_Library::Generator& y);
+
+} // namespace std
+
+
+//! A line, ray, point or closure point.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Generator is one of the following:
+
+  - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a ray \f$\vect{r} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a point
+    \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  - a closure point
+    \f$\vect{c} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  where \f$n\f$ is the dimension of the space
+  and, for points and closure points, \f$d > 0\f$ is the divisor.
+
+  \par A note on terminology.
+  As observed in Section \ref representation, there are cases when,
+  in order to represent a polyhedron \f$\cP\f$ using the generator system
+  \f$\cG = (L, R, P, C)\f$, we need to include in the finite set
+  \f$P\f$ even points of \f$\cP\f$ that are <EM>not</EM> vertices
+  of \f$\cP\f$.
+  This situation is even more frequent when working with NNC polyhedra
+  and it is the reason why we prefer to use the word `point'
+  where other libraries use the word `vertex'.
+
+  \par How to build a generator.
+  Each type of generator is built by applying the corresponding
+  function (<CODE>line</CODE>, <CODE>ray</CODE>, <CODE>point</CODE>
+  or <CODE>closure_point</CODE>) to a linear expression,
+  representing a direction in the space;
+  the space dimension of the generator is defined as the space dimension
+  of the corresponding linear expression.
+  Linear expressions used to define a generator should be homogeneous
+  (any constant term will be simply ignored).
+  When defining points and closure points, an optional Coefficient argument
+  can be used as a common <EM>divisor</EM> for all the coefficients
+  occurring in the provided linear expression;
+  the default value for this argument is 1.
+
+  \par
+  In all the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a line with direction \f$x-y-z\f$
+  and having space dimension \f$3\f$:
+  \code
+  Generator l = line(x - y - z);
+  \endcode
+  As mentioned above, the constant term of the linear expression
+  is not relevant. Thus, the following code has the same effect:
+  \code
+  Generator l = line(x - y - z + 15);
+  \endcode
+  By definition, the origin of the space is not a line, so that
+  the following code throws an exception:
+  \code
+  Generator l = line(0*x);
+  \endcode
+
+  \par Example 2
+  The following code builds a ray with the same direction as the
+  line in Example 1:
+  \code
+  Generator r = ray(x - y - z);
+  \endcode
+  As is the case for lines, when specifying a ray the constant term
+  of the linear expression is not relevant; also, an exception is thrown
+  when trying to build a ray from the origin of the space.
+
+  \par Example 3
+  The following code builds the point
+  \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+  \code
+  Generator p = point(1*x + 0*y + 2*z);
+  \endcode
+  The same effect can be obtained by using the following code:
+  \code
+  Generator p = point(x + 2*z);
+  \endcode
+  Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+  using either one of the following lines of code:
+  \code
+  Generator origin3 = point(0*x + 0*y + 0*z);
+  Generator origin3_alt = point(0*z);
+  \endcode
+  Note however that the following code would have defined
+  a different point, namely \f$\vect{0} \in \Rset^2\f$:
+  \code
+  Generator origin2 = point(0*y);
+  \endcode
+  The following two lines of code both define the only point
+  having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+  In the second case we exploit the fact that the first argument
+  of the function <CODE>point</CODE> is optional.
+  \code
+  Generator origin0 = Generator::zero_dim_point();
+  Generator origin0_alt = point();
+  \endcode
+
+  \par Example 4
+  The point \f$\vect{p}\f$ specified in Example 3 above
+  can also be obtained with the following code,
+  where we provide a non-default value for the second argument
+  of the function <CODE>point</CODE> (the divisor):
+  \code
+  Generator p = point(2*x + 0*y + 4*z, 2);
+  \endcode
+  Obviously, the divisor can be usefully exploited to specify
+  points having some non-integer (but rational) coordinates.
+  For instance, the point
+  \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be specified by the following code:
+  \code
+  Generator q = point(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par Example 5
+  Closure points are specified in the same way we defined points,
+  but invoking their specific constructor function.
+  For instance, the closure point
+  \f$\vect{c} = (1, 0, 2)^\transpose \in \Rset^3\f$ is defined by
+  \code
+  Generator c = closure_point(1*x + 0*y + 2*z);
+  \endcode
+  For the particular case of the (only) closure point
+  having space dimension zero, we can use any of the following:
+  \code
+  Generator closure_origin0 = Generator::zero_dim_closure_point();
+  Generator closure_origin0_alt = closure_point();
+  \endcode
+
+  \par How to inspect a generator
+  Several methods are provided to examine a generator and extract
+  all the encoded information: its space dimension, its type and
+  the value of its integer coefficients.
+
+  \par Example 6
+  The following code shows how it is possible to access each single
+  coefficient of a generator.
+  If <CODE>g1</CODE> is a point having coordinates
+  \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+  we construct the closure point <CODE>g2</CODE> having coordinates
+  \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+  \code
+  if (g1.is_point()) {
+    cout << "Point g1: " << g1 << endl;
+    Linear_Expression e;
+    for (int i = g1.space_dimension() - 1; i >= 0; i--)
+      e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+    Generator g2 = closure_point(e, g1.divisor());
+    cout << "Closure point g2: " << g2 << endl;
+  }
+  else
+    cout << "Generator g1 is not a point." << endl;
+  \endcode
+  Therefore, for the point
+  \code
+  Generator g1 = point(2*x - y + 3*z, 2);
+  \endcode
+  we would obtain the following output:
+  \code
+  Point g1: p((2*A - B + 3*C)/2)
+  Closure point g2: cp((2*A - 2*B + 9*C)/2)
+  \endcode
+  When working with (closure) points, be careful not to confuse
+  the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+  these are equivalent only when the divisor of the (closure) point is 1.
+*/
+class Parma_Polyhedra_Library::Generator : private Linear_Row {
+public:
+  //! Returns the line of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Generator line(const Linear_Expression& e);
+
+  //! Returns the ray of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Generator ray(const Linear_Expression& e);
+
+  //! Returns the point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Generator point(const Linear_Expression& e
+			 = Linear_Expression::zero(),
+			 Coefficient_traits::const_reference d
+			 = Coefficient_one());
+
+  //! Returns the closure point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Generator
+  closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+		Coefficient_traits::const_reference d = Coefficient_one());
+
+  //! Ordinary copy-constructor.
+  Generator(const Generator& g);
+
+  //! Destructor.
+  ~Generator();
+
+  //! Assignment operator.
+  Generator& operator=(const Generator& g);
+
+  //! Returns the maximum space dimension a Generator can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! The generator type.
+  enum Type {
+    /*! The generator is a line. */
+    LINE,
+    /*! The generator is a ray. */
+    RAY,
+    /*! The generator is a point. */
+    POINT,
+    /*! The generator is a closure point. */
+    CLOSURE_POINT
+  };
+
+  //! Returns the generator type of \p *this.
+  Type type() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+  bool is_line() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a ray.
+  bool is_ray() const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line or a ray.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool is_line_or_ray() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+  bool is_point() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a closure point.
+  bool is_closure_point() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the index of \p v is greater than or equal to the
+    space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! If \p *this is either a point or a closure point, returns its divisor.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is neither a point nor a closure point.
+  */
+  Coefficient_traits::const_reference divisor() const;
+
+  //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+  static const Generator& zero_dim_point();
+
+  /*! \brief
+    Returns, as a closure point,
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Generator& zero_dim_closure_point();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent generators.
+
+    Generators having different space dimensions are not equivalent.
+  */
+  bool is_equivalent_to(const Generator& y) const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Generator& y);
+
+private:
+  /*! \brief
+    Builds a generator of type \p type and topology \p topology,
+    stealing the coefficients from \p e.
+  */
+  Generator(Linear_Expression& e, Type type, Topology topology);
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+			       const char* name_var,
+			       Variable v) const;
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* reason) const;
+
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Assign;
+  friend class Parma_Polyhedra_Library::Generator_System;
+  friend class Parma_Polyhedra_Library::Generator_System::const_iterator;
+  // FIXME: the following friend declaration should be avoided.
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  friend class Parma_Polyhedra_Library::Grid_Generator;
+  // This is for access to Row and Linear_Row in `insert'.
+  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+  friend
+  Parma_Polyhedra_Library
+  ::Linear_Expression::Linear_Expression(const Generator& g);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+						    const Generator& g);
+
+  //! Copy-constructor with given space dimension.
+  Generator(const Generator& g, dimension_type dimension);
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is not a line.
+  bool is_ray_or_point() const;
+
+  //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
+  void set_is_line();
+
+  //! Sets the Linear_Row kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+  void set_is_ray_or_point();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the closure point
+    \p *this has the same \e coordinates of the point \p p.
+
+    It is \e assumed that \p *this is a closure point, \p p is a point
+    and both topologies and space dimensions agree.
+  */
+  bool is_matching_closure_point(const Generator& p) const;
+
+  //! Default constructor: private and not implemented.
+  Generator();
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Shorthand for Generator Generator::line(const Linear_Expression& e).
+/*! \relates Generator */
+Generator line(const Linear_Expression& e);
+
+//! Shorthand for Generator Generator::ray(const Linear_Expression& e).
+/*! \relates Generator */
+Generator ray(const Linear_Expression& e);
+
+/*! \brief
+  Shorthand for Generator
+  Generator::point(const Linear_Expression& e, Coefficient_traits::const_reference d).
+
+  \relates Generator
+*/
+Generator
+point(const Linear_Expression& e = Linear_Expression::zero(),
+      Coefficient_traits::const_reference d = Coefficient_one());
+
+/*! \brief
+  Shorthand for Generator
+  Generator::closure_point(const Linear_Expression& e, Coefficient_traits::const_reference d).
+
+  \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+	      Coefficient_traits::const_reference d = Coefficient_one());
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Generator */
+bool operator==(const Generator& x, const Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Generator */
+bool operator!=(const Generator& x, const Generator& y);
+
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Generator.inlines.hh"
+
+#endif // !defined(PPL_Generator_defs_hh)
diff --git a/src/Generator.inlines.hh b/src/Generator.inlines.hh
new file mode 100644
index 0000000..b66f4f1
--- /dev/null
+++ b/src/Generator.inlines.hh
@@ -0,0 +1,225 @@
+/* Generator class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Generator_inlines_hh
+#define PPL_Generator_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Generator::Generator(Linear_Expression& e, Type type, Topology topology) {
+  assert(type != CLOSURE_POINT || topology == NOT_NECESSARILY_CLOSED);
+  Linear_Row::swap(e);
+  flags() = Flags(topology, (type == LINE
+			     ? LINE_OR_EQUALITY
+			     : RAY_OR_POINT_OR_INEQUALITY));
+}
+
+inline
+Generator::Generator(const Generator& g)
+  : Linear_Row(g) {
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type dimension)
+  : Linear_Row(g, dimension, dimension) {
+}
+
+inline
+Generator::~Generator() {
+}
+
+inline Generator&
+Generator::operator=(const Generator& g) {
+  Linear_Row::operator=(g);
+  return *this;
+}
+
+inline dimension_type
+Generator::max_space_dimension() {
+  return Linear_Row::max_space_dimension();
+}
+
+inline dimension_type
+Generator::space_dimension() const {
+  return Linear_Row::space_dimension();
+}
+
+inline bool
+Generator::is_line() const {
+  return is_line_or_equality();
+}
+
+inline bool
+Generator::is_ray_or_point() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline bool
+Generator::is_line_or_ray() const {
+  return (*this)[0] == 0;
+}
+
+inline bool
+Generator::is_ray() const {
+  return is_ray_or_point() && is_line_or_ray();
+}
+
+inline Generator::Type
+Generator::type() const {
+  if (is_line())
+    return LINE;
+  if (is_line_or_ray())
+    return RAY;
+  if (is_necessarily_closed())
+    return POINT;
+  else {
+    // Checking the value of the epsilon coefficient.
+    const Generator& g = *this;
+    return (g[size() - 1] == 0) ? CLOSURE_POINT : POINT;
+  }
+}
+
+inline bool
+Generator::is_point() const {
+  return type() == POINT;
+}
+
+inline bool
+Generator::is_closure_point() const {
+  return type() == CLOSURE_POINT;
+}
+
+inline void
+Generator::set_is_line() {
+  set_is_line_or_equality();
+}
+
+inline void
+Generator::set_is_ray_or_point() {
+  set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Generator::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Generator::divisor() const {
+  Coefficient_traits::const_reference d = Linear_Row::inhomogeneous_term();
+  if (!is_ray_or_point() || d == 0)
+    throw_invalid_argument("divisor()",
+			   "*this is neither a point nor a closure point");
+  return d;
+}
+
+inline memory_size_type
+Generator::external_memory_in_bytes() const {
+  return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator::total_memory_in_bytes() const {
+  return Linear_Row::total_memory_in_bytes();
+}
+
+inline const Generator&
+Generator::zero_dim_point() {
+  static const Generator zdp = point();
+  return zdp;
+}
+
+inline const Generator&
+Generator::zero_dim_closure_point() {
+  static const Generator zdcp = closure_point();
+  return zdcp;
+}
+
+/*! \relates Generator */
+inline Generator
+line(const Linear_Expression& e) {
+  return Generator::line(e);
+}
+
+/*! \relates Generator */
+inline Generator
+ray(const Linear_Expression& e) {
+  return Generator::ray(e);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Coefficient_traits::const_reference d) {
+  return Generator::point(e, d);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+	      Coefficient_traits::const_reference d) {
+  return Generator::closure_point(e, d);
+}
+
+/*! \relates Generator */
+inline bool
+operator==(const Generator& x, const Generator& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Generator */
+inline bool
+operator!=(const Generator& x, const Generator& y) {
+  return !x.is_equivalent_to(y);
+}
+
+inline void
+Generator::ascii_dump(std::ostream& s) const {
+  Linear_Row::ascii_dump(s);
+}
+
+inline bool
+Generator::ascii_load(std::istream& s) {
+  return Linear_Row::ascii_load(s);
+}
+
+inline void
+Generator::swap(Generator& y) {
+  Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+inline void
+swap(Parma_Polyhedra_Library::Generator& x,
+     Parma_Polyhedra_Library::Generator& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Generator_inlines_hh)
diff --git a/src/Generator.types.hh b/src/Generator.types.hh
new file mode 100644
index 0000000..6ed070c
--- /dev/null
+++ b/src/Generator.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Generator_types_hh
+#define PPL_Generator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Generator;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Generator_types_hh)
diff --git a/src/Generator_System.cc b/src/Generator_System.cc
new file mode 100644
index 0000000..821ef2f
--- /dev/null
+++ b/src/Generator_System.cc
@@ -0,0 +1,1032 @@
+/* Generator_System class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Generator_System.defs.hh"
+#include "Generator_System.inlines.hh"
+#include "Constraint.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cassert>
+#include <string>
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::Generator_System::
+adjust_topology_and_space_dimension(const Topology new_topology,
+				    const dimension_type new_space_dim) {
+  assert(space_dimension() <= new_space_dim);
+
+  const dimension_type old_space_dim = space_dimension();
+  const Topology old_topology = topology();
+  dimension_type cols_to_be_added = new_space_dim - old_space_dim;
+
+  // Dealing with empty constraint systems first.
+  if (num_rows() == 0) {
+    if (num_columns() == 0)
+      if (new_topology == NECESSARILY_CLOSED) {
+	add_zero_columns(cols_to_be_added + 1);
+	set_necessarily_closed();
+      }
+      else {
+	add_zero_columns(cols_to_be_added + 2);
+	set_not_necessarily_closed();
+      }
+    else
+      // Here `num_columns() > 0'.
+      if (old_topology != new_topology)
+	if (new_topology == NECESSARILY_CLOSED) {
+	  switch (cols_to_be_added) {
+	  case 0:
+	    remove_trailing_columns(1);
+	    break;
+	  case 1:
+	    // Nothing to do.
+	    break;
+	  default:
+	    add_zero_columns(cols_to_be_added - 1);
+	  }
+	  set_necessarily_closed();
+	}
+	else {
+	  // Here old_topology == NECESSARILY_CLOSED
+	  //  and new_topology == NOT_NECESSARILY_CLOSED.
+	  add_zero_columns(cols_to_be_added + 1);
+	  set_not_necessarily_closed();
+	}
+      else
+	// Here topologies agree.
+	if (cols_to_be_added > 0)
+	  add_zero_columns(cols_to_be_added);
+    assert(OK());
+    return true;
+  }
+
+  // Here `num_rows() > 0'.
+  if (cols_to_be_added > 0)
+    if (old_topology != new_topology)
+      if (new_topology == NECESSARILY_CLOSED) {
+	// A NOT_NECESSARILY_CLOSED generator system
+	// can be converted to a NECESSARILY_CLOSED one
+	// only if it does not contain closure points.
+	// This check has to be performed under the user viewpoint.
+	if (has_closure_points())
+	  return false;
+	// For a correct implementation, we have to remove those
+	// closure points that were matching a point (i.e., those
+	// that are in the generator system, but are invisible to
+	// the user).
+	Generator_System& gs = *this;
+	dimension_type num_closure_points = 0;
+	dimension_type gs_end = gs.num_rows();
+	for (dimension_type i = 0; i < gs_end; ) {
+	  // All the closure points seen so far have consecutive
+	  // indices starting from `i'.
+	  if (num_closure_points > 0)
+	    // Let next generator have index `i'.
+	    std::swap(gs[i], gs[i+num_closure_points]);
+	  if (gs[i].is_closure_point()) {
+	    ++num_closure_points;
+	    --gs_end;
+	  }
+	  else
+	    ++i;
+	}
+	// We may have identified some closure points.
+	if (num_closure_points > 0) {
+	  assert(num_closure_points == num_rows() - gs_end);
+	  erase_to_end(gs_end);
+	}
+	// Remove the epsilon column, re-normalize and, after that,
+	// add the missing dimensions. This ensures that
+	// non-zero epsilon coefficients will be cleared.
+	remove_trailing_columns(1);
+	set_necessarily_closed();
+	normalize();
+	add_zero_columns(cols_to_be_added);
+      }
+      else {
+	// A NECESSARILY_CLOSED generator system is converted to
+	// a NOT_NECESSARILY_CLOSED one by adding a further column
+	// and setting the epsilon coordinate of all points to 1.
+	// Note: normalization is preserved.
+	add_zero_columns(cols_to_be_added + 1);
+	Generator_System& gs = *this;
+	const dimension_type eps_index = new_space_dim + 1;
+	for (dimension_type i = num_rows(); i-- > 0; )
+	  gs[i][eps_index] = gs[i][0];
+	set_not_necessarily_closed();
+      }
+    else {
+      // Topologies agree: first add the required zero columns ...
+      add_zero_columns(cols_to_be_added);
+      // ... and, if needed, move the epsilon coefficients
+      // to the new last column.
+      if (old_topology == NOT_NECESSARILY_CLOSED)
+	swap_columns(old_space_dim + 1, new_space_dim + 1);
+    }
+  else
+    // Here `cols_to_be_added == 0'.
+    if (old_topology != new_topology)
+      if (new_topology == NECESSARILY_CLOSED) {
+	// A NOT_NECESSARILY_CLOSED generator system
+	// can be converted in to a NECESSARILY_CLOSED one
+	// only if it does not contain closure points.
+	if (has_closure_points())
+	  return false;
+	// We just remove the column of the epsilon coefficients.
+	remove_trailing_columns(1);
+	set_necessarily_closed();
+      }
+      else {
+	// Add the column of the epsilon coefficients
+	// and set the epsilon coordinate of all points to 1.
+	// Note: normalization is preserved.
+	add_zero_columns(1);
+	Generator_System& gs = *this;
+	const dimension_type eps_index = new_space_dim + 1;
+	for (dimension_type i = num_rows(); i-- > 0; )
+	  gs[i][eps_index] = gs[i][0];
+	set_not_necessarily_closed();
+      }
+  // We successfully adjusted dimensions and topology.
+  assert(OK());
+  return true;
+}
+
+// TODO: would be worth to avoid adding closure points
+// that already are in the system of generators?
+// To do this efficiently we could sort the system and
+// perform insertions keeping its sortedness.
+void
+PPL::Generator_System::add_corresponding_closure_points() {
+  assert(!is_necessarily_closed());
+  // NOTE: we always add (pending) rows at the end of the generator system.
+  // Updating `index_first_pending', if needed, is done by the caller.
+  Generator_System& gs = *this;
+  const dimension_type n_rows = gs.num_rows();
+  const dimension_type eps_index = gs.num_columns() - 1;
+  for (dimension_type i = n_rows; i-- > 0; ) {
+    const Generator& g = gs[i];
+    if (g[eps_index] > 0) {
+      // `g' is a point: adding the closure point.
+      Generator cp = g;
+      cp[eps_index] = 0;
+      // Enforcing normalization.
+      cp.normalize();
+      gs.add_pending_row(cp);
+    }
+  }
+  assert(OK());
+}
+
+
+// TODO: would be worth to avoid adding points
+// that already are in the system of generators?
+// To do this efficiently we could sort the system and
+// perform insertions keeping its sortedness.
+void
+PPL::Generator_System::add_corresponding_points() {
+  assert(!is_necessarily_closed());
+  // NOTE: we always add (pending) rows at the end of the generator system.
+  // Updating `index_first_pending', if needed, is done by the caller.
+  Generator_System& gs = *this;
+  const dimension_type n_rows = gs.num_rows();
+  const dimension_type eps_index = gs.num_columns() - 1;
+  for (dimension_type i = 0; i < n_rows; i++) {
+    const Generator& g = gs[i];
+    if (!g.is_line_or_ray() && g[eps_index] == 0) {
+      // `g' is a closure point: adding the point.
+      // Note: normalization is preserved.
+      Generator p = g;
+      p[eps_index] = p[0];
+      gs.add_pending_row(p);
+    }
+  }
+  assert(OK());
+}
+
+bool
+PPL::Generator_System::has_closure_points() const {
+  if (is_necessarily_closed())
+    return false;
+  // Adopt the point of view of the user.
+  for (Generator_System::const_iterator i = begin(),
+	 iend = end(); i != iend; ++i)
+    if (i->is_closure_point())
+      return true;
+  return false;
+}
+
+bool
+PPL::Generator_System::has_points() const {
+  const Generator_System& gs = *this;
+  // Avoiding the repeated tests on topology.
+  if (is_necessarily_closed())
+    for (dimension_type i = num_rows(); i-- > 0; ) {
+      if (!gs[i].is_line_or_ray())
+	return true;
+    }
+  else {
+    // !is_necessarily_closed()
+    const dimension_type eps_index = gs.num_columns() - 1;
+    for (dimension_type i = num_rows(); i-- > 0; )
+    if (gs[i][eps_index] != 0)
+      return true;
+  }
+  return false;
+}
+
+void
+PPL::Generator_System::const_iterator::skip_forward() {
+  const Linear_System::const_iterator gsp_end = gsp->end();
+  if (i != gsp_end) {
+    Linear_System::const_iterator i_next = i;
+    ++i_next;
+    if (i_next != gsp_end) {
+      const Generator& cp = static_cast<const Generator&>(*i);
+      const Generator& p = static_cast<const Generator&>(*i_next);
+      if (cp.is_closure_point()
+	  && p.is_point()
+	  && cp.is_matching_closure_point(p))
+	i = i_next;
+    }
+  }
+}
+
+void
+PPL::Generator_System::insert(const Generator& g) {
+  // We are sure that the matrix has no pending rows
+  // and that the new row is not a pending generator.
+  assert(num_pending_rows() == 0);
+  if (topology() == g.topology())
+    Linear_System::insert(g);
+  else
+    // `*this' and `g' have different topologies.
+    if (is_necessarily_closed()) {
+      // Padding the matrix with the column
+      // corresponding to the epsilon coefficients:
+      // all points must have epsilon coordinate equal to 1
+      // (i.e., the epsilon coefficient is equal to the divisor);
+      // rays and lines must have epsilon coefficient equal to 0.
+      // Note: normalization is preserved.
+      const dimension_type eps_index = num_columns();
+      add_zero_columns(1);
+      Generator_System& gs = *this;
+      for (dimension_type i = num_rows(); i-- > 0; ) {
+	Generator& gen = gs[i];
+	if (!gen.is_line_or_ray())
+	  gen[eps_index] = gen[0];
+      }
+      set_not_necessarily_closed();
+      // Inserting the new generator.
+      Linear_System::insert(g);
+    }
+    else {
+      // The generator system is NOT necessarily closed:
+      // copy the generator, adding the missing dimensions
+      // and the epsilon coefficient.
+      const dimension_type new_size = 2 + std::max(g.space_dimension(),
+						   space_dimension());
+      Generator tmp_g(g, new_size);
+      // If it was a point, set the epsilon coordinate to 1
+      // (i.e., set the coefficient equal to the divisor).
+      // Note: normalization is preserved.
+      if (!tmp_g.is_line_or_ray())
+	tmp_g[new_size - 1] = tmp_g[0];
+      tmp_g.set_not_necessarily_closed();
+      // Inserting the new generator.
+      Linear_System::insert(tmp_g);
+    }
+  assert(OK());
+}
+
+void
+PPL::Generator_System::insert_pending(const Generator& g) {
+  if (topology() == g.topology())
+    Linear_System::insert_pending(g);
+  else
+    // `*this' and `g' have different topologies.
+    if (is_necessarily_closed()) {
+      // Padding the matrix with the column
+      // corresponding to the epsilon coefficients:
+      // all points must have epsilon coordinate equal to 1
+      // (i.e., the epsilon coefficient is equal to the divisor);
+      // rays and lines must have epsilon coefficient equal to 0.
+      // Note: normalization is preserved.
+      const dimension_type eps_index = num_columns();
+      add_zero_columns(1);
+      Generator_System& gs = *this;
+      for (dimension_type i = num_rows(); i-- > 0; ) {
+	Generator& gen = gs[i];
+	if (!gen.is_line_or_ray())
+	  gen[eps_index] = gen[0];
+      }
+      set_not_necessarily_closed();
+      // Inserting the new generator.
+      Linear_System::insert_pending(g);
+    }
+    else {
+      // The generator system is NOT necessarily closed:
+      // copy the generator, adding the missing dimensions
+      // and the epsilon coefficient.
+      const dimension_type new_size = 2 + std::max(g.space_dimension(),
+						   space_dimension());
+      Generator tmp_g(g, new_size);
+      // If it was a point, set the epsilon coordinate to 1
+      // (i.e., set the coefficient equal to the divisor).
+      // Note: normalization is preserved.
+      if (!tmp_g.is_line_or_ray())
+	tmp_g[new_size - 1] = tmp_g[0];
+      tmp_g.set_not_necessarily_closed();
+      // Inserting the new generator.
+      Linear_System::insert_pending(tmp_g);
+    }
+  assert(OK());
+}
+
+PPL::dimension_type
+PPL::Generator_System::num_lines() const {
+  // We are sure that this method is applied only to a matrix
+  // that does not contain pending rows.
+  assert(num_pending_rows() == 0);
+  const Generator_System& gs = *this;
+  dimension_type n = 0;
+  // If the Linear_System happens to be sorted, take advantage of the fact
+  // that lines are at the top of the system.
+  if (is_sorted()) {
+    dimension_type nrows = num_rows();
+    for (dimension_type i = 0; i < nrows && gs[i].is_line(); ++i)
+      ++n;
+  }
+  else
+    for (dimension_type i = num_rows(); i-- > 0 ; )
+      if (gs[i].is_line())
+	++n;
+  return n;
+}
+
+PPL::dimension_type
+PPL::Generator_System::num_rays() const {
+  // We are sure that this method is applied only to a matrix
+  // that does not contain pending rows.
+  assert(num_pending_rows() == 0);
+  const Generator_System& gs = *this;
+  dimension_type n = 0;
+  // If the Linear_System happens to be sorted, take advantage of the fact
+  // that rays and points are at the bottom of the system and
+  // rays have the inhomogeneous term equal to zero.
+  if (is_sorted()) {
+    for (dimension_type i = num_rows(); i != 0 && gs[--i].is_ray_or_point(); )
+      if (gs[i].is_line_or_ray())
+	++n;
+  }
+  else
+    for (dimension_type i = num_rows(); i-- > 0 ; )
+      if (gs[i].is_ray())
+	++n;
+  return n;
+}
+
+PPL::Poly_Con_Relation
+PPL::Generator_System::relation_with(const Constraint& c) const {
+  // Note: this method is not public and it is the responsibility
+  // of the caller to actually test for dimension compatibility.
+  // We simply assert it.
+  assert(space_dimension() >= c.space_dimension());
+  // Number of generators: the case of an empty polyhedron
+  // has already been filtered out by the caller.
+  const dimension_type n_rows = num_rows();
+  assert(n_rows > 0);
+  const Generator_System& gs = *this;
+
+  // `result' will keep the relation holding between the generators
+  // we have seen so far and the constraint `c'.
+  Poly_Con_Relation result = Poly_Con_Relation::saturates();
+
+  switch (c.type()) {
+
+  case Constraint::EQUALITY:
+    {
+      // The hyperplane defined by the equality `c' is included
+      // in the set of points satisfying `c' (it is the same set!).
+      result = result && Poly_Con_Relation::is_included();
+      // The following integer variable will hold the scalar product sign
+      // of either the first point or the first non-saturating ray we find.
+      // If it is equal to 2, then it means that we haven't found such
+      // a generator yet.
+      int first_point_or_nonsaturating_ray_sign = 2;
+
+      for (dimension_type i = n_rows; i-- > 0; ) {
+	const Generator& g = gs[i];
+	const int sp_sign = Scalar_Products::sign(c, g);
+	// Checking whether the generator saturates the equality.
+	// If that is the case, then we have to do something only if
+	// the generator is a point.
+	if (sp_sign == 0) {
+	  if (g.is_point())
+	    if (first_point_or_nonsaturating_ray_sign == 2)
+	      // It is the first time that we find a point and
+	      // we have not found a non-saturating ray yet.
+	      first_point_or_nonsaturating_ray_sign = 0;
+	    else
+	      // We already found a point or a non-saturating ray.
+	      if (first_point_or_nonsaturating_ray_sign != 0)
+		return Poly_Con_Relation::strictly_intersects();
+	}
+	else
+	  // Here we know that sp_sign != 0.
+	  switch (g.type()) {
+
+	  case Generator::LINE:
+	    // If a line does not saturate `c', then there is a strict
+	    // intersection between the points satisfying `c'
+	    // and the points generated by `gs'.
+	    return Poly_Con_Relation::strictly_intersects();
+
+	  case Generator::RAY:
+	    if (first_point_or_nonsaturating_ray_sign == 2) {
+	      // It is the first time that we have a non-saturating ray
+	      // and we have not found any point yet.
+	      first_point_or_nonsaturating_ray_sign = sp_sign;
+	      result = Poly_Con_Relation::is_disjoint();
+	    }
+	    else
+	      // We already found a point or a non-saturating ray.
+	      if (sp_sign != first_point_or_nonsaturating_ray_sign)
+		return Poly_Con_Relation::strictly_intersects();
+	    break;
+
+	  case Generator::POINT:
+	  case Generator::CLOSURE_POINT:
+	    // NOTE: a non-saturating closure point is treated as
+	    // a normal point.
+	    if (first_point_or_nonsaturating_ray_sign == 2) {
+	      // It is the first time that we find a point and
+	      // we have not found a non-saturating ray yet.
+	      first_point_or_nonsaturating_ray_sign = sp_sign;
+	      result = Poly_Con_Relation::is_disjoint();
+	    }
+	    else
+	      // We already found a point or a non-saturating ray.
+	      if (sp_sign != first_point_or_nonsaturating_ray_sign)
+		return Poly_Con_Relation::strictly_intersects();
+	    break;
+	  }
+      }
+    }
+    break;
+
+  case Constraint::NONSTRICT_INEQUALITY:
+    {
+      // The hyperplane implicitly defined by the non-strict inequality `c'
+      // is included in the set of points satisfying `c'.
+      result = result && Poly_Con_Relation::is_included();
+      // The following boolean variable will be set to `false'
+      // as soon as either we find (any) point or we find a
+      // non-saturating ray.
+      bool first_point_or_nonsaturating_ray = true;
+
+      for (dimension_type i = n_rows; i-- > 0; ) {
+	const Generator& g = gs[i];
+	const int sp_sign = Scalar_Products::sign(c, g);
+	// Checking whether the generator saturates the non-strict
+	// inequality. If that is the case, then we have to do something
+	// only if the generator is a point.
+	if (sp_sign == 0) {
+	  if (g.is_point())
+	    if (first_point_or_nonsaturating_ray)
+	      // It is the first time that we have a point and
+	      // we have not found a non-saturating ray yet.
+	      first_point_or_nonsaturating_ray = false;
+	    else
+	      // We already found a point or a non-saturating ray before.
+	      if (result == Poly_Con_Relation::is_disjoint())
+		// Since g saturates c, we have a strict intersection if
+		// none of the generators seen so far are included in `c'.
+		return Poly_Con_Relation::strictly_intersects();
+	}
+	else
+	  // Here we know that sp_sign != 0.
+	  switch (g.type()) {
+
+	  case Generator::LINE:
+	    // If a line does not saturate `c', then there is a strict
+	    // intersection between the points satisfying `c' and
+	    // the points generated by `gs'.
+	    return Poly_Con_Relation::strictly_intersects();
+
+	  case Generator::RAY:
+	    if (first_point_or_nonsaturating_ray) {
+	      // It is the first time that we have a non-saturating ray
+	      // and we have not found any point yet.
+	      first_point_or_nonsaturating_ray = false;
+	      result = (sp_sign > 0)
+		? Poly_Con_Relation::is_included()
+		: Poly_Con_Relation::is_disjoint();
+	    }
+	    else {
+	      // We already found a point or a non-saturating ray.
+	      if ((sp_sign > 0
+		   && result == Poly_Con_Relation::is_disjoint())
+		  || (sp_sign < 0
+		      && result.implies(Poly_Con_Relation::is_included())))
+		// We have a strict intersection if either:
+		// - `g' satisfies `c' but none of the generators seen
+		//    so far are included in `c'; or
+		// - `g' does not satisfy `c' and all the generators
+		//    seen so far are included in `c'.
+		return Poly_Con_Relation::strictly_intersects();
+	      if (sp_sign > 0)
+		// Here all the generators seen so far either saturate
+		// or are included in `c'.
+		// Since `g' does not saturate `c' ...
+		result = Poly_Con_Relation::is_included();
+	    }
+	    break;
+
+	  case Generator::POINT:
+	  case Generator::CLOSURE_POINT:
+	    // NOTE: a non-saturating closure point is treated as
+	    // a normal point.
+	    if (first_point_or_nonsaturating_ray) {
+	      // It is the first time that we have a point and
+	      // we have not found a non-saturating ray yet.
+	      // - If point `g' saturates `c', then all the generators
+	      //   seen so far saturate `c'.
+	      // - If point `g' is included (but does not saturate) `c',
+	      //   then all the generators seen so far are included in `c'.
+	      // - If point `g' does not satisfy `c', then all the
+	      //   generators seen so far are disjoint from `c'.
+	      first_point_or_nonsaturating_ray = false;
+	      if (sp_sign > 0)
+		result = Poly_Con_Relation::is_included();
+	      else if (sp_sign < 0)
+		result = Poly_Con_Relation::is_disjoint();
+	    }
+	    else {
+	      // We already found a point or a non-saturating ray before.
+	      if ((sp_sign > 0
+		   && result == Poly_Con_Relation::is_disjoint())
+		  || (sp_sign < 0
+		      && result.implies(Poly_Con_Relation::is_included())))
+		// We have a strict intersection if either:
+		// - `g' satisfies or saturates `c' but none of the
+		//    generators seen so far are included in `c'; or
+		// - `g' does not satisfy `c' and all the generators
+		//    seen so far are included in `c'.
+		return Poly_Con_Relation::strictly_intersects();
+	      if (sp_sign > 0)
+		// Here all the generators seen so far either saturate
+		// or are included in `c'.
+		// Since `g' does not saturate `c' ...
+		result = Poly_Con_Relation::is_included();
+	    }
+	    break;
+	  }
+      }
+    }
+    break;
+
+  case Constraint::STRICT_INEQUALITY:
+    {
+      // The hyperplane implicitly defined by the strict inequality `c'
+      // is disjoint from the set of points satisfying `c'.
+      result = result && Poly_Con_Relation::is_disjoint();
+      // The following boolean variable will be set to `false'
+      // as soon as either we find (any) point or we find a
+      // non-saturating ray.
+      bool first_point_or_nonsaturating_ray = true;
+      for (dimension_type i = n_rows; i-- > 0; ) {
+	const Generator& g = gs[i];
+	// Using the reduced scalar product operator to avoid
+	// both topology and num_columns mismatches.
+	const int sp_sign = Scalar_Products::reduced_sign(c, g);
+	// Checking whether the generator saturates the strict inequality.
+	// If that is the case, then we have to do something
+	// only if the generator is a point.
+	if (sp_sign == 0) {
+	  if (g.is_point())
+	    if (first_point_or_nonsaturating_ray)
+	      // It is the first time that we have a point and
+	      // we have not found a non-saturating ray yet.
+	      first_point_or_nonsaturating_ray = false;
+	    else
+	      // We already found a point or a non-saturating ray before.
+	      if (result == Poly_Con_Relation::is_included())
+		return Poly_Con_Relation::strictly_intersects();
+	}
+	else
+	  // Here we know that sp_sign != 0.
+	  switch (g.type()) {
+
+	  case Generator::LINE:
+	    // If a line does not saturate `c', then there is a strict
+	    // intersection between the points satisfying `c' and the points
+	    // generated by `gs'.
+	    return Poly_Con_Relation::strictly_intersects();
+
+	  case Generator::RAY:
+	    if (first_point_or_nonsaturating_ray) {
+	      // It is the first time that we have a non-saturating ray
+	      // and we have not found any point yet.
+	      first_point_or_nonsaturating_ray = false;
+	      result = (sp_sign > 0)
+		? Poly_Con_Relation::is_included()
+		: Poly_Con_Relation::is_disjoint();
+	    }
+	    else {
+	      // We already found a point or a non-saturating ray before.
+	      if ((sp_sign > 0
+		   && result.implies(Poly_Con_Relation::is_disjoint()))
+		  ||
+		  (sp_sign <= 0
+		   && result == Poly_Con_Relation::is_included()))
+		return Poly_Con_Relation::strictly_intersects();
+	      if (sp_sign < 0)
+		// Here all the generators seen so far either saturate
+		// or are disjoint from `c'.
+		// Since `g' does not saturate `c' ...
+		result = Poly_Con_Relation::is_disjoint();
+	    }
+	    break;
+
+	  case Generator::POINT:
+	  case Generator::CLOSURE_POINT:
+	    if (first_point_or_nonsaturating_ray) {
+	      // It is the first time that we have a point and
+	      // we have not found a non-saturating ray yet.
+	      // - If point `g' saturates `c', then all the generators
+	      //   seen so far saturate `c'.
+	      // - If point `g' is included in (but does not saturate) `c',
+	      //   then all the generators seen so far are included in `c'.
+	      // - If point `g' strictly violates `c', then all the
+	      //   generators seen so far are disjoint from `c'.
+	      first_point_or_nonsaturating_ray = false;
+	      if (sp_sign > 0)
+		result = Poly_Con_Relation::is_included();
+	      else if (sp_sign < 0)
+		result = Poly_Con_Relation::is_disjoint();
+	    }
+	    else {
+	      // We already found a point or a non-saturating ray before.
+	      if ((sp_sign > 0
+		   && result.implies(Poly_Con_Relation::is_disjoint()))
+		  ||
+		  (sp_sign <= 0
+		   && result == Poly_Con_Relation::is_included()))
+		return Poly_Con_Relation::strictly_intersects();
+	      if (sp_sign < 0)
+		// Here all the generators seen so far either saturate
+		// or are disjoint from `c'.
+		// Since `g' does not saturate `c' ...
+		result = Poly_Con_Relation::is_disjoint();
+	    }
+	    break;
+	  }
+      }
+    }
+    break;
+  }
+  // We have seen all generators.
+  return result;
+}
+
+
+bool
+PPL::Generator_System::satisfied_by_all_generators(const Constraint& c) const {
+  assert(c.space_dimension() <= space_dimension());
+
+  // Setting `sps' to the appropriate scalar product sign operator.
+  // This also avoids problems when having _legal_ topology mismatches
+  // (which could also cause a mismatch in the number of columns).
+  Topology_Adjusted_Scalar_Product_Sign sps(c);
+
+  const Generator_System& gs = *this;
+  switch (c.type()) {
+  case Constraint::EQUALITY:
+    // Equalities must be saturated by all generators.
+    for (dimension_type i = gs.num_rows(); i-- > 0; )
+      if (sps(c, gs[i]) != 0)
+	return false;
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    // Non-strict inequalities must be saturated by lines and
+    // satisfied by all the other generators.
+    for (dimension_type i = gs.num_rows(); i-- > 0; ) {
+      const Generator& g = gs[i];
+      const int sp_sign = sps(c, g);
+      if (g.is_line()) {
+	if (sp_sign != 0)
+	  return false;
+      }
+      else
+	// `g' is a ray, point or closure point.
+	if (sp_sign < 0)
+	  return false;
+    }
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    // Strict inequalities must be saturated by lines,
+    // satisfied by all generators, and must not be saturated by points.
+    for (dimension_type i = gs.num_rows(); i-- > 0; ) {
+      const Generator& g = gs[i];
+      const int sp_sign = sps(c, g);
+      switch (g.type()) {
+      case Generator::POINT:
+	if (sp_sign <= 0)
+	  return false;
+	break;
+      case Generator::LINE:
+	if (sp_sign != 0)
+	  return false;
+	break;
+      default:
+	// `g' is a ray or closure point.
+	if (sp_sign < 0)
+	  return false;
+	break;
+      }
+    }
+    break;
+  }
+  // If we reach this point, `c' is satisfied by all generators.
+  return true;
+}
+
+
+void
+PPL::Generator_System
+::affine_image(dimension_type v,
+	       const Linear_Expression& expr,
+	       Coefficient_traits::const_reference denominator) {
+  Generator_System& x = *this;
+  // `v' is the index of a column corresponding to
+  // a "user" variable (i.e., it cannot be the inhomogeneous term,
+  // nor the epsilon dimension of NNC polyhedra).
+  assert(v > 0 && v <= x.space_dimension());
+  assert(expr.space_dimension() <= x.space_dimension());
+  assert(denominator > 0);
+
+  const dimension_type n_columns = x.num_columns();
+  const dimension_type n_rows = x.num_rows();
+
+  // Compute the numerator of the affine transformation and assign it
+  // to the column of `*this' indexed by `v'.
+  TEMP_INTEGER(numerator);
+  for (dimension_type i = n_rows; i-- > 0; ) {
+    Generator& row = x[i];
+    Scalar_Products::assign(numerator, expr, row);
+    std::swap(numerator, row[v]);
+  }
+
+  if (denominator != 1) {
+    // Since we want integer elements in the matrix,
+    // we multiply by `denominator' all the columns of `*this'
+    // having an index different from `v'.
+    for (dimension_type i = n_rows; i-- > 0; ) {
+      Generator& row = x[i];
+      for (dimension_type j = n_columns; j-- > 0; )
+	if (j != v)
+	  row[j] *= denominator;
+    }
+  }
+
+  // If the mapping is not invertible we may have transformed
+  // valid lines and rays into the origin of the space.
+  const bool not_invertible = (v > expr.space_dimension() || expr[v] == 0);
+  if (not_invertible)
+    x.remove_invalid_lines_and_rays();
+
+  // Strong normalization also resets the sortedness flag.
+  x.strong_normalize();
+}
+
+void
+PPL::Generator_System::ascii_dump(std::ostream& s) const {
+  const Generator_System& x = *this;
+  const dimension_type x_num_rows = x.num_rows();
+  const dimension_type x_num_columns = x.num_columns();
+  s << "topology " << (is_necessarily_closed()
+		       ? "NECESSARILY_CLOSED"
+		       : "NOT_NECESSARILY_CLOSED")
+    << "\n"
+    << x_num_rows << " x " << x_num_columns << ' '
+    << (x.is_sorted() ? "(sorted)" : "(not_sorted)")
+    << "\n"
+    << "index_first_pending " << x.first_pending_row()
+    << "\n";
+  for (dimension_type i = 0; i < x_num_rows; ++i) {
+    const Generator& g = x[i];
+    for (dimension_type j = 0; j < x_num_columns; ++j)
+      s << g[j] << ' ';
+    switch (g.type()) {
+    case Generator::LINE:
+      s << "L";
+      break;
+    case Generator::RAY:
+      s << "R";
+      break;
+    case Generator::POINT:
+      s << "P";
+      break;
+    case Generator::CLOSURE_POINT:
+      s << "C";
+      break;
+    }
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_DEFINITIONS(Generator_System);
+
+bool
+PPL::Generator_System::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str) || str != "topology")
+    return false;
+  if (!(s >> str))
+    return false;
+  if (str == "NECESSARILY_CLOSED")
+    set_necessarily_closed();
+  else {
+    if (str != "NOT_NECESSARILY_CLOSED")
+      return false;
+    set_not_necessarily_closed();
+  }
+
+  dimension_type nrows;
+  dimension_type ncols;
+  if (!(s >> nrows))
+    return false;
+  if (!(s >> str))
+    return false;
+  if (!(s >> ncols))
+      return false;
+  resize_no_copy(nrows, ncols);
+
+  if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
+    return false;
+  set_sorted(str == "(sorted)");
+  dimension_type index;
+  if (!(s >> str) || str != "index_first_pending")
+    return false;
+  if (!(s >> index))
+    return false;
+  set_index_first_pending_row(index);
+
+  Generator_System& x = *this;
+  for (dimension_type i = 0; i < x.num_rows(); ++i) {
+    for (dimension_type j = 0; j < x.num_columns(); ++j)
+      if (!(s >> x[i][j]))
+	return false;
+
+    if (!(s >> str))
+      return false;
+    if (str == "L")
+      x[i].set_is_line();
+    else
+      x[i].set_is_ray_or_point();
+
+    // Checking for equality of actual and declared types.
+    switch (x[i].type()) {
+    case Generator::LINE:
+      if (str == "L")
+	continue;
+      break;
+    case Generator::RAY:
+      if (str == "R")
+	continue;
+      break;
+    case Generator::POINT:
+      if (str == "P")
+	continue;
+      break;
+    case Generator::CLOSURE_POINT:
+      if (str == "C")
+	continue;
+      break;
+    }
+    // Reaching this point means that the input was illegal.
+    return false;
+  }
+
+  // Checking for well-formedness.
+
+  assert(OK());
+  return true;
+}
+
+void
+PPL::Generator_System::remove_invalid_lines_and_rays() {
+  // The origin of the vector space cannot be a valid line/ray.
+  // NOTE: the following swaps will mix generators without even trying
+  // to preserve sortedness: as a matter of fact, it will almost always
+  // be the case that the input generator system is NOT sorted.
+  Generator_System& gs = *this;
+  dimension_type n_rows = gs.num_rows();
+  if (num_pending_rows() == 0) {
+    for (dimension_type i = n_rows; i-- > 0; ) {
+      Generator& g = gs[i];
+      if (g.is_line_or_ray() && g.all_homogeneous_terms_are_zero()) {
+	// An invalid line/ray has been found.
+	--n_rows;
+	std::swap(g, gs[n_rows]);
+	gs.set_sorted(false);
+      }
+    }
+    set_index_first_pending_row(n_rows);
+  }
+  else {
+    // If the matrix has some pending rows, we can not
+    // swap the "normal" rows with the pending rows. So
+    // we must put at the end of the "normal" rows
+    // the invalid "normal" rows, put them at the end
+    // of the matrix, find the invalid rows in the pending
+    // part and then erase the invalid rows that now
+    // are in the bottom part of the matrix.
+    assert(num_pending_rows() > 0);
+    dimension_type first_pending = first_pending_row();
+    for (dimension_type i = first_pending; i-- > 0; ) {
+      Generator& g = gs[i];
+      if (g.is_line_or_ray() && g.all_homogeneous_terms_are_zero()) {
+	// An invalid line/ray has been found.
+	--first_pending;
+	std::swap(g, gs[first_pending]);
+	gs.set_sorted(false);
+      }
+    }
+    const dimension_type num_invalid_rows
+      = first_pending_row() - first_pending;
+    set_index_first_pending_row(first_pending);
+    for (dimension_type i = 0; i < num_invalid_rows; ++i)
+      std::swap(gs[n_rows - i], gs[first_pending + i]);
+    n_rows -= num_invalid_rows;
+    for (dimension_type i = n_rows; i-- > first_pending; ) {
+      Generator& g = gs[i];
+      if (g.is_line_or_ray() && g.all_homogeneous_terms_are_zero()) {
+	// An invalid line/ray has been found.
+	--n_rows;
+	std::swap(g, gs[n_rows]);
+	gs.set_sorted(false);
+      }
+    }
+  }
+  gs.erase_to_end(n_rows);
+}
+
+bool
+PPL::Generator_System::OK() const {
+  // A Generator_System must be a valid Linear_System; do not check for
+  // strong normalization, since this will be done when
+  // checking each individual generator.
+  if (!Linear_System::OK(false))
+    return false;
+
+  // Checking each generator in the system.
+  const Generator_System& x = *this;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    if (!x[i].OK())
+      return false;
+
+  // All checks passed.
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Generator_System */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Generator_System& gs) {
+  Generator_System::const_iterator i = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (i == gs_end)
+    return s << "false";
+  while (true) {
+    s << *i++;
+    if (i == gs_end)
+      return s;
+    s << ", ";
+  }
+}
diff --git a/src/Generator_System.defs.hh b/src/Generator_System.defs.hh
new file mode 100644
index 0000000..6fdb704
--- /dev/null
+++ b/src/Generator_System.defs.hh
@@ -0,0 +1,506 @@
+/* Generator_System class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Generator_System_defs_hh
+#define PPL_Generator_System_defs_hh 1
+
+#include "Generator_System.types.hh"
+#include "Grid_Generator_System.types.hh"
+#include "Linear_Expression.types.hh"
+#include "Linear_System.defs.hh"
+#include "Generator.types.hh"
+#include "Constraint.types.hh"
+#include "Polyhedron.types.hh"
+#include "Poly_Con_Relation.defs.hh"
+#include "Grid.types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Generator_System
+  Writes <CODE>false</CODE> if \p gs is empty.  Otherwise, writes on
+  \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Generator_System& gs);
+
+} // namespace IO_Operators
+
+// Put it in the namespace here to declare it friend later.
+/*! \relates Polyhedron */
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Generator_System */
+void swap(Parma_Polyhedra_Library::Generator_System& x,
+	  Parma_Polyhedra_Library::Generator_System& y);
+
+} // namespace std
+
+//! A system of generators.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Generator_System is a system of generators,
+    i.e., a multiset of objects of the class Generator
+    (lines, rays, points and closure points).
+    When inserting generators in a system, space dimensions are automatically
+    adjusted so that all the generators in the system are defined
+    on the same vector space.
+    A system of generators which is meant to define a non-empty
+    polyhedron must include at least one point: the reason is that
+    lines, rays and closure points need a supporting point
+    (lines and rays only specify directions while closure points only
+    specify points in the topological closure of the NNC polyhedron).
+
+    \par
+     In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code defines the line having the same direction
+    as the \f$x\f$ axis (i.e., the first Cartesian axis)
+    in \f$\Rset^2\f$:
+    \code
+  Generator_System gs;
+  gs.insert(line(x + 0*y));
+    \endcode
+    As said above, this system of generators corresponds to
+    an empty polyhedron, because the line has no supporting point.
+    To define a system of generators that does correspond to
+    the \f$x\f$ axis, we can add the following code which
+    inserts the origin of the space as a point:
+    \code
+  gs.insert(point(0*x + 0*y));
+    \endcode
+    Since space dimensions are automatically adjusted, the following
+    code obtains the same effect:
+    \code
+  gs.insert(point(0*x));
+    \endcode
+    In contrast, if we had added the following code, we would have
+    defined a line parallel to the \f$x\f$ axis through
+    the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+    \code
+  gs.insert(point(0*x + 1*y));
+    \endcode
+
+    \par Example 2
+    The following code builds a ray having the same direction as
+    the positive part of the \f$x\f$ axis in \f$\Rset^2\f$:
+    \code
+  Generator_System gs;
+  gs.insert(ray(x + 0*y));
+    \endcode
+    To define a system of generators indeed corresponding to the set
+    \f[
+      \bigl\{\,
+        (x, 0)^\transpose \in \Rset^2
+      \bigm|
+        x \geq 0
+      \,\bigr\},
+    \f]
+    one just has to add the origin:
+    \code
+  gs.insert(point(0*x + 0*y));
+    \endcode
+
+    \par Example 3
+    The following code builds a system of generators having four points
+    and corresponding to a square in \f$\Rset^2\f$
+    (the same as Example 1 for the system of constraints):
+    \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 3*y));
+  gs.insert(point(3*x + 0*y));
+  gs.insert(point(3*x + 3*y));
+    \endcode
+
+    \par Example 4
+    By using closure points, we can define the \e kernel
+    (i.e., the largest open set included in a given set)
+    of the square defined in the previous example.
+    Note that a supporting point is needed and, for that purpose,
+    any inner point could be considered.
+    \code
+  Generator_System gs;
+  gs.insert(point(x + y));
+  gs.insert(closure_point(0*x + 0*y));
+  gs.insert(closure_point(0*x + 3*y));
+  gs.insert(closure_point(3*x + 0*y));
+  gs.insert(closure_point(3*x + 3*y));
+    \endcode
+
+    \par Example 5
+    The following code builds a system of generators having two points
+    and a ray, corresponding to a half-strip in \f$\Rset^2\f$
+    (the same as Example 2 for the system of constraints):
+    \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 1*y));
+  gs.insert(ray(x - y));
+    \endcode
+
+    \note
+    After inserting a multiset of generators in a generator system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> generator system
+    will be available, where original generators may have been
+    reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Generator_System : private Linear_System {
+public:
+  //! Default constructor: builds an empty system of generators.
+  Generator_System();
+
+  //! Builds the singleton system containing only generator \p g.
+  explicit Generator_System(const Generator& g);
+
+  //! Ordinary copy-constructor.
+  Generator_System(const Generator_System& gs);
+
+  //! Destructor.
+  ~Generator_System();
+
+  //! Assignment operator.
+  Generator_System& operator=(const Generator_System& y);
+
+  //! Returns the maximum space dimension a Generator_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Removes all the generators from the generator system
+    and sets its space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the generator \p g,
+    increasing the number of space dimensions if needed.
+  */
+  void insert(const Generator& g);
+
+  /*! \brief
+    Returns the singleton system containing only
+    Generator::zero_dim_point().
+  */
+  static const Generator_System& zero_dim_univ();
+
+  //! An iterator over a system of generators
+  /*! \ingroup PPL_CXX_interface
+      A const_iterator is used to provide read-only access
+      to each generator contained in an object of Generator_System.
+
+      \par Example
+      The following code prints the system of generators
+      of the polyhedron <CODE>ph</CODE>:
+      \code
+  const Generator_System& gs = ph.generators();
+  for (Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i)
+    cout << *i << endl;
+      \endcode
+      The same effect can be obtained more concisely by using
+      more features of the STL:
+      \code
+  const Generator_System& gs = ph.generators();
+  copy(gs.begin(), gs.end(), ostream_iterator<Generator>(cout, "\n"));
+      \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+			   Generator,
+			   ptrdiff_t,
+			   const Generator*,
+			   const Generator&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Generator& operator*() const;
+
+    //! Indirect member selector.
+    const Generator* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Generator_System;
+
+    //! The const iterator over the Linear_System.
+    Linear_System::const_iterator i;
+
+    //! A const pointer to the Linear_System.
+    const Linear_System* gsp;
+
+    //! Constructor.
+    const_iterator(const Linear_System::const_iterator& iter,
+		   const Generator_System& gsys);
+
+    /*! \brief
+      \p *this skips to the next generator, skipping those
+      closure points that are immediately followed by a matching point.
+    */
+    void skip_forward();
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first generator,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Linear_System and each row in the system is a valid Generator.
+  */
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Resizes the matrix of generators using the numbers of rows and columns
+    read from \p s, then initializes the coordinates of each generator
+    and its type reading the contents from \p s.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Generator_System& y);
+
+private:
+  friend class const_iterator;
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+  friend bool
+  Parma_Polyhedra_Library::operator==(const Polyhedron& x,
+				      const Polyhedron& y);
+
+  //! Builds an empty system of generators having the specified topology.
+  explicit Generator_System(Topology topol);
+
+  /*! \brief
+    Builds a system of \p n_rows rays/points on a \p n_columns - 1
+    dimensional space (including the \f$\epsilon\f$ dimension, if
+    \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE>).
+  */
+  Generator_System(Topology topol,
+		   dimension_type n_rows, dimension_type n_columns);
+
+  /*! \brief
+    Adjusts \p *this so that it matches the topology and
+    the number of space dimensions given as parameters
+    (adding or removing columns if needed).
+    Returns <CODE>false</CODE> if and only if \p topol is
+    equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+    contains closure points.
+  */
+  bool adjust_topology_and_space_dimension(Topology topol,
+					   dimension_type num_dimensions);
+
+  /*! \brief
+    For each unmatched closure point in \p *this, adds the
+    corresponding point.
+
+    It is assumed that the topology of \p *this
+    is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  */
+  void add_corresponding_points();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more points.
+  */
+  bool has_points() const;
+
+  /*! \brief
+    For each unmatched point in \p *this, adds the corresponding
+    closure point.
+
+    It is assumed that the topology of \p *this
+    is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  */
+  void add_corresponding_closure_points();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more closure points.
+
+    Note: the check for the presence of closure points is
+    done under the point of view of the user. Namely, we scan
+    the generator system using high-level iterators, so that
+    closure points that are matching the corresponding points
+    will be disregarded.
+  */
+  bool has_closure_points() const;
+
+  //! Returns the \p k- th generator of the system.
+  Generator& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k- th generator of the system.
+  const Generator& operator[](dimension_type k) const;
+
+  /*! \brief
+    Returns the relations holding between the generator system
+    and the constraint \p c.
+  */
+  Parma_Polyhedra_Library::Poly_Con_Relation
+  relation_with(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  bool satisfied_by_all_generators(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  /*!
+    It is assumed that <CODE>c.is_necessarily_closed()</CODE> holds.
+  */
+  bool satisfied_by_all_generators_C(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  /*!
+    It is assumed that <CODE>c.is_necessarily_closed()</CODE> does not hold.
+  */
+  bool satisfied_by_all_generators_NNC(const Constraint& c) const;
+
+  //! Assigns to a given variable an affine expression.
+  /*!
+    \param v
+    Index of the column to which the affine transformation is assigned;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We want to allow affine transformations (see the Introduction) having
+    any rational coefficients. Since the coefficients of the
+    constraints are integers we must also provide an integer \p denominator
+    that will be used as denominator of the affine transformation.
+    The denominator is required to be a positive integer.
+
+    The affine transformation assigns to each element of \p v -th
+    column the follow expression:
+    \f[
+      \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+           {\mathrm{denominator}}.
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_image(dimension_type v,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator);
+
+  //! Returns the number of lines of the system.
+  dimension_type num_lines() const;
+
+  //! Returns the number of rays of the system.
+  dimension_type num_rays() const;
+
+  //! Removes all the invalid lines and rays.
+  /*!
+    The invalid lines and rays are those with all
+    the homogeneous terms set to zero.
+  */
+  void remove_invalid_lines_and_rays();
+
+  /*! \brief
+    Applies Gaussian's elimination and back-substitution so as
+    to provide a partial simplification of the system of generators.
+
+    It is assumed that the system has no pending generators.
+  */
+  void simplify();
+
+  /*! \brief
+    Inserts in \p *this a copy of the generator \p g,
+    increasing the number of space dimensions if needed.
+    It is a pending generator.
+  */
+  void insert_pending(const Generator& g);
+};
+
+// Generator_System.inlines.hh is not included here on purpose.
+
+#endif // !defined(PPL_Generator_System_defs_hh)
diff --git a/src/Generator_System.inlines.hh b/src/Generator_System.inlines.hh
new file mode 100644
index 0000000..fc6471b
--- /dev/null
+++ b/src/Generator_System.inlines.hh
@@ -0,0 +1,212 @@
+/* Generator_System class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Generator_System_inlines_hh
+#define PPL_Generator_System_inlines_hh 1
+
+#include "Generator.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Generator_System::Generator_System()
+  : Linear_System(NECESSARILY_CLOSED) {
+}
+
+inline
+Generator_System::Generator_System(const Generator& g)
+  : Linear_System(g.topology()) {
+  Linear_System::insert(g);
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs)
+  : Linear_System(gs) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol)
+  : Linear_System(topol) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol,
+				   const dimension_type n_rows,
+				   const dimension_type n_columns)
+  : Linear_System(topol, n_rows, n_columns) {
+}
+
+inline
+Generator_System::~Generator_System() {
+}
+
+inline Generator_System&
+Generator_System::operator=(const Generator_System& y) {
+  Linear_System::operator=(y);
+  return *this;
+}
+
+inline dimension_type
+Generator_System::max_space_dimension() {
+  return Linear_System::max_space_dimension();
+}
+
+inline dimension_type
+Generator_System::space_dimension() const {
+  return Linear_System::space_dimension();
+}
+
+inline void
+Generator_System::clear() {
+  Linear_System::clear();
+}
+
+inline Generator&
+Generator_System::operator[](const dimension_type k) {
+  return static_cast<Generator&>(Linear_System::operator[](k));
+}
+
+inline const Generator&
+Generator_System::operator[](const dimension_type k) const {
+  return static_cast<const Generator&>(Linear_System::operator[](k));
+}
+
+inline
+Generator_System::const_iterator::const_iterator()
+  : i(), gsp(0) {
+}
+
+inline
+Generator_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i), gsp(y.gsp) {
+}
+
+inline
+Generator_System::const_iterator::~const_iterator() {
+}
+
+inline
+Generator_System::const_iterator&
+Generator_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  gsp = y.gsp;
+  return *this;
+}
+
+inline const Generator&
+Generator_System::const_iterator::operator*() const {
+  return static_cast<const Generator&>(*i);
+}
+
+inline const Generator*
+Generator_System::const_iterator::operator->() const {
+  return static_cast<const Generator*>(i.operator->());
+}
+
+inline Generator_System::const_iterator&
+Generator_System::const_iterator::operator++() {
+  ++i;
+  if (!gsp->is_necessarily_closed())
+    skip_forward();
+  return *this;
+}
+
+inline Generator_System::const_iterator
+Generator_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Generator_System::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Generator_System::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Generator_System::const_iterator::
+const_iterator(const Linear_System::const_iterator& iter,
+	       const Generator_System& gsys)
+  : i(iter), gsp(&gsys) {
+}
+
+inline Generator_System::const_iterator
+Generator_System::begin() const {
+  const_iterator i(Linear_System::begin(), *this);
+  if (!is_necessarily_closed())
+    i.skip_forward();
+  return i;
+}
+
+inline Generator_System::const_iterator
+Generator_System::end() const {
+  const const_iterator i(Linear_System::end(), *this);
+  return i;
+}
+
+inline const Generator_System&
+Generator_System::zero_dim_univ() {
+  static const Generator_System zdu(Generator::zero_dim_point());
+  return zdu;
+}
+
+inline void
+Generator_System::swap(Generator_System& y) {
+  Linear_System::swap(y);
+}
+
+inline memory_size_type
+Generator_System::external_memory_in_bytes() const {
+  return Linear_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator_System::total_memory_in_bytes() const {
+  return Linear_System::total_memory_in_bytes();
+}
+
+inline void
+Generator_System::simplify() {
+  Linear_System::simplify();
+  remove_invalid_lines_and_rays();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Generator_System& x,
+     Parma_Polyhedra_Library::Generator_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Generator_System_inlines_hh)
diff --git a/src/Generator_System.types.hh b/src/Generator_System.types.hh
new file mode 100644
index 0000000..0166685
--- /dev/null
+++ b/src/Generator_System.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Generator_System_types_hh
+#define PPL_Generator_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Generator_System;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Generator_System_types_hh)
diff --git a/src/Grid.defs.hh b/src/Grid.defs.hh
new file mode 100644
index 0000000..c4652b0
--- /dev/null
+++ b/src/Grid.defs.hh
@@ -0,0 +1,2485 @@
+/* Grid class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_defs_hh
+#define PPL_Grid_defs_hh 1
+
+#define STRONG_REDUCTION
+
+#include "Grid.types.hh"
+#include "globals.defs.hh"
+#include "Variable.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "Congruence_System.defs.hh"
+#include "Congruence_System.inlines.hh"
+#include "Grid_Generator_System.defs.hh"
+#include "Grid_Generator_System.inlines.hh"
+#include "Grid_Generator.types.hh"
+#include "Poly_Con_Relation.defs.hh"
+#include "Poly_Gen_Relation.defs.hh"
+#include "Grid_Certificate.types.hh"
+#include <vector>
+#include <iosfwd>
+
+// Dimension kind vector tracing
+#define print_dim_kinds(msg, dim_kinds)					\
+  std::cout << msg << "dim_kinds:";					\
+  for (Dimension_Kinds::iterator i = dim_kinds.begin(); i != dim_kinds.end(); ++i) \
+    std::cout << " " << *i;						\
+  std::cout << std::endl;
+#if 0
+#define trace_dim_kinds(msg, dim_kinds) print_dim_kinds(msg, dim_kinds)
+#else
+#define trace_dim_kinds(msg, dim_kinds)
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Grid
+  Writes a textual representation of \p gr on \p s: <CODE>false</CODE>
+  is written if \p gr is an empty grid; <CODE>true</CODE> is written
+  if \p gr is a universe grid; a minimized system of congruences
+  defining \p gr is written otherwise, all congruences in one row
+  separated by ", "s.
+*/
+std::ostream&
+operator<<(std::ostream& s, const Grid& gr);
+
+} // namespace IO_Operators
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are the same
+  grid.
+
+  \relates Grid
+  Note that \p x and \p y may be dimension-incompatible grids: in
+  those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Grid& x, const Grid& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are different
+  grids.
+
+  \relates Grid
+  Note that \p x and \p y may be dimension-incompatible grids: in
+  those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Grid& x, const Grid& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A grid.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Grid represents a rational grid.
+
+  A grid can be specified as either a finite system of congruences
+  or a finite system of generators (see Section \ref
+  sect_rational_grids) and it is always possible to obtain either
+  representation.
+  That is, if we know the system of congruences, we can obtain
+  from this the system of generators that define the same grid
+  and vice versa.
+  These systems can contain redundant members, or they can be in the
+  minimal form.
+  Most operators on grids are provided with two implementations:
+  one of these, denoted <CODE>\<operator-name\>_and_minimize</CODE>,
+  also enforces the minimization of the representations,
+  and returns the boolean value <CODE>false</CODE> whenever
+  the resulting grid turns out to be empty.
+
+  A key attributes of any grid is its space dimension (the dimension
+  \f$n \in \Nset\f$ of the enclosing vector space):
+
+  - all grids, the empty ones included, are endowed with a space
+    dimension;
+  - most operations working on a grid and another object (another
+    grid, a congruence, a generator, a set of variables, etc.) will
+    throw an exception if the grid and the object are not
+    dimension-compatible (see Section \ref Grid_Space_Dimensions);
+  - the only ways in which the space dimension of a grid can be
+    changed are with <EM>explicit</EM> calls to operators provided for
+    that purpose, and with standard copy, assignment and swap
+    operators.
+
+  Note that two different grids can be defined on the zero-dimension
+  space: the empty grid and the universe grid \f$R^0\f$.
+
+  \par
+  In all the examples it is assumed that variables
+  <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+  used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
+
+  \par Example 1
+  The following code builds a grid corresponding to the even integer
+  pairs in \f$\Rset^2\f$, given as a system of congruences:
+  \code
+  Congruence_System cgs;
+  cgs.insert((x %= 0) / 2);
+  cgs.insert((y %= 0) / 2);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying three of the points:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_point(0*x + 2*y));
+  gs.insert(grid_point(2*x + 0*y));
+  Grid gr(gs);
+  \endcode
+
+  \par Example 2
+  The following code builds a grid corresponding to a line in
+  \f$\Rset^2\f$ by adding a single congruence to the universe grid:
+  \code
+  Congruence_System cgs;
+  cgs.insert(x - y == 0);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying a point and a line:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_line(x + y));
+  Grid gr(gs);
+  \endcode
+
+  \par Example 3
+  The following code builds a grid corresponding to the integral
+  points on the line \f$x = y\f$ in \f$\Rset^2\f$ constructed
+  by adding an equality and congruence to the universe grid:
+  \code
+  Congruence_System cgs;
+  cgs.insert(x - y == 0);
+  cgs.insert(x %= 0);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying a point and a parameter:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(parameter(x + y));
+  Grid gr(gs);
+  \endcode
+
+  \par Example 4
+  The following code builds the grid corresponding to a plane by
+  creating the universe grid in \f$\Rset^2\f$:
+  \code
+  Grid gr(2);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from the empty grid in \f$\Rset^2\f$ and inserting the appropriate
+  generators (a point, and two lines).
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(0*x + 0*y));
+  gr.add_generator(grid_line(x));
+  gr.add_generator(grid_line(y));
+  \endcode
+  Note that a generator system must contain a point when describing
+  a grid.  To ensure that this is always the case it is required
+  that the first generator inserted in an empty grid is a point
+  (otherwise, an exception is thrown).
+
+  \par Example 5
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_embed</CODE>:
+  \code
+  Grid gr(1);
+  gr.add_congruence(x == 2);
+  gr.add_space_dimensions_and_embed(1);
+  \endcode
+  We build the universe grid in the 1-dimension space \f$\Rset\f$.
+  Then we add a single equality congruence,
+  thus obtaining the grid corresponding to the singleton set
+  \f$\{ 2 \} \sseq \Rset\f$.
+  After the last line of code, the resulting grid is
+  \f[
+  \bigl\{\,
+  (2, y)^\transpose \in \Rset^2
+  \bigm|
+  y \in \Rset
+  \,\bigr\}.
+  \f]
+
+  \par Example 6
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_project</CODE>:
+  \code
+  Grid gr(1);
+  gr.add_congruence(x == 2);
+  gr.add_space_dimensions_and_project(1);
+  \endcode
+  The first two lines of code are the same as in Example 4 for
+  <CODE>add_space_dimensions_and_embed</CODE>.
+  After the last line of code, the resulting grid is
+  the singleton set
+  \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+
+  \par Example 7
+  The following code shows the use of the function
+  <CODE>affine_image</CODE>:
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(0*x + 0*y));
+  gr.add_generator(grid_point(4*x + 0*y));
+  gr.add_generator(grid_point(0*x + 2*y));
+  Linear_Expression expr = x + 3;
+  gr.affine_image(x, expr);
+  \endcode
+  In this example the starting grid is all the pairs of \f$x\f$ and
+  \f$y\f$ in \f$\Rset^2\f$ where \f$x\f$ is an integer multiple of 4
+  and \f$y\f$ is an integer multiple of 2.  The considered variable
+  is \f$x\f$ and the affine expression is \f$x+3\f$.  The resulting
+  grid is the given grid translated 3 integers to the right (all the
+  pairs \f$(x, y)\f$ where \f$x\f$ is -1 plus an integer multiple of 4
+  and \f$y\f$ is an integer multiple of 2).
+  Moreover, if the affine transformation for the same variable \p x
+  is instead \f$x+y\f$:
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting grid is every second integral point along the \f$x=y\f$
+  line, with this line of points repeated at every fourth integral value
+  along the \f$x\f$ axis.
+  Instead, if we do not use an invertible transformation for the
+  same variable; for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting grid is every second point along the \f$x=y\f$ line.
+
+  \par Example 8
+  The following code shows the use of the function
+  <CODE>affine_preimage</CODE>:
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(0*x + 0*y));
+  gr.add_generator(grid_point(4*x + 0*y));
+  gr.add_generator(grid_point(0*x + 2*y));
+  Linear_Expression expr = x + 3;
+  gr.affine_preimage(x, expr);
+  \endcode
+  In this example the starting grid, \p var and the affine
+  expression and the denominator are the same as in Example 6, while
+  the resulting grid is similar but translated 3 integers to the
+  left (all the pairs \f$(x, y)\f$
+  where \f$x\f$ is -3 plus an integer multiple of 4 and
+  \f$y\f$ is an integer multiple of 2)..
+  Moreover, if the affine transformation for \p x is \f$x+y\f$
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting grid is a similar grid to the result in Example 6,
+  only the grid is slanted along \f$x=-y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable \p x, for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting grid is every fourth line parallel to the \f$x\f$
+  axis.
+
+  \par Example 9
+  For this example we also use the variables:
+  \code
+  Variable z(2);
+  Variable w(3);
+  \endcode
+  The following code shows the use of the function
+  <CODE>remove_space_dimensions</CODE>:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(3*x + y +0*z + 2*w));
+  Grid gr(gs);
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  gr.remove_space_dimensions(to_be_removed);
+  \endcode
+  The starting grid is the singleton set
+  \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+  the resulting grid is
+  \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+  Be careful when removing space dimensions <EM>incrementally</EM>:
+  since dimensions are automatically renamed after each application
+  of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+  results can be obtained.
+  For instance, by using the following code we would obtain
+  a different result:
+  \code
+  set<Variable> to_be_removed1;
+  to_be_removed1.insert(y);
+  gr.remove_space_dimensions(to_be_removed1);
+  set<Variable> to_be_removed2;
+  to_be_removed2.insert(z);
+  gr.remove_space_dimensions(to_be_removed2);
+  \endcode
+  In this case, the result is the grid
+  \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+  when removing the set of dimensions \p to_be_removed2
+  we are actually removing variable \f$w\f$ of the original grid.
+  For the same reason, the operator \p remove_space_dimensions
+  is not idempotent: removing twice the same non-empty set of dimensions
+  is never the same as removing them just once.
+*/
+
+class Parma_Polyhedra_Library::Grid {
+public:
+  //! Returns the maximum space dimension all kinds of Grid can handle.
+  static dimension_type max_space_dimension();
+
+  //! Builds a grid having the specified properties.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the grid;
+
+    \param kind
+    Specifies whether the universe or the empty grid has to be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(dimension_type num_dimensions = 0,
+		const Degenerate_Element kind = UNIVERSE);
+
+  //! Builds a grid, copying a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the grid.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Congruence_System& cgs);
+
+  //! Builds a grid, recycling a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the grid.  Its data-structures
+    will be recycled to build the grid.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(Congruence_System& cgs);
+
+  //! Builds a grid, copying a system of constraints.
+  /*!
+    The grid inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the grid.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Constraint_System& cs);
+
+  //! Builds a grid, recycling a system of constraints.
+  /*!
+    The grid inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the grid.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(Constraint_System& cs);
+
+  //! Builds a grid, copying a system of generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
+
+    \param const_gs
+    The system of generators defining the grid.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Grid_Generator_System& const_gs);
+
+  //! Builds a grid, recycling a system of generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the grid.  Its data-structures
+    will be recycled to build the grid.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+  */
+  explicit Grid(Grid_Generator_System& gs);
+
+  //! Builds a grid out of a generic, interval-based bounding box.
+  /*!
+    \param box
+    The bounding box representing the grid to be built.  The box can
+    contain only point and universe intervals;
+
+    \param dummy
+    A dummy tag to make this constructor syntactically unique.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p box contains at least one interval with: a
+    topologically open bound, a single bound, or two bounds which have
+    space between them.
+
+    The template class Box must provide the following methods.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the dimension of the vector space enclosing the grid
+    represented by the bounding box.
+    \code
+      bool is_empty() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the bounding box
+    describes the empty set.
+    \code
+      bool get_lower_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+    \code
+      bool get_upper_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
+  */
+  template <typename Box>
+  Grid(const Box& box, From_Bounding_Box dummy);
+
+  //! Builds a grid out of a generic, interval-based covering box.
+  /*!
+    The covering box is a set of upper and lower values for each
+    dimension.  When a covering box is tiled onto empty space the
+    corners of the tiles form a rectilinear grid.
+
+    A box interval with only one bound fixes the values of all grid
+    points in the dimension associated with the box to the value of
+    the bound.  A box interval which has upper and lower bounds of
+    equal value allows all grid points with any value in the dimension
+    associated with the interval.  The presence of a universe interval
+    results in the empty grid.  The empty box produces the empty grid
+    of the same dimension as the box.
+
+    \param box
+    The covering box representing the grid to be built;
+
+    \param dummy
+    A dummy tag to make this constructor syntactically unique.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p box contains any topologically open bounds.
+
+    The template class Box must provide the following methods.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the dimension of the vector space enclosing the grid
+    represented by the covering box.
+    \code
+      bool is_empty() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the covering box
+    describes the empty set.
+    \code
+      bool get_lower_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+    \code
+      bool get_upper_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
+  */
+  template <typename Box>
+  Grid(const Box& box, From_Covering_Box dummy);
+
+  //! Ordinary copy-constructor.
+  Grid(const Grid& y);
+
+  /*! \brief
+    The assignment operator.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  Grid& operator=(const Grid& y);
+
+  //! \name Member Functions that Do Not Modify the Grid
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns
+    the \ref Grid_Affine_Dimension "affine dimension" of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns the system of congruences.
+  const Congruence_System& congruences() const;
+
+  //! Returns the system of congruences in reduced form.
+  const Congruence_System& minimized_congruences() const;
+
+  //! Returns the system of generators.
+  const Grid_Generator_System& generators() const;
+
+  //! Returns the minimized system of generators.
+  const Grid_Generator_System& minimized_generators() const;
+
+  //! Returns the relations holding between \p *this and \p cg.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  // FIXME: Poly_Con_Relation seems to encode exactly what we want
+  // here.  We must find a new name for that class.  Temporarily,
+  // we keep using it without changing the name.
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  // FIXME: see the comment for Poly_Con_Relation above.
+  Poly_Gen_Relation
+  relation_with(const Grid_Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is an empty
+    grid.
+  */
+  bool is_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a universe
+    grid.
+  */
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a
+    topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    disjoint.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool is_disjoint_from(const Grid& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  /*!
+    A grid is discrete if it can be defined by a generator system which
+    contains only points and parameters.  This includes the empty grid
+    and any grid in dimension zero.
+  */
+  bool is_discrete() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is bounded.
+  bool is_bounded() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_below.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_above.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+    Always <CODE>true</CODE> when \p this bounds \p expr.  Present for
+    interface compatibility with class Polyhedron, where closure
+    points can result in a value of false.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+    maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+    Always <CODE>true</CODE> when \p this bounds \p expr.  Present for
+    interface compatibility with class Polyhedron, where closure
+    points can result in a value of false;
+
+    \param point
+    When maximization succeeds, will be assigned a point where \p expr
+    reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p point are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		Grid_Generator& point) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the is the infimum value can be reached in \p
+    this.  Always <CODE>true</CODE> when \p this bounds \p expr.
+    Present for interface compatibility with class Polyhedron, where
+    closure points can result in a value of false.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the is the infimum value can be reached in \p
+    this.  Always <CODE>true</CODE> when \p this bounds \p expr.
+    Present for interface compatibility with class Polyhedron, where
+    closure points can result in a value of false;
+
+    \param point
+    When minimization succeeds, will be assigned a point where \p expr
+    reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		Grid_Generator& point) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Grid& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this strictly
+    contains \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Grid& y) const;
+
+  //! Uses \p *this to shrink a generic, interval-based bounding box.
+  /*!
+    \param box
+    The bounding box to be shrunk.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p box are dimension-incompatible, or if \p
+    box contains any topologically open bounds.
+
+    The template class Box must provide the following methods
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the dimension of the vector space enclosing the grid
+    represented by the bounding box.
+    \code
+      bool get_lower_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+    \code
+      bool get_upper_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
+    \code
+      set_empty()
+    \endcode
+    Causes the box to become empty, i.e., to represent the empty set.
+    \code
+      raise_lower_bound(dimension_type k, bool closed,
+                        Coefficient_traits::const_reference n,
+                        Coefficient_traits::const_reference d)
+    \endcode
+    intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension with \f$[n/d, +\infty)\f$.  <CODE>closed</CODE> is
+    always passed as <CODE>true</CODE>.
+    \code
+      lower_upper_bound(dimension_type k, bool closed,
+                        Coefficient_traits::const_reference n,
+                        Coefficient_traits::const_reference d)
+    \endcode
+    intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension with \f$(-\infty, n/d]\f$.  <CODE>closed</CODE> is
+    always passed as <CODE>true</CODE>.
+
+    The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
+    will be called at most once for each possible value for <CODE>k</CODE>
+    and for all such calls the fraction \f$n/d\f$ will be in canonical form,
+    that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
+    is positive, \f$0/1\f$ being the unique representation for zero.
+    The same guarantee is offered for the function
+    <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
+  */
+  template <typename Box>
+  void shrink_bounding_box(Box& box) const;
+
+  //! Writes the covering box for \p *this into \p box.
+  /*!
+    The covering box is a set of upper and lower values for each
+    dimension.  When the covering box written into \p box is tiled
+    onto empty space the corners of the tiles form the sparsest
+    rectilinear grid that includes \p *this.
+
+    The value of the lower bound of each interval of the resulting \p
+    box are as close as possible to the origin, with positive values
+    taking preference when the lowest positive value equals the lowest
+    negative value.
+
+    If all the points have a single value in a particular dimension of
+    the grid then there is only a lower bound on the interval produced
+    in \p box, and the lower bound denotes the single value for the
+    dimension.  If the coordinates of the points in a particular
+    dimension include every value then the upper and lower bounds of
+    the associated interval in \p box are set equal.  The empty grid
+    produces the empty \p box.  The zero dimension universe grid
+    produces the zero dimension universe box.
+
+    \param box
+    The Box into which the covering box is written.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p box are dimension-incompatible.
+
+    The template class Box must provide the following methods
+    \code
+      Box(dimension_type space_dimension)
+    \endcode
+    Creates a universe box of space_dimension dimensions.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the dimension of the vector space enclosing the grid
+    represented by the covering box.
+    \code
+      set_empty()
+    \endcode
+    Causes the box to become empty, i.e., to represent the empty set.
+    \code
+      raise_lower_bound(dimension_type k, bool closed,
+                        Coefficient_traits::const_reference n,
+                        Coefficient_traits::const_reference d)
+    \endcode
+    intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension with \f$[n/d, +\infty)\f$.  <CODE>closed</CODE> is
+    always passed as <CODE>true</CODE>.
+    \code
+      lower_upper_bound(dimension_type k, bool closed,
+                        Coefficient_traits::const_reference n,
+                        Coefficient_traits::const_reference d)
+    \endcode
+    intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension with \f$(-\infty, n/d]\f$.  <CODE>closed</CODE> is
+    always passed as <CODE>true</CODE>.
+
+    The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
+    will be called at most once for each possible value for <CODE>k</CODE>
+    and for all such calls the fraction \f$n/d\f$ will be in canonical form,
+    that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
+    is positive, \f$0/1\f$ being the unique representation for zero.
+    The same guarantee is offered for the function
+    <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
+  */
+  template <typename Box>
+  void get_covering_box(Box& box) const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if \p *this satisfies all the
+    invariants and either \p check_not_empty is <CODE>false</CODE> or
+    \p *this is not empty.
+
+    \param check_not_empty
+    <CODE>true</CODE> if and only if, in addition to checking the
+    invariants, \p *this must be checked to be not empty.
+
+    The check is performed so as to intrude as little as possible.  If
+    the library has been compiled with run-time assertions enabled,
+    error messages are written on <CODE>std::cerr</CODE> in case
+    invariants are violated. This is useful for the purpose of
+    debugging the library.
+  */
+  bool OK(bool check_not_empty = false) const;
+
+  //@} // Member Functions that Do Not Modify the Grid
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Grid
+  //@{
+
+  //! Adds a copy of congruence \p cg to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are
+    dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  //! Adds constraint \p c to \p *this.
+  /*!
+    The addition can only affect \p *this if \p c is an equality.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void add_congruence(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences of \p
+    *this, reducing the result
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  bool add_congruence_and_minimize(const Congruence& c);
+
+  //! Adds a copy of constraint \p c to \p *this, reducing the result.
+  /*!
+    The addition can only affect \p *this if \p c is an equality.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  bool add_congruence_and_minimize(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators of \p
+    *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible,
+    or if \p *this is an empty grid and \p g is not a point.
+  */
+  void add_generator(const Grid_Generator& g);
+
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators of \p
+    *this, reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible,
+    or if \p *this is an empty grid and \p g is not a point.
+  */
+  bool add_generator_and_minimize(const Grid_Generator& g);
+
+  //! Adds a copy of each congruence in \p cgs to \p *this.
+  /*!
+    \param cgs
+    Contains the congruences that will be added to the system of
+    congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  //! Adds a copy of each equality constraint in \p cs to \p *this.
+  /*!
+    \param cs
+    The congruences that will be considered for addition to the system
+    of congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Constraint_System& cs);
+
+  //! Adds the congruences in \p cgs to *this.
+  /*!
+    \param cgs
+    The congruence system that will be recycled, adding its
+    congruences to the system of congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cgs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  //! Adds the equality constraints in \p cs to \p *this.
+  /*!
+    \param cs
+    The constraint system from which constraints will be considered
+    for addition to the system of congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of the congruences in \p cgs to the system of
+    congruences of \p *this, reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cgs
+    Contains the congruences that will be added to the system of
+    congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  bool add_congruences_and_minimize(const Congruence_System& cgs);
+
+  /*! \brief
+    Adds a copy of each equality constraint in \p cs to \p *this,
+    reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    Contains the constraints that will be added to the system of
+    congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  bool add_congruences_and_minimize(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the congruences in \p cgs to the system of congruences of \p
+    *this, reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cgs
+    The congruence system that will be recycled, adding its
+    congruences to the system of congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cgs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  bool add_recycled_congruences_and_minimize(Congruence_System& cgs);
+
+  //! Adds the equalities in \p cs to \p *this, reducing the result.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    The constraint system that will be recycled, adding its
+    equalities to the system of congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  bool add_recycled_congruences_and_minimize(Constraint_System& cs);
+
+  //! Adds constraint \p c to \p *this.
+  /*!
+    The addition can only affect \p *this if \p c is an equality.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  //! Adds constraint \p c to \p *this, reducing the result.
+  /*!
+    The addition can only affect \p *this if \p c is an equality.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  bool add_constraint_and_minimize(const Constraint& c);
+
+  //! Adds copies of the equality constraints in \p cs to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds copies of the equality constraints in \p cs to \p *this,
+    reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  bool add_constraints_and_minimize(const Constraint_System& cs);
+
+  //! Adds the equality constraints in \p cs to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  bool add_recycled_constraints_and_minimize(Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system of generators
+    of \p *this.
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible, or if
+    \p *this is empty and the system of generators \p gs is not empty,
+    but has no points.
+  */
+  void add_generators(const Grid_Generator_System& gs);
+
+  /*! \brief
+    Adds the generators in \p gs to the system of generators of \p
+    *this.
+
+    \param gs
+    The generator system that will be recycled, adding its generators
+    to the system of generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible, or if
+    \p *this is empty and the system of generators \p gs is not empty,
+    but has no points.
+
+    \warning
+    The only assumption that can be made about \p gs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_generators(Grid_Generator_System& gs);
+
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system of generators
+    of \p *this, reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible, or if \p
+    *this is empty and the system of generators \p gs is not empty,
+    but has no points.
+  */
+  bool add_generators_and_minimize(const Grid_Generator_System& gs);
+
+  /*! \brief
+    Adds the generators in \p gs to the system of generators of \p
+    *this, reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param gs
+    The generator system that will be recycled, adding its generators
+    to the system of generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible, or if \p
+    *this is empty and the system of generators \p gs is not empty,
+    but has no points.
+
+    \warning
+    The only assumption that can be made about \p gs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  bool add_recycled_generators_and_minimize(Grid_Generator_System& gs);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y.  The
+    result is not guaranteed to be reduced.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y,
+    reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool intersection_assign_and_minimize(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the join of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void join_assign(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the join of \p *this and \p y, reducing the
+    result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool join_assign_and_minimize(const Grid& y);
+
+  //! Same as join_assign(y).
+  void upper_bound_assign(const Grid& y);
+
+  /*! \brief
+    If the join of \p *this and \p y is exact it is assigned to \p
+    *this and <CODE>true</CODE> is returned, otherwise
+    <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool join_assign_if_exact(const Grid& y);
+
+  //! Same as join_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Difference "grid-difference" of
+    \p *this and \p y.
+
+    The grid difference between grids x and y is the smallest grid
+    containing all the points from x and y that are only in x.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void grid_difference_assign(const Grid& y);
+
+  //! Same as grid_difference_assign(y).
+  void difference_assign(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Affine_Transformation
+    "affine image" of \p
+    *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering the generators of a grid, the
+    affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If congruences are up-to-date, it uses the specialized function
+    affine_preimage() (for the system of congruences)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+	   = a_\mathrm{var} x_\mathrm{var}
+	     + \sum_{i \neq var} a_i x_i + b,
+       \f]
+       so that the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+             - \sum_{i \neq j} a_i x_i - b.
+       \f]
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only generators remain
+    up-to-date.
+
+    \endif
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		    = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Affine_Transformation
+    "affine preimage" of
+    \p *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering congruences of a grid, the affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If generators are up-to-date, then the specialized function
+    affine_image() is used (for the system of generators)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation, we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+       \f],
+       the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+               - \sum_{i \neq j} a_i x_i - b.
+       \f].
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only congruences remain
+    up-to-date.
+
+    \endif
+  */
+  void affine_preimage(Variable var,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator
+		         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to
+    the \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+    \pmod{\mathrm{modulus}}\f$.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+    Optional argument with an automatic value of one;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of one.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p
+    *this.
+  */
+  void generalized_affine_image(Variable var,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				= Coefficient_one(),
+				Coefficient_traits::const_reference modulus
+				= Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+    \pmod{\mathrm{modulus}}\f$.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+    Optional argument with an automatic value of one;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of one.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p
+    *this.
+  */
+  void generalized_affine_preimage(Variable var,
+				   const Linear_Expression& expr,
+				   Coefficient_traits::const_reference denominator
+				   = Coefficient_one(),
+				   Coefficient_traits::const_reference modulus
+				   = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to
+    the \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param rhs
+    The right hand side affine expression.
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of one.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p
+    rhs.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+				const Linear_Expression& rhs,
+				Coefficient_traits::const_reference modulus
+				= Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param rhs
+    The right hand side affine expression;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of one.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p
+    rhs.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+				   const Linear_Expression& rhs,
+				   Coefficient_traits::const_reference modulus
+				   = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Time_Elapse
+    "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Grid& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void widening_assign(const Grid& y, unsigned* tp = NULL);
+
+  /*! \brief
+    Improves the result of the \ref Grid_Widening "Grid widening"
+    computation by also enforcing those congruences in \p cgs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param cgs
+    The system of congruences used to improve the widened grid;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  */
+  void limited_extrapolation_assign(const Grid& y,
+				    const Congruence_System& cgs,
+				    unsigned* tp = NULL);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old grid in the new
+    vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new grid, which is characterized by a system of congruences
+    in which the variables which are the new dimensions can have any
+    value.  For instance, when starting from the grid \f$\cL \sseq
+    \Rset^2\f$ and adding a third space dimension, the result will be
+    the grid
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cL
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new space dimensions to the grid and does not embed it
+    in the new vector space.
+
+    \param m
+    The number of space dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new grid, which is characterized by a system of congruences
+    in which the variables running through the new dimensions are all
+    constrained to be equal to 0.  For instance, when starting from
+    the grid \f$\cL \sseq \Rset^2\f$ and adding a third space
+    dimension, the result will be the grid
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cL
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Concatenate "concatenation" of
+    \p *this and \p y, taken in this order.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Grid& y);
+
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher dimensions of the vector space so that the
+    resulting space will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Grid_Map_Space_Dimensions "partial function".
+
+    If \p pfunc maps only some of the dimensions of \p *this then the
+    rest will be projected away.
+
+    If the highest dimension mapped to by \p pfunc is higher than the
+    highest dimension in \p *this then the number of dimensions in \p
+    *this will be increased to the highest dimension mapped to by \p
+    pfunc.
+
+    \param pfunc
+    The partial function specifying the destiny of each space
+    dimension.
+
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain of the
+    partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.  If \f$f\f$ is
+    undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing the grid.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Grid_Map_Space_Dimensions "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Grid_Expand_Space_Dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.  Also
+    thrown if \p var is contained in \p to_be_folded.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref Grid_Fold_Space_Dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  friend bool Parma_Polyhedra_Library::operator==(const Grid& x,
+						  const Grid& y);
+
+  friend class Parma_Polyhedra_Library::Grid_Certificate;
+
+  //! \name Miscellaneous Member Functions
+  //@{
+
+  //! Destructor.
+  ~Grid();
+
+  /*! \brief
+    Swaps \p *this with grid \p y.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  void swap(Grid& y);
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+
+     \return
+     <CODE>true</CODE> if successful, else <CODE>false</CODE>.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //@} // Miscellaneous Member Functions
+
+private:
+
+  //! The system of congruences.
+  Congruence_System con_sys;
+
+  //! The system of generators.
+  Grid_Generator_System gen_sys;
+
+#define PPL_IN_Grid_CLASS
+#include "Grid_Status.idefs.hh"
+#undef PPL_IN_Grid_CLASS
+
+  //! The status flags to keep track of the grid's internal state.
+  Status status;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  enum Dimension_Kind {
+    PARAMETER,
+    LINE,
+    GEN_VIRTUAL,
+    PROPER_CONGRUENCE = PARAMETER,
+    CON_VIRTUAL = LINE,
+    EQUALITY = GEN_VIRTUAL
+  };
+
+  typedef std::vector<Dimension_Kind> Dimension_Kinds;
+
+  // The type of row associated with each dimension.  If the virtual
+  // rows existed then the reduced systems would be square and upper
+  // or lower triangular, and the rows in each would have the types
+  // given in this vector.  As the congruence system is reduced to an
+  // upside-down lower triangular form the ordering of the congruence
+  // types is last to first.
+  Dimension_Kinds dim_kinds;
+
+  //! Builds a grid from a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the grid.
+  */
+  void construct(const Congruence_System& cgs);
+
+  //! Builds a grid from a system of generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the grid;
+  */
+  void construct(const Grid_Generator_System& gs);
+
+  //! \name Private Verifiers: Verify if Individual Flags are Set
+  //@{
+
+  //! Returns <CODE>true</CODE> if the grid is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  //! Returns <CODE>true</CODE> if the system of congruences is up-to-date.
+  bool congruences_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+  bool generators_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of congruences is minimized.
+  bool congruences_are_minimized() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is minimized.
+  bool generators_are_minimized() const;
+
+  //@} // Private Verifiers: Verify if Individual Flags are Set
+
+  //! \name State Flag Setters: Set Only the Specified Flags
+  //@{
+
+  /*! \brief
+    Sets \p status to express that the grid is the universe
+    0-dimension vector space, clearing all corresponding matrices.
+  */
+  void set_zero_dim_univ();
+
+  /*! \brief
+    Sets \p status to express that the grid is empty, clearing all
+    corresponding matrices.
+  */
+  void set_empty();
+
+  //! Sets \p status to express that congruences are up-to-date.
+  void set_congruences_up_to_date();
+
+  //! Sets \p status to express that generators are up-to-date.
+  void set_generators_up_to_date();
+
+  //! Sets \p status to express that congruences are minimized.
+  void set_congruences_minimized();
+
+  //! Sets \p status to express that generators are minimized.
+  void set_generators_minimized();
+
+  //@} // State Flag Setters: Set Only the Specified Flags
+
+  //! \name State Flag Cleaners: Clear Only the Specified Flag
+  //@{
+
+  //! Clears the \p status flag indicating that the grid is empty.
+  void clear_empty();
+
+  //! Sets \p status to express that congruences are out of date.
+  void clear_congruences_up_to_date();
+
+  //! Sets \p status to express that parameters are out of date.
+  void clear_generators_up_to_date();
+
+  //! Sets \p status to express that congruences are no longer minimized.
+  void clear_congruences_minimized();
+
+  //! Sets \p status to express that generators are no longer minimized.
+  void clear_generators_minimized();
+
+  //@} // State Flag Cleaners: Clear Only the Specified Flag
+
+  //! \name Updating Matrices
+  //@{
+
+  //! Updates and minimizes the congruences from the generators.
+  /*!
+    \return
+    Always <CODE>true</CODE>.
+  */
+  bool update_congruences() const;
+
+  //! Updates and minimizes the generators from the congruences.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty grid.
+
+    It is illegal to call this method when the Status field already
+    declares the grid to be empty.
+  */
+  bool update_generators() const;
+
+  //@} // Updating Matrices
+
+  //! \name Minimization of Descriptions
+  //@{
+
+  //! Minimizes both the congruences and the generators.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty grid.
+
+    Minimization is performed on each system only if the minimized
+    Status field is clear.
+  */
+  bool minimize() const;
+
+  //@} // Minimization of Descriptions
+
+  enum Three_Valued_Boolean {
+    TVB_TRUE,
+    TVB_FALSE,
+    TVB_DONT_KNOW
+  };
+
+  //! Polynomial but incomplete equivalence test between grids.
+  Three_Valued_Boolean quick_equivalence_test(const Grid& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+  bool is_included_in(const Grid& y) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param method_call
+    The call description of the public parent method, for example
+    "bounded_from_above(e)".  Passed to throw_dimension_incompatible,
+    as the first argument.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, const char* method_call) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param method_call
+    The call description of the public parent method, for example
+    "maximize(e)".  Passed to throw_dimension_incompatible, as the
+    first argument;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr in \p
+    *this can actually be reached (which is always the case);
+
+    \param point
+    When maximization or minimization succeeds, will be assigned the
+    point where \p expr reaches the extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+	       char* method_call,
+	       Coefficient& ext_n, Coefficient& ext_d, bool& included,
+	       Grid_Generator* point = NULL) const;
+
+  //! \name Widening- and Extrapolation-Related Functions
+  //@{
+
+  //! Copies a widened selection of congruences from \p y to \p selected_cgs.
+  void select_wider_congruences(const Grid& y,
+				Congruence_System& selected_cgs) const;
+
+  //@} // Widening- and Extrapolation-Related Functions
+
+  //! Adds new space dimensions to the given systems.
+  /*!
+    \param cgs
+    A congruence system, to which columns are added;
+
+    \param gs
+    A generator system, to which rows and columns are added;
+
+    \param dims
+    The number of space dimensions to add.
+
+    This method is invoked only by
+    <CODE>add_space_dimensions_and_embed()</CODE>.
+  */
+  void add_space_dimensions(Congruence_System& cgs,
+			    Grid_Generator_System& gs,
+			    const dimension_type dims);
+
+  //! Adds new space dimensions to the given systems.
+  /*!
+    \param gs
+    A generator system, to which columns are added;
+
+    \param cgs
+    A congruence system, to which rows and columns are added;
+
+    \param dims
+    The number of space dimensions to add.
+
+    This method is invoked only by
+    <CODE>add_space_dimensions_and_project()</CODE>.
+  */
+  void add_space_dimensions(Grid_Generator_System& gs,
+			    Congruence_System& cgs,
+			    const dimension_type dims);
+
+  //! \name Minimization-related Static Member Functions
+  //@{
+
+  //! Normalizes the divisors in \p sys.
+  /*!
+    Converts \p sys to an equivalent system in which the divisors are
+    of equal value.
+
+    \return
+    The new system divisor, or zero if \p divisor was zero.
+
+    \param sys
+    The generator system to be normalized.
+
+    \param divisor
+    An extra divisor to include in the calculation of the common
+    divisor of \p sys.
+
+    \param first_point
+    If \p first_point has a value other than NULL then it is taken as
+    the first point in \p sys, and it is assumed that any following
+    points have the same divisor as \p first_point.
+  */
+  static Coefficient
+  normalize_divisors(Grid_Generator_System& sys,
+		     Coefficient_traits::const_reference divisor
+		     = Coefficient_one(),
+		     Grid_Generator* first_point = NULL);
+
+  //! Normalize all the divisors in \p sys and \p gen_sys.
+  /*!
+    Modify \p sys and \p gen_sys to use the same single divisor value
+    for all generators, leaving each system representing the grid it
+    represented originally.
+  */
+  static void normalize_divisors(Grid_Generator_System& sys,
+				 Grid_Generator_System& gen_sys);
+
+  /*! \brief
+    Converts generator system \p dest to be equivalent to congruence
+    system \p source.
+  */
+  static void conversion(Congruence_System& source,
+			 Grid_Generator_System& dest,
+			 Dimension_Kinds& dim_kinds);
+
+  /*! \brief
+    Converts congruence system \p dest to be equivalent to generator
+    system \p source.
+  */
+  static void conversion(Grid_Generator_System& source,
+			 Congruence_System& dest,
+			 Dimension_Kinds& dim_kinds);
+
+  //! Converts \p cgs to upper triangular (i.e. minimized) form.
+  /*!
+    Returns <CODE>true</CODE> if \p cgs represents the empty set,
+    otherwise returns <CODE>false</CODE>.
+  */
+  static bool simplify(Congruence_System& cgs,
+		       Dimension_Kinds& dim_kinds);
+
+  //! Converts \p gs to lower triangular (i.e. minimized) form.
+  /*!
+    Expects \p gs to contain at least one point.
+  */
+  static void simplify(Grid_Generator_System& gs,
+		       Dimension_Kinds& dim_kinds);
+
+  //! Reduces the line \p row using the line \p pivot.
+  /*!
+    Uses the line \p pivot to change the representation of the line \p
+    row so that the element at index \p col of \p row is zero.
+  */
+  // A member of Grid for access to Matrix::rows.
+  static void reduce_line_with_line(Grid_Generator& row,
+				    Grid_Generator& pivot,
+				    dimension_type col);
+
+  //! Reduces the equality \p row using the equality \p pivot.
+  /*!
+    Uses the equality \p pivot to change the representation of the
+    equality \p row so that the element at index \p col of \p row is
+    zero.
+  */
+  // A member of Grid for access to Matrix::rows.
+  static void reduce_equality_with_equality(Congruence& row,
+					    Congruence& pivot,
+					    dimension_type col);
+
+  //! Reduces \p row using \p pivot.
+  /*!
+    Uses the point, parameter or proper congruence at \p pivot to
+    change the representation of the point, parameter or proper
+    congruence at \p row so that the element at index \p col of \p row
+    is zero.  Only elements from index \p start to index \p end are
+    modified (i.e. it is assumed that all other elements are zero).
+  */
+  // Part of Grid for access to Matrix::rows.
+  template <typename R>
+  static void reduce_pc_with_pc(R& row,
+				R& pivot,
+				dimension_type col,
+				dimension_type start,
+				dimension_type end);
+
+  //! Reduce \p row using \p pivot.
+  /*!
+    Use the line \p pivot to change the representation of the
+    parameter \p row such that the element at index \p col of \p row
+    is zero.
+  */
+  // A member of Grid for access to Matrix::rows.
+  static void reduce_parameter_with_line(Grid_Generator& row,
+					 Grid_Generator& pivot,
+					 dimension_type col,
+					 Grid_Generator_System& sys);
+
+  //! Reduce \p row using \p pivot.
+  /*!
+    Use the equality \p pivot to change the representation of the
+    congruence \p row such that element at index \p col of \p row is
+    zero.
+  */
+  // A member of Grid for access to Matrix::rows.
+  static void reduce_congruence_with_equality(Congruence& row,
+					      Congruence& pivot,
+					      dimension_type col,
+					      Congruence_System& sys);
+
+  //! Reduce column \p dim in rows preceding \p pivot_index in \p sys.
+  /*!
+    Only consider from index \p start to index \p end of the row at \p
+    pivot_index.  Flag \p generators indicates whether \p sys is a
+    congruence or generator system.
+  */
+  template <typename M, typename R>
+  static void reduce_reduced(M& sys, dimension_type dim,
+			     dimension_type pivot_index,
+			     dimension_type start, dimension_type end,
+			     Dimension_Kinds& dim_kinds,
+			     bool generators = true);
+
+  //! Multiply the elements of \p dest by \p multiplier.
+  // A member of Grid for access to Matrix::rows and cgs::operator[].
+  static void multiply_grid(const Coefficient& multiplier,
+			    Congruence& cg, Congruence_System& dest,
+			    const dimension_type num_rows,
+			    const dimension_type num_dims);
+
+  //! Multiply the elements of \p dest by \p multiplier.
+  // A member of Grid for access to Grid_Generator::operator[].
+  static void multiply_grid(const Coefficient& multiplier, Grid_Generator& gen,
+			    Grid_Generator_System& dest, const dimension_type num_rows,
+			    const dimension_type num_dims);
+
+  /*! \brief
+    If \p sys is lower triangular return <CODE>true</CODE>, else
+    return <CODE>false</CODE>.
+  */
+  static bool lower_triangular(const Congruence_System& sys,
+			       const Dimension_Kinds& dim_kinds);
+
+  /*! \brief
+    If \p sys is upper triangular return <CODE>true</CODE>, else
+    return <CODE>false</CODE>.
+  */
+  static bool upper_triangular(const Grid_Generator_System& sys,
+			       const Dimension_Kinds& dim_kinds);
+
+#ifndef NDEBUG
+  //! Checks that trailing rows contain only zero terms.
+  /*!
+    If all columns contain zero in the rows of \p system from row
+    index \p first to row index \p last then return <code>true</code>,
+    else return <code>false</code>.  \p row_size gives the number of
+    columns in each row.
+
+    This method is only used in assertions in the simplify methods.
+  */
+  template <typename M, typename R>
+  static bool rows_are_zero(M& system,
+			    dimension_type first,
+			    dimension_type last,
+			    dimension_type row_size);
+#endif
+
+  //@} // Minimization-Related Static Member Functions
+
+  //! \name Exception Throwers
+  //@{
+protected:
+  void throw_runtime_error(const char* method) const;
+  void throw_invalid_argument(const char* method, const char* reason) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const char* other_name,
+				    dimension_type other_dim) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* gr_name,
+				    const Grid& gr) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* e_name,
+				    const Linear_Expression& e) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cg_name,
+				    const Congruence& cg) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* c_name,
+				    const Constraint& c) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* g_name,
+				    const Grid_Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cgs_name,
+				    const Congruence_System& cgs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cs_name,
+				    const Constraint_System& cs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* gs_name,
+				    const Grid_Generator_System& gs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* var_name,
+				    const Variable var) const;
+  void throw_dimension_incompatible(const char* method,
+				    dimension_type required_space_dim) const;
+
+  // Note: it has to be a static method, because it can be called inside
+  // constructors (before actually constructing the grid object).
+  static void throw_space_dimension_overflow(const char* method,
+					     const char* reason);
+
+  void throw_invalid_generator(const char* method,
+			       const char* g_name) const;
+  void throw_invalid_generators(const char* method,
+				const char* gs_name) const;
+  //@} // Exception Throwers
+
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid */
+void swap(Parma_Polyhedra_Library::Grid& x,
+	  Parma_Polyhedra_Library::Grid& y);
+
+} // namespace std
+
+#include "Grid_Status.inlines.hh"
+#include "Grid.inlines.hh"
+#include "Grid.templates.hh"
+
+#endif // !defined(PPL_Grid_defs_hh)
diff --git a/src/Grid.inlines.hh b/src/Grid.inlines.hh
new file mode 100644
index 0000000..8a256b2
--- /dev/null
+++ b/src/Grid.inlines.hh
@@ -0,0 +1,264 @@
+/* Grid class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_inlines_hh
+#define PPL_Grid_inlines_hh 1
+
+#include "Grid_Generator.defs.hh"
+#include "Grid_Generator_System.defs.hh"
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Grid::max_space_dimension() {
+  using std::min;
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return min(std::numeric_limits<dimension_type>::max() - 1,
+	     min(Congruence_System::max_space_dimension(),
+		 Grid_Generator_System::max_space_dimension()
+		 )
+	     );
+}
+
+inline void
+Grid::set_congruences_up_to_date() {
+  status.set_c_up_to_date();
+}
+
+inline
+Grid::Grid(const Congruence_System& ccgs) {
+  if (ccgs.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(ccgs)",
+				   "the space dimension of ccgs "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+  construct(ccgs);
+}
+
+inline
+Grid::Grid(Congruence_System& cgs) {
+  if (cgs.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(cgs)",
+				   "the space dimension of cgs "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+  construct(cgs);
+}
+
+inline
+Grid::Grid(const Grid_Generator_System& gs) {
+  if (gs.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(gs)",
+				   "the space dimension of gs "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+  construct(gs);
+}
+
+inline
+Grid::Grid(Grid_Generator_System& gs) {
+  if (gs.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(gs)",
+				   "the space dimension of gs "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+  construct(gs);
+}
+
+inline
+Grid::~Grid() {
+}
+
+inline memory_size_type
+Grid::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline dimension_type
+Grid::space_dimension() const {
+  return space_dim;
+}
+
+inline void
+Grid::upper_bound_assign(const Grid& y) {
+  join_assign(y);
+}
+
+inline bool
+Grid::upper_bound_assign_if_exact(const Grid& y) {
+  return join_assign_if_exact(y);
+}
+
+inline void
+Grid::difference_assign(const Grid& y) {
+  grid_difference_assign(y);
+}
+
+inline void
+Grid::swap(Grid& y) {
+  std::swap(con_sys, y.con_sys);
+  std::swap(gen_sys, y.gen_sys);
+  std::swap(status, y.status);
+  std::swap(space_dim, y.space_dim);
+  std::swap(dim_kinds, y.dim_kinds);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::Grid */
+inline void
+std::swap(Parma_Polyhedra_Library::Grid& x,
+	  Parma_Polyhedra_Library::Grid& y) {
+  x.swap(y);
+}
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Grid::marked_empty() const {
+  return status.test_empty();
+}
+
+inline bool
+Grid::congruences_are_up_to_date() const {
+  return status.test_c_up_to_date();
+}
+
+inline bool
+Grid::generators_are_up_to_date() const {
+  return status.test_g_up_to_date();
+}
+
+inline bool
+Grid::congruences_are_minimized() const {
+  return status.test_c_minimized();
+}
+
+inline bool
+Grid::generators_are_minimized() const {
+  return status.test_g_minimized();
+}
+
+inline void
+Grid::set_generators_up_to_date() {
+  status.set_g_up_to_date();
+}
+
+inline void
+Grid::set_congruences_minimized() {
+  set_congruences_up_to_date();
+  status.set_c_minimized();
+}
+
+inline void
+Grid::set_generators_minimized() {
+  set_generators_up_to_date();
+  status.set_g_minimized();
+}
+
+inline void
+Grid::clear_empty() {
+  status.reset_empty();
+}
+
+inline void
+Grid::clear_congruences_minimized() {
+  status.reset_c_minimized();
+}
+
+inline void
+Grid::clear_generators_minimized() {
+  status.reset_g_minimized();
+}
+
+inline void
+Grid::clear_congruences_up_to_date() {
+  clear_congruences_minimized();
+  status.reset_c_up_to_date();
+  // Can get rid of con_sys here.
+}
+
+inline void
+Grid::clear_generators_up_to_date() {
+  clear_generators_minimized();
+  status.reset_g_up_to_date();
+  // Can get rid of gen_sys here.
+}
+
+inline bool
+Grid::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, "bounds_from_above(e)");
+}
+
+inline bool
+Grid::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, "bounds_from_below(e)");
+}
+
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+	       Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const {
+  return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum);
+}
+
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+	       Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+	       Grid_Generator& point) const {
+  return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum, &point);
+}
+
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+	       Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const {
+  return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum);
+}
+
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+	       Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+	       Grid_Generator& point) const {
+  return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum, &point);
+}
+
+/*! \relates Grid */
+inline bool
+operator!=(const Grid& x, const Grid& y) {
+  return !(x == y);
+}
+
+inline bool
+Grid::strictly_contains(const Grid& y) const {
+  const Grid& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+inline void
+Grid::topological_closure_assign() {
+  return;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_inlines_hh)
diff --git a/src/Grid.templates.hh b/src/Grid.templates.hh
new file mode 100644
index 0000000..deb8acf
--- /dev/null
+++ b/src/Grid.templates.hh
@@ -0,0 +1,569 @@
+/* Grid class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_templates_hh
+#define PPL_Grid_templates_hh 1
+
+#include "Interval.defs.hh"
+#include "Grid_Generator.defs.hh"
+#include "Grid_Generator_System.defs.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Box>
+Grid::Grid(const Box& box, From_Bounding_Box dummy)
+  : con_sys(),
+    gen_sys(NECESSARILY_CLOSED) {
+  used(dummy);
+
+  if (box.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(box, from_bounding_box)",
+				   "the space dimension of box "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+
+  space_dim = box.space_dimension();
+
+  TEMP_INTEGER(l_n);
+  TEMP_INTEGER(l_d);
+
+  // Check that all bounds are closed.  This must be done before the
+  // empty check below, in case an open bound makes the grid empty.
+  for (dimension_type k = space_dim; k-- > 0; ) {
+    bool closed;
+    // FIXME: Perhaps introduce box::is_bounded_and_closed.
+    if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+    if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+  }
+
+  if (box.is_empty()) {
+    // Empty grid.
+    set_empty();
+    assert(OK());
+    return;
+  }
+
+  if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    // Initialize the space dimension as indicated by the box.
+    con_sys.increase_space_dimension(space_dim);
+    // Add congruences according to `box'.
+    TEMP_INTEGER(u_n);
+    TEMP_INTEGER(u_d);
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      bool closed;
+      // TODO: Consider producing the system(s) in minimized form.
+      // FIXME: Also create the generator system.
+      if (box.get_lower_bound(k, closed, l_n, l_d)) {
+	if (box.get_upper_bound(k, closed, u_n, u_d))
+	  if (l_n * u_d == u_n * l_d) {
+	    // A point interval sets dimension k of every point to a
+	    // single value.
+	    con_sys.insert(l_d * Variable(k) == l_n);
+	    continue;
+	  }
+	// The only valid bounded interval is a point interval.
+	throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+      }
+      else if (box.get_upper_bound(k, closed, u_n, u_d))
+	// An interval can only be a point or the universe.
+	throw_invalid_argument("Grid(box, from_covering_box)",
+			       "box");
+      // A universe interval allows any value in dimension k.
+    }
+    set_congruences_up_to_date();
+    gen_sys.unset_pending_rows();
+    gen_sys.set_sorted(false);
+  }
+
+  assert(OK());
+}
+
+template <typename Box>
+Grid::Grid(const Box& box, From_Covering_Box dummy)
+  : con_sys(),
+    gen_sys(NECESSARILY_CLOSED) {
+  used(dummy);
+
+  if (box.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(box, from_covering_box)",
+				   "the space dimension of box "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+
+  space_dim = box.space_dimension();
+
+  TEMP_INTEGER(l_n);
+  TEMP_INTEGER(l_d);
+
+  // Check that all bounds are closed.  This must be done before the
+  // empty check below, in case an open bound makes the grid empty.
+  for (dimension_type k = space_dim; k-- > 0; ) {
+    bool closed;
+    // FIXME: Perhaps introduce box::is_bounded_and_closed.
+    if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("Grid(box, from_covering_box)", "box");
+    if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("Grid(box, from_covering_box)", "box");
+  }
+
+  if (box.is_empty()) {
+    // Empty grid.
+    set_empty();
+    assert(OK());
+    return;
+  }
+
+  if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    // Initialize the space dimension as indicated by the box.
+    con_sys.increase_space_dimension(space_dim);
+    // Add congruences according to `box'.
+    TEMP_INTEGER(u_n);
+    TEMP_INTEGER(u_d);
+    TEMP_INTEGER(d);
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      bool closed;
+      // TODO: Consider producing the system(s) in minimized form.
+      // FIXME: Also create the generator system.
+      if (box.get_lower_bound(k, closed, l_n, l_d)) {
+	if (box.get_upper_bound(k, closed, u_n, u_d)) {
+	  if (l_n * u_d == u_n * l_d)
+	    // A point interval allows any point along the dimension
+	    // k axis.
+	    continue;
+	  gcd_assign(d, l_d, u_d);
+	  // `d' is the gcd of the divisors.
+	  l_n *= (u_d / d);
+	  d = l_d / d;
+	  // `d' is now the smallest integer expression of the size
+	  // of l_d relative to u_d.  `d * u_d' is the lcm of the
+	  // divisors.
+	  con_sys.insert((d * u_d * Variable(k) %= l_n) / ((u_n * d) - l_n));
+	}
+	else
+	  // An interval bounded only from below produces an
+	  // equality.
+	  con_sys.insert(l_d * Variable(k) == l_n);
+      }
+      else
+	if (box.get_upper_bound(k, closed, u_n, u_d))
+	  // An interval bounded only from above produces an equality.
+	  con_sys.insert(u_d * Variable(k) == u_n);
+	else {
+	  // Any universe interval produces an empty grid.
+	  set_empty();
+	  assert(OK());
+	  return;
+	}
+    }
+    set_congruences_up_to_date();
+    gen_sys.set_sorted(false);
+    gen_sys.unset_pending_rows();
+  }
+
+  assert(OK());
+}
+
+template <typename Box>
+void
+Grid::shrink_bounding_box(Box& box) const {
+  // Dimension-compatibility check.
+  if (space_dim > box.space_dimension())
+    throw_dimension_incompatible("shrink_bounding_box(box)", "box",
+				 box.space_dimension());
+
+  TEMP_INTEGER(l_n);
+  TEMP_INTEGER(l_d);
+
+  // Check that all bounds are closed.
+  for (dimension_type k = space_dim; k-- > 0; ) {
+    bool closed;
+    // FIXME: Perhaps introduce box::is_bounded_and_closed.
+    if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("shrink_bounding_box(box)", "box");
+    if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("shrink_bounding_box(box)", "box");
+  }
+
+  if (marked_empty()) {
+    box.set_empty();
+    return;
+  }
+  if (space_dim == 0)
+    return;
+  if (!generators_are_up_to_date() && !update_generators()) {
+    // Updating found the grid empty.
+    box.set_empty();
+    return;
+  }
+
+  assert(gen_sys.num_generators() > 0);
+
+  dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
+  dimension_type num_rows = gen_sys.num_generators();
+
+  // Create a vector to record which dimensions are bounded.
+  std::vector<bool> bounded_interval(num_dims, true);
+
+  const Grid_Generator *first_point = NULL;
+  // Clear the bound flag in `bounded_interval' for all dimensions in
+  // which a line or sequence of points extends away from a single
+  // value in the dimension.
+  for (dimension_type row = 0; row < num_rows; ++row) {
+    Grid_Generator& gen = const_cast<Grid_Generator&>(gen_sys[row]);
+    if (gen.is_point()) {
+      if (first_point == NULL) {
+	first_point = &gen_sys[row];
+	continue;
+      }
+      const Grid_Generator& point = *first_point;
+      // Convert the point `gen' to a parameter.
+      for (dimension_type dim = 0; dim < num_dims; ++dim)
+	gen[dim] -= point[dim];
+      gen.divisor() = point.divisor();
+    }
+    for (dimension_type col = num_dims; col > 0; )
+      if (gen[col--] != 0)
+	bounded_interval[col] = false;
+  }
+
+  // Attempt to set both bounds of each boundable interval to the
+  // value of the associated coefficient in the point.
+  const Grid_Generator& point = *first_point;
+  TEMP_INTEGER(divisor);
+  TEMP_INTEGER(gcd);
+  TEMP_INTEGER(bound);
+  TEMP_INTEGER(reduced_divisor);
+  divisor = point.divisor();
+  for (dimension_type dim = 0; dim < num_dims; ++dim)
+    if (bounded_interval[dim]) {
+      // Reduce the bound fraction first.
+      gcd_assign(gcd, point[dim+1], divisor);
+      exact_div_assign(bound, point[dim+1], gcd);
+      exact_div_assign(reduced_divisor, divisor, gcd);
+      box.raise_lower_bound(dim, true, bound, reduced_divisor);
+      box.lower_upper_bound(dim, true, bound, reduced_divisor);
+    }
+}
+
+template <typename Box>
+void
+Grid::get_covering_box(Box& box) const {
+  // Dimension-compatibility check.
+  if (space_dim > box.space_dimension())
+    throw_dimension_incompatible("get_covering_box(box)", "box",
+				 box.space_dimension());
+
+  Box new_box(box.space_dimension());
+
+  if (marked_empty()) {
+    box = new_box;
+    box.set_empty();
+    return;
+  }
+  if (space_dim == 0) {
+    return;
+  }
+  if (!generators_are_up_to_date() && !update_generators()) {
+    // Updating found the grid empty.
+    box = new_box;
+    box.set_empty();
+    return;
+  }
+
+  assert(gen_sys.num_generators() > 0);
+
+  dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
+  dimension_type num_rows = gen_sys.num_generators();
+
+  TEMP_INTEGER(divisor);
+  TEMP_INTEGER(gcd);
+  TEMP_INTEGER(bound);
+  TEMP_INTEGER(reduced_divisor);
+
+  if (num_rows > 1) {
+    Row interval_sizes(num_dims, Row::Flags());
+    std::vector<bool> interval_emptiness(num_dims, false);
+
+    // Store in `interval_sizes', for each column (that is, for each
+    // dimension), the GCD of all the values in that column where the
+    // row is of type parameter.
+
+    for (dimension_type dim = num_dims; dim-- > 0; )
+      interval_sizes[dim] = 0;
+    const Grid_Generator *first_point = NULL;
+    for (dimension_type row = 0; row < num_rows; ++row) {
+      Grid_Generator& gen = const_cast<Grid_Generator&>(gen_sys[row]);
+      if (gen.is_line()) {
+	for (dimension_type dim = 0; dim < num_dims; ++dim)
+	  if (!interval_emptiness[dim] && gen[dim+1] != 0) {
+	    // Empty interval, set both bounds for associated
+      	    // dimension to zero.
+	    new_box.lower_upper_bound(dim, true, 0, 1);
+	    new_box.raise_lower_bound(dim, true, 0, 1);
+	    interval_emptiness[dim] = true;
+	  }
+	continue;
+      }
+      if (gen.is_point()) {
+	if (first_point == NULL) {
+	  first_point = &gen_sys[row];
+	  continue;
+	}
+	const Grid_Generator& point = *first_point;
+	// Convert the point `gen' to a parameter.
+	for (dimension_type dim = 0; dim <= num_dims; ++dim)
+	  gen[dim] -= point[dim];
+	gen.divisor() = point.divisor();
+      }
+      for (dimension_type dim = 0; dim < num_dims; ++dim)
+	if (!interval_emptiness[dim])
+	  gcd_assign(interval_sizes[dim], interval_sizes[dim], gen[dim+1]);
+    }
+
+    // For each dimension set the lower bound of the interval to the
+    // grid value closest to the origin, and the upper bound to the
+    // addition of the lower bound and the shortest distance in the
+    // given dimension between any two grid points.
+    const Grid_Generator& point = *first_point;
+    divisor = point.divisor();
+    TEMP_INTEGER(lower_bound);
+    for (dimension_type dim = 0; dim < num_dims; ++dim) {
+      if (interval_emptiness[dim])
+	continue;
+
+      lower_bound = point[dim+1];
+
+      // If the interval size is zero then all points have the same
+      // value in this dimension, so set only the lower bound.
+      if (interval_sizes[dim] != 0) {
+	// Make the lower bound as close as possible to the origin,
+	// leaving the sign the same.
+	lower_bound %= interval_sizes[dim];
+	// Check if the lowest value the other side of the origin is
+	// closer to the origin, prefering the lowest positive if they
+	// are equal.
+	if (lower_bound > 0) {
+	  if (interval_sizes[dim] - lower_bound < lower_bound)
+	    lower_bound -= interval_sizes[dim];
+	}
+	else if (lower_bound < 0
+		 && interval_sizes[dim] + lower_bound < - lower_bound)
+	  lower_bound += interval_sizes[dim];
+
+	// Reduce the bound fraction first.
+	bound = interval_sizes[dim] + lower_bound;
+	gcd_assign(gcd, bound, divisor);
+	exact_div_assign(bound, bound, gcd);
+	exact_div_assign(reduced_divisor, divisor, gcd);
+	new_box.lower_upper_bound(dim, true, bound, reduced_divisor);
+      }
+
+      // Reduce the bound fraction first.
+      gcd_assign(gcd, lower_bound, divisor);
+      exact_div_assign(lower_bound, lower_bound, gcd);
+      exact_div_assign(reduced_divisor, divisor, gcd);
+      new_box.raise_lower_bound(dim, true, lower_bound, reduced_divisor);
+    }
+  }
+  else {
+    const Grid_Generator& point = gen_sys[0];
+    divisor = point.divisor();
+    // The covering box of a single point has only lower bounds.
+    for (dimension_type dim = 0; dim < num_dims; ++dim) {
+      // Reduce the bound fraction first.
+      gcd_assign(gcd, point[dim+1], divisor);
+      exact_div_assign(bound, point[dim+1], gcd);
+      exact_div_assign(reduced_divisor, divisor, gcd);
+      new_box.raise_lower_bound(dim, true, bound, reduced_divisor);
+    }
+  }
+
+  box = new_box;
+}
+
+template <typename Partial_Function>
+void
+Grid::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the grid becomes zero_dimensional.
+    if (marked_empty()
+	|| (!generators_are_up_to_date() && !update_generators())) {
+      // Removing all dimensions from the empty grid.
+      space_dim = 0;
+      set_empty();
+    }
+    else
+      // Removing all dimensions from a non-empty grid.
+      set_zero_dim_univ();
+
+    assert(OK());
+    return;
+  }
+
+  dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+  if (new_space_dimension == space_dim) {
+    // The partial function `pfunc' is indeed total and thus specifies
+    // a permutation, that is, a renaming of the dimensions.  For
+    // maximum efficiency, we will simply permute the columns of the
+    // constraint system and/or the generator system.
+
+    // We first compute suitable permutation cycles for the columns of
+    // the `con_sys' and `gen_sys' matrices.  We will represent them
+    // with a linear array, using 0 as a terminator for each cycle
+    // (notice that the columns with index 0 of `con_sys' and
+    // `gen_sys' represent the inhomogeneous terms, and thus are
+    // unaffected by the permutation of dimensions).
+    // Cycles of length 1 will be omitted so that, in the worst case,
+    // we will have `space_dim' elements organized in `space_dim/2'
+    // cycles, which means we will have at most `space_dim/2'
+    // terminators.
+    std::vector<dimension_type> cycles;
+    cycles.reserve(space_dim + space_dim/2);
+
+    // Used to mark elements as soon as they are inserted in a cycle.
+    std::deque<bool> visited(space_dim);
+
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      if (!visited[i]) {
+	dimension_type j = i;
+	do {
+	  visited[j] = true;
+	  dimension_type k;
+	  (void) pfunc.maps(j, k);
+	  if (k == j)
+	    // Cycle of length 1: skip it.
+	    goto skip;
+
+	  cycles.push_back(j+1);
+	  // Go along the cycle.
+	  j = k;
+	} while (!visited[j]);
+	// End of cycle: mark it.
+	cycles.push_back(0);
+      skip:
+	;
+      }
+    }
+
+    // If `cycles' is empty then `pfunc' is the identity.
+    if (cycles.empty())
+      return;
+
+    // Permute all that is up-to-date.
+    if (congruences_are_up_to_date()) {
+      con_sys.permute_columns(cycles);
+      clear_congruences_minimized();
+    }
+
+    if (generators_are_up_to_date()) {
+      gen_sys.permute_columns(cycles);
+      clear_generators_minimized();
+    }
+
+    assert(OK());
+    return;
+  }
+
+  // If control gets here, then `pfunc' is not a permutation and some
+  // dimensions must be projected away.
+
+  const Grid_Generator_System& old_gensys = generators();
+
+  if (old_gensys.num_generators() == 0) {
+    // The grid is empty.
+    Grid new_grid(new_space_dimension, EMPTY);
+    std::swap(*this, new_grid);
+    assert(OK());
+    return;
+  }
+
+  // Make a local copy of the partial function.
+  std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+  for (dimension_type j = space_dim; j-- > 0; ) {
+    dimension_type pfunc_j;
+    if (pfunc.maps(j, pfunc_j))
+      pfunc_maps[j] = pfunc_j;
+  }
+
+  Grid_Generator_System new_gensys;
+  // Set sortedness, for the assertion met via gs::insert.
+  new_gensys.set_sorted(false);
+  // Get the divisor of the first point.
+  Grid_Generator_System::const_iterator i;
+  Grid_Generator_System::const_iterator old_gensys_end = old_gensys.end();
+  for (i = old_gensys.begin(); i != old_gensys_end; ++i)
+    if (i->is_point())
+      break;
+  assert(i != old_gensys_end);
+  Coefficient_traits::const_reference system_divisor = i->divisor();
+  for (Grid_Generator_System::const_iterator i = old_gensys.begin();
+       i != old_gensys_end;
+       ++i) {
+    const Grid_Generator& old_g = *i;
+    Linear_Expression e(0 * Variable(new_space_dimension-1));
+    bool all_zeroes = true;
+    for (dimension_type j = space_dim; j-- > 0; ) {
+      if (old_g.coefficient(Variable(j)) != 0
+	  && pfunc_maps[j] != not_a_dimension()) {
+	e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j));
+	all_zeroes = false;
+      }
+    }
+    switch (old_g.type()) {
+    case Grid_Generator::LINE:
+      if (!all_zeroes)
+	new_gensys.insert(grid_line(e));
+      break;
+    case Grid_Generator::PARAMETER:
+      if (!all_zeroes)
+	new_gensys.insert(parameter(e, system_divisor));
+      break;
+    case Grid_Generator::POINT:
+      new_gensys.insert(grid_point(e, old_g.divisor()));
+      break;
+    case Grid_Generator::CLOSURE_POINT:
+    default:
+      assert(0);
+    }
+  }
+
+  Grid new_grid(new_gensys);
+  std::swap(*this, new_grid);
+
+  assert(OK(true));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_templates_hh)
diff --git a/src/Grid.types.hh b/src/Grid.types.hh
new file mode 100644
index 0000000..a0ce3d6
--- /dev/null
+++ b/src/Grid.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Grid_types_hh
+#define PPL_Grid_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Grid;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_types_hh)
diff --git a/src/Grid_Certificate.cc b/src/Grid_Certificate.cc
new file mode 100644
index 0000000..a03de1c
--- /dev/null
+++ b/src/Grid_Certificate.cc
@@ -0,0 +1,114 @@
+/* Grid_Certificate class implementation
+   (non-inline member functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid_Certificate.defs.hh"
+
+#include "Grid.defs.hh"
+#include <cassert>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Grid_Certificate::Grid_Certificate(const Grid& cgr)
+  : num_equalities(0), num_proper_congruences(0) {
+  Grid& gr = const_cast<Grid&>(cgr);
+  // As in Polyhedron assume that gr contains at least one point.
+  assert(!gr.marked_empty());
+  if (gr.space_dimension() == 0)
+    return;
+  // One of the systems must be in minimal form.
+  if (gr.congruences_are_up_to_date())
+    if (gr.congruences_are_minimized()) {
+      num_proper_congruences = gr.con_sys.num_proper_congruences();
+      num_equalities = gr.con_sys.num_equalities();
+    }
+    else
+      if (gr.generators_are_up_to_date() && gr.generators_are_minimized()) {
+	// Calculate number of congruences from generators.
+ 	num_proper_congruences
+	  = gr.gen_sys.num_parameters() + 1 /* Integrality cg. */;
+	num_equalities
+	  = gr.space_dimension() + 1 - gr.gen_sys.num_generators();
+      }
+      else {
+	// Minimize gr congruence system.  As in Polyhedron assume
+	// that gr contains at least one point.
+#ifndef NDEBUG
+	Grid::simplify(gr.con_sys, gr.dim_kinds);
+#else
+	bool contains_points = Grid::simplify(gr.con_sys, gr.dim_kinds);
+	used(contains_points);	// Quiet compiler warning.
+	assert(contains_points);
+#endif
+	gr.set_congruences_minimized();
+
+	num_proper_congruences = gr.con_sys.num_proper_congruences();
+	num_equalities = gr.con_sys.num_equalities();
+      }
+  else {
+    if (!gr.generators_are_minimized()) {
+      // Minimize gr generator system.  As in Polyhedron assume that
+      // gr contains at least one point.
+      Grid::simplify(gr.gen_sys, gr.dim_kinds);
+      // If gen_sys contained rows before being reduced, it should
+      // contain at least a single point afterwards.
+      assert(gr.gen_sys.num_generators() > 0);
+      gr.set_generators_minimized();
+    }
+    // Calculate number of congruences from generators.
+    num_proper_congruences
+      = gr.gen_sys.num_parameters() + 1 /* Integrality cg. */;
+    num_equalities
+      = gr.space_dimension() + 1 - gr.gen_sys.num_generators();
+  }
+}
+
+int
+PPL::Grid_Certificate::compare(const Grid_Certificate& y) const {
+  assert(OK() && y.OK());
+  if (num_equalities == y.num_equalities)
+    if (num_proper_congruences == y.num_proper_congruences)
+      return 0;
+    else
+      return num_proper_congruences > y.num_proper_congruences ? 1 : -1;
+  return num_equalities > y.num_equalities ? 1 : -1;
+}
+
+int
+PPL::Grid_Certificate::compare(const Grid& gr) const {
+  Grid_Certificate gc(gr);
+  return compare(gc);
+}
+
+bool
+PPL::Grid_Certificate::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // All tests passed.
+  return true;
+}
diff --git a/src/Grid_Certificate.defs.hh b/src/Grid_Certificate.defs.hh
new file mode 100644
index 0000000..7e9e941
--- /dev/null
+++ b/src/Grid_Certificate.defs.hh
@@ -0,0 +1,103 @@
+/* Grid_Certificate class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Certificate_defs_hh
+#define PPL_Grid_Certificate_defs_hh 1
+
+#include "Grid_Certificate.types.hh"
+
+#include "Grid.types.hh"
+#include "globals.defs.hh"
+#include <cassert>
+#include <vector>
+
+//! The convergence certificate for the Grid widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+
+  \note
+  Each convergence certificate has to be used together with a
+  compatible widening operator. In particular, Grid_Certificate can
+  certify the Grid widening.
+*/
+class Parma_Polyhedra_Library::Grid_Certificate {
+public:
+  //! Default constructor.
+  Grid_Certificate();
+
+  //! Constructor: computes the certificate for \p gr.
+  Grid_Certificate(const Grid& gr);
+
+  //! Copy constructor.
+  Grid_Certificate(const Grid_Certificate& y);
+
+  //! Destructor.
+  ~Grid_Certificate();
+
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+  */
+  int compare(const Grid_Certificate& y) const;
+
+  //! Compares \p *this with the certificate for grid \p gr.
+  int compare(const Grid& gr) const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the certificate for grid
+    \p gr is strictly smaller than \p *this.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool is_stabilizing(const Grid& gr) const;
+
+  //! A total ordering on Grid certificates.
+  /*!
+    This binary predicate defines a total ordering on Grid certificates
+    which is used when storing information about sets of grids.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const Grid_Certificate& x,
+		    const Grid_Certificate& y) const;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Check if gathered information is meaningful.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool OK() const;
+
+private:
+  //! Number of a equalities in a minimized congruence system for the
+  //! grid.
+  dimension_type num_equalities;
+  //! Number of a proper congruences in a minimized congruence system
+  //! for the grid.
+  dimension_type num_proper_congruences;
+};
+
+#include "Grid_Certificate.inlines.hh"
+
+#endif // !defined(PPL_Grid_Certificate_defs_hh)
diff --git a/src/Grid_Certificate.inlines.hh b/src/Grid_Certificate.inlines.hh
new file mode 100644
index 0000000..419834d
--- /dev/null
+++ b/src/Grid_Certificate.inlines.hh
@@ -0,0 +1,60 @@
+/* Grid_Certificate class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Certificate_inlines_hh
+#define PPL_Grid_Certificate_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Certificate::Grid_Certificate()
+  : num_equalities(0), num_proper_congruences(0) {
+  // This is the certificate for a zero-dim universe grid.
+  assert(OK());
+}
+
+inline
+Grid_Certificate::Grid_Certificate(const Grid_Certificate& y)
+  : num_equalities(y.num_equalities),
+    num_proper_congruences(y.num_proper_congruences) {
+}
+
+inline
+Grid_Certificate::~Grid_Certificate() {
+}
+
+inline bool
+Grid_Certificate::is_stabilizing(const Grid& gr) const {
+  return compare(gr) == 1;
+}
+
+inline bool
+Grid_Certificate::Compare::operator()(const Grid_Certificate& x,
+				      const Grid_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this lgo relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_Certificate_inlines_hh)
diff --git a/src/Grid_Certificate.types.hh b/src/Grid_Certificate.types.hh
new file mode 100644
index 0000000..54c2e15
--- /dev/null
+++ b/src/Grid_Certificate.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Grid_Certificate_types_hh
+#define PPL_Grid_Certificate_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Certificate;
+
+}
+
+#endif // !defined(PPL_Grid_Certificate_types_hh)
diff --git a/src/Grid_Generator.cc b/src/Grid_Generator.cc
new file mode 100644
index 0000000..8dcbc3d
--- /dev/null
+++ b/src/Grid_Generator.cc
@@ -0,0 +1,339 @@
+/* Grid_Generator class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid_Generator.defs.hh"
+#include <iostream>
+#include <sstream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid_Generator::throw_invalid_argument(const char* method,
+					    const char* reason) const {
+  std::ostringstream s;
+  s << "PPL::Grid_Generator::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::invalid_argument(s.str());
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::parameter(const Linear_Expression& e,
+			       Coefficient_traits::const_reference d) {
+  if (d == 0)
+    throw std::invalid_argument("PPL::parameter(e, d):\n"
+				"d == 0.");
+  // Add 2 to space dimension to allow for parameter divisor column.
+  Linear_Expression ec(e,
+		       e.space_dimension() + 2);
+  Generator g(ec, Generator::RAY, NECESSARILY_CLOSED);
+  g[0] = 0;
+  // Using this constructor saves reallocation when creating the
+  // coefficients.
+  Grid_Generator gg(g);
+  gg.divisor() = d;
+
+  // If the divisor is negative, negate it and all the coefficients of
+  // the parameter.  This ensures that divisors are always positive.
+  if (d < 0)
+    for (dimension_type i = gg.size(); i-- > 0; )
+      neg_assign(gg[i]);
+
+  return gg;
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::point(const Linear_Expression& e,
+			   Coefficient_traits::const_reference d) {
+  if (d == 0)
+    throw std::invalid_argument("PPL::grid_point(e, d):\n"
+				"d == 0.");
+  // Add 2 to space dimension to allow for parameter divisor column.
+  Linear_Expression ec(e,
+		       e.space_dimension() + 2);
+  Generator g(ec, Generator::POINT, NECESSARILY_CLOSED);
+  g[0] = d;
+  // Using this constructor saves reallocation when creating the
+  // coefficients.
+  Grid_Generator gg(g);
+
+  // If the divisor is negative, negate it and all the coefficients of
+  // the parameter.  This ensures that divisors are always positive.
+  if (d < 0)
+    for (dimension_type i = gg.size(); i-- > 0; )
+      neg_assign(gg[i]);
+
+  // Enforce normalization.
+  gg.normalize();
+  return gg;
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::line(const Linear_Expression& e) {
+  // The origin of the space cannot be a line.
+  if (e.all_homogeneous_terms_are_zero())
+    throw std::invalid_argument("PPL::grid_line(e):\n"
+				"e == 0, but the origin cannot be a line.");
+
+  // Add 2 to space dimension to allow for parameter divisor column.
+  Linear_Expression ec(e,
+		       e.space_dimension() + 2);
+  Generator g(ec, Generator::LINE, NECESSARILY_CLOSED);
+  g[0] = 0;
+  // Using this constructor saves reallocation when creating the
+  // coefficients.
+  Grid_Generator gg(g);
+
+  // Enforce normalization.
+  gg.strong_normalize();
+  return gg;
+}
+
+void
+PPL::Grid_Generator::coefficient_swap(Grid_Generator& y) {
+  // Swap one coefficient at a time into *this.  Doing this instead of
+  // swapping the entire row ensures that the row keeps the same
+  // capacity.
+  if (y.is_line())
+    set_is_line();
+  else
+    set_is_ray_or_point();
+  assert(size() > 0);
+  assert(y.size() > 0);
+  dimension_type sz = size() - 1;
+  dimension_type y_sz = y.size() - 1;
+  // Swap parameter divisors.
+  std::swap(operator[](sz), y[y_sz]);
+  for (dimension_type j = (sz > y_sz ? y_sz : sz); j-- > 0; )
+    std::swap(operator[](j), y[j]);
+}
+
+bool
+PPL::Grid_Generator::is_equivalent_to(const Grid_Generator& y) const {
+  const Grid_Generator& x = *this;
+  dimension_type x_space_dim = x.space_dimension();
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  const Type x_type = x.type();
+  if (x_type != y.type())
+    return false;
+
+  Grid_Generator tem(*this);
+  Grid_Generator tem_y(y);
+  dimension_type& last = x_space_dim;
+  ++last;
+  if (x_type == POINT || x_type == LINE) {
+    tem[last] = 0;
+    tem_y[last] = 0;
+  }
+  // Normalize the copies, including the divisor column.
+  tem.Row::normalize();
+  tem_y.Row::normalize();
+  // Check for equality.
+  while (last-- > 0)
+    if (tem[last] != tem_y[last])
+      return false;
+  return true;
+}
+
+bool
+PPL::Grid_Generator::is_equal_to(const Grid_Generator& y) const {
+  if (type() != y.type())
+    return false;
+  for (dimension_type col = (is_parameter() ? size() : size() - 1);
+       col-- > 0; )
+    if (Generator::operator[](col) != y.Generator::operator[](col))
+      return false;
+  return true;
+}
+
+bool
+PPL::Grid_Generator::all_homogeneous_terms_are_zero() const {
+  // Start at size() - 1 to avoid the extra grid generator column.
+  for (dimension_type i = size() - 1; --i > 0; )
+    if (operator[](i) != 0)
+      return false;
+  return true;
+}
+
+void
+PPL::Grid_Generator::scale_to_divisor(Coefficient_traits::const_reference d) {
+  if (is_parameter_or_point()) {
+    if (d == 0)
+      throw std::invalid_argument("PPL::Grid_Generator::scale_to_divisor(d):\n"
+				  "d == 0.");
+
+    TEMP_INTEGER(factor);
+    factor = d / divisor();
+    divisor() = d;
+    assert(factor > 0);
+    if (factor > 1)
+      for (dimension_type col = size() - 2; col >= 1; --col)
+	Generator::operator[](col) *= factor;
+  }
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g) {
+  bool need_divisor = false;
+  bool extra_parentheses = false;
+  const int num_variables = g.space_dimension();
+  Grid_Generator::Type t = g.type();
+  switch (t) {
+  case Grid_Generator::LINE:
+    s << "l(";
+    break;
+  case Grid_Generator::PARAMETER:
+    s << "r(";
+    if (g[num_variables + 1] == 1)
+      break;
+    goto any_point;
+  case Grid_Generator::POINT:
+    s << "p(";
+    if (g[0] > 1) {
+    any_point:
+      need_divisor = true;
+      int num_non_zero_coefficients = 0;
+      for (int v = 0; v < num_variables; ++v)
+	if (g[v+1] != 0)
+	  if (++num_non_zero_coefficients > 1) {
+	    extra_parentheses = true;
+	    s << "(";
+	    break;
+	  }
+    }
+    break;
+  }
+
+  bool first = true;
+  for (int v = 0; v < num_variables; ++v) {
+    Coefficient gv = g[v+1];
+    if (gv != 0) {
+      if (!first) {
+	if (gv > 0)
+	  s << " + ";
+	else {
+	  s << " - ";
+	  neg_assign(gv);
+	}
+      }
+      else
+	first = false;
+      if (gv == -1)
+	s << "-";
+      else if (gv != 1)
+	s << gv << "*";
+      s << PPL::Variable(v);
+    }
+  }
+  if (first)
+    // A generator in the origin.
+    s << 0;
+  if (extra_parentheses)
+    s << ")";
+  if (need_divisor)
+    s << "/" << g.divisor();
+  s << ")";
+  return s;
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s,
+			      const Grid_Generator::Type& t) {
+  const char* n = 0;
+  switch (t) {
+  case Grid_Generator::LINE:
+    n = "LINE";
+    break;
+  case Grid_Generator::PARAMETER:
+    n = "PARAMETER";
+    break;
+  case Generator::POINT:
+    n = "POINT";
+    break;
+  }
+  s << n;
+  return s;
+}
+
+bool
+PPL::Grid_Generator::OK() const {
+  if (!is_necessarily_closed()) {
+#ifndef NDEBUG
+    std::cerr << "Grid_Generator Generator should be necessarily closed."
+	      << std::endl;
+#endif
+    return false;
+  }
+
+  // Topology consistency check.
+  if (size() < 1) {
+#ifndef NDEBUG
+    std::cerr << "Grid_Generator has fewer coefficients than the minimum "
+	      << "allowed:" << std::endl
+	      << "size is " << size() << ", minimum is 1." << std::endl;
+#endif
+    return false;
+  }
+
+  switch (type()) {
+  case Grid_Generator::LINE:
+    if (operator[](0) != 0) {
+#ifndef NDEBUG
+      std::cerr << "Inhomogeneous terms of lines must be zero!"
+		<< std::endl;
+#endif
+      return false;
+    }
+    break;
+
+  case Grid_Generator::PARAMETER:
+    if (operator[](0) != 0) {
+#ifndef NDEBUG
+      std::cerr << "Inhomogeneous terms of parameters must be zero!"
+		<< std::endl;
+#endif
+      return false;
+    }
+    // Fall through.
+
+  case Grid_Generator::POINT:
+    if (divisor() <= 0) {
+#ifndef NDEBUG
+      std::cerr << "Points and parameters must have positive divisors!"
+		<< std::endl;
+#endif
+      return false;
+    }
+    break;
+
+  }
+
+  // All tests passed.
+  return true;
+}
+
+PPL_OUTPUT_DEFINITIONS(Grid_Generator);
diff --git a/src/Grid_Generator.defs.hh b/src/Grid_Generator.defs.hh
new file mode 100644
index 0000000..33dc032
--- /dev/null
+++ b/src/Grid_Generator.defs.hh
@@ -0,0 +1,493 @@
+/* Grid_Generator class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Generator_defs_hh
+#define PPL_Grid_Generator_defs_hh 1
+
+#include "Grid_Generator.types.hh"
+#include "Grid_Generator_System.defs.hh"
+#include "Generator.defs.hh"
+#include "Grid.types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put these in the namespace here to declare them friend later.
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator& g);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+void swap(Parma_Polyhedra_Library::Grid_Generator& x,
+	  Parma_Polyhedra_Library::Grid_Generator& y);
+
+} // namespace std
+
+//! A line, parameter or point.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Grid_Generator is one of the following:
+
+  - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a parameter
+    \f$\vect{q} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  - a point
+    \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  where \f$n\f$ is the dimension of the space
+  and, for points and parameters, \f$d > 0\f$ is the divisor.
+
+  \par How to build a grid generator.
+  Each type of generator is built by applying the corresponding
+  function (<CODE>line</CODE>, <CODE>parameter</CODE> or <CODE>point</CODE>)
+  to a linear expression;
+  the space dimension of the generator is defined as the space dimension
+  of the corresponding linear expression.
+  Linear expressions used to define a generator should be homogeneous
+  (any constant term will be simply ignored).
+  When defining points and parameters, an optional Coefficient argument
+  can be used as a common <EM>divisor</EM> for all the coefficients
+  occurring in the provided linear expression;
+  the default value for this argument is 1.
+
+  \par
+  In all the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a line with direction \f$x-y-z\f$
+  and having space dimension \f$3\f$:
+  \code
+  Grid_Generator l = grid_line(x - y - z);
+  \endcode
+  By definition, the origin of the space is not a line, so that
+  the following code throws an exception:
+  \code
+  Grid_Generator l = grid_line(0*x);
+  \endcode
+
+  \par Example 2
+  The following code builds the parameter as the vector
+  \f$\vect{p} = (1, -1, -1)^\transpose \in \Rset^3\f$
+  which has the same direction as the line in Example 1:
+  \code
+  Grid_Generator q = parameter(x - y - z);
+  \endcode
+  Note that, unlike lines, for parameters, the length as well
+  as the direction of the vector represented by the code is significant.
+  Thus \p q is \e not the same as the parameter \p q1 defined by
+  \code
+  Grid_Generator q1 = parameter(2x - 2y - 2z);
+  \endcode
+  By definition, the origin of the space is not a parameter, so that
+  the following code throws an exception:
+  \code
+  Grid_Generator q = parameter(0*x);
+  \endcode
+
+  \par Example 3
+  The following code builds the point
+  \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+  \code
+  Grid_Generator p = grid_point(1*x + 0*y + 2*z);
+  \endcode
+  The same effect can be obtained by using the following code:
+  \code
+  Grid_Generator p = grid_point(x + 2*z);
+  \endcode
+  Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+  using either one of the following lines of code:
+  \code
+  Grid_Generator origin3 = grid_point(0*x + 0*y + 0*z);
+  Grid_Generator origin3_alt = grid_point(0*z);
+  \endcode
+  Note however that the following code would have defined
+  a different point, namely \f$\vect{0} \in \Rset^2\f$:
+  \code
+  Grid_Generator origin2 = grid_point(0*y);
+  \endcode
+  The following two lines of code both define the only point
+  having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+  In the second case we exploit the fact that the first argument
+  of the function <CODE>point</CODE> is optional.
+  \code
+  Grid_Generator origin0 = Generator::zero_dim_point();
+  Grid_Generator origin0_alt = grid_point();
+  \endcode
+
+  \par Example 4
+  The point \f$\vect{p}\f$ specified in Example 3 above
+  can also be obtained with the following code,
+  where we provide a non-default value for the second argument
+  of the function <CODE>grid_point</CODE> (the divisor):
+  \code
+  Grid_Generator p = grid_point(2*x + 0*y + 4*z, 2);
+  \endcode
+  Obviously, the divisor can be used to specify
+  points having some non-integer (but rational) coordinates.
+  For instance, the point
+  \f$\vect{p1} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be specified by the following code:
+  \code
+  Grid_Generator p1 = grid_point(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par Example 5
+  Parameters, like points can have a divisor.
+  For instance, the parameter
+  \f$\vect{q} = (1, 0, 2)^\transpose \in \Rset^3\f$ can be defined:
+  \code
+  Grid_Generator q = parameter(2*x + 0*y + 4*z, 2);
+  \endcode
+  Also, the divisor can be used to specify
+  parameters having some non-integer (but rational) coordinates.
+  For instance, the parameter
+  \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be defined:
+  \code
+  Grid_Generator q = parameter(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par How to inspect a grid generator
+  Several methods are provided to examine a grid generator and extract
+  all the encoded information: its space dimension, its type and
+  the value of its integer coefficients and the value of the denominator.
+
+  \par Example 6
+  The following code shows how it is possible to access each single
+  coefficient of a grid generator.
+  If <CODE>g1</CODE> is a point having coordinates
+  \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+  we construct the parameter <CODE>g2</CODE> having coordinates
+  \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+  \code
+  if (g1.is_point()) {
+    cout << "Point g1: " << g1 << endl;
+    Linear_Expression e;
+    for (int i = g1.space_dimension() - 1; i >= 0; i--)
+      e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+    Grid_Generator g2 = parameter(e, g1.divisor());
+    cout << "Parameter g2: " << g2 << endl;
+  }
+  else
+    cout << "Grid Generator g1 is not a point." << endl;
+  \endcode
+  Therefore, for the point
+  \code
+  Grid_Generator g1 = grid_point(2*x - y + 3*z, 2);
+  \endcode
+  we would obtain the following output:
+  \code
+  Point g1: p((2*A - B + 3*C)/2)
+  Parameter g2: parameter((2*A - 2*B + 9*C)/2)
+  \endcode
+  When working with points and parameters, be careful not to confuse
+  the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+  these are equivalent only when the divisor is 1.
+*/
+class Parma_Polyhedra_Library::Grid_Generator : private Generator {
+public:
+  // FIXME: Add wrappers of any other public Generator methods.
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! The generator type.
+  enum Type {
+    /*! The generator is a line. */
+    LINE,
+    /*! The generator is a parameter. */
+    PARAMETER,
+    /*! The generator is a point. */
+    POINT
+  };
+
+  //! Returns the generator type of \p *this.
+  Type type() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+  bool is_line() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a parameter.
+  bool is_parameter() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a line or
+    a parameter.
+  */
+  bool is_line_or_parameter() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+  bool is_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row represents a
+    parameter or a point.
+  */
+  bool is_parameter_or_point() const;
+
+  //! Returns the line of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Grid_Generator line(const Linear_Expression& e);
+
+  //! Returns the parameter at \p e.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Grid_Generator parameter(const Linear_Expression& e
+				  = Linear_Expression::zero(),
+				  Coefficient_traits::const_reference d
+				  = Coefficient_one());
+
+  //! Returns the point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Grid_Generator point(const Linear_Expression& e
+			      = Linear_Expression::zero(),
+			      Coefficient_traits::const_reference d
+			      = Coefficient_one());
+
+  //! Assignment operator.
+  Grid_Generator& operator=(const Grid_Generator& g);
+
+  //! Assignment operator.
+  Grid_Generator& operator=(const Generator& g);
+
+  //! Returns the divisor of \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is a line.
+  */
+  Coefficient_traits::const_reference divisor() const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    equivalent generators.
+
+    Generators having different space dimensions are not equivalent.
+  */
+  bool is_equivalent_to(const Grid_Generator& y) const;
+
+  //! Returns <CODE>true</CODE> if \p *this is exactly equal to \p y.
+  bool is_equal_to(const Grid_Generator& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous terms
+    of \p *this are \f$0\f$.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  /*! \brief
+    Scales \p *this to be represented with a divisor of \p d (if
+    \*this is a parameter or point).
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  void scale_to_divisor(Coefficient_traits::const_reference d);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Grid_Generator& y);
+
+  /*! \brief
+    Swaps \p *this with \p y, leaving \p *this with the original
+    capacity.
+
+    All up to and including the last element of the smaller of \p
+    *this and \p y are swapped.  The parameter divisor element of \p y
+    is swapped with the divisor element of \p *this.
+  */
+  void coefficient_swap(Grid_Generator& y);
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+private:
+  /*! \brief
+    Constructs from polyhedron generator \p g, stealing the underlying
+    data structures from \p g.
+
+    The last column in \p g becomes the parameter divisor column of
+    the new Grid_Generator.
+  */
+  explicit Grid_Generator(Generator g);
+
+  //! Returns the actual size of \p this.
+  dimension_type size() const;
+
+  //! Negates the elements from index \p start to index \p end.
+  void negate(dimension_type start, dimension_type end);
+
+  //! Returns the divisor of \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is a line.
+  */
+  Coefficient& divisor();
+
+  //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
+  void set_is_line();
+
+  //! Sets the Linear_Row kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+  void set_is_parameter_or_point();
+
+  /*! \brief
+    Strong normalization: ensures that different Grid_Generator
+    objects represent different hyperplanes or hyperspaces.
+
+    Applies both Linear_Row::normalize() and Linear_Row::sign_normalize().
+
+    This is simply a wrapper around the Generator::strong_normalize,
+    which means applying it to a parameter may change the parameter.
+  */
+  void strong_normalize();
+
+  //! Returns a reference to the element of the row indexed by \p k.
+  Coefficient& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  Coefficient_traits::const_reference operator[](dimension_type k) const;
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception containing
+    the appropriate error message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* reason) const;
+
+  friend std::ostream&
+  IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g);
+  // FIXME: The following friend declaration is for operator[] and
+  //        divisor() access in Grid::conversion and Grid::simplify.
+  friend class Grid;
+
+  friend class Grid_Generator_System;
+  friend class Grid_Generator_System::const_iterator;
+  friend class Congruence_System;
+  friend class Scalar_Products;
+  friend class Topology_Adjusted_Scalar_Product_Sign;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  Shorthand for Grid_Generator
+  Grid_Generator::line(const Linear_Expression& e).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator grid_line(const Linear_Expression& e);
+
+/*! \brief
+  Shorthand for Grid_Generator
+  Grid_Generator::parameter(const Linear_Expression& e,
+  Coefficient_traits::const_reference d).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator
+parameter(const Linear_Expression& e = Linear_Expression::zero(),
+	  Coefficient_traits::const_reference d = Coefficient_one());
+
+/*! \brief
+  Shorthand for Grid_Generator
+  Grid_Generator::point(const Linear_Expression& e,
+  Coefficient_traits::const_reference d).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator
+grid_point(const Linear_Expression& e = Linear_Expression::zero(),
+	   Coefficient_traits::const_reference d = Coefficient_one());
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator==(const Grid_Generator& x, const Grid_Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator!=(const Grid_Generator& x, const Grid_Generator& y);
+
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Grid_Generator.inlines.hh"
+
+#endif // !defined(PPL_Grid_Generator_defs_hh)
diff --git a/src/Grid_Generator.inlines.hh b/src/Grid_Generator.inlines.hh
new file mode 100644
index 0000000..24de1d9
--- /dev/null
+++ b/src/Grid_Generator.inlines.hh
@@ -0,0 +1,218 @@
+/* Grid Generator class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Generator_inlines_hh
+#define PPL_Grid_Generator_inlines_hh 1
+
+#include "Grid_Generator.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Generator::Grid_Generator(Generator g)
+  : Generator(Generator::point()) {
+  Generator::swap(g);
+}
+
+inline dimension_type
+Grid_Generator::space_dimension() const {
+  return Generator::space_dimension() - 1;
+}
+
+inline Grid_Generator::Type
+Grid_Generator::type() const {
+  switch (Generator::type()) {
+  case Generator::POINT:
+    return POINT;
+  case Generator::RAY:
+    return PARAMETER;
+  case Generator::LINE:
+    return LINE;
+  case Generator::CLOSURE_POINT:
+  default:
+    assert(false);
+    return POINT;
+  }
+}
+
+inline bool
+Grid_Generator::is_line() const {
+  return Generator::is_line();
+}
+
+inline bool
+Grid_Generator::is_parameter() const {
+  return is_ray();
+}
+
+inline bool
+Grid_Generator::is_line_or_parameter() const {
+  return is_line_or_ray();
+}
+
+inline bool
+Grid_Generator::is_point() const {
+  return Generator::is_point();
+}
+
+inline bool
+Grid_Generator::is_parameter_or_point() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline void
+Grid_Generator::set_is_line() {
+  Generator::set_is_line();
+}
+
+inline void
+Grid_Generator::set_is_parameter_or_point() {
+  Generator::set_is_ray_or_point();
+}
+
+inline Grid_Generator&
+Grid_Generator::operator=(const Grid_Generator& g) {
+  Generator::operator=(g);
+  return *this;
+}
+
+inline Grid_Generator&
+Grid_Generator::operator=(const Generator& g) {
+  Generator::operator=(g);
+  return *this;
+}
+
+inline void
+Grid_Generator::negate(dimension_type start, dimension_type end) {
+  while (start <= end)
+    neg_assign(operator[](start++));
+}
+
+inline Coefficient&
+Grid_Generator::divisor() {
+  if (is_line())
+    throw_invalid_argument("divisor()", "*this is a line");
+  if (is_line_or_parameter())
+    return Generator::operator[](size() - 1);
+  return Generator::operator[](0);
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::divisor() const {
+  if (is_line())
+    throw_invalid_argument("divisor()", "*this is a line");
+  if (is_line_or_parameter())
+    return Generator::operator[](size() - 1);
+  return Generator::operator[](0);
+}
+
+inline memory_size_type
+Grid_Generator::total_memory_in_bytes() const {
+  return Generator::total_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator::external_memory_in_bytes() const {
+  return Generator::external_memory_in_bytes();
+}
+
+inline void
+Grid_Generator::strong_normalize() {
+  Generator::strong_normalize();
+}
+
+inline dimension_type
+Grid_Generator::size() const {
+  return Generator::size();
+}
+
+inline void
+Grid_Generator::swap(Grid_Generator& y) {
+  Generator::swap(y);
+}
+
+inline void
+Grid_Generator::ascii_dump(std::ostream& s) const {
+  Generator::ascii_dump(s);
+}
+
+inline bool
+Grid_Generator::ascii_load(std::istream& s) {
+  return Generator::ascii_load(s);
+}
+
+inline Coefficient&
+Grid_Generator::operator[](dimension_type k) {
+  return Generator::operator[](k);
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::operator[](dimension_type k) const {
+  return Generator::operator[](k);
+}
+
+/*! \relates Grid_Generator */
+inline bool
+operator==(const Grid_Generator& x, const Grid_Generator& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Grid_Generator */
+inline bool
+operator!=(const Grid_Generator& x, const Grid_Generator& y) {
+  return !(x == y);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_line(const Linear_Expression& e) {
+  return Grid_Generator::line(e);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e,
+	  Coefficient_traits::const_reference d) {
+  return Grid_Generator::parameter(e, d);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e,
+	   Coefficient_traits::const_reference d) {
+  return Grid_Generator::point(e, d);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+inline void
+swap(Parma_Polyhedra_Library::Grid_Generator& x,
+     Parma_Polyhedra_Library::Grid_Generator& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Grid_Generator_inlines_hh)
diff --git a/src/Grid_Generator.types.hh b/src/Grid_Generator.types.hh
new file mode 100644
index 0000000..62d396c
--- /dev/null
+++ b/src/Grid_Generator.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Grid_Generator_types_hh
+#define PPL_Grid_Generator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator;
+
+}
+
+#endif // !defined(PPL_Grid_Generator_types_hh)
diff --git a/src/Grid_Generator_System.cc b/src/Grid_Generator_System.cc
new file mode 100644
index 0000000..0db91da
--- /dev/null
+++ b/src/Grid_Generator_System.cc
@@ -0,0 +1,429 @@
+/* Grid_Generator_System class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid_Generator_System.defs.hh"
+#include "Grid_Generator_System.inlines.hh"
+#include "Scalar_Products.defs.hh"
+
+#include <cassert>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid_Generator_System::recycling_insert(Grid_Generator_System& gs) {
+  const dimension_type old_num_rows = num_rows();
+  const dimension_type gs_num_rows = gs.num_rows();
+  const dimension_type old_num_cols = num_columns();
+  const dimension_type gs_num_cols = gs.num_columns();
+  if (old_num_cols >= gs_num_cols)
+    add_zero_rows(gs_num_rows,
+		  Linear_Row::Flags(NECESSARILY_CLOSED,
+				    Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+  else {
+    add_zero_rows_and_columns(gs_num_rows,
+			      gs_num_cols - old_num_cols,
+			      Linear_Row::Flags(NECESSARILY_CLOSED,
+						Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+    // Swap the parameter divisor column into the new last column.
+    swap_columns(old_num_cols - 1, num_columns() - 1);
+  }
+  set_index_first_pending_row(old_num_rows + gs_num_rows);
+  // Swap one coefficient at a time into the newly added rows, instead
+  // of swapping each entire row.  This ensures that the added rows
+  // have the same capacities as the existing rows.
+  for (dimension_type i = gs_num_rows; i-- > 0; )
+    operator[](old_num_rows + i).coefficient_swap(gs[i]);
+}
+
+void
+PPL::Grid_Generator_System::recycling_insert(Grid_Generator& g) {
+  dimension_type old_num_rows = num_rows();
+  const dimension_type old_num_cols = num_columns();
+  const dimension_type g_num_cols = g.size();
+  if (old_num_cols >= g_num_cols)
+    add_zero_rows(1,
+		  Linear_Row::Flags(NECESSARILY_CLOSED,
+				    Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+  else {
+    add_zero_rows_and_columns(1,
+			      g_num_cols - old_num_cols,
+			      Linear_Row::Flags(NECESSARILY_CLOSED,
+						Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+    // Swap the parameter divisor column into the new last column.
+    swap_columns(old_num_cols - 1, num_columns() - 1);
+  }
+  set_index_first_pending_row(old_num_rows + 1);
+  // Swap one coefficient at a time into the newly added rows, instead
+  // of swapping each entire row.  This ensures that the added rows
+  // have the same capacities as the existing rows.
+  operator[](old_num_rows).coefficient_swap(g);
+}
+
+void
+PPL::Grid_Generator_System::insert(const Grid_Generator& g) {
+  dimension_type g_space_dim = g.space_dimension();
+
+  if (g.is_parameter())
+    if (g.all_homogeneous_terms_are_zero()) {
+      dimension_type initial_space_dim = space_dimension();
+      if (initial_space_dim < g_space_dim) {
+	// Adjust the space dimension.
+	add_zero_columns(g_space_dim - initial_space_dim);
+	// Swap the parameter divisor column into the new last column.
+	swap_columns(g_space_dim + 1, initial_space_dim + 1);
+	assert(OK());
+      }
+      return;
+    }
+
+  {
+    // This block is a substitute for Generator_System::insert, in
+    // which the single call to Linear_System::insert has been
+    // inlined.
+
+    // We are sure that the matrix has no pending rows
+    // and that the new row is not a pending generator.
+    assert(num_pending_rows() == 0);
+
+    // TODO: Consider whether, if possible, it would be better to wrap
+    //       an NNC Generator, storing the generator divisor in the
+    //       epsilon column.
+
+    // This is a modified copy of Linear_System::insert.  It is here
+    // to force Grid_Generator::OK to be used (to work around the
+    // normalization assertions in Linear_System::OK) and so that the
+    // parameter divisor column can be moved during the insert.
+
+    // The added row must be strongly normalized and have the same
+    // topology as the system.
+    assert(topology() == g.topology());
+    // This method is only used when the system has no pending rows.
+    assert(num_pending_rows() == 0);
+
+    const dimension_type old_num_rows = num_rows();
+    const dimension_type old_num_columns = num_columns();
+    const dimension_type g_size = g.size();
+
+    // Resize the system, if necessary.
+    assert(is_necessarily_closed());
+    if (g_size > old_num_columns) {
+      add_zero_columns(g_size - old_num_columns);
+      if (old_num_rows > 0)
+	// Swap the existing parameter divisor column into the new
+	// last column.
+	swap_columns(old_num_columns - 1, g_size - 1);
+      Matrix::add_row(g);
+    }
+    else if (g_size < old_num_columns)
+      if (old_num_rows == 0)
+	Matrix::add_row(Linear_Row(g, old_num_columns, row_capacity));
+      else {
+	// Create a resized copy of the row (and move the parameter
+	// divisor coefficient to its last position).
+	Linear_Row tmp_row(g, old_num_columns, row_capacity);
+	std::swap(tmp_row[g_size - 1], tmp_row[old_num_columns - 1]);
+	Matrix::add_row(tmp_row);
+      }
+    else
+      // Here r_size == old_num_columns.
+      Matrix::add_row(g);
+
+  } // Generator_System::insert(g) substitute.
+
+  set_index_first_pending_row(num_rows());
+  set_sorted(false);
+
+  assert(OK());
+}
+
+void
+PPL::Grid_Generator_System
+::affine_image(dimension_type v,
+	       const Linear_Expression& expr,
+	       Coefficient_traits::const_reference denominator) {
+  // This is mostly a copy of Generator_System::affine_image.
+
+  Grid_Generator_System& x = *this;
+  // `v' is the index of a column corresponding to a "user" variable
+  // (i.e., it cannot be the inhomogeneous term).
+  assert(v > 0 && v <= x.space_dimension());
+  assert(expr.space_dimension() <= x.space_dimension());
+  assert(denominator > 0);
+
+  const dimension_type n_columns = x.num_columns();
+  const dimension_type n_rows = x.num_rows();
+
+  // Compute the numerator of the affine transformation and assign it
+  // to the column of `*this' indexed by `v'.
+  TEMP_INTEGER(numerator);
+  for (dimension_type i = n_rows; i-- > 0; ) {
+    Grid_Generator& row = x[i];
+    Scalar_Products::assign(numerator, expr, row);
+    std::swap(numerator, row[v]);
+  }
+
+  if (denominator != 1)
+    // Since we want integer elements in the matrix,
+    // we multiply by `denominator' all the columns of `*this'
+    // having an index different from `v'.
+    for (dimension_type i = n_rows; i-- > 0; ) {
+      Grid_Generator& row = x[i];
+      for (dimension_type j = n_columns; j-- > 0; )
+	if (j != v)
+	  row[j] *= denominator;
+    }
+
+  // If the mapping is not invertible we may have transformed valid
+  // lines and rays into the origin of the space.
+  const bool not_invertible = (v > expr.space_dimension() || expr[v] == 0);
+  if (not_invertible)
+    x.remove_invalid_lines_and_rays();
+}
+
+PPL_OUTPUT_DEFINITIONS(Grid_Generator_System);
+
+bool
+PPL::Grid_Generator_System::ascii_load(std::istream& s) {
+  // This is a copy of Generator_System::ascii_load, to force
+  // Grid_Generator_System::OK to be called, in order to work around
+  // the assertions in Linear_System::OK.
+
+  // FIXME: Gridify this.  Add an ascii_dump to match.
+
+  std::string str;
+  if (!(s >> str) || str != "topology")
+    return false;
+  if (!(s >> str))
+    return false;
+  if (str == "NECESSARILY_CLOSED")
+    set_necessarily_closed();
+  else {
+    if (str != "NOT_NECESSARILY_CLOSED")
+      return false;
+    set_not_necessarily_closed();
+  }
+
+  dimension_type nrows;
+  dimension_type ncols;
+  if (!(s >> nrows))
+    return false;
+  if (!(s >> str))
+    return false;
+  if (!(s >> ncols))
+      return false;
+  resize_no_copy(nrows, ncols);
+
+  if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
+    return false;
+  set_sorted(str == "(sorted)");
+  dimension_type index;
+  if (!(s >> str) || str != "index_first_pending")
+    return false;
+  if (!(s >> index))
+    return false;
+  set_index_first_pending_row(index);
+
+  Grid_Generator_System& x = *this;
+  for (dimension_type i = 0; i < x.num_rows(); ++i) {
+    for (dimension_type j = 0; j < x.num_columns(); ++j)
+      if (!(s >> const_cast<Coefficient&>(x[i][j])))
+	return false;
+
+    if (!(s >> str))
+      return false;
+    if (str == "L")
+      x[i].set_is_line();
+    else
+      x[i].set_is_ray_or_point();
+
+    // Checking for equality of actual and declared types.
+    switch (x[i].type()) {
+    case Grid_Generator::LINE:
+      if (str == "L")
+	continue;
+      break;
+    case Grid_Generator::PARAMETER:
+      if (str == "R")
+	continue;
+      break;
+    case Grid_Generator::POINT:
+      if (str == "P")
+	continue;
+      break;
+    }
+    // Reaching this point means that the input was illegal.
+    return false;
+  }
+
+  // Checking for well-formedness.
+
+  assert(OK());
+  return true;
+}
+
+bool
+PPL::Grid_Generator_System::OK() const {
+  if (topology() == NOT_NECESSARILY_CLOSED) {
+#ifndef NDEBUG
+    std::cerr << "Grid_Generator_System is NOT_NECESSARILY_CLOSED"
+	      << std::endl;
+#endif
+    return false;
+  }
+
+  if (is_sorted()) {
+#ifndef NDEBUG
+    std::cerr << "Grid_Generator_System is marked as sorted."
+	      << std::endl;
+#endif
+    return false;
+  }
+
+  // A Generator_System and hence a Grid_Generator_System must be a
+  // valid Linear_System; do not check for strong normalization, since
+  // this will be done when checking each individual generator.
+  if (!Linear_System::OK(false))
+    return false;
+
+  // Checking each generator in the system.
+  const Grid_Generator_System& x = *this;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    if (!x[i].OK())
+      return false;
+
+  // All checks passed.
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator_System */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s,
+			      const Grid_Generator_System& gs) {
+  Grid_Generator_System::const_iterator i = gs.begin();
+  const Grid_Generator_System::const_iterator gs_end = gs.end();
+  if (i == gs_end)
+    return s << "false";
+  while (true) {
+    s << *i++;
+    if (i == gs_end)
+      return s;
+    s << ", ";
+  }
+}
+
+void
+PPL::Grid_Generator_System
+::add_universe_rows_and_columns(dimension_type dims) {
+  assert(num_columns() > 0);
+  dimension_type col = num_columns() - 1;
+  add_zero_rows_and_columns(dims, dims,
+			    Linear_Row::Flags(NECESSARILY_CLOSED,
+					      Linear_Row::LINE_OR_EQUALITY));
+  unset_pending_rows();
+  // Swap the parameter divisor column into the new last column.
+  swap_columns(col, col + dims);
+  // Set the diagonal element of each added rows.
+  dimension_type rows = num_rows();
+  for (dimension_type row = rows - dims; row < rows; ++row, ++col)
+    const_cast<Coefficient&>(operator[](row)[col]) = 1;
+}
+
+void
+PPL::Grid_Generator_System
+::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  // The removal of no dimensions from any system is a no-op.  This
+  // case also captures the only legal removal of dimensions from a
+  // 0-dim system.
+  if (to_be_removed.empty())
+    return;
+
+  // Dimension-compatibility check: the variable having maximum space
+  // dimension is the one occurring last in the set.
+  const dimension_type
+    min_space_dim = to_be_removed.rbegin()->space_dimension();
+  if (space_dimension() < min_space_dim) {
+    std::ostringstream s;
+    s << "PPL::Grid_Generator_System::remove_space_dimensions(vs):\n"
+      << "this->space_dimension() == " << space_dimension()
+      << ", required space dimension == " << min_space_dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+
+  // For each variable to be removed, replace the corresponding column
+  // by shifting left the columns to the right that will be kept.
+  Variables_Set::const_iterator tbr = to_be_removed.begin();
+  Variables_Set::const_iterator tbr_end = to_be_removed.end();
+  dimension_type dst_col = tbr->space_dimension();
+  dimension_type src_col = dst_col + 1;
+  for (++tbr; tbr != tbr_end; ++tbr) {
+    dimension_type tbr_col = tbr->space_dimension();
+    // Move all columns in between to the left.
+    while (src_col < tbr_col)
+      // FIXME: consider whether Linear_System must have a swap_columns()
+      // method.  If the answer is "no", remove this Matrix:: qualification.
+      Matrix::swap_columns(dst_col++, src_col++);
+    ++src_col;
+  }
+  // Move any remaining columns.
+  const dimension_type num_cols = num_columns();
+  while (src_col < num_cols)
+    // FIXME: consider whether Linear_System must have a swap_columns()
+    // method.  If the answer is "no", remove this Matrix:: qualification.
+    Matrix::swap_columns(dst_col++, src_col++);
+
+  // The number of remaining columns is `dst_col'.
+  Matrix::remove_trailing_columns(num_cols - dst_col);
+
+
+
+  remove_invalid_lines_and_rays();
+}
+
+void
+PPL::Grid_Generator_System
+::remove_higher_space_dimensions(dimension_type new_dimension) {
+  dimension_type space_dim = space_dimension();
+  // Dimension-compatibility check.
+  if (new_dimension > space_dim) {
+    std::ostringstream s;
+    s << "PPL::Grid_Generator_System::remove_higher_space_dimensions(n):\n"
+      << "this->space_dimension() == " << space_dim
+      << ", required space dimension == " << new_dimension << ".";
+    throw std::invalid_argument(s.str());
+  }
+
+  // The removal of no dimensions from any system is a no-op.  Note
+  // that this case also captures the only legal removal of dimensions
+  // from a system in a 0-dim space.
+  if (new_dimension == space_dim)
+    return;
+
+  // Swap the parameter divisor column into the column that will
+  // become the last column.
+  swap_columns(new_dimension + 1, space_dim + 1);
+  Matrix::remove_trailing_columns(space_dim - new_dimension);
+  remove_invalid_lines_and_rays();
+  assert(OK());
+}
diff --git a/src/Grid_Generator_System.defs.hh b/src/Grid_Generator_System.defs.hh
new file mode 100644
index 0000000..7496fd6
--- /dev/null
+++ b/src/Grid_Generator_System.defs.hh
@@ -0,0 +1,497 @@
+/* Grid_Generator_System class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Generator_System_defs_hh
+#define PPL_Grid_Generator_System_defs_hh 1
+
+#include "Grid_Generator_System.types.hh"
+#include "Generator_System.defs.hh"
+#include "Grid_Generator.types.hh"
+#include "Variable.defs.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Grid_Generator_System
+  Writes <CODE>false</CODE> if \p gs is empty.  Otherwise, writes on
+  \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Grid_Generator_System& gs);
+
+} // namespace IO_Operators
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Grid_Generator_System */
+bool operator==(const Grid_Generator_System& x,
+		const Grid_Generator_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator_System */
+void swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
+	  Parma_Polyhedra_Library::Grid_Generator_System& y);
+
+} // namespace std
+
+
+//! A system of grid generators.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Grid_Generator_System is a system of
+    grid generators, i.e., a multiset of objects of the class
+    Grid_Generator (lines, parameters and points).
+    When inserting generators in a system, space dimensions are
+    automatically adjusted so that all the generators in the system
+    are defined on the same vector space.
+    A system of grid generators which is meant to define a non-empty
+    grid must include at least one point: the reason is that
+    lines and parameters need a supporting point
+    (lines only specify directions while parameters only
+    specify direction and distance.
+
+    \par
+     In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code defines the line having the same direction
+    as the \f$x\f$ axis (i.e., the first Cartesian axis)
+    in \f$\Rset^2\f$:
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_line(x + 0*y));
+    \endcode
+    As said above, this system of generators corresponds to
+    an empty grid, because the line has no supporting point.
+    To define a system of generators that does correspond to
+    the \f$x\f$ axis, we can add the following code which
+    inserts the origin of the space as a point:
+    \code
+  gs.insert(grid_point(0*x + 0*y));
+    \endcode
+    Since space dimensions are automatically adjusted, the following
+    code obtains the same effect:
+    \code
+  gs.insert(grid_point(0*x));
+    \endcode
+    In contrast, if we had added the following code, we would have
+    defined a line parallel to the \f$x\f$ axis through
+    the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+    \code
+  gs.insert(grid_point(0*x + 1*y));
+    \endcode
+
+    \par Example 2
+    The following code builds a system of generators corresponding
+    to the grid consisting of all the integral points on the \f$x\f$ axes;
+    that is, all points satisfying the congruence relation
+    \f[
+      \bigl\{\,
+        (x, 0)^\transpose \in \Rset^2
+      \bigm|
+        x \pmod{1}\ 0
+      \,\bigr\},
+    \f]
+    \code
+  Grid_Generator_System gs;
+  gs.insert(parameter(x + 0*y));
+  gs.insert(grid_point(0*x + 0*y));
+    \endcode
+
+    \par Example 3
+    The following code builds a system of generators having three points
+    corresponding to a non-relational grid consisting of all points
+    whose coordinates are integer multiple of 3.
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_point(0*x + 3*y));
+  gs.insert(grid_point(3*x + 0*y));
+    \endcode
+
+    \par Example 4
+    By using parameters instead of two of the points we
+    can define the same grid as that defined in the previous example.
+    Note that there has to be at least one point and, for this purpose,
+    any point in the grid could be considered.
+    Thus the following code builds two identical grids from the
+    grid generator systems \p gs and \p gs1.
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(parameter(0*x + 3*y));
+  gs.insert(parameter(3*x + 0*y));
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(3*x + 3*y));
+  gs1.insert(parameter(0*x + 3*y));
+  gs1.insert(parameter(3*x + 0*y));
+    \endcode
+
+    \par Example 5
+    The following code builds a system of generators having one point and
+    a parameter corresponding to all the integral points that
+    lie on \f$x + y = 2\f$ in \f$\Rset^2\f$
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(1*x + 1*y));
+  gs.insert(parameter(1*x - 1*y));
+    \endcode
+
+    \note
+    After inserting a multiset of generators in a grid generator system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> grid generator system
+    will be available, where original generators may have been
+    reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Grid_Generator_System
+  : private Generator_System {
+public:
+  // FIXME: Add wrappers of any other public Generator_System methods.
+
+  //! Default constructor: builds an empty system of generators.
+  Grid_Generator_System();
+
+  //! Ordinary copy-constructor.
+  Grid_Generator_System(const Grid_Generator_System& gs);
+
+  //! Builds an empty system of generators of dimension \p dim.
+  explicit Grid_Generator_System(dimension_type dim);
+
+  //! Builds the singleton system containing only generator \p g.
+  explicit Grid_Generator_System(const Grid_Generator& g);
+
+  //! Returns the maximum space dimension a Grid_Generator_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Removes all the generators from the generator system and sets its
+    space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts into \p *this a copy of the generator \p g, increasing the
+    number of space dimensions if needed.
+
+    If \p g is an all-zero parameter then the only action is to ensure
+    that the space dimension of \p *this is at least the space
+    dimension of \p g.
+  */
+  void insert(const Grid_Generator& g);
+
+  /*! \brief
+    Inserts into \p *this the generator \p g, increasing the number of
+    space dimensions if needed.
+  */
+  void recycling_insert(Grid_Generator& g);
+
+  /*! \brief
+    Inserts into \p *this the generators in \p gs, increasing the
+    number of space dimensions if needed.
+  */
+  void recycling_insert(Grid_Generator_System& gs);
+
+  //! An iterator over a system of grid generators
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each generator contained in an object of Grid_Generator_System.
+
+    \par Example
+    The following code prints the system of generators
+    of the grid <CODE>gr</CODE>:
+    \code
+  const Grid_Generator_System& gs = gr.generators();
+  for (Grid_Generator_System::const_iterator i = gs.begin(),
+        gs_end = gs.end(); i != gs_end; ++i)
+    cout << *i << endl;
+    \endcode
+    The same effect can be obtained more concisely by using
+    more features of the STL:
+    \code
+  const Generator_System& gs = gr.generators();
+  copy(gs.begin(), gs.end(), ostream_iterator<Grid_Generator>(cout, "\n"));
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+			   Grid_Generator,
+			   ptrdiff_t,
+			   const Grid_Generator*,
+			   const Grid_Generator&>,
+      private Generator_System::const_iterator {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Grid_Generator& operator*() const;
+
+    //! Indirect member selector.
+    const Grid_Generator* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Grid_Generator_System;
+
+    //! Copy-constructor from Generator_System::const_iterator.
+    const_iterator(const Generator_System::const_iterator& y);
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first generator, if \p
+    *this is not empty; otherwise, returns the past-the-end
+    const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Grid_Generator_System& y);
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Assigns to a given variable an affine expression.
+  /*!
+    \param v
+    Index of the column to which the affine transformation is assigned;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation;
+
+    We allow affine transformations (see the Section \ref
+    rational_grid_operations)to have rational
+    coefficients. Since the coefficients of linear expressions are
+    integers we also provide an integer \p denominator that will
+    be used as denominator of the affine transformation.  The
+    denominator is required to be a positive integer and its
+    default value is 1.
+
+    The affine transformation assigns to each element of \p v -th
+    column the follow expression:
+    \f[
+      \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+           {\mathrm{denominator}}.
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_image(dimension_type v,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator);
+
+  //! Returns the number of generators in the system.
+  dimension_type num_generators() const;
+
+  //! Returns the number of parameters in the system.
+  dimension_type num_parameters() const;
+
+  //! Returns the number of lines in the system.
+  dimension_type num_lines() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains one or
+    more points.
+  */
+  bool has_points() const;
+
+  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+  bool is_equal_to(const Grid_Generator_System y) const;
+
+  //! Returns the \p k- th generator of the system.
+  Grid_Generator& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k- th generator of the system.
+  const Grid_Generator& operator[](dimension_type k) const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref
+    ascii_dump) and sets \p *this accordingly.  Returns
+    <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Resizes the matrix of generators using the numbers of rows and columns
+    read from \p s, then initializes the coordinates of each generator
+    and its type reading the contents from \p s.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Linear_System and each row in the system is a valid Grid_Generator.
+  */
+  bool OK() const;
+
+  /*! \brief
+    Adds \p dims rows and \p dims columns of zeroes to the matrix,
+    initializing the added rows as in the universe system.
+
+    \param dims
+    The number of rows and columns to be added: must be strictly
+    positive.
+
+    Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims)
+    \times (c+dims)\f$ matrix \f$\bigl({A \atop 0}{0 \atop B}\bigr)\f$
+    where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the
+    form \f$\bigl({1 \atop 0}{0 \atop 1}\bigr)\f$.  The matrix is
+    expanded avoiding reallocation whenever possible.
+  */
+  void add_universe_rows_and_columns(dimension_type dims);
+
+  //! Removes all the specified dimensions from the generator system.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the highest space dimension of the variables in \p
+    to_be_removed is higher than the space dimension of \p *this.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher dimensions of the system so that the resulting
+    system will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if the \p new_dimension is higher than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+private:
+  friend bool operator==(const Grid_Generator_System& x,
+			 const Grid_Generator_System& y);
+  // FIXME: The following friend declaration grants Grid::conversion
+  //        access to Matrix (for the Grid::reduce_reduced call) and
+  //        Matrix::resize_no_copy, and the following methods.
+  friend class Grid;
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  //! Resizes the system without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows of the resized system;
+
+    \param new_n_columns
+    The number of columns of the resized system.
+
+    The system is expanded to the specified dimensions avoiding
+    reallocation whenever possible.
+    The contents of the original system is lost.
+  */
+  void resize_no_copy(dimension_type new_n_rows,
+		      dimension_type new_n_columns);
+
+  /*! \brief
+    Returns the number of columns of the matrix (i.e., the size of the
+    rows).
+  */
+  dimension_type num_columns() const;
+
+  /*! \brief
+    Erases from the matrix all the rows but those having an index less
+    than \p first_to_erase.
+  */
+  void erase_to_end(dimension_type first_to_erase);
+
+  //! Permutes the columns of the matrix.
+  /*
+    \param cycles
+    A vector representing the non-trivial cycles of the permutation
+    according to which the columns must be rearranged.
+
+    The \p cycles vector contains, one after the other, the
+    non-trivial cycles (i.e., the cycles of length greater than one)
+    of a permutation of non-zero column indexes.  Each cycle is
+    terminated by zero.  For example, assuming the matrix has 6
+    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+    turn can be represented by a vector of 6 elements containing 1, 3,
+    6, 0, 2, 4, 0.
+  */
+  void permute_columns(const std::vector<dimension_type>& cycles);
+};
+
+// Grid_Generator_System.inlines.hh is not included here on purpose.
+
+#endif // !defined(PPL_Grid_Generator_System_defs_hh)
diff --git a/src/Grid_Generator_System.inlines.hh b/src/Grid_Generator_System.inlines.hh
new file mode 100644
index 0000000..729ed84
--- /dev/null
+++ b/src/Grid_Generator_System.inlines.hh
@@ -0,0 +1,268 @@
+/* Grid_Generator_System class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Generator_System_inlines_hh
+#define PPL_Grid_Generator_System_inlines_hh 1
+
+#include "Grid_Generator.defs.hh"
+#include "Generator_System.inlines.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Generator_System::Grid_Generator_System()
+  : Generator_System(NECESSARILY_CLOSED) {
+  adjust_topology_and_space_dimension(NECESSARILY_CLOSED, 1);
+  set_sorted(false);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs)
+  : Generator_System(gs) {
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(dimension_type dim)
+  : Generator_System(NECESSARILY_CLOSED) {
+  adjust_topology_and_space_dimension(NECESSARILY_CLOSED, dim + 1);
+  set_sorted(false);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g)
+  : Generator_System(g) {
+  set_sorted(false);
+}
+
+inline dimension_type
+Grid_Generator_System::max_space_dimension() {
+  // Grid generators use an extra column for the parameter divisor.
+  return Generator_System::max_space_dimension() - 1;
+}
+
+inline dimension_type
+Grid_Generator_System::space_dimension() const {
+  assert(Generator_System::space_dimension() > 0);
+  // Grid generators use an extra column for the parameter divisor.
+  return Generator_System::space_dimension() - 1;
+}
+
+inline void
+Grid_Generator_System::clear() {
+  Generator_System::clear();
+  // For grid generators, two extra columns are needed.
+  add_zero_columns(2);
+  set_sorted(false);
+  unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::swap(Grid_Generator_System& y) {
+  Generator_System::swap(y);
+}
+
+inline memory_size_type
+Grid_Generator_System::external_memory_in_bytes() const {
+  return Generator_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator_System::total_memory_in_bytes() const {
+  return Generator_System::total_memory_in_bytes();
+}
+
+inline dimension_type
+Grid_Generator_System::num_generators() const {
+  return Generator_System::num_rows();
+}
+
+inline dimension_type
+Grid_Generator_System::num_parameters() const {
+  return Generator_System::num_rays();
+}
+
+inline dimension_type
+Grid_Generator_System::num_lines() const {
+  return Generator_System::num_lines();
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator()
+  : Generator_System::const_iterator() {
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator(const const_iterator& y)
+  : Generator_System::const_iterator(y) {
+}
+
+inline
+Grid_Generator_System::const_iterator::~const_iterator() {
+}
+
+inline
+Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator=(const const_iterator& y) {
+  return static_cast<Grid_Generator_System::const_iterator&>
+    (Generator_System::const_iterator::operator=(y));
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::const_iterator::operator*() const {
+  return static_cast<const Grid_Generator&>
+    (Generator_System::const_iterator::operator*());
+}
+
+inline const Grid_Generator*
+Grid_Generator_System::const_iterator::operator->() const {
+  return static_cast<const Grid_Generator*>
+    (Generator_System::const_iterator::operator->());
+}
+
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator++() {
+  return static_cast<Grid_Generator_System::const_iterator&>
+    (Generator_System::const_iterator::operator++());
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator==(const const_iterator& y) const {
+  return Generator_System::const_iterator::operator==(y);
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator!=(const const_iterator& y) const {
+  return Generator_System::const_iterator::operator!=(y);
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::begin() const {
+  return static_cast<Grid_Generator_System::const_iterator>
+    (Generator_System::begin());
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::end() const {
+  return static_cast<Grid_Generator_System::const_iterator>
+    (Generator_System::end());
+}
+
+inline
+Grid_Generator_System
+::const_iterator::const_iterator(const Generator_System::const_iterator& y)
+  : Generator_System::const_iterator::const_iterator(y) {
+}
+
+inline bool
+Grid_Generator_System::has_points() const {
+  return Generator_System::has_points();
+}
+
+inline Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) {
+  return static_cast<Grid_Generator&>(Generator_System::operator[](k));
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) const {
+  return static_cast<const Grid_Generator&>(Generator_System::operator[](k));
+}
+
+inline void
+Grid_Generator_System::ascii_dump(std::ostream& s) const {
+  return Generator_System::ascii_dump(s);
+}
+
+inline void
+Grid_Generator_System::set_sorted(bool b) {
+  Generator_System::set_sorted(b);
+}
+
+inline void
+Grid_Generator_System::unset_pending_rows() {
+  Generator_System::unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::set_index_first_pending_row(const dimension_type i) {
+  Generator_System::set_index_first_pending_row(i);
+}
+
+inline void
+Grid_Generator_System::resize_no_copy(const dimension_type new_n_rows,
+				      const dimension_type new_n_columns) {
+  Generator_System::resize_no_copy(new_n_rows, new_n_columns);
+}
+
+inline dimension_type
+Grid_Generator_System::num_columns() const {
+  return Generator_System::num_columns();
+}
+
+inline void
+Grid_Generator_System::erase_to_end(dimension_type first_to_erase) {
+  return Generator_System::erase_to_end(first_to_erase);
+}
+
+inline void
+Grid_Generator_System
+::permute_columns(const std::vector<dimension_type>& cycles) {
+  return Generator_System::permute_columns(cycles);
+}
+
+inline bool
+Grid_Generator_System::is_equal_to(const Grid_Generator_System y) const {
+  return operator==(static_cast<const Generator_System&>(*this),
+		    static_cast<const Generator_System&>(y));
+}
+
+/*! \relates Grid_Generator_System */
+inline bool
+operator==(const Grid_Generator_System& x,
+	   const Grid_Generator_System& y) {
+  return x.is_equal_to(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
+     Parma_Polyhedra_Library::Grid_Generator_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Grid_Generator_System_inlines_hh)
diff --git a/src/Grid_Generator_System.types.hh b/src/Grid_Generator_System.types.hh
new file mode 100644
index 0000000..b0ced3b
--- /dev/null
+++ b/src/Grid_Generator_System.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Grid_Generator_System_types_hh
+#define PPL_Grid_Generator_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator_System;
+
+}
+
+#endif // !defined(PPL_Grid_Generator_System_types_hh)
diff --git a/src/Grid_Status.cc b/src/Grid_Status.cc
new file mode 100644
index 0000000..de09253
--- /dev/null
+++ b/src/Grid_Status.cc
@@ -0,0 +1,245 @@
+/* Grid::Status class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid.defs.hh"
+#include <iostream>
+#include <string>
+#include <cassert>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+// These are the keywords that indicate the individual assertions.
+const char* zero_dim_univ = "ZE";
+const char* empty = "EM";
+const char* consys_min = "CM";
+const char* gensys_min = "GM";
+const char* consys_upd = "CS";
+const char* gensys_upd = "GS";
+const char* satc_upd = "SC";
+const char* satg_upd = "SG";
+const char* consys_pending = "CP";
+const char* gensys_pending = "GP";
+
+/*! \relates Parma_Polyhedra_Library::Grid::Status
+  Reads a keyword and its associated on/off, +/- flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+bool
+get_field(std::istream& s, const char* keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != '+' && str[0] != '-')
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == '+');
+  return true;
+}
+
+} // namespace
+
+void
+PPL::Grid::Status::ascii_dump(std::ostream& s) const {
+  s << (test_zero_dim_univ() ? '+' : '-') << zero_dim_univ << ' '
+    << (test_empty() ? '+' : '-') << empty << ' '
+    << ' '
+    << (test_c_minimized() ? '+' : '-') << consys_min << ' '
+    << (test_g_minimized() ? '+' : '-') << gensys_min << ' '
+    << ' '
+    << (test_c_up_to_date() ? '+' : '-') << consys_upd << ' '
+    << (test_g_up_to_date() ? '+' : '-') << gensys_upd << ' '
+    << ' '
+    << (test_c_pending() ? '+' : '-') << consys_pending << ' '
+    << (test_g_pending() ? '+' : '-') << gensys_pending << ' '
+    << ' '
+    << (test_sat_c_up_to_date() ? '+' : '-') << satc_upd << ' '
+    << (test_sat_g_up_to_date() ? '+' : '-') << satg_upd << ' '
+    << std::endl;
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Grid::Status);
+
+bool
+PPL::Grid::Status::ascii_load(std::istream& s) {
+  bool positive;
+
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
+
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, consys_min, positive))
+    return false;
+  if (positive)
+    set_c_minimized();
+  else
+    reset_c_minimized();
+
+  if (!get_field(s, gensys_min, positive))
+    return false;
+  if (positive)
+    set_g_minimized();
+  else
+    reset_g_minimized();
+
+  if (!get_field(s, consys_upd, positive))
+    return false;
+  if (positive)
+    set_c_up_to_date();
+  else
+    reset_c_up_to_date();
+
+  if (!get_field(s, gensys_upd, positive))
+    return false;
+  if (positive)
+    set_g_up_to_date();
+  else
+    reset_g_up_to_date();
+
+  if (!get_field(s, consys_pending, positive))
+    return false;
+  if (positive)
+    set_c_pending();
+  else
+    reset_c_pending();
+
+  if (!get_field(s, gensys_pending, positive))
+    return false;
+  if (positive)
+    set_g_pending();
+  else
+    reset_g_pending();
+
+  if (!get_field(s, satc_upd, positive))
+    return false;
+  if (positive)
+    set_sat_c_up_to_date();
+  else
+    reset_sat_c_up_to_date();
+
+  if (!get_field(s, satg_upd, positive))
+    return false;
+  if (positive)
+    set_sat_g_up_to_date();
+  else
+    reset_sat_g_up_to_date();
+
+  // Check for well-formedness.
+  assert(OK());
+  return true;
+}
+
+bool
+PPL::Grid::Status::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
+
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+#ifndef NDEBUG
+    cerr << "The empty flag is incompatible with any other one."
+	 << endl << "Flags:" << endl;
+    ascii_dump(cerr);
+#endif
+    return false;
+  }
+
+  if ((test_sat_c_up_to_date() || test_sat_g_up_to_date())
+      && !(test_c_up_to_date() && test_g_up_to_date())) {
+#ifndef NDEBUG
+    cerr <<
+      "If a saturation matrix is up-to-date, congruences and\n"
+      "generators have to be both up-to-date."
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (test_c_minimized() && !test_c_up_to_date()) {
+#ifndef NDEBUG
+    cerr << "If congruences are minimized they must be up-to-date."
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (test_g_minimized() && !test_g_up_to_date()) {
+#ifndef NDEBUG
+    cerr << "If generators are minimized they must be up-to-date."
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (test_c_pending() && test_g_pending()) {
+#ifndef NDEBUG
+    cerr << "There cannot be both pending congruences and pending generators."
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (test_c_pending() || test_g_pending()) {
+    if (!test_c_minimized() || !test_g_minimized()) {
+#ifndef NDEBUG
+    cerr <<
+      "If there are pending congruences or generators, congruences\n"
+      "and generators must be minimized."
+	 << endl;
+#endif
+      return false;
+    }
+
+    if (!test_sat_c_up_to_date() && !test_sat_g_up_to_date()) {
+#ifndef NDEBUG
+    cerr <<
+      "If there are pending congruences or generators, there must\n"
+      "be at least a saturation matrix up-to-date."
+	 << endl;
+#endif
+      return false;
+    }
+  }
+
+  // Any other case is OK.
+  return true;
+}
diff --git a/src/Grid_Status.idefs.hh b/src/Grid_Status.idefs.hh
new file mode 100644
index 0000000..c87ae6a
--- /dev/null
+++ b/src/Grid_Status.idefs.hh
@@ -0,0 +1,167 @@
+/* Grid::Status class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Status_defs_hh
+#define PPL_Grid_Status_defs_hh 1
+
+#ifndef PPL_IN_Grid_CLASS
+#error "Do not include Grid_Status.idefs.hh directly; use Grid.defs.hh instead."
+#endif
+
+//! A conjunctive assertion about a grid.
+/*!
+  The assertions supported that are in use are:
+  - <EM>zero-dim universe</EM>: the grid is the zero-dimension
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the grid is the empty set;
+  - <EM>congruences up-to-date</EM>: the grid is correctly
+    characterized by the attached system of congruences, modulo the
+    processing of pending generators;
+  - <EM>generators up-to-date</EM>: the grid is correctly
+    characterized by the attached system of generators, modulo the
+    processing of pending congruences;
+  - <EM>congruences minimized</EM>: the non-pending part of the system
+    of congruences attached to the grid is in minimal form;
+  - <EM>generators minimized</EM>: the non-pending part of the system
+    of generators attached to the grid is in minimal form.
+
+  Other supported assertions are:
+  - <EM>congruences pending</EM>
+  - <EM>generators pending</EM>
+  - <EM>congruences' saturation matrix up-to-date</EM>
+  - <EM>generators' saturation matrix up-to-date</EM>.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>congruences pending</EM> and <EM>generators pending</EM>
+    are mutually exclusive;
+  - <EM>congruences pending</EM> implies both <EM>congruences minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>generators pending</EM> implies both <EM>congruences minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>congruences minimized</EM> implies <EM>congruences up-to-date</EM>;
+  - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+  - <EM>congruences' saturation matrix up-to-date</EM> implies both
+    <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>;
+  - <EM>generators' saturation matrix up-to-date</EM> implies both
+    <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_c_up_to_date() const;
+  void reset_c_up_to_date();
+  void set_c_up_to_date();
+
+  bool test_g_up_to_date() const;
+  void reset_g_up_to_date();
+  void set_g_up_to_date();
+
+  bool test_c_minimized() const;
+  void reset_c_minimized();
+  void set_c_minimized();
+
+  bool test_g_minimized() const;
+  void reset_g_minimized();
+  void set_g_minimized();
+
+  bool test_sat_c_up_to_date() const;
+  void reset_sat_c_up_to_date();
+  void set_sat_c_up_to_date();
+
+  bool test_sat_g_up_to_date() const;
+  void reset_sat_g_up_to_date();
+  void set_sat_g_up_to_date();
+
+  bool test_c_pending() const;
+  void reset_c_pending();
+  void set_c_pending();
+
+  bool test_g_pending() const;
+  void reset_g_pending();
+  void set_g_pending();
+  //@} // Test, remove or add an individual assertion from the conjunction
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref
+    ascii_dump) and sets \p *this accordingly.  Returns
+    <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bitmasks for the individual assertions
+  //@{
+  static const flags_t ZERO_DIM_UNIV    = 0U;
+  static const flags_t EMPTY            = 1U << 0;
+  static const flags_t C_UP_TO_DATE     = 1U << 1;
+  static const flags_t G_UP_TO_DATE     = 1U << 2;
+  static const flags_t C_MINIMIZED      = 1U << 3;
+  static const flags_t G_MINIMIZED      = 1U << 4;
+  static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+  static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+  static const flags_t CS_PENDING       = 1U << 7;
+  static const flags_t GS_PENDING       = 1U << 8;
+  //@} // Bitmasks for the individual assertions
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bitmask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+#endif // !defined(PPL_Grid_Status_defs_hh)
diff --git a/src/Grid_Status.inlines.hh b/src/Grid_Status.inlines.hh
new file mode 100644
index 0000000..9ee87f9
--- /dev/null
+++ b/src/Grid_Status.inlines.hh
@@ -0,0 +1,216 @@
+/* Grid::Status class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Status_inlines_hh
+#define PPL_Grid_Status_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+inline
+Grid::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+inline bool
+Grid::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+inline bool
+Grid::Status::test_any(flags_t mask) const {
+  return flags & mask;
+}
+
+inline void
+Grid::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+inline void
+Grid::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+inline bool
+Grid::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+inline void
+Grid::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+inline void
+Grid::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+inline bool
+Grid::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+inline void
+Grid::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+inline void
+Grid::Status::set_empty() {
+  flags = EMPTY;
+}
+
+inline bool
+Grid::Status::test_c_up_to_date() const {
+  return test_any(C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_c_up_to_date() {
+  reset(C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_c_up_to_date() {
+  set(C_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_g_up_to_date() const {
+  return test_any(G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_g_up_to_date() {
+  reset(G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_g_up_to_date() {
+  set(G_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_c_minimized() const {
+  return test_any(C_MINIMIZED);
+}
+
+inline void
+Grid::Status::reset_c_minimized() {
+  reset(C_MINIMIZED);
+}
+
+inline void
+Grid::Status::set_c_minimized() {
+  set(C_MINIMIZED);
+}
+
+inline bool
+Grid::Status::test_g_minimized() const {
+  return test_any(G_MINIMIZED);
+}
+
+inline void
+Grid::Status::reset_g_minimized() {
+  reset(G_MINIMIZED);
+}
+
+inline void
+Grid::Status::set_g_minimized() {
+  set(G_MINIMIZED);
+}
+
+
+inline bool
+Grid::Status::test_c_pending() const {
+  return test_any(CS_PENDING);
+}
+
+inline void
+Grid::Status::reset_c_pending() {
+  reset(CS_PENDING);
+}
+
+inline void
+Grid::Status::set_c_pending() {
+  set(CS_PENDING);
+}
+
+inline bool
+Grid::Status::test_g_pending() const {
+  return test_any(GS_PENDING);
+}
+
+inline void
+Grid::Status::reset_g_pending() {
+  reset(GS_PENDING);
+}
+
+inline void
+Grid::Status::set_g_pending() {
+  set(GS_PENDING);
+}
+
+
+inline bool
+Grid::Status::test_sat_c_up_to_date() const {
+  return test_any(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_sat_c_up_to_date() {
+  reset(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_sat_c_up_to_date() {
+  set(SAT_C_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_sat_g_up_to_date() const {
+  return test_any(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_sat_g_up_to_date() {
+  reset(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_sat_g_up_to_date() {
+  set(SAT_G_UP_TO_DATE);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Status_inlines_hh)
diff --git a/src/Grid_chdims.cc b/src/Grid_chdims.cc
new file mode 100644
index 0000000..2d9d2c4
--- /dev/null
+++ b/src/Grid_chdims.cc
@@ -0,0 +1,444 @@
+/* Grid class implementation
+   (non-inline operators that may change the dimension of the vector space).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid.defs.hh"
+#include <cassert>
+
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+// Used for add_space_dimensions_and_embed.
+inline void
+PPL::Grid::add_space_dimensions(Congruence_System& cgs,
+				Grid_Generator_System& gs,
+				const dimension_type dims) {
+  assert(cgs.num_columns() - 1 == gs.space_dimension() + 1);
+  assert(dims > 0);
+
+  dimension_type tem = cgs.num_columns() - 1;
+  cgs.add_zero_columns(dims);
+  // Move the moduli.
+  cgs.swap_columns(tem, tem + dims);
+
+  if (congruences_are_minimized() || generators_are_minimized())
+    dim_kinds.resize(tem + dims, CON_VIRTUAL /* a.k.a. LINE */);
+
+  gs.add_universe_rows_and_columns(dims);
+}
+
+// Used for add_space_dimensions_and_project.
+inline void
+PPL::Grid::add_space_dimensions(Grid_Generator_System& gs,
+				Congruence_System& cgs,
+				const dimension_type dims) {
+  assert(cgs.num_columns() - 1 == gs.space_dimension() + 1);
+  assert(dims > 0);
+
+  cgs.add_unit_rows_and_columns(dims);
+
+  // Add `dims' zero columns onto gs.
+  gs.insert(parameter(0*Variable(space_dim + dims - 1)));
+
+  normalize_divisors(gs);
+
+  dim_kinds.resize(cgs.num_columns() - 1, EQUALITY /* a.k.a GEN_VIRTUAL */);
+}
+
+// (o is a point)       y
+//
+//                      |   |   |
+//                 =>   |   |   |
+//                      |   |   |
+// o---o---o-- x        |---|---|-- x
+// 0 1 2 3 4 5          0 1 2 3 4 5
+//     R^1                   R^2
+void
+PPL::Grid::add_space_dimensions_and_embed(dimension_type m) {
+  if (m == 0)
+    return;
+
+  // The space dimension of the resulting grid must be at most the
+  // maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dimension())
+    throw_space_dimension_overflow("add_space_dimensions_and_embed(m)",
+				   "adding m new space dimensions exceeds "
+				   "the maximum allowed space dimension");
+
+  // Adding dimensions to an empty grid is obtained by adjusting
+  // `space_dim' and clearing `con_sys' (since it can contain the
+  // integrality congruence of the current dimension).
+  if (marked_empty()) {
+    space_dim += m;
+    set_empty();
+    return;
+  }
+
+  // The case of a zero-dimension space grid.
+  if (space_dim == 0) {
+    // Since it is not empty, it has to be the universe grid.
+    assert(status.test_zero_dim_univ());
+    // Swap *this with a newly created `m'-dimensional universe grid.
+    Grid gr(m, UNIVERSE);
+    swap(gr);
+    return;
+  }
+
+  // To embed an n-dimension space grid in a (n+m)-dimension space, we
+  // add `m' zero-columns to the rows in the system of congruences; in
+  // contrast, the system of generators needs additional rows,
+  // corresponding to the vectors of the canonical basis for the added
+  // dimensions. That is, for each new dimension we add the line
+  // having that direction. This is done by invoking the function
+  // add_space_dimensions().
+  if (congruences_are_up_to_date())
+    if (generators_are_up_to_date())
+      // Adds rows and/or columns to both matrices.
+      add_space_dimensions(con_sys, gen_sys, m);
+    else {
+      // Only congruences are up-to-date, so modify only them.
+      con_sys.add_zero_columns(m);
+      dimension_type size = con_sys.num_columns() - 1;
+      // Move the moduli.
+      con_sys.swap_columns(size - m, size);
+      if (congruences_are_minimized())
+	dim_kinds.resize(size, CON_VIRTUAL);
+    }
+  else {
+    // Only generators are up-to-date, so modify only them.
+    assert(generators_are_up_to_date());
+    gen_sys.add_universe_rows_and_columns(m);
+    if (generators_are_minimized())
+      dim_kinds.resize(gen_sys.space_dimension() + 1, LINE);
+  }
+  // Update the space dimension.
+  space_dim += m;
+
+  // Note: we do not check for satisfiability, because the system of
+  // congruences may be unsatisfiable.
+  assert(OK());
+}
+
+// (o is a point)       y
+//
+//
+//                 =>
+//
+// o---o---o-- x        o---o---o-- x
+// 0 1 2 3 4 5          0 1 2 3 4 5
+//     R^1                   R^2
+void
+PPL::Grid::add_space_dimensions_and_project(dimension_type m) {
+  if (m == 0)
+    return;
+
+  // The space dimension of the resulting grid should be at most the
+  // maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dimension())
+    throw_space_dimension_overflow("add_space_dimensions_and_project(m)",
+				   "adding m new space dimensions exceeds "
+				   "the maximum allowed space dimension");
+
+  // Adding dimensions to an empty grid is obtained by merely
+  // adjusting `space_dim'.
+  if (marked_empty()) {
+    space_dim += m;
+    set_empty();
+    return;
+  }
+
+  if (space_dim == 0) {
+    assert(status.test_zero_dim_univ());
+    // Swap *this with a newly created `n'-dimensional universe grid.
+    Grid gr(m, UNIVERSE);
+    swap(gr);
+    return;
+  }
+
+  // To project an n-dimension space grid in a (n+m)-dimension space,
+  // we just add to the system of generators `m' zero-columns; in
+  // contrast, in the system of congruences, new rows are needed in
+  // order to avoid embedding the old grid in the new space.  Thus,
+  // for each new dimensions `x[k]', we add the constraint x[k] = 0;
+  // this is done by invoking the function add_space_dimensions()
+  // giving the system of constraints as the second argument.
+  if (congruences_are_up_to_date())
+    if (generators_are_up_to_date())
+      // Add rows and/or columns to both matrices.
+      add_space_dimensions(gen_sys, con_sys, m);
+    else {
+      // Only congruences are up-to-date so modify only them.
+      con_sys.add_unit_rows_and_columns(m);
+      if (congruences_are_minimized())
+	dim_kinds.resize(con_sys.num_columns() - 1, EQUALITY);
+    }
+  else {
+    // Only generators are up-to-date so modify only them.
+    assert(generators_are_up_to_date());
+
+    // Add m zero columns onto gs.
+    gen_sys.insert(parameter(0*Variable(space_dim + m - 1)));
+
+    normalize_divisors(gen_sys);
+
+    if (generators_are_minimized())
+      dim_kinds.resize(gen_sys.space_dimension() + 1, EQUALITY);
+  }
+  // Now update the space dimension.
+  space_dim += m;
+
+  // Note: we do not check for satisfiability, because the system of
+  // congruences may be unsatisfiable.
+  assert(OK());
+}
+
+void
+PPL::Grid::concatenate_assign(const Grid& y) {
+  // The space dimension of the resulting grid must be at most the
+  // maximum allowed space dimension.
+  if (y.space_dim > max_space_dimension() - space_dimension())
+    throw_space_dimension_overflow("concatenate_assign(y)",
+				   "concatenation exceeds the maximum "
+				   "allowed space dimension");
+
+  const dimension_type added_columns = y.space_dim;
+
+  // If `*this' or `y' are empty grids just adjust the space
+  // dimension.
+  if (marked_empty() || y.marked_empty()) {
+    space_dim += added_columns;
+    set_empty();
+    return;
+  }
+
+  // If `y' is a universe 0-dim grid, the result is `*this'.
+  if (added_columns == 0)
+    return;
+
+  // If `*this' is a universe 0-dim space grid, the result is `y'.
+  if (space_dim == 0) {
+    *this = y;
+    return;
+  }
+
+  congruences_are_up_to_date() || update_congruences();
+
+  con_sys.concatenate(y.congruences());
+
+  space_dim += added_columns;
+
+  clear_congruences_minimized();
+  clear_generators_up_to_date();
+
+  // Check that the system is OK, taking into account that the system
+  // of congruences may now be empty.
+  assert(OK());
+}
+
+void
+PPL::Grid::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  // The removal of no dimensions from any grid is a no-op.  This case
+  // also captures the only legal removal of dimensions from a grid in
+  // a 0-dim space.
+  if (to_be_removed.empty()) {
+    assert(OK());
+    return;
+  }
+
+  // Dimension-compatibility check: the variable having maximum space
+  // dimension is the one occurring last in the set.
+  const dimension_type
+    min_space_dim = to_be_removed.rbegin()->space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+  const dimension_type new_space_dim = space_dim - to_be_removed.size();
+
+  if (marked_empty()
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // Update the space dimension.
+    space_dim = new_space_dim;
+    set_empty();
+    assert(OK());
+    return;
+  }
+
+  // Removing _all_ dimensions from a non-empty grid obtains the
+  // zero-dimensional universe grid.
+  if (new_space_dim == 0) {
+    set_zero_dim_univ();
+    return;
+  }
+
+  // FIXME: Can this operate on the congruence system if only the
+  //        congruence system is up to date?
+
+  gen_sys.remove_space_dimensions(to_be_removed);
+
+  clear_congruences_up_to_date();
+  clear_generators_minimized();
+
+  // Update the space dimension.
+  space_dim = new_space_dim;
+
+  assert(OK(true));
+}
+
+void
+PPL::Grid::remove_higher_space_dimensions(dimension_type new_dimension) {
+  // Dimension-compatibility check.
+  if (new_dimension > space_dim)
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+				 new_dimension);
+
+  // The removal of no dimensions from any grid is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a grid in a 0-dim space.
+  if (new_dimension == space_dim) {
+    assert(OK());
+    return;
+  }
+
+  if (marked_empty()
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // Removing dimensions from the empty grid just updates the space
+    // dimension.
+    space_dim = new_dimension;
+    set_empty();
+    assert(OK());
+    return;
+  }
+
+  if (new_dimension == 0) {
+    // Removing all dimensions from a non-empty grid just returns the
+    // zero-dimensional universe grid.
+    set_zero_dim_univ();
+    return;
+  }
+
+  gen_sys.remove_higher_space_dimensions(new_dimension);
+
+#if 0
+  // FIXME: Perhaps add something like remove_rows_and_columns(dims)
+  //        to Grid_Generator_System for this.
+  if (generators_are_minimized()) {
+    gen_sys.erase_to_end(new_dimension + 1);
+    dim_kinds.erase(dim_kinds.begin() + new_dimension + 1, dim_kinds.end());
+  }
+#else
+  clear_generators_minimized();
+#endif
+
+  clear_congruences_up_to_date();
+
+  // Update the space dimension.
+  space_dim = new_dimension;
+
+  assert(OK(true));
+}
+
+void
+PPL::Grid::expand_space_dimension(Variable var, dimension_type m) {
+  // FIXME: this implementation is _really_ an executable specification.
+
+  // `var' must be one of the dimensions of the vector space.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+  // Adding 0 dimensions leaves the same grid.
+  if (m == 0)
+    return;
+
+  // The resulting space dimension must be at most the maximum.
+  if (m > max_space_dimension() - space_dimension())
+    throw_space_dimension_overflow("expand_space_dimension(v, m)",
+				   "adding m new space dimensions exceeds "
+				   "the maximum allowed space dimension");
+
+  // Save the number of dimensions before adding new ones.
+  dimension_type old_dim = space_dim;
+
+  // Add the required new dimensions.
+  add_space_dimensions_and_embed(m);
+
+  const dimension_type src_d = var.id();
+  const Congruence_System& cgs = congruences();
+  Congruence_System new_congruences;
+  for (Congruence_System::const_iterator i = cgs.begin(),
+	 cgs_end = cgs.end(); i != cgs_end; ++i) {
+    const Congruence& cg = *i;
+
+    // Only consider congruences that constrain `var'.
+    if (cg.coefficient(var) == 0)
+      continue;
+
+    // Each relevant congruence results in `m' new congruences.
+    for (dimension_type dst_d = old_dim; dst_d < old_dim+m; ++dst_d) {
+      Linear_Expression e;
+      for (dimension_type j = old_dim; j-- > 0; )
+	e +=
+	  cg.coefficient(Variable(j))
+	  * (j == src_d ? Variable(dst_d) : Variable(j));
+      new_congruences.insert_verbatim((e + cg.inhomogeneous_term() %= 0)
+				      / cg.modulus());
+    }
+  }
+  add_congruences(new_congruences);
+  assert(OK());
+}
+
+void
+PPL::Grid::fold_space_dimensions(const Variables_Set& to_be_folded,
+				 Variable var) {
+  // FIXME: this implementation is _really_ an executable specification.
+
+  // `var' should be one of the dimensions of the grid.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var);
+
+  // Folding only has effect if dimensions are given.
+  if (to_be_folded.empty())
+    return;
+
+  // All variables in `to_be_folded' must be dimensions of the grid.
+  if (to_be_folded.rbegin()->space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, v)",
+				 "*tbf.rbegin()",
+				 *to_be_folded.rbegin());
+
+  // Moreover, `var' must not occur in `to_be_folded'.
+  if (to_be_folded.find(var) != to_be_folded.end())
+    throw_invalid_argument("fold_space_dimensions(tbf, v)",
+			   "v should not occur in tbf");
+
+  for (Variables_Set::const_iterator i = to_be_folded.begin(),
+	 tbf_end = to_be_folded.end(); i != tbf_end; ++i) {
+    Grid copy = *this;
+    copy.affine_image(var, Linear_Expression(*i));
+    join_assign(copy);
+  }
+  remove_space_dimensions(to_be_folded);
+  assert(OK());
+}
diff --git a/src/Grid_conversion.cc b/src/Grid_conversion.cc
new file mode 100644
index 0000000..6137362
--- /dev/null
+++ b/src/Grid_conversion.cc
@@ -0,0 +1,559 @@
+/* Grid class implementation: conversion().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid.defs.hh"
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+#define TRACE(x)
+//#define TRACE(x) x
+
+TRACE(using std::endl);
+TRACE(using std::cerr);
+
+// X 0 0 0  upside down, so  x x x X
+// x X 0 0                   x x X 0
+// x x X 0                   x X 0 0
+// x x x X                   X 0 0 0
+//
+// Where X is greater than zero and x is an integer.
+bool
+Grid::lower_triangular(const Congruence_System& sys,
+		       const Dimension_Kinds& dim_kinds) {
+  dimension_type num_cols = sys.num_columns() - 1;
+  dimension_type row = sys.num_rows();
+
+  // Check for easy square failure case.
+  if (row > num_cols)
+    return false;
+
+  // Check triangularity.
+  for (dimension_type dim = 0; dim < num_cols; ++dim) {
+    if (dim_kinds[dim] == CON_VIRTUAL)
+      continue;
+    const Congruence& cg = sys[--row];
+    // Check diagonal.
+    if (cg[dim] <= 0)
+      return false;
+    // Check elements following diagonal.
+    dimension_type col = dim;
+    while (++col < num_cols)
+      if (cg[col] != 0)
+	return false;
+  }
+
+  // Check squareness.
+  return row == 0;
+}
+
+// X x x x
+// 0 X x x
+// 0 0 X x
+// 0 0 0 X
+//
+// Where X is greater than zero and x is an integer.
+bool
+Grid::upper_triangular(const Grid_Generator_System& sys,
+		       const Dimension_Kinds& dim_kinds) {
+  dimension_type num_cols = sys.space_dimension() + 1;
+  dimension_type row = sys.num_generators();
+
+  // Check for easy square fail case.
+  if (row > num_cols)
+    return false;
+
+  // Check triangularity.
+  while (num_cols > 0) {
+    --num_cols;
+    if (dim_kinds[num_cols] == GEN_VIRTUAL)
+      continue;
+    const Grid_Generator& gen = sys[--row];
+    // Check diagonal.
+    if (gen[num_cols] <= 0)
+      return false;
+    // Check elements preceding diagonal.
+    dimension_type col = num_cols;
+    while (col-- > 0)
+      if (gen[col] != 0)
+	return false;
+  }
+
+  // Check for squareness.
+  return num_cols == row;
+}
+
+inline void
+Grid::multiply_grid(const Coefficient& multiplier, Grid_Generator& gen,
+		    Grid_Generator_System& dest, const dimension_type num_rows,
+		    const dimension_type num_dims) {
+  if (multiplier == 1)
+    return;
+
+  if (gen.is_line())
+    // Multiply every element of the line.
+    for (dimension_type column = 0; column < num_dims; ++column)
+      gen[column] *= multiplier;
+  else {
+    assert(gen.is_parameter_or_point());
+    // Multiply every element of every parameter.
+    for (dimension_type index = 0; index < num_rows; ++index) {
+      Grid_Generator& generator = dest[index];
+      if (generator.is_parameter_or_point())
+	for (dimension_type column = 0; column < num_dims; ++column)
+	  generator[column] *= multiplier;
+    }
+  }
+}
+
+inline void
+Grid::multiply_grid(const Coefficient& multiplier, Congruence& cg,
+		    Congruence_System& dest, const dimension_type num_rows,
+		    const dimension_type num_dims) {
+  if (multiplier == 1)
+    return;
+
+  if (cg.is_proper_congruence())
+    // Multiply every element of every congruence.
+    for (dimension_type index = 0; index < num_rows; ++index) {
+      Congruence& congruence = dest[index];
+      if (congruence.is_proper_congruence())
+	for (dimension_type column = 0; column < num_dims; ++column)
+	  congruence[column] *= multiplier;
+    }
+  else {
+    assert(cg.is_equality());
+    // Multiply every element of the equality.
+    for (dimension_type column = 0; column < num_dims; ++column)
+      cg[column] *= multiplier;
+  }
+}
+
+// TODO: Rename the next two methods to convert and this file
+//       Grid_convert.cc (and equivalently for Polyhedron) to use
+//       verbs consistently as function and method names.
+
+void
+Grid::conversion(Grid_Generator_System& source, Congruence_System& dest,
+		 Dimension_Kinds& dim_kinds) {
+  TRACE(cerr << "============= convert gs to cgs" << endl);
+  TRACE(cerr << "source:" << endl);
+  TRACE(source.ascii_dump(cerr));
+  TRACE(cerr << "dest:" << endl);
+  TRACE(dest.ascii_dump(cerr));
+  trace_dim_kinds("gs to cgs ", dim_kinds);
+
+  // Quite similar to the congruence to generator version below.
+  // Changes here may be needed there too.
+
+  assert(upper_triangular(source, dim_kinds));
+
+  // Initialise matrix row number counters and compute the LCM of the
+  // diagonal entries of the parameters in `source'.
+  //
+  // The top-down order of the parameter system rows corresponds to
+  // the left-right order of the dimensions.
+  dimension_type source_num_rows = 0;
+  // The congruence system rows have a bottom-up ordering.
+  dimension_type dest_num_rows = 0;
+  TEMP_INTEGER(diagonal_lcm);
+  diagonal_lcm = 1;
+  const dimension_type dims = source.space_dimension() + 1;
+  for (dimension_type dim = 0; dim < dims; ++dim)
+    if (dim_kinds[dim] == GEN_VIRTUAL)
+      // Virtual generators map to equalities.
+      ++dest_num_rows;
+    else {
+      if (dim_kinds[dim] == PARAMETER) {
+	// Dimension `dim' has a parameter row at `source_num_rows' in
+	// `source', so include in `diagonal_lcm' the `dim'th element
+	// of that row.
+	lcm_assign(diagonal_lcm, diagonal_lcm, source[source_num_rows][dim]);
+	// Parameters map to proper congruences.
+	++dest_num_rows;
+      }
+      // Lines map to virtual congruences.
+      ++source_num_rows;
+    }
+  TRACE(cerr << "diagonal_lcm: " << diagonal_lcm << endl);
+  TRACE(cerr << "source_num_rows: " << source_num_rows << endl);
+  TRACE(cerr << "dest_num_rows: " << dest_num_rows << endl);
+
+  // `source' must be regular.
+  if (diagonal_lcm == 0)
+    throw std::runtime_error("PPL internal error: Grid::conversion:"
+			     " source matrix is singular.");
+
+  dest.resize_no_copy(dest_num_rows, dims + 1 /* moduli */);
+
+  // In `dest' initialize row types and elements, including setting
+  // the diagonal elements to the inverse ratio of the `source'
+  // diagonal elements.
+  dimension_type source_index = 0, dest_index = dest_num_rows - 1;
+  for (dimension_type dim = 0; dim < dims; ++dim) {
+    TRACE(cerr << "init dim " << dim << endl);
+    if (dim_kinds[dim] == LINE) {
+      TRACE(cerr << "  line" << endl);
+      ++source_index;
+    }
+    else {
+      Congruence& cg = dest[dest_index];
+      for (dimension_type j = 0; j < dim; j++)
+	cg[j] = 0;
+      for (dimension_type j = dim + 1; j < dims; j++)
+	cg[j] = 0;
+
+      if (dim_kinds[dim] == GEN_VIRTUAL) {
+	TRACE(cerr << "  gen_virtual" << endl);
+	cg[dims] = 0;		// An equality.
+	cg[dim] = 1;
+      }
+      else {
+	assert(dim_kinds[dim] == PARAMETER);
+	TRACE(cerr << "  parameter" << endl);
+	cg[dims] = 1;		// A proper congruence.
+	cg[dim] = diagonal_lcm / source[source_index][dim];
+	++source_index;
+      }
+      --dest_index;
+    }
+  }
+
+  assert(lower_triangular(dest, dim_kinds));
+
+  TRACE(cerr << "dest after init:" << endl);
+  TRACE(dest.ascii_dump(cerr));
+
+  // Convert.
+  //
+  // `source_index' and `dest_index' hold the positions of pivot rows
+  // in `source' and `dest'.  The order of the rows in `dest' is the
+  // reverse of the order in `source', so the rows are iterated from
+  // last to first (index 0) in `source' and from first to last in
+  // `dest'.
+  source_index = source_num_rows;
+  dest_index = 0;
+
+  for (dimension_type dim = dims; dim-- > 0; ) {
+    TRACE(cerr << "dim: " << dim << endl);
+
+    if (dim_kinds[dim] != GEN_VIRTUAL) {
+      --source_index;
+      TEMP_INTEGER(source_dim);
+      source_dim = source[source_index][dim];
+
+      // In the rows in `dest' above `dest_index' divide each element
+      // at column `dim' by `source_dim'.
+      for (dimension_type row = dest_index; row-- > 0; ) {
+	TRACE(cerr << "  row " << row << endl);
+	TRACE(dest.ascii_dump(cerr));
+
+	Congruence& cg = dest[row];
+
+	// Multiply the representation of `dest' such that entry `dim'
+        // of `g' is a multiple of `source_dim'.  This ensures that
+        // the result of the division that follows is a whole number.
+	TEMP_INTEGER(multiplier);
+	gcd_assign(multiplier, cg[dim], source_dim);
+	multiplier = source_dim / multiplier;
+	multiply_grid(multiplier, cg, dest, dest_num_rows, dims);
+
+	cg[dim] /= source_dim;
+      }
+      TRACE(cerr << "dest after dividing grid:" << endl);
+      TRACE(dest.ascii_dump(cerr));
+    }
+
+    // Invert and transpose the source row at `source_index' into the
+    // destination row at `dest_index'.
+    //
+    // Consider each dimension `dim_prec' that precedes `dim', as the
+    // rows in `dest' that follow `dim_index' have zeroes at index
+    // `dim'.
+    dimension_type tem_source_index = source_index;
+    if (dim_kinds[dim] != LINE)
+      ++dest_index;
+    for (dimension_type dim_prec = dim; dim_prec-- > 0; ) {
+      TRACE(cerr << "  dim_prec: " << dim_prec);
+      TRACE(cerr << "  dest_index: " << dest_index);
+      TRACE(cerr << "  tem_source_index: " << tem_source_index << endl);
+      if (dim_kinds[dim_prec] != GEN_VIRTUAL) {
+	--tem_source_index;
+	TEMP_INTEGER(source_dim);
+	source_dim = source[tem_source_index][dim];
+	TRACE(cerr << "  rows:" << endl);
+	// In order to compute the transpose of the inverse of
+	// `source', subtract source[tem_source_index][dim] times the
+	// column vector in `dest' at `dim' from the column vector in
+	// `dest' at `dim_prec'.
+	//
+	// I.e., for each row `dest_index' in `dest' that is above the
+	// row `dest_index', subtract dest[tem_source_index][dim]
+	// times the entry `dim' from the entry at `dim_prec'.
+	for (dimension_type row = dest_index; row-- > 0; ) {
+	  assert(row < dest_num_rows);
+	  TRACE(cerr << "       " << row << endl);
+	  Congruence& cg = dest[row];
+	  cg[dim_prec] -= source_dim * cg[dim];
+	}
+      }
+    }
+
+    TRACE(cerr << "dest after processing preceding rows:" << endl);
+    TRACE(dest.ascii_dump(cerr));
+  }
+  // Set the modulus in every congruence.
+  Coefficient_traits::const_reference modulus = dest[dest_num_rows - 1][0];
+  for (dimension_type row = 0; row < dest_num_rows; ++row) {
+    Congruence& cg = dest[row];
+    if (cg[dims] > 0)
+      // `cg' is a proper congruence.
+      cg[dims] = modulus;
+  }
+  TRACE(cerr << "dest after setting moduli:" << endl);
+  TRACE(dest.ascii_dump(cerr));
+
+  assert(lower_triangular(dest, dim_kinds));
+
+#ifdef STRONG_REDUCTION
+  for (dimension_type dim = dims, i = 0; dim-- > 0; )
+    if (dim_kinds[dim] != CON_VIRTUAL)
+      // Factor the "diagonal" congruence out of the preceding rows.
+      reduce_reduced<Congruence_System, Congruence>
+	(dest, dim, i++, 0, dim, dim_kinds, false);
+  TRACE(cerr << "dest after strong reduction:" << endl);
+  TRACE(dest.ascii_dump(cerr));
+#endif
+
+  trace_dim_kinds("gs to cgs end ", dim_kinds);
+
+  TRACE(cerr << "------------------- gs to cgs conversion done." << endl);
+}
+
+void
+Grid::conversion(Congruence_System& source, Grid_Generator_System& dest,
+		 Dimension_Kinds& dim_kinds) {
+  TRACE(cerr << "============= convert cgs to gs" << endl);
+  TRACE(cerr << "source:" << endl);
+  TRACE(source.ascii_dump(cerr));
+  TRACE(cerr << "dest:" << endl);
+  TRACE(dest.ascii_dump(cerr));
+  trace_dim_kinds("cgs to gs ", dim_kinds);
+
+  // Quite similar to the generator to congruence version above.
+  // Changes here may be needed there too.
+
+  assert(lower_triangular(source, dim_kinds));
+
+  // Initialise matrix row number counters and compute the LCM of the
+  // diagonal entries of the proper congruences in `source'.
+  dimension_type source_num_rows = 0, dest_num_rows = 0;
+  TEMP_INTEGER(diagonal_lcm);
+  diagonal_lcm = 1;
+  dimension_type dims = source.num_columns() - 1;
+  for (dimension_type dim = dims; dim-- > 0; )
+    if (dim_kinds[dim] == CON_VIRTUAL)
+      // Virtual congruences map to lines.
+      ++dest_num_rows;
+    else {
+      if (dim_kinds[dim] == PROPER_CONGRUENCE) {
+	// Dimension `dim' has a proper congruence row at
+	// `source_num_rows' in `source', so include in `diagonal_lcm'
+	// the `dim'th element of that row.
+	lcm_assign(diagonal_lcm, diagonal_lcm, source[source_num_rows][dim]);
+	// Proper congruences map to parameters.
+	++dest_num_rows;
+      }
+      // Equalities map to virtual generators.
+      ++source_num_rows;
+    }
+  TRACE(cerr << "diagonal_lcm: " << diagonal_lcm << endl);
+  TRACE(cerr << "source_num_rows: " << source_num_rows << endl);
+  TRACE(cerr << "dest_num_rows: " << dest_num_rows << endl);
+
+  // `source' must be regular.
+  if (diagonal_lcm == 0)
+    throw std::runtime_error("PPL internal error: Grid::conversion:"
+			     " source matrix is singular.");
+
+  dest.set_index_first_pending_row(dest_num_rows);
+  dest.resize_no_copy(dest_num_rows, dims + 1 /* parameter divisor */);
+
+  // In `dest' initialize row types and elements, including setting
+  // the diagonal elements to the inverse ratio of the `source'
+  // diagonal elements.
+  //
+  // The top-down order of the congruence system rows corresponds to
+  // the right-left order of the dimensions.
+  dimension_type source_index = 0;
+  // The generator system has a bottom-up ordering.
+  dimension_type dest_index = dest_num_rows - 1;
+  for (dimension_type dim = dims; dim-- > 0; ) {
+    TRACE(cerr << "init dim " << dim << endl);
+    if (dim_kinds[dim] == EQUALITY) {
+      TRACE(cerr << "  equality" << endl);
+      ++source_index;
+    }
+    else {
+      Grid_Generator& g = dest[dest_index];
+      for (dimension_type j = 0; j < dim; ++j)
+	g[j] = 0;
+      for (dimension_type j = dim + 1; j < dims; ++j)
+	g[j] = 0;
+
+      if (dim_kinds[dim] == CON_VIRTUAL) {
+	TRACE(cerr << "  con_virtual" << endl);
+	g.set_is_line();
+	g[dim] = 1;
+      }
+      else {
+	assert(dim_kinds[dim] == PROPER_CONGRUENCE);
+	TRACE(cerr << "  proper_congruence" << endl);
+	g.set_is_parameter_or_point();
+	g[dim] = diagonal_lcm / source[source_index][dim];
+	++source_index;
+      }
+      --dest_index;
+    }
+  }
+
+  assert(upper_triangular(dest, dim_kinds));
+
+  TRACE(cerr << "dest after init:" << endl);
+  TRACE(dest.ascii_dump(cerr));
+
+  // Convert.
+  //
+  // `source_index' and `dest_index' hold the positions of pivot rows
+  // in `source' and `dest'.  The order of the rows in `dest' is the
+  // reverse of the order in `source', so the rows are iterated from
+  // last to first (index 0) in `source' and from first to last in
+  // `dest'.
+  source_index = source_num_rows;
+  dest_index = 0;
+
+  for (dimension_type dim = 0; dim < dims; ++dim) {
+    TRACE(cerr << "dim: " << dim << endl);
+
+    if (dim_kinds[dim] != CON_VIRTUAL) {
+      --source_index;
+      TEMP_INTEGER(source_dim);
+      source_dim = source[source_index][dim];
+
+      // In the rows in `dest' above `dest_index' divide each element
+      // at column `dim' by `source_dim'.
+      for (dimension_type row = dest_index; row-- > 0; ) {
+	TRACE(cerr << "  row " << row << endl);
+	TRACE(dest.ascii_dump(cerr));
+
+	Grid_Generator& g = dest[row];
+
+	// Multiply the representation of `dest' such that entry `dim'
+        // of `g' is a multiple of `source_dim'.  This ensures that
+        // the result of the division that follows is a whole number.
+	TEMP_INTEGER(red_source_dim);
+	gcd_assign(red_source_dim, g[dim], source_dim);
+	red_source_dim = source_dim / red_source_dim;
+	multiply_grid(red_source_dim, g, dest, dest_num_rows,
+		      dims + 1 /* parameter divisor */);
+
+	g[dim] /= source_dim;
+      }
+      TRACE(cerr << "dest after dividing grid:" << endl);
+      TRACE(dest.ascii_dump(cerr));
+    }
+
+    // Invert and transpose the source row at `source_index' into the
+    // destination row at `dest_index'.
+    //
+    // Consider each dimension `dim_fol' that follows `dim', as the
+    // rows in `dest' that follow row `dest_index' are zero at index
+    // `dim'.
+    dimension_type tem_source_index = source_index;
+    if (dim_kinds[dim] != EQUALITY)
+      ++dest_index;
+    for (dimension_type dim_fol = dim + 1; dim_fol < dims; ++dim_fol) {
+      TRACE(cerr << "  dim_fol: " << dim_fol);
+      TRACE(cerr << "  dest_index: " << dest_index);
+      TRACE(cerr << "  tem_source_index: " << tem_source_index << endl);
+      if (dim_kinds[dim_fol] != CON_VIRTUAL) {
+	--tem_source_index;
+	TEMP_INTEGER(source_dim);
+	source_dim = source[tem_source_index][dim];
+	TRACE(cerr << "  rows:" << endl);
+	// In order to compute the transpose of the inverse of
+	// `source', subtract source[tem_source_index][dim] times the
+	// column vector in `dest' at `dim' from the column vector in
+	// `dest' at `dim_fol'.
+	//
+	// I.e., for each row `dest_index' in `dest' that is above the
+	// row `dest_index', subtract dest[tem_source_index][dim]
+	// times the entry `dim' from the entry at `dim_fol'.
+	for (dimension_type row = dest_index; row-- > 0; ) {
+	  assert(row < dest_num_rows);
+	  TRACE(cerr << "       " << row << endl);
+	  Grid_Generator& g = dest[row];
+	  g[dim_fol] -= source_dim * g[dim];
+	}
+      }
+    }
+    TRACE(cerr << "dest after processing preceding rows:" << endl);
+    TRACE(dest.ascii_dump(cerr));
+  }
+
+  assert(upper_triangular(dest, dim_kinds));
+
+#ifdef STRONG_REDUCTION
+  for (dimension_type dim = 0, i = 0; dim < dims; ++dim)
+    if (dim_kinds[dim] != GEN_VIRTUAL)
+      // Factor the "diagonal" generator out of the preceding rows.
+      reduce_reduced<Grid_Generator_System, Grid_Generator>
+	(dest, dim, i++, dim, dims - 1, dim_kinds);
+  TRACE(cerr << "dest after strong reduction:" << endl);
+  TRACE(dest.ascii_dump(cerr));
+#endif
+
+  // Ensure that the parameter divisors are the same as the divisor of
+  // the point.
+  Coefficient_traits::const_reference system_divisor = dest[0][0];
+  for (dimension_type row = 1, dim = 1; dim < dims; ++dim)
+    switch (dim_kinds[dim]) {
+    case PARAMETER:
+      dest[row].divisor() = system_divisor;
+    case LINE:
+      ++row;
+    case GEN_VIRTUAL:
+      break;
+    }
+  TRACE(cerr << "dest after updating param divisors:" << endl);
+  TRACE(dest.ascii_dump(cerr));
+
+  trace_dim_kinds("cgs to gs end ", dim_kinds);
+
+  TRACE(cerr << "------------------- cgs to gs conversion done." << endl);
+}
+
+#undef TRACE
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Grid_nonpublic.cc b/src/Grid_nonpublic.cc
new file mode 100644
index 0000000..66a8a7e
--- /dev/null
+++ b/src/Grid_nonpublic.cc
@@ -0,0 +1,612 @@
+/* Grid class implementation
+   (non-inline private or protected functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid.defs.hh"
+#include "Grid_Generator.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cassert>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_defines
+  \brief
+  Controls the laziness level of the implementation.
+
+  Temporarily used in a few of the function implementations to
+  switch to an even more lazy algorithm. To be removed as soon as
+  we collect enough information to decide which is the better
+  implementation alternative.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid::construct(const Congruence_System& ccgs) {
+  // Protecting against space dimension overflow is up to the caller.
+  assert(ccgs.space_dimension() <= max_space_dimension());
+
+  // TODO: this implementation is just an executable specification.
+  Congruence_System cgs = ccgs;
+
+  // Set the space dimension.
+  space_dim = cgs.space_dimension();
+
+  if (space_dim > 0) {
+    // Stealing the rows from `cgs'.
+    std::swap(con_sys, cgs);
+    con_sys.normalize_moduli();
+    set_congruences_up_to_date();
+  }
+  else {
+    // Here `space_dim == 0'.
+    if (cgs.num_columns() > 1)
+      // See if an inconsistent congruence has been passed.
+      for (dimension_type i = cgs.num_rows(); i-- > 0; )
+	if (cgs[i].is_trivial_false()) {
+	  // Inconsistent congruence found: the grid is empty.
+	  // FIXME: Initialize con_sys to the correct dimension in the
+	  //        caller constructors, and copy the necessary parts
+	  //        of set_empty into here.
+	  set_empty();
+	  assert(OK());
+	  return;
+	}
+    set_zero_dim_univ();
+  }
+
+  assert(OK());
+}
+
+void
+PPL::Grid::construct(const Grid_Generator_System& const_gs) {
+  // Protecting against space dimension overflow is up to the caller.
+  assert(const_gs.space_dimension() <= max_space_dimension());
+
+  // TODO: this implementation is just an executable specification.
+  Grid_Generator_System gs = const_gs;
+
+  // Set the space dimension.
+  space_dim = gs.space_dimension();
+
+  // An empty set of generators defines the empty grid.
+  if (gs.num_generators() == 0) {
+    // FIXME: Initialize gen_sys to the correct dimension in the
+    //        caller constructors, and copy the necessary parts of
+    //        set_empty into here.
+    set_empty();
+    return;
+  }
+
+  // Non-empty valid generator systems have a supporting point, at least.
+  if (!gs.has_points())
+    throw_invalid_generators("Grid(const_gs)", "gs");
+
+  if (space_dim > 0) {
+    // Steal the rows from `gs'.
+    std::swap(gen_sys, gs);
+    normalize_divisors(gen_sys);
+
+    // Generators are now up-to-date.
+    set_generators_up_to_date();
+  }
+  else
+    set_zero_dim_univ();
+
+  assert(OK());
+}
+
+PPL::Grid::Three_Valued_Boolean
+PPL::Grid::quick_equivalence_test(const Grid& y) const {
+  // Private method: the caller must ensure the following.
+  assert(space_dim == y.space_dim);
+  assert(!marked_empty() && !y.marked_empty() && space_dim > 0);
+
+  const Grid& x = *this;
+
+  bool css_normalized = false;
+
+  if (x.congruences_are_minimized() && y.congruences_are_minimized()) {
+    // Equivalent minimized congruence systems have:
+    //  - the same number of congruences; ...
+    if (x.con_sys.num_rows() != y.con_sys.num_rows())
+      return Grid::TVB_FALSE;
+    //  - the same number of equalities; ...
+    dimension_type x_num_equalities = x.con_sys.num_equalities();
+    if (x_num_equalities != y.con_sys.num_equalities())
+      return Grid::TVB_FALSE;
+    //  - and if there are no equalities, the same congruences.
+    //    Delay this test: try cheaper tests on generators first.
+    css_normalized = (x_num_equalities == 0);
+  }
+
+  if (x.generators_are_minimized() && y.generators_are_minimized()) {
+    // Equivalent minimized generator systems have:
+    //  - the same number of generators; ...
+    if (x.gen_sys.num_generators() != y.gen_sys.num_generators())
+      return Grid::TVB_FALSE;
+    //  - the same number of lines; ...
+    const dimension_type x_num_lines = x.gen_sys.num_lines();
+    if (x_num_lines != y.gen_sys.num_lines())
+      return Grid::TVB_FALSE;
+      //  - and if there are no lines, the same generators.
+    if (x_num_lines == 0) {
+      // Check for syntactic identity.
+      if (x.gen_sys == y.gen_sys)
+	return Grid::TVB_TRUE;
+      else
+	return Grid::TVB_FALSE;
+    }
+  }
+
+  // TODO: Consider minimizing the systems and re-performing these
+  //       checks.
+
+  if (css_normalized)
+    if (x.con_sys == y.con_sys)
+      return Grid::TVB_TRUE;
+    else
+      return Grid::TVB_FALSE;
+
+  return Grid::TVB_DONT_KNOW;
+}
+
+bool
+PPL::Grid::is_included_in(const Grid& y) const {
+  // Private method: the caller must ensure the following.
+  assert(space_dim == y.space_dim);
+  assert(!marked_empty() && !y.marked_empty() && space_dim > 0);
+
+  const Grid& x = *this;
+
+#if BE_LAZY
+  if (!x.generators_are_up_to_date() && !x.update_generators())
+    // Updating found `x' empty.
+    return true;
+  y.congruences_are_up_to_date() || y.update_congruences();
+#else
+  if (!x.generators_are_minimized() && !x.minimize())
+    // Minimizing found `x' empty.
+    return true;
+  y.congruences_are_minimized() || y.minimize();
+#endif
+
+  assert(x.OK());
+  assert(y.OK());
+
+  const Grid_Generator_System& gs = x.gen_sys;
+  const Congruence_System& cgs = y.con_sys;
+
+  dimension_type num_rows = gs.num_generators();
+  for (dimension_type i = num_rows; i-- > 0; )
+    if (!cgs.satisfies_all_congruences(gs[i]))
+      return false;
+
+  // Inclusion holds.
+  return true;
+}
+
+bool
+PPL::Grid::bounds(const Linear_Expression& expr,
+		  const char* method_call) const {
+  // The dimension of `expr' must be at most the dimension of *this.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible(method_call, "e", expr);
+
+  // A zero-dimensional or empty grid bounds everything.
+  if (space_dim == 0
+      || marked_empty()
+      || (!generators_are_up_to_date() && !update_generators()))
+    return true;
+
+  // The generators are up to date.
+  for (dimension_type i = gen_sys.num_generators(); i-- > 0; ) {
+    const Grid_Generator& g = gen_sys[i];
+    // Only lines and parameters in `*this' can cause `expr' to be
+    // unbounded.
+    if (g.is_line_or_parameter()) {
+      const int sp_sign = Scalar_Products::homogeneous_sign(expr, g);
+      if (sp_sign != 0)
+	// `*this' does not bound `expr'.
+	return false;
+    }
+  }
+  return true;
+}
+
+bool
+PPL::Grid::max_min(const Linear_Expression& expr,
+		   char* method_call,
+		   Coefficient& ext_n, Coefficient& ext_d, bool& included,
+		   Grid_Generator* point) const {
+  if (bounds(expr, method_call)) {
+    if (marked_empty())
+      return false;
+    if (space_dim == 0) {
+      ext_n = 0;
+      ext_d = 1;
+      included = true;
+      if (point)
+	*point = Grid_Generator::point();
+      return true;
+    }
+    if (!generators_are_minimized()) {
+      // Minimize the generator system.
+      Grid& gr = const_cast<Grid&>(*this);
+      gr.simplify(gr.gen_sys, gr.dim_kinds);
+      gr.set_generators_minimized();
+    }
+
+    const Grid_Generator& gen = gen_sys[0];
+    Scalar_Products::homogeneous_assign(ext_n, expr, gen);
+    ext_n += expr.inhomogeneous_term();
+    ext_d = gen.divisor();
+    // Reduce ext_n and ext_d.
+    TEMP_INTEGER(gcd);
+    gcd_assign(gcd, ext_n, ext_d);
+    exact_div_assign(ext_n, ext_n, gcd);
+    exact_div_assign(ext_d, ext_d, gcd);
+
+    included = true;
+    if (point) {
+      *point = gen;
+      point->strong_normalize();
+    }
+    return true;
+  }
+  return false;
+}
+
+void
+PPL::Grid::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+  space_dim = 0;
+  con_sys.clear();
+  gen_sys.clear();
+  gen_sys.insert(Grid_Generator::point());
+}
+
+void
+PPL::Grid::set_empty() {
+  status.set_empty();
+
+  // Replace gen_sys with an empty system of the right dimension.
+  Grid_Generator_System gs(space_dim);
+  gen_sys.swap(gs);
+
+  // Extend the zero dim false congruence system to the appropriate
+  // dimension and then swap it with `con_sys'.
+  Congruence_System cgs(Congruence::zero_dim_false());
+  cgs.increase_space_dimension(space_dim);
+  const_cast<Congruence_System&>(con_sys).swap(cgs);
+}
+
+bool
+PPL::Grid::update_congruences() const {
+  // The caller must ensure that the generators are up to date.
+  assert(space_dim > 0);
+  assert(!marked_empty());
+  assert(gen_sys.num_generators() > 0);
+  assert(gen_sys.space_dimension() > 0);
+
+  Grid& gr = const_cast<Grid&>(*this);
+
+  if (!generators_are_minimized())
+    gr.simplify(gr.gen_sys, gr.dim_kinds);
+
+  // `gen_sys' contained rows before being reduced, so it should
+  // contain at least a single point afterwards.
+  assert(gen_sys.num_generators() > 0);
+
+  // Populate `con_sys' with congruences characterizing the grid
+  // described by `gen_sys'.
+  gr.conversion(gr.gen_sys, gr.con_sys, gr.dim_kinds);
+
+  // Both systems are minimized.
+  gr.set_congruences_minimized();
+  gr.set_generators_minimized();
+  return true;
+}
+
+bool
+PPL::Grid::update_generators() const {
+  assert(space_dim > 0);
+  assert(!marked_empty());
+  assert(congruences_are_up_to_date());
+
+  Grid& x = const_cast<Grid&>(*this);
+
+  if (!congruences_are_minimized())
+    // Either the system of congruences is consistent, or the grid is
+    // empty.
+    if (simplify(x.con_sys, x.dim_kinds)) {
+      x.set_empty();
+      return false;
+    }
+
+  // Populate gen_sys with generators characterizing the grid
+  // described by con_sys.
+  conversion(x.con_sys, x.gen_sys, x.dim_kinds);
+
+  // Both systems are minimized.
+  x.set_congruences_minimized();
+  x.set_generators_minimized();
+  return true;
+}
+
+bool
+PPL::Grid::minimize() const {
+  // 0-dimension and empty grids are already minimized.
+  if (marked_empty())
+    return false;
+  if (space_dim == 0)
+    return true;
+
+  // Are both systems already minimized?
+  if (congruences_are_minimized() && generators_are_minimized())
+    return true;
+
+  // Invoke update_generators, update_congruences or simplify,
+  // depending on the state of the systems.
+  if (congruences_are_up_to_date()) {
+    if (generators_are_up_to_date()) {
+      Grid& gr = const_cast<Grid&>(*this);
+      // Only one of the systems can be minimized here.
+      if (congruences_are_minimized()) {
+	// Minimize the generator system.
+	gr.simplify(gr.gen_sys, gr.dim_kinds);
+	gr.set_generators_minimized();
+      }
+      else {
+#ifndef NDEBUG
+	// Both systems are up to date, and the empty case is handled
+	// above, so the grid should contain points.
+	bool empty = simplify(gr.con_sys, gr.dim_kinds);
+	assert(!empty);
+#else
+	simplify(gr.con_sys, gr.dim_kinds);
+#endif
+	gr.set_congruences_minimized();
+	if (!generators_are_minimized()) {
+	  // Minimize the generator system.
+	  gr.simplify(gr.gen_sys, gr.dim_kinds);
+	  gr.set_generators_minimized();
+	}
+      }
+    }
+    else {
+      // Updating the generators may reveal that `*this' is empty.
+      const bool ret = update_generators();
+      assert(OK());
+      return ret;
+    }
+  }
+  else {
+    assert(generators_are_up_to_date());
+    update_congruences();
+  }
+  assert(OK());
+  return true;
+}
+
+void
+PPL::Grid::normalize_divisors(Grid_Generator_System& sys,
+			      Grid_Generator_System& gen_sys) {
+  dimension_type row = 0;
+  dimension_type num_rows = gen_sys.num_generators();
+  // Find first point in gen_sys.
+  while (gen_sys[row].is_line_or_parameter())
+    if (++row == num_rows)
+      // All rows are lines or parameters; generators should always
+      // contain a point.
+      throw std::runtime_error("PPL::Grid::normalize_divisors(sys, gen_sys).");
+  Grid_Generator& first_point = gen_sys[row];
+  Coefficient_traits::const_reference gen_sys_divisor = first_point.divisor();
+  Coefficient divisor = normalize_divisors(sys, gen_sys_divisor);
+  if (divisor != gen_sys_divisor)
+    // The divisors of the points in gen_sys are always the same, so
+    // the new divisor will be the LCM of this value and `divisor',
+    // hence the third argument.
+    normalize_divisors(gen_sys, divisor, &first_point);
+}
+
+PPL::Coefficient
+PPL::Grid::normalize_divisors(Grid_Generator_System& sys,
+			      Coefficient_traits::const_reference divisor,
+			      Grid_Generator* first_point) {
+  assert(divisor >= 0);
+  if (sys.space_dimension() > 0 && divisor > 0) {
+    TEMP_INTEGER(lcm);
+    lcm = divisor;
+
+    dimension_type row = 0;
+    dimension_type num_rows = sys.num_generators();
+
+    if (first_point)
+      lcm_assign(lcm, lcm, (*first_point).divisor());
+    else {
+      // Move to the first point or parameter.
+      while (sys[row].is_line())
+	if (++row == num_rows)
+	  // All rows are lines.
+	  return divisor;
+
+      // Calculate the LCM of `divisor' and the divisor of every
+      // point or parameter.
+      while (row < num_rows) {
+	Grid_Generator& g = sys[row];
+	if (g.is_parameter_or_point())
+	  lcm_assign(lcm, lcm, g.divisor());
+	++row;
+      }
+    }
+
+    // Represent every point and every parameter using the LCM as the
+    // divisor.
+    for (dimension_type row = 0; row < num_rows; ++row)
+      sys[row].scale_to_divisor(lcm);
+
+    return lcm;
+  }
+  return divisor;
+}
+
+void
+PPL::Grid::throw_runtime_error(const char* method) const {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << "." << std::endl;
+  throw std::runtime_error(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_argument(const char* method,
+				  const char* reason) const {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+					const char* other_name,
+					dimension_type other_dim) const {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << other_name << ".space_dimension() == " << other_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+					const char* gr_name,
+					const Grid& gr) const {
+  throw_dimension_incompatible(method, gr_name, gr.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+					const char* e_name,
+					const Linear_Expression& e) const {
+  throw_dimension_incompatible(method, e_name, e.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+					const char* cg_name,
+					const Congruence& cg) const {
+  throw_dimension_incompatible(method, cg_name, cg.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+					const char* c_name,
+					const Constraint& c) const {
+  throw_dimension_incompatible(method, c_name, c.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+					const char* g_name,
+					const Grid_Generator& g) const {
+  throw_dimension_incompatible(method, g_name, g.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+					const char* cgs_name,
+					const Congruence_System& cgs) const {
+  throw_dimension_incompatible(method, cgs_name, cgs.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+					const char* cs_name,
+					const Constraint_System& cs) const {
+  throw_dimension_incompatible(method, cs_name, cs.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+					const char* gs_name,
+					const Grid_Generator_System& gs) const {
+  throw_dimension_incompatible(method, gs_name, gs.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+					const char* var_name,
+					const Variable var) const {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << var_name << ".space_dimension() == " << var.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::
+throw_dimension_incompatible(const char* method,
+			     dimension_type required_space_dim) const {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required space dimension == " << required_space_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_space_dimension_overflow(const char* method,
+					  const char* reason) {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::length_error(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_generator(const char* method,
+				   const char* g_name) const {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << "*this is an empty grid and "
+    << g_name << " is not a point.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_generators(const char* method,
+				    const char* gs_name) const {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << "*this is an empty grid and" << std::endl
+    << "the non-empty generator system " << gs_name << " contains no points.";
+  throw std::invalid_argument(s.str());
+}
diff --git a/src/Grid_public.cc b/src/Grid_public.cc
new file mode 100644
index 0000000..7afe635
--- /dev/null
+++ b/src/Grid_public.cc
@@ -0,0 +1,2218 @@
+/* Grid class implementation (non-inline public functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid.defs.hh"
+#include "Topology.hh"
+#include "Scalar_Products.defs.hh"
+
+#include <cassert>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Grid::Grid(dimension_type num_dimensions,
+		const Degenerate_Element kind)
+  : con_sys(),
+    gen_sys(num_dimensions > max_space_dimension()
+	    ? (throw_space_dimension_overflow("Grid(n, k)",
+					      "n exceeds the maximum "
+					      "allowed space dimension"),
+	       0)
+	    : num_dimensions) {
+
+  space_dim = num_dimensions;
+
+  if (kind == EMPTY) {
+    // Set emptiness directly instead of with set_empty, as gen_sys is
+    // already correctly initialized.
+
+    status.set_empty();
+
+    // Extend the zero dim false congruence system to the appropriate
+    // dimension and then store it in `con_sys'.
+    Congruence_System cgs(Congruence::zero_dim_false());
+    cgs.increase_space_dimension(space_dim);
+    const_cast<Congruence_System&>(con_sys).swap(cgs);
+
+    assert(OK());
+    return;
+  }
+
+  if (num_dimensions > 0) {
+    con_sys.increase_space_dimension(num_dimensions);
+
+    // Initialise both systems to universe representations.
+
+    set_congruences_minimized();
+    set_generators_minimized();
+    dim_kinds.resize(num_dimensions + 1);
+
+    // Extend the zero dim integrality congruence system to the
+    // appropriate dimension and then store it in `con_sys'.
+    Congruence_System cgs(Congruence::zero_dim_integrality());
+    cgs.increase_space_dimension(space_dim);
+    cgs[0][0] = 1; // Recover minimal form after cgs(zdi) normalization.
+    con_sys.swap(cgs);
+
+    dim_kinds[0] = PROPER_CONGRUENCE /* a.k.a. PARAMETER */;
+
+    // Trivially true point.
+    gen_sys.insert(grid_point(0*(Variable(0))));
+
+    // A line for each dimension.
+    dimension_type dim = 0;
+    while (dim < num_dimensions) {
+      gen_sys.insert(grid_line(Variable(dim++)));
+      dim_kinds[dim] = CON_VIRTUAL /* a.k.a. LINE */;
+    }
+  }
+  else
+    set_zero_dim_univ();
+
+  assert(OK());
+}
+
+PPL::Grid::Grid(const Grid& y)
+  : con_sys(),
+    gen_sys(),
+    status(y.status),
+    space_dim(y.space_dim),
+    dim_kinds(y.dim_kinds) {
+  if (space_dim == 0) {
+    con_sys = y.con_sys;
+    gen_sys = y.gen_sys;
+  }
+  else {
+    if (y.congruences_are_up_to_date())
+      con_sys = y.con_sys;
+    else
+      con_sys.increase_space_dimension(space_dim);
+    if (y.generators_are_up_to_date())
+      gen_sys = y.gen_sys;
+    else
+      gen_sys = Grid_Generator_System(y.space_dim);
+  }
+}
+
+PPL::Grid::Grid(const Constraint_System& ccs) {
+  if (ccs.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(ccs)",
+				   "the space dimension of ccs "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+  Congruence_System cgs;
+  cgs.insert(0*Variable(ccs.space_dimension() - 1) %= 1);
+  for (Constraint_System::const_iterator i = ccs.begin(),
+         ccs_end = ccs.end(); i != ccs_end; ++i)
+    if (i->is_equality())
+      cgs.insert(*i);
+  construct(cgs);
+}
+
+PPL::Grid::Grid(Constraint_System& cs) {
+  if (cs.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(cs)",
+				   "the space dimension of cs "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+  // FIXME: Adapt and use cs instead of using a copy.
+  Congruence_System cgs;
+  cgs.insert(0*Variable(cs.space_dimension() - 1) %= 1);
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    if (i->is_equality())
+      cgs.insert(*i);
+  construct(cgs);
+}
+
+PPL::Grid&
+PPL::Grid::operator=(const Grid& y) {
+  space_dim = y.space_dim;
+  dim_kinds = y.dim_kinds;
+  if (y.marked_empty())
+    set_empty();
+  else if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    status = y.status;
+    if (y.congruences_are_up_to_date())
+      con_sys = y.con_sys;
+    if (y.generators_are_up_to_date())
+      gen_sys = y.gen_sys;
+  }
+  return *this;
+}
+
+PPL::dimension_type
+PPL::Grid::affine_dimension() const {
+  if (space_dim == 0 || is_empty())
+    return 0;
+
+  // FIXME: Use the minimized congruence system, or the generator
+  //        system in any form.
+
+  const Congruence_System& cgs = minimized_congruences();
+  dimension_type d = space_dim;
+  for (dimension_type i = cgs.num_rows(); i-- > 0; )
+    if (cgs[i].is_equality())
+      --d;
+  return d;
+}
+
+const PPL::Congruence_System&
+PPL::Grid::congruences() const {
+  if (marked_empty())
+    return con_sys;
+
+  if (space_dim == 0) {
+    // Zero-dimensional universe.
+    assert(con_sys.num_columns() == 2 && con_sys.num_rows() == 0);
+    return con_sys;
+  }
+
+  congruences_are_up_to_date() || update_congruences();
+
+  return con_sys;
+}
+
+const PPL::Congruence_System&
+PPL::Grid::minimized_congruences() const {
+  if (space_dim == 0) {
+    if (!marked_empty()) {
+      // Ensure the congruences are minimal by extending a zero dim
+      // universe congruence system to the appropriate dimension and
+      // then storing it in `con_sys'.
+      Congruence_System cgs(Congruence::zero_dim_integrality());
+      cgs.increase_space_dimension(space_dim);
+      cgs[0][0] = 1; // Recover minimal form after cgs(zdi) normalization.
+      const_cast<Congruence_System&>(con_sys).swap(cgs);
+    }
+    return con_sys;
+  }
+  if (congruences_are_up_to_date() && !congruences_are_minimized()) {
+    // Minimize the congruences.
+    Grid& gr = const_cast<Grid&>(*this);
+    if (gr.simplify(gr.con_sys, gr.dim_kinds))
+      gr.set_empty();
+    else
+      gr.set_congruences_minimized();
+  }
+  return congruences();
+}
+
+const PPL::Grid_Generator_System&
+PPL::Grid::generators() const {
+  if (space_dim == 0) {
+    assert(gen_sys.space_dimension() == 0
+	   && gen_sys.num_generators() == (marked_empty() ? 0 : 1));
+    return gen_sys;
+  }
+
+  if (marked_empty()) {
+    assert(gen_sys.num_generators() == 0);
+    return gen_sys;
+  }
+
+  if (!generators_are_up_to_date() && !update_generators()) {
+    // Updating found the grid empty.
+    const_cast<Grid&>(*this).set_empty();
+    return gen_sys;
+  }
+
+  return gen_sys;
+}
+
+const PPL::Grid_Generator_System&
+PPL::Grid::minimized_generators() const {
+  if (space_dim == 0) {
+    assert(gen_sys.space_dimension() == 0
+	   && gen_sys.num_generators() == (marked_empty() ? 0 : 1));
+    return gen_sys;
+  }
+
+  if (marked_empty()) {
+    assert(gen_sys.num_generators() == 0);
+    return gen_sys;
+  }
+
+  if (generators_are_up_to_date()) {
+    if (!generators_are_minimized()) {
+      // Minimize the generators.
+      Grid& gr = const_cast<Grid&>(*this);
+      gr.simplify(gr.gen_sys, gr.dim_kinds);
+      gr.set_generators_minimized();
+    }
+  }
+  else if (!update_generators()) {
+    // Updating found the grid empty.
+    const_cast<Grid&>(*this).set_empty();
+    return gen_sys;
+  }
+
+  return gen_sys;
+}
+
+PPL::Poly_Con_Relation
+PPL::Grid::relation_with(const Congruence& cg) const {
+  // Dimension-compatibility check.
+  if (space_dim < cg.space_dimension())
+    throw_dimension_incompatible("relation_with(cg)", "cg", cg);
+
+  if (marked_empty())
+    return Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0)
+    // FIXME: Confirm that the relation with the false cg is correct.
+    //        Does the false congruence define the empty grid?  If so,
+    //        is the empty grid disjoint from the universe grid?
+    if (cg.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::is_included();
+    else if (cg.is_equality())
+      return Poly_Con_Relation::is_disjoint();
+    else if (cg.inhomogeneous_term() % cg.modulus() == 0)
+      return Poly_Con_Relation::is_included();
+    else
+      // cg is false.
+      return Poly_Con_Relation::is_disjoint();
+
+  if (!generators_are_up_to_date() && !update_generators())
+    // Updating found the grid empty.
+    return Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  // Return one of the relations
+  // 'strictly_intersects'   a strict subset of the grid points satisfy cg
+  // 'is_included'	     every grid point satisfies cg
+  // 'is_disjoint'	     cg and the grid occupy seperate spaces.
+
+  // There is always a point.
+
+  // Scalar product of the congruence and the first point that
+  // satisfies the congruence.
+  TEMP_INTEGER(point_sp);
+  point_sp = 0;
+
+  TEMP_INTEGER(modulus);
+  modulus = cg.modulus();
+
+  TEMP_INTEGER(div);
+  div = 0;
+
+  bool known_to_intersect = false;
+
+  for (Grid_Generator_System::const_iterator g = gen_sys.begin(),
+         gen_sys_end = gen_sys.end(); g != gen_sys_end; ++g) {
+    TEMP_INTEGER(sp);
+    Scalar_Products::assign(sp, cg, *g);
+
+    switch (g->type()) {
+
+    case Grid_Generator::POINT:
+      if (cg.is_proper_congruence())
+	sp %= modulus;
+      if (sp == 0)
+	// The point satisfies the congruence.
+	if (point_sp == 0)
+	  // Any previous points satisfied the congruence.
+	  known_to_intersect = true;
+	else
+	  return Poly_Con_Relation::strictly_intersects();
+      else
+	if (point_sp == 0) {
+	  if (known_to_intersect)
+	    return Poly_Con_Relation::strictly_intersects();
+	  // Assign `sp' to `point_sp' as `sp' is the scalar product
+	  // of cg and a point g and is non-zero.
+	  point_sp = sp;
+	}
+	else {
+	  // A previously considered point p failed to satisfy cg such that
+	  // `point_sp' = `scalar_prod(p,cg)'
+	  // so, if we consider the parameter g-p instead of g, we have
+	  // scalar_prod(g-p, cg) = scalar_prod(g,cg) - scalar_prod(p,cg)
+	  //                      = sp - point_sp
+	  sp -= point_sp;
+
+	  if (sp != 0) {
+	    // Find the GCD between sp and the previous GCD.
+	    gcd_assign(div, div, sp);
+	    if (point_sp % div == 0)
+	      // There is a point in the grid satisfying cg.
+	      return Poly_Con_Relation::strictly_intersects();
+	  }
+	}
+      break;
+
+    case Grid_Generator::PARAMETER:
+      if (cg.is_proper_congruence())
+	sp %= (modulus * g->divisor());
+      if (sp == 0)
+	// Parameter g satisfies the cg so the relation depends
+	// entirely on the other generators.
+	break;
+
+      if (known_to_intersect)
+	// At least one point satisfies cg.  However, the sum of such
+	// a point and the parameter g fails to satisfy cg (due to g).
+	return Poly_Con_Relation::strictly_intersects();
+
+      // Find the GCD between sp and the previous GCD.
+      gcd_assign(div, div, sp);
+      if (point_sp != 0)
+	// At least one of any previously encountered points fails to
+	// satisfy cg.
+	if (point_sp == div)
+	  // There is also a grid point that satisfies cg.
+	  return Poly_Con_Relation::strictly_intersects();
+
+      break;
+
+    case Grid_Generator::LINE:
+      if (sp == 0)
+	// Line g satisfies the cg so the relation depends entirely on
+	// the other generators.
+	break;
+
+      // Line g intersects the congruence.
+      //
+      // There is a point p in the grid.  Suppose <p*cg> = p_sp.  Then
+      // (-p_sp/sp)*g + p is a point that satisfies cg: <((-p_sp/sp)*g
+      // + p).cg> = -(p_sp/sp)*sp + p_sp) = 0.  If p does not satisfy
+      // `cg' and hence is not in the grid defined by `cg', the grid
+      // `*this' strictly intersects the `cg' grid.  On the other
+      // hand, if `p' is in the grid defined by `cg' so that p_sp = 0,
+      // then <p+g.cg> = p_sp + sp != 0; thus `p+g' is a point in
+      // *this that does not satisfy `cg' and hence `p+g' is a point
+      // in *this not in the grid defined by `cg'; therefore `*this'
+      // strictly intersects the `cg' grid.
+
+      return Poly_Con_Relation::strictly_intersects();
+    }
+  }
+
+  if (point_sp == 0)
+    // Every generator satisfied the cg.
+    return Poly_Con_Relation::is_included();
+
+  assert(!known_to_intersect);
+  return Poly_Con_Relation::is_disjoint();
+}
+
+PPL::Poly_Gen_Relation
+PPL::Grid::relation_with(const Grid_Generator& g) const {
+  // Dimension-compatibility check.
+  if (space_dim < g.space_dimension())
+    throw_dimension_incompatible("relation_with(g)", "g", g);
+
+  // The empty grid cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe grid in a zero-dimensional space subsumes all the
+  // generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  congruences_are_up_to_date() || update_congruences();
+
+  return
+    con_sys.satisfies_all_congruences(g)
+    ? Poly_Gen_Relation::subsumes()
+    : Poly_Gen_Relation::nothing();
+}
+
+bool
+PPL::Grid::is_empty() const {
+  if (marked_empty())
+    return true;
+  // Try a fast-fail test: if generators are up-to-date then the
+  // generator system (since it is well formed) contains a point.
+  if (generators_are_up_to_date())
+    return false;
+  if (space_dim == 0)
+    return false;
+  if (congruences_are_minimized())
+    // If the grid was empty it would be marked empty.
+    return false;
+  // Minimize the congruences to check if the grid is empty.
+  Grid& gr = const_cast<Grid&>(*this);
+  if (gr.simplify(gr.con_sys, gr.dim_kinds)) {
+    gr.set_empty();
+    return true;
+  }
+  gr.set_congruences_minimized();
+  return false;
+}
+
+bool
+PPL::Grid::is_universe() const {
+  if (marked_empty())
+    return false;
+
+  if (space_dim == 0)
+    return true;
+
+  if (congruences_are_up_to_date()) {
+    if (congruences_are_minimized())
+      // The minimized universe congruence system has only one row,
+      // the integrality congruence.
+      return con_sys.num_rows() == 1 && con_sys[0].is_trivial_true();
+  }
+  else {
+    update_congruences();
+    return con_sys.num_rows() == 1 && con_sys[0].is_trivial_true();
+  }
+
+  // Test con_sys's inclusion in a universe generator system.
+
+  // The zero dimension cases are handled above.
+  Variable var(space_dim - 1);
+  for (dimension_type i = space_dim; i-- > 0; )
+    if (!con_sys.satisfies_all_congruences(grid_line(Variable(i) + var)))
+      return false;
+  assert(con_sys.satisfies_all_congruences(grid_point(0*var)));
+  return true;
+}
+
+bool
+PPL::Grid::is_bounded() const {
+  // A zero-dimensional or empty grid is bounded.
+  if (space_dim == 0
+      || marked_empty()
+      || (!generators_are_up_to_date() && !update_generators()))
+    return true;
+
+  // TODO: Consider using con_sys when gen_sys is out of date.
+
+  if (gen_sys.num_generators() > 1) {
+    // Check if all generators are the same point.
+    const Grid_Generator& first_point = gen_sys[0];
+    if (first_point.is_line_or_parameter())
+      return false;
+    for (dimension_type row = gen_sys.num_generators(); row-- > 0; ) {
+      const Grid_Generator& gen = gen_sys[row];
+      if (gen.is_line_or_parameter() || gen != first_point)
+	return false;
+    }
+  }
+  return true;
+}
+
+bool
+PPL::Grid::is_discrete() const {
+  // A zero-dimensional or empty grid is discrete.
+  if (space_dim == 0 || marked_empty())
+    return true;
+
+  if (generators_are_minimized()) {
+  line_search:
+    // Search for lines in the minimized generator system.
+    for (dimension_type row = gen_sys.num_generators(); row-- > 1; )
+      if (gen_sys[row].is_line())
+	return false;
+    return true;
+  }
+
+  if (congruences_are_minimized())
+    return con_sys.has_a_free_dimension();
+
+  Grid& gr = const_cast<Grid&>(*this);
+  if (generators_are_up_to_date()) {
+    // Minimize the generator system.
+    gr.simplify(gr.gen_sys, gr.dim_kinds);
+    gr.set_generators_minimized();
+
+    goto line_search;
+  }
+
+  // Generators are out of date.
+
+  // Minimize the congruence system to find out whether it is empty.
+  if (gr.simplify(gr.con_sys, gr.dim_kinds)) {
+    // The congruence system reduced to the empty grid.
+    gr.set_empty();
+    return true;
+  }
+  gr.set_congruences_minimized();
+
+  return gr.con_sys.has_a_free_dimension();
+}
+
+bool
+PPL::Grid::is_topologically_closed() const {
+  // Any empty or zero-dimensional grid is closed.
+  if (marked_empty() || space_dim == 0)
+    return true;
+
+  if (generators_are_minimized()) {
+  param_search:
+    // Search for a parameter in the minimized generator system.
+    for (dimension_type row = gen_sys.num_generators(); row-- > 1; )
+      if (gen_sys[row].is_parameter())
+	return false;
+    return true;
+  }
+
+  if (congruences_are_minimized()) {
+  proper_cg_search:
+    // Search for a proper congruence following the integrality
+    // congruence, in the minimized congruence system.
+    for (dimension_type row = con_sys.num_rows() - 1; row-- > 0; )
+      if (con_sys[row].is_proper_congruence())
+	return false;
+    return true;
+  }
+
+  Grid& gr = const_cast<Grid&>(*this);
+  if (generators_are_up_to_date()) {
+    gr.simplify(gr.gen_sys, gr.dim_kinds);
+    gr.set_generators_minimized();
+    goto param_search;
+  }
+
+  // Minimize the congruence system.
+  if (gr.simplify(gr.con_sys, gr.dim_kinds)) {
+    // The congruence system reduced to the empty grid.
+    gr.set_empty();
+    return true;
+  }
+  gr.set_congruences_minimized();
+  goto proper_cg_search;
+}
+
+bool
+PPL::Grid::OK(bool check_not_empty) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // Check whether the status information is legal.
+  if (!status.OK())
+    goto fail;
+
+  if (marked_empty()) {
+    if (check_not_empty) {
+      // The caller does not want the grid to be empty.
+#ifndef NDEBUG
+      cerr << "Empty grid!" << endl;
+#endif
+      goto fail;
+    }
+
+    if (con_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+      cerr << "The grid is in a space of dimension " << space_dim
+	   << " while the system of congruences is in a space of dimension "
+	   << con_sys.space_dimension()
+	   << endl;
+#endif
+      goto fail;
+    }
+    return true;
+  }
+
+  // A zero-dimensional universe grid is legal only if the system of
+  // congruences `con_sys' is empty, and the generator system contains
+  // one point.
+  if (space_dim == 0) {
+    if (con_sys.num_rows() == 0)
+      if (gen_sys.num_generators() == 1 && gen_sys[0].is_point())
+	return true;
+#ifndef NDEBUG
+    cerr << "Zero-dimensional grid should have an empty congruence" << endl
+	 << "system and a generator system of a single point." << endl;
+#endif
+    goto fail;
+  }
+
+  // A grid is defined by a system of congruences or a system of
+  // generators.  At least one of them must be up to date.
+  if (!congruences_are_up_to_date() && !generators_are_up_to_date()) {
+#ifndef NDEBUG
+    cerr << "Grid not empty, not zero-dimensional" << endl
+	 << "and with neither congruences nor generators up-to-date!"
+	 << endl;
+#endif
+    goto fail;
+  }
+
+  {
+    // This block is to limit the scope of num_columns, at least for
+    // GCC < 3.4.
+
+    // The expected number of columns in the congruence and generator
+    // systems, if they are not empty.
+    const dimension_type num_columns = space_dim + 1;
+
+    // Here we check if the size of the matrices is consistent.
+    // Let us suppose that all the matrices are up-to-date; this means:
+    // `con_sys' : number of congruences x poly_num_columns
+    // `gen_sys' : number of generators  x poly_num_columns
+    if (congruences_are_up_to_date())
+      if (con_sys.num_columns() != num_columns + 1 /* moduli */) {
+#ifndef NDEBUG
+	cerr << "Incompatible size! (con_sys and space_dim)"
+	     << endl;
+#endif
+	goto fail;
+      }
+
+    if (generators_are_up_to_date()) {
+      if (gen_sys.space_dimension() + 1 != num_columns) {
+#ifndef NDEBUG
+	cerr << "Incompatible size! (gen_sys and space_dim)"
+	     << endl;
+#endif
+	goto fail;
+      }
+
+      // Check if the system of generators is well-formed.
+      if (!gen_sys.OK()) {
+#ifndef NDEBUG
+	cerr << "gen_sys OK failed." << endl;
+#endif
+	goto fail;
+      }
+      // Check each generator in the system.
+      for (dimension_type i = gen_sys.num_generators(); i-- > 0; ) {
+	const Grid_Generator& g = gen_sys[i];
+
+	if (g.size() < 1) {
+#ifndef NDEBUG
+	  cerr << "Parameter should have coefficients." << endl;
+#endif
+	  goto fail;
+	}
+      }
+
+      // A non-empty system of generators describing a grid is valid iff
+      // it contains a point.
+      if (gen_sys.num_generators() > 0 && !gen_sys.has_points()) {
+#ifndef NDEBUG
+	cerr << "Non-empty generator system declared up-to-date "
+	     << "has no points!"
+	     << endl;
+#endif
+	goto fail;
+      }
+
+      if (generators_are_minimized()) {
+	Grid_Generator_System gs = gen_sys;
+
+	if (dim_kinds.size() != num_columns) {
+#ifndef NDEBUG
+	  cerr << "Size of dim_kinds should equal the number of columns."
+	       << endl;
+#endif
+	  goto fail;
+	}
+
+	if (!upper_triangular(gs, dim_kinds)) {
+#ifndef NDEBUG
+	  cerr << "Reduced generators should be upper triangular."
+	       << endl;
+#endif
+	  goto fail;
+	}
+
+	// Check that dim_kinds corresponds to the row kinds in gen_sys.
+	for (dimension_type dim = 0, row = 0;
+	     dim < space_dim + 1;
+	     ++dim, assert(row <= dim)) {
+	  if (dim_kinds[dim] == GEN_VIRTUAL
+	      || (gen_sys[row++].is_parameter_or_point()
+		  && dim_kinds[dim] == PARAMETER)
+	      || (assert(gen_sys[row-1].is_line()), dim_kinds[dim] == LINE))
+	    continue;
+#ifndef NDEBUG
+	  cerr << "Kinds in dim_kinds should match those in gen_sys."
+	       << endl;
+#endif
+	  goto fail;
+	}
+
+	// A reduced generator system must be the same as a temporary
+	// reduced copy.
+	Dimension_Kinds dk = dim_kinds;
+	// `gs' is minimized and marked_empty returned false, so `gs'
+	// should contain rows.
+	assert(gs.num_generators() > 0);
+	simplify(gs, dk);
+	// gs contained rows before being reduced, so it should
+	// contain at least a single point afterwards.
+	assert(gs.num_generators() > 0);
+	for (dimension_type row = 0; row < gen_sys.num_generators(); ++row) {
+	  Grid_Generator& g = gs[row];
+	  const Grid_Generator& g_copy = gen_sys[row];
+	  if (g.is_equal_to(g_copy))
+	    continue;
+#ifndef NDEBUG
+	  cerr << "Generators are declared minimized,"
+	    " but they change under reduction.\n"
+	       << "Here is the generator system:\n";
+	  gen_sys.ascii_dump(cerr);
+	  cerr << "and here is the minimized form of the temporary copy:\n";
+	  gs.ascii_dump(cerr);
+#endif
+	  goto fail;
+	}
+      }
+
+    } // if (congruences_are_up_to_date())
+  } // scope block
+
+  if (congruences_are_up_to_date()) {
+    // Check if the system of congruences is well-formed.
+    if (!con_sys.OK()) {
+#ifndef NDEBUG
+      cerr << "con_sys OK failed." << endl;
+#endif
+      goto fail;
+    }
+
+    Grid tem_gr = *this;
+    Congruence_System cs_copy = tem_gr.con_sys;
+
+    // Clear the generators in tem_gr.
+    Grid_Generator_System gs(space_dim);
+    std::swap(tem_gr.gen_sys, gs);
+    tem_gr.clear_generators_up_to_date();
+
+    if (!tem_gr.update_generators()) {
+      if (check_not_empty) {
+	// Want to know the satisfiability of the congruences.
+#ifndef NDEBUG
+	cerr << "Unsatisfiable system of congruences!"
+	     << endl;
+#endif
+	goto fail;
+      }
+      // The grid is empty, all checks are done.
+      return true;
+    }
+
+    if (congruences_are_minimized()) {
+      // A reduced congruence system must be lower triangular.
+      if (!lower_triangular(con_sys, dim_kinds)) {
+#ifndef NDEBUG
+	cerr << "Reduced congruences should be lower triangular." << endl;
+#endif
+	goto fail;
+      }
+
+      // If the congruences are minimized, all the elements in the
+      // congruence system must be the same as those in the temporary,
+      // minimized system `cs_copy'.
+      if (!con_sys.is_equal_to(cs_copy)) {
+#ifndef NDEBUG
+	cerr << "Congruences are declared minimized, but they change under reduction!"
+	     << endl
+	     << "Here is the minimized form of the congruence system:"
+	     << endl;
+	cs_copy.ascii_dump(cerr);
+	cerr << endl;
+#endif
+	goto fail;
+      }
+
+      if (dim_kinds.size() != con_sys.num_columns() - 1 /* modulus */) {
+#ifndef NDEBUG
+	cerr << "Size of dim_kinds should equal the number of columns."
+	     << endl;
+#endif
+	goto fail;
+      }
+
+      // Check that dim_kinds corresponds to the row kinds in con_sys.
+      for (dimension_type dim = 0, row = con_sys.num_rows() - 1;
+	   dim < space_dim + 1;
+	   ++dim) {
+	if (dim_kinds[dim] == CON_VIRTUAL
+	    || (con_sys[row--].is_proper_congruence()
+		&& dim_kinds[dim] == PROPER_CONGRUENCE)
+	    || (assert(con_sys[row+1].is_equality()),
+		dim_kinds[dim] == EQUALITY))
+	  continue;
+#ifndef NDEBUG
+	cerr << "Kinds in dim_kinds should match those in con_sys." << endl;
+#endif
+	goto fail;
+      }
+    }
+  }
+
+  return true;
+
+ fail:
+#ifndef NDEBUG
+  cerr << "Here is the grid under check:" << endl;
+  ascii_dump(cerr);
+#endif
+  return false;
+}
+
+void
+PPL::Grid::add_congruence(const Congruence& cg) {
+  // Dimension-compatibility check: the dimension of `cg' can not be
+  // greater than space_dim.
+  if (space_dim < cg.space_dimension())
+    throw_dimension_incompatible("add_congruence(cg)", "cg", cg);
+
+  // Adding a new congruence to an empty grid results in an empty
+  // grid.
+  if (marked_empty())
+    return;
+
+  // Dealing with a zero-dimensional space grid first.
+  if (space_dim == 0) {
+    if (!cg.is_trivial_true())
+      set_empty();
+    return;
+  }
+
+  congruences_are_up_to_date() || update_congruences();
+
+  con_sys.insert(cg);
+
+  clear_congruences_minimized();
+  set_congruences_up_to_date();
+  clear_generators_up_to_date();
+
+  // Note: the congruence system may have become unsatisfiable, thus
+  // we do not check for satisfiability.
+  assert(OK());
+}
+
+void
+PPL::Grid::add_congruence(const Constraint& c) {
+  // TODO: this is just an executable specification.
+  if (c.is_equality()) {
+    Congruence_System cgs(c);
+    add_recycled_congruences(cgs);
+  }
+}
+
+bool
+PPL::Grid::add_congruence_and_minimize(const Congruence& cg) {
+  // TODO: this is just an executable specification.
+  Congruence_System cgs(cg);
+  return add_recycled_congruences_and_minimize(cgs);
+}
+
+bool
+PPL::Grid::add_congruence_and_minimize(const Constraint& c) {
+  // TODO: this is just an executable specification.
+  if (c.is_equality()) {
+    Congruence_System cgs(c);
+    return add_recycled_congruences_and_minimize(cgs);
+  }
+  return minimize();
+}
+
+void
+PPL::Grid::add_generator(const Grid_Generator& g) {
+  // The dimension of `g' must be at most space_dim.
+  const dimension_type g_space_dim = g.space_dimension();
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("add_generator(g)", "g", g);
+
+  // Deal with zero-dimension case first.
+  if (space_dim == 0) {
+    // Points and parameters are the only zero-dimension generators
+    // that can be created.
+    if (marked_empty()) {
+      if (g.is_parameter())
+	throw_invalid_generator("add_generator(g)", "g");
+      set_zero_dim_univ();
+    }
+    assert(OK());
+    return;
+  }
+
+  if (marked_empty()
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // Here the grid is empty: the specification says we can only
+    // insert a point.
+    if (g.is_line_or_parameter())
+      throw_invalid_generator("add_generator(g)", "g");
+    gen_sys.insert(g);
+    clear_empty();
+  }
+  else {
+    assert(generators_are_up_to_date());
+    gen_sys.insert(g);
+    if (g.is_parameter_or_point())
+      normalize_divisors(gen_sys);
+  }
+
+  // With the added generator, congruences are out of date.
+  clear_congruences_up_to_date();
+
+  clear_generators_minimized();
+  set_generators_up_to_date();
+  assert(OK());
+}
+
+bool
+PPL::Grid::add_generator_and_minimize(const Grid_Generator& g) {
+  // TODO: this is just an executable specification.
+  Grid_Generator_System gs(g);
+  return add_recycled_generators_and_minimize(gs);
+}
+
+void
+PPL::Grid::add_recycled_congruences(Congruence_System& cgs) {
+  // Dimension-compatibility check: the dimension of `cgs' can not be
+  // greater than space_dim.
+  const dimension_type cgs_space_dim = cgs.space_dimension();
+  if (space_dim < cgs_space_dim)
+    throw_dimension_incompatible("add_recycled_congruences(cgs)", "cgs", cgs);
+
+  if (cgs.num_rows() == 0)
+    return;
+
+  if (space_dim == 0) {
+    // In a 0-dimensional space the congruences are trivial (e.g., 0
+    // == 0 or 1 %= 0) or false (e.g., 1 == 0).  In a system of
+    // congruences `begin()' and `end()' are equal if and only if the
+    // system contains only trivial congruences.
+    if (cgs.begin() != cgs.end())
+      // There is a congruence, it must be false, the grid is empty.
+      if (status.test_zero_dim_univ())
+	set_empty();
+    return;
+  }
+
+  if (marked_empty()) {
+    assert(OK());
+    return;
+  }
+
+  // The congruences are required.
+  congruences_are_up_to_date() || update_congruences();
+
+  // Swap (instead of copying) the coefficients of `cgs' (which is
+  // writable).
+  con_sys.recycling_insert(cgs);
+
+  // Congruences may not be minimized and generators are out of date.
+  clear_congruences_minimized();
+  clear_generators_up_to_date();
+  // Note: the congruence system may have become unsatisfiable, thus
+  // we do not check for satisfiability.
+  assert(OK());
+}
+
+void
+PPL::Grid::add_recycled_congruences(Constraint_System& cs) {
+  // TODO: this is just an executable specification.
+  // The dimension of `cs' must be at most `space_dim'.
+  if (space_dim < cs.space_dimension())
+    throw_dimension_incompatible("add_recycled_congruences(cs)", "cs", cs);
+  Congruence_System cgs(cs);
+  add_recycled_congruences(cgs);
+}
+
+void
+PPL::Grid::add_congruences(const Congruence_System& cgs) {
+  // TODO: this is just an executable specification.
+  // The dimension of `cgs' must be at most `space_dim'.
+  if (space_dim < cgs.space_dimension())
+    throw_dimension_incompatible("add_congruences(cgs)", "cgs", cgs);
+  Congruence_System cgs_copy = cgs;
+  add_recycled_congruences(cgs_copy);
+}
+
+void
+PPL::Grid::add_congruences(const Constraint_System& cs) {
+  // TODO: this is just an executable specification.
+  // The dimension of `cs' must be at most `space_dim'.
+  if (space_dim < cs.space_dimension())
+    throw_dimension_incompatible("add_congruences(cs)", "cs", cs);
+  Congruence_System cgs(cs);
+  add_recycled_congruences(cgs);
+}
+
+bool
+PPL::Grid::add_recycled_congruences_and_minimize(Congruence_System& cgs) {
+  // Dimension-compatibility check: the dimension of `cgs' can not be
+  // greater than space_dim.
+  const dimension_type cgs_space_dim = cgs.space_dimension();
+  if (space_dim < cgs_space_dim)
+    throw_dimension_incompatible("add_recycled_congruences_and_minimize(cgs)",
+				 "cgs", cgs);
+
+  // Adding no congruences: just minimize.
+  if (cgs.num_rows() == 0)
+    return minimize();
+
+  // Dealing with zero-dimensional space grids first.
+  if (space_dim == 0) {
+    // In a 0-dimensional space the congruences are trivial (e.g., 0
+    // == 0 or 1 %= 0) or false (e.g., 1 == 0).  In a system of
+    // congruences `begin()' and `end()' are equal if and only if the
+    // system contains only trivial congruences.
+    if (cgs.begin() == cgs.end())
+      return true;
+    // There is a congruence, it must be false, the grid is empty.
+    if (status.test_zero_dim_univ())
+      set_empty();
+    return false;
+  }
+
+  if (marked_empty())
+    return false;
+
+  congruences_are_up_to_date() || update_congruences();
+
+  con_sys.recycling_insert(cgs);
+
+  clear_congruences_minimized();
+
+#ifndef NDEBUG
+  bool ret = update_generators();
+  assert(OK());
+  return ret;
+#else
+  return update_generators();
+#endif
+}
+
+bool
+PPL::Grid::add_recycled_congruences_and_minimize(Constraint_System& cs) {
+  // TODO: this is just an executable specification.
+  // The dimension of `cs' must be at most `space_dim'.
+  if (space_dim < cs.space_dimension())
+    throw_dimension_incompatible("add_recycled_congruences_and_minimize(cs)",
+				 "cs", cs);
+  Congruence_System cgs(cs);
+  return add_recycled_congruences_and_minimize(cgs);
+}
+
+bool
+PPL::Grid::add_congruences_and_minimize(const Congruence_System& cgs) {
+  // TODO: this is just an executable specification.
+  Congruence_System cgs_copy = cgs;
+  return add_recycled_congruences_and_minimize(cgs_copy);
+}
+
+bool
+PPL::Grid::add_congruences_and_minimize(const Constraint_System& cs) {
+  // TODO: this is just an executable specification.
+  // The dimension of `cs' must be at most `space_dim'.
+  if (space_dim < cs.space_dimension())
+    throw_dimension_incompatible("add_congruences_and_minimize(cs)", "cs", cs);
+  Congruence_System cgs(cs);
+  return add_recycled_congruences_and_minimize(cgs);
+}
+
+void
+PPL::Grid::add_constraint(const Constraint& c) {
+  // The dimension of `c' must be at most `space_dim'.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", "c", c);
+  if (c.is_equality()) {
+    Congruence cg(c);
+    add_congruence(cg);
+  }
+}
+
+bool
+PPL::Grid::add_constraint_and_minimize(const Constraint& c) {
+  // The dimension of `c' must be at most `space_dim'.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("add_constraint_and_minimize(c)", "c", c);
+  if (c.is_equality()) {
+    Congruence cg(c);
+    return add_congruence_and_minimize(cg);
+  }
+  return minimize();
+}
+
+void
+PPL::Grid::add_constraints(const Constraint_System& cs) {
+  // The dimension of `cs' must be at most `space_dim'.
+  if (space_dim < cs.space_dimension())
+    throw_dimension_incompatible("add_constraints(cs)", "cs", cs);
+  Congruence_System cgs(cs);
+  add_recycled_congruences(cgs);
+}
+
+bool
+PPL::Grid::add_constraints_and_minimize(const Constraint_System& cs) {
+  // The dimension of `cs' must be at most `space_dim'.
+  if (space_dim < cs.space_dimension())
+    throw_dimension_incompatible("add_constraints_and_minimize(cs)",
+				 "cs", cs);
+  Congruence_System cgs(cs);
+  return add_recycled_congruences_and_minimize(cgs);
+}
+
+void
+PPL::Grid::add_recycled_constraints(Constraint_System& cs) {
+  // The dimension of `cs' must be at most `space_dim'.
+  if (space_dim < cs.space_dimension())
+    throw_dimension_incompatible("add_recycled_constraints(cs)",
+				 "cs", cs);
+  Congruence_System cgs(cs);
+  add_recycled_congruences(cgs);
+}
+
+bool
+PPL::Grid::add_recycled_constraints_and_minimize(Constraint_System& cs) {
+  // The dimension of `cs' must be at most `space_dim'.
+  if (space_dim < cs.space_dimension())
+    throw_dimension_incompatible("add_recycled_constraints_and_minimize(cs)",
+				 "cs", cs);
+  Congruence_System cgs(cs);
+  return add_recycled_congruences_and_minimize(cgs);
+}
+
+void
+PPL::Grid::add_recycled_generators(Grid_Generator_System& gs) {
+  // Dimension-compatibility check:
+  // the dimension of `gs' can not be greater than space_dim.
+  const dimension_type gs_space_dim = gs.space_dimension();
+  if (space_dim < gs_space_dim)
+    throw_dimension_incompatible("add_recycled_generators(gs)", "gs", gs);
+
+  // Adding no generators leaves the grid the same.
+  if (gs.num_generators() == 0)
+    return;
+
+  // Adding valid generators to a zero-dimensional grid transforms it
+  // to the zero-dimensional universe grid.
+  if (space_dim == 0) {
+    if (marked_empty())
+      if (gs.has_points())
+	set_zero_dim_univ();
+      else
+	throw_invalid_generators("add_recycled_generators(gs)", "gs");
+    assert(OK(true));
+    return;
+  }
+
+  if (!marked_empty()
+      && (generators_are_up_to_date() || update_generators())) {
+    // The grid contains at least one point.
+
+    normalize_divisors(gs, gen_sys);
+
+    gen_sys.recycling_insert(gs);
+
+    // Congruences are out of date and generators are not minimized.
+    clear_congruences_up_to_date();
+    clear_generators_minimized();
+
+    assert(OK(true));
+    return;
+  }
+
+  // The grid is empty.
+
+  // `gs' must contain at least one point.
+  if (!gs.has_points())
+    throw_invalid_generators("add_recycled_generators(gs)", "gs");
+
+  // Adjust `gs' to the right dimension.
+  gs.insert(parameter(0*Variable(space_dim-1)));
+
+  std::swap(gen_sys, gs);
+
+  normalize_divisors(gen_sys);
+
+  // The grid is no longer empty and generators are up-to-date.
+  set_generators_up_to_date();
+  clear_empty();
+
+  assert(OK());
+}
+
+void
+PPL::Grid::add_generators(const Grid_Generator_System& gs) {
+  // TODO: this is just an executable specification.
+  Grid_Generator_System gs_copy = gs;
+  add_recycled_generators(gs_copy);
+}
+
+bool
+PPL::Grid::add_recycled_generators_and_minimize(Grid_Generator_System& gs) {
+  // Dimension-compatibility check: the dimension of `gs' must be less
+  // than or equal to that of space_dim.
+  const dimension_type gs_space_dim = gs.space_dimension();
+  if (space_dim < gs_space_dim)
+    throw_dimension_incompatible("add_recycled_generators_and_minimize(gs)",
+				 "gs", gs);
+
+  // Adding no generators is equivalent to just requiring reduction.
+  if (gs.num_generators() == 0)
+    return minimize();
+
+  // Adding valid generators to a zero-dimensional grid produces the
+  // zero-dimensional universe grid.
+  if (space_dim == 0) {
+    if (marked_empty())
+      if (gs.has_points())
+	set_zero_dim_univ();
+      else
+	throw_invalid_generators("add_recycled_generators_and_minimize(gs)",
+				 "gs");
+    assert(OK(true));
+    return true;
+  }
+
+  // Adjust `gs' to the right dimension.
+  gs.insert(parameter(0*Variable(space_dim-1)));
+
+  if (!marked_empty()
+      && (generators_are_up_to_date() || update_generators())) {
+    // The grid contains at least one point.
+    normalize_divisors(gs, gen_sys);
+
+    for (dimension_type row = 0; row < gs.num_generators(); ++row)
+      gen_sys.recycling_insert(gs[row]);
+  }
+  else {
+    // The grid is empty: check if `gs' contains a point.
+    if (!gs.has_points())
+      throw_invalid_generators("add_recycled_generators_and_minimize(gs)",
+			       "gs");
+    std::swap(gen_sys, gs);
+    normalize_divisors(gen_sys);
+    clear_empty();
+  }
+  clear_generators_minimized();
+  update_congruences();
+
+  assert(OK(true));
+  return true;
+}
+
+bool
+PPL::Grid::add_generators_and_minimize(const Grid_Generator_System& gs) {
+  // TODO: this is just an executable specification.
+  Grid_Generator_System gs_copy = gs;
+  return add_recycled_generators_and_minimize(gs_copy);
+}
+
+void
+PPL::Grid::intersection_assign(const Grid& y) {
+  Grid& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("intersection_assign(y)", "y", y);
+
+  // If one of the two grids is empty, the intersection is empty.
+  if (x.marked_empty())
+    return;
+  if (y.marked_empty()) {
+    x.set_empty();
+    return;
+  }
+
+  // If both grids are zero-dimensional, then at this point they are
+  // necessarily universe, so the intersection is also universe.
+  if (x.space_dim == 0)
+    return;
+
+  // The congruences must be up-to-date.
+  x.congruences_are_up_to_date() || x.update_congruences();
+  y.congruences_are_up_to_date() || y.update_congruences();
+
+  if (y.con_sys.num_rows() > 0 ) {
+    x.con_sys.insert(y.con_sys);
+    // Grid_Generators may be out of date and congruences may have changed
+    // from minimal form.
+    x.clear_generators_up_to_date();
+    x.clear_congruences_minimized();
+  }
+
+  // `y' should still contain a point.
+  assert(x.OK() && y.OK(true));
+}
+
+bool
+PPL::Grid::intersection_assign_and_minimize(const Grid& y) {
+  intersection_assign(y);
+  return minimize();
+}
+
+void
+PPL::Grid::join_assign(const Grid& y) {
+  Grid& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("join_assign(y)", "y", y);
+
+  // The join of a grid `gr' with an empty grid is `gr'.
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty()) {
+    x = y;
+    return;
+  }
+
+  // If both grids are zero-dimensional, then they are necessarily
+  // universe grids, and so is their join.
+  if (x.space_dim == 0)
+    return;
+
+  // The generators must be up-to-date.
+  if (!x.generators_are_up_to_date() && !x.update_generators()) {
+    // Discovered `x' empty when updating generators.
+    x = y;
+    return;
+  }
+  if (!y.generators_are_up_to_date() && !y.update_generators())
+    // Discovered `y' empty when updating generators.
+    return;
+
+  // Match the divisors of the x and y generator systems.
+  Grid_Generator_System gs(y.gen_sys);
+  normalize_divisors(x.gen_sys, gs);
+  x.gen_sys.recycling_insert(gs);
+  // Congruences may be out of date and generators may have lost
+  // minimal form.
+  x.clear_congruences_up_to_date();
+  x.clear_generators_minimized();
+
+  // At this point both `x' and `y' are not empty.
+  assert(x.OK(true) && y.OK(true));
+}
+
+bool
+PPL::Grid::join_assign_and_minimize(const Grid& y) {
+  join_assign(y);
+  return minimize();
+}
+
+bool
+PPL::Grid::join_assign_if_exact(const Grid& y) {
+  Grid& x = *this;
+
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("join_assign_if_exact(y)", "y", y);
+
+  if (x.marked_empty()
+      || y.marked_empty()
+      || x.space_dim == 0
+      || x.is_included_in(y)
+      || y.is_included_in(x)) {
+    join_assign(y);
+    return true;
+  }
+
+  Grid x_copy = x;
+  x_copy.join_assign(y);
+  x_copy.grid_difference_assign(y);
+  if (x_copy.is_included_in(x)) {
+    join_assign(y);
+    return true;
+  }
+
+  return false;
+}
+
+void
+PPL::Grid::grid_difference_assign(const Grid& y) {
+  Grid& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("poly_difference_assign(y)", "y", y);
+
+  if (y.marked_empty() || x.marked_empty())
+    return;
+
+  // If both grids are zero-dimensional, then they are necessarily
+  // universe grids, so the result is empty.
+  if (x.space_dim == 0) {
+    x.set_empty();
+    return;
+  }
+
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
+
+  Grid new_grid(x.space_dim, EMPTY);
+
+  const Congruence_System& y_cgs = y.congruences();
+  for (Congruence_System::const_iterator i = y_cgs.begin(),
+	 y_cgs_end = y_cgs.end(); i != y_cgs_end; ++i) {
+    const Congruence& cg = *i;
+
+    // The 2-complement cg2 of cg = ((e %= 0) / m) is the congruence
+    // defining the sets of points exactly half-way between successive
+    // hyperplanes e = km and e = (k+1)m, for any integer k; that is,
+    // the hyperplanes defined by 2e = (2k + 1)m, for any integer k.
+    // Thus `cg2' is the congruence ((2e %= m) / 2m).
+
+    // As the grid difference must be a grid, only add the
+    // 2-complement congruence to x if the resulting grid includes all
+    // the points in x that did not satisfy `cg'.
+
+    // The 2-complement of cg can be included in the result only if x
+    // holds points other than those in cg.
+    if (x.relation_with(cg).implies(Poly_Con_Relation::is_included()))
+      continue;
+
+    if (cg.is_proper_congruence()) {
+      const Linear_Expression e = Linear_Expression(cg);
+      // Congruence cg is ((e %= 0) / m).
+      Coefficient_traits::const_reference m = cg.modulus();
+      // If x is included in the grid defined by the congruences cg
+      // and its 2-complement (i.e. the grid defined by the congruence
+      // (2e %= 0) / m) then add the 2-complement to the potential
+      // result.
+      if (x.relation_with((2*e %= 0) / m)
+	  .implies(Poly_Con_Relation::is_included())) {
+	Grid z = x;
+	z.add_congruence((2*e %= m) / (2*m));
+	new_grid.join_assign(z);
+	continue;
+      }
+    }
+    return;
+  }
+
+  *this = new_grid;
+
+  assert(OK());
+}
+
+void
+PPL::Grid::affine_image(const Variable var,
+			const Linear_Expression& expr,
+			Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' must be at most the dimension of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+  // `var' must be one of the dimensions of the grid.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+  if (marked_empty())
+    return;
+
+  if (var_space_dim <= expr_space_dim && expr[var_space_dim] != 0) {
+    // The transformation is invertible.
+    if (generators_are_up_to_date()) {
+      // Grid_Generator_System::affine_image() requires the third argument
+      // to be a positive Coefficient.
+      if (denominator > 0)
+	gen_sys.affine_image(var_space_dim, expr, denominator);
+      else
+	gen_sys.affine_image(var_space_dim, -expr, -denominator);
+      clear_generators_minimized();
+      // Strong normalization in gs::affine_image may have modified
+      // divisors.
+      normalize_divisors(gen_sys);
+    }
+    if (congruences_are_up_to_date()) {
+      // To build the inverse transformation,
+      // after copying and negating `expr',
+      // we exchange the roles of `expr[var_space_dim]' and `denominator'.
+      Linear_Expression inverse;
+      if (expr[var_space_dim] > 0) {
+	inverse = -expr;
+	inverse[var_space_dim] = denominator;
+	con_sys.affine_preimage(var_space_dim, inverse, expr[var_space_dim]);
+      }
+      else {
+	// The new denominator is negative:
+	// we negate everything once more, as Congruence_System::affine_preimage()
+	// requires the third argument to be positive.
+	inverse = expr;
+	inverse[var_space_dim] = denominator;
+	neg_assign(inverse[var_space_dim]);
+	con_sys.affine_preimage(var_space_dim, inverse, -expr[var_space_dim]);
+      }
+      clear_congruences_minimized();
+    }
+  }
+  else {
+    // The transformation is not invertible.
+    // We need an up-to-date system of generators.
+    if (!generators_are_up_to_date())
+      minimize();
+    if (!marked_empty()) {
+      // Grid_Generator_System::affine_image() requires the third argument
+      // to be a positive Coefficient.
+      if (denominator > 0)
+	gen_sys.affine_image(var_space_dim, expr, denominator);
+      else
+	gen_sys.affine_image(var_space_dim, -expr, -denominator);
+
+      clear_congruences_up_to_date();
+      clear_generators_minimized();
+      // Strong normalization in gs::affine_image may have modified
+      // divisors.
+      normalize_divisors(gen_sys);
+    }
+  }
+  assert(OK());
+}
+
+void
+PPL::Grid::
+affine_preimage(const Variable var,
+		const Linear_Expression& expr,
+		Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var);
+
+  if (marked_empty())
+    return;
+
+  if (var_space_dim <= expr_space_dim && expr[var_space_dim] != 0) {
+    // The transformation is invertible.
+    if (congruences_are_up_to_date()) {
+      // Congruence_System::affine_preimage() requires the third argument
+      // to be a positive Coefficient.
+      if (denominator > 0)
+	con_sys.affine_preimage(var_space_dim, expr, denominator);
+      else
+	con_sys.affine_preimage(var_space_dim, -expr, -denominator);
+      clear_congruences_minimized();
+    }
+    if (generators_are_up_to_date()) {
+      // To build the inverse transformation,
+      // after copying and negating `expr',
+      // we exchange the roles of `expr[var_space_dim]' and `denominator'.
+      Linear_Expression inverse;
+      if (expr[var_space_dim] > 0) {
+	inverse = -expr;
+	inverse[var_space_dim] = denominator;
+	gen_sys.affine_image(var_space_dim, inverse, expr[var_space_dim]);
+      }
+      else {
+	// The new denominator is negative:
+	// we negate everything once more, as Grid_Generator_System::affine_image()
+	// requires the third argument to be positive.
+	inverse = expr;
+	inverse[var_space_dim] = denominator;
+	neg_assign(inverse[var_space_dim]);
+	gen_sys.affine_image(var_space_dim, inverse, -expr[var_space_dim]);
+      }
+      clear_generators_minimized();
+    }
+  }
+  else {
+    // The transformation is not invertible.
+    // We need an up-to-date system of congruences.
+    if (!congruences_are_up_to_date())
+      minimize();
+    // Congruence_System::affine_preimage() requires the third argument
+    // to be a positive Coefficient.
+    if (denominator > 0)
+      con_sys.affine_preimage(var_space_dim, expr, denominator);
+    else
+      con_sys.affine_preimage(var_space_dim, -expr, -denominator);
+
+    clear_generators_up_to_date();
+    clear_congruences_minimized();
+  }
+  assert(OK());
+}
+
+void
+PPL::Grid::
+generalized_affine_image(const Variable var,
+			 const Linear_Expression& expr,
+			 Coefficient_traits::const_reference denominator,
+			 Coefficient_traits::const_reference modulus) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+				 "e", expr);
+  // `var' should be one of the dimensions of the grid.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+				 "v", var);
+
+  // Any image of an empty grid is empty.
+  if (marked_empty())
+    return;
+
+  affine_image(var, expr, denominator);
+
+  if (modulus == 0)
+    return;
+
+  // Modulate dimension `var' according to `modulus'.
+
+  generators_are_up_to_date() || minimize();
+
+  // Test if minimization, possibly in affine_image, found an empty
+  // grid.
+  if (marked_empty())
+    return;
+
+  if (modulus < 0)
+    gen_sys.insert(parameter(-modulus * var));
+  else
+    gen_sys.insert(parameter(modulus * var));
+
+  normalize_divisors(gen_sys);
+
+  clear_generators_minimized();
+  clear_congruences_up_to_date();
+
+  assert(OK());
+}
+
+void PPL::Grid::
+generalized_affine_preimage(const Variable var,
+			    const Linear_Expression& expr,
+			    Coefficient_traits::const_reference denominator,
+			    Coefficient_traits::const_reference modulus) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_preimage(v, e, d, m)",
+			   "d == 0");
+
+  // The dimension of `expr' should be at most the dimension of
+  // `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, e, d, m)",
+				 "e", expr);
+  // `var' should be one of the dimensions of the grid.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, e, d, m)",
+				 "v", var);
+
+  // Check whether the affine relation is an affine function.
+  if (modulus == 0) {
+    affine_preimage(var, expr, denominator);
+    return;
+  }
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  Coefficient_traits::const_reference var_coefficient = expr.coefficient(var);
+  if (var_space_dim <= expr_space_dim && var_coefficient != 0) {
+    Linear_Expression inverse_expr
+      = expr - (denominator + var_coefficient) * var;
+    Coefficient inverse_denominator = - var_coefficient;
+    if (modulus < 0)
+      generalized_affine_image(var, inverse_expr, inverse_denominator,
+			       - modulus);
+    else
+      generalized_affine_image(var, inverse_expr, inverse_denominator,
+			       modulus);
+    return;
+  }
+
+  // Here `var_coefficient == 0', so that the preimage cannot be
+  // easily computed by inverting the affine relation.  Add the
+  // congruence induced by the affine relation.
+  if (modulus < 0)
+    add_congruence((denominator*var %= expr) / denominator /= - modulus);
+  else
+    add_congruence((denominator*var %= expr) / denominator /= modulus);
+
+  // If the resulting grid is empty, its preimage is empty too.
+  // Note: DO check for emptyness here, as we will later add a line.
+  if (is_empty())
+    return;
+  add_generator(grid_line(var));
+  assert(OK());
+}
+
+void
+PPL::Grid::
+generalized_affine_image(const Linear_Expression& lhs,
+			 const Linear_Expression& rhs,
+			 Coefficient_traits::const_reference modulus) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should be at most the dimension of
+  // `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e1", lhs);
+  // The dimension of `rhs' should be at most the dimension of
+  // `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e2", rhs);
+
+  // Any image of an empty grid is empty.
+  if (marked_empty())
+    return;
+
+  TEMP_INTEGER(mod);
+  if (modulus < 0)
+    mod = -modulus;
+  else
+    mod = modulus;
+
+  // Compute the actual space dimension of `lhs',
+  // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+  do {
+    if (lhs_space_dim == 0) {
+      // All variables have zero coefficients, so `lhs' is a constant.
+      add_congruence((lhs %= rhs) / mod);
+      return;
+    }
+  }
+  while (lhs.coefficient(Variable(--lhs_space_dim)) == 0);
+
+  // Gather in `new_lines' the collections of all the lines having the
+  // direction of variables occurring in `lhs'.  While at it, check
+  // whether there exists a variable occurring in both `lhs' and
+  // `rhs'.
+  Grid_Generator_System new_lines;
+  bool lhs_vars_intersect_rhs_vars = false;
+  for (dimension_type i = lhs_space_dim + 1; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0) {
+      new_lines.insert(Grid_Generator::line(Variable(i)));
+      if (rhs.coefficient(Variable(i)) != 0)
+	lhs_vars_intersect_rhs_vars = true;
+    }
+
+  if (lhs_vars_intersect_rhs_vars) {
+    // Some variables in `lhs' also occur in `rhs'.
+    // To ease the computation, add an additional dimension.
+    const Variable new_var = Variable(space_dim);
+    add_space_dimensions_and_embed(1);
+
+    // Constrain the new dimension to be equal to the right hand side.
+    // TODO: Use add_congruence_and_minimize() when it has been updated.
+    Congruence_System new_cgs1(new_var == rhs);
+    if (add_recycled_congruences_and_minimize(new_cgs1)) {
+      // The grid still contains points.
+
+      // Cylindrificate on all the variables occurring in the left
+      // hand side expression.
+
+      // Ajust `new_lines' to the right dimension.
+      new_lines.insert(parameter(0*Variable(space_dim-1)));
+      // Add the lines to `gen_sys'.
+      gen_sys.recycling_insert(new_lines);
+      normalize_divisors(gen_sys);
+      // Update the flags.
+      clear_congruences_up_to_date();
+      clear_generators_minimized();
+
+      // Constrain the new dimension so that it is congruent to the left
+      // hand side expression modulo `mod'.
+      // TODO: Use add_congruence() when it has been updated.
+      Congruence_System new_cgs2((lhs %= new_var) / mod);
+      add_recycled_congruences(new_cgs2);
+    }
+
+    // Remove the temporarily added dimension.
+    remove_higher_space_dimensions(space_dim-1);
+  }
+  else {
+    // `lhs' and `rhs' variables are disjoint:
+    // there is no need to add a further dimension.
+
+    // Only add the lines and congruence if there are points.
+    if (is_empty())
+      return;
+
+    // Cylindrificate on all the variables occurring in the left hand
+    // side expression.
+    add_recycled_generators(new_lines);
+
+    // Constrain the left hand side expression so that it is congruent to
+    // the right hand side expression modulo `mod'.
+    add_congruence((lhs %= rhs) / mod);
+  }
+
+  assert(OK());
+}
+
+void PPL::Grid::
+generalized_affine_preimage(const Linear_Expression& lhs,
+			    const Linear_Expression& rhs,
+			    Coefficient_traits::const_reference modulus) {
+  // The dimension of `lhs' must be at most the dimension of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, e2, m)",
+				 "lhs", lhs);
+  // The dimension of `rhs' must be at most the dimension of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, e2, m)",
+				 "e2", rhs);
+
+  // Any preimage of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  TEMP_INTEGER(mod);
+  if (modulus < 0)
+    mod = -modulus;
+  else
+    mod = modulus;
+
+  // Compute the actual space dimension of `lhs',
+  // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+  do {
+    if (lhs_space_dim == 0) {
+      // All variables have zero coefficients, so `lhs' is a constant.
+      // In this case, preimage and image happen to be the same.
+      add_congruence((lhs %= rhs) / mod);
+      return;
+    }
+  }
+  while (lhs.coefficient(Variable(--lhs_space_dim)) == 0);
+
+  // Gather in `new_lines' the collections of all the lines having
+  // the direction of variables occurring in `lhs'.
+  // While at it, check whether or not there exists a variable
+  // occurring in both `lhs' and `rhs'.
+  Grid_Generator_System new_lines;
+  bool lhs_vars_intersect_rhs_vars = false;
+  for (dimension_type i = lhs_space_dim + 1; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0) {
+      new_lines.insert(Grid_Generator::line(Variable(i)));
+      if (rhs.coefficient(Variable(i)) != 0)
+	lhs_vars_intersect_rhs_vars = true;
+    }
+
+  if (lhs_vars_intersect_rhs_vars) {
+    // Some variables in `lhs' also occur in `rhs'.
+    // To ease the computation, add an additional dimension.
+    const Variable new_var = Variable(space_dim);
+    add_space_dimensions_and_embed(1);
+
+    // Constrain the new dimension to be equal to `lhs'
+    // TODO: Use add_congruence_and_minimize() when it has been updated.
+    Congruence_System new_cgs1(new_var == lhs);
+    if (add_recycled_congruences_and_minimize(new_cgs1)) {
+      // The grid still contains points.
+
+      // Cylindrificate on all the variables occurring in the left
+      // hand side
+
+      // Ajust `new_lines' to the right dimension.
+      new_lines.insert(parameter(0*Variable(space_dim-1)));
+      // Add the lines to `gen_sys'.
+      gen_sys.recycling_insert(new_lines);
+      normalize_divisors(gen_sys);
+      // Update the flags.
+      clear_congruences_up_to_date();
+      clear_generators_minimized();
+
+      // Constrain the new dimension so that it is related to
+      // the right hand side modulo `mod'.
+      // TODO: Use add_congruence() when it has been updated.
+      Congruence_System new_cgs2((rhs %= new_var) / mod);
+      add_recycled_congruences(new_cgs2);
+    }
+
+    // Remove the temporarily added dimension.
+    remove_higher_space_dimensions(space_dim-1);
+  }
+  else {
+    // `lhs' and `rhs' variables are disjoint:
+    // there is no need to add a further dimension.
+
+    // Constrain the left hand side expression so that it is congruent to
+    // the right hand side expression modulo `mod'.
+    add_congruence((lhs %= rhs) / mod);
+
+    // Any image of an empty grid is empty.
+    if (is_empty())
+      return;
+
+    // FIXME: Confirm that it is OK for this to follow the
+    //        add_congruence, whereas in the branch above (and in
+    //        affine_image, and in Polyhedron) it comes first.
+    // Cylindrificate on all the variables occurring in `lhs'.
+    add_recycled_generators(new_lines);
+  }
+  assert(OK());
+}
+
+void
+PPL::Grid::time_elapse_assign(const Grid& y) {
+  Grid& x = *this;
+  // Check dimension-compatibility.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("time_elapse_assign(y)", "y", y);
+
+  // Deal with the zero-dimensional case.
+  if (x.space_dim == 0) {
+    if (y.marked_empty())
+      x.set_empty();
+    return;
+  }
+
+  // If either one of `x' or `y' is empty, the result is empty too.
+  if (x.marked_empty())
+    return;
+  if (y.marked_empty()
+      || (!x.generators_are_up_to_date() && !x.update_generators())
+      || (!y.generators_are_up_to_date() && !y.update_generators())) {
+    x.set_empty();
+    return;
+  }
+
+  // At this point both generator systems are up-to-date.
+  Grid_Generator_System gs = y.gen_sys;
+  dimension_type gs_num_rows = gs.num_generators();
+
+  normalize_divisors(gs, gen_sys);
+
+  for (dimension_type i = gs_num_rows; i-- > 0; ) {
+    Grid_Generator& g = gs[i];
+    if (g.is_point()) {
+      // Transform the point into a parameter.
+      TEMP_INTEGER(div);
+      div = g.divisor();
+      g.divisor() = 0;
+      g.divisor() = div;
+    }
+  }
+
+  if (gs_num_rows == 0)
+    // `y' was the grid containing a single point at the origin, so
+    // the result is `x'.
+    return;
+
+  // Append `gs' to the generators of `x'.
+
+  gen_sys.recycling_insert(gs);
+
+  x.clear_congruences_up_to_date();
+  x.clear_generators_minimized();
+
+  assert(x.OK(true) && y.OK(true));
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid */
+bool
+PPL::operator==(const Grid& x, const Grid& y) {
+  if (x.space_dim != y.space_dim)
+    return false;
+
+  if (x.marked_empty())
+    return y.is_empty();
+  if (y.marked_empty())
+    return x.is_empty();
+  if (x.space_dim == 0)
+    return true;
+
+  switch (x.quick_equivalence_test(y)) {
+  case Grid::TVB_TRUE:
+    return true;
+
+  case Grid::TVB_FALSE:
+    return false;
+
+  default:
+    if (x.is_included_in(y)) {
+      if (x.marked_empty())
+	return y.is_empty();
+      return y.is_included_in(x);
+    }
+    return false;
+  }
+}
+
+bool
+PPL::Grid::contains(const Grid& y) const {
+  const Grid& x = *this;
+
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("contains(y)", "y", y);
+
+  if (y.marked_empty())
+    return true;
+  if (x.marked_empty())
+    return y.is_empty();
+  if (y.space_dim == 0)
+    return true;
+  if (x.quick_equivalence_test(y) == Grid::TVB_TRUE)
+    return true;
+  return y.is_included_in(x);
+}
+
+bool
+PPL::Grid::is_disjoint_from(const Grid& y) const {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("is_disjoint_from(y)", "y", y);
+  Grid z = *this;
+  return !z.intersection_assign_and_minimize(y);
+}
+
+void
+PPL::Grid::ascii_dump(std::ostream& s) const {
+  using std::endl;
+
+  s << "space_dim "
+    << space_dim
+    << endl;
+  status.ascii_dump(s);
+  s << "con_sys ("
+    << (congruences_are_up_to_date() ? "" : "not_")
+    << "up-to-date)"
+    << endl;
+  con_sys.ascii_dump(s);
+  s << "gen_sys ("
+    << (generators_are_up_to_date() ? "" : "not_")
+    << "up-to-date)"
+    << endl;
+  gen_sys.ascii_dump(s);
+  s << "dimension_kinds";
+  if ((generators_are_up_to_date() && generators_are_minimized())
+      || (congruences_are_up_to_date() && congruences_are_minimized()))
+    for (Dimension_Kinds::const_iterator i = dim_kinds.begin();
+	 i != dim_kinds.end();
+	 ++i)
+      s << " " << *i;
+  s << endl;
+}
+
+PPL_OUTPUT_DEFINITIONS(Grid);
+
+bool
+PPL::Grid::ascii_load(std::istream& s) {
+  std::string str;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> space_dim))
+    return false;
+
+  if (!status.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "con_sys")
+    return false;
+
+  if (s >> str) {
+    if (str == "(up-to-date)")
+      set_congruences_up_to_date();
+    else if (str != "(not_up-to-date)")
+      return false;
+  }
+  else
+    return false;
+
+  if (!con_sys.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "gen_sys")
+    return false;
+
+  if (s >> str) {
+    if (str == "(up-to-date)")
+      set_generators_up_to_date();
+    else if (str != "(not_up-to-date)")
+      return false;
+  }
+  else
+    return false;
+
+  if (!gen_sys.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "dimension_kinds")
+    return false;
+
+  if (!marked_empty()
+      && ((generators_are_up_to_date() && generators_are_minimized())
+	  || (congruences_are_up_to_date() && congruences_are_minimized()))) {
+    dim_kinds.resize(space_dim + 1);
+    for (Dimension_Kinds::size_type dim = 0; dim <= space_dim; ++dim) {
+      short unsigned int dim_kind;
+      if (!(s >> dim_kind))
+	return false;
+      switch(dim_kind) {
+      case 0: dim_kinds[dim] = PARAMETER; break;
+      case 1: dim_kinds[dim] = LINE; break;
+      case 2: dim_kinds[dim] = GEN_VIRTUAL; break;
+      default: return false;
+      }
+    }
+  }
+
+
+  // Check for well-formedness.
+  assert(OK());
+  return true;
+}
+
+PPL::memory_size_type
+PPL::Grid::external_memory_in_bytes() const {
+  return
+    con_sys.external_memory_in_bytes()
+    + gen_sys.external_memory_in_bytes();
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Grid& gr) {
+  if (gr.is_empty())
+    s << "false";
+  else if (gr.is_universe())
+    s << "true";
+  else
+    s << gr.minimized_congruences();
+  return s;
+}
diff --git a/src/Grid_simplify.cc b/src/Grid_simplify.cc
new file mode 100644
index 0000000..66a2cbe
--- /dev/null
+++ b/src/Grid_simplify.cc
@@ -0,0 +1,660 @@
+/* Grid class implementation: simplify().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include <cassert>
+
+#include "Grid.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#define TRACE(x)
+//#define TRACE(x) x
+
+TRACE(using std::endl);
+TRACE(using std::cerr);
+
+#ifdef STRONG_REDUCTION
+template <typename M, typename R>
+void
+Grid::reduce_reduced(M& sys, dimension_type dim, dimension_type pivot_index,
+		     dimension_type start, dimension_type end,
+		     Dimension_Kinds& dim_kinds, bool generators) {
+  R& pivot = sys[pivot_index];
+
+  TEMP_INTEGER(pivot_dim);
+  pivot_dim = pivot[dim];
+
+  if (pivot_dim == 0)
+    return;
+
+  TEMP_INTEGER(pivot_dim_half);
+  pivot_dim_half = (pivot_dim + 1) / 2;
+  Dimension_Kind row_kind = dim_kinds[dim];
+  Dimension_Kind line_or_equality, virtual_kind;
+  int jump;
+  if (generators) {
+    line_or_equality = LINE;
+    virtual_kind = GEN_VIRTUAL;
+    jump = -1;
+  } else {
+    line_or_equality = EQUALITY;
+    virtual_kind = CON_VIRTUAL;
+    jump = 1;
+  }
+
+  for (dimension_type row_index = pivot_index, kinds_index = dim + jump;
+       row_index-- > 0;
+       kinds_index += jump) {
+    // Move over any virtual rows.
+    while (dim_kinds[kinds_index] == virtual_kind)
+      kinds_index += jump;
+
+    if (row_kind == line_or_equality
+	|| (row_kind == PARAMETER // a.k.a. CONGRUENCE
+	    && dim_kinds[kinds_index] == PARAMETER)) {
+      R& row = sys[row_index];
+
+      TEMP_INTEGER(row_dim);
+      row_dim = row[dim];
+      // num_rows_to_subtract may be positive or negative.
+      TEMP_INTEGER(num_rows_to_subtract);
+      num_rows_to_subtract = row_dim / pivot_dim;
+
+      // Ensure that after subtracting num_rows_to_subtract * r_dim
+      // from row_dim,
+      // -pivot_dim_half < row_dim <= pivot_dim_half.  E.g., if pivot[dim] =
+      // 9, then after strong reduction -5 < row_dim <= 5.
+      Coefficient& row_dim_rem = row_dim;
+      row_dim_rem %= pivot_dim;
+      if (row_dim_rem < 0) {
+	if (row_dim_rem <= -pivot_dim_half)
+	  --num_rows_to_subtract;
+      }
+      else if (row_dim_rem > 0 && row_dim_rem > pivot_dim_half)
+	num_rows_to_subtract++;
+
+      // Subtract num_rows_to_subtract copies of pivot from row i.  Only the
+      // entries from dim need to be subtracted, as the preceding
+      // entries are all zero.
+      // If num_rows_to_subtract is negative, these copies of pivot are
+      // added to row i.
+      if (num_rows_to_subtract != 0)
+	for (dimension_type col = start; col <= end; ++col)
+	  row[col] -= num_rows_to_subtract * pivot[col];
+    }
+  }
+}
+#endif // STRONG_REDUCTION
+
+inline void
+Grid::reduce_line_with_line(Grid_Generator& row, Grid_Generator& pivot,
+			    dimension_type column) {
+  TRACE(cerr << "reduce_line_with_line" << endl);
+
+  TEMP_INTEGER(gcd);
+  gcd_assign(gcd, pivot[column], row[column]);
+  // Store the reduced ratio between pivot[column] and row[column].
+  TEMP_INTEGER(red_pivot_col);
+  TEMP_INTEGER(red_row_col);
+  red_pivot_col = pivot[column] / gcd;
+  red_row_col = row[column] / gcd;
+  // Multiply row, then subtract from it a multiple of pivot such that
+  // the result in row[column] is zero.
+  row[column] = 0;
+  for (dimension_type col = pivot.size() - 2 /* parameter divisor, index */;
+       col > column;
+       --col)
+    row[col] = (red_pivot_col * row[col]) - (red_row_col * pivot[col]);
+}
+
+inline void
+Grid::reduce_equality_with_equality(Congruence& row, Congruence& pivot,
+				    dimension_type column) {
+  TRACE(cerr << "reduce_equality_with_equality" << endl);
+  // Assume two equalities.
+  assert(row.modulus() == 0 && pivot.modulus() == 0);
+
+  TEMP_INTEGER(gcd);
+  gcd_assign(gcd, pivot[column], row[column]);
+  // Store the reduced ratio between pivot[column] and row[column].
+  TEMP_INTEGER(red_pivot_col);
+  TEMP_INTEGER(red_row_col);
+  red_pivot_col = pivot[column] / gcd;
+  red_row_col = row[column] / gcd;
+  // Multiply row, then subtract from it a multiple of pivot such that
+  // the result in row[column] is zero.
+  row[column] = 0;
+  for (dimension_type col = 0; col < column; ++col)
+    row[col] = (red_pivot_col * row[col]) - (red_row_col * pivot[col]);
+}
+
+template <typename R>
+void
+Grid::reduce_pc_with_pc(R& row, R& pivot,
+			dimension_type column,
+			dimension_type start,
+			dimension_type end) {
+  TEMP_INTEGER(gcd);
+  TEMP_INTEGER(s);
+  TEMP_INTEGER(t);
+  gcdext_assign(gcd, pivot[column], row[column], s, t);
+  // Now pivot[column] * s + row[column] * t == gcd.
+  TRACE(cerr << "  gcd " << gcd << ", s " << s << ", t " << t << endl);
+
+  // Store the reduced ratio between pivot[column] and row[column].
+  TEMP_INTEGER(red_pivot_col);
+  TEMP_INTEGER(red_row_col);
+  red_pivot_col = pivot[column] / gcd;
+  red_row_col = row[column] / gcd;
+  TRACE(cerr << "  red_pivot_col " << red_pivot_col
+	     << ", red_row_col " << red_row_col << endl);
+
+  // Multiply row, then subtract from it a multiple of pivot such that
+  // the result in row[column] is zero.  Afterwards, multiply pivot,
+  // then add to it a (possibly negative) multiple of row such that
+  // the result in pivot[column] is the smallest possible positive
+  // integer.
+  assert(pivot.size() > 0);
+  assert(row.size() > 0);
+  pivot[column] = gcd;
+  row[column] = 0;
+  for (dimension_type col = start; col < end; ++col) {
+    TEMP_INTEGER(pivot_col);
+    TEMP_INTEGER(row_col);
+    pivot_col = pivot[col];
+    row_col = row[col];
+    pivot[col] = (s * pivot_col) + (t * row_col);
+    row[col] = (red_pivot_col * row_col) - (red_row_col * pivot_col);
+  }
+}
+
+void
+Grid::reduce_parameter_with_line(Grid_Generator& row,
+				 Grid_Generator& pivot,
+				 dimension_type column,
+				 Grid_Generator_System& sys) {
+  // Very similar to reduce_congruence_with_equality below.  Any
+  // change here may be needed there too.
+  TRACE(cerr << "reduce_parameter_with_line" << endl);
+
+  dimension_type num_cols = sys.num_columns() - 1 /* parameter divisor */;
+
+  // If the elements at column in row and pivot are the same, then
+  // just subtract pivot from row.
+  if (row[column] == pivot[column]) {
+    for (dimension_type col = 0; col < num_cols; ++col)
+      row[col] -= pivot[col];
+    return;
+  }
+
+  TEMP_INTEGER(gcd);
+  gcd_assign(gcd, pivot[column], row[column]);
+  // Store the reduced ratio between pivot[column] and row[column].
+  TEMP_INTEGER(red_pivot_col);
+  TEMP_INTEGER(red_row_col);
+  red_pivot_col = pivot[column] / gcd;
+  red_row_col = row[column] / gcd;
+
+  // Multiply row such that a multiple of pivot can be subtracted from
+  // it below to render row[column] zero.  This requires multiplying
+  // all other parameters to match.
+#ifdef STRONG_REDUCTION
+  // Ensure that the multiplier is positive, so that the preceding
+  // diagonals (including the divisor) remain positive.  It's safe to
+  // swap the signs as row[column] will still come out 0.
+  if (red_pivot_col < 0) {
+    neg_assign(red_pivot_col);
+    neg_assign(red_row_col);
+  }
+#endif
+  for (dimension_type index = 0; index < sys.num_generators(); ++index) {
+    Grid_Generator& row = sys[index];
+    if (row.is_parameter_or_point())
+      for (dimension_type col = 0; col < num_cols; ++col)
+        row[col] *= red_pivot_col;
+  }
+  // Subtract from row a multiple of pivot such that the result in
+  // row[column] is zero.
+  row[column] = 0;
+  for (dimension_type col = num_cols - 1; col > column; --col)
+    row[col] -= red_row_col * pivot[col];
+}
+
+void
+Grid::reduce_congruence_with_equality(Congruence& row,
+				      Congruence& pivot,
+				      dimension_type column,
+				      Congruence_System& sys) {
+  // Very similar to reduce_parameter_with_line above.  Any change
+  // here may be needed there too.
+  TRACE(cerr << "reduce_congruence_with_equality" << endl);
+  assert(row.modulus() > 0 && pivot.modulus() == 0);
+
+  dimension_type num_cols = sys.num_columns();
+
+  // If the elements at `column' in row and pivot are the same, then
+  // just subtract `pivot' from `row'.
+  if (row[column] == pivot[column]) {
+    for (dimension_type col = 0; col < num_cols; ++col)
+      row[col] -= pivot[col];
+    return;
+  }
+
+  TEMP_INTEGER(gcd);
+  gcd_assign(gcd, pivot[column], row[column]);
+  TEMP_INTEGER(red_pivot_col);
+  TEMP_INTEGER(red_row_a);
+  red_pivot_col = pivot[column] / gcd;
+  red_row_a = row[column] / gcd;
+  // Ensure that `red_pivot_col' is positive, so that the modulus
+  // remains positive when multiplying the proper congruences below.
+  // It's safe to swap the signs as row[column] will still come out 0.
+  if (red_pivot_col < 0) {
+    neg_assign(red_pivot_col);
+    neg_assign(red_row_a);
+  }
+  // Multiply `row', including the modulus, by red_pivot_col.  To keep
+  // all the moduli the same this requires multiplying all the other
+  // proper congruences in the same way.
+  for (dimension_type index = 0; index < sys.num_rows(); ++index) {
+    Congruence& row = sys[index];
+    if (row.is_proper_congruence())
+      for (dimension_type col = 0; col < num_cols; ++col)
+        row[col] *= red_pivot_col;
+  }
+  --num_cols;			// Modulus.
+  row[column] = 0;
+  // Subtract from row a multiple of pivot such that the result in
+  // row[column] is zero.
+  for (dimension_type col = 0; col < column; ++col)
+    row[col] -= red_row_a * pivot[col];
+}
+
+#ifndef NDEBUG
+template <typename M, typename R>
+bool
+Grid::rows_are_zero(M& system, dimension_type first,
+		    dimension_type last, dimension_type row_size) {
+  while (first <= last) {
+    R& row = system[first++];
+    for (dimension_type col = 0; col < row_size; ++col)
+      if (row[col] != 0)
+	return false;
+  }
+  return true;
+}
+#endif
+
+void
+Grid::simplify(Grid_Generator_System& sys, Dimension_Kinds& dim_kinds) {
+  TRACE(cerr << "==== simplify (reduce) gs:" << endl);
+  TRACE(cerr << "sys:" << endl);
+  TRACE(sys.ascii_dump(cerr));
+  assert(sys.num_generators() > 0);
+  assert(sys.num_columns() > 0); // For reduce_pc_with_pc.
+
+  // Changes here may also be required in the congruence version
+  // below.
+
+  dimension_type num_cols = sys.num_columns() - 1 /* parameter divisor */;
+
+  if (dim_kinds.size() != num_cols)
+    dim_kinds.resize(num_cols);
+
+  dimension_type num_rows = sys.num_generators();
+  TRACE(cerr << "  num_rows " << num_rows << endl);
+
+  // For each dimension `dim' move or construct a row into position
+  // `pivot_index' such that the row has zero in all elements
+  // following column `dim' and a value other than zero in column
+  // `dim'.
+  dimension_type pivot_index = 0;
+  for (dimension_type dim = 0; dim < num_cols; ++dim) {
+    TRACE(cerr << "dim " << dim << endl);
+    trace_dim_kinds("  ", dim_kinds);
+
+    // Consider the pivot and following rows.
+    dimension_type row_index = pivot_index;
+    TRACE(cerr << "  row_index " << row_index << endl);
+
+    // Move down over rows which have zero in column `dim'.
+    while (row_index < num_rows && sys[row_index][dim] == 0) {
+      TRACE(cerr << "  .");
+      ++row_index;
+    }
+    TRACE(cerr << endl);
+
+    if (row_index == num_rows) {
+      // Element in column `dim' is zero in all rows from the pivot.
+      TRACE(cerr << "  Marking virtual row" << endl);
+      dim_kinds[dim] = GEN_VIRTUAL;
+    }
+    else {
+      if (row_index != pivot_index)
+	std::swap(sys[row_index], sys[pivot_index]);
+      Grid_Generator& pivot = sys[pivot_index];
+      bool pivot_is_line = pivot.is_line();
+
+      // Change the matrix so that the value at `dim' in every row
+      // following `pivot_index' is 0, leaving an equivalent grid.
+      TRACE(cerr << "  Reducing all following rows" << endl);
+      while (row_index < num_rows - 1) {
+	++row_index;
+	TRACE(cerr << "    row_index " << row_index << endl);
+
+	Grid_Generator& row = sys[row_index];
+
+	if (row[dim] == 0)
+	  continue;
+
+	if (row.is_line())
+	  if (pivot_is_line)
+	    reduce_line_with_line(row, pivot, dim);
+	  else {
+	    assert(pivot.is_parameter_or_point());
+	    std::swap(row, pivot);
+	    pivot_is_line = true;
+	    reduce_parameter_with_line(row, pivot, dim, sys);
+	  }
+	else {
+	  assert(row.is_parameter_or_point());
+	  if (pivot_is_line)
+	    reduce_parameter_with_line(row, pivot, dim, sys);
+	  else {
+	    assert(pivot.is_parameter_or_point());
+	    reduce_pc_with_pc(row, pivot, dim, dim + 1, num_cols);
+	  }
+	}
+      }
+
+      if (pivot_is_line)
+	dim_kinds[dim] = LINE;
+      else {
+	assert(pivot.is_parameter_or_point());
+	dim_kinds[dim] = PARAMETER;
+      }
+
+#ifdef STRONG_REDUCTION
+      // Ensure a positive follows the leading zeros.
+      if (pivot[dim] < 0)
+	pivot.negate(dim, num_cols - 1);
+      TRACE(cerr << "  rr pivot_index " << pivot_index << endl);
+      TRACE(sys.ascii_dump(cerr));
+      // Factor this row out of the preceding rows.
+      reduce_reduced<Grid_Generator_System, Grid_Generator>
+	(sys, dim, pivot_index, dim, num_cols - 1, dim_kinds);
+#endif
+
+      ++pivot_index;
+    }
+    TRACE(sys.ascii_dump(cerr));
+  }
+  trace_dim_kinds("gs simpl end ", dim_kinds);
+
+  // Clip any zero rows from the end of the matrix.
+  if (num_rows > pivot_index) {
+    TRACE(cerr << "clipping trailing" << endl);
+#ifndef NDEBUG
+    bool ret = rows_are_zero<Grid_Generator_System,Grid_Generator>
+      (sys,
+       pivot_index,		 // index of first
+       sys.num_generators() - 1, // index of last
+       sys.num_columns() - 1);	 // row size
+    assert(ret == true);
+#endif
+    sys.erase_to_end(pivot_index);
+  }
+
+  sys.unset_pending_rows();
+
+  // Ensure that the parameter divisors are the same as the system
+  // divisor.
+  TRACE(cerr << "updating param divisors" << endl);
+  Coefficient_traits::const_reference system_divisor = sys[0][0];
+  for (dimension_type row = 1, dim = 1, num_cols = sys.num_columns() - 1;
+       dim < num_cols;
+       ++dim)
+    switch (dim_kinds[dim]) {
+    case PARAMETER:
+      sys[row].divisor() = system_divisor;
+    case LINE:
+      ++row;
+    case GEN_VIRTUAL:
+      break;
+    }
+
+  assert(sys.OK());
+
+  TRACE(cerr << "---- simplify (reduce) gs done." << endl);
+}
+
+bool
+Grid::simplify(Congruence_System& sys, Dimension_Kinds& dim_kinds) {
+  TRACE(cerr << "======== simplify (reduce) cgs:" << endl);
+  TRACE(cerr << "sys:" << endl);
+  TRACE(sys.ascii_dump(cerr));
+  assert(sys.num_columns() > 2);
+
+  // Changes here may also be required in the generator version above.
+
+  // TODO: Consider normalizing the moduli only when congruences are
+  //       added to con_sys.
+  sys.normalize_moduli();
+
+  dimension_type num_cols = sys.num_columns() - 1 /* modulus */;
+
+  if (dim_kinds.size() != num_cols)
+    dim_kinds.resize(num_cols);
+
+  dimension_type num_rows = sys.num_rows();
+  TRACE(cerr << "  num_rows " << num_rows << endl);
+
+  // For each dimension `dim' move or construct a row into position
+  // `pivot_index' such that the row has a value of zero in all
+  // elements preceding column `dim' and some other value in column
+  // `dim'.
+  dimension_type pivot_index = 0;
+  for (dimension_type dim = num_cols; dim-- > 0; ) {
+    TRACE(cerr << "dim " << dim << endl);
+    trace_dim_kinds("  ", dim_kinds);
+
+    // Consider the pivot and following rows.
+    dimension_type row_index = pivot_index;
+    TRACE(cerr << "  row_index " << row_index << endl);
+
+    // Move down over rows which have zero in column `dim'.
+    while (row_index < num_rows && sys[row_index][dim] == 0) {
+      TRACE(cerr << "  .");
+      ++row_index;
+    }
+    TRACE(cerr << endl);
+
+    if (row_index == num_rows) {
+      // Element in column `dim' is zero in all rows from the pivot,
+      // or `sys' is empty of rows.
+      TRACE(cerr << "  Marking virtual row" << endl);
+      dim_kinds[dim] = CON_VIRTUAL;
+    }
+    else {
+      // row_index != num_rows
+      if (row_index != pivot_index)
+	std::swap(sys[row_index], sys[pivot_index]);
+      Congruence& pivot = sys[pivot_index];
+      bool pivot_is_equality = pivot.is_equality();
+
+      // Change the matrix so that the value at `dim' in every row
+      // following `pivot_index' is 0, leaving an equivalent grid.
+      TRACE(cerr << "  Reducing all following rows" << endl);
+      while (row_index < num_rows - 1) {
+	++row_index;
+	TRACE(cerr << "    row_index " << row_index << endl);
+
+	Congruence& row = sys[row_index];
+
+	if (row[dim] == 0)
+	  continue;
+
+	if (row.is_equality())
+	  if (pivot_is_equality)
+	    reduce_equality_with_equality(row, pivot, dim);
+	  else {
+	    assert(pivot.is_proper_congruence());
+	    std::swap(row, pivot);
+	    pivot_is_equality = true;
+	    reduce_congruence_with_equality(row, pivot, dim, sys);
+	  }
+	else {
+	  assert(row.is_proper_congruence());
+	  if (pivot_is_equality)
+	    reduce_congruence_with_equality(row, pivot, dim, sys);
+	  else {
+	    assert(pivot.is_proper_congruence());
+	    reduce_pc_with_pc(row, pivot, dim, 0, dim);
+	  }
+	}
+      }
+
+      if (pivot_is_equality)
+	dim_kinds[dim] = EQUALITY;
+      else {
+	assert(pivot.is_proper_congruence());
+	dim_kinds[dim] = PROPER_CONGRUENCE;
+      }
+
+#ifdef STRONG_REDUCTION
+      // Ensure a positive follows the leading zeros.
+      if (pivot[dim] < 0)
+	pivot.negate(0, dim);
+      // Factor this row out of the preceding ones.
+      reduce_reduced<Congruence_System, Congruence>
+	(sys, dim, pivot_index, 0, dim, dim_kinds, false);
+#endif
+      ++pivot_index;
+    }
+    TRACE(sys.ascii_dump(cerr));
+  } // end for (dimension_type dim = num_cols; dim-- > 0; )
+
+  dimension_type& reduced_num_rows = pivot_index; // For clearer naming.
+
+  // Clip any zero rows from the end of the matrix.
+  if (num_rows > 1 && num_rows > reduced_num_rows) {
+    TRACE(cerr << "clipping trailing" << endl);
+#ifndef NDEBUG
+    bool ret = rows_are_zero<Congruence_System,Congruence>
+      (sys,
+       reduced_num_rows,	// index of first
+       num_rows - 1,		// index of last
+       num_cols);		// row size
+    assert(ret == true);
+#endif
+    // Don't erase the last row as this will be changed to the integrality row.
+    // FIXME Simplify and improve code if possible.
+    if (reduced_num_rows > 0)
+      sys.erase_to_end(reduced_num_rows);
+    else
+      sys.erase_to_end(1);
+  }
+
+  assert(sys.num_rows() == reduced_num_rows
+	 || (sys.num_rows() == 1 && reduced_num_rows == 0));
+
+  if (reduced_num_rows > 0) {
+    // If the last row is false then make it the equality 1 = 0, and
+    // make it the only row.
+    Congruence& last_row = sys[reduced_num_rows - 1];
+    if (dim_kinds[0] == PROPER_CONGRUENCE) {
+      if (last_row.inhomogeneous_term() % last_row.modulus() != 0) {
+	// The last row is a false proper congruence.
+	last_row.set_is_equality();
+	dim_kinds[0] = EQUALITY;
+	goto return_empty;
+      }
+    }
+    else if (dim_kinds[0] == EQUALITY) {
+      // The last row is a false equality, as all the coefficient terms
+      // are zero while the inhomogeneous term (as a result of the
+      // reduced form) is some other value.
+    return_empty:
+      last_row[0] = 1;
+      dim_kinds.resize(1);
+      std::swap(sys.rows[0], sys.rows.back());
+      sys.erase_to_end(1);
+
+      trace_dim_kinds("cgs simpl end ", dim_kinds);
+      assert(sys.OK());
+      TRACE(cerr << "---- simplify (reduce) cgs done (empty)." << endl);
+      return true;
+    }
+  }
+  else if (num_rows > 0) {
+    assert(sys.num_rows() == 1);
+    // All columns up to the modulus column must have been zero, set
+    // up the integrality congruence.
+    dim_kinds[0] = PROPER_CONGRUENCE;
+    sys[0][num_cols] = 1;
+    reduced_num_rows = 1;
+  }
+
+  // Ensure that the last row is the integrality congruence.
+  dimension_type mod_index = num_cols;
+  if (dim_kinds[0] == CON_VIRTUAL) {
+    // The last row is virtual, append the integrality congruence.
+    dim_kinds[0] = PROPER_CONGRUENCE;
+    sys.add_zero_rows(1, Linear_Row::Flags(NECESSARILY_CLOSED,
+					   Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+    Congruence& new_last_row = sys[reduced_num_rows];
+    new_last_row[mod_index] = 1;
+    // Try use an existing modulus.
+    dimension_type row_index = reduced_num_rows;
+    while (row_index-- > 0) {
+      Congruence& row = sys[row_index];
+      if (row[mod_index] > 0) {
+	new_last_row[mod_index] = row[mod_index];
+	break;
+      }
+    }
+    new_last_row[0] = new_last_row[mod_index];
+#ifdef STRONG_REDUCTION
+    ++reduced_num_rows;
+#endif
+  }
+  else {
+    Congruence& last_row = sys[reduced_num_rows - 1];
+    last_row[0] = last_row[mod_index];
+  }
+
+#ifdef STRONG_REDUCTION
+  // Factor the modified integrality congruence out of the other rows.
+  reduce_reduced<Congruence_System, Congruence>
+    (sys, 0, reduced_num_rows - 1, 0, 0, dim_kinds, false);
+#endif
+
+  trace_dim_kinds("cgs simpl end ", dim_kinds);
+  assert(sys.OK());
+  TRACE(cerr << "---- simplify (reduce) cgs done." << endl);
+  return false;
+}
+
+#undef TRACE
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Grid_widenings.cc b/src/Grid_widenings.cc
new file mode 100644
index 0000000..4635c42
--- /dev/null
+++ b/src/Grid_widenings.cc
@@ -0,0 +1,226 @@
+/* Grid class implementation
+   (non-inline widening-related member functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid.defs.hh"
+
+#include <cassert>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid::select_wider_congruences(const Grid& y,
+				    Congruence_System& cgs_selected) const {
+  // Private method: the caller must ensure the following conditions
+  // (beside the inclusion `y <= x').
+  assert(space_dim == y.space_dim);
+  assert(!marked_empty());
+  assert(!y.marked_empty());
+  assert(congruences_are_minimized());
+  assert(y.congruences_are_minimized());
+
+  // Note: row counters start at 0, to preserve the original order in
+  // the selected congruences.
+  for (dimension_type dim = con_sys.space_dimension(), x_row = 0, y_row = 0;
+       dim > 0; --dim) {
+    assert(dim_kinds[dim] == CON_VIRTUAL
+	   || dim_kinds[dim] == y.dim_kinds[dim]);
+    switch (dim_kinds[dim]) {
+    case PROPER_CONGRUENCE:
+      {
+	const Congruence& cg = con_sys[x_row];
+	const Congruence& y_cg = y.con_sys[y_row];
+	if (cg.is_equal_at_dimension(dim, y_cg))
+	  // The leading diagonal entries are equal.
+	  cgs_selected.insert(cg);
+	++x_row;
+	++y_row;
+      }
+      break;
+    case EQUALITY:
+      cgs_selected.insert(con_sys[x_row]);
+      ++x_row;
+      ++y_row;
+      break;
+    case CON_VIRTUAL:
+      y.dim_kinds[dim] == CON_VIRTUAL || ++y_row;
+      break;
+    }
+  }
+}
+
+void
+PPL::Grid::widening_assign(const Grid& const_y, unsigned* tp) {
+  Grid& x = *this;
+  Grid& y = const_cast<Grid&>(const_y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("widening_assign(y)", "y", y);
+
+  // As noted in definitions.dox, stable behaviour is only garaunteed
+  // if y is contained in or equal to x.
+#ifndef NDEBUG
+  {
+    // Assume y is contained in or equal to x.
+    const Grid x_copy = x;
+    const Grid y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // Leave `x' the same if `x' or `y' is zero-dimensional or empty.
+  if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
+    return;
+
+  // Ensure that the `x' congruences are in minimal form.
+  if (x.congruences_are_up_to_date()) {
+    if (!x.congruences_are_minimized()) {
+      if (simplify(x.con_sys, x.dim_kinds)) {
+	// `x' is empty.
+	x.set_empty();
+	return;
+      }
+      x.set_congruences_minimized();
+    }
+  }
+  else
+    x.update_congruences();
+
+  // Ensure that the `y' congruences are in minimal form.
+  if (y.congruences_are_up_to_date()) {
+    if (!y.congruences_are_minimized()) {
+      if (simplify(y.con_sys, y.dim_kinds)) {
+	// `y' is empty.
+	y.set_empty();
+	return;
+      }
+      y.set_congruences_minimized();
+    }
+  }
+  else
+    y.update_congruences();
+
+  if (con_sys.num_equalities() < y.con_sys.num_equalities())
+    return;
+
+  // Copy into `cgs' the congruences of `x' that are common to `y',
+  // according to the grid widening.
+  Congruence_System cgs;
+  x.select_wider_congruences(y, cgs);
+
+  if (cgs.num_rows() == con_sys.num_rows())
+    // All congruences were selected, thus the result is `x'.
+    return;
+
+  // A strict subset of the congruences was selected.
+
+  Grid result(x.space_dim);
+  result.add_recycled_congruences(cgs);
+
+  // Check whether we are using the widening-with-tokens technique
+  // and there are still tokens available.
+  if (tp && *tp > 0) {
+    // There are tokens available.  If `result' is not a subset of
+    // `x', then it is less precise and we use one of the available
+    // tokens.
+    if (!x.contains(result))
+      --(*tp);
+  }
+  else
+    // No tokens.
+    std::swap(x, result);
+
+  assert(x.OK(true));
+}
+
+void
+PPL::Grid::limited_extrapolation_assign(const Grid& y,
+					const Congruence_System& cgs,
+					unsigned* tp) {
+  Grid& x = *this;
+
+  // Check dimension compatibility.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+				 "y", y);
+  // `cgs' must be dimension-compatible with the two grids.
+  const dimension_type cgs_space_dim = cgs.space_dimension();
+  if (x.space_dim < cgs_space_dim)
+    throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+				 "cgs", cgs);
+
+  dimension_type cgs_num_rows = cgs.num_rows();
+  // If `cgs' is empty (of rows), fall back to ordinary widening.
+  if (cgs_num_rows == 0) {
+    x.widening_assign(y, tp);
+    return;
+  }
+
+#ifndef NDEBUG
+  {
+    // Assume that y is contained in or equal to x.
+    const Grid x_copy = x;
+    const Grid y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty())
+    return;
+
+  // The limited widening between two grids in a zero-dimensional
+  // space is also a grid in a zero-dimensional space.
+  if (x.space_dim == 0)
+    return;
+
+  // Update the generators of `x': these are used to select, from the
+  // congruences in `cgs', those that must be added to the widened
+  // grid.
+  if (!x.generators_are_up_to_date() && !x.update_generators())
+    // `x' is empty.
+    return;
+
+  if (tp == NULL || *tp == 0) {
+    // Widening may change the grid, so add the congruences.
+    Congruence_System new_cgs;
+    // The congruences to be added need only be satisfied by all the
+    // generators of `x', as `y <= x'.  Iterate upwards here, to keep
+    // the relative ordering of congruences (just for aesthetics).
+    for (dimension_type i = 0; i < cgs_num_rows; ++i) {
+      const Congruence& cg = cgs[i];
+      if (x.relation_with(cg) == Poly_Con_Relation::is_included())
+	new_cgs.insert(cg);
+    }
+    x.widening_assign(y, tp);
+    x.add_congruences(new_cgs);
+  }
+  else
+    // There are tokens, so widening will leave the grid the same.
+    x.widening_assign(y, tp);
+
+  assert(OK());
+}
diff --git a/src/H79_Certificate.cc b/src/H79_Certificate.cc
new file mode 100644
index 0000000..c8841d2
--- /dev/null
+++ b/src/H79_Certificate.cc
@@ -0,0 +1,119 @@
+/* H79_Certificate class implementation
+   (non-inline member functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "H79_Certificate.defs.hh"
+
+#include "Polyhedron.defs.hh"
+#include <cassert>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::H79_Certificate::H79_Certificate(const Polyhedron& ph)
+  : affine_dim(0), num_constraints(0) {
+  // The affine dimension of the polyhedron is obtained by subtracting
+  // the number of equalities from the space dimension.
+  // When counting constraints, for a correct reasoning, we have
+  // to disregard the low-level constraints (i.e., the positivity
+  // constraint and epsilon bounds).
+  const dimension_type space_dim = ph.space_dimension();
+  affine_dim = space_dim;
+  const Constraint_System& cs = ph.minimized_constraints();
+  // It is assumed that `ph' is not an empty polyhedron.
+  assert(!ph.marked_empty());
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); i != cs_end; ++i) {
+    ++num_constraints;
+    if (i->is_equality())
+      --affine_dim;
+  }
+
+  // TODO: this is an inefficient workaround.
+  // For NNC polyhedra, generators might be no longer up-to-date
+  // (and hence, neither minimized) due to the strong minimization
+  // process applied to constraints when constructing the certificate.
+  // We have to reinforce the (normal) minimization of the generator
+  // system. The future, lazy implementation of the strong minimization
+  // process will solve this problem.
+  if (!ph.is_necessarily_closed())
+    ph.minimize();
+}
+
+int
+PPL::H79_Certificate::compare(const H79_Certificate& y) const {
+  if (affine_dim != y.affine_dim)
+    return affine_dim > y.affine_dim ? 1 : -1;
+  if (num_constraints != y.num_constraints)
+    return num_constraints > y.num_constraints ? 1 : -1;
+  // All components are equal.
+  return 0;
+}
+
+int
+PPL::H79_Certificate::compare(const Polyhedron& ph) const {
+  // The affine dimension of the polyhedron is obtained by subtracting
+  // the number of equalities from the space dimension.
+  // When counting constraints, for a correct reasoning, we have
+  // to disregard the low-level constraints (i.e., the positivity
+  // constraint and epsilon bounds).
+  const dimension_type space_dim = ph.space_dimension();
+  dimension_type ph_affine_dim = space_dim;
+  dimension_type ph_num_constraints = 0;
+  const Constraint_System& cs = ph.minimized_constraints();
+  // It is assumed that `ph' is a polyhedron containing the
+  // polyhedron described by `*this': hence, it cannot be empty.
+  assert(!ph.marked_empty());
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); i != cs_end; ++i) {
+    ++ph_num_constraints;
+    if (i->is_equality())
+      --ph_affine_dim;
+  }
+  // TODO: this is an inefficient workaround.
+  // For NNC polyhedra, generators might be no longer up-to-date
+  // (and hence, neither minimized) due to the strong minimization
+  // process applied to constraints when constructing the certificate.
+  // We have to reinforce the (normal) minimization of the generator
+  // system. The future, lazy implementation of the strong minimization
+  // process will solve this problem.
+  if (!ph.is_necessarily_closed())
+    ph.minimize();
+
+  // If the affine dimension of `ph' is increasing, the chain is stabilizing.
+  if (ph_affine_dim > affine_dim)
+    return 1;
+
+  // At this point the two polyhedra must have the same affine dimension.
+  assert(ph_affine_dim == affine_dim);
+
+  // If the number of constraints of `ph' is decreasing, then the chain
+  // is stabilizing. If it is increasing, the chain is not stabilizing.
+  if (ph_num_constraints != num_constraints)
+    return ph_num_constraints < num_constraints ? 1 : -1;
+
+  // All components are equal.
+  return 0;
+}
+
diff --git a/src/H79_Certificate.defs.hh b/src/H79_Certificate.defs.hh
new file mode 100644
index 0000000..650f8e3
--- /dev/null
+++ b/src/H79_Certificate.defs.hh
@@ -0,0 +1,97 @@
+/* H79_Certificate class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_H79_Certificate_defs_hh
+#define PPL_H79_Certificate_defs_hh 1
+
+#include "H79_Certificate.types.hh"
+#include "Polyhedron.types.hh"
+#include "globals.types.hh"
+#include <cassert>
+#include <vector>
+
+//! A convergence certificate for the H79 widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+  \note
+  The convergence of the H79 widening can also be certified by
+  BHRZ03_Certificate.
+*/
+class Parma_Polyhedra_Library::H79_Certificate {
+public:
+  //! Default constructor.
+  H79_Certificate();
+
+  //! Constructor: computes the certificate for \p ph.
+  template <typename PH>
+  H79_Certificate(const PH& ph);
+
+  //! Constructor: computes the certificate for \p ph.
+  H79_Certificate(const Polyhedron& ph);
+
+  //! Copy constructor.
+  H79_Certificate(const H79_Certificate& y);
+
+  //! Destructor.
+  ~H79_Certificate();
+
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+
+    Compares \p *this with \p y, using a total ordering which is a
+    refinement of the limited growth ordering relation for the
+    H79 widening.
+  */
+  int compare(const H79_Certificate& y) const;
+
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  template <typename PH>
+  int compare(const PH& ph) const;
+
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  int compare(const Polyhedron& ph) const;
+
+  //! A total ordering on H79 certificates.
+  /*! \ingroup PPL_CXX_interface
+    This binary predicate defines a total ordering on H79 certificates
+    which is used when storing information about sets of polyhedra.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const H79_Certificate& x,
+		    const H79_Certificate& y) const;
+  };
+
+private:
+  //! Affine dimension of the polyhedron.
+  dimension_type affine_dim;
+  //! Cardinality of a non-redundant constraint system for the polyhedron.
+  dimension_type num_constraints;
+};
+
+#include "H79_Certificate.inlines.hh"
+
+#endif // !defined(PPL_H79_Certificate_defs_hh)
diff --git a/src/H79_Certificate.inlines.hh b/src/H79_Certificate.inlines.hh
new file mode 100644
index 0000000..5d951f7
--- /dev/null
+++ b/src/H79_Certificate.inlines.hh
@@ -0,0 +1,70 @@
+/* H79_Certificate class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_H79_Certificate_inlines_hh
+#define PPL_H79_Certificate_inlines_hh 1
+
+#include "Polyhedron.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+H79_Certificate::H79_Certificate()
+  : affine_dim(0), num_constraints(0) {
+  // This is the certificate for a zero-dim universe polyhedron.
+}
+
+inline
+H79_Certificate::H79_Certificate(const H79_Certificate& y)
+  : affine_dim(y.affine_dim), num_constraints(y.num_constraints) {
+}
+
+inline
+H79_Certificate::~H79_Certificate() {
+}
+
+inline bool
+H79_Certificate::Compare::operator()(const H79_Certificate& x,
+				     const H79_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this lgo relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
+
+template <typename PH>
+inline
+H79_Certificate::H79_Certificate(const PH& ph)
+  : affine_dim(0), num_constraints(0) {
+  H79_Certificate cert(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+  affine_dim = cert.affine_dim;
+  num_constraints = cert.num_constraints;
+}
+
+template <typename PH>
+inline int
+H79_Certificate::compare(const PH& ph) const {
+  return this->compare(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_H79_Certificate_inlines_hh)
diff --git a/src/H79_Certificate.types.hh b/src/H79_Certificate.types.hh
new file mode 100644
index 0000000..d7ea746
--- /dev/null
+++ b/src/H79_Certificate.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_H79_Certificate_types_hh
+#define PPL_H79_Certificate_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class H79_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_H79_Certificate_types_hh)
diff --git a/src/Init.cc b/src/Init.cc
new file mode 100644
index 0000000..bbbc410
--- /dev/null
+++ b/src/Init.cc
@@ -0,0 +1,71 @@
+/* Init class implementation (non-inline functions and static variables).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Init.defs.hh"
+#include "Variable.defs.hh"
+#include "fpu.defs.hh"
+#include "checked.defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+unsigned int PPL::Init::count = 0;
+
+PPL::fpu_rounding_direction_type PPL::Init::old_rounding_direction;
+
+extern "C" void
+set_GMP_memory_allocation_functions(void)
+#if CXX_SUPPORTS_ATTRIBUTE_WEAK
+  __attribute__((weak));
+
+void
+set_GMP_memory_allocation_functions(void) {
+}
+#else
+  ;
+#endif
+
+PPL::Init::Init() {
+  // Only when the first Init object is constructed...
+  if (count++ == 0) {
+    // ... the GMP memory allocation functions are set, ...
+    set_GMP_memory_allocation_functions();
+    // ... and the default output function for Variable objects is set.
+    Variable::set_output_function(Variable::default_output_function);
+#if PPL_CAN_CONTROL_FPU
+    old_rounding_direction = fpu_get_rounding_direction();
+    fpu_set_rounding_direction(ROUND_DIRECT);
+#endif
+    // FIXME: is 3200 a magic number?
+    set_rational_sqrt_precision_parameter(3200);
+  }
+}
+
+PPL::Init::~Init() {
+  // Only when the last Init object is destroyed...
+  if (--count == 0) {
+#if PPL_CAN_CONTROL_FPU
+    fpu_set_rounding_direction(old_rounding_direction);
+#endif
+  }
+}
diff --git a/src/Init.defs.hh b/src/Init.defs.hh
new file mode 100644
index 0000000..16b3fb5
--- /dev/null
+++ b/src/Init.defs.hh
@@ -0,0 +1,57 @@
+/* Init class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Init_defs_hh
+#define PPL_Init_defs_hh 1
+
+#include "Init.types.hh"
+#include "fpu.types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Class for initialization and finalization.
+/*! \ingroup PPL_CXX_interface
+  <EM>Nifty Counter</EM> initialization class,
+  ensuring that the library is initialized only once
+  and before its first use.
+  A count of the number of translation units using the library
+  is maintained. A static object of Init type will be declared
+  by each translation unit using the library.  As a result,
+  only one of them will initialize and properly finalize
+  the library.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Init {
+private:
+  //! Count the number of objects created.
+  static unsigned int count;
+  static fpu_rounding_direction_type old_rounding_direction;
+
+public:
+  //! Initializes the PPL.
+  Init();
+
+  //! Finalizes the PPL.
+  ~Init();
+};
+
+#endif // !defined(PPL_Init_defs_hh)
diff --git a/src/Init.types.hh b/src/Init.types.hh
new file mode 100644
index 0000000..e44df35
--- /dev/null
+++ b/src/Init.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Init_types_hh
+#define PPL_Init_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Init;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Init_types_hh)
diff --git a/src/Interval.cc b/src/Interval.cc
new file mode 100644
index 0000000..73e4e1c
--- /dev/null
+++ b/src/Interval.cc
@@ -0,0 +1,55 @@
+/* Non-inline functions for the Interval class and its constituents.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Interval.defs.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::LBoundary::OK() const {
+  if (flag != POS && flag != ZERO) {
+#ifndef NDEBUG
+    std::cerr << "Invalid flag in LBoundary: " << flag << std::endl;
+#endif
+    return false;
+  }
+  return true;
+}
+
+bool
+PPL::UBoundary::OK() const {
+  if (flag != NEG && flag != ZERO) {
+#ifndef NDEBUG
+    std::cerr << "Invalid flag in UBoundary: " << flag << std::endl;
+#endif
+    return false;
+  }
+  return true;
+}
+
+bool
+PPL::Interval::OK() const {
+  return lower.OK() && upper.OK();
+}
diff --git a/src/Interval.defs.hh b/src/Interval.defs.hh
new file mode 100644
index 0000000..952e693
--- /dev/null
+++ b/src/Interval.defs.hh
@@ -0,0 +1,204 @@
+/* Declarations for the Interval class and its constituents.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Interval_defs_hh
+#define PPL_Interval_defs_hh 1
+
+#include "Interval.types.hh"
+#include "Coefficient.defs.hh"
+#include "Checked_Number.defs.hh"
+#include <gmpxx.h>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+typedef Checked_Number<mpq_class, Extended_Number_Policy> ERational;
+
+}
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is less than \p y.
+/*! \relates Boundary */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator<(const Boundary& x, const Boundary& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is greater than \p y.
+/*! \relates Boundary */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator>(const Boundary& x, const Boundary& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An extended rational bound of an interval.
+/*! \ingroup PPL_CXX_interface
+  An object of class Boundary represents either an upper or a lower
+  bound of an interval over the set of extended rational numbers.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Boundary {
+protected:
+  //! Kinds of bounds.
+  enum Flag {
+    //! An open upper bound.
+    NEG = -1,
+    //! A closed (lower or upper) bound.
+    ZERO = 0,
+    //! An open lower bound.
+    POS = 1
+  };
+
+  //! The extended rational value of the bound.
+  ERational value;
+  //! The kind of the bound.
+  Flag flag;
+
+  //! Builds a bound of kind \p f and having value \p v.
+  Boundary(const ERational& v, Flag f);
+
+  friend bool
+  Parma_Polyhedra_Library::operator<(const Boundary& x, const Boundary& y);
+  friend bool
+  Parma_Polyhedra_Library::operator>(const Boundary& x, const Boundary& y);
+
+public:
+  //! Returns <CODE>true</CODE> if and only if \p *this is a closed bound.
+  bool is_closed() const;
+
+  //! Returns a const reference to the value of the bound.
+  const ERational& bound() const;
+
+  //! Returns a reference to the value of the bound.
+  ERational& bound();
+};
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The lower bound of an extended rational interval.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::LBoundary : public Boundary {
+public:
+  //! Kinds of lower bounds.
+  enum Open_Closed {
+    //! An open lower bound.
+    OPEN = Boundary::POS,
+    //! A closed lower bound.
+    CLOSED = Boundary::ZERO
+  };
+
+  //! Builds a lower bound of kind \p f and having value \p v.
+  LBoundary(const ERational& v, Open_Closed f);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The upper bound of an extended rational interval.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::UBoundary : public Boundary {
+public:
+  //! Kinds of upper bounds.
+  enum Open_Closed {
+    //! An open upper bound.
+    OPEN = Boundary::NEG,
+    //! A closed upper bound.
+    CLOSED = Boundary::ZERO
+  };
+
+  //! Builds an upper bound of kind \p f and having value \p v.
+  UBoundary(const ERational& v, Open_Closed f);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A interval over the set of rational numbers.
+/*! \ingroup PPL_CXX_interface
+  An object of class Interval represents a closed/half-closed/open
+  interval over the set of rational numbers \f$\Qset\f$.
+
+  Note that, even though the implementation is capable to represent
+  any interval on the set of <EM>extended</EM> rational numbers,
+  the available public methods only allows for the construction
+  and manipulation of intervals over \f$\Qset\f$.
+  Namely, it is not possible to create a non-empty interval having
+  a <EM>closed</EM> bound whose value is \f$-\infty\f$ or \f$+\infty\f$.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Interval {
+public:
+  //! Constructs the universe interval \f$(-\infty, +\infty) = \Qset\f$.
+  Interval();
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is empty.
+  bool is_empty() const;
+
+  //! Returns a const reference to the interval's lower bound.
+  const LBoundary& lower_bound() const;
+
+  //! Returns a reference to the interval's lower bound.
+  LBoundary& lower_bound();
+
+  //! Returns a const reference to the interval's upper bound.
+  const UBoundary& upper_bound() const;
+
+  //! Returns a reference to the interval's upper bound.
+  UBoundary& upper_bound();
+
+  /*! \brief
+    Raises the interval's lower bound, if \p new_lower is higher
+    than the current one.
+  */
+  void raise_lower_bound(LBoundary new_lower);
+
+  /*! \brief
+    Lowers the interval's upper bound, if \p new_upper is lower
+    than the current one.
+  */
+  void lower_upper_bound(UBoundary new_upper);
+
+  //! Turns \p *this into the empty interval.
+  void set_empty();
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! The interval's lower bound.
+  LBoundary lower;
+
+  //! The interval's upper bound.
+  UBoundary upper;
+};
+
+#include "Interval.inlines.hh"
+
+#endif // !defined(PPL_Interval_defs_hh)
diff --git a/src/Interval.inlines.hh b/src/Interval.inlines.hh
new file mode 100644
index 0000000..d93c3ac
--- /dev/null
+++ b/src/Interval.inlines.hh
@@ -0,0 +1,127 @@
+/* Inline functions for the Interval class and its constituents.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Interval_inlines_hh
+#define PPL_Interval_inlines_hh 1
+
+#include <cassert>
+#include "Checked_Number.defs.hh"
+#include "checked_mpz.inlines.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Boundary::Boundary(const ERational& v, Flag f)
+  : value(v), flag(f) {
+}
+
+inline bool
+Boundary::is_closed() const {
+  return flag == ZERO;
+}
+
+inline const ERational&
+Boundary::bound() const {
+  return value;
+}
+
+inline ERational&
+Boundary::bound() {
+  return value;
+}
+
+inline
+LBoundary::LBoundary(const ERational& v, Open_Closed f)
+  : Boundary(v, f == CLOSED ? ZERO : POS) {
+}
+
+inline
+UBoundary::UBoundary(const ERational& v, Open_Closed f)
+  : Boundary(v, f == CLOSED ? ZERO : NEG) {
+}
+
+/*! \relates Boundary */
+inline bool
+operator<(const Boundary& x, const Boundary& y) {
+  return x.value < y.value ||
+    (x.value == y.value && x.flag < y.flag);
+}
+
+/*! \relates Boundary */
+inline bool
+operator>(const Boundary& x, const Boundary& y) {
+  return y < x;
+}
+
+inline
+Interval::Interval()
+  : lower(ERational(MINUS_INFINITY), LBoundary::OPEN),
+    upper(ERational(PLUS_INFINITY), UBoundary::OPEN) {
+}
+
+inline bool
+Interval::is_empty() const {
+  return lower > upper;
+}
+
+inline const LBoundary&
+Interval::lower_bound() const {
+  return lower;
+}
+
+inline LBoundary&
+Interval::lower_bound() {
+  return lower;
+}
+
+inline const UBoundary&
+Interval::upper_bound() const {
+  return upper;
+}
+
+inline UBoundary&
+Interval::upper_bound() {
+  return upper;
+}
+
+inline void
+Interval::raise_lower_bound(LBoundary new_lower) {
+  if (new_lower > lower)
+    lower = new_lower;
+}
+
+inline void
+Interval::lower_upper_bound(UBoundary new_upper) {
+  if (new_upper < upper)
+    upper = new_upper;
+}
+
+inline void
+Interval::set_empty() {
+  lower = LBoundary(ERational(PLUS_INFINITY), LBoundary::OPEN);
+  upper = UBoundary(ERational(MINUS_INFINITY), UBoundary::OPEN);
+  assert(is_empty());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_inlines_hh)
diff --git a/src/Interval.types.hh b/src/Interval.types.hh
new file mode 100644
index 0000000..0195f98
--- /dev/null
+++ b/src/Interval.types.hh
@@ -0,0 +1,24 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Interval_types_hh
+#define PPL_Interval_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Boundary;
+class LBoundary;
+class UBoundary;
+class Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_types_hh)
diff --git a/src/LP_Problem.cc b/src/LP_Problem.cc
new file mode 100644
index 0000000..1576ffb
--- /dev/null
+++ b/src/LP_Problem.cc
@@ -0,0 +1,1035 @@
+/* LP_Problem class implementation: non-inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "LP_Problem.defs.hh"
+#include "globals.types.hh"
+#include "globals.defs.hh"
+#include "Row.defs.hh"
+#include "Matrix.defs.hh"
+#include "Linear_Row.defs.hh"
+#include "Linear_System.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "Generator.defs.hh"
+#include <stdexcept>
+#include <sstream>
+#include <map>
+#include <deque>
+#include <set>
+#include <algorithm>
+
+#ifndef PPL_NOISY_SIMPLEX
+#define PPL_NOISY_SIMPLEX 0
+#endif
+
+#ifdef PPL_NOISY_SIMPLEX
+#include <iostream>
+#endif
+
+#ifndef PPL_SIMPLEX_ENABLE_STEEPEST_EDGE
+#define PPL_SIMPLEX_ENABLE_STEEPEST_EDGE 1
+#endif
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_NOISY_SIMPLEX
+namespace {
+
+unsigned long num_iterations = 0;
+
+} // namespace
+#endif // PPL_NOISY_SIMPLEX
+
+PPL::dimension_type
+PPL::LP_Problem::steepest_edge() const {
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  assert(tableau_num_rows == base.size());
+  // The square of the lcm of all the coefficients of variables in base.
+  TEMP_INTEGER(squared_lcm_basis);
+  // The normalization factor for each coefficient in the tableau.
+  std::vector<Coefficient> norm_factor(tableau_num_rows);
+  {
+    // Compute the lcm of all the coefficients of variables in base.
+    TEMP_INTEGER(lcm_basis);
+    lcm_basis = 1;
+    for (dimension_type i = tableau_num_rows; i-- > 0; )
+      lcm_assign(lcm_basis, lcm_basis, tableau[i][base[i]]);
+    // Compute normalization factors.
+    for (dimension_type i = tableau_num_rows; i-- > 0; )
+      exact_div_assign(norm_factor[i], lcm_basis, tableau[i][base[i]]);
+    // Compute the square of `lcm_basis', exploiting the fact that
+    // `lcm_basis' will no longer be needed.
+    lcm_basis *= lcm_basis;
+    std::swap(squared_lcm_basis, lcm_basis);
+  }
+
+  // Defined here to avoid repeated (de-)allocations.
+  TEMP_INTEGER(challenger_num);
+  TEMP_INTEGER(scalar_value);
+  TEMP_INTEGER(challenger_den);
+  TEMP_INTEGER(challenger_value);
+  TEMP_INTEGER(current_value);
+
+  TEMP_INTEGER(current_num);
+  TEMP_INTEGER(current_den);
+  dimension_type entering_index = 0;
+  const int cost_sign = sgn(working_cost[working_cost.size() - 1]);
+  for (dimension_type j = tableau.num_columns() - 1; j-- > 1; ) {
+    const Coefficient& cost_j = working_cost[j];
+    if (sgn(cost_j) == cost_sign) {
+      // We can't compute the (exact) square root of abs(\Delta x_j).
+      // The workaround is to compute the square of `cost[j]'.
+      challenger_num = cost_j * cost_j;
+      // Due to our integer implementation, the `1' term in the denominator
+      // of the original formula has to be replaced by `squared_lcm_basis'.
+      challenger_den = squared_lcm_basis;
+      for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+	const Coefficient& tableau_ij = tableau[i][j];
+	// Note: this test speeds up the GMP computation.
+	if (tableau_ij != 0) {
+	  scalar_value = tableau_ij * norm_factor[i];
+	  add_mul_assign(challenger_den, scalar_value, scalar_value);
+	}
+      }
+      // Initialization during the first loop.
+      if (entering_index == 0) {
+	std::swap(current_num, challenger_num);
+	std::swap(current_den, challenger_den);
+	entering_index = j;
+ 	continue;
+      }
+      challenger_value = challenger_num * current_den;
+      current_value = current_num * challenger_den;
+      // Update the values, if the challeger wins.
+      if (challenger_value > current_value) {
+	std::swap(current_num, challenger_num);
+	std::swap(current_den, challenger_den);
+	entering_index = j;
+      }
+    }
+  }
+  return entering_index;
+}
+
+// See pag. 47 of Papadimitriou.
+
+PPL::dimension_type
+PPL::LP_Problem::get_entering_var_index() const {
+  // The variable entering the base is the first one whose coefficient
+  // in the cost function has the same sign the cost function itself.
+  // If no such variable exists, then we met the optimality condition
+  // (and return 0 to the caller).
+
+  // Get the "sign" of the cost function.
+  const dimension_type cost_sign_index = working_cost.size() - 1;
+  const int cost_sign = sgn(working_cost[cost_sign_index]);
+  assert(cost_sign != 0);
+  for (dimension_type i = 1; i < cost_sign_index; ++i)
+    if (sgn(working_cost[i]) == cost_sign)
+      return i;
+  // No variable has to enter the base:
+  // the cost function was optimized.
+  return 0;
+}
+
+void
+PPL::LP_Problem::linear_combine(Row& x,
+				const Row& y,
+				const dimension_type k) {
+  assert(x.size() == y.size());
+  assert(y[k] != 0 && x[k] != 0);
+  // Let g be the GCD between `x[k]' and `y[k]'.
+  // For each i the following computes
+  //   x[i] = x[i]*y[k]/g - y[i]*x[k]/g.
+  TEMP_INTEGER(normalized_x_k);
+  TEMP_INTEGER(normalized_y_k);
+  normalize2(x[k], y[k], normalized_x_k, normalized_y_k);
+  for (dimension_type i = x.size(); i-- > 0; )
+    if (i != k) {
+      Coefficient& x_i = x[i];
+      x_i *= normalized_y_k;
+      // Note: the test speeds up the GMP computation.
+      const Coefficient& y_i = y[i];
+      if (y_i != 0)
+	sub_mul_assign(x_i, y_i, normalized_x_k);
+    }
+  x[k] = 0;
+  x.normalize();
+}
+
+// See pag 42-43 of Papadimitriou.
+
+void
+PPL::LP_Problem::swap_base(const dimension_type entering_var_index,
+			   const dimension_type exiting_base_index) {
+  const Row& tableau_out = tableau[exiting_base_index];
+  // Linearly combine the constraints.
+  for (dimension_type i = tableau.num_rows(); i-- > 0; ) {
+    Row& tableau_i = tableau[i];
+    if (i != exiting_base_index && tableau_i[entering_var_index] != 0)
+      linear_combine(tableau_i, tableau_out, entering_var_index);
+  }
+  // Linearly combine the cost function.
+  if (working_cost[entering_var_index] != 0)
+    linear_combine(working_cost, tableau_out, entering_var_index);
+  // Adjust the base.
+  base[exiting_base_index] = entering_var_index;
+}
+
+// See pag. 47 + 50 of Papadimitriou.
+
+PPL::dimension_type
+PPL::LP_Problem
+::get_exiting_base_index(const dimension_type entering_var_index) const  {
+  // The variable exiting the base should be associated to a tableau
+  // constraint such that the ratio
+  // tableau[i][entering_var_index] / tableau[i][base[i]]
+  // is strictly positive and minimal.
+
+  // Find the first tableau constraint `c' having a positive value for
+  //   tableau[i][entering_var_index] / tableau[i][base[i]]
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  dimension_type exiting_base_index = tableau_num_rows;
+  for (dimension_type i = 0; i < tableau_num_rows; ++i) {
+    const Row& t_i = tableau[i];
+    const int num_sign = sgn(t_i[entering_var_index]);
+    if (num_sign != 0 && num_sign == sgn(t_i[base[i]])) {
+      exiting_base_index = i;
+      break;
+    }
+  }
+  // Check for unboundedness.
+  if (exiting_base_index == tableau_num_rows)
+    return tableau_num_rows;
+
+  // Reaching this point means that a variable will definitely exit the base.
+  TEMP_INTEGER(lcm);
+  TEMP_INTEGER(current_min);
+  TEMP_INTEGER(challenger);
+  for (dimension_type i = exiting_base_index + 1; i < tableau_num_rows; ++i) {
+    const Row& t_i = tableau[i];
+    const Coefficient& t_ie = t_i[entering_var_index];
+    const Coefficient& t_ib = t_i[base[i]];
+    const int t_ie_sign = sgn(t_ie);
+    if (t_ie_sign != 0 && t_ie_sign == sgn(t_ib)) {
+      const Row& t_e = tableau[exiting_base_index];
+      const Coefficient& t_ee = t_e[entering_var_index];
+      lcm_assign(lcm, t_ee, t_ie);
+      exact_div_assign(current_min, lcm, t_ee);
+      current_min *= t_e[0];
+      current_min = abs(current_min);
+      exact_div_assign(challenger, lcm, t_ie);
+      challenger *= t_i[0];
+      challenger = abs(challenger);
+      current_min -= challenger;
+      const int sign = sgn(current_min);
+      if (sign > 0
+	  || (sign == 0 && base[i] < base[exiting_base_index]))
+	exiting_base_index = i;
+    }
+  }
+  return exiting_base_index;
+}
+
+// See pag 49 of Papadimitriou.
+
+bool
+PPL::LP_Problem::compute_simplex() {
+  assert(tableau.num_columns() == working_cost.size());
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  while (true) {
+    // Choose the index of the variable entering the base, if any.
+    const dimension_type entering_var_index
+#if PPL_SIMPLEX_ENABLE_STEEPEST_EDGE
+      = steepest_edge();
+#else
+      = get_entering_var_index();
+#endif
+    // If no entering index was computed, the problem is solved.
+    if (entering_var_index == 0)
+      return true;
+
+    // Choose the index of the row exiting the base.
+    const dimension_type exiting_base_index
+      = get_exiting_base_index(entering_var_index);
+    // If no exiting index was computed, the problem is unbounded.
+    if (exiting_base_index == tableau_num_rows)
+      return false;
+
+    // We have not reached the optimality or unbounded condition:
+    // compute the new base and the corresponding vertex of the
+    // feasible region.
+    swap_base(entering_var_index, exiting_base_index);
+#if PPL_NOISY_SIMPLEX
+    ++num_iterations;
+    if (num_iterations % 200 == 0)
+      std::cout << "Primal Simplex: iteration "
+		<< num_iterations << "." << std::endl;
+#endif
+  }
+}
+
+// See pag 28  Papadimitriou.
+
+void
+PPL::LP_Problem::prepare_first_phase() {
+  // We negate the row if tableau[i][0] <= 0 to get the inhomogeneous term > 0.
+  // This simplifies the insertion of the slack variables: the value of the
+  // slack variable of every constraint will be 1.
+  const dimension_type tableau_old_n_cols = tableau.num_columns();
+  for (dimension_type i = tableau.num_rows(); i-- > 0 ; ) {
+    Row& tableau_i = tableau[i];
+    if (tableau_i[0] > 0)
+      for (dimension_type j = tableau_old_n_cols; j-- > 0; )
+	neg_assign(tableau_i[j]);
+  }
+
+  // Add the columns for all the slack variables, plus an additional
+  // column for the sign of the cost function, provided we are not going
+  // to exceed the maximum number of allowed columns.
+  if (tableau.max_num_columns() - tableau_old_n_cols <= tableau.num_rows())
+    throw std::length_error("PPL::LP_Problem:\nthe maximum size of an "
+			    "internal data structure has been exceeded "
+			    "while solving the LP_Problem.");
+  tableau.add_zero_columns(tableau.num_rows() + 1);
+  // Set the working cost function with the right size.
+  working_cost = Row(tableau.num_columns(), Row::Flags());
+
+  // Modify the tableau and the new cost function by adding
+  // the slack variables (which enter the base).
+  // As for the cost function, all the slack variables should have
+  // coefficient -1.
+  for (dimension_type i = 0; i < tableau.num_rows(); ++i) {
+    const dimension_type j = tableau_old_n_cols + i;
+    tableau[i][j] = 1;
+    working_cost[j] = -1;
+    base[i] = j;
+  }
+
+  // Set the extra-coefficient of the cost functions to record its sign.
+  // This is done to keep track of the possible sign's inversion.
+  const dimension_type last_obj_index = working_cost.size() - 1;
+  working_cost[last_obj_index] = 1;
+
+  // Express the problem in terms of the variables in base.
+  for (dimension_type i = tableau.num_rows(); i-- > 0; )
+    linear_combine(working_cost, tableau[i], base[i]);
+}
+
+// See pag 55-56 Papadimitriou.
+
+void
+PPL::LP_Problem::erase_slacks() {
+  const dimension_type tableau_last_index = tableau.num_columns() - 1;
+  dimension_type tableau_n_rows = tableau.num_rows();
+  const dimension_type first_slack_index = tableau_last_index - tableau_n_rows;
+
+  // Step 1: try to remove from the base all the remaining slack variables.
+  for (dimension_type i = 0; i < tableau_n_rows; ++i)
+    if (base[i] >= first_slack_index) {
+      // Search for a non-zero element to enter the base.
+      Row& tableau_i = tableau[i];
+      bool redundant = true;
+      for (dimension_type j = first_slack_index; j-- > 1; )
+	if (tableau_i[j] != 0) {
+	  swap_base(j, i);
+	  redundant = false;
+	  break;
+	}
+      if (redundant) {
+	// No original variable entered the base:
+	// the constraint is redundant and should be deleted.
+	--tableau_n_rows;
+	if (i < tableau_n_rows) {
+	  // Replace the redundant row with the last one,
+	  // taking care of adjusting the iteration index.
+	  tableau_i.swap(tableau[tableau_n_rows]);
+	  base[i] = base[tableau_n_rows];
+	  --i;
+	}
+	tableau.erase_to_end(tableau_n_rows);
+	base.pop_back();
+      }
+    }
+
+  // Step 2: Adjust data structures so as to enter phase 2 of the simplex.
+
+  // Compute the dimensions of the new tableau.
+  const dimension_type new_tableau_n_cols = first_slack_index + 1;
+  const dimension_type new_tableau_last_index = first_slack_index;
+
+  // Adjust the number of columns of `tableau'.
+  tableau.remove_trailing_columns(tableau.num_columns() - new_tableau_n_cols);
+  // Zero the last column of the tableau.
+  for (dimension_type i = tableau_n_rows; i-- > 0; )
+    tableau[i][new_tableau_last_index] = 0;
+
+  // ... then properly set the element in the (new) last column,
+  // encoding the kind of optimization; ...
+  working_cost[new_tableau_last_index] = working_cost[tableau_last_index];
+  // ... and finally remove redundant columns.
+  const dimension_type working_cost_new_size = working_cost.size() -
+    (tableau_last_index - new_tableau_last_index);
+  working_cost.shrink(working_cost_new_size);
+}
+
+// See pag 55 of Papadimitriou.
+
+PPL::LP_Problem_Status
+PPL::LP_Problem::compute_tableau() {
+  assert(tableau.num_rows() == 0);
+  assert(dim_map.size() == 0);
+  // Note: exploiting friendship so as to efficiently access the
+  // coefficients of each constraint.
+  Linear_System& cs = input_cs;
+  const dimension_type cs_num_rows = cs.num_rows();
+  const dimension_type cs_num_cols = cs.num_columns();
+
+  // Step 1:
+  // determine variables that are constrained to be nonnegative,
+  // detect (non-negativity or tautology) constraints that will not
+  // be part of the tableau and count the number of slack variables.
+
+  // Counters determining the dimensions of the tableau:
+  // initialized here, they will be updated while examining `cs'.
+  dimension_type tableau_num_rows = cs_num_rows;
+  dimension_type tableau_num_cols = 2*cs_num_cols - 1;
+  dimension_type num_slack_variables = 0;
+
+  // On exit, `is_tableau_constraint[i]' will be true if and only if
+  // `cs[i]' is neither a tautology (e.g., 1 >= 0) nor a non-negativity
+  // constraint (e.g., X >= 0).
+  std::deque<bool> is_tableau_constraint(cs_num_rows, true);
+
+  // On exit, `nonnegative_variable[j]' will be true if and only if
+  // Variable(j) is bound to be nonnegative in `cs'.
+  std::deque<bool> nonnegative_variable(cs_num_cols - 1, false);
+
+  // Process each row of the `cs' matrix.
+  for (dimension_type i = cs_num_rows; i-- > 0; ) {
+    const Linear_Row& cs_i = cs[i];
+    bool found_a_nonzero_coeff = false;
+    bool found_many_nonzero_coeffs = false;
+    dimension_type nonzero_coeff_column_index = 0;
+    for (dimension_type j = cs_num_cols; j-- > 1; ) {
+      if (cs_i[j] != 0)
+	if (found_a_nonzero_coeff) {
+	  found_many_nonzero_coeffs = true;
+	  if (cs_i.is_ray_or_point_or_inequality())
+	    ++num_slack_variables;
+	  break;
+	}
+	else {
+	  nonzero_coeff_column_index = j;
+	  found_a_nonzero_coeff = true;
+	}
+    }
+    // If more than one coefficient is nonzero,
+    // continue with next constraint.
+    if (found_many_nonzero_coeffs)
+      continue;
+
+    if (!found_a_nonzero_coeff) {
+      // All coefficients are 0.
+      // The constraint is either trivially true or trivially false.
+      if (cs_i.is_ray_or_point_or_inequality()) {
+	if (cs_i[0] < 0)
+	  // A constraint such as -1 >= 0 is trivially false.
+	  return UNFEASIBLE_LP_PROBLEM;
+      }
+      else
+	// The constraint is an equality.
+	if (cs_i[0] != 0)
+	  // A constraint such as 1 == 0 is trivially false.
+	  return UNFEASIBLE_LP_PROBLEM;
+      // Here the constraint is trivially true.
+      is_tableau_constraint[i] = false;
+      --tableau_num_rows;
+      continue;
+    }
+    else {
+      // Here we have only one nonzero coefficient.
+      /*
+
+      We have the following methods:
+      A) Do split the variable and do add the constraint in the tableau.
+      B) Don't split the variable and do add the constraint in the tableau.
+      C) Don't split the variable and don't add the constraint in the tableau.
+
+      Let the constraint be (a*v + b relsym 0).
+      These are the 12 possible combinations we can have:
+                a |  b | relsym | method
+      ----------------------------------
+      1)       >0 | >0 |   >=   |   A
+      2)       >0 | >0 |   ==   |   A
+      3)       <0 | <0 |   >=   |   A
+      4)       >0 | =0 |   ==   |   B
+      5)       >0 | <0 |   ==   |   B
+      Note:    <0 | >0 |   ==   | impossible by strong normalization
+      Note:    <0 | =0 |   ==   | impossible by strong normalization
+      Note:    <0 | <0 |   ==   | impossible by strong normalization
+      6)       >0 | <0 |   >=   |   B
+      7)       >0 | =0 |   >=   |   C
+      8)       <0 | >0 |   >=   |   A
+      9)       <0 | =0 |   >=   |   A
+
+      The next lines will apply the correct method to each case.
+      */
+
+      // The variable index is not equal to the column index.
+      const dimension_type nonzero_var_index = nonzero_coeff_column_index - 1;
+
+      const int sgn_a = sgn(cs_i[nonzero_coeff_column_index]);
+      const int sgn_b = sgn(cs_i[0]);
+      // Cases 1-3: apply method A.
+      if (sgn_a == sgn_b) {
+	if (cs_i.is_ray_or_point_or_inequality())
+	  ++num_slack_variables;
+      }
+      // Cases 4-5: apply method B.
+      else if (cs_i.is_line_or_equality()) {
+	if (!nonnegative_variable[nonzero_var_index]) {
+	  nonnegative_variable[nonzero_var_index] = true;
+	  --tableau_num_cols;
+	}
+      }
+      // Case 6: apply method B.
+      else if (sgn_b < 0) {
+	if (!nonnegative_variable[nonzero_var_index]) {
+	  nonnegative_variable[nonzero_var_index] = true;
+	  --tableau_num_cols;
+	}
+	++num_slack_variables;
+      }
+      // Case 7: apply method C.
+      else if (sgn_a > 0) {
+	if (!nonnegative_variable[nonzero_var_index]) {
+	  nonnegative_variable[nonzero_var_index] = true;
+	  --tableau_num_cols;
+	}
+	is_tableau_constraint[i] = false;
+	--tableau_num_rows;
+      }
+      // Cases 8-9: apply method A.
+      else
+	++num_slack_variables;
+    }
+  }
+
+  // The slack variables will be columns in the tableau.
+  tableau_num_cols += num_slack_variables;
+
+  // Now we can fill the map.
+  for (dimension_type i = 0, j = nonnegative_variable.size(),
+	 nnv_size = j; i < nnv_size; ++i)
+    if (!nonnegative_variable[i]) {
+      dim_map.insert(std::make_pair(i, j));
+      ++j;
+    }
+
+  // Step 2:
+  // set the dimensions for the tableau and the cost function.
+  if (tableau_num_rows > 0) {
+    if (tableau_num_cols > tableau.max_num_columns())
+      throw std::length_error("PPL::LP_Problem:\nthe maximum size of an "
+			      "internal data structure has been exceeded "
+			      "while solving the LP_Problem.");
+    tableau.add_zero_rows_and_columns(tableau_num_rows,
+				      tableau_num_cols,
+				      Row::Flags());
+  }
+
+  // Phase 3:
+  // insert all the (possibly transformed) constraints that are not
+  // nonnegativity constraints. The transformation includes both
+  // the variable splitting (for variables that are unconstrained
+  // in sign) and the addition of slack variables (for inequalities
+  // in the original problem).
+
+  for (dimension_type k = tableau_num_rows, slack_index = tableau_num_cols,
+	 i = cs_num_rows; i-- > 0; )
+    if (is_tableau_constraint[i]) {
+      // Copy the original constraint in the tableau.
+      Row& tableau_k = tableau[--k];
+      const Linear_Row& cs_i = cs[i];
+      for (dimension_type j = cs_num_cols; j-- > 0; )
+	tableau_k[j] = cs_i[j];
+      // Add the slack variable, if needed.
+      if (cs_i.is_ray_or_point_or_inequality())
+	tableau_k[--slack_index] = -1;
+    }
+
+  // Split the variables in the tableau and cost function.
+  typedef std::map<dimension_type, dimension_type>::const_iterator iter;
+  for (iter map_itr = dim_map.begin(),
+	 map_end = dim_map.end(); map_itr != map_end; ++map_itr) {
+    const dimension_type original_var = (map_itr->first) + 1;
+    const dimension_type split_var = (map_itr->second) + 1;
+    for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+      Row& tableau_i = tableau[i];
+      tableau_i[split_var] = -tableau_i[original_var];
+    }
+  }
+
+  // If there is no constraint in the tableau, then the feasible region
+  // is only delimited by non-negativity constraints. Therefore,
+  // the problem is unbounded as soon as the cost function has
+  // a variable with a positive coefficient.
+  if (tableau_num_rows == 0)
+    for (dimension_type i = tableau_num_cols; i-- > 1; )
+      if (input_obj_function[i] > 0){
+	status = UNBOUNDED;
+	return UNBOUNDED_LP_PROBLEM;
+      }
+  // The problem is neither trivially unfeasible nor trivially unbounded.
+  // The tableau was successfull computed and the caller has to figure
+  // out which case applies.
+  status = OPTIMIZED;
+  return OPTIMIZED_LP_PROBLEM;
+}
+
+bool
+PPL::LP_Problem::is_in_base(const dimension_type var_index,
+			    dimension_type& row_index) const {
+  for (row_index = base.size(); row_index-- > 0; )
+    if (base[row_index] == var_index)
+      return true;
+  return false;
+}
+
+PPL::Generator
+PPL::LP_Problem::compute_generator() const {
+  // We will store in num[] and in den[] the numerators and
+  // the denominators of every variable of the original problem.
+  dimension_type original_space_dim = input_cs.space_dimension();
+  std::vector<Coefficient> num(original_space_dim);
+  std::vector<Coefficient> den(original_space_dim);
+  dimension_type row = 0;
+
+  // We start to compute num[] and den[].
+  typedef std::map<dimension_type, dimension_type>::const_iterator iter;
+  iter map_end = dim_map.end();
+
+  for (dimension_type i = original_space_dim; i-- > 0; ) {
+    Coefficient& num_i = num[i];
+    Coefficient& den_i = den[i];
+    // Get the value of the variable from the tableau
+    // (if it is not a basic variable, the value is 0).
+    if (is_in_base(i+1, row)) {
+      const Row& t_row = tableau[row];
+      if (t_row[i+1] > 0) {
+	num_i= -t_row[0];
+	den_i= t_row[i+1];
+      }
+      else {
+	num_i= t_row[0];
+	den_i= -t_row[i+1];
+      }
+    }
+    else {
+      num_i = 0;
+      den_i = 1;
+    }
+    // Check whether the variable was split.
+    iter map_iter = dim_map.find(i);
+    if (map_iter != map_end) {
+      // The variable was split: get the value for the negative component,
+      // having index map[i] + 1.
+      const dimension_type split_i = map_iter->second;
+      // Like before, we he have to check if the variable is in base.
+      if (is_in_base(split_i+1, row)) {
+	const Row& t_row = tableau[row];
+	TEMP_INTEGER(split_num);
+	TEMP_INTEGER(split_den);
+	if (t_row[split_i+1] > 0) {
+	  split_num = -t_row[0];
+	  split_den = t_row[split_i+1];
+	}
+	else {
+	  split_num = t_row[0];
+	  split_den = -t_row[split_i+1];
+	}
+	// We compute the lcm to compute subsequently the difference
+	// between the 2 variables.
+	TEMP_INTEGER(lcm);
+	lcm_assign(lcm, den_i, split_den);
+	exact_div_assign(den_i, lcm, den_i);
+	exact_div_assign(split_den, lcm, split_den);
+	num_i *= den_i;
+	sub_mul_assign(num_i, split_num, split_den);
+	if (num_i == 0)
+	  den_i = 1;
+	else
+	  den_i = lcm;
+      }
+      // Note: if the negative component was not in base, then
+      // it has value zero and there is nothing left to do.
+    }
+  }
+
+  // Compute the lcm of all denominators.
+  TEMP_INTEGER(lcm);
+  lcm = den[0];
+  for (dimension_type i = 1; i < original_space_dim; ++i)
+    lcm_assign(lcm, lcm, den[i]);
+  // Use the denominators to store the numerators' multipliers
+  // and then compute the normalized numerators.
+  for (dimension_type i = original_space_dim; i-- > 0; ) {
+    exact_div_assign(den[i], lcm, den[i]);
+    num[i] *= den[i];
+  }
+
+  // Finally, build the generator.
+  Linear_Expression expr;
+  for (dimension_type i = original_space_dim; i-- > 0; )
+    expr += num[i] * Variable(i);
+  return point(expr, lcm);
+}
+
+void
+PPL::LP_Problem::second_phase() {
+  // Second_phase requires that *this is satisfiable.
+  assert(status == SATISFIABLE || status == UNBOUNDED || status == OPTIMIZED);
+  // In the following cases the problem is already solved.
+  if (status == UNBOUNDED || status == OPTIMIZED)
+    return;
+
+  // Negate the cost function if we are minimizing.
+  Row new_cost = input_obj_function;
+  if (opt_mode == MINIMIZATION)
+    for (dimension_type i = new_cost.size(); i-- > 0; )
+      neg_assign(new_cost[i]);
+
+  // Substitute properly the cost funcion in the `costs' Matrix.
+  const dimension_type cost_zero_size = working_cost.size();
+  Row tmp_cost = Row(new_cost, cost_zero_size, cost_zero_size);
+  tmp_cost.swap(working_cost);
+  working_cost[cost_zero_size-1] = 1;
+  // Split the variable in the original cost function as defined in the
+  // `dim_map' variable.
+  typedef std::map<dimension_type, dimension_type>::const_iterator iter;
+  for (iter map_itr = dim_map.begin(),
+	 map_end = dim_map.end(); map_itr != map_end; ++map_itr){
+    const dimension_type original_var = (map_itr->first) + 1;
+    const dimension_type split_var = (map_itr->second) + 1;
+    working_cost[split_var] = -working_cost[original_var];
+  }
+
+  // Here the first phase problem succeeded with optimum value zero.
+  // Express the old cost function in terms of the computed base.
+  for (dimension_type i = tableau.num_rows(); i-- > 0; ) {
+    const dimension_type base_i = base[i];
+    if (working_cost[base_i] != 0)
+      linear_combine(working_cost, tableau[i], base_i);
+  }
+  // Solve the second phase problem.
+  bool second_phase_successful = compute_simplex();
+
+#if PPL_NOISY_SIMPLEX
+  std::cout << "LP_Problem::solve: 2nd phase ended at iteration "
+	    << num_iterations << "." << std::endl;
+#endif
+  if (second_phase_successful) {
+    last_generator = compute_generator();
+    status = OPTIMIZED;
+  }
+  else
+    status = UNBOUNDED;
+  assert(OK());
+}
+
+void
+PPL::LP_Problem::evaluate_objective_function(const Generator& evaluating_point,
+					     Coefficient& ext_n,
+					     Coefficient& ext_d) const {
+  const dimension_type ep_space_dim = evaluating_point.space_dimension();
+  if (space_dimension() < ep_space_dim)
+    throw std::invalid_argument("PPL::LP_Problem::"
+				"evaluate_objective_function(p, n, d):\n"
+				"*this and p are dimension incompatible.");
+  if (!evaluating_point.is_point())
+    throw std::invalid_argument("PPL::LP_Problem::"
+				"evaluate_objective_function(p, n, d):\n"
+				"p is not a point.");
+
+  // Compute the smallest space dimension  between `input_obj_function'
+  // and `evaluating_point'.
+  const dimension_type space_dim
+    = std::min(ep_space_dim, input_obj_function.space_dimension());
+  // Compute the optimal value of the cost function.
+  ext_n = input_obj_function.inhomogeneous_term();
+  for (dimension_type i = space_dim; i-- > 0; )
+    ext_n += evaluating_point.coefficient(Variable(i))
+      * input_obj_function.coefficient(Variable(i));
+  // Numerator and denominator should be coprime.
+  normalize2(ext_n, evaluating_point.divisor(), ext_n, ext_d);
+}
+
+bool
+PPL::LP_Problem::is_satisfiable() const {
+#if PPL_NOISY_SIMPLEX
+  num_iterations = 0;
+#endif
+  // Check for the `status' attribute in trivial cases.
+  switch (status) {
+  case UNSATISFIABLE:
+    return false;
+  case SATISFIABLE:
+    return true;
+  case UNBOUNDED:
+    return true;
+  case OPTIMIZED:
+    return true;
+  case PARTIALLY_SATISFIABLE:
+    return false;
+  case UNSOLVED:
+    break;
+  }
+
+  LP_Problem& x = const_cast<LP_Problem&>(*this);
+
+  // The space dimension of the solution to be computed.
+  // Note: here we can not use method Constraint_System::space_dimension(),
+  // because if the constraint system is NNC, then even the epsilon
+  // dimension has to be interpreted as a normal dimension.
+  const dimension_type space_dim = x.input_cs.num_columns() - 1;
+
+  // Reset internal objects.
+  x.tableau.clear();
+  x.dim_map.clear();
+  // Compute the initial tableau.
+  LP_Problem_Status s_status = x.compute_tableau();
+
+  // Check for trivial cases.
+  switch (s_status) {
+  case UNFEASIBLE_LP_PROBLEM:
+    return false;
+  case UNBOUNDED_LP_PROBLEM:
+    // A feasible point has to be returned: the origin.
+    // Ensure the right space dimension is obtained.
+    x.last_generator = point(0*Variable(space_dim-1));
+    return true;
+  case OPTIMIZED_LP_PROBLEM:
+    // Check for the special case of an empty tableau,
+    // in which case an optimizing solution is the origin.
+    if (x.tableau.num_rows() == 0) {
+      // Ensure the right space dimension is obtained.
+      x.last_generator = point(0*Variable(space_dim-1));
+      return true;
+    }
+    break;
+  }
+
+#if PPL_NOISY_SIMPLEX
+  num_iterations = 0;
+#endif
+
+  // Actually solve the LP problem.
+  x.base = std::vector<dimension_type> (x.tableau.num_rows());
+
+  // This will contain the new cost function for the 1st phase problem.
+  // Adds the necessary slack variables to get the 1st phase problem.
+  x.prepare_first_phase();
+  // Solve the first phase of the primal simplex algorithm.
+  bool first_phase_successful = x.compute_simplex();
+
+#if PPL_NOISY_SIMPLEX
+  std::cout << "LP_Problem::solve: 1st phase ended at iteration "
+	    << num_iterations << "." << std::endl;
+#endif
+  // If the first phase problem was not solved or if we found an optimum
+  // value different from zero, then the origianl problem is unfeasible.
+  if (!first_phase_successful || x.working_cost[0] != 0){
+    x.status = UNSATISFIABLE;
+    return false;
+  }
+
+  // The first phase has found a feasible solution. If only a satisfiability
+  // check was requested, we can return that feasible solution.
+  // Store the last succesfully computed generator.
+  x.last_generator = compute_generator();
+  x.status = SATISFIABLE;
+  // Erase the slack variables.
+  x.erase_slacks();
+  return true;
+}
+
+bool
+PPL::LP_Problem::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // Constraint system should contain no strict inequalities.
+  if (input_cs.has_strict_inequalities()) {
+#ifndef NDEBUG
+    cerr << "The feasible region of the LP_Problem is defined by "
+	 << "a constraint system containing strict inequalities."
+	 << endl;
+#endif
+    return false;
+  }
+
+  // Constraint system and objective function should be dimension compatible.
+  const dimension_type space_dim = input_cs.space_dimension();
+  if (space_dim < input_obj_function.space_dimension()) {
+#ifndef NDEBUG
+    cerr << "The LP_Problem and the objective function have "
+	 << "incompatible space dimensions ("
+	 << space_dim << " < " << input_obj_function.space_dimension() << ")."
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (status == SATISFIABLE || status == UNBOUNDED || status == OPTIMIZED) {
+    // Here `last_generator' has to be meaningful.
+    // Check for dimension compatibility and actual feasibility.
+    if (space_dim != last_generator.space_dimension()) {
+#ifndef NDEBUG
+      cerr << "The LP_Problem and the cached feasible point have "
+	   << "incompatible space dimensions ("
+	   << space_dim << " != " << last_generator.space_dimension() << ")."
+	   << endl;
+#endif
+      return false;
+    }
+    if (!input_cs.satisfies_all_constraints(last_generator)) {
+#ifndef NDEBUG
+      cerr << "The cached feasible point does not belong to "
+	   << "the feasible region of the LP_Problem."
+	   << endl;
+#endif
+      return false;
+    }
+
+    const dimension_type tableau_nrows = tableau.num_rows();
+    const dimension_type tableau_ncols = tableau.num_columns();
+
+    // The number of rows in the tableau and base should be equal.
+    if (tableau_nrows != base.size()) {
+#ifndef NDEBUG
+      cerr << "tableau and base have incompatible sizes" << endl;
+#endif
+      return false;
+    }
+
+    // The number of columns in the tableau and working_cost should be equal.
+    if (tableau_ncols != working_cost.size()) {
+#ifndef NDEBUG
+      cerr << "tableau and working_cost have incompatible sizes" << endl;
+#endif
+      return false;
+    }
+
+    // The vector base should contain indices of tableau's columns.
+    for (dimension_type i = base.size(); i-- > 0; )
+      if (base[i] > tableau_ncols) {
+#ifndef NDEBUG
+	cerr << "base contains an invalid column index" << endl;
+#endif
+	return false;
+      }
+
+    // dim_map should encode an injective function having
+    // disjoint domain and range.
+    std::set<dimension_type> domain;
+    std::set<dimension_type> range;
+    typedef std::map<dimension_type, dimension_type>::const_iterator Iter;
+    for (Iter i = dim_map.begin(), iend = dim_map.end(); i != iend; ++i) {
+      domain.insert(i->first);
+      range.insert(i->second);
+    }
+    if (domain.size() != range.size()
+	|| domain.end() != std::find_first_of(domain.begin(), domain.end(),
+					      range.begin(), range.end())) {
+#ifndef NDEBUG
+      cerr << "dim_map encodes an invalid map" << endl;
+#endif
+      return false;
+    }
+  }
+  // TODO: further tests will be added when supporting incremental
+  // computations.
+
+  // All checks passed.
+  return true;
+}
+
+void
+PPL::LP_Problem::ascii_dump(std::ostream& s) const {
+  using namespace IO_Operators;
+
+  s << "input_cs\n";
+  input_cs.ascii_dump(s);
+  s << "\ninput_obj_function\n";
+  input_obj_function.ascii_dump(s);
+  s << "\nopt_mode " << (opt_mode == MAXIMIZATION ? "MAX" : "MIN") << "\n";
+
+  s << "\nstatus: ";
+  switch (status) {
+  case UNSATISFIABLE:
+    s << "UNSAT";
+    break;
+  case SATISFIABLE:
+    s << "SATIS";
+    break;
+  case UNBOUNDED:
+    s << "UNBOU";
+    break;
+  case OPTIMIZED:
+    s << "OPTIM";
+    break;
+  case PARTIALLY_SATISFIABLE:
+    s << "P_SAT";
+    break;
+  case UNSOLVED:
+    s << "UNSOL";
+    break;
+  }
+  s << "\n";
+
+  s << "\ntableau\n";
+  tableau.ascii_dump(s);
+  s << "\nworking_cost\n";
+  working_cost.ascii_dump(s);
+
+  const dimension_type base_size = base.size();
+  s << "\nbase (" << base_size << ")\n";
+  for (dimension_type i = 0; i != base_size; ++i)
+    s << base[i] << ' ';
+
+  const dimension_type dim_map_size = dim_map.size();
+  s << "\ndim_map (" << dim_map_size << ")\n";
+  for (std::map<dimension_type, dimension_type>::const_iterator
+	 i = dim_map.begin(), iend = dim_map.end(); i != iend; ++i)
+    s << Variable(i->first) << "->" << Variable(i->second) << ' ';
+
+  s << "\nlast_generator\n";
+  last_generator.ascii_dump(s);
+  s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(LP_Problem);
diff --git a/src/LP_Problem.defs.hh b/src/LP_Problem.defs.hh
new file mode 100644
index 0000000..3f5e7db
--- /dev/null
+++ b/src/LP_Problem.defs.hh
@@ -0,0 +1,394 @@
+/* LP_Problem class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_LP_Problem_defs_hh
+#define PPL_LP_Problem_defs_hh 1
+
+#include "LP_Problem.types.hh"
+#include "globals.types.hh"
+#include "Row.defs.hh"
+#include "Matrix.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint.types.hh"
+#include "Generator.defs.hh"
+#include <vector>
+#include <map>
+#include <iosfwd>
+
+//! A Linear Programming problem.
+/*! \ingroup PPL_CXX_interface */
+class Parma_Polyhedra_Library::LP_Problem {
+public:
+  //! Default constructor: builds a trivial LP problem.
+  /*!
+    The trivial LP problem requires to maximize the objective function
+    \f$0\f$ on the zero-dimensional vector space under no constraints
+    at all: the origin of the vector space is the optimal solution.
+  */
+  LP_Problem();
+
+  /*! \brief
+    Builds an LP problem from the constraint system \p cs, the objective
+    function \p obj and optimization mode \p mode.
+
+    \param cs
+    The constraint system defining the feasible region for the LP problem.
+
+    \param obj
+    The objective function for the LP problem (optional argument with
+    default value \f$0\f$).
+
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
+
+    \exception std::invalid_argument
+    Thrown if the constraint system contains any strict inequality
+    or if the space dimension of the objective function is strictly
+    greater than the space dimension of the constraint system.
+  */
+  explicit LP_Problem(const Constraint_System& cs,
+		      const Linear_Expression& obj = Linear_Expression::zero(),
+		      Optimization_Mode mode = MAXIMIZATION);
+
+  //! Ordinary copy-constructor.
+  LP_Problem(const LP_Problem& y);
+
+  //! Destructor.
+  ~LP_Problem();
+
+  //! Assignment operator.
+  LP_Problem& operator=(const LP_Problem& y);
+
+  //! Returns the maximum space dimension a LP_Problem can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the current LP problem.
+  dimension_type space_dimension() const;
+
+  //! Returns the constraints defining the current feasible region.
+  const Constraint_System& constraints() const;
+
+  //! Returns the current objective function.
+  const Linear_Expression& objective_function() const;
+
+  //! Returns the current optimization mode.
+  Optimization_Mode optimization_mode() const;
+
+  //! Resets \p *this to be equal to the trivial LP problem.
+  void clear();
+
+  /*! \brief
+    Adds a copy of constraint \p c to the current LP problem,
+    increasing the number of space dimensions if needed.
+
+    \exception std::invalid_argument
+    Thrown if the constraint \p c is a strict inequality.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the current LP problem,
+    increasing the number of space dimensions if needed.
+
+    \exception std::invalid_argument
+    Thrown if the constraint system \p cs contains any strict inequality.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  //! Sets the objective function to \p obj.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the space dimension of \p obj is strictly greater than
+    the space dimension of \p *this.
+  */
+  void set_objective_function(const Linear_Expression& obj);
+
+  //! Sets the optimization mode to \p mode.
+  void set_optimization_mode(Optimization_Mode mode);
+
+  //! Checks satisfiability of \p *this.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if the LP problem is satisfiable.
+  */
+  bool is_satisfiable() const;
+
+  //! Optimizes the current LP problem using the primal simplex algorithm.
+  /*!
+    \return
+    An LP_Problem_Status flag indicating the outcome of the optimization
+    attempt (unfeasible, unbounded or optimized problem).
+  */
+  LP_Problem_Status solve() const;
+
+  /*! \brief
+    Sets \p num and \p den so that \f$\frac{num}{den}\f$ is the result
+    of evaluating the objective function on \p evaluating_point.
+
+    \param evaluating_point
+    The point on which the objective function will be evaluated.
+
+    \param num
+    On exit will contain the numerator of the evaluated value.
+
+    \param den
+    On exit will contain the denominator of the evaluated value.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p evaluating_point are dimension-incompatible
+    or if the generator \p evaluating_point is not a point.
+  */
+  void evaluate_objective_function(const Generator& evaluating_point,
+				   Coefficient& num,
+				   Coefficient& den) const;
+
+  //! Returns a feasible point for \p *this, if it exists.
+  /*!
+    \exception std::domain_error
+    Thrown if the LP problem is not satisfiable.
+  */
+  const Generator& feasible_point() const;
+
+  //! Returns an optimal point for \p *this, if it exists.
+  /*!
+    \exception std::domain_error
+    Thrown if \p *this doesn't not have an optimizing point, i.e.,
+    if the LP problem is unbounded or not satisfiable.
+  */
+  const Generator& optimizing_point() const;
+
+  /*! \brief
+    Sets \p num and \p den so that \f$\frac{num}{den}\f$ is
+    the solution of the optimization problem.
+
+    \exception std::domain_error
+    Thrown if \p *this doesn't not have an optimizing point, i.e.,
+    if the LP problem is unbounded or not satisfiable.
+  */
+  void optimal_value(Coefficient& num, Coefficient& den) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(LP_Problem& y);
+
+private:
+  //! The matrix encoding the current feasible region in tableau form.
+  Matrix tableau;
+  //! The working cost function.
+  Row working_cost;
+  //! The current basic solution.
+  std::vector<dimension_type> base;
+  //! A mapping between original variables and split ones.
+  /*!
+    Contains all the pairs (i, j) such that Variable(i) (that was not found
+    to be constrained in sign) has been split into two nonnegative variables.
+    The "positive" one is represented again by Variable(i), and
+    the "negative" one is represented by Variable(j).
+  */
+  std::map<dimension_type, dimension_type> dim_map;
+
+  //! An enumerated type describing the internal status of the LP problem.
+  enum Status {
+    //! The LP problem has not been solved yet.
+    UNSOLVED,
+    //! The LP problem is unsatisfiable.
+    UNSATISFIABLE,
+    //! The LP problem is satisfiable; a feasible solution has been computed.
+    SATISFIABLE,
+    //! The LP problem is unbounded; a feasible solution has been computed.
+    UNBOUNDED,
+    //! The LP problem is optimized; an optimal solution has been computed.
+    OPTIMIZED,
+    /*! \brief
+      The feasible region of the LP problem has been changed by adding
+      new constraints; a feasible solution for the old constraints has
+      been computed.
+    */
+    PARTIALLY_SATISFIABLE
+  };
+
+  //! The internal state of the LP problem.
+  Status status;
+
+  //! The constraint system describing the feasible region.
+  Constraint_System input_cs;
+
+  //! The objective function to be optimized.
+  Linear_Expression input_obj_function;
+
+  //! The optimization mode requested.
+  Optimization_Mode opt_mode;
+
+  //! The last successfully computed feasible or optimizing point.
+  Generator last_generator;
+
+  /*! \brief
+    Optimizes the current LP problem using the second phase of the
+    primal simplex algorithm.
+  */
+  void second_phase();
+
+  /*! \brief
+    Assigns to \p this->tableau a simplex tableau representing the
+    current LP problem, inserting into \p this->dim_map the information
+    that is required to recover the original LP problem.
+
+    \return
+    <CODE>UNFEASIBLE_LP_PROBLEM</CODE> if the constraint system contains
+    any trivially unfeasible constraint (tableau was not computed);
+    <CODE>UNBOUNDED_LP_PROBLEM</CODE> if the problem is trivially unbounded
+    (the computed tableau contains no constraints);
+    <CODE>OPTIMIZED_LP_PROBLEM></CODE> if the problem is neither trivially
+    unfeasible nor trivially unbounded (the tableau was computed successfully).
+  */
+  LP_Problem_Status compute_tableau();
+
+  /*! \brief
+    Checks for optimality and, if it does not hold, computes the column
+    index of the variable entering the base of the LP problem.
+    Implemented with anti-cycling rule.
+
+    \return
+    The column index of the variable that enters the base. If no such
+    variable exists, optimality was achieved and <CODE>0</CODE> is retuned.
+  */
+  dimension_type get_entering_var_index() const;
+
+  /*! \brief
+    Computes the row index of the variable exiting the base
+    of the LP problem. Implemented with anti-cycling rules.
+
+    \return
+    The row index of the variable exiting the base.
+
+    \param entering_var_index
+    The column index of the variable entering the base.
+  */
+  dimension_type
+  get_exiting_base_index(dimension_type entering_var_index) const;
+
+  //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
+  /*!
+    \param x
+    The Row that will be combined with \p y object.
+
+    \param y
+    The Row that will be combined with \p x object.
+
+    \param k
+    The position of \p *this that have to be \f$0\f$.
+
+    Computes a linear combination of \p x and \p y having
+    the element of index \p k equal to \f$0\f$. Then it assigns
+    the resulting Linear_Row to \p x and normalizes it.
+  */
+  static void linear_combine(Row& x, const Row& y, const dimension_type k);
+
+  /*! \brief
+    Swaps two variables in base during the simplex algorithm,
+    performing the needed linear combinations.
+
+    \param entering_var_index
+    The index of the variable entering the base.
+
+    \param exiting_base_index
+    The index of the row exiting the base.
+  */
+  void swap_base(const dimension_type entering_var_index,
+		 const dimension_type exiting_base_index);
+
+  /*! \brief
+    Checks for optimality and, if it does not hold, computes the column
+    index of the variable entering the base of the LP problem.
+
+    \return
+    The column index of the variable that enters the base. If no such
+    variable exists, optimality was achieved and <CODE>0</CODE> is retuned.
+
+    To compute the entering_index, the steepest edge algorithm chooses
+    the index `j' such that \f$\frac{d_{j}}{\|\Delta x^{j} \|}\f$ is the
+    largest in absolute value, where
+    \f[
+      \|\Delta x^{j} \|
+        = \left(
+            1+\sum_{i=1}^{m} \alpha_{ij}^2
+          \right)^{\frac{1}{2}}.
+    \f]
+    Recall that, due to the Integer implementation of the algorithm, our
+    tableau doesn't contain the ``real'' \f$\alpha\f$ values, but these
+    can be computed dividing the value of the cofficient by the value of
+    the variable in base. Obviously the result may not be an Integer, so
+    we will proceed in another way: the following code will compute the
+    lcm of all the variables in base to get the good ``weight'' of each
+    Coefficient of the tableau.
+  */
+  dimension_type steepest_edge() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and if only the algorithm successfully
+    computed a feasible solution.
+  */
+  bool compute_simplex();
+
+  /*! \brief
+    Adds the slack variables to satisfy the standard form of a LP problem,
+    inserts the "sign" to the cost functions, and makes the
+    necessary swaps to express the problem with the 1st phase base.
+  */
+  void prepare_first_phase();
+
+  /*! \brief
+    Drop unnecessary slack variables from the tableau and get ready
+    for the second phase of the simplex algorithm.
+  */
+  void erase_slacks();
+
+  bool is_in_base(const dimension_type var_index,
+		  dimension_type& row_index) const;
+
+  Generator compute_generator() const;
+};
+
+#include "LP_Problem.inlines.hh"
+
+#endif // !defined(PPL_LP_Problem_defs_hh)
diff --git a/src/LP_Problem.inlines.hh b/src/LP_Problem.inlines.hh
new file mode 100644
index 0000000..ec0197e
--- /dev/null
+++ b/src/LP_Problem.inlines.hh
@@ -0,0 +1,267 @@
+/* LP_Problem class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_LP_Problem_inlines_hh
+#define PPL_LP_Problem_inlines_hh 1
+
+#include "Constraint.defs.hh"
+#include "Constraint_System.defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+LP_Problem::LP_Problem()
+  : tableau(), working_cost(0, Row::Flags()),
+    base(),  dim_map(), status(OPTIMIZED),
+    input_cs(), input_obj_function(), opt_mode(MAXIMIZATION),
+    last_generator(point()) {
+  assert(OK());
+}
+
+inline
+LP_Problem::LP_Problem(const Constraint_System& cs,
+		       const Linear_Expression& obj,
+		       const Optimization_Mode mode)
+  : tableau(), working_cost(0, Row::Flags()),
+    base(), dim_map(), status(UNSOLVED),
+    input_cs(!cs.has_strict_inequalities()
+	     ? cs
+	     : (throw std::invalid_argument("PPL::LP_Problem::"
+			   "LP_Problem(cs, obj, m):\n"
+			   "cs contains strict inequalities."),
+		cs)),
+    input_obj_function(obj.space_dimension() <= cs.space_dimension()
+		       ? obj
+		       : (throw std::invalid_argument("PPL::LP_Problem::"
+			             "LP_Problem(cs, obj, m):\n"
+				     "cs and obj have "
+				     "incompatible space dimensions."),
+			  obj)),
+    opt_mode(mode),
+    last_generator(point()) {
+  assert(OK());
+}
+
+inline
+LP_Problem::LP_Problem(const LP_Problem& y)
+  : tableau(y.tableau), working_cost(y.working_cost),
+    base(y.base), dim_map(y.dim_map), status(y.status),
+    input_cs(y.input_cs), input_obj_function(y.input_obj_function),
+    opt_mode(y.opt_mode), last_generator(y.last_generator) {
+  assert(OK());
+}
+
+inline
+LP_Problem::~LP_Problem() {
+}
+
+inline void
+LP_Problem::swap(LP_Problem& y) {
+  std::swap(tableau, y.tableau);
+  std::swap(working_cost, y.working_cost);
+  std::swap(base, y.base);
+  std::swap(dim_map, y.dim_map);
+  std::swap(status, y.status);
+  std::swap(input_cs, y.input_cs);
+  std::swap(input_obj_function, y.input_obj_function);
+  std::swap(opt_mode, y.opt_mode);
+  std::swap(last_generator, y.last_generator);
+}
+
+inline LP_Problem&
+LP_Problem::operator=(const LP_Problem& y) {
+  LP_Problem tmp(y);
+  swap(tmp);
+  return *this;
+}
+
+inline dimension_type
+LP_Problem::max_space_dimension() {
+  return Constraint_System::max_space_dimension();
+}
+
+inline dimension_type
+LP_Problem::space_dimension() const {
+  return input_cs.space_dimension();
+}
+
+inline const Constraint_System&
+LP_Problem::constraints() const {
+  return input_cs;
+}
+
+inline const Linear_Expression&
+LP_Problem::objective_function() const {
+  return input_obj_function;
+}
+
+inline Optimization_Mode
+LP_Problem::optimization_mode() const {
+  return opt_mode;
+}
+
+inline void
+LP_Problem::clear() {
+  LP_Problem tmp;
+  swap(tmp);
+}
+
+inline void
+LP_Problem::add_constraint(const Constraint& c) {
+  if (c.is_strict_inequality())
+    throw std::invalid_argument("PPL::LP_Problem::add_constraint(c):\n"
+				"c is a strict inequality.");
+  input_cs.insert(c);
+  if (status != UNSATISFIABLE)
+    // TODO: apply an incremental version of the simplex algorithm,
+    // setting `status' to PARTIALLY_SATISFIABLE;
+    status = UNSOLVED;
+}
+
+inline void
+LP_Problem::add_constraints(const Constraint_System& cs) {
+  if (cs.has_strict_inequalities())
+    throw std::invalid_argument("PPL::LP_Problem::add_constraints(cs):\n"
+				"cs contains strict inequalities.");
+  const dimension_type cs_num_rows = cs.num_rows();
+  for (dimension_type i = cs_num_rows; i-- > 0; )
+    input_cs.insert(cs[i]);
+  if (status != UNSATISFIABLE)
+    // TODO: apply an incremental version of the simplex algorithm,
+    // setting `status' to PARTIALLY_SATISFIABLE;
+    status = UNSOLVED;
+  assert(OK());
+}
+
+inline void
+LP_Problem::set_objective_function(const Linear_Expression& obj) {
+  if (space_dimension() < obj.space_dimension())
+    throw std::invalid_argument("PPL::LP_Problem::"
+				"set_objective_function(obj):\n"
+				"*this and obj are dimension incompatible.");
+  switch (status) {
+  case UNBOUNDED:
+    status = SATISFIABLE;
+    break;
+  case OPTIMIZED:
+    status = SATISFIABLE;
+    break;
+  default:
+    break;
+  }
+  input_obj_function = obj;
+  assert(OK());
+}
+
+inline void
+LP_Problem::set_optimization_mode(Optimization_Mode mode) {
+  if (opt_mode == mode)
+    return;
+  switch (status) {
+  case UNBOUNDED:
+    status = SATISFIABLE;
+    break;
+  case OPTIMIZED:
+    status = SATISFIABLE;
+    break;
+  default:
+    break;
+  }
+  opt_mode = mode;
+  assert(OK());
+}
+
+inline LP_Problem_Status
+LP_Problem::solve() const {
+  if (is_satisfiable()) {
+    LP_Problem& x = const_cast<LP_Problem&>(*this);
+    x.second_phase();
+    if (x.status == UNBOUNDED)
+      return UNBOUNDED_LP_PROBLEM;
+    if (x.status == OPTIMIZED)
+      return OPTIMIZED_LP_PROBLEM;
+  }
+  return UNFEASIBLE_LP_PROBLEM;
+}
+
+inline const Generator&
+LP_Problem::feasible_point() const {
+  if (is_satisfiable()) {
+    assert(OK());
+    return last_generator;
+  }
+  throw std::domain_error("PPL::LP_Problem::feasible_point():\n"
+			  "*this is not satisfiable.");
+}
+
+inline const Generator&
+LP_Problem::optimizing_point() const {
+  if (solve() == OPTIMIZED_LP_PROBLEM)
+    return last_generator;
+  throw std::domain_error("PPL::LP_Problem::optimizing_point():\n"
+			  "*this doesn't have an optimizing point.");
+}
+
+inline void
+LP_Problem::optimal_value(Coefficient& num, Coefficient& den) const {
+  const Generator& g_ref = optimizing_point();
+  evaluate_objective_function(g_ref, num, den);
+  assert(OK());
+}
+
+inline memory_size_type
+LP_Problem::external_memory_in_bytes() const {
+  memory_size_type n
+    = tableau.external_memory_in_bytes()
+    + working_cost.external_memory_in_bytes()
+    + input_cs.external_memory_in_bytes()
+    + input_obj_function.external_memory_in_bytes()
+    + last_generator.external_memory_in_bytes();
+  // Adding the external memory for `base'.
+  n += base.capacity() * sizeof(dimension_type);
+  // Adding the external memory for `dim_map'.
+  // CHECK ME: just a lower approximation?
+  n += dim_map.size()
+    * sizeof(std::map<dimension_type, dimension_type>::value_type);
+  return n;
+}
+
+inline memory_size_type
+LP_Problem::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::LP_Problem */
+inline void
+swap(Parma_Polyhedra_Library::LP_Problem& x,
+     Parma_Polyhedra_Library::LP_Problem& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_LP_Problem_inlines_hh)
diff --git a/src/LP_Problem.types.hh b/src/LP_Problem.types.hh
new file mode 100644
index 0000000..ea812e1
--- /dev/null
+++ b/src/LP_Problem.types.hh
@@ -0,0 +1,32 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_LP_Problem_types_hh
+#define PPL_LP_Problem_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the LP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum LP_Problem_Status {
+  //! The problem is unfeasible.
+  UNFEASIBLE_LP_PROBLEM,
+  //! The problem is unbounded.
+  UNBOUNDED_LP_PROBLEM,
+  //! The problem has an optimal solution.
+  OPTIMIZED_LP_PROBLEM
+};
+
+class LP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_LP_Problem_types_hh)
diff --git a/src/Limits.hh b/src/Limits.hh
new file mode 100644
index 0000000..3fec349
--- /dev/null
+++ b/src/Limits.hh
@@ -0,0 +1,95 @@
+/* Limits for native integer types.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Limits_hh
+#define PPL_Limits_hh 1
+
+#include <climits>
+
+// C99 defines LLONG_MIN, LLONG_MAX and ULLONG_MAX, but this part of
+// C99 is not yet included into the C++ standard.
+// GCC defines LONG_LONG_MIN, LONG_LONG_MAX and ULONG_LONG_MAX.
+// Some compilers (such as Comeau C++ up to and including version 4.3.3)
+// define nothing.  In this last case we make a reasonable guess.
+#ifndef LLONG_MIN
+#if defined(LONG_LONG_MIN)
+#define LLONG_MIN LONG_LONG_MIN
+#elif SIZEOF_LONG_LONG == 8
+#define LLONG_MIN 0x8000000000000000LL
+#endif
+#endif
+
+#ifndef LLONG_MAX
+#if defined(LONG_LONG_MAX)
+#define LLONG_MAX LONG_LONG_MAX
+#elif SIZEOF_LONG_LONG == 8
+#define LLONG_MAX 0x7fffffffffffffffLL
+#endif
+#endif
+
+#ifndef ULLONG_MAX
+#if defined(ULONG_LONG_MAX)
+#define ULLONG_MAX ULONG_LONG_MAX
+#elif SIZEOF_UNSIGNED_LONG_LONG == 8
+#define ULLONG_MAX 0xffffffffffffffffULL
+#endif
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+/*
+  The only reason to use these definitions instead of std::numeric_limits
+  is a missing optimization in GCC 3.4.1.
+*/
+
+template <typename T>
+struct Limits;
+
+#define signed_limits(type, prefix) \
+template <> \
+struct Limits<type> { \
+	static const type min = prefix ## _MIN; \
+	static const type max = prefix ## _MAX; \
+}
+
+#define unsigned_limits(type, prefix) \
+template <> \
+struct Limits<type> { \
+	static const type min = 0; \
+	static const type max = prefix ## _MAX; \
+}
+
+signed_limits(signed char, SCHAR);
+signed_limits(short, SHRT);
+signed_limits(int, INT);
+signed_limits(long, LONG);
+signed_limits(long long, LLONG);
+
+unsigned_limits(unsigned char, UCHAR);
+unsigned_limits(unsigned short, USHRT);
+unsigned_limits(unsigned int, UINT);
+unsigned_limits(unsigned long, ULONG);
+unsigned_limits(unsigned long long, ULLONG);
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Limits_hh)
diff --git a/src/Linear_Expression.cc b/src/Linear_Expression.cc
new file mode 100644
index 0000000..5fd2a3b
--- /dev/null
+++ b/src/Linear_Expression.cc
@@ -0,0 +1,289 @@
+/* Linear_Expression class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+
+#include <config.h>
+
+#include "Linear_Expression.defs.hh"
+#include "Constraint.defs.hh"
+#include "Generator.defs.hh"
+#include "Congruence.defs.hh"
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Linear_Expression::Linear_Expression(const Constraint& c)
+  : Linear_Row(c.space_dimension() + 1, Linear_Row::Flags()) {
+  Linear_Expression& e = *this;
+  for (dimension_type i = size(); i-- > 0; )
+    e[i] = c[i];
+}
+
+PPL::Linear_Expression::Linear_Expression(const Generator& g)
+  : Linear_Row(g.space_dimension() + 1, Linear_Row::Flags()) {
+  Linear_Expression& e = *this;
+  // Do not copy the divisor of `g'.
+  for (dimension_type i = size(); --i > 0; )
+    e[i] = g[i];
+}
+
+PPL::Linear_Expression::Linear_Expression(const Congruence& cg)
+  : Linear_Row(cg.space_dimension() + 1, Linear_Row::Flags()) {
+  Linear_Expression& e = *this;
+  for (dimension_type i = size(); i-- > 0; )
+    e[i] = cg[i];
+}
+
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression
+PPL::operator+(const Linear_Expression& e1, const Linear_Expression& e2) {
+  dimension_type e1_size = e1.size();
+  dimension_type e2_size = e2.size();
+  dimension_type min_size;
+  dimension_type max_size;
+  const Linear_Expression* p_e_max;
+  if (e1_size > e2_size) {
+    min_size = e2_size;
+    max_size = e1_size;
+    p_e_max = &e1;
+  }
+  else {
+    min_size = e1_size;
+    max_size = e2_size;
+    p_e_max = &e2;
+  }
+
+  Linear_Expression r(max_size, false);
+  dimension_type i = max_size;
+  while (i > min_size) {
+    --i;
+    r[i] = (*p_e_max)[i];
+  }
+  while (i > 0) {
+    --i;
+    r[i] = e1[i] + e2[i];
+  }
+
+  return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression
+PPL::operator+(Coefficient_traits::const_reference n,
+	       const Linear_Expression& e) {
+  Linear_Expression r(e);
+  r[0] += n;
+  return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression
+PPL::operator-(const Linear_Expression& e) {
+  Linear_Expression r(e);
+  for (dimension_type i = e.size(); i-- > 0; )
+    neg_assign(r[i]);
+  return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression
+PPL::operator-(const Linear_Expression& e1, const Linear_Expression& e2) {
+  dimension_type e1_size = e1.size();
+  dimension_type e2_size = e2.size();
+  if (e1_size > e2_size) {
+    Linear_Expression r(e1_size, false);
+    dimension_type i = e1_size;
+    while (i > e2_size) {
+      --i;
+      r[i] = e1[i];
+    }
+    while (i > 0) {
+      --i;
+      r[i] = e1[i] - e2[i];
+    }
+    return r;
+  }
+  else {
+    Linear_Expression r(e2_size, false);
+    dimension_type i = e2_size;
+    while (i > e1_size) {
+      --i;
+      r[i] = -e2[i];
+    }
+    while (i > 0) {
+      --i;
+      r[i] = e1[i] - e2[i];
+    }
+    return r;
+  }
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression
+PPL::operator-(Coefficient_traits::const_reference n,
+	       const Linear_Expression& e) {
+  Linear_Expression r(e);
+  for (dimension_type i = e.size(); i-- > 0; )
+    neg_assign(r[i]);
+  r[0] += n;
+
+  return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression
+PPL::operator*(Coefficient_traits::const_reference n,
+	       const Linear_Expression& e) {
+  Linear_Expression r(e);
+  for (dimension_type i = e.size(); i-- > 0; )
+    r[i] *= n;
+  return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression&
+PPL::operator+=(Linear_Expression& e1, const Linear_Expression& e2) {
+  dimension_type e1_size = e1.size();
+  dimension_type e2_size = e2.size();
+  if (e1_size >= e2_size)
+    for (dimension_type i = e2_size; i-- > 0; )
+      e1[i] += e2[i];
+  else {
+    Linear_Expression e(e2);
+    for (dimension_type i = e1_size; i-- > 0; )
+      e[i] += e1[i];
+    std::swap(e1, e);
+  }
+  return e1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression&
+PPL::operator+=(Linear_Expression& e, const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Expression::max_space_dimension())
+    throw std::length_error("PPL::operator+=(e, v):\n"
+			    "v exceeds the maximum allowed space dimension.");
+  const dimension_type e_size = e.size();
+  if (e_size <= v_space_dim) {
+    Linear_Expression new_e(e, v_space_dim+1);
+    std::swap(e, new_e);
+  }
+  ++e[v_space_dim];
+  return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression&
+PPL::operator-=(Linear_Expression& e1, const Linear_Expression& e2) {
+  dimension_type e1_size = e1.size();
+  dimension_type e2_size = e2.size();
+  if (e1_size >= e2_size)
+    for (dimension_type i = e2_size; i-- > 0; )
+      e1[i] -= e2[i];
+  else {
+    Linear_Expression e(e1, e2_size);
+    for (dimension_type i = e2_size; i-- > 0; )
+      e[i] -= e2[i];
+    std::swap(e1, e);
+  }
+  return e1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression&
+PPL::operator-=(Linear_Expression& e, const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Expression::max_space_dimension())
+    throw std::length_error("PPL::operator-=(e, v):\n"
+			    "v exceeds the maximum allowed space dimension.");
+  const dimension_type e_size = e.size();
+  if (e_size <= v_space_dim) {
+    Linear_Expression new_e(e, v_space_dim+1);
+    std::swap(e, new_e);
+  }
+  --e[v_space_dim];
+  return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression&
+PPL::operator*=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  dimension_type e_size = e.size();
+  for (dimension_type i = e_size; i-- > 0; )
+    e[i] *= n;
+  return e;
+}
+
+bool
+PPL::Linear_Expression::OK() const {
+  dimension_type sz = size();
+  return Linear_Row::OK(sz, sz);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Linear_Expression& e) {
+  const int num_variables = e.space_dimension();
+  bool first = true;
+  for (int v = 0; v < num_variables; ++v) {
+    Coefficient ev = e[v+1];
+    if (ev != 0) {
+      if (!first) {
+	if (ev > 0)
+	  s << " + ";
+	else {
+	  s << " - ";
+	  neg_assign(ev);
+	}
+      }
+      else
+	first = false;
+      if (ev == -1)
+	s << "-";
+      else if (ev != 1)
+	s << ev << "*";
+      s << PPL::Variable(v);
+    }
+  }
+  // Inhomogeneous term.
+  Coefficient it = e[0];
+  if (it != 0) {
+    if (!first) {
+      if (it > 0)
+	s << " + ";
+      else {
+	s << " - ";
+	neg_assign(it);
+      }
+    }
+    else
+      first = false;
+    s << it;
+  }
+
+  if (first)
+    // The null linear expression.
+    s << Coefficient_zero();
+  return s;
+}
diff --git a/src/Linear_Expression.defs.hh b/src/Linear_Expression.defs.hh
new file mode 100644
index 0000000..b822e14
--- /dev/null
+++ b/src/Linear_Expression.defs.hh
@@ -0,0 +1,444 @@
+/* Linear_Expression class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Linear_Expression_defs_hh
+#define PPL_Linear_Expression_defs_hh 1
+
+#include "Linear_Expression.types.hh"
+#include "Scalar_Products.types.hh"
+#include "Constraint.types.hh"
+#include "Generator.types.hh"
+#include "Congruence.types.hh"
+#include "Grid_Generator.types.hh"
+#include "Linear_Row.defs.hh"
+#include "Coefficient.types.hh"
+#include "Variable.defs.hh"
+#include "Constraint_System.types.hh"
+#include "Generator_System.types.hh"
+#include "Congruence_System.types.hh"
+#include "Grid_Generator_System.types.hh"
+#include "Polyhedron.types.hh"
+#include "Grid.types.hh"
+#include "LP_Problem.types.hh"
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the congruence \p e1 = \p e2 \p \pmod{1}.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the congruence \p e = \p n \p \pmod{1}.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 + \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v + \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, Variable w);
+
+//! Returns the linear expression \p v + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e);
+
+//! Returns the linear expression - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e);
+
+//! Returns the linear expression \p e1 - \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v - \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, Variable w);
+
+//! Returns the linear expression \p v - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e * \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 + \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e + \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator+=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e + \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 - \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e - \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator-=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e - \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+std::ostream& operator<<(std::ostream& s, const Linear_Expression& e);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+void swap(Parma_Polyhedra_Library::Linear_Expression& x,
+	  Parma_Polyhedra_Library::Linear_Expression& y);
+
+} // namespace std
+
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Linear_Expression represents the linear expression
+  \f[
+    \sum_{i=0}^{n-1} a_i x_i + b
+  \f]
+  where \f$n\f$ is the dimension of the vector space,
+  each \f$a_i\f$ is the integer coefficient
+  of the \f$i\f$-th variable \f$x_i\f$
+  and \f$b\f$ is the integer for the inhomogeneous term.
+
+  \par How to build a linear expression.
+
+  Linear expressions are the basic blocks for defining
+  both constraints (i.e., linear equalities or inequalities)
+  and generators (i.e., lines, rays, points and closure points).
+  A full set of functions is defined to provide a convenient interface
+  for building complex linear expressions starting from simpler ones
+  and from objects of the classes Variable and Coefficient:
+  available operators include unary negation,
+  binary addition and subtraction,
+  as well as multiplication by a Coefficient.
+  The space dimension of a linear expression is defined as the maximum
+  space dimension of the arguments used to build it:
+  in particular, the space dimension of a Variable <CODE>x</CODE>
+  is defined as <CODE>x.id()+1</CODE>,
+  whereas all the objects of the class Coefficient have space dimension zero.
+
+  \par Example
+  The following code builds the linear expression \f$4x - 2y - z + 14\f$,
+  having space dimension \f$3\f$:
+  \code
+  Linear_Expression e = 4*x - 2*y - z + 14;
+  \endcode
+  Another way to build the same linear expression is:
+  \code
+  Linear_Expression e1 = 4*x;
+  Linear_Expression e2 = 2*y;
+  Linear_Expression e3 = z;
+  Linear_Expression e = Linear_Expression(14);
+  e += e1 - e2 - e3;
+  \endcode
+  Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3,
+  respectively; also, in the fourth line of code, \p e is created
+  with space dimension zero and then extended to space dimension 3
+  in the fifth line.
+*/
+class Parma_Polyhedra_Library::Linear_Expression : private Linear_Row {
+public:
+  //! Default constructor: returns a copy of Linear_Expression::zero().
+  Linear_Expression();
+
+  //! Ordinary copy-constructor.
+  Linear_Expression(const Linear_Expression& e);
+
+  //! Destructor.
+  ~Linear_Expression();
+
+  /*! \brief
+    Builds the linear expression corresponding
+    to the inhomogeneous term \p n.
+  */
+  explicit Linear_Expression(Coefficient_traits::const_reference n);
+
+  //! Builds the linear expression corresponding to the variable \p v.
+  /*! \relates Linear_Expression
+    \exception std::length_error
+    Thrown if the space dimension of \p v exceeds
+    <CODE>Linear_Expression::max_space_dimension()</CODE>.
+  */
+  Linear_Expression(Variable v);
+
+  //! Builds the linear expression corresponding to constraint \p c.
+  /*!
+    Given the constraint
+    \f$c = \bigl(\sum_{i=0}^{n-1} a_i x_i + b \relsym 0\bigr)\f$,
+    where \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$,
+    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$.
+    If \p c is an inequality (resp., equality) constraint, then
+    the built linear expression is unique up to a positive
+    (resp., non-zero) factor.
+  */
+  explicit Linear_Expression(const Constraint& c);
+
+  /*! \brief
+    Builds the linear expression corresponding to generator \p g
+    (for points and closure points, the divisor is not copied).
+
+    Given the generator
+    \f$g = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$
+    (where, for lines and rays, we have \f$d = 1\f$),
+    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i\f$.
+    The inhomogeneous term of the linear expression will always be 0.
+    If \p g is a ray, point or closure point (resp., a line), then
+    the linear expression is unique up to a positive
+    (resp., non-zero) factor.
+  */
+  explicit Linear_Expression(const Generator& g);
+
+  //! Builds the linear expression corresponding to congruence \p cg.
+  /*!
+    Given the congruence
+    \f$cg = \bigl(\sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod{m}\bigr)\f$,
+    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$.
+  */
+  explicit Linear_Expression(const Congruence& cg);
+
+  //! Returns the maximum space dimension a Linear_Expression can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns the (zero-dimension space) constant 0.
+  static const Linear_Expression& zero();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Linear_Expression& y);
+
+private:
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Constraint;
+  friend class Parma_Polyhedra_Library::Generator;
+  // The following declaration grants access to Grid_Generator::parameter.
+  friend class Parma_Polyhedra_Library::Grid_Generator;
+  friend class Parma_Polyhedra_Library::Congruence;
+  // FIXME: the following friend declaration should be avoided.
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  friend class Parma_Polyhedra_Library::Grid;
+  friend class Parma_Polyhedra_Library::LP_Problem;
+
+  // FIXME: the following friend declaration is only to grant access to
+  // Constraint_System::affine_preimage().
+  friend class Parma_Polyhedra_Library::Constraint_System;
+
+  // FIXME: the following friend declaration is only to grant access to
+  // Generator_System::affine_image().
+  friend class Parma_Polyhedra_Library::Generator_System;
+
+  // FIXME: the following friend declaration is only to grant access to
+  // Congruence_System::affine_preimage().
+  friend class Parma_Polyhedra_Library::Congruence_System;
+
+  // FIXME: the following friend declaration is only to grant access to
+  // Grid_Generator_System::affine_image().
+  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+  //! Copy-constructor with a specified space dimension.
+  Linear_Expression(const Linear_Expression& e, dimension_type sz);
+
+  //! Implementation sizing constructor.
+  /*!
+    The bool parameter is just to avoid problems with
+    the constructor Linear_Expression(Coefficient_traits::const_reference n).
+  */
+  Linear_Expression(dimension_type sz, bool);
+
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator+(const Linear_Expression& e1,
+				     const Linear_Expression& e2);
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator+(Coefficient_traits::const_reference n,
+				     const Linear_Expression& e);
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator+(const Linear_Expression& e,
+				     Coefficient_traits::const_reference n);
+
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator-(const Linear_Expression& e);
+
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator-(const Linear_Expression& e1,
+				     const Linear_Expression& e2);
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator-(Coefficient_traits::const_reference n,
+				     const Linear_Expression& e);
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator-(const Linear_Expression& e,
+				     Coefficient_traits::const_reference n);
+
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator*(Coefficient_traits::const_reference n,
+				     const Linear_Expression& e);
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator*(const Linear_Expression& e,
+				     Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator+=(Linear_Expression& e1,
+				      const Linear_Expression& e2);
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
+				      Variable v);
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator-=(Linear_Expression& e1,
+				      const Linear_Expression& e2);
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
+				      Variable v);
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator*=(Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+						    const Linear_Expression& e);
+
+  friend Congruence
+  Parma_Polyhedra_Library::operator%=(const Linear_Expression& e1,
+				      const Linear_Expression& e2);
+
+  friend Congruence
+  Parma_Polyhedra_Library::operator%=(const Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+};
+
+#include "Linear_Expression.inlines.hh"
+
+#endif // !defined(PPL_Linear_Expression_defs_hh)
diff --git a/src/Linear_Expression.inlines.hh b/src/Linear_Expression.inlines.hh
new file mode 100644
index 0000000..ae0f301
--- /dev/null
+++ b/src/Linear_Expression.inlines.hh
@@ -0,0 +1,212 @@
+/* Linear_Expression class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Linear_Expression_inlines_hh
+#define PPL_Linear_Expression_inlines_hh 1
+
+#include "Variable.defs.hh"
+#include "Coefficient.defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Linear_Expression::max_space_dimension() {
+  return Linear_Row::max_space_dimension();
+}
+
+inline
+Linear_Expression::Linear_Expression()
+  : Linear_Row(1, Linear_Row::Flags()) {
+}
+
+inline
+Linear_Expression::Linear_Expression(dimension_type sz, bool)
+  : Linear_Row(sz, Linear_Row::Flags()) {
+}
+
+inline
+Linear_Expression::Linear_Expression(const Variable v)
+  : Linear_Row(v.space_dimension() <= max_space_dimension()
+	       ? v.id() + 2
+	       : (throw std::length_error("PPL::Linear_Expression::"
+					  "Linear_Expression(v):\n"
+					  "v exceeds the maximum allowed "
+					  "space dimension."),
+		  v.id() + 2)
+	       , Linear_Row::Flags()) {
+  (*this)[v.id() + 1] = 1;
+}
+
+inline
+Linear_Expression::Linear_Expression(const Linear_Expression& e)
+  : Linear_Row(e) {
+}
+
+inline
+Linear_Expression::~Linear_Expression() {
+}
+
+inline
+Linear_Expression::Linear_Expression(const Linear_Expression& e,
+				     dimension_type sz)
+  : Linear_Row(e, sz, sz) {
+}
+
+inline
+Linear_Expression::Linear_Expression(Coefficient_traits::const_reference n)
+  : Linear_Row(1, Linear_Row::Flags()) {
+  (*this)[0] = n;
+}
+
+inline dimension_type
+Linear_Expression::space_dimension() const {
+  return size() - 1;
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::coefficient(Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    return Coefficient_zero();
+  return Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::inhomogeneous_term() const {
+  return Linear_Row::inhomogeneous_term();
+}
+
+inline const Linear_Expression&
+Linear_Expression::zero() {
+  static Linear_Expression z = Linear_Expression(Coefficient_zero());
+  return z;
+}
+
+inline memory_size_type
+Linear_Expression::external_memory_in_bytes() const {
+  return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_Expression::total_memory_in_bytes() const {
+  return Linear_Row::total_memory_in_bytes();
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e) {
+  return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Variable w) {
+  // FIXME: provide a better implementation.
+  return Linear_Expression(v) + Linear_Expression(w);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Linear_Expression& e) {
+  // FIXME: provide a better implementation.
+  return e + Linear_Expression(v);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, const Variable v) {
+  return v + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return -n + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Variable w) {
+  // FIXME: provide a better implementation.
+  return Linear_Expression(v) - Linear_Expression(w);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Linear_Expression& e) {
+  // FIXME: provide a better implementation.
+  return Linear_Expression(v) - e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, const Variable v) {
+  // FIXME: provide a better implementation.
+  return e - Linear_Expression(v);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n * e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  e[0] += n;
+  return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  e[0] -= n;
+  return e;
+}
+
+inline void
+Linear_Expression::swap(Linear_Expression& y) {
+  Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+swap(Parma_Polyhedra_Library::Linear_Expression& x,
+     Parma_Polyhedra_Library::Linear_Expression& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Linear_Expression_inlines_hh)
diff --git a/src/Linear_Expression.types.hh b/src/Linear_Expression.types.hh
new file mode 100644
index 0000000..3858003
--- /dev/null
+++ b/src/Linear_Expression.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_Expression_types_hh
+#define PPL_Linear_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_types_hh)
diff --git a/src/Linear_Row.cc b/src/Linear_Row.cc
new file mode 100644
index 0000000..7d77920
--- /dev/null
+++ b/src/Linear_Row.cc
@@ -0,0 +1,209 @@
+/* Linear_Row class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Linear_Row.defs.hh"
+#include "Coefficient.defs.hh"
+#include <algorithm>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Linear_Row::sign_normalize() {
+  if (is_line_or_equality()) {
+    Linear_Row& x = *this;
+    const dimension_type sz = x.size();
+    // `first_non_zero' indicates the index of the first
+    // coefficient of the row different from zero, disregarding
+    // the very first coefficient (inhomogeneous term / divisor).
+    dimension_type first_non_zero;
+    for (first_non_zero = 1; first_non_zero < sz; ++first_non_zero)
+      if (x[first_non_zero] != 0)
+	break;
+    if (first_non_zero < sz)
+      // If the first non-zero coefficient of the row is negative,
+      // we negate the entire row.
+      if (x[first_non_zero] < 0) {
+	for (dimension_type j = first_non_zero; j < sz; ++j)
+	  neg_assign(x[j]);
+	// Also negate the first coefficient.
+	neg_assign(x[0]);
+      }
+  }
+}
+
+bool
+PPL::Linear_Row::check_strong_normalized() const {
+  Linear_Row tmp = *this;
+  tmp.strong_normalize();
+  return compare(*this, tmp) == 0;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+int
+PPL::compare(const Linear_Row& x, const Linear_Row& y) {
+  const bool x_is_line_or_equality = x.is_line_or_equality();
+  const bool y_is_line_or_equality = y.is_line_or_equality();
+  if (x_is_line_or_equality != y_is_line_or_equality)
+    // Equalities (lines) precede inequalities (ray/point).
+    return y_is_line_or_equality ? 2 : -2;
+
+  // Compare all the coefficients of the row starting from position 1.
+  const dimension_type xsz = x.size();
+  const dimension_type ysz = y.size();
+  const dimension_type min_sz = std::min(xsz, ysz);
+  dimension_type i;
+  for (i = 1; i < min_sz; ++i)
+    if (const int comp = cmp(x[i], y[i]))
+      // There is at least a different coefficient.
+      return (comp > 0) ? 2 : -2;
+
+  // Handle the case where `x' and `y' are of different size.
+  if (xsz != ysz) {
+    for( ; i < xsz; ++i)
+      if (const int sign = sgn(x[i]))
+	return (sign > 0) ? 2 : -2;
+    for( ; i < ysz; ++i)
+      if (const int sign = sgn(y[i]))
+	return (sign < 0) ? 2 : -2;
+  }
+
+  // If all the coefficients in `x' equal all the coefficients in `y'
+  // (starting from position 1) we compare coefficients in position 0,
+  // i.e., inhomogeneous terms.
+  if (const int comp = cmp(x[0], y[0]))
+    return (comp > 0) ? 1 : -1;
+
+  // `x' and `y' are equal.
+  return 0;
+}
+
+void
+PPL::Linear_Row::linear_combine(const Linear_Row& y, const dimension_type k) {
+  Linear_Row& x = *this;
+  // We can combine only vector of the same dimension.
+  assert(x.size() == y.size());
+  assert(y[k] != 0 && x[k] != 0);
+  // Let g be the GCD between `x[k]' and `y[k]'.
+  // For each i the following computes
+  //   x[i] = x[i]*y[k]/g - y[i]*x[k]/g.
+  TEMP_INTEGER(normalized_x_k);
+  TEMP_INTEGER(normalized_y_k);
+  normalize2(x[k], y[k], normalized_x_k, normalized_y_k);
+  for (dimension_type i = size(); i-- > 0; )
+    if (i != k) {
+      Coefficient& x_i = x[i];
+      x_i *= normalized_y_k;
+      sub_mul_assign(x_i, y[i], normalized_x_k);
+    }
+  x[k] = 0;
+  x.strong_normalize();
+}
+
+bool
+PPL::Linear_Row::all_homogeneous_terms_are_zero() const {
+  const Linear_Row& x = *this;
+  for (dimension_type i = x.size(); --i > 0; )
+    if (x[i] != 0)
+      return false;
+  return true;
+}
+
+namespace {
+
+// These are the keywords that indicate the individual assertions.
+const char* rpi_valid = "RPI_V";
+const char* is_rpi = "RPI";
+const char* nnc_valid = "NNC_V";
+const char* is_nnc = "NNC";
+const char* bit_names[] = {rpi_valid, is_rpi, nnc_valid, is_nnc};
+
+} // namespace
+
+void
+PPL::Linear_Row::Flags::ascii_dump(std::ostream& s) const {
+  s << (test_bits(1 << Flags::rpi_validity_bit) ? '+' : '-')
+    << rpi_valid << ' '
+    << (test_bits(1 << Flags::rpi_bit) ? '+' : '-')
+    << is_rpi << ' '
+    << ' '
+    << (test_bits(1 << Flags::nnc_validity_bit) ? '+' : '-')
+    << nnc_valid << ' '
+    << (test_bits(1 << Flags::nnc_bit) ? '+' : '-')
+    << is_nnc;
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_Row::Flags);
+
+bool
+PPL::Linear_Row::Flags::ascii_load(std::istream& s) {
+  std::string str;
+  // Assume that the bits are used in sequence.
+  reset_bits(std::numeric_limits<base_type>::max());
+  for (unsigned int bit = 0;
+       bit < (sizeof(bit_names) / sizeof(char*));
+       ++bit) {
+    if (!(s >> str))
+      return false;
+    if (str[0] == '+')
+      set_bits(1 << Row::Flags::first_free_bit + bit);
+    else if (str[0] != '-')
+      return false;
+    if (str.compare(1, strlen(bit_names[bit]), bit_names[bit]) != 0)
+      return false;
+  }
+  return true;
+}
+
+void
+PPL::Linear_Row::ascii_dump(std::ostream& s) const {
+  const Row& x = *this;
+  dimension_type x_size = x.size();
+  for (dimension_type i = 0; i < x_size; ++i)
+    s << x[i] << ' ';
+  s << "f ";
+  flags().ascii_dump(s);
+  s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_Row);
+
+bool
+PPL::Linear_Row::ascii_load(std::istream& s) {
+  Row& x = *this;
+  std::string str;
+  const dimension_type x_size = x.size();
+  for (dimension_type col = 0; col < x_size; ++col)
+    if (!(s >> x[col]))
+      return false;
+  if (!(s >> str) || (str.compare("f") != 0))
+    return false;
+  return flags().ascii_load(s);
+}
+
+bool
+PPL::Linear_Row::OK(const dimension_type row_size,
+		    const dimension_type row_capacity) const {
+  return Row::OK(row_size, row_capacity);
+}
diff --git a/src/Linear_Row.defs.hh b/src/Linear_Row.defs.hh
new file mode 100644
index 0000000..8088795
--- /dev/null
+++ b/src/Linear_Row.defs.hh
@@ -0,0 +1,458 @@
+/* Linear_Row class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Linear_Row_defs_hh
+#define PPL_Linear_Row_defs_hh 1
+
+#include "Linear_Row.types.hh"
+#include "globals.defs.hh"
+#include "Row.defs.hh"
+#include "Topology.hh"
+#include "Linear_Expression.types.hh"
+#include "Constraint.types.hh"
+#include "Generator.types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for linear expressions, constraints and generators.
+/*! \ingroup PPL_CXX_interface
+  The class Linear_Row allows us to build objects of the form
+  \f$[b, a_0, \ldots, a_{d-1}]_{(t, k)}\f$,
+  i.e., a finite sequence of coefficients subscripted by a pair of flags,
+  which are both stored in a Linear_Row::Flags object.
+  The flag \f$t \in \{ \mathrm{c}, \mathrm{nnc} \}\f$ represents
+  the <EM>topology</EM> and
+  the flag \f$k \in \{\mathord{=}, \mathord{\geq} \}\f$ represents
+  the <EM>kind</EM> of the Linear_Row object.
+  Note that, even though all the four possible combinations of topology
+  and kind values will result in a legal Linear_Row::Flags object, some
+  of these pose additional constraints on the values of the Linear_Row's
+  coefficients.
+
+  When \f$t = c\f$, we have the following cases
+  (\f$d\f$ is the dimension of the vector space):
+    - \f$[b, a_0, \ldots, a_{d-1}]_{(c,=)}\f$
+      represents the equality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$
+      represents the non-strict inequality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$.
+    - \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$
+      represents the line of direction
+      \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+    - \f$[0, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$
+      represents the ray of direction
+      \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$, with \f$b > 0\f$,
+      represents the point
+      \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+
+  When \f$t = \mathrm{nnc}\f$, the last coefficient of the Linear_Row is
+  associated to the slack variable \f$\epsilon\f$, so that we have the
+  following cases (\f$d\f$ is again the dimension of the vector space,
+  but this time we have \f$d+2\f$ coefficients):
+    - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$
+      represents the equality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$
+      represents the non-strict inequality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$,
+      with \f$e < 0\f$, represents the strict inequality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b > 0\f$.
+    - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$
+      represents the line of direction
+      \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+    - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$
+      represents the ray of direction
+      \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$,
+      with \f$b > 0\f$ and \f$e > 0\f$, represents the point
+      \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$,
+      with \f$b > 0\f$, represents the closure point
+      \f$\vect{c} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+
+  So, a Linear_Row can be both a constraint and a generator: it can be an
+  equality, a strict or non-strict inequality, a line, a ray, a point
+  or a closure point.
+
+  The inhomogeneous term of a constraint can be zero or different from zero.
+
+  Points and closure points must have a positive inhomogeneous term
+  (which is used as a common divisor for all the other coefficients),
+  lines and rays must have the inhomogeneous term equal to zero.
+  If needed, the coefficients of points and closure points are negated
+  at creation time so that they satisfy this invariant.
+  The invariant is maintained because, when combining a point or closure
+  point with another generator, we only consider positive combinations.
+
+  The \f$\epsilon\f$ coefficient, when present, is negative for strict
+  inequality constraints, positive for points and equal to zero in all
+  the other cases.
+  Note that the above description corresponds to the end-user, high-level
+  view of a Linear_Row object. In the implementation, to allow for code reuse,
+  it is sometimes useful to regard an \f$\mathrm{nnc}\f$-object on
+  the vector space \f$\Rset^d\f$ as if it was a \f$\mathrm{c}\f$-object
+  on the vector space \f$\Rset^{d+1}\f$, therefore interpreting the slack
+  variable \f$\epsilon\f$ as an ordinary dimension of the vector space.
+
+  A Linear_Row object implementing a Linear_Expression is always of the form
+  \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$, which represents the
+  linear expression \f$\sum_{i=0}^{d-1} a_i x_i\f$.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Linear_Row : public Row {
+public:
+  //! The possible kinds of Linear_Row objects.
+  enum Kind {
+    LINE_OR_EQUALITY = 0,
+    RAY_OR_POINT_OR_INEQUALITY = 1
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    The type of the object to which the coefficients refer to,
+    encoding both topology and kind.
+
+    \ingroup PPL_CXX_interface
+    This combines the information about the topology (necessarily closed
+    or not) and the kind (line/equality or ray/point/inequality)
+    of a Linear_Row object.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  class Flags : public Row::Flags {
+  public:
+    //! Default constructor: builds an object where all flags are invalid.
+    Flags();
+
+    //! Builds an object corresponding to the topology \p t.
+    explicit Flags(Topology t);
+
+    //! Builds an object corresponding to the topology \p t and kind \p k.
+    Flags(Topology t, Kind k);
+
+    //! \name Testing and setting the type
+    //@{
+    Topology topology() const;
+    bool is_necessarily_closed() const;
+    bool is_not_necessarily_closed() const;
+    bool is_line_or_equality() const;
+    bool is_ray_or_point_or_inequality() const;
+
+    void set_necessarily_closed();
+    void set_not_necessarily_closed();
+    void set_is_line_or_equality();
+    void set_is_ray_or_point_or_inequality();
+    //@} // Testing and setting the type
+
+    //! Returns <CODE>true</CODE> if and only if \p *this and \p y are equal.
+    bool operator==(const Flags& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y
+      are different.
+    */
+    bool operator!=(const Flags& y) const;
+
+    PPL_OUTPUT_DECLARATIONS;
+
+    //! Uses the ASCII Flags representation from \p s to recreate *this.
+    /*!
+      Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+      otherwise.  The ASCII representation is as output by \ref ascii_dump.
+    */
+    bool ascii_load(std::istream& s);
+
+  private:
+    //! Builds the type from a bit-mask.
+    explicit Flags(base_type mask);
+
+    //! \name The bits that are currently in use
+    //@{
+    // NB: ascii_load assumes that these are sequential.
+    static const unsigned rpi_validity_bit
+    = Row::Flags::first_free_bit + 0;
+    static const unsigned rpi_bit
+    = Row::Flags::first_free_bit + 1;
+    static const unsigned nnc_validity_bit
+    = Row::Flags::first_free_bit + 2;
+    static const unsigned nnc_bit
+    = Row::Flags::first_free_bit + 3;
+    //@}
+
+  protected:
+    //! Index of the first bit derived classes can use.
+    static const unsigned first_free_bit
+    = Row::Flags::first_free_bit + 4;
+
+    friend class Parma_Polyhedra_Library::Linear_Row;
+  };
+
+  //! Pre-constructs a row: construction must be completed by construct().
+  Linear_Row();
+
+  //! \name Post-constructors
+  //@{
+  //! Constructs properly a default-constructed element.
+  /*!
+    Builds a row with type \p t, size \p sz and minimum capacity.
+  */
+  void construct(dimension_type sz, Flags f);
+
+  //! Constructs properly a default-constructed element.
+  /*!
+    \param sz
+    The size of the row that will be constructed;
+
+    \param capacity
+    The minimum capacity of the row that will be constructed.
+
+    \param f
+    Flags for the row that will be constructed.
+
+    The row that we are constructing has a minimum capacity, i.e., it
+    can contain at least \p capacity elements, \p sz of which will be
+    default-constructed now. The row flags are set to \p f.
+  */
+  void construct(dimension_type sz, dimension_type capacity, Flags f);
+  //@} // Post-constructors
+
+  //! Tight constructor: resizing will require reallocation.
+  Linear_Row(dimension_type sz, Flags f);
+
+  //! Sizing constructor with capacity.
+  Linear_Row(dimension_type sz, dimension_type capacity, Flags f);
+
+  //! Ordinary copy constructor.
+  Linear_Row(const Linear_Row& y);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to \p y size.
+  */
+  Linear_Row(const Linear_Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is greater than or equal to the size of \p y
+    and, of course, that \p sz is less than or equal to \p capacity.
+  */
+  Linear_Row(const Linear_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Destructor.
+  ~Linear_Row();
+
+  //! \name Flags inspection methods
+  //@{
+  //! Returns a const reference to the flags of \p *this.
+  const Flags& flags() const;
+
+  //! Returns a non-const reference to the flags of \p *this.
+  Flags& flags();
+
+  //! Returns the topological kind of \p *this.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is not necessarily closed.
+  */
+  bool is_not_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a line or an equality.
+  */
+  bool is_line_or_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a ray, a point or an inequality.
+  */
+  bool is_ray_or_point_or_inequality() const;
+  //@} // Flags inspection methods
+
+  //! \name Flags coercion methods
+  //@{
+  //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_necessarily_closed();
+
+  //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_not_necessarily_closed();
+
+  //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+  void set_is_line_or_equality();
+
+  //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+  void set_is_ray_or_point_or_inequality();
+  //@} // Flags coercion methods
+
+  //! Returns the maximum space dimension a Linear_Row can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the inhomogeneous term.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns the coefficient \f$a_n\f$.
+  Coefficient_traits::const_reference coefficient(dimension_type n) const;
+
+  /*! \brief
+    Normalizes the sign of the coefficients so that the first non-zero
+    (homogeneous) coefficient of a line-or-equality is positive.
+  */
+  void sign_normalize();
+
+  /*! \brief
+    Strong normalization: ensures that different Linear_Row objects
+    represent different hyperplanes or hyperspaces.
+
+    Applies both Linear_Row::normalize() and Linear_Row::sign_normalize().
+  */
+  void strong_normalize();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the coefficients are
+    strongly normalized.
+  */
+  bool check_strong_normalized() const;
+
+  //! Linearly combines \p *this with \p y so that <CODE>*this[k]</CODE> is 0.
+  /*!
+    \param y
+    The Linear_Row that will be combined with \p *this object;
+
+    \param k
+    The position of \p *this that have to be \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the element of index \p k equal to \f$0\f$. Then it assigns
+    the resulting Linear_Row to \p *this and normalizes it.
+  */
+  void linear_combine(const Linear_Row& y, dimension_type k);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are \f$0\f$.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  //! Uses the ASCII Linear_Row representation from \p s to recreate *this.
+  /*!
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+    otherwise.  The ASCII representation is as output by \ref ascii_dump.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+  friend class Parma_Polyhedra_Library::Linear_Expression;
+  friend class Parma_Polyhedra_Library::Constraint;
+  friend class Parma_Polyhedra_Library::Generator;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Linear_Row */
+bool operator==(const Linear_Row& x, const Linear_Row& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_Row */
+bool operator!=(const Linear_Row& x, const Linear_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Linear_Row
+  \return
+  The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+  \param x
+  A row of coefficients;
+
+  \param y
+  Another row.
+
+  Compares \p x and \p y, where \p x and \p y may be of different size,
+  in which case the "missing" coefficients are assumed to be zero.
+  The comparison is such that:
+  -# equalities are smaller than inequalities;
+  -# lines are smaller than points and rays;
+  -# the ordering is lexicographic;
+  -# the positions compared are, in decreasing order of significance,
+     1, 2, ..., \p size(), 0;
+  -# the result is negative, zero, or positive if x is smaller than,
+     equal to, or greater than y, respectively;
+  -# when \p x and \p y are different, the absolute value of the
+     result is 1 if the difference is due to the coefficient in
+     position 0; it is 2 otherwise.
+
+  When \p x and \p y represent the hyper-planes associated
+  to two equality or inequality constraints, the coefficient
+  at 0 is the known term.
+  In this case, the return value can be characterized as follows:
+  - -2, if \p x is smaller than \p y and they are \e not parallel;
+  - -1, if \p x is smaller than \p y and they \e are parallel;
+  -  0, if \p x and y are equal;
+  - +1, if \p y is smaller than \p x and they \e are parallel;
+  - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+int compare(const Linear_Row& x, const Linear_Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Linear_Row& x,
+	  Parma_Polyhedra_Library::Linear_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
+	       std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y);
+
+} // namespace std
+
+#include "Linear_Row.inlines.hh"
+
+#endif // !defined(PPL_Linear_Row_defs_hh)
diff --git a/src/Linear_Row.inlines.hh b/src/Linear_Row.inlines.hh
new file mode 100644
index 0000000..9444163
--- /dev/null
+++ b/src/Linear_Row.inlines.hh
@@ -0,0 +1,290 @@
+/* Linear_Row class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Linear_Row_inlines_hh
+#define PPL_Linear_Row_inlines_hh 1
+
+#include "globals.defs.hh"
+#include <cassert>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Linear_Row::Flags::Flags()
+  : Row::Flags() {
+  // Note that the constructed type has its validity bit unset.
+}
+
+inline
+Linear_Row::Flags::Flags(const Topology t)
+  : Row::Flags(t << nnc_bit) {
+#ifndef NDEBUG
+  set_bits(1 << nnc_validity_bit);
+#endif
+}
+
+inline
+Linear_Row::Flags::Flags(const Topology t, const Kind k)
+  : Row::Flags((k << rpi_bit) | (t << nnc_bit)) {
+#ifndef NDEBUG
+  set_bits((1 << rpi_validity_bit)
+	   | (1 << nnc_validity_bit));
+#endif
+}
+
+inline bool
+Linear_Row::Flags::is_ray_or_point_or_inequality() const {
+  assert(test_bits(1 << rpi_validity_bit));
+  return test_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline void
+Linear_Row::Flags::set_is_ray_or_point_or_inequality() {
+#ifndef NDEBUG
+  set_bits(1 << rpi_validity_bit);
+#endif
+  set_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_line_or_equality() const {
+  assert(test_bits(1 << rpi_validity_bit));
+  return !is_ray_or_point_or_inequality();
+}
+
+inline void
+Linear_Row::Flags::set_is_line_or_equality() {
+#ifndef NDEBUG
+  set_bits(1 << rpi_validity_bit);
+#endif
+  reset_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_not_necessarily_closed() const {
+  assert(test_bits(1 << nnc_validity_bit));
+  return test_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_necessarily_closed() const {
+  assert(test_bits(1 << nnc_validity_bit));
+  return !is_not_necessarily_closed();
+}
+
+inline void
+Linear_Row::Flags::set_not_necessarily_closed() {
+#ifndef NDEBUG
+  set_bits(1 << nnc_validity_bit);
+#endif
+  set_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline void
+Linear_Row::Flags::set_necessarily_closed() {
+#ifndef NDEBUG
+  set_bits(1 << nnc_validity_bit);
+#endif
+  reset_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline Topology
+Linear_Row::Flags::topology() const {
+  return is_necessarily_closed() ? NECESSARILY_CLOSED : NOT_NECESSARILY_CLOSED;
+}
+
+inline bool
+Linear_Row::Flags::operator==(const Flags& y) const {
+  base_type mask = low_bits_mask<base_type>(first_free_bit);
+  return (get_bits() & mask) == (y.get_bits() & mask);
+}
+
+inline bool
+Linear_Row::Flags::operator!=(const Flags& y) const {
+  return !operator==(y);
+}
+
+inline const Linear_Row::Flags&
+Linear_Row::flags() const {
+  return static_cast<const Flags&>(Row::flags());
+}
+
+inline Linear_Row::Flags&
+Linear_Row::flags() {
+  return static_cast<Flags&>(Row::flags());
+}
+
+inline bool
+Linear_Row::is_necessarily_closed() const {
+  return flags().is_necessarily_closed();
+}
+
+inline dimension_type
+Linear_Row::max_space_dimension() {
+  // The first coefficient holds the inhomogeneous term or the divisor.
+  // In NNC rows, the last coefficient is for the epsilon dimension.
+  return max_size() - 2;
+}
+
+inline dimension_type
+Linear_Row::space_dimension() const {
+  const dimension_type sz = size();
+  return (sz == 0)
+    ? 0
+    : sz - (is_necessarily_closed() ? 1 : 2);
+}
+
+inline
+Linear_Row::Linear_Row()
+  : Row() {
+}
+
+inline void
+Linear_Row::construct(const dimension_type sz, const dimension_type capacity,
+		      const Flags f) {
+  Row::construct(sz, capacity, f);
+}
+
+inline
+Linear_Row::Linear_Row(const dimension_type sz, const dimension_type capacity,
+		       const Flags f) {
+  construct(sz, capacity, f);
+}
+
+inline void
+Linear_Row::construct(const dimension_type sz, const Flags f) {
+  construct(sz, sz, f);
+}
+
+inline
+Linear_Row::Linear_Row(const dimension_type sz, const Flags f) {
+  construct(sz, f);
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y)
+  : Row(y) {
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y,
+		       const dimension_type capacity)
+  : Row(y, capacity) {
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y,
+		       const dimension_type sz, const dimension_type capacity)
+  : Row(y, sz, capacity) {
+}
+
+inline
+Linear_Row::~Linear_Row() {
+}
+
+inline bool
+Linear_Row::is_line_or_equality() const {
+  return flags().is_line_or_equality();
+}
+
+inline bool
+Linear_Row::is_ray_or_point_or_inequality() const {
+  return flags().is_ray_or_point_or_inequality();
+}
+
+inline Topology
+Linear_Row::topology() const {
+  return flags().topology();
+}
+
+inline void
+Linear_Row::set_is_line_or_equality() {
+  flags().set_is_line_or_equality();
+}
+
+inline void
+Linear_Row::set_is_ray_or_point_or_inequality() {
+  flags().set_is_ray_or_point_or_inequality();
+}
+
+inline void
+Linear_Row::set_necessarily_closed() {
+  flags().set_necessarily_closed();
+}
+
+inline void
+Linear_Row::set_not_necessarily_closed() {
+  flags().set_not_necessarily_closed();
+}
+
+inline Coefficient_traits::const_reference
+Linear_Row::inhomogeneous_term() const {
+  return (*this)[0];
+}
+
+inline Coefficient_traits::const_reference
+Linear_Row::coefficient(const dimension_type k) const {
+  return (*this)[k+1];
+}
+
+inline void
+Linear_Row::strong_normalize() {
+  normalize();
+  sign_normalize();
+}
+
+/*! \relates Linear_Row */
+inline bool
+operator==(const Linear_Row& x, const Linear_Row& y) {
+  return x.flags() == y.flags()
+    && static_cast<const Row&>(x) == static_cast<const Row&>(y);
+}
+
+/*! \relates Linear_Row */
+inline bool
+operator!=(const Linear_Row& x, const Linear_Row& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+inline void
+swap(Parma_Polyhedra_Library::Linear_Row& x,
+     Parma_Polyhedra_Library::Linear_Row& y) {
+  x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Linear_Row_inlines_hh)
diff --git a/src/Linear_Row.types.hh b/src/Linear_Row.types.hh
new file mode 100644
index 0000000..618a4cd
--- /dev/null
+++ b/src/Linear_Row.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_Row_types_hh
+#define PPL_Linear_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Row_types_hh)
diff --git a/src/Linear_System.cc b/src/Linear_System.cc
new file mode 100644
index 0000000..e65fc2b
--- /dev/null
+++ b/src/Linear_System.cc
@@ -0,0 +1,916 @@
+/* Linear_System class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Linear_System.defs.hh"
+#include "Coefficient.defs.hh"
+#include "Row.defs.hh"
+#include "Saturation_Matrix.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <algorithm>
+#include <iostream>
+#include <string>
+#include <deque>
+
+#include "swapping_sort.icc"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::dimension_type
+PPL::Linear_System::num_lines_or_equalities() const {
+  assert(num_pending_rows() == 0);
+  const Linear_System& x = *this;
+  dimension_type n = 0;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    if (x[i].is_line_or_equality())
+      ++n;
+  return n;
+}
+
+void
+PPL::Linear_System::merge_rows_assign(const Linear_System& y) {
+  assert(row_size >= y.row_size);
+  // Both systems have to be sorted and have no pending rows.
+  assert(check_sorted() && y.check_sorted());
+  assert(num_pending_rows() == 0 && y.num_pending_rows() == 0);
+
+  Linear_System& x = *this;
+
+  // A temporary vector of rows...
+  std::vector<Row> tmp;
+  // ... with enough capacity not to require any reallocations.
+  tmp.reserve(compute_capacity(x.num_rows() + y.num_rows(), max_num_rows()));
+
+  dimension_type xi = 0;
+  dimension_type x_num_rows = x.num_rows();
+  dimension_type yi = 0;
+  dimension_type y_num_rows = y.num_rows();
+
+  while (xi < x_num_rows && yi < y_num_rows) {
+    const int comp = compare(x[xi], y[yi]);
+    if (comp <= 0) {
+      // Elements that can be taken from `x' are actually _stolen_ from `x'
+      std::swap(x[xi++], *tmp.insert(tmp.end(), Linear_Row()));
+      if (comp == 0)
+	// A duplicate element.
+	++yi;
+    }
+    else {
+      // (comp > 0)
+      Linear_Row copy(y[yi++], row_size, row_capacity);
+      std::swap(copy, *tmp.insert(tmp.end(), Linear_Row()));
+    }
+  }
+  // Insert what is left.
+  if (xi < x_num_rows)
+    while (xi < x_num_rows)
+      std::swap(x[xi++], *tmp.insert(tmp.end(), Linear_Row()));
+  else
+    while (yi < y_num_rows) {
+      Linear_Row copy(y[yi++], row_size, row_capacity);
+      std::swap(copy, *tmp.insert(tmp.end(), Linear_Row()));
+    }
+
+  // We get the result vector and let the old one be destroyed.
+  std::swap(tmp, rows);
+  // There are no pending rows.
+  unset_pending_rows();
+  assert(check_sorted());
+}
+
+void
+PPL::Linear_System::set_rows_topology() {
+  Linear_System& x = *this;
+  if (is_necessarily_closed())
+    for (dimension_type i = num_rows(); i-- > 0; )
+      x[i].set_necessarily_closed();
+  else
+    for (dimension_type i = num_rows(); i-- > 0; )
+      x[i].set_not_necessarily_closed();
+}
+
+void
+PPL::Linear_System::ascii_dump(std::ostream& s) const {
+  // Prints the topology, the number of rows, the number of columns
+  // and the sorted flag.  The specialized methods provided by
+  // Constraint_System and Generator_System take care of properly
+  // printing the contents of the system.
+  const Linear_System& x = *this;
+  dimension_type x_num_rows = x.num_rows();
+  dimension_type x_num_columns = x.num_columns();
+  s << "topology " << (is_necessarily_closed()
+		       ? "NECESSARILY_CLOSED"
+		       : "NOT_NECESSARILY_CLOSED")
+    << "\n"
+    << x_num_rows << " x " << x_num_columns
+    << (x.sorted ? "(sorted)" : "(not_sorted)")
+    << "\n"
+    << "index_first_pending " << x.first_pending_row()
+    << "\n";
+  for (dimension_type i = 0; i < x_num_rows; ++i)
+    x[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_System);
+
+bool
+PPL::Linear_System::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str) || str != "topology")
+    return false;
+  if (!(s >> str))
+    return false;
+  if (str == "NECESSARILY_CLOSED")
+    set_necessarily_closed();
+  else {
+    if (str != "NOT_NECESSARILY_CLOSED")
+      return false;
+    set_not_necessarily_closed();
+  }
+
+  dimension_type nrows;
+  dimension_type ncols;
+  if (!(s >> nrows))
+    return false;
+  if (!(s >> str))
+    return false;
+  if (!(s >> ncols))
+    return false;
+  resize_no_copy(nrows, ncols);
+
+  if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
+    return false;
+  set_sorted(str == "(sorted)");
+  dimension_type index;
+  if (!(s >> str) || str != "index_first_pending")
+    return false;
+  if (!(s >> index))
+    return false;
+  set_index_first_pending_row(index);
+
+  Linear_System& x = *this;
+  for (dimension_type row = 0; row < nrows; ++row)
+    if (!x[row].ascii_load(s))
+      return false;
+
+  // Check for well-formedness.
+  assert(OK(true));
+  return true;
+}
+
+void
+PPL::Linear_System::insert(const Linear_Row& r) {
+  // The added row must be strongly normalized and have the same
+  // topology of the system.
+  assert(r.check_strong_normalized());
+  assert(topology() == r.topology());
+  // This method is only used when the system has no pending rows.
+  assert(num_pending_rows() == 0);
+
+  const dimension_type old_num_rows = num_rows();
+  const dimension_type old_num_columns = num_columns();
+  const dimension_type r_size = r.size();
+
+  // Resize the system, if necessary.
+  if (r_size > old_num_columns) {
+    add_zero_columns(r_size - old_num_columns);
+    if (!is_necessarily_closed() && old_num_rows != 0)
+      // Move the epsilon coefficients to the last column
+      // (note: sorting is preserved).
+      swap_columns(old_num_columns - 1, r_size - 1);
+    add_row(r);
+  }
+  else if (r_size < old_num_columns)
+    if (is_necessarily_closed() || old_num_rows == 0)
+      add_row(Linear_Row(r, old_num_columns, row_capacity));
+    else {
+      // Create a resized copy of the row (and move the epsilon
+      // coefficient to its last position).
+      Linear_Row tmp_row(r, old_num_columns, row_capacity);
+      std::swap(tmp_row[r_size - 1], tmp_row[old_num_columns - 1]);
+      add_row(tmp_row);
+    }
+  else
+    // Here r_size == old_num_columns.
+    add_row(r);
+
+  // The added row was not a pending row.
+  assert(num_pending_rows() == 0);
+  // Do not check for strong normalization,
+  // because no modification of rows has occurred.
+  assert(OK(false));
+}
+
+void
+PPL::Linear_System::insert_pending(const Linear_Row& r) {
+  // The added row must be strongly normalized and have the same
+  // topology of the system.
+  assert(r.check_strong_normalized());
+  assert(topology() == r.topology());
+
+  const dimension_type old_num_rows = num_rows();
+  const dimension_type old_num_columns = num_columns();
+  const dimension_type r_size = r.size();
+
+  // Resize the system, if necessary.
+  if (r_size > old_num_columns) {
+    add_zero_columns(r_size - old_num_columns);
+    if (!is_necessarily_closed() && old_num_rows != 0)
+      // Move the epsilon coefficients to the last column
+      // (note: sorting is preserved).
+      swap_columns(old_num_columns - 1, r_size - 1);
+    add_pending_row(r);
+  }
+  else if (r_size < old_num_columns)
+    if (is_necessarily_closed() || old_num_rows == 0)
+      add_pending_row(Linear_Row(r, old_num_columns, row_capacity));
+    else {
+      // Create a resized copy of the row (and move the epsilon
+      // coefficient to its last position).
+      Linear_Row tmp_row(r, old_num_columns, row_capacity);
+      std::swap(tmp_row[r_size - 1], tmp_row[old_num_columns - 1]);
+      add_pending_row(tmp_row);
+    }
+  else
+    // Here r_size == old_num_columns.
+    add_pending_row(r);
+
+  // The added row was a pending row.
+  assert(num_pending_rows() > 0);
+  // Do not check for strong normalization,
+  // because no modification of rows has occurred.
+  assert(OK(false));
+}
+
+void
+PPL::Linear_System::add_pending_rows(const Linear_System& y) {
+  Linear_System& x = *this;
+  assert(x.row_size == y.row_size);
+
+  const dimension_type x_n_rows = x.num_rows();
+  const dimension_type y_n_rows = y.num_rows();
+  // Grow to the required size without changing sortedness.
+  const bool was_sorted = sorted;
+  add_zero_rows(y_n_rows, Linear_Row::Flags(row_topology));
+  sorted = was_sorted;
+
+  // Copy the rows of `y', forcing size and capacity.
+  for (dimension_type i = y_n_rows; i-- > 0; ) {
+    Row copy(y[i], x.row_size, x.row_capacity);
+    std::swap(copy, x[x_n_rows+i]);
+  }
+  // Do not check for strong normalization,
+  // because no modification of rows has occurred.
+  assert(OK(false));
+}
+
+void
+PPL::Linear_System::add_rows(const Linear_System& y) {
+  assert(num_pending_rows() == 0);
+
+  // Adding no rows is a no-op.
+  if (y.num_rows() == 0)
+    return;
+
+  // Check if sortedness is preserved.
+  if (is_sorted())
+    if (!y.is_sorted() || y.num_pending_rows() > 0)
+      set_sorted(false);
+    else {
+      // `y' is sorted and has no pending rows.
+      const dimension_type n_rows = num_rows();
+      if (n_rows > 0)
+	set_sorted(compare((*this)[n_rows-1], y[0]) <= 0);
+    }
+
+  // Add the rows of `y' as if they were pending.
+  add_pending_rows(y);
+  // There are no pending_rows.
+  unset_pending_rows();
+
+  // Do not check for strong normalization,
+  // because no modification of rows has occurred.
+  assert(OK(false));
+}
+
+void
+PPL::Linear_System::sort_rows() {
+  const dimension_type num_pending = num_pending_rows();
+  // We sort the non-pending rows only.
+  sort_rows(0, first_pending_row());
+  set_index_first_pending_row(num_rows() - num_pending);
+  sorted = true;
+  // Do not check for strong normalization,
+  // because no modification of rows has occurred.
+  assert(OK(false));
+}
+
+void
+PPL::Linear_System::sort_rows(const dimension_type first_row,
+			      const dimension_type last_row) {
+  assert(first_row <= last_row && last_row <= num_rows());
+  // We cannot mix pending and non-pending rows.
+  assert(first_row >= first_pending_row() || last_row <= first_pending_row());
+
+  // First sort without removing duplicates.
+  std::vector<Row>::iterator first = rows.begin() + first_row;
+  std::vector<Row>::iterator last = rows.begin() + last_row;
+  swapping_sort(first, last, Row_Less_Than());
+  // Second, move duplicates to the end.
+  std::vector<Row>::iterator new_last = swapping_unique(first, last);
+  // Finally, remove duplicates.
+  rows.erase(new_last, last);
+  // NOTE: we cannot check for well-formedness of the system here,
+  // because the caller still has to update `index_first_pending'.
+}
+
+void
+PPL::Linear_System::add_row(const Linear_Row& r) {
+  // The added row must be strongly normalized and have the same
+  // number of elements as the existing rows of the system.
+  assert(r.check_strong_normalized());
+  assert(r.size() == row_size);
+  // This method is only used when the system has no pending rows.
+  assert(num_pending_rows() == 0);
+
+  const bool was_sorted = is_sorted();
+
+  Matrix::add_row(r);
+
+  //  We update `index_first_pending', because it must be equal to
+  // `num_rows()'.
+  set_index_first_pending_row(num_rows());
+
+  if (was_sorted) {
+    const dimension_type nrows = num_rows();
+    // The added row may have caused the system to be not sorted anymore.
+    if (nrows > 1) {
+      // If the system is not empty and the inserted row is the
+      // greatest one, the system is set to be sorted.
+      // If it is not the greatest one then the system is no longer sorted.
+      Linear_System& x = *this;
+      set_sorted(compare(x[nrows-2], x[nrows-1]) <= 0);
+    }
+    else
+      // A system having only one row is sorted.
+      set_sorted(true);
+  }
+  // The added row was not a pending row.
+  assert(num_pending_rows() == 0);
+  // Do not check for strong normalization, because no modification of
+  // rows has occurred.
+  assert(OK(false));
+}
+
+void
+PPL::Linear_System::add_pending_row(const Linear_Row& r) {
+  // The added row must be strongly normalized and have the same
+  // number of elements of the existing rows of the system.
+  assert(r.check_strong_normalized());
+  assert(r.size() == row_size);
+
+  const dimension_type new_rows_size = rows.size() + 1;
+  if (rows.capacity() < new_rows_size) {
+    // Reallocation will take place.
+    std::vector<Row> new_rows;
+    new_rows.reserve(compute_capacity(new_rows_size, max_num_rows()));
+    new_rows.insert(new_rows.end(), new_rows_size, Row());
+    // Put the new row in place.
+    Row new_row(r, row_capacity);
+    dimension_type i = new_rows_size-1;
+    std::swap(new_rows[i], new_row);
+    // Steal the old rows.
+    while (i-- > 0)
+      new_rows[i].swap(rows[i]);
+    // Put the new rows into place.
+    std::swap(rows, new_rows);
+  }
+  else {
+    // Reallocation will NOT take place.
+    // Inserts a new empty row at the end, then substitutes it with a
+    // copy of the given row.
+    Row tmp(r, row_capacity);
+    std::swap(*rows.insert(rows.end(), Row()), tmp);
+  }
+
+  // The added row was a pending row.
+  assert(num_pending_rows() > 0);
+  // Do not check for strong normalization, because no modification of
+  // rows has occurred.
+  assert(OK(false));
+}
+
+void
+PPL::Linear_System::add_pending_row(const Linear_Row::Flags flags) {
+  const dimension_type new_rows_size = rows.size() + 1;
+  if (rows.capacity() < new_rows_size) {
+    // Reallocation will take place.
+    std::vector<Row> new_rows;
+    new_rows.reserve(compute_capacity(new_rows_size, max_num_rows()));
+    new_rows.insert(new_rows.end(), new_rows_size, Row());
+    // Put the new row in place.
+    Linear_Row new_row(row_size, row_capacity, flags);
+    dimension_type i = new_rows_size-1;
+    std::swap(new_rows[i], new_row);
+    // Steal the old rows.
+    while (i-- > 0)
+      new_rows[i].swap(rows[i]);
+    // Put the new vector into place.
+    std::swap(rows, new_rows);
+  }
+  else {
+    // Reallocation will NOT take place.
+    // Insert a new empty row at the end, then construct it assigning
+    // it the given type.
+    Row& new_row = *rows.insert(rows.end(), Row());
+    static_cast<Linear_Row&>(new_row).construct(row_size, row_capacity, flags);
+  }
+
+  // The added row was a pending row.
+  assert(num_pending_rows() > 0);
+}
+
+void
+PPL::Linear_System::normalize() {
+  Linear_System& x = *this;
+  // We normalize also the pending rows.
+  for (dimension_type i = num_rows(); i-- > 0; )
+    x[i].normalize();
+  set_sorted(false);
+}
+
+void
+PPL::Linear_System::strong_normalize() {
+  Linear_System& x = *this;
+  // We strongly normalize also the pending rows.
+  for (dimension_type i = num_rows(); i-- > 0; )
+    x[i].strong_normalize();
+  set_sorted(false);
+}
+
+void
+PPL::Linear_System::sign_normalize() {
+  Linear_System& x = *this;
+  // We sign-normalize also the pending rows.
+  for (dimension_type i = num_rows(); i-- > 0; )
+    x[i].sign_normalize();
+  set_sorted(false);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+bool
+PPL::operator==(const Linear_System& x, const Linear_System& y) {
+  if (x.num_columns() != y.num_columns())
+    return false;
+  const dimension_type x_num_rows = x.num_rows();
+  const dimension_type y_num_rows = y.num_rows();
+  if (x_num_rows != y_num_rows)
+    return false;
+  if (x.first_pending_row() != y.first_pending_row())
+    return false;
+  // Notice that calling operator==(const Matrix&, const Matrix&)
+  // would be wrong here, as equality of the type fields would
+  // not be checked.
+  for (dimension_type i = x_num_rows; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+void
+PPL::Linear_System::sort_and_remove_with_sat(Saturation_Matrix& sat) {
+  Linear_System& sys = *this;
+  // We can only sort the non-pending part of the system.
+  assert(sys.first_pending_row() == sat.num_rows());
+  if (sys.first_pending_row() <= 1) {
+    sys.set_sorted(true);
+    return;
+  }
+
+  // First, sort `sys' (keeping `sat' consistent) without removing duplicates.
+  With_Saturation_Matrix_iterator first(sys.rows.begin(), sat.rows.begin());
+  With_Saturation_Matrix_iterator last = first + sat.num_rows();
+  swapping_sort(first, last, Row_Less_Than());
+  // Second, move duplicates in `sys' to the end (keeping `sat' consistent).
+  With_Saturation_Matrix_iterator new_last = swapping_unique(first, last);
+
+  const dimension_type num_duplicates = last - new_last;
+  const dimension_type new_first_pending_row
+    = sys.first_pending_row() - num_duplicates;
+
+  if (sys.num_pending_rows() > 0) {
+    // In this case, we must put the duplicates after the pending rows.
+    const dimension_type n_rows = sys.num_rows() - 1;
+    for (dimension_type i = 0; i < num_duplicates; ++i)
+      std::swap(sys[new_first_pending_row + i], sys[n_rows - i]);
+  }
+  // Erasing the duplicated rows...
+  sys.erase_to_end(sys.num_rows() - num_duplicates);
+  sys.set_index_first_pending_row(new_first_pending_row);
+  // ... and the corresponding rows of the saturation matrix.
+  sat.rows_erase_to_end(sat.num_rows() - num_duplicates);
+  assert(sys.check_sorted());
+  // Now the system is sorted.
+  sys.set_sorted(true);
+}
+
+PPL::dimension_type
+PPL::Linear_System::gauss(const dimension_type n_lines_or_equalities) {
+  Linear_System& x = *this;
+  // This method is only applied to a well-formed linear system
+  // having no pending rows and exactly `n_lines_or_equalities'
+  // lines or equalities, all of which occur before the rays or points
+  // or inequalities.
+  assert(x.OK(true));
+  assert(x.num_pending_rows() == 0);
+  assert(n_lines_or_equalities == x.num_lines_or_equalities());
+#ifndef NDEBUG
+  for (dimension_type i = n_lines_or_equalities; i-- > 0; )
+    assert(x[i].is_line_or_equality());
+#endif
+
+  dimension_type rank = 0;
+  // Will keep track of the variations on the system of equalities.
+  bool changed = false;
+  for (dimension_type j = x.num_columns(); j-- > 0; )
+    for (dimension_type i = rank; i < n_lines_or_equalities; ++i) {
+      // Search for the first row having a non-zero coefficient
+      // (the pivot) in the j-th column.
+      if (x[i][j] == 0)
+	continue;
+      // Pivot found: if needed, swap rows so that this one becomes
+      // the rank-th row in the linear system.
+      if (i > rank) {
+	std::swap(x[i], x[rank]);
+	// After swapping the system is no longer sorted.
+	changed = true;
+      }
+      // Combine the row containing the pivot with all the lines or
+      // equalities following it, so that all the elements on the j-th
+      // column in these rows become 0.
+      for (dimension_type k = i + 1; k < n_lines_or_equalities; ++k)
+	if (x[k][j] != 0) {
+	  x[k].linear_combine(x[rank], j);
+	  changed = true;
+	}
+      // Already dealt with the rank-th row.
+      ++rank;
+      // Consider another column index `j'.
+      break;
+    }
+  if (changed)
+    x.set_sorted(false);
+  // A well-formed system is returned.
+  assert(x.OK(true));
+  return rank;
+}
+
+void
+PPL::Linear_System
+::back_substitute(const dimension_type n_lines_or_equalities) {
+  Linear_System& x = *this;
+  // This method is only applied to a well-formed system
+  // having no pending rows and exactly `n_lines_or_equalities'
+  // lines or equalities, all of which occur before the first ray
+  // or point or inequality.
+  assert(x.OK(true));
+  assert(x.num_pending_rows() == 0);
+  assert(n_lines_or_equalities <= x.num_lines_or_equalities());
+#ifndef NDEBUG
+  for (dimension_type i = n_lines_or_equalities; i-- > 0; )
+    assert(x[i].is_line_or_equality());
+#endif
+
+  const dimension_type nrows = x.num_rows();
+  const dimension_type ncols = x.num_columns();
+  // Trying to keep sortedness.
+  bool still_sorted = x.is_sorted();
+  // This deque of booleans will be used to flag those rows that,
+  // before exiting, need to be re-checked for sortedness.
+  std::deque<bool> check_for_sortedness;
+  if (still_sorted)
+    check_for_sortedness.insert(check_for_sortedness.end(), nrows, false);
+
+  for (dimension_type k = n_lines_or_equalities; k-- > 0; ) {
+    // For each line or equality, starting from the last one,
+    // looks for the last non-zero element.
+    // `j' will be the index of such a element.
+    Linear_Row& x_k = x[k];
+    dimension_type j = ncols - 1;
+    while (j != 0 && x_k[j] == 0)
+      --j;
+
+    // Go through the equalities above `x_k'.
+    for (dimension_type i = k; i-- > 0; ) {
+      Linear_Row& x_i = x[i];
+      if (x_i[j] != 0) {
+	// Combine linearly `x_i' with `x_k'
+	// so that `x_i[j]' becomes zero.
+	x_i.linear_combine(x_k, j);
+	if (still_sorted) {
+	  // Trying to keep sortedness: remember which rows
+	  // have to be re-checked for sortedness at the end.
+	  if (i > 0)
+	    check_for_sortedness[i-1] = true;
+	  check_for_sortedness[i] = true;
+	}
+      }
+    }
+
+    // Due to strong normalization during previous iterations,
+    // the pivot coefficient `x_k[j]' may now be negative.
+    // Since an inequality (or ray or point) cannot be multiplied
+    // by a negative factor, the coefficient of the pivot must be
+    // forced to be positive.
+    const bool have_to_negate = (x_k[j] < 0);
+    if (have_to_negate)
+      for (dimension_type h = ncols; h-- > 0; )
+	PPL::neg_assign(x_k[h]);
+    // Note: we do not mark index `k' in `check_for_sortedness',
+    // because we will later negate back the row.
+
+    // Go through all the other rows of the system.
+    for (dimension_type i = n_lines_or_equalities; i < nrows; ++i) {
+      Linear_Row& x_i = x[i];
+      if (x_i[j] != 0) {
+	// Combine linearly the `x_i' with `x_k'
+	// so that `x_i[j]' becomes zero.
+	x_i.linear_combine(x_k, j);
+	if (still_sorted) {
+	  // Trying to keep sortedness: remember which rows
+	  // have to be re-checked for sortedness at the end.
+	  if (i > n_lines_or_equalities)
+	    check_for_sortedness[i-1] = true;
+	  check_for_sortedness[i] = true;
+	}
+      }
+    }
+    if (have_to_negate)
+      // Negate `x_k' to restore strong-normalization.
+      for (dimension_type h = ncols; h-- > 0; )
+	PPL::neg_assign(x_k[h]);
+  }
+
+  // Trying to keep sortedness.
+  for (dimension_type i = 0; still_sorted && i < nrows-1; ++i)
+    if (check_for_sortedness[i])
+      // Have to check sortedness of `x[i]' with respect to `x[i+1]'.
+      still_sorted = (compare(x[i], x[i+1]) <= 0);
+  // Set the sortedness flag.
+  x.set_sorted(still_sorted);
+
+  // A well-formed system is returned.
+  assert(x.OK(true));
+}
+
+void
+PPL::Linear_System::simplify() {
+  Linear_System& x = *this;
+  // This method is only applied to a well-formed system
+  // having no pending rows.
+  assert(x.OK(true));
+  assert(x.num_pending_rows() == 0);
+
+  // Partially sort the linear system so that all lines/equalities come first.
+  dimension_type nrows = x.num_rows();
+  dimension_type n_lines_or_equalities = 0;
+  for (dimension_type i = 0; i < nrows; ++i)
+    if (x[i].is_line_or_equality()) {
+      if (n_lines_or_equalities < i) {
+	std::swap(x[i], x[n_lines_or_equalities]);
+	// The system was not sorted.
+	assert(!x.sorted);
+      }
+      ++n_lines_or_equalities;
+    }
+  // Apply Gaussian's elimination to the subsystem of lines/equalities.
+  const dimension_type rank = x.gauss(n_lines_or_equalities);
+  // Eliminate any redundant line/equality that has been detected.
+  if (rank < n_lines_or_equalities) {
+    const dimension_type
+      n_rays_or_points_or_inequalities = nrows - n_lines_or_equalities;
+    const dimension_type
+      num_swaps = std::min(n_lines_or_equalities - rank,
+			   n_rays_or_points_or_inequalities);
+    for (dimension_type i = num_swaps; i-- > 0; )
+      std::swap(x[--nrows], x[rank + i]);
+    x.erase_to_end(nrows);
+    x.unset_pending_rows();
+    if (n_rays_or_points_or_inequalities > num_swaps)
+      x.set_sorted(false);
+    n_lines_or_equalities = rank;
+  }
+  // Apply back-substitution to the system of rays/points/inequalities.
+  x.back_substitute(n_lines_or_equalities);
+  // A well-formed system is returned.
+  assert(x.OK(true));
+}
+
+void
+PPL::Linear_System::add_rows_and_columns(const dimension_type n) {
+  assert(n > 0);
+  const bool was_sorted = is_sorted();
+  const dimension_type old_n_rows = num_rows();
+  const dimension_type old_n_columns = num_columns();
+  add_zero_rows_and_columns(n, n, Linear_Row::Flags(row_topology));
+  Linear_System& x = *this;
+  // The old system is moved to the bottom.
+  for (dimension_type i = old_n_rows; i-- > 0; )
+    std::swap(x[i], x[i + n]);
+  for (dimension_type i = n, c = old_n_columns; i-- > 0; ) {
+    // The top right-hand sub-system (i.e., the system made of new
+    // rows and columns) is set to the specular image of the identity
+    // matrix.
+    Linear_Row& r = x[i];
+    r[c++] = 1;
+    r.set_is_line_or_equality();
+    // Note: `r' is strongly normalized.
+  }
+  // If the old system was empty, the last row added is either
+  // a positivity constraint or a point.
+  if (old_n_columns == 0) {
+    x[n-1].set_is_ray_or_point_or_inequality();
+    // Since ray, points and inequalities come after lines
+    // and equalities, this case implies the system is sorted.
+    set_sorted(true);
+  }
+  else if (was_sorted)
+    set_sorted(compare(x[n-1], x[n]) <= 0);
+
+  // A well-formed system has to be returned.
+  assert(OK(true));
+}
+
+void
+PPL::Linear_System::sort_pending_and_remove_duplicates() {
+  assert(num_pending_rows() > 0);
+  assert(is_sorted());
+  Linear_System& x = *this;
+
+  // The non-pending part of the system is already sorted.
+  // Now sorting the pending part..
+  const dimension_type first_pending = x.first_pending_row();
+  x.sort_rows(first_pending, x.num_rows());
+  // Recompute the number of rows, because we may have removed
+  // some rows occurring more than once in the pending part.
+  dimension_type num_rows = x.num_rows();
+
+  dimension_type k1 = 0;
+  dimension_type k2 = first_pending;
+  dimension_type num_duplicates = 0;
+  // In order to erase them, put at the end of the system
+  // those pending rows that also occur in the non-pending part.
+  while (k1 < first_pending && k2 < num_rows) {
+    const int cmp = compare(x[k1], x[k2]);
+    if (cmp == 0) {
+      // We found the same row.
+      ++num_duplicates;
+      --num_rows;
+      // By initial sortedness, we can increment index `k1'.
+      ++k1;
+      // Do not increment `k2'; instead, swap there the next pending row.
+      if (k2 < num_rows)
+	std::swap(x[k2], x[k2 + num_duplicates]);
+    }
+    else if (cmp < 0)
+      // By initial sortedness, we can increment `k1'.
+      ++k1;
+    else {
+      // Here `cmp > 0'.
+      // Increment `k2' and, if we already found any duplicate,
+      // swap the next pending row in position `k2'.
+      ++k2;
+      if (num_duplicates > 0 && k2 < num_rows)
+	std::swap(x[k2], x[k2 + num_duplicates]);
+    }
+  }
+  // If needed, swap any duplicates found past the pending rows
+  // that has not been considered yet; then erase the duplicates.
+  if (num_duplicates > 0) {
+    if (k2 < num_rows)
+      for (++k2; k2 < num_rows; ++k2)
+	std::swap(x[k2], x[k2 + num_duplicates]);
+    x.erase_to_end(num_rows);
+  }
+  // Do not check for strong normalization,
+  // because no modification of rows has occurred.
+  assert(OK(false));
+}
+
+bool
+PPL::Linear_System::check_sorted() const {
+  const Linear_System& x = *this;
+  for (dimension_type i = first_pending_row(); i-- > 1; )
+    if (compare(x[i], x[i-1]) < 0)
+      return false;
+  return true;
+}
+
+bool
+PPL::Linear_System::OK(const bool check_strong_normalized) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // `index_first_pending' must be less than or equal to `num_rows()'.
+  if (first_pending_row() > num_rows()) {
+#ifndef NDEBUG
+    cerr << "Linear_System has a negative number of pending rows!"
+	 << endl;
+#endif
+    return false;
+  }
+
+  // An empty system is OK,
+  // unless it is an NNC system with exactly one column.
+  if (num_rows() == 0)
+    if (is_necessarily_closed() || num_columns() != 1)
+      return true;
+    else {
+#ifndef NDEBUG
+      cerr << "NNC Linear_System has one column" << endl;
+#endif
+      return false;
+    }
+
+  // A non-empty system will contain constraints or generators; in
+  // both cases it must have at least one column for the inhomogeneous
+  // term and, if it is NNC, another one for the epsilon coefficient.
+  const dimension_type min_cols = is_necessarily_closed() ? 1 : 2;
+  if (num_columns() < min_cols) {
+#ifndef NDEBUG
+    cerr << "Linear_System has fewer columns than the minimum "
+	 << "allowed by its topology:"
+	 << endl
+	 << "num_columns is " << num_columns()
+	 << ", minimum is " << min_cols
+	 << endl;
+#endif
+    return false;
+  }
+
+  const Linear_System& x = *this;
+  const dimension_type n_rows = num_rows();
+  for (dimension_type i = 0; i < n_rows; ++i) {
+    if (!x[i].OK(row_size, row_capacity))
+      return false;
+    // Checking for topology mismatches.
+    if (x.topology() != x[i].topology()) {
+#ifndef NDEBUG
+      cerr << "Topology mismatch between the system "
+	   << "and one of its rows!"
+	   << endl;
+#endif
+      return false;
+    }
+  }
+
+  if (check_strong_normalized) {
+    // Check for strong normalization of rows.
+    // Note: normalization cannot be checked inside the
+    // Linear_Row::OK() method, because a Linear_Row object may also
+    // implement a Linear_Expression object, which in general cannot
+    // be (strongly) normalized.
+    Linear_System tmp(x, With_Pending());
+    tmp.strong_normalize();
+    if (x != tmp) {
+#ifndef NDEBUG
+      cerr << "Linear_System rows are not strongly normalized!"
+	   << endl;
+#endif
+      return false;
+    }
+  }
+
+  if (sorted && !check_sorted()) {
+#ifndef NDEBUG
+    cerr << "The system declares itself to be sorted but it is not!"
+	 << endl;
+#endif
+    return false;
+  }
+
+  // All checks passed.
+  return true;
+}
diff --git a/src/Linear_System.defs.hh b/src/Linear_System.defs.hh
new file mode 100644
index 0000000..ebc440b
--- /dev/null
+++ b/src/Linear_System.defs.hh
@@ -0,0 +1,517 @@
+/* Linear_System class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Linear_System_defs_hh
+#define PPL_Linear_System_defs_hh 1
+
+#include "Linear_System.types.hh"
+#include "Row.types.hh"
+#include "Saturation_Row.types.hh"
+#include "Saturation_Matrix.types.hh"
+#include "Matrix.defs.hh"
+#include "Topology.hh"
+#include "Linear_Row.defs.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for systems of constraints and generators.
+/*! \ingroup PPL_CXX_interface
+  An object of this class represents either a constraint system
+  or a generator system. Each Linear_System object can be viewed
+  as a finite sequence of strong-normalized Linear_Row objects,
+  where each Linear_Row implements a constraint or a generator.
+  Linear systems are characterized by the matrix of coefficients,
+  also encoding the number, size and capacity of Linear_row objects,
+  as well as a few additional information, including:
+   - the topological kind of (all) the rows;
+   - an indication of whether or not some of the rows in the Linear_System
+     are <EM>pending</EM>, meaning that they still have to undergo
+     an (unspecified) elaboration; if there are pending rows, then these
+     form a proper suffix of the overall sequence of rows;
+   - a Boolean flag that, when <CODE>true</CODE>, ensures that the
+     non-pending prefix of the sequence of rows is sorted.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Linear_System : public Matrix {
+public:
+  //! Builds an empty linear system with specified topology.
+  /*!
+    Rows size and capacity are initialized to \f$0\f$.
+  */
+  Linear_System(Topology topol);
+
+  //! Builds a system with specified topology and dimensions.
+  /*!
+    \param topol
+    The topology of the system that will be created;
+
+    \param n_rows
+    The number of rows of the system that will be created;
+
+    \param n_columns
+    The number of columns of the system that will be created.
+
+    Creates a \p n_rows \f$\times\f$ \p n_columns system whose
+    coefficients are all zero and whose rows are all initialized
+    to be of the given topology.
+  */
+  Linear_System(Topology topol,
+		dimension_type n_rows, dimension_type n_columns);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A tag class.
+  /*! \ingroup PPL_CXX_interface
+    Tag class to differentiate the Linear_System copy-constructor that
+    copies pending rows as pending from the one that transforms
+    pending rows into non-pending ones.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  struct With_Pending {
+  };
+
+  //! Copy-constructor: pending rows are transformed into non-pending ones.
+  Linear_System(const Linear_System& y);
+
+  //! Full copy-constructor: pending rows are copied as pending.
+  Linear_System(const Linear_System& y, With_Pending);
+
+  //! Assignment operator: pending rows are transformed into non-pending ones.
+  Linear_System& operator=(const Linear_System& y);
+
+  //! Full assignment operator: pending rows are copied as pending.
+  void assign_with_pending(const Linear_System& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Linear_System& y);
+
+  //! Returns the maximum space dimension a Linear_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the rows in the system.
+  /*!
+    The computation of the space dimension correctly ignores
+    the column encoding the inhomogeneous terms of constraint
+    (resp., the divisors of generators);
+    if the system topology is <CODE>NOT_NECESSARILY_CLOSED</CODE>,
+    also the column of the \f$\epsilon\f$-dimension coefficients
+    will be ignored.
+  */
+  dimension_type space_dimension() const;
+
+  //! Makes the system shrink by removing its \p n trailing columns.
+  void remove_trailing_columns(dimension_type n);
+
+  //! Permutes the columns of the system.
+  /*
+    \param cycles
+    A vector representing the non-trivial cycles of the permutation
+    according to which the columns must be rearranged.
+
+    The \p cycles vector contains, one after the other, the
+    non-trivial cycles (i.e., the cycles of length greater than one)
+    of a permutation of non-zero column indexes.  Each cycle is
+    terminated by zero.  For example, assuming the system has 6
+    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+    turn can be represented by a vector of 6 elements containing 1, 3,
+    6, 0, 2, 4, 0.
+  */
+  void permute_columns(const std::vector<dimension_type>& cycles);
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the \p k-th row of the system.
+  Linear_Row& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the system.
+  const Linear_Row& operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  //! Strongly normalizes the system.
+  void strong_normalize();
+
+  //! Sign-normalizes the system.
+  void sign_normalize();
+
+  //! \name Accessors
+  //@{
+  //! Returns the system topology.
+  Topology topology() const;
+
+  //! Returns the value of the sortedness flag.
+  bool is_sorted() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+  */
+  bool is_necessarily_closed() const;
+
+  /*! \brief
+    Returns the number of rows in the system
+    that represent either lines or equalities.
+  */
+  dimension_type num_lines_or_equalities() const;
+
+  //! Returns the index of the first pending row.
+  dimension_type first_pending_row() const;
+
+  //! Returns the number of rows that are in the pending part of the system.
+  dimension_type num_pending_rows() const;
+  //@} // Accessors
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is sorted,
+    without checking for duplicates.
+  */
+  bool check_sorted() const;
+
+  //! Sets the system topology to <CODE>NECESSARILY_CLOSED</CODE>.
+  void set_necessarily_closed();
+
+  //! Sets the system topology to <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  void set_not_necessarily_closed();
+
+  //! Sets the topology of all rows equal to the system topology.
+  void set_rows_topology();
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  //! Resizes the system without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows of the resized system;
+
+    \param new_n_columns
+    The number of columns of the resized system.
+
+    The system is expanded to the specified dimensions avoiding
+    reallocation whenever possible.
+    The contents of the original system is lost.
+  */
+  void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns);
+
+  //! Adds \p n rows and columns to the system.
+  /*!
+    \param n
+    The number of rows and columns to be added: must be strictly positive.
+
+    Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+    the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+    such that
+    \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+    where \f$J\f$ is the specular image
+    of the \f$n \times n\f$ identity matrix.
+  */
+  void add_rows_and_columns(dimension_type n);
+
+  /*! \brief
+    Adds a copy of \p r to the system,
+    automatically resizing the system or the row's copy, if needed.
+  */
+  void insert(const Linear_Row& r);
+
+  /*! \brief
+    Adds a copy of the given row to the pending part of the system,
+    automatically resizing the system or the row, if needed.
+  */
+  void insert_pending(const Linear_Row& r);
+
+  //! Adds a copy of the given row to the system.
+  void add_row(const Linear_Row& r);
+
+  //! Adds a new empty row to the system, setting only its flags.
+  void add_pending_row(Linear_Row::Flags flags);
+
+  //! Adds a copy of the given row to the pending part of the system.
+  void add_pending_row(const Linear_Row& r);
+
+  //! Adds to \p *this a copy of the rows of `y'.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void add_rows(const Linear_System& y);
+
+  //! Adds a copy of the rows of `y' to the pending part of `*this'.
+  void add_pending_rows(const Linear_System& y);
+
+  /*! \brief
+    Sorts the non-pending rows (in growing order) and eliminates
+    duplicated ones.
+  */
+  void sort_rows();
+
+  /*! \brief
+    Sorts the rows (in growing order) form \p first_row to
+    \p last_row and eliminates duplicated ones.
+  */
+  void sort_rows(dimension_type first_row, dimension_type last_row);
+
+  /*! \brief
+    Assigns to \p *this the result of merging its rows with
+    those of \p y, obtaining a sorted system.
+
+    Duplicated rows will occur only once in the result.
+    On entry, both systems are assumed to be sorted and have
+    no pending rows.
+  */
+  void merge_rows_assign(const Linear_System& y);
+
+  /*! \brief
+    Sorts the pending rows and eliminates those that also occur
+    in the non-pending part of the system.
+  */
+  void sort_pending_and_remove_duplicates();
+
+  class With_Saturation_Matrix_iterator;
+
+  /*! \brief
+    Sorts the system, removing duplicates, keeping the saturation
+    matrix consistent.
+
+    \param sat
+    Saturation matrix with rows corresponding to the rows of \p *this.
+  */
+  void sort_and_remove_with_sat(Saturation_Matrix& sat);
+
+  //! Minimizes the subsystem of equations contained in \p *this.
+  /*!
+    This method works only on the equalities of the system:
+    the system is required to be partially sorted, so that
+    all the equalities are grouped at its top; it is assumed that
+    the number of equalities is exactly \p n_lines_or_equalities.
+    The method finds a minimal system for the equalities and
+    returns its rank, i.e., the number of linearly independent equalities.
+    The result is an upper triangular subsystem of equalities:
+    for each equality, the pivot is chosen starting from
+    the right-most columns.
+  */
+  dimension_type gauss(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Back-substitutes the coefficients to reduce
+    the complexity of the system.
+
+    Takes an upper triangular system having \p n_lines_or_equalities rows.
+    For each row, starting from the one having the minimum number of
+    coefficients different from zero, computes the expression of an element
+    as a function of the remaining ones and then substitutes this expression
+    in all the other rows.
+  */
+  void back_substitute(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Applies Gaussian's elimination and back-substitution so as to
+    simplify the linear system.
+  */
+  void simplify();
+
+  /*! \brief
+    Normalizes the system by dividing each row for the GCD of the
+    row's elements.
+  */
+  void normalize();
+
+  //! Clears the system deallocating all its rows.
+  void clear();
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref
+    ascii_dump) and sets \p *this accordingly.  Returns <CODE>true</CODE>
+    if successful, <CODE>false</CODE> otherwise.
+
+    Reads into a Linear_System object the information produced by the
+    output of <CODE>ascii_dump()</CODE>.  The specialized methods
+    provided by Constraint_System and Generator_System take care of
+    properly reading the contents of the system.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \param check_strong_normalized
+    <CODE>true</CODE> if and only if the strong normalization of all
+    the rows in the system has to be checked.
+
+    By default, the strong normalization check is performed.
+    This check may be turned off to avoid useless repeated checking;
+    e.g., when re-checking a well-formed Linear_System after the permutation
+    or deletion of some of its rows.
+  */
+  bool OK(bool check_strong_normalized = true) const;
+
+private:
+  //! The topological kind of the rows in the system.
+  Topology row_topology;
+
+  //! The index of the first pending row.
+  dimension_type index_first_pending;
+
+  /*! \brief
+    <CODE>true</CODE> if rows are sorted in the ascending order as defined by
+    <CODE>bool compare(const Linear_Row&, const Linear_Row&)</CODE>.
+    If <CODE>false</CODE> may not be sorted.
+  */
+  bool sorted;
+
+  //! Ordering predicate (used when implementing the sort algorithm).
+  struct Row_Less_Than {
+    bool operator()(const Row& x, const Row& y) const;
+  };
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Linear_System& x,
+	  Parma_Polyhedra_Library::Linear_System& y);
+
+} // namespace std
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Linear_System */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator==(const Linear_System& x, const Linear_System& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_System */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator!=(const Linear_System& x, const Linear_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator keeping a Linear_System consistent with a Saturation_Matrix.
+/*! \ingroup PPL_CXX_interface
+  An iterator on the vector of Row objects encoded in a Linear_System
+  extended to maintain a corresponding iterator on a vector of
+  Saturation_Row objects.  Access to values is always done on the Row
+  objects, but iterator
+  movements and swaps are done on both components.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator {
+public:
+  typedef std::vector<Row>::iterator Iter1;
+  typedef std::vector<Saturation_Row>::iterator Iter2;
+
+private:
+  Iter1 i1;
+  Iter2 i2;
+
+public:
+  // Same traits as Iter1.
+  typedef std::iterator_traits<Iter1>::iterator_category iterator_category;
+  typedef std::iterator_traits<Iter1>::value_type value_type;
+  typedef std::iterator_traits<Iter1>::difference_type difference_type;
+  typedef std::iterator_traits<Iter1>::pointer pointer;
+  typedef std::iterator_traits<Iter1>::reference reference;
+
+  //! Constructor.
+  With_Saturation_Matrix_iterator(Iter1 iter1, Iter2 iter2);
+
+  //! Copy-constructor.
+  With_Saturation_Matrix_iterator(const With_Saturation_Matrix_iterator& y);
+
+  //! Destructor.
+  ~With_Saturation_Matrix_iterator();
+
+  //! Assignment operator.
+  With_Saturation_Matrix_iterator&
+  operator=(const With_Saturation_Matrix_iterator& y);
+
+  //! \name Operators Implementing Iterator Movement
+  //@{
+  With_Saturation_Matrix_iterator& operator++();
+  With_Saturation_Matrix_iterator operator++(int);
+
+  With_Saturation_Matrix_iterator& operator--();
+  With_Saturation_Matrix_iterator operator--(int);
+
+  With_Saturation_Matrix_iterator& operator+=(difference_type d);
+  With_Saturation_Matrix_iterator operator+(difference_type d) const;
+
+  With_Saturation_Matrix_iterator& operator-=(difference_type d);
+  With_Saturation_Matrix_iterator operator-(difference_type d) const;
+  //@}
+
+  //! Distance operator.
+  difference_type operator-(const With_Saturation_Matrix_iterator& y) const;
+
+  //! \name Comparisons between Iterators
+  //@{
+  bool operator==(const With_Saturation_Matrix_iterator& y) const;
+  bool operator!=(const With_Saturation_Matrix_iterator& y) const;
+  bool operator<(const With_Saturation_Matrix_iterator& y) const;
+  //@}
+
+  //! Dereferencing operator.
+  reference operator*() const;
+
+  //! Access-through operator.
+  pointer operator->() const;
+
+  //! Swaps the pointed Row objects while keeping Saturation_Matrix consistent.
+  void iter_swap(const With_Saturation_Matrix_iterator& y) const;
+
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void
+iter_swap(Parma_Polyhedra_Library
+	  ::Linear_System::With_Saturation_Matrix_iterator x,
+	  Parma_Polyhedra_Library
+	  ::Linear_System::With_Saturation_Matrix_iterator y);
+
+} // namespace std
+
+#include "Linear_System.inlines.hh"
+
+#endif // !defined(PPL_Linear_System_defs_hh)
diff --git a/src/Linear_System.inlines.hh b/src/Linear_System.inlines.hh
new file mode 100644
index 0000000..99e8a98
--- /dev/null
+++ b/src/Linear_System.inlines.hh
@@ -0,0 +1,393 @@
+/* Linear_System class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Linear_System_inlines_hh
+#define PPL_Linear_System_inlines_hh 1
+
+#include "Saturation_Row.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline memory_size_type
+Linear_System::external_memory_in_bytes() const {
+  return Matrix::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_System::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Linear_System::is_sorted() const {
+  // The flag `sorted' does not really reflect the sortedness status
+  // of a system (if `sorted' evaluates to `false' nothing is known).
+  // This assertion is used to ensure that the system
+  // is actually sorted when `sorted' value is 'true'.
+  assert(!sorted || check_sorted());
+  return sorted;
+}
+
+inline void
+Linear_System::set_sorted(const bool b) {
+  sorted = b;
+}
+
+inline
+Linear_System::Linear_System(Topology topol)
+  : Matrix(),
+    row_topology(topol),
+    index_first_pending(0),
+    sorted(true) {
+}
+
+inline
+Linear_System::Linear_System(Topology topol,
+			     dimension_type n_rows, dimension_type n_columns)
+  : Matrix(n_rows, n_columns, Linear_Row::Flags(topol)),
+    row_topology(topol),
+    index_first_pending(n_rows),
+    sorted(true) {
+}
+
+inline dimension_type
+Linear_System::first_pending_row() const {
+  return index_first_pending;
+}
+
+inline dimension_type
+Linear_System::num_pending_rows() const {
+  assert(num_rows() >= first_pending_row());
+  return num_rows() - first_pending_row();
+}
+
+inline void
+Linear_System::unset_pending_rows() {
+  index_first_pending = num_rows();
+}
+
+inline void
+Linear_System::set_index_first_pending_row(const dimension_type i) {
+  index_first_pending = i;
+}
+
+inline
+Linear_System::Linear_System(const Linear_System& y)
+  : Matrix(y),
+    row_topology(y.row_topology) {
+  unset_pending_rows();
+  // Previously pending rows may violate sortedness.
+  sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+  assert(num_pending_rows() == 0);
+}
+
+inline
+Linear_System::Linear_System(const Linear_System& y, With_Pending)
+  : Matrix(y),
+    row_topology(y.row_topology),
+    index_first_pending(y.index_first_pending),
+    sorted(y.sorted) {
+}
+
+inline Linear_System&
+Linear_System::operator=(const Linear_System& y) {
+  Matrix::operator=(y);
+  row_topology = y.row_topology;
+  unset_pending_rows();
+  // Previously pending rows may violate sortedness.
+  sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+  assert(num_pending_rows() == 0);
+  return *this;
+}
+
+inline void
+Linear_System::assign_with_pending(const Linear_System& y) {
+  Matrix::operator=(y);
+  row_topology = y.row_topology;
+  index_first_pending = y.index_first_pending;
+  sorted = y.sorted;
+}
+
+inline void
+Linear_System::swap(Linear_System& y) {
+  Matrix::swap(y);
+  std::swap(row_topology, y.row_topology);
+  std::swap(index_first_pending, y.index_first_pending);
+  std::swap(sorted, y.sorted);
+}
+
+inline void
+Linear_System::clear() {
+  // Note: do NOT modify the value of `row_topology'.
+  Matrix::clear();
+  index_first_pending = 0;
+  sorted = true;
+}
+
+inline void
+Linear_System::resize_no_copy(const dimension_type new_n_rows,
+			      const dimension_type new_n_columns) {
+  Matrix::resize_no_copy(new_n_rows, new_n_columns,
+			 Linear_Row::Flags(row_topology));
+  // Even though `*this' may happen to keep its sortedness, we believe
+  // that checking such a property is not worth the effort.  In fact,
+  // it is very likely that the system will be overwritten as soon as
+  // we return.
+  set_sorted(false);
+}
+
+inline void
+Linear_System::set_necessarily_closed() {
+  row_topology = NECESSARILY_CLOSED;
+  if (num_rows() > 0)
+    set_rows_topology();
+}
+
+inline void
+Linear_System::set_not_necessarily_closed() {
+  row_topology = NOT_NECESSARILY_CLOSED;
+  if (num_rows() > 0)
+    set_rows_topology();
+}
+
+inline bool
+Linear_System::is_necessarily_closed() const {
+  return row_topology == NECESSARILY_CLOSED;
+}
+
+inline Linear_Row&
+Linear_System::operator[](const dimension_type k) {
+  return static_cast<Linear_Row&>(Matrix::operator[](k));
+}
+
+inline const Linear_Row&
+Linear_System::operator[](const dimension_type k) const {
+  return static_cast<const Linear_Row&>(Matrix::operator[](k));
+}
+
+inline Topology
+Linear_System::topology() const {
+  return row_topology;
+}
+
+inline dimension_type
+Linear_System::max_space_dimension() {
+  // Column zero holds the inhomogeneous term or the divisor.
+  // In NNC linear systems, the last column holds the coefficient
+  // of the epsilon dimension.
+  return max_num_columns() - 2;
+}
+
+inline dimension_type
+Linear_System::space_dimension() const {
+  const dimension_type n_columns = num_columns();
+  return (n_columns == 0)
+    ? 0
+    : n_columns - (is_necessarily_closed() ? 1 : 2);
+}
+
+inline void
+Linear_System::remove_trailing_columns(const dimension_type n) {
+  Matrix::remove_trailing_columns(n);
+  // Have to re-normalize the rows of the system,
+  // since we removed some coefficients.
+  strong_normalize();
+}
+
+inline void
+Linear_System::permute_columns(const std::vector<dimension_type>& cycles) {
+  Matrix::permute_columns(cycles);
+  // The rows with permuted columns are still normalized but may
+  // be not strongly normalized: sign normalization is necessary.
+  sign_normalize();
+}
+
+/*! \relates Linear_System */
+inline bool
+operator!=(const Linear_System& x, const Linear_System& y) {
+  return !(x == y);
+}
+
+inline bool
+Linear_System::Row_Less_Than::operator()(const Row& x, const Row& y) const {
+  return compare(static_cast<const Linear_Row&>(x),
+		 static_cast<const Linear_Row&>(y)) < 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+inline void
+swap(Parma_Polyhedra_Library::Linear_System& x,
+     Parma_Polyhedra_Library::Linear_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Linear_System::With_Saturation_Matrix_iterator::
+With_Saturation_Matrix_iterator(Iter1 iter1, Iter2 iter2)
+  : i1(iter1), i2(iter2) {
+}
+
+inline
+Linear_System::With_Saturation_Matrix_iterator::
+With_Saturation_Matrix_iterator(const With_Saturation_Matrix_iterator& y)
+  : i1(y.i1), i2(y.i2) {
+}
+
+inline
+Linear_System::With_Saturation_Matrix_iterator::
+~With_Saturation_Matrix_iterator() {
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::
+operator=(const With_Saturation_Matrix_iterator& y) {
+  i1 = y.i1;
+  i2 = y.i2;
+  return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator++() {
+  ++i1;
+  ++i2;
+  return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::operator++(int) {
+  With_Saturation_Matrix_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator--() {
+  --i1;
+  --i2;
+  return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::operator--(int) {
+  With_Saturation_Matrix_iterator tmp = *this;
+  operator--();
+  return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator+=(difference_type d) {
+  i1 += d;
+  i2 += d;
+  return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::
+operator+(difference_type d) const {
+  With_Saturation_Matrix_iterator tmp = *this;
+  tmp += d;
+  return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator-=(difference_type d) {
+  i1 -= d;
+  i2 -= d;
+  return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::
+operator-(difference_type d) const {
+  With_Saturation_Matrix_iterator tmp = *this;
+  tmp -= d;
+  return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator::difference_type
+Linear_System::With_Saturation_Matrix_iterator::
+operator-(const With_Saturation_Matrix_iterator& y) const {
+  return i1 - y.i1;
+}
+
+inline bool
+Linear_System::With_Saturation_Matrix_iterator::
+operator==(const With_Saturation_Matrix_iterator& y) const {
+  return i1 == y.i1;
+}
+
+inline bool
+Linear_System::With_Saturation_Matrix_iterator::
+operator!=(const With_Saturation_Matrix_iterator& y) const {
+  return i1 != y.i1;
+}
+
+inline bool
+Linear_System::With_Saturation_Matrix_iterator::
+operator<(const With_Saturation_Matrix_iterator& y) const {
+  return i1 < y.i1;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator::reference
+Linear_System::With_Saturation_Matrix_iterator::operator*() const {
+  return *i1;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator::pointer
+Linear_System::With_Saturation_Matrix_iterator::operator->() const {
+  return &*i1;
+}
+
+inline void
+Linear_System::With_Saturation_Matrix_iterator::
+iter_swap(const With_Saturation_Matrix_iterator& y) const {
+  std::iter_swap(i1, y.i1);
+  std::iter_swap(i2, y.i2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+inline void
+iter_swap(Parma_Polyhedra_Library
+	  ::Linear_System::With_Saturation_Matrix_iterator x,
+	  Parma_Polyhedra_Library
+	  ::Linear_System::With_Saturation_Matrix_iterator y) {
+  x.iter_swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Linear_System_inlines_hh)
diff --git a/src/Linear_System.types.hh b/src/Linear_System.types.hh
new file mode 100644
index 0000000..52a2c13
--- /dev/null
+++ b/src/Linear_System.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_System_types_hh
+#define PPL_Linear_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_System;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_System_types_hh)
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..c14ffe0
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,413 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+# Libtool -version-info for libppl.la.
+#
+#  1. Start with version information of `0:0:0' for each Libtool library.
+#
+#  2. Update the version information only immediately before a public
+#     release of your software.  More frequent updates are unnecessary,
+#     and only guarantee that the current interface number gets larger
+#     faster.
+#
+#  3. If the library source code has changed at all since the last
+#     update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+#  4. If any interfaces have been added, removed, or changed since the
+#     last update, increment CURRENT, and set REVISION to 0.
+#
+#  5. If any interfaces have been added since the last public release,
+#     then increment AGE.
+#
+#  6. If any interfaces have been removed since the last public release,
+#     then set AGE to 0.
+#
+#	PPL release		-version-info
+#	    0.1			    -----
+#	    0.2			    -----
+#	    0.3			    0:0:0
+#	    0.4			    1:0:1
+#	    0.5			    2:0:0
+#	    0.6			    3:0:0
+#	    0.7			    4:0:0
+#	    0.8			    5:0:0
+#	    0.9			    6:0:0
+
+LIBPPL_LT_CURRENT =  6
+LIBPPL_LT_REVISION = 0
+LIBPPL_LT_AGE =      0
+
+AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src @extra_includes@
+
+lib_LTLIBRARIES = libppl.la
+
+bin_PROGRAMS = ppl-config
+ppl_config_SOURCES = \
+ppl-config.cc \
+BUGS.cc \
+COPYING.cc \
+CREDITS.cc
+
+ppl_config_LDADD = \
+libppl.la \
+ at extra_libraries@
+
+if USE_NATIVE_INTEGERS
+
+COEFFICIENT_TYPES_INCLUDE_FILES =
+
+COEFFICIENT_DEFS_INCLUDE_FILES =
+
+endif
+
+if USE_CHECKED_INTEGERS
+
+COEFFICIENT_TYPES_INCLUDE_FILES =
+
+COEFFICIENT_DEFS_INCLUDE_FILES =
+
+endif
+
+if USE_GMP_INTEGERS
+
+COEFFICIENT_TYPES_INCLUDE_FILES = \
+  GMP_Integer.types.hh
+
+COEFFICIENT_DEFS_INCLUDE_FILES = \
+  GMP_Integer.defs.hh \
+  GMP_Integer.inlines.hh
+
+endif
+
+# The ordering of the following list *matters*!
+INCLUDE_FILES = \
+namespaces.hh \
+compiler.hh \
+Coefficient_traits_template.hh \
+Checked_Number.types.hh \
+$(COEFFICIENT_TYPES_INCLUDE_FILES) \
+Coefficient.types.hh \
+globals.types.hh \
+Interval.types.hh \
+Bounding_Box.types.hh \
+Constraint.types.hh \
+Generator.types.hh \
+Grid_Generator.types.hh \
+Congruence.types.hh \
+Init.types.hh \
+Row.types.hh \
+Linear_Row.types.hh \
+Matrix.types.hh \
+Variable.types.hh \
+Linear_Expression.types.hh \
+Linear_System.types.hh \
+Saturation_Row.types.hh \
+Saturation_Matrix.types.hh \
+Constraint_System.types.hh \
+Generator_System.types.hh \
+Grid_Generator_System.types.hh \
+Congruence_System.types.hh \
+Scalar_Products.types.hh \
+LP_Problem.types.hh \
+Poly_Con_Relation.types.hh \
+Poly_Gen_Relation.types.hh \
+BHRZ03_Certificate.types.hh \
+H79_Certificate.types.hh \
+Grid_Certificate.types.hh \
+Polyhedron.types.hh \
+C_Polyhedron.types.hh \
+NNC_Polyhedron.types.hh \
+Grid.types.hh \
+Ptr_Iterator.types.hh \
+DB_Row.types.hh \
+DB_Matrix.types.hh \
+BD_Shape.types.hh \
+fpu.types.hh \
+Float.defs.hh \
+Float.inlines.hh \
+Limits.hh \
+fpu.defs.hh \
+fpu-c99.inlines.hh \
+fpu-ia32.inlines.hh \
+fpu-none.inlines.hh \
+fpu-sparc.inlines.hh \
+Rounding_Dir.defs.hh \
+Rounding_Dir.inlines.hh \
+Result.defs.hh \
+Result.inlines.hh \
+Numeric_Format.defs.hh \
+checked.defs.hh \
+checked.inlines.hh \
+checked_int.inlines.hh \
+checked_float.inlines.hh \
+checked_mpz.inlines.hh \
+checked_mpq.inlines.hh \
+checked_ext.inlines.hh \
+Checked_Number.defs.hh \
+Checked_Number.inlines.hh \
+mp_numeric_limits.hh \
+checked_numeric_limits.hh \
+$(COEFFICIENT_DEFS_INCLUDE_FILES) \
+Coefficient.defs.hh \
+Coefficient.inlines.hh \
+globals.defs.hh \
+globals.inlines.hh \
+Interval.defs.hh \
+Interval.inlines.hh \
+Bounding_Box.defs.hh \
+Bounding_Box.inlines.hh \
+Variable.defs.hh \
+Variable.inlines.hh \
+Init.defs.hh \
+initializer.hh \
+Topology.hh \
+Row.defs.hh \
+Row.inlines.hh \
+Linear_Row.defs.hh \
+Linear_Row.inlines.hh \
+Matrix.defs.hh \
+Matrix.inlines.hh \
+Saturation_Row.defs.hh \
+Saturation_Row.inlines.hh \
+Linear_System.defs.hh \
+Linear_System.inlines.hh \
+Saturation_Matrix.defs.hh \
+Saturation_Matrix.inlines.hh \
+Constraint_System.defs.hh \
+Generator_System.defs.hh \
+Grid_Generator_System.defs.hh \
+Congruence_System.defs.hh \
+Linear_Expression.defs.hh \
+Linear_Expression.inlines.hh \
+Constraint.defs.hh \
+Constraint.inlines.hh \
+Constraint_System.inlines.hh \
+Generator.defs.hh \
+Generator.inlines.hh \
+Grid_Generator.inlines.hh \
+Grid_Generator.defs.hh \
+Congruence.defs.hh \
+Congruence.inlines.hh \
+Generator_System.inlines.hh \
+Grid_Generator_System.inlines.hh \
+Congruence_System.inlines.hh \
+Scalar_Products.defs.hh \
+Scalar_Products.inlines.hh \
+LP_Problem.defs.hh \
+LP_Problem.inlines.hh \
+Poly_Con_Relation.defs.hh \
+Poly_Con_Relation.inlines.hh \
+Poly_Gen_Relation.defs.hh \
+Poly_Gen_Relation.inlines.hh \
+BHRZ03_Certificate.defs.hh \
+BHRZ03_Certificate.inlines.hh \
+H79_Certificate.defs.hh \
+H79_Certificate.inlines.hh \
+Grid_Certificate.defs.hh \
+Grid_Certificate.inlines.hh \
+Polyhedron.defs.hh \
+Ph_Status.inlines.hh \
+Polyhedron.inlines.hh \
+Polyhedron.templates.hh \
+Grid.defs.hh \
+Grid_Status.inlines.hh \
+Grid.inlines.hh \
+Grid.templates.hh \
+C_Polyhedron.defs.hh \
+C_Polyhedron.inlines.hh \
+NNC_Polyhedron.defs.hh \
+NNC_Polyhedron.inlines.hh \
+Widening_Function.types.hh \
+Widening_Function.defs.hh \
+Widening_Function.inlines.hh \
+Ptr_Iterator.defs.hh \
+Ptr_Iterator.inlines.hh \
+DB_Row.defs.hh \
+DB_Row.inlines.hh \
+DB_Matrix.defs.hh \
+DB_Matrix.inlines.hh \
+BD_Shape.defs.hh \
+BDS_Status.inlines.hh \
+BD_Shape.inlines.hh \
+BD_Shape.templates.hh \
+Determinate.types.hh \
+Determinate.defs.hh \
+Determinate.inlines.hh \
+Powerset.types.hh \
+Powerset.defs.hh \
+Powerset.inlines.hh \
+Powerset.templates.hh \
+Polyhedra_Powerset.types.hh \
+Polyhedra_Powerset.defs.hh \
+Polyhedra_Powerset.inlines.hh \
+Polyhedra_Powerset.templates.hh \
+max_space_dimension.hh \
+algorithms.hh
+
+NESTED_INCLUDE_FILES = \
+Ph_Status.idefs.hh \
+Grid_Status.idefs.hh \
+BDS_Status.idefs.hh
+
+libppl_la_SOURCES = \
+Bounding_Box.cc \
+checked.cc \
+Checked_Number.cc \
+Float.cc \
+Constraint.cc \
+Constraint_System.cc \
+Congruence.cc \
+Congruence_System.cc \
+Generator_System.cc \
+Grid_Generator_System.cc \
+Generator.cc \
+Grid_Generator.cc \
+Init.cc \
+Coefficient.cc \
+Interval.cc \
+Linear_Expression.cc \
+Linear_System.cc \
+Matrix.cc \
+Scalar_Products.cc \
+LP_Problem.cc \
+Poly_Con_Relation.cc \
+Poly_Gen_Relation.cc \
+BHRZ03_Certificate.cc \
+H79_Certificate.cc \
+Grid_Certificate.cc \
+Polyhedron_nonpublic.cc \
+Polyhedron_public.cc \
+Polyhedron_chdims.cc \
+Polyhedron_widenings.cc \
+C_Polyhedron.cc \
+NNC_Polyhedron.cc \
+Grid_nonpublic.cc \
+Grid_public.cc \
+Grid_chdims.cc \
+Grid_widenings.cc \
+BD_Shape.cc \
+Polyhedra_Powerset.cc \
+Row.cc \
+Linear_Row.cc \
+Saturation_Matrix.cc \
+Saturation_Row.cc \
+Ph_Status.cc \
+Grid_Status.cc \
+Variable.cc \
+conversion.cc \
+minimize.cc \
+simplify.cc \
+Grid_conversion.cc \
+Grid_simplify.cc \
+globals.cc \
+version.cc \
+$(INCLUDE_FILES) \
+$(NESTED_INCLUDE_FILES) \
+swapping_sort.icc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+libppl_la_LIBADD = @extra_libraries@
+
+endif NO_UNDEFINED
+
+libppl_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPPL_LT_CURRENT):$(LIBPPL_LT_REVISION):$(LIBPPL_LT_AGE)
+
+include_HEADERS = ppl.hh
+
+nodist_noinst_HEADERS = ppl_include_files.hh
+
+ppl_include_files.hh: $(INCLUDE_FILES) Makefile
+	rm -f $@
+	for file in $(INCLUDE_FILES); \
+	do \
+	  printf "#include \"%s\"\n" $$file >>$@; \
+	done
+
+EXTRA_DIST = ppl_header.hh ppl-config.cc.in version.hh.in
+
+if HAVE_PERL
+
+ppl.hh:	$(top_builddir)/config.h $(top_builddir)/src/version.hh ppl_header.hh ppl_include_files.hh $(INCLUDE_FILES) $(NESTED_INCLUDE_FILES) Makefile $(top_builddir)/utils/build_header
+	$(top_builddir)/utils/build_header \
+		-I $(top_builddir) -I $(top_builddir)/src \
+		$(top_srcdir)/src/ppl_header.hh >$@
+
+BUGS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS
+	$(top_builddir)/utils/text2cxxarray --name=BUGS_array \
+		$(top_srcdir)/BUGS >$@
+COPYING.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING
+	$(top_builddir)/utils/text2cxxarray --name=COPYING_array \
+		$(top_srcdir)/COPYING >$@
+CREDITS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS
+	$(top_builddir)/utils/text2cxxarray --name=CREDITS_array \
+		$(top_srcdir)/CREDITS >$@
+
+else !HAVE_PERL
+
+ppl.hh:	ppl.hh.dist
+	cp -f $< $@
+
+BUGS.cc:	BUGS.cc.dist
+	cp -f $< $@
+COPYING.cc:	COPYING.cc.dist
+	cp -f $< $@
+CREDITS.cc:	CREDITS.cc.dist
+	cp -f $< $@
+
+endif !HAVE_PERL
+
+if USE_PRECOMPILED_HEADERS
+
+ppl.hh.gch: ppl.hh
+	$(CXXCOMPILE) -xc++-header -o $@ $<
+
+PRECOMPILED = ppl.hh.gch
+
+else
+
+PRECOMPILED =
+
+endif
+
+BUILT_SOURCES = \
+$(include_HEADERS) \
+$(nodist_noinst_HEADERS) \
+$(PRECOMPILED) \
+BUGS.cc \
+COPYING.cc \
+CREDITS.cc
+
+# ppl.hh is not distributed.
+# ppl.hh.dist, which is distributed, is a copy of ppl.hh;
+# likewise for BUGS.cc.dist, COPYING.cc.dist and CREDITS.cc.dist.
+dist-hook:
+	mv -f $(distdir)/ppl.hh $(distdir)/ppl.hh.dist
+	mv -f $(distdir)/BUGS.cc $(distdir)/BUGS.cc.dist
+	mv -f $(distdir)/COPYING.cc $(distdir)/COPYING.cc.dist
+	mv -f $(distdir)/CREDITS.cc $(distdir)/CREDITS.cc.dist
+
+MOSTLYCLEANFILES = $(BUILT_SOURCES)
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..e55f707
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,1167 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+# Libtool -version-info for libppl.la.
+#
+#  1. Start with version information of `0:0:0' for each Libtool library.
+#
+#  2. Update the version information only immediately before a public
+#     release of your software.  More frequent updates are unnecessary,
+#     and only guarantee that the current interface number gets larger
+#     faster.
+#
+#  3. If the library source code has changed at all since the last
+#     update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+#  4. If any interfaces have been added, removed, or changed since the
+#     last update, increment CURRENT, and set REVISION to 0.
+#
+#  5. If any interfaces have been added since the last public release,
+#     then increment AGE.
+#
+#  6. If any interfaces have been removed since the last public release,
+#     then set AGE to 0.
+#
+#	PPL release		-version-info
+#	    0.1			    -----
+#	    0.2			    -----
+#	    0.3			    0:0:0
+#	    0.4			    1:0:1
+#	    0.5			    2:0:0
+#	    0.6			    3:0:0
+#	    0.7			    4:0:0
+#	    0.8			    5:0:0
+#	    0.9			    6:0:0
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ppl-config$(EXEEXT)
+subdir = src
+DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(srcdir)/ppl-config.cc.in \
+	$(srcdir)/version.hh.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = version.hh ppl-config.cc
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(includedir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libppl_la_DEPENDENCIES =
+am__libppl_la_SOURCES_DIST = Bounding_Box.cc checked.cc \
+	Checked_Number.cc Float.cc Constraint.cc Constraint_System.cc \
+	Congruence.cc Congruence_System.cc Generator_System.cc \
+	Grid_Generator_System.cc Generator.cc Grid_Generator.cc \
+	Init.cc Coefficient.cc Interval.cc Linear_Expression.cc \
+	Linear_System.cc Matrix.cc Scalar_Products.cc LP_Problem.cc \
+	Poly_Con_Relation.cc Poly_Gen_Relation.cc \
+	BHRZ03_Certificate.cc H79_Certificate.cc Grid_Certificate.cc \
+	Polyhedron_nonpublic.cc Polyhedron_public.cc \
+	Polyhedron_chdims.cc Polyhedron_widenings.cc C_Polyhedron.cc \
+	NNC_Polyhedron.cc Grid_nonpublic.cc Grid_public.cc \
+	Grid_chdims.cc Grid_widenings.cc BD_Shape.cc \
+	Polyhedra_Powerset.cc Row.cc Linear_Row.cc \
+	Saturation_Matrix.cc Saturation_Row.cc Ph_Status.cc \
+	Grid_Status.cc Variable.cc conversion.cc minimize.cc \
+	simplify.cc Grid_conversion.cc Grid_simplify.cc globals.cc \
+	version.cc namespaces.hh compiler.hh \
+	Coefficient_traits_template.hh Checked_Number.types.hh \
+	GMP_Integer.types.hh Coefficient.types.hh globals.types.hh \
+	Interval.types.hh Bounding_Box.types.hh Constraint.types.hh \
+	Generator.types.hh Grid_Generator.types.hh Congruence.types.hh \
+	Init.types.hh Row.types.hh Linear_Row.types.hh Matrix.types.hh \
+	Variable.types.hh Linear_Expression.types.hh \
+	Linear_System.types.hh Saturation_Row.types.hh \
+	Saturation_Matrix.types.hh Constraint_System.types.hh \
+	Generator_System.types.hh Grid_Generator_System.types.hh \
+	Congruence_System.types.hh Scalar_Products.types.hh \
+	LP_Problem.types.hh Poly_Con_Relation.types.hh \
+	Poly_Gen_Relation.types.hh BHRZ03_Certificate.types.hh \
+	H79_Certificate.types.hh Grid_Certificate.types.hh \
+	Polyhedron.types.hh C_Polyhedron.types.hh \
+	NNC_Polyhedron.types.hh Grid.types.hh Ptr_Iterator.types.hh \
+	DB_Row.types.hh DB_Matrix.types.hh BD_Shape.types.hh \
+	fpu.types.hh Float.defs.hh Float.inlines.hh Limits.hh \
+	fpu.defs.hh fpu-c99.inlines.hh fpu-ia32.inlines.hh \
+	fpu-none.inlines.hh fpu-sparc.inlines.hh Rounding_Dir.defs.hh \
+	Rounding_Dir.inlines.hh Result.defs.hh Result.inlines.hh \
+	Numeric_Format.defs.hh checked.defs.hh checked.inlines.hh \
+	checked_int.inlines.hh checked_float.inlines.hh \
+	checked_mpz.inlines.hh checked_mpq.inlines.hh \
+	checked_ext.inlines.hh Checked_Number.defs.hh \
+	Checked_Number.inlines.hh mp_numeric_limits.hh \
+	checked_numeric_limits.hh GMP_Integer.defs.hh \
+	GMP_Integer.inlines.hh Coefficient.defs.hh \
+	Coefficient.inlines.hh globals.defs.hh globals.inlines.hh \
+	Interval.defs.hh Interval.inlines.hh Bounding_Box.defs.hh \
+	Bounding_Box.inlines.hh Variable.defs.hh Variable.inlines.hh \
+	Init.defs.hh initializer.hh Topology.hh Row.defs.hh \
+	Row.inlines.hh Linear_Row.defs.hh Linear_Row.inlines.hh \
+	Matrix.defs.hh Matrix.inlines.hh Saturation_Row.defs.hh \
+	Saturation_Row.inlines.hh Linear_System.defs.hh \
+	Linear_System.inlines.hh Saturation_Matrix.defs.hh \
+	Saturation_Matrix.inlines.hh Constraint_System.defs.hh \
+	Generator_System.defs.hh Grid_Generator_System.defs.hh \
+	Congruence_System.defs.hh Linear_Expression.defs.hh \
+	Linear_Expression.inlines.hh Constraint.defs.hh \
+	Constraint.inlines.hh Constraint_System.inlines.hh \
+	Generator.defs.hh Generator.inlines.hh \
+	Grid_Generator.inlines.hh Grid_Generator.defs.hh \
+	Congruence.defs.hh Congruence.inlines.hh \
+	Generator_System.inlines.hh Grid_Generator_System.inlines.hh \
+	Congruence_System.inlines.hh Scalar_Products.defs.hh \
+	Scalar_Products.inlines.hh LP_Problem.defs.hh \
+	LP_Problem.inlines.hh Poly_Con_Relation.defs.hh \
+	Poly_Con_Relation.inlines.hh Poly_Gen_Relation.defs.hh \
+	Poly_Gen_Relation.inlines.hh BHRZ03_Certificate.defs.hh \
+	BHRZ03_Certificate.inlines.hh H79_Certificate.defs.hh \
+	H79_Certificate.inlines.hh Grid_Certificate.defs.hh \
+	Grid_Certificate.inlines.hh Polyhedron.defs.hh \
+	Ph_Status.inlines.hh Polyhedron.inlines.hh \
+	Polyhedron.templates.hh Grid.defs.hh Grid_Status.inlines.hh \
+	Grid.inlines.hh Grid.templates.hh C_Polyhedron.defs.hh \
+	C_Polyhedron.inlines.hh NNC_Polyhedron.defs.hh \
+	NNC_Polyhedron.inlines.hh Widening_Function.types.hh \
+	Widening_Function.defs.hh Widening_Function.inlines.hh \
+	Ptr_Iterator.defs.hh Ptr_Iterator.inlines.hh DB_Row.defs.hh \
+	DB_Row.inlines.hh DB_Matrix.defs.hh DB_Matrix.inlines.hh \
+	BD_Shape.defs.hh BDS_Status.inlines.hh BD_Shape.inlines.hh \
+	BD_Shape.templates.hh Determinate.types.hh Determinate.defs.hh \
+	Determinate.inlines.hh Powerset.types.hh Powerset.defs.hh \
+	Powerset.inlines.hh Powerset.templates.hh \
+	Polyhedra_Powerset.types.hh Polyhedra_Powerset.defs.hh \
+	Polyhedra_Powerset.inlines.hh Polyhedra_Powerset.templates.hh \
+	max_space_dimension.hh algorithms.hh Ph_Status.idefs.hh \
+	Grid_Status.idefs.hh BDS_Status.idefs.hh swapping_sort.icc
+am__objects_1 =
+am__objects_2 = $(am__objects_1) $(am__objects_1)
+am_libppl_la_OBJECTS = Bounding_Box.lo checked.lo Checked_Number.lo \
+	Float.lo Constraint.lo Constraint_System.lo Congruence.lo \
+	Congruence_System.lo Generator_System.lo \
+	Grid_Generator_System.lo Generator.lo Grid_Generator.lo \
+	Init.lo Coefficient.lo Interval.lo Linear_Expression.lo \
+	Linear_System.lo Matrix.lo Scalar_Products.lo LP_Problem.lo \
+	Poly_Con_Relation.lo Poly_Gen_Relation.lo \
+	BHRZ03_Certificate.lo H79_Certificate.lo Grid_Certificate.lo \
+	Polyhedron_nonpublic.lo Polyhedron_public.lo \
+	Polyhedron_chdims.lo Polyhedron_widenings.lo C_Polyhedron.lo \
+	NNC_Polyhedron.lo Grid_nonpublic.lo Grid_public.lo \
+	Grid_chdims.lo Grid_widenings.lo BD_Shape.lo \
+	Polyhedra_Powerset.lo Row.lo Linear_Row.lo \
+	Saturation_Matrix.lo Saturation_Row.lo Ph_Status.lo \
+	Grid_Status.lo Variable.lo conversion.lo minimize.lo \
+	simplify.lo Grid_conversion.lo Grid_simplify.lo globals.lo \
+	version.lo $(am__objects_2) $(am__objects_1)
+libppl_la_OBJECTS = $(am_libppl_la_OBJECTS)
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_config_OBJECTS = ppl-config.$(OBJEXT) BUGS.$(OBJEXT) \
+	COPYING.$(OBJEXT) CREDITS.$(OBJEXT)
+ppl_config_OBJECTS = $(am_ppl_config_OBJECTS)
+ppl_config_DEPENDENCIES = libppl.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_la_SOURCES) $(ppl_config_SOURCES)
+DIST_SOURCES = $(am__libppl_la_SOURCES_DIST) $(ppl_config_SOURCES)
+includeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(include_HEADERS) $(nodist_noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+LIBPPL_LT_CURRENT = 6
+LIBPPL_LT_REVISION = 0
+LIBPPL_LT_AGE = 0
+AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src @extra_includes@
+lib_LTLIBRARIES = libppl.la
+ppl_config_SOURCES = \
+ppl-config.cc \
+BUGS.cc \
+COPYING.cc \
+CREDITS.cc
+
+ppl_config_LDADD = \
+libppl.la \
+ at extra_libraries@
+
+ at USE_CHECKED_INTEGERS_TRUE@COEFFICIENT_TYPES_INCLUDE_FILES = 
+ at USE_GMP_INTEGERS_TRUE@COEFFICIENT_TYPES_INCLUDE_FILES = \
+ at USE_GMP_INTEGERS_TRUE@  GMP_Integer.types.hh
+
+ at USE_NATIVE_INTEGERS_TRUE@COEFFICIENT_TYPES_INCLUDE_FILES = 
+ at USE_CHECKED_INTEGERS_TRUE@COEFFICIENT_DEFS_INCLUDE_FILES = 
+ at USE_GMP_INTEGERS_TRUE@COEFFICIENT_DEFS_INCLUDE_FILES = \
+ at USE_GMP_INTEGERS_TRUE@  GMP_Integer.defs.hh \
+ at USE_GMP_INTEGERS_TRUE@  GMP_Integer.inlines.hh
+
+ at USE_NATIVE_INTEGERS_TRUE@COEFFICIENT_DEFS_INCLUDE_FILES = 
+
+# The ordering of the following list *matters*!
+INCLUDE_FILES = \
+namespaces.hh \
+compiler.hh \
+Coefficient_traits_template.hh \
+Checked_Number.types.hh \
+$(COEFFICIENT_TYPES_INCLUDE_FILES) \
+Coefficient.types.hh \
+globals.types.hh \
+Interval.types.hh \
+Bounding_Box.types.hh \
+Constraint.types.hh \
+Generator.types.hh \
+Grid_Generator.types.hh \
+Congruence.types.hh \
+Init.types.hh \
+Row.types.hh \
+Linear_Row.types.hh \
+Matrix.types.hh \
+Variable.types.hh \
+Linear_Expression.types.hh \
+Linear_System.types.hh \
+Saturation_Row.types.hh \
+Saturation_Matrix.types.hh \
+Constraint_System.types.hh \
+Generator_System.types.hh \
+Grid_Generator_System.types.hh \
+Congruence_System.types.hh \
+Scalar_Products.types.hh \
+LP_Problem.types.hh \
+Poly_Con_Relation.types.hh \
+Poly_Gen_Relation.types.hh \
+BHRZ03_Certificate.types.hh \
+H79_Certificate.types.hh \
+Grid_Certificate.types.hh \
+Polyhedron.types.hh \
+C_Polyhedron.types.hh \
+NNC_Polyhedron.types.hh \
+Grid.types.hh \
+Ptr_Iterator.types.hh \
+DB_Row.types.hh \
+DB_Matrix.types.hh \
+BD_Shape.types.hh \
+fpu.types.hh \
+Float.defs.hh \
+Float.inlines.hh \
+Limits.hh \
+fpu.defs.hh \
+fpu-c99.inlines.hh \
+fpu-ia32.inlines.hh \
+fpu-none.inlines.hh \
+fpu-sparc.inlines.hh \
+Rounding_Dir.defs.hh \
+Rounding_Dir.inlines.hh \
+Result.defs.hh \
+Result.inlines.hh \
+Numeric_Format.defs.hh \
+checked.defs.hh \
+checked.inlines.hh \
+checked_int.inlines.hh \
+checked_float.inlines.hh \
+checked_mpz.inlines.hh \
+checked_mpq.inlines.hh \
+checked_ext.inlines.hh \
+Checked_Number.defs.hh \
+Checked_Number.inlines.hh \
+mp_numeric_limits.hh \
+checked_numeric_limits.hh \
+$(COEFFICIENT_DEFS_INCLUDE_FILES) \
+Coefficient.defs.hh \
+Coefficient.inlines.hh \
+globals.defs.hh \
+globals.inlines.hh \
+Interval.defs.hh \
+Interval.inlines.hh \
+Bounding_Box.defs.hh \
+Bounding_Box.inlines.hh \
+Variable.defs.hh \
+Variable.inlines.hh \
+Init.defs.hh \
+initializer.hh \
+Topology.hh \
+Row.defs.hh \
+Row.inlines.hh \
+Linear_Row.defs.hh \
+Linear_Row.inlines.hh \
+Matrix.defs.hh \
+Matrix.inlines.hh \
+Saturation_Row.defs.hh \
+Saturation_Row.inlines.hh \
+Linear_System.defs.hh \
+Linear_System.inlines.hh \
+Saturation_Matrix.defs.hh \
+Saturation_Matrix.inlines.hh \
+Constraint_System.defs.hh \
+Generator_System.defs.hh \
+Grid_Generator_System.defs.hh \
+Congruence_System.defs.hh \
+Linear_Expression.defs.hh \
+Linear_Expression.inlines.hh \
+Constraint.defs.hh \
+Constraint.inlines.hh \
+Constraint_System.inlines.hh \
+Generator.defs.hh \
+Generator.inlines.hh \
+Grid_Generator.inlines.hh \
+Grid_Generator.defs.hh \
+Congruence.defs.hh \
+Congruence.inlines.hh \
+Generator_System.inlines.hh \
+Grid_Generator_System.inlines.hh \
+Congruence_System.inlines.hh \
+Scalar_Products.defs.hh \
+Scalar_Products.inlines.hh \
+LP_Problem.defs.hh \
+LP_Problem.inlines.hh \
+Poly_Con_Relation.defs.hh \
+Poly_Con_Relation.inlines.hh \
+Poly_Gen_Relation.defs.hh \
+Poly_Gen_Relation.inlines.hh \
+BHRZ03_Certificate.defs.hh \
+BHRZ03_Certificate.inlines.hh \
+H79_Certificate.defs.hh \
+H79_Certificate.inlines.hh \
+Grid_Certificate.defs.hh \
+Grid_Certificate.inlines.hh \
+Polyhedron.defs.hh \
+Ph_Status.inlines.hh \
+Polyhedron.inlines.hh \
+Polyhedron.templates.hh \
+Grid.defs.hh \
+Grid_Status.inlines.hh \
+Grid.inlines.hh \
+Grid.templates.hh \
+C_Polyhedron.defs.hh \
+C_Polyhedron.inlines.hh \
+NNC_Polyhedron.defs.hh \
+NNC_Polyhedron.inlines.hh \
+Widening_Function.types.hh \
+Widening_Function.defs.hh \
+Widening_Function.inlines.hh \
+Ptr_Iterator.defs.hh \
+Ptr_Iterator.inlines.hh \
+DB_Row.defs.hh \
+DB_Row.inlines.hh \
+DB_Matrix.defs.hh \
+DB_Matrix.inlines.hh \
+BD_Shape.defs.hh \
+BDS_Status.inlines.hh \
+BD_Shape.inlines.hh \
+BD_Shape.templates.hh \
+Determinate.types.hh \
+Determinate.defs.hh \
+Determinate.inlines.hh \
+Powerset.types.hh \
+Powerset.defs.hh \
+Powerset.inlines.hh \
+Powerset.templates.hh \
+Polyhedra_Powerset.types.hh \
+Polyhedra_Powerset.defs.hh \
+Polyhedra_Powerset.inlines.hh \
+Polyhedra_Powerset.templates.hh \
+max_space_dimension.hh \
+algorithms.hh
+
+NESTED_INCLUDE_FILES = \
+Ph_Status.idefs.hh \
+Grid_Status.idefs.hh \
+BDS_Status.idefs.hh
+
+libppl_la_SOURCES = \
+Bounding_Box.cc \
+checked.cc \
+Checked_Number.cc \
+Float.cc \
+Constraint.cc \
+Constraint_System.cc \
+Congruence.cc \
+Congruence_System.cc \
+Generator_System.cc \
+Grid_Generator_System.cc \
+Generator.cc \
+Grid_Generator.cc \
+Init.cc \
+Coefficient.cc \
+Interval.cc \
+Linear_Expression.cc \
+Linear_System.cc \
+Matrix.cc \
+Scalar_Products.cc \
+LP_Problem.cc \
+Poly_Con_Relation.cc \
+Poly_Gen_Relation.cc \
+BHRZ03_Certificate.cc \
+H79_Certificate.cc \
+Grid_Certificate.cc \
+Polyhedron_nonpublic.cc \
+Polyhedron_public.cc \
+Polyhedron_chdims.cc \
+Polyhedron_widenings.cc \
+C_Polyhedron.cc \
+NNC_Polyhedron.cc \
+Grid_nonpublic.cc \
+Grid_public.cc \
+Grid_chdims.cc \
+Grid_widenings.cc \
+BD_Shape.cc \
+Polyhedra_Powerset.cc \
+Row.cc \
+Linear_Row.cc \
+Saturation_Matrix.cc \
+Saturation_Row.cc \
+Ph_Status.cc \
+Grid_Status.cc \
+Variable.cc \
+conversion.cc \
+minimize.cc \
+simplify.cc \
+Grid_conversion.cc \
+Grid_simplify.cc \
+globals.cc \
+version.cc \
+$(INCLUDE_FILES) \
+$(NESTED_INCLUDE_FILES) \
+swapping_sort.icc
+
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+ at NO_UNDEFINED_TRUE@libppl_la_LIBADD = @extra_libraries@
+libppl_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPPL_LT_CURRENT):$(LIBPPL_LT_REVISION):$(LIBPPL_LT_AGE)
+
+include_HEADERS = ppl.hh
+nodist_noinst_HEADERS = ppl_include_files.hh
+EXTRA_DIST = ppl_header.hh ppl-config.cc.in version.hh.in
+ at USE_PRECOMPILED_HEADERS_FALSE@PRECOMPILED = 
+ at USE_PRECOMPILED_HEADERS_TRUE@PRECOMPILED = ppl.hh.gch
+BUILT_SOURCES = \
+$(include_HEADERS) \
+$(nodist_noinst_HEADERS) \
+$(PRECOMPILED) \
+BUGS.cc \
+COPYING.cc \
+CREDITS.cc
+
+MOSTLYCLEANFILES = $(BUILT_SOURCES)
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+version.hh: $(top_builddir)/config.status $(srcdir)/version.hh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+ppl-config.cc: $(top_builddir)/config.status $(srcdir)/ppl-config.cc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    f=$(am__strip_dir) \
+	    echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+	    $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+	  else :; fi; \
+	done
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  p=$(am__strip_dir) \
+	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+libppl.la: $(libppl_la_OBJECTS) $(libppl_la_DEPENDENCIES) 
+	$(CXXLINK) -rpath $(libdir) $(libppl_la_LDFLAGS) $(libppl_la_OBJECTS) $(libppl_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	     || test -f $$p1 \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+ppl-config$(EXEEXT): $(ppl_config_OBJECTS) $(ppl_config_DEPENDENCIES) 
+	@rm -f ppl-config$(EXEEXT)
+	$(CXXLINK) $(ppl_config_LDFLAGS) $(ppl_config_OBJECTS) $(ppl_config_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BD_Shape.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BHRZ03_Certificate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BUGS.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Bounding_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/COPYING.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/CREDITS.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Checked_Number.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Coefficient.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Congruence.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Congruence_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Constraint.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Constraint_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Generator.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Generator_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_Certificate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_Generator.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_Generator_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_Status.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_chdims.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_conversion.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_nonpublic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_public.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_simplify.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_widenings.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H79_Certificate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Init.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Interval.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/LP_Problem.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_Expression.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_Row.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Matrix.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Ph_Status.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Poly_Con_Relation.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Poly_Gen_Relation.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedra_Powerset.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_chdims.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_nonpublic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_public.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_widenings.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Row.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Saturation_Matrix.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Saturation_Row.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Scalar_Products.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Variable.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/checked.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/conversion.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/globals.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minimize.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl-config.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplify.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/version.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)"
+	@list='$(include_HEADERS)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
+	  $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(include_HEADERS)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(includedir)/$$f"; \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS)
+install-binPROGRAMS: install-libLTLIBRARIES
+
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS
+
+install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \
+	uninstall-info-am uninstall-libLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+	clean-generic clean-libLTLIBRARIES clean-libtool ctags \
+	dist-hook distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-exec install-exec-am \
+	install-includeHEADERS install-info install-info-am \
+	install-libLTLIBRARIES install-man install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-binPROGRAMS \
+	uninstall-includeHEADERS uninstall-info-am \
+	uninstall-libLTLIBRARIES
+
+
+ppl_include_files.hh: $(INCLUDE_FILES) Makefile
+	rm -f $@
+	for file in $(INCLUDE_FILES); \
+	do \
+	  printf "#include \"%s\"\n" $$file >>$@; \
+	done
+
+ at HAVE_PERL_TRUE@ppl.hh:	$(top_builddir)/config.h $(top_builddir)/src/version.hh ppl_header.hh ppl_include_files.hh $(INCLUDE_FILES) $(NESTED_INCLUDE_FILES) Makefile $(top_builddir)/utils/build_header
+ at HAVE_PERL_TRUE@	$(top_builddir)/utils/build_header \
+ at HAVE_PERL_TRUE@		-I $(top_builddir) -I $(top_builddir)/src \
+ at HAVE_PERL_TRUE@		$(top_srcdir)/src/ppl_header.hh >$@
+
+ at HAVE_PERL_TRUE@BUGS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS
+ at HAVE_PERL_TRUE@	$(top_builddir)/utils/text2cxxarray --name=BUGS_array \
+ at HAVE_PERL_TRUE@		$(top_srcdir)/BUGS >$@
+ at HAVE_PERL_TRUE@COPYING.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING
+ at HAVE_PERL_TRUE@	$(top_builddir)/utils/text2cxxarray --name=COPYING_array \
+ at HAVE_PERL_TRUE@		$(top_srcdir)/COPYING >$@
+ at HAVE_PERL_TRUE@CREDITS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS
+ at HAVE_PERL_TRUE@	$(top_builddir)/utils/text2cxxarray --name=CREDITS_array \
+ at HAVE_PERL_TRUE@		$(top_srcdir)/CREDITS >$@
+
+ at HAVE_PERL_FALSE@ppl.hh:	ppl.hh.dist
+ at HAVE_PERL_FALSE@	cp -f $< $@
+
+ at HAVE_PERL_FALSE@BUGS.cc:	BUGS.cc.dist
+ at HAVE_PERL_FALSE@	cp -f $< $@
+ at HAVE_PERL_FALSE@COPYING.cc:	COPYING.cc.dist
+ at HAVE_PERL_FALSE@	cp -f $< $@
+ at HAVE_PERL_FALSE@CREDITS.cc:	CREDITS.cc.dist
+ at HAVE_PERL_FALSE@	cp -f $< $@
+
+ at USE_PRECOMPILED_HEADERS_TRUE@ppl.hh.gch: ppl.hh
+ at USE_PRECOMPILED_HEADERS_TRUE@	$(CXXCOMPILE) -xc++-header -o $@ $<
+
+# ppl.hh is not distributed.
+# ppl.hh.dist, which is distributed, is a copy of ppl.hh;
+# likewise for BUGS.cc.dist, COPYING.cc.dist and CREDITS.cc.dist.
+dist-hook:
+	mv -f $(distdir)/ppl.hh $(distdir)/ppl.hh.dist
+	mv -f $(distdir)/BUGS.cc $(distdir)/BUGS.cc.dist
+	mv -f $(distdir)/COPYING.cc $(distdir)/COPYING.cc.dist
+	mv -f $(distdir)/CREDITS.cc $(distdir)/CREDITS.cc.dist
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Matrix.cc b/src/Matrix.cc
new file mode 100644
index 0000000..77e97a2
--- /dev/null
+++ b/src/Matrix.cc
@@ -0,0 +1,409 @@
+/* Matrix class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Matrix.defs.hh"
+#include "Row.defs.hh"
+#include <algorithm>
+#include <iostream>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Matrix::Matrix(const dimension_type n_rows,
+		    const dimension_type n_columns,
+		    Row::Flags row_flags)
+  : rows((assert(n_rows <= max_num_rows()),
+	  n_rows)),
+    row_size(n_columns),
+    row_capacity(compute_capacity(n_columns, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < n_rows; ++i)
+    rows[i].construct(n_columns, row_capacity, row_flags);
+  assert(OK());
+}
+
+void
+PPL::Matrix::add_zero_rows(const dimension_type n, Row::Flags row_flags) {
+  assert(n > 0);
+  assert(n <= max_num_rows() - num_rows());
+  const dimension_type old_num_rows = rows.size();
+  const dimension_type new_num_rows = old_num_rows + n;
+
+  if (rows.capacity() < new_num_rows) {
+    // Reallocation will take place.
+    std::vector<Row> new_rows;
+    new_rows.reserve(compute_capacity(new_num_rows, max_num_rows()));
+    new_rows.insert(new_rows.end(), new_num_rows, Row());
+    // Construct the new rows.
+    dimension_type i = new_num_rows;
+    while (i-- > old_num_rows)
+      new_rows[i].construct(row_size, row_capacity, row_flags);
+    // Steal the old rows.
+    ++i;
+    while (i-- > 0)
+      new_rows[i].swap(rows[i]);
+    // Put the new vector into place.
+    std::swap(rows, new_rows);
+  }
+  else {
+    // Reallocation will NOT take place.
+    rows.insert(rows.end(), n, Row());
+    for (dimension_type i = new_num_rows; i-- > old_num_rows; )
+      rows[i].construct(row_size, row_capacity, row_flags);
+  }
+}
+
+void
+PPL::Matrix::add_zero_columns(const dimension_type n) {
+  assert(n > 0);
+  assert(n <= max_num_columns() - num_columns());
+  const dimension_type num_rows = rows.size();
+  const dimension_type new_num_columns = row_size + n;
+
+  if (new_num_columns <= row_capacity)
+    // We have enough capacity: we resize existing rows.
+    for (dimension_type i = num_rows; i-- > 0; )
+      rows[i].expand_within_capacity(new_num_columns);
+  else {
+    // Capacity exhausted: we must reallocate the rows and
+    // make sure all the rows have the same capacity.
+    const dimension_type new_row_capacity
+      = compute_capacity(new_num_columns, max_num_columns());
+    assert(new_row_capacity <= max_num_columns());
+    for (dimension_type i = num_rows; i-- > 0; ) {
+      Row new_row(rows[i], new_num_columns, new_row_capacity);
+      std::swap(rows[i], new_row);
+    }
+    row_capacity = new_row_capacity;
+  }
+  // Rows have been expanded.
+  row_size = new_num_columns;
+}
+
+void
+PPL::Matrix::add_zero_rows_and_columns(const dimension_type n,
+				       const dimension_type m,
+				       Row::Flags row_flags) {
+  assert(n > 0);
+  assert(n <= max_num_rows() - num_rows());
+  assert(m > 0);
+  assert(m <= max_num_columns() - num_columns());
+  const dimension_type old_num_rows = rows.size();
+  const dimension_type new_num_rows = old_num_rows + n;
+  const dimension_type new_num_columns = row_size + m;
+
+  if (new_num_columns <= row_capacity) {
+    // We can recycle the old rows.
+    if (rows.capacity() < new_num_rows) {
+      // Reallocation will take place.
+      std::vector<Row> new_rows;
+      new_rows.reserve(compute_capacity(new_num_rows, max_num_rows()));
+      new_rows.insert(new_rows.end(), new_num_rows, Row());
+      // Construct the new rows.
+      dimension_type i = new_num_rows;
+      while (i-- > old_num_rows)
+	new_rows[i].construct(new_num_columns, row_capacity, row_flags);
+      // Expand and steal the old rows.
+      ++i;
+      while (i-- > 0) {
+	rows[i].expand_within_capacity(new_num_columns);
+	new_rows[i].swap(rows[i]);
+      }
+      // Put the new vector into place.
+      std::swap(rows, new_rows);
+    }
+    else {
+      // Reallocation will NOT take place.
+      rows.insert(rows.end(), n, Row());
+      // Construct the new rows.
+      dimension_type i = new_num_rows;
+      while (i-- > old_num_rows)
+	rows[i].construct(new_num_columns, row_capacity, row_flags);
+      // Expand the old rows.
+      ++i;
+      while (i-- > 0)
+	rows[i].expand_within_capacity(new_num_columns);
+    }
+    row_size = new_num_columns;
+  }
+  else {
+    // We cannot even recycle the old rows.
+    Matrix new_matrix;
+    new_matrix.rows.reserve(compute_capacity(new_num_rows, max_num_rows()));
+    new_matrix.rows.insert(new_matrix.rows.end(), new_num_rows, Row());
+    // Construct the new rows.
+    new_matrix.row_size = new_num_columns;
+    new_matrix.row_capacity = compute_capacity(new_num_columns,
+					       max_num_columns());
+    dimension_type i = new_num_rows;
+    while (i-- > old_num_rows)
+      new_matrix.rows[i].construct(new_matrix.row_size,
+				   new_matrix.row_capacity,
+				   row_flags);
+    // Copy the old rows.
+    ++i;
+    while (i-- > 0) {
+      Row new_row(rows[i],
+		  new_matrix.row_size,
+		  new_matrix.row_capacity);
+      std::swap(new_matrix.rows[i], new_row);
+    }
+    // Put the new vector into place.
+    swap(new_matrix);
+  }
+}
+
+void
+PPL::Matrix::add_recycled_row(Row& y) {
+  // The added row must have the same size and capacity as the
+  // existing rows of the system.
+  assert(y.OK(row_size, row_capacity));
+  const dimension_type new_rows_size = rows.size() + 1;
+  if (rows.capacity() < new_rows_size) {
+    // Reallocation will take place.
+    std::vector<Row> new_rows;
+    new_rows.reserve(compute_capacity(new_rows_size, max_num_rows()));
+    new_rows.insert(new_rows.end(), new_rows_size, Row());
+    // Put the new row in place.
+    dimension_type i = new_rows_size-1;
+    std::swap(new_rows[i], y);
+    // Steal the old rows.
+    while (i-- > 0)
+      new_rows[i].swap(rows[i]);
+    // Put the new rows into place.
+    std::swap(rows, new_rows);
+  }
+  else
+    // Reallocation will NOT take place.
+    // Inserts a new empty row at the end,
+    // then substitutes it with a copy of the given row.
+    std::swap(*rows.insert(rows.end(), Row()), y);
+
+  assert(OK());
+}
+
+void
+PPL::Matrix::resize_no_copy(const dimension_type new_n_rows,
+			    const dimension_type new_n_columns,
+			    Row::Flags row_flags) {
+  dimension_type old_n_rows = rows.size();
+  // Note that, if we have `new_n_rows <= old_n_rows' and
+  // `new_n_columns >= row_size', the matrix will keep its sortedness.
+  // This is obvious if `new_n_columns == row_size'.
+  // If `new_n_columns > row_size', then sortedness is maintained
+  // because trailing zeroes will be added to all rows.
+  if (new_n_rows > old_n_rows) {
+    if (new_n_columns <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+	// Reallocation (of vector `rows') will take place.
+	std::vector<Row> new_rows;
+	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+	new_rows.insert(new_rows.end(), new_n_rows, Row());
+	// Construct the new rows (be careful: each new row must have
+	// the same capacity as each one of the old rows).
+	dimension_type i = new_n_rows;
+	while (i-- > old_n_rows)
+	  new_rows[i].construct(new_n_columns, row_capacity, row_flags);
+	// Steal the old rows.
+	++i;
+	while (i-- > 0)
+	  new_rows[i].swap(rows[i]);
+	// Put the new vector into place.
+	std::swap(rows, new_rows);
+      }
+      else {
+	// Reallocation (of vector `rows') will NOT take place.
+	rows.insert(rows.end(), new_n_rows - old_n_rows, Row());
+	// Be careful: each new row must have
+	// the same capacity as each one of the old rows.
+	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+	  rows[i].construct(new_n_columns, row_capacity, row_flags);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows: allocate a new matrix and swap.
+      Matrix new_matrix(new_n_rows, new_n_columns, row_flags);
+      swap(new_matrix);
+      return;
+    }
+  }
+  else if (new_n_rows < old_n_rows) {
+    // Drop some rows.
+    rows.erase(rows.begin() + new_n_rows, rows.end());
+    old_n_rows = new_n_rows;
+  }
+  // Here we have the right number of rows.
+  if (new_n_columns != row_size) {
+    if (new_n_columns < row_size) {
+      // Shrink the existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+	rows[i].shrink(new_n_columns);
+    }
+    else
+      // We need more columns.
+      if (new_n_columns <= row_capacity)
+	// But we have enough capacity: we resize existing rows.
+	for (dimension_type i = old_n_rows; i-- > 0; )
+	  rows[i].expand_within_capacity(new_n_columns);
+      else {
+	// Capacity exhausted: we must reallocate the rows and
+	// make sure all the rows have the same capacity.
+	const dimension_type new_row_capacity
+	  = compute_capacity(new_n_columns, max_num_columns());
+	for (dimension_type i = old_n_rows; i-- > 0; ) {
+	  Row new_row(new_n_columns, new_row_capacity, row_flags);
+	  std::swap(rows[i], new_row);
+	}
+	row_capacity = new_row_capacity;
+      }
+    // Rows have grown or shrunk.
+    row_size = new_n_columns;
+  }
+}
+
+void
+PPL::Matrix::ascii_dump(std::ostream& s) const {
+  const Matrix& x = *this;
+  dimension_type x_num_rows = x.num_rows();
+  dimension_type x_num_columns = x.num_columns();
+  s << x_num_rows << " x " << x_num_columns << "\n";
+  for (dimension_type i = 0; i < x_num_rows; ++i)
+    x[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Matrix);
+
+bool
+PPL::Matrix::ascii_load(std::istream& s) {
+  Matrix& x = *this;
+  std::string str;
+  dimension_type x_num_rows;
+  dimension_type x_num_cols;
+  if (!(s >> x_num_rows))
+    return false;
+  if (!(s >> str) || (str.compare("x") != 0))
+    return false;
+  if (!(s >> x_num_cols))
+    return false;
+
+  resize_no_copy(x_num_rows, x_num_cols, Row::Flags());
+
+  for (dimension_type row = 0; row < x_num_rows; ++row)
+    if (!x[row].ascii_load(s))
+      return false;
+
+  // Check for well-formedness.
+  assert(OK());
+  return true;
+}
+
+void
+PPL::Matrix::swap_columns(const dimension_type i, const dimension_type j) {
+  assert(i != j && i < num_columns() && j < num_columns());
+  for (dimension_type k = num_rows(); k-- > 0; ) {
+    Row& rows_k = rows[k];
+    std::swap(rows_k[i], rows_k[j]);
+  }
+}
+
+void
+PPL::Matrix::remove_trailing_columns(const dimension_type n) {
+  assert(n > 0);
+  assert(n <= row_size);
+  row_size -= n;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    rows[i].shrink(row_size);
+}
+
+void
+PPL::Matrix::permute_columns(const std::vector<dimension_type>& cycles) {
+  TEMP_INTEGER(tmp);
+  const dimension_type n = cycles.size();
+  assert(cycles[n - 1] == 0);
+  for (dimension_type k = num_rows(); k-- > 0; ) {
+    Row& rows_k = rows[k];
+    for (dimension_type i = 0, j = 0; i < n; i = ++j) {
+      // Make `j' be the index of the next cycle terminator.
+      while (cycles[j] != 0)
+	++j;
+      // Cycles of length less than 2 are not allowed.
+      assert(j - i >= 2);
+      if (j - i == 2)
+	// For cycles of length 2 no temporary is needed, just a swap.
+	std::swap(rows_k[cycles[i]], rows_k[cycles[i+1]]);
+      else {
+	// Longer cycles need a temporary.
+	std::swap(rows_k[cycles[j-1]], tmp);
+	for (dimension_type l = j-1; l > i; --l)
+	  std::swap(rows_k[cycles[l-1]], rows_k[cycles[l]]);
+	std::swap(tmp, rows_k[cycles[i]]);
+      }
+    }
+  }
+}
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+bool
+PPL::operator==(const Matrix& x, const Matrix& y) {
+  if (x.num_columns() != y.num_columns())
+    return false;
+  const dimension_type x_num_rows = x.num_rows();
+  const dimension_type y_num_rows = y.num_rows();
+  if (x_num_rows != y_num_rows)
+    return false;
+  for (dimension_type i = x_num_rows; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+PPL::memory_size_type
+PPL::Matrix::external_memory_in_bytes() const {
+  memory_size_type n = rows.capacity() * sizeof(Row);
+  for (dimension_type i = num_rows(); i-- > 0; )
+    n += rows[i].external_memory_in_bytes(row_capacity);
+  return n;
+}
+
+bool
+PPL::Matrix::OK() const {
+  if (row_size > row_capacity) {
+#ifndef NDEBUG
+    std::cerr << "Matrix completely broken: "
+	      << "row_capacity is " << row_capacity
+	      << ", row_size is " << row_size
+	      << std::endl;
+#endif
+    return false;
+  }
+
+  const Matrix& x = *this;
+  for (dimension_type i = 0, n_rows = num_rows(); i < n_rows; ++i)
+    if (!x[i].OK(row_size, row_capacity))
+      return false;
+
+  // All checks passed.
+  return true;
+}
diff --git a/src/Matrix.defs.hh b/src/Matrix.defs.hh
new file mode 100644
index 0000000..bb6ce48
--- /dev/null
+++ b/src/Matrix.defs.hh
@@ -0,0 +1,356 @@
+/* Matrix class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Matrix_defs_hh
+#define PPL_Matrix_defs_hh 1
+
+#include "Matrix.types.hh"
+#include "Row.defs.hh"
+#include "Constraint_System.types.hh"
+#include "Generator_System.types.hh"
+#include "Coefficient.types.hh"
+#include <vector>
+#include <cstddef>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A 2-dimensional matrix of coefficients.
+/*! \ingroup PPL_CXX_interface
+  A Matrix object is a sequence of Row objects and is characterized
+  by the matrix dimensions (the number of rows and columns).
+  All the rows in a matrix, besides having the same size (corresponding
+  to the number of columns of the matrix), are also bound to have the
+  same capacity.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Matrix {
+public:
+  //! Returns the maximum number of rows of a Matrix.
+  static dimension_type max_num_rows();
+
+  //! Returns the maximum number of columns of a Matrix.
+  static dimension_type max_num_columns();
+
+  //! Builds an empty matrix.
+  /*!
+    Rows' size and capacity are initialized to \f$0\f$.
+  */
+  Matrix();
+
+  //! Builds a zero matrix with specified dimensions and flags.
+  /*!
+    \param n_rows
+    The number of rows of the matrix that will be created;
+
+    \param n_columns
+    The number of columns of the matrix that will be created.
+
+    \param row_flags
+    The flags used to build the rows of the matrix;
+    by default, the rows will have all flags unset.
+  */
+  Matrix(dimension_type n_rows, dimension_type n_columns,
+	 Row::Flags row_flags = Row::Flags());
+
+  //! Copy-constructor.
+  Matrix(const Matrix& y);
+
+  //! Destructor.
+  ~Matrix();
+
+  //! Assignment operator.
+  Matrix& operator=(const Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! An iterator over a matrix.
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each row contained in a Matrix object.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  class const_iterator {
+  private:
+    typedef std::vector<Row>::const_iterator Iter;
+    //! The const iterator on the rows' vector \p rows.
+    Iter i;
+
+  public:
+    typedef std::forward_iterator_tag iterator_category;
+    typedef std::iterator_traits<Iter>::value_type value_type;
+    typedef std::iterator_traits<Iter>::difference_type difference_type;
+    typedef std::iterator_traits<Iter>::pointer pointer;
+    typedef std::iterator_traits<Iter>::reference reference;
+
+    //! Default constructor.
+    const_iterator();
+
+    /*! \brief
+      Builds a const iterator on the matrix starting from
+      an iterator \p b on the elements of the vector \p rows.
+    */
+    explicit const_iterator(const Iter& b);
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    reference operator*() const;
+
+    //! Indirect member selector.
+    pointer operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first row, if \p *this is
+    not empty; otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  // FIXME: the following section must become private.
+protected:
+  //! Contains the rows of the matrix.
+  std::vector<Row> rows;
+
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
+
+  //! Capacity allocated for each row.
+  dimension_type row_capacity;
+
+public:
+  //! Swaps \p *this with \p y.
+  void swap(Matrix& y);
+
+  //! Adds to the matrix \p n rows of zeroes with flags set to \p row_flags.
+  /*!
+    \param n
+    The number of rows to be added: must be strictly positive.
+
+    \param row_flags
+    Flags for the newly added rows.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+n) \times c\f$ matrix \f$M \choose 0\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_zero_rows(dimension_type n, Row::Flags row_flags);
+
+  //! Adds \p n columns of zeroes to the matrix.
+  /*!
+    \param n
+    The number of columns to be added: must be strictly positive.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$r \times (c+n)\f$ matrix \f$(M \, 0)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_zero_columns(dimension_type n);
+
+  //! Adds \p n rows and \p m columns of zeroes to the matrix.
+  /*!
+    \param n
+    The number of rows to be added: must be strictly positive.
+
+    \param m
+    The number of columns to be added: must be strictly positive.
+
+    \param row_flags
+    Flags for the newly added rows.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+n) \times (c+m)\f$ matrix
+    \f$\bigl({M \atop 0}{0 \atop 0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_zero_rows_and_columns(dimension_type n, dimension_type m,
+				 Row::Flags row_flags);
+
+  //! Adds a copy of the row \p y to the matrix.
+  /*!
+    \param y
+    The row to be copied: it must have the same number of columns as
+    the matrix.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+1) \times c\f$ matrix
+    \f$\bigl({M \atop 0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_row(const Row& y);
+
+  //! Adds the row \p y to the matrix.
+  /*!
+    \param y
+    The row to be added: it must have the same size and capacity as \p
+    *this.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+1) \times c\f$ matrix
+    \f$\bigl({M \atop 0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_recycled_row(Row& y);
+
+  //! Makes the matrix shrink by removing its \p n trailing columns.
+  void remove_trailing_columns(dimension_type n);
+
+  //! Resizes the matrix without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows of the resized matrix;
+
+    \param new_n_columns
+    The number of columns of the resized matrix.
+
+    \param row_flags
+    The flags of the rows eventually added to the matrix.
+
+    The matrix is expanded to the specified dimensions avoiding
+    reallocation whenever possible.
+    The contents of the original matrix is lost.
+  */
+  void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns,
+		      Row::Flags row_flags);
+
+  //! Swaps the columns having indexes \p i and \p j.
+  void swap_columns(dimension_type i,  dimension_type j);
+
+  //! Permutes the columns of the matrix.
+  /*
+    \param cycles
+    A vector representing the non-trivial cycles of the permutation
+    according to which the columns must be rearranged.
+
+    The \p cycles vector contains, one after the other, the
+    non-trivial cycles (i.e., the cycles of length greater than one)
+    of a permutation of non-zero column indexes.  Each cycle is
+    terminated by zero.  For example, assuming the matrix has 6
+    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+    turn can be represented by a vector of 6 elements containing 1, 3,
+    6, 0, 2, 4, 0.
+  */
+  void permute_columns(const std::vector<dimension_type>& cycles);
+
+  //! \name Accessors
+  //@{
+
+  //! Returns the number of columns of the matrix (i.e., the size of the rows).
+  dimension_type num_columns() const;
+
+  //! Returns the number of rows in the matrix.
+  dimension_type num_rows() const;
+  //@} // Accessors
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the \p k-th row of the matrix.
+  Row& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the matrix.
+  const Row& operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  //! Clears the matrix deallocating all its rows.
+  void clear();
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
+    <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Erases from the matrix all the rows but those having
+    an index less than \p first_to_erase.
+  */
+  void erase_to_end(dimension_type first_to_erase);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Specializes <CODE>std::swap</CODE>.
+  /*! \relates Parma_Polyhedra_Library::Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Matrix& x,
+	  Parma_Polyhedra_Library::Matrix& y);
+
+} // namespace std
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator==(const Matrix& x, const Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator!=(const Matrix& x, const Matrix& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Matrix.inlines.hh"
+
+#endif // !defined(PPL_Matrix_defs_hh)
diff --git a/src/Matrix.inlines.hh b/src/Matrix.inlines.hh
new file mode 100644
index 0000000..1eeb38c
--- /dev/null
+++ b/src/Matrix.inlines.hh
@@ -0,0 +1,213 @@
+/* Matrix class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Matrix_inlines_hh
+#define PPL_Matrix_inlines_hh 1
+
+#include "globals.defs.hh"
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Matrix::max_num_rows() {
+  return std::vector<Row>().max_size();
+}
+
+inline dimension_type
+Matrix::max_num_columns() {
+  return Row::max_size();
+}
+
+inline memory_size_type
+Matrix::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline
+Matrix::const_iterator::const_iterator()
+  : i(Iter()) {
+}
+
+inline
+Matrix::const_iterator::const_iterator(const Iter& b)
+  : i(b) {
+}
+
+inline
+Matrix::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i) {
+}
+
+inline Matrix::const_iterator&
+Matrix::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  return *this;
+}
+
+inline Matrix::const_iterator::reference
+Matrix::const_iterator::operator*() const {
+  return *i;
+}
+
+inline Matrix::const_iterator::pointer
+Matrix::const_iterator::operator->() const {
+  return &*i;
+}
+
+inline Matrix::const_iterator&
+Matrix::const_iterator::operator++() {
+  ++i;
+  return *this;
+}
+
+inline Matrix::const_iterator
+Matrix::const_iterator::operator++(int) {
+  return const_iterator(i++);
+}
+
+inline bool
+Matrix::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Matrix::const_iterator::operator!=(const const_iterator& y) const {
+  return !operator==(y);
+}
+
+inline Matrix::const_iterator
+Matrix::begin() const {
+  return const_iterator(rows.begin());
+}
+
+inline Matrix::const_iterator
+Matrix::end() const {
+  return const_iterator(rows.end());
+}
+
+inline void
+Matrix::swap(Matrix& y) {
+  std::swap(rows, y.rows);
+  std::swap(row_size, y.row_size);
+  std::swap(row_capacity, y.row_capacity);
+}
+
+inline
+Matrix::Matrix()
+  : rows(),
+    row_size(0),
+    row_capacity(0) {
+}
+
+inline
+Matrix::Matrix(const Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+}
+
+inline
+Matrix::~Matrix() {
+}
+
+inline Matrix&
+Matrix::operator=(const Matrix& y) {
+  // Without the following guard against auto-assignments we would
+  // recompute the row capacity based on row size, possibly without
+  // actually increasing the capacity of the rows.  This would lead to
+  // an inconsistent state.
+  if (this != &y) {
+    // The following assignment may do nothing on auto-assignments...
+    rows = y.rows;
+    row_size = y.row_size;
+    // ... hence the following assignment must not be done on
+    // auto-assignments.
+    row_capacity = compute_capacity(y.row_size, max_num_columns());
+  }
+  return *this;
+}
+
+inline void
+Matrix::add_row(const Row& y) {
+  Row new_row(y, row_capacity);
+  add_recycled_row(new_row);
+}
+
+inline Row&
+Matrix::operator[](const dimension_type k) {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+inline const Row&
+Matrix::operator[](const dimension_type k) const {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+inline dimension_type
+Matrix::num_rows() const {
+  return rows.size();
+}
+
+inline dimension_type
+Matrix::num_columns() const {
+  return row_size;
+}
+
+/*! \relates Matrix */
+inline bool
+operator!=(const Matrix& x, const Matrix& y) {
+  return !(x == y);
+}
+
+inline void
+Matrix::erase_to_end(const dimension_type first_to_erase) {
+  assert(first_to_erase <= rows.size());
+  if (first_to_erase < rows.size())
+    rows.erase(rows.begin() + first_to_erase, rows.end());
+}
+
+inline void
+Matrix::clear() {
+  // Clear `rows' and minimize its capacity.
+  std::vector<Row>().swap(rows);
+  row_size = 0;
+  row_capacity = 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+inline void
+swap(Parma_Polyhedra_Library::Matrix& x,
+     Parma_Polyhedra_Library::Matrix& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Matrix_inlines_hh)
diff --git a/src/Matrix.types.hh b/src/Matrix.types.hh
new file mode 100644
index 0000000..0871cc9
--- /dev/null
+++ b/src/Matrix.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Matrix_types_hh
+#define PPL_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Matrix_types_hh)
diff --git a/src/NNC_Polyhedron.cc b/src/NNC_Polyhedron.cc
new file mode 100644
index 0000000..6106113
--- /dev/null
+++ b/src/NNC_Polyhedron.cc
@@ -0,0 +1,66 @@
+/* NNC_Polyhedron class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "NNC_Polyhedron.defs.hh"
+#include "C_Polyhedron.defs.hh"
+#include "algorithms.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(const C_Polyhedron& y)
+  : Polyhedron(NOT_NECESSARILY_CLOSED, y.space_dimension(), UNIVERSE) {
+  add_constraints(y.constraints());
+  assert(OK());
+}
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(const Congruence_System& cgs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       cgs.space_dimension() <= max_space_dimension()
+	       ? cgs.space_dimension()
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(cgs)",
+						 "the space dimension of cgs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+	       UNIVERSE) {
+  add_congruences(cgs);
+}
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(Congruence_System& cgs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       cgs.space_dimension() <= max_space_dimension()
+	       ? cgs.space_dimension()
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(cgs)",
+						 "the space dimension of cgs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), 0),
+	       UNIVERSE) {
+  add_congruences(cgs);
+}
+
+bool
+PPL::NNC_Polyhedron::poly_hull_assign_if_exact(const NNC_Polyhedron& y) {
+  return PPL::poly_hull_assign_if_exact(*this, y);
+}
diff --git a/src/NNC_Polyhedron.defs.hh b/src/NNC_Polyhedron.defs.hh
new file mode 100644
index 0000000..f2f1a15
--- /dev/null
+++ b/src/NNC_Polyhedron.defs.hh
@@ -0,0 +1,187 @@
+/* NNC_Polyhedron class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_NNC_Polyhedron_defs_hh
+#define PPL_NNC_Polyhedron_defs_hh 1
+
+#include "C_Polyhedron.types.hh"
+#include "NNC_Polyhedron.types.hh"
+#include "Polyhedron.defs.hh"
+
+//! A not necessarily closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+    An object of the class NNC_Polyhedron represents a
+    <EM>not necessarily closed</EM> (NNC) convex polyhedron
+    in the vector space \f$\Rset^n\f$.
+
+    \note
+    Since NNC polyhedra are a generalization of closed polyhedra,
+    any object of the class C_Polyhedron can be (explicitly) converted
+    into an object of the class NNC_Polyhedron.
+    The reason for defining two different classes is that objects of
+    the class C_Polyhedron are characterized by a more efficient
+    implementation, requiring less time and memory resources.
+*/
+class Parma_Polyhedra_Library::NNC_Polyhedron : public Polyhedron {
+public:
+  //! Builds either the universe or the empty NNC polyhedron.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the NNC polyhedron;
+
+    \param kind
+    Specifies whether a universe or an empty NNC polyhedron should be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+
+    Both parameters are optional:
+    by default, a 0-dimension space universe NNC polyhedron is built.
+  */
+  explicit NNC_Polyhedron(dimension_type num_dimensions = 0,
+			  Degenerate_Element kind = UNIVERSE);
+
+  //! Builds an NNC polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.
+  */
+  explicit NNC_Polyhedron(const Constraint_System& cs);
+
+  //! Builds an NNC polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+  */
+  explicit NNC_Polyhedron(Constraint_System& cs);
+
+  //! Builds an NNC polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit NNC_Polyhedron(const Generator_System& gs);
+
+  //! Builds an NNC polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit NNC_Polyhedron(Generator_System& gs);
+
+  //! Builds an NNC polyhedron from a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+  */
+  explicit NNC_Polyhedron(const Congruence_System& cgs);
+
+  //! Builds an NNC polyhedron recycling a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence
+    system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+  */
+  explicit NNC_Polyhedron(Congruence_System& cgs);
+
+  //! Builds an NNC polyhedron from the C polyhedron \p y.
+  explicit NNC_Polyhedron(const C_Polyhedron& y);
+
+  //! Builds an NNC polyhedron out of a generic, interval-based bounding box.
+  /*!
+    For a description of the methods that should be provided by
+    the template class Box, see the documentation of the protected method:
+      template \<typename Box\>
+      Polyhedron::Polyhedron(Topology topol, const Box& box);
+
+    \param box
+    The bounding box representing the polyhedron to be built;
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one from the other
+    constructors.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum allowed
+    space dimension.
+  */
+  template <typename Box>
+  NNC_Polyhedron(const Box& box, From_Bounding_Box dummy);
+
+  //! Ordinary copy-constructor.
+  NNC_Polyhedron(const NNC_Polyhedron& y);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  NNC_Polyhedron& operator=(const NNC_Polyhedron& y);
+
+  //! Assigns to \p *this the C polyhedron \p y.
+  NNC_Polyhedron& operator=(const C_Polyhedron& y);
+
+  //! Destructor.
+  ~NNC_Polyhedron();
+
+  /*! \brief
+    If the poly-hull of \p *this and \p y is exact it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool poly_hull_assign_if_exact(const NNC_Polyhedron& y);
+
+  //! Same as poly_hull_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const NNC_Polyhedron& y);
+};
+
+#include "NNC_Polyhedron.inlines.hh"
+
+#endif // !defined(PPL_NNC_Polyhedron_defs_hh)
diff --git a/src/NNC_Polyhedron.inlines.hh b/src/NNC_Polyhedron.inlines.hh
new file mode 100644
index 0000000..7c27be6
--- /dev/null
+++ b/src/NNC_Polyhedron.inlines.hh
@@ -0,0 +1,134 @@
+/* NNC_Polyhedron class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_NNC_Polyhedron_inlines_hh
+#define PPL_NNC_Polyhedron_inlines_hh 1
+
+#include "C_Polyhedron.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(dimension_type num_dimensions,
+			       Degenerate_Element kind)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       num_dimensions <= max_space_dimension()
+	       ? num_dimensions
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(n, k)",
+						 "n exceeds the maximum "
+						 "allowed space dimension"),
+		  num_dimensions),
+	       kind) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       cs.space_dimension() <= max_space_dimension()
+	       ? cs
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(cs)",
+						 "the space dimension of cs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), cs)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       cs.space_dimension() <= max_space_dimension()
+	       ? cs
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(cs)",
+						 "the space dimension of cs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), cs)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       gs.space_dimension() <= max_space_dimension()
+	       ? gs
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(gs)",
+						 "the space dimension of gs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), gs)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       gs.space_dimension() <= max_space_dimension()
+	       ? gs
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(gs)",
+						 "the space dimension of gs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), gs)) {
+}
+
+template <typename Box>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Box& box, From_Bounding_Box)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       box.space_dimension() <= max_space_dimension()
+	       ? box
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(box)",
+						 "the space dimension of box "
+						 "exceeds the maximum allowed "
+						 "space dimension"), box)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const NNC_Polyhedron& y)
+  : Polyhedron(y) {
+}
+
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const NNC_Polyhedron& y) {
+  Polyhedron::operator=(y);
+  return *this;
+}
+
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const C_Polyhedron& y) {
+  NNC_Polyhedron nnc_y(y);
+  swap(nnc_y);
+  return *this;
+}
+
+inline
+NNC_Polyhedron::~NNC_Polyhedron() {
+}
+
+inline bool
+NNC_Polyhedron::upper_bound_assign_if_exact(const NNC_Polyhedron& y) {
+  return poly_hull_assign_if_exact(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_NNC_Polyhedron_inlines_hh)
diff --git a/src/NNC_Polyhedron.types.hh b/src/NNC_Polyhedron.types.hh
new file mode 100644
index 0000000..cd415c5
--- /dev/null
+++ b/src/NNC_Polyhedron.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_NNC_Polyhedron_types_hh
+#define PPL_NNC_Polyhedron_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class NNC_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_NNC_Polyhedron_types_hh)
diff --git a/src/Numeric_Format.defs.hh b/src/Numeric_Format.defs.hh
new file mode 100644
index 0000000..fc84c3b
--- /dev/null
+++ b/src/Numeric_Format.defs.hh
@@ -0,0 +1,37 @@
+/* Numeric format.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Numeric_Format_defs_hh
+#define PPL_Numeric_Format_defs_hh 1
+
+#include "Result.defs.hh"
+#include "fpu.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+class Numeric_Format {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Float_defs_hh)
+
diff --git a/src/Ph_Status.cc b/src/Ph_Status.cc
new file mode 100644
index 0000000..1557cff
--- /dev/null
+++ b/src/Ph_Status.cc
@@ -0,0 +1,245 @@
+/* Polyhedron::Status class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Polyhedron.defs.hh"
+#include <iostream>
+#include <string>
+#include <cassert>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+// These are the keywords that indicate the individual assertions.
+const char* zero_dim_univ = "ZE";
+const char* empty = "EM";
+const char* consys_min = "CM";
+const char* gensys_min = "GM";
+const char* consys_upd = "CS";
+const char* gensys_upd = "GS";
+const char* satc_upd = "SC";
+const char* satg_upd = "SG";
+const char* consys_pending = "CP";
+const char* gensys_pending = "GP";
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron::Status
+  Reads a keyword and its associated on/off, +/- flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+bool
+get_field(std::istream& s, const char* keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != '+' && str[0] != '-')
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == '+');
+  return true;
+}
+
+} // namespace
+
+void
+PPL::Polyhedron::Status::ascii_dump(std::ostream& s) const {
+  s << (test_zero_dim_univ() ? '+' : '-') << zero_dim_univ << ' '
+    << (test_empty() ? '+' : '-') << empty << ' '
+    << ' '
+    << (test_c_minimized() ? '+' : '-') << consys_min << ' '
+    << (test_g_minimized() ? '+' : '-') << gensys_min << ' '
+    << ' '
+    << (test_c_up_to_date() ? '+' : '-') << consys_upd << ' '
+    << (test_g_up_to_date() ? '+' : '-') << gensys_upd << ' '
+    << ' '
+    << (test_c_pending() ? '+' : '-') << consys_pending << ' '
+    << (test_g_pending() ? '+' : '-') << gensys_pending << ' '
+    << ' '
+    << (test_sat_c_up_to_date() ? '+' : '-') << satc_upd << ' '
+    << (test_sat_g_up_to_date() ? '+' : '-') << satg_upd << ' ';
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Polyhedron::Status);
+
+bool
+PPL::Polyhedron::Status::ascii_load(std::istream& s) {
+  bool positive;
+
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
+
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, consys_min, positive))
+    return false;
+  if (positive)
+    set_c_minimized();
+  else
+    reset_c_minimized();
+
+  if (!get_field(s, gensys_min, positive))
+    return false;
+  if (positive)
+    set_g_minimized();
+  else
+    reset_g_minimized();
+
+  if (!get_field(s, consys_upd, positive))
+    return false;
+  if (positive)
+    set_c_up_to_date();
+  else
+    reset_c_up_to_date();
+
+  if (!get_field(s, gensys_upd, positive))
+    return false;
+  if (positive)
+    set_g_up_to_date();
+  else
+    reset_g_up_to_date();
+
+  if (!get_field(s, consys_pending, positive))
+    return false;
+  if (positive)
+    set_c_pending();
+  else
+    reset_c_pending();
+
+  if (!get_field(s, gensys_pending, positive))
+    return false;
+  if (positive)
+    set_g_pending();
+  else
+    reset_g_pending();
+
+  if (!get_field(s, satc_upd, positive))
+    return false;
+  if (positive)
+    set_sat_c_up_to_date();
+  else
+    reset_sat_c_up_to_date();
+
+  if (!get_field(s, satg_upd, positive))
+    return false;
+  if (positive)
+    set_sat_g_up_to_date();
+  else
+    reset_sat_g_up_to_date();
+
+  // Check for well-formedness.
+  assert(OK());
+  return true;
+}
+
+bool
+PPL::Polyhedron::Status::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
+
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+    else {
+#ifndef NDEBUG
+      cerr << "The empty flag is incompatible with any other one."
+	   << endl;
+#endif
+      return false;
+    }
+  }
+
+  if ((test_sat_c_up_to_date() || test_sat_g_up_to_date())
+      && !(test_c_up_to_date() && test_g_up_to_date())) {
+#ifndef NDEBUG
+    cerr <<
+      "If a saturation matrix is up-to-date, constraints and\n"
+      "generators have to be both up-to-date."
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (test_c_minimized() && !test_c_up_to_date()) {
+#ifndef NDEBUG
+    cerr << "If constraints are minimized they must be up-to-date."
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (test_g_minimized() && !test_g_up_to_date()) {
+#ifndef NDEBUG
+    cerr << "If generators are minimized they must be up-to-date."
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (test_c_pending() && test_g_pending()) {
+#ifndef NDEBUG
+    cerr << "There cannot be both pending constraints and pending generators."
+	 << endl;
+#endif
+    return false;
+  }
+
+  if (test_c_pending() || test_g_pending()) {
+    if (!test_c_minimized() || !test_g_minimized()) {
+#ifndef NDEBUG
+    cerr <<
+      "If there are pending constraints or generators, constraints\n"
+      "and generators must be minimized."
+	 << endl;
+#endif
+      return false;
+    }
+
+    if (!test_sat_c_up_to_date() && !test_sat_g_up_to_date()) {
+#ifndef NDEBUG
+    cerr <<
+      "If there are pending constraints or generators, there must\n"
+      "be at least a saturation matrix up-to-date."
+	 << endl;
+#endif
+      return false;
+    }
+  }
+
+  // Any other case is OK.
+  return true;
+}
diff --git a/src/Ph_Status.idefs.hh b/src/Ph_Status.idefs.hh
new file mode 100644
index 0000000..c0e03d5
--- /dev/null
+++ b/src/Ph_Status.idefs.hh
@@ -0,0 +1,182 @@
+/* Polyhedron::Status class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Status_defs_hh
+#define PPL_Status_defs_hh 1
+
+#ifndef PPL_IN_Polyhedron_CLASS
+#error "Do not include Ph_Status.idefs.hh directly; use Polyhedron.defs.hh instead."
+#endif
+
+//! A conjunctive assertion about a polyhedron.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimension
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the polyhedron is the empty set;
+  - <EM>constraints pending</EM>: the polyhedron is correctly
+    characterized by the attached system of constraints, which is
+    split in two non-empty subsets: the already processed constraints,
+    which are in minimal form, and the pending constraints, which
+    still have to be processed and may thus be inconsistent or
+    contain redundancies;
+  - <EM>generators pending</EM>: the polyhedron is correctly
+    characterized by the attached system of generators, which is
+    split in two non-empty subsets: the already processed generators,
+    which are in minimal form, and the pending generators, which still
+    have to be processed and may thus contain redundancies;
+  - <EM>constraints up-to-date</EM>: the polyhedron is correctly
+    characterized by the attached system of constraints, modulo the
+    processing of pending generators;
+  - <EM>generators up-to-date</EM>: the polyhedron is correctly
+    characterized by the attached system of generators, modulo the
+    processing of pending constraints;
+  - <EM>constraints minimized</EM>: the non-pending part of the system
+    of constraints attached to the polyhedron is in minimal form;
+  - <EM>generators minimized</EM>: the non-pending part of the system
+    of generators attached to the polyhedron is in minimal form;
+  - <EM>constraints' saturation matrix up-to-date</EM>: the attached
+    saturation matrix having rows indexed by non-pending generators and
+    columns indexed by non-pending constraints correctly expresses
+    the saturation relation between the attached non-pending constraints
+    and generators;
+  - <EM>generators' saturation matrix up-to-date</EM>: the attached
+    saturation matrix having rows indexed by non-pending constraints and
+    columns indexed by non-pending generators correctly expresses
+    the saturation relation between the attached non-pending constraints
+    and generators;
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>constraints pending</EM> and <EM>generators pending</EM>
+    are mutually exclusive;
+  - <EM>constraints pending</EM> implies both <EM>constraints minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>generators pending</EM> implies both <EM>constraints minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>constraints minimized</EM> implies <EM>constraints up-to-date</EM>;
+  - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+  - <EM>constraints' saturation matrix up-to-date</EM> implies both
+    <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>;
+  - <EM>generators' saturation matrix up-to-date</EM> implies both
+    <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_c_up_to_date() const;
+  void reset_c_up_to_date();
+  void set_c_up_to_date();
+
+  bool test_g_up_to_date() const;
+  void reset_g_up_to_date();
+  void set_g_up_to_date();
+
+  bool test_c_minimized() const;
+  void reset_c_minimized();
+  void set_c_minimized();
+
+  bool test_g_minimized() const;
+  void reset_g_minimized();
+  void set_g_minimized();
+
+  bool test_sat_c_up_to_date() const;
+  void reset_sat_c_up_to_date();
+  void set_sat_c_up_to_date();
+
+  bool test_sat_g_up_to_date() const;
+  void reset_sat_g_up_to_date();
+  void set_sat_g_up_to_date();
+
+  bool test_c_pending() const;
+  void reset_c_pending();
+  void set_c_pending();
+
+  bool test_g_pending() const;
+  void reset_g_pending();
+  void set_g_pending();
+  //@} // Test, remove or add an individual assertion from the conjunction
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
+    <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t ZERO_DIM_UNIV    = 0U;
+  static const flags_t EMPTY            = 1U << 0;
+  static const flags_t C_UP_TO_DATE     = 1U << 1;
+  static const flags_t G_UP_TO_DATE     = 1U << 2;
+  static const flags_t C_MINIMIZED      = 1U << 3;
+  static const flags_t G_MINIMIZED      = 1U << 4;
+  static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+  static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+  static const flags_t CS_PENDING       = 1U << 7;
+  static const flags_t GS_PENDING       = 1U << 8;
+  //@} // Bit-masks for the individual assertions
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+#endif // !defined(PPL_Status_defs_hh)
diff --git a/src/Ph_Status.inlines.hh b/src/Ph_Status.inlines.hh
new file mode 100644
index 0000000..2eddc51
--- /dev/null
+++ b/src/Ph_Status.inlines.hh
@@ -0,0 +1,216 @@
+/* Polyhedron::Status class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Status_inlines_hh
+#define PPL_Status_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Polyhedron::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+inline
+Polyhedron::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+inline bool
+Polyhedron::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+inline bool
+Polyhedron::Status::test_any(flags_t mask) const {
+  return flags & mask;
+}
+
+inline void
+Polyhedron::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+inline void
+Polyhedron::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+inline bool
+Polyhedron::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+inline void
+Polyhedron::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+inline void
+Polyhedron::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+inline bool
+Polyhedron::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+inline void
+Polyhedron::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+inline void
+Polyhedron::Status::set_empty() {
+  flags = EMPTY;
+}
+
+inline bool
+Polyhedron::Status::test_c_up_to_date() const {
+  return test_any(C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_c_up_to_date() {
+  reset(C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_c_up_to_date() {
+  set(C_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_g_up_to_date() const {
+  return test_any(G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_g_up_to_date() {
+  reset(G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_g_up_to_date() {
+  set(G_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_c_minimized() const {
+  return test_any(C_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::reset_c_minimized() {
+  reset(C_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::set_c_minimized() {
+  set(C_MINIMIZED);
+}
+
+inline bool
+Polyhedron::Status::test_g_minimized() const {
+  return test_any(G_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::reset_g_minimized() {
+  reset(G_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::set_g_minimized() {
+  set(G_MINIMIZED);
+}
+
+
+inline bool
+Polyhedron::Status::test_c_pending() const {
+  return test_any(CS_PENDING);
+}
+
+inline void
+Polyhedron::Status::reset_c_pending() {
+  reset(CS_PENDING);
+}
+
+inline void
+Polyhedron::Status::set_c_pending() {
+  set(CS_PENDING);
+}
+
+inline bool
+Polyhedron::Status::test_g_pending() const {
+  return test_any(GS_PENDING);
+}
+
+inline void
+Polyhedron::Status::reset_g_pending() {
+  reset(GS_PENDING);
+}
+
+inline void
+Polyhedron::Status::set_g_pending() {
+  set(GS_PENDING);
+}
+
+
+inline bool
+Polyhedron::Status::test_sat_c_up_to_date() const {
+  return test_any(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_sat_c_up_to_date() {
+  reset(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_sat_c_up_to_date() {
+  set(SAT_C_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_sat_g_up_to_date() const {
+  return test_any(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_sat_g_up_to_date() {
+  reset(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_sat_g_up_to_date() {
+  set(SAT_G_UP_TO_DATE);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Status_inlines_hh)
diff --git a/src/Poly_Con_Relation.cc b/src/Poly_Con_Relation.cc
new file mode 100644
index 0000000..a67f8d9
--- /dev/null
+++ b/src/Poly_Con_Relation.cc
@@ -0,0 +1,77 @@
+/* Poly_Con_Relation class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Poly_Con_Relation.defs.hh"
+
+#include <iostream>
+#include <string>
+#include <cassert>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Poly_Con_Relation::ascii_dump(std::ostream& s) const {
+  flags_t f = flags;
+  if (f == NOTHING) {
+    s << "NOTHING";
+    return;
+  }
+
+  while (true) {
+    if (implies(f, IS_DISJOINT)) {
+      s << "IS_DISJOINT";
+      f &= ~IS_DISJOINT;
+    }
+    else if (implies(f, STRICTLY_INTERSECTS)) {
+      s << "STRICTLY_INTERSECTS";
+      f &= ~STRICTLY_INTERSECTS;
+    }
+    else if (implies(f, IS_INCLUDED)) {
+      s << "IS_INCLUDED";
+      f &= ~IS_INCLUDED;
+    }
+    else if (implies(f, SATURATES)) {
+      s << "SATURATES";
+      f &= ~SATURATES;
+    }
+    if (f != NOTHING)
+      s << " & ";
+    else
+      break;
+  }
+}
+
+PPL_OUTPUT_DEFINITIONS(Poly_Con_Relation);
+
+/*! \relates Parma_Polyhedra_Library::Poly_Con_Relation */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Poly_Con_Relation& r) {
+  r.ascii_dump(s);
+  return s;
+}
+
+bool
+PPL::Poly_Con_Relation::OK() const {
+  return true;
+}
diff --git a/src/Poly_Con_Relation.defs.hh b/src/Poly_Con_Relation.defs.hh
new file mode 100644
index 0000000..2b885a4
--- /dev/null
+++ b/src/Poly_Con_Relation.defs.hh
@@ -0,0 +1,170 @@
+/* Poly_Con_Relation class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Poly_Con_Relation_defs_hh
+#define PPL_Poly_Con_Relation_defs_hh 1
+
+#include "Poly_Con_Relation.types.hh"
+#include "globals.defs.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Con_Relation */
+Poly_Con_Relation operator&&(const Poly_Con_Relation& x,
+			     const Poly_Con_Relation& y);
+
+/*! \brief
+  Yields the assertion with all the conjuncts of \p x
+  that are not in \p y.
+
+  \relates Poly_Con_Relation
+*/
+Poly_Con_Relation operator-(const Poly_Con_Relation& x,
+			    const Poly_Con_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Con_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a constraint.
+/*! \ingroup PPL_CXX_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a constraint.
+*/
+class Parma_Polyhedra_Library::Poly_Con_Relation {
+private:
+  //! Poly_Con_Relation is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t NOTHING             = 0U;
+  static const flags_t IS_DISJOINT         = 1U << 0;
+  static const flags_t STRICTLY_INTERSECTS = 1U << 1;
+  static const flags_t IS_INCLUDED         = 1U << 2;
+  static const flags_t SATURATES           = 1U << 3;
+  //@} // Bit-masks for the individual assertions
+
+  //! All assertions together.
+  static const flags_t EVERYTHING
+  = IS_DISJOINT
+  | STRICTLY_INTERSECTS
+  | IS_INCLUDED
+  | SATURATES;
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! True if and only if the conjunction \p x implies the conjunction \p y.
+  static bool implies(flags_t x, flags_t y);
+
+  //! Construct from a bit-mask.
+  Poly_Con_Relation(flags_t mask);
+
+  friend bool
+  Parma_Polyhedra_Library::operator==(const Poly_Con_Relation& x,
+				      const Poly_Con_Relation& y);
+
+  friend bool
+  Parma_Polyhedra_Library::operator!=(const Poly_Con_Relation& x,
+				      const Poly_Con_Relation& y);
+
+  friend Poly_Con_Relation
+  Parma_Polyhedra_Library::operator&&(const Poly_Con_Relation& x,
+				      const Poly_Con_Relation& y);
+
+  friend Poly_Con_Relation
+  Parma_Polyhedra_Library::operator-(const Poly_Con_Relation& x,
+				     const Poly_Con_Relation& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::
+  IO_Operators::operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Access the internal flags: this is needed for some foreign
+    language interfaces.
+  */
+#endif
+  flags_t get_flags() const;
+
+public:
+  //! The assertion that says nothing.
+  static Poly_Con_Relation nothing();
+
+  /*! \brief
+    The polyhedron and the set of points satisfying
+    the constraint are disjoint.
+  */
+  static Poly_Con_Relation is_disjoint();
+
+  /*! \brief
+    The polyhedron intersects the set of points satisfying
+    the constraint, but it is not included in it.
+  */
+  static Poly_Con_Relation strictly_intersects();
+
+  /*! \brief
+    The polyhedron is included in the set of points satisfying
+    the constraint.
+  */
+  static Poly_Con_Relation is_included();
+
+  /*! \brief
+    The polyhedron is included in the set of points saturating
+    the constraint.
+  */
+  static Poly_Con_Relation saturates();
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  //! True if and only if \p *this implies \p y.
+  bool implies(const Poly_Con_Relation& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+#include "Poly_Con_Relation.inlines.hh"
+
+#endif // !defined(PPL_Poly_Con_Relation_defs_hh)
diff --git a/src/Poly_Con_Relation.inlines.hh b/src/Poly_Con_Relation.inlines.hh
new file mode 100644
index 0000000..b0432af
--- /dev/null
+++ b/src/Poly_Con_Relation.inlines.hh
@@ -0,0 +1,99 @@
+/* Poly_Con_Relation class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Poly_Con_Relation_inlines_hh
+#define PPL_Poly_Con_Relation_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Con_Relation::Poly_Con_Relation(flags_t mask)
+  : flags(mask) {
+}
+
+inline Poly_Con_Relation::flags_t
+Poly_Con_Relation::get_flags() const {
+  return flags;
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::nothing() {
+  return Poly_Con_Relation(NOTHING);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_disjoint() {
+  return Poly_Con_Relation(IS_DISJOINT);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::strictly_intersects() {
+  return Poly_Con_Relation(STRICTLY_INTERSECTS);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_included() {
+  return Poly_Con_Relation(IS_INCLUDED);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::saturates() {
+  return Poly_Con_Relation(SATURATES);
+}
+
+inline bool
+Poly_Con_Relation::implies(flags_t x, flags_t y) {
+  return (x & y) == y;
+}
+
+inline bool
+Poly_Con_Relation::implies(const Poly_Con_Relation& y) const {
+  return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return x.flags == y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return x.flags != y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return Poly_Con_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return Poly_Con_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Poly_Con_Relation_inlines_hh)
diff --git a/src/Poly_Con_Relation.types.hh b/src/Poly_Con_Relation.types.hh
new file mode 100644
index 0000000..70b12ac
--- /dev/null
+++ b/src/Poly_Con_Relation.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Poly_Con_Relation_types_hh
+#define PPL_Poly_Con_Relation_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Con_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Poly_Con_Relation_types_hh)
diff --git a/src/Poly_Gen_Relation.cc b/src/Poly_Gen_Relation.cc
new file mode 100644
index 0000000..5a0d4ef
--- /dev/null
+++ b/src/Poly_Gen_Relation.cc
@@ -0,0 +1,65 @@
+/* Poly_Gen_Relation class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Poly_Gen_Relation.defs.hh"
+
+#include <iostream>
+#include <string>
+#include <cassert>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Poly_Gen_Relation::ascii_dump(std::ostream& s) const {
+  flags_t f = flags;
+  if (f == NOTHING) {
+    s << "NOTHING";
+    return;
+  }
+
+  while (true) {
+    if (implies(f, SUBSUMES)) {
+      s << "SUBSUMES";
+      f &= ~SUBSUMES;
+    }
+    if (f != NOTHING)
+      s << " & ";
+    else
+      break;
+  }
+}
+
+PPL_OUTPUT_DEFINITIONS(Poly_Gen_Relation);
+
+/*! \relates Parma_Polyhedra_Library::Poly_Gen_Relation */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Poly_Gen_Relation& r) {
+  r.ascii_dump(s);
+  return s;
+}
+
+bool
+PPL::Poly_Gen_Relation::OK() const {
+  return true;
+}
diff --git a/src/Poly_Gen_Relation.defs.hh b/src/Poly_Gen_Relation.defs.hh
new file mode 100644
index 0000000..8a6ade3
--- /dev/null
+++ b/src/Poly_Gen_Relation.defs.hh
@@ -0,0 +1,143 @@
+/* Poly_Gen_Relation class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Poly_Gen_Relation_defs_hh
+#define PPL_Poly_Gen_Relation_defs_hh 1
+
+#include "Poly_Gen_Relation.types.hh"
+#include "globals.defs.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Gen_Relation */
+Poly_Gen_Relation operator&&(const Poly_Gen_Relation& x,
+			     const Poly_Gen_Relation& y);
+
+/*! \brief
+  Yields the assertion with all the conjuncts of \p x
+  that are not in \p y.
+
+  \relates Poly_Gen_Relation
+*/
+Poly_Gen_Relation operator-(const Poly_Gen_Relation& x,
+			    const Poly_Gen_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Gen_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a generator
+/*! \ingroup PPL_CXX_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a generator.
+*/
+class Parma_Polyhedra_Library::Poly_Gen_Relation {
+private:
+  //! Poly_Gen_Relation is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t NOTHING  = 0U;
+  static const flags_t SUBSUMES = 1U << 0;
+  //@} // Bit-masks for the individual assertions
+
+  //! All assertions together.
+  static const flags_t EVERYTHING
+  = SUBSUMES;
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! True if and only if the conjunction \p x implies the conjunction \p y.
+  static bool implies(flags_t x, flags_t y);
+
+  //! Construct from a bit-mask.
+  Poly_Gen_Relation(flags_t mask);
+
+  friend bool
+  Parma_Polyhedra_Library::operator==(const Poly_Gen_Relation& x,
+				      const Poly_Gen_Relation& y);
+
+  friend bool
+  Parma_Polyhedra_Library::operator!=(const Poly_Gen_Relation& x,
+				      const Poly_Gen_Relation& y);
+
+  friend Poly_Gen_Relation
+  Parma_Polyhedra_Library::operator&&(const Poly_Gen_Relation& x,
+				      const Poly_Gen_Relation& y);
+
+  friend Poly_Gen_Relation
+  Parma_Polyhedra_Library::operator-(const Poly_Gen_Relation& x,
+				     const Poly_Gen_Relation& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::
+  IO_Operators::operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Access the internal flags: this is needed for some foreign
+    language interfaces.
+  */
+#endif
+  flags_t get_flags() const;
+
+public:
+  //! The assertion that says nothing.
+  static Poly_Gen_Relation nothing();
+
+  //! Adding the generator would not change the polyhedron.
+  static Poly_Gen_Relation subsumes();
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  //! True if and only if \p *this implies \p y.
+  bool implies(const Poly_Gen_Relation& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+#include "Poly_Gen_Relation.inlines.hh"
+
+#endif // !defined(PPL_Poly_Gen_Relation_defs_hh)
diff --git a/src/Poly_Gen_Relation.inlines.hh b/src/Poly_Gen_Relation.inlines.hh
new file mode 100644
index 0000000..a6b34d3
--- /dev/null
+++ b/src/Poly_Gen_Relation.inlines.hh
@@ -0,0 +1,84 @@
+/* Poly_Gen_Relation class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Poly_Gen_Relation_inlines_hh
+#define PPL_Poly_Gen_Relation_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Gen_Relation::Poly_Gen_Relation(flags_t mask)
+  : flags(mask) {
+}
+
+inline Poly_Gen_Relation::flags_t
+Poly_Gen_Relation::get_flags() const {
+  return flags;
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::nothing() {
+  return Poly_Gen_Relation(NOTHING);
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::subsumes() {
+  return Poly_Gen_Relation(SUBSUMES);
+}
+
+inline bool
+Poly_Gen_Relation::implies(flags_t x, flags_t y) {
+  return (x & y) == y;
+}
+
+inline bool
+Poly_Gen_Relation::implies(const Poly_Gen_Relation& y) const {
+  return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return x.flags == y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return x.flags != y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return Poly_Gen_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return Poly_Gen_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Poly_Gen_Relation_inlines_hh)
diff --git a/src/Poly_Gen_Relation.types.hh b/src/Poly_Gen_Relation.types.hh
new file mode 100644
index 0000000..ffc3ac9
--- /dev/null
+++ b/src/Poly_Gen_Relation.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Poly_Gen_Relation_types_hh
+#define PPL_Poly_Gen_Relation_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Gen_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Poly_Gen_Relation_types_hh)
diff --git a/src/Polyhedra_Powerset.cc b/src/Polyhedra_Powerset.cc
new file mode 100644
index 0000000..eda0b73
--- /dev/null
+++ b/src/Polyhedra_Powerset.cc
@@ -0,0 +1,143 @@
+/* Polyhedra_Powerset class implementation: non-inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "Polyhedra_Powerset.defs.hh"
+#include <utility>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+// FIXME: Commented out so as to avoid a bug in GCC 3.3.3.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+// template <>
+// template <>
+// PPL::Polyhedra_Powerset<PPL::NNC_Polyhedron>
+// ::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
+//   : Base(), space_dim(y.space_dimension()) {
+//   Polyhedra_Powerset& x = *this;
+//   for (Polyhedra_Powerset<C_Polyhedron>::const_iterator i = y.begin(),
+// 	 y_end = y.end(); i != y_end; ++i)
+//     x.sequence.push_back(Determinate<NNC_Polyhedron>(
+//                            NNC_Polyhedron(i->element()))
+// 			 );
+//   x.reduced = y.reduced;
+//   assert(x.OK());
+// }
+
+// FIXME: Commented out so as to avoid a bug in GCC 3.3.3.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+// template <>
+// template <>
+// PPL::Polyhedra_Powerset<PPL::C_Polyhedron>
+// ::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y)
+//   : Base(), space_dim(y.space_dimension()) {
+//   Polyhedra_Powerset& x = *this;
+//   for (Polyhedra_Powerset<NNC_Polyhedron>::const_iterator i = y.begin(),
+// 	 y_end = y.end(); i != y_end; ++i)
+//     x.sequence.push_back(Determinate<C_Polyhedron>(
+//                            C_Polyhedron(i->element()))
+// 			 );
+//   // Note: this might be non-reduced even when `y' is known to be
+//   // omega-reduced, because the constructor of C_Polyhedron, by
+//   // enforcing topological closure, may have made different elements
+//   // comparable.
+//   x.reduced = false;
+//   assert(x.OK());
+// }
+
+template <>
+void
+PPL::Polyhedra_Powerset<PPL::NNC_Polyhedron>
+::poly_difference_assign(const Polyhedra_Powerset& y) {
+  Polyhedra_Powerset& x = *this;
+  // Ensure omega-reduction.
+  x.omega_reduce();
+  y.omega_reduce();
+  Sequence new_sequence = x.sequence;
+  for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi) {
+    const NNC_Polyhedron& py = yi->element();
+    Sequence tmp_sequence;
+    for (Sequence_const_iterator nsi = new_sequence.begin(),
+	   ns_end = new_sequence.end(); nsi != ns_end; ++nsi) {
+      std::pair<NNC_Polyhedron, Polyhedra_Powerset<NNC_Polyhedron> > partition
+	= linear_partition(py, nsi->element());
+      const Polyhedra_Powerset<NNC_Polyhedron>& residues = partition.second;
+      // Append the contents of `residues' to `tmp_sequence'.
+      std::copy(residues.begin(), residues.end(), back_inserter(tmp_sequence));
+    }
+    std::swap(tmp_sequence, new_sequence);
+  }
+  std::swap(x.sequence, new_sequence);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <>
+bool
+PPL::Polyhedra_Powerset<PPL::NNC_Polyhedron>
+::geometrically_covers(const Polyhedra_Powerset& y) const {
+  const Polyhedra_Powerset& x = *this;
+  for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi)
+    if (!check_containment(yi->element(), x))
+      return false;
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
+bool
+PPL::check_containment(const NNC_Polyhedron& ph,
+		       const Polyhedra_Powerset<NNC_Polyhedron>& ps) {
+  Polyhedra_Powerset<NNC_Polyhedron> tmp(ph.space_dimension(), EMPTY);
+  tmp.add_disjunct(ph);
+  for (Polyhedra_Powerset<NNC_Polyhedron>::const_iterator
+	 i = ps.begin(), ps_end = ps.end(); i != ps_end; ++i) {
+    const NNC_Polyhedron& pi = i->element();
+    for (Polyhedra_Powerset<NNC_Polyhedron>::iterator
+	   j = tmp.begin(); j != tmp.end(); ) {
+      const NNC_Polyhedron& pj = j->element();
+      if (pi.contains(pj))
+	j = tmp.drop_disjunct(j);
+      else
+	++j;
+    }
+    if (tmp.empty())
+      return true;
+    else {
+      Polyhedra_Powerset<NNC_Polyhedron> new_disjuncts(ph.space_dimension(),
+						       EMPTY);
+      for (Polyhedra_Powerset<NNC_Polyhedron>::iterator
+	     j = tmp.begin(); j != tmp.end(); ) {
+	const NNC_Polyhedron& pj = j->element();
+	if (pj.is_disjoint_from(pi))
+	  ++j;
+	else {
+	  std::pair<NNC_Polyhedron, Polyhedra_Powerset<NNC_Polyhedron> >
+	    partition = linear_partition(pi, pj);
+	  new_disjuncts.upper_bound_assign(partition.second);
+	  j = tmp.drop_disjunct(j);
+	}
+      }
+      tmp.upper_bound_assign(new_disjuncts);
+    }
+  }
+  return false;
+}
diff --git a/src/Polyhedra_Powerset.defs.hh b/src/Polyhedra_Powerset.defs.hh
new file mode 100644
index 0000000..e0341e4
--- /dev/null
+++ b/src/Polyhedra_Powerset.defs.hh
@@ -0,0 +1,553 @@
+/* Polyhedra_Powerset class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Polyhedra_Powerset_defs_hh
+#define PPL_Polyhedra_Powerset_defs_hh
+
+#include "Polyhedra_Powerset.types.hh"
+#include "globals.defs.hh"
+#include "BHRZ03_Certificate.types.hh"
+#include "Constraint.types.hh"
+#include "Constraint_System.types.hh"
+#include "Congruence.types.hh"
+#include "Congruence_System.types.hh"
+#include "C_Polyhedron.types.hh"
+#include "NNC_Polyhedron.types.hh"
+#include "Polyhedron.defs.hh"
+#include "Variable.defs.hh"
+#include "Determinate.defs.hh"
+#include "Powerset.defs.hh"
+#include <iosfwd>
+#include <list>
+#include <map>
+
+//! The powerset construction instantiated on PPL polyhedra.
+/*! \ingroup PPL_CXX_interface */
+template <typename PH>
+class Parma_Polyhedra_Library::Polyhedra_Powerset
+  : public Parma_Polyhedra_Library::Powerset
+<Parma_Polyhedra_Library::Determinate<PH> > {
+public:
+  typedef PH element_type;
+
+private:
+  typedef Determinate<PH> CS;
+  typedef Powerset<CS> Base;
+
+public:
+  //! Returns the maximum space dimension a Polyhedra_Powerset<PH> can handle.
+  static dimension_type max_space_dimension();
+
+  //! \name Constructors
+  //@{
+
+  //! Builds a universe (top) or empty (bottom) Polyhedra_Powerset.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the powerset;
+
+    \param kind
+    Specifies whether the universe or the empty powerset has to be built.
+  */
+  explicit
+  Polyhedra_Powerset(dimension_type num_dimensions = 0,
+		     Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy-constructor.
+  Polyhedra_Powerset(const Polyhedra_Powerset& y);
+
+  /*! \brief
+    If \p ph is nonempty, builds a powerset containing only \p ph.
+    Builds the empty powerset otherwise.
+  */
+  explicit Polyhedra_Powerset(const PH& ph);
+
+  /*! \brief
+    Copy-constructor allowing a source powerset with elements of a
+    different polyhedron kind.
+  */
+  template <typename QH>
+  explicit Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+
+  /*! \brief
+    Creates a Polyhedra_Powerset with a single polyhedron
+    with the same information contents as \p cs.
+  */
+  explicit Polyhedra_Powerset(const Constraint_System& cs);
+
+  //! Creates a Polyhedra_Powerset with a single polyhedron
+  //! with the same information contents as \p cgs.
+  explicit Polyhedra_Powerset(const Congruence_System& cgs);
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Powerset of Polyhedra
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this geometrically
+    covers \p y, i.e., if any point (in some element) of \p y is also
+    a point (of some element) of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    This may be <EM>really</EM> expensive!
+  */
+  bool geometrically_covers(const Polyhedra_Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is geometrically
+    equal to \p y, i.e., if (the elements of) \p *this and \p y
+    contain the same set of points.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    This may be <EM>really</EM> expensive!
+  */
+  bool geometrically_equals(const Polyhedra_Powerset& y) const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} // Member Functions that Do Not Modify the Powerset
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Powerset of Polyhedra
+  //@{
+
+  //! Adds to \p *this the disjunct \p ph.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p ph are dimension-incompatible.
+  */
+  void add_disjunct(const PH& ph);
+
+  //! Intersects \p *this with constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  //! Intersects \p *this with the constraint \p c, minimizing the result.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool add_constraint_and_minimize(const Constraint& c);
+
+  //! Intersects \p *this with the constraints in \p cs.
+  /*!
+    \param cs
+    The constraints to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Intersects \p *this with the constraints in \p cs,
+    minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    The constraints to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool add_constraints_and_minimize(const Constraint_System& cs);
+
+  /*! \brief
+    Assign to \p *this the result of (recursively) merging together
+    the pairs of polyhedra whose poly-hull is the same as their
+    set-theoretical union.
+
+    On exit, for all the pairs \f$\cP\f$, \f$\cQ\f$ of different polyhedra
+    in \p *this, we have \f$\cP \uplus \cQ \neq \cP \union \cQ\f$.
+  */
+  void pairwise_reduce();
+
+  /*! \brief
+    Assigns to \p *this the result of applying the
+    \ref pps_bgp99_extrapolation "BGP99 extrapolation operator"
+    to \p *this and \p y, using the widening function \p wf
+    and the cardinality threshold \p max_disjuncts.
+
+    \param y
+    A finite powerset of polyhedra.
+    It <EM>must</EM> definitely entail \p *this;
+
+    \param wf
+    The widening function to be used on polyhedra objects. It is obtained
+    from the corresponding widening method by using the helper function
+    Parma_Polyhedra_Library::widen_fun_ref. Legal values are, e.g.,
+    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>;
+
+    \param max_disjuncts
+    The maximum number of disjuncts occurring in the powerset \p *this
+    <EM>before</EM> starting the computation. If this number is exceeded,
+    some of the disjuncts in \p *this are collapsed (i.e., joined together).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+
+    For a description of the extrapolation operator,
+    see \ref BGP99 "[BGP99]" and \ref BHZ03b "[BHZ03b]".
+  */
+  template <typename Widening>
+  void BGP99_extrapolation_assign(const Polyhedra_Powerset& y,
+				  Widening wf,
+				  unsigned max_disjuncts);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref pps_certificate_widening "BHZ03-widening"
+    between \p *this and \p y, using the widening function \p wf
+    certified by the convergence certificate \p Cert.
+
+    \param y
+    The finite powerset of polyhedra computed in the previous iteration step.
+    It <EM>must</EM> definitely entail \p *this;
+
+    \param wf
+    The widening function to be used on polyhedra objects.
+    It is obtained from the corresponding widening method by using
+    the helper function widen_fun_ref. Legal values are, e.g.,
+    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    In order to obtain a proper widening operator, the template parameter
+    \p Cert should be a finite convergence certificate for the base-level
+    widening function \p wf; otherwise, an extrapolation operator is
+    obtained.
+    For a description of the methods that should be provided
+    by \p Cert, see BHRZ03_Certificate or H79_Certificate.
+  */
+  template <typename Cert, typename Widening>
+  void BHZ03_widening_assign(const Polyhedra_Powerset& y, Widening wf);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  Polyhedra_Powerset& operator=(const Polyhedra_Powerset& y);
+
+  /*! \brief
+    Assignment operator allowing a source powerset with elements of a
+    different polyhedron kind
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  template <typename QH>
+  Polyhedra_Powerset& operator=(const Polyhedra_Powerset<QH>& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Polyhedra_Powerset& y);
+
+  /*! \brief
+    Adds \p m new dimensions to the vector space containing \p *this
+    and embeds each polyhedron in \p *this in the new space.
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the vector space containing \p *this
+    without embedding the polyhedra in \p *this in the new space.
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    The result is obtained by intersecting each polyhedron in \p *this
+    with each polyhedron in \p y and collecting all these intersections.
+  */
+  void intersection_assign(const Polyhedra_Powerset& y);
+
+  //! Assigns to \p *this the difference of \p *this and \p y.
+  /*!
+    The result is obtained by computing the
+    \ref Convex_Polyhedral_Difference "poly-difference" of each polyhedron
+    in \p *this with each polyhedron in \p y and collecting all these
+    differences.
+  */
+  void poly_difference_assign(const Polyhedra_Powerset& y);
+
+  //! Assigns to \p *this the concatenation of \p *this and \p y.
+  /*!
+    The result is obtained by computing the pairwise
+    \ref Concatenating_Polyhedra "concatenation" of each polyhedron
+    in \p *this with each polyhedron in \p y.
+  */
+  void concatenate_assign(const Polyhedra_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    The result is obtained by computing the pairwise
+    \ref Time_Elapse_Operator "time elapse" of each polyhedron
+    in \p *this with each polyhedron in \p y.
+  */
+  void time_elapse_assign(const Polyhedra_Powerset& y);
+
+  //! Removes all the specified space dimensions.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher space dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a partial function.
+
+    See also Polyhedron::map_space_dimensions.
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+public:
+  typedef typename Base::size_type size_type;
+  typedef typename Base::value_type value_type;
+  typedef typename Base::iterator iterator;
+  typedef typename Base::const_iterator const_iterator;
+  typedef typename Base::reverse_iterator reverse_iterator;
+  typedef typename Base::const_reverse_iterator const_reverse_iterator;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref
+    ascii_dump) and sets \p *this accordingly.  Returns <CODE>true</CODE>
+    if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+private:
+  typedef typename Base::Sequence Sequence;
+  typedef typename Base::Sequence_iterator Sequence_iterator;
+  typedef typename Base::Sequence_const_iterator Sequence_const_iterator;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  /*! \brief
+    Assigns to \p *this the result of applying the BGP99 heuristics
+    to \p *this and \p y, using the widening function \p wf.
+  */
+  template <typename Widening>
+  void BGP99_heuristics_assign(const Polyhedra_Powerset& y, Widening wf);
+
+  //! Records in \p cert_ms the certificates for this set of polyhedra.
+  template <typename Cert>
+  void collect_certificates(std::map<Cert, size_type,
+		                     typename Cert::Compare>& cert_ms) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the current set of polyhedra
+    is stabilizing with respect to the multiset of certificates \p y_cert_ms.
+  */
+  template <typename Cert>
+  bool is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+                                                   typename Cert::Compare>&
+				    y_cert_ms) const;
+
+  // FIXME: here it should be enough to befriend the templatic constructor
+  //   template <typename QH>
+  //   Polyhedra_Powerset(const Polyhedra_Powerset<QH>&)
+  // but, apparently, this cannot be done.
+  // As a workaround, we could use
+  //   friend class Polyhedra_Powerset<NNC_Polyhedron>
+  // but GCC 3.3.3 has a bug that causes its rejection.
+  // So, temporarily, we make all Polyhedra_Powerset's friends of each other.
+  template <typename QH> friend class Polyhedra_Powerset;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Partitions \p q with respect to \p p.
+/*! \relates Polyhedra_Powerset
+  Let \p p and \p q be two polyhedra.
+  The function returns an object <CODE>r</CODE> of type
+  <CODE>std::pair\<PH, Polyhedra_Powerset\<NNC_Polyhedron\> \></CODE>
+  such that
+  - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+  - <CODE>r.second</CODE> has the property that all its elements are
+    pairwise disjoint and disjoint from \p p;
+  - the union of <CODE>r.first</CODE> with all the elements of
+    <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE> is the
+    representation of a partition of \p q).
+
+  \if Include_Implementation_Details
+
+  See
+  <A HREF="http://www.cs.unipr.it/ppl/Documentation/bibliography#Srivastava93">
+  this paper</A> for more information about the implementation.
+  \endif
+*/
+template <typename PH>
+std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+linear_partition(const PH& p, const PH& q);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the NNC polyhedra in \p ps contains the NNC polyhedron \p ph.
+
+  \relates Polyhedra_Powerset
+*/
+bool
+check_containment(const NNC_Polyhedron& ph,
+		  const Polyhedra_Powerset<NNC_Polyhedron>& ps);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the objects in \p ps contains \p ph.
+
+  \relates Polyhedra_Powerset
+  \note
+  It is assumed that the template parameter PH can be converted
+  without precision loss into an NNC_Polyhedron; otherwise,
+  an incorrect result might be obtained.
+*/
+template <typename PH>
+bool
+check_containment(const PH& ph, const Polyhedra_Powerset<PH>& ps);
+
+// CHECK ME: according to the Intel compiler, the declaration of the
+// following specialization (of the class template parameter) should come
+// before the declaration of the corresponding full specialization
+// (where the member template parameter is specialized too).
+template <>
+template <typename QH>
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+
+// CHECK ME: according to the Intel compiler, the declaration of the
+// following specialization (of the class template parameter) should come
+// before the declaration of the corresponding full specialization
+// (where the member template parameter is specialized too).
+template <>
+template <typename QH>
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+
+// Non-inline full specializations should be declared here
+// so as to inhibit multiple instantiations of the generic template.
+template <>
+template <>
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y);
+
+template <>
+template <>
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y);
+
+template <>
+void
+Polyhedra_Powerset<NNC_Polyhedron>
+::poly_difference_assign(const Polyhedra_Powerset& y);
+
+template <>
+bool
+Polyhedra_Powerset<NNC_Polyhedron>
+::geometrically_covers(const Polyhedra_Powerset& y) const;
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
+template <typename PH>
+void swap(Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& x,
+	  Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& y);
+
+} // namespace std
+
+#include "Polyhedra_Powerset.inlines.hh"
+#include "Polyhedra_Powerset.templates.hh"
+
+#endif // !defined(PPL_Polyhedra_Powerset_defs_hh)
diff --git a/src/Polyhedra_Powerset.inlines.hh b/src/Polyhedra_Powerset.inlines.hh
new file mode 100644
index 0000000..5c1b615
--- /dev/null
+++ b/src/Polyhedra_Powerset.inlines.hh
@@ -0,0 +1,268 @@
+/* Polyhedra_Powerset class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Polyhedra_Powerset_inlines_hh
+#define PPL_Polyhedra_Powerset_inlines_hh 1
+
+#include "Constraint.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "Congruence.defs.hh"
+#include "Congruence_System.defs.hh"
+#include "Congruence_System.inlines.hh"
+#include "C_Polyhedron.defs.hh"
+#include "NNC_Polyhedron.defs.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+inline dimension_type
+Polyhedra_Powerset<PH>::space_dimension() const {
+  return space_dim;
+}
+
+template <typename PH>
+inline dimension_type
+Polyhedra_Powerset<PH>::max_space_dimension() {
+  return PH::max_space_dimension();
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(dimension_type num_dimensions,
+					   Degenerate_Element kind)
+  : Base(), space_dim(num_dimensions) {
+  Polyhedra_Powerset& x = *this;
+  if (kind == UNIVERSE)
+    x.sequence.push_back(Determinate<PH>(PH(num_dimensions, kind)));
+  assert(x.OK());
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Polyhedra_Powerset& y)
+  : Base(y), space_dim(y.space_dim) {
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const PH& ph)
+  : Base(ph), space_dim(ph.space_dimension()) {
+}
+
+// FIXME: This full specialization is declared inline and placed here
+// just as a workaround to a bug in GCC 3.3.3. In principle, it should
+// not be declared inline and moved in Polyhedra_Powerset.cc.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+template <>
+template <>
+inline
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
+  : Base(), space_dim(y.space_dimension()) {
+  Polyhedra_Powerset& x = *this;
+  for (Polyhedra_Powerset<C_Polyhedron>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<NNC_Polyhedron>(
+                           NNC_Polyhedron(i->element()))
+			 );
+  x.reduced = y.reduced;
+  assert(x.OK());
+}
+
+// FIXME: This full specialization is declared inline and placed here
+// just as a workaround to a bug in GCC 3.3.3. In principle, it should
+// not be declared inline and moved in Polyhedra_Powerset.cc.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+template <>
+template <>
+inline
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y)
+  : Base(), space_dim(y.space_dimension()) {
+  Polyhedra_Powerset& x = *this;
+  for (Polyhedra_Powerset<NNC_Polyhedron>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<C_Polyhedron>(
+                           C_Polyhedron(i->element()))
+			 );
+  // Note: this might be non-reduced even when `y' is known to be
+  // omega-reduced, because the constructor of C_Polyhedron, by
+  // enforcing topological closure, may have made different elements
+  // comparable.
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Constraint_System& cs)
+  // FIXME: calling Base(Determinate<PH>(cs)) will automatically handle
+  // the flag `reduced', but it will also force a non-emptiness test
+  // on the constraint system `cs'.
+  : Base(), space_dim(cs.space_dimension()) {
+  Polyhedra_Powerset& x = *this;
+  x.sequence.push_back(Determinate<PH>(cs));
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Congruence_System& cgs)
+  // FIXME: calling Base(Determinate<PH>(cgs)) will automatically handle
+  // the flag `reduced', but it will also force a non-emptiness test
+  // on the congruence system `cgs'.
+  : Base(), space_dim(cgs.space_dimension()) {
+  Polyhedra_Powerset& x = *this;
+  x.sequence.push_back(Determinate<PH>(cgs));
+  x.reduced = false;
+  assert(OK());
+}
+
+template <typename PH>
+inline Polyhedra_Powerset<PH>&
+Polyhedra_Powerset<PH>::operator=(const Polyhedra_Powerset& y) {
+  Polyhedra_Powerset& x = *this;
+  x.Base::operator=(y);
+  x.space_dim = y.space_dim;
+  return x;
+}
+
+template <typename PH>
+inline void
+Polyhedra_Powerset<PH>::swap(Polyhedra_Powerset& y) {
+  Polyhedra_Powerset& x = *this;
+  x.Base::swap(y);
+  std::swap(x.space_dim, y.space_dim);
+}
+
+template <typename PH>
+template <typename QH>
+inline Polyhedra_Powerset<PH>&
+Polyhedra_Powerset<PH>::operator=(const Polyhedra_Powerset<QH>& y) {
+  Polyhedra_Powerset& x = *this;
+  Polyhedra_Powerset<PH> pps(y);
+  x.swap(pps);
+  return x;
+}
+
+template <typename PH>
+inline void
+Polyhedra_Powerset<PH>::intersection_assign(const Polyhedra_Powerset& y) {
+  Polyhedra_Powerset& x = *this;
+  x.pairwise_apply_assign
+    (y, CS::lift_op_assign(std::mem_fun_ref(&PH::intersection_assign)));
+}
+
+template <typename PH>
+inline void
+Polyhedra_Powerset<PH>::time_elapse_assign(const Polyhedra_Powerset& y) {
+  Polyhedra_Powerset& x = *this;
+  x.pairwise_apply_assign
+    (y, CS::lift_op_assign(std::mem_fun_ref(&PH::time_elapse_assign)));
+}
+
+template <typename PH>
+inline bool
+Polyhedra_Powerset<PH>
+::geometrically_covers(const Polyhedra_Powerset& y) const {
+  const Polyhedra_Powerset<NNC_Polyhedron> xx(*this);
+  const Polyhedra_Powerset<NNC_Polyhedron> yy(y);
+  return xx.geometrically_covers(yy);
+}
+
+template <typename PH>
+inline bool
+Polyhedra_Powerset<PH>
+::geometrically_equals(const Polyhedra_Powerset& y) const {
+  const Polyhedra_Powerset<NNC_Polyhedron> xx(*this);
+  const Polyhedra_Powerset<NNC_Polyhedron> yy(y);
+  return xx.geometrically_covers(yy) && yy.geometrically_covers(xx);
+}
+
+template <>
+inline bool
+Polyhedra_Powerset<NNC_Polyhedron>
+::geometrically_equals(const Polyhedra_Powerset& y) const {
+  const Polyhedra_Powerset& x = *this;
+  return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <typename PH>
+inline memory_size_type
+Polyhedra_Powerset<PH>::external_memory_in_bytes() const {
+  return Base::external_memory_in_bytes();
+}
+
+template <typename PH>
+inline memory_size_type
+Polyhedra_Powerset<PH>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <>
+inline void
+Polyhedra_Powerset<C_Polyhedron>
+::poly_difference_assign(const Polyhedra_Powerset& y) {
+  Polyhedra_Powerset<NNC_Polyhedron> nnc_this(*this);
+  Polyhedra_Powerset<NNC_Polyhedron> nnc_y(y);
+  nnc_this.poly_difference_assign(nnc_y);
+  *this = nnc_this;
+}
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH>
+inline bool
+check_containment(const PH& ph, const Polyhedra_Powerset<PH>& ps) {
+  const NNC_Polyhedron pph = NNC_Polyhedron(ph.constraints());
+  const Polyhedra_Powerset<NNC_Polyhedron> pps(ps);
+  return check_containment(pph, pps);
+}
+
+/*! \relates Polyhedra_Powerset */
+template <>
+inline bool
+check_containment(const C_Polyhedron& ph,
+		  const Polyhedra_Powerset<C_Polyhedron>& ps) {
+  return check_containment(NNC_Polyhedron(ph),
+			   Polyhedra_Powerset<NNC_Polyhedron>(ps));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
+template <typename PH>
+inline void
+swap(Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& x,
+     Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Polyhedra_Powerset_inlines_hh)
diff --git a/src/Polyhedra_Powerset.templates.hh b/src/Polyhedra_Powerset.templates.hh
new file mode 100644
index 0000000..9616002
--- /dev/null
+++ b/src/Polyhedra_Powerset.templates.hh
@@ -0,0 +1,684 @@
+/* Polyhedra_Powerset class implementation: non-inline template functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Polyhedra_Powerset_templates_hh
+#define PPL_Polyhedra_Powerset_templates_hh 1
+
+#include "Constraint.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "C_Polyhedron.defs.hh"
+#include "NNC_Polyhedron.defs.hh"
+#include <algorithm>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_disjunct(const PH& ph) {
+  Polyhedra_Powerset& x = *this;
+  if (x.space_dimension() != ph.space_dimension()) {
+    std::ostringstream s;
+    s << "PPL::Polyhedra_Powerset<PH>::add_disjunct(ph):\n"
+      << "this->space_dimension() == " << x.space_dimension() << ", "
+      << "ph.space_dimension() == " << ph.space_dimension() << ".";
+    throw std::invalid_argument(s.str());
+  }
+  x.sequence.push_back(Determinate<PH>(ph));
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <>
+template <typename QH>
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y)
+  : Base(), space_dim(y.space_dimension()) {
+  Polyhedra_Powerset& x = *this;
+  for (typename Polyhedra_Powerset<QH>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<NNC_Polyhedron>(
+                           NNC_Polyhedron(i->element().constraints()))
+			 );
+  x.reduced = y.reduced;
+  assert(x.OK());
+}
+
+template <>
+template <typename QH>
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y)
+  : Base(), space_dim(y.space_dimension()) {
+  Polyhedra_Powerset& x = *this;
+  for (typename Polyhedra_Powerset<QH>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<C_Polyhedron>(
+                           C_Polyhedron(i->element().constraints()))
+			 );
+  // Note: this might be non-reduced even when `y' is known to be
+  // omega-reduced, because the constructor of C_Polyhedron, by
+  // enforcing topological closure, may have made different elements
+  // comparable.
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::concatenate_assign(const Polyhedra_Powerset& y) {
+  Polyhedra_Powerset& x = *this;
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  x.omega_reduce();
+  y.omega_reduce();
+  Polyhedra_Powerset<PH> new_x(x.space_dim + y.space_dim, EMPTY);
+  for (const_iterator xi = x.begin(), x_end = x.end(),
+	 y_begin = y.begin(), y_end = y.end(); xi != x_end; ) {
+    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+      CS zi = *xi;
+      zi.concatenate_assign(*yi);
+      assert(!zi.is_bottom());
+      new_x.sequence.push_back(zi);
+    }
+    ++xi;
+    if (abandon_expensive_computations && xi != x_end && y_begin != y_end) {
+      // Hurry up!
+      PH xph = xi->element();
+      for (++xi; xi != x_end; ++xi)
+	xph.upper_bound_assign(xi->element());
+      const_iterator yi = y_begin;
+      PH yph = yi->element();
+      for (++yi; yi != y_end; ++yi)
+	yph.upper_bound_assign(yi->element());
+      xph.concatenate_assign(yph);
+      x.swap(new_x);
+      x.add_disjunct(xph);
+      assert(x.OK());
+      return;
+    }
+  }
+  x.swap(new_x);
+  assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_constraint(const Constraint& c) {
+  Polyhedra_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_constraint(c);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::add_constraint_and_minimize(const Constraint& c) {
+  Polyhedra_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; )
+    if (!si->element().add_constraint_and_minimize(c))
+      si = x.sequence.erase(si);
+    else {
+      x.reduced = false;
+      ++si;
+    }
+  assert(x.OK());
+  return !x.empty();
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_constraints(const Constraint_System& cs) {
+  Polyhedra_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_constraints(cs);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::
+add_constraints_and_minimize(const Constraint_System& cs) {
+  Polyhedra_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; )
+    if (!si->element().add_constraints_and_minimize(cs))
+      si = x.sequence.erase(si);
+    else {
+      x.reduced = false;
+      ++si;
+    }
+  assert(x.OK());
+  return !x.empty();
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_space_dimensions_and_embed(dimension_type m) {
+  Polyhedra_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_space_dimensions_and_embed(m);
+  x.space_dim += m;
+  assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_space_dimensions_and_project(dimension_type m) {
+  Polyhedra_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_space_dimensions_and_project(m);
+  x.space_dim += m;
+  assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::
+remove_space_dimensions(const Variables_Set& to_be_removed) {
+  Polyhedra_Powerset& x = *this;
+  Variables_Set::size_type num_removed = to_be_removed.size();
+  if (num_removed > 0) {
+    for (Sequence_iterator si = x.sequence.begin(),
+	   s_end = x.sequence.end(); si != s_end; ++si) {
+      si->element().remove_space_dimensions(to_be_removed);
+      x.reduced = false;
+    }
+    x.space_dim -= num_removed;
+    assert(x.OK());
+  }
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::remove_higher_space_dimensions(dimension_type
+						       new_dimension) {
+  Polyhedra_Powerset& x = *this;
+  if (new_dimension < x.space_dim) {
+    for (Sequence_iterator si = x.sequence.begin(),
+	   s_end = x.sequence.end(); si != s_end; ++si) {
+      si->element().remove_higher_space_dimensions(new_dimension);
+      x.reduced = false;
+    }
+    x.space_dim = new_dimension;
+    assert(x.OK());
+  }
+}
+
+template <typename PH>
+template <typename Partial_Function>
+void
+Polyhedra_Powerset<PH>::map_space_dimensions(const Partial_Function& pfunc) {
+  Polyhedra_Powerset& x = *this;
+  if (x.is_bottom()) {
+    dimension_type n = 0;
+    for (dimension_type i = x.space_dim; i-- > 0; ) {
+      dimension_type new_i;
+      if (pfunc.maps(i, new_i))
+	++n;
+    }
+    x.space_dim = n;
+  }
+  else {
+    Sequence_iterator s_begin = x.sequence.begin();
+    for (Sequence_iterator si = s_begin,
+	   s_end = x.sequence.end(); si != s_end; ++si)
+      si->element().map_space_dimensions(pfunc);
+    x.space_dim = s_begin->element().space_dimension();
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::pairwise_reduce() {
+  Polyhedra_Powerset& x = *this;
+  // It is wise to omega-reduce before pairwise-reducing.
+  x.omega_reduce();
+
+  size_type n = x.size();
+  size_type deleted;
+  do {
+    Polyhedra_Powerset new_x(x.space_dim, EMPTY);
+    std::deque<bool> marked(n, false);
+    deleted = 0;
+    Sequence_iterator s_begin = x.sequence.begin();
+    Sequence_iterator s_end = x.sequence.end();
+    unsigned si_index = 0;
+    for (Sequence_iterator si = s_begin; si != s_end; ++si, ++si_index) {
+      if (marked[si_index])
+	continue;
+      PH& pi = si->element();
+      Sequence_const_iterator sj = si;
+      unsigned sj_index = si_index;
+      for (++sj, ++sj_index; sj != s_end; ++sj, ++sj_index) {
+	if (marked[sj_index])
+	  continue;
+	const PH& pj = sj->element();
+	if (pi.upper_bound_assign_if_exact(pj)) {
+	  marked[si_index] = marked[sj_index] = true;
+	  new_x.add_non_bottom_disjunct(pi);
+	  ++deleted;
+	  goto next;
+	}
+      }
+    next:
+      ;
+    }
+    iterator nx_begin = new_x.begin();
+    iterator nx_end = new_x.end();
+    unsigned xi_index = 0;
+    for (const_iterator xi = x.begin(),
+	   x_end = x.end(); xi != x_end; ++xi, ++xi_index)
+      if (!marked[xi_index])
+	nx_begin = new_x.add_non_bottom_disjunct(*xi, nx_begin, nx_end);
+    std::swap(x.sequence, new_x.sequence);
+    n -= deleted;
+  } while (deleted > 0);
+  assert(x.OK());
+}
+
+template <typename PH>
+template <typename Widening>
+void
+Polyhedra_Powerset<PH>::
+BGP99_heuristics_assign(const Polyhedra_Powerset& y, Widening wf) {
+  // `x' is the current iteration value.
+  Polyhedra_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Polyhedra_Powerset<PH> x_copy = x;
+    const Polyhedra_Powerset<PH> y_copy = y;
+    assert(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  size_type n = x.size();
+  Polyhedra_Powerset new_x(x.space_dim, EMPTY);
+  std::deque<bool> marked(n, false);
+  const_iterator x_begin = x.begin();
+  const_iterator x_end = x.end();
+  unsigned i_index = 0;
+  for (const_iterator i = x_begin,
+	 y_begin = y.begin(), y_end = y.end(); i != x_end; ++i, ++i_index)
+    for (const_iterator j = y_begin; j != y_end; ++j) {
+      const PH& pi = i->element();
+      const PH& pj = j->element();
+      if (pi.contains(pj)) {
+	PH pi_copy = pi;
+	wf(pi_copy, pj);
+	new_x.add_non_bottom_disjunct(pi_copy);
+	marked[i_index] = true;
+      }
+    }
+  iterator nx_begin = new_x.begin();
+  iterator nx_end = new_x.end();
+  i_index = 0;
+  for (const_iterator i = x_begin; i != x_end; ++i, ++i_index)
+    if (!marked[i_index])
+      nx_begin = new_x.add_non_bottom_disjunct(*i, nx_begin, nx_end);
+  std::swap(x.sequence, new_x.sequence);
+  assert(x.OK());
+  assert(x.is_omega_reduced());
+}
+
+template <typename PH>
+template <typename Widening>
+void
+Polyhedra_Powerset<PH>::
+BGP99_extrapolation_assign(const Polyhedra_Powerset& y,
+			   Widening wf,
+			   unsigned max_disjuncts) {
+  // `x' is the current iteration value.
+  Polyhedra_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Polyhedra_Powerset<PH> x_copy = x;
+    const Polyhedra_Powerset<PH> y_copy = y;
+    assert(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  x.pairwise_reduce();
+  if (max_disjuncts != 0)
+    x.collapse(max_disjuncts);
+  x.BGP99_heuristics_assign(y, wf);
+}
+
+template <typename PH>
+template <typename Cert>
+void
+Polyhedra_Powerset<PH>::
+collect_certificates(std::map<Cert, size_type,
+		              typename Cert::Compare>& cert_ms) const {
+  const Polyhedra_Powerset& x = *this;
+  assert(x.is_omega_reduced());
+  assert(cert_ms.size() == 0);
+  for (const_iterator i = x.begin(), end = x.end(); i != end; i++) {
+    Cert ph_cert(i->element());
+    ++cert_ms[ph_cert];
+  }
+}
+
+template <typename PH>
+template <typename Cert>
+bool
+Polyhedra_Powerset<PH>::
+is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+			                    typename Cert::Compare>& y_cert_ms
+			     ) const {
+  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+  Cert_Multiset x_cert_ms;
+  collect_certificates(x_cert_ms);
+  typename Cert_Multiset::const_iterator
+    xi = x_cert_ms.begin(),
+    xend = x_cert_ms.end(),
+    yi = y_cert_ms.begin(),
+    yend = y_cert_ms.end();
+  while (xi != xend && yi != yend) {
+    const Cert& xi_cert = xi->first;
+    const Cert& yi_cert = yi->first;
+    switch (xi_cert.compare(yi_cert)) {
+    case 0:
+      // xi_cert == yi_cert: check the number of multiset occurrences.
+      {
+	const size_type& xi_count = xi->second;
+	const size_type& yi_count = yi->second;
+	if (xi_count == yi_count) {
+	  // Same number of occurrences: compare the next pair.
+	  ++xi;
+	  ++yi;
+	}
+	else
+	  // Different number of occurrences: can decide ordering.
+	  return xi_count < yi_count;
+	break;
+      }
+    case 1:
+      // xi_cert > yi_cert: it is not stabilizing.
+      return false;
+
+    case -1:
+      // xi_cert < yi_cert: it is stabilizing.
+      return true;
+    }
+  }
+  // Here xi == xend or yi == yend.
+  // Stabilization is achieved if `y_cert_ms' still has other elements.
+  return yi != yend;
+}
+
+template <typename PH>
+template <typename Cert, typename Widening>
+void
+Polyhedra_Powerset<PH>::BHZ03_widening_assign(const Polyhedra_Powerset& y,
+					      Widening wf) {
+  // `x' is the current iteration value.
+  Polyhedra_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Polyhedra_Powerset<PH> x_copy = x;
+    const Polyhedra_Powerset<PH> y_copy = y;
+    assert(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  // First widening technique: do nothing.
+
+  // If `y' is the empty collection, do nothing.
+  assert(x.size() > 0);
+  if (y.size() == 0)
+    return;
+
+  // Compute the poly-hull of `x'.
+  PH x_hull(x.space_dim, EMPTY);
+  for (const_iterator i = x.begin(), x_end = x.end(); i != x_end; ++i)
+    x_hull.upper_bound_assign(i->element());
+
+  // Compute the poly-hull of `y'.
+  PH y_hull(y.space_dim, EMPTY);
+  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+    y_hull.upper_bound_assign(i->element());
+  // Compute the certificate for `y_hull'.
+  const Cert y_hull_cert(y_hull);
+
+  // If the hull is stabilizing, do nothing.
+  int hull_stabilization = y_hull_cert.compare(x_hull);
+  if (hull_stabilization == 1)
+    return;
+
+  // Multiset ordering is only useful when `y' is not a singleton.
+  const bool y_is_not_a_singleton = y.size() > 1;
+
+  // The multiset certificate for `y':
+  // we want to be lazy about its computation.
+  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+  Cert_Multiset y_cert_ms;
+  bool y_cert_ms_computed = false;
+
+  if (hull_stabilization == 0 && y_is_not_a_singleton) {
+    // Collect the multiset certificate for `y'.
+    y.collect_certificates(y_cert_ms);
+    y_cert_ms_computed = true;
+    // If multiset ordering is stabilizing, do nothing.
+    if (x.is_cert_multiset_stabilizing(y_cert_ms))
+      return;
+  }
+
+  // Second widening technique: try the BGP99 powerset heuristics.
+  Polyhedra_Powerset<PH> bgp99_heuristics = x;
+  bgp99_heuristics.BGP99_heuristics_assign(y, wf);
+
+  // Compute the poly-hull of `bgp99_heuristics'.
+  PH bgp99_heuristics_hull(x.space_dim, EMPTY);
+  for (const_iterator i = bgp99_heuristics.begin(),
+	 bh_end = bgp99_heuristics.end(); i != bh_end; ++i)
+    bgp99_heuristics_hull.upper_bound_assign(i->element());
+
+  // Check for stabilization and, if successful,
+  // commit to the result of the extrapolation.
+  hull_stabilization = y_hull_cert.compare(bgp99_heuristics_hull);
+  if (hull_stabilization == 1) {
+    // The poly-hull is stabilizing.
+    std::swap(x, bgp99_heuristics);
+    return;
+  }
+  else if (hull_stabilization == 0 && y_is_not_a_singleton) {
+    // If not already done, compute multiset certificate for `y'.
+    if (!y_cert_ms_computed) {
+      y.collect_certificates(y_cert_ms);
+      y_cert_ms_computed = true;
+    }
+    if (bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+      std::swap(x, bgp99_heuristics);
+      return;
+    }
+    // Third widening technique: pairwise-reduction on `bgp99_heuristics'.
+    // Note that pairwise-reduction does not affect the computation
+    // of the poly-hulls, so that we only have to check the multiset
+    // certificate relation.
+    Polyhedra_Powerset<PH> reduced_bgp99_heuristics(bgp99_heuristics);
+    reduced_bgp99_heuristics.pairwise_reduce();
+    if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+      std::swap(x, reduced_bgp99_heuristics);
+      return;
+    }
+  }
+
+  // Fourth widening technique: this is applicable only when
+  // `y_hull' is a proper subset of `bgp99_heuristics_hull'.
+  if (bgp99_heuristics_hull.strictly_contains(y_hull)) {
+    // Compute (y_hull \widen bgp99_heuristics_hull).
+    PH ph = bgp99_heuristics_hull;
+    wf(ph, y_hull);
+    // Compute the difference between `ph' and `bgp99_heuristics_hull'.
+    ph.difference_assign(bgp99_heuristics_hull);
+    x.add_disjunct(ph);
+    return;
+  }
+
+  // Fall back to the computation of the poly-hull.
+  Polyhedra_Powerset<PH> x_hull_singleton(x.space_dim, EMPTY);
+  x_hull_singleton.add_disjunct(x_hull);
+  std::swap(x, x_hull_singleton);
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::ascii_dump(std::ostream& s) const {
+  const Polyhedra_Powerset& x = *this;
+  s << "size " << x.size()
+    << "\nspace_dim " << x.space_dim
+    << "\n";
+  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi)
+    xi->element().ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(PH, Polyhedra_Powerset<PH>);
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::ascii_load(std::istream& s) {
+  Polyhedra_Powerset& x = *this;
+  std::string str;
+
+  if (!(s >> str) || str != "size")
+    return false;
+
+  size_type sz;
+
+  if (!(s >> sz))
+    return false;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> x.space_dim))
+    return false;
+
+  Polyhedra_Powerset new_x(x.space_dim, EMPTY);
+  while (sz-- > 0) {
+    PH ph;
+    if (!ph.ascii_load(s))
+      return false;
+    new_x.add_disjunct(ph);
+  }
+  x.swap(new_x);
+
+  // Check for well-formedness.
+  assert(x.OK());
+  return true;
+}
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::OK() const {
+  const Polyhedra_Powerset& x = *this;
+  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) {
+    const PH& pi = xi->element();
+    if (pi.space_dimension() != x.space_dim) {
+#ifndef NDEBUG
+      std::cerr << "Space dimension mismatch: is " << pi.space_dimension()
+		<< " in an element of the sequence,\nshould be "
+		<< x.space_dim << "."
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+  return x.Base::OK();
+}
+
+
+namespace Implementation {
+
+namespace Polyhedra_Powersets {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions polyhedron \p qq according to constraint \p c.
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset
+  On exit, the intersection of \p qq and constraint \p c is stored
+  in \p qq, whereas the intersection of \p qq with the negation of \p c
+  is added as a new disjunct of the powerset \p r.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+void
+linear_partition_aux(const Constraint& c,
+		     PH& qq,
+		     Polyhedra_Powerset<NNC_Polyhedron>& r) {
+  Linear_Expression le(c);
+  Constraint neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0);
+  NNC_Polyhedron qqq(qq);
+  if (qqq.add_constraint_and_minimize(neg_c))
+    r.add_disjunct(qqq);
+  qq.add_constraint(c);
+}
+
+} // namespace Polyhedra_Powersets
+
+} // namespace Implementation
+
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH>
+std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+linear_partition(const PH& p, const PH& q) {
+  using Implementation::Polyhedra_Powersets::linear_partition_aux;
+
+  Polyhedra_Powerset<NNC_Polyhedron> r(p.space_dimension(), EMPTY);
+  PH qq = q;
+  const Constraint_System& pcs = p.constraints();
+  for (Constraint_System::const_iterator i = pcs.begin(),
+	 pcs_end = pcs.end(); i != pcs_end; ++i) {
+    const Constraint c = *i;
+    if (c.is_equality()) {
+      Linear_Expression le(c);
+      linear_partition_aux(le <= 0, qq, r);
+      linear_partition_aux(le >= 0, qq, r);
+    }
+    else
+      linear_partition_aux(c, qq, r);
+  }
+  return std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >(qq, r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedra_Powerset_templates_hh)
diff --git a/src/Polyhedra_Powerset.types.hh b/src/Polyhedra_Powerset.types.hh
new file mode 100644
index 0000000..e4a05fc
--- /dev/null
+++ b/src/Polyhedra_Powerset.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Polyhedra_Powerset_types_hh
+#define PPL_Polyhedra_Powerset_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+class Polyhedra_Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedra_Powerset_types_hh)
diff --git a/src/Polyhedron.defs.hh b/src/Polyhedron.defs.hh
new file mode 100644
index 0000000..6ed78bd
--- /dev/null
+++ b/src/Polyhedron.defs.hh
@@ -0,0 +1,2475 @@
+/* Polyhedron class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Polyhedron_defs_hh
+#define PPL_Polyhedron_defs_hh 1
+
+#include "Polyhedron.types.hh"
+#include "globals.types.hh"
+#include "Variable.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "Generator_System.defs.hh"
+#include "Generator_System.inlines.hh"
+#include "Congruence_System.defs.hh"
+#include "Congruence_System.inlines.hh"
+#include "Saturation_Matrix.defs.hh"
+#include "Generator.types.hh"
+#include "Congruence.defs.hh"
+#include "Poly_Con_Relation.defs.hh"
+#include "Poly_Gen_Relation.defs.hh"
+#include "BHRZ03_Certificate.types.hh"
+#include "H79_Certificate.types.hh"
+#include "BD_Shape.types.hh"
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Polyhedron
+  Writes a textual representation of \p ph on \p s:
+  <CODE>false</CODE> is written if \p ph is an empty polyhedron;
+  <CODE>true</CODE> is written if \p ph is a universe polyhedron;
+  a minimized system of constraints defining \p ph is written otherwise,
+  all constraints in one row separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Polyhedron& ph);
+
+} // namespace IO_Operators
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are the same polyhedron.
+
+  \relates Polyhedron
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are different polyhedra.
+
+  \relates Polyhedron
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The base class for convex polyhedra.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Polyhedron represents a convex polyhedron
+  in the vector space \f$\Rset^n\f$.
+
+  A polyhedron can be specified as either a finite system of constraints
+  or a finite system of generators (see Section \ref representation)
+  and it is always possible to obtain either representation.
+  That is, if we know the system of constraints, we can obtain
+  from this the system of generators that define the same polyhedron
+  and vice versa.
+  These systems can contain redundant members: in this case we say
+  that they are not in the minimal form.
+  Most operators on polyhedra are provided with two implementations:
+  one of these, denoted <CODE>\<operator-name\>_and_minimize</CODE>,
+  also enforces the minimization of the representations,
+  and returns the Boolean value <CODE>false</CODE> whenever
+  the resulting polyhedron turns out to be empty.
+
+  Two key attributes of any polyhedron are its topological kind
+  (recording whether it is a C_Polyhedron or an NNC_Polyhedron object)
+  and its space dimension (the dimension \f$n \in \Nset\f$ of
+  the enclosing vector space):
+
+  - all polyhedra, the empty ones included, are endowed with
+    a specific topology and space dimension;
+  - most operations working on a polyhedron and another object
+    (i.e., another polyhedron, a constraint or generator,
+    a set of variables, etc.) will throw an exception if
+    the polyhedron and the object are not both topology-compatible
+    and dimension-compatible (see Section \ref representation);
+  - the topology of a polyhedron cannot be changed;
+    rather, there are constructors for each of the two derived classes
+    that will build a new polyhedron with the topology of that class
+    from another polyhedron from either class and any topology;
+  - the only ways in which the space dimension of a polyhedron can
+    be changed are:
+    - <EM>explicit</EM> calls to operators provided for that purpose;
+    - standard copy, assignment and swap operators.
+
+  Note that four different polyhedra can be defined on
+  the zero-dimension space:
+  the empty polyhedron, either closed or NNC,
+  and the universe polyhedron \f$R^0\f$, again either closed or NNC.
+
+  \par
+  In all the examples it is assumed that variables
+  <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+  used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
+
+  \par Example 1
+  The following code builds a polyhedron corresponding to
+  a square in \f$\Rset^2\f$, given as a system of constraints:
+  \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  cs.insert(y >= 0);
+  cs.insert(y <= 3);
+  C_Polyhedron ph(cs);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from a system of generators specifying
+  the four vertices of the square:
+  \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 3*y));
+  gs.insert(point(3*x + 0*y));
+  gs.insert(point(3*x + 3*y));
+  C_Polyhedron ph(gs);
+  \endcode
+
+  \par Example 2
+  The following code builds an unbounded polyhedron
+  corresponding to a half-strip in \f$\Rset^2\f$,
+  given as a system of constraints:
+  \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x - y <= 0);
+  cs.insert(x - y + 1 >= 0);
+  C_Polyhedron ph(cs);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from the system of generators specifying
+  the two vertices of the polyhedron and one ray:
+  \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + y));
+  gs.insert(ray(x - y));
+  C_Polyhedron ph(gs);
+  \endcode
+
+  \par Example 3
+  The following code builds the polyhedron corresponding to
+  a half-plane by adding a single constraint
+  to the universe polyhedron in \f$\Rset^2\f$:
+  \code
+  C_Polyhedron ph(2);
+  ph.add_constraint(y >= 0);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from the empty polyhedron in the space \f$\Rset^2\f$
+  and inserting the appropriate generators
+  (a point, a ray and a line).
+  \code
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(0*x + 0*y));
+  ph.add_generator(ray(y));
+  ph.add_generator(line(x));
+  \endcode
+  Note that, although the above polyhedron has no vertices, we must add
+  one point, because otherwise the result of the Minkowski's sum
+  would be an empty polyhedron.
+  To avoid subtle errors related to the minimization process,
+  it is required that the first generator inserted in an empty
+  polyhedron is a point (otherwise, an exception is thrown).
+
+  \par Example 4
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_embed</CODE>:
+  \code
+  C_Polyhedron ph(1);
+  ph.add_constraint(x == 2);
+  ph.add_space_dimensions_and_embed(1);
+  \endcode
+  We build the universe polyhedron in the 1-dimension space \f$\Rset\f$.
+  Then we add a single equality constraint,
+  thus obtaining the polyhedron corresponding to the singleton set
+  \f$\{ 2 \} \sseq \Rset\f$.
+  After the last line of code, the resulting polyhedron is
+  \f[
+    \bigl\{\,
+      (2, y)^\transpose \in \Rset^2
+    \bigm|
+      y \in \Rset
+    \,\bigr\}.
+  \f]
+
+  \par Example 5
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_project</CODE>:
+  \code
+  C_Polyhedron ph(1);
+  ph.add_constraint(x == 2);
+  ph.add_space_dimensions_and_project(1);
+  \endcode
+  The first two lines of code are the same as in Example 4 for
+  <CODE>add_space_dimensions_and_embed</CODE>.
+  After the last line of code, the resulting polyhedron is
+  the singleton set
+  \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+
+  \par Example 6
+  The following code shows the use of the function
+  <CODE>affine_image</CODE>:
+  \code
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(0*x + 0*y));
+  ph.add_generator(point(0*x + 3*y));
+  ph.add_generator(point(3*x + 0*y));
+  ph.add_generator(point(3*x + 3*y));
+  Linear_Expression expr = x + 4;
+  ph.affine_image(x, expr);
+  \endcode
+  In this example the starting polyhedron is a square in
+  \f$\Rset^2\f$, the considered variable is \f$x\f$ and the affine
+  expression is \f$x+4\f$.  The resulting polyhedron is the same
+  square translated to the right.  Moreover, if the affine
+  transformation for the same variable \p x is \f$x+y\f$:
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting polyhedron is a parallelogram with the height equal to
+  the side of the square and the oblique sides parallel to the line
+  \f$x-y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable; for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting polyhedron is a diagonal of the square.
+
+  \par Example 7
+  The following code shows the use of the function
+  <CODE>affine_preimage</CODE>:
+  \code
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(x <= 3);
+  ph.add_constraint(y >= 0);
+  ph.add_constraint(y <= 3);
+  Linear_Expression expr = x + 4;
+  ph.affine_preimage(x, expr);
+  \endcode
+  In this example the starting polyhedron, \p var and the affine
+  expression and the denominator are the same as in Example 6,
+  while the resulting polyhedron is again the same square,
+  but translated to the left.
+  Moreover, if the affine transformation for \p x is \f$x+y\f$
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting polyhedron is a parallelogram with the height equal to
+  the side of the square and the oblique sides parallel to the line
+  \f$x+y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable \p x, for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting polyhedron is a line that corresponds to the \f$y\f$ axis.
+
+  \par Example 8
+  For this example we use also the variables:
+  \code
+  Variable z(2);
+  Variable w(3);
+  \endcode
+  The following code shows the use of the function
+  <CODE>remove_space_dimensions</CODE>:
+  \code
+  Generator_System gs;
+  gs.insert(point(3*x + y +0*z + 2*w));
+  C_Polyhedron ph(gs);
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  ph.remove_space_dimensions(to_be_removed);
+  \endcode
+  The starting polyhedron is the singleton set
+  \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+  the resulting polyhedron is
+  \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+  Be careful when removing space dimensions <EM>incrementally</EM>:
+  since dimensions are automatically renamed after each application
+  of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+  results can be obtained.
+  For instance, by using the following code we would obtain
+  a different result:
+  \code
+  set<Variable> to_be_removed1;
+  to_be_removed1.insert(y);
+  ph.remove_space_dimensions(to_be_removed1);
+  set<Variable> to_be_removed2;
+  to_be_removed2.insert(z);
+  ph.remove_space_dimensions(to_be_removed2);
+  \endcode
+  In this case, the result is the polyhedron
+  \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+  when removing the set of dimensions \p to_be_removed2
+  we are actually removing variable \f$w\f$ of the original polyhedron.
+  For the same reason, the operator \p remove_space_dimensions
+  is not idempotent: removing twice the same non-empty set of dimensions
+  is never the same as removing them just once.
+*/
+
+class Parma_Polyhedra_Library::Polyhedron {
+public:
+  //! Returns the maximum space dimension all kinds of Polyhedron can handle.
+  static dimension_type max_space_dimension();
+
+protected:
+  //! Builds a polyhedron having the specified properties.
+  /*!
+    \param topol
+    The topology of the polyhedron;
+
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the polyhedron;
+
+    \param kind
+    Specifies whether the universe or the empty polyhedron has to be built.
+  */
+  Polyhedron(Topology topol,
+	     dimension_type num_dimensions,
+	     Degenerate_Element kind);
+
+  //! Ordinary copy-constructor.
+  Polyhedron(const Polyhedron& y);
+
+  //! Builds a polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param cs
+    The system of constraints defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p cs is incompatible with \p topol.
+  */
+  Polyhedron(Topology topol, const Constraint_System& cs);
+
+  //! Builds a polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p cs is incompatible with \p topol.
+  */
+  Polyhedron(Topology topol, Constraint_System& cs);
+
+  //! Builds a polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param gs
+    The system of generators defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p gs is incompatible with \p topol,
+    or if the system of generators is not empty but has no points.
+  */
+  Polyhedron(Topology topol, const Generator_System& gs);
+
+  //! Builds a polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p gs is incompatible with \p topol,
+    or if the system of generators is not empty but has no points.
+  */
+  Polyhedron(Topology topol, Generator_System& gs);
+
+  //! Builds a polyhedron out of a generic, interval-based bounding box.
+  /*!
+    \param topol
+    The topology of the polyhedron;
+
+    \param box
+    The bounding box representing the polyhedron to be built.
+
+    \exception std::invalid_argument
+    Thrown if \p box has intervals that are incompatible with \p topol.
+
+    The template class Box must provide the following methods.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the dimension of the vector space enclosing the polyhedron
+    represented by the bounding box.
+    \code
+      bool is_empty() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the bounding box
+    describes the empty set.
+    The <CODE>is_empty()</CODE> method will always be called before the
+    methods below.  However, if <CODE>is_empty()</CODE> returns
+    <CODE>true</CODE>, none of the functions below will be called.
+    \code
+      bool get_lower_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+    \code
+      bool get_upper_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
+  */
+  template <typename Box>
+  Polyhedron(Topology topol, const Box& box);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  Polyhedron& operator=(const Polyhedron& y);
+
+public:
+  //! \name Member Functions that Do Not Modify the Polyhedron
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns the system of constraints.
+  const Constraint_System& constraints() const;
+
+  //! Returns the system of constraints, with no redundant constraint.
+  const Constraint_System& minimized_constraints() const;
+
+  //! Returns the system of generators.
+  const Generator_System& generators() const;
+
+  //! Returns the system of generators, with no redundant generator.
+  const Generator_System& minimized_generators() const;
+
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is
+    an empty polyhedron.
+  */
+  bool is_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a universe polyhedron.
+  */
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const Polyhedron& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a bounded polyhedron.
+  */
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param point
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p point are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		Generator& point) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param point
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		Generator& point) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool contains(const Polyhedron& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool strictly_contains(const Polyhedron& y) const;
+
+  /*! \brief
+    Uses \p *this to shrink a generic, interval-based bounding box.
+    Assigns to \p box the intersection of \p box with the smallest
+    bounding box containing \p *this.
+
+    \param box
+    The bounding box to be shrunk;
+
+    \param complexity
+    The complexity class of the algorithm to be used.
+
+    If the polyhedron \p *this or \p box is empty, then the empty box
+    is returned.
+
+    If \p *this and \p box are non-empty, then, for
+    each space dimension \f$k\f$ with variable \f$\mathrm{var}\f$, let
+    \f$u\f$ be the upper and \f$l\f$ the lower bound of the smallest
+    interval containing \p *this.
+
+    If \f$l\f$ is infinite, then \p box is unaltered; if \f$l\f$ is
+    finite, then the \p box interval for space dimension \f$k\f$ is
+    (destructively) intersected with \f$[l, +\mathrm{infty})\f$ if a
+    point of \p *this satisfies \f$\mathrm{var} == l\f$ and with
+    \f$(l, +\mathrm{infty})\f$ otherwise.
+
+    Similarly, if \f$u\f$ is infinite, then \p box is unaltered; if
+    \f$u\f$ is finite, then the \p box interval for space dimension
+    \f$k\f$ is (destructively) intersected with \f$(-\mathrm{infty},
+    u]\f$ if a point of \p *this satisfies \f$\mathrm{var} == u\f$ and
+    with \f$(-\mathrm{infty}, u)\f$ otherwise.
+
+    The template class Box must provide the following methods, whose
+    return values, if any, are simply ignored.
+    \code
+      set_empty()
+    \endcode
+    causes the box to become empty, i.e., to represent the empty set.
+    \code
+      raise_lower_bound(dimension_type k, bool closed,
+                        Coefficient_traits::const_reference n,
+                        Coefficient_traits::const_reference d)
+    \endcode
+    intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension
+    with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+    with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>false</CODE>.
+    \code
+      lower_upper_bound(dimension_type k, bool closed,
+                        Coefficient_traits::const_reference n,
+                        Coefficient_traits::const_reference d)
+    \endcode
+    intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension
+    with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+    with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE>
+    is <CODE>false</CODE>.
+
+    The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
+    will be called at most once for each possible value for <CODE>k</CODE>
+    and for all such calls the fraction \f$n/d\f$ will be in canonical form,
+    that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
+    is positive, \f$0/1\f$ being the unique representation for zero.
+    The same guarantee is offered for the function
+    <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
+  */
+  template <typename Box>
+  void shrink_bounding_box(Box& box,
+			   Complexity_Class complexity = ANY_COMPLEXITY) const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if \p *this satisfies all the
+    invariants and either \p check_not_empty is <CODE>false</CODE> or
+    \p *this is not empty.
+
+    \param check_not_empty
+    <CODE>true</CODE> if and only if, in addition to checking the
+    invariants, \p *this must be checked to be not empty.
+
+    The check is performed so as to intrude as little as possible.  If
+    the library has been compiled with run-time assertions enabled,
+    error messages are written on <CODE>std::cerr</CODE> in case
+    invariants are violated. This is useful for the purpose of
+    debugging the library.
+  */
+  bool OK(bool check_not_empty = false) const;
+
+  //@} // Member Functions that Do Not Modify the Polyhedron
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Polyhedron
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    of \p *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    of \p *this, minimizing the result
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  bool add_constraint_and_minimize(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators
+    of \p *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are topology-incompatible or
+    dimension-incompatible, or if \p *this is an empty polyhedron and
+    \p g is not a point.
+  */
+  void add_generator(const Generator& g);
+
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators
+    of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are topology-incompatible or
+    dimension-incompatible, or if \p *this is an empty polyhedron and
+    \p g is not a point.
+  */
+  bool add_generator_and_minimize(const Generator& g);
+
+  /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences of \p
+    *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the system
+    of constraints of \p *this (without minimizing the result).
+
+    \param cs
+    Contains the constraints that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this (without minimizing the result).
+
+    \param cs
+    The constraint system that will be recycled, adding its
+    constraints to the system of constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the system
+    of constraints of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    Contains the constraints that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool add_constraints_and_minimize(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    The constraint system that will be recycled, adding its
+    constraints to the system of constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  bool add_recycled_constraints_and_minimize(Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system
+    of generators of \p *this (without minimizing the result).
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the system of
+    generators \p gs is not empty, but has no points.
+  */
+  void add_generators(const Generator_System& gs);
+
+  /*! \brief
+    Adds the generators in \p gs to the system of generators
+    of \p *this (without minimizing the result).
+
+    \param gs
+    The generator system that will be recycled, adding its generators
+    to the system of generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the system of
+    generators \p gs is not empty, but has no points.
+
+    \warning
+    The only assumption that can be made on \p gs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_generators(Generator_System& gs);
+
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system
+    of generators of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the the system
+    of generators \p gs is not empty, but has no points.
+  */
+  bool add_generators_and_minimize(const Generator_System& gs);
+
+  /*! \brief
+    Adds the generators in \p gs to the system of generators
+    of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param gs
+    The generator system that will be recycled, adding its generators
+    to the system of generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the the system
+    of generators \p gs is not empty, but has no points.
+
+    \warning
+    The only assumption that can be made on \p gs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  bool add_recycled_generators_and_minimize(Generator_System& gs);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p
+    cgs (without minimizing the result).
+
+    \param cgs
+    Contains the congruences that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y.
+    The result is not guaranteed to be minimized.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void intersection_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y,
+    minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool intersection_assign_and_minimize(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the poly-hull of \p *this and \p y.
+    The result is not guaranteed to be minimized.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void poly_hull_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the poly-hull of \p *this and \p y,
+    minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool poly_hull_assign_and_minimize(const Polyhedron& y);
+
+  //! Same as poly_hull_assign(y).
+  void upper_bound_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this
+    the \ref Convex_Polyhedral_Difference "poly-difference"
+    of \p *this and \p y. The result is not guaranteed to be minimized.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void poly_difference_assign(const Polyhedron& y);
+
+  //! Same as poly_difference_assign(y).
+  void difference_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1.)
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering the generators of a polyhedron, the
+    affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If constraints are up-to-date, it uses the specialized function
+    affine_preimage() (for the system of constraints)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+	   = a_\mathrm{var} x_\mathrm{var}
+	     + \sum_{i \neq var} a_i x_i + b,
+       \f]
+       so that the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+             - \sum_{i \neq j} a_i x_i - b.
+       \f]
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only generators remain
+    up-to-date.
+
+    In other words, if \f$R\f$ is a \f$m_1 \times n\f$ matrix representing
+    the rays of the polyhedron, \f$V\f$ is a \f$m_2 \times n\f$
+    matrix representing the points of the polyhedron and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            \vect{x} = \vect{\lambda} R + \vect{\mu} V,
+	    \vect{\lambda} \in \Rset^{m_1}_+,
+	    \vect{\mu} \in \Rset^{m_2}_+,
+	    \sum_{i = 0}^{m_2 - 1} \mu_i = 1
+          \,\bigr\}
+    \f]
+    and \f$T\f$ is the affine transformation to apply to \f$P\f$, then
+    the resulting polyhedron is
+    \f[
+      P' = \bigl\{\,
+             (x_0, \ldots, T(x_0, \ldots, x_{n-1}),
+                     \ldots, x_{n-1})^\mathrm{T}
+           \bigm|
+             (x_0, \ldots, x_{n-1})^\mathrm{T} \in P
+           \,\bigr\}.
+    \f]
+
+    Affine transformations are, for example:
+    - translations
+    - rotations
+    - symmetries.
+    \endif
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1.)
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering constraints of a polyhedron, the affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If generators are up-to-date, then the specialized function
+    affine_image() is used (for the system of generators)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation, we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+       \f],
+       the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+               - \sum_{i \neq j} a_i x_i - b.
+       \f].
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only constraints remain
+    up-to-date.
+
+    In other words, if \f$A\f$ is a \f$m \times n\f$ matrix representing
+    the constraints of the polyhedron, \f$T\f$ is the affine transformation
+    to apply to \f$P\f$ and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            A\vect{x} \geq \vect{0}
+          \,\bigr\}.
+    \f]
+    The resulting polyhedron is
+    \f[
+      P' = \bigl\{\,
+             \vect{x} = (x_0, \ldots, x_{n-1}))^\mathrm{T}
+           \bigm|
+             A'\vect{x} \geq \vect{0}
+           \,\bigr\},
+    \f]
+    where \f$A'\f$ is defined as follows:
+    \f[
+      {a'}_{ij}
+        = \begin{cases}
+            a_{ij} * \mathrm{denominator} + a_{i\mathrm{var}}*\mathrm{expr}[j]
+              \quad \mathrm{for } j \neq \mathrm{var}; \\
+            \mathrm{expr}[\mathrm{var}] * a_{i\mathrm{var}},
+              \quad \text{for } j = \mathrm{var}.
+          \end{cases}
+    \f]
+    \endif
+  */
+  void affine_preimage(Variable var,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator
+		         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1.)
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+				const Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				  = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1.)
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+			      const Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+				const Relation_Symbol relsym,
+				const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+				   const Relation_Symbol relsym,
+				   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1.)
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1.)
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void time_elapse_assign(const Polyhedron& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHRZ03_widening "BHRZ03-widening" between \p *this and \p y.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref BHRZ03_widening "BHRZ03-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void limited_BHRZ03_extrapolation_assign(const Polyhedron& y,
+					   const Constraint_System& cs,
+					   unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref BHRZ03_widening "BHRZ03-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this, plus all the constraints
+    of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
+    \f$r \in \Qset\f$, that are satisfied by all the points of \p *this.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
+					   const Constraint_System& cs,
+					   unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref H79_widening "H79-widening" between \p *this and \p y.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void H79_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void limited_H79_extrapolation_assign(const Polyhedron& y,
+					const Constraint_System& cs,
+					unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this, plus all the constraints
+    of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
+    \f$r \in \Qset\f$, that are satisfied by all the points of \p *this.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void bounded_H79_extrapolation_assign(const Polyhedron& y,
+					const Constraint_System& cs,
+					unsigned* tp = 0);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old polyhedron
+    in the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new polyhedron, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are not constrained.
+    For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the polyhedron
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new space dimensions to the polyhedron
+    and does not embed it in the new vector space.
+
+    \param m
+    The number of space dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new polyhedron, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are all constrained to be equal to 0.
+    For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the polyhedron
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Polyhedron& y);
+
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher dimensions of the vector space so that
+    the resulting space will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each space dimension.
+
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain
+    of the partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing the polyhedron.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.
+    Also thrown if \p var is contained in \p to_be_folded.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  friend bool Parma_Polyhedra_Library::operator==(const Polyhedron& x,
+						  const Polyhedron& y);
+
+  //! \name Miscellaneous Member Functions
+  //@{
+
+  //! Destructor.
+  ~Polyhedron();
+
+  /*! \brief
+    Swaps \p *this with polyhedron \p y.
+    (\p *this and \p y can be dimension-incompatible.)
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible.
+  */
+  void swap(Polyhedron& y);
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //@} // Miscellaneous Member Functions
+
+private:
+  //! The system of constraints.
+  Constraint_System con_sys;
+
+  //! The system of generators.
+  Generator_System gen_sys;
+
+  //! The saturation matrix having constraints on its columns.
+  Saturation_Matrix sat_c;
+
+  //! The saturation matrix having generators on its columns.
+  Saturation_Matrix sat_g;
+
+#define PPL_IN_Polyhedron_CLASS
+#include "Ph_Status.idefs.hh"
+#undef PPL_IN_Polyhedron_CLASS
+
+  //! The status flags to keep track of the polyhedron's internal state.
+  Status status;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  //! Returns the topological kind of the polyhedron.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the polyhedron
+    is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+
+  //! \name Private Verifiers: Verify if Individual Flags are Set
+  //@{
+
+  //! Returns <CODE>true</CODE> if the polyhedron is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  //! Returns <CODE>true</CODE> if the system of constraints is up-to-date.
+  bool constraints_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+  bool generators_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of constraints is minimized.
+  /*!
+    Note that only \em weak minimization is entailed, so that
+    an NNC polyhedron may still have \f$\epsilon\f$-redundant constraints.
+  */
+  bool constraints_are_minimized() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is minimized.
+  /*!
+    Note that only \em weak minimization is entailed, so that
+    an NNC polyhedron may still have \f$\epsilon\f$-redundant generators.
+  */
+  bool generators_are_minimized() const;
+
+  //! Returns <CODE>true</CODE> if there are pending constraints.
+  bool has_pending_constraints() const;
+
+  //! Returns <CODE>true</CODE> if there are pending generators.
+  bool has_pending_generators() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if there are
+    either pending constraints or pending generators.
+  */
+  bool has_something_pending() const;
+
+  //! Returns <CODE>true</CODE> if the polyhedron can have something pending.
+  bool can_have_something_pending() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the saturation matrix \p sat_c
+    is up-to-date.
+  */
+  bool sat_c_is_up_to_date() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the saturation matrix \p sat_g
+    is up-to-date.
+  */
+  bool sat_g_is_up_to_date() const;
+
+  //@} // Private Verifiers: Verify if Individual Flags are Set
+
+  //! \name State Flag Setters: Set Only the Specified Flags
+  //@{
+
+  /*! \brief
+    Sets \p status to express that the polyhedron is the universe
+    0-dimension vector space, clearing all corresponding matrices.
+  */
+  void set_zero_dim_univ();
+
+  /*! \brief
+    Sets \p status to express that the polyhedron is empty,
+    clearing all corresponding matrices.
+  */
+  void set_empty();
+
+  //! Sets \p status to express that constraints are up-to-date.
+  void set_constraints_up_to_date();
+
+  //! Sets \p status to express that generators are up-to-date.
+  void set_generators_up_to_date();
+
+  //! Sets \p status to express that constraints are minimized.
+  void set_constraints_minimized();
+
+  //! Sets \p status to express that generators are minimized.
+  void set_generators_minimized();
+
+  //! Sets \p status to express that constraints are pending.
+  void set_constraints_pending();
+
+  //! Sets \p status to express that generators are pending.
+  void set_generators_pending();
+
+  //! Sets \p status to express that \p sat_c is up-to-date.
+  void set_sat_c_up_to_date();
+
+  //! Sets \p status to express that \p sat_g is up-to-date.
+  void set_sat_g_up_to_date();
+
+  //@} // State Flag Setters: Set Only the Specified Flags
+
+  //! \name State Flag Cleaners: Clear Only the Specified Flag
+  //@{
+
+  //! Clears the \p status flag indicating that the polyhedron is empty.
+  void clear_empty();
+
+  //! Sets \p status to express that constraints are no longer up-to-date.
+  /*!
+    This also implies that they are neither minimized
+    and both saturation matrices are no longer meaningful.
+  */
+  void clear_constraints_up_to_date();
+
+  //! Sets \p status to express that generators are no longer up-to-date.
+  /*!
+    This also implies that they are neither minimized
+    and both saturation matrices are no longer meaningful.
+  */
+  void clear_generators_up_to_date();
+
+  //! Sets \p status to express that constraints are no longer minimized.
+  void clear_constraints_minimized();
+
+  //! Sets \p status to express that generators are no longer minimized.
+  void clear_generators_minimized();
+
+  //! Sets \p status to express that there are no longer pending constraints.
+  void clear_pending_constraints();
+
+  //! Sets \p status to express that there are no longer pending generators.
+  void clear_pending_generators();
+
+  //! Sets \p status to express that \p sat_c is no longer up-to-date.
+  void clear_sat_c_up_to_date();
+
+  //! Sets \p status to express that \p sat_g is no longer up-to-date.
+  void clear_sat_g_up_to_date();
+
+  //@} // State Flag Cleaners: Clear Only the Specified Flag
+
+  //! \name The Handling of Pending Rows
+  //@{
+
+  /*! \brief
+    Processes the pending rows of either description of the polyhedron
+    and obtains a minimized polyhedron.
+
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  bool process_pending() const;
+
+  //! Processes the pending constraints and obtains a minimized polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    It is assumed that the polyhedron does have some pending constraints.
+  */
+  bool process_pending_constraints() const;
+
+  //! Processes the pending generators and obtains a minimized polyhedron.
+  /*!
+    It is assumed that the polyhedron does have some pending generators.
+  */
+  void process_pending_generators() const;
+
+  /*! \brief
+    Lazily integrates the pending descriptions of the polyhedron
+    to obtain a constraint system without pending rows.
+
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  void remove_pending_to_obtain_constraints() const;
+
+  /*! \brief
+    Lazily integrates the pending descriptions of the polyhedron
+    to obtain a generator system without pending rows.
+
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  bool remove_pending_to_obtain_generators() const;
+
+  //@} // The Handling of Pending Rows
+
+  //! \name Updating and Sorting Matrices
+  //@{
+
+  //! Updates constraints starting from generators and minimizes them.
+  /*!
+    The resulting system of constraints is only partially sorted:
+    the equalities are in the upper part of the matrix,
+    while the inequalities in the lower part.
+  */
+  void update_constraints() const;
+
+  //! Updates generators starting from constraints and minimizes them.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    The resulting system of generators is only partially sorted:
+    the lines are in the upper part of the matrix,
+    while rays and points are in the lower part.
+    It is illegal to call this method when the Status field
+    already declares the polyhedron to be empty.
+  */
+  bool update_generators() const;
+
+  //! Updates \p sat_c using the updated constraints and generators.
+  /*!
+    It is assumed that constraints and generators are up-to-date
+    and minimized and that the Status field does not already flag
+    \p sat_c to be up-to-date.
+    The values of the saturation matrix are computed as follows:
+    \f[
+      \begin{cases}
+        sat\_c[i][j] = 0,
+          \quad \text{if } G[i] \cdot C^\mathrm{T}[j] = 0; \\
+        sat\_c[i][j] = 1,
+          \quad \text{if } G[i] \cdot C^\mathrm{T}[j] > 0.
+      \end{cases}
+    \f]
+  */
+  void update_sat_c() const;
+
+  //! Updates \p sat_g using the updated constraints and generators.
+  /*!
+    It is assumed that constraints and generators are up-to-date
+    and minimized and that the Status field does not already flag
+    \p sat_g to be up-to-date.
+    The values of the saturation matrix are computed as follows:
+    \f[
+      \begin{cases}
+        sat\_g[i][j] = 0,
+          \quad \text{if } C[i] \cdot G^\mathrm{T}[j] = 0; \\
+        sat\_g[i][j] = 1,
+          \quad \text{if } C[i] \cdot G^\mathrm{T}[j] > 0.
+      \end{cases}
+    \f]
+  */
+  void update_sat_g() const;
+
+  //! Sorts the matrix of constraints keeping status consistency.
+  /*!
+    It is assumed that constraints are up-to-date.
+    If at least one of the saturation matrices is up-to-date,
+    then \p sat_g is kept consistent with the sorted matrix
+    of constraints.
+    The method is declared \p const because reordering
+    the constraints does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_constraints() const;
+
+  //! Sorts the matrix of generators keeping status consistency.
+  /*!
+    It is assumed that generators are up-to-date.
+    If at least one of the saturation matrices is up-to-date,
+    then \p sat_c is kept consistent with the sorted matrix
+    of generators.
+    The method is declared \p const because reordering
+    the generators does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_generators() const;
+
+  //! Sorts the matrix of constraints and updates \p sat_c.
+  /*!
+    It is assumed that both constraints and generators
+    are up-to-date and minimized.
+    The method is declared \p const because reordering
+    the constraints does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_constraints_with_sat_c() const;
+
+  //! Sorts the matrix of generators and updates \p sat_g.
+  /*!
+    It is assumed that both constraints and generators
+    are up-to-date and minimized.
+    The method is declared \p const because reordering
+    the generators does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_generators_with_sat_g() const;
+
+  //@} // Updating and Sorting Matrices
+
+  //! \name Weak and Strong Minimization of Descriptions
+  //@{
+
+  //! Applies (weak) minimization to both the constraints and generators.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    Minimization is not attempted if the Status field already declares
+    both systems to be minimized.
+  */
+  bool minimize() const;
+
+  //! Applies strong minimization to the constraints of an NNC polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+  */
+  bool strongly_minimize_constraints() const;
+
+  //! Applies strong minimization to the generators of an NNC polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+  */
+  bool strongly_minimize_generators() const;
+
+  //@} // Weak and Strong Minimization of Descriptions
+
+  enum Three_Valued_Boolean {
+    TVB_TRUE,
+    TVB_FALSE,
+    TVB_DONT_KNOW
+  };
+
+  //! Polynomial but incomplete equivalence test between polyhedra.
+  Three_Valued_Boolean quick_equivalence_test(const Polyhedron& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+  bool is_included_in(const Polyhedron& y) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \param point
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+	       const bool maximize,
+	       Coefficient& ext_n, Coefficient& ext_d, bool& included,
+	       Generator& point) const;
+
+  //! \name Widening- and Extrapolation-Related Functions
+  //@{
+
+  /*! \brief
+    Copies to \p cs_selection the constraints of \p y corresponding
+    to the definition of the CH78-widening of \p *this and \p y.
+  */
+  void select_CH78_constraints(const Polyhedron& y,
+			       Constraint_System& cs_selected) const;
+
+  /*! \brief
+    Splits the constraints of `x' into two subsets, depending on whether
+    or not they are selected to compute the \ref H79_widening "H79-widening"
+    of \p *this and \p y.
+  */
+  void select_H79_constraints(const Polyhedron& y,
+			      Constraint_System& cs_selected,
+			      Constraint_System& cs_not_selected) const;
+
+  bool BHRZ03_combining_constraints(const Polyhedron& y,
+				    const BHRZ03_Certificate& y_cert,
+ 				    const Polyhedron& H79,
+				    const Constraint_System& x_minus_H79_con_sys);
+
+  bool BHRZ03_evolving_points(const Polyhedron& y,
+			      const BHRZ03_Certificate& y_cert,
+			      const Polyhedron& H79);
+
+  bool BHRZ03_evolving_rays(const Polyhedron& y,
+			    const BHRZ03_Certificate& y_cert,
+			    const Polyhedron& H79);
+
+  //@} // Widening- and Extrapolation-Related Functions
+
+  //! Adds new space dimensions to the given matrices.
+  /*!
+    \param mat1
+    The matrix to which columns are added;
+
+    \param mat2
+    The matrix to which rows and columns are added;
+
+    \param sat1
+    The saturation matrix whose columns are indexed by the rows of
+    matrix \p mat1. On entry it is up-to-date;
+
+    \param sat2
+    The saturation matrix whose columns are indexed by the rows of \p
+    mat2;
+
+    \param add_dim
+    The number of space dimensions to add.
+
+    Adds new space dimensions to the vector space modifying the matrices.
+    This function is invoked only by
+    <CODE>add_space_dimensions_and_embed()</CODE> and
+    <CODE>add_space_dimensions_and_project()</CODE>, passing the matrix of
+    constraints and that of generators (and the corresponding saturation
+    matrices) in different order (see those methods for details).
+  */
+  static void add_space_dimensions(Linear_System& mat1,
+				   Linear_System& mat2,
+				   Saturation_Matrix& sat1,
+				   Saturation_Matrix& sat2,
+				   dimension_type add_dim);
+
+  //! \name Minimization-Related Static Member Functions
+  //@{
+
+  //! Builds and simplifies constraints from generators (or vice versa).
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  static bool minimize(bool con_to_gen,
+		       Linear_System& source,
+		       Linear_System& dest,
+		       Saturation_Matrix& sat);
+
+  /*! \brief
+    Adds given constraints and builds minimized corresponding generators
+    or vice versa.
+  */
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  static bool add_and_minimize(bool con_to_gen,
+			       Linear_System& source1,
+			       Linear_System& dest,
+			       Saturation_Matrix& sat,
+			       const Linear_System& source2);
+
+  /*! \brief
+    Adds given constraints and builds minimized corresponding generators
+    or vice versa. The given constraints are in \p source.
+  */
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  static bool add_and_minimize(bool con_to_gen,
+			       Linear_System& source,
+			       Linear_System& dest,
+			       Saturation_Matrix& sat);
+
+  //! Performs the conversion from constraints to generators and vice versa.
+  // Detailed Doxygen comment to be found in file conversion.cc.
+  static dimension_type conversion(Linear_System& source,
+				   dimension_type start,
+				   Linear_System& dest,
+				   Saturation_Matrix& sat,
+				   dimension_type num_lines_or_equalities);
+
+  /*! \brief
+    Uses Gauss' elimination method to simplify the result of
+    <CODE>conversion()</CODE>.
+  */
+  // Detailed Doxygen comment to be found in file simplify.cc.
+  static int simplify(Linear_System& mat, Saturation_Matrix& sat);
+
+  //@} // Minimization-Related Static Member Functions
+
+  template <typename T> friend class Parma_Polyhedra_Library::BD_Shape;
+  friend class Parma_Polyhedra_Library::BHRZ03_Certificate;
+  friend class Parma_Polyhedra_Library::H79_Certificate;
+
+
+  //! \name Exception Throwers
+  //@{
+protected:
+  void throw_runtime_error(const char* method) const;
+  void throw_invalid_argument(const char* method, const char* reason) const;
+
+  void throw_topology_incompatible(const char* method,
+				   const char* ph_name,
+				   const Polyhedron& ph) const;
+  void throw_topology_incompatible(const char* method,
+				   const char* c_name,
+				   const Constraint& c) const;
+  void throw_topology_incompatible(const char* method,
+				   const char* g_name,
+				   const Generator& g) const;
+  void throw_topology_incompatible(const char* method,
+				   const char* cs_name,
+				   const Constraint_System& cs) const;
+  void throw_topology_incompatible(const char* method,
+				   const char* gs_name,
+				   const Generator_System& gs) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const char* other_name,
+				    dimension_type other_dim) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* ph_name,
+				    const Polyhedron& ph) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* e_name,
+				    const Linear_Expression& e) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* c_name,
+				    const Constraint& c) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* g_name,
+				    const Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cg_name,
+				    const Congruence& cg) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cs_name,
+				    const Constraint_System& cs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* gs_name,
+				    const Generator_System& gs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cgs_name,
+				    const Congruence_System& cgs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* var_name,
+				    const Variable var) const;
+  void throw_dimension_incompatible(const char* method,
+				    dimension_type required_space_dim) const;
+
+  // Note: it has to be a static method, because it can be called inside
+  // constructors (before actually constructing the polyhedron object).
+  static void throw_space_dimension_overflow(Topology topol,
+					     const char* method,
+					     const char* reason);
+
+  void throw_invalid_generator(const char* method,
+			       const char* g_name) const;
+  void throw_invalid_generators(const char* method,
+				const char* gs_name) const;
+  //@} // Exception Throwers
+
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+void swap(Parma_Polyhedra_Library::Polyhedron& x,
+	  Parma_Polyhedra_Library::Polyhedron& y);
+
+} // namespace std
+
+#include "Ph_Status.inlines.hh"
+#include "Polyhedron.inlines.hh"
+#include "Polyhedron.templates.hh"
+
+#endif // !defined(PPL_Polyhedron_defs_hh)
diff --git a/src/Polyhedron.inlines.hh b/src/Polyhedron.inlines.hh
new file mode 100644
index 0000000..e9265c0
--- /dev/null
+++ b/src/Polyhedron.inlines.hh
@@ -0,0 +1,344 @@
+/* Polyhedron class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Polyhedron_inlines_hh
+#define PPL_Polyhedron_inlines_hh 1
+
+#include "Interval.defs.hh"
+#include "Generator.defs.hh"
+#include "LP_Problem.defs.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+inline memory_size_type
+Polyhedron::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline dimension_type
+Polyhedron::max_space_dimension() {
+  using std::min;
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return min(std::numeric_limits<dimension_type>::max() - 1,
+	     min(Constraint_System::max_space_dimension(),
+		 Generator_System::max_space_dimension()
+		 )
+	     );
+}
+
+inline Topology
+Polyhedron::topology() const {
+  // We can check either one of the two matrices.
+  // (`con_sys' is slightly better, since it is placed at offset 0.)
+  return con_sys.topology();
+}
+
+inline bool
+Polyhedron::is_necessarily_closed() const {
+  // We can check either one of the two matrices.
+  // (`con_sys' is slightly better, since it is placed at offset 0.)
+  return con_sys.is_necessarily_closed();
+}
+
+inline dimension_type
+Polyhedron::space_dimension() const {
+  return space_dim;
+}
+
+inline void
+Polyhedron::upper_bound_assign(const Polyhedron& y) {
+  poly_hull_assign(y);
+}
+
+inline void
+Polyhedron::difference_assign(const Polyhedron& y) {
+  poly_difference_assign(y);
+}
+
+inline
+Polyhedron::~Polyhedron() {
+}
+
+inline void
+Polyhedron::swap(Polyhedron& y) {
+  if (topology() != y.topology())
+    throw_topology_incompatible("swap(y)", "y", y);
+  std::swap(con_sys, y.con_sys);
+  std::swap(gen_sys, y.gen_sys);
+  std::swap(sat_c, y.sat_c);
+  std::swap(sat_g, y.sat_g);
+  std::swap(status, y.status);
+  std::swap(space_dim, y.space_dim);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+inline void
+std::swap(Parma_Polyhedra_Library::Polyhedron& x,
+	  Parma_Polyhedra_Library::Polyhedron& y) {
+  x.swap(y);
+}
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Polyhedron::marked_empty() const {
+  return status.test_empty();
+}
+
+inline bool
+Polyhedron::constraints_are_up_to_date() const {
+  return status.test_c_up_to_date();
+}
+
+inline bool
+Polyhedron::generators_are_up_to_date() const {
+  return status.test_g_up_to_date();
+}
+
+inline bool
+Polyhedron::constraints_are_minimized() const {
+  return status.test_c_minimized();
+}
+
+inline bool
+Polyhedron::generators_are_minimized() const {
+  return status.test_g_minimized();
+}
+
+inline bool
+Polyhedron::sat_c_is_up_to_date() const {
+  return status.test_sat_c_up_to_date();
+}
+
+inline bool
+Polyhedron::sat_g_is_up_to_date() const {
+  return status.test_sat_g_up_to_date();
+}
+
+inline bool
+Polyhedron::has_pending_constraints() const {
+  return status.test_c_pending();
+}
+
+inline bool
+Polyhedron::has_pending_generators() const {
+  return status.test_g_pending();
+}
+
+inline bool
+Polyhedron::has_something_pending() const {
+  return status.test_c_pending() || status.test_g_pending();
+}
+
+inline bool
+Polyhedron::can_have_something_pending() const {
+  return constraints_are_minimized()
+    && generators_are_minimized()
+    && (sat_c_is_up_to_date() || sat_g_is_up_to_date());
+}
+
+inline void
+Polyhedron::set_constraints_up_to_date() {
+  status.set_c_up_to_date();
+}
+
+inline void
+Polyhedron::set_generators_up_to_date() {
+  status.set_g_up_to_date();
+}
+
+inline void
+Polyhedron::set_constraints_minimized() {
+  set_constraints_up_to_date();
+  status.set_c_minimized();
+}
+
+inline void
+Polyhedron::set_generators_minimized() {
+  set_generators_up_to_date();
+  status.set_g_minimized();
+}
+
+inline void
+Polyhedron::set_constraints_pending() {
+  status.set_c_pending();
+}
+
+inline void
+Polyhedron::set_generators_pending() {
+  status.set_g_pending();
+}
+
+inline void
+Polyhedron::set_sat_c_up_to_date() {
+  status.set_sat_c_up_to_date();
+}
+
+inline void
+Polyhedron::set_sat_g_up_to_date() {
+  status.set_sat_g_up_to_date();
+}
+
+inline void
+Polyhedron::clear_empty() {
+  status.reset_empty();
+}
+
+inline void
+Polyhedron::clear_constraints_minimized() {
+  status.reset_c_minimized();
+}
+
+inline void
+Polyhedron::clear_generators_minimized() {
+  status.reset_g_minimized();
+}
+
+inline void
+Polyhedron::clear_pending_constraints() {
+  status.reset_c_pending();
+}
+
+inline void
+Polyhedron::clear_pending_generators() {
+  status.reset_g_pending();
+}
+
+inline void
+Polyhedron::clear_sat_c_up_to_date() {
+  status.reset_sat_c_up_to_date();
+  // Can get rid of sat_c here.
+}
+
+inline void
+Polyhedron::clear_sat_g_up_to_date() {
+  status.reset_sat_g_up_to_date();
+  // Can get rid of sat_g here.
+}
+
+inline void
+Polyhedron::clear_constraints_up_to_date() {
+  clear_pending_constraints();
+  clear_constraints_minimized();
+  clear_sat_c_up_to_date();
+  clear_sat_g_up_to_date();
+  status.reset_c_up_to_date();
+  // Can get rid of con_sys here.
+}
+
+inline void
+Polyhedron::clear_generators_up_to_date() {
+  clear_pending_generators();
+  clear_generators_minimized();
+  clear_sat_c_up_to_date();
+  clear_sat_g_up_to_date();
+  status.reset_g_up_to_date();
+  // Can get rid of gen_sys here.
+}
+
+inline bool
+Polyhedron::process_pending() const {
+  assert(space_dim > 0 && !marked_empty());
+  assert(has_something_pending());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  if (x.has_pending_constraints())
+    return x.process_pending_constraints();
+
+  assert(x.has_pending_generators());
+  x.process_pending_generators();
+  return true;
+}
+
+inline bool
+Polyhedron::is_empty() const {
+  if (marked_empty())
+    return true;
+  // Try a fast-fail test: if generators are up-to-date and
+  // there are no pending constraints, then the generator system
+  // (since it is well formed) contains a point.
+  if (generators_are_up_to_date() && !has_pending_constraints())
+    return false;
+  return !minimize();
+}
+
+inline bool
+Polyhedron::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+inline bool
+Polyhedron::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+		     Coefficient& sup_n, Coefficient& sup_d,
+		     bool& maximum) const {
+  Generator g(point());
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+		     Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		     Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+inline bool
+Polyhedron::minimize(const Linear_Expression& expr,
+		     Coefficient& inf_n, Coefficient& inf_d,
+		     bool& minimum) const {
+  Generator g(point());
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+inline bool
+Polyhedron::minimize(const Linear_Expression& expr,
+		     Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		     Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+/*! \relates Polyhedron */
+inline bool
+operator!=(const Polyhedron& x, const Polyhedron& y) {
+  return !(x == y);
+}
+
+inline bool
+Polyhedron::strictly_contains(const Polyhedron& y) const {
+  const Polyhedron& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_inlines_hh)
diff --git a/src/Polyhedron.templates.hh b/src/Polyhedron.templates.hh
new file mode 100644
index 0000000..24fbcfb
--- /dev/null
+++ b/src/Polyhedron.templates.hh
@@ -0,0 +1,512 @@
+/* Polyhedron class implementation: non-inline template functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Polyhedron_templates_hh
+#define PPL_Polyhedron_templates_hh 1
+
+#include "Interval.defs.hh"
+#include "Generator.defs.hh"
+#include "LP_Problem.defs.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Box>
+Polyhedron::Polyhedron(Topology topol, const Box& box)
+  : con_sys(topol),
+    gen_sys(topol),
+    sat_c(),
+    sat_g() {
+  // Initialize the space dimension as indicated by the box.
+  space_dim = box.space_dimension();
+
+  // Check for emptiness.
+  if (box.is_empty()) {
+    set_empty();
+    return;
+  }
+
+  // Zero-dim universe polyhedron.
+  if (space_dim == 0) {
+    set_zero_dim_univ();
+    return;
+  }
+
+  // Insert a dummy constraint of the highest dimension to avoid the
+  // need of resizing the matrix of constraints later;
+  // this constraint will be removed at the end.
+  con_sys.insert(Variable(space_dim - 1) >= 0);
+
+  for (dimension_type k = space_dim; k-- > 0; ) {
+    // See if we have a valid lower bound.
+    bool l_closed = false;
+    Coefficient l_n, l_d;
+    bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d);
+    if (l_bounded && topol == NECESSARILY_CLOSED && !l_closed)
+      throw_invalid_argument("C_Polyhedron(const Box& box):",
+			     " box has an open lower bound");
+    // See if we have a valid upper bound.
+    bool u_closed = false;
+    Coefficient u_n, u_d;
+    bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d);
+    if (u_bounded && topol == NECESSARILY_CLOSED && !u_closed)
+      throw_invalid_argument("C_Polyhedron(const Box& box):",
+			     " box has an open upper bound");
+
+    // See if we have an implicit equality constraint.
+    if (l_bounded && u_bounded
+	&& l_closed && u_closed
+	&& l_n == u_n && l_d == u_d) {
+      // Add the constraint `l_d*v_k == l_n'.
+      con_sys.insert(l_d * Variable(k) == l_n);
+    }
+    else {
+      // Check if a lower bound constraint is required.
+      if (l_bounded) {
+       if (l_closed)
+	 // Add the constraint `l_d*v_k >= l_n'.
+	 con_sys.insert(l_d * Variable(k) >= l_n);
+       else
+	 // Add the constraint `l_d*v_k > l_n'.
+	 con_sys.insert(l_d * Variable(k) > l_n);
+      }
+      // Check if an upper bound constraint is required.
+      if (u_bounded) {
+       if (u_closed)
+	 // Add the constraint `u_d*v_k <= u_n'.
+	 con_sys.insert(u_d * Variable(k) <= u_n);
+       else
+	 // Add the constraint `u_d*v_k < u_n'.
+	 con_sys.insert(u_d * Variable(k) < u_n);
+      }
+    }
+  }
+
+  // Adding the low-level constraints.
+  con_sys.add_low_level_constraints();
+  // Now removing the dummy constraint inserted before.
+  dimension_type n_rows = con_sys.num_rows() - 1;
+  con_sys[0].swap(con_sys[n_rows]);
+  con_sys.set_sorted(false);
+  // NOTE: here there are no pending constraints.
+  con_sys.set_index_first_pending_row(n_rows);
+  con_sys.erase_to_end(n_rows);
+
+  // Constraints are up-to-date.
+  set_constraints_up_to_date();
+  assert(OK());
+}
+
+template <typename Box>
+void
+Polyhedron::shrink_bounding_box(Box& box, Complexity_Class complexity) const {
+  bool reduce_complexity = (complexity != ANY_COMPLEXITY);
+  if (!reduce_complexity
+      || (!has_something_pending() && constraints_are_minimized())) {
+    // If the constraint system is minimized, the test `is_universe()'
+    // is not exponential.
+    if (is_universe())
+      return;
+  }
+  if (reduce_complexity) {
+    if (marked_empty()
+	|| (generators_are_up_to_date() && gen_sys.num_rows() == 0)) {
+      box.set_empty();
+      return;
+    }
+    else if (constraints_are_up_to_date()) {
+      // See if there is at least one inconsistent constraint in `con_sys'.
+      for (Constraint_System::const_iterator i = con_sys.begin(),
+	     cs_end = con_sys.end(); i != cs_end; ++i)
+	if (i->is_inconsistent()) {
+	  box.set_empty();
+	  return;
+	}
+      // If `complexity' allows it, use the LP_Problem solver to determine
+      // whether or not the polyhedron is empty.
+      if (complexity == SIMPLEX_COMPLEXITY
+	  // TODO: find a workaround for NNC polyhedra.
+	  && is_necessarily_closed()) {
+	LP_Problem lp(con_sys);
+	if (!lp.is_satisfiable()) {
+	  box.set_empty();
+	  return;
+	}
+      }
+    }
+  }
+  else
+    // The flag `reduce_complexity' is `false'.
+    // Note that the test `is_empty()' is exponential in the worst case.
+    if (is_empty()) {
+      box.set_empty();
+      return;
+    }
+
+  if (space_dim == 0)
+    return;
+
+  // The following vectors will store the lower and upper bound
+  // for each dimension.
+  // Lower bounds are initialized to open plus infinity.
+  std::vector<LBoundary>
+    lower_bound(space_dim,
+		LBoundary(ERational(PLUS_INFINITY), LBoundary::OPEN));
+  // Upper bounds are initialized to open minus infinity.
+  std::vector<UBoundary>
+    upper_bound(space_dim,
+		UBoundary(ERational(MINUS_INFINITY), UBoundary::OPEN));
+
+  if (!reduce_complexity && has_something_pending())
+    process_pending();
+
+  // TODO: use simplex to derive variable bounds, if the complexity
+  // is SIMPLEX_COMPLEXITY.
+
+  if (reduce_complexity &&
+       (!generators_are_up_to_date() || has_pending_constraints())) {
+    // Extract easy-to-find bounds from constraints.
+    assert(constraints_are_up_to_date());
+
+    // We must copy `con_sys' to a temporary matrix,
+    // as we need to simplify all of the matrix
+    // (not just the non-pending part of it).
+    Constraint_System cs(con_sys);
+    if (cs.num_pending_rows() > 0)
+      cs.unset_pending_rows();
+    if (has_pending_constraints() || !constraints_are_minimized())
+      cs.simplify();
+
+    const Constraint_System::const_iterator cs_begin = cs.begin();
+    const Constraint_System::const_iterator cs_end = cs.end();
+
+    for (Constraint_System::const_iterator i = cs_begin; i != cs_end; ++i) {
+      dimension_type varid = space_dim;
+      const Constraint& c = *i;
+      // After `simplify()' some constraints may have become inconsistent.
+      if (c.is_inconsistent()) {
+	box.set_empty();
+	return;
+      }
+      for (dimension_type j = space_dim; j-- > 0; ) {
+	// We look for constraints of the form `Variable(j) == k',
+	// `Variable(j) >= k', and `Variable(j) > k'.
+	if (c.coefficient(Variable(j)) != 0)
+	  if (varid != space_dim) {
+	    varid = space_dim;
+	    break;
+	  }
+	  else
+	    varid = j;
+      }
+      if (varid != space_dim) {
+	Coefficient_traits::const_reference d = c.coefficient(Variable(varid));
+	Coefficient_traits::const_reference n = c.inhomogeneous_term();
+	// The constraint `c' is of the form
+	// `Variable(varid) + n / d rel 0', where
+	// `rel' is either the relation `==', `>=', or `>'.
+	// For the purpose of shrinking intervals, this is
+	// (morally) turned into `Variable(varid) rel -n/d'.
+	mpq_class q;
+	assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+	assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+	q.canonicalize();
+	// Turn `n/d' into `-n/d'.
+	q = -q;
+	const ERational r(q, ROUND_NOT_NEEDED);
+	const Constraint::Type c_type = c.type();
+	switch (c_type) {
+	case Constraint::EQUALITY:
+	  lower_bound[varid] = LBoundary(r, LBoundary::CLOSED);
+	  upper_bound[varid] = UBoundary(r, UBoundary::CLOSED);
+	  break;
+	case Constraint::NONSTRICT_INEQUALITY:
+	case Constraint::STRICT_INEQUALITY:
+	  if (d > 0)
+	  // If `d' is strictly positive, we have a constraint of the
+	  // form `Variable(varid) >= k' or `Variable(varid) > k'.
+	    lower_bound[varid]
+	      = LBoundary(r, (c_type == Constraint::NONSTRICT_INEQUALITY
+			      ? LBoundary::CLOSED
+			      : LBoundary::OPEN));
+	  else {
+	    // Otherwise, we are sure that `d' is strictly negative
+	    // and, in this case, we have a constraint of the form
+	    // `Variable(varid) <= k' or `Variable(varid) < k'.
+	    assert(d < 0);
+	    upper_bound[varid]
+	      = UBoundary(r, (c_type == Constraint::NONSTRICT_INEQUALITY
+			      ? UBoundary::CLOSED
+			      : UBoundary::OPEN));
+	  }
+	  break;
+	}
+      }
+    }
+  }
+  else {
+    // We are in the case where either the generators are up-to-date
+    // or reduced complexity is not required.
+    // Get the generators for *this.
+
+    // We have not to copy `gen_sys', because in this case
+    // we only read the generators.
+    const Generator_System& gs = gen_sys;
+
+    // We first need to identify those axes that are unbounded below
+    // and/or above.
+    for (Generator_System::const_iterator i = gs.begin(),
+	   gs_end = gs.end(); i != gs_end; ++i) {
+      // Note: using an iterator, we read also the pending part of the matrix.
+      const Generator& g = *i;
+      Generator::Type g_type = g.type();
+      switch (g_type) {
+      case Generator::LINE:
+	// Any axes `j' in which the coefficient is non-zero is unbounded
+	// both below and above.
+	for (dimension_type j = space_dim; j-- > 0; )
+	  if (g.coefficient(Variable(j)) != 0) {
+	    lower_bound[j] = LBoundary(ERational(MINUS_INFINITY),
+				       LBoundary::OPEN);
+	    upper_bound[j] = UBoundary(ERational(PLUS_INFINITY),
+				       UBoundary::OPEN);
+	  }
+	break;
+      case Generator::RAY:
+	// Axes in which the coefficient is negative are unbounded below.
+	// Axes in which the coefficient is positive are unbounded above.
+	for (dimension_type j = space_dim; j-- > 0; ) {
+	  int sign = sgn(g.coefficient(Variable(j)));
+	  if (sign < 0)
+	    lower_bound[j] = LBoundary(ERational(MINUS_INFINITY),
+				       LBoundary::OPEN);
+	  else if (sign > 0)
+	    upper_bound[j] = UBoundary(ERational(PLUS_INFINITY),
+				       UBoundary::OPEN);
+	}
+	break;
+      case Generator::POINT:
+      case Generator::CLOSURE_POINT:
+	{
+	  Coefficient_traits::const_reference d = g.divisor();
+	  for (dimension_type j = space_dim; j-- > 0; ) {
+	    Coefficient_traits::const_reference n = g.coefficient(Variable(j));
+	    mpq_class q;
+	    assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+	    assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+	    q.canonicalize();
+	    const ERational r(q, ROUND_NOT_NEEDED);
+	    LBoundary lb(r,(g_type == Generator::CLOSURE_POINT
+			    ? LBoundary::OPEN
+			    : LBoundary::CLOSED));
+	    if (lb < lower_bound[j])
+	      lower_bound[j] = lb;
+	    UBoundary ub(r, (g_type == Generator::CLOSURE_POINT
+			     ? UBoundary::OPEN
+			     : UBoundary::CLOSED));
+	    if (ub > upper_bound[j])
+	      upper_bound[j] = ub;
+	  }
+	}
+	break;
+      }
+    }
+  }
+
+  TEMP_INTEGER(n);
+  TEMP_INTEGER(d);
+
+  // Now shrink the bounded axes.
+  for (dimension_type j = space_dim; j-- > 0; ) {
+    // Lower bound.
+    const LBoundary& lb = lower_bound[j];
+    const ERational& lr = lb.bound();
+    if (!is_plus_infinity(lr) && !is_minus_infinity(lr)) {
+      n = raw_value(lr).get_num();
+      d = raw_value(lr).get_den();
+      box.raise_lower_bound(j, lb.is_closed(), n, d);
+    }
+
+    // Upper bound.
+    const UBoundary& ub = upper_bound[j];
+    const ERational& ur = ub.bound();
+    if (!is_plus_infinity(ur) && !is_minus_infinity(ur)) {
+      n = raw_value(ur).get_num();
+      d = raw_value(ur).get_den();
+      box.lower_upper_bound(j, ub.is_closed(), n, d);
+    }
+  }
+}
+
+template <typename Partial_Function>
+void
+Polyhedron::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the polyhedron becomes zero_dimensional.
+    if (marked_empty()
+	|| (has_pending_constraints()
+	    && !remove_pending_to_obtain_generators())
+	|| (!generators_are_up_to_date() && !update_generators())) {
+      // Removing all dimensions from the empty polyhedron.
+      space_dim = 0;
+      con_sys.clear();
+    }
+    else
+      // Removing all dimensions from a non-empty polyhedron.
+      set_zero_dim_univ();
+
+    assert(OK());
+    return;
+  }
+
+  const dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+  if (new_space_dimension == space_dim) {
+    // The partial function `pfunc' is indeed total and thus specifies
+    // a permutation, that is, a renaming of the dimensions.  For
+    // maximum efficiency, we will simply permute the columns of the
+    // constraint system and/or the generator system.
+
+    // We first compute suitable permutation cycles for the columns of
+    // the `con_sys' and `gen_sys' matrices.  We will represent them
+    // with a linear array, using 0 as a terminator for each cycle
+    // (notice that the columns with index 0 of `con_sys' and
+    // `gen_sys' represent the inhomogeneous terms, and thus are
+    // unaffected by the permutation of dimensions).
+    // Cycles of length 1 will be omitted so that, in the worst case,
+    // we will have `space_dim' elements organized in `space_dim/2'
+    // cycles, which means we will have at most `space_dim/2'
+    // terminators.
+    std::vector<dimension_type> cycles;
+    cycles.reserve(space_dim + space_dim/2);
+
+    // Used to mark elements as soon as they are inserted in a cycle.
+    std::deque<bool> visited(space_dim);
+
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      if (!visited[i]) {
+	dimension_type j = i;
+	do {
+	  visited[j] = true;
+	  // The following initialization is only to make the compiler happy.
+	  dimension_type k = 0;
+	  if (!pfunc.maps(j, k))
+	    throw_invalid_argument("map_space_dimensions(pfunc)",
+				   " pfunc is inconsistent");
+	  if (k == j)
+	    // Cycle of length 1: skip it.
+	    goto skip;
+
+	  cycles.push_back(j+1);
+	  // Go along the cycle.
+	  j = k;
+	} while (!visited[j]);
+	// End of cycle: mark it.
+	cycles.push_back(0);
+      skip:
+	;
+      }
+    }
+
+    // If `cycles' is empty then `pfunc' is the identity.
+    if (cycles.empty())
+      return;
+
+    // Permute all that is up-to-date.  Notice that the contents of
+    // the saturation matrices is unaffected by the permutation of
+    // columns: they remain valid, if they were so.
+    if (constraints_are_up_to_date())
+      con_sys.permute_columns(cycles);
+
+    if (generators_are_up_to_date())
+      gen_sys.permute_columns(cycles);
+
+    assert(OK());
+    return;
+  }
+
+  // If control gets here, then `pfunc' is not a permutation and some
+  // dimensions must be projected away.
+
+  // If there are pending constraints, using `generators()' we process them.
+  const Generator_System& old_gensys = generators();
+
+  if (old_gensys.num_rows() == 0) {
+    // The polyhedron is empty.
+    Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY);
+    std::swap(*this, new_polyhedron);
+    assert(OK());
+    return;
+  }
+
+  // Make a local copy of the partial function.
+  std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+  for (dimension_type j = space_dim; j-- > 0; ) {
+    dimension_type pfunc_j;
+    if (pfunc.maps(j, pfunc_j))
+      pfunc_maps[j] = pfunc_j;
+  }
+
+  Generator_System new_gensys;
+  for (Generator_System::const_iterator i = old_gensys.begin(),
+	 old_gensys_end = old_gensys.end(); i != old_gensys_end; ++i) {
+    const Generator& old_g = *i;
+    Linear_Expression e(0 * Variable(new_space_dimension-1));
+    bool all_zeroes = true;
+    for (dimension_type j = space_dim; j-- > 0; ) {
+      if (old_g.coefficient(Variable(j)) != 0
+	  && pfunc_maps[j] != not_a_dimension()) {
+	e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j));
+	all_zeroes = false;
+      }
+    }
+    switch (old_g.type()) {
+    case Generator::LINE:
+      if (!all_zeroes)
+	new_gensys.insert(line(e));
+      break;
+    case Generator::RAY:
+      if (!all_zeroes)
+	new_gensys.insert(ray(e));
+      break;
+    case Generator::POINT:
+      // A point in the origin has all zero homogeneous coefficients.
+      new_gensys.insert(point(e, old_g.divisor()));
+      break;
+    case Generator::CLOSURE_POINT:
+      // A closure point in the origin has all zero homogeneous coefficients.
+      new_gensys.insert(closure_point(e, old_g.divisor()));
+      break;
+    }
+  }
+  Polyhedron new_polyhedron(topology(), new_gensys);
+  std::swap(*this, new_polyhedron);
+  assert(OK(true));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_templates_hh)
diff --git a/src/Polyhedron.types.hh b/src/Polyhedron.types.hh
new file mode 100644
index 0000000..ea057dc
--- /dev/null
+++ b/src/Polyhedron.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Polyhedron_types_hh
+#define PPL_Polyhedron_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_types_hh)
diff --git a/src/Polyhedron_chdims.cc b/src/Polyhedron_chdims.cc
new file mode 100644
index 0000000..b472465
--- /dev/null
+++ b/src/Polyhedron_chdims.cc
@@ -0,0 +1,637 @@
+/* Polyhedron class implementation
+   (non-inline operators that may change the dimension of the vector space).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Polyhedron.defs.hh"
+#include <cassert>
+
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Polyhedron::add_space_dimensions(Linear_System& sys1,
+				      Linear_System& sys2,
+				      Saturation_Matrix& sat1,
+				      Saturation_Matrix& sat2,
+				      dimension_type add_dim) {
+  assert(sys1.topology() == sys2.topology());
+  assert(sys1.num_columns() == sys2.num_columns());
+  assert(add_dim != 0);
+
+  sys1.add_zero_columns(add_dim);
+  dimension_type old_index = sys2.first_pending_row();
+  sys2.add_rows_and_columns(add_dim);
+  // The added rows are in the non-pending part.
+  sys2.set_index_first_pending_row(old_index + add_dim);
+
+  // The resulting saturation matrix will be as follows:
+  // from row    0    to      add_dim-1       : only zeroes
+  //          add_dim     add_dim+num_rows-1  : old saturation matrix
+
+  // In fact all the old generators saturate all the new constraints
+  // because the polyhedron has not been embedded in the new space.
+  sat1.resize(sat1.num_rows() + add_dim, sat1.num_columns());
+  // The old matrix is moved to the end of the new matrix.
+  for (dimension_type i = sat1.num_rows() - add_dim; i-- > 0; )
+    std::swap(sat1[i], sat1[i+add_dim]);
+  // Computes the "sat_c", too.
+  sat2.transpose_assign(sat1);
+
+  if (!sys1.is_necessarily_closed()) {
+    // Moving the epsilon coefficients to the new last column.
+    dimension_type new_eps_index = sys1.num_columns() - 1;
+    dimension_type old_eps_index = new_eps_index - add_dim;
+    // This swap preserves sortedness of `sys1'.
+    sys1.swap_columns(old_eps_index, new_eps_index);
+
+    // Try to preserve sortedness of `sys2'.
+    if (!sys2.is_sorted())
+      sys2.swap_columns(old_eps_index, new_eps_index);
+    else {
+      for (dimension_type i = sys2.num_rows(); i-- > add_dim; ) {
+	Linear_Row& r = sys2[i];
+	std::swap(r[old_eps_index], r[new_eps_index]);
+      }
+      // The upper-right corner of `sys2' contains the J matrix:
+      // swap coefficients to preserve sortedness.
+      for (dimension_type i = add_dim; i-- > 0; ++old_eps_index) {
+	Linear_Row& r = sys2[i];
+	std::swap(r[old_eps_index], r[old_eps_index + 1]);
+      }
+    }
+    // NOTE: since we swapped columns in both `sys1' and `sys2',
+    // no swapping is required for `sat1' and `sat2'.
+  }
+}
+
+void
+PPL::Polyhedron::add_space_dimensions_and_embed(dimension_type m) {
+  // The space dimension of the resulting polyhedron should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dimension())
+    throw_space_dimension_overflow(topology(),
+				   "add_space_dimensions_and_embed(m)",
+				   "adding m new space dimensions exceeds "
+				   "the maximum allowed space dimension");
+
+  // Adding no dimensions to any polyhedron is a no-op.
+  if (m == 0)
+    return;
+
+  // Adding dimensions to an empty polyhedron is obtained by adjusting
+  // `space_dim' and clearing `con_sys' (since it can contain the
+  // unsatisfiable constraint system of the wrong dimension).
+  if (marked_empty()) {
+    space_dim += m;
+    con_sys.clear();
+    return;
+  }
+
+  // The case of a zero-dimensional space polyhedron.
+  if (space_dim == 0) {
+    // Since it is not empty, it has to be the universe polyhedron.
+    assert(status.test_zero_dim_univ());
+    // We swap `*this' with a newly created
+    // universe polyhedron of dimension `m'.
+    Polyhedron ph(topology(), m, UNIVERSE);
+    swap(ph);
+    return;
+  }
+
+  // To embed an n-dimension space polyhedron in a (n+m)-dimension space,
+  // we just add `m' zero-columns to the rows in the system of constraints;
+  // in contrast, the system of generators needs additional rows,
+  // corresponding to the vectors of the canonical basis
+  // for the added dimensions. That is, for each new dimension `x[k]'
+  // we add the line having that direction. This is done by invoking
+  // the function add_space_dimensions() giving the system of generators
+  // as the second argument.
+  if (constraints_are_up_to_date())
+    if (generators_are_up_to_date()) {
+      // `sat_c' must be up to date for add_space_dimensions(...).
+      if (!sat_c_is_up_to_date())
+	update_sat_c();
+      // Adds rows and/or columns to both matrices.
+      // `add_space_dimensions' correctly handles pending constraints
+      // or generators.
+      add_space_dimensions(con_sys, gen_sys, sat_c, sat_g, m);
+    }
+    else {
+      // Only constraints are up-to-date: no need to modify the generators.
+      con_sys.add_zero_columns(m);
+      // If the polyhedron is not necessarily closed,
+      // move the epsilon coefficients to the last column.
+      if (!is_necessarily_closed())
+	con_sys.swap_columns(space_dim + 1, space_dim + 1 + m);
+    }
+  else {
+    // Only generators are up-to-date: no need to modify the constraints.
+    assert(generators_are_up_to_date());
+    gen_sys.add_rows_and_columns(m);
+    // The polyhedron does not support pending generators.
+    gen_sys.unset_pending_rows();
+    // If the polyhedron is not necessarily closed,
+    // move the epsilon coefficients to the last column.
+    if (!is_necessarily_closed()) {
+      // Try to preserve sortedness of `gen_sys'.
+      if (!gen_sys.is_sorted())
+	gen_sys.swap_columns(space_dim + 1, space_dim + 1 + m);
+      else {
+	dimension_type old_eps_index = space_dim + 1;
+	dimension_type new_eps_index = old_eps_index + m;
+	for (dimension_type i = gen_sys.num_rows(); i-- > m; ) {
+	  Generator& r = gen_sys[i];
+	  std::swap(r[old_eps_index], r[new_eps_index]);
+	}
+	// The upper-right corner of `gen_sys' contains the J matrix:
+	// swap coefficients to preserve sortedness.
+	for (dimension_type i = m; i-- > 0; ++old_eps_index) {
+	  Generator& r = gen_sys[i];
+	  std::swap(r[old_eps_index], r[old_eps_index + 1]);
+	}
+      }
+    }
+  }
+  // Update the space dimension.
+  space_dim += m;
+
+  // Note: we do not check for satisfiability, because the system of
+  // constraints may be unsatisfiable.
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::add_space_dimensions_and_project(dimension_type m) {
+  // The space dimension of the resulting polyhedron should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dimension())
+    throw_space_dimension_overflow(topology(),
+				   "add_space_dimensions_and_project(m)",
+				   "adding m new space dimensions exceeds "
+				   "the maximum allowed space dimension");
+
+  // Adding no dimensions to any polyhedron is a no-op.
+  if (m == 0)
+    return;
+
+  // Adding dimensions to an empty polyhedron is obtained
+  // by merely adjusting `space_dim'.
+  if (marked_empty()) {
+    space_dim += m;
+    con_sys.clear();
+    return;
+  }
+
+  if (space_dim == 0) {
+    assert(status.test_zero_dim_univ() && gen_sys.num_rows() == 0);
+    // The system of generators for this polyhedron has only
+    // the origin as a point.
+    // In an NNC polyhedron, all points have to be accompanied
+    // by the corresponding closure points
+    // (this time, dimensions are automatically adjusted).
+    if (!is_necessarily_closed())
+      gen_sys.insert(Generator::zero_dim_closure_point());
+    gen_sys.insert(Generator::zero_dim_point());
+    gen_sys.adjust_topology_and_space_dimension(topology(), m);
+    set_generators_minimized();
+    space_dim = m;
+    assert(OK());
+    return;
+  }
+
+  // To project an n-dimension space polyhedron in a (n+m)-dimension space,
+  // we just add to the system of generators `m' zero-columns;
+  // In contrast, in the system of constraints, new rows are needed
+  // in order to avoid embedding the old polyhedron in the new space.
+  // Thus, for each new dimensions `x[k]', we add the constraint
+  // x[k] = 0; this is done by invoking the function add_space_dimensions()
+  // giving the system of constraints as the second argument.
+  if (constraints_are_up_to_date())
+    if (generators_are_up_to_date()) {
+      // `sat_g' must be up to date for add_space_dimensions(...).
+      if (!sat_g_is_up_to_date())
+	update_sat_g();
+      // Adds rows and/or columns to both matrices.
+      // `add_space_dimensions' correctly handles pending constraints
+      // or generators.
+      add_space_dimensions(gen_sys, con_sys, sat_g, sat_c, m);
+    }
+    else {
+      // Only constraints are up-to-date: no need to modify the generators.
+      con_sys.add_rows_and_columns(m);
+      // The polyhedron does not support pending constraints.
+      con_sys.unset_pending_rows();
+      // If the polyhedron is not necessarily closed,
+      // move the epsilon coefficients to the last column.
+      if (!is_necessarily_closed()) {
+	// Try to preserve sortedness of `con_sys'.
+	if (!con_sys.is_sorted())
+	  con_sys.swap_columns(space_dim + 1, space_dim + 1 + m);
+	else {
+	  dimension_type old_eps_index = space_dim + 1;
+	  dimension_type new_eps_index = old_eps_index + m;
+	  for (dimension_type i = con_sys.num_rows(); i-- > m; ) {
+	    Constraint& r = con_sys[i];
+	    std::swap(r[old_eps_index], r[new_eps_index]);
+	  }
+	  // The upper-right corner of `con_sys' contains the J matrix:
+	  // swap coefficients to preserve sortedness.
+	  for (dimension_type i = m; i-- > 0; ++old_eps_index) {
+	    Constraint& r = con_sys[i];
+	    std::swap(r[old_eps_index], r[old_eps_index + 1]);
+	  }
+	}
+      }
+    }
+  else {
+    // Only generators are up-to-date: no need to modify the constraints.
+    assert(generators_are_up_to_date());
+    gen_sys.add_zero_columns(m);
+    // If the polyhedron is not necessarily closed,
+    // move the epsilon coefficients to the last column.
+    if (!is_necessarily_closed())
+      gen_sys.swap_columns(space_dim + 1, space_dim + 1 + m);
+  }
+  // Now we update the space dimension.
+  space_dim += m;
+
+  // Note: we do not check for satisfiability, because the system of
+  // constraints may be unsatisfiable.
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::concatenate_assign(const Polyhedron& y) {
+  if (topology() != y.topology())
+    throw_topology_incompatible("concatenate_assign(y)", "y", y);
+
+  // The space dimension of the resulting polyhedron should not
+  // overflow the maximum allowed space dimension.
+  if (y.space_dim > max_space_dimension() - space_dimension())
+    throw_space_dimension_overflow(topology(),
+				   "concatenate_assign(y)",
+				   "concatenation exceeds the maximum "
+				   "allowed space dimension");
+
+  const dimension_type added_columns = y.space_dim;
+
+  // If `*this' or `y' are empty polyhedra, it is sufficient to adjust
+  // the dimension of the space.
+  if (marked_empty() || y.marked_empty()) {
+    space_dim += added_columns;
+    set_empty();
+    return;
+  }
+
+  // If `y' is a non-empty 0-dim space polyhedron, the result is `*this'.
+  if (added_columns == 0)
+    return;
+
+  // If `*this' is a non-empty 0-dim space polyhedron, the result is `y'.
+  if (space_dim == 0) {
+    *this = y;
+    return;
+  }
+
+  // TODO: this implementation is just an executable specification.
+  Constraint_System cs = y.constraints();
+
+  // The constraints of `x' (possibly with pending rows) are required.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  // The matrix for the new system of constraints is obtained
+  // by leaving the old system of constraints in the upper left-hand side
+  // and placing the constraints of `cs' in the lower right-hand side.
+  // NOTE: here topologies agree, whereas dimensions may not agree.
+  dimension_type old_num_rows = con_sys.num_rows();
+  dimension_type old_num_columns = con_sys.num_columns();
+  dimension_type added_rows = cs.num_rows();
+
+  // We already dealt with the cases of an empty or zero-dim `y' polyhedron;
+  // also, `cs' contains the low-level constraints, at least.
+  assert(added_rows > 0 && added_columns > 0);
+
+  con_sys.add_zero_rows_and_columns(added_rows, added_columns,
+				    Linear_Row::Flags(topology(),
+						      Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+  // Move the epsilon coefficient to the last column, if needed.
+  if (!is_necessarily_closed())
+    con_sys.swap_columns(old_num_columns - 1,
+			 old_num_columns - 1 + added_columns);
+  dimension_type cs_num_columns = cs.num_columns();
+  // Steal the constraints from `cs' and put them in `con_sys'
+  // using the right displacement for coefficients.
+  for (dimension_type i = added_rows; i-- > 0; ) {
+    Constraint& c_old = cs[i];
+    Constraint& c_new = con_sys[old_num_rows + i];
+    // Method `add_zero_rows_and_columns', by default, added
+    // inequalities.
+    if (c_old.is_equality())
+      c_new.set_is_equality();
+    // The inhomogeneous term is not displaced.
+    std::swap(c_new[0], c_old[0]);
+    // All homogeneous terms (included the epsilon coefficient,
+    // if present) are displaced by `space_dim' columns.
+    for (dimension_type j = 1; j < cs_num_columns; ++j)
+      std::swap(c_old[j], c_new[space_dim + j]);
+  }
+
+  if (can_have_something_pending()) {
+    // If `*this' can support pending constraints, then, since we have
+    // resized the system of constraints, we must also add to the generator
+    // system those lines corresponding to the newly added dimensions,
+    // because the non-pending parts of `con_sys' and `gen_sys' must still
+    // be a DD pair in minimal form.
+    gen_sys.add_rows_and_columns(added_columns);
+    gen_sys.set_sorted(false);
+    if (!is_necessarily_closed())
+      gen_sys.swap_columns(old_num_columns - 1,
+			   old_num_columns - 1 + added_columns);
+    // The added lines are not pending.
+    gen_sys.unset_pending_rows();
+    // Since we added new lines at the beginning of `x.gen_sys',
+    // we also have to adjust the saturation matrix `sat_c'.
+    // FIXME: if `sat_c' is not up-to-date, couldn't we directly update
+    // `sat_g' by resizing it and shifting its columns?
+    if (!sat_c_is_up_to_date()) {
+      sat_c.transpose_assign(sat_g);
+      set_sat_c_up_to_date();
+    }
+    clear_sat_g_up_to_date();
+    sat_c.resize(sat_c.num_rows() + added_columns, sat_c.num_columns());
+    // The old saturation rows are copied at the end of the matrix.
+    // The newly introduced lines saturate all the non-pending constraints,
+    // thus their saturation rows are made of zeroes.
+    for (dimension_type i = sat_c.num_rows() - added_columns; i-- > 0; )
+      std::swap(sat_c[i], sat_c[i+added_columns]);
+    // Since `added_rows > 0', we now have pending constraints.
+    set_constraints_pending();
+  }
+  else {
+    // The polyhedron cannot have pending constraints.
+    con_sys.unset_pending_rows();
+#if BE_LAZY
+    con_sys.set_sorted(false);
+#else
+    con_sys.sort_rows();
+#endif
+    clear_constraints_minimized();
+    clear_generators_up_to_date();
+    clear_sat_g_up_to_date();
+    clear_sat_c_up_to_date();
+  }
+  // Update space dimension.
+  space_dim += added_columns;
+
+  // The system of constraints may be unsatisfiable,
+  // thus we do not check for satisfiability.
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  // The removal of no dimensions from any polyhedron is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a polyhedron in a 0-dim space.
+  if (to_be_removed.empty()) {
+    assert(OK());
+    return;
+  }
+
+  // Dimension-compatibility check: the variable having
+  // maximum space dimension is the one occurring last in the set.
+  const dimension_type
+    min_space_dim = to_be_removed.rbegin()->space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+  const dimension_type new_space_dim = space_dim - to_be_removed.size();
+
+  // We need updated generators; note that keeping pending generators
+  // is useless because the constraints will be dropped anyway.
+  if (marked_empty()
+      || (has_something_pending() && !remove_pending_to_obtain_generators())
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // Removing dimensions from the empty polyhedron:
+    // we clear `con_sys' since it could have contained the
+    // unsatisfiable constraint of the wrong dimension.
+    con_sys.clear();
+    // Update the space dimension.
+    space_dim = new_space_dim;
+    assert(OK());
+    return;
+  }
+
+  // When removing _all_ dimensions from a non-empty polyhedron,
+  // we obtain the zero-dimensional universe polyhedron.
+  if (new_space_dim == 0) {
+    set_zero_dim_univ();
+    return;
+  }
+
+  // For each variable to be removed, we fill the corresponding column
+  // by shifting left those columns that will not be removed.
+  Variables_Set::const_iterator tbr = to_be_removed.begin();
+  Variables_Set::const_iterator tbr_end = to_be_removed.end();
+  dimension_type dst_col = tbr->space_dimension();
+  dimension_type src_col = dst_col + 1;
+  for (++tbr; tbr != tbr_end; ++tbr) {
+    dimension_type tbr_col = tbr->space_dimension();
+    // All columns in between are moved to the left.
+    while (src_col < tbr_col)
+      gen_sys.Matrix::swap_columns(dst_col++, src_col++);
+    ++src_col;
+  }
+  // Moving the remaining columns.
+  const dimension_type gen_sys_num_columns = gen_sys.num_columns();
+  while (src_col < gen_sys_num_columns)
+    gen_sys.Matrix::swap_columns(dst_col++, src_col++);
+
+  // The number of remaining columns is `dst_col'.
+  // Note that resizing also calls `set_sorted(false)'.
+  gen_sys.remove_trailing_columns(gen_sys_num_columns - dst_col);
+  // We may have invalid lines and rays now.
+  gen_sys.remove_invalid_lines_and_rays();
+
+  // Constraints are not up-to-date and generators are not minimized.
+  clear_constraints_up_to_date();
+  clear_generators_minimized();
+
+  // Update the space dimension.
+  space_dim = new_space_dim;
+
+  assert(OK(true));
+}
+
+void
+PPL::Polyhedron::remove_higher_space_dimensions(dimension_type new_dimension) {
+  // Dimension-compatibility check.
+  if (new_dimension > space_dim)
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+				 new_dimension);
+
+  // The removal of no dimensions from any polyhedron is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a polyhedron in a 0-dim space.
+  if (new_dimension == space_dim) {
+    assert(OK());
+    return;
+  }
+
+  // We need updated generators; note that keeping pending generators
+  // is useless because constraints will be dropped anyway.
+  if (marked_empty()
+      || (has_something_pending() && !remove_pending_to_obtain_generators())
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // Removing dimensions from the empty polyhedron:
+    // just updates the space dimension.
+    space_dim = new_dimension;
+    con_sys.clear();
+    assert(OK());
+    return;
+  }
+
+  if (new_dimension == 0) {
+    // Removing all dimensions from a non-empty polyhedron:
+    // just return the zero-dimensional universe polyhedron.
+    set_zero_dim_univ();
+    return;
+  }
+
+  dimension_type new_num_cols = new_dimension + 1;
+  if (!is_necessarily_closed()) {
+    // The polyhedron is not necessarily closed: move the column
+    // of the epsilon coefficients to its new place.
+    gen_sys.swap_columns(gen_sys.num_columns() - 1, new_num_cols);
+    // The number of remaining columns is `new_dimension + 2'.
+    ++new_num_cols;
+  }
+  // Note that resizing also calls `set_sorted(false)'.
+  gen_sys.remove_trailing_columns(space_dim - new_dimension);
+  // We may have invalid lines and rays now.
+  gen_sys.remove_invalid_lines_and_rays();
+
+  // Constraints are not up-to-date and generators are not minimized.
+  clear_constraints_up_to_date();
+  clear_generators_minimized();
+
+  // Update the space dimension.
+  space_dim = new_dimension;
+
+  assert(OK(true));
+}
+
+void
+PPL::Polyhedron::expand_space_dimension(Variable var, dimension_type m) {
+  // TODO: this implementation is _really_ an executable specification.
+
+  // `var' should be one of the dimensions of the vector space.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+  // The space dimension of the resulting polyhedron should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dimension())
+    throw_space_dimension_overflow(topology(),
+				   "expand_dimension(v, m)",
+				   "adding m new space dimensions exceeds "
+				   "the maximum allowed space dimension");
+
+  // Nothing to do, if no dimensions must be added.
+  if (m == 0)
+    return;
+
+  // Keep track of the dimension before adding the new ones.
+  dimension_type old_dim = space_dim;
+
+  // Add the required new dimensions.
+  add_space_dimensions_and_embed(m);
+
+  const dimension_type src_d = var.id();
+  const Constraint_System& cs = constraints();
+  Constraint_System new_constraints;
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); i != cs_end; ++i) {
+    const Constraint& c = *i;
+
+    // If `c' does not constrain `var', skip it.
+    if (c.coefficient(var) == 0)
+      continue;
+
+    // Each relevant constraint results in `m' new constraints.
+    for (dimension_type dst_d = old_dim; dst_d < old_dim+m; ++dst_d) {
+      Linear_Expression e;
+      for (dimension_type j = old_dim; j-- > 0; )
+	e +=
+	  c.coefficient(Variable(j))
+	  * (j == src_d ? Variable(dst_d) : Variable(j));
+      e += c.inhomogeneous_term();
+      new_constraints.insert(c.is_equality()
+			     ? (e == 0)
+			     : (c.is_nonstrict_inequality()
+				? (e >= 0)
+				: (e > 0)));
+    }
+  }
+  add_constraints(new_constraints);
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::fold_space_dimensions(const Variables_Set& to_be_folded,
+				       Variable var) {
+  // TODO: this implementation is _really_ an executable specification.
+
+  // `var' should be one of the dimensions of the polyhedron.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var);
+
+  // The folding of no dimensions is a no-op.
+  if (to_be_folded.empty())
+    return;
+
+  // All variables in `to_be_folded' should be dimensions of the polyhedron.
+  if (to_be_folded.rbegin()->space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(tbf, v)",
+				 "*tbf.rbegin()",
+				 *to_be_folded.rbegin());
+
+  // Moreover, `var' should not occur in `to_be_folded'.
+  if (to_be_folded.find(var) != to_be_folded.end())
+    throw_invalid_argument("fold_space_dimensions(tbf, v)",
+			   "v should not occur in tbf");
+
+  for (Variables_Set::const_iterator i = to_be_folded.begin(),
+	 tbf_end = to_be_folded.end(); i != tbf_end; ++i) {
+    Polyhedron copy = *this;
+    copy.affine_image(var, Linear_Expression(*i));
+    poly_hull_assign(copy);
+  }
+  remove_space_dimensions(to_be_folded);
+  assert(OK());
+}
diff --git a/src/Polyhedron_nonpublic.cc b/src/Polyhedron_nonpublic.cc
new file mode 100644
index 0000000..66e75b6
--- /dev/null
+++ b/src/Polyhedron_nonpublic.cc
@@ -0,0 +1,1568 @@
+/* Polyhedron class implementation
+   (non-inline private or protected functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Polyhedron.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cassert>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_defines
+  \brief
+  Controls the laziness level of the implementation.
+
+  Temporarily used in a few of the function implementations to
+  switch to an even more lazy algorithm. To be removed as soon as
+  we collect enough information to decide which is the better
+  implementation alternative.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Polyhedron::Polyhedron(const Topology topol,
+			    const dimension_type num_dimensions,
+			    const Degenerate_Element kind)
+  : con_sys(topol),
+    gen_sys(topol),
+    sat_c(),
+    sat_g() {
+  // Protecting against space dimension overflow is up to the caller.
+  assert(num_dimensions <= max_space_dimension());
+
+  if (kind == EMPTY)
+    status.set_empty();
+  else if (num_dimensions > 0) {
+    con_sys.add_low_level_constraints();
+    con_sys.adjust_topology_and_space_dimension(topol, num_dimensions);
+    set_constraints_minimized();
+  }
+  space_dim = num_dimensions;
+  assert(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Polyhedron& y)
+  : con_sys(y.topology()),
+    gen_sys(y.topology()),
+    status(y.status),
+    space_dim(y.space_dim) {
+  // Being a protected method, we simply assert that topologies do match.
+  assert(topology() == y.topology());
+  if (y.constraints_are_up_to_date())
+    con_sys.assign_with_pending(y.con_sys);
+  if (y.generators_are_up_to_date())
+    gen_sys.assign_with_pending(y.gen_sys);
+  if (y.sat_c_is_up_to_date())
+    sat_c = y.sat_c;
+  if (y.sat_g_is_up_to_date())
+    sat_g = y.sat_g;
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol, const Constraint_System& ccs)
+  : con_sys(topol),
+    gen_sys(topol),
+    sat_c(),
+    sat_g() {
+  // Protecting against space dimension overflow is up to the caller.
+  assert(ccs.space_dimension() <= max_space_dimension());
+
+  // TODO: this implementation is just an executable specification.
+  Constraint_System cs = ccs;
+
+  // Try to adapt `cs' to the required topology.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (!cs.adjust_topology_and_space_dimension(topol, cs_space_dim))
+    throw_topology_incompatible((topol == NECESSARILY_CLOSED)
+				? "C_Polyhedron(cs)"
+				: "NNC_Polyhedron(cs)", "cs", cs);
+
+  // Set the space dimension.
+  space_dim = cs_space_dim;
+
+  if (space_dim > 0) {
+    // Stealing the rows from `cs'.
+    std::swap(con_sys, cs);
+    if (con_sys.num_pending_rows() > 0) {
+      // Even though `cs' has pending constraints, since the generators
+      // of the polyhedron are not up-to-date, the polyhedron cannot
+      // have pending constraints. By integrating the pending part
+      // of `con_sys' we may loose sortedness.
+      con_sys.unset_pending_rows();
+      con_sys.set_sorted(false);
+    }
+    con_sys.add_low_level_constraints();
+    set_constraints_up_to_date();
+  }
+  else {
+    // Here `space_dim == 0'.
+    if (cs.num_columns() > 0)
+      // See if an inconsistent constraint has been passed.
+      for (dimension_type i = cs.num_rows(); i-- > 0; )
+	if (cs[i].is_inconsistent()) {
+	  // Inconsistent constraint found: the polyhedron is empty.
+	  set_empty();
+	  break;
+	}
+  }
+  assert(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol, Constraint_System& cs)
+  : con_sys(topol),
+    gen_sys(topol),
+    sat_c(),
+    sat_g() {
+  // Protecting against space dimension overflow is up to the caller.
+  assert(cs.space_dimension() <= max_space_dimension());
+
+  // Try to adapt `cs' to the required topology.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (!cs.adjust_topology_and_space_dimension(topol, cs_space_dim))
+    throw_topology_incompatible((topol == NECESSARILY_CLOSED)
+				? "C_Polyhedron(cs)"
+				: "NNC_Polyhedron(cs)", "cs", cs);
+
+  // Set the space dimension.
+  space_dim = cs_space_dim;
+
+  if (space_dim > 0) {
+    // Stealing the rows from `cs'.
+    std::swap(con_sys, cs);
+    if (con_sys.num_pending_rows() > 0) {
+      // Even though `cs' has pending constraints, since the generators
+      // of the polyhedron are not up-to-date, the polyhedron cannot
+      // have pending constraints. By integrating the pending part
+      // of `con_sys' we may loose sortedness.
+      con_sys.unset_pending_rows();
+      con_sys.set_sorted(false);
+    }
+    con_sys.add_low_level_constraints();
+    set_constraints_up_to_date();
+  }
+  else {
+    // Here `space_dim == 0'.
+    if (cs.num_columns() > 0)
+      // See if an inconsistent constraint has been passed.
+      for (dimension_type i = cs.num_rows(); i-- > 0; )
+	if (cs[i].is_inconsistent()) {
+	  // Inconsistent constraint found: the polyhedron is empty.
+	  set_empty();
+	  break;
+	}
+  }
+  assert(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol, const Generator_System& cgs)
+  : con_sys(topol),
+    gen_sys(topol),
+    sat_c(),
+    sat_g() {
+  // Protecting against space dimension overflow is up to the caller.
+  assert(cgs.space_dimension() <= max_space_dimension());
+
+  // TODO: this implementation is just an executable specification.
+  Generator_System gs = cgs;
+
+  // An empty set of generators defines the empty polyhedron.
+  if (gs.num_rows() == 0) {
+    space_dim = gs.space_dimension();
+    status.set_empty();
+    assert(OK());
+    return;
+  }
+
+  // Non-empty valid generator systems have a supporting point, at least.
+  if (!gs.has_points())
+    throw_invalid_generators((topol == NECESSARILY_CLOSED)
+			     ? "C_Polyhedron(gs)"
+			     : "NNC_Polyhedron(gs)", "gs");
+
+  const dimension_type gs_space_dim = gs.space_dimension();
+  // Try to adapt `gs' to the required topology.
+  if (!gs.adjust_topology_and_space_dimension(topol, gs_space_dim))
+    throw_topology_incompatible((topol == NECESSARILY_CLOSED)
+				? "C_Polyhedron(gs)"
+				: "NNC_Polyhedron(gs)", "gs", gs);
+
+  if (gs_space_dim > 0) {
+    // Stealing the rows from `gs'.
+    std::swap(gen_sys, gs);
+    // In a generator system describing a NNC polyhedron,
+    // for each point we must also have the corresponding closure point.
+    if (topol == NOT_NECESSARILY_CLOSED)
+      gen_sys.add_corresponding_closure_points();
+    if (gen_sys.num_pending_rows() > 0) {
+      // Even though `gs' has pending generators, since the constraints
+      // of the polyhedron are not up-to-date, the polyhedron cannot
+      // have pending generators. By integrating the pending part
+      // of `gen_sys' we may loose sortedness.
+      gen_sys.unset_pending_rows();
+      gen_sys.set_sorted(false);
+    }
+    // Generators are now up-to-date.
+    set_generators_up_to_date();
+
+    // Set the space dimension.
+    space_dim = gs_space_dim;
+    assert(OK());
+    return;
+  }
+
+  // Here `gs.num_rows > 0' and `gs_space_dim == 0':
+  // we already checked for both the topology-compatibility
+  // and the supporting point.
+  space_dim = 0;
+  assert(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol, Generator_System& gs)
+  : con_sys(topol),
+    gen_sys(topol),
+    sat_c(),
+    sat_g() {
+  // Protecting against space dimension overflow is up to the caller.
+  assert(gs.space_dimension() <= max_space_dimension());
+
+  // An empty set of generators defines the empty polyhedron.
+  if (gs.num_rows() == 0) {
+    space_dim = gs.space_dimension();
+    status.set_empty();
+    assert(OK());
+    return;
+  }
+
+  // Non-empty valid generator systems have a supporting point, at least.
+  if (!gs.has_points())
+    throw_invalid_generators((topol == NECESSARILY_CLOSED)
+			     ? "C_Polyhedron(gs)"
+			     : "NNC_Polyhedron(gs)", "gs");
+
+  const dimension_type gs_space_dim = gs.space_dimension();
+  // Try to adapt `gs' to the required topology.
+  if (!gs.adjust_topology_and_space_dimension(topol, gs_space_dim))
+    throw_topology_incompatible((topol == NECESSARILY_CLOSED)
+				? "C_Polyhedron(gs)"
+				: "NNC_Polyhedron(gs)", "gs", gs);
+
+  if (gs_space_dim > 0) {
+    // Stealing the rows from `gs'.
+    std::swap(gen_sys, gs);
+    // In a generator system describing a NNC polyhedron,
+    // for each point we must also have the corresponding closure point.
+    if (topol == NOT_NECESSARILY_CLOSED)
+      gen_sys.add_corresponding_closure_points();
+    if (gen_sys.num_pending_rows() > 0) {
+      // Even though `gs' has pending generators, since the constraints
+      // of the polyhedron are not up-to-date, the polyhedron cannot
+      // have pending generators. By integrating the pending part
+      // of `gen_sys' we may loose sortedness.
+      gen_sys.unset_pending_rows();
+      gen_sys.set_sorted(false);
+    }
+    // Generators are now up-to-date.
+    set_generators_up_to_date();
+
+    // Set the space dimension.
+    space_dim = gs_space_dim;
+    assert(OK());
+    return;
+  }
+
+  // Here `gs.num_rows > 0' and `gs_space_dim == 0':
+  // we already checked for both the topology-compatibility
+  // and the supporting point.
+  space_dim = 0;
+  assert(OK());
+}
+
+PPL::Polyhedron&
+PPL::Polyhedron::operator=(const Polyhedron& y) {
+  // Being a protected method, we simply assert that topologies do match.
+  assert(topology() == y.topology());
+  space_dim = y.space_dim;
+  if (y.marked_empty())
+    set_empty();
+  else if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    status = y.status;
+    if (y.constraints_are_up_to_date())
+      con_sys.assign_with_pending(y.con_sys);
+    if (y.generators_are_up_to_date())
+      gen_sys.assign_with_pending(y.gen_sys);
+    if (y.sat_c_is_up_to_date())
+      sat_c = y.sat_c;
+    if (y.sat_g_is_up_to_date())
+      sat_g = y.sat_g;
+  }
+  return *this;
+}
+
+PPL::Polyhedron::Three_Valued_Boolean
+PPL::Polyhedron::quick_equivalence_test(const Polyhedron& y) const {
+  // Private method: the caller must ensure the following.
+  assert(topology() == y.topology());
+  assert(space_dim == y.space_dim);
+  assert(!marked_empty() && !y.marked_empty() && space_dim > 0);
+
+  const Polyhedron& x = *this;
+
+  if (x.is_necessarily_closed()) {
+    if (!x.has_something_pending() && !y.has_something_pending()) {
+      bool css_normalized = false;
+      if (x.constraints_are_minimized() && y.constraints_are_minimized()) {
+	// Equivalent minimized constraint systems have:
+	//  - the same number of constraints; ...
+	if (x.con_sys.num_rows() != y.con_sys.num_rows())
+	  return Polyhedron::TVB_FALSE;
+	//  - the same number of equalities; ...
+	dimension_type x_num_equalities = x.con_sys.num_equalities();
+	if (x_num_equalities != y.con_sys.num_equalities())
+	  return Polyhedron::TVB_FALSE;
+	//  - if there are no equalities, they have the same constraints.
+	//    Delay this test: try cheaper tests on generators first.
+	css_normalized = (x_num_equalities == 0);
+      }
+
+      if (x.generators_are_minimized() && y.generators_are_minimized()) {
+	// Equivalent minimized generator systems have:
+	//  - the same number of generators; ...
+	if (x.gen_sys.num_rows() != y.gen_sys.num_rows())
+	  return Polyhedron::TVB_FALSE;
+	//  - the same number of lines; ...
+	const dimension_type x_num_lines = x.gen_sys.num_lines();
+	if (x_num_lines != y.gen_sys.num_lines())
+	  return Polyhedron::TVB_FALSE;
+	//  - if there are no lines, they have the same generators.
+	if (x_num_lines == 0) {
+	  // Sort the two systems and check for syntactic identity.
+	  x.obtain_sorted_generators();
+	  y.obtain_sorted_generators();
+	  if (x.gen_sys == y.gen_sys)
+	    return Polyhedron::TVB_TRUE;
+	  else
+	    return Polyhedron::TVB_FALSE;
+	}
+      }
+
+      if (css_normalized) {
+	// Sort the two systems and check for identity.
+	x.obtain_sorted_constraints();
+	y.obtain_sorted_constraints();
+	if (x.con_sys == y.con_sys)
+	    return Polyhedron::TVB_TRUE;
+	  else
+	    return Polyhedron::TVB_FALSE;
+      }
+    }
+  }
+  return Polyhedron::TVB_DONT_KNOW;
+}
+
+bool
+PPL::Polyhedron::is_included_in(const Polyhedron& y) const {
+  // Private method: the caller must ensure the following.
+  assert(topology() == y.topology());
+  assert(space_dim == y.space_dim);
+  assert(!marked_empty() && !y.marked_empty() && space_dim > 0);
+
+  const Polyhedron& x = *this;
+
+  // `x' cannot have pending constraints, because we need its generators.
+  if (x.has_pending_constraints() && !x.process_pending_constraints())
+    return true;
+  // `y' cannot have pending generators, because we need its constraints.
+  if (y.has_pending_generators())
+    y.process_pending_generators();
+
+#if BE_LAZY
+  if (!x.generators_are_up_to_date() && !x.update_generators())
+    return true;
+  if (!y.constraints_are_up_to_date())
+    y.update_constraints();
+#else
+  if (!x.generators_are_minimized())
+    x.minimize();
+  if (!y.constraints_are_minimized())
+    y.minimize();
+#endif
+
+  assert(x.OK());
+  assert(y.OK());
+
+  const Generator_System& gs = x.gen_sys;
+  const Constraint_System& cs = y.con_sys;
+
+  if (x.is_necessarily_closed())
+    // When working with necessarily closed polyhedra,
+    // `x' is contained in `y' if and only if all the generators of `x'
+    // satisfy all the inequalities and saturate all the equalities of `y'.
+    // This comes from the definition of a polyhedron as the set of
+    // vectors satisfying a constraint system and the fact that all
+    // vectors in `x' can be obtained by suitably combining its generators.
+    for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+      const Constraint& c = cs[i];
+      if (c.is_inequality()) {
+	for (dimension_type j = gs.num_rows(); j-- > 0; ) {
+	  const Generator& g = gs[j];
+	  const int sp_sign = Scalar_Products::sign(c, g);
+	  if (g.is_line()) {
+	    if (sp_sign != 0)
+	      return false;
+	  }
+	  else
+	    // `g' is a ray or a point.
+	    if (sp_sign < 0)
+	      return false;
+	}
+      }
+      else {
+	// `c' is an equality.
+	for (dimension_type j = gs.num_rows(); j-- > 0; )
+	  if (Scalar_Products::sign(c, gs[j]) != 0)
+	    return false;
+      }
+    }
+  else {
+    // Here we have an NNC polyhedron: using the reduced scalar product,
+    // which ignores the epsilon coefficient.
+    for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+      const Constraint& c = cs[i];
+      switch (c.type()) {
+      case Constraint::NONSTRICT_INEQUALITY:
+	for (dimension_type j = gs.num_rows(); j-- > 0; ) {
+	  const Generator& g = gs[j];
+	  const int sp_sign = Scalar_Products::reduced_sign(c, g);
+	  if (g.is_line()) {
+	    if (sp_sign != 0)
+	      return false;
+	  }
+	  else
+	    // `g' is a ray or a point or a closure point.
+	    if (sp_sign < 0)
+	      return false;
+	}
+	break;
+      case Constraint::EQUALITY:
+	for (dimension_type j = gs.num_rows(); j-- > 0; )
+	  if (Scalar_Products::reduced_sign(c, gs[j]) != 0)
+	    return false;
+	break;
+      case Constraint::STRICT_INEQUALITY:
+	for (dimension_type j = gs.num_rows(); j-- > 0; ) {
+	  const Generator& g = gs[j];
+	  const int sp_sign = Scalar_Products::reduced_sign(c, g);
+	  switch (g.type()) {
+	  case Generator::POINT:
+	    // If a point violates or saturates a strict inequality
+	    // (when ignoring the epsilon coefficients) then it is
+	    // not included in the polyhedron.
+	    if (sp_sign <= 0)
+	      return false;
+	    break;
+	  case Generator::LINE:
+	    // Lines have to saturate all constraints.
+	    if (sp_sign != 0)
+	      return false;
+	    break;
+	  case Generator::RAY:
+	    // Intentionally fall through.
+	  case Generator::CLOSURE_POINT:
+	    // The generator is a ray or closure point: usual test.
+	    if (sp_sign < 0)
+	      return false;
+	    break;
+	  }
+	}
+	break;
+      }
+    }
+  }
+
+  // Inclusion holds.
+  return true;
+}
+
+bool
+PPL::Polyhedron::bounds(const Linear_Expression& expr,
+			const bool from_above) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+				  ? "bounds_from_above(e)"
+				  : "bounds_from_below(e)"), "e", expr);
+
+  // A zero-dimensional or empty polyhedron bounds everything.
+  if (space_dim == 0
+      || marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    return true;
+
+  // The polyhedron has updated, possibly pending generators.
+  for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+    const Generator& g = gen_sys[i];
+    // Only lines and rays in `*this' can cause `expr' to be unbounded.
+    if (g.is_line_or_ray()) {
+      const int sp_sign = Scalar_Products::homogeneous_sign(expr, g);
+      if (sp_sign != 0
+	  && (g.is_line()
+	      || (from_above && sp_sign > 0)
+	      || (!from_above && sp_sign < 0)))
+	// `*this' does not bound `expr'.
+	return false;
+    }
+  }
+  // No sources of unboundedness have been found for `expr'
+  // in the given direction.
+  return true;
+}
+
+bool
+PPL::Polyhedron::max_min(const Linear_Expression& expr,
+			 const bool maximize,
+			 Coefficient& ext_n, Coefficient& ext_d,
+			 bool& included,
+			 Generator& point) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+				  ? "maximize(e, ...)"
+				  : "minimize(e, ...)"), "e", expr);
+
+  // For an empty polyhedron we simply return false.
+  if (marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    return false;
+
+  // The polyhedron has updated, possibly pending generators.
+  // The following loop will iterate through the generator
+  // to find the extremum.
+  mpq_class extremum;
+
+  // True if we have no other candidate extremum to compare with.
+  bool first_candidate = true;
+
+  // To store the position of the current candidate extremum.
+  // Initialized only to avoid a compiler warning.
+  dimension_type ext_position = 0;
+
+  // Whether the current candidate extremum is included or not.
+  // Initialized only to avoid a compiler warning.
+  bool ext_included = false;
+
+  TEMP_INTEGER(sp);
+  for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+    const Generator& g = gen_sys[i];
+    Scalar_Products::homogeneous_assign(sp, expr, g);
+    // Lines and rays in `*this' can cause `expr' to be unbounded.
+    if (g.is_line_or_ray()) {
+      const int sp_sign = sgn(sp);
+      if (sp_sign != 0
+	  && (g.is_line()
+	      || (maximize && sp_sign > 0)
+	      || (!maximize && sp_sign < 0)))
+	// `expr' is unbounded in `*this'.
+	return false;
+    }
+    else {
+      // We have a point or a closure point.
+      assert(g.is_point() || g.is_closure_point());
+      // Notice that we are ignoring the constant term in `expr' here.
+      // We will add it to the extremum as soon as we find it.
+      mpq_class candidate;
+      assign_r(candidate.get_num(), sp, ROUND_NOT_NEEDED);
+      assign_r(candidate.get_den(), g[0], ROUND_NOT_NEEDED);
+      candidate.canonicalize();
+      const bool g_is_point = g.is_point();
+      if (first_candidate
+	  || (maximize
+	      && (candidate > extremum
+		  || (g_is_point
+		      && !ext_included
+		      && candidate == extremum)))
+	  || (!maximize
+	      && (candidate < extremum
+		  || (g_is_point
+		      && !ext_included
+		      && candidate == extremum)))) {
+	// We have a (new) candidate extremum.
+	first_candidate = false;
+	extremum = candidate;
+	ext_position = i;
+	ext_included = g_is_point;
+      }
+    }
+  }
+
+  // Add in the constant term in `expr'.
+  mpz_class n;
+  assign_r(n, expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+  extremum += n;
+
+  // The polyhedron is bounded in the right direction and we have
+  // computed the extremum: write the result into the caller's structures.
+  assert(!first_candidate);
+  ext_n = Coefficient(extremum.get_num());
+  ext_d = Coefficient(extremum.get_den());
+  included = ext_included;
+  point = gen_sys[ext_position];
+
+  return true;
+}
+
+void
+PPL::Polyhedron::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+  space_dim = 0;
+  con_sys.clear();
+  gen_sys.clear();
+}
+
+void
+PPL::Polyhedron::set_empty() {
+  status.set_empty();
+  // The polyhedron is empty: we can thus throw away everything.
+  con_sys.clear();
+  gen_sys.clear();
+  sat_c.clear();
+  sat_g.clear();
+}
+
+bool
+PPL::Polyhedron::process_pending_constraints() const {
+  assert(space_dim > 0 && !marked_empty());
+  assert(has_pending_constraints() && !has_pending_generators());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // Integrate the pending part of the system of constraints and minimize.
+  // We need `sat_c' up-to-date and `con_sys' sorted (together with `sat_c').
+  if (!x.sat_c_is_up_to_date())
+    x.sat_c.transpose_assign(x.sat_g);
+  if (!x.con_sys.is_sorted())
+    x.obtain_sorted_constraints_with_sat_c();
+  // We sort in place the pending constraints, erasing those constraints
+  // that also occur in the non-pending part of `con_sys'.
+  x.con_sys.sort_pending_and_remove_duplicates();
+  if (x.con_sys.num_pending_rows() == 0) {
+    // All pending constraints were duplicates.
+    x.clear_pending_constraints();
+    assert(OK(true));
+    return true;
+  }
+
+  const bool empty = add_and_minimize(true, x.con_sys, x.gen_sys, x.sat_c);
+  assert(x.con_sys.num_pending_rows() == 0);
+
+  if (empty)
+    x.set_empty();
+  else {
+    x.clear_pending_constraints();
+    x.clear_sat_g_up_to_date();
+    x.set_sat_c_up_to_date();
+  }
+  assert(OK(!empty));
+  return !empty;
+}
+
+void
+PPL::Polyhedron::process_pending_generators() const {
+  assert(space_dim > 0 && !marked_empty());
+  assert(has_pending_generators() && !has_pending_constraints());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // Integrate the pending part of the system of generators and minimize.
+  // We need `sat_g' up-to-date and `gen_sys' sorted (together with `sat_g').
+  if (!x.sat_g_is_up_to_date())
+    x.sat_g.transpose_assign(x.sat_c);
+  if (!x.gen_sys.is_sorted())
+    x.obtain_sorted_generators_with_sat_g();
+  // We sort in place the pending generators, erasing those generators
+  // that also occur in the non-pending part of `gen_sys'.
+  x.gen_sys.sort_pending_and_remove_duplicates();
+  if (x.gen_sys.num_pending_rows() == 0) {
+    // All pending generators were duplicates.
+    x.clear_pending_generators();
+    assert(OK(true));
+    return;
+  }
+
+  add_and_minimize(false, x.gen_sys, x.con_sys, x.sat_g);
+  assert(x.gen_sys.num_pending_rows() == 0);
+
+  x.clear_pending_generators();
+  x.clear_sat_c_up_to_date();
+  x.set_sat_g_up_to_date();
+}
+
+void
+PPL::Polyhedron::remove_pending_to_obtain_constraints() const {
+  assert(has_something_pending());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // If the polyhedron has pending constraints, simply unset them.
+  if (x.has_pending_constraints()) {
+    // Integrate the pending constraints, which are possibly not sorted.
+    x.con_sys.unset_pending_rows();
+    x.con_sys.set_sorted(false);
+    x.clear_pending_constraints();
+    x.clear_constraints_minimized();
+    x.clear_generators_up_to_date();
+  }
+  else {
+    assert(x.has_pending_generators());
+    // We must process the pending generators and obtain the
+    // corresponding system of constraints.
+    x.process_pending_generators();
+  }
+  assert(OK(true));
+}
+
+bool
+PPL::Polyhedron::remove_pending_to_obtain_generators() const {
+  assert(has_something_pending());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // If the polyhedron has pending generators, simply unset them.
+  if (x.has_pending_generators()) {
+    // Integrate the pending generators, which are possibly not sorted.
+    x.gen_sys.unset_pending_rows();
+    x.gen_sys.set_sorted(false);
+    x.clear_pending_generators();
+    x.clear_generators_minimized();
+    x.clear_constraints_up_to_date();
+    assert(OK(true));
+    return true;
+  }
+  else {
+    assert(x.has_pending_constraints());
+    // We must integrate the pending constraints and obtain the
+    // corresponding system of generators.
+    return x.process_pending_constraints();
+  }
+}
+
+void
+PPL::Polyhedron::update_constraints() const {
+  assert(space_dim > 0);
+  assert(!marked_empty());
+  assert(generators_are_up_to_date());
+  // We assume the polyhedron has no pending constraints or generators.
+  assert(!has_something_pending());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  minimize(false, x.gen_sys, x.con_sys, x.sat_c);
+  // `sat_c' is the only saturation matrix up-to-date.
+  x.set_sat_c_up_to_date();
+  x.clear_sat_g_up_to_date();
+  // The system of constraints and the system of generators
+  // are minimized.
+  x.set_constraints_minimized();
+  x.set_generators_minimized();
+}
+
+bool
+PPL::Polyhedron::update_generators() const {
+  assert(space_dim > 0);
+  assert(!marked_empty());
+  assert(constraints_are_up_to_date());
+  // We assume the polyhedron has no pending constraints or generators.
+  assert(!has_something_pending());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  // If the system of constraints is not consistent the
+  // polyhedron is empty.
+  const bool empty = minimize(true, x.con_sys, x.gen_sys, x.sat_g);
+  if (empty)
+    x.set_empty();
+  else {
+    // `sat_g' is the only saturation matrix up-to-date.
+    x.set_sat_g_up_to_date();
+    x.clear_sat_c_up_to_date();
+    // The system of constraints and the system of generators
+    // are minimized.
+    x.set_constraints_minimized();
+    x.set_generators_minimized();
+  }
+  return !empty;
+}
+
+void
+PPL::Polyhedron::update_sat_c() const {
+  assert(constraints_are_minimized());
+  assert(generators_are_minimized());
+  assert(!sat_c_is_up_to_date());
+
+  // We only consider non-pending rows.
+  const dimension_type csr = con_sys.first_pending_row();
+  const dimension_type gsr = gen_sys.first_pending_row();
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // The columns of `sat_c' represent the constraints and
+  // its rows represent the generators: resize accordingly.
+  x.sat_c.resize(gsr, csr);
+  for (dimension_type i = gsr; i-- > 0; )
+    for (dimension_type j = csr; j-- > 0; ) {
+      const int sp_sign = Scalar_Products::sign(con_sys[j], gen_sys[i]);
+      // The negativity of this scalar product would mean
+      // that the generator `gen_sys[i]' violates the constraint
+      // `con_sys[j]' and it is not possible because both generators
+      // and constraints are up-to-date.
+      assert(sp_sign >= 0);
+      if (sp_sign > 0)
+	// `gen_sys[i]' satisfies (without saturate) `con_sys[j]'.
+	x.sat_c[i].set(j);
+      else
+	// `gen_sys[i]' saturates `con_sys[j]'.
+	x.sat_c[i].clear(j);
+    }
+  x.set_sat_c_up_to_date();
+}
+
+void
+PPL::Polyhedron::update_sat_g() const {
+  assert(constraints_are_minimized());
+  assert(generators_are_minimized());
+  assert(!sat_g_is_up_to_date());
+
+  // We only consider non-pending rows.
+  const dimension_type csr = con_sys.first_pending_row();
+  const dimension_type gsr = gen_sys.first_pending_row();
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // The columns of `sat_g' represent generators and its
+  // rows represent the constraints: resize accordingly.
+  x.sat_g.resize(csr, gsr);
+  for (dimension_type i = csr; i-- > 0; )
+    for (dimension_type j = gsr; j-- > 0; ) {
+      const int sp_sign = Scalar_Products::sign(con_sys[i], gen_sys[j]);
+      // The negativity of this scalar product would mean
+      // that the generator `gen_sys[j]' violates the constraint
+      // `con_sys[i]' and it is not possible because both generators
+      // and constraints are up-to-date.
+      assert(sp_sign >= 0);
+      if (sp_sign > 0)
+	// `gen_sys[j]' satisfies (without saturate) `con_sys[i]'.
+	x.sat_g[i].set(j);
+      else
+	// `gen_sys[j]' saturates `con_sys[i]'.
+	x.sat_g[i].clear(j);
+    }
+  x.set_sat_g_up_to_date();
+}
+
+void
+PPL::Polyhedron::obtain_sorted_constraints() const {
+  assert(constraints_are_up_to_date());
+  // `con_sys' will be sorted up to `index_first_pending'.
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  if (!x.con_sys.is_sorted())
+    if (x.sat_g_is_up_to_date()) {
+      // Sorting constraints keeping `sat_g' consistent.
+      x.con_sys.sort_and_remove_with_sat(x.sat_g);
+      // `sat_c' is not up-to-date anymore.
+      x.clear_sat_c_up_to_date();
+    }
+    else if (x.sat_c_is_up_to_date()) {
+      // Using `sat_c' to obtain `sat_g', then it is like previous case.
+      x.sat_g.transpose_assign(x.sat_c);
+      x.con_sys.sort_and_remove_with_sat(x.sat_g);
+      x.set_sat_g_up_to_date();
+      x.clear_sat_c_up_to_date();
+    }
+    else
+      // If neither `sat_g' nor `sat_c' are up-to-date,
+      // we just sort the constraints.
+      x.con_sys.sort_rows();
+
+  assert(con_sys.check_sorted());
+}
+
+void
+PPL::Polyhedron::obtain_sorted_generators() const {
+  assert(generators_are_up_to_date());
+  // `gen_sys' will be sorted up to `index_first_pending'.
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  if (!x.gen_sys.is_sorted())
+    if (x.sat_c_is_up_to_date()) {
+      // Sorting generators keeping 'sat_c' consistent.
+      x.gen_sys.sort_and_remove_with_sat(x.sat_c);
+      // `sat_g' is not up-to-date anymore.
+      x.clear_sat_g_up_to_date();
+    }
+    else if (x.sat_g_is_up_to_date()) {
+      // Obtaining `sat_c' from `sat_g' and proceeding like previous case.
+      x.sat_c.transpose_assign(x.sat_g);
+      x.gen_sys.sort_and_remove_with_sat(x.sat_c);
+      x.set_sat_c_up_to_date();
+      x.clear_sat_g_up_to_date();
+    }
+    else
+      // If neither `sat_g' nor `sat_c' are up-to-date, we just sort
+      // the generators.
+      x.gen_sys.sort_rows();
+
+  assert(gen_sys.check_sorted());
+}
+
+void
+PPL::Polyhedron::obtain_sorted_constraints_with_sat_c() const {
+  assert(constraints_are_up_to_date());
+  assert(constraints_are_minimized());
+  // `con_sys' will be sorted up to `index_first_pending'.
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  // At least one of the saturation matrices must be up-to-date.
+  if (!x.sat_c_is_up_to_date() && !x.sat_g_is_up_to_date())
+    x.update_sat_c();
+
+  if (x.con_sys.is_sorted()) {
+    if (x.sat_c_is_up_to_date())
+      // If constraints are already sorted and sat_c is up to
+      // date there is nothing to do.
+      return;
+  }
+  else {
+    if (!x.sat_g_is_up_to_date()) {
+      // If constraints are not sorted and sat_g is not up-to-date
+      // we obtain sat_g from sat_c (that has to be up-to-date)...
+      x.sat_g.transpose_assign(x.sat_c);
+      x.set_sat_g_up_to_date();
+    }
+    // ... and sort it together with constraints.
+    x.con_sys.sort_and_remove_with_sat(x.sat_g);
+  }
+  // Obtaining sat_c from sat_g.
+  x.sat_c.transpose_assign(x.sat_g);
+  x.set_sat_c_up_to_date();
+  // Constraints are sorted now.
+  x.con_sys.set_sorted(true);
+
+  assert(con_sys.check_sorted());
+}
+
+void
+PPL::Polyhedron::obtain_sorted_generators_with_sat_g() const {
+  assert(generators_are_up_to_date());
+  // `gen_sys' will be sorted up to `index_first_pending'.
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  // At least one of the saturation matrices must be up-to-date.
+  if (!x.sat_c_is_up_to_date() && !x.sat_g_is_up_to_date())
+    x.update_sat_g();
+
+  if (x.gen_sys.is_sorted()) {
+    if (x.sat_g_is_up_to_date())
+      // If generators are already sorted and sat_g is up to
+      // date there is nothing to do.
+      return;
+  }
+  else {
+    if (!x.sat_c_is_up_to_date()) {
+      // If generators are not sorted and sat_c is not up-to-date
+      // we obtain sat_c from sat_g (that has to be up-to-date)...
+      x.sat_c.transpose_assign(x.sat_g);
+      x.set_sat_c_up_to_date();
+    }
+    // ... and sort it together with generators.
+    x.gen_sys.sort_and_remove_with_sat(x.sat_c);
+  }
+  // Obtaining sat_g from sat_c.
+  x.sat_g.transpose_assign(sat_c);
+  x.set_sat_g_up_to_date();
+  // Generators are sorted now.
+  x.gen_sys.set_sorted(true);
+
+  assert(gen_sys.check_sorted());
+}
+
+bool
+PPL::Polyhedron::minimize() const {
+  // 0-dim space or empty polyhedra are already minimized.
+  if (marked_empty())
+    return false;
+  if (space_dim == 0)
+    return true;
+
+  // If the polyhedron has something pending, process it.
+  if (has_something_pending()) {
+    const bool not_empty = process_pending();
+    assert(OK());
+    return not_empty;
+  }
+
+  // Here there are no pending constraints or generators.
+  // Is the polyhedron already minimized?
+  if (constraints_are_minimized() && generators_are_minimized())
+    return true;
+
+  // If constraints or generators are up-to-date, invoking
+  // update_generators() or update_constraints(), respectively,
+  // minimizes both constraints and generators.
+  // If both are up-to-date it does not matter whether we use
+  // update_generators() or update_constraints():
+  // both minimize constraints and generators.
+  if (constraints_are_up_to_date()) {
+    // We may discover here that `*this' is empty.
+    const bool ret = update_generators();
+    assert(OK());
+    return ret;
+  }
+  else {
+    assert(generators_are_up_to_date());
+    update_constraints();
+    assert(OK());
+    return true;
+  }
+}
+
+bool
+PPL::Polyhedron::strongly_minimize_constraints() const {
+  assert(!is_necessarily_closed());
+
+  // From the user perspective, the polyhedron will not change.
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // We need `con_sys' (weakly) minimized and `gen_sys' up-to-date.
+  // `minimize()' will process any pending constraints or generators.
+  if (!minimize())
+    return false;
+
+  // If the polyhedron `*this' is zero-dimensional
+  // at this point it must be a universe polyhedron.
+  if (x.space_dim == 0)
+    return true;
+
+  // We also need `sat_g' up-to-date.
+  if (!sat_g_is_up_to_date()) {
+    assert(sat_c_is_up_to_date());
+    x.sat_g.transpose_assign(sat_c);
+  }
+
+  // These Saturation_Row's will be later used as masks in order to
+  // check saturation conditions restricted to particular subsets of
+  // the generator system.
+  Saturation_Row sat_all_but_rays;
+  Saturation_Row sat_all_but_points;
+  Saturation_Row sat_all_but_closure_points;
+
+  const dimension_type gs_rows = gen_sys.num_rows();
+  const dimension_type n_lines = gen_sys.num_lines();
+  for (dimension_type i = gs_rows; i-- > n_lines; )
+    switch (gen_sys[i].type()) {
+    case Generator::RAY:
+      sat_all_but_rays.set(i);
+      break;
+    case Generator::POINT:
+      sat_all_but_points.set(i);
+      break;
+    case Generator::CLOSURE_POINT:
+      sat_all_but_closure_points.set(i);
+      break;
+    default:
+      // Found a line with index i >= n_lines.
+      throw std::runtime_error("PPL internal error: "
+			       "strongly_minimize_constraints.");
+    }
+  Saturation_Row sat_lines_and_rays;
+  set_union(sat_all_but_points, sat_all_but_closure_points,
+	    sat_lines_and_rays);
+  Saturation_Row sat_lines_and_closure_points;
+  set_union(sat_all_but_rays, sat_all_but_points,
+	    sat_lines_and_closure_points);
+  Saturation_Row sat_lines;
+  set_union(sat_lines_and_rays, sat_lines_and_closure_points,
+	    sat_lines);
+
+  // These flags are maintained to later decide if we have to add the
+  // eps_leq_one constraint and whether or not the constraint system
+  // was changed.
+  bool changed = false;
+  bool found_eps_leq_one = false;
+
+  // For all the strict inequalities in `con_sys', check for
+  // eps-redundancy and eventually move them to the bottom part of the
+  // system.
+  Constraint_System& cs = x.con_sys;
+  Saturation_Matrix& sat = x.sat_g;
+  dimension_type cs_rows = cs.num_rows();
+  const dimension_type eps_index = cs.num_columns() - 1;
+  for (dimension_type i = 0; i < cs_rows; )
+    if (cs[i].is_strict_inequality()) {
+      // First, check if it is saturated by no closure points
+      Saturation_Row sat_ci;
+      set_union(sat[i], sat_lines_and_closure_points, sat_ci);
+      if (sat_ci == sat_lines) {
+	// It is saturated by no closure points.
+	if (!found_eps_leq_one) {
+	  // Check if it is the eps_leq_one constraint.
+	  const Constraint& c = cs[i];
+	  bool all_zeroes = true;
+	  for (dimension_type k = eps_index; k-- > 1; )
+	    if (c[k] != 0) {
+	      all_zeroes = false;
+	      break;
+	    }
+	  if (all_zeroes && (c[0] + c[eps_index] == 0)) {
+	    // We found the eps_leq_one constraint.
+	    found_eps_leq_one = true;
+	    // Consider next constraint.
+	    ++i;
+	    continue;
+	  }
+	}
+	// Here `cs[i]' is not the eps_leq_one constraint,
+	// so it is eps-redundant.
+	// Move it to the bottom of the constraint system,
+	// while keeping `sat_g' consistent.
+	--cs_rows;
+	std::swap(cs[i], cs[cs_rows]);
+	std::swap(sat[i], sat[cs_rows]);
+	// The constraint system is changed.
+	changed = true;
+	// Continue by considering next constraint,
+	// which is already in place due to the swap.
+	continue;
+      }
+      // Now we check if there exists another strict inequality
+      // constraint having a superset of its saturators,
+      // when disregarding points.
+      sat_ci.clear();
+      set_union(sat[i], sat_all_but_points, sat_ci);
+      bool eps_redundant = false;
+      for (dimension_type j = 0; j < cs_rows; ++j)
+	if (i != j && cs[j].is_strict_inequality()
+	    && subset_or_equal(sat[j], sat_ci)) {
+	  // Constraint `cs[i]' is eps-redundant:
+	  // move it to the bottom of the constraint system,
+	  // while keeping `sat_g' consistent.
+	  --cs_rows;
+	  std::swap(cs[i], cs[cs_rows]);
+	  std::swap(sat[i], sat[cs_rows]);
+	  eps_redundant = true;
+	  // The constraint system is changed.
+	  changed = true;
+	  break;
+	}
+      // Continue with next constraint, which is already in place
+      // due to the swap if we have found an eps-redundant constraint.
+      if (!eps_redundant)
+	++i;
+    }
+    else
+      // `cs[i]' is not a strict inequality: consider next constraint.
+      ++i;
+
+  if (changed) {
+    // If the constraint system has been changed, we have to erase
+    // the epsilon-redundant constraints.
+    assert(cs_rows < cs.num_rows());
+    cs.erase_to_end(cs_rows);
+    // The remaining constraints are not pending.
+    cs.unset_pending_rows();
+    // The constraint system is no longer sorted.
+    cs.set_sorted(false);
+    // The generator system is no longer up-to-date.
+    x.clear_generators_up_to_date();
+
+    // If we haven't found an upper bound for the epsilon dimension,
+    // then we have to check whether such an upper bound is implied
+    // by the remaining constraints (exploiting teh simplex algorithm).
+    if (!found_eps_leq_one) {
+      LP_Problem lp;
+      // KLUDGE: temporarily mark the constraint system as if it was
+      // necessarily closed, so that we can interpret the epsilon
+      // dimension as a standard dimension. Be careful to reset the
+      // topology of `cs' even on exceptional execution path.
+      cs.set_necessarily_closed();
+      try {
+	lp.add_constraints(cs);
+	cs.set_not_necessarily_closed();
+      }
+      catch (...) {
+	cs.set_not_necessarily_closed();
+	throw;
+      }
+      // The objective function is `epsilon'.
+      lp.set_objective_function(Variable(x.space_dim));
+      lp.set_optimization_mode(MAXIMIZATION);
+      LP_Problem_Status status = lp.solve();
+      assert(status != UNFEASIBLE_LP_PROBLEM);
+      // If the epsilon dimension is actually unbounded,
+      // then add the eps_leq_one constraint.
+      if (status == UNBOUNDED_LP_PROBLEM)
+	cs.insert(Constraint::epsilon_leq_one());
+    }
+  }
+
+  assert(OK());
+  return true;
+}
+
+bool
+PPL::Polyhedron::strongly_minimize_generators() const {
+  assert(!is_necessarily_closed());
+
+  // From the user perspective, the polyhedron will not change.
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // We need `gen_sys' (weakly) minimized and `con_sys' up-to-date.
+  // `minimize()' will process any pending constraints or generators.
+  if (!minimize())
+    return false;
+
+  // If the polyhedron `*this' is zero-dimensional
+  // at this point it must be a universe polyhedron.
+  if (x.space_dim == 0)
+    return true;
+
+  // We also need `sat_c' up-to-date.
+  if (!sat_c_is_up_to_date()) {
+    assert(sat_g_is_up_to_date());
+    x.sat_c.transpose_assign(sat_g);
+  }
+
+  // This Saturation_Row will have all and only the indexes
+  // of strict inequalities set to 1.
+  Saturation_Row sat_all_but_strict_ineq;
+  const dimension_type cs_rows = con_sys.num_rows();
+  const dimension_type n_equals = con_sys.num_equalities();
+  for (dimension_type i = cs_rows; i-- > n_equals; )
+    if (con_sys[i].is_strict_inequality())
+      sat_all_but_strict_ineq.set(i);
+
+  // Will record whether or not we changed the generator system.
+  bool changed = false;
+
+  // For all points in the generator system, check for eps-redundancy
+  // and eventually move them to the bottom part of the system.
+  Generator_System& gs = const_cast<Generator_System&>(gen_sys);
+  Saturation_Matrix& sat = const_cast<Saturation_Matrix&>(sat_c);
+  dimension_type gs_rows = gs.num_rows();
+  const dimension_type n_lines = gs.num_lines();
+  const dimension_type eps_index = gs.num_columns() - 1;
+  for (dimension_type i = n_lines; i < gs_rows; )
+    if (gs[i].is_point()) {
+      // Compute the Saturation_Row corresponding to the candidate point
+      // when strict inequality constraints are ignored.
+      Saturation_Row sat_gi;
+      set_union(sat[i], sat_all_but_strict_ineq, sat_gi);
+      // Check if the candidate point is actually eps-redundant:
+      // namely, if there exists another point that saturates
+      // all the non-strict inequalities saturated by the candidate.
+      bool eps_redundant = false;
+      for (dimension_type j = n_lines; j < gs_rows; ++j)
+	if (i != j && gs[j].is_point() && subset_or_equal(sat[j], sat_gi)) {
+	  // Point `gs[i]' is eps-redundant:
+	  // move it to the bottom of the generator system,
+	  // while keeping `sat_c' consistent.
+	  --gs_rows;
+	  std::swap(gs[i], gs[gs_rows]);
+	  std::swap(sat[i], sat[gs_rows]);
+	  eps_redundant = true;
+	  changed = true;
+	  break;
+	}
+      if (!eps_redundant) {
+	// Let all point encodings have epsilon coordinate 1.
+	Generator& gi = gs[i];
+	if (gi[eps_index] != gi[0]) {
+	  gi[eps_index] = gi[0];
+	  // Enforce normalization.
+	  gi.normalize();
+	  changed = true;
+	}
+	// Consider next generator.
+	++i;
+      }
+    }
+    else
+      // Consider next generator.
+      ++i;
+
+  // If needed, erase the eps-redundant generators (also updating
+  // `index_first_pending').
+  if (gs_rows < gs.num_rows()) {
+    gs.erase_to_end(gs_rows);
+    gs.unset_pending_rows();
+  }
+
+  if (changed) {
+    // The generator system is no longer sorted.
+    x.gen_sys.set_sorted(false);
+    // The constraint system is no longer up-to-date.
+    x.clear_constraints_up_to_date();
+  }
+
+  assert(OK());
+  return true;
+}
+
+void
+PPL::Polyhedron::throw_runtime_error(const char* method) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << "." << std::endl;
+  throw std::runtime_error(s.str());
+}
+
+void
+PPL::Polyhedron::throw_invalid_argument(const char* method,
+					const char* reason) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+					     const char* ph_name,
+					     const Polyhedron& ph) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << ph_name << " is a ";
+  if (ph.is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron." << std::endl;
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+					     const char* c_name,
+					     const Constraint&) const {
+  assert(is_necessarily_closed());
+  std::ostringstream s;
+  s << "PPL::C_Polyhedron::" << method << ":" << std::endl
+    << c_name << " is a strict inequality.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+					     const char* g_name,
+					     const Generator&) const {
+  assert(is_necessarily_closed());
+  std::ostringstream s;
+  s << "PPL::C_Polyhedron::" << method << ":" << std::endl
+    << g_name << " is a closure point.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+					     const char* cs_name,
+					     const Constraint_System&) const {
+  assert(is_necessarily_closed());
+  std::ostringstream s;
+  s << "PPL::C_Polyhedron::" << method << ":" << std::endl
+    << cs_name << " contains strict inequalities.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+					     const char* gs_name,
+					     const Generator_System&) const {
+  std::ostringstream s;
+  s << "PPL::C_Polyhedron::" << method << ":" << std::endl
+    << gs_name << " contains closure points.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+					      const char* other_name,
+					      dimension_type other_dim) const {
+  std::ostringstream s;
+  s << "PPL::"
+    << (is_necessarily_closed() ? "C_" : "NNC_")
+    << "Polyhedron::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << other_name << ".space_dimension() == " << other_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+					      const char* ph_name,
+					      const Polyhedron& ph) const {
+  throw_dimension_incompatible(method, ph_name, ph.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+					      const char* e_name,
+					      const Linear_Expression& e) const {
+  throw_dimension_incompatible(method, e_name, e.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+					      const char* c_name,
+					      const Constraint& c) const {
+  throw_dimension_incompatible(method, c_name, c.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+					      const char* g_name,
+					      const Generator& g) const {
+  throw_dimension_incompatible(method, g_name, g.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+					      const char* cg_name,
+					      const Congruence& cg) const {
+  throw_dimension_incompatible(method, cg_name, cg.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+					      const char* cs_name,
+					      const Constraint_System& cs) const {
+  throw_dimension_incompatible(method, cs_name, cs.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+					      const char* gs_name,
+					      const Generator_System& gs) const {
+  throw_dimension_incompatible(method, gs_name, gs.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+					      const char* cgs_name,
+					      const Congruence_System& cgs) const {
+  throw_dimension_incompatible(method, cgs_name, cgs.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+					      const char* var_name,
+					      const Variable var) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << var_name << ".space_dimension() == " << var.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::
+throw_dimension_incompatible(const char* method,
+			     dimension_type required_space_dim) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required space dimension == " << required_space_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_space_dimension_overflow(const Topology topol,
+						const char* method,
+						const char* reason) {
+  std::ostringstream s;
+  s << "PPL::";
+  if (topol == NECESSARILY_CLOSED)
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::length_error(s.str());
+}
+
+void
+PPL::Polyhedron::throw_invalid_generator(const char* method,
+					 const char* g_name) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << "*this is an empty polyhedron and "
+    << g_name << " is not a point.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_invalid_generators(const char* method,
+					  const char* gs_name) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << "*this is an empty polyhedron and" << std::endl
+    << "the non-empty generator system " << gs_name << " contains no points.";
+  throw std::invalid_argument(s.str());
+}
diff --git a/src/Polyhedron_public.cc b/src/Polyhedron_public.cc
new file mode 100644
index 0000000..d662ca0
--- /dev/null
+++ b/src/Polyhedron_public.cc
@@ -0,0 +1,2965 @@
+/* Polyhedron class implementation (non-inline public functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Polyhedron.defs.hh"
+#include "Scalar_Products.defs.hh"
+
+#include <cassert>
+#include <iostream>
+
+#ifndef ENSURE_SORTEDNESS
+#define ENSURE_SORTEDNESS 0
+#endif
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::dimension_type
+PPL::Polyhedron::affine_dimension() const {
+  if (is_empty())
+    return 0;
+
+  const Constraint_System& cs = minimized_constraints();
+  dimension_type d = space_dim;
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); i != cs_end; ++i)
+    if (i->is_equality())
+      --d;
+  return d;
+}
+
+const PPL::Constraint_System&
+PPL::Polyhedron::constraints() const {
+  if (marked_empty()) {
+    // We want `con_sys' to only contain the unsatisfiable constraint
+    // of the appropriate dimension.
+    if (con_sys.num_rows() == 0) {
+      // The 0-dim unsatisfiable constraint is extended to
+      // the appropriate dimension and then stored in `con_sys'.
+      Constraint_System unsat_cs = Constraint_System::zero_dim_empty();
+      unsat_cs.adjust_topology_and_space_dimension(topology(), space_dim);
+      const_cast<Constraint_System&>(con_sys).swap(unsat_cs);
+    }
+    else {
+      // Checking that `con_sys' contains the right thing.
+      assert(con_sys.space_dimension() == space_dim);
+      assert(con_sys.num_rows() == 1);
+      assert(con_sys[0].is_inconsistent());
+    }
+    return con_sys;
+  }
+
+  if (space_dim == 0) {
+    // zero-dimensional universe.
+    assert(con_sys.num_columns() == 0 && con_sys.num_rows() == 0);
+    return con_sys;
+  }
+
+  // If the polyhedron has pending generators, we process them to obtain
+  // the constraints. No processing is needed if the polyhedron has
+  // pending constraints.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  // TODO: reconsider whether to really sort constraints at this stage.
+#if ENSURE_SORTEDNESS
+  // We insist in returning a sorted system of constraints,
+  // but sorting is useless if there are pending constraints.
+  if (!has_pending_constraints())
+    obtain_sorted_constraints();
+#endif
+  return con_sys;
+}
+
+const PPL::Constraint_System&
+PPL::Polyhedron::minimized_constraints() const {
+  // `minimize()' or `strongly_minimize_constraints()'
+  // will process any pending constraints or generators.
+  if (is_necessarily_closed())
+    minimize();
+  else
+    strongly_minimize_constraints();
+  return constraints();
+}
+
+const PPL::Generator_System&
+PPL::Polyhedron::generators() const {
+  if (marked_empty()) {
+    assert(gen_sys.num_rows() == 0);
+    // We want `gen_sys' to have the appropriate space dimension,
+    // even though it is an empty generator system.
+    if (gen_sys.space_dimension() != space_dim) {
+      Generator_System gs;
+      gs.adjust_topology_and_space_dimension(topology(), space_dim);
+      const_cast<Generator_System&>(gen_sys).swap(gs);
+    }
+    return gen_sys;
+  }
+
+  if (space_dim == 0) {
+    assert(gen_sys.num_columns() == 0 && gen_sys.num_rows() == 0);
+    return Generator_System::zero_dim_univ();
+  }
+
+  // If the polyhedron has pending constraints, we process them to obtain
+  // the generators (we may discover that the polyhedron is empty).
+  // No processing is needed if the polyhedron has pending generators.
+  if ((has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // We have just discovered that `*this' is empty.
+    assert(gen_sys.num_rows() == 0);
+    // We want `gen_sys' to have the appropriate space dimension,
+    // even though it is an empty generator system.
+    if (gen_sys.space_dimension() != space_dim) {
+      Generator_System gs;
+      gs.adjust_topology_and_space_dimension(topology(), space_dim);
+      const_cast<Generator_System&>(gen_sys).swap(gs);
+    }
+    return gen_sys;
+  }
+
+  // TODO: reconsider whether to really sort generators at this stage.
+#if ENSURE_SORTEDNESS
+  // We insist in returning a sorted system of generators,
+  // but sorting is useless if there are pending generators.
+  if (!has_pending_generators())
+    obtain_sorted_generators();
+#else
+  // In the case of an NNC polyhedron, if the generator system is fully
+  // minimized (i.e., minimized and with no pending generator), then
+  // return a sorted system of generators: this is needed so that the
+  // const_iterator could correctly filter out the matched closure points.
+  if (!is_necessarily_closed()
+      && generators_are_minimized() && !has_pending_generators())
+    obtain_sorted_generators();
+#endif
+  return gen_sys;
+}
+
+const PPL::Generator_System&
+PPL::Polyhedron::minimized_generators() const {
+  // `minimize()' or `strongly_minimize_generators()'
+  // will process any pending constraints or generators.
+  if (is_necessarily_closed())
+    minimize();
+  else
+    strongly_minimize_generators();
+  // Note: calling generators() on a strongly minimized NNC generator
+  // system will also ensure sortedness, which is required to correctly
+  // filter away the matched closure points.
+  return generators();
+}
+
+PPL::Poly_Con_Relation
+PPL::Polyhedron::relation_with(const Constraint& c) const {
+  // Dimension-compatibility check.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("relation_with(c)", "c", c);
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0)
+    if (c.is_inconsistent())
+      if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+	// The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+	// thus, the zero-dimensional point also saturates it.
+	return Poly_Con_Relation::saturates()
+	  && Poly_Con_Relation::is_disjoint();
+      else
+	return Poly_Con_Relation::is_disjoint();
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+
+  if ((has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    // The polyhedron is empty.
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  return gen_sys.relation_with(c);
+}
+
+PPL::Poly_Gen_Relation
+PPL::Polyhedron::relation_with(const Generator& g) const {
+  // Dimension-compatibility check.
+  if (space_dim < g.space_dimension())
+    throw_dimension_incompatible("relation_with(g)", "g", g);
+
+  // The empty polyhedron cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe polyhedron in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  return
+    con_sys.satisfies_all_constraints(g)
+    ? Poly_Gen_Relation::subsumes()
+    : Poly_Gen_Relation::nothing();
+}
+
+bool
+PPL::Polyhedron::is_universe() const {
+  if (marked_empty())
+    return false;
+
+  if (space_dim == 0)
+    return true;
+
+  if (!has_pending_generators() && constraints_are_up_to_date()) {
+    // Search for a constraint that is not a tautology.
+    for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+      if (!con_sys[i].is_tautological())
+	return false;
+    // All the constraints are tautologies.
+    return true;
+  }
+
+  assert(!has_pending_constraints() && generators_are_up_to_date());
+
+  // Try a fast-fail test.
+  dimension_type num_lines = 0;
+  dimension_type num_rays = 0;
+  const dimension_type first_pending = gen_sys.first_pending_row();
+  for (dimension_type i = first_pending; i-- > 0; )
+    switch (gen_sys[i].type()) {
+    case Generator::RAY:
+      ++num_rays;
+      break;
+    case Generator::LINE:
+      ++num_lines;
+      break;
+    default:
+      break;
+    }
+
+  if (has_pending_generators()) {
+    // The non-pending part of `gen_sys' was minimized:
+    // a success-first test is possible in this case.
+    assert(generators_are_minimized());
+    if (num_lines == space_dim) {
+      assert(num_rays == 0);
+      return true;
+    }
+    assert(num_lines < space_dim);
+    // Now scan the pending generators.
+    dimension_type num_pending_lines = 0;
+    dimension_type num_pending_rays = 0;
+    const dimension_type gs_num_rows = gen_sys.num_rows();
+    for (dimension_type i = first_pending; i < gs_num_rows; ++i)
+      switch (gen_sys[i].type()) {
+      case Generator::RAY:
+	++num_pending_rays;
+	break;
+      case Generator::LINE:
+	++num_pending_lines;
+	break;
+      default:
+	break;
+      }
+    // If no pending rays and lines were found,
+    // then it is not the universe polyhedron.
+    if (num_pending_rays == 0 && num_pending_lines == 0)
+      return false;
+    // Factor away the lines already seen (to be on the safe side,
+    // we assume they are all linearly independent).
+    if (num_lines + num_pending_lines < space_dim) {
+      const dimension_type num_dims_missing
+	= space_dim - (num_lines + num_pending_lines);
+      // In order to span an n dimensional space (where n = num_dims_missing),
+      // at least n+1 rays are needed.
+      if (num_rays + num_pending_rays <= num_dims_missing)
+	return false;
+    }
+  }
+  else {
+    // There is nothing pending.
+    if (generators_are_minimized()) {
+      // The exact test is possible.
+      assert(num_rays == 0 || num_lines < space_dim);
+      return num_lines == space_dim;
+    }
+    else
+      // Only the fast-fail test can be computed: in order to span
+      // an n dimensional space (where n = space_dim - num_lines),
+      // at least n+1 rays are needed.
+      if (num_lines < space_dim && num_lines + num_rays <= space_dim)
+	return false;
+  }
+
+  // We need the polyhedron in minimal form.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_minimized())
+    minimize();
+  if (is_necessarily_closed())
+    return (con_sys.num_rows() == 1
+	    && con_sys[0].is_inequality()
+	    && con_sys[0].is_tautological());
+  else {
+    // NNC polyhedron.
+    if (con_sys.num_rows() != 2
+	|| con_sys[0].is_equality()
+	|| con_sys[1].is_equality())
+      return false;
+    else {
+      // If the system of constraints contains two rows that
+      // are not equalities, we are sure that they are
+      // epsilon constraints: in this case we know that
+      // the polyhedron is universe.
+#ifndef NDEBUG
+      obtain_sorted_constraints();
+      const Constraint& eps_leq_one = con_sys[0];
+      const Constraint& eps_geq_zero = con_sys[1];
+      const dimension_type eps_index = con_sys.num_columns() - 1;
+      assert(eps_leq_one[0] > 0 && eps_leq_one[eps_index] < 0
+	     && eps_geq_zero[0] == 0 && eps_geq_zero[eps_index] > 0);
+      for (dimension_type i = 1; i < eps_index; ++i)
+	assert(eps_leq_one[i] == 0 && eps_geq_zero[i] == 0);
+#endif
+      return true;
+    }
+  }
+}
+
+bool
+PPL::Polyhedron::is_bounded() const {
+  // A zero-dimensional or empty polyhedron is bounded.
+  if (space_dim == 0
+      || marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    return true;
+
+  // If the system of generators contains any line or a ray,
+  // then the polyhedron is unbounded.
+  for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+    if (gen_sys[i].is_line_or_ray())
+      return false;
+
+  // The system of generators is composed only by
+  // points and closure points: the polyhedron is bounded.
+  return true;
+}
+
+bool
+PPL::Polyhedron::is_topologically_closed() const {
+  // Necessarily closed polyhedra are trivially closed.
+  if (is_necessarily_closed())
+    return true;
+  // Any empty or zero-dimensional polyhedron is closed.
+  if (marked_empty()
+      || space_dim == 0
+      || (has_something_pending() && !process_pending()))
+     return true;
+
+  // At this point there are no pending constraints or generators.
+  assert(!has_something_pending());
+
+  if (generators_are_minimized()) {
+    // A polyhedron is closed if and only if all of its (non-redundant)
+    // closure points are matched by a corresponding point.
+    const dimension_type n_rows = gen_sys.num_rows();
+    const dimension_type n_lines = gen_sys.num_lines();
+    for (dimension_type i = n_rows; i-- > n_lines; ) {
+      const Generator& gi = gen_sys[i];
+      if (gi.is_closure_point()) {
+	bool gi_has_no_matching_point = true;
+	for (dimension_type j = n_rows; j-- > n_lines; ) {
+	  const Generator& gj = gen_sys[j];
+	  if (i != j
+	      && gj.is_point()
+	      && gi.is_matching_closure_point(gj)) {
+	    gi_has_no_matching_point = false;
+	    break;
+	  }
+	}
+	if (gi_has_no_matching_point)
+	  return false;
+      }
+    }
+    // All closure points are matched.
+    return true;
+  }
+
+  // A polyhedron is closed if, after strong minimization
+  // of its constraint system, it has no strict inequalities.
+  strongly_minimize_constraints();
+  return marked_empty() || !con_sys.has_strict_inequalities();
+}
+
+bool
+PPL::Polyhedron::OK(bool check_not_empty) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // The expected number of columns in the constraint and generator
+  // systems, if they are not empty.
+  const dimension_type poly_num_columns
+    = space_dim + (is_necessarily_closed() ? 1 : 2);
+
+  // Check whether the topologies of `con_sys' and `gen_sys' agree.
+  if (con_sys.topology() != gen_sys.topology()) {
+#ifndef NDEBUG
+    cerr << "Constraints and generators have different topologies!"
+	 << endl;
+#endif
+    goto bomb;
+  }
+
+  // Check whether the saturation matrices are well-formed.
+  if (!sat_c.OK())
+    goto bomb;
+  if (!sat_g.OK())
+    goto bomb;
+
+  // Check whether the status information is legal.
+  if (!status.OK())
+    goto bomb;
+
+  if (marked_empty()) {
+    if (check_not_empty) {
+      // The caller does not want the polyhedron to be empty.
+#ifndef NDEBUG
+      cerr << "Empty polyhedron!" << endl;
+#endif
+      goto bomb;
+    }
+
+    // An empty polyhedron is allowed if the system of constraints
+    // either has no rows or only contains an unsatisfiable constraint
+    // and if it has no pending constraints or generators.
+    if (has_something_pending()) {
+#ifndef NDEBUG
+      cerr << "The polyhedron is empty, "
+	   << "but it has something pending" << endl;
+#endif
+      goto bomb;
+    }
+    if (con_sys.num_rows() == 0)
+      return true;
+    else {
+      if (con_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+	cerr << "The polyhedron is in a space of dimension "
+	     << space_dim
+	     << " while the system of constraints is in a space of dimension "
+	     << con_sys.space_dimension()
+	     << endl;
+#endif
+	goto bomb;
+      }
+      if (con_sys.num_rows() != 1) {
+#ifndef NDEBUG
+	cerr << "The system of constraints for an empty polyhedron "
+	     << "has more then one row"
+	     << endl;
+#endif
+	goto bomb;
+      }
+      if (!con_sys[0].is_inconsistent()) {
+#ifndef NDEBUG
+	cerr << "Empty polyhedron with a satisfiable system of constraints"
+	     << endl;
+#endif
+	goto bomb;
+      }
+      // Here we have only one, inconsistent constraint.
+      return true;
+    }
+  }
+
+  // A zero-dimensional, non-empty polyhedron is legal only if the
+  // system of constraint `con_sys' and the system of generators
+  // `gen_sys' have no rows.
+  if (space_dim == 0) {
+    if (has_something_pending()) {
+#ifndef NDEBUG
+      cerr << "Zero-dimensional polyhedron with something pending"
+	   << endl;
+#endif
+      goto bomb;
+    }
+    if (con_sys.num_rows() != 0 || gen_sys.num_rows() != 0) {
+#ifndef NDEBUG
+      cerr << "Zero-dimensional polyhedron with a non-empty"
+	   << endl
+	   << "system of constraints or generators."
+	   << endl;
+#endif
+      goto bomb;
+    }
+    return true;
+  }
+
+  // A polyhedron is defined by a system of constraints
+  // or a system of generators: at least one of them must be up to date.
+  if (!constraints_are_up_to_date() && !generators_are_up_to_date()) {
+#ifndef NDEBUG
+    cerr << "Polyhedron not empty, not zero-dimensional"
+	 << endl
+	 << "and with neither constraints nor generators up-to-date!"
+	 << endl;
+#endif
+    goto bomb;
+  }
+
+  // Here we check if the size of the matrices is consistent.
+  // Let us suppose that all the matrices are up-to-date; this means:
+  // `con_sys' : number of constraints x poly_num_columns
+  // `gen_sys' : number of generators  x poly_num_columns
+  // `sat_c'   : number of generators  x number of constraints
+  // `sat_g'   : number of constraints x number of generators.
+  if (constraints_are_up_to_date()) {
+    if (con_sys.num_columns() != poly_num_columns) {
+#ifndef NDEBUG
+      cerr << "Incompatible size! (con_sys and space_dim)"
+	   << endl;
+#endif
+      goto bomb;
+    }
+    if (sat_c_is_up_to_date())
+      if (con_sys.first_pending_row() != sat_c.num_columns()) {
+#ifndef NDEBUG
+	cerr << "Incompatible size! (con_sys and sat_c)"
+	     << endl;
+#endif
+	goto bomb;
+      }
+    if (sat_g_is_up_to_date())
+      if (con_sys.first_pending_row() != sat_g.num_rows()) {
+#ifndef NDEBUG
+	cerr << "Incompatible size! (con_sys and sat_g)"
+	     << endl;
+#endif
+	goto bomb;
+      }
+    if (generators_are_up_to_date())
+      if (con_sys.num_columns() != gen_sys.num_columns()) {
+#ifndef NDEBUG
+	cerr << "Incompatible size! (con_sys and gen_sys)"
+	     << endl;
+#endif
+	goto bomb;
+      }
+  }
+
+  if (generators_are_up_to_date()) {
+    if (gen_sys.num_columns() != poly_num_columns) {
+#ifndef NDEBUG
+      cerr << "Incompatible size! (gen_sys and space_dim)"
+	   << endl;
+#endif
+      goto bomb;
+    }
+    if (sat_c_is_up_to_date())
+      if (gen_sys.first_pending_row() != sat_c.num_rows()) {
+#ifndef NDEBUG
+	cerr << "Incompatible size! (gen_sys and sat_c)"
+	     << endl;
+#endif
+	goto bomb;
+      }
+    if (sat_g_is_up_to_date())
+      if (gen_sys.first_pending_row() != sat_g.num_columns()) {
+#ifndef NDEBUG
+	cerr << "Incompatible size! (gen_sys and sat_g)"
+	     << endl;
+#endif
+	goto bomb;
+      }
+
+    // Check if the system of generators is well-formed.
+    if (!gen_sys.OK())
+      goto bomb;
+
+    if (gen_sys.first_pending_row() == 0) {
+#ifndef NDEBUG
+      cerr << "Up-to-date generator system with all rows pending!"
+	   << endl;
+#endif
+      goto bomb;
+    }
+
+    // A non-empty system of generators describing a polyhedron
+    // is valid if and only if it contains a point.
+    if (gen_sys.num_rows() > 0 && !gen_sys.has_points()) {
+#ifndef NDEBUG
+      cerr << "Non-empty generator system declared up-to-date "
+	   << "has no points!"
+	   << endl;
+#endif
+      goto bomb;
+    }
+
+#if 0
+    //=================================================
+    // TODO: this test is wrong in the general case.
+    // However, such an invariant does hold for a
+    // strongly-minimized Generator_System.
+    // We will activate this test as soon as the Status
+    // flags will be able to remember if a system is
+    // strongly minimized.
+
+    // Checking that the number of closure points is always
+    // greater than the number of points.
+    if (!is_necessarily_closed()) {
+      dimension_type num_points = 0;
+      dimension_type num_closure_points = 0;
+      dimension_type eps_index = gen_sys.num_columns() - 1;
+      for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+	if (!gen_sys[i].is_line_or_ray())
+	  if (gen_sys[i][eps_index] > 0)
+	    ++num_points;
+	  else
+	    ++num_closure_points;
+      if (num_points > num_closure_points) {
+#ifndef NDEBUG
+	cerr << "# POINTS > # CLOSURE_POINTS" << endl;
+#endif
+	goto bomb;
+      }
+    }
+    //=================================================
+#endif
+
+    if (generators_are_minimized()) {
+      // If the system of generators is minimized, the number of
+      // lines, rays and points of the polyhedron must be the same as
+      // of a temporary, minimized one. If this does not happen then
+      // the polyhedron is not OK.
+      Constraint_System new_con_sys(topology());
+      Generator_System gs_without_pending = gen_sys;
+      gs_without_pending.erase_to_end(gen_sys.first_pending_row());
+      gs_without_pending.unset_pending_rows();
+      Generator_System copy_of_gen_sys = gs_without_pending;
+      Saturation_Matrix new_sat_c;
+      minimize(false, copy_of_gen_sys, new_con_sys, new_sat_c);
+      const dimension_type copy_num_lines = copy_of_gen_sys.num_lines();
+      if (gs_without_pending.num_rows() != copy_of_gen_sys.num_rows()
+	  || gs_without_pending.num_lines() != copy_num_lines
+	  || gs_without_pending.num_rays() != copy_of_gen_sys.num_rays()) {
+#ifndef NDEBUG
+	cerr << "Generators are declared minimized, but they are not!\n"
+	     << "Here is the minimized form of the generators:\n";
+	copy_of_gen_sys.ascii_dump(cerr);
+	cerr << endl;
+#endif
+	goto bomb;
+      }
+
+      // CHECKME : the following observation is not formally true
+      //           for a NNC_Polyhedron. But it may be true for its
+      //           representation ...
+
+      // If the corresponding polyhedral cone is _pointed_, then
+      // a minimal system of generators is unique up to positive scaling.
+      // We thus verify if the cone is pointed (i.e., there are no lines)
+      // and, after normalizing and sorting a copy of the system `gen_sys'
+      // of the polyhedron (we use a copy not to modify the polyhedron's
+      // system) and the system `copy_of_gen_sys' that has been just
+      // minimized, we check if the two matrices are identical.  If
+      // they are different it means that the generators of the
+      // polyhedron are declared minimized, but they are not.
+      if (copy_num_lines == 0) {
+	copy_of_gen_sys.strong_normalize();
+	copy_of_gen_sys.sort_rows();
+	gs_without_pending.strong_normalize();
+	gs_without_pending.sort_rows();
+	if (copy_of_gen_sys != gs_without_pending) {
+#ifndef NDEBUG
+	  cerr << "Generators are declared minimized, but they are not!\n"
+	       << "(we are in the case:\n"
+	       << "dimension of lineality space equal to 0)\n"
+	       << "Here is the minimized form of the generators:\n";
+	  copy_of_gen_sys.ascii_dump(cerr);
+	  cerr << endl;
+#endif
+	    goto bomb;
+	}
+      }
+    }
+  }
+
+  if (constraints_are_up_to_date()) {
+    // Check if the system of constraints is well-formed.
+    if (!con_sys.OK())
+      goto bomb;
+
+    if (con_sys.first_pending_row() == 0) {
+#ifndef NDEBUG
+      cerr << "Up-to-date constraint system with all rows pending!"
+	   << endl;
+#endif
+      goto bomb;
+    }
+
+    // A non-empty system of constraints describing a polyhedron
+    // must contain a constraint with a non-zero inhomogeneous term;
+    // such a constraint corresponds to (a combination of other
+    // constraints with):
+    // -* the positivity constraint, for necessarily closed polyhedra;
+    // -* the epsilon <= 1 constraint, for NNC polyhedra.
+    bool no_positivity_constraint = true;
+    for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+      if (con_sys[i].inhomogeneous_term() != 0) {
+	no_positivity_constraint = false;
+	break;
+      }
+    if (no_positivity_constraint) {
+#ifndef NDEBUG
+      cerr << "Non-empty constraint system has no positivity constraint"
+	   << endl;
+#endif
+      goto bomb;
+    }
+
+    if (!is_necessarily_closed()) {
+      // A non-empty system of constraints describing a NNC polyhedron
+      // must also contain a (combination of) the constraint epsilon >= 0,
+      // i.e., a constraint with a positive epsilon coefficient.
+      bool no_epsilon_geq_zero = true;
+      const dimension_type eps_index = con_sys.num_columns() - 1;
+      for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+	if (con_sys[i][eps_index] > 0) {
+	  no_epsilon_geq_zero = false;
+	  break;
+	}
+      if (no_epsilon_geq_zero) {
+#ifndef NDEBUG
+	cerr << "Non-empty constraint system for NNC polyhedron "
+	     << "has no epsilon >= 0 constraint"
+	     << endl;
+#endif
+	goto bomb;
+      }
+    }
+
+    Constraint_System cs_without_pending = con_sys;
+    cs_without_pending.erase_to_end(con_sys.first_pending_row());
+    cs_without_pending.unset_pending_rows();
+    Constraint_System copy_of_con_sys = cs_without_pending;
+    Generator_System new_gen_sys(topology());
+    Saturation_Matrix new_sat_g;
+
+    if (minimize(true, copy_of_con_sys, new_gen_sys, new_sat_g)) {
+      if (check_not_empty) {
+	// Want to know the satisfiability of the constraints.
+#ifndef NDEBUG
+	cerr << "Unsatisfiable system of constraints!"
+	     << endl;
+#endif
+	goto bomb;
+      }
+      // The polyhedron is empty, there is nothing else to check.
+      return true;
+    }
+
+    if (constraints_are_minimized()) {
+      // If the constraints are minimized, the number of equalities
+      // and of inequalities of the system of the polyhedron must be
+      // the same of the temporary minimized one.
+      // If it does not happen, the polyhedron is not OK.
+      if (cs_without_pending.num_rows() != copy_of_con_sys.num_rows()
+	  || cs_without_pending.num_equalities()
+	  != copy_of_con_sys.num_equalities()) {
+#ifndef NDEBUG
+	cerr << "Constraints are declared minimized, but they are not!\n"
+	     << "Here is the minimized form of the constraints:\n";
+	copy_of_con_sys.ascii_dump(cerr);
+	cerr << endl;
+#endif
+	goto bomb;
+      }
+      // The system `copy_of_con_sys' has the form that is obtained
+      // after applying methods gauss() and back_substitute().
+      // A system of constraints can be minimal even if it does not
+      // have this form. So, to verify if the polyhedron is correct,
+      // we copy the system `con_sys' in a temporary one and then
+      // modify it using method simplify() (which calls both gauss()
+      // and back_substitute()).
+      // If the temporary system and `copy_of_con_sys' are different,
+      // the polyhedron is not OK.
+      copy_of_con_sys.strong_normalize();
+      copy_of_con_sys.sort_rows();
+      cs_without_pending.simplify();
+      cs_without_pending.strong_normalize();
+      cs_without_pending.sort_rows();
+      if (cs_without_pending != copy_of_con_sys) {
+#ifndef NDEBUG
+	cerr << "Constraints are declared minimized, but they are not!\n"
+	     << "Here is the minimized form of the constraints:\n";
+	copy_of_con_sys.ascii_dump(cerr);
+	cerr << endl;
+#endif
+	goto bomb;
+      }
+    }
+  }
+
+  if (sat_c_is_up_to_date())
+    for (dimension_type i = sat_c.num_rows(); i-- > 0; ) {
+      const Generator tmp_gen = gen_sys[i];
+      const Saturation_Row tmp_sat = sat_c[i];
+      for (dimension_type j = sat_c.num_columns(); j-- > 0; )
+	if (Scalar_Products::sign(con_sys[j], tmp_gen) != tmp_sat[j]) {
+#ifndef NDEBUG
+	  cerr << "sat_c is declared up-to-date, but it is not!"
+	       << endl;
+#endif
+	  goto bomb;
+	}
+    }
+
+  if (sat_g_is_up_to_date())
+    for (dimension_type i = sat_g.num_rows(); i-- > 0; ) {
+      const Constraint tmp_con = con_sys[i];
+      const Saturation_Row tmp_sat = sat_g[i];
+      for (dimension_type j = sat_g.num_columns(); j-- > 0; )
+	if (Scalar_Products::sign(tmp_con, gen_sys[j]) != tmp_sat[j]) {
+#ifndef NDEBUG
+	  cerr << "sat_g is declared up-to-date, but it is not!"
+	       << endl;
+#endif
+	  goto bomb;
+	}
+    }
+
+  if (has_pending_constraints()) {
+    if (con_sys.num_pending_rows() == 0) {
+#ifndef NDEBUG
+      cerr << "The polyhedron is declared to have pending constraints, "
+	   << "but con_sys has no pending rows!"
+	   << endl;
+#endif
+      goto bomb;
+    }
+  }
+
+  if (has_pending_generators()) {
+    if (gen_sys.num_pending_rows() == 0) {
+#ifndef NDEBUG
+      cerr << "The polyhedron is declared to have pending generators, "
+	   << "but gen_sys has no pending rows!"
+	   << endl;
+#endif
+      goto bomb;
+    }
+  }
+
+  return true;
+
+ bomb:
+#ifndef NDEBUG
+  cerr << "Here is the guilty polyhedron:"
+       << endl;
+  ascii_dump(cerr);
+#endif
+  return false;
+}
+
+void
+PPL::Polyhedron::add_constraint(const Constraint& c) {
+  // Topology-compatibility check.
+  if (c.is_strict_inequality() && is_necessarily_closed())
+    throw_topology_incompatible("add_constraint(c)", "c", c);
+  // Dimension-compatibility check:
+  // the dimension of `c' can not be greater than space_dim.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", "c", c);
+
+  // Adding a new constraint to an empty polyhedron
+  // results in an empty polyhedron.
+  if (marked_empty())
+    return;
+
+  // Dealing with a zero-dimensional space polyhedron first.
+  if (space_dim == 0) {
+    if (!c.is_tautological())
+      set_empty();
+    return;
+  }
+
+  // The constraints (possibly with pending rows) are required.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  const bool adding_pending = can_have_something_pending();
+
+  // Here we know that the system of constraints has at least a row.
+  if (c.is_necessarily_closed() || !is_necessarily_closed())
+    // Since `con_sys' is not empty, the topology and space dimension
+    // of the inserted constraint are automatically adjusted.
+    if (adding_pending)
+      con_sys.insert_pending(c);
+    else
+      con_sys.insert(c);
+  else {
+    // Note: here we have a _legal_ topology mismatch, because
+    // `c' is NOT a strict inequality.
+    // However, by barely invoking `con_sys.insert(c)' we would
+    // cause a change in the topology of `con_sys', which is wrong.
+    // Thus, we insert a "topology corrected" copy of `c'.
+    Linear_Expression nc_expr = Linear_Expression(c);
+    if (c.is_equality())
+      if (adding_pending)
+	con_sys.insert_pending(nc_expr == 0);
+      else
+	con_sys.insert(nc_expr == 0);
+    else
+      if (adding_pending)
+	con_sys.insert_pending(nc_expr >= 0);
+      else
+	con_sys.insert(nc_expr >= 0);
+  }
+
+  if (adding_pending)
+    set_constraints_pending();
+  else {
+    // Constraints are not minimized and generators are not up-to-date.
+    clear_constraints_minimized();
+    clear_generators_up_to_date();
+  }
+  // Note: the constraint system may have become unsatisfiable, thus
+  // we do not check for satisfiability.
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::add_congruence(const Congruence& cg) {
+  // Dimension-compatibility check:
+  // the dimension of `cg' can not be greater than space_dim.
+  if (space_dim < cg.space_dimension())
+    throw_dimension_incompatible("add_congruence(cg)", "cg", cg);
+
+  // Adding a new congruence to an empty polyhedron results in an
+  // empty polyhedron.
+  if (marked_empty())
+    return;
+
+  // Dealing with a zero-dimensional space polyhedron first.
+  if (space_dim == 0) {
+    if (!cg.is_trivial_true())
+      set_empty();
+    return;
+  }
+
+  if (cg.is_equality()) {
+    Linear_Expression le(cg);
+    Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+    add_constraint(c);
+  }
+}
+
+bool
+PPL::Polyhedron::add_constraint_and_minimize(const Constraint& c) {
+  // TODO: this is just an executable specification.
+  Constraint_System cs(c);
+  return add_recycled_constraints_and_minimize(cs);
+}
+
+void
+PPL::Polyhedron::add_generator(const Generator& g) {
+  // Topology-compatibility check.
+  if (g.is_closure_point() && is_necessarily_closed())
+    throw_topology_incompatible("add_generator(g)", "g", g);
+  // Dimension-compatibility check:
+  // the dimension of `g' can not be greater than space_dim.
+  const dimension_type g_space_dim = g.space_dimension();
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("add_generator(g)", "g", g);
+
+  // Dealing with a zero-dimensional space polyhedron first.
+  if (space_dim == 0) {
+    // It is not possible to create 0-dim rays or lines.
+    assert(g.is_point() || g.is_closure_point());
+    // Closure points can only be inserted in non-empty polyhedra.
+    if (marked_empty())
+      if (g.type() != Generator::POINT)
+	throw_invalid_generator("add_generator(g)", "g");
+      else
+	status.set_zero_dim_univ();
+    assert(OK());
+    return;
+  }
+
+  if (marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // Here the polyhedron is empty:
+    // the specification says we can only insert a point.
+    if (!g.is_point())
+      throw_invalid_generator("add_generator(g)", "g");
+    if (g.is_necessarily_closed() || !is_necessarily_closed()) {
+      gen_sys.insert(g);
+      // Since `gen_sys' was empty, after inserting `g' we have to resize
+      // the system of generators to have the right dimension.
+      gen_sys.adjust_topology_and_space_dimension(topology(), space_dim);
+      if (!is_necessarily_closed()) {
+	// In the NNC topology, each point has to be matched by
+	// a corresponding closure point:
+	// turn the just inserted point into the corresponding
+	// (normalized) closure point.
+	Generator& cp = gen_sys[gen_sys.num_rows() - 1];
+	cp[space_dim + 1] = 0;
+	cp.normalize();
+	// Re-insert the point (which is already normalized).
+	gen_sys.insert(g);
+      }
+    }
+    else {
+      // Note: here we have a _legal_ topology mismatch,
+      // because `g' is NOT a closure point (it is a point!)
+      // However, by barely invoking `gen_sys.insert(g)' we would
+      // cause a change in the topology of `gen_sys', which is wrong.
+      // Thus, we insert a "topology corrected" copy of `g'.
+      const Linear_Expression nc_expr = Linear_Expression(g);
+      gen_sys.insert(Generator::point(nc_expr, g.divisor()));
+      // Since `gen_sys' was empty, after inserting `g' we have to resize
+      // the system of generators to have the right dimension.
+      gen_sys.adjust_topology_and_space_dimension(topology(), space_dim);
+    }
+    // No longer empty, generators up-to-date and minimized.
+    clear_empty();
+    set_generators_minimized();
+  }
+  else {
+    assert(generators_are_up_to_date());
+    const bool has_pending = can_have_something_pending();
+    if (g.is_necessarily_closed() || !is_necessarily_closed()) {
+      // Since `gen_sys' is not empty, the topology and space dimension
+      // of the inserted generator are automatically adjusted.
+      if (has_pending)
+	gen_sys.insert_pending(g);
+      else
+	gen_sys.insert(g);
+      if (!is_necessarily_closed() && g.is_point()) {
+	// In the NNC topology, each point has to be matched by
+	// a corresponding closure point:
+	// turn the just inserted point into the corresponding
+	// (normalized) closure point.
+	Generator& cp = gen_sys[gen_sys.num_rows() - 1];
+	cp[space_dim + 1] = 0;
+	cp.normalize();
+	// Re-insert the point (which is already normalized).
+	if (has_pending)
+	  gen_sys.insert_pending(g);
+	else
+	  gen_sys.insert(g);
+      }
+    }
+    else {
+      assert(!g.is_closure_point());
+      // Note: here we have a _legal_ topology mismatch, because
+      // `g' is NOT a closure point.
+      // However, by barely invoking `gen_sys.insert(g)' we would
+      // cause a change in the topology of `gen_sys', which is wrong.
+      // Thus, we insert a "topology corrected" copy of `g'.
+      const Linear_Expression nc_expr = Linear_Expression(g);
+      switch (g.type()) {
+      case Generator::LINE:
+	if (has_pending)
+	  gen_sys.insert_pending(Generator::line(nc_expr));
+	else
+	  gen_sys.insert(Generator::line(nc_expr));
+	break;
+      case Generator::RAY:
+	if (has_pending)
+	  gen_sys.insert_pending(Generator::ray(nc_expr));
+	else
+	  gen_sys.insert(Generator::ray(nc_expr));
+	break;
+      case Generator::POINT:
+	if (has_pending)
+	  gen_sys.insert_pending(Generator::point(nc_expr, g.divisor()));
+	else
+	  gen_sys.insert(Generator::point(nc_expr, g.divisor()));
+	break;
+      default:
+	throw_runtime_error("add_generator(const Generator& g)");
+      }
+    }
+
+    if (has_pending)
+      set_generators_pending();
+    else {
+      // After adding the new generator,
+      // constraints are no longer up-to-date.
+      clear_generators_minimized();
+      clear_constraints_up_to_date();
+    }
+  }
+  assert(OK());
+}
+
+bool
+PPL::Polyhedron::add_generator_and_minimize(const Generator& g) {
+  // TODO: this is just an executable specification.
+  Generator_System gs(g);
+  return add_recycled_generators_and_minimize(gs);
+}
+
+void
+PPL::Polyhedron::add_recycled_constraints(Constraint_System& cs) {
+  // Topology compatibility check.
+  if (is_necessarily_closed() && cs.has_strict_inequalities())
+    throw_topology_incompatible("add_constraints(cs)", "cs", cs);
+  // Dimension-compatibility check:
+  // the dimension of `cs' can not be greater than space_dim.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_dimension_incompatible("add_recycled_constraints(cs)", "cs", cs);
+
+  // Adding no constraints is a no-op.
+  if (cs.num_rows() == 0)
+    return;
+
+  if (space_dim == 0) {
+    // In a 0-dimensional space the constraints are
+    // tautologies (e.g., 0 == 0 or 1 >= 0 or 1 > 0) or
+    // inconsistent (e.g., 1 == 0 or -1 >= 0 or 0 > 0).
+    // In a system of constraints `begin()' and `end()' are equal
+    // if and only if the system only contains tautologies.
+    if (cs.begin() != cs.end())
+      // There is a constraint, it must be inconsistent,
+      // the polyhedron is empty.
+      status.set_empty();
+    return;
+  }
+
+  if (marked_empty())
+    return;
+
+  // The constraints (possibly with pending rows) are required.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  // Adjust `cs' to the right topology and space dimension.
+  // NOTE: we already checked for topology compatibility.
+  cs.adjust_topology_and_space_dimension(topology(), space_dim);
+
+  const bool adding_pending = can_have_something_pending();
+
+  // Here we do not require `con_sys' to be sorted.
+  // also, we _swap_ (instead of copying) the coefficients of `cs'
+  // (which is not a const).
+  const dimension_type old_num_rows = con_sys.num_rows();
+  const dimension_type cs_num_rows = cs.num_rows();
+  const dimension_type cs_num_columns = cs.num_columns();
+  con_sys.add_zero_rows(cs_num_rows,
+			Linear_Row::Flags(topology(),
+					  Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+  for (dimension_type i = cs_num_rows; i-- > 0; ) {
+    // NOTE: we cannot directly swap the rows, since they might have
+    // different capacities (besides possibly having different sizes):
+    // thus, we steal one coefficient at a time.
+    Constraint& new_c = con_sys[old_num_rows + i];
+    Constraint& old_c = cs[i];
+    if (old_c.is_equality())
+      new_c.set_is_equality();
+    for (dimension_type j = cs_num_columns; j-- > 0; )
+      std::swap(new_c[j], old_c[j]);
+  }
+
+  if (adding_pending)
+    set_constraints_pending();
+  else {
+    // The newly added ones are not pending constraints.
+    con_sys.unset_pending_rows();
+    // They have been simply appended.
+    con_sys.set_sorted(false);
+    // Constraints are not minimized and generators are not up-to-date.
+    clear_constraints_minimized();
+    clear_generators_up_to_date();
+  }
+  // Note: the constraint system may have become unsatisfiable, thus
+  // we do not check for satisfiability.
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::add_constraints(const Constraint_System& cs) {
+  // TODO: this is just an executable specification.
+  Constraint_System cs_copy = cs;
+  add_recycled_constraints(cs_copy);
+}
+
+bool
+PPL::Polyhedron::add_recycled_constraints_and_minimize(Constraint_System& cs) {
+  // Topology-compatibility check.
+  if (is_necessarily_closed() && cs.has_strict_inequalities())
+    throw_topology_incompatible("add_recycled_constraints_and_minimize(cs)",
+				"cs", cs);
+  // Dimension-compatibility check:
+  // the dimension of `cs' can not be greater than space_dim.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_dimension_incompatible("add_recycled_constraints_and_minimize(cs)",
+				 "cs", cs);
+
+  // Adding no constraints: just minimize.
+  if (cs.num_rows() == 0)
+    return minimize();
+
+  // Dealing with zero-dimensional space polyhedra first.
+  if (space_dim == 0) {
+    // In a 0-dimensional space the constraints are
+    // tautologies (e.g., 0 == 0 or 1 >= 0 or 1 > 0) or
+    // inconsistent (e.g., 1 == 0 or -1 >= 0 or 0 > 0).
+    // In a system of constraints `begin()' and `end()' are equal
+    // if and only if the system only contains tautologies.
+    if (cs.begin() == cs.end())
+      return true;
+    // There is a constraint, it must be inconsistent,
+    // the polyhedron is empty.
+    status.set_empty();
+    return false;
+  }
+
+  // The polyhedron must be minimized and have sorted constraints.
+  // `minimize()' will process any pending constraints or generators.
+  if (!minimize())
+    // We have just discovered that `x' is empty.
+    return false;
+  // Fully sort the system of constraints for `x'.
+  obtain_sorted_constraints_with_sat_c();
+
+  // Fully sort the system of constraints to be added
+  // (before adjusting dimensions in order to save time).
+  if (cs.num_pending_rows() > 0) {
+    cs.unset_pending_rows();
+    cs.sort_rows();
+  }
+  else if (!cs.is_sorted())
+    cs.sort_rows();
+  // Adjust `cs' to the right topology and space dimension.
+  // NOTE: we already checked for topology compatibility.
+  cs.adjust_topology_and_space_dimension(topology(), space_dim);
+
+  const bool empty = add_and_minimize(true, con_sys, gen_sys, sat_c, cs);
+
+  if (empty)
+    set_empty();
+  else {
+    // `sat_c' is up-to-date, while `sat_g' is no longer up-to-date.
+    set_sat_c_up_to_date();
+    clear_sat_g_up_to_date();
+  }
+  assert(OK());
+
+  return !empty;
+}
+
+bool
+PPL::Polyhedron::add_constraints_and_minimize(const Constraint_System& cs) {
+  // TODO: this is just an executable specification.
+  Constraint_System cs_copy = cs;
+  return add_recycled_constraints_and_minimize(cs_copy);
+}
+
+void
+PPL::Polyhedron::add_recycled_generators(Generator_System& gs) {
+  // Topology compatibility check.
+  if (is_necessarily_closed() && gs.has_closure_points())
+    throw_topology_incompatible("add_recycled_generators(gs)", "gs", gs);
+  // Dimension-compatibility check:
+  // the dimension of `gs' can not be greater than space_dim.
+  const dimension_type gs_space_dim = gs.space_dimension();
+  if (space_dim < gs_space_dim)
+    throw_dimension_incompatible("add_recycled_generators(gs)", "gs", gs);
+
+  // Adding no generators is a no-op.
+  if (gs.num_rows() == 0)
+    return;
+
+  // Adding valid generators to a zero-dimensional polyhedron
+  // transform it in the zero-dimensional universe polyhedron.
+  if (space_dim == 0) {
+    if (marked_empty() && !gs.has_points())
+      throw_invalid_generators("add_recycled_generators(gs)", "gs");
+    status.set_zero_dim_univ();
+    assert(OK(true));
+    return;
+  }
+
+  // Adjust `gs' to the right topology and dimensions.
+  // NOTE: we already checked for topology compatibility.
+  gs.adjust_topology_and_space_dimension(topology(), space_dim);
+  // For NNC polyhedra, each point must be matched by
+  // the corresponding closure point.
+  if (!is_necessarily_closed())
+    gs.add_corresponding_closure_points();
+
+  // The generators (possibly with pending rows) are required.
+  if ((has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !minimize())) {
+    // We have just discovered that `*this' is empty.
+    // So `gs' must contain at least one point.
+    if (!gs.has_points())
+      throw_invalid_generators("add_recycled_generators(gs)", "gs");
+    // The polyhedron is no longer empty and generators are up-to-date.
+    std::swap(gen_sys, gs);
+    if (gen_sys.num_pending_rows() > 0) {
+      // Even though `gs' has pending generators, since the constraints
+      // of the polyhedron are not up-to-date, the polyhedron cannot
+      // have pending generators. By integrating the pending part
+      // of `gen_sys' we may loose sortedness.
+      gen_sys.unset_pending_rows();
+      gen_sys.set_sorted(false);
+    }
+    set_generators_up_to_date();
+    clear_empty();
+    assert(OK());
+    return;
+  }
+
+  const bool adding_pending = can_have_something_pending();
+
+  // Here we do not require `gen_sys' to be sorted.
+  // also, we _swap_ (instead of copying) the coefficients of `gs'
+  // (which is not a const).
+  const dimension_type old_num_rows = gen_sys.num_rows();
+  const dimension_type gs_num_rows = gs.num_rows();
+  const dimension_type gs_num_columns = gs.num_columns();
+  gen_sys.add_zero_rows(gs_num_rows,
+			Linear_Row::Flags(topology(),
+					  Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+  for (dimension_type i = gs_num_rows; i-- > 0; ) {
+    // NOTE: we cannot directly swap the rows, since they might have
+    // different capacities (besides possibly having different sizes):
+    // thus, we steal one coefficient at a time.
+    Generator& new_g = gen_sys[old_num_rows + i];
+    Generator& old_g = gs[i];
+    if (old_g.is_line())
+      new_g.set_is_line();
+    for (dimension_type j = gs_num_columns; j-- > 0; )
+      std::swap(new_g[j], old_g[j]);
+  }
+
+  if (adding_pending)
+    set_generators_pending();
+  else {
+    // The newly added ones are not pending generators.
+    gen_sys.unset_pending_rows();
+    // They have been simply appended.
+    gen_sys.set_sorted(false);
+    // Constraints are not up-to-date and generators are not minimized.
+    clear_constraints_up_to_date();
+    clear_generators_minimized();
+  }
+  assert(OK(true));
+}
+
+void
+PPL::Polyhedron::add_generators(const Generator_System& gs) {
+  // TODO: this is just an executable specification.
+  Generator_System gs_copy = gs;
+  add_recycled_generators(gs_copy);
+}
+
+bool
+PPL::Polyhedron::add_recycled_generators_and_minimize(Generator_System& gs) {
+  // Topology compatibility check.
+  if (is_necessarily_closed() && gs.has_closure_points())
+    throw_topology_incompatible("add_recycled_generators_and_minimize(gs)",
+				"gs", gs);
+  // Dimension-compatibility check:
+  // the dimension of `gs' can not be greater than space_dim.
+  const dimension_type gs_space_dim = gs.space_dimension();
+  if (space_dim < gs_space_dim)
+    throw_dimension_incompatible("add_recycled_generators_and_minimize(gs)",
+				 "gs", gs);
+
+  // Adding no generators is equivalent to just requiring minimization.
+  if (gs.num_rows() == 0)
+    return minimize();
+
+  // Adding valid generators to a zero-dimensional polyhedron
+  // transform it in the zero-dimensional universe polyhedron.
+  if (space_dim == 0) {
+    if (marked_empty() && !gs.has_points())
+      throw_invalid_generators("add_recycled_generators_and_minimize(gs)",
+			       "gs");
+    status.set_zero_dim_univ();
+    assert(OK(true));
+    return true;
+  }
+
+  // Adjust `gs' to the right topology.
+  // NOTE: we already checked for topology compatibility;
+  // also, we do NOT adjust dimensions now, so that we will
+  // spend less time to sort rows.
+  gs.adjust_topology_and_space_dimension(topology(), gs_space_dim);
+
+  // For NNC polyhedra, each point must be matched by
+  // the corresponding closure point.
+  if (!is_necessarily_closed())
+    gs.add_corresponding_closure_points();
+
+  // `gs' has to be fully sorted, thus it cannot have pending rows.
+  if (gs.num_pending_rows() > 0) {
+    gs.unset_pending_rows();
+    gs.sort_rows();
+  }
+  else if (!gs.is_sorted())
+    gs.sort_rows();
+
+  // Now adjusting dimensions (topology already adjusted).
+  // NOTE: sortedness is preserved.
+  gs.adjust_topology_and_space_dimension(topology(), space_dim);
+
+  if (minimize()) {
+    obtain_sorted_generators_with_sat_g();
+    // This call to `add_and_minimize(...)' cannot return `false'.
+    add_and_minimize(false, gen_sys, con_sys, sat_g, gs);
+    clear_sat_c_up_to_date();
+  }
+  else {
+    // The polyhedron was empty: check if `gs' contains a point.
+    if (!gs.has_points())
+      throw_invalid_generators("add_recycled_generators_and_minimize(gs)",
+			       "gs");
+    // `gs' has a point: the polyhedron is no longer empty
+    // and generators are up-to-date.
+    std::swap(gen_sys, gs);
+    clear_empty();
+    set_generators_up_to_date();
+    // This call to `minimize()' cannot return `false'.
+    minimize();
+  }
+  assert(OK(true));
+  return true;
+}
+
+bool
+PPL::Polyhedron::add_generators_and_minimize(const Generator_System& gs) {
+  // TODO: this is just an executable specification.
+  Generator_System gs_copy = gs;
+  return add_recycled_generators_and_minimize(gs_copy);
+}
+
+void
+PPL::Polyhedron::add_congruences(const Congruence_System& cgs) {
+  // Dimension-compatibility check:
+  // the dimension of `cgs' can not be greater than space_dim.
+  if (space_dim < cgs.space_dimension())
+    throw_dimension_incompatible("add_congruences(cgs)", "cgs", cgs);
+
+  Constraint_System cs;
+  bool inserted = false;
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    if (i->is_equality()) {
+      Linear_Expression le(*i);
+      Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+      // FIXME: Steal the row in c when adding it to cs.
+      cs.insert(c);
+      inserted = true;
+    }
+  // Only add cgs if congruences were inserted into cgs, as the
+  // dimension of cs must be at most that of the polyhedron.
+  if (inserted)
+    add_recycled_constraints(cs);
+}
+
+void
+PPL::Polyhedron::intersection_assign(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("intersection_assign(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("intersection_assign(y)", "y", y);
+
+  // If one of the two polyhedra is empty, the intersection is empty.
+  if (x.marked_empty())
+    return;
+  if (y.marked_empty()) {
+    x.set_empty();
+    return;
+  }
+
+  // If both polyhedra are zero-dimensional,
+  // then at this point they are necessarily non-empty,
+  // so that their intersection is non-empty too.
+  if (x.space_dim == 0)
+    return;
+
+  // Both systems of constraints have to be up-to-date,
+  // possibly having pending constraints.
+  if (x.has_pending_generators())
+    x.process_pending_generators();
+  else if (!x.constraints_are_up_to_date())
+    x.update_constraints();
+
+  if (y.has_pending_generators())
+    y.process_pending_generators();
+  else if (!y.constraints_are_up_to_date())
+    y.update_constraints();
+
+  // Here both systems are up-to-date and possibly have pending constraints
+  // (but they cannot have pending generators).
+  assert(!x.has_pending_generators() && x.constraints_are_up_to_date());
+  assert(!y.has_pending_generators() && y.constraints_are_up_to_date());
+
+  // If `x' can support pending constraints,
+  // the constraints of `y' are added as pending constraints of `x'.
+  if (x.can_have_something_pending()) {
+    x.con_sys.add_pending_rows(y.con_sys);
+    x.set_constraints_pending();
+  }
+  else {
+    // `x' cannot support pending constraints.
+    // If both constraint systems are (fully) sorted, then we can
+    // merge them; otherwise we simply add the second to the first.
+    if (x.con_sys.is_sorted()
+	&& y.con_sys.is_sorted() && !y.has_pending_constraints())
+      x.con_sys.merge_rows_assign(y.con_sys);
+    else
+      x.con_sys.add_rows(y.con_sys);
+    // Generators are no longer up-to-date and constraints are no
+    // longer minimized.
+    x.clear_generators_up_to_date();
+    x.clear_constraints_minimized();
+  }
+  assert(x.OK() && y.OK());
+}
+
+bool
+PPL::Polyhedron::intersection_assign_and_minimize(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("intersection_assign_and_minimize(y)",
+				"y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("intersection_assign_and_minimize(y)",
+				 "y", y);
+
+  // If one of the two polyhedra is empty, the intersection is empty.
+  if (x.marked_empty())
+    return false;
+  if (y.marked_empty()) {
+    x.set_empty();
+    return false;
+  }
+
+  // If both polyhedra are zero-dimensional,
+  // then at this point they are necessarily non-empty,
+  // so that their intersection is non-empty too.
+  if (x.space_dim == 0)
+    return true;
+
+  // `x' must be minimized and have sorted constraints.
+  // `minimize()' will process any pending constraints or generators.
+  if (!x.minimize())
+    // We have just discovered that `x' is empty.
+    return false;
+  x.obtain_sorted_constraints_with_sat_c();
+
+  // `y' must have updated, possibly pending constraints.
+  if (y.has_pending_generators())
+    y.process_pending_generators();
+  else if (!y.constraints_are_up_to_date())
+    y.update_constraints();
+
+  bool empty;
+  if (y.con_sys.num_pending_rows() > 0) {
+    // Integrate `y.con_sys' as pending constraints of `x',
+    // sort them in place and then call `add_and_minimize()'.
+    x.con_sys.add_pending_rows(y.con_sys);
+    x.con_sys.sort_pending_and_remove_duplicates();
+    if (x.con_sys.num_pending_rows() == 0) {
+      // All pending constraints were duplicates.
+      x.clear_pending_constraints();
+      assert(OK(true));
+      return true;
+    }
+    empty = add_and_minimize(true, x.con_sys, x.gen_sys, x.sat_c);
+  }
+  else {
+    y.obtain_sorted_constraints();
+    empty = add_and_minimize(true, x.con_sys, x.gen_sys, x.sat_c, y.con_sys);
+  }
+
+  if (empty)
+    x.set_empty();
+  else {
+    // On exit of the function `intersection_assign_and_minimize()'
+    // the polyhedron is up-to-date and `sat_c' is meaningful.
+    x.set_sat_c_up_to_date();
+    x.clear_sat_g_up_to_date();
+  }
+  assert(x.OK(!empty));
+  return !empty;
+}
+
+void
+PPL::Polyhedron::poly_hull_assign(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("poly_hull_assign(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("poly_hull_assign(y)", "y", y);
+
+  // The poly-hull of a polyhedron `p' with an empty polyhedron is `p'.
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty()) {
+    x = y;
+    return;
+  }
+
+  // If both polyhedra are zero-dimensional,
+  // then at this point they are necessarily universe polyhedra,
+  // so that their poly-hull is the universe polyhedron too.
+  if (x.space_dim == 0)
+    return;
+
+  // Both systems of generators have to be up-to-date,
+  // possibly having pending generators.
+  if ((x.has_pending_constraints() && !x.process_pending_constraints())
+      || (!x.generators_are_up_to_date() && !x.update_generators())) {
+    // Discovered `x' empty when updating generators.
+    x = y;
+    return;
+  }
+  if ((y.has_pending_constraints() && !y.process_pending_constraints())
+      || (!y.generators_are_up_to_date() && !y.update_generators()))
+    // Discovered `y' empty when updating generators.
+    return;
+
+  // Here both systems are up-to-date and possibly have pending generators
+  // (but they cannot have pending constraints).
+  assert(!x.has_pending_constraints() && x.generators_are_up_to_date());
+  assert(!y.has_pending_constraints() && y.generators_are_up_to_date());
+
+  // If `x' can support pending generators,
+  // the generators of `y' are added as pending generators of `x'.
+  if (x.can_have_something_pending()) {
+    x.gen_sys.add_pending_rows(y.gen_sys);
+    x.set_generators_pending();
+  }
+  else {
+    // `x' cannot support pending generators.
+    // If both generator systems are (fully) sorted, then we can merge
+    // them; otherwise we simply add the second to the first.
+    if (x.gen_sys.is_sorted()
+	&& y.gen_sys.is_sorted() && !y.has_pending_generators())
+      x.gen_sys.merge_rows_assign(y.gen_sys);
+    else
+      x.gen_sys.add_rows(y.gen_sys);
+    // Constraints are no longer up-to-date
+    // and generators are no longer minimized.
+    x.clear_constraints_up_to_date();
+    x.clear_generators_minimized();
+  }
+  // At this point both `x' and `y' are not empty.
+  assert(x.OK(true) && y.OK(true));
+}
+
+bool
+PPL::Polyhedron::poly_hull_assign_and_minimize(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("poly_hull_assign_and_minimize(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("poly_hull_assign_and_minimize(y)", "y", y);
+
+  // The poly-hull of a polyhedron `p' with an empty polyhedron is `p'.
+  if (y.marked_empty())
+    return minimize();
+  if (x.marked_empty()) {
+    x = y;
+    return minimize();
+  }
+
+  // If both polyhedra are zero-dimensional,
+  // then at this point they are necessarily universe polyhedra,
+  // so that their poly-hull is the universe polyhedron too.
+  if (x.space_dim == 0)
+    return true;
+
+  // `x' must have minimized constraints and generators.
+  // `minimize()' will process any pending constraints or generators.
+  if (!x.minimize()) {
+    // We have just discovered that `x' is empty.
+    x = y;
+    return minimize();
+  }
+  // x must have `sat_g' up-to-date and sorted generators.
+  x.obtain_sorted_generators_with_sat_g();
+
+  // `y' must have updated, possibly pending generators.
+  if ((y.has_pending_constraints() && !y.process_pending_constraints())
+      || (!y.generators_are_up_to_date() && !y.update_generators()))
+    // We have just discovered that `y' is empty
+    // (and we know that `x' is not empty).
+    return true;
+
+  if (y.gen_sys.num_pending_rows() > 0) {
+    // Integrate `y.gen_sys' as pending generators of `x',
+    // sort them in place and then call `add_and_minimize()'.
+    x.gen_sys.add_pending_rows(y.gen_sys);
+    x.gen_sys.sort_pending_and_remove_duplicates();
+    if (x.gen_sys.num_pending_rows() == 0) {
+      // All pending generators were duplicates.
+      x.clear_pending_generators();
+      assert(OK(true) && y.OK());
+      return true;
+    }
+    add_and_minimize(false, x.gen_sys, x.con_sys, x.sat_g);
+  }
+  else {
+    y.obtain_sorted_generators();
+    add_and_minimize(false, x.gen_sys, x.con_sys, x.sat_g, y.gen_sys);
+  }
+  x.clear_sat_c_up_to_date();
+
+  assert(x.OK(true) && y.OK());
+  return true;
+}
+
+void
+PPL::Polyhedron::poly_difference_assign(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("poly_difference_assign(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("poly_difference_assign(y)", "y", y);
+
+  // The difference of a polyhedron `p' and an empty polyhedron is `p'.
+  if (y.marked_empty())
+    return;
+  // The difference of an empty polyhedron and of a polyhedron `p' is empty.
+  if (x.marked_empty())
+    return;
+
+  // If both polyhedra are zero-dimensional,
+  // then at this point they are necessarily universe polyhedra,
+  // so that their difference is empty.
+  if (x.space_dim == 0) {
+    x.set_empty();
+    return;
+  }
+
+  // TODO: This is just an executable specification.
+  //       Have to find a more efficient method.
+
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
+
+  Polyhedron new_polyhedron(topology(), x.space_dim, EMPTY);
+
+  // Being lazy here is only harmful.
+  // `minimize()' will process any pending constraints or generators.
+  x.minimize();
+  y.minimize();
+
+  const Constraint_System& y_cs = y.constraints();
+  for (Constraint_System::const_iterator i = y_cs.begin(),
+	 y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+    const Constraint& c = *i;
+    assert(!c.is_tautological());
+    assert(!c.is_inconsistent());
+    // If the polyhedron `x' is included in the polyhedron defined by
+    // `c', then `c' can be skipped, as adding its complement to `x'
+    // would result in the empty polyhedron.  Moreover, if we operate
+    // on C-polyhedra and `c' is a non-strict inequality, c _must_ be
+    // skipped for otherwise we would obtain a result that is less
+    // precise than the poly-difference.
+    if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    Polyhedron z = x;
+    const Linear_Expression e = Linear_Expression(c);
+    switch (c.type()) {
+    case Constraint::NONSTRICT_INEQUALITY:
+      if (is_necessarily_closed())
+	z.add_constraint(e <= 0);
+      else
+	z.add_constraint(e < 0);
+      break;
+    case Constraint::STRICT_INEQUALITY:
+      z.add_constraint(e <= 0);
+      break;
+    case Constraint::EQUALITY:
+      if (is_necessarily_closed())
+	// We have already filtered out the case
+	// when `x' is included in `y': the result is `x'.
+	return;
+      else {
+	Polyhedron w = x;
+	w.add_constraint(e < 0);
+	new_polyhedron.poly_hull_assign(w);
+	z.add_constraint(e > 0);
+      }
+      break;
+    }
+    new_polyhedron.poly_hull_assign(z);
+  }
+  *this = new_polyhedron;
+
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::
+affine_image(const Variable var,
+	     const Linear_Expression& expr,
+	     Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+  if (marked_empty())
+    return;
+
+  if (expr.coefficient(var) != 0) {
+    // The transformation is invertible:
+    // minimality and saturators are preserved, so that
+    // pending rows, if present, are correctly handled.
+    if (generators_are_up_to_date()) {
+      // Generator_System::affine_image() requires the third argument
+      // to be a positive Coefficient.
+      if (denominator > 0)
+	gen_sys.affine_image(var_space_dim, expr, denominator);
+      else
+	gen_sys.affine_image(var_space_dim, -expr, -denominator);
+    }
+    if (constraints_are_up_to_date()) {
+      // To build the inverse transformation,
+      // after copying and negating `expr',
+      // we exchange the roles of `expr[var_space_dim]' and `denominator'.
+      Linear_Expression inverse;
+      if (expr[var_space_dim] > 0) {
+	inverse = -expr;
+	inverse[var_space_dim] = denominator;
+	con_sys.affine_preimage(var_space_dim, inverse, expr[var_space_dim]);
+      }
+      else {
+	// The new denominator is negative: we negate everything once
+	// more, as Constraint_System::affine_preimage() requires the
+	// third argument to be positive.
+	inverse = expr;
+	inverse[var_space_dim] = denominator;
+	neg_assign(inverse[var_space_dim]);
+	con_sys.affine_preimage(var_space_dim, inverse, -expr[var_space_dim]);
+      }
+    }
+  }
+  else {
+    // The transformation is not invertible.
+    // We need an up-to-date system of generators.
+    if (has_something_pending())
+      remove_pending_to_obtain_generators();
+    else if (!generators_are_up_to_date())
+      minimize();
+    if (!marked_empty()) {
+      // Generator_System::affine_image() requires the third argument
+      // to be a positive Coefficient.
+      if (denominator > 0)
+	gen_sys.affine_image(var_space_dim, expr, denominator);
+      else
+	gen_sys.affine_image(var_space_dim, -expr, -denominator);
+
+      clear_constraints_up_to_date();
+      clear_generators_minimized();
+      clear_sat_c_up_to_date();
+      clear_sat_g_up_to_date();
+    }
+  }
+  assert(OK());
+}
+
+
+void
+PPL::Polyhedron::
+affine_preimage(const Variable var,
+		const Linear_Expression& expr,
+		Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var);
+
+  if (marked_empty())
+    return;
+
+  if (expr.coefficient(var) != 0) {
+    // The transformation is invertible:
+    // minimality and saturators are preserved.
+    if (constraints_are_up_to_date()) {
+      // Constraint_System::affine_preimage() requires the third argument
+      // to be a positive Coefficient.
+      if (denominator > 0)
+	con_sys.affine_preimage(var_space_dim, expr, denominator);
+      else
+	con_sys.affine_preimage(var_space_dim, -expr, -denominator);
+    }
+    if (generators_are_up_to_date()) {
+      // To build the inverse transformation,
+      // after copying and negating `expr',
+      // we exchange the roles of `expr[var_space_dim]' and `denominator'.
+      Linear_Expression inverse;
+      if (expr[var_space_dim] > 0) {
+	inverse = -expr;
+	inverse[var_space_dim] = denominator;
+	gen_sys.affine_image(var_space_dim, inverse, expr[var_space_dim]);
+      }
+      else {
+	// The new denominator is negative:
+	// we negate everything once more, as Generator_System::affine_image()
+	// requires the third argument to be positive.
+	inverse = expr;
+	inverse[var_space_dim] = denominator;
+	neg_assign(inverse[var_space_dim]);
+	gen_sys.affine_image(var_space_dim, inverse, -expr[var_space_dim]);
+      }
+    }
+  }
+  else {
+    // The transformation is not invertible.
+    // We need an up-to-date system of constraints.
+    if (has_something_pending())
+      remove_pending_to_obtain_constraints();
+    else if (!constraints_are_up_to_date())
+      minimize();
+    // Constraint_System::affine_preimage() requires the third argument
+    // to be a positive Coefficient.
+    if (denominator > 0)
+      con_sys.affine_preimage(var_space_dim, expr, denominator);
+    else
+      con_sys.affine_preimage(var_space_dim, -expr, -denominator);
+    // Generators, minimality and saturators are no longer valid.
+    clear_generators_up_to_date();
+    clear_constraints_minimized();
+    clear_sat_c_up_to_date();
+    clear_sat_g_up_to_date();
+  }
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::
+bounded_affine_image(const Variable var,
+		     const Linear_Expression& lb_expr,
+		     const Linear_Expression& ub_expr,
+		     Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+				 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub)",
+				 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub)",
+				 "ub", ub_expr);
+
+  // Any image of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  // Check whether `var' occurs in `lb_expr' and/or `ub_expr'.
+  if (lb_expr.coefficient(var) == 0) {
+    // Here `var' may only occur in `ub_expr'.
+    generalized_affine_image(var,
+			     LESS_THAN_OR_EQUAL,
+			     ub_expr,
+			     denominator);
+    if (denominator > 0)
+      add_constraint(lb_expr <= denominator*var);
+    else
+      add_constraint(denominator*var <= lb_expr);
+  }
+  else if (ub_expr.coefficient(var) == 0) {
+    // Here `var' only occurs in `lb_expr'.
+    generalized_affine_image(var,
+			     GREATER_THAN_OR_EQUAL,
+			     lb_expr,
+			     denominator);
+    if (denominator > 0)
+      add_constraint(denominator*var <= ub_expr);
+    else
+      add_constraint(ub_expr <= denominator*var);
+  }
+  else {
+    // Here `var' occurs in both `lb_expr' and `ub_expr'.
+    // To ease the computation, we add an additional dimension.
+    const Variable new_var = Variable(space_dim);
+    add_space_dimensions_and_embed(1);
+    // Constrain the new dimension to be equal to `ub_expr'.
+    // (we force minimization because we will need the generators).
+    add_constraint_and_minimize(denominator*new_var == ub_expr);
+    // Apply the affine lower bound.
+    generalized_affine_image(var,
+			     GREATER_THAN_OR_EQUAL,
+			     lb_expr,
+			     denominator);
+    // Now apply the affine upper bound, as recorded in `new_var'
+    // (we force minimization because we will need the generators).
+    if (denominator > 0)
+      add_constraint_and_minimize(var <= new_var);
+    else
+      add_constraint_and_minimize(new_var <= var);
+    // Remove the temporarily added dimension.
+    remove_higher_space_dimensions(space_dim-1);
+  }
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::
+bounded_affine_preimage(const Variable var,
+			const Linear_Expression& lb_expr,
+			const Linear_Expression& ub_expr,
+			Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+				 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+				 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)",
+				 "ub", ub_expr);
+
+  // Any preimage of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  // Check whether `var' occurs in neither `lb_expr' nor `ub_expr'.
+  if (lb_expr.coefficient(var) == 0 && ub_expr.coefficient(var) == 0) {
+    if (denominator > 0) {
+      add_constraint(lb_expr <= denominator*var);
+      add_constraint(denominator*var <= ub_expr);
+    }
+    else {
+      add_constraint(ub_expr <= denominator*var);
+      add_constraint(denominator*var <= lb_expr);
+    }
+    // Any image of an empty polyhedron is empty.
+    // Note: DO check for emptyness here, as we will later add a line.
+    if (is_empty())
+      return;
+    add_generator(line(var));
+  }
+  else {
+    // Here `var' occurs in `lb_expr' or `ub_expr'.
+    // To ease the computation, add an additional dimension.
+    const Variable new_var = Variable(space_dim);
+    add_space_dimensions_and_embed(1);
+    // Swap dimensions `var' and `new_var'.
+    std::vector<dimension_type> swapping_cycle;
+    swapping_cycle.push_back(var_space_dim);
+    swapping_cycle.push_back(space_dim);
+    swapping_cycle.push_back(0);
+    if (constraints_are_up_to_date())
+      con_sys.permute_columns(swapping_cycle);
+    if (generators_are_up_to_date())
+      gen_sys.permute_columns(swapping_cycle);
+    // Constrain the new dimension as dictated by `lb_expr' and `ub_expr'.
+    // (we force minimization because we will need the generators).
+    if (denominator > 0) {
+      add_constraint(lb_expr <= denominator*new_var);
+      add_constraint(denominator*new_var <= ub_expr);
+    }
+    else {
+      add_constraint(ub_expr <= denominator*new_var);
+      add_constraint(denominator*new_var <= lb_expr);
+    }
+    // Remove the temporarily added dimension.
+    remove_higher_space_dimensions(space_dim-1);
+  }
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::
+generalized_affine_image(const Variable var,
+			 const Relation_Symbol relsym,
+			 const Linear_Expression& expr,
+			 Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+				 "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+				 "v", var);
+
+  // Strict relation symbols are only admitted for NNC polyhedra.
+  if (is_necessarily_closed()
+      && (relsym == LESS_THAN || relsym == GREATER_THAN))
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+			   "r is a strict relation symbol");
+
+  // First compute the affine image.
+  affine_image(var, expr, denominator);
+
+  if (relsym == EQUAL)
+    // The affine relation is indeed an affine function.
+    return;
+
+  // Any image of an empty polyhedron is empty.
+  // Note: DO check for emptyness here, as we will later add a ray.
+  if (is_empty())
+    return;
+
+  switch (relsym) {
+  case LESS_THAN_OR_EQUAL:
+    add_generator(ray(-var));
+    break;
+  case GREATER_THAN_OR_EQUAL:
+    add_generator(ray(var));
+    break;
+  case LESS_THAN:
+  // Intentionally fall through.
+  case GREATER_THAN:
+    {
+      // The relation symbol is strict.
+      assert(!is_necessarily_closed());
+      // While adding the ray, we minimize the generators
+      // in order to avoid adding too many redundant generators later.
+      add_generator_and_minimize(ray(relsym == GREATER_THAN ? var : -var));
+      // We split each point of the generator system into two generators:
+      // a closure point, having the same coordinates of the given point,
+      // and another point, having the same coordinates for all but the
+      // `var' dimension, which is displaced along the direction of the
+      // newly introduced ray.
+      const dimension_type eps_index = space_dim + 1;
+      for (dimension_type i =  gen_sys.num_rows(); i-- > 0; )
+	if (gen_sys[i].is_point()) {
+	  Generator& g = gen_sys[i];
+	  // Add a `var'-displaced copy of `g' to the generator system.
+	  gen_sys.add_row(g);
+	  if (relsym == GREATER_THAN)
+	    ++gen_sys[gen_sys.num_rows()-1][var_space_dim];
+	  else
+	    --gen_sys[gen_sys.num_rows()-1][var_space_dim];
+	  // Transform `g' into a closure point.
+	  g[eps_index] = 0;
+	}
+      clear_constraints_up_to_date();
+      clear_generators_minimized();
+      gen_sys.set_sorted(false);
+      clear_sat_c_up_to_date();
+      clear_sat_g_up_to_date();
+    }
+    break;
+  case EQUAL:
+    // This case was already dealt with before.
+    throw std::runtime_error("PPL internal error");
+  }
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::
+generalized_affine_preimage(const Variable var,
+			    const Relation_Symbol relsym,
+			    const Linear_Expression& expr,
+			    Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+			   "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+				 "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+				 "v", var);
+
+  // Strict relation symbols are only admitted for NNC polyhedra.
+  if (is_necessarily_closed()
+      && (relsym == LESS_THAN || relsym == GREATER_THAN))
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+			   "r is a strict relation symbol");
+
+  // Check whether the affine relation is indeed an affine function.
+  if (relsym == EQUAL) {
+    affine_preimage(var, expr, denominator);
+    return;
+  }
+
+  // Compute the reversed relation symbol to simplify later coding.
+  Relation_Symbol reversed_relsym;
+  switch (relsym) {
+  case LESS_THAN:
+    reversed_relsym = GREATER_THAN;
+    break;
+  case LESS_THAN_OR_EQUAL:
+    reversed_relsym = GREATER_THAN_OR_EQUAL;
+    break;
+  case GREATER_THAN_OR_EQUAL:
+    reversed_relsym = LESS_THAN_OR_EQUAL;
+    break;
+  case GREATER_THAN:
+    reversed_relsym = LESS_THAN;
+    break;
+  default:
+    // The EQUAL case has been already dealt with.
+    throw std::runtime_error("PPL internal error");
+    break;
+  }
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& var_coefficient = expr.coefficient(var);
+  if (var_coefficient != 0) {
+    Linear_Expression inverse_expr
+      = expr - (denominator + var_coefficient) * var;
+    Coefficient inverse_denominator = - var_coefficient;
+    Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_denominator))
+      ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse_expr,
+			     inverse_denominator);
+    return;
+  }
+
+  // Here `var_coefficient == 0', so that the preimage cannot
+  // be easily computed by inverting the affine relation.
+  // Shrink the polyhedron by adding the constraint induced
+  // by the affine relation.
+  const Relation_Symbol corrected_relsym
+    = (denominator > 0) ? relsym : reversed_relsym;
+  switch (corrected_relsym) {
+  case LESS_THAN:
+    add_constraint(denominator*var < expr);
+    break;
+  case LESS_THAN_OR_EQUAL:
+    add_constraint(denominator*var <= expr);
+    break;
+  case GREATER_THAN_OR_EQUAL:
+    add_constraint(denominator*var >= expr);
+    break;
+  case GREATER_THAN:
+    add_constraint(denominator*var > expr);
+    break;
+  case EQUAL:
+    // We already dealt with this case.
+    throw std::runtime_error("PPL internal error");
+    break;
+  }
+  // If the shrunk polyhedron is empty, its preimage is empty too.
+  // Note: DO check for emptyness here, as we will later add a line.
+  if (is_empty())
+    return;
+  add_generator(line(var));
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::generalized_affine_image(const Linear_Expression& lhs,
+					  const Relation_Symbol relsym,
+					  const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e1", lhs);
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e2", rhs);
+
+  // Strict relation symbols are only admitted for NNC polyhedra.
+  if (is_necessarily_closed()
+      && (relsym == LESS_THAN || relsym == GREATER_THAN))
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+			   "r is a strict relation symbol");
+
+  // Any image of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  // Compute the actual space dimension of `lhs',
+  // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+  for ( ; lhs_space_dim > 0; lhs_space_dim--)
+    if (lhs.coefficient(Variable(lhs_space_dim - 1)) != 0)
+      break;
+  // If all variables have a zero coefficient, then `lhs' is a constant:
+  // we can simply add the constraint `lhs relsym rhs'.
+  if (lhs_space_dim == 0) {
+    switch (relsym) {
+    case LESS_THAN:
+      add_constraint(lhs < rhs);
+      break;
+    case LESS_THAN_OR_EQUAL:
+      add_constraint(lhs <= rhs);
+      break;
+    case EQUAL:
+      add_constraint(lhs == rhs);
+      break;
+    case GREATER_THAN_OR_EQUAL:
+      add_constraint(lhs >= rhs);
+      break;
+    case GREATER_THAN:
+      add_constraint(lhs > rhs);
+      break;
+    }
+    return;
+  }
+
+  // Gather in `new_lines' the collections of all the lines having
+  // the direction of variables occurring in `lhs'.
+  // While at it, check whether or not there exists a variable
+  // occurring in both `lhs' and `rhs'.
+  Generator_System new_lines;
+  bool lhs_vars_intersects_rhs_vars = false;
+  for (dimension_type i = lhs_space_dim; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0) {
+      new_lines.insert(line(Variable(i)));
+      if (rhs.coefficient(Variable(i)) != 0)
+	lhs_vars_intersects_rhs_vars = true;
+    }
+
+  if (lhs_vars_intersects_rhs_vars) {
+    // Some variables in `lhs' also occur in `rhs'.
+    // To ease the computation, we add an additional dimension.
+    const Variable new_var = Variable(space_dim);
+    add_space_dimensions_and_embed(1);
+
+    // Constrain the new dimension to be equal to the right hand side.
+    // (check for emptiness because we will add lines).
+    if (add_constraint_and_minimize(new_var == rhs)) {
+      // Cylindrificate on all the variables occurring in the left hand side
+      // (we force minimization because we will need the constraints).
+      add_recycled_generators_and_minimize(new_lines);
+
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'
+      // (we force minimization because we will need the generators).
+      switch (relsym) {
+      case LESS_THAN:
+	add_constraint_and_minimize(lhs < new_var);
+	break;
+      case LESS_THAN_OR_EQUAL:
+	add_constraint_and_minimize(lhs <= new_var);
+	break;
+      case EQUAL:
+	add_constraint_and_minimize(lhs == new_var);
+	break;
+      case GREATER_THAN_OR_EQUAL:
+	add_constraint_and_minimize(lhs >= new_var);
+	break;
+      case GREATER_THAN:
+	add_constraint_and_minimize(lhs > new_var);
+	break;
+      }
+    }
+    // Remove the temporarily added dimension.
+    remove_higher_space_dimensions(space_dim-1);
+  }
+  else {
+    // `lhs' and `rhs' variables are disjoint:
+    // there is no need to add a further dimension.
+
+    // Any image of an empty polyhedron is empty.
+    // Note: DO check for emptyness here, as we will add lines.
+    if (is_empty())
+      return;
+
+    // Cylindrificate on all the variables occurring in the left hand side
+    // (we force minimization because we will need the constraints).
+    add_recycled_generators_and_minimize(new_lines);
+
+    // Constrain the left hand side expression so that it is related to
+    // the right hand side expression as dictated by `relsym'.
+    switch (relsym) {
+    case LESS_THAN:
+      add_constraint(lhs < rhs);
+      break;
+    case LESS_THAN_OR_EQUAL:
+      add_constraint(lhs <= rhs);
+      break;
+    case EQUAL:
+      add_constraint(lhs == rhs);
+      break;
+    case GREATER_THAN_OR_EQUAL:
+      add_constraint(lhs >= rhs);
+      break;
+    case GREATER_THAN:
+      add_constraint(lhs > rhs);
+      break;
+    }
+  }
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::generalized_affine_preimage(const Linear_Expression& lhs,
+					     const Relation_Symbol relsym,
+					     const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+				 "e1", lhs);
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+				 "e2", rhs);
+
+  // Strict relation symbols are only admitted for NNC polyhedra.
+  if (is_necessarily_closed()
+      && (relsym == LESS_THAN || relsym == GREATER_THAN))
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+			   "r is a strict relation symbol");
+
+  // Any preimage of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  // Compute the actual space dimension of `lhs',
+  // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+  for ( ; lhs_space_dim > 0; lhs_space_dim--)
+    if (lhs.coefficient(Variable(lhs_space_dim - 1)) != 0)
+      break;
+
+  // If all variables have a zero coefficient, then `lhs' is a constant:
+  // in this case, preimage and image happen to be the same.
+  if (lhs_space_dim == 0) {
+    generalized_affine_image(lhs, relsym, rhs);
+    return;
+  }
+
+  // Gather in `new_lines' the collections of all the lines having
+  // the direction of variables occurring in `lhs'.
+  // While at it, check whether or not there exists a variable
+  // occurring in both `lhs' and `rhs'.
+  Generator_System new_lines;
+  bool lhs_vars_intersects_rhs_vars = false;
+  for (dimension_type i = lhs_space_dim; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0) {
+      new_lines.insert(line(Variable(i)));
+      if (rhs.coefficient(Variable(i)) != 0)
+	lhs_vars_intersects_rhs_vars = true;
+    }
+
+  if (lhs_vars_intersects_rhs_vars) {
+    // Some variables in `lhs' also occur in `rhs'.
+    // To ease the computation, we add an additional dimension.
+    const Variable new_var = Variable(space_dim);
+    add_space_dimensions_and_embed(1);
+
+    // Constrain the new dimension to be equal to `lhs'
+    // (also check for emptiness because we have to add lines).
+    if (add_constraint_and_minimize(new_var == lhs)) {
+      // Cylindrificate on all the variables occurring in the left hand side
+      // (we force minimization because we will need the constraints).
+      add_recycled_generators_and_minimize(new_lines);
+
+      // Constrain the new dimension so that it is related to
+      // the right hand side as dictated by `relsym'
+      // (we force minimization because we will need the generators).
+      switch (relsym) {
+      case LESS_THAN:
+	add_constraint_and_minimize(new_var < rhs);
+	break;
+      case LESS_THAN_OR_EQUAL:
+	add_constraint_and_minimize(new_var <= rhs);
+	break;
+      case EQUAL:
+	add_constraint_and_minimize(new_var == rhs);
+	break;
+      case GREATER_THAN_OR_EQUAL:
+	add_constraint_and_minimize(new_var >= rhs);
+	break;
+      case GREATER_THAN:
+	add_constraint_and_minimize(new_var > rhs);
+	break;
+      }
+    }
+    // Remove the temporarily added dimension.
+    remove_higher_space_dimensions(space_dim-1);
+  }
+  else {
+    // `lhs' and `rhs' variables are disjoint:
+    // there is no need to add a further dimension.
+
+    // Constrain the left hand side expression so that it is related to
+    // the right hand side expression as dictated by `relsym'.
+    switch (relsym) {
+    case LESS_THAN:
+      add_constraint(lhs < rhs);
+      break;
+    case LESS_THAN_OR_EQUAL:
+      add_constraint(lhs <= rhs);
+      break;
+    case EQUAL:
+      add_constraint(lhs == rhs);
+      break;
+    case GREATER_THAN_OR_EQUAL:
+      add_constraint(lhs >= rhs);
+      break;
+    case GREATER_THAN:
+      add_constraint(lhs > rhs);
+      break;
+    }
+    // Any image of an empty polyhedron is empty.
+    // Note: DO check for emptyness here, as we will add lines.
+    if (is_empty())
+      return;
+    // Cylindrificate on all the variables occurring in `lhs'.
+    add_recycled_generators(new_lines);
+  }
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::time_elapse_assign(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("time_elapse_assign(y)", "y", y);
+  // Dimension-compatibility checks.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("time_elapse_assign(y)", "y", y);
+
+  // Dealing with the zero-dimensional case.
+  if (x.space_dim == 0) {
+    if (y.marked_empty())
+      x.set_empty();
+    return;
+  }
+
+  // If either one of `x' or `y' is empty, the result is empty too.
+  if (x.marked_empty() || y.marked_empty()
+      || (x.has_pending_constraints() && !x.process_pending_constraints())
+      || (!x.generators_are_up_to_date() && !x.update_generators())
+      || (y.has_pending_constraints() && !y.process_pending_constraints())
+      || (!y.generators_are_up_to_date() && !y.update_generators())) {
+    x.set_empty();
+    return;
+  }
+
+  // At this point both generator systems are up-to-date,
+  // possibly containing pending generators.
+  Generator_System gs = y.gen_sys;
+  dimension_type gs_num_rows = gs.num_rows();
+
+  if (!x.is_necessarily_closed())
+    // `x' and `y' are NNC polyhedra.
+    for (dimension_type i = gs_num_rows; i-- > 0; )
+      switch (gs[i].type()) {
+      case Generator::POINT:
+	// The points of `gs' can be erased,
+	// since their role can be played by closure points.
+	--gs_num_rows;
+	std::swap(gs[i], gs[gs_num_rows]);
+	break;
+      case Generator::CLOSURE_POINT:
+	{
+	  Generator& cp = gs[i];
+	  // If it is the origin, erase it.
+	  if (cp.all_homogeneous_terms_are_zero()) {
+	    --gs_num_rows;
+	    std::swap(cp, gs[gs_num_rows]);
+	  }
+	  // Otherwise, transform the closure point into a ray.
+	  else {
+	    cp[0] = 0;
+	    // Enforce normalization.
+	    cp.normalize();
+	  }
+	}
+	break;
+      default:
+	// For rays and lines, nothing to be done.
+	break;
+      }
+  else
+    // `x' and `y' are C polyhedra.
+    for (dimension_type i = gs_num_rows; i-- > 0; )
+      switch (gs[i].type()) {
+      case Generator::POINT:
+	{
+	  Generator& p = gs[i];
+	  // If it is the origin, erase it.
+	  if (p.all_homogeneous_terms_are_zero()) {
+	    --gs_num_rows;
+	    std::swap(p, gs[gs_num_rows]);
+	  }
+	  // Otherwise, transform the point into a ray.
+	  else {
+	    p[0] = 0;
+	    // Enforce normalization.
+	    p.normalize();
+	  }
+	}
+	break;
+      default:
+	// For rays and lines, nothing to be done.
+	break;
+      }
+  // If it was present, erase the origin point or closure point,
+  // which cannot be transformed into a valid ray or line.
+  // For NNC polyhedra, also erase all the points of `gs',
+  // whose role can be played by the closure points.
+  // These have been previously moved to the end of `gs'.
+  gs.erase_to_end(gs_num_rows);
+  gs.unset_pending_rows();
+
+  // `gs' may now have no rows.
+  // Namely, this happens when `y' was the singleton polyhedron
+  // having the origin as the one and only point.
+  // In such a case, the resulting polyhedron is equal to `x'.
+  if (gs_num_rows == 0)
+    return;
+
+  // If the polyhedron can have something pending, we add `gs'
+  // to `gen_sys' as pending rows
+  if (x.can_have_something_pending()) {
+    x.gen_sys.add_pending_rows(gs);
+    x.set_generators_pending();
+  }
+  // Otherwise, the two systems are merged.
+  // `Linear_System::merge_rows_assign()' requires both systems to be sorted.
+  else {
+    if (!x.gen_sys.is_sorted())
+      x.gen_sys.sort_rows();
+    gs.sort_rows();
+    x.gen_sys.merge_rows_assign(gs);
+    // Only the system of generators is up-to-date.
+    x.clear_constraints_up_to_date();
+    x.clear_generators_minimized();
+  }
+  assert(x.OK(true) && y.OK(true));
+}
+
+void
+PPL::Polyhedron::topological_closure_assign() {
+  // Necessarily closed polyhedra are trivially closed.
+  if (is_necessarily_closed())
+    return;
+  // Any empty or zero-dimensional polyhedron is closed.
+  if (marked_empty() || space_dim == 0)
+    return;
+
+  // The computation can be done using constraints or generators.
+  // If we use constraints, we will change them, so that having pending
+  // constraints would be useless. If we use generators, we add generators,
+  // so that having pending generators still makes sense.
+
+  // Process any pending constraints.
+  if (has_pending_constraints() && !process_pending_constraints())
+    return;
+
+  // Use constraints only if they are available and
+  // there are no pending generators.
+  if (!has_pending_generators() && constraints_are_up_to_date()) {
+    const dimension_type eps_index = space_dim + 1;
+    bool changed = false;
+    // Transform all strict inequalities into non-strict ones.
+    for (dimension_type i = con_sys.num_rows(); i-- > 0; ) {
+      Constraint& c = con_sys[i];
+      if (c[eps_index] < 0 && !c.is_tautological()) {
+	c[eps_index] = 0;
+	// Enforce normalization.
+	c.normalize();
+	changed = true;
+      }
+    }
+    if (changed) {
+      con_sys.insert(Constraint::epsilon_leq_one());
+      con_sys.set_sorted(false);
+      // After changing the system of constraints, the generators
+      // are no longer up-to-date and the constraints are no longer
+      // minimized.
+      clear_generators_up_to_date();
+      clear_constraints_minimized();
+    }
+  }
+  else {
+    // Here we use generators, possibly keeping constraints.
+    assert(generators_are_up_to_date());
+    // Add the corresponding point to each closure point.
+    gen_sys.add_corresponding_points();
+    if (can_have_something_pending())
+      set_generators_pending();
+    else {
+      // We cannot have pending generators; this also implies
+      // that generators may have lost their sortedness.
+      gen_sys.unset_pending_rows();
+      gen_sys.set_sorted(false);
+      // Constraints are not up-to-date and generators are not minimized.
+      clear_constraints_up_to_date();
+      clear_generators_minimized();
+    }
+  }
+  assert(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+bool
+PPL::operator==(const Polyhedron& x, const Polyhedron& y) {
+  // If the two polyhedra are topology-incompatible or dimension-incompatible,
+  // then they cannot be the same polyhedron.
+  if (x.topology() != y.topology() || x.space_dim != y.space_dim)
+    return false;
+
+  if (x.marked_empty())
+    return y.is_empty();
+  else if (y.marked_empty())
+    return x.is_empty();
+  else if (x.space_dim == 0)
+    return true;
+
+  switch (x.quick_equivalence_test(y)) {
+  case Polyhedron::TVB_TRUE:
+    return true;
+
+  case Polyhedron::TVB_FALSE:
+    return false;
+
+  default:
+    if (x.is_included_in(y))
+      if (x.marked_empty())
+	return y.is_empty();
+      else
+	return y.is_included_in(x);
+    else
+      return false;
+  }
+}
+
+bool
+PPL::Polyhedron::contains(const Polyhedron& y) const {
+  const Polyhedron& x = *this;
+
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("contains(y)", "y", y);
+
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("contains(y)", "y", y);
+
+  if (y.marked_empty())
+    return true;
+  else if (x.marked_empty())
+    return y.is_empty();
+  else if (y.space_dim == 0)
+    return true;
+  else if (x.quick_equivalence_test(y) == Polyhedron::TVB_TRUE)
+    return true;
+  else
+    return y.is_included_in(x);
+}
+
+bool
+PPL::Polyhedron::is_disjoint_from(const Polyhedron& y) const {
+  Polyhedron z = *this;
+  z.intersection_assign_and_minimize(y);
+  return z.is_empty();
+}
+
+void
+PPL::Polyhedron::ascii_dump(std::ostream& s) const {
+  s << "space_dim " << space_dim << "\n";
+  status.ascii_dump(s);
+  s << "\ncon_sys ("
+    << (constraints_are_up_to_date() ? "" : "not_")
+    << "up-to-date)"
+    << "\n";
+  con_sys.ascii_dump(s);
+  s << "\ngen_sys ("
+    << (generators_are_up_to_date() ? "" : "not_")
+    << "up-to-date)"
+    << "\n";
+  gen_sys.ascii_dump(s);
+  s << "\nsat_c\n";
+  sat_c.ascii_dump(s);
+  s << "\nsat_g\n";
+  sat_g.ascii_dump(s);
+  s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS(Polyhedron);
+
+bool
+PPL::Polyhedron::ascii_load(std::istream& s) {
+  std::string str;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> space_dim))
+    return false;
+
+  if (!status.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "con_sys")
+    return false;
+
+  if (!(s >> str) || (str != "(not_up-to-date)" && str != "(up-to-date)"))
+    return false;
+
+  if (!con_sys.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "gen_sys")
+    return false;
+
+  if (!(s >> str) || (str != "(not_up-to-date)" && str != "(up-to-date)"))
+    return false;
+
+  if (!gen_sys.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "sat_c")
+    return false;
+
+  if (!sat_c.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "sat_g")
+    return false;
+
+  if (!sat_g.ascii_load(s))
+    return false;
+
+  // Check for well-formedness.
+  assert(OK());
+  return true;
+}
+
+PPL::memory_size_type
+PPL::Polyhedron::external_memory_in_bytes() const {
+  return
+    con_sys.external_memory_in_bytes()
+    + gen_sys.external_memory_in_bytes()
+    + sat_c.external_memory_in_bytes()
+    + sat_g.external_memory_in_bytes();
+}
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Polyhedron& ph) {
+  if (ph.is_empty())
+    s << "false";
+  else
+    s << ph.minimized_constraints();
+  return s;
+}
diff --git a/src/Polyhedron_widenings.cc b/src/Polyhedron_widenings.cc
new file mode 100644
index 0000000..49bf651
--- /dev/null
+++ b/src/Polyhedron_widenings.cc
@@ -0,0 +1,862 @@
+/* Polyhedron class implementation
+   (non-inline widening-related member functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Polyhedron.defs.hh"
+
+#include "BHRZ03_Certificate.defs.hh"
+#include "Bounding_Box.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cassert>
+#include <iostream>
+#include <stdexcept>
+#include <deque>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Polyhedron
+::select_CH78_constraints(const Polyhedron& y,
+			  Constraint_System& cs_selection) const {
+  // Private method: the caller must ensure the following conditions.
+  assert(topology() == y.topology()
+	 && topology() == cs_selection.topology()
+	 && space_dim == y.space_dim);
+  assert(!marked_empty()
+	 && !has_pending_constraints()
+	 && generators_are_up_to_date());
+  assert(!y.marked_empty()
+	 && !y.has_something_pending()
+	 && y.constraints_are_minimized());
+
+  // A constraint in `y.con_sys' is copied to `cs_selection'
+  // if it is satisfied by all the generators of `gen_sys'.
+
+  // Note: the loop index `i' goes upward to avoid reversing
+  // the ordering of the chosen constraints.
+  for (dimension_type i = 0, end = y.con_sys.num_rows(); i < end; ++i) {
+    const Constraint& c = y.con_sys[i];
+    if (gen_sys.satisfied_by_all_generators(c))
+      cs_selection.insert(c);
+  }
+}
+
+void
+PPL::Polyhedron
+::select_H79_constraints(const Polyhedron& y,
+			 Constraint_System& cs_selected,
+			 Constraint_System& cs_not_selected) const {
+  // Private method: the caller must ensure the following conditions
+  // (beside the inclusion `y <= x').
+  assert(topology() == y.topology()
+	 && topology() == cs_selected.topology()
+	 && topology() == cs_not_selected.topology());
+  assert(space_dim == y.space_dim);
+  assert(!marked_empty()
+	 && !has_pending_generators()
+	 && constraints_are_up_to_date());
+  assert(!y.marked_empty()
+	 && !y.has_something_pending()
+	 && y.constraints_are_minimized()
+	 && y.generators_are_up_to_date());
+
+  // Obtain a sorted copy of `y.sat_g'.
+  if (!y.sat_g_is_up_to_date())
+    y.update_sat_g();
+  Saturation_Matrix tmp_sat_g = y.sat_g;
+  // Remove from `tmp_sat_g' the rows corresponding to tautologies
+  // (i.e., the positivity or epsilon-bounding constraints):
+  // this is needed in order to widen the polyhedron and not the
+  // corresponding homogenized polyhedral cone.
+  const Constraint_System& y_cs = y.con_sys;
+  dimension_type num_rows = y_cs.num_rows();
+  for (dimension_type i = 0; i < num_rows; ++i)
+    if (y_cs[i].is_tautological()) {
+      --num_rows;
+      std::swap(tmp_sat_g[i], tmp_sat_g[num_rows]);
+    }
+  tmp_sat_g.rows_erase_to_end(num_rows);
+  tmp_sat_g.sort_rows();
+
+  // A constraint in `con_sys' is copied to `cs_selected'
+  // if its behavior with respect to `y.gen_sys' is the same
+  // as that of another constraint in `y.con_sys'.
+  // otherwise it is copied to `cs_not_selected'.
+  // Namely, we check whether the saturation row `buffer'
+  // (built starting from the given constraint and `y.gen_sys')
+  // is a row of the saturation matrix `tmp_sat_g'.
+
+  // CHECK ME: the following comment is only applicable when `y.gen_sys'
+  // is minimized. In that case, the comment suggests that it would be
+  // possible to use a fast (but incomplete) redundancy test based on
+  // the number of saturators in `buffer'.
+  // NOTE: If the considered constraint of `con_sys' does not
+  // satisfy the saturation rule (see Section \ref prelims), then
+  // it will not appear in the resulting constraint system,
+  // because `tmp_sat_g' is built starting from a minimized polyhedron.
+
+  // The size of `buffer' will reach sat.num_columns() bit.
+  Saturation_Row buffer;
+  // Note: the loop index `i' goes upward to avoid reversing
+  // the ordering of the chosen constraints.
+  for (dimension_type i = 0, end = con_sys.num_rows(); i < end; ++i) {
+    const Constraint& ci = con_sys[i];
+    // The saturation row `buffer' is built considering
+    // the `i'-th constraint of the polyhedron `x' and
+    // all the generators of the polyhedron `y'.
+    buffer.clear();
+    for (dimension_type j = y.gen_sys.num_rows(); j-- > 0; ) {
+      const int sp_sgn = Scalar_Products::sign(ci, y.gen_sys[j]);
+      // We are assuming that `y <= x'.
+      assert(sp_sgn >= 0);
+      if (sp_sgn > 0)
+	buffer.set(j);
+    }
+    // We check whether `buffer' is a row of `tmp_sat_g',
+    // exploiting its sortedness in order to have faster comparisons.
+    if (tmp_sat_g.sorted_contains(buffer))
+      cs_selected.insert(ci);
+    else
+      cs_not_selected.insert(ci);
+  }
+}
+
+void
+PPL::Polyhedron::H79_widening_assign(const Polyhedron& y, unsigned* tp) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  const Topology tpl = x.topology();
+  if (tpl != y.topology())
+    throw_topology_incompatible("H79_widening_assign(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("H79_widening_assign(y)", "y", y);
+
+#ifndef NDEBUG
+  {
+    // We assume that y is contained in or equal to x.
+    const Polyhedron x_copy = x;
+    const Polyhedron y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // If any argument is zero-dimensional or empty,
+  // the H79-widening behaves as the identity function.
+  if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
+    return;
+
+  // `y.gen_sys' should be in minimal form and
+  // `y.sat_g' should be up-to-date.
+  if (y.is_necessarily_closed()) {
+    if (!y.minimize())
+      // `y' is empty: the result is `x'.
+      return;
+  }
+  else {
+    // Dealing with a NNC polyhedron.
+    // To obtain a correct reasoning when comparing
+    // the constraints of `x' with the generators of `y',
+    // we enforce the inclusion relation holding between
+    // the two NNC polyhedra `x' and `y' (i.e., `y <= x')
+    // to also hold for the corresponding eps-representations:
+    // this is obtained by intersecting the two eps-representations.
+    Polyhedron& yy = const_cast<Polyhedron&>(y);
+    if (!yy.intersection_assign_and_minimize(x))
+      // `y' is empty: the result is `x'.
+      return;
+  }
+
+  // If we only have the generators of `x' and the dimensions of
+  // the two polyhedra are the same, we can compute the standard
+  // widening by using the specification in CousotH78, therefore
+  // avoiding converting from generators to constraints.
+  if (x.has_pending_generators() || !x.constraints_are_up_to_date()) {
+    Constraint_System CH78_cs(tpl);
+    x.select_CH78_constraints(y, CH78_cs);
+
+    if (CH78_cs.num_rows() == y.con_sys.num_rows()) {
+      // Having selected all the constraints, the result is `y'.
+      x = y;
+      return;
+    }
+    // Otherwise, check if `x' and `y' have the same dimension.
+    // Note that `y.con_sys' is minimized and `CH78_cs' has no redundant
+    // constraints, since it is a subset of the former.
+    else if (CH78_cs.num_equalities() == y.con_sys.num_equalities()) {
+      // Let `x' be defined by the constraints in `CH78_cs'.
+      Polyhedron CH78(tpl, x.space_dim, UNIVERSE);
+      CH78.add_recycled_constraints(CH78_cs);
+
+      // Check whether we are using the widening-with-tokens technique
+      // and there still are tokens available.
+      if (tp != 0 && *tp > 0) {
+	// There are tokens available. If `CH78' is not a subset of `x',
+	// then it is less precise and we use one of the available tokens.
+	if (!x.contains(CH78))
+	  --(*tp);
+      }
+      else
+	// No tokens.
+	std::swap(x, CH78);
+      assert(x.OK(true));
+      return;
+    }
+  }
+
+  // As the dimension of `x' is strictly greater than the dimension of `y',
+  // we have to compute the standard widening by selecting a subset of
+  // the constraints of `x'.
+  // `x.con_sys' is just required to be up-to-date, because:
+  // - if `x.con_sys' is unsatisfiable, then by assumption
+  //   also `y' is empty, so that the resulting polyhedron is `x';
+  // - redundant constraints in `x.con_sys' do not affect the result
+  //   of the widening, because if they are selected they will be
+  //   redundant even in the result.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!x.constraints_are_up_to_date())
+    x.update_constraints();
+
+  // Copy into `H79_cs' the constraints of `x' that are common to `y',
+  // according to the definition of the H79 widening.
+  Constraint_System H79_cs(tpl);
+  Constraint_System x_minus_H79_cs(tpl);
+  x.select_H79_constraints(y, H79_cs, x_minus_H79_cs);
+
+  if (x_minus_H79_cs.num_rows() == 0)
+    // We selected all of the constraints of `x',
+    // thus the result of the widening is `x'.
+    return;
+  else {
+    // We selected a strict subset of the constraints of `x'.
+    // NOTE: as `x.con_sys' was not necessarily in minimal form,
+    // this does not imply that the result strictly includes `x'.
+    // Let `H79' be defined by the constraints in `H79_cs'.
+    Polyhedron H79(tpl, x.space_dim, UNIVERSE);
+    H79.add_recycled_constraints(H79_cs);
+
+    // Check whether we are using the widening-with-tokens technique
+    // and there still are tokens available.
+    if (tp != 0 && *tp > 0) {
+      // There are tokens available. If `H79' is not a subset of `x',
+      // then it is less precise and we use one of the available tokens.
+      if (!x.contains(H79))
+	--(*tp);
+    }
+    else
+      // No tokens.
+      std::swap(x, H79);
+    assert(x.OK(true));
+  }
+}
+
+void
+PPL::Polyhedron::limited_H79_extrapolation_assign(const Polyhedron& y,
+						  const Constraint_System& cs,
+						  unsigned* tp) {
+  Polyhedron& x = *this;
+
+  const dimension_type cs_num_rows = cs.num_rows();
+  // If `cs' is empty, we fall back to ordinary, non-limited widening.
+  if (cs_num_rows == 0) {
+    x.H79_widening_assign(y, tp);
+    return;
+  }
+
+  // Topology compatibility check.
+  if (x.is_necessarily_closed()) {
+    if (!y.is_necessarily_closed())
+      throw_topology_incompatible("limited_H79_extrapolation_assign(y, cs)",
+				  "y", y);
+    if (cs.has_strict_inequalities())
+      throw_topology_incompatible("limited_H79_extrapolation_assign(y, cs)",
+				  "cs", cs);
+  }
+  else if (y.is_necessarily_closed())
+    throw_topology_incompatible("limited_H79_extrapolation_assign(y, cs)",
+				"y", y);
+
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_H79_extrapolation_assign(y, cs)",
+				 "y", y);
+  // `cs' must be dimension-compatible with the two polyhedra.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (x.space_dim < cs_space_dim)
+    throw_dimension_incompatible("limited_H79_extrapolation_assign(y, cs)",
+				 "cs", cs);
+
+#ifndef NDEBUG
+  {
+    // We assume that y is contained in or equal to x.
+    const Polyhedron x_copy = x;
+    const Polyhedron y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty())
+    return;
+
+  // The limited H79-widening between two polyhedra in a
+  // zero-dimensional space is a polyhedron in a zero-dimensional
+  // space, too.
+  if (x.space_dim == 0)
+    return;
+
+  if (!y.minimize())
+    // We have just discovered that `y' is empty.
+    return;
+
+  // Update the generators of `x': these are used to select,
+  // from the constraints in `cs', those that must be added
+  // to the resulting polyhedron.
+  if ((x.has_pending_constraints() && !x.process_pending_constraints())
+      || (!x.generators_are_up_to_date() && !x.update_generators()))
+    // We have just discovered that `x' is empty.
+    return;
+
+  Constraint_System new_cs;
+  // The constraints to be added must be satisfied by all the
+  // generators of `x'.  We can disregard `y' because `y <= x'.
+  const Generator_System& x_gen_sys = x.gen_sys;
+  // Iterate upwards here so as to keep the relative ordering of constraints.
+  // Not really an issue: just aesthetics.
+  for (dimension_type i = 0; i < cs_num_rows; ++i) {
+    const Constraint& c = cs[i];
+    if (x_gen_sys.satisfied_by_all_generators(c))
+      new_cs.insert(c);
+  }
+  x.H79_widening_assign(y, tp);
+  x.add_constraints(new_cs);
+  assert(OK());
+}
+
+void
+PPL::Polyhedron::bounded_H79_extrapolation_assign(const Polyhedron& y,
+						  const Constraint_System& cs,
+						  unsigned* tp) {
+  const dimension_type space_dim = space_dimension();
+  Bounding_Box x_box(space_dim);
+  Bounding_Box y_box(space_dim);
+  shrink_bounding_box(x_box, ANY_COMPLEXITY);
+  y.shrink_bounding_box(y_box, ANY_COMPLEXITY);
+  x_box.CC76_widening_assign(y_box);
+  limited_H79_extrapolation_assign(y, cs, tp);
+  // TODO: see if some copies can be avoided.
+  // add_recycled_constraints(x_box.constraints());
+  add_constraints(x_box.constraints());
+}
+
+bool
+PPL::Polyhedron
+::BHRZ03_combining_constraints(const Polyhedron& y,
+			       const BHRZ03_Certificate& y_cert,
+			       const Polyhedron& H79,
+			       const Constraint_System& x_minus_H79_cs) {
+  Polyhedron& x = *this;
+  // It is assumed that `y <= x <= H79'.
+  assert(x.topology() == y.topology()
+	 && x.topology() == H79.topology()
+	 && x.topology() == x_minus_H79_cs.topology());
+  assert(x.space_dim == y.space_dim
+	 && x.space_dim == H79.space_dim
+	 && x.space_dim == x_minus_H79_cs.space_dimension());
+  assert(!x.marked_empty() && !x.has_something_pending()
+	 && x.constraints_are_minimized() && x.generators_are_minimized());
+  assert(!y.marked_empty() && !y.has_something_pending()
+	 && y.constraints_are_minimized() && y.generators_are_minimized());
+  assert(!H79.marked_empty() && !H79.has_something_pending()
+	 && H79.constraints_are_minimized() && H79.generators_are_minimized());
+
+  // We will choose from `x_minus_H79_cs' many subsets of constraints,
+  // that will be collected (one at a time) in `combining_cs'.
+  // For each group collected, we compute an average constraint,
+  // that will be stored in `new_cs'.
+
+  // There is no point in applying this technique when `x_minus_H79_cs'
+  // has one constraint at most (no ``new'' constraint can be computed).
+  const dimension_type x_minus_H79_cs_num_rows = x_minus_H79_cs.num_rows();
+  if (x_minus_H79_cs_num_rows <= 1)
+    return false;
+
+  const Topology tpl = x.topology();
+  Constraint_System combining_cs(tpl);
+  Constraint_System new_cs(tpl);
+
+  // Consider the points that belong to both `x.gen_sys' and `y.gen_sys'.
+  // For NNC polyhedra, the role of points is played by closure points.
+  const bool closed = x.is_necessarily_closed();
+  for (dimension_type i = y.gen_sys.num_rows(); i-- > 0; ) {
+    const Generator& g = y.gen_sys[i];
+    if ((g.is_point() && closed) || (g.is_closure_point() && !closed)) {
+      // If in `H79.con_sys' there is already an inequality constraint
+      // saturating this point, then there is no need to produce another
+      // constraint.
+      bool lies_on_the_boundary_of_H79 = false;
+      const Constraint_System& H79_cs = H79.con_sys;
+      for (dimension_type j = H79_cs.num_rows(); j-- > 0; ) {
+	const Constraint& c = H79_cs[j];
+	if (c.is_inequality() && Scalar_Products::sign(c, g) == 0) {
+	  lies_on_the_boundary_of_H79 = true;
+	  break;
+	}
+      }
+      if (lies_on_the_boundary_of_H79)
+	continue;
+
+      // Consider all the constraints in `x_minus_H79_cs'
+      // that are saturated by the point `g'.
+      combining_cs.clear();
+      for (dimension_type j = x_minus_H79_cs_num_rows; j-- > 0; ) {
+	const Constraint& c = x_minus_H79_cs[j];
+	if (Scalar_Products::sign(c, g) == 0)
+	  combining_cs.insert(c);
+      }
+      // Build a new constraint by combining all the chosen constraints.
+      const dimension_type combining_cs_num_rows = combining_cs.num_rows();
+      if (combining_cs_num_rows > 0) {
+	if (combining_cs_num_rows == 1)
+	  // No combination is needed.
+	  new_cs.insert(combining_cs[0]);
+	else {
+	  Linear_Expression e(0);
+	  bool strict_inequality = false;
+	  for (dimension_type h = combining_cs_num_rows; h-- > 0; ) {
+	    if (combining_cs[h].is_strict_inequality())
+	      strict_inequality = true;
+	    e += Linear_Expression(combining_cs[h]);
+	  }
+
+	  if (!e.all_homogeneous_terms_are_zero())
+	    if (strict_inequality)
+	      new_cs.insert(e > 0);
+	    else
+	      new_cs.insert(e >= 0);
+	}
+      }
+    }
+  }
+
+  // If none of the collected constraints strictly intersects `H79',
+  // then the technique was unsuccessful.
+  bool improves_upon_H79 = false;
+  const Poly_Con_Relation si = Poly_Con_Relation::strictly_intersects();
+  for (dimension_type i = new_cs.num_rows(); i-- > 0; )
+    if (H79.relation_with(new_cs[i]) == si) {
+      improves_upon_H79 = true;
+      break;
+    }
+  if (!improves_upon_H79)
+    return false;
+
+  // The resulting polyhedron is obtained by adding the constraints
+  // in `new_cs' to polyhedron `H79'.
+  Polyhedron result = H79;
+  result.add_recycled_constraints_and_minimize(new_cs);
+
+  // Check for stabilization with respect to `y_cert' and improvement
+  // over `H79'.
+  if (y_cert.is_stabilizing(result) && !result.contains(H79)) {
+    // The technique was successful.
+    std::swap(x, result);
+    assert(x.OK(true));
+    return true;
+  }
+  else
+    // The technique was unsuccessful.
+    return false;
+}
+
+bool
+PPL::Polyhedron::BHRZ03_evolving_points(const Polyhedron& y,
+					const BHRZ03_Certificate& y_cert,
+					const Polyhedron& H79) {
+  Polyhedron& x = *this;
+  // It is assumed that `y <= x <= H79'.
+  assert(x.topology() == y.topology()
+	 && x.topology() == H79.topology());
+  assert(x.space_dim == y.space_dim
+	 && x.space_dim == H79.space_dim);
+  assert(!x.marked_empty() && !x.has_something_pending()
+	 && x.constraints_are_minimized() && x.generators_are_minimized());
+  assert(!y.marked_empty() && !y.has_something_pending()
+	 && y.constraints_are_minimized() && y.generators_are_minimized());
+  assert(!H79.marked_empty() && !H79.has_something_pending()
+	 && H79.constraints_are_minimized() && H79.generators_are_minimized());
+
+  // For each point in `x.gen_sys' that is not in `y',
+  // this technique tries to identify a set of rays that:
+  //  - are included in polyhedron `H79';
+  //  - when added to `y' will subsume the point.
+  Generator_System candidate_rays;
+
+  const dimension_type x_gen_sys_num_rows = x.gen_sys.num_rows();
+  const dimension_type y_gen_sys_num_rows = y.gen_sys.num_rows();
+  const bool closed = x.is_necessarily_closed();
+  for (dimension_type i = x_gen_sys_num_rows; i-- > 0; ) {
+    Generator& g1 = x.gen_sys[i];
+    // For C polyhedra, we choose a point of `x.gen_sys'
+    // that is not included in `y'.
+    // In the case of NNC polyhedra, we can restrict attention to
+    // closure points (considering also points will only add redundancy).
+    if (((g1.is_point() && closed) || (g1.is_closure_point() && !closed))
+	&& y.relation_with(g1) == Poly_Gen_Relation::nothing()) {
+      // For each point (resp., closure point) `g2' in `y.gen_sys',
+      // where `g1' and `g2' are different,
+      // build the candidate ray `g1 - g2'.
+      for (dimension_type j = y_gen_sys_num_rows; j-- > 0; ) {
+	const Generator& g2 = y.gen_sys[j];
+	if ((g2.is_point() && closed)
+	    || (g2.is_closure_point() && !closed)) {
+	  assert(compare(g1, g2) != 0);
+	  Generator ray_from_g2_to_g1 = g1;
+	  ray_from_g2_to_g1.linear_combine(g2, 0);
+	  candidate_rays.insert(ray_from_g2_to_g1);
+	}
+      }
+    }
+  }
+
+  // Be non-intrusive.
+  Polyhedron result = x;
+  result.add_recycled_generators_and_minimize(candidate_rays);
+  result.intersection_assign_and_minimize(H79);
+
+  // Check for stabilization with respect to `y_cert' and improvement
+  // over `H79'.
+  if (y_cert.is_stabilizing(result) && !result.contains(H79)) {
+    // The technique was successful.
+    std::swap(x, result);
+    assert(x.OK(true));
+    return true;
+  }
+  else
+    // The technique was unsuccessful.
+    return false;
+}
+
+bool
+PPL::Polyhedron::BHRZ03_evolving_rays(const Polyhedron& y,
+				      const BHRZ03_Certificate& y_cert,
+				      const Polyhedron& H79) {
+  Polyhedron& x = *this;
+  // It is assumed that `y <= x <= H79'.
+  assert(x.topology() == y.topology()
+	 && x.topology() == H79.topology());
+  assert(x.space_dim == y.space_dim
+	 && x.space_dim == H79.space_dim);
+  assert(!x.marked_empty() && !x.has_something_pending()
+	 && x.constraints_are_minimized() && x.generators_are_minimized());
+  assert(!y.marked_empty() && !y.has_something_pending()
+	 && y.constraints_are_minimized() && y.generators_are_minimized());
+  assert(!H79.marked_empty() && !H79.has_something_pending()
+	 && H79.constraints_are_minimized() && H79.generators_are_minimized());
+
+  const dimension_type x_gen_sys_num_rows = x.gen_sys.num_rows();
+  const dimension_type y_gen_sys_num_rows = y.gen_sys.num_rows();
+
+  // Candidate rays are kept in a temporary generator system.
+  Generator_System candidate_rays;
+  TEMP_INTEGER(tmp);
+  for (dimension_type i = x_gen_sys_num_rows; i-- > 0; ) {
+    const Generator& x_g = x.gen_sys[i];
+    // We choose a ray of `x' that does not belong to `y'.
+    if (x_g.is_ray() && y.relation_with(x_g) == Poly_Gen_Relation::nothing()) {
+      for (dimension_type j = y_gen_sys_num_rows; j-- > 0; ) {
+	const Generator& y_g = y.gen_sys[j];
+	if (y_g.is_ray()) {
+	  Generator new_ray(x_g);
+	  // Modify `new_ray' according to the evolution of `x_g' with
+	  // respect to `y_g'.
+	  std::deque<bool> considered(x.space_dim + 1);
+	  for (dimension_type k = 1; k < x.space_dim; ++k)
+	    if (!considered[k])
+	      for (dimension_type h = k + 1; h <= x.space_dim; ++h)
+		if (!considered[h]) {
+		  tmp = x_g[k] * y_g[h];
+		  // The following line optimizes the computation of
+		  // tmp -= x_g[h] * y_g[k];
+		  sub_mul_assign(tmp, x_g[h], y_g[k]);
+		  const int clockwise
+		    = sgn(tmp);
+		  const int first_or_third_quadrant
+		    = sgn(x_g[k]) * sgn(x_g[h]);
+		  switch (clockwise * first_or_third_quadrant) {
+		  case -1:
+		    new_ray[k] = 0;
+		    considered[k] = true;
+		    break;
+		  case 1:
+		    new_ray[h] = 0;
+		    considered[h] = true;
+		    break;
+		  default:
+		    break;
+		  }
+		}
+	  new_ray.normalize();
+	  candidate_rays.insert(new_ray);
+	}
+      }
+    }
+  }
+
+  // If there are no candidate rays, we cannot obtain stabilization.
+  if (candidate_rays.num_rows() == 0)
+    return false;
+
+  // Be non-intrusive.
+  Polyhedron result = x;
+  // Add to `result' the rays in `candidate_rays'
+  result.add_recycled_generators_and_minimize(candidate_rays);
+  // Intersect with `H79'.
+  result.intersection_assign_and_minimize(H79);
+
+  // Check for stabilization with respect to `y' and improvement over `H79'.
+  if (y_cert.is_stabilizing(result) && !result.contains(H79)) {
+    // The technique was successful.
+    std::swap(x, result);
+    assert(x.OK(true));
+    return true;
+  }
+  else
+    // The technique was unsuccessful.
+    return false;
+}
+
+void
+PPL::Polyhedron::BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("BHRZ03_widening_assign(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("BHRZ03_widening_assign(y)", "y", y);
+
+#ifndef NDEBUG
+  {
+    // We assume that y is contained in or equal to x.
+    const Polyhedron x_copy = x;
+    const Polyhedron y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // If any argument is zero-dimensional or empty,
+  // the BHRZ03-widening behaves as the identity function.
+  if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
+    return;
+
+  // `x.con_sys' and `x.gen_sys' should be in minimal form.
+  x.minimize();
+
+  // `y.con_sys' and `y.gen_sys' should be in minimal form.
+  if (y.is_necessarily_closed()) {
+    if (!y.minimize())
+      // `y' is empty: the result is `x'.
+      return;
+  }
+  else {
+    // Dealing with a NNC polyhedron.
+    // To obtain a correct reasoning when comparing
+    // the constraints of `x' with the generators of `y',
+    // we enforce the inclusion relation holding between
+    // the two NNC polyhedra `x' and `y' (i.e., `y <= x')
+    // to also hold for the corresponding eps-representations:
+    // this is obtained by intersecting the two eps-representations.
+    Polyhedron& yy = const_cast<Polyhedron&>(y);
+    if (!yy.intersection_assign_and_minimize(x))
+      // `y' is empty: the result is `x'.
+      return;
+  }
+
+  // Compute certificate info for polyhedron `y'.
+  BHRZ03_Certificate y_cert(y);
+
+  // If the iteration is stabilizing, the resulting polyhedron is `x'.
+  // At this point, also check if the two polyhedra are the same
+  // (exploiting the knowledge that `y <= x').
+  if (y_cert.is_stabilizing(x) || y.contains(x)) {
+    assert(OK());
+    return;
+  }
+
+  // Here the iteration is not immediately stabilizing.
+  // If we are using the widening-with-tokens technique and
+  // there are tokens available, use one of them and return `x'.
+  if (tp != 0 && *tp > 0) {
+    --(*tp);
+    assert(OK());
+    return;
+  }
+
+  // Copy into `H79_cs' the constraints that are common to `x' and `y',
+  // according to the definition of the H79 widening.
+  // The other ones are copied into `x_minus_H79_cs'.
+  const Topology tpl = x.topology();
+  Constraint_System H79_cs(tpl);
+  Constraint_System x_minus_H79_cs(tpl);
+  x.select_H79_constraints(y, H79_cs, x_minus_H79_cs);
+
+  // We cannot have selected all of the rows, since otherwise
+  // the iteration should have been immediately stabilizing.
+  assert(x_minus_H79_cs.num_rows() > 0);
+  // Be careful to obtain the right space dimension
+  // (because `H79_cs' may be empty).
+  Polyhedron H79(tpl, x.space_dim, UNIVERSE);
+  H79.add_recycled_constraints_and_minimize(H79_cs);
+
+  // NOTE: none of the following widening heuristics is intrusive:
+  // they will modify `x' only when returning successfully.
+  if (x.BHRZ03_combining_constraints(y, y_cert, H79, x_minus_H79_cs))
+    return;
+
+  assert(H79.OK() && x.OK() && y.OK());
+
+  if (x.BHRZ03_evolving_points(y, y_cert, H79))
+    return;
+
+  assert(H79.OK() && x.OK() && y.OK());
+
+  if (x.BHRZ03_evolving_rays(y, y_cert, H79))
+    return;
+
+  assert(H79.OK() && x.OK() && y.OK());
+
+  // No previous technique was successful: fall back to the H79 widening.
+  std::swap(x, H79);
+  assert(x.OK(true));
+
+#ifndef NDEBUG
+  // The H79 widening is always stabilizing.
+  x.minimize();
+  assert(y_cert.is_stabilizing(x));
+#endif
+}
+
+void
+PPL::Polyhedron
+::limited_BHRZ03_extrapolation_assign(const Polyhedron& y,
+				      const Constraint_System& cs,
+				      unsigned* tp) {
+  Polyhedron& x = *this;
+  const dimension_type cs_num_rows = cs.num_rows();
+  // If `cs' is empty, we fall back to ordinary, non-limited widening.
+  if (cs_num_rows == 0) {
+    x.BHRZ03_widening_assign(y, tp);
+    return;
+  }
+
+  // Topology compatibility check.
+  if (x.is_necessarily_closed()) {
+    if (!y.is_necessarily_closed())
+      throw_topology_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+				  "y", y);
+    if (cs.has_strict_inequalities())
+      throw_topology_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+				  "cs", cs);
+  }
+  else if (y.is_necessarily_closed())
+    throw_topology_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+				"y", y);
+
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+				 "y", y);
+  // `cs' must be dimension-compatible with the two polyhedra.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (x.space_dim < cs_space_dim)
+    throw_dimension_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+				 "cs", cs);
+
+#ifndef NDEBUG
+  {
+    // We assume that y is contained in or equal to x.
+    const Polyhedron x_copy = x;
+    const Polyhedron y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty())
+    return;
+
+  // The limited BHRZ03-widening between two polyhedra in a
+  // zero-dimensional space is a polyhedron in a zero-dimensional
+  // space, too.
+  if (x.space_dim == 0)
+    return;
+
+  if (!y.minimize())
+    // We have just discovered that `y' is empty.
+    return;
+
+  // Update the generators of `x': these are used to select,
+  // from the constraints in `cs', those that must be added
+  // to the resulting polyhedron.
+  if ((x.has_pending_constraints() && !x.process_pending_constraints())
+      || (!x.generators_are_up_to_date() && !x.update_generators()))
+    // We have just discovered that `x' is empty.
+    return;
+
+  Constraint_System new_cs;
+  // The constraints to be added must be satisfied by all the
+  // generators of `x'. We can disregard `y' because `y <= x'.
+  const Generator_System& x_gen_sys = x.gen_sys;
+  // Iterate upwards here so as to keep the relative ordering of constraints.
+  // Not really an issue: just aesthetics.
+  for (dimension_type i = 0; i < cs_num_rows; ++i) {
+    const Constraint& c = cs[i];
+    if (x_gen_sys.satisfied_by_all_generators(c))
+      new_cs.insert(c);
+  }
+  x.BHRZ03_widening_assign(y, tp);
+  x.add_constraints(new_cs);
+  assert(OK());
+}
+
+void
+PPL::Polyhedron
+::bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
+				      const Constraint_System& cs,
+				      unsigned* tp) {
+  const dimension_type space_dim = space_dimension();
+  Bounding_Box x_box(space_dim);
+  Bounding_Box y_box(space_dim);
+  shrink_bounding_box(x_box, ANY_COMPLEXITY);
+  y.shrink_bounding_box(y_box, ANY_COMPLEXITY);
+  x_box.CC76_widening_assign(y_box);
+  limited_BHRZ03_extrapolation_assign(y, cs, tp);
+  // TODO: see if some copies can be avoided.
+  // add_recycled_constraints(x_box.constraints());
+  add_constraints(x_box.constraints());
+}
diff --git a/src/Powerset.defs.hh b/src/Powerset.defs.hh
new file mode 100644
index 0000000..6600a99
--- /dev/null
+++ b/src/Powerset.defs.hh
@@ -0,0 +1,620 @@
+/* Powerset class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Powerset_defs_hh
+#define PPL_Powerset_defs_hh
+
+#include "Powerset.types.hh"
+#include <iosfwd>
+#include <iterator>
+#include <list>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator!=(const Powerset<D>& x, const Powerset<D>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The powerset construction on a base-level domain.
+/*! \ingroup PPL_CXX_interface
+  This class offers a generic implementation of a
+  <EM>powerset</EM> domain as defined in Section \ref powerset.
+
+  Besides invoking the available methods on the disjuncts of a Powerset,
+  this class also provides bidirectional iterators that allow for a
+  direct inspection of these disjuncts. For a consistent handling of
+  Omega-reduction, all the iterators are <EM>read-only</EM>, meaning
+  that the disjuncts cannot be overwritten. Rather, by using the class
+  <CODE>iterator</CODE>, it is possible to drop one or more disjuncts
+  (possibly so as to later add back modified versions).  As an example
+  of iterator usage, the following templatic function drops from
+  powerset \p ps all the disjuncts that would have become redundant by
+  the addition of an external element \p d.
+
+  \code
+template <typename D>
+void
+drop_subsumed(Powerset<D>& ps, const D& d) {
+  for (typename Powerset<D>::iterator i = ps.begin(),
+         ps_end = ps.end(), i != ps_end; )
+    if (i->definitely_entails(d))
+      i = ps.drop_disjunct(i);
+    else
+      ++i;
+}
+  \endcode
+
+  The template class D must provide the following methods.
+  \code
+    memory_size_type total_memory_in_bytes() const
+  \endcode
+  Returns a lower bound on the total size in bytes of the memory
+  occupied by the instance of D.
+  \code
+    bool is_top() const
+  \endcode
+  Returns <CODE>true</CODE> if and only if the instance of D is the top
+  element of the domain.
+  \code
+    bool is_bottom() const
+  \endcode
+  Returns <CODE>true</CODE> if and only if the instance of D is the
+  bottom element of the domain.
+  \code
+    bool definitely_entails(const D& y) const
+  \endcode
+  Returns <CODE>true</CODE> if the instance of D definitely entails
+  <CODE>y</CODE>.  Returns <CODE>false</CODE> if the instance may not
+  entail <CODE>y</CODE> (i.e., if the instance does not entail
+  <CODE>y</CODE> or if entailment could not be decided).
+  \code
+    void upper_bound_assign(const D& y)
+  \endcode
+  Assigns to the instance of D an upper bound of the instance and
+  <CODE>y</CODE>.
+  \code
+    void meet_assign(const D& y)
+  \endcode
+  Assigns to the instance of D the meet of the instance and
+  <CODE>y</CODE>.
+  \code
+    bool OK() const
+  \endcode
+  Returns <CODE>true</CODE> if the instance of D is in a consistent
+  state, else returns <CODE>false</CODE>.
+
+  The following operators on the template class D must be defined.
+  \code
+    operator<<(std::ostream& s, const D& x)
+  \endcode
+  Writes a textual representation of the instance of D on
+  <CODE>s</CODE>.
+  \code
+    operator==(const D& x, const D& y)
+  \endcode
+  Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+  <CODE>y</CODE> are equivalent D's.
+  \code
+    operator!=(const D& x, const D& y)
+  \endcode
+  Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+  <CODE>y</CODE> are different D's.
+*/
+template <typename D>
+class Parma_Polyhedra_Library::Powerset {
+public:
+  //! \name Constructors and Destructor
+  //@{
+
+  /*! \brief
+    Default constructor: builds the bottom of the powerset constraint
+    system (i.e., the empty powerset).
+  */
+  Powerset();
+
+  //! Copy constructor.
+  Powerset(const Powerset& y);
+
+  /*! \brief
+    If \p d is not bottom, builds a powerset containing only \p d.
+    Builds the empty powerset otherwise.
+  */
+  explicit Powerset(const D& d);
+
+  //! Destructor.
+  ~Powerset();
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Powerset Element
+  //@{
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this definitely entails \p y.
+    Returns <CODE>false</CODE> if \p *this may not entail \p y
+    (i.e., if \p *this does not entail \p y or if entailment could
+    not be decided).
+  */
+  bool definitely_entails(const Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the top
+    element of the powerset constraint system (i.e., it represents
+    the universe).
+  */
+  bool is_top() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the bottom
+    element of the powerset constraint system (i.e., it represents
+    the empty set).
+  */
+  bool is_bottom() const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  // FIXME: document and perhaps use an enum instead of a bool.
+  bool OK(bool disallow_bottom = false) const;
+
+  //@} // Member Functions that Do Not Modify the Powerset Element
+
+protected:
+  //! A powerset is implemented as a sequence of elements.
+  /*!
+    The particular sequence employed must support efficient deletion
+    in any position and efficient back insertion.
+  */
+  typedef std::list<D> Sequence;
+
+  //! Alias for the low-level iterator on the disjuncts.
+  typedef typename Sequence::iterator Sequence_iterator;
+
+  //! Alias for the low-level %const_iterator on the disjuncts.
+  typedef typename Sequence::const_iterator Sequence_const_iterator;
+
+  //! The sequence container holding powerset's elements.
+  Sequence sequence;
+
+  //! If <CODE>true</CODE>, \p *this is Omega-reduced.
+  mutable bool reduced;
+
+public:
+  // Sequence manipulation types, accessors and modifiers
+  typedef typename Sequence::size_type size_type;
+  typedef typename Sequence::value_type value_type;
+
+  class omega_iterator;
+  class omega_const_iterator;
+
+  /*! \brief
+    Alias for a <EM>read-only</EM> bidirectional %iterator on the
+    disjuncts of a Powerset element.
+
+    By using this iterator type, the disjuncts cannot be overwritten,
+    but they can be removed using methods
+    <CODE>drop_disjunct(iterator position)</CODE> and
+    <CODE>drop_disjuncts(iterator first, iterator last)</CODE>,
+    while still ensuring a correct handling of Omega-reduction.
+  */
+  typedef omega_iterator iterator;
+  //! A bidirectional %const_iterator on the disjuncts of a Powerset element.
+  typedef omega_const_iterator const_iterator;
+
+  //! The reverse iterator type built from Powerset::iterator.
+  typedef std::reverse_iterator<iterator> reverse_iterator;
+  //! The reverse iterator type built from Powerset::const_iterator.
+  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+
+  //! \name Member Functions for the Direct Manipulation of Disjuncts
+  //@{
+
+  /*! \brief
+    Drops from the sequence of disjuncts in \p *this all the
+    non-maximal elements so that \p *this is non-redundant.
+
+    This method is declared <CODE>const</CODE> because, even though
+    Omega-reduction may change the syntactic representation of \p *this,
+    its semantics will be unchanged.
+  */
+  void omega_reduce() const;
+
+  //! Returns the number of disjuncts.
+  size_type size() const;
+
+  //! Returns <CODE>true</CODE> if and only if there are no disjuncts.
+  bool empty() const;
+
+  /*! \brief
+    Returns an iterator pointing to the first disjunct, if \p *this
+    is not empty; otherwise, returns the past-the-end iterator.
+  */
+  iterator begin();
+
+  //! Returns the past-the-end iterator.
+  iterator end();
+
+  /*! \brief
+    Returns a const_iterator pointing to the first disjunct, if \p *this
+    is not empty; otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  /*! \brief
+    Returns a reverse_iterator pointing to the last disjunct, if \p *this
+    is not empty; otherwise, returns the before-the-start reverse_iterator.
+  */
+  reverse_iterator rbegin();
+  //! Returns the before-the-start reverse_iterator.
+  reverse_iterator rend();
+  /*! \brief
+    Returns a const_reverse_iterator pointing to the last disjunct,
+    if \p *this is not empty; otherwise, returns the before-the-start
+    const_reverse_iterator.
+  */
+  const_reverse_iterator rbegin() const;
+  //! Returns the before-the-start const_reverse_iterator.
+  const_reverse_iterator rend() const;
+
+  //! Adds to \p *this the disjunct \p d.
+  void add_disjunct(const D& d);
+
+  /*! \brief
+    Drops the disjunct in \p *this pointed to by \p position, returning
+    an iterator to the disjunct following \p position.
+  */
+  iterator drop_disjunct(iterator position);
+
+  //! Drops all the disjuncts from \p first to \p last (excluded).
+  void drop_disjuncts(iterator first, iterator last);
+
+  //! Drops all the disjuncts, making \p *this an empty powerset.
+  void clear();
+
+  //@} // Member Functions for the Direct Manipulation of Disjuncts
+
+  //! \name Member Functions that May Modify the Powerset Element
+  //@{
+
+  //! The assignment operator.
+  Powerset& operator=(const Powerset& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Powerset& y);
+
+  //! Assigns to \p *this the least upper bound of \p *this and \p y.
+  void least_upper_bound_assign(const Powerset& y);
+
+  //! Assigns to \p *this an upper bound of \p *this and \p y.
+  /*!
+    The result will be the least upper bound of \p *this and \p y.
+  */
+  void upper_bound_assign(const Powerset& y);
+
+  //! Assigns to \p *this the meet of \p *this and \p y.
+  void meet_assign(const Powerset& y);
+
+  /*! \brief
+    If \p *this is not empty (i.e., it is not the bottom element),
+    it is reduced to a singleton obtained by computing an upper-bound
+    of all the disjuncts.
+  */
+  void collapse();
+
+  //@} // Member Functions that May Modify the Powerset element
+
+protected:
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this does not contain
+    non-maximal elements.
+  */
+  bool is_omega_reduced() const;
+
+  /*! \brief Upon return, \p *this will contain at most \p
+    max_disjuncts elements; the set of disjuncts in positions greater
+    than or equal to \p max_disjuncts, will be replaced at that
+    position by their upper-bound.
+  */
+  void collapse(unsigned max_disjuncts);
+
+  /*! \brief
+    Adds to \p *this the disjunct \p d,
+    assuming \p d is not the bottom element and ensuring
+    partial Omega-reduction.
+
+    If \p d is not the bottom element and is not Omega-redundant with
+    respect to elements in positions between \p first and \p last, all
+    elements in these positions that would be made Omega-redundant by the
+    addition of \p d are dropped and \p d is added to the reduced
+    sequence.
+  */
+  iterator add_non_bottom_disjunct(const D& d,
+				   iterator first,
+				   iterator last);
+
+  /*! \brief
+    Adds to \p *this the disjunct \p d,
+    assuming \p d is not the bottom element.
+  */
+  void add_non_bottom_disjunct(const D& d);
+
+  /*! \brief
+    Assigns to \p *this the result of applying \p op_assign pairwise
+    to the elements in \p *this and \p y.
+
+    The elements of the powerset result are obtained by applying
+    \p op_assign to each pair of elements whose components are drawn
+    from \p *this and \p y, respectively.
+  */
+  template <typename Binary_Operator_Assign>
+  void pairwise_apply_assign(const Powerset& y,
+			     Binary_Operator_Assign op_assign);
+
+private:
+  /*! \brief
+    Does the hard work of checking whether \p *this contains non-maximal
+    elements and returns <CODE>true</CODE> if and only if it does not.
+  */
+  bool check_omega_reduced() const;
+
+  /*! \brief
+    Replaces the disjunct \p *sink by an upper bound of itself and
+    all the disjuncts following it.
+  */
+  void collapse(Sequence_iterator sink);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A %const_iterator on the disjuncts of a Powerset element.
+/*! \ingroup PPL_CXX_interface
+  This class implements a read-only bidirectional iterator
+  on the sequence of disjuncts.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+class Parma_Polyhedra_Library::Powerset<D>::omega_const_iterator {
+protected:
+  //! The type of the underlying %const_iterator.
+  typedef typename Powerset::Sequence::const_iterator Base;
+
+  //! A shortcut for naming traits.
+  typedef typename std::iterator_traits<Base> Traits;
+
+  //! A %const_iterator on the sequence of elements.
+  Base base;
+
+  //! Constructs from the lower-level const_iterator.
+  omega_const_iterator(const Base& b);
+
+  friend class Powerset;
+
+public:
+  // Same traits of the underlying const_iterator.
+  typedef typename Traits::iterator_category iterator_category;
+  typedef typename Traits::value_type value_type;
+  typedef typename Traits::difference_type difference_type;
+  typedef typename Traits::pointer pointer;
+  typedef typename Traits::reference reference;
+
+  //! Default constructor.
+  omega_const_iterator();
+
+  //! Copy constructor.
+  omega_const_iterator(const omega_const_iterator& y);
+
+  //! Constructs from the corresponding non-const iterator.
+  omega_const_iterator(const omega_iterator& y);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect member selector.
+  pointer operator->() const;
+
+  //! Prefix increment operator.
+  omega_const_iterator& operator++();
+
+  //! Postfix increment operator.
+  omega_const_iterator operator++(int);
+
+  //! Prefix decrement operator.
+  omega_const_iterator& operator--();
+
+  //! Postfix decrement operator.
+  omega_const_iterator operator--(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const omega_const_iterator& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const omega_const_iterator& y) const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator on the disjuncts of a Powerset element.
+/*! \ingroup PPL_CXX_interface
+  This class implements a <EM>read-only</EM> bidirectional iterator
+  on the sequence of disjuncts. That is, by using an instance of
+  this iterator class it is not possible to overwrite the disjuncts
+  contained in a Powerset element. However, using such an instance
+  allows for the removal of disjuncts by using methods
+  <CODE>Powerset::drop_disjunct(iterator position)</CODE> and
+  <CODE>Powerset::drop_disjuncts(iterator first, iterator last)</CODE>.
+  Such a policy is needed to allow for a reliable use of the Boolean
+  flag <CODE>Powerset::reduced</CODE>.
+
+  \note
+  For any developers' need, (low-level) iterators on the sequence of
+  disjuncts are still available by accessing the protected member
+  <CODE>Powerset::sequence</CODE>.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+class Parma_Polyhedra_Library::Powerset<D>::omega_iterator {
+protected:
+  //! The type of the underlying mutable iterator.
+  typedef typename Powerset::Sequence::iterator Base;
+
+  //! A shortcut for naming the const_iterator traits.
+  typedef typename
+  std::iterator_traits<typename Powerset::Sequence::const_iterator> Traits;
+
+  //! A (mutable) iterator on the sequence of elements.
+  Base base;
+
+  //! Constructs from the lower-level iterator.
+  omega_iterator(const Base& b);
+
+  friend class Powerset;
+  friend Powerset<D>::omega_const_iterator
+  ::omega_const_iterator(const omega_iterator& y);
+
+public:
+  // Same traits of the const_iterator, therefore
+  // forbidding the direct modification of sequence elements.
+  typedef typename Traits::iterator_category iterator_category;
+  typedef typename Traits::value_type value_type;
+  typedef typename Traits::difference_type difference_type;
+  typedef typename Traits::pointer pointer;
+  typedef typename Traits::reference reference;
+
+  //! Default constructor.
+  omega_iterator();
+
+  //! Copy constructor.
+  omega_iterator(const omega_iterator& y);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect access operator.
+  pointer operator->() const;
+
+  //! Prefix increment operator.
+  omega_iterator& operator++();
+
+  //! Postfix increment operator.
+  omega_iterator operator++(int);
+
+  //! Prefix decrement operator.
+  omega_iterator& operator--();
+
+  //! Postfix decrement operator.
+  omega_iterator operator--(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const omega_iterator& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const omega_iterator& y) const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Mixed comparison operator: returns <CODE>true</CODE> if and only
+  if (the const version of) \p x is identical to \p y.
+
+  \relates Powerset::omega_const_iterator
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+bool
+operator==(const typename Powerset<D>::omega_iterator& x,
+	   const typename Powerset<D>::omega_const_iterator& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Mixed comparison operator: returns <CODE>true</CODE> if and only
+  if (the const version of) \p x is different from \p y.
+
+  \relates Powerset::omega_const_iterator
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+bool
+operator!=(const typename Powerset<D>::omega_iterator& x,
+	   const typename Powerset<D>::omega_const_iterator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+void swap(Parma_Polyhedra_Library::Powerset<D>& x,
+	  Parma_Polyhedra_Library::Powerset<D>& y);
+
+} // namespace std
+
+#include "Powerset.inlines.hh"
+#include "Powerset.templates.hh"
+
+#endif // !defined(PPL_Powerset_defs_hh)
diff --git a/src/Powerset.inlines.hh b/src/Powerset.inlines.hh
new file mode 100644
index 0000000..8085fbe
--- /dev/null
+++ b/src/Powerset.inlines.hh
@@ -0,0 +1,399 @@
+/* Powerset class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Powerset_inlines_hh
+#define PPL_Powerset_inlines_hh 1
+
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+inline
+Powerset<D>::omega_iterator::omega_iterator()
+  : base() {
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_iterator::omega_iterator(const omega_iterator& y)
+  : base(y.base) {
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_iterator::omega_iterator(const Base& b)
+  : base(b) {
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator::reference
+Powerset<D>::omega_iterator::operator*() const {
+  return *base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator::pointer
+Powerset<D>::omega_iterator::operator->() const {
+  return &*base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator&
+Powerset<D>::omega_iterator::operator++() {
+  ++base;
+  return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator
+Powerset<D>::omega_iterator::operator++(int) {
+  omega_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator&
+Powerset<D>::omega_iterator::operator--() {
+  --base;
+  return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator
+Powerset<D>::omega_iterator::operator--(int) {
+  omega_iterator tmp = *this;
+  operator--();
+  return tmp;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::omega_iterator::operator==(const omega_iterator& y) const {
+  return base == y.base;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::omega_iterator::operator!=(const omega_iterator& y) const {
+  return !operator==(y);
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_const_iterator::omega_const_iterator()
+  : base() {
+}
+
+template <typename D>
+inline
+Powerset<D>
+::omega_const_iterator::omega_const_iterator(const omega_const_iterator& y)
+  : base(y.base) {
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_const_iterator::omega_const_iterator(const Base& b)
+  : base(b) {
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator::reference
+Powerset<D>::omega_const_iterator::operator*() const {
+  return *base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator::pointer
+Powerset<D>::omega_const_iterator::operator->() const {
+  return &*base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator&
+Powerset<D>::omega_const_iterator::operator++() {
+  ++base;
+  return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator
+Powerset<D>::omega_const_iterator::operator++(int) {
+  omega_const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator&
+Powerset<D>::omega_const_iterator::operator--() {
+  --base;
+  return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator
+Powerset<D>::omega_const_iterator::operator--(int) {
+  omega_const_iterator tmp = *this;
+  operator--();
+  return tmp;
+}
+
+template <typename D>
+inline bool
+Powerset<D>
+::omega_const_iterator::operator==(const omega_const_iterator& y) const {
+  return base == y.base;
+}
+
+template <typename D>
+inline bool
+Powerset<D>
+::omega_const_iterator::operator!=(const omega_const_iterator& y) const {
+  return !operator==(y);
+}
+
+template <typename D>
+inline
+Powerset<D>
+::omega_const_iterator::omega_const_iterator(const omega_iterator& y)
+  : base(y.base) {
+}
+
+/*! \relates Powerset::omega_const_iterator */
+template <typename D>
+inline bool
+operator==(const typename Powerset<D>::omega_iterator& x,
+	   const typename Powerset<D>::omega_const_iterator& y) {
+  return Powerset<D>::omega_const_iterator(x).operator==(y);
+}
+
+/*! \relates Powerset::omega_const_iterator */
+template <typename D>
+inline bool
+operator!=(const typename Powerset<D>::omega_iterator& x,
+	   const typename Powerset<D>::omega_const_iterator& y) {
+  return !(x == y);
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::begin() {
+  return sequence.begin();
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::end() {
+  return sequence.end();
+}
+
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::begin() const {
+  return sequence.begin();
+}
+
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::end() const {
+  return sequence.end();
+}
+
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rbegin() {
+  return reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rend() {
+  return reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rbegin() const {
+  return const_reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rend() const {
+  return const_reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::size_type
+Powerset<D>::size() const {
+  return sequence.size();
+}
+
+template <typename D>
+inline bool
+Powerset<D>::empty() const {
+  return sequence.empty();
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::drop_disjunct(iterator position) {
+  return sequence.erase(position.base);
+}
+
+template <typename D>
+inline void
+Powerset<D>::drop_disjuncts(iterator first, iterator last) {
+  sequence.erase(first.base, last.base);
+}
+
+template <typename D>
+inline void
+Powerset<D>::clear() {
+  sequence.clear();
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset(const Powerset& y)
+  : sequence(y.sequence), reduced(y.reduced) {
+}
+
+template <typename D>
+inline Powerset<D>&
+Powerset<D>::operator=(const Powerset& y) {
+  sequence = y.sequence;
+  reduced = y.reduced;
+  return *this;
+}
+
+template <typename D>
+inline void
+Powerset<D>::swap(Powerset& y) {
+  std::swap(sequence, y.sequence);
+  std::swap(reduced, y.reduced);
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset()
+  : sequence(), reduced(true) {
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset(const D& d)
+  : sequence(), reduced(true) {
+  if (!d.is_bottom())
+    sequence.push_back(d);
+  assert(OK());
+}
+
+template <typename D>
+inline
+Powerset<D>::~Powerset() {
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_non_bottom_disjunct(const D& d) {
+  assert(!d.is_bottom());
+  add_non_bottom_disjunct(d, begin(), end());
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_disjunct(const D& d) {
+  if (!d.is_bottom())
+    add_non_bottom_disjunct(d);
+}
+
+/*! \relates Powerset */
+template <typename D>
+inline
+bool operator!=(const Powerset<D>& x, const Powerset<D>& y) {
+  return !(x == y);
+}
+
+template <typename D>
+inline bool
+Powerset<D>::is_top() const {
+  // Must perform omega-reduction for correctness.
+  omega_reduce();
+  const_iterator xi = begin();
+  const_iterator x_end = end();
+  return xi != x_end && xi->is_top() && ++xi == x_end;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::is_bottom() const {
+  // Must perform omega-reduction for correctness.
+  omega_reduce();
+  return empty();
+}
+
+template <typename D>
+inline void
+Powerset<D>::collapse() {
+  if (!empty())
+    collapse(sequence.begin());
+}
+
+template <typename D>
+inline void
+Powerset<D>::meet_assign(const Powerset& y) {
+  pairwise_apply_assign(y, std::mem_fun_ref(&D::meet_assign));
+}
+
+template <typename D>
+inline void
+Powerset<D>::upper_bound_assign(const Powerset& y) {
+  least_upper_bound_assign(y);
+}
+
+template <typename D>
+inline memory_size_type
+Powerset<D>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+inline void
+swap(Parma_Polyhedra_Library::Powerset<D>& x,
+     Parma_Polyhedra_Library::Powerset<D>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Powerset_inlines_hh)
diff --git a/src/Powerset.templates.hh b/src/Powerset.templates.hh
new file mode 100644
index 0000000..3fce827
--- /dev/null
+++ b/src/Powerset.templates.hh
@@ -0,0 +1,302 @@
+/* Powerset class implementation: non-inline template functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Powerset_templates_hh
+#define PPL_Powerset_templates_hh 1
+
+#include <algorithm>
+#include <cassert>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+void
+Powerset<D>::collapse(const Sequence_iterator sink) {
+  assert(sink != sequence.end());
+  D& d = *sink;
+  iterator x_sink = sink;
+  iterator next_x_sink = x_sink;
+  ++next_x_sink;
+  iterator x_end = end();
+  for (const_iterator xi = next_x_sink; xi != x_end; ++xi)
+    d.upper_bound_assign(*xi);
+  // Drop the surplus disjuncts.
+  drop_disjuncts(next_x_sink, x_end);
+
+  // Ensure omega-reduction.
+  for (iterator xi = begin(); xi != x_sink; )
+    if (xi->definitely_entails(d))
+      xi = drop_disjunct(xi);
+    else
+      ++xi;
+
+  assert(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::omega_reduce() const {
+  if (reduced)
+    return;
+
+  Powerset& x = const_cast<Powerset&>(*this);
+  // First remove all bottom elements.
+  for (iterator xi = x.begin(), x_end = x.end(); xi != x_end; )
+    if (xi->is_bottom())
+      xi = x.drop_disjunct(xi);
+    else
+      ++xi;
+  // Then remove non-maximal elements.
+  for (iterator xi = x.begin(); xi != x.end(); ) {
+    const D& xv = *xi;
+    bool dropping_xi = false;
+    for (iterator yi = x.begin(); yi != x.end(); )
+      if (xi == yi)
+	++yi;
+      else {
+	const D& yv = *yi;
+	if (yv.definitely_entails(xv))
+	  yi = x.drop_disjunct(yi);
+	else if (xv.definitely_entails(yv)) {
+	  dropping_xi = true;
+	  break;
+	}
+	else
+	  ++yi;
+      }
+    if (dropping_xi)
+      xi = x.drop_disjunct(xi);
+    else
+      ++xi;
+    if (abandon_expensive_computations && xi != x.end()) {
+      // Hurry up!
+      x.collapse(xi.base);
+      break;
+    }
+  }
+  reduced = true;
+  assert(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::collapse(const unsigned max_disjuncts) {
+  assert(max_disjuncts > 0);
+  // Omega-reduce before counting the number of disjuncts.
+  omega_reduce();
+  size_type n = size();
+  if (n > max_disjuncts) {
+    // Let `i' point to the last disjunct that will survive.
+    iterator i = begin();
+    std::advance(i, max_disjuncts-1);
+    // This disjunct will be assigned an upper-bound of itself and of
+    // all the disjuncts that follow.
+    collapse(i.base);
+  }
+  assert(OK());
+  assert(is_omega_reduced());
+}
+
+template <typename D>
+bool
+Powerset<D>::check_omega_reduced() const {
+  for (const_iterator x_begin = begin(), x_end = end(),
+	 xi = x_begin; xi != x_end; ++xi) {
+    const D& xv = *xi;
+    if (xv.is_bottom())
+      return false;
+    for (const_iterator yi = x_begin; yi != x_end; ++yi) {
+      if (xi == yi)
+	continue;
+      const D& yv = *yi;
+      if (xv.definitely_entails(yv) || yv.definitely_entails(xv))
+	return false;
+    }
+  }
+  return true;
+}
+
+template <typename D>
+bool
+Powerset<D>::is_omega_reduced() const {
+  if (!reduced && check_omega_reduced())
+    reduced = true;
+  return reduced;
+}
+
+template <typename D>
+typename Powerset<D>::iterator
+Powerset<D>::add_non_bottom_disjunct(const D& d,
+				      iterator first,
+				      iterator last) {
+  for (iterator xi = first; xi != last; ) {
+    const D& xv = *xi;
+    if (d.definitely_entails(xv))
+      return first;
+    else if (xv.definitely_entails(d)) {
+      if (xi == first)
+	++first;
+      xi = drop_disjunct(xi);
+    }
+    else
+      ++xi;
+  }
+  sequence.push_back(d);
+  return first;
+}
+
+template <typename D>
+bool
+Powerset<D>::definitely_entails(const Powerset& y) const {
+  const Powerset<D>& x = *this;
+  bool found = true;
+  for (const_iterator xi = x.begin(),
+	 x_end = x.end(); found && xi != x_end; ++xi) {
+    found = false;
+    for (const_iterator yi = y.begin(),
+	   y_end = y.end(); !found && yi != y_end; ++yi)
+      found = (*xi).definitely_entails(*yi);
+  }
+  return found;
+}
+
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y) {
+  x.omega_reduce();
+  y.omega_reduce();
+  if (x.size() != y.size())
+    return false;
+  // Take a copy of `y' and work with it.
+  Powerset<D> yy = y;
+  for (typename Powerset<D>::const_iterator xi = x.begin(),
+	 x_end = x.end(); xi != x_end; ++xi) {
+    typename Powerset<D>::iterator yyi = yy.begin();
+    typename Powerset<D>::iterator yy_end = yy.end();
+    yyi = std::find(yyi, yy_end, *xi);
+    if (yyi == yy_end)
+      return false;
+    else
+      yy.drop_disjunct(yyi);
+  }
+  return true;
+}
+
+template <typename D>
+template <typename Binary_Operator_Assign>
+void
+Powerset<D>::pairwise_apply_assign(const Powerset& y,
+				    Binary_Operator_Assign op_assign) {
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  omega_reduce();
+  y.omega_reduce();
+  Sequence new_sequence;
+  for (const_iterator xi = begin(), x_end = end(),
+	 y_begin = y.begin(), y_end = y.end(); xi != x_end; ++xi)
+    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+      D zi = *xi;
+      op_assign(zi, *yi);
+      if (!zi.is_bottom())
+	new_sequence.push_back(zi);
+    }
+  // Put the new sequence in place.
+  std::swap(sequence, new_sequence);
+  reduced = false;
+}
+
+template <typename D>
+void
+Powerset<D>::least_upper_bound_assign(const Powerset& y) {
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  omega_reduce();
+  y.omega_reduce();
+  iterator old_begin = begin();
+  iterator old_end = end();
+  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+    old_begin = add_non_bottom_disjunct(*i, old_begin, old_end);
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x) {
+  if (x.is_bottom())
+    s << "false";
+  else if (x.is_top())
+    s << "true";
+  else
+    for (typename Powerset<D>::const_iterator i = x.begin(),
+	   x_end = x.end(); i != x_end; ) {
+      s << "{ " << *i++ << " }";
+      if (i != x_end)
+	s << ", ";
+    }
+  return s;
+}
+
+} // namespace IO_Operators
+
+template <typename D>
+memory_size_type
+Powerset<D>::external_memory_in_bytes() const {
+  memory_size_type bytes = 0;
+  for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+    bytes += xi->total_memory_in_bytes();
+    // We assume there is at least a forward and a backward link, and
+    // that the pointers implementing them are at least the size of
+    // pointers to `D'.
+    bytes += 2*sizeof(D*);
+  }
+  return bytes;
+}
+
+template <typename D>
+bool
+Powerset<D>::OK(const bool disallow_bottom) const {
+  for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+    if (!xi->OK())
+      return false;
+    if (disallow_bottom && xi->is_bottom()) {
+#ifndef NDEBUG
+      std::cerr << "Bottom element in powerset!"
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+  if (reduced && !check_omega_reduced()) {
+#ifndef NDEBUG
+    std::cerr << "Powerset claims to be reduced, but it is not!"
+	      << std::endl;
+#endif
+    return false;
+  }
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Powerset_templates_hh)
diff --git a/src/Powerset.types.hh b/src/Powerset.types.hh
new file mode 100644
index 0000000..4198773
--- /dev/null
+++ b/src/Powerset.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Powerset_types_hh
+#define PPL_Powerset_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+class Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Powerset_types_hh)
diff --git a/src/Ptr_Iterator.defs.hh b/src/Ptr_Iterator.defs.hh
new file mode 100644
index 0000000..6b8f2d4
--- /dev/null
+++ b/src/Ptr_Iterator.defs.hh
@@ -0,0 +1,171 @@
+/* Ptr_Iterator class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Ptr_Iterator_defs_hh
+#define PPL_Ptr_Iterator_defs_hh 1
+
+#include "Ptr_Iterator.types.hh"
+#include <iterator>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template<typename Q, typename R>
+bool operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+typename Ptr_Iterator<Q>::difference_type operator-(const Ptr_Iterator<Q>& x,
+						    const Ptr_Iterator<R>& y);
+
+template<typename P>
+Ptr_Iterator<P> operator+(typename Ptr_Iterator<P>::difference_type m,
+			  const Ptr_Iterator<P>& y);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class to define STL const and non-const iterators from pointer types.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename P>
+class Parma_Polyhedra_Library::Implementation::Ptr_Iterator
+  : public std::iterator<typename std::iterator_traits<P>::iterator_category,
+			 typename std::iterator_traits<P>::value_type,
+			 typename std::iterator_traits<P>::difference_type,
+			 typename std::iterator_traits<P>::pointer,
+			 typename std::iterator_traits<P>::reference> {
+public:
+  typedef typename std::iterator_traits<P>::difference_type difference_type;
+  typedef typename std::iterator_traits<P>::reference reference;
+  typedef typename std::iterator_traits<P>::pointer pointer;
+
+  //! Default constructor: no guarantees.
+  Ptr_Iterator();
+
+  //! Construct an iterator pointing at \p q.
+  explicit Ptr_Iterator(const P& q);
+
+  /*! \brief
+    Copy-constructor allowing the construction of a const_iterator
+    from a non-const iterator.
+  */
+  template<typename Q>
+  Ptr_Iterator(const Ptr_Iterator<Q>& q);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect member selector.
+  pointer operator->() const;
+
+  //! Subscript operator.
+  reference operator[](const difference_type m) const;
+
+  //! Prefix increment operator.
+  Ptr_Iterator& operator++();
+
+  //! Postfix increment operator.
+  Ptr_Iterator operator++(int);
+
+  //! Prefix decrement operator
+  Ptr_Iterator& operator--();
+
+  //! Postfix decrement operator.
+  Ptr_Iterator operator--(int);
+
+  //! Assignment-increment operator.
+  Ptr_Iterator& operator+=(const difference_type m);
+
+  //! Assignment-decrement operator.
+  Ptr_Iterator& operator-=(const difference_type m);
+
+  //! Returns the difference between \p *this and \p y.
+  difference_type operator-(const Ptr_Iterator& y) const;
+
+  //! Returns the sum of \p *this and \p m.
+  Ptr_Iterator operator+(const difference_type m) const;
+
+  //! Returns the difference of \p *this and \p m.
+  Ptr_Iterator operator-(const difference_type m) const;
+
+private:
+  //! The base pointer implementing the iterator.
+  P p;
+
+  //! Returns the hidden pointer.
+  const P& base() const;
+
+  template <typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template <typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend typename Ptr_Iterator<Q>::difference_type
+  Parma_Polyhedra_Library::Implementation::
+  operator-(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  friend Ptr_Iterator<P>
+  Parma_Polyhedra_Library::Implementation::
+  operator+<>(typename Ptr_Iterator<P>::difference_type m,
+	      const Ptr_Iterator<P>& y);
+};
+
+#include "Ptr_Iterator.inlines.hh"
+
+#endif // !defined(PPL_Ptr_Iterator_defs_hh)
diff --git a/src/Ptr_Iterator.inlines.hh b/src/Ptr_Iterator.inlines.hh
new file mode 100644
index 0000000..dc886b8
--- /dev/null
+++ b/src/Ptr_Iterator.inlines.hh
@@ -0,0 +1,188 @@
+/* Ptr_Iterator class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Ptr_Iterator_inlines_hh
+#define PPL_Ptr_Iterator_inlines_hh 1
+
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+inline const P&
+Ptr_Iterator<P>::base() const {
+  return p;
+}
+
+template <typename P>
+inline
+Ptr_Iterator<P>::Ptr_Iterator()
+  : p(P()) {
+}
+
+template <typename P>
+inline
+Ptr_Iterator<P>::Ptr_Iterator(const P& q)
+  : p(q) {
+}
+
+template <typename P>
+template <typename Q>
+inline
+Ptr_Iterator<P>::Ptr_Iterator(const Ptr_Iterator<Q>& y)
+  : p(y.base()) {
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator*() const {
+  return *p;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::pointer
+Ptr_Iterator<P>::operator->() const {
+  return p;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator[](const difference_type m) const {
+  return p[m];
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator++() {
+  ++p;
+  return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator++(int) {
+  return Ptr_Iterator(p++);
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator--() {
+  --p;
+  return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator--(int) {
+  return Ptr_Iterator(p--);
+}
+
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator+=(const difference_type m) {
+  p += m;
+  return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator-=(const difference_type m) {
+  p -= m;
+  return *this;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::difference_type
+Ptr_Iterator<P>::operator-(const Ptr_Iterator& y) const {
+  return p - y.p;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator+(const difference_type m) const {
+  return Ptr_Iterator(p + m);
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator-(const difference_type m) const {
+  return Ptr_Iterator(p - m);
+}
+
+template<typename P, typename Q>
+inline bool
+operator==(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() == y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator!=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() != y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator<(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() < y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator<=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() <= y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator>(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() > y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator>=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() >= y.base();
+}
+
+template<typename P, typename Q>
+inline typename Ptr_Iterator<P>::difference_type
+operator-(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() - y.base();
+}
+
+template<typename P>
+inline Ptr_Iterator<P>
+operator+(typename Ptr_Iterator<P>::difference_type m,
+	  const Ptr_Iterator<P>& y) {
+  return Ptr_Iterator<P>(m + y.base());
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Ptr_Iterator_inlines_hh)
diff --git a/src/Ptr_Iterator.types.hh b/src/Ptr_Iterator.types.hh
new file mode 100644
index 0000000..3d7b646
--- /dev/null
+++ b/src/Ptr_Iterator.types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Ptr_Iterator_types_hh
+#define PPL_Ptr_Iterator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+class Ptr_Iterator;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Ptr_Iterator_types_hh)
diff --git a/src/Result.defs.hh b/src/Result.defs.hh
new file mode 100644
index 0000000..e0c5073
--- /dev/null
+++ b/src/Result.defs.hh
@@ -0,0 +1,118 @@
+/* Result enum and supporting function declarations.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Result_defs_hh
+#define PPL_Result_defs_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of a checked arithmetic computation.
+/*! \ingroup PPL_CXX_interface */
+enum Result {
+
+  VC_MASK = 48,
+
+  //! \hideinitializer Ordinary result class.
+  VC_NORMAL = 0,
+
+  //! \hideinitializer The computed result is inexact and rounded up.
+  V_LT = 1,
+
+  //! \hideinitializer The computed result is inexact and rounded down.
+  V_GT = 2,
+
+  //! \hideinitializer The computed result is exact.
+  V_EQ = 4,
+
+  //! \hideinitializer The computed result is inexact.
+  V_NE = V_LT | V_GT,
+
+  //! \hideinitializer The computed result may be inexact and rounded up.
+  V_LE = V_EQ | V_LT,
+
+  //! \hideinitializer The computed result may be inexact and rounded down.
+  V_GE = V_EQ | V_GT,
+
+  //! \hideinitializer The computed result may be inexact.
+  V_LGE = V_LT | V_EQ | V_GT,
+
+  //! \hideinitializer Negative infinity unrepresentable result class.
+  VC_MINUS_INFINITY = 16,
+
+  //! \hideinitializer A negative overflow occurred.
+  V_NEG_OVERFLOW = VC_MINUS_INFINITY | V_GT,
+
+  //! \hideinitializer Positive infinity unrepresentable result class.
+  VC_PLUS_INFINITY = 32,
+
+  //! \hideinitializer A positive overflow occurred.
+  V_POS_OVERFLOW = VC_PLUS_INFINITY | V_LT,
+
+  //! \hideinitializer Not a number result class.
+  VC_NAN = 48,
+
+  //! \hideinitializer Converting from unknown string.
+  V_CVT_STR_UNK = 49,
+
+  //! \hideinitializer Dividing by zero.
+  V_DIV_ZERO = 50,
+
+  //! \hideinitializer Adding two infinities having opposite signs.
+  V_INF_ADD_INF = 51,
+
+  //! \hideinitializer Dividing two infinities.
+  V_INF_DIV_INF = 52,
+
+  //! \hideinitializer Taking the modulus of an infinity.
+  V_INF_MOD = 53,
+
+  //! \hideinitializer Multiplying an infinity by zero.
+  V_INF_MUL_ZERO = 54,
+
+  //! \hideinitializer Subtracting two infinities having the same sign.
+  V_INF_SUB_INF = 55,
+
+  //! \hideinitializer Computing a remainder modulo zero.
+  V_MOD_ZERO = 56,
+
+  //! \hideinitializer Taking the square root of a negative number.
+  V_SQRT_NEG = 57,
+
+  //! \hideinitializer Unknown result due to intermediate negative overflow.
+  V_UNKNOWN_NEG_OVERFLOW = 58,
+
+  //! \hideinitializer Unknown result due to intermediate positive overflow.
+  V_UNKNOWN_POS_OVERFLOW = 59,
+
+  //! \hideinitializer Unordered comparison.
+  V_UNORD_COMP = 60
+};
+
+bool is_special(Result r);
+Result classify(Result r);
+Result sign(Result r);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Result.inlines.hh"
+
+#endif // !defined(PPL_Result_defs_hh)
diff --git a/src/Result.inlines.hh b/src/Result.inlines.hh
new file mode 100644
index 0000000..3ff1a97
--- /dev/null
+++ b/src/Result.inlines.hh
@@ -0,0 +1,60 @@
+/* Result supporting functions implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Result_inlines_hh
+#define PPL_Result_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline Result
+classify(Result r) {
+  return static_cast<Result>(r & VC_MASK);
+}
+
+inline bool
+is_special(Result r) {
+  return classify(r) != VC_NORMAL;
+}
+
+inline Result
+sign(Result r) {
+  switch (r) {
+  case V_LT:
+  case V_EQ:
+  case V_GT:
+  case VC_NAN:
+    return r;
+  case VC_MINUS_INFINITY:
+    return V_LT;
+  case VC_PLUS_INFINITY:
+    return V_GT;
+  default:
+    assert(false);
+    return VC_NAN;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Result_inlines_hh)
diff --git a/src/Rounding_Dir.defs.hh b/src/Rounding_Dir.defs.hh
new file mode 100644
index 0000000..6f44dd2
--- /dev/null
+++ b/src/Rounding_Dir.defs.hh
@@ -0,0 +1,70 @@
+/* Declaration of Rounding_Dir and related functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Rounding_defs_hh
+#define PPL_Rounding_defs_hh 1
+
+#include "Result.defs.hh"
+#include "fpu.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! Rounding directions for arithmetic computations.
+/*! \ingroup PPL_CXX_interface */
+enum Rounding_Dir {
+  /*! \hideinitializer
+    Round toward \f$-\infty\f$.
+  */
+  ROUND_DOWN = FPU_DOWNWARD,
+
+  /*! \hideinitializer
+    Round toward \f$+\infty\f$.
+  */
+  ROUND_UP = FPU_UPWARD,
+
+  /*! \hideinitializer
+    Rounding is delegated to lower level. Result info is evaluated lazily.
+  */
+  ROUND_IGNORE = -1,
+  ROUND_NATIVE = ROUND_IGNORE,
+
+  /*! \hideinitializer
+    Rounding is not needed: client code must ensure the operation is exact.
+  */
+  ROUND_NOT_NEEDED = -2,
+
+  ROUND_DIRECT = ROUND_UP,
+  ROUND_INVERSE = ROUND_DOWN
+};
+
+/*! \brief
+  Returns the inverse rounding mode of \p dir,
+  <CODE>ROUND_IGNORE</CODE> being the inverse of itself.
+*/
+Rounding_Dir inverse(Rounding_Dir dir);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Rounding_Dir.inlines.hh"
+
+#endif // !defined(PPL_Float_defs_hh)
+
diff --git a/src/Rounding_Dir.inlines.hh b/src/Rounding_Dir.inlines.hh
new file mode 100644
index 0000000..2304410
--- /dev/null
+++ b/src/Rounding_Dir.inlines.hh
@@ -0,0 +1,48 @@
+/* Inline functions operating on enum Rounding_Dir values.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Rounding_Dir_inlines_hh
+#define PPL_Rounding_Dir_inlines_hh 1
+
+#include "Rounding_Dir.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+/*! \relates Parma_Polyhedra_Library::Rounding_Dir */
+inline Rounding_Dir
+inverse(Rounding_Dir dir) {
+  switch (dir) {
+  case ROUND_UP:
+    return ROUND_DOWN;
+  case ROUND_DOWN:
+    return ROUND_UP;
+  case ROUND_IGNORE:
+    return ROUND_IGNORE;
+  default:
+    assert(false);
+    return ROUND_IGNORE;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Rounding_Dir_inlines_hh)
diff --git a/src/Row.cc b/src/Row.cc
new file mode 100644
index 0000000..5f10255
--- /dev/null
+++ b/src/Row.cc
@@ -0,0 +1,282 @@
+/* Row class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Row.defs.hh"
+#include "Coefficient.defs.hh"
+#include <iostream>
+#include <iomanip>
+#include <cassert>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Row_Impl_Handler::
+Impl::expand_within_capacity(const dimension_type new_size) {
+  assert(size() <= new_size && new_size <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // vec_[0] is already constructed.
+  if (size() == 0 && new_size > 0)
+    bump_size();
+#endif
+  for (dimension_type i = size(); i < new_size; ++i) {
+    new (&vec_[i]) Coefficient();
+    bump_size();
+  }
+}
+
+void
+PPL::Row_Impl_Handler::Impl::shrink(dimension_type new_size) {
+  const dimension_type old_size = size();
+  assert(new_size <= old_size);
+  // Since ~Coefficient() does not throw exceptions, nothing here does.
+  set_size(new_size);
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Make sure we do not try to destroy vec_[0].
+  if (new_size == 0)
+    ++new_size;
+#endif
+  // We assume construction was done "forward".
+  // We thus perform destruction "backward".
+  for (dimension_type i = old_size; i-- > new_size; )
+    vec_[i].~Coefficient();
+}
+
+void
+PPL::Row_Impl_Handler::Impl::copy_construct_coefficients(const Impl& y) {
+  const dimension_type y_size = y.size();
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  for (dimension_type i = 0; i < y_size; ++i) {
+    new (&vec_[i]) Coefficient(y.vec_[i]);
+    bump_size();
+  }
+#else
+  assert(y_size > 0);
+  if (y_size > 0) {
+    vec_[0] = y.vec_[0];
+    bump_size();
+    for (dimension_type i = 1; i < y_size; ++i) {
+      new (&vec_[i]) Coefficient(y.vec_[i]);
+      bump_size();
+    }
+  }
+#endif
+}
+
+void
+PPL::Row::normalize() {
+  Row& x = *this;
+  // Compute the GCD of all the coefficients.
+  const dimension_type sz = size();
+  dimension_type i = sz;
+  TEMP_INTEGER(gcd);
+  while (i > 0) {
+    const Coefficient& x_i = x[--i];
+    if (const int x_i_sign = sgn(x_i)) {
+      gcd = x_i;
+      if (x_i_sign < 0)
+	neg_assign(gcd);
+      goto compute_gcd;
+    }
+  }
+  // We reach this point only if all the coefficients were zero.
+  return;
+
+ compute_gcd:
+  if (gcd == 1)
+    return;
+  while (i > 0) {
+    const Coefficient& x_i = x[--i];
+    if (x_i != 0) {
+      // Note: we use the ternary version instead of a more concise
+      // gcd_assign(gcd, x_i) to take advantage of the fact that
+      // `gcd' will decrease very rapidly (see D. Knuth, The Art of
+      // Computer Programming, second edition, Section 4.5.2,
+      // Algorithm C, and the discussion following it).  Our
+      // implementation of gcd_assign(x, y, z) for checked numbers is
+      // optimized for the case where `z' is smaller than `y', so that
+      // on checked numbers we gain.  On the other hand, for the
+      // implementation of gcd_assign(x, y, z) on GMP's unbounded
+      // integers we cannot make any assumption, so here we draw.
+      // Overall, we win.
+      gcd_assign(gcd, x_i, gcd);
+      if (gcd == 1)
+	return;
+    }
+  }
+  // Divide the coefficients by the GCD.
+  for (dimension_type j = sz; j-- > 0; ) {
+    Coefficient& x_j = x[j];
+    exact_div_assign(x_j, x_j, gcd);
+  }
+}
+
+void
+PPL::Row::Flags::ascii_dump(std::ostream& s) const {
+  s << "0x";
+  std::istream::fmtflags f = s.setf(std::istream::hex);
+  std::streamsize sz = s.width(2*sizeof(Flags::base_type));
+  std::ostream::char_type ch = s.fill('0');
+  s << bits;
+  s.fill(ch);
+  s.width(sz);
+  s.flags(f);
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Row::Flags);
+
+bool
+PPL::Row::Flags::ascii_load(std::istream& s) {
+  std::string str;
+  std::streamsize sz = s.width(2);
+  if (!(s >> str) || (str.compare("0x") != 0))
+    return false;
+  s.width(sz);
+  std::istream::fmtflags f = s.setf(std::istream::hex);
+  bool r = s >> bits;
+  s.flags(f);
+  return r;
+}
+
+void
+PPL::Row::ascii_dump(std::ostream& s) const {
+  const Row& x = *this;
+  const dimension_type x_size = x.size();
+  for (dimension_type i = 0; i < x_size; ++i)
+    s << x[i] << ' ';
+  s << "f ";
+  flags().ascii_dump(s);
+  s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Row);
+
+bool
+PPL::Row::ascii_load(std::istream& s) {
+  Row& x = *this;
+  std::string str;
+  const dimension_type x_size = x.size();
+  for (dimension_type col = 0; col < x_size; ++col)
+    if (!(s >> x[col]))
+      return false;
+  if (!(s >> str) || (str.compare("f") != 0))
+    return false;
+  return flags().ascii_load(s);
+}
+
+PPL::memory_size_type
+PPL::Row_Impl_Handler::Impl::external_memory_in_bytes() const {
+  memory_size_type n = 0;
+  for (dimension_type i = size(); i-- > 0; )
+    n += PPL::external_memory_in_bytes(vec_[i]);
+  return n;
+}
+
+bool
+PPL::Row::OK(const dimension_type row_size,
+	     const dimension_type
+#if EXTRA_ROW_DEBUG
+	     row_capacity
+#endif
+	     ) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  bool is_broken = false;
+#if EXTRA_ROW_DEBUG
+# if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (capacity_ == 0) {
+    cerr << "Illegal row capacity: is 0, should be at least 1"
+	 << endl;
+    is_broken = true;
+  }
+  else if (capacity_ == 1 && row_capacity == 0)
+    // This is fine.
+    ;
+  else
+# endif
+  if (capacity_ > max_size()) {
+    cerr << "Row capacity exceeds the maximum allowed size:"
+	 << endl
+	 << "is " << capacity_
+	 << ", should be less than or equal to " << max_size() << "."
+	 << endl;
+    is_broken = true;
+  }
+  if (capacity_ != row_capacity) {
+    cerr << "Row capacity mismatch: is " << capacity_
+	 << ", should be " << row_capacity << "."
+	 << endl;
+    is_broken = true;
+  }
+#endif
+  if (size() > max_size()) {
+#ifndef NDEBUG
+    cerr << "Row size exceeds the maximum allowed size:"
+	 << endl
+	 << "is " << size()
+	 << ", should be less than or equal to " << max_size() << "."
+	 << endl;
+#endif
+    is_broken = true;
+  }
+  if (size() != row_size) {
+#ifndef NDEBUG
+    cerr << "Row size mismatch: is " << size()
+	 << ", should be " << row_size << "."
+	 << endl;
+#endif
+    is_broken = true;
+  }
+#if EXTRA_ROW_DEBUG
+  if (capacity_ < size()) {
+#ifndef NDEBUG
+    cerr << "Row is completely broken: capacity is " << capacity_
+	 << ", size is " << size() << "."
+	 << endl;
+#endif
+    is_broken = true;
+  }
+#endif
+  return !is_broken;
+}
+
+/*! \relates Parma_Polyhedra_Library::Row */
+bool
+PPL::operator==(const Row& x, const Row& y) {
+  const dimension_type x_size = x.size();
+  const dimension_type y_size = y.size();
+  if (x_size != y_size)
+    return false;
+
+  if (x.flags() != y.flags())
+    return false;
+
+  for (dimension_type i = x_size; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+
+  return true;
+}
diff --git a/src/Row.defs.hh b/src/Row.defs.hh
new file mode 100644
index 0000000..c3ca460
--- /dev/null
+++ b/src/Row.defs.hh
@@ -0,0 +1,496 @@
+/* Row class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Row_defs_hh
+#define PPL_Row_defs_hh 1
+
+#include "Row.types.hh"
+#include "globals.defs.hh"
+#include "Coefficient.defs.hh"
+#include <vector>
+#include <limits>
+
+#ifndef EXTRA_ROW_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*!
+  \brief
+  Enables extra debugging information for class Row.
+
+  \ingroup PPL_CXX_interface
+  When <CODE>EXTRA_ROW_DEBUG</CODE> evaluates to <CODE>true</CODE>,
+  each instance of the class Row carries its own capacity; this enables
+  extra consistency checks to be performed.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define EXTRA_ROW_DEBUG 0
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The handler of the actual Row implementation.
+/*! \ingroup PPL_CXX_interface
+  Exception-safety is the only responsibility of this class: it has
+  to ensure that its \p impl member is correctly deallocated.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Row_Impl_Handler {
+public:
+  //! Default constructor.
+  Row_Impl_Handler();
+
+  //! Destructor.
+  ~Row_Impl_Handler();
+
+  class Impl;
+
+  //! A pointer to the actual implementation.
+  Impl* impl;
+
+#if EXTRA_ROW_DEBUG
+  //! The capacity of \p impl (only available during debugging).
+  dimension_type capacity_;
+#endif // EXTRA_ROW_DEBUG
+
+private:
+  //! Private and unimplemented: copy construction is not allowed.
+  Row_Impl_Handler(const Row_Impl_Handler&);
+
+  //! Private and unimplemented: copy assignment is not allowed.
+  Row_Impl_Handler& operator=(const Row_Impl_Handler&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sequence of coefficients.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Row : private Row_Impl_Handler {
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Wrapper class to represent a set of flags with bits in a native
+    unsigned integral type.
+    \ingroup PPL_CXX_interface
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  class Flags {
+  public:
+    //! Constructs an object with all the flags unset.
+    Flags();
+
+    //! Returns <CODE>true</CODE> if and only if \p *this and \p y are equal.
+    bool operator==(const Flags& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y
+      are different.
+    */
+    bool operator!=(const Flags& y) const;
+
+    PPL_OUTPUT_DECLARATIONS;
+
+    //! Uses the ASCII Flags representation from \p s to recreate *this.
+    /*!
+      Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+      otherwise.  The ASCII representation is as output by
+      \ref Parma_Polyhedra_Library::Row::Flags::ascii_dump.
+    */
+    bool ascii_load(std::istream& s);
+
+  protected:
+    //! A native integral type holding the bits that encode the flags.
+    typedef unsigned int base_type;
+
+    //! Index of the first bit derived classes can use.
+    static const unsigned first_free_bit = 0;
+
+    //! Total number of bits that can be stored.
+    static const unsigned num_bits = std::numeric_limits<base_type>::digits;
+
+    //! Constructs an object with flags set as in \p n.
+    explicit Flags(base_type n);
+
+    //! Returns the integer encoding \p *this.
+    base_type get_bits() const;
+
+    //! Sets the bits in \p mask.
+    void set_bits(base_type mask);
+
+    //! Resets the bits in \p mask.
+    void reset_bits(base_type mask);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if all the bits
+      in \p mask are set.
+    */
+    bool test_bits(base_type mask) const;
+
+  private:
+    //! The integer encoding \p *this.
+    base_type bits;
+
+    friend class Row;
+  };
+
+  //! Pre-constructs a row: construction must be completed by construct().
+  Row();
+
+  //! \name Post-constructors
+  //@{
+  //! Constructs properly a default-constructed element.
+  /*!
+    Builds a row with size and capacity \p sz and flags \p f.
+  */
+  void construct(dimension_type sz, Flags f);
+
+  //! Constructs properly a default-constructed element.
+  /*!
+    \param sz
+    The size of the row that will be constructed;
+
+    \param capacity
+    The capacity of the row that will be constructed;
+
+    \param f
+    Flags for the row that will be constructed.
+
+    The row that is constructed has storage for \p capacity elements,
+    \p sz of which are default-constructed now.
+    The row flags are set to \p f.
+  */
+  void construct(dimension_type sz, dimension_type capacity, Flags f);
+  //@} // Post-constructors
+
+  //! Tight constructor: resizing may require reallocation.
+  /*!
+    Constructs a row with size and capacity \p sz, and flags \p f.
+  */
+  Row(dimension_type sz, Flags f);
+
+  //! Sizing constructor with capacity.
+  /*!
+    \param sz
+    The size of the row that will be constructed;
+
+    \param capacity
+    The capacity of the row that will be constructed;
+
+    \param f
+    Flags for the row that will be constructed.
+
+    The row that is constructed has storage for \p capacity elements,
+    \p sz of which are default-constructed now.
+    The row flags are set to \p f.
+  */
+  Row(dimension_type sz, dimension_type capacity, Flags f);
+
+  //! Ordinary copy constructor.
+  Row(const Row& y);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to
+    the size of \p y.
+  */
+  Row(const Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is greater than or equal to the size of \p y
+    and, of course, that \p sz is less than or equal to \p capacity.
+  */
+  Row(const Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Destructor.
+  ~Row();
+
+  //! Assignment operator.
+  Row& operator=(const Row& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Row& y);
+
+  //! Assigns the implementation of \p y to \p *this.
+  /*!
+    To be used with extra care, since it may easily cause memory leaks
+    or undefined behavior.
+  */
+  void assign(Row& y);
+
+  /*! \brief
+    Allocates memory for a default constructed Row object, setting
+    flags to \p f and allowing for \p capacity coefficients at most.
+
+    It is assumed that no allocation has been performed before
+    (otherwise, a memory leak will occur).
+    After execution, the size of the Row object is zero.
+  */
+  void allocate(dimension_type capacity, Flags f);
+
+  //! Expands the row to size \p new_size.
+  /*!
+    Adds new positions to the implementation of the row
+    obtaining a new row with size \p new_size.
+    It is assumed that \p new_size is between the current size
+    and capacity of the row.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    Destroys elements of the row implementation
+    from position \p new_size to the end.
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Returns a const reference to the flags of \p *this.
+  const Flags& flags() const;
+
+  //! Returns a non-const reference to the flags of \p *this.
+  Flags& flags();
+
+  //! Returns the size() of the largest possible Row.
+  static dimension_type max_size();
+
+  //! Gives the number of coefficients currently in use.
+  dimension_type size() const;
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the element of the row indexed by \p k.
+  Coefficient& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  Coefficient_traits::const_reference operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  //! Normalizes the modulo of coefficients so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the elements of
+    the row and normalizes them by the GCD itself.
+  */
+  void normalize();
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  //! Uses the ASCII Row representation at \p s to recreate *this.
+  /*!
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+    otherwise.  The ASCII representation is as output by \ref ascii_dump.
+  */
+  bool ascii_load(std::istream& s);
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns the total size in bytes of the memory occupied by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  /*! \brief
+    Returns the size in bytes of the memory managed by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const Row& y);
+
+#if EXTRA_ROW_DEBUG
+  //! Returns the capacity of the row (only available during debugging).
+  dimension_type capacity() const;
+#endif // EXTRA_ROW_DEBUG
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Row */
+bool operator==(const Row& x, const Row& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Row */
+bool operator!=(const Row& x, const Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Row& x,
+	  Parma_Polyhedra_Library::Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
+	       std::vector<Parma_Polyhedra_Library::Row>::iterator y);
+
+} // namespace std
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The actual implementation of a Row object.
+/*! \ingroup PPL_CXX_interface
+  The class Row_Impl_Handler::Impl provides the implementation of Row
+  objects and, in particular, of the corresponding memory allocation
+  functions.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Row_Impl_Handler::Impl {
+public:
+  //! \name Custom allocator and deallocator
+  //@{
+
+  /*! \brief
+    Allocates a chunk of memory able to contain \p capacity Coefficient objects
+    beyond the specified \p fixed_size and returns a pointer to the new
+    allocated memory.
+  */
+  static void* operator new(size_t fixed_size, dimension_type capacity);
+
+  //! Uses the standard delete operator to free the memory \p p points to.
+  static void operator delete(void* p);
+
+  /*! \brief
+    Placement version:
+    uses the standard operator delete to free the memory \p p points to.
+  */
+  static void operator delete(void* p, dimension_type capacity);
+  //@} // Custom allocator and deallocator
+
+  //! Constructor.
+  Impl(Row::Flags f);
+
+  //! Destructor.
+  /*!
+    Uses <CODE>shrink()</CODE> method with argument \f$0\f$
+    to delete all the row elements.
+  */
+  ~Impl();
+
+  //! Expands the row to size \p new_size.
+  /*!
+    It is assumed that \p new_size is between the current size and capacity.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const Impl& y);
+
+  //! Returns the size() of the largest possible Impl.
+  static dimension_type max_size();
+
+  //! \name Flags accessors
+  //@{
+  //! Returns a const reference to the flags of \p *this.
+  const Row::Flags& flags() const;
+
+  //! Returns a non-const reference to the flags of \p *this.
+  Row::Flags& flags();
+  //@} // Flags accessors
+
+  //! \name Size accessors
+  //@{
+  //! Returns the actual size of \p this.
+  dimension_type size() const;
+
+  //! Sets to \p new_size the actual size of \p *this.
+  void set_size(dimension_type new_size);
+
+  //! Increment the size of \p *this by 1.
+  void bump_size();
+  //@} // Size accessors
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the element of \p *this indexed by \p k.
+  Coefficient& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of \p *this indexed by \p k.
+  Coefficient_traits::const_reference operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+private:
+  //! The number of coefficients in the row.
+  dimension_type size_;
+
+  //! The flags of this row.
+  Row::Flags flags_;
+
+  //! The vector of coefficients.
+  Coefficient vec_[
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+	       1
+#endif
+  ];
+
+  //! Private and unimplemented: default construction is not allowed.
+  Impl();
+
+  //! Private and unimplemented: copy construction is not allowed.
+  Impl(const Impl& y);
+
+  //! Private and unimplemented: assignment is not allowed.
+  Impl& operator=(const Impl&);
+};
+
+#include "Row.inlines.hh"
+
+#endif // !defined(PPL_Row_defs_hh)
diff --git a/src/Row.inlines.hh b/src/Row.inlines.hh
new file mode 100644
index 0000000..a850267
--- /dev/null
+++ b/src/Row.inlines.hh
@@ -0,0 +1,404 @@
+/* Row class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Row_inlines_hh
+#define PPL_Row_inlines_hh 1
+
+#include "globals.defs.hh"
+#include <cassert>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Row::Flags::Flags()
+  : bits(0) {
+}
+
+inline
+Row::Flags::Flags(base_type n)
+  : bits(n) {
+}
+
+inline Row::Flags::base_type
+Row::Flags::get_bits() const {
+  return bits;
+}
+
+inline void
+Row::Flags::set_bits(const base_type mask) {
+  bits |= mask;
+}
+
+inline void
+Row::Flags::reset_bits(const base_type mask) {
+  bits &= ~mask;
+}
+
+inline bool
+Row::Flags::test_bits(const base_type mask) const {
+  return (bits & mask) == mask;
+}
+
+inline bool
+Row::Flags::operator==(const Flags& y) const {
+  base_type mask = low_bits_mask<base_type>(first_free_bit);
+  return (get_bits() & mask) == (y.get_bits() & mask);
+}
+
+inline bool
+Row::Flags::operator!=(const Flags& y) const {
+  return !operator==(y);
+}
+
+inline void*
+Row_Impl_Handler::Impl::operator new(const size_t fixed_size,
+				     const dimension_type capacity) {
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  return ::operator new(fixed_size + capacity*sizeof(Coefficient));
+#else
+  assert(capacity >= 1);
+  return ::operator new(fixed_size + (capacity-1)*sizeof(Coefficient));
+#endif
+}
+
+inline void
+Row_Impl_Handler::Impl::operator delete(void* p) {
+  ::operator delete(p);
+}
+
+inline void
+Row_Impl_Handler::Impl::operator delete(void* p, dimension_type) {
+  ::operator delete(p);
+}
+
+inline dimension_type
+Row_Impl_Handler::Impl::max_size() {
+  return size_t(-1)/sizeof(Coefficient);
+}
+
+inline dimension_type
+Row_Impl_Handler::Impl::size() const {
+  return size_;
+}
+
+inline void
+Row_Impl_Handler::Impl::set_size(const dimension_type new_size) {
+  size_ = new_size;
+}
+
+inline void
+Row_Impl_Handler::Impl::bump_size() {
+  ++size_;
+}
+
+inline
+Row_Impl_Handler::Impl::Impl(const Row::Flags f)
+  : size_(0), flags_(f) {
+}
+
+inline
+Row_Impl_Handler::Impl::~Impl() {
+  shrink(0);
+}
+
+inline const Row::Flags&
+Row_Impl_Handler::Impl::flags() const {
+  return flags_;
+}
+
+inline Row::Flags&
+Row_Impl_Handler::Impl::flags() {
+  return flags_;
+}
+
+inline Coefficient&
+Row_Impl_Handler::Impl::operator[](const dimension_type k) {
+  assert(k < size());
+  return vec_[k];
+}
+
+inline Coefficient_traits::const_reference
+Row_Impl_Handler::Impl::operator[](const dimension_type k) const {
+  assert(k < size());
+  return vec_[k];
+}
+
+inline memory_size_type
+Row_Impl_Handler::Impl::total_memory_in_bytes(dimension_type capacity) const {
+  return
+    sizeof(*this)
+    + capacity*sizeof(Coefficient)
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+    - 1*sizeof(Coefficient)
+#endif
+    + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Row_Impl_Handler::Impl::total_memory_in_bytes() const {
+  // In general, this is a lower bound, as the capacity of *this
+  // may be strictly greater than `size_'
+  return total_memory_in_bytes(size_);
+}
+
+inline dimension_type
+Row::max_size() {
+  return Impl::max_size();
+}
+
+inline dimension_type
+Row::size() const {
+  return impl->size();
+}
+
+inline const Row::Flags&
+Row::flags() const {
+  return impl->flags();
+}
+
+inline Row::Flags&
+Row::flags() {
+  return impl->flags();
+}
+
+#if EXTRA_ROW_DEBUG
+inline dimension_type
+Row::capacity() const {
+  return capacity_;
+}
+#endif
+
+inline
+Row_Impl_Handler::Row_Impl_Handler()
+  : impl(0) {
+#if EXTRA_ROW_DEBUG
+  capacity_ = 0;
+#endif
+}
+
+inline
+Row_Impl_Handler::~Row_Impl_Handler() {
+  delete impl;
+}
+
+inline
+Row::Row()
+  : Row_Impl_Handler() {
+}
+
+inline void
+Row::allocate(
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+	       const
+#endif
+	       dimension_type capacity,
+	       const Flags f) {
+  assert(capacity <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (capacity == 0)
+    ++capacity;
+#endif
+  assert(impl == 0);
+  impl = new (capacity) Impl(f);
+#if EXTRA_ROW_DEBUG
+  assert(capacity_ == 0);
+  capacity_ = capacity;
+#endif
+}
+
+inline void
+Row::expand_within_capacity(const dimension_type new_size) {
+  assert(impl);
+#if EXTRA_ROW_DEBUG
+  assert(new_size <= capacity_);
+#endif
+  impl->expand_within_capacity(new_size);
+}
+
+inline void
+Row::copy_construct_coefficients(const Row& y) {
+  assert(impl && y.impl);
+#if EXTRA_ROW_DEBUG
+  assert(y.size() <= capacity_);
+#endif
+  impl->copy_construct_coefficients(*(y.impl));
+}
+
+inline void
+Row::construct(const dimension_type sz,
+	       const dimension_type capacity,
+	       const Flags f) {
+  assert(sz <= capacity && capacity <= max_size());
+  allocate(capacity, f);
+  expand_within_capacity(sz);
+}
+
+inline void
+Row::construct(const dimension_type sz, const Flags f) {
+  construct(sz, sz, f);
+}
+
+inline
+Row::Row(const dimension_type sz,
+	 const dimension_type capacity,
+	 const Flags f)
+  : Row_Impl_Handler() {
+  construct(sz, capacity, f);
+}
+
+inline
+Row::Row(const dimension_type sz, const Flags f)
+  : Row_Impl_Handler() {
+  construct(sz, f);
+}
+
+inline
+Row::Row(const Row& y)
+  : Row_Impl_Handler() {
+  if (y.impl) {
+    allocate(compute_capacity(y.size(), max_size()), y.flags());
+    copy_construct_coefficients(y);
+  }
+}
+
+inline
+Row::Row(const Row& y,
+	 const dimension_type capacity)
+  : Row_Impl_Handler() {
+  assert(y.impl);
+  assert(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity, y.flags());
+  copy_construct_coefficients(y);
+}
+
+inline
+Row::Row(const Row& y,
+	 const dimension_type sz,
+	 const dimension_type capacity)
+  : Row_Impl_Handler() {
+  assert(y.impl);
+  assert(y.size() <= sz && sz <= capacity && capacity <= max_size());
+  allocate(capacity, y.flags());
+  copy_construct_coefficients(y);
+  expand_within_capacity(sz);
+}
+
+inline
+Row::~Row() {
+}
+
+inline void
+Row::shrink(const dimension_type new_size) {
+  assert(impl);
+  impl->shrink(new_size);
+}
+
+inline void
+Row::swap(Row& y) {
+  std::swap(impl, y.impl);
+#if EXTRA_ROW_DEBUG
+  std::swap(capacity_, y.capacity_);
+#endif
+}
+
+inline void
+Row::assign(Row& y) {
+  impl = y.impl;
+#if EXTRA_ROW_DEBUG
+  capacity_ = y.capacity_;
+#endif
+}
+
+inline Row&
+Row::operator=(const Row& y) {
+  // Copy-construct `tmp' from `y'.
+  Row tmp(y);
+  // Swap the implementation of `*this' with the one of `tmp'.
+  swap(tmp);
+  // Now `tmp' goes out of scope, so the old `*this' will be destroyed.
+  return *this;
+}
+
+inline Coefficient&
+Row::operator[](const dimension_type k) {
+  assert(impl);
+  return (*impl)[k];
+}
+
+inline Coefficient_traits::const_reference
+Row::operator[](const dimension_type k) const {
+  assert(impl);
+  return (*impl)[k];
+}
+
+inline memory_size_type
+Row::external_memory_in_bytes(dimension_type capacity) const {
+  return impl->total_memory_in_bytes(capacity);
+}
+
+inline memory_size_type
+Row::total_memory_in_bytes(dimension_type capacity) const {
+  return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+inline memory_size_type
+Row::external_memory_in_bytes() const {
+#if EXTRA_ROW_DEBUG
+  return impl->total_memory_in_bytes(capacity_);
+#else
+  return impl->total_memory_in_bytes();
+#endif
+}
+
+inline memory_size_type
+Row::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Row */
+inline bool
+operator!=(const Row& x, const Row& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Row */
+inline void
+swap(Parma_Polyhedra_Library::Row& x, Parma_Polyhedra_Library::Row& y) {
+  x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Row_inlines_hh)
diff --git a/src/Row.types.hh b/src/Row.types.hh
new file mode 100644
index 0000000..3a7fb38
--- /dev/null
+++ b/src/Row.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Row_types_hh
+#define PPL_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Row_Impl_Handler;
+class Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Row_types_hh)
diff --git a/src/Saturation_Matrix.cc b/src/Saturation_Matrix.cc
new file mode 100644
index 0000000..f3ab2b4
--- /dev/null
+++ b/src/Saturation_Matrix.cc
@@ -0,0 +1,227 @@
+/* Saturation_Matrix class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Saturation_Matrix.defs.hh"
+#include "globals.defs.hh"
+#include <iostream>
+#include <string>
+
+#include "swapping_sort.icc"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Saturation_Matrix&
+PPL::Saturation_Matrix::operator=(const Saturation_Matrix& y){
+  rows = y.rows;
+  row_size = y.row_size;
+  assert(OK());
+  return *this;
+}
+
+void
+PPL::Saturation_Matrix::sort_rows() {
+  typedef std::vector<Saturation_Row>::iterator Iter;
+  // Sorting without removing duplicates.
+  Iter first = rows.begin();
+  Iter last = rows.end();
+  swapping_sort(first, last, Saturation_Row_Less_Than());
+  // Moving all the duplicate elements at the end of the vector.
+  Iter new_last = swapping_unique(first, last);
+  // Removing duplicates.
+  rows.erase(new_last, last);
+  assert(OK());
+}
+
+void
+PPL::Saturation_Matrix::add_row(const Saturation_Row& row) {
+  const dimension_type new_rows_size = rows.size() + 1;
+  if (rows.capacity() < new_rows_size) {
+    // Reallocation will take place.
+    std::vector<Saturation_Row> new_rows;
+    new_rows.reserve(compute_capacity(new_rows_size, max_num_rows()));
+    new_rows.insert(new_rows.end(), new_rows_size, Saturation_Row());
+    // Put the new row in place.
+    dimension_type i = new_rows_size-1;
+    new_rows[i] = row;
+    // Steal the old rows.
+    while (i-- > 0)
+      new_rows[i].swap(rows[i]);
+    // Put the new rows into place.
+    std::swap(rows, new_rows);
+  }
+  else
+    // Reallocation will NOT take place: append a new empty row.
+    rows.push_back(row);
+  assert(OK());
+}
+
+void
+PPL::Saturation_Matrix::transpose() {
+  const Saturation_Matrix& x = *this;
+  const dimension_type nrows = num_rows();
+  const dimension_type ncols = num_columns();
+  Saturation_Matrix tmp(ncols, nrows);
+  for (dimension_type i = nrows; i-- > 0; )
+    for (unsigned long j = x[i].last(); j != ULONG_MAX; j = x[i].prev(j))
+      tmp[j].set(i);
+  swap(tmp);
+  assert(OK());
+}
+
+void
+PPL::Saturation_Matrix::transpose_assign(const Saturation_Matrix& y) {
+  const dimension_type y_nrows = y.num_rows();
+  const dimension_type y_ncols = y.num_columns();
+  Saturation_Matrix tmp(y_ncols, y_nrows);
+  for (dimension_type i = y_nrows; i-- > 0; )
+    for (unsigned long j = y[i].last(); j != ULONG_MAX; j = y[i].prev(j))
+      tmp[j].set(i);
+  swap(tmp);
+  assert(OK());
+}
+
+void
+PPL::Saturation_Matrix::resize(dimension_type new_n_rows,
+		       dimension_type new_n_columns) {
+  assert(OK());
+  const dimension_type old_num_rows = num_rows();
+  if (new_n_columns < row_size) {
+    const dimension_type num_preserved_rows
+      = std::min(old_num_rows, new_n_rows);
+    Saturation_Matrix& x = *this;
+    for (dimension_type i = num_preserved_rows; i-- > 0; )
+      x[i].clear_from(new_n_columns);
+  }
+  row_size = new_n_columns;
+  if (new_n_rows > old_num_rows) {
+    if (rows.capacity() < new_n_rows) {
+      // Reallocation will take place.
+      std::vector<Saturation_Row> new_rows;
+      new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+      new_rows.insert(new_rows.end(), new_n_rows, Saturation_Row());
+      // Steal the old rows.
+      for (dimension_type i = old_num_rows; i-- > 0; )
+	new_rows[i].swap(rows[i]);
+      // Put the new vector into place.
+      std::swap(rows, new_rows);
+    }
+    else
+      // Reallocation will NOT take place.
+      rows.insert(rows.end(), new_n_rows - old_num_rows, Saturation_Row());
+  }
+  else if (new_n_rows < old_num_rows)
+    // Drop some rows.
+    rows.erase(rows.begin() + new_n_rows, rows.end());
+
+  assert(OK());
+}
+
+void
+PPL::Saturation_Matrix::ascii_dump(std::ostream& s) const {
+  const Saturation_Matrix& x = *this;
+  const char separator = ' ';
+  s << num_rows() << separator << 'x' << separator
+    << num_columns() << "\n";
+  for (dimension_type i = 0; i < num_rows(); ++i) {
+    for (dimension_type j = 0; j < num_columns(); ++j)
+      s << x[i][j] << separator;
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Saturation_Matrix);
+
+bool
+PPL::Saturation_Matrix::ascii_load(std::istream& s) {
+  Saturation_Matrix& x = *this;
+  dimension_type nrows;
+  dimension_type ncols;
+  std::string str;
+  if (!(s >> nrows))
+    return false;
+  if (!(s >> str))
+    return false;
+  if (!(s >> ncols))
+    return false;
+  resize(nrows, ncols);
+
+  for (dimension_type i = 0; i < num_rows(); ++i)
+    for (dimension_type j = 0; j < num_columns(); ++j) {
+      int bit;
+      if (!(s >> bit))
+	return false;
+      if (bit)
+	x[i].set(j);
+      else
+	x[i].clear(j);
+    }
+  // Check for well-formedness.
+  assert(OK());
+  return true;
+}
+
+PPL::memory_size_type
+PPL::Saturation_Matrix::external_memory_in_bytes() const {
+  memory_size_type n = rows.capacity() * sizeof(Row);
+  for (dimension_type i = num_rows(); i-- > 0; )
+    n += rows[i].external_memory_in_bytes();
+  return n;
+}
+
+bool
+PPL::Saturation_Matrix::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  const Saturation_Matrix& x = *this;
+  for (dimension_type i = num_rows(); i-- > 1; ) {
+    const Saturation_Row& row = x[i];
+    if (!row.OK())
+      return false;
+    else if (row.last() != ULONG_MAX && row.last() >= row_size) {
+#ifndef NDEBUG
+      cerr << "Saturation_Matrix[" << i << "] is a row with too many bits!"
+	   << endl
+	   << "(row_size == " << row_size
+	   << ", row.last() == " << row.last() << ")"
+	   << endl;
+#endif
+      return false;
+    }
+  }
+  return true;
+}
+
+#ifndef NDEBUG
+bool
+PPL::Saturation_Matrix::check_sorted() const {
+  const Saturation_Matrix& x = *this;
+  for (dimension_type i = num_rows(); i-- > 1; )
+    if (compare(x[i-1], x[i]) > 0)
+      return false;
+  return true;
+}
+#endif
diff --git a/src/Saturation_Matrix.defs.hh b/src/Saturation_Matrix.defs.hh
new file mode 100644
index 0000000..264c3c8
--- /dev/null
+++ b/src/Saturation_Matrix.defs.hh
@@ -0,0 +1,177 @@
+/* Saturation_Matrix class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Saturation_Matrix_defs_hh
+#define PPL_Saturation_Matrix_defs_hh 1
+
+#include "Saturation_Matrix.types.hh"
+#include "Linear_System.defs.hh"
+#include "Saturation_Row.defs.hh"
+#include <vector>
+#include <iosfwd>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A saturation matrix.
+/*! \ingroup PPL_CXX_interface
+  A saturation matrix is used to encode the relation between the
+  generators and the constraints of a polyhedron: if a generator
+  saturates a constraint the corresponding element of the saturation
+  matrix is \f$0\f$, otherwise (i.e., if the generator satisfies but
+  does not saturate the constraint) the corresponding element is \f$1\f$.
+  \note
+  since the constraints and generators are taken from the same polyhedron
+  description, it cannot be the case that a generator <EM>violates</EM>
+  a constraint.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Saturation_Matrix {
+public:
+  //! Default constructor.
+  Saturation_Matrix();
+
+  /*! \brief
+    Construct a saturation matrix with \p n_rows rows
+    and \p n_columns columns.
+  */
+  Saturation_Matrix(dimension_type n_rows, dimension_type n_columns);
+
+  //! Copy-constructor.
+  Saturation_Matrix(const Saturation_Matrix& y);
+
+  //! Destructor.
+  ~Saturation_Matrix();
+
+  //! Assignment operator.
+  Saturation_Matrix& operator=(const Saturation_Matrix& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Saturation_Matrix& y);
+
+  //! Subscript operator.
+  Saturation_Row& operator[](dimension_type k);
+
+  //! Constant subscript operator.
+  const Saturation_Row& operator[](dimension_type k) const;
+
+  //! Clears the matrix deallocating all its rows.
+  void clear();
+
+  //! Transposes the matrix.
+  void transpose();
+
+  //! Makes \p *this a transposed copy of \p y.
+  void transpose_assign(const Saturation_Matrix& y);
+
+  //! Returns the maximum number of rows of a Saturation_Matrix.
+  static dimension_type max_num_rows();
+
+  //! Returns the number of columns of \p *this.
+  dimension_type num_columns() const;
+
+  //! Returns the number of rows of \p *this.
+  dimension_type num_rows() const;
+
+  //! Sorts the rows and removes duplicates.
+  void sort_rows();
+
+  //! Looks for \p row in \p *this, which is assumed to be sorted.
+  /*!
+    \return
+    <CODE>true</CODE> if \p row belongs to \p *this, false otherwise.
+
+    \param row
+    The row that will be searched for in the matrix.
+
+    Given a sorted saturation matrix (this ensures better efficiency),
+    tells whether it contains the given row.
+  */
+  bool sorted_contains(const Saturation_Row& row) const;
+
+  //! Adds \p row to \p *this.
+  void add_row(const Saturation_Row& row);
+
+  //! Erases the rows from the \p first_to_erase -th to the last one.
+  void rows_erase_to_end(dimension_type first_to_erase);
+
+  //! Erases the columns from the \p first_to_erase -th to the last one.
+  void columns_erase_to_end(dimension_type first_to_erase);
+
+  //! Resizes the matrix copying the old contents.
+  void resize(dimension_type new_n_rows, dimension_type new_n_columns);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
+    <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+#ifndef NDEBUG
+  //! Checks whether \p *this is sorted. It does NOT check for duplicates.
+  bool check_sorted() const;
+#endif
+
+private:
+  //! Contains the rows of the matrix.
+  std::vector<Saturation_Row> rows;
+
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
+
+  //! Ordering predicate (used when implementing the sort algorithm).
+  /*! \ingroup PPL_CXX_interface */
+  struct Saturation_Row_Less_Than {
+    bool operator()(const Saturation_Row& x, const Saturation_Row& y) const;
+  };
+
+  friend
+  void Parma_Polyhedra_Library::
+  Linear_System::sort_and_remove_with_sat(Saturation_Matrix& sat);
+
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Saturation_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
+	  Parma_Polyhedra_Library::Saturation_Matrix& y);
+
+} // namespace std
+
+#include "Saturation_Matrix.inlines.hh"
+
+#endif // !defined(PPL_Saturation_Matrix_defs_hh)
diff --git a/src/Saturation_Matrix.inlines.hh b/src/Saturation_Matrix.inlines.hh
new file mode 100644
index 0000000..ad7b477
--- /dev/null
+++ b/src/Saturation_Matrix.inlines.hh
@@ -0,0 +1,145 @@
+/* Saturation_Matrix class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Saturation_Matrix_inlines_hh
+#define PPL_Saturation_Matrix_inlines_hh 1
+
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Saturation_Matrix::Saturation_Matrix()
+  : rows(),
+    row_size(0) {
+}
+
+inline dimension_type
+Saturation_Matrix::max_num_rows() {
+  return std::vector<Saturation_Row>().max_size();
+}
+
+inline
+Saturation_Matrix::Saturation_Matrix(const dimension_type n_rows,
+		     const dimension_type n_columns)
+  : rows(n_rows),
+    row_size(n_columns) {
+}
+
+inline
+Saturation_Matrix::Saturation_Matrix(const Saturation_Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size) {
+}
+
+inline
+Saturation_Matrix::~Saturation_Matrix() {
+}
+
+inline void
+Saturation_Matrix::rows_erase_to_end(const dimension_type first_to_erase) {
+  // The first row to be erased cannot be greater
+  // than the actual number of the rows of the matrix.
+  assert(first_to_erase <= rows.size());
+  if (first_to_erase < rows.size())
+    rows.erase(rows.begin() + first_to_erase, rows.end());
+  assert(OK());
+}
+
+inline void
+Saturation_Matrix::columns_erase_to_end(const dimension_type first_to_erase) {
+  // The first column to be erased cannot be greater
+  // than the actual number of the columns of the matrix.
+  assert(first_to_erase <= row_size);
+  row_size = first_to_erase;
+  assert(OK());
+}
+
+inline void
+Saturation_Matrix::swap(Saturation_Matrix& y) {
+  std::swap(row_size, y.row_size);
+  std::swap(rows, y.rows);
+}
+
+inline Saturation_Row&
+Saturation_Matrix::operator[](const dimension_type k) {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+inline const Saturation_Row&
+Saturation_Matrix::operator[](const dimension_type k) const {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+inline dimension_type
+Saturation_Matrix::num_columns() const {
+  return row_size;
+}
+
+inline dimension_type
+Saturation_Matrix::num_rows() const {
+  return rows.size();
+}
+
+inline void
+Saturation_Matrix::clear() {
+  // Clear `rows' and minimize its capacity.
+  std::vector<Saturation_Row>().swap(rows);
+  row_size = 0;
+}
+
+inline memory_size_type
+Saturation_Matrix::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Saturation_Matrix::Saturation_Row_Less_Than::
+operator()(const Saturation_Row& x, const Saturation_Row& y) const {
+  return compare(x, y) < 0;
+}
+
+inline bool
+Saturation_Matrix::sorted_contains(const Saturation_Row& row) const {
+  assert(check_sorted());
+  return std::binary_search(rows.begin(), rows.end(), row,
+			    Saturation_Row_Less_Than());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Matrix */
+inline void
+swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
+     Parma_Polyhedra_Library::Saturation_Matrix& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Saturation_Matrix_inlines_hh)
diff --git a/src/Saturation_Matrix.types.hh b/src/Saturation_Matrix.types.hh
new file mode 100644
index 0000000..489b6ea
--- /dev/null
+++ b/src/Saturation_Matrix.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Saturation_Matrix_types_hh
+#define PPL_Saturation_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Saturation_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Saturation_Matrix_types_hh)
diff --git a/src/Saturation_Row.cc b/src/Saturation_Row.cc
new file mode 100644
index 0000000..55c2533
--- /dev/null
+++ b/src/Saturation_Row.cc
@@ -0,0 +1,347 @@
+/* Saturation_Row class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Saturation_Row.defs.hh"
+#include <cassert>
+#include <climits>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#define BITS_PER_GMP_LIMB (SIZEOF_MP_LIMB_T*CHAR_BIT)
+
+#if !HAVE_DECL_FFS || SIZEOF_MP_LIMB_T != SIZEOF_INT
+unsigned int
+PPL::Saturation_Row::first_one(mp_limb_t w) {
+  unsigned int r = 0;
+  w = w & -w;
+#if SIZEOF_MP_LIMB_T == 8
+  if ((w & 0xffffffff) == 0) {
+    w >>= 32;
+    r += 32;
+  }
+#elif SIZEOF_MP_LIMB_T != 4
+#error "Size of mp_limb_t not supported by Saturation_Row::first_one(mp_limb_t w)."
+#endif
+  if ((w & 0xffff) == 0) {
+    w >>= 16;
+    r += 16;
+  }
+  if ((w & 0xff) == 0) {
+    w >>= 8;
+    r += 8;
+  }
+  if (w & 0xf0)
+    r += 4;
+  if (w & 0xcc)
+    r += 2;
+  if (w & 0xaa)
+    r += 1;
+  return r;
+}
+#endif // !HAVE_DECL_FFS || SIZEOF_MP_LIMB_T != SIZEOF_INT
+
+unsigned int
+PPL::Saturation_Row::last_one(mp_limb_t w) {
+  unsigned int r = 0;
+#if SIZEOF_MP_LIMB_T == 8
+  if (w & 0xffffffff00000000) {
+    w >>= 32;
+    r += 32;
+  }
+#elif SIZEOF_MP_LIMB_T != 4
+#error "Size of mp_limb_t not supported by Saturation_Row::last_one(mp_limb_t w)."
+#endif
+  if (w & 0xffff0000) {
+    w >>= 16;
+    r += 16;
+  }
+  if (w & 0xff00) {
+    w >>= 8;
+    r += 8;
+  }
+  if (w & 0xf0) {
+    w >>= 4;
+    r += 4;
+  }
+  if (w & 0xc) {
+    w >>= 2;
+    r += 2;
+  }
+  if (w & 0x2)
+    r += 1;
+  return r;
+}
+
+unsigned long
+PPL::Saturation_Row::first() const {
+  const mp_size_t vec_size = vec->_mp_size;
+  assert(vec_size >= 0);
+  mp_size_t li = 0;
+  mp_srcptr p = vec->_mp_d;
+  for (; li < vec_size; ++li, ++p) {
+    const mp_limb_t limb = *p;
+    if (limb != 0)
+      return li*BITS_PER_GMP_LIMB + first_one(limb);
+  }
+  return ULONG_MAX;
+}
+
+unsigned long
+PPL::Saturation_Row::next(unsigned long position) const {
+  ++position;
+
+  // The alternative implementation using the mpz_scan1() function
+  // of GMP was measured to be slower that ours.  Here it is, in
+  // case mpz_scan1() is improved.
+  //
+  // unsigned long r = mpz_scan1(vec, position);
+  // return (r == ULONG_MAX) ? -1 : r;
+
+  mp_size_t li = position / BITS_PER_GMP_LIMB;
+  const mp_size_t vec_size = vec->_mp_size;
+  assert(vec_size >= 0);
+  if (li >= vec_size)
+    return ULONG_MAX;
+
+  // Get the first limb.
+  mp_srcptr p = vec->_mp_d + li;
+
+  // Mask off any bits before `position' in the first limb.
+  mp_limb_t limb = *p & (~(mp_limb_t) 0) << (position % BITS_PER_GMP_LIMB);
+
+  while (true) {
+    if (limb != 0)
+      return li*BITS_PER_GMP_LIMB + first_one(limb);
+    ++li;
+    if (li == vec_size)
+      break;
+    ++p;
+    limb = *p;
+  }
+  return ULONG_MAX;
+}
+
+unsigned long
+PPL::Saturation_Row::last() const {
+  mp_size_t li = vec->_mp_size;
+  assert(li >= 0);
+  if (li == 0)
+    return ULONG_MAX;
+  --li;
+  const mp_srcptr p = vec->_mp_d + li;
+  const mp_limb_t limb = *p;
+  assert(limb != 0);
+  return li*BITS_PER_GMP_LIMB + last_one(limb);
+}
+
+unsigned long
+PPL::Saturation_Row::prev(unsigned long position) const {
+  if (position == 0)
+    return ULONG_MAX;
+
+  --position;
+
+  const mp_size_t vec_size = vec->_mp_size;
+  assert(vec_size > 0);
+  mp_size_t li = position / BITS_PER_GMP_LIMB;
+
+  mp_limb_t limb;
+  mp_srcptr p = vec->_mp_d;
+
+  // Get the first limb.
+  if (li >= vec_size) {
+    li = vec_size - 1;
+    p += li;
+    limb = *p;
+  }
+  else {
+    const mp_limb_t mask
+      = (~(mp_limb_t) 0)
+      >> (BITS_PER_GMP_LIMB - 1 - position % BITS_PER_GMP_LIMB);
+    p += li;
+    limb = *p & mask;
+  }
+
+  while (true) {
+    if (limb != 0)
+      return li*BITS_PER_GMP_LIMB + last_one(limb);
+    if (li == 0)
+      break;
+    --li;
+    --p;
+    limb = *p;
+  }
+  return ULONG_MAX;
+}
+
+bool
+PPL::Saturation_Row::operator[](const unsigned long k) const {
+  const mp_size_t vec_size = vec->_mp_size;
+  assert(vec_size >= 0);
+
+  unsigned long i = k / GMP_NUMB_BITS;
+  if (i >= static_cast<unsigned long>(vec_size))
+    return false;
+
+  mp_limb_t limb = *(vec->_mp_d + i);
+  return (limb >> (k % GMP_NUMB_BITS)) & 1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+int
+PPL::compare(const Saturation_Row& x, const Saturation_Row& y) {
+  const mp_size_t x_size = x.vec->_mp_size;
+  assert(x_size >= 0);
+  const mp_size_t y_size = y.vec->_mp_size;
+  assert(y_size >= 0);
+  mp_size_t size = (x_size > y_size ? y_size : x_size);
+  mp_srcptr xp = x.vec->_mp_d;
+  mp_srcptr yp = y.vec->_mp_d;
+  while (size > 0) {
+    const mp_limb_t xl = *xp;
+    const mp_limb_t yl = *yp;
+    if (xl != yl) {
+      // Get the one's where they are different.
+      const mp_limb_t diff = xl ^ yl;
+      // First bit that is different.
+      const mp_limb_t mask = diff & ~(diff-1);
+      return (xl & mask) ? 1 : -1;
+    }
+    ++xp;
+    ++yp;
+    --size;
+  }
+  return x_size == y_size ? 0 : (x_size > y_size ? 1 : -1);
+}
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+bool
+PPL::subset_or_equal(const Saturation_Row& x, const Saturation_Row& y) {
+  mp_size_t x_size = x.vec->_mp_size;
+  assert(x_size >= 0);
+  mp_size_t y_size = y.vec->_mp_size;
+  assert(y_size >= 0);
+  if (x_size > y_size)
+    return false;
+  mp_srcptr xp = x.vec->_mp_d;
+  mp_srcptr yp = y.vec->_mp_d;
+  while (x_size > 0) {
+    if (*xp & ~*yp)
+      return false;
+    ++xp;
+    ++yp;
+    --x_size;
+  }
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+bool
+PPL::subset_or_equal(const Saturation_Row& x, const Saturation_Row& y,
+		     bool& strict_subset) {
+  mp_size_t x_size = x.vec->_mp_size;
+  assert(x_size >= 0);
+  mp_size_t y_size = y.vec->_mp_size;
+  assert(y_size >= 0);
+  if (x_size > y_size)
+    return false;
+  strict_subset = (x_size < y_size);
+  mp_srcptr xp = x.vec->_mp_d;
+  mp_srcptr yp = y.vec->_mp_d;
+  while (x_size > 0) {
+    const mp_limb_t xl = *xp;
+    const mp_limb_t yl = *yp;
+    if (xl & ~yl)
+      return false;
+    if (!strict_subset && xl != yl)
+      strict_subset = true;
+    ++xp;
+    ++yp;
+    --x_size;
+  }
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+bool
+PPL::strict_subset(const Saturation_Row& x, const Saturation_Row& y) {
+  mp_size_t x_size = x.vec->_mp_size;
+  assert(x_size >= 0);
+  mp_size_t y_size = y.vec->_mp_size;
+  assert(y_size >= 0);
+  if (x_size > y_size)
+    return false;
+  bool different = (x_size < y_size);
+  mp_srcptr xp = x.vec->_mp_d;
+  mp_srcptr yp = y.vec->_mp_d;
+  while (x_size > 0) {
+    const mp_limb_t xl = *xp;
+    const mp_limb_t yl = *yp;
+    if (xl & ~yl)
+      return false;
+    if (!different && xl != yl)
+      different = true;
+    ++xp;
+    ++yp;
+    --x_size;
+  }
+  return different;
+}
+
+/*! \relates Saturation_Row */
+bool
+PPL::operator==(const Saturation_Row& x, const Saturation_Row& y) {
+  const mp_size_t x_vec_size = x.vec->_mp_size;
+  assert(x_vec_size >= 0);
+  const mp_size_t y_vec_size = y.vec->_mp_size;
+  assert(y_vec_size >= 0);
+
+  if (x_vec_size != y_vec_size)
+    return false;
+
+  return mpn_cmp(x.vec->_mp_d, y.vec->_mp_d, x_vec_size) == 0;
+}
+
+/*! \relates Saturation_Row */
+bool
+PPL::operator!=(const Saturation_Row& x, const Saturation_Row& y) {
+  const mp_size_t x_vec_size = x.vec->_mp_size;
+  assert(x_vec_size >= 0);
+  const mp_size_t y_vec_size = y.vec->_mp_size;
+  assert(y_vec_size >= 0);
+
+  if (x_vec_size != y_vec_size)
+    return true;
+
+  return mpn_cmp(x.vec->_mp_d, y.vec->_mp_d, x_vec_size) != 0;
+}
+
+bool
+PPL::Saturation_Row::OK() const {
+  const mp_size_t vec_size = vec->_mp_size;
+  const mp_size_t vec_alloc = vec->_mp_alloc;
+  return vec_size >= 0
+    && vec_alloc >= vec_size
+    && (vec_size == 0 || mpz_getlimbn(vec, vec_size-1) != 0);
+}
diff --git a/src/Saturation_Row.defs.hh b/src/Saturation_Row.defs.hh
new file mode 100644
index 0000000..29c6d14
--- /dev/null
+++ b/src/Saturation_Row.defs.hh
@@ -0,0 +1,239 @@
+/* Saturation_Row class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Saturation_Row_defs_hh
+#define PPL_Saturation_Row_defs_hh 1
+
+#include "Saturation_Row.types.hh"
+#include "globals.types.hh"
+#include <iosfwd>
+#include <gmp.h>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friends later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator==(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator!=(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Saturation_Row
+  Compares \p x with \p y starting from the least significant bits.
+  The ordering is total and has the following property: if \p x and \p y
+  are two rows seen as sets of naturals, if \p x is a strict subset
+  of \p y, then \p x comes before \p y.
+
+  Returns
+  - -1 if \p x comes before \p y in the ordering;
+  -  0 if \p x and \p y are equal;
+  -  1 if \p x comes after \p y in the ordering.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+int compare(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic inclusion test.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool subset_or_equal(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Set-theoretic inclusion test: sets \p strict_subset to a boolean
+  indicating whether the inclusion is strict or not.
+
+  \relates Saturation_Row
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool subset_or_equal(const Saturation_Row& x, const Saturation_Row& y,
+		     bool& strict_subset);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic strict inclusion test.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool strict_subset(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic union.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void set_union(const Saturation_Row& x,
+	       const Saturation_Row& y,
+	       Saturation_Row& z);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A row of a saturation matrix.
+/*! \ingroup PPL_CXX_interface
+  An object of this class represents a single row of a saturation matrix.
+  The saturation row corresponds to a constraint and a system of generators
+  (resp., a generator and a system of constraints) and records whether or
+  not the constraint is saturated by each one of the generators (resp.,
+  the generator saturates each one of the constraints).
+
+  The saturation relation is encoded by using a bitset, so that the
+  constraint is saturated by the \f$i\f$-th generator in the system
+  (resp., the generator saturates the \f$i\f$-th constraint in the system)
+  if and only if the \f$i\f$-th bit is not set.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Saturation_Row {
+public:
+  //! Default constructor.
+  Saturation_Row();
+
+  //! Copy-constructor.
+  Saturation_Row(const Saturation_Row& y);
+
+  //! Destructor.
+  ~Saturation_Row();
+
+  //! Assignment operator.
+  Saturation_Row& operator=(const Saturation_Row& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Saturation_Row& y);
+
+  //! Returns the truth value corresponding to the bit in position \p k.
+  bool operator[](unsigned long k) const;
+
+  //! Sets the bit in position \p k.
+  void set(unsigned long k);
+
+  //! Clears the bit in position \p k.
+  void clear(unsigned long k);
+
+  //! Clears bits from position \p k (included) onward.
+  void clear_from(unsigned long k);
+
+  //! Clears all the bits of the row.
+  void clear();
+
+  friend int
+  Parma_Polyhedra_Library::compare(const Saturation_Row& x,
+				   const Saturation_Row& y);
+
+  friend bool
+  Parma_Polyhedra_Library::operator==(const Saturation_Row& x,
+				      const Saturation_Row& y);
+
+  friend bool
+  Parma_Polyhedra_Library::operator!=(const Saturation_Row& x,
+				      const Saturation_Row& y);
+
+  friend bool
+  Parma_Polyhedra_Library::subset_or_equal(const Saturation_Row& x,
+					   const Saturation_Row& y);
+
+  friend bool
+  Parma_Polyhedra_Library::subset_or_equal(const Saturation_Row& x,
+					   const Saturation_Row& y,
+					   bool& strict_subset);
+
+  friend bool
+  Parma_Polyhedra_Library::strict_subset(const Saturation_Row& x,
+					 const Saturation_Row& y);
+
+  friend void
+  Parma_Polyhedra_Library::set_union(const Saturation_Row& x,
+				     const Saturation_Row& y,
+				     Saturation_Row& z);
+
+  //! Returns the index of the first set bit or ULONG_MAX if no bit is set.
+  unsigned long first() const;
+
+  /*! \brief
+    Returns the index of the first set bit after \p position
+    or ULONG_MAX if no bit after \p position is set.
+  */
+  unsigned long next(unsigned long position) const;
+
+  //! Returns the index of the last set bit or ULONG_MAX if no bit is set.
+  unsigned long last() const;
+
+  /*! \brief
+    Returns the index of the first set bit before \p position
+    or ULONG_MAX if no bits before \p position is set.
+  */
+  unsigned long prev(unsigned long position) const;
+
+  //! Returns the number of set bits in the row.
+  unsigned long count_ones() const;
+
+  //! Returns <CODE>true</CODE> if no bit is set in the row.
+  bool empty() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied
+  bool OK() const;
+
+private:
+  //! Bit-vector representing the row.
+  mpz_t vec;
+
+  //! Assuming \p w is nonzero, returns the index of the first set bit in \p w.
+  static unsigned int first_one(mp_limb_t w);
+
+  //! Assuming \p w is nonzero, returns the index of the last set bit in \p w.
+  static unsigned int last_one(mp_limb_t w);
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Saturation_Row& x,
+	  Parma_Polyhedra_Library::Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void
+iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y);
+
+} // namespace std
+
+#include "Saturation_Row.inlines.hh"
+
+#endif // !defined(PPL_Saturation_Row_defs_hh)
diff --git a/src/Saturation_Row.inlines.hh b/src/Saturation_Row.inlines.hh
new file mode 100644
index 0000000..e8e9d4f
--- /dev/null
+++ b/src/Saturation_Row.inlines.hh
@@ -0,0 +1,136 @@
+/* Saturation_Row class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Saturation_Row_inlines_hh
+#define PPL_Saturation_Row_inlines_hh 1
+
+#include <cassert>
+// For the declaration of ffs(3).
+#include <cstring>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Saturation_Row::Saturation_Row() {
+  mpz_init(vec);
+}
+
+inline
+Saturation_Row::Saturation_Row(const Saturation_Row& y) {
+  mpz_init_set(vec, y.vec);
+}
+
+inline
+Saturation_Row::~Saturation_Row() {
+  mpz_clear(vec);
+}
+
+inline Saturation_Row&
+Saturation_Row::operator=(const Saturation_Row& y) {
+  mpz_set(vec, y.vec);
+  return *this;
+}
+
+inline void
+Saturation_Row::set(const unsigned long k) {
+  mpz_setbit(vec, k);
+}
+
+inline void
+Saturation_Row::clear(const unsigned long k) {
+  mpz_clrbit(vec, k);
+}
+
+inline void
+Saturation_Row::clear_from(const unsigned long k) {
+  mpz_tdiv_r_2exp(vec, vec, k);
+}
+
+inline unsigned long
+Saturation_Row::count_ones() const {
+  assert(vec->_mp_size >= 0);
+  return mpn_popcount(vec->_mp_d, vec->_mp_size);
+}
+
+inline bool
+Saturation_Row::empty() const {
+  return mpz_sgn(vec) == 0;
+}
+
+inline void
+Saturation_Row::swap(Saturation_Row& y) {
+  mpz_swap(vec, y.vec);
+}
+
+inline void
+Saturation_Row::clear() {
+  mpz_set_ui(vec, 0UL);
+}
+
+inline memory_size_type
+Saturation_Row::external_memory_in_bytes() const {
+  return vec[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+Saturation_Row::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+#if HAVE_DECL_FFS && SIZEOF_MP_LIMB_T == SIZEOF_INT
+
+inline unsigned int
+Saturation_Row::first_one(mp_limb_t w) {
+  return ffs(w)-1;
+}
+
+#endif
+
+/*! \relates Saturation_Row */
+inline void
+set_union(const Saturation_Row& x, const Saturation_Row& y,
+	  Saturation_Row& z) {
+  mpz_ior(z.vec, x.vec, y.vec);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+inline void
+swap(Parma_Polyhedra_Library::Saturation_Row& x,
+     Parma_Polyhedra_Library::Saturation_Row& y) {
+  x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Saturation_Row_inlines_hh)
diff --git a/src/Saturation_Row.types.hh b/src/Saturation_Row.types.hh
new file mode 100644
index 0000000..8a97747
--- /dev/null
+++ b/src/Saturation_Row.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Saturation_Row_types_hh
+#define PPL_Saturation_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Saturation_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Saturation_Row_types_hh)
diff --git a/src/Scalar_Products.cc b/src/Scalar_Products.cc
new file mode 100644
index 0000000..0c9dec3
--- /dev/null
+++ b/src/Scalar_Products.cc
@@ -0,0 +1,121 @@
+/* Scalar_Products class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Scalar_Products.defs.hh"
+#include "Coefficient.defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+			     const Linear_Row& x, const Linear_Row& y) {
+  // Scalar product is only defined  if `x' and `y' are
+  // dimension-compatible.
+  assert(x.size() <= y.size());
+  z = 0;
+  for (dimension_type i = x.size(); i-- > 0; )
+    // The following line optimizes the computation of z += x[i] * y[i].
+    add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+			     const Grid_Generator& x, const Congruence& y) {
+  // Scalar product is only defined if `x' and `y' are
+  // dimension-compatible.
+  assert(x.size() <= y.size());
+  z = 0;
+  for (dimension_type i = x.size() - 1 /* parameter divisor */; i-- > 0; )
+    // The following line optimizes the computation of z += x[i] *
+    // y[i].
+    add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+			     const Congruence& x, const Grid_Generator& y) {
+  // Scalar product is only defined if `x' and `y' are
+  // dimension-compatible.
+  assert(x.size() <= y.size());
+  z = 0;
+  for (dimension_type i = x.size() - 1; i-- > 0; )
+    // The following line optimizes the computation of z += x[i] *
+    // y[i].
+    add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::reduced_assign(Coefficient& z,
+				     const Linear_Row& x,
+				     const Linear_Row& y) {
+  // The reduced scalar product is only defined
+  // if the topology of `x' is NNC and `y' has enough coefficients.
+  assert(!x.is_necessarily_closed());
+  assert(x.size() - 1 <= y.size());
+  z = 0;
+  for (dimension_type i = x.size() - 1; i-- > 0; )
+    // The following line optimizes the computation of z += x[i] * y[i].
+    add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::reduced_assign(Coefficient& z,
+				     const Grid_Generator& x,
+				     const Congruence& y) {
+  // The reduced scalar product is only defined if the topology of `x'
+  // is NNC and `y' has enough coefficients.
+  assert(x.size() <= y.size());
+  z = 0;
+  for (dimension_type i = x.size() - 1; i-- > 0; )
+    // The following line optimizes z += x[i] * y[i].
+    add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::homogeneous_assign(Coefficient& z,
+					 const Linear_Row& x,
+					 const Linear_Row& y) {
+  // Scalar product is only defined  if `x' and `y' are
+  // dimension-compatible.
+  assert(x.size() <= y.size());
+  z = 0;
+    // Note the pre-decrement of `i': last iteration should be for `i == 1'.
+  for (dimension_type i = x.size(); --i > 0; )
+    // The following line optimizes the computation of z += x[i] * y[i].
+    add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::homogeneous_assign(Coefficient& z,
+					 const Grid_Generator& x,
+					 const Congruence& y) {
+  // Scalar product is only defined if `x' and `y' are
+  // dimension-compatible.
+  assert(x.size() <= y.size());
+  z = 0;
+  // Note the pre-decrement of `i': last iteration should be for `i == 1'.
+  for (dimension_type i = x.size() - 1; --i > 0; )
+    // The following line optimizes the computation of z += x[i] * y[i].
+    add_mul_assign(z, x[i], y[i]);
+}
diff --git a/src/Scalar_Products.defs.hh b/src/Scalar_Products.defs.hh
new file mode 100644
index 0000000..c22a3f8
--- /dev/null
+++ b/src/Scalar_Products.defs.hh
@@ -0,0 +1,182 @@
+/* Scalar_Products class definition.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Scalar_Products_defs_hh
+#define PPL_Scalar_Products_defs_hh 1
+
+#include "Scalar_Products.types.hh"
+#include "Linear_Row.types.hh"
+#include "Coefficient.types.hh"
+#include "Linear_Expression.types.hh"
+#include "Constraint.types.hh"
+#include "Generator.types.hh"
+#include "Congruence.types.hh"
+#include "Grid_Generator.types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class implementing various scalar product functions.
+/*! \ingroup PPL_CXX_interface
+  When computing the scalar product of (Linear_Row or Constraint or
+  Generator) objects <CODE>x</CODE> and <CODE>y</CODE>, it is assumed
+  that the space dimension of the first object <CODE>x</CODE> is less
+  than or equal to the space dimension of the second object <CODE>y</CODE>.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Scalar_Products {
+public:
+  //! Computes the scalar product of \p x and \p y and assigns it to \p z.
+  static void assign(Coefficient& z, const Linear_Row& x, const Linear_Row& y);
+  //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+  static void assign(Coefficient& z, const Constraint& c, const Generator& g);
+  //! Computes the scalar product of \p g and \p c and assigns it to \p z.
+  static void assign(Coefficient& z, const Generator& g, const Constraint& c);
+  //! Computes the scalar product of \p g and \p cg and assigns it to \p z.
+  static void assign(Coefficient& z,
+		     const Grid_Generator& g, const Congruence& cg);
+  //! Computes the scalar product of \p cg and \p g and assigns it to \p z.
+  static void assign(Coefficient& z,
+		     const Congruence& cg, const Grid_Generator& g);
+
+  //! Returns the sign of the scalar product between \p x and \p y.
+  static int sign(const Linear_Row& x, const Linear_Row& y);
+  //! Returns the sign of the scalar product between \p c and \p g.
+  static int sign(const Constraint& c, const Generator& g);
+  //! Returns the sign of the scalar product between \p g and \p c.
+  static int sign(const Generator& g, const Constraint& c);
+
+  /*! \brief
+    Computes the \e reduced scalar product of \p x and \p y,
+    where the \f$\epsilon\f$ coefficient of \p x is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+			     const Linear_Row& x, const Linear_Row& y);
+  /*! \brief
+    Computes the \e reduced scalar product of \p c and \p g,
+    where the \f$\epsilon\f$ coefficient of \p c is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+			     const Constraint& c, const Generator& g);
+  /*! \brief
+    Computes the \e reduced scalar product of \p g and \p c,
+    where the \f$\epsilon\f$ coefficient of \p g is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+			     const Generator& g, const Constraint& c);
+  //! \brief
+  //! Computes the \e reduced scalar product of \p g and \p cg,
+  //! where the \f$\epsilon\f$ coefficient of \p g is ignored,
+  //! and assigns the result to \p z.
+  static void reduced_assign(Coefficient& z,
+			     const Grid_Generator& g, const Congruence& cg);
+
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p x and \p y,
+    where the \f$\epsilon\f$ coefficient of \p x is ignored.
+  */
+  static int reduced_sign(const Linear_Row& x, const Linear_Row& y);
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p c and \p g,
+    where the \f$\epsilon\f$ coefficient of \p c is ignored.
+  */
+  static int reduced_sign(const Constraint& c, const Generator& g);
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p g and \p c,
+    where the \f$\epsilon\f$ coefficient of \p g is ignored.
+  */
+  static int reduced_sign(const Generator& g, const Constraint& c);
+
+  /*! \brief
+    Computes the \e homogeneous scalar product of \p x and \p y,
+    where the inhomogeneous terms are ignored,
+    and assigns the result to \p z.
+  */
+  static void homogeneous_assign(Coefficient& z,
+				 const Linear_Row& x, const Linear_Row& y);
+  /*! \brief
+    Computes the \e homogeneous scalar product of \p e and \p g,
+    where the inhomogeneous terms are ignored,
+    and assigns the result to \p z.
+  */
+  static void homogeneous_assign(Coefficient& z,
+				 const Linear_Expression& e,
+				 const Generator& g);
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p g and \p cg,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+				 const Grid_Generator& g, const Congruence& cg);
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p e and \p g,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+				 const Linear_Expression& e,
+				 const Grid_Generator& g);
+
+  /*! \brief
+    Returns the sign of the \e homogeneous scalar product of \p x and \p y,
+    where the inhomogeneous terms are ignored.
+  */
+  static int homogeneous_sign(const Linear_Row& x, const Linear_Row& y);
+  /*! \brief
+    Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+    where the inhomogeneous terms are ignored.
+  */
+  static int homogeneous_sign(const Linear_Expression& e, const Generator& g);
+  //! \brief
+  //! Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+  //! where the inhomogeneous terms are ignored,
+  static int homogeneous_sign(const Linear_Expression& e,
+			      const Grid_Generator& g);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Scalar product sign function object depending on topology.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign {
+public:
+  //! Constructs the function object according to the topology of \p c.
+  Topology_Adjusted_Scalar_Product_Sign(const Constraint& c);
+  //! Constructs the function object according to the topology of \p g.
+  Topology_Adjusted_Scalar_Product_Sign(const Generator& g);
+
+  //! Computes the (topology adjusted) scalar product sign of \p c and \p g.
+  int operator()(const Constraint&, const Generator&) const;
+  //! Computes the (topology adjusted) scalar product sign of \p g and \p c.
+  int operator()(const Generator&, const Constraint&) const;
+
+private:
+  //! The type of the scalar product sign function pointer.
+  typedef int (*SPS_type)(const Linear_Row&, const Linear_Row&);
+
+  //! The scalar product sign function pointer.
+  SPS_type sps_fp;
+};
+
+#include "Scalar_Products.inlines.hh"
+
+#endif // !defined(PPL_Scalar_Products_defs_hh)
diff --git a/src/Scalar_Products.inlines.hh b/src/Scalar_Products.inlines.hh
new file mode 100644
index 0000000..95bb409
--- /dev/null
+++ b/src/Scalar_Products.inlines.hh
@@ -0,0 +1,152 @@
+/* Scalar_Products class implementation (inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Scalar_Products_inlines_hh
+#define PPL_Scalar_Products_inlines_hh 1
+
+#include "Linear_Row.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint.defs.hh"
+#include "Generator.defs.hh"
+#include "Congruence.defs.hh"
+#include "Grid_Generator.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+Scalar_Products::sign(const Linear_Row& x, const Linear_Row& y) {
+  TEMP_INTEGER(z);
+  assign(z, x, y);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Linear_Row& x, const Linear_Row& y) {
+  TEMP_INTEGER(z);
+  reduced_assign(z, x, y);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Row& x, const Linear_Row& y) {
+  TEMP_INTEGER(z);
+  homogeneous_assign(z, x, y);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::sign(const Constraint& c, const Generator& g) {
+  return sign(static_cast<const Linear_Row&>(c),
+	      static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::sign(const Generator& g, const Constraint& c) {
+  return sign(static_cast<const Linear_Row&>(g),
+	      static_cast<const Linear_Row&>(c));
+}
+
+inline int
+Scalar_Products::reduced_sign(const Constraint& c, const Generator& g) {
+  return reduced_sign(static_cast<const Linear_Row&>(c),
+		      static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::reduced_sign(const Generator& g, const Constraint& c) {
+  return reduced_sign(static_cast<const Linear_Row&>(g),
+		      static_cast<const Linear_Row&>(c));
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+				    const Linear_Expression& e,
+				    const Generator& g) {
+  homogeneous_assign(z,
+		     static_cast<const Linear_Row&>(e),
+		     static_cast<const Linear_Row&>(g));
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+				    const Linear_Expression& e,
+				    const Grid_Generator& g) {
+  homogeneous_assign(z,
+		     static_cast<const Linear_Row&>(e),
+		     static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+				  const Generator& g) {
+  return homogeneous_sign(static_cast<const Linear_Row&>(e),
+			  static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+				  const Grid_Generator& g) {
+  return homogeneous_sign(static_cast<const Linear_Row&>(e),
+			  static_cast<const Linear_Row&>(g));
+}
+
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Constraint& c)
+  : sps_fp(c.is_necessarily_closed()
+	   ? static_cast<SPS_type>(&Scalar_Products::sign)
+	   : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
+}
+
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Generator& g)
+  : sps_fp(g.is_necessarily_closed()
+	   ? static_cast<SPS_type>(&Scalar_Products::sign)
+	   : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Constraint& c,
+						  const Generator& g) const {
+  assert(c.space_dimension() <= g.space_dimension());
+  assert(sps_fp == (c.is_necessarily_closed()
+		    ? static_cast<SPS_type>(&Scalar_Products::sign)
+		    : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+  return sps_fp(static_cast<const Linear_Row&>(c),
+		static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Generator& g,
+						  const Constraint& c) const {
+  assert(g.space_dimension() <= c.space_dimension());
+  assert(sps_fp == (g.is_necessarily_closed()
+		    ? static_cast<SPS_type>(&Scalar_Products::sign)
+		    : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+  return sps_fp(static_cast<const Linear_Row&>(g),
+		static_cast<const Linear_Row&>(c));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Scalar_Products_inlines_hh)
diff --git a/src/Scalar_Products.types.hh b/src/Scalar_Products.types.hh
new file mode 100644
index 0000000..b363999
--- /dev/null
+++ b/src/Scalar_Products.types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Scalar_Products_types_hh
+#define PPL_Scalar_Products_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Scalar_Products;
+class Topology_Adjusted_Scalar_Product_Sign;
+class Topology_Adjusted_Scalar_Product_Assign;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Scalar_Products_types_hh)
diff --git a/src/Topology.hh b/src/Topology.hh
new file mode 100644
index 0000000..1c9d7a2
--- /dev/null
+++ b/src/Topology.hh
@@ -0,0 +1,28 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Topology_hh
+#define PPL_Topology_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Kinds of polyhedra domains.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+enum Topology {
+  NECESSARILY_CLOSED = 0,
+  NOT_NECESSARILY_CLOSED = 1
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Topology_hh)
diff --git a/src/Variable.cc b/src/Variable.cc
new file mode 100644
index 0000000..f6707ed
--- /dev/null
+++ b/src/Variable.cc
@@ -0,0 +1,52 @@
+/* Variable class implementation (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Variable.defs.hh"
+
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Variable::output_function_type*
+PPL::Variable::current_output_function = 0;
+
+bool
+PPL::Variable::OK() const {
+  return id() < max_space_dimension();
+}
+
+void
+PPL::Variable::default_output_function(std::ostream& s, const Variable& v) {
+  dimension_type varid = v.id();
+  s << static_cast<char>('A' + varid % 26);
+  if (dimension_type i = varid / 26)
+    s << i;
+}
+
+/*! \relates Parma_Polyhedra_Library::Variable */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Variable& v) {
+  (*Variable::current_output_function)(s, v);
+  return s;
+}
diff --git a/src/Variable.defs.hh b/src/Variable.defs.hh
new file mode 100644
index 0000000..ae623c9
--- /dev/null
+++ b/src/Variable.defs.hh
@@ -0,0 +1,156 @@
+/* Variable class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Variable_defs_hh
+#define PPL_Variable_defs_hh 1
+
+#include "Variable.types.hh"
+#include "Init.types.hh"
+#include "globals.types.hh"
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variable */
+std::ostream&
+operator<<(std::ostream& s, const Variable& v);
+
+} // namespace IO_Operators
+
+//! Defines a total ordering on variables.
+/*! \relates Variable */
+bool less(Variable v, Variable w);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A dimension of the vector space.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Variable represents a dimension of the space,
+  that is one of the Cartesian axes.
+  Variables are used as basic blocks in order to build
+  more complex linear expressions.
+  Each variable is identified by a non-negative integer,
+  representing the index of the corresponding Cartesian axis
+  (the first axis has index 0).
+  The space dimension of a variable is the dimension of the vector space
+  made by all the Cartesian axes having an index less than or equal to
+  that of the considered variable; thus, if a variable has index \f$i\f$,
+  its space dimension is \f$i+1\f$.
+
+  Note that the ``meaning'' of an object of the class Variable
+  is completely specified by the integer index provided to its
+  constructor:
+  be careful not to be mislead by C++ language variable names.
+  For instance, in the following example the linear expressions
+  <CODE>e1</CODE> and <CODE>e2</CODE> are equivalent,
+  since the two variables <CODE>x</CODE> and <CODE>z</CODE> denote
+  the same Cartesian axis.
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(0);
+  Linear_Expression e1 = x + y;
+  Linear_Expression e2 = y + z;
+  \endcode
+
+*/
+class Parma_Polyhedra_Library::Variable {
+
+public:
+  //! Builds the variable corresponding to the Cartesian axis of index \p i.
+  /*!
+    \exception std::length_error
+    Thrown if the <CODE>i+1</CODE> exceeds
+    <CODE>Variable::max_space_dimension()</CODE>.
+  */
+  explicit Variable(dimension_type i);
+
+  //! Returns the index of the Cartesian axis associated to the variable.
+  dimension_type id() const;
+
+  //! Returns the maximum space dimension a Variable can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  /*!
+    The returned value is <CODE>id()+1</CODE>.
+  */
+  dimension_type space_dimension() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Type of output functions.
+  typedef void output_function_type(std::ostream& s, const Variable& v);
+
+  //! Sets the output function to be used for printing Variable objects.
+  static void set_output_function(output_function_type* p);
+
+  //! Returns the pointer to the current output function.
+  static output_function_type* get_output_function();
+
+  //! Binary predicate defining the total ordering on variables.
+  /*! \ingroup PPL_CXX_interface */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(Variable x, Variable y) const;
+  };
+
+private:
+  //! The index of the Cartesian axis.
+  dimension_type varid;
+
+  // The initialization class needs to set the default output function.
+  friend class Init;
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+						    const Variable& v);
+
+  //! Pointer to the current output function.
+  static output_function_type* current_output_function;
+
+  //! The default output function.
+  static void default_output_function(std::ostream& s, const Variable& v);
+};
+
+#include "Variable.inlines.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! An std::set containing variables in increasing order of dimension index.
+/*! \ingroup PPL_CXX_interface */
+typedef std::set<Variable, Variable::Compare> Variables_Set;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variable_defs_hh)
diff --git a/src/Variable.inlines.hh b/src/Variable.inlines.hh
new file mode 100644
index 0000000..7be957c
--- /dev/null
+++ b/src/Variable.inlines.hh
@@ -0,0 +1,88 @@
+/* Variable class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Variable_inlines_hh
+#define PPL_Variable_inlines_hh 1
+
+#include "globals.defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Variable::max_space_dimension() {
+  return not_a_dimension() - 1;
+}
+
+inline
+Variable::Variable(dimension_type i)
+  : varid(i < max_space_dimension()
+	  ? i
+	  : (throw std::length_error("PPL::Variable::Variable(i):\n"
+				     "i exceeds the maximum allowed "
+				     "variable identifier."), i)) {
+}
+
+inline dimension_type
+Variable::id() const {
+  return varid;
+}
+
+inline dimension_type
+Variable::space_dimension() const {
+  return varid + 1;
+}
+
+inline memory_size_type
+Variable::external_memory_in_bytes() const {
+  return 0;
+}
+
+inline memory_size_type
+Variable::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Variable::set_output_function(output_function_type* p) {
+  current_output_function = p;
+}
+
+inline Variable::output_function_type*
+Variable::get_output_function() {
+  return current_output_function;
+}
+
+/*! \relates Variable */
+inline bool
+less(const Variable v, const Variable w) {
+  return v.id() < w.id();
+}
+
+inline bool
+Variable::Compare::operator()(const Variable x, const Variable y) const {
+  return less(x, y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variable_inlines_hh)
diff --git a/src/Variable.types.hh b/src/Variable.types.hh
new file mode 100644
index 0000000..58d4a05
--- /dev/null
+++ b/src/Variable.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Variable_types_hh
+#define PPL_Variable_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Variable;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variable_types_hh)
diff --git a/src/Widening_Function.defs.hh b/src/Widening_Function.defs.hh
new file mode 100644
index 0000000..4b95190
--- /dev/null
+++ b/src/Widening_Function.defs.hh
@@ -0,0 +1,126 @@
+/* Widening_Function class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Widening_Function_defs_hh
+#define PPL_Widening_Function_defs_hh 1
+
+#include "Widening_Function.types.hh"
+#include "Constraint_System.types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+class Parma_Polyhedra_Library::Widening_Function {
+public:
+  //! The (parametric) type of a widening method.
+  typedef void (PH::* Widening_Method)(const PH&, unsigned*);
+
+  //! Explicit unary constructor.
+  explicit
+  Widening_Function(Widening_Method wm);
+
+  //! Function-application operator.
+  /*!
+    Computes <CODE>(x.*wm)(y, tp)</CODE>, where \p wm is the widening
+    method stored at construction time.
+  */
+  void operator()(PH& x, const PH& y, unsigned* tp = 0) const;
+
+private:
+  //! The widening method.
+  Widening_Method w_method;
+};
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a limited widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH, typename CS>
+class Parma_Polyhedra_Library::Limited_Widening_Function {
+public:
+  //! The (parametric) type of a limited widening method.
+  typedef void (PH::* Limited_Widening_Method)(const PH&,
+					       const CS&,
+					       unsigned*);
+
+  //! Constructor.
+  /*!
+    \param lwm
+    The limited widening method.
+
+    \param cs
+    The constraint system limiting the widening.
+  */
+  Limited_Widening_Function(Limited_Widening_Method lwm,
+			    const CS& cs);
+
+  //! Function-application operator.
+  /*!
+    Computes <CODE>(x.*lwm)(y, cs, tp)</CODE>, where \p lwm and \p cs
+    are the limited widening method and the constraint system stored
+    at construction time.
+  */
+  void operator()(PH& x, const PH& y, unsigned* tp = 0) const;
+
+private:
+  //! The limited widening method.
+  Limited_Widening_Method lw_method;
+  //! A constant reference to the constraint system limiting the widening.
+  const CS& limiting_cs;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Wraps a widening method into a function object.
+/*!
+  \relates Polyhedra_Powerset
+
+  \param wm
+  The widening method.
+*/
+template <typename PH>
+Widening_Function<PH>
+widen_fun_ref(void (PH::* wm)(const PH&, unsigned*));
+
+//! Wraps a limited widening method into a function object.
+/*!
+  \relates Polyhedra_Powerset
+
+  \param lwm
+  The limited widening method.
+
+  \param cs
+  The constraint system limiting the widening.
+*/
+template <typename PH, typename CS>
+Limited_Widening_Function<PH, CS>
+widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
+	      const CS& cs);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Widening_Function.inlines.hh"
+
+#endif // !defined(PPL_Widening_Function_defs_hh)
diff --git a/src/Widening_Function.inlines.hh b/src/Widening_Function.inlines.hh
new file mode 100644
index 0000000..33d254d
--- /dev/null
+++ b/src/Widening_Function.inlines.hh
@@ -0,0 +1,74 @@
+/* Widening_Function class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Widening_Function_inlines_hh
+#define PPL_Widening_Function_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+Widening_Function<PH>::Widening_Function(Widening_Method wm)
+  : w_method(wm) {
+}
+
+template <typename PH>
+inline void
+Widening_Function<PH>::
+operator()(PH& x, const PH& y, unsigned* tp) const {
+  (x.*w_method)(y, tp);
+}
+
+template <typename PH, typename CS>
+Limited_Widening_Function<PH, CS>::
+Limited_Widening_Function(Limited_Widening_Method lwm,
+			  const CS& cs)
+  : lw_method(lwm), limiting_cs(cs) {
+}
+
+template <typename PH, typename CS>
+inline void
+Limited_Widening_Function<PH, CS>::
+operator()(PH& x, const PH& y, unsigned* tp) const {
+  (x.*lw_method)(y, limiting_cs, tp);
+}
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH>
+inline Widening_Function<PH>
+widen_fun_ref(void (PH::* wm)(const PH&, unsigned*)) {
+  return Widening_Function<PH>(wm);
+}
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH, typename CS>
+inline Limited_Widening_Function<PH, CS>
+widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
+	      const CS& cs) {
+  return Limited_Widening_Function<PH, CS>(lwm, cs);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+#endif // !defined(PPL_Widening_Function_inlines_hh)
diff --git a/src/Widening_Function.types.hh b/src/Widening_Function.types.hh
new file mode 100644
index 0000000..2bc68b8
--- /dev/null
+++ b/src/Widening_Function.types.hh
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Widening_Function_types_hh
+#define PPL_Widening_Function_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+class Widening_Function;
+
+template <typename PH, typename CS>
+class Limited_Widening_Function;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Widening_Function_types_hh)
diff --git a/src/algorithms.hh b/src/algorithms.hh
new file mode 100644
index 0000000..37f0eca
--- /dev/null
+++ b/src/algorithms.hh
@@ -0,0 +1,71 @@
+/* A collection of useful convex polyhedra algorithms: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_algorithms_hh
+#define PPL_algorithms_hh 1
+
+#include "NNC_Polyhedron.defs.hh"
+#include "Polyhedra_Powerset.defs.hh"
+#include <utility>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If the poly-hull of \p p and \p q is exact it is assigned
+  to \p p and <CODE>true</CODE> is returned,
+  otherwise <CODE>false</CODE> is returned.
+
+  \relates Polyhedron
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Polyhedron */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q) {
+  PH phull = p;
+  NNC_Polyhedron nnc_p(p);
+  phull.poly_hull_assign(q);
+  std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+    partition = linear_partition(q, phull);
+  const Polyhedra_Powerset<NNC_Polyhedron>& s = partition.second;
+  typedef Polyhedra_Powerset<NNC_Polyhedron>::const_iterator iter;
+  for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i)
+    // The polyhedral hull is exact if and only if all the elements
+    // of the partition of the polyhedral hull of `p' and `q' with
+    // respect to `q' are included in `p'
+    if (!nnc_p.contains(i->element()))
+      return false;
+  p = phull;
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_algorithms_hh)
diff --git a/src/checked.cc b/src/checked.cc
new file mode 100644
index 0000000..bb79ec3
--- /dev/null
+++ b/src/checked.cc
@@ -0,0 +1,375 @@
+/* Helper functions for checked numbers
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "checked.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+//! Holds the precision parameter used for rational sqrt calculations.
+unsigned long rational_sqrt_precision_parameter;
+
+struct number_struct {
+  unsigned int base;
+  bool neg_mantissa;
+  bool neg_exponent;
+  std::string mantissa;
+  unsigned long exponent;
+};
+
+/*! \brief
+  Returns the integer value associated with the ASCII code \p c, in
+  the base \p base positional number system, if there is such an
+  association; returns \f$-1\f$ otherwise.
+*/
+inline int
+get_digit(int c, int base = 10) {
+  if (c >= '0' && c < '0' + (base > 10 ? 10 : base))
+    return c - '0';
+  if (base > 10) {
+    base -= 10;
+    if (c >= 'A' && c < 'A' + base)
+      return c - 'A' + 10;
+    if (c >= 'a' && c < 'a' + base)
+      return c - 'a' + 10;
+  }
+  return -1;
+}
+
+/*! \brief
+  Adds the number represented (in the modulus-and-sign representation)
+  by \p b_neg and \p b_mod to the number represented by \p a_neg and
+  \p a_mod, assigning the result to the latter.  Returns
+  <CODE>false</CODE> is the result cannot be represented; returns
+  <CODE>true</CODE> otherwise.
+*/
+inline bool
+sum_sign(bool& a_neg, unsigned long& a_mod,
+	 bool b_neg, unsigned long b_mod) {
+  if (a_neg == b_neg) {
+    if (a_mod > ULONG_MAX - b_mod)
+      return false;
+    a_mod += b_mod;
+  }
+  else if (a_mod >= b_mod)
+    a_mod -= b_mod;
+  else {
+    a_neg = !a_neg;
+    a_mod = b_mod - a_mod;
+  }
+  return true;
+}
+
+
+/*! \brief
+  Helper function for parse_number(): reads the numerator or
+  denominator part of a number from \p is into \p num, returning the
+  appropriate Result value.
+*/
+Result
+parse_number_part(std::istream& is, number_struct& num) {
+  enum { BASE, INTEGER, FRACTIONAL, EXPONENT } state = BASE;
+  unsigned long max_exp_div;
+  int max_exp_rem;
+  bool empty_exponent = true;
+  bool empty_mantissa = true;
+  long exponent_offset = 0;
+  num.base = 10;
+  num.neg_mantissa = false;
+  num.neg_exponent = false;
+  num.mantissa.erase();
+  num.exponent = 0;
+  int c;
+  do {
+    c = is.get();
+  } while (isspace(c));
+  switch (c) {
+  case '-':
+    num.neg_mantissa = true;
+    // Fall through.
+  case '+':
+    c = is.get();
+    if (c == 'i' || c == 'I')
+      goto inf;
+    break;
+  case 'n':
+  case 'N':
+    c = is.get();
+    if (c != 'a' && c != 'A')
+      goto error;
+    c = is.get();
+    if (c != 'n' && c != 'N')
+      goto error;
+    return VC_NAN;
+  inf:
+  case 'i':
+  case 'I':
+    c = is.get();
+    if (c != 'n' && c != 'n')
+      goto error;
+    c = is.get();
+    if (c != 'f' && c != 'F')
+      goto error;
+    return num.neg_mantissa ? VC_MINUS_INFINITY : VC_PLUS_INFINITY;
+  }
+  if (get_digit(c, 10) < 0)
+    goto error;
+  if (c == '0') {
+    int d = is.get();
+    if (d == 'x' || d == 'X') {
+      num.base = 16;
+      state = INTEGER;
+      c = is.get();
+    }
+    else {
+      c = d;
+      empty_mantissa = false;
+    }
+  }
+  else {
+    num.mantissa += (char) c;
+    empty_mantissa = false;
+    c = is.get();
+  }
+  while (true) {
+    switch (state) {
+    case BASE:
+      if (get_digit(c, 10) >= 0) {
+	if (c != '0' || !num.mantissa.empty())
+	  num.mantissa += (char) c;
+	empty_mantissa = false;
+	break;
+      }
+      if (c == '^') {
+	c = is.get();
+	if (c != '^')
+	  goto error;
+	std::string::const_iterator i;
+	num.base = 0;
+	for (i = num.mantissa.begin(); i != num.mantissa.end(); i++) {
+	  num.base = num.base * 10 + (*i - '0');
+	  if (num.base > 36)
+	    goto error;
+	}
+	if (num.base < 2)
+	  goto error;
+	num.mantissa.erase();
+	empty_mantissa = true;
+	state = INTEGER;
+	break;
+      }
+      goto integer;
+    case INTEGER:
+      if (get_digit(c, num.base) >= 0) {
+	if (c != '0' || !num.mantissa.empty())
+	  num.mantissa += (char) c;
+	empty_mantissa = false;
+	break;
+      }
+    integer:
+      if (c == '.') {
+	state = FRACTIONAL;
+	break;
+      }
+      goto fractional;
+    case FRACTIONAL:
+      if (get_digit(c, num.base) >= 0) {
+	exponent_offset--;
+	if (c != '0' || !num.mantissa.empty())
+	  num.mantissa += (char) c;
+	empty_mantissa = false;
+	break;
+      }
+    fractional:
+      if (empty_mantissa)
+	goto error;
+      if (c == 'e' || c == 'E')
+	goto exp;
+      if (c == '*') {
+	c = is.get();
+	if (c != '^')
+	  goto error;
+      exp:
+	state = EXPONENT;
+	max_exp_div = LONG_MAX / num.base;
+	max_exp_rem = LONG_MAX % num.base;
+	c = is.get();
+	if (c == '-') {
+	  num.neg_exponent = true;
+	  break;
+	}
+	if (c == '+')
+	  break;
+	continue;
+      }
+      goto ok;
+    case EXPONENT:
+      int d = get_digit(c, 10);
+      if (d >= 0) {
+	empty_exponent = false;
+	if (num.exponent > max_exp_div
+	    || (num.exponent == max_exp_div && d > max_exp_rem))
+	  return V_CVT_STR_UNK;
+	num.exponent = num.exponent * 10 + d;
+	break;
+      }
+      if (empty_exponent)
+	goto error;
+      goto ok;
+    }
+    c = is.get();
+  }
+
+  {
+  ok:
+    is.unget();
+    unsigned int n = num.mantissa.size();
+    while (n > 0 && num.mantissa[n - 1] == '0') {
+      --n;
+      exponent_offset++;
+    }
+    num.mantissa.erase(n);
+    bool neg;
+    if (exponent_offset < 0) {
+      neg = true;
+      exponent_offset = -exponent_offset;
+    }
+    else
+      neg = false;
+    sum_sign(num.neg_exponent, num.exponent,
+	     neg, exponent_offset);
+    return V_EQ;
+  }
+
+ error:
+  is.unget();
+  return V_CVT_STR_UNK;
+}
+
+/* \brief
+   Reads a number from \p is writing it into \p num, the numerator,
+   and \p den, the denominator; the appropriate Result value is
+   returned.
+*/
+Result
+parse_number(std::istream& is, number_struct& num, number_struct& den) {
+  // Read the numerator.
+  Result r = parse_number_part(is, num);
+  if (r != V_EQ)
+    return r;
+  if (is.get() != '/') {
+    is.unget();
+    den.base = 0;
+    return r;
+  }
+  // Read the denominator.
+  r = parse_number_part(is, den);
+  if (r != V_EQ)
+    return V_CVT_STR_UNK;
+  if (num.base == den.base) {
+    if (sum_sign(num.neg_exponent, num.exponent,
+		 !den.neg_exponent, den.exponent)) {
+      if (num.neg_exponent) {
+	den.neg_exponent = false;
+	den.exponent = num.exponent;
+	num.exponent = 0;
+      }
+      else
+	den.exponent = 0;
+    }
+  }
+  return V_EQ;
+}
+
+
+Result
+input_mpq(mpq_class& to, std::istream& is) {
+  number_struct num_struct;
+  number_struct den_struct;
+  Result r = parse_number(is, num_struct, den_struct);
+  if (r != V_EQ)
+    return r;
+  if (den_struct.base && den_struct.mantissa.empty())
+      return VC_NAN;
+  if (num_struct.mantissa.empty()) {
+    to = 0;
+    return V_EQ;
+  }
+  mpz_ptr num = to.get_num().get_mpz_t();
+  mpz_ptr den = to.get_den().get_mpz_t();
+  mpz_set_str(num, num_struct.mantissa.c_str(), num_struct.base);
+  if (den_struct.base) {
+    if (num_struct.neg_mantissa ^ den_struct.neg_mantissa)
+      mpz_neg(num, num);
+    mpz_set_str(den, den_struct.mantissa.c_str(), den_struct.base);
+    if (num_struct.exponent || den_struct.exponent) {
+      // Multiply the exponents into the numerator and denominator.
+      mpz_t z;
+      mpz_init(z);
+      if (num_struct.exponent) {
+	mpz_ui_pow_ui(z, num_struct.base, num_struct.exponent);
+	if (num_struct.neg_exponent)
+	  mpz_mul(den, den, z);
+	else
+	  mpz_mul(num, num, z);
+      }
+      if (den_struct.exponent) {
+	mpz_ui_pow_ui(z, den_struct.base, den_struct.exponent);
+	if (den_struct.neg_exponent)
+	  mpz_mul(num, num, z);
+	else
+	  mpz_mul(den, den, z);
+      }
+      mpz_clear(z);
+    }
+  }
+  else {
+    if (num_struct.neg_mantissa)
+      mpz_neg(num, num);
+    if (num_struct.exponent) {
+      if (num_struct.neg_exponent) {
+	// Add the negative exponent as a denominator.
+	mpz_ui_pow_ui(den, num_struct.base, num_struct.exponent);
+	goto end;
+      }
+      // Multiply the exponent into the numerator.
+      mpz_t z;
+      mpz_init(z);
+      mpz_ui_pow_ui(z, num_struct.base, num_struct.exponent);
+      mpz_mul(num, num, z);
+      mpz_clear(z);
+    }
+    mpz_set_ui(den, 1);
+    return V_EQ;
+  }
+ end:
+  // GMP operators require rationals in canonical form.
+  to.canonicalize();
+  return V_EQ;
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
diff --git a/src/checked.defs.hh b/src/checked.defs.hh
new file mode 100644
index 0000000..47ae3a3
--- /dev/null
+++ b/src/checked.defs.hh
@@ -0,0 +1,392 @@
+/* Abstract checked arithmetic function container
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_checked_defs_hh
+#define PPL_checked_defs_hh 1
+
+#include <iostream>
+#include <gmpxx.h>
+#include "Rounding_Dir.defs.hh"
+#include "Numeric_Format.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A policy checking for overflows.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Check_Overflow_Policy {
+  static const int check_overflow = 1;
+  static const int check_inf_add_inf = 0;
+  static const int check_inf_sub_inf = 0;
+  static const int check_inf_mul_zero = 0;
+  static const int check_div_zero = 0;
+  static const int check_inf_div_inf = 0;
+  static const int check_inf_mod = 0;
+  static const int check_sqrt_neg = 0;
+  static const int handle_nan = 0;
+  static const int handle_infinity = 0;
+  static const int convertible = 1;
+  static const int fpu_check_inexact = 0;
+  static const int check_nan_args = 1;
+};
+
+// It is a pity that function partial specialization is not permitted
+// by C++.  To (partly) overcome this limitation, we use class
+// encapsulated functions and partial specialization of containing
+// classes.
+
+#define FUNCTION_CLASS(name) name ## _function_struct
+
+#define DECLARE_FUN1_0_0(name, ret_type, qual, type) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(arg); \
+}
+
+#define DECLARE_FUN1_0_1(name, ret_type, qual, type, after1) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1); \
+}
+
+#define DECLARE_FUN1_0_2(name, ret_type, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1, after2 a2) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1, a2); \
+}
+
+#define DECLARE_FUN1_0_3(name, ret_type, qual, type, after1, after2, after3) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1, after2 a2, after3 a3) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1, a2, a3); \
+}
+
+#define DECLARE_FUN1_1_1(name, ret_type, before1, qual, type, after1) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, qual type& arg, after1 a1) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(b1, arg, a1); \
+}
+
+#define DECLARE_FUN1_1_2(name, ret_type, before1, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, qual type& arg, after1 a1, after2 a2) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(b1, arg, a1, a2); \
+}
+
+#define DECLARE_FUN1_2_2(name, ret_type, before1, before2, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(b1, b2, arg, a1, a2); \
+}
+
+#define DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \
+template <typename Policy, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2) { \
+  return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2); \
+}
+
+#define DECLARE_FUN2_0_1(name, ret_type, qual1, type1, qual2, type2, after1) \
+template <typename Policy, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1) { \
+  return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2, a1); \
+}
+
+#define DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, after1, after2) \
+template <typename Policy, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1, after2 a2) { \
+  return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2, a1, a2); \
+}
+
+#define DECLARE_FUN3_0_1(name, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
+template <typename Policy, typename type1, typename type2, typename type3> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2, typename type3> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, qual3 type3& arg3, after1 a1) { \
+  return FUNCTION_CLASS(name)<Policy, type1, type2, type3>::function(arg1, arg2, arg3, a1); \
+}
+
+#define DECLARE_FUN5_0_1(name, ret_type,				\
+			 qual1, type1, qual2, type2, qual3, type3,	\
+			 qual4, type4, qual5, type5,			\
+			 after1)					\
+template <typename Policy,						\
+	  typename type1, typename type2, typename type3,		\
+	  typename type4, typename type5>				\
+struct FUNCTION_CLASS(name);						\
+template <typename Policy,						\
+	  typename type1, typename type2, typename type3,		\
+	  typename type4, typename type5>				\
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2,		\
+		     qual3 type3& arg3, qual4 type4& arg4,		\
+		     qual5 type5& arg5,	after1 a1) {			\
+  return FUNCTION_CLASS(name)<Policy, type1, type2, type3, type4, type5> \
+    ::function(arg1, arg2, arg3, arg4, arg5, a1);			\
+}
+
+#define SPECIALIZE_FUN1_0_0(name, suf, ret_type, qual, type) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(qual type& arg) { \
+    return name ## _ ## suf<Policy>(arg); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_0_1(name, suf, ret_type, qual, type, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(qual type& arg, after1 a1) { \
+    return name ## _ ## suf<Policy>(arg, a1); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_0_2(name, suf, ret_type, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(qual type& arg, after1 a1, after2 a2) { \
+    return name ## _ ## suf<Policy>(arg, a1, a2); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_0_3(name, suf, ret_type, qual, type, after1, after2, after3) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(qual type& arg, after1 a1, after2 a2, after3 a3) { \
+    return name ## _ ## suf<Policy>(arg, a1, a2, a3); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_1_1(name, suf, ret_type, before1, qual, type, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(before1 b1, qual type& arg, after1 a1) { \
+    return name ## _ ## suf<Policy>(b1, arg, a1); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_1_2(name, suf, ret_type, before1, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(before1 b1, qual type& arg, after1 a1, after2 a2) { \
+    return name ## _ ## suf<Policy>(b1, arg, a1, a2); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_2_2(name, suf, ret_type, before1, before2, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
+    return name ## _ ## suf<Policy>(b1, b2, arg, a1, a2); \
+  } \
+};
+
+#define SPECIALIZE_FUN2_0_0(name, suf, ret_type, qual1, type1, qual2, type2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+  static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2) { \
+    return name ## _ ## suf<Policy>(arg1, arg2); \
+  } \
+};
+
+#define SPECIALIZE_FUN2_0_1(name, suf, ret_type, qual1, type1, qual2, type2, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+  static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1) { \
+    return name ## _ ## suf<Policy>(arg1, arg2, a1); \
+  } \
+};
+
+#define SPECIALIZE_FUN2_0_2(name, suf, ret_type, qual1, type1, qual2, type2, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+  static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1, after2 a2) { \
+    return name ## _ ## suf<Policy>(arg1, arg2, a1, a2); \
+  } \
+};
+
+#define SPECIALIZE_FUN3_0_1(name, suf, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name) <Policy, type1, type2, type3> { \
+  static inline Result function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3, after1 a1) { \
+    return name ## _ ## suf<Policy>(arg1, arg2, arg3, a1); \
+  } \
+};
+
+#define SPECIALIZE_FUN5_0_1(name, suf, ret_type,			\
+			    qual1, type1, qual2, type2, qual3, type3,	\
+			    qual4, type4, qual5, type5, after1)		\
+template <typename Policy>						\
+struct FUNCTION_CLASS(name) <Policy,					\
+			     type1, type2, type3, type4, type5> {	\
+  static inline Result							\
+  function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3,	\
+	   qual4 type4 &arg4, qual5 type5 &arg5, after1 a1) {		\
+    return name ## _ ## suf<Policy>(arg1, arg2, arg3, arg4, arg5, a1);	\
+  }									\
+};
+
+#define nonconst
+
+#define SPECIALIZE_COPY(suf, Type) \
+  SPECIALIZE_FUN2_0_0(copy, suf, void, nonconst, Type, const, Type)
+#define SPECIALIZE_SGN(suf, From) \
+  SPECIALIZE_FUN1_0_0(sgn, suf, Result, const, From)
+#define SPECIALIZE_CMP(suf, Type1, Type2) \
+  SPECIALIZE_FUN2_0_0(cmp, suf, Result, const, Type1, const, Type2)
+#define SPECIALIZE_SET_SPECIAL(suf, Type) \
+  SPECIALIZE_FUN1_0_1(set_special, suf, Result, nonconst, Type, Result)
+#define SPECIALIZE_CLASSIFY(suf, Type) \
+  SPECIALIZE_FUN1_0_3(classify, suf, Result, const, Type, bool, bool, bool)
+#define SPECIALIZE_IS_NAN(suf, Type) \
+  SPECIALIZE_FUN1_0_0(is_nan, suf, bool, const, Type)
+#define SPECIALIZE_IS_MINF(suf, Type) \
+  SPECIALIZE_FUN1_0_0(is_minf, suf, bool, const, Type)
+#define SPECIALIZE_IS_PINF(suf, Type) \
+  SPECIALIZE_FUN1_0_0(is_pinf, suf, bool, const, Type)
+#define SPECIALIZE_IS_INT(suf, Type) \
+  SPECIALIZE_FUN1_0_0(is_int, suf, bool, const, Type)
+#define SPECIALIZE_CONSTRUCT(suf, To, From) \
+  SPECIALIZE_FUN2_0_1(construct, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ASSIGN(suf, To, From) \
+  SPECIALIZE_FUN2_0_1(assign, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_NEG(suf, To, From) \
+  SPECIALIZE_FUN2_0_1(neg, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ABS(suf, To, From) \
+  SPECIALIZE_FUN2_0_1(abs, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_SQRT(suf, To, From) \
+  SPECIALIZE_FUN2_0_1(sqrt, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ADD(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(add, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_SUB(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(sub, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_MUL(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_DIV(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(div, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_REM(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(rem, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_MUL2EXP(suf, To, From) \
+  SPECIALIZE_FUN2_0_2(mul2exp, suf, Result, nonconst, To, const, From, int, Rounding_Dir)
+#define SPECIALIZE_DIV2EXP(suf, To, From) \
+  SPECIALIZE_FUN2_0_2(div2exp, suf, Result, nonconst, To, const, From, int, Rounding_Dir)
+#define SPECIALIZE_ADD_MUL(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(add_mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_SUB_MUL(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(sub_mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_GCD(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(gcd, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_GCDEXT(suf, To1, From1, From2, To2, To3)		\
+  SPECIALIZE_FUN5_0_1(gcdext, suf, Result, nonconst, To1,		\
+		      const, From1, const, From2, nonconst, To2, nonconst, To3, Rounding_Dir)
+#define SPECIALIZE_LCM(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(lcm, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_INPUT(suf, Type) \
+  SPECIALIZE_FUN1_0_2(input, suf, Result, nonconst, Type, std::istream&, Rounding_Dir)
+#define SPECIALIZE_OUTPUT(suf, Type) \
+  SPECIALIZE_FUN1_1_2(output, suf, Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+
+
+DECLARE_FUN2_0_0(copy,        void, nonconst, Type1, const, Type2)
+DECLARE_FUN1_0_0(sgn,         Result, const, From)
+DECLARE_FUN2_0_0(cmp,         Result, const, Type1, const, Type2)
+DECLARE_FUN1_0_1(set_special, Result, nonconst, Type, Result)
+DECLARE_FUN1_0_3(classify,    Result, const, Type, bool, bool, bool)
+DECLARE_FUN1_0_0(is_nan,      bool, const, Type)
+DECLARE_FUN1_0_0(is_minf,     bool, const, Type)
+DECLARE_FUN1_0_0(is_pinf,     bool, const, Type)
+DECLARE_FUN1_0_0(is_int,      bool, const, Type)
+DECLARE_FUN2_0_1(construct,   Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(assign,      Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(neg,         Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(abs,         Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(sqrt,        Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN3_0_1(add,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(sub,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(mul,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(div,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(rem,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN2_0_2(mul2exp,     Result, nonconst, To, const, From, int, Rounding_Dir)
+DECLARE_FUN2_0_2(div2exp,     Result, nonconst, To, const, From, int, Rounding_Dir)
+DECLARE_FUN3_0_1(add_mul,     Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(sub_mul,     Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(gcd,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN5_0_1(gcdext,      Result, nonconst, To1, const, From1, const, From2,
+		                      nonconst, To2, nonconst, To3, Rounding_Dir)
+DECLARE_FUN3_0_1(lcm,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN1_0_2(input,       Result, nonconst, Type, std::istream&, Rounding_Dir)
+DECLARE_FUN1_1_2(output,      Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+
+template <typename Policy, typename To>
+Result round(To& to, Result r, Rounding_Dir dir);
+
+Result input_mpq(mpq_class& to, std::istream& is);
+
+} // namespace Checked
+
+struct Minus_Infinity {
+};
+
+struct Plus_Infinity {
+};
+
+struct Not_A_Number {
+};
+
+extern Minus_Infinity MINUS_INFINITY;
+extern Plus_Infinity PLUS_INFINITY;
+extern Not_A_Number NOT_A_NUMBER;
+
+} // namespace Parma_Polyhedra_Library
+
+
+#define CHECK_P(cond, check) ((cond) ? (check) : (assert(!(check)), false))
+
+#include "checked.inlines.hh"
+#include "checked_int.inlines.hh"
+#include "checked_float.inlines.hh"
+#include "checked_mpz.inlines.hh"
+#include "checked_mpq.inlines.hh"
+#include "checked_ext.inlines.hh"
+
+#endif // !defined(PPL_checked_defs_hh)
diff --git a/src/checked.inlines.hh b/src/checked.inlines.hh
new file mode 100644
index 0000000..e96cd9e
--- /dev/null
+++ b/src/checked.inlines.hh
@@ -0,0 +1,277 @@
+/* Abstract checked arithmetic functions: fall-backs.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "compiler.hh"
+#include "globals.types.hh"
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy, typename Type>
+struct FUNCTION_CLASS(construct)<Policy, Type, Type> {
+  static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+    new (&to) Type(from);
+    return V_EQ;
+  }
+};
+
+template <typename Policy, typename To, typename From>
+struct FUNCTION_CLASS(construct) {
+  static inline Result function(To& to, const From& from, Rounding_Dir dir) {
+    new (&to) To();
+    return assign<Policy>(to, from, dir);
+  }
+};
+
+template <typename Policy, typename Type>
+struct FUNCTION_CLASS(assign)<Policy, Type, Type> {
+  static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+    to = from;
+    return V_EQ;
+  }
+};
+
+template <typename Policy, typename Type>
+inline void
+copy_generic(Type& to, const Type& from) {
+  to = from;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+abs_generic(To& to, const From& from, Rounding_Dir dir) {
+  if (from < 0)
+    return neg<Policy>(to, from, dir);
+  to = from;
+  return V_EQ;
+}
+
+inline Result
+neg(Result r) {
+  assert(!is_special(r));
+  Result ret = static_cast<Result>(r & V_EQ);
+  if (r & V_LT)
+    ret = static_cast<Result>(ret | V_GT);
+  if (r & V_GT)
+    ret = static_cast<Result>(ret | V_LT);
+  return ret;
+}
+
+inline Result
+add(Result r1, Result r2) {
+  assert(!is_special(r1));
+  assert(!is_special(r2));
+  if (r1 == V_EQ)
+    return r2;
+  if (r2 == V_EQ)
+    return r1;
+  if (((r1 & V_LT) && (r2 & V_GT))
+      || ((r1 & V_GT) && (r2 & V_LT)))
+    return V_LGE;
+  return static_cast<Result>((((r1 & r2) & V_EQ) ? V_EQ : 0) |
+			       (r1 & (V_LT | V_GT)));
+}
+
+inline Result
+sub(Result r1, Result r2) {
+  return add(r1, neg(r2));
+}
+
+template <typename Policy, typename To, typename From>
+inline void
+gcd_exact_noabs(To& to, const From& x, const From& y) {
+  To nx = x;
+  To ny = y;
+  To rm;
+  while (ny != 0) {
+    /* The following is derived from the assumption that x % y
+       is always representable. This is true for both native integers
+       and iec559 floating point numbers */
+    rem<Policy>(rm, nx, ny, ROUND_NOT_NEEDED);
+    nx = ny;
+    ny = rm;
+  }
+  to = nx;
+}
+
+template <typename Policy, typename To, typename From1, typename From2>
+inline Result
+gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  gcd_exact_noabs<Policy>(to, x, y);
+  return abs<Policy>(to, to, dir);
+}
+
+template <typename Policy, typename To1,
+	  typename From1, typename From2, typename To2, typename To3>
+inline Result
+gcdext_exact(To1& to, const From1& x, const From2& y, To2& s, To3& t,
+	     Rounding_Dir dir) {
+  if (y == 0) {
+    if (x == 0) {
+      s = 0;
+      t = 1;
+      return V_EQ;
+    }
+    else {
+      if (x < 0)
+	s = -1;
+      else
+	s = 1;
+      t = 0;
+      return abs<Policy>(to, x, dir);
+    }
+  }
+
+  s = 1;
+  t = 0;
+  bool negative_x = x < 0;
+  bool negative_y = y < 0;
+
+  Result r;
+  r = abs<Policy>(to, x, dir);
+  if (r != V_EQ)
+    return r;
+
+  From2 ay;
+  r = abs<Policy>(ay, y, dir);
+  if (r != V_EQ)
+    return r;
+
+  // If COPY_GMP is defined then s is favoured when the absolute
+  // values of the given numbers are equal.  For instance if x and y
+  // are both 5 then s will be 1 and t will be 0, instead of the other
+  // way round.  This is to match the behaviour of GMP.
+#define COPY_GMP
+#ifdef COPY_GMP
+  if (to == ay)
+    goto sign_check;
+#endif
+
+  {
+    To2 v1 = 0;
+    To3 v2 = 1;
+    To1 v3 = static_cast<To1>(ay);
+    while (true) {
+      To1 q = to / v3;
+      // Remainder, next candidate GCD.
+      To1 t3 = to - q*v3;
+      To2 t1 = s - static_cast<To2>(q)*v1;
+      To3 t2 = t - static_cast<To3>(q)*v2;
+      s = v1;
+      t = v2;
+      to = v3;
+      if (t3 == 0)
+	break;
+      v1 = t1;
+      v2 = t2;
+      v3 = t3;
+    }
+  }
+
+#ifdef COPY_GMP
+ sign_check:
+#endif
+  if (negative_x) {
+    r = neg<Policy>(s, s, dir);
+    if (r != V_EQ)
+      return r;
+  }
+  if (negative_y)
+    return neg<Policy>(t, t, dir);
+  return V_EQ;
+}
+
+template <typename Policy, typename To, typename From1, typename From2>
+inline Result
+lcm_gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (x == 0 || y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  To nx, ny;
+  Result r;
+  r = abs<Policy>(nx, x, dir);
+  if (r != V_EQ)
+    return r;
+  r = abs<Policy>(ny, y, dir);
+  if (r != V_EQ)
+    return r;
+  To gcd;
+  gcd_exact_noabs<Policy>(gcd, nx, ny);
+  /* The following is derived from the assumption that x / gcd(x, y)
+     is always representable. This is true for both native integers
+     and iec559 floating point numbers */
+  div<Policy>(to, nx, gcd, ROUND_NOT_NEEDED);
+  return mul<Policy>(to, to, ny, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sgn_generic(const Type& x) {
+  if (x > 0)
+    return V_GT;
+  if (x == 0)
+    return V_EQ;
+  return V_LT;
+}
+
+template <typename Policy, typename Type>
+inline Result
+cmp_generic(const Type& x, const Type& y) {
+  if (x > y)
+    return V_GT;
+  if (x < y)
+    return V_LT;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+input_generic(Type& to, std::istream& is, Rounding_Dir dir) {
+  mpq_class q;
+  Result r = input_mpq(q, is);
+  if (r == VC_MINUS_INFINITY)
+    return assign<Policy>(to, MINUS_INFINITY, dir);
+  if (r == VC_PLUS_INFINITY)
+    return assign<Policy>(to, PLUS_INFINITY, dir);
+  if (r == V_EQ)
+    return assign<Policy>(to, q, dir);
+  return set_special<Policy>(to, r);
+}
+
+template <typename T>
+inline memory_size_type
+external_memory_in_bytes(T) {
+  return 0;
+}
+
+template <typename T>
+inline memory_size_type
+total_memory_in_bytes(T& x) {
+  return sizeof(x) + external_memory_in_bytes(x);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/checked_ext.inlines.hh b/src/checked_ext.inlines.hh
new file mode 100644
index 0000000..d905724
--- /dev/null
+++ b/src/checked_ext.inlines.hh
@@ -0,0 +1,763 @@
+/* Checked extended arithmetic functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#define handle_ext_natively(T) (Float<T>::fpu_related)
+
+template <typename Policy, typename Type>
+inline Result
+sgn_ext(const Type& x) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x)))
+    return VC_NAN;
+  else if (is_minf<Policy>(x))
+    return V_LT;
+  else if (is_pinf<Policy>(x))
+    return V_GT;
+  else
+    return sgn<Policy>(x);
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+construct_ext(To& to, const From& from, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(from)))
+    return construct<To_Policy>(to, NOT_A_NUMBER, dir);
+  else if (is_minf<From_Policy>(from))
+    return construct<To_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return construct<To_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return construct<To_Policy>(to, from, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+assign_ext(To& to, const From& from, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(from)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(from))
+    return assign<To_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return assign<To_Policy>(to, from, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+neg_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy>(to, MINUS_INFINITY, dir);
+  else {
+  native:
+    return neg<To_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+abs_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x) || is_pinf<From_Policy>(x))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return abs<To_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+add_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<From2_Policy>(y)))
+      goto inf_add_inf;
+    else
+      goto minf;
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<From2_Policy>(y))) {
+    inf_add_inf:
+      return set_special<To_Policy>(to, V_INF_ADD_INF);
+    }
+    else
+      goto pinf;
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+    minf:
+      return assign<To_Policy>(to, MINUS_INFINITY, dir);
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+    pinf:
+      return assign<To_Policy>(to, PLUS_INFINITY, dir);
+    }
+    else {
+    native:
+      return add<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+sub_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<From2_Policy>(y)))
+      goto inf_sub_inf;
+    else
+      goto minf;
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<From2_Policy>(y))) {
+    inf_sub_inf:
+      return set_special<To_Policy>(to, V_INF_SUB_INF);
+    }
+    else
+      goto pinf;
+  }
+  else {
+    if (is_pinf<From2_Policy>(y)) {
+    minf:
+      return assign<To_Policy>(to, MINUS_INFINITY, dir);
+    }
+    else if (is_minf<From2_Policy>(y)) {
+    pinf:
+      return assign<To_Policy>(to, PLUS_INFINITY, dir);
+    }
+    else {
+    native:
+      return sub<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto pinf;
+    case V_GT:
+      goto minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto minf;
+    case V_GT:
+      goto pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+	goto pinf;
+      case V_GT:
+	goto minf;
+      default:
+	goto inf_mul_zero;
+      }
+    } else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+      minf:
+	return assign<To_Policy>(to, MINUS_INFINITY, dir);
+      case V_GT:
+      pinf:
+	return assign<To_Policy>(to, PLUS_INFINITY, dir);
+	goto pinf;
+      default:
+      inf_mul_zero:
+	assert(To_Policy::check_inf_mul_zero);
+	return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+    native:
+      return mul<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(To_Policy::check_nan_args, is_nan<To_Policy>(to))
+      || CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto a_pinf;
+    case V_GT:
+      goto a_minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto a_minf;
+    case V_GT:
+      goto a_pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+	goto a_pinf;
+      case V_GT:
+	goto a_minf;
+      default:
+	goto inf_mul_zero;
+      }
+    } else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+      a_minf:
+	if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<To_Policy>(to)))
+	  goto inf_add_inf;
+	else
+	  goto minf;
+      case V_GT:
+      a_pinf:
+	if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<To_Policy>(to))) {
+	inf_add_inf:
+	  return set_special<To_Policy>(to, V_INF_ADD_INF);
+	}
+	else
+	  goto pinf;
+      default:
+      inf_mul_zero:
+	assert(To_Policy::check_inf_mul_zero);
+	return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+      if (is_minf<To_Policy>(to)) {
+      minf:
+	return assign<To_Policy>(to, MINUS_INFINITY, dir);
+      }
+      if (is_pinf<To_Policy>(to)) {
+      pinf:
+	return assign<To_Policy>(to, PLUS_INFINITY, dir);
+      }
+    native:
+      return add_mul<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(To_Policy::check_nan_args, is_nan<To_Policy>(to))
+      || CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto a_pinf;
+    case V_GT:
+      goto a_minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto a_minf;
+    case V_GT:
+      goto a_pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+	goto a_pinf;
+      case V_GT:
+	goto a_minf;
+      default:
+	goto inf_mul_zero;
+      }
+    } else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+      a_minf:
+	if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<To_Policy>(to)))
+	  goto inf_sub_inf;
+	else
+	  goto pinf;
+      case V_GT:
+      a_pinf:
+	if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<To_Policy>(to))) {
+	inf_sub_inf:
+	  return set_special<To_Policy>(to, V_INF_SUB_INF);
+	}
+	else
+	  goto minf;
+      default:
+      inf_mul_zero:
+	assert(To_Policy::check_inf_mul_zero);
+	return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+      if (is_minf<To_Policy>(to)) {
+      minf:
+	return assign<To_Policy>(to, MINUS_INFINITY, dir);
+      }
+      if (is_pinf<To_Policy>(to)) {
+      pinf:
+	return assign<To_Policy>(to, PLUS_INFINITY, dir);
+      }
+    native:
+      return sub_mul<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+		|| is_pinf<From2_Policy>(y)))
+      goto inf_div_inf;
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case V_LT:
+	goto pinf;
+      case V_GT:
+	goto minf;
+      default:
+	goto div_zero;
+      }
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+		|| is_pinf<From2_Policy>(y))) {
+    inf_div_inf:
+      return set_special<To_Policy>(to, V_INF_DIV_INF);
+    }
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case V_LT:
+      minf:
+	return assign<To_Policy>(to, MINUS_INFINITY, dir);
+      case V_GT:
+      pinf:
+	return assign<To_Policy>(to, PLUS_INFINITY, dir);
+      default:
+      div_zero:
+	assert(To_Policy::check_div_zero);
+	return set_special<To_Policy>(to, V_DIV_ZERO);
+      }
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = 0;
+      return V_EQ;
+    }
+    else {
+    native:
+      return div<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+rem_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From1_Policy>(x)
+		   || is_pinf<From1_Policy>(x)))
+    return set_special<To_Policy>(to, V_INF_MOD);
+  else {
+    if (is_minf<From1_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = x;
+      return V_EQ;
+    }
+    else {
+    native:
+      return rem<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+mul2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return mul2exp<To_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+div2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return div2exp<To_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+sqrt_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return set_special<To_Policy>(to, V_SQRT_NEG);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return sqrt<To_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+gcd_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x))
+    return abs_ext<To_Policy, From2_Policy>(to, y, dir);
+  else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+    return abs_ext<To_Policy, From1_Policy>(to, x, dir);
+  else
+    return gcd<To_Policy>(to, x, y, dir);
+}
+
+template <typename To1_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To2_Policy, typename To3_Policy,
+	  typename To1, typename From1, typename From2, typename To2, typename To3>
+inline Result
+gcdext_ext(To1& to, const From1& x, const From2& y,
+	   To2& s, To3& t, Rounding_Dir dir) {
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To1_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)) {
+    s = 0;
+    t = y > 0 ? -1 : 1;
+    return abs_ext<To1_Policy, From2_Policy>(to, y, dir);
+  }
+  else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+    s = x > 0 ? -1 : 1;
+    t = 0;
+    return abs_ext<To1_Policy, From1_Policy>(to, x, dir);
+  }
+  else
+    return gcdext<To1_Policy>(to, x, y, s, t, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+lcm_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)
+	   || is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else
+    return lcm<To_Policy>(to, x, y, dir);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline Result
+cmp_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return V_UNORD_COMP;
+  else if (is_minf<Policy1>(x))
+    return is_minf<Policy2>(y) ? V_EQ : V_LT;
+  else if (is_pinf<Policy1>(x))
+    return is_pinf<Policy2>(y) ? V_EQ : V_GT;
+  else {
+    if (is_minf<Policy2>(y))
+      return V_GT;
+    if (is_pinf<Policy2>(y))
+      return V_LT;
+  native:
+    return cmp<Policy1>(x, y);
+  }
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+lt_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return false;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return false;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return true;
+ native:
+  return x < y;
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+gt_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return false;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return false;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return true;
+ native:
+  return x > y;
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+le_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return false;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return true;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return false;
+ native:
+  return x <= y;
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+ge_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return false;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return true;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return false;
+ native:
+  return x >= y;
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+eq_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return false;
+  if (is_minf<Policy1>(x))
+    return is_minf<Policy2>(y);
+  if (is_pinf<Policy1>(x))
+    return is_pinf<Policy2>(y);
+ native:
+  return x == y;
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+ne_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return true;
+  if (is_minf<Policy1>(x))
+    return !is_minf<Policy2>(y);
+  if (is_pinf<Policy1>(x))
+    return !is_pinf<Policy2>(y);
+ native:
+  return x != y;
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_ext(std::ostream& os, const Type& x,
+	   const Numeric_Format& format, Rounding_Dir dir) {
+  if (handle_ext_natively(Type))
+    goto native;
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))) {
+    os << "nan";
+    return VC_NAN;
+  }
+  if (is_minf<Policy>(x)) {
+    os << "-inf";
+    return V_EQ;
+  }
+  if (is_pinf<Policy>(x)) {
+    os << "+inf";
+    return V_EQ;
+  }
+ native:
+  return output<Policy>(os, x, format, dir);
+}
+
+template <typename To_Policy, typename To>
+inline Result
+input_ext(To& to, std::istream& is, Rounding_Dir dir) {
+  return input<To_Policy>(to, is, dir);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/checked_float.inlines.hh b/src/checked_float.inlines.hh
new file mode 100644
index 0000000..63af0ea
--- /dev/null
+++ b/src/checked_float.inlines.hh
@@ -0,0 +1,940 @@
+/* Specialized "checked" functions for native floating-point numbers.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_checked_float_inlines_hh
+#define PPL_checked_float_inlines_hh 1
+
+#include "Float.defs.hh"
+#ifndef __alpha
+#include <cmath>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+inline float
+fma(float x, float y, float z) {
+#if HAVE_DECL_FMAF && !defined(__alpha)
+  return ::fmaf(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+#if HAVE_DECL_RINTF
+inline float
+rint(float x) {
+  return ::rintf(x);
+}
+#endif
+
+inline double
+fma(double x, double y, double z) {
+#if HAVE_DECL_FMA && !defined(__alpha)
+  return ::fma(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+inline double
+rint(double x) {
+  return ::rint(x);
+}
+
+inline long double
+fma(long double x, long double y, long double z) {
+#if HAVE_DECL_FMAL && !defined(__alpha)
+  return ::fmal(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+#if HAVE_DECL_RINTL
+inline long double
+rint(long double x) {
+  return ::rintl(x);
+}
+#endif
+
+inline bool
+fpu_direct_rounding(Rounding_Dir dir) {
+  return dir == ROUND_DIRECT || dir == ROUND_IGNORE;
+}
+
+inline bool
+fpu_inverse_rounding(Rounding_Dir dir) {
+  return dir == ROUND_INVERSE;
+}
+
+// The FPU mode is "round down".
+//
+// The result of the rounded down multiplication is thus computed directly.
+//
+//   a = 0.3
+//   b = 0.1
+//   c_i = a * b = 0.03
+//   c = c_i = 0.0
+//
+// To obtain the result of the rounded up multiplication
+// we do -(-a * b).
+//
+//   a = 0.3
+//   b = 0.1
+//   c_i = -a * b = -0.03
+//
+// Here c_i should be forced to lose excess precision, otherwise the
+// FPU will truncate using the rounding mode in force, which is "round down".
+//
+//   c_i = -c_i = 0.03
+//   c = c_i = 0.0
+//
+// Wrong result: we should have obtained c = 0.1.
+
+inline float
+limit_precision(float v) {
+  volatile float x = v;
+  return x;
+}
+
+inline double
+limit_precision(double v) {
+  volatile double x = v;
+  return x;
+}
+
+inline long double
+limit_precision(long double v) {
+#if __GNUC__ >= 4
+  return v;
+#else
+  // Not really needed for floating point operations done with the
+  // maximum available precision, but this avoids a bug in GCC 3.4.3
+  // that causes excessive optimization compiling -(-a * b).
+  // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21032
+  // and http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21067.
+  volatile long double x = v;
+  return x;
+#endif
+}
+
+template <typename Policy, typename T>
+inline Result
+classify_float(const T v, bool nan, bool inf, bool sign) {
+  Float<T> f(v);
+  if ((nan || sign) && f.u.binary.is_nan())
+    return VC_NAN;
+  if (inf) {
+    int i = f.u.binary.is_inf();
+    if (i < 0)
+      return VC_MINUS_INFINITY;
+    if (i > 0)
+      return VC_PLUS_INFINITY;
+  }
+  if (sign) {
+    if (v < 0)
+      return V_LT;
+    if (v > 0)
+      return V_GT;
+    return V_EQ;
+  }
+  return VC_NORMAL;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_nan_float(const T v) {
+  Float<T> f(v);
+  return f.u.binary.is_nan();
+}
+
+template <typename Policy, typename T>
+inline bool
+is_minf_float(const T v) {
+  Float<T> f(v);
+  return f.u.binary.is_inf() < 0;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_pinf_float(const T v) {
+  Float<T> f(v);
+  return f.u.binary.is_inf() > 0;
+}
+
+template <typename T>
+inline bool
+is_inf_float(const T v) {
+  Float<T> f(v);
+  return f.u.binary.is_inf() != 0;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_int_float(const T v) {
+  return rint(v) == v;
+}
+
+template <typename Policy, typename T>
+inline Result
+set_special_float(T& v, Result r) {
+  switch (classify(r)) {
+  case VC_MINUS_INFINITY:
+    v = -HUGE_VAL;
+    break;
+  case VC_PLUS_INFINITY:
+    v = HUGE_VAL;
+    break;
+  case VC_NAN:
+    v = NAN;
+    break;
+  default:
+    break;
+  }
+  return r;
+}
+
+template <typename T>
+inline void
+pred_float(T& v) {
+  Float<T> f(v);
+  assert(!f.u.binary.is_nan());
+  assert(f.u.binary.is_inf() >= 0);
+  if (f.u.binary.is_zero() > 0) {
+    f.u.binary.negate();
+    f.u.binary.inc();
+  }
+  else if (f.u.binary.sign_bit()) {
+    f.u.binary.inc();
+  }
+  else {
+    f.u.binary.dec();
+  }
+  v = f.value();
+}
+
+template <typename T>
+inline void
+succ_float(T& v) {
+  Float<T> f(v);
+  assert(!f.u.binary.is_nan());
+  assert(f.u.binary.is_inf() <= 0);
+  if (f.u.binary.is_zero() < 0) {
+    f.u.binary.negate();
+    f.u.binary.inc();
+  }
+  else if (!f.u.binary.sign_bit()) {
+    f.u.binary.inc();
+  }
+  else {
+    f.u.binary.dec();
+  }
+  v = f.value();
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_float(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_DOWN) {
+    pred_float(to);
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_float(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_UP) {
+    succ_float(to);
+    return V_LT;
+  }
+  return V_GT;
+}
+
+template <typename Policy>
+inline void
+prepare_inexact(Rounding_Dir dir) {
+  if (Policy::fpu_check_inexact && dir != ROUND_IGNORE)
+    fpu_reset_inexact();
+}
+
+template <typename Policy>
+inline Result
+result_relation(Rounding_Dir dir) {
+  if (Policy::fpu_check_inexact) {
+    if (!fpu_check_inexact())
+      return V_EQ;
+    switch (dir) {
+    case ROUND_DOWN:
+      return V_GT;
+    case ROUND_UP:
+      return V_LT;
+    default:
+      return V_NE;
+    }
+  }
+  else {
+    switch (dir) {
+    case ROUND_DOWN:
+      return V_GE;
+    case ROUND_UP:
+      return V_LE;
+    default:
+      return V_LGE;
+    }
+  }
+}
+
+template <typename Policy, typename From, typename To>
+inline Result
+assign_float_float_exact(To& to, const From from, Rounding_Dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+    return VC_NAN;
+  to = from;
+  return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+    return VC_NAN;
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = from;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(-from);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = from;
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename From, typename To>
+inline Result
+assign_float_float(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(From) > sizeof(To))
+    return assign_float_float_inexact<Policy>(to, from, dir);
+  else
+    return assign_float_float_exact<Policy>(to, from, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+neg_float(Type& to, const Type from, Rounding_Dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+    return VC_NAN;
+  to = -from;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  if (CHECK_P(Policy::check_inf_add_inf, is_inf_float(x) && x == -y))
+    return V_INF_ADD_INF;
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x + y;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(-x - y);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = x + y;
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  if (CHECK_P(Policy::check_inf_sub_inf, is_inf_float(x) && x == y))
+    return V_INF_SUB_INF;
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x - y;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(y - x);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = x - y;
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  if (CHECK_P(Policy::check_inf_mul_zero, (x == 0 && is_inf_float(y)) ||
+	    (y == 0 && is_inf_float(x))))
+      return V_INF_MUL_ZERO;
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x * y;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(x * -y);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = x * y;
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+div_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  if (CHECK_P(Policy::check_inf_div_inf, is_inf_float(x) && is_inf_float(y)))
+      return V_INF_DIV_INF;
+  if (CHECK_P(Policy::check_div_zero, y == 0)) {
+    to = NAN;
+    return V_DIV_ZERO;
+  }
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x / y;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(x / -y);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = x / y;
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+rem_float(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  if (CHECK_P(Policy::check_inf_mod, is_inf_float(x)))
+    return V_INF_MOD;
+  if (CHECK_P(Policy::check_div_zero, y == 0)) {
+    to = NAN;
+    return V_MOD_ZERO;
+  }
+  to = std::fmod(x, y);
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<Policy>(to, x, -exp, dir);
+  assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
+  return mul<Policy>(to, x, static_cast<Type>(1ULL << exp), dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+div2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<Policy>(to, x, -exp, dir);
+  assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
+  return div<Policy>(to, x, static_cast<Type>(1ULL << exp), dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+abs_float(Type& to, const Type from, Rounding_Dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+    return VC_NAN;
+  to = from < 0 ? -from : from;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+sqrt_float(Type& to, const Type from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+    return VC_NAN;
+  if (CHECK_P(Policy::check_sqrt_neg, from < 0)) {
+    to = NAN;
+    return V_SQRT_NEG;
+  }
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = std::sqrt(from);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = std::sqrt(from);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sgn_float(const Type x) {
+  return classify<Policy>(x, false, false, true);
+}
+
+template <typename Policy, typename Type>
+inline Result
+cmp_float(const Type x, const Type y) {
+  if (x > y)
+    return V_GT;
+  if (x < y)
+    return V_LT;
+  if (x == y)
+    return V_EQ;
+  return V_UNORD_COMP;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_int_exact(To& to, const From from, Rounding_Dir) {
+  to = from;
+  return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) {
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = from;
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = from;
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(From) * 8 > Float<To>::Binary::MANTISSA_BITS)
+    return assign_float_int_inexact<Policy>(to, from, dir);
+  else
+    return assign_float_int_exact<Policy>(to, from, dir);
+}
+
+template <typename Policy, typename T>
+inline Result
+set_neg_overflow_float(T& to, Rounding_Dir dir) {
+  switch (dir) {
+  case ROUND_UP:
+    {
+      Float<T> f;
+      f.u.binary.set_max(true);
+      to = f.value();
+      return V_LT;
+    }
+  default:
+    to = -HUGE_VAL;
+    return V_GT;
+  }
+}
+
+template <typename Policy, typename T>
+inline Result
+set_pos_overflow_float(T& to, Rounding_Dir dir) {
+  switch (dir) {
+  case ROUND_DOWN:
+    {
+      Float<T> f;
+      f.u.binary.set_max(false);
+      to = f.value();
+      return V_GT;
+    }
+  default:
+    to = HUGE_VAL;
+    return V_LT;
+  }
+}
+
+template <typename Policy, typename T>
+inline Result
+assign_float_mpz(T& to, const mpz_class& _from, Rounding_Dir dir)
+{
+  mpz_srcptr from = _from.get_mpz_t();
+  int sign = mpz_sgn(from);
+  if (sign == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  size_t exponent = mpz_sizeinbase(from, 2) - 1;
+  if (exponent > (size_t) Float<T>::Binary::EXPONENT_MAX) {
+    if (sign < 0)
+      return set_neg_overflow_float<Policy>(to, dir);
+    else
+      return set_pos_overflow_float<Policy>(to, dir);
+  }
+  unsigned long zeroes = mpn_scan1(from->_mp_d, 0);
+  size_t meaningful_bits = exponent - zeroes;
+  mpz_t mantissa;
+  mpz_init(mantissa);
+  if (exponent > Float<T>::Binary::MANTISSA_BITS)
+    mpz_tdiv_q_2exp(mantissa,
+		    from,
+		    exponent - Float<T>::Binary::MANTISSA_BITS);
+  else
+    mpz_mul_2exp(mantissa, from, Float<T>::Binary::MANTISSA_BITS - exponent);
+  Float<T> f(to);
+  f.u.binary.build(sign < 0, mantissa, exponent);
+  mpz_clear(mantissa);
+  to = f.value();
+  if (meaningful_bits > Float<T>::Binary::MANTISSA_BITS) {
+    if (sign < 0)
+      return round_lt_float<Policy>(to, dir);
+    else
+      return round_gt_float<Policy>(to, dir);
+  }
+  return V_EQ;
+}
+
+template <typename Policy, typename T>
+inline Result
+assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir)
+{
+  const mpz_class& _num = from.get_num();
+  const mpz_class& _den = from.get_den();
+  if (_den == 1)
+    return assign_float_mpz<Policy>(to, _num, dir);
+  mpz_srcptr num = _num.get_mpz_t();
+  mpz_srcptr den = _den.get_mpz_t();
+  int sign = mpz_sgn(num);
+  signed long exponent = mpz_sizeinbase(num, 2) - mpz_sizeinbase(den, 2);
+  if (exponent < Float<T>::Binary::EXPONENT_MIN_DENORM) {
+    to = 0;
+  inexact:
+    if (sign < 0)
+      return round_lt_float<Policy>(to, dir);
+    else
+      return round_gt_float<Policy>(to, dir);
+  }
+  if (exponent > (signed int) Float<T>::Binary::EXPONENT_MAX + 1) {
+  overflow:
+    if (sign < 0)
+      return set_neg_overflow_float<Policy>(to, dir);
+    else
+      return set_pos_overflow_float<Policy>(to, dir);
+  }
+  unsigned int needed_bits = Float<T>::Binary::MANTISSA_BITS + 1;
+  if (exponent < Float<T>::Binary::EXPONENT_MIN)
+    needed_bits -= Float<T>::Binary::EXPONENT_MIN - exponent;
+  mpz_t mantissa;
+  mpz_init(mantissa);
+  signed long shift = needed_bits - exponent;
+  if (shift > 0) {
+    mpz_mul_2exp(mantissa, num, shift);
+    num = mantissa;
+  }
+  else if (shift < 0) {
+    mpz_mul_2exp(mantissa, den, -shift);
+    den = mantissa;
+  }
+  mpz_t r;
+  mpz_init(r);
+  mpz_tdiv_qr(mantissa, r, num, den);
+  size_t bits = mpz_sizeinbase(mantissa, 2);
+  bool inexact = (mpz_sgn(r) != 0);
+  mpz_clear(r);
+  if (bits == needed_bits + 1) {
+    inexact = (inexact || mpz_odd_p(mantissa));
+    mpz_div_2exp(mantissa, mantissa, 1);
+  }
+  else
+    --exponent;
+  if (exponent > (signed int)Float<T>::Binary::EXPONENT_MAX) {
+    mpz_clear(mantissa);
+    goto overflow;
+  } else if (exponent < Float<T>::Binary::EXPONENT_MIN - 1) {
+    /* Denormalized */
+    exponent = Float<T>::Binary::EXPONENT_MIN - 1;
+  }
+  Float<T> f(to);
+  f.u.binary.build(sign < 0, mantissa, exponent);
+  mpz_clear(mantissa);
+  to = f.value();
+  if (inexact)
+    goto inexact;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(to))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = fma(x, y, to);
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(fma(-x, y, -to));
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = fma(x, y, to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(to))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = fma(x, -y, to);
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(fma(x, y, -to));
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = fma(x, -y, to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_float(std::ostream& os, const Type from, const Numeric_Format&,
+	     Rounding_Dir) {
+  if (from == 0)
+    os << "0";
+  else if (is_minf<Policy>(from))
+    os << "-inf";
+  else if (is_pinf<Policy>(from))
+    os << "+inf";
+  else if (is_nan<Policy>(from))
+    os << "nan";
+  else {
+    int old_precision = os.precision(10000);
+    os << from;
+    os.precision(old_precision);
+  }
+  return V_EQ;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_float_minf(To& to, const Minus_Infinity&, Rounding_Dir) {
+  to = -HUGE_VAL;
+  return V_EQ;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_float_pinf(To& to, const Plus_Infinity&, Rounding_Dir) {
+  to = HUGE_VAL;
+  return V_EQ;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_float_nan(To& to, const Not_A_Number&, Rounding_Dir) {
+  to = NAN;
+  return V_EQ;
+}
+
+#if PPL_SUPPORTED_FLOAT
+SPECIALIZE_ASSIGN(float_float_exact, float, float)
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_ASSIGN(float_float, float, double)
+SPECIALIZE_ASSIGN(float_float_exact, double, float)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(float_float, float, long double)
+SPECIALIZE_ASSIGN(float_float_exact, long double, float)
+#endif
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_ASSIGN(float_float_exact, double, double)
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(float_float, double, long double)
+SPECIALIZE_ASSIGN(float_float_exact, long double, double)
+#endif
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(float_float_exact, long double, long double)
+#endif
+
+#if PPL_SUPPORTED_FLOAT
+SPECIALIZE_CLASSIFY(float, float)
+SPECIALIZE_IS_NAN(float, float)
+SPECIALIZE_IS_MINF(float, float)
+SPECIALIZE_IS_PINF(float, float)
+SPECIALIZE_SET_SPECIAL(float, float)
+SPECIALIZE_ASSIGN(float_int, float, signed char)
+SPECIALIZE_ASSIGN(float_int, float, signed short)
+SPECIALIZE_ASSIGN(float_int, float, signed int)
+SPECIALIZE_ASSIGN(float_int, float, signed long)
+SPECIALIZE_ASSIGN(float_int, float, signed long long)
+SPECIALIZE_ASSIGN(float_int, float, unsigned char)
+SPECIALIZE_ASSIGN(float_int, float, unsigned short)
+SPECIALIZE_ASSIGN(float_int, float, unsigned int)
+SPECIALIZE_ASSIGN(float_int, float, unsigned long)
+SPECIALIZE_ASSIGN(float_int, float, unsigned long long)
+SPECIALIZE_ASSIGN(float_mpz, float, mpz_class)
+SPECIALIZE_ASSIGN(float_mpq, float, mpq_class)
+SPECIALIZE_COPY(generic, float)
+SPECIALIZE_IS_INT(float, float)
+SPECIALIZE_ASSIGN(float_minf, float, Minus_Infinity)
+SPECIALIZE_ASSIGN(float_pinf, float, Plus_Infinity)
+SPECIALIZE_ASSIGN(float_nan, float, Not_A_Number)
+SPECIALIZE_NEG(float, float, float)
+SPECIALIZE_ABS(float, float, float)
+SPECIALIZE_ADD(float, float, float, float)
+SPECIALIZE_SUB(float, float, float, float)
+SPECIALIZE_MUL(float, float, float, float)
+SPECIALIZE_DIV(float, float, float, float)
+SPECIALIZE_REM(float, float, float, float)
+SPECIALIZE_MUL2EXP(float, float, float)
+SPECIALIZE_DIV2EXP(float, float, float)
+SPECIALIZE_SQRT(float, float, float)
+SPECIALIZE_GCD(exact, float, float, float)
+SPECIALIZE_GCDEXT(exact, float, float, float, float, float)
+SPECIALIZE_LCM(gcd_exact, float, float, float)
+SPECIALIZE_SGN(float, float)
+SPECIALIZE_CMP(float, float, float)
+SPECIALIZE_ADD_MUL(float, float, float, float)
+SPECIALIZE_SUB_MUL(float, float, float, float)
+SPECIALIZE_INPUT(generic, float)
+SPECIALIZE_OUTPUT(float, float)
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_CLASSIFY(float, double)
+SPECIALIZE_IS_NAN(float, double)
+SPECIALIZE_IS_MINF(float, double)
+SPECIALIZE_IS_PINF(float, double)
+SPECIALIZE_SET_SPECIAL(float, double)
+SPECIALIZE_ASSIGN(float_int, double, signed char)
+SPECIALIZE_ASSIGN(float_int, double, signed short)
+SPECIALIZE_ASSIGN(float_int, double, signed int)
+SPECIALIZE_ASSIGN(float_int, double, signed long)
+SPECIALIZE_ASSIGN(float_int, double, signed long long)
+SPECIALIZE_ASSIGN(float_int, double, unsigned char)
+SPECIALIZE_ASSIGN(float_int, double, unsigned short)
+SPECIALIZE_ASSIGN(float_int, double, unsigned int)
+SPECIALIZE_ASSIGN(float_int, double, unsigned long)
+SPECIALIZE_ASSIGN(float_int, double, unsigned long long)
+SPECIALIZE_ASSIGN(float_mpz, double, mpz_class)
+SPECIALIZE_ASSIGN(float_mpq, double, mpq_class)
+SPECIALIZE_COPY(generic, double)
+SPECIALIZE_IS_INT(float, double)
+SPECIALIZE_ASSIGN(float_minf, double, Minus_Infinity)
+SPECIALIZE_ASSIGN(float_pinf, double, Plus_Infinity)
+SPECIALIZE_ASSIGN(float_nan, double, Not_A_Number)
+SPECIALIZE_NEG(float, double, double)
+SPECIALIZE_ABS(float, double, double)
+SPECIALIZE_ADD(float, double, double, double)
+SPECIALIZE_SUB(float, double, double, double)
+SPECIALIZE_MUL(float, double, double, double)
+SPECIALIZE_DIV(float, double, double, double)
+SPECIALIZE_REM(float, double, double, double)
+SPECIALIZE_MUL2EXP(float, double, double)
+SPECIALIZE_DIV2EXP(float, double, double)
+SPECIALIZE_SQRT(float, double, double)
+SPECIALIZE_GCD(exact, double, double, double)
+SPECIALIZE_GCDEXT(exact, double, double, double, double, double)
+SPECIALIZE_LCM(gcd_exact, double, double, double)
+SPECIALIZE_SGN(float, double)
+SPECIALIZE_CMP(float, double, double)
+SPECIALIZE_ADD_MUL(float, double, double, double)
+SPECIALIZE_SUB_MUL(float, double, double, double)
+SPECIALIZE_INPUT(generic, double)
+SPECIALIZE_OUTPUT(float, double)
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_CLASSIFY(float, long double)
+SPECIALIZE_IS_NAN(float, long double)
+SPECIALIZE_IS_MINF(float, long double)
+SPECIALIZE_IS_PINF(float, long double)
+SPECIALIZE_SET_SPECIAL(float, long double)
+SPECIALIZE_ASSIGN(float_int, long double, signed char)
+SPECIALIZE_ASSIGN(float_int, long double, signed short)
+SPECIALIZE_ASSIGN(float_int, long double, signed int)
+SPECIALIZE_ASSIGN(float_int, long double, signed long)
+SPECIALIZE_ASSIGN(float_int, long double, signed long long)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned char)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned short)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned int)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned long)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned long long)
+SPECIALIZE_ASSIGN(float_mpz, long double, mpz_class)
+SPECIALIZE_ASSIGN(float_mpq, long double, mpq_class)
+SPECIALIZE_COPY(generic, long double)
+SPECIALIZE_IS_INT(float, long double)
+SPECIALIZE_ASSIGN(float_minf, long double, Minus_Infinity)
+SPECIALIZE_ASSIGN(float_pinf, long double, Plus_Infinity)
+SPECIALIZE_ASSIGN(float_nan, long double, Not_A_Number)
+SPECIALIZE_NEG(float, long double, long double)
+SPECIALIZE_ABS(float, long double, long double)
+SPECIALIZE_ADD(float, long double, long double, long double)
+SPECIALIZE_SUB(float, long double, long double, long double)
+SPECIALIZE_MUL(float, long double, long double, long double)
+SPECIALIZE_DIV(float, long double, long double, long double)
+SPECIALIZE_REM(float, long double, long double, long double)
+SPECIALIZE_MUL2EXP(float, long double, long double)
+SPECIALIZE_DIV2EXP(float, long double, long double)
+SPECIALIZE_SQRT(float, long double, long double)
+SPECIALIZE_GCD(exact, long double, long double, long double)
+SPECIALIZE_GCDEXT(exact, long double, long double, long double,
+		  long double, long double)
+SPECIALIZE_LCM(gcd_exact, long double, long double, long double)
+SPECIALIZE_SGN(float, long double)
+SPECIALIZE_CMP(float, long double, long double)
+SPECIALIZE_ADD_MUL(float, long double, long double, long double)
+SPECIALIZE_SUB_MUL(float, long double, long double, long double)
+SPECIALIZE_INPUT(generic, long double)
+SPECIALIZE_OUTPUT(float, long double)
+#endif
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_int_inlines_hh)
diff --git a/src/checked_int.inlines.hh b/src/checked_int.inlines.hh
new file mode 100644
index 0000000..303d5b3
--- /dev/null
+++ b/src/checked_int.inlines.hh
@@ -0,0 +1,1537 @@
+/* Specialized "checked" functions for native integer numbers.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_checked_int_inlines_hh
+#define PPL_checked_int_inlines_hh 1
+
+#include "Limits.hh"
+#include <cerrno>
+#include <cstdlib>
+#include <climits>
+#include <string>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if !HAVE_DECL_STRTOLL
+signed long long
+strtoll(const char* nptr, char** endptr, int base);
+#endif
+
+#if !HAVE_DECL_STRTOULL
+unsigned long long
+strtoull(const char* nptr, char** endptr, int base);
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifndef HAVE_INT_FAST16_T
+typedef int16_t int_fast16_t;
+#endif
+
+#ifndef HAVE_INT_FAST32_T
+typedef int32_t int_fast32_t;
+#endif
+
+#ifndef HAVE_INT_FAST64_T
+typedef int64_t int_fast64_t;
+#endif
+
+#ifndef HAVE_UINT_FAST16_T
+typedef uint16_t uint_fast16_t;
+#endif
+
+#ifndef HAVE_UINT_FAST32_T
+typedef uint32_t uint_fast32_t;
+#endif
+
+#ifndef HAVE_UINT_FAST64_T
+typedef uint64_t uint_fast64_t;
+#endif
+
+template <typename Policy, typename Type>
+struct Extended_Int {
+  static const Type plus_infinity = Limits<Type>::max;
+  static const Type minus_infinity = (Limits<Type>::min >= 0
+				      ? Limits<Type>::max - 1
+				      : Limits<Type>::min);
+  static const Type not_a_number = (Limits<Type>::min >= 0
+				    ? Limits<Type>::max - Policy::handle_infinity * 2
+				    : Limits<Type>::min + Policy::handle_infinity);
+  static const Type min = (Limits<Type>::min
+			   + (Limits<Type>::min >= 0 ? 0
+			      : (Policy::handle_infinity + Policy::handle_nan)));
+  static const Type max = (Limits<Type>::max
+			   - (Limits<Type>::min >= 0
+			      ? (2 * Policy::handle_infinity + Policy::handle_nan)
+			      : Policy::handle_infinity));
+};
+
+template <typename Policy, typename To>
+inline Result
+set_neg_overflow_int(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_UP) {
+    to = Extended_Int<Policy, To>::min;
+    return V_LT;
+  }
+  else {
+    if (Policy::handle_infinity) {
+      to = Extended_Int<Policy, To>::minus_infinity;
+      return V_GT;
+    }
+    return V_NEG_OVERFLOW;
+  }
+}
+
+template <typename Policy, typename To>
+inline Result
+set_pos_overflow_int(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_DOWN) {
+    to = Extended_Int<Policy, To>::max;
+    return V_GT;
+  }
+  else {
+    if (Policy::handle_infinity) {
+      to = Extended_Int<Policy, To>::plus_infinity;
+      return V_LT;
+    }
+    return V_POS_OVERFLOW;
+  }
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int_no_overflow(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_DOWN) {
+    to--;
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int_no_overflow(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_UP) {
+    to++;
+    return V_LT;
+  }
+  return V_GT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_DOWN) {
+    if (to == Extended_Int<Policy, To>::min) {
+      if (Policy::handle_infinity) {
+	to = Extended_Int<Policy, To>::minus_infinity;
+	return V_GT;
+      }
+      return V_NEG_OVERFLOW;
+    } else {
+      to--;
+      return V_GT;
+    }
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_UP) {
+    if (to == Extended_Int<Policy, To>::max) {
+      if (Policy::handle_infinity) {
+	to = Extended_Int<Policy, To>::plus_infinity;
+	return V_LT;
+      }
+      return V_POS_OVERFLOW;
+    } else {
+      to++;
+      return V_LT;
+    }
+  }
+  return V_GT;
+}
+
+SPECIALIZE_COPY(generic, signed char)
+SPECIALIZE_COPY(generic, signed short)
+SPECIALIZE_COPY(generic, signed int)
+SPECIALIZE_COPY(generic, signed long)
+SPECIALIZE_COPY(generic, signed long long)
+SPECIALIZE_COPY(generic, unsigned char)
+SPECIALIZE_COPY(generic, unsigned short)
+SPECIALIZE_COPY(generic, unsigned int)
+SPECIALIZE_COPY(generic, unsigned long)
+SPECIALIZE_COPY(generic, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+classify_int(const Type v, bool nan, bool inf, bool sign) {
+  if (Policy::handle_nan
+      && (nan || sign)
+      && v == Extended_Int<Policy, Type>::not_a_number)
+    return VC_NAN;
+  if (!inf & !sign)
+    return VC_NORMAL;
+  if (Policy::handle_infinity) {
+    if (v == Extended_Int<Policy, Type>::minus_infinity)
+      return inf ? VC_MINUS_INFINITY : V_LT;
+    if (v == Extended_Int<Policy, Type>::plus_infinity)
+      return inf ? VC_PLUS_INFINITY : V_GT;
+  }
+  if (sign) {
+    if (v < 0)
+      return V_LT;
+    if (v > 0)
+      return V_GT;
+    return V_EQ;
+  }
+  return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(int, signed char)
+SPECIALIZE_CLASSIFY(int, signed short)
+SPECIALIZE_CLASSIFY(int, signed int)
+SPECIALIZE_CLASSIFY(int, signed long)
+SPECIALIZE_CLASSIFY(int, signed long long)
+SPECIALIZE_CLASSIFY(int, unsigned char)
+SPECIALIZE_CLASSIFY(int, unsigned short)
+SPECIALIZE_CLASSIFY(int, unsigned int)
+SPECIALIZE_CLASSIFY(int, unsigned long)
+SPECIALIZE_CLASSIFY(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_nan_int(const Type v) {
+  return Policy::handle_nan && v == Extended_Int<Policy, Type>::not_a_number;
+}
+
+SPECIALIZE_IS_NAN(int, signed char)
+SPECIALIZE_IS_NAN(int, signed short)
+SPECIALIZE_IS_NAN(int, signed int)
+SPECIALIZE_IS_NAN(int, signed long)
+SPECIALIZE_IS_NAN(int, signed long long)
+SPECIALIZE_IS_NAN(int, unsigned char)
+SPECIALIZE_IS_NAN(int, unsigned short)
+SPECIALIZE_IS_NAN(int, unsigned int)
+SPECIALIZE_IS_NAN(int, unsigned long)
+SPECIALIZE_IS_NAN(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_minf_int(const Type v) {
+  return Policy::handle_infinity
+    && v == Extended_Int<Policy, Type>::minus_infinity;
+}
+
+SPECIALIZE_IS_MINF(int, signed char)
+SPECIALIZE_IS_MINF(int, signed short)
+SPECIALIZE_IS_MINF(int, signed int)
+SPECIALIZE_IS_MINF(int, signed long)
+SPECIALIZE_IS_MINF(int, signed long long)
+SPECIALIZE_IS_MINF(int, unsigned char)
+SPECIALIZE_IS_MINF(int, unsigned short)
+SPECIALIZE_IS_MINF(int, unsigned int)
+SPECIALIZE_IS_MINF(int, unsigned long)
+SPECIALIZE_IS_MINF(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_pinf_int(const Type v) {
+  return Policy::handle_infinity
+    && v == Extended_Int<Policy, Type>::plus_infinity;
+}
+
+SPECIALIZE_IS_PINF(int, signed char)
+SPECIALIZE_IS_PINF(int, signed short)
+SPECIALIZE_IS_PINF(int, signed int)
+SPECIALIZE_IS_PINF(int, signed long)
+SPECIALIZE_IS_PINF(int, signed long long)
+SPECIALIZE_IS_PINF(int, unsigned char)
+SPECIALIZE_IS_PINF(int, unsigned short)
+SPECIALIZE_IS_PINF(int, unsigned int)
+SPECIALIZE_IS_PINF(int, unsigned long)
+SPECIALIZE_IS_PINF(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_int_int(const Type v) {
+  return !is_nan<Policy>(v);
+}
+
+SPECIALIZE_IS_INT(int, signed char)
+SPECIALIZE_IS_INT(int, signed short)
+SPECIALIZE_IS_INT(int, signed int)
+SPECIALIZE_IS_INT(int, signed long)
+SPECIALIZE_IS_INT(int, signed long long)
+SPECIALIZE_IS_INT(int, unsigned char)
+SPECIALIZE_IS_INT(int, unsigned short)
+SPECIALIZE_IS_INT(int, unsigned int)
+SPECIALIZE_IS_INT(int, unsigned long)
+SPECIALIZE_IS_INT(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+set_special_int(Type& v, Result r) {
+  Result t = classify(r);
+  if (Policy::handle_nan && t == VC_NAN)
+    v = Extended_Int<Policy, Type>::not_a_number;
+  else if (Policy::handle_infinity) {
+    switch (t) {
+    case VC_MINUS_INFINITY:
+      v = Extended_Int<Policy, Type>::minus_infinity;
+      break;
+    case VC_PLUS_INFINITY:
+      v = Extended_Int<Policy, Type>::plus_infinity;
+      break;
+    default:
+      break;
+    }
+  }
+  return r;
+}
+
+SPECIALIZE_SET_SPECIAL(int, signed char)
+SPECIALIZE_SET_SPECIAL(int, signed short)
+SPECIALIZE_SET_SPECIAL(int, signed int)
+SPECIALIZE_SET_SPECIAL(int, signed long)
+SPECIALIZE_SET_SPECIAL(int, signed long long)
+SPECIALIZE_SET_SPECIAL(int, unsigned char)
+SPECIALIZE_SET_SPECIAL(int, unsigned short)
+SPECIALIZE_SET_SPECIAL(int, unsigned int)
+SPECIALIZE_SET_SPECIAL(int, unsigned long)
+SPECIALIZE_SET_SPECIAL(int, unsigned long long)
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_signed_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(From)) {
+    if (CHECK_P(Policy::check_overflow,
+		from < static_cast<From>(Extended_Int<Policy, To>::min)))
+      return set_neg_overflow_int<Policy>(to, dir);
+    if (CHECK_P(Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<Policy, To>::max)))
+      return set_pos_overflow_int<Policy>(to, dir);
+  }
+  to = To(from);
+  return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_signed_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(From)) {
+    if (CHECK_P(Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<Policy, To>::max)))
+      return set_pos_overflow_int<Policy>(to, dir);
+  }
+  to = To(from);
+  return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_overflow, from < 0))
+    return set_neg_overflow_int<Policy>(to, dir);
+  if (sizeof(To) < sizeof(From)) {
+    if (CHECK_P(Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<Policy, To>::max)))
+      return set_pos_overflow_int<Policy>(to, dir);
+  }
+  to = To(from);
+  return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(From)) {
+    if (CHECK_P(Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<Policy, To>::max)))
+      return set_pos_overflow_int<Policy>(to, dir);
+  }
+  to = To(from);
+  return V_EQ;
+}
+
+
+#define ASSIGN2_SIGNED_SIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_signed_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_signed_int, Larger, Smaller)
+
+#define ASSIGN2_UNSIGNED_UNSIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Larger, Smaller)
+
+#define ASSIGN2_UNSIGNED_SIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_signed_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_unsigned_int, Larger, Smaller)
+
+#define ASSIGN2_SIGNED_UNSIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_unsigned_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_signed_int, Larger, Smaller)
+
+#define ASSIGN_SIGNED(Type) \
+SPECIALIZE_ASSIGN(signed_int_signed_int, Type, Type)
+#define ASSIGN_UNSIGNED(Type) \
+SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Type, Type)
+
+ASSIGN_SIGNED(signed char)
+ASSIGN_SIGNED(signed short)
+ASSIGN_SIGNED(signed int)
+ASSIGN_SIGNED(signed long)
+ASSIGN_SIGNED(signed long long)
+ASSIGN_UNSIGNED(unsigned char)
+ASSIGN_UNSIGNED(unsigned short)
+ASSIGN_UNSIGNED(unsigned int)
+ASSIGN_UNSIGNED(unsigned long)
+ASSIGN_UNSIGNED(unsigned long long)
+
+ASSIGN2_SIGNED_SIGNED(signed char, signed short)
+ASSIGN2_SIGNED_SIGNED(signed char, signed int)
+ASSIGN2_SIGNED_SIGNED(signed char, signed long)
+ASSIGN2_SIGNED_SIGNED(signed char, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed short, signed int)
+ASSIGN2_SIGNED_SIGNED(signed short, signed long)
+ASSIGN2_SIGNED_SIGNED(signed short, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed int, signed long)
+ASSIGN2_SIGNED_SIGNED(signed int, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed long, signed long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned short)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned int)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned int)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned long, unsigned long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed short)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed int)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed int)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned long, signed long long)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned char)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned short)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned short)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed long long, unsigned long long)
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_int_float(To& to, const From from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_overflow, (from < Extended_Int<Policy, To>::min)))
+    return set_neg_overflow_int<Policy>(to, dir);
+  if (CHECK_P(Policy::check_overflow, (from > Extended_Int<Policy, To>::max)))
+    return set_pos_overflow_int<Policy>(to, dir);
+  to = static_cast<To>(from);
+  if (dir == ROUND_IGNORE)
+    return V_LGE;
+  if (from < to)
+    return round_lt_int<Policy>(to, dir);
+  else if (from > to)
+    return round_gt_int<Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(int_float, signed char, float)
+SPECIALIZE_ASSIGN(int_float, signed short, float)
+SPECIALIZE_ASSIGN(int_float, signed int, float)
+SPECIALIZE_ASSIGN(int_float, signed long, float)
+SPECIALIZE_ASSIGN(int_float, signed long long, float)
+SPECIALIZE_ASSIGN(int_float, unsigned char, float)
+SPECIALIZE_ASSIGN(int_float, unsigned short, float)
+SPECIALIZE_ASSIGN(int_float, unsigned int, float)
+SPECIALIZE_ASSIGN(int_float, unsigned long, float)
+SPECIALIZE_ASSIGN(int_float, unsigned long long, float)
+
+SPECIALIZE_ASSIGN(int_float, signed char, double)
+SPECIALIZE_ASSIGN(int_float, signed short, double)
+SPECIALIZE_ASSIGN(int_float, signed int, double)
+SPECIALIZE_ASSIGN(int_float, signed long, double)
+SPECIALIZE_ASSIGN(int_float, signed long long, double)
+SPECIALIZE_ASSIGN(int_float, unsigned char, double)
+SPECIALIZE_ASSIGN(int_float, unsigned short, double)
+SPECIALIZE_ASSIGN(int_float, unsigned int, double)
+SPECIALIZE_ASSIGN(int_float, unsigned long, double)
+SPECIALIZE_ASSIGN(int_float, unsigned long long, double)
+
+SPECIALIZE_ASSIGN(int_float, signed char, long double)
+SPECIALIZE_ASSIGN(int_float, signed short, long double)
+SPECIALIZE_ASSIGN(int_float, signed int, long double)
+SPECIALIZE_ASSIGN(int_float, signed long, long double)
+SPECIALIZE_ASSIGN(int_float, signed long long, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned char, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned short, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned int, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned long, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned long long, long double)
+
+#undef ASSIGN2_SIGNED_SIGNED
+#undef ASSIGN2_UNSIGNED_UNSIGNED
+#undef ASSIGN2_UNSIGNED_SIGNED
+#undef ASSIGN2_SIGNED_UNSIGNED
+
+template <typename Policy, typename To>
+inline Result
+assign_signed_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(signed long)) {
+    if (!Policy::check_overflow) {
+      to = from.get_si();
+      return V_EQ;
+    }
+    if (from.fits_slong_p()) {
+      signed long v = from.get_si();
+      if (v < Limits<To>::min)
+	return set_neg_overflow_int<Policy>(to, dir);
+      if (v > Limits<To>::max)
+	return set_pos_overflow_int<Policy>(to, dir);
+      to = v;
+      return V_EQ;
+    }
+  }
+  else {
+    mpz_srcptr m = from.get_mpz_t();
+    size_t sz = mpz_size(m);
+    if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+      if (sz == 0) {
+	to = 0;
+	return V_EQ;
+      }
+      To v;
+      mpz_export(&v, 0, -1, sizeof(To), 0, 0, m);
+      if (v >= 0) {
+	if (::sgn(from) < 0)
+	  return neg<Policy>(to, v, dir);
+	to = v;
+	return V_EQ;
+      }
+    }
+  }
+  return ::sgn(from) < 0
+    ? set_neg_overflow_int<Policy>(to, dir)
+    : set_pos_overflow_int<Policy>(to, dir);
+}
+
+SPECIALIZE_ASSIGN(signed_int_mpz, signed char, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed short, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed int, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed long, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed long long, mpz_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_overflow, ::sgn(from) < 0))
+    return set_neg_overflow_int<Policy>(to, dir);
+  if (sizeof(To) <= sizeof(unsigned long)) {
+    if (!Policy::check_overflow) {
+      to = from.get_ui();
+      return V_EQ;
+    }
+    if (from.fits_ulong_p()) {
+      unsigned long v = from.get_ui();
+      if (v > Limits<To>::max)
+	return set_pos_overflow_int<Policy>(to, dir);
+      to = v;
+      return V_EQ;
+    }
+  }
+  else {
+    mpz_srcptr m = from.get_mpz_t();
+    size_t sz = mpz_size(m);
+    if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+      if (sz == 0)
+	to = 0;
+      else
+	mpz_export(&to, 0, -1, sizeof(To), 0, 0, m);
+      return V_EQ;
+    }
+  }
+  return set_pos_overflow_int<Policy>(to, dir);
+}
+
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned char, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned short, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned int, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned long, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned long long, mpz_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_int_mpq(To& to, const mpq_class& from, Rounding_Dir dir) {
+  mpz_srcptr n = from.get_num().get_mpz_t();
+  mpz_srcptr d = from.get_den().get_mpz_t();
+  mpz_class q;
+  mpz_ptr _q = q.get_mpz_t();
+  if (dir == ROUND_IGNORE) {
+    mpz_tdiv_q(_q, n, d);
+    Result r = assign<Policy>(to, q, dir);
+    if (r != V_EQ)
+      return r;
+    return V_LGE;
+  }
+  mpz_t rem;
+  int sign;
+  mpz_init(rem);
+  mpz_tdiv_qr(_q, rem, n, d);
+  sign = mpz_sgn(rem);
+  mpz_clear(rem);
+  Result r = assign<Policy>(to, q, dir);
+  if (r != V_EQ)
+    return r;
+  switch (sign) {
+  case -1:
+    return round_lt_int<Policy>(to, dir);
+  case 1:
+    return round_gt_int<Policy>(to, dir);
+  default:
+    return V_EQ;
+  }
+}
+
+SPECIALIZE_ASSIGN(int_mpq, signed char, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed short, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed int, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed long, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed long long, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned char, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned short, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned int, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned long, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned long long, mpq_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_int_minf(To& to, const Minus_Infinity&, Rounding_Dir dir) {
+  if (Policy::handle_infinity) {
+    to = Extended_Int<Policy, To>::minus_infinity;
+    return V_EQ;
+  }
+  if (dir == ROUND_UP) {
+    to = Extended_Int<Policy, To>::min;
+    return V_LT;
+  }
+  return VC_MINUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_int_pinf(To& to, const Plus_Infinity&, Rounding_Dir dir) {
+  if (Policy::handle_infinity) {
+    to = Extended_Int<Policy, To>::plus_infinity;
+    return V_EQ;
+  }
+  if (dir == ROUND_DOWN) {
+    to = Extended_Int<Policy, To>::max;
+    return V_GT;
+  }
+  return VC_PLUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_int_nan(To& to, const Not_A_Number&, Rounding_Dir) {
+  if (Policy::handle_nan) {
+    to = Extended_Int<Policy, To>::not_a_number;
+    return V_EQ;
+  }
+  return VC_NAN;
+}
+
+SPECIALIZE_ASSIGN(int_minf, signed char, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed short, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed int, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed long, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed long long, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned char, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned short, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned int, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned long, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned long long, Minus_Infinity)
+
+SPECIALIZE_ASSIGN(int_pinf, signed char, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed short, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed int, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed long, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed long long, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned char, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned short, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned int, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned long, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned long long, Plus_Infinity)
+
+SPECIALIZE_ASSIGN(int_nan, signed char, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed short, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed int, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed long, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed long long, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned char, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned short, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned int, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned long, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned long long, Not_A_Number)
+
+#if UCHAR_MAX == 0xff
+#define CHAR_BITS 8
+#else
+#error "Unexpected max for unsigned char"
+#endif
+
+#if USHRT_MAX == 0xffff
+#define SHRT_BITS 16
+#else
+#error "Unexpected max for unsigned short"
+#endif
+
+#if UINT_MAX == 0xffffffff
+#define INT_BITS 32
+#else
+#error "Unexpected max for unsigned int"
+#endif
+
+#if ULONG_MAX == 0xffffffffUL
+#define LONG_BITS 32
+#elif ULONG_MAX == 0xffffffffffffffffULL
+#define LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long"
+#endif
+
+#if ULLONG_MAX == 0xffffffffffffffffULL
+#define LONG_LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long long"
+#endif
+
+
+template <typename T>
+struct Larger;
+
+// The following may be tuned for performance on specific architecture.
+//
+// Current guidelines:
+//   - avoid division where possible (larger type variant for mul)
+//   - use larger type variant for types smaller than architecture bit size
+
+template <>
+struct Larger<signed char> {
+  static const bool use_for_neg = true;
+  static const bool use_for_add = true;
+  static const bool use_for_sub = true;
+  static const bool use_for_mul = true;
+  typedef int_fast16_t Type_For_Neg;
+  typedef int_fast16_t  Type_For_Add;
+  typedef int_fast16_t  Type_For_Sub;
+  typedef int_fast16_t  Type_For_Mul;
+};
+
+template <>
+struct Larger<unsigned char> {
+  static const bool use_for_neg = true;
+  static const bool use_for_add = true;
+  static const bool use_for_sub = true;
+  static const bool use_for_mul = true;
+  typedef int_fast16_t Type_For_Neg;
+  typedef uint_fast16_t Type_For_Add;
+  typedef int_fast16_t Type_For_Sub;
+  typedef uint_fast16_t Type_For_Mul;
+};
+
+template <>
+struct Larger<signed short> {
+  static const bool use_for_neg = true;
+  static const bool use_for_add = true;
+  static const bool use_for_sub = true;
+  static const bool use_for_mul = true;
+  typedef int_fast32_t Type_For_Neg;
+  typedef int_fast32_t Type_For_Add;
+  typedef int_fast32_t Type_For_Sub;
+  typedef int_fast32_t Type_For_Mul;
+};
+
+template <>
+struct Larger<unsigned short> {
+  static const bool use_for_neg = true;
+  static const bool use_for_add = true;
+  static const bool use_for_sub = true;
+  static const bool use_for_mul = true;
+  typedef int_fast32_t Type_For_Neg;
+  typedef uint_fast32_t Type_For_Add;
+  typedef int_fast32_t Type_For_Sub;
+  typedef uint_fast32_t Type_For_Mul;
+};
+
+template <>
+struct Larger<signed int> {
+  static const bool use_for_neg = (LONG_BITS == 64);
+  static const bool use_for_add = (LONG_BITS == 64);
+  static const bool use_for_sub = (LONG_BITS == 64);
+  static const bool use_for_mul = true;
+  typedef int_fast64_t Type_For_Neg;
+  typedef int_fast64_t Type_For_Add;
+  typedef int_fast64_t Type_For_Sub;
+  typedef int_fast64_t Type_For_Mul;
+};
+
+template <>
+struct Larger<unsigned int> {
+  static const bool use_for_neg = (LONG_BITS == 64);
+  static const bool use_for_add = (LONG_BITS == 64);
+  static const bool use_for_sub = (LONG_BITS == 64);
+  static const bool use_for_mul = true;
+  typedef int_fast64_t Type_For_Neg;
+  typedef uint_fast64_t Type_For_Add;
+  typedef int_fast64_t Type_For_Sub;
+  typedef uint_fast64_t Type_For_Mul;
+};
+
+template <>
+struct Larger<signed long> {
+  static const bool use_for_neg = false;
+  static const bool use_for_add = false;
+  static const bool use_for_sub = false;
+  static const bool use_for_mul = (LONG_BITS == 32);
+  typedef int_fast64_t Type_For_Neg;
+  typedef int_fast64_t Type_For_Add;
+  typedef int_fast64_t Type_For_Sub;
+  typedef int_fast64_t Type_For_Mul;
+};
+
+template <>
+struct Larger<unsigned long> {
+  static const bool use_for_neg = false;
+  static const bool use_for_add = false;
+  static const bool use_for_sub = false;
+  static const bool use_for_mul = (LONG_BITS == 32);
+  typedef int_fast64_t Type_For_Neg;
+  typedef uint_fast64_t Type_For_Add;
+  typedef int_fast64_t Type_For_Sub;
+  typedef uint_fast64_t Type_For_Mul;
+};
+
+template <>
+struct Larger<signed long long> {
+  static const bool use_for_neg = false;
+  static const bool use_for_add = false;
+  static const bool use_for_sub = false;
+  static const bool use_for_mul = false;
+  typedef int_fast64_t Type_For_Neg;
+  typedef int_fast64_t Type_For_Add;
+  typedef int_fast64_t Type_For_Sub;
+  typedef int_fast64_t Type_For_Mul;
+};
+
+template <>
+struct Larger<unsigned long long> {
+  static const bool use_for_neg = false;
+  static const bool use_for_add = false;
+  static const bool use_for_sub = false;
+  static const bool use_for_mul = false;
+  typedef int_fast64_t Type_For_Neg;
+  typedef uint_fast64_t Type_For_Add;
+  typedef int_fast64_t Type_For_Sub;
+  typedef uint_fast64_t Type_For_Mul;
+};
+
+template <typename Policy, typename Type>
+inline Result
+neg_int_larger(Type& to, const Type x, Rounding_Dir dir) {
+  typename Larger<Type>::Type_For_Neg l = x;
+  l = -l;
+  return assign<Policy>(to, l, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::Type_For_Add l = x;
+  l += y;
+  return assign<Policy>(to, l, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::Type_For_Sub l = x;
+  l -= y;
+  return assign<Policy>(to, l, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::Type_For_Mul l = x;
+  l *= y;
+  return assign<Policy>(to, l, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+neg_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_neg)
+    return neg_int_larger<Policy>(to, from, dir);
+  if (CHECK_P(Policy::check_overflow,
+	      (from < -Extended_Int<Policy, Type>::max)))
+    return set_pos_overflow_int<Policy>(to, dir);
+  to = -from;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_neg)
+    return neg_int_larger<Policy>(to, from, dir);
+  if (CHECK_P(Policy::check_overflow, from != 0))
+    return set_neg_overflow_int<Policy>(to, dir);
+  to = from;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_add)
+    return add_int_larger<Policy>(to, x, y, dir);
+  if (Policy::check_overflow) {
+    if (y >= 0) {
+      if (x > Extended_Int<Policy, Type>::max - y)
+	return set_pos_overflow_int<Policy>(to, dir);
+    }
+    else if (x < Extended_Int<Policy, Type>::min - y)
+	return set_neg_overflow_int<Policy>(to, dir);
+  }
+  to = x + y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_add)
+    return add_int_larger<Policy>(to, x, y, dir);
+  if (CHECK_P(Policy::check_overflow,
+	      (x > Extended_Int<Policy, Type>::max - y)))
+    return set_pos_overflow_int<Policy>(to, dir);
+  to = x + y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_sub)
+    return sub_int_larger<Policy>(to, x, y, dir);
+  if (Policy::check_overflow) {
+    if (y >= 0) {
+      if (x < Extended_Int<Policy, Type>::min + y)
+	return set_neg_overflow_int<Policy>(to, dir);
+    }
+    else if (x > Extended_Int<Policy, Type>::max + y)
+	return set_pos_overflow_int<Policy>(to, dir);
+  }
+  to = x - y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_sub)
+    return sub_int_larger<Policy>(to, x, y, dir);
+  if (CHECK_P(Policy::check_overflow,
+	      (x < Extended_Int<Policy, Type>::min + y)))
+    return set_neg_overflow_int<Policy>(to, dir);
+  to = x - y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_mul)
+    return mul_int_larger<Policy>(to, x, y, dir);
+  if (!Policy::check_overflow) {
+    to = x * y;
+    return V_EQ;
+  }
+  if (y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  if (y == -1)
+    return neg_signed_int<Policy>(to, x, dir);
+  if (x >= 0) {
+    if (y > 0) {
+      if (x > Extended_Int<Policy, Type>::max / y)
+	return set_pos_overflow_int<Policy>(to, dir);
+    }
+    else {
+      if (x > Extended_Int<Policy, Type>::min / y)
+	return set_neg_overflow_int<Policy>(to, dir);
+    }
+  }
+  else {
+    if (y < 0) {
+      if (x < Extended_Int<Policy, Type>::max / y)
+	return set_pos_overflow_int<Policy>(to, dir);
+    }
+    else {
+      if (x < Extended_Int<Policy, Type>::min / y)
+	return set_neg_overflow_int<Policy>(to, dir);
+    }
+  }
+  to = x * y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_mul)
+    return mul_int_larger<Policy>(to, x, y, dir);
+  if (!Policy::check_overflow) {
+    to = x * y;
+    return V_EQ;
+  }
+  if (y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  if (x > Extended_Int<Policy, Type>::max / y)
+    return set_pos_overflow_int<Policy>(to, dir);
+  to = x * y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_div_zero, y == 0))
+    return set_special<Policy>(to, V_DIV_ZERO);
+  if (Policy::check_overflow && y == -1)
+    return neg_signed_int<Policy>(to, x, dir);
+  to = x / y;
+  if (dir == ROUND_IGNORE)
+    return V_LGE;
+  Type m = x % y;
+  if (m < 0)
+    return round_lt_int_no_overflow<Policy>(to, dir);
+  else if (m > 0)
+    return round_gt_int_no_overflow<Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_div_zero, y == 0))
+    return set_special<Policy>(to, V_DIV_ZERO);
+  to = x / y;
+  if (dir == ROUND_IGNORE)
+    return V_GE;
+  Type m = x % y;
+  if (m == 0)
+    return V_EQ;
+  return round_gt_int<Policy>(to, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+rem_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(Policy::check_div_zero, y == 0))
+    return set_special<Policy>(to, V_MOD_ZERO);
+  to = x % y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<Policy>(to, x, -exp, dir);
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+    to = 0;
+    if (dir == ROUND_IGNORE)
+      return V_GE;
+    if (x == 0)
+      return V_EQ;
+    return round_gt_int_no_overflow<Policy>(to, dir);
+  }
+  to = x >> exp;
+  if (dir == ROUND_IGNORE)
+    return V_GE;
+  if (x & ((static_cast<Type>(1) << exp) - 1))
+    return round_gt_int_no_overflow<Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<Policy>(to, x, -exp, dir);
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+  zero:
+    to = 0;
+    if (dir == ROUND_IGNORE)
+      return V_LGE;
+    if (x < 0)
+      return round_lt_int_no_overflow<Policy>(to, dir);
+    else if (x > 0)
+      return round_gt_int_no_overflow<Policy>(to, dir);
+    else
+      return V_EQ;
+  }
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
+    if (x == Limits<Type>::min) {
+      to = -1;
+      return V_EQ;
+    }
+    goto zero;
+  }
+#if 0
+  to = x / (static_cast<Type>(1) << exp);
+  if (dir == ROUND_IGNORE)
+    return V_GE;
+  Type r = x % (static_cast<Type>(1) << exp);
+  if (r < 0)
+    return round_lt_int_no_overflow<Policy>(to, dir);
+  else if (r > 0)
+    return round_gt_int_no_overflow<Policy>(to, dir);
+  else
+    return V_EQ;
+#else
+  // Faster but compiler implementation dependent (see C++98 5.8.3)
+  to = x >> exp;
+  if (dir == ROUND_IGNORE)
+    return V_GE;
+  if (x & ((static_cast<Type>(1) << exp) - 1))
+    return round_gt_int_no_overflow<Policy>(to, dir);
+  return V_EQ;
+#endif
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<Policy>(to, x, -exp, dir);
+  if (!Policy::check_overflow) {
+    to = x << exp;
+    return V_EQ;
+  }
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+    if (x == 0) {
+      to = 0;
+      return V_EQ;
+    }
+    return set_pos_overflow_int<Policy>(to, dir);
+  }
+  if (x & (((static_cast<Type>(1) << exp) - 1) << (sizeof(Type) * 8 - exp)))
+    return set_pos_overflow_int<Policy>(to, dir);
+  Type n = x << exp;
+  if (n > Extended_Int<Policy, Type>::max)
+    return set_pos_overflow_int<Policy>(to, dir);
+  to = n;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<Policy>(to, x, -exp, dir);
+  if (!Policy::check_overflow) {
+    to = x << exp;
+    return V_EQ;
+  }
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
+    if (x < 0)
+      return set_neg_overflow_int<Policy>(to, dir);
+    else if (x > 0)
+      return set_pos_overflow_int<Policy>(to, dir);
+    else {
+      to = 0;
+      return V_EQ;
+    }
+  }
+  Type mask = ((static_cast<Type>(1) << exp) - 1)
+    << (sizeof(Type) * 8 - 1 - exp);
+  Type n;
+  if (x < 0) {
+    if ((x & mask) != mask)
+      return set_neg_overflow_int<Policy>(to, dir);
+    n = x << exp;
+    if (n < Extended_Int<Policy, Type>::min)
+      return set_neg_overflow_int<Policy>(to, dir);
+  }
+  else {
+    if (x & mask)
+      return set_pos_overflow_int<Policy>(to, dir);
+    n = x << exp;
+    if (n > Extended_Int<Policy, Type>::max)
+      return set_pos_overflow_int<Policy>(to, dir);
+  }
+  to = n;
+  return V_EQ;
+}
+
+template <typename Type>
+inline void
+isqrtrem_(Type& q, Type& r, const Type from) {
+  q = 0;
+  r = from;
+  Type t(1);
+  for (t <<= 8 * sizeof(Type) - 2; t != 0; t >>= 2) {
+    Type s = q + t;
+    if (s <= r) {
+      r -= s;
+      q = s + t;
+    }
+    q >>= 1;
+  }
+}
+
+template <typename Policy, typename Type>
+inline Result
+sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+  Type rem;
+  isqrtrem_(to, rem, from);
+  if (dir == ROUND_IGNORE)
+    return V_GE;
+  if (rem == 0)
+    return V_EQ;
+  return round_gt_int<Policy>(to, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sqrt_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_sqrt_neg, from < 0))
+    return set_special<Policy>(to, V_SQRT_NEG);
+  return sqrt_unsigned_int<Policy>(to, from, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type z;
+  Result r = mul<Policy>(z, x, y, dir);
+  switch (r) {
+  case V_NEG_OVERFLOW:
+  case V_LT:
+    if (to <= 0) {
+      to = z;
+      return r;
+    }
+    return set_special<Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+  case V_POS_OVERFLOW:
+  case V_GT:
+    if (to >= 0) {
+      to = z;
+      return r;
+    }
+    return set_special<Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+  default:
+    return add<Policy>(to, to, z, dir);
+  }
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type z;
+  Result r = mul<Policy>(z, x, y, dir);
+  switch (r) {
+  case V_NEG_OVERFLOW:
+  case V_LT:
+    if (to >= 0)
+      return set_pos_overflow_int<Policy>(to, dir);
+    return V_UNKNOWN_NEG_OVERFLOW;
+  case V_POS_OVERFLOW:
+  case V_GT:
+    if (to <= 0)
+      return set_neg_overflow_int<Policy>(to, dir);
+    return V_UNKNOWN_POS_OVERFLOW;
+  default:
+    return sub<Policy>(to, to, z, dir);
+  }
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_char(std::ostream& os, Type& from,
+	    const Numeric_Format&, Rounding_Dir) {
+  os << (int) from;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_int(std::ostream& os, Type& from, const Numeric_Format&, Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+SPECIALIZE_NEG(signed_int, signed char, signed char)
+SPECIALIZE_NEG(signed_int, signed short, signed short)
+SPECIALIZE_NEG(signed_int, signed int, signed int)
+SPECIALIZE_NEG(signed_int, signed long, signed long)
+SPECIALIZE_NEG(signed_int, signed long long, signed long long)
+SPECIALIZE_NEG(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_NEG(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_NEG(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_NEG(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_NEG(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_ADD(signed_int, signed char, signed char, signed char)
+SPECIALIZE_ADD(signed_int, signed short, signed short, signed short)
+SPECIALIZE_ADD(signed_int, signed int, signed int, signed int)
+SPECIALIZE_ADD(signed_int, signed long, signed long, signed long)
+SPECIALIZE_ADD(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_ADD(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_ADD(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_ADD(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_ADD(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_ADD(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SUB(signed_int, signed char, signed char, signed char)
+SPECIALIZE_SUB(signed_int, signed short, signed short, signed short)
+SPECIALIZE_SUB(signed_int, signed int, signed int, signed int)
+SPECIALIZE_SUB(signed_int, signed long, signed long, signed long)
+SPECIALIZE_SUB(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_SUB(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_SUB(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_SUB(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_SUB(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_SUB(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_MUL(signed_int, signed char, signed char, signed char)
+SPECIALIZE_MUL(signed_int, signed short, signed short, signed short)
+SPECIALIZE_MUL(signed_int, signed int, signed int, signed int)
+SPECIALIZE_MUL(signed_int, signed long, signed long, signed long)
+SPECIALIZE_MUL(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_MUL(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_MUL(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_MUL(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_MUL(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_MUL(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_DIV(signed_int, signed char, signed char, signed char)
+SPECIALIZE_DIV(signed_int, signed short, signed short, signed short)
+SPECIALIZE_DIV(signed_int, signed int, signed int, signed int)
+SPECIALIZE_DIV(signed_int, signed long, signed long, signed long)
+SPECIALIZE_DIV(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_DIV(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_DIV(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_DIV(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_DIV(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_DIV(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_REM(int, signed char, signed char, signed char)
+SPECIALIZE_REM(int, signed short, signed short, signed short)
+SPECIALIZE_REM(int, signed int, signed int, signed int)
+SPECIALIZE_REM(int, signed long, signed long, signed long)
+SPECIALIZE_REM(int, signed long long, signed long long, signed long long)
+SPECIALIZE_REM(int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_REM(int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_REM(int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_REM(int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_REM(int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_MUL2EXP(signed_int, signed char, signed char)
+SPECIALIZE_MUL2EXP(signed_int, signed short, signed short)
+SPECIALIZE_MUL2EXP(signed_int, signed int, signed int)
+SPECIALIZE_MUL2EXP(signed_int, signed long, signed long)
+SPECIALIZE_MUL2EXP(signed_int, signed long long, signed long long)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_DIV2EXP(signed_int, signed char, signed char)
+SPECIALIZE_DIV2EXP(signed_int, signed short, signed short)
+SPECIALIZE_DIV2EXP(signed_int, signed int, signed int)
+SPECIALIZE_DIV2EXP(signed_int, signed long, signed long)
+SPECIALIZE_DIV2EXP(signed_int, signed long long, signed long long)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_SQRT(signed_int, signed char, signed char)
+SPECIALIZE_SQRT(signed_int, signed short, signed short)
+SPECIALIZE_SQRT(signed_int, signed int, signed int)
+SPECIALIZE_SQRT(signed_int, signed long, signed long)
+SPECIALIZE_SQRT(signed_int, signed long long, signed long long)
+SPECIALIZE_SQRT(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_SQRT(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_SQRT(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_SQRT(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_SQRT(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_ABS(generic, signed char, signed char)
+SPECIALIZE_ABS(generic, signed short, signed short)
+SPECIALIZE_ABS(generic, signed int, signed int)
+SPECIALIZE_ABS(generic, signed long, signed long)
+SPECIALIZE_ABS(generic, signed long long, signed long long)
+SPECIALIZE_ABS(generic, unsigned char, unsigned char)
+SPECIALIZE_ABS(generic, unsigned short, unsigned short)
+SPECIALIZE_ABS(generic, unsigned int, unsigned int)
+SPECIALIZE_ABS(generic, unsigned long, unsigned long)
+SPECIALIZE_ABS(generic, unsigned long long, unsigned long long)
+
+SPECIALIZE_GCD(exact, signed char, signed char, signed char)
+SPECIALIZE_GCD(exact, signed short, signed short, signed short)
+SPECIALIZE_GCD(exact, signed int, signed int, signed int)
+SPECIALIZE_GCD(exact, signed long, signed long, signed long)
+SPECIALIZE_GCD(exact, signed long long, signed long long, signed long long)
+SPECIALIZE_GCD(exact, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_GCD(exact, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_GCD(exact, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_GCD(exact, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_GCD(exact, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_GCDEXT(exact, signed char, signed char, signed char, signed char, signed char)
+SPECIALIZE_GCDEXT(exact, signed short, signed short, signed short, signed short, signed short)
+SPECIALIZE_GCDEXT(exact, signed int, signed int, signed int, signed int, signed int)
+SPECIALIZE_GCDEXT(exact, signed long, signed long, signed long, signed long, signed long)
+SPECIALIZE_GCDEXT(exact, signed long long, signed long long, signed long long, signed long long, signed long long)
+SPECIALIZE_GCDEXT(exact, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_GCDEXT(exact, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_GCDEXT(exact, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_GCDEXT(exact, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_GCDEXT(exact, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_LCM(gcd_exact, signed char, signed char, signed char)
+SPECIALIZE_LCM(gcd_exact, signed short, signed short, signed short)
+SPECIALIZE_LCM(gcd_exact, signed int, signed int, signed int)
+SPECIALIZE_LCM(gcd_exact, signed long, signed long, signed long)
+SPECIALIZE_LCM(gcd_exact, signed long long, signed long long, signed long long)
+SPECIALIZE_LCM(gcd_exact, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_LCM(gcd_exact, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_LCM(gcd_exact, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_LCM(gcd_exact, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_LCM(gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SGN(generic, signed char)
+SPECIALIZE_SGN(generic, signed short)
+SPECIALIZE_SGN(generic, signed int)
+SPECIALIZE_SGN(generic, signed long)
+SPECIALIZE_SGN(generic, signed long long)
+SPECIALIZE_SGN(generic, unsigned char)
+SPECIALIZE_SGN(generic, unsigned short)
+SPECIALIZE_SGN(generic, unsigned int)
+SPECIALIZE_SGN(generic, unsigned long)
+SPECIALIZE_SGN(generic, unsigned long long)
+
+SPECIALIZE_CMP(generic, signed char, signed char)
+SPECIALIZE_CMP(generic, signed short, signed short)
+SPECIALIZE_CMP(generic, signed int, signed int)
+SPECIALIZE_CMP(generic, signed long, signed long)
+SPECIALIZE_CMP(generic, signed long long, signed long long)
+SPECIALIZE_CMP(generic, unsigned char, unsigned char)
+SPECIALIZE_CMP(generic, unsigned short, unsigned short)
+SPECIALIZE_CMP(generic, unsigned int, unsigned int)
+SPECIALIZE_CMP(generic, unsigned long, unsigned long)
+SPECIALIZE_CMP(generic, unsigned long long, unsigned long long)
+
+SPECIALIZE_ADD_MUL(int, signed char, signed char, signed char)
+SPECIALIZE_ADD_MUL(int, signed short, signed short, signed short)
+SPECIALIZE_ADD_MUL(int, signed int, signed int, signed int)
+SPECIALIZE_ADD_MUL(int, signed long, signed long, signed long)
+SPECIALIZE_ADD_MUL(int, signed long long, signed long long, signed long long)
+SPECIALIZE_ADD_MUL(int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_ADD_MUL(int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_ADD_MUL(int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_ADD_MUL(int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_ADD_MUL(int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SUB_MUL(int, signed char, signed char, signed char)
+SPECIALIZE_SUB_MUL(int, signed short, signed short, signed short)
+SPECIALIZE_SUB_MUL(int, signed int, signed int, signed int)
+SPECIALIZE_SUB_MUL(int, signed long, signed long, signed long)
+SPECIALIZE_SUB_MUL(int, signed long long, signed long long, signed long long)
+SPECIALIZE_SUB_MUL(int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_SUB_MUL(int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_SUB_MUL(int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_SUB_MUL(int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_SUB_MUL(int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_INPUT(generic, signed char)
+SPECIALIZE_INPUT(generic, signed short)
+SPECIALIZE_INPUT(generic, signed int)
+SPECIALIZE_INPUT(generic, signed long)
+SPECIALIZE_INPUT(generic, signed long long)
+SPECIALIZE_INPUT(generic, unsigned char)
+SPECIALIZE_INPUT(generic, unsigned short)
+SPECIALIZE_INPUT(generic, unsigned int)
+SPECIALIZE_INPUT(generic, unsigned long)
+SPECIALIZE_INPUT(generic, unsigned long long)
+
+SPECIALIZE_OUTPUT(char, signed char)
+SPECIALIZE_OUTPUT(int, signed short)
+SPECIALIZE_OUTPUT(int, signed int)
+SPECIALIZE_OUTPUT(int, signed long)
+SPECIALIZE_OUTPUT(int, signed long long)
+SPECIALIZE_OUTPUT(char, unsigned char)
+SPECIALIZE_OUTPUT(int, unsigned short)
+SPECIALIZE_OUTPUT(int, unsigned int)
+SPECIALIZE_OUTPUT(int, unsigned long)
+SPECIALIZE_OUTPUT(int, unsigned long long)
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_int_inlines_hh)
diff --git a/src/checked_mpq.inlines.hh b/src/checked_mpq.inlines.hh
new file mode 100644
index 0000000..ce5e380
--- /dev/null
+++ b/src/checked_mpq.inlines.hh
@@ -0,0 +1,413 @@
+/* Specialized "checked" functions for GMP's mpq_class numbers.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_checked_mpq_inlines_hh
+#define PPL_checked_mpq_inlines_hh 1
+
+#include <sstream>
+#include <climits>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+classify_mpq(const mpq_class& v, bool nan, bool inf, bool sign) {
+  if ((Policy::handle_nan || Policy::handle_infinity)
+      && ::sgn(v.get_den()) == 0) {
+    int s = ::sgn(v.get_num());
+    if (Policy::handle_nan && (nan || sign) && s == 0)
+      return VC_NAN;
+    if (!inf && !sign)
+      return VC_NORMAL;
+    if (Policy::handle_infinity) {
+      if (s < 0)
+	return inf ? VC_MINUS_INFINITY : V_LT;
+      if (s > 0)
+	return inf ? VC_PLUS_INFINITY : V_GT;
+    }
+  }
+  if (sign)
+    return sgn<Policy>(v);
+  return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpq(const mpq_class& v) {
+  return Policy::handle_nan
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) == 0;
+}
+
+SPECIALIZE_IS_NAN(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpq(const mpq_class& v) {
+  return Policy::handle_infinity
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) < 0;
+}
+
+SPECIALIZE_IS_MINF(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpq(const mpq_class& v) {
+  return Policy::handle_infinity
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) > 0;
+}
+
+SPECIALIZE_IS_PINF(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_int_mpq(const mpq_class& v) {
+  return !is_nan<Policy>(v) && v.get_den() == 1;
+}
+
+SPECIALIZE_IS_INT(mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+set_special_mpq(mpq_class& v, Result r) {
+  Result c = classify(r);
+  if (Policy::handle_nan && c == VC_NAN) {
+    v.get_num() = 0;
+    v.get_den() = 0;
+  }
+  else if (Policy::handle_infinity) {
+    switch (c) {
+    case VC_MINUS_INFINITY:
+      v.get_num() = -1;
+      v.get_den() = 0;
+      break;
+    case VC_PLUS_INFINITY:
+      v.get_num() = 1;
+      v.get_den() = 0;
+      break;
+    default:
+      break;
+    }
+  }
+  return r;
+}
+
+SPECIALIZE_SET_SPECIAL(mpq, mpq_class)
+
+SPECIALIZE_COPY(generic, mpq_class)
+
+template <typename Policy, typename From>
+inline Result
+construct_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+  new (&to) mpq_class(from);
+  return V_EQ;
+}
+
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, mpz_class)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed char)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed short)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed int)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed long)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned char)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned short)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned int)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned long)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, float)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, double)
+
+template <typename Policy, typename From>
+inline Result
+construct_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
+  // FIXME: this is an incredibly inefficient implementation!
+  new (&to) mpq_class;
+  std::stringstream ss;
+  output_float<Policy, long double>(ss, from, Numeric_Format(), dir);
+  return input_mpq(to, ss);
+}
+
+SPECIALIZE_CONSTRUCT(mpq_long_double, mpq_class, long double)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+  to = from;
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, mpz_class)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed char)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed short)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed int)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed long)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned char)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned short)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned int)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned long)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, float)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, double)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpq_signed_int(mpq_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(signed long))
+    to = static_cast<signed long>(from);
+  else {
+    mpz_ptr m = to.get_num().get_mpz_t();
+    if (from >= 0)
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+    else {
+      From n = -from;
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+      mpz_neg(m, m);
+    }
+    to.get_den() = 1;
+  }
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpq_signed_int, mpq_class, signed long long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpq_unsigned_int(mpq_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(unsigned long))
+    to = static_cast<unsigned long>(from);
+  else {
+    mpz_import(to.get_num().get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+    to.get_den() = 1;
+  }
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpq_unsigned_int, mpq_class, unsigned long long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
+  // FIXME: this is an incredibly inefficient implementation!
+  std::stringstream ss;
+  output_float<Policy, long double>(ss, from, Numeric_Format(), dir);
+  return input_mpq(to, ss);
+}
+
+SPECIALIZE_ASSIGN(mpq_long_double, mpq_class, long double)
+
+template <typename Policy>
+inline Result
+neg_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpq_neg(to.get_mpq_t(), from.get_mpq_t());
+  return V_EQ;
+}
+
+SPECIALIZE_NEG(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+add_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x + y;
+  return V_EQ;
+}
+
+SPECIALIZE_ADD(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+sub_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x - y;
+  return V_EQ;
+}
+
+SPECIALIZE_SUB(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x * y;
+  return V_EQ;
+}
+
+SPECIALIZE_MUL(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+div_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  if (CHECK_P(Policy::check_div_zero, sgn(y) == 0))
+    return set_special<Policy>(to, V_DIV_ZERO);
+  to = x / y;
+  return V_EQ;
+}
+
+SPECIALIZE_DIV(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+rem_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  if (CHECK_P(Policy::check_div_zero, sgn(y) == 0))
+    return set_special<Policy>(to, V_MOD_ZERO);
+  to = x / y;
+  to.get_num() %= to.get_den();
+  return V_EQ;
+}
+
+SPECIALIZE_REM(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+mul2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<Policy>(to, x, -exp, dir);
+  mpz_mul_2exp(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), exp);
+  to.get_den() = x.get_den();
+  to.canonicalize();
+  return V_EQ;
+}
+
+SPECIALIZE_MUL2EXP(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+div2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<Policy>(to, x, -exp, dir);
+  to.get_num() = x.get_num();
+  mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+  to.canonicalize();
+  return V_EQ;
+}
+
+SPECIALIZE_DIV2EXP(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+abs_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  to = abs(from);
+  return V_EQ;
+}
+
+SPECIALIZE_ABS(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+add_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+	    Rounding_Dir) {
+  to += x * y;
+  return V_EQ;
+}
+
+SPECIALIZE_ADD_MUL(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+sub_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+	    Rounding_Dir) {
+  to -= x * y;
+  return V_EQ;
+}
+
+SPECIALIZE_SUB_MUL(mpq, mpq_class, mpq_class, mpq_class)
+
+extern unsigned long rational_sqrt_precision_parameter;
+
+template <typename Policy>
+inline Result
+sqrt_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_sqrt_neg, from < 0))
+    return set_special<Policy>(to, V_SQRT_NEG);
+  const unsigned long k = rational_sqrt_precision_parameter;
+  mpz_class& to_num = to.get_num();
+  mul2exp<Policy>(to_num, from.get_num(), 2*k, dir);
+  Result rdiv = div<Policy>(to_num, to_num, from.get_den(), dir);
+  Result rsqrt = sqrt<Policy>(to_num, to_num, dir);
+  mpz_class& to_den = to.get_den();
+  to_den = 1;
+  mul2exp<Policy>(to_den, to_den, k, dir);
+  to.canonicalize();
+  return rdiv != V_EQ ? rdiv : rsqrt;
+}
+
+SPECIALIZE_SQRT(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+input_mpq(mpq_class& to, std::istream& is, Rounding_Dir dir) {
+  Result r = input_mpq(to, is);
+  if (r == VC_MINUS_INFINITY)
+    return assign<Policy>(to, MINUS_INFINITY, dir);
+  if (r == VC_PLUS_INFINITY)
+    return assign<Policy>(to, PLUS_INFINITY, dir);
+  return set_special<Policy>(to, r);
+}
+
+template <typename Policy>
+inline Result
+output_mpq(std::ostream& os,
+	   const mpq_class& from,
+	   const Numeric_Format&,
+	   Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+SPECIALIZE_INPUT(mpq, mpq_class)
+SPECIALIZE_OUTPUT(mpq, mpq_class)
+
+inline memory_size_type
+external_memory_in_bytes(const mpq_class& x) {
+  return external_memory_in_bytes(x.get_num())
+    + external_memory_in_bytes(x.get_den());
+}
+
+} // namespace Checked
+
+//! Returns the precision parameter used for rational square root calculations.
+inline unsigned
+rational_sqrt_precision_parameter() {
+  return Checked::rational_sqrt_precision_parameter;
+}
+
+//! Sets the precision parameter used for rational square root calculations.
+/*!
+  If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+  precision parameter used for rational square root calculations to \p p.
+
+  \exception std::invalid_argument
+  Thrown if \p p is greater than <CODE>INT_MAX</CODE>.
+*/
+inline void
+set_rational_sqrt_precision_parameter(const unsigned p) {
+  if (p <= INT_MAX)
+    Checked::rational_sqrt_precision_parameter = p;
+  else
+    throw std::invalid_argument("PPL::set_rational_sqrt_precision_parameter(p)"
+				" with p > INT_MAX");
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_mpq_inlines_hh)
diff --git a/src/checked_mpz.inlines.hh b/src/checked_mpz.inlines.hh
new file mode 100644
index 0000000..71d83de
--- /dev/null
+++ b/src/checked_mpz.inlines.hh
@@ -0,0 +1,529 @@
+/* Specialized "checked" functions for GMP's mpz_class numbers.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_checked_mpz_inlines_hh
+#define PPL_checked_mpz_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+round_lt_mpz(mpz_class& to, Rounding_Dir dir) {
+  if (dir == ROUND_DOWN) {
+    --to;
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy>
+inline Result
+round_gt_mpz(mpz_class& to, Rounding_Dir dir) {
+  if (dir == ROUND_UP) {
+    ++to;
+    return V_LT;
+  }
+  return V_GT;
+}
+
+// FIXME: change this when Autoconf will support AC_C_TYPEOF.
+#ifdef __GNUC__
+//! Type of the _mp_size field of GMP's __mpz_struct.
+typedef __typeof__(__mpz_struct()._mp_size) mp_size_field_t;
+#else
+//! This is assumed to be the type of the _mp_size field of GMP's __mpz_struct.
+typedef int mp_size_field_t;
+#endif
+
+inline mp_size_field_t
+get_mp_size(const mpz_class &v) {
+  return v.get_mpz_t()->_mp_size;
+}
+
+inline void
+set_mp_size(mpz_class &v, mp_size_field_t size) {
+  v.get_mpz_t()->_mp_size = size;
+}
+
+template <typename Policy>
+inline Result
+classify_mpz(const mpz_class& v, bool nan, bool inf, bool sign) {
+  if (Policy::handle_nan || Policy::handle_infinity) {
+    mp_size_field_t s = get_mp_size(v);
+    if (Policy::handle_nan
+	&& (nan || sign)
+	&& s == Limits<mp_size_field_t>::min + 1)
+      return VC_NAN;
+    if (!inf && !sign)
+      return VC_NORMAL;
+    if (Policy::handle_infinity) {
+      if (s == Limits<mp_size_field_t>::min)
+	return inf ? VC_MINUS_INFINITY : V_LT;
+      if (s == Limits<mp_size_field_t>::max)
+	return inf ? VC_PLUS_INFINITY : V_GT;
+    }
+  }
+  if (sign)
+    return sgn<Policy>(v);
+  return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpz(const mpz_class& v) {
+  return Policy::handle_nan
+    && get_mp_size(v) == Limits<mp_size_field_t>::min + 1;
+}
+
+SPECIALIZE_IS_NAN(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpz(const mpz_class& v) {
+  return Policy::handle_infinity
+    && get_mp_size(v) == Limits<mp_size_field_t>::min;
+}
+
+SPECIALIZE_IS_MINF(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpz(const mpz_class& v) {
+  return Policy::handle_infinity
+    && get_mp_size(v) == Limits<mp_size_field_t>::max;
+}
+
+SPECIALIZE_IS_PINF(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_int_mpz(const mpz_class& v) {
+  return !is_nan<Policy>(v);
+}
+
+SPECIALIZE_IS_INT(mpz, mpz_class)
+
+template <typename Policy>
+inline Result
+set_special_mpz(mpz_class& v, Result r) {
+  Result c = classify(r);
+  if (Policy::handle_nan && c == VC_NAN)
+    set_mp_size(v, Limits<mp_size_field_t>::min + 1);
+  else if (Policy::handle_infinity) {
+    switch (c) {
+    case VC_MINUS_INFINITY:
+      set_mp_size(v, Limits<mp_size_field_t>::min);
+      break;
+    case VC_PLUS_INFINITY:
+      set_mp_size(v, Limits<mp_size_field_t>::max);
+      break;
+    default:
+      break;
+    }
+  }
+  return r;
+}
+
+SPECIALIZE_SET_SPECIAL(mpz, mpz_class)
+
+template <typename Policy>
+inline void
+copy_mpz(mpz_class& to, const mpz_class& from) {
+  if (is_nan_mpz<Policy>(from) ||
+      is_minf_mpz<Policy>(from) || is_pinf_mpz<Policy>(from))
+    set_mp_size(to, get_mp_size(from));
+  else
+    to = from;
+}
+
+SPECIALIZE_COPY(mpz, mpz_class)
+
+template <typename Policy, typename From>
+inline Result
+construct_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+    new (&to) mpz_class(from);
+    return V_EQ;
+}
+
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed char)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed short)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed int)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed long)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned char)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned short)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned int)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+    to = static_cast<signed long>(from);
+    return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed char)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed short)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed int)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed long)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned char)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned short)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned int)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpz_signed_int(mpz_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(signed long))
+    to = static_cast<signed long>(from);
+  else {
+    mpz_ptr m = to.get_mpz_t();
+    if (from >= 0)
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+    else {
+      From n = -from;
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+      mpz_neg(m, m);
+    }
+  }
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpz_signed_int, mpz_class, signed long long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpz_unsigned_int(mpz_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(unsigned long))
+    to = static_cast<unsigned long>(from);
+  else
+    mpz_import(to.get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpz_unsigned_int, mpz_class, unsigned long long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) {
+  if (dir == ROUND_IGNORE) {
+    to = from;
+    return V_LGE;
+  }
+  From n = rint(from);
+  to = n;
+  if (from < n)
+    return round_lt_mpz<Policy>(to, dir);
+  else if (from > n)
+    return round_gt_mpz<Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpz_float, mpz_class, float)
+SPECIALIZE_ASSIGN(mpz_float, mpz_class, double)
+
+template <typename Policy>
+inline Result
+assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) {
+  if (dir == ROUND_IGNORE) {
+    to = from;
+    return V_LGE;
+  }
+  mpz_srcptr n = from.get_num().get_mpz_t();
+  mpz_srcptr d = from.get_den().get_mpz_t();
+  if (dir == ROUND_DOWN) {
+    mpz_fdiv_q(to.get_mpz_t(), n, d);
+    return mpz_divisible_p(n, d) ? V_EQ : V_GT;
+  }
+  else {
+    assert(dir == ROUND_UP);
+    mpz_cdiv_q(to.get_mpz_t(), n, d);
+    return mpz_divisible_p(n, d) ? V_EQ : V_LT;
+  }
+}
+
+SPECIALIZE_ASSIGN(mpz_mpq, mpz_class, mpq_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_mp_minf(To& to, const Minus_Infinity&, Rounding_Dir) {
+  if (Policy::handle_infinity) {
+    set_special<Policy>(to, VC_MINUS_INFINITY);
+    return V_EQ;
+  }
+  return VC_MINUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_mp_pinf(To& to, const Plus_Infinity&, Rounding_Dir) {
+  if (Policy::handle_infinity) {
+    set_special<Policy>(to, VC_PLUS_INFINITY);
+    return V_EQ;
+  }
+  return VC_PLUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_mp_nan(To& to, const Not_A_Number&, Rounding_Dir) {
+  if (Policy::handle_nan) {
+    set_special<Policy>(to, VC_NAN);
+    return V_EQ;
+  }
+  return VC_NAN;
+}
+
+SPECIALIZE_ASSIGN(mp_minf, mpz_class, Minus_Infinity)
+SPECIALIZE_ASSIGN(mp_pinf, mpz_class, Plus_Infinity)
+SPECIALIZE_ASSIGN(mp_nan, mpz_class, Not_A_Number)
+SPECIALIZE_ASSIGN(mp_minf, mpq_class, Minus_Infinity)
+SPECIALIZE_ASSIGN(mp_pinf, mpq_class, Plus_Infinity)
+SPECIALIZE_ASSIGN(mp_nan, mpq_class, Not_A_Number)
+
+template <typename Policy>
+inline Result
+neg_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+  mpz_neg(to.get_mpz_t(), from.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_NEG(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+add_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x + y;
+  return V_EQ;
+}
+
+SPECIALIZE_ADD(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+sub_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x - y;
+  return V_EQ;
+}
+
+SPECIALIZE_SUB(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x * y;
+  return V_EQ;
+}
+
+SPECIALIZE_MUL(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+div_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_div_zero, ::sgn(y) == 0))
+    return set_special<Policy>(to, V_DIV_ZERO);
+  mpz_srcptr n = x.get_mpz_t();
+  mpz_srcptr d = y.get_mpz_t();
+  if (dir == ROUND_IGNORE) {
+    mpz_divexact(to.get_mpz_t(), n, d);
+    return V_LGE;
+  }
+  if (dir == ROUND_DOWN) {
+    mpz_fdiv_q(to.get_mpz_t(), n, d);
+    return mpz_divisible_p(n, d) ? V_EQ : V_GT;
+  }
+  else {
+    assert(dir == ROUND_UP);
+    mpz_cdiv_q(to.get_mpz_t(), n, d);
+    return mpz_divisible_p(n, d) ? V_EQ : V_LT;
+  }
+}
+
+SPECIALIZE_DIV(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+rem_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  if (CHECK_P(Policy::check_div_zero, ::sgn(y) == 0))
+    return set_special<Policy>(to, V_MOD_ZERO);
+  to = x % y;
+  return V_EQ;
+}
+
+SPECIALIZE_REM(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+mul2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<Policy>(to, x, -exp, dir);
+  mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+  return V_EQ;
+}
+
+SPECIALIZE_MUL2EXP(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+div2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<Policy>(to, x, -exp, dir);
+  mpz_srcptr n = x.get_mpz_t();
+  if (dir == ROUND_IGNORE) {
+    mpz_tdiv_q_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+    return V_LGE;
+  }
+  if (dir == ROUND_DOWN) {
+    mpz_fdiv_q_2exp(to.get_mpz_t(), n, exp);
+    return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_GT;
+  }
+  else {
+    assert(dir == ROUND_UP);
+    mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp);
+    return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_LT;
+  }
+}
+
+SPECIALIZE_DIV2EXP(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+abs_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+  to = abs(from);
+  return V_EQ;
+}
+
+SPECIALIZE_ABS(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+add_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	    Rounding_Dir) {
+  mpz_addmul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_ADD_MUL(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+sub_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	    Rounding_Dir) {
+  mpz_submul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_SUB_MUL(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+gcd_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  mpz_gcd(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_GCD(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+gcdext_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	   mpz_class& s, mpz_class& t, Rounding_Dir) {
+  mpz_gcdext(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t(),
+	     s.get_mpz_t(), t.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_GCDEXT(mpz, mpz_class, mpz_class, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+lcm_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  mpz_lcm(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_LCM(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+sqrt_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_sqrt_neg, from < 0))
+    return set_special<Policy>(to, V_SQRT_NEG);
+  if (dir == ROUND_IGNORE) {
+    to = sqrt(from);
+    return V_GE;
+  }
+  mpz_class r;
+  mpz_sqrtrem(to.get_mpz_t(), r.get_mpz_t(), from.get_mpz_t());
+  if (r == 0)
+    return V_EQ;
+  return round_gt_mpz<Policy>(to, dir);
+}
+
+SPECIALIZE_SQRT(mpz, mpz_class, mpz_class)
+
+template <typename Policy, typename Type>
+inline Result
+sgn_mp(const Type& x) {
+  int i = ::sgn(x);
+  return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
+}
+
+SPECIALIZE_SGN(mp, mpz_class)
+SPECIALIZE_SGN(mp, mpq_class)
+
+template <typename Policy, typename Type>
+inline Result
+cmp_mp(const Type& x, const Type& y) {
+  int i = ::cmp(x, y);
+  return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
+}
+
+SPECIALIZE_CMP(mp, mpz_class, mpz_class)
+SPECIALIZE_CMP(mp, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+output_mpz(std::ostream& os, const mpz_class& from, const Numeric_Format&,
+	   Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+SPECIALIZE_INPUT(generic, mpz_class)
+SPECIALIZE_OUTPUT(mpz, mpz_class)
+
+inline memory_size_type
+external_memory_in_bytes(const mpz_class& x) {
+  return x.get_mpz_t()[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_mpz_inlines_hh)
diff --git a/src/checked_numeric_limits.hh b/src/checked_numeric_limits.hh
new file mode 100644
index 0000000..a79ac60
--- /dev/null
+++ b/src/checked_numeric_limits.hh
@@ -0,0 +1,161 @@
+/* Specializations of std::numeric_limits for "checked" types.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_checked_numeric_limits_hh
+#define PPL_checked_numeric_limits_hh 1
+
+#include "Checked_Number.defs.hh"
+#include "checked_int.inlines.hh"
+#include "mp_numeric_limits.hh"
+#include <limits>
+
+namespace std {
+
+#define PPL_SPECIALIZE_LIMITS_INT(T)					\
+/*! \brief Partial specialization of std::numeric_limits. */		\
+template <typename Policy>						\
+class numeric_limits<Parma_Polyhedra_Library::Checked_Number<T, Policy> > \
+  : public numeric_limits<T> {						\
+ private:								\
+  typedef Parma_Polyhedra_Library::Checked_Number<T, Policy> Type;	\
+									\
+ public:								\
+  static const bool has_infinity = Policy::handle_infinity;		\
+  static const bool has_quiet_NaN =  Policy::handle_nan;			\
+									\
+  static Type min() {							\
+    return Parma_Polyhedra_Library::Checked::Extended_Int<Policy, T>::min; \
+  }									\
+									\
+  static Type max() {							\
+    return Parma_Polyhedra_Library::Checked::Extended_Int<Policy, T>::max; \
+  }									\
+									\
+  static Type infinity() {						\
+    return								\
+      Policy::handle_infinity						\
+      ? Parma_Polyhedra_Library::PLUS_INFINITY				\
+      : static_cast<Type>(0);						\
+  }									\
+									\
+  static Type quiet_NaN() {						\
+    return								\
+      Policy::handle_nan							\
+      ? Parma_Polyhedra_Library::NOT_A_NUMBER				\
+      : static_cast<Type>(0);						\
+  }									\
+};
+
+PPL_SPECIALIZE_LIMITS_INT(signed char)
+PPL_SPECIALIZE_LIMITS_INT(signed short)
+PPL_SPECIALIZE_LIMITS_INT(signed int)
+PPL_SPECIALIZE_LIMITS_INT(signed long)
+PPL_SPECIALIZE_LIMITS_INT(signed long long)
+
+PPL_SPECIALIZE_LIMITS_INT(unsigned char)
+PPL_SPECIALIZE_LIMITS_INT(unsigned short)
+PPL_SPECIALIZE_LIMITS_INT(unsigned int)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long long)
+
+#undef PPL_SPECIALIZE_LIMITS_INT
+
+#define PPL_SPECIALIZE_LIMITS_FLOAT(T)					\
+/*! \brief Partial specialization of std::numeric_limits. */		\
+template <typename Policy>						\
+struct numeric_limits<Parma_Polyhedra_Library::Checked_Number<T, Policy> > \
+  : public numeric_limits<T> {						\
+};
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_LIMITS_FLOAT(float)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(double)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(long double)
+#endif
+
+#undef PPL_SPECIALIZE_LIMITS_FLOAT
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+class
+numeric_limits<Parma_Polyhedra_Library::Checked_Number<mpz_class, Policy> >
+  : public numeric_limits<mpz_class> {
+private:
+  typedef Parma_Polyhedra_Library::Checked_Number<mpz_class, Policy> Type;
+
+public:
+  static const bool has_infinity = Policy::handle_infinity;
+  static const bool has_quiet_NaN =  Policy::handle_nan;
+
+  static Type infinity() {
+    return
+      Policy::handle_infinity
+      ? Parma_Polyhedra_Library::PLUS_INFINITY
+      : static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return
+      Policy::handle_nan
+      ? Parma_Polyhedra_Library::NOT_A_NUMBER
+      : static_cast<Type>(0);
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+class
+numeric_limits<Parma_Polyhedra_Library::Checked_Number<mpq_class, Policy> >
+: public numeric_limits<mpq_class> {
+private:
+  typedef Parma_Polyhedra_Library::Checked_Number<mpq_class, Policy> Type;
+
+public:
+  static const bool has_infinity = Policy::handle_infinity;
+  static const bool has_quiet_NaN =  Policy::handle_nan;
+
+  static Type infinity() {
+    return
+      Policy::handle_infinity
+      ? Parma_Polyhedra_Library::PLUS_INFINITY
+      : static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return
+      Policy::handle_nan
+      ? Parma_Polyhedra_Library::NOT_A_NUMBER
+      : static_cast<Type>(0);
+  }
+};
+
+} // namespace std
+
+#endif // !defined(PPL_checked_numeric_limits_hh)
diff --git a/src/compiler.hh b/src/compiler.hh
new file mode 100644
index 0000000..657f469
--- /dev/null
+++ b/src/compiler.hh
@@ -0,0 +1,38 @@
+/* C++ compiler related stuff.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_compiler_hh
+#define PPL_compiler_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Used to avoid unused variable warnings from the compiler.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline void
+used(const T&) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_compiler_hh)
diff --git a/src/conversion.cc b/src/conversion.cc
new file mode 100644
index 0000000..c60ffe4
--- /dev/null
+++ b/src/conversion.cc
@@ -0,0 +1,856 @@
+/* Polyhedron class implementation: conversion().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Linear_Row.defs.hh"
+#include "Linear_System.defs.hh"
+#include "Saturation_Row.defs.hh"
+#include "Saturation_Matrix.defs.hh"
+#include "Polyhedron.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cstddef>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+// True if abandon_expensive_computations should be checked often,
+// where the meaning of "often" is as stated in the documentation
+// of that variable.
+#define REACTIVE_ABANDONING 1
+
+/*!
+  \return
+  The number of lines of the polyhedron or the number of equality
+  constraints in the result of conversion.
+
+  \param source
+  The system to use to convert \p dest: it may be modified;
+
+  \param start
+  The index of \p source row from which conversion begin;
+
+  \param dest
+  The result of the conversion;
+
+  \param sat
+  The saturation matrix telling us, for each row in \p source, which
+  are the rows of \p dest that satisfy but do not saturate it;
+
+  \param num_lines_or_equalities
+  The number of rows in the system \p dest that are either lines of
+  the polyhedron (when \p dest is a system of generators) or equality
+  constraints (when \p dest is a system of constraints).
+
+  For simplicity, all the following comments assume we are converting a
+  constraint system \p source to a generator system \p dest;
+  the comments for the symmetric case can be obtained by duality.
+
+  If some of the constraints in \p source are redundant, they will be removed.
+  This is why the \p source is not declared to be a constant parameter.
+
+  If \p start is 0, then \p source is a sorted system; also, \p dest is
+  a generator system corresponding to an empty constraint system.
+  If otherwise \p start is greater than 0, then the two sub-systems of
+  \p source made by the non-pending rows and the pending rows, respectively,
+  are both sorted; also, \p dest is the generator system corresponding to
+  the non-pending constraints of \p source.
+
+  Independently from the value of \p start, \p dest has lines from index 0
+  to index \p num_lines_or_equalities - 1 and rays/points from index
+  \p num_lines_or_equalities to the last of its rows.
+
+  Note that here the rows of \p sat are indexed by rows of \p dest
+  and its columns are indexed by rows of \p source.
+
+  We know that polyhedra can be represented by both a system of
+  constraints or a system of generators (points, rays and lines)
+  (see Section \ref representation).
+  When we have both descriptions for a polyhedron \f$P\f$
+  we have what is called a <EM>double description</EM>
+  (or <EM>DD pair</EM>) for \f$P\f$.
+
+  Here, the <EM>representation system</EM> refers to the system \f$C\f$
+  whose rows represent the constraints that characterize \f$P\f$
+  and the <EM>generating system</EM>, the system \f$G\f$ whose rows
+  represent the generators of \f$P\f$.
+  We say that a pair \f$(C, G)\f$ of (real) systems is
+  a <EM>double description pair</EM> if
+  \f[
+    C\vect{x} \geq \vect{0}
+      \quad\iff\quad
+        \exists \vect{\lambda} \geq \vect{0} \mathrel{.}
+	\vect{x} = G\vect{\lambda}.
+  \f]
+
+  The term "double description" is quite natural in the sense that
+  such a pair contains two different description of the same object.
+  In fact, if we refer to the cone representation of a polyhedron \f$P\f$
+  and we call \f$C\f$ and \f$G\f$ the systems of constraints and
+  rays respectively, we have
+  \f[
+    P = \{\, \vect{x} \in \Rset^n \mid C\vect{x} \geq \vect{0}\, \}
+      = \{\, \vect{x} \in \Rset^n \mid \vect{x} = G\vect{\lambda}
+      \text{ for some } \vect{\lambda} \geq \vect{0}\, \}.
+  \f]
+
+  Because of the theorem of Minkowski (see Section \ref prelims),
+  we can say that, given a \f$m \times n\f$ representation system
+  \f$C\f$ such that
+  \f$\mathop{\mathrm{rank}}(C) = n = \mathit{dimension of the whole space}\f$
+  for a non-empty polyhedron \f$P\f$,
+  it is always possible to find a generating system \f$G\f$ for \f$P\f$
+  such that \f$(C, G)\f$ is a DD pair.
+  Conversely, Weyl's theorem ensures that, for each generating system
+  \f$G\f$, it is possible to find a representation system \f$C\f$
+  such that \f$(C, G)\f$ is a DD pair.
+
+  For efficiency reasons, our representation of polyhedra makes use
+  of a double description.
+  We are thus left with two problems:
+    -# given \f$C\f$ find \f$G\f$ such that \f$(C, G)\f$ is a DD pair;
+    -# given \f$G\f$ find \f$C\f$ such that \f$(C, G)\f$ is a DD pair.
+
+  Using Farkas' lemma we can prove that these two problems are
+  computationally equivalent (i.e., linear-time reducible to each other).
+  Farkas' lemma establishes a fundamental property of vectors in
+  \f$\Rset^n\f$ that, in a sense, captures the essence of duality.
+  Consider a matrix \f$A \in \Rset^{m \times n}\f$ and let
+  \f$\{ \vect{a}_1, \ldots, \vect{a}_m \}\f$ be its set of row vectors.
+  Consider also another vector \f$\vect{c} \in \Rset^n\f$ such that,
+  whenever a vector \f$\vect{y} \in \Rset^n\f$ has a non-negative projection
+  on the \f$\vect{a}_i\f$'s, it also has a non-negative projection
+  on \f$\vect{c}\f$.
+  The lemma states that \f$\vect{c}\f$ has this property if and only if
+  it is in the cone generated by the \f$\vect{a}_i\f$'s.
+  Formally, the lemma states the equivalence of the two following
+  assertions:
+    -# \f$
+         \forall \vect{y}
+           \mathrel{:} (A\vect{y} \geq 0 \implies
+	   \langle \vect{y},\vect{c} \rangle \geq 0)
+       \f$;
+    -# \f$
+         \exists \vect{\lambda} \geq \vect{0}
+           \mathrel{.} \vect{c}^\mathrm{T} = \vect{\lambda}^\mathrm{T}A
+       \f$.
+
+  With this result we can prove that \f$(C, G)\f$ is a DD pair
+  if and only if \f$(G^\mathrm{T}, C^\mathrm{T})\f$ is a DD pair.
+
+  Suppose \f$(C, G)\f$ is a DD pair.
+  Thus, for each \f$x\f$ of the appropriate dimension,
+  \f$C\vect{x} \geq \vect{0}\f$ if and only if
+  \f$\exists \lambda \geq 0 \mathrel{.} \vect{x} = G\vect{\lambda}\f$,
+  which is of course equivalent to
+  \f$
+    \exists \vect{\lambda} \geq \vect{0}
+      \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T}
+  \f$.
+
+  First, we assume that \f$\vect{z}\f$ is such that
+  \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$
+  and we will show that
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z} = C^\mathrm{T}\vect{\mu}\f$.
+  Let \f$\vect{x}\f$ be such that \f$C\vect{x} \geq \vect{0}\f$.
+  Since \f$(C, G)\f$ is a DD pair, this is equivalent to
+  \f$
+    \exists \vect{\lambda} \geq \vect{0}
+      \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T}
+  \f$,
+  which, by Farkas' lemma is equivalent to
+  \f$
+    \forall \vect{y} \mathrel{:} (G^\mathrm{T}\vect{y} \geq \vect{0} \implies
+                                 \langle \vect{y}, \vect{x} \rangle \geq 0)
+  \f$.
+  Taking \f$\vect{y} = \vect{z}\f$ and recalling our assumption that
+  \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$
+  we can conclude that \f$\langle \vect{z}, \vect{x} \rangle \geq 0\f$,
+  that is equivalent to \f$\langle \vect{x}, \vect{z} \rangle \geq 0\f$.
+  We have thus established that
+  \f$
+    \forall \vect{x} \mathrel{:} (C\vect{x} \geq \vect{0} \implies
+    \langle \vect{x}, \vect{z} \rangle \geq 0)
+  \f$.
+  By Farkas' lemma, this is equivalent to
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T} C\f$,
+  which is equivalent to what we wanted to prove, that is,
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z} = C^\mathrm{T}\vect{\mu}\f$.
+
+  In order to prove the reverse implication, the following observation
+  turns out to be useful:
+  when \f$(C, G)\f$ is a DD pair, \f$CG \geq 0\f$.
+  In fact,
+  let \f$\vect{e}_j\f$ be the vector whose components are all \f$0\f$
+  apart from the \f$j\f$-th one, which is \f$1\f$.
+  Clearly \f$\vect{e}_j \geq \vect{0}\f$ and, taking
+  \f$\vect{\lambda} = \vect{e}_j\f$ and
+  \f$\vect{x} = G\vect{\lambda} = G \vect{e}_j\f$, we have
+  \f$C\vect{x} = C(G \vect{e}_j) = (CG)\vect{e}_j \geq \vect{0}\f$,
+  since \f$(C, G)\f$ is a DD pair.
+  Thus, as \f$(CG)\vect{e}_j\f$ is the \f$j\f$-th column of \f$CG\f$
+  and since the choice of \f$j\f$ was arbitrary, \f$CG \geq \vect{0}\f$.
+
+  We now assume that \f$\vect{z}\f$ is such that
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z} = C^\mathrm{T}\vect{\mu}\f$
+  and we will prove that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$.
+  By Farkas' lemma, the assumption
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T}C\f$,
+  is equivalent to
+  \f$\forall \vect{y} \mathrel{:} (C\vect{y} \geq \vect{0}
+  \implies \langle \vect{y}, \vect{z} \rangle \geq 0)\f$.
+  If we take \f$\vect{y} = G\vect{e}_j\f$ then \f$C\vect{y}
+                 = CG\vect{e}_j \geq 0\f$,
+  since \f$CG \geq \vect{0}\f$.
+  So
+  \f$
+    \langle \vect{y}, \vect{z} \rangle
+      = (\vect{e}_j^\mathrm{T}G^\mathrm{T}) \vect{z}
+      = \vect{e}_j^\mathrm{T}(G^\mathrm{T} \vect{z})
+      \geq 0
+  \f$,
+  that is, the \f$j\f$-th component of \f$G^\mathrm{T}\vect{z}\f$
+  is non-negative. The arbitrary choice of \f$j\f$ allows us to conclude
+  that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$, as required.
+
+  In view of this result, the following exposition assumes, for clarity,
+  that the conversion being performed is from constraints to generators.
+  Thus, even if the roles of \p source and \p dest can be interchanged,
+  in the sequel we assume the \p source system will contain the constraints
+  that represent the polyhedron and the \p dest system will contain
+  the generator that generates it.
+
+  There are some observations that are useful to understand this function:
+
+  Observation 1: Let \f$A\f$ be a system of constraints that generate
+  the polyhedron \f$P\f$ and \f$\vect{c}\f$ a new constraint that must
+  be added. Suppose that there is a line \f$\vect{z}\f$ that does not
+  saturate the constraint \f$\vect{c}\f$. If we combine the old lines
+  and rays that do not saturate \f$\vect{c}\f$ (except \f$\vect{z}\f$)
+  with \f$\vect{z}\f$ such that the new ones saturate \f$\vect{c}\f$,
+  the new lines and rays also saturate the constraints  saturated by
+  the old lines and rays.
+
+  In fact, if \f$\vect{y}_1\f$ is the old generator that does not saturate
+  \f$\vect{c}\f$, \f$\vect{y}_2\f$ is the new one such that
+  \f[
+    \vect{y}_2 = \lambda \vect{y}_1 + \mu \vect{z}
+  \f]
+  and \f$\vect{c}_1\f$ is a previous constraint that \f$\vect{y}_1\f$
+  and \f$\vect{z}\f$ saturates, we can see
+  \f[
+    \langle \vect{c}_1, \vect{y}_2 \rangle
+    = \langle \vect{c}_1, (\lambda \vect{y}_1 + \mu \vect{z}) \rangle
+    = \lambda \langle \vect{c}_1, \vect{y}_1 \rangle
+       + \mu \langle \vect{c}_1, \vect{z} \rangle
+       = 0 + \mu \langle \vect{c}_1, \vect{z} \rangle
+       = \mu \langle \vect{c}_1, \vect{z} \rangle
+  \f]
+  and
+  \f[
+    \mu \langle \vect{c}_1, \vect{z} \rangle = 0.
+  \f]
+
+  Proposition 1: Let \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ be distinct
+  rays of \f$P\f$.
+  Then the following statements are equivalent:
+  a) \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are adjacent extreme rays
+     (see Section \ref prelims);
+  b) \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are extreme rays and the
+     rank of the system composed by the constraints saturated by both
+     \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ is equal to
+     \f$d - 2\f$, where \f$d\f$ is the rank of the system of constraints.
+
+  In fact, let \f$F\f$ be the system of generators that saturate the
+  constraints saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$.
+  If b) holds, the set \f$F\f$ is 2-dimensional and \f$\vect{r}_1\f$ and
+  \f$\vect{r}_2\f$ generate this set. So, every generator
+  \f$\vect{x}\f$ of \f$F\f$ can be built as a combination of
+  \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$, i.e.
+  \f[
+    \vect{x} = \lambda \vect{r}_1 + \mu \vect{r}_2.
+  \f]
+  This combination is non-negative because there exists at least a
+  constraint \f$c\f$ saturated by \f$\vect{r}_1\f$ and not
+  \f$\vect{r}_2\f$ (or vice versa) (because they are distinct) for which
+  \f[
+    \langle \vect{c}, \vect{x} \rangle \geq 0
+  \f]
+  and
+  \f[
+    \langle \vect{c}, \vect{x} \rangle
+    = \lambda \langle \vect{c}, \vect{r}_1 \rangle
+                           (or = \mu \langle \vect{c}, \vect{r}_2 \rangle).
+  \f]
+  So, there is no other extreme ray in \f$F\f$ and a) holds.
+  Otherwise, if b) does not hold, the rank of the system generated by
+  the constraints saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$
+  is equal to \f$d - k\f$, with \p k \>= 3, the set \f$F\f$ is
+  \p k -dimensional and at least \p k extreme rays are necessary
+  to generate \f$F\f$.
+  So, \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are not adjacent and
+  a) does not hold.
+
+  Proposition 2: When we build the new system of generators starting from
+  a system \f$A\f$ of constraints of \f$P\f$, if \f$\vect{c}\f$ is the
+  constraint to add to \f$A\f$ and all lines of \f$P\f$ saturate
+  \f$\vect{c}\f$, the new set of rays is the union of those rays that
+  saturate, of those that satisfy and of a set \f$\overline Q\f$ of
+  rays such that each of them
+  -# lies on the hyper-plane represented by the k-th constraint,
+  -# is a positive combination of two adjacent rays \f$\vect{r}_1\f$ and
+     \f$\vect{r}_2\f$ such that the first one satisfies the constraint and
+     the other does not satisfy it.
+  If the adjacency property is not taken in account, the new set of
+  rays is not irredundant, in general.
+
+  In fact, if \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are not adjacent,
+  the rank of the system composed by the constraints saturated by both
+  \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ is different from \f$d - 2\f$
+  (see the previous proposition) or neither \f$\vect{r}_1\f$ nor
+  \f$\vect{r}_2\f$ are extreme rays. Since the new ray \f$\vect{r}\f$
+  is a combination of \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$,
+  it saturates the same constraints saturated by both \f$\vect{r}_1\f$ and
+  \f$\vect{r}_2\f$.
+  If the rank is less than \f$d - 2\f$, the rank of
+  the system composed by \f$\vect{c}\f$ (that is saturated by \f$\vect{r}\f$)
+  and by the constraints of \f$A\f$ saturated by \f$\vect{r}\f$  is less
+  than \f$d - 1\f$. It means that \f$r\f$ is redundant (see
+  Section \ref prelims).
+  If neither \f$\vect{r}_1\f$ nor \f$\vect{r}_2\f$ are extreme rays,
+  they belong to a 2-dimensional face containing exactly two extreme rays
+  of \f$P\f$.
+  These two adjacent rays build a ray equal to \f$\vect{r}\f$ and so
+  \f$\vect{r}\f$ is redundant.
+*/
+PPL::dimension_type
+PPL::Polyhedron::conversion(Linear_System& source,
+			    const dimension_type start,
+			    Linear_System& dest,
+			    Saturation_Matrix& sat,
+			    dimension_type num_lines_or_equalities) {
+  dimension_type source_num_rows = source.num_rows();
+  dimension_type dest_num_rows = dest.num_rows();
+  const dimension_type source_num_columns = source.num_columns();
+  const dimension_type dest_num_columns = dest.num_columns();
+
+  // By construction, the number of columns of `sat' is the same as
+  // the number of rows of `source'; also, the number of rows of `sat'
+  // is the same as the number of rows of `dest'.
+  assert(source_num_rows == sat.num_columns());
+  assert(dest_num_rows == sat.num_rows());
+
+  // If `start > 0', then we are converting the pending constraints.
+  assert(start == 0 || start == source.first_pending_row());
+
+  // During the iteration on the constraints in `source' we may identify
+  // constraints that are redundant: these have to be removed by swapping
+  // the rows of `source', taking care not to compromise the sortedness
+  // of the constraints that still have to be considered.
+  // To this end, the following counter keeps the number of redundant
+  // constraints seen so far, to be used as a displacement when swapping rows.
+  dimension_type source_num_redundant = 0;
+
+  TEMP_INTEGER(normalized_sp_i);
+  TEMP_INTEGER(normalized_sp_o);
+
+  // Converting the sub-system of `source' having rows with indexes
+  // from `start' to the last one (i.e., `source_num_rows' - 1).
+  for (dimension_type k = start; k < source_num_rows; ) {
+
+    // All the `source_num_redundant' redundant constraints identified so far
+    // have consecutive indices starting from `k'.
+    if (source_num_redundant > 0)
+      // Let the next constraint have index `k'.
+      // There is no need to swap the columns of `sat' (all zeroes).
+      std::swap(source[k], source[k+source_num_redundant]);
+
+    Linear_Row& source_k = source[k];
+
+    // Constraints and generators must have the same dimension,
+    // otherwise the scalar product below will bomb.
+    assert(source_num_columns == dest_num_columns);
+
+    // `scalar_prod[i]' will contain the scalar product
+    // of the constraint `source_k' and the generator `dest[i]'.
+    // This product is 0 iff the generator saturates the constraint.
+    static std::vector<Coefficient> scalar_prod;
+    const int needed_space = dest_num_rows - scalar_prod.size();
+    if (needed_space > 0)
+      scalar_prod.insert(scalar_prod.end(), needed_space, Coefficient_zero());
+    // `index_non_zero' will indicate the first generator in `dest'
+    // that does not saturate the constraint `source_k'.
+    dimension_type index_non_zero = 0;
+    for ( ; index_non_zero < dest_num_rows; ++index_non_zero) {
+      Scalar_Products::assign(scalar_prod[index_non_zero],
+			      source_k,
+			      dest[index_non_zero]);
+      if (scalar_prod[index_non_zero] != 0)
+	// The generator does not saturate the constraint.
+	break;
+#if REACTIVE_ABANDONING
+      // Check if the client has requested abandoning all exponential
+      // computations.  If so, the exception specified by the client
+      // is thrown now.
+      maybe_abandon();
+#endif
+    }
+    for (dimension_type i = index_non_zero + 1; i < dest_num_rows; ++i) {
+      Scalar_Products::assign(scalar_prod[i], source_k, dest[i]);
+#if REACTIVE_ABANDONING
+      maybe_abandon();
+#endif
+    }
+
+    // We first treat the case when `index_non_zero' is less than
+    // `num_lines_or_equalities', i.e., when the generator that
+    // does not saturate the constraint `source_k' is a line.
+    // The other case (described later) is when all the lines
+    // in `dest' (i.e., all the rows having indexes less than
+    // `num_lines_or_equalities') do saturate the constraint.
+
+    if (index_non_zero < num_lines_or_equalities) {
+      // Since the generator `dest[index_non_zero]' does not saturate
+      // the constraint `source_k', it can no longer be a line
+      // (see saturation rule in Section \ref prelims).
+      // Therefore, we first transform it to a ray.
+      dest[index_non_zero].set_is_ray_or_point_or_inequality();
+      // Of the two possible choices, we select the ray satisfying
+      // the constraint (namely, the ray whose scalar product
+      // with the constraint gives a positive result).
+      if (scalar_prod[index_non_zero] < 0) {
+	// The ray `dest[index_non_zero]' lies on the wrong half-space:
+	// we change it to have the opposite direction.
+	neg_assign(scalar_prod[index_non_zero]);
+	for (dimension_type j = dest_num_columns; j-- > 0; )
+	  neg_assign(dest[index_non_zero][j]);
+      }
+      // Having changed a line to a ray, we set `dest' to be a
+      // non-sorted system, we decrement the number of lines of `dest' and,
+      // if necessary, we move the new ray below all the remaining lines.
+      dest.set_sorted(false);
+      --num_lines_or_equalities;
+      if (index_non_zero != num_lines_or_equalities) {
+	std::swap(dest[index_non_zero],
+		  dest[num_lines_or_equalities]);
+	std::swap(scalar_prod[index_non_zero],
+		  scalar_prod[num_lines_or_equalities]);
+      }
+      Linear_Row& dest_nle = dest[num_lines_or_equalities];
+
+      // Computing the new lineality space.
+      // Since each line must lie on the hyper-plane corresponding to
+      // the constraint `source_k', the scalar product between
+      // the line and the constraint must be 0.
+      // This property already holds for the lines having indexes
+      // between 0 and `index_non_zero' - 1.
+      // We have to consider the remaining lines, having indexes
+      // between `index_non_zero' and `num_lines_or_equalities' - 1.
+      // Each line that does not saturate the constraint has to be
+      // linearly combined with generator `dest_nle' so that the
+      // resulting new line saturates the constraint.
+      // Note that, by Observation 1 above, the resulting new line
+      // will still saturate all the constraints that were saturated by
+      // the old line.
+
+      Coefficient& scalar_prod_nle = scalar_prod[num_lines_or_equalities];
+      for (dimension_type
+	     i = index_non_zero; i < num_lines_or_equalities; ++i) {
+	if (scalar_prod[i] != 0) {
+	  // The following fragment optimizes the computation of
+	  //
+	  // Coefficient scale = scalar_prod[i];
+	  // scale.gcd_assign(scalar_prod_nle);
+	  // Coefficient normalized_sp_i = scalar_prod[i] / scale;
+	  // Coefficient normalized_sp_n = scalar_prod_nle / scale;
+	  // for (dimension_type c = dest_num_columns; c-- > 0; ) {
+	  //   dest[i][c] *= normalized_sp_n;
+	  //   dest[i][c] -= normalized_sp_i * dest_nle[c];
+	  // }
+	  normalize2(scalar_prod[i],
+		     scalar_prod_nle,
+		     normalized_sp_i,
+		     normalized_sp_o);
+	  Linear_Row& dest_i = dest[i];
+	  for (dimension_type c = dest_num_columns; c-- > 0; ) {
+	    Coefficient& dest_i_c = dest_i[c];
+	    dest_i_c *= normalized_sp_o;
+	    sub_mul_assign(dest_i_c, normalized_sp_i, dest_nle[c]);
+	  }
+	  dest_i.strong_normalize();
+	  scalar_prod[i] = 0;
+	  // `dest' has already been set as non-sorted.
+	}
+      }
+
+      // Computing the new pointed cone.
+      // Similarly to what we have done during the computation of
+      // the lineality space, we consider all the remaining rays
+      // (having indexes strictly greater than `num_lines_or_equalities')
+      // that do not saturate the constraint `source_k'. These rays
+      // are positively combined with the ray `dest_nle' so that the
+      // resulting new rays saturate the constraint.
+      for (dimension_type
+	     i = num_lines_or_equalities + 1; i < dest_num_rows; ++i) {
+	if (scalar_prod[i] != 0) {
+	  // The following fragment optimizes the computation of
+	  //
+	  // Coefficient scale = scalar_prod[i];
+	  // scale.gcd_assign(scalar_prod_nle);
+	  // Coefficient normalized_sp_i = scalar_prod[i] / scale;
+	  // Coefficient normalized_sp_n = scalar_prod_nle / scale;
+	  // for (dimension_type c = dest_num_columns; c-- > 0; ) {
+	  //   dest[i][c] *= normalized_sp_n;
+	  //   dest[i][c] -= normalized_sp_i * dest_nle[c];
+	  // }
+	  normalize2(scalar_prod[i],
+		     scalar_prod_nle,
+		     normalized_sp_i,
+		     normalized_sp_o);
+	  Linear_Row& dest_i = dest[i];
+	  for (dimension_type c = dest_num_columns; c-- > 0; ) {
+	    Coefficient& dest_i_c = dest_i[c];
+	    dest_i_c *= normalized_sp_o;
+	    sub_mul_assign(dest_i_c, normalized_sp_i, dest_nle[c]);
+	  }
+	  dest_i.strong_normalize();
+	  scalar_prod[i] = 0;
+	  // `dest' has already been set as non-sorted.
+	}
+#if REACTIVE_ABANDONING
+	maybe_abandon();
+#endif
+      }
+      // Since the `scalar_prod_nle' is positive (by construction), it
+      // does not saturate the constraint `source_k'.  Therefore, if
+      // the constraint is an inequality, we set to 1 the
+      // corresponding element of `sat' ...
+      Saturation_Row& sat_nle = sat[num_lines_or_equalities];
+      if (source_k.is_ray_or_point_or_inequality())
+	sat_nle.set(k);
+      // ... otherwise, the constraint is an equality which is
+      // violated by the generator `dest_nle': the generator has to be
+      // removed from `dest'.
+      else {
+	--dest_num_rows;
+	std::swap(dest_nle, dest[dest_num_rows]);
+	std::swap(scalar_prod_nle, scalar_prod[dest_num_rows]);
+	std::swap(sat_nle, sat[dest_num_rows]);
+	// `dest' has already been set as non-sorted.
+      }
+      // We continue with the next constraint.
+      ++k;
+    }
+    // Here we have `index_non_zero' >= `num_lines_or_equalities',
+    // so that all the lines in `dest' saturate the constraint `source_k'.
+    else {
+      // First, we reorder the generators in `dest' as follows:
+      // -# all the lines should have indexes between 0 and
+      //    `num_lines_or_equalities' - 1 (this already holds);
+      // -# all the rays that saturate the constraint should have
+      //    indexes between `num_lines_or_equalities' and
+      //    `lines_or_equal_bound' - 1; these rays form the set Q=.
+      // -# all the rays that have a positive scalar product with the
+      //    constraint should have indexes between `lines_or_equal_bound'
+      //    and `sup_bound' - 1; these rays form the set Q+.
+      // -# all the rays that have a negative scalar product with the
+      //    constraint should have indexes between `sup_bound' and
+      //    `dest_num_rows' - 1; these rays form the set Q-.
+      dimension_type lines_or_equal_bound = num_lines_or_equalities;
+      dimension_type inf_bound = dest_num_rows;
+      // While we find saturating generators, we simply increment
+      // `lines_or_equal_bound'.
+      while (inf_bound > lines_or_equal_bound
+	     && scalar_prod[lines_or_equal_bound] == 0)
+	++lines_or_equal_bound;
+      dimension_type sup_bound = lines_or_equal_bound;
+      while (inf_bound > sup_bound) {
+	const int sp_sign = sgn(scalar_prod[sup_bound]);
+	if (sp_sign == 0) {
+	  // This generator has to be moved in Q=.
+	  std::swap(dest[sup_bound], dest[lines_or_equal_bound]);
+	  std::swap(scalar_prod[sup_bound], scalar_prod[lines_or_equal_bound]);
+	  std::swap(sat[sup_bound], sat[lines_or_equal_bound]);
+	  ++lines_or_equal_bound;
+	  ++sup_bound;
+	  dest.set_sorted(false);
+	}
+	else if (sp_sign < 0) {
+	  // This generator has to be moved in Q-.
+	  --inf_bound;
+	  std::swap(dest[sup_bound], dest[inf_bound]);
+	  std::swap(scalar_prod[sup_bound], scalar_prod[inf_bound]);
+	  std::swap(sat[sup_bound], sat[inf_bound]);
+	  dest.set_sorted(false);
+	}
+	else
+	  // sp_sign > 0: this generator has to be moved in Q+.
+	  ++sup_bound;
+      }
+
+      if (sup_bound == dest_num_rows) {
+	// Here the set Q- is empty.
+	// If the constraint is an inequality, then all the generators
+	// in Q= and Q+ satisfy the constraint. The constraint is redundant
+	// and it can be safely removed from the constraint system.
+	// This is why the `source' parameter is not declared `const'.
+	if (source_k.is_ray_or_point_or_inequality()) {
+	  ++source_num_redundant;
+	  --source_num_rows;
+	  // NOTE: we continue with the next cycle of the loop
+	  // without incrementing the index `k', because:
+	  // -# either `k == source_num_rows', and we will exit the loop;
+	  // -# or, having increased `source_num_redundant', we will swap
+	  //    in position `k' a constraint that still has to be examined.
+	}
+	else {
+	  // The constraint is an equality, so that all the generators
+	  // in Q+ violate it. Since the set Q- is empty, we can simply
+	  // remove from `dest' all the generators of Q+.
+	  dest_num_rows = lines_or_equal_bound;
+          // We continue with the next constraint.
+	  ++k;
+        }
+      }
+      else {
+	// The set Q- is not empty, i.e., at least one generator
+	// violates the constraint `source_k'.
+	// We have to further distinguish two cases:
+	if (sup_bound == num_lines_or_equalities)
+	  // The set Q+ is empty, so that all generators that satisfy
+	  // the constraint also saturate it.
+	  // We can simply remove from `dest' all the generators in Q-.
+	  dest_num_rows = sup_bound;
+	else {
+	  // The sets Q+ and Q- are both non-empty.
+	  // The generators of the new pointed cone are all those satisfying
+	  // the constraint `source_k' plus a set of new rays enjoying
+	  // the following properties:
+	  // -# they lie on the hyper-plane represented by the constraint
+	  // -# they are obtained as a positive combination of two
+	  //    adjacent rays, the first taken from Q+ and the second
+	  //    taken from Q-.
+
+	  // The adjacency property is necessary to have an irredundant
+	  // set of new rays (see proposition 2).
+	  const dimension_type bound = dest_num_rows;
+
+	  // In the following loop,
+	  // `i' runs through the generators in the set Q+ and
+	  // `j' runs through the generators in the set Q-.
+	  for (dimension_type i = lines_or_equal_bound; i < sup_bound; ++i) {
+	    for(dimension_type j = sup_bound; j < bound; ++j) {
+	      // Checking if generators `dest[i]' and `dest[j]' are adjacent.
+	      // If there exist another generator that saturates
+	      // all the constraints saturated by both `dest[i]' and
+	      // `dest[j]', then they are NOT adjacent.
+	      Saturation_Row new_satrow;
+	      assert(sat[i].last() == ULONG_MAX || sat[i].last() < k);
+	      assert(sat[j].last() == ULONG_MAX || sat[j].last() < k);
+	      // Being the union of `sat[i]' and `sat[j]',
+	      // `new_satrow' corresponds to a ray that saturates all the
+	      // constraints saturated by both `dest[i]' and `dest[j]'.
+	      set_union(sat[i], sat[j], new_satrow);
+
+	      // Computing the number of common saturators.
+	      // NOTE: this number has to be less than `k' because
+	      // we are treating the `k'-th constraint.
+	      const dimension_type
+		num_common_satur = k - new_satrow.count_ones();
+
+	      // Even before actually creating the new ray as a
+	      // positive combination of `dest[i]' and `dest[j]',
+	      // we exploit saturation information to check if
+	      // it can be an extremal ray. To this end, we refer
+	      // to the definition of a minimal proper face
+	      // (see comments in Polyhedron.defs.hh):
+	      // an extremal ray saturates at least `n' - `t' - 1
+	      // constraints, where `n' is the dimension of the space
+	      // and `t' is the dimension of the lineality space.
+	      // Since `n == source_num_columns - 1' and
+	      // `t == num_lines_or_equalities', we obtain that
+	      // an extremal ray saturates at least
+	      // `source_num_columns - num_lines_or_equalities - 2'
+	      // constraints.
+	      if (num_common_satur
+		  >= source_num_columns - num_lines_or_equalities - 2) {
+		// The minimal proper face rule is satisfied.
+		// Now we actually check for redundancy by computing
+		// adjacency information.
+		bool redundant = false;
+		for (dimension_type
+		       l = num_lines_or_equalities; l < bound; ++l)
+		  if (l != i && l != j
+		      && subset_or_equal(sat[l], new_satrow)) {
+		    // Found another generator saturating all the
+		    // constraints saturated by both `dest[i]' and `dest[j]'.
+		    redundant = true;
+		    break;
+		  }
+		if (!redundant) {
+		  // Adding the new ray to `dest' and the corresponding
+		  // saturation row to `sat'.
+		  if (dest_num_rows == dest.num_rows()) {
+		    // Make room for one more row.
+		    dest.add_pending_row(Linear_Row::Flags(dest.topology(),
+							   Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+		    sat.add_row(new_satrow);
+		  }
+		  else
+		    sat[dest_num_rows] = new_satrow;
+		  Linear_Row& new_row = dest[dest_num_rows];
+		  // The following fragment optimizes the computation of
+		  //
+		  // Coefficient scale = scalar_prod[i];
+		  // scale.gcd_assign(scalar_prod[j]);
+		  // Coefficient normalized_sp_i = scalar_prod[i] / scale;
+		  // Coefficient normalized_sp_j = scalar_prod[j] / scale;
+		  // for (dimension_type c = dest_num_columns; c-- > 0; ) {
+		  //   new_row[c] = normalized_sp_i * dest[j][c];
+		  //   new_row[c] -= normalized_sp_j * dest[i][c];
+		  // }
+		  normalize2(scalar_prod[i],
+			     scalar_prod[j],
+			     normalized_sp_i,
+			     normalized_sp_o);
+		  for (dimension_type c = dest_num_columns; c-- > 0; ) {
+		    Coefficient& new_row_c = new_row[c];
+		    new_row_c = normalized_sp_i * dest[j][c];
+		    sub_mul_assign(new_row_c, normalized_sp_o, dest[i][c]);
+		  }
+		  new_row.strong_normalize();
+		  // Since we added a new generator to `dest',
+		  // we also add a new element to `scalar_prod';
+		  // by construction, the new ray lies on the hyper-plane
+		  // represented by the constraint `source_k'.
+		  // Thus, the added scalar product is 0.
+		  assert(scalar_prod.size() >= dest_num_rows);
+		  if (scalar_prod.size() <= dest_num_rows)
+		    scalar_prod.push_back(Coefficient_zero());
+		  else
+		    scalar_prod[dest_num_rows] = Coefficient_zero();
+		  // Increment the number of generators.
+		  ++dest_num_rows;
+		}
+	      }
+	    }
+#if REACTIVE_ABANDONING
+	    maybe_abandon();
+#endif
+	  }
+	  // Now we substitute the rays in Q- (i.e., the rays violating
+	  // the constraint) with the newly added rays.
+	  dimension_type j;
+	  if (source_k.is_ray_or_point_or_inequality()) {
+	    // The constraint is an inequality:
+	    // the violating generators are those in Q-.
+	    j = sup_bound;
+	    // For all the generators in Q+, set to 1 the corresponding
+	    // entry for the constraint `source_k' in the saturation matrix.
+            for (dimension_type l = lines_or_equal_bound; l < sup_bound; ++l)
+              sat[l].set(k);
+	  }
+	  else
+	    // The constraint is an equality:
+	    // the violating generators are those in the union of Q+ and Q-.
+	    j = lines_or_equal_bound;
+
+	  // Swapping the newly added rays
+	  // (index `i' running through `dest_num_rows - 1' down-to `bound')
+	  // with the generators violating the constraint
+	  // (index `j' running through `j' up-to `bound - 1').
+	  dimension_type i = dest_num_rows;
+	  while (j < bound && i > bound) {
+	    --i;
+	    std::swap(dest[i], dest[j]);
+	    std::swap(scalar_prod[i], scalar_prod[j]);
+	    std::swap(sat[i], sat[j]);
+	    ++j;
+	    dest.set_sorted(false);
+	  }
+	  // Setting the number of generators in `dest':
+	  // - if the number of generators violating the constraint
+	  //   is less than or equal to the number of the newly added
+	  //   generators, we assign `i' to `dest_num_rows' because
+	  //   all generators above this index are significant;
+	  // - otherwise, we assign `j' to `dest_num_rows' because
+	  //   all generators below index `j-1' violates the constraint.
+	  dest_num_rows = (j == bound) ? i : j;
+	}
+	// We continue with the next constraint.
+	++k;
+      }
+    }
+#if !REACTIVE_ABANDONING
+    // Check if the client has requested abandoning all exponential
+    // computations.  If so, the exception specified by the client
+    // is thrown now.
+    maybe_abandon();
+#endif
+  }
+
+  // We may have identified some redundant constraints in `source',
+  // which have been swapped at the end of the system.
+  if (source_num_redundant > 0) {
+    assert(source_num_redundant == source.num_rows() - source_num_rows);
+    source.erase_to_end(source_num_rows);
+    sat.columns_erase_to_end(source_num_rows);
+  }
+  // If `start == 0', then `source' was sorted and remained so.
+  // If otherwise `start > 0', then the two sub-system made by the
+  // non-pending rows and the pending rows, respectively, were both sorted.
+  // Thus, the overall system is sorted if and only if either
+  // `start == source_num_rows' (i.e., the second sub-system is empty)
+  // or the row ordering holds for the two rows at the boundary between
+  // the two sub-systems.
+  if (start > 0 && start < source_num_rows)
+    source.set_sorted(compare(source[start - 1], source[start]) <= 0);
+  // There are no longer pending constraints in `source'.
+  source.unset_pending_rows();
+
+  // We may have identified some redundant rays in `dest',
+  // which have been swapped at the end of the system.
+  if (dest_num_rows < dest.num_rows()) {
+    dest.erase_to_end(dest_num_rows);
+    // Be careful: we might have erased some of the non-pending rows.
+    if (dest.first_pending_row() > dest_num_rows)
+      dest.unset_pending_rows();
+    sat.rows_erase_to_end(dest_num_rows);
+  }
+  if (dest.is_sorted())
+    // If the non-pending generators in `dest' are still declared to be
+    // sorted, then we have to also check for the sortedness of the
+    // pending generators.
+    for (dimension_type i = dest.first_pending_row(); i < dest_num_rows; ++i)
+      if (compare(dest[i - 1], dest[i]) > 0) {
+	dest.set_sorted(false);
+	break;
+      }
+  // There are no pending generators in `dest'.
+  dest.unset_pending_rows();
+
+  return num_lines_or_equalities;
+}
diff --git a/src/fpu-c99.inlines.hh b/src/fpu-c99.inlines.hh
new file mode 100644
index 0000000..629faf6
--- /dev/null
+++ b/src/fpu-c99.inlines.hh
@@ -0,0 +1,81 @@
+/* C99 Floating point unit related functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifdef HAVE_FENV_H
+#include <fenv.h>
+
+#ifdef FE_TONEAREST
+#define FPU_TONEAREST FE_TONEAREST
+#endif
+#ifdef FE_UPWARD
+#define FPU_UPWARD FE_UPWARD
+#endif
+#ifdef FE_DOWNWARD
+#define FPU_DOWNWARD FE_DOWNWARD
+#endif
+#ifdef FE_TOWARDZERO
+#define FPU_TOWARDZERO FE_TOWARDZERO
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return fegetround();
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+  fesetround(dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+  fpu_rounding_direction_type old = fegetround();
+  fesetround(dir);
+  return old;
+}
+
+inline void
+fpu_reset_inexact() {
+  feclearexcept(FE_INEXACT);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
+  fpu_reset_inexact();
+  return fpu_save_rounding_direction(dir);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+  fesetround(w);
+}
+
+inline int
+fpu_check_inexact() {
+  return fetestexcept(FE_INEXACT) != 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(HAVE_FENV_H)
diff --git a/src/fpu-ia32.inlines.hh b/src/fpu-ia32.inlines.hh
new file mode 100644
index 0000000..ce9bfd7
--- /dev/null
+++ b/src/fpu-ia32.inlines.hh
@@ -0,0 +1,134 @@
+/* ia32 floating point unit related functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "compiler.hh"
+
+#define FPU_INVALID      0x01
+#define FPU_DIVBYZERO    0x04
+#define FPU_OVERFLOW     0x08
+#define FPU_UNDERFLOW    0x10
+#define FPU_INEXACT      0x20
+
+#define FPU_ALL_EXCEPT \
+  (FPU_INEXACT | FPU_DIVBYZERO | FPU_UNDERFLOW | FPU_OVERFLOW | FPU_INVALID)
+
+#define FPU_TONEAREST    0
+#define FPU_DOWNWARD     0x400
+#define FPU_UPWARD       0x800
+#define FPU_TOWARDZERO   0xc00
+
+#define FPU_ROUNDING_MASK 0xc00
+
+#define PPL_FPU_CONTROL_DEFAULT_BASE 0x37f
+// This MUST be congruent with the definition of ROUND_DIRECT
+#define PPL_FPU_CONTROL_DEFAULT (PPL_FPU_CONTROL_DEFAULT_BASE | FPU_UPWARD)
+
+namespace Parma_Polyhedra_Library {
+
+typedef struct
+{
+  unsigned short control_word;
+  unsigned short unused1;
+  unsigned short status_word;
+  unsigned short unused2;
+  unsigned short tags;
+  unsigned short unused3;
+  unsigned int eip;
+  unsigned short cs_selector;
+  unsigned int opcode:11;
+  unsigned int unused4:5;
+  unsigned int data_offset;
+  unsigned short data_selector;
+  unsigned short unused5;
+} ia32_fenv_t;
+
+inline int
+fpu_get_control() {
+  unsigned short cw;
+  __asm__ __volatile__ ("fnstcw %0" : "=m" (cw));
+  return cw;
+}
+
+inline void
+fpu_set_control(unsigned short cw) {
+  __asm__ __volatile__ ("fldcw %0" : : "m" (cw));
+}
+
+inline int
+fpu_get_status() {
+  int sw;
+  __asm__ __volatile__ ("fnstsw %0" : "=a" (sw));
+  return sw;
+}
+
+inline void
+fpu_clear_status(unsigned short bits) {
+  /* There is no fldsw instruction */
+  ia32_fenv_t env;
+  __asm__ ("fnstenv %0" : "=m" (env));
+  env.status_word &= ~bits;
+  __asm__ ("fldenv %0" : : "m" (env));
+}
+
+inline void
+fpu_clear_exceptions() {
+  __asm__ __volatile__ ("fnclex" : /* No outputs.  */);
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return fpu_get_control() & FPU_ROUNDING_MASK;
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+  return 0;
+}
+
+inline void
+fpu_reset_inexact() {
+  fpu_clear_exceptions();
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
+  fpu_reset_inexact();
+  return fpu_save_rounding_direction(dir);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type) {
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT);
+}
+
+inline int
+fpu_check_inexact() {
+  return (fpu_get_status() & FPU_INEXACT) ? 1 : 0;
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/fpu-none.inlines.hh b/src/fpu-none.inlines.hh
new file mode 100644
index 0000000..83c1b09
--- /dev/null
+++ b/src/fpu-none.inlines.hh
@@ -0,0 +1,69 @@
+/* Null floating point unit related functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+fpu_get_rounding_direction() {
+  throw std::logic_error("PPL::fpu_get_rounding_direction():"
+			 " cannot control the FPU");
+}
+
+inline void
+fpu_set_rounding_direction(int dir) {
+  throw std::logic_error("PPL::fpu_set_rounding_direction():"
+			 " cannot control the FPU");
+}
+
+inline int
+fpu_save_rounding_direction(int dir) {
+  throw std::logic_error("PPL::fpu_save_rounding_direction():"
+			 " cannot control the FPU");
+}
+
+inline void
+fpu_reset_inexact() {
+  throw std::logic_error("PPL::fpu_reset_inexact():"
+			 " cannot control the FPU");
+}
+
+inline int
+fpu_save_rounding_direction_reset_inexact(int dir) {
+  throw std::logic_error("PPL::fpu_save_rounding_direction_reset_inexact():"
+			 " cannot control the FPU");
+}
+
+inline void
+fpu_restore_rounding_direction(int dir) {
+  throw std::logic_error("PPL::fpu_restore_rounding_direction():"
+			 " cannot control the FPU");
+}
+
+inline int
+fpu_check_inexact() {
+  throw std::logic_error("PPL::fpu_check_inexact():"
+			 " cannot control the FPU");
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/fpu-sparc.inlines.hh b/src/fpu-sparc.inlines.hh
new file mode 100644
index 0000000..804ea0d
--- /dev/null
+++ b/src/fpu-sparc.inlines.hh
@@ -0,0 +1,73 @@
+/* SPARC floating point unit related functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifdef HAVE_IEEEFP_H
+#include <ieeefp.h>
+
+#define FPU_TONEAREST ((int) FP_RN)
+#define FPU_UPWARD ((int) FP_RP)
+#define FPU_DOWNWARD ((int) FP_RM)
+#define FPU_TOWARDZERO ((int) FP_RZ)
+
+namespace Parma_Polyhedra_Library {
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return fpgetround();
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+  fpsetround((fp_rnd) dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+  return fpsetround((fp_rnd) dir);
+}
+
+inline void
+fpu_reset_inexact() {
+  fp_except except = fpgetmask();
+  except &= ~FP_X_IMP;
+  fpsetmask(except);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
+  fpu_reset_inexact();
+  return fpu_save_rounding_direction((fp_rnd) dir);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+  fpsetround((fp_rnd) w);
+}
+
+inline int
+fpu_check_inexact() {
+  return (fpgetmask() & FP_X_IMP) ? 1 : 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(HAVE_IEEEFP_H)
diff --git a/src/fpu.defs.hh b/src/fpu.defs.hh
new file mode 100644
index 0000000..3d9e218
--- /dev/null
+++ b/src/fpu.defs.hh
@@ -0,0 +1,85 @@
+/* Floating point unit related functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_fpu_defs_hh
+#define PPL_fpu_defs_hh 1
+
+#include "fpu.types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the current FPU rounding direction.
+fpu_rounding_direction_type
+fpu_get_rounding_direction();
+
+//! Sets the FPU rounding direction to \p dir.
+void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir);
+
+/*! \brief
+  Sets the FPU rounding direction to \p dir and returns the rounding
+  control word previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir);
+
+/*! \brief
+  Sets the FPU rounding direction to \p dir, clears the <EM>inexact
+  computation</EM> status, and returns the rounding control word
+  previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir);
+
+//! Restores the FPU rounding rounding control word to \p cw.
+void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w);
+
+//! Clears the <EM>inexact computation</EM> status.
+void
+fpu_reset_inexact();
+
+/*! \brief
+  Queries the <EM>inexact computation</EM> status.
+
+  Returns 0 if the computation was definitely exact, 1 if it was
+  definitely inexact, -1 if definite exactness information is unavailable.
+*/
+int
+fpu_check_inexact();
+
+} // namespace Parma_Polyhedra_Library
+
+#if defined(__i386__)
+#include "fpu-ia32.inlines.hh"
+#elif defined(HAVE_FENV_H)
+#include "fpu-c99.inlines.hh"
+#elif defined(HAVE_IEEEFP_H)						\
+  && (defined(__sparc)							\
+      || defined(sparc)							\
+      || defined(__sparc__))
+#include "fpu-sparc.inlines.hh"
+#else
+#include "fpu-none.inlines.hh"
+#endif
+
+#endif // !defined(PPL_fpu_defs_hh)
diff --git a/src/fpu.types.hh b/src/fpu.types.hh
new file mode 100644
index 0000000..3f9183a
--- /dev/null
+++ b/src/fpu.types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_fpu_types_hh
+#define PPL_fpu_types_hh 1
+
+#ifdef HAVE_IEEEFP_H
+#include <ieeefp.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+typedef int fpu_rounding_direction_type;
+typedef int fpu_rounding_control_word_type;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_fpu_types_hh)
diff --git a/src/globals.cc b/src/globals.cc
new file mode 100644
index 0000000..a04b6a2
--- /dev/null
+++ b/src/globals.cc
@@ -0,0 +1,33 @@
+/* Definitions of global objects.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "globals.defs.hh"
+#include "Constraint.defs.hh"
+#include "Generator.defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Coefficient_free_list_element* PPL::Coefficient_free_list_first = 0;
+
+const PPL::Throwable* volatile PPL::abandon_expensive_computations = 0;
diff --git a/src/globals.defs.hh b/src/globals.defs.hh
new file mode 100644
index 0000000..f4da042
--- /dev/null
+++ b/src/globals.defs.hh
@@ -0,0 +1,290 @@
+/* Declarations of global objects.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_globals_defs_hh
+#define PPL_globals_defs_hh 1
+
+#include "globals.types.hh"
+#include "Coefficient.defs.hh"
+#include <exception>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns a value that does not designate a valid dimension.
+dimension_type
+not_a_dimension();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A node of the list of available coefficients.
+/*! \ingroup PPL_CXX_interface */
+// FIXME: rewrite the comment.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Coefficient_free_list_element {
+private:
+  Coefficient i;
+  Coefficient_free_list_element* p;
+
+public:
+  Coefficient_free_list_element()
+    : i() {
+  }
+
+  Coefficient& integer() {
+    return i;
+  }
+
+  Coefficient_free_list_element*& next() {
+    return p;
+  }
+};
+
+extern Coefficient_free_list_element* Coefficient_free_list_first;
+
+inline Coefficient&
+get_tmp_Coefficient() {
+  Coefficient* p;
+  if (Coefficient_free_list_first != 0) {
+    p = &Coefficient_free_list_first->integer();
+    Coefficient_free_list_first = Coefficient_free_list_first->next();
+  }
+  else
+    p = reinterpret_cast<Coefficient*>(new Coefficient_free_list_element());
+  return *p;
+}
+
+inline void
+release_tmp_Coefficient(Coefficient& i) {
+  Coefficient_free_list_element& e
+    = reinterpret_cast<Coefficient_free_list_element&>(i);
+  e.next() = Coefficient_free_list_first;
+  Coefficient_free_list_first = &e;
+}
+
+class Temp_Coefficient_Holder {
+private:
+  Coefficient& hold;
+
+public:
+  Temp_Coefficient_Holder(Coefficient& i)
+    : hold(i) {
+  }
+  ~Temp_Coefficient_Holder() {
+    release_tmp_Coefficient(hold);
+  }
+};
+
+#if 1
+#define TEMP_INTEGER(id) \
+Coefficient& id = get_tmp_Coefficient(); \
+Temp_Coefficient_Holder temp_Coefficient_holder_ ## id = (id)
+#else
+#define TEMP_INTEGER(id) static Coefficient id
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Speculative allocation function.
+/*!
+  \return
+  The actual capacity to be allocated.
+
+  \param requested_size
+  The number of elements we need.
+
+  \param maximum_size
+  The maximum number of elements to be allocated. It is assumed
+  to be no less than \p requested_size.
+
+  Computes a capacity given a requested size.
+  Allows for speculative allocation aimed at reducing the number of
+  reallocations enough to guarantee amortized constant insertion time
+  for our vector-like data structures. In all cases, the speculative
+  allocation will not exceed \p maximum_size.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+dimension_type
+compute_capacity(dimension_type requested_size,
+		 dimension_type maximum_size);
+
+//! User objects the PPL can throw.
+/*! \ingroup PPL_CXX_interface
+  This abstract base class should be instantiated by those users
+  willing to provide a polynomial upper bound to the time spent
+  by any invocation of a library operator.
+*/
+class Throwable {
+public:
+  //! Throws the user defined exception object.
+  virtual void throw_me() const = 0;
+
+  //! Virtual destructor.
+  virtual ~Throwable();
+};
+
+/*! \brief
+  A pointer to an exception object.
+
+  \ingroup PPL_CXX_interface
+  This pointer, which is initialized to zero, is repeatedly checked
+  along any super-linear (i.e., computationally expensive) computation
+  path in the library.
+  When it is found nonzero the exception it points to is thrown.
+  In other words, making this pointer point to an exception (and
+  leaving it in this state) ensures that the library will return
+  control to the client application, possibly by throwing the given
+  exception, within a time that is a linear function of the size
+  of the representation of the biggest object (powerset of polyhedra,
+  polyhedron, system of constraints or generators) on which the library
+  is operating upon.
+
+  \note
+  The only sensible way to assign to this pointer is from within a
+  signal handler or from a parallel thread.  For this reason, the
+  library, apart from ensuring that the pointer is initially set to zero,
+  never assigns to it.  In particular, it does not zero it again when
+  the exception is thrown: it is the client's responsibility to do so.
+*/
+extern const Throwable* volatile abandon_expensive_computations;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If the pointer abandon_expensive_computations is found
+  to be nonzero, the exception it points to is thrown.
+
+  \relates Throwable
+*/
+#endif
+void
+maybe_abandon();
+
+//! A tag class.
+/*! \ingroup PPL_CXX_interface
+  Tag class to differentiate the C_Polyhedron and NNC_Polyhedron
+  constructors that build a polyhedron out of a bounding box.
+*/
+struct From_Bounding_Box {
+};
+
+//! A tag class.
+/*! \ingroup PPL_CXX_interface
+  Tag class to make the Grid covering box constructor unique.
+*/
+struct From_Covering_Box {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If \f$g\f$ is the GCD of \p x and \p y, the values of \p x and \p y
+  divided by \f$g\f$ are assigned to \p nx and \p ny, respectively.
+
+  \note
+  \p x and \p nx may be the same object and likewise for
+  \p y and \p ny.  Any other aliasing results in undefined behavior.
+*/
+#endif
+void
+normalize2(Coefficient_traits::const_reference x,
+	   Coefficient_traits::const_reference y,
+	   Coefficient& nx, Coefficient& ny);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns a mask for the lowest \p n bits,
+#endif
+template <typename T>
+T low_bits_mask(unsigned n);
+
+// Turn s into a string: PPL_STR(x + y) => "x + y".
+#define PPL_STR(s) #s
+// Turn the expansion of s into a string: PPL_XSTR(x) => "x expanded".
+#define PPL_XSTR(s) PPL_STR(s)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define PPL_OUTPUT_DECLARATIONS						\
+  /*! \brief Writes to \c std::cerr an ASCII representation of \p *this. */ \
+  void ascii_dump() const;						\
+  /*! \brief Writes to \p s an ASCII representation of \p *this. */	\
+  void ascii_dump(std::ostream& s) const;				\
+  /*! \brief Prints \p *this to \c std::cerr using \c operator<<. */	\
+  void print() const;
+#else
+#define PPL_OUTPUT_DECLARATIONS					\
+  void ascii_dump() const;					\
+  void ascii_dump(std::ostream& s) const;			\
+  void print() const;
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+#define PPL_OUTPUT_DEFINITIONS(class_name)			\
+  void								\
+  Parma_Polyhedra_Library::class_name::ascii_dump() const {	\
+    ascii_dump(std::cerr);					\
+  }								\
+								\
+  void								\
+  Parma_Polyhedra_Library::class_name::print() const {		\
+    using namespace IO_Operators;				\
+    std::cerr << *this;						\
+  }
+
+#define PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name)			\
+  void									\
+  Parma_Polyhedra_Library::class_name::ascii_dump() const {		\
+    ascii_dump(std::cerr);						\
+  }									\
+									\
+  void									\
+  Parma_Polyhedra_Library::class_name::print() const {			\
+    std::cerr << "No user level output operator defined "		\
+	      << "for class " PPL_XSTR(class_name) << "." << std::endl; \
+  }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix)	\
+  template <typename type_symbol>					\
+  void									\
+  class_prefix::ascii_dump() const {					\
+    ascii_dump(std::cerr);						\
+  }									\
+									\
+  template <typename type_symbol>					\
+  void									\
+  class_prefix::print() const {						\
+    using namespace IO_Operators;					\
+    std::cerr << *this;							\
+  }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol, class_prefix) \
+  template <typename type_symbol>					\
+  void									\
+  class_prefix::ascii_dump() const {					\
+    ascii_dump(std::cerr);						\
+  }									\
+									\
+  template <typename type_symbol>					\
+  void									\
+  class_prefix::print() const {						\
+    std::cerr << "No user level output operator defined "		\
+	      << "for " PPL_XSTR(class_prefix) << "." << std::endl;	\
+  }
+
+} // namespace Parma_Polyhedra_Library
+
+#include "globals.inlines.hh"
+
+#endif // !defined(PPL_globals_defs_hh)
diff --git a/src/globals.inlines.hh b/src/globals.inlines.hh
new file mode 100644
index 0000000..f9f1dc2
--- /dev/null
+++ b/src/globals.inlines.hh
@@ -0,0 +1,80 @@
+/* Implementation of global objects: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_globals_inlines_hh
+#define PPL_globals_inlines_hh 1
+
+#include "Coefficient.defs.hh"
+#include <limits>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+not_a_dimension() {
+  return std::numeric_limits<dimension_type>::max();
+}
+
+inline
+Throwable::~Throwable() {
+}
+
+inline void
+maybe_abandon() {
+  if (const Throwable* p = abandon_expensive_computations)
+    p->throw_me();
+}
+
+inline dimension_type
+compute_capacity(const dimension_type requested_size,
+		 const dimension_type maximum_size) {
+  assert(requested_size <= maximum_size);
+  // Speculation factor 2.
+  return (requested_size < maximum_size / 2)
+    ? 2*(requested_size + 1)
+    : maximum_size;
+  // Speculation factor 1.5.
+  // return (maximum_size - requested_size > requested_size/2)
+  //   ? requested_size + requested_size/2 + 1
+  //   : maximum_size;
+}
+
+inline void
+normalize2(Coefficient_traits::const_reference x,
+	   Coefficient_traits::const_reference y,
+	   Coefficient& nx, Coefficient& ny) {
+  TEMP_INTEGER(gcd);
+  gcd_assign(gcd, x, y);
+  exact_div_assign(nx, x, gcd);
+  exact_div_assign(ny, y, gcd);
+}
+
+template <typename T>
+inline T
+low_bits_mask(const unsigned n) {
+  assert(n < unsigned(std::numeric_limits<T>::digits));
+  return n == 0 ? 0 : ~(~(T(0u)) << n);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_globals_inlines_hh)
diff --git a/src/globals.types.hh b/src/globals.types.hh
new file mode 100644
index 0000000..08d9bfa
--- /dev/null
+++ b/src/globals.types.hh
@@ -0,0 +1,73 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_globals_types_hh
+#define PPL_globals_types_hh 1
+
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! An unsigned integral type for representing space dimensions.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t dimension_type;
+
+//! An unsigned integral type for representing memory size in bytes.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t memory_size_type;
+
+//! Kinds of degenerate abstract elements.
+/*! \ingroup PPL_CXX_interface */
+enum Degenerate_Element {
+  //! The universe element, i.e., the whole vector space.
+  UNIVERSE,
+  //! The empty element, i.e., the empty set.
+  EMPTY
+};
+
+//! Relation symbols.
+/*! \ingroup PPL_CXX_interface */
+enum Relation_Symbol {
+  //! Less than.
+  LESS_THAN,
+  //! Less than or equal to.
+  LESS_THAN_OR_EQUAL,
+  //! Equal to.
+  EQUAL,
+  //! Greater than or equal to.
+  GREATER_THAN_OR_EQUAL,
+  //! Greater than.
+  GREATER_THAN
+};
+
+//! Complexity pseudo-classes.
+/*! \ingroup PPL_CXX_interface */
+enum Complexity_Class {
+  //! Worst-case polynomial complexity.
+  POLYNOMIAL_COMPLEXITY,
+  //! Worst-case exponential complexity but typically polynomial behavior.
+  SIMPLEX_COMPLEXITY,
+  //! Any complexity.
+  ANY_COMPLEXITY
+};
+
+//! Possible optimization modes.
+/*! \ingroup PPL_CXX_interface */
+enum Optimization_Mode {
+  //! Minimization is requested.
+  MINIMIZATION,
+  //! Maximization is requested.
+  MAXIMIZATION
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_globals_types_hh)
diff --git a/src/initializer.hh b/src/initializer.hh
new file mode 100644
index 0000000..0c48f20
--- /dev/null
+++ b/src/initializer.hh
@@ -0,0 +1,34 @@
+/* Nifty counter object for the initialization of the library.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_initializer_hh
+#define PPL_initializer_hh 1
+
+#include "Init.defs.hh"
+
+namespace {
+
+Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer;
+
+} // namespace
+
+#endif // !defined(PPL_initializer_hh)
diff --git a/src/max_space_dimension.hh b/src/max_space_dimension.hh
new file mode 100644
index 0000000..c986da4
--- /dev/null
+++ b/src/max_space_dimension.hh
@@ -0,0 +1,48 @@
+/* Definition of functions yielding maximal space dimensions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_max_space_dimension_hh
+#define PPL_max_space_dimension_hh 1
+
+#include "Polyhedron.defs.hh"
+#include "C_Polyhedron.defs.hh"
+#include "NNC_Polyhedron.defs.hh"
+#include "Polyhedra_Powerset.defs.hh"
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the maximum space dimension this library can handle.
+inline dimension_type
+max_space_dimension() {
+  using std::min;
+  return
+    min(Polyhedron::max_space_dimension(),
+	min(Polyhedra_Powerset<C_Polyhedron>::max_space_dimension(),
+	    Polyhedra_Powerset<NNC_Polyhedron>::max_space_dimension()
+	    )
+	);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_max_space_dimension_hh)
diff --git a/src/minimize.cc b/src/minimize.cc
new file mode 100644
index 0000000..1725d30
--- /dev/null
+++ b/src/minimize.cc
@@ -0,0 +1,401 @@
+/* Polyhedron class implementation: minimize() and add_and_minimize().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "Linear_Row.defs.hh"
+#include "Linear_System.defs.hh"
+#include "Saturation_Matrix.defs.hh"
+#include "Polyhedron.defs.hh"
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+/*!
+  \return
+  <CODE>true</CODE> if the polyhedron is empty, <CODE>false</CODE>
+  otherwise.
+
+  \param con_to_gen
+  <CODE>true</CODE> if \p source represents the constraints,
+  <CODE>false</CODE> otherwise;
+
+  \param source
+  The given system, which is not empty;
+
+  \param dest
+  The system to build and minimize;
+
+  \param sat
+  The saturation matrix.
+
+  \p dest is not <CODE>const</CODE> because it will be built (and then
+  modified) during minimize(). Also, \p sat and \p source are
+  not <CODE>const</CODE> because the former will be built during
+  \p dest creation and the latter will maybe be sorted and modified by
+  <CODE>conversion()</CODE> and <CODE>simplify()</CODE>.
+
+  \p sat has the generators on its columns and the constraints on its rows
+  if \p con_to_gen is <CODE>true</CODE>, otherwise it has the generators on
+  its rows and the constraints on its columns.
+
+  Given \p source, this function builds (by means of
+  <CODE>conversion()</CODE>) \p dest and then simplifies (invoking
+  <CODE>simplify()</CODE>) \p source, erasing redundant rows.
+  For the sequel we assume that \p source is the system of constraints
+  and \p dest is the system of generators.
+  This will simplify the description of the function; the dual case is
+  similar.
+*/
+bool
+PPL::Polyhedron::minimize(const bool con_to_gen,
+			  Linear_System& source,
+			  Linear_System& dest,
+			  Saturation_Matrix& sat) {
+  // Topologies have to agree.
+  assert(source.topology() == dest.topology());
+  // `source' cannot be empty: even if it is an empty constraint system,
+  // representing the universe polyhedron, homogenization has added
+  // the positive constraint. It also cannot be an empty generator system,
+  // since this function is always called starting from a non-empty
+  // polyhedron.
+  assert(source.num_rows() > 0);
+
+  // Sort the source system, if necessary.
+  if (!source.is_sorted())
+    source.sort_rows();
+
+  // Initialization of the system of generators `dest'.
+  // The algorithm works incrementally and we haven't seen any
+  // constraint yet: as a consequence, `dest' should describe
+  // the universe polyhedron of the appropriate dimension.
+  // To this end, we initialize it to the identity matrix of dimension
+  // `source.num_columns()': the rows represent the lines corresponding
+  // to the canonical basis of the vector space.
+
+  // Resizing `dest' to be the appropriate square matrix.
+  dimension_type dest_num_rows = source.num_columns();
+  // Note that before calling `resize_no_copy()' we must update
+  // `index_first_pending'.
+  dest.set_index_first_pending_row(dest_num_rows);
+  dest.resize_no_copy(dest_num_rows, dest_num_rows);
+
+  // Initialize `dest' to the identity matrix.
+  for (dimension_type i = dest_num_rows; i-- > 0; ) {
+    Linear_Row& dest_i = dest[i];
+    for (dimension_type j = dest_num_rows; j-- > 0; )
+      dest_i[j] = (i == j) ? 1 : 0;
+    dest_i.set_is_line_or_equality();
+  }
+  // The identity matrix `dest' is not sorted (see the sorting rules
+  // in Linear_Row.cc).
+  dest.set_sorted(false);
+
+  // NOTE: the system `dest', as it is now, is not a _legal_ system of
+  //       generators, because in the first row we have a line with a
+  //       non-zero divisor (which should only happen for
+  //       points). However, this is NOT a problem, because `source'
+  //       necessarily contains the positivity constraint (or a
+  //       combination of it with another constraint) which will
+  //       restore things as they should be.
+
+
+  // Building a saturation matrix and initializing it by setting
+  // all of its elements to zero. This matrix will be modified together
+  // with `dest' during the conversion.
+  // NOTE: since we haven't seen any constraint yet, the relevant
+  //       portion of `tmp_sat' is the sub-matrix consisting of
+  //       the first 0 columns: thus the relevant portion correctly
+  //       characterizes the initial saturation information.
+  Saturation_Matrix tmp_sat(dest_num_rows, source.num_rows());
+
+  // By invoking the function conversion(), we populate `dest' with
+  // the generators characterizing the polyhedron described by all
+  // the constraints in `source'.
+  // The `start' parameter is zero (we haven't seen any constraint yet)
+  // and the 5th parameter (representing the number of lines in `dest'),
+  // by construction, is equal to `dest_num_rows'.
+  const dimension_type num_lines_or_equalities
+    = conversion(source, 0, dest, tmp_sat, dest_num_rows);
+  // conversion() may have modified the number of rows in `dest'.
+  dest_num_rows = dest.num_rows();
+
+  // Checking if the generators in `dest' represent an empty polyhedron:
+  // the polyhedron is empty if there are no points
+  // (because rays, lines and closure points need a supporting point).
+  // Points can be detected by looking at:
+  // - the divisor, for necessarily closed polyhedra;
+  // - the epsilon coordinate, for NNC polyhedra.
+  const dimension_type checking_index
+    = dest.is_necessarily_closed()
+    ? 0
+    : dest.num_columns() - 1;
+  dimension_type first_point;
+  for (first_point = num_lines_or_equalities;
+       first_point < dest_num_rows;
+       ++first_point)
+    if (dest[first_point][checking_index] > 0)
+      break;
+
+  if (first_point == dest_num_rows)
+    if (con_to_gen)
+      // No point has been found: the polyhedron is empty.
+      return true;
+    else
+      // Here `con_to_gen' is false: `dest' is a system of constraints.
+      // In this case the condition `first_point == dest_num_rows'
+      // actually means that all the constraints in `dest' have their
+      // inhomogeneous term equal to 0.
+      // This is an ILLEGAL situation, because it implies that
+      // the constraint system `dest' lacks the positivity constraint
+      // and no linear combination of the constraints in `dest'
+      // can reintroduce the positivity constraint.
+      throw std::runtime_error("PPL internal error");
+  else {
+    // A point has been found: the polyhedron is not empty.
+    // Now invoking simplify() to remove all the redundant constraints
+    // from the system `source'.
+    // Since the saturation matrix `tmp_sat' returned by conversion()
+    // has rows indexed by generators (the rows of `dest') and columns
+    // indexed by constraints (the rows of `source'), we have to
+    // transpose it to obtain the saturation matrix needed by simplify().
+    sat.transpose_assign(tmp_sat);
+    simplify(source, sat);
+    return false;
+  }
+}
+
+
+/*!
+  \return
+  <CODE>true</CODE> if the obtained polyhedron is empty,
+  <CODE>false</CODE> otherwise.
+
+  \param con_to_gen
+  <CODE>true</CODE> if \p source1 and \p source2 are system of
+  constraints, <CODE>false</CODE> otherwise;
+
+  \param source1
+  The first element of the given DD pair;
+
+  \param dest
+  The second element of the given DD pair;
+
+  \param sat
+  The saturation matrix that bind \p source1 to \p dest;
+
+  \param source2
+  The new system of generators or constraints.
+
+  It is assumed that \p source1 and \p source2 are sorted and have
+  no pending rows. It is also assumed that \p dest has no pending rows.
+  On entry, the rows of \p sat are indexed by the rows of \p dest
+  and its columns are indexed by the rows of \p source1.
+  On exit, the rows of \p sat are indexed by the rows of \p dest
+  and its columns are indexed by the rows of the system obtained
+  by merging \p source1 and \p source2.
+
+  Let us suppose we want to add some constraints to a given system of
+  constraints \p source1. This method, given a minimized double description
+  pair (\p source1, \p dest) and a system of new constraints \p source2,
+  modifies \p source1 by adding to it the constraints of \p source2 that
+  are not in \p source1. Then, by invoking
+  <CODE>add_and_minimize(bool, Linear_System&, Linear_System&, Saturation_Matrix&)</CODE>,
+  processes the added constraints obtaining a new DD pair.
+
+  This method treats also the dual case, i.e., adding new generators to
+  a previous system of generators. In this case \p source1 contains the
+  old generators, \p source2 the new ones and \p dest is the system
+  of constraints in the given minimized DD pair.
+
+  Since \p source2 contains the constraints (or the generators) that
+  will be added to \p source1, it is constant: it will not be modified.
+*/
+bool
+PPL::Polyhedron::add_and_minimize(const bool con_to_gen,
+				  Linear_System& source1,
+				  Linear_System& dest,
+				  Saturation_Matrix& sat,
+				  const Linear_System& source2) {
+  // `source1' and `source2' cannot be empty.
+  assert(source1.num_rows() > 0 && source2.num_rows() > 0);
+  // `source1' and `source2' must have the same number of columns
+  // to be merged.
+  assert(source1.num_columns() == source2.num_columns());
+  // `source1' and `source2' are fully sorted.
+  assert(source1.is_sorted() && source1.num_pending_rows() == 0);
+  assert(source2.is_sorted() && source2.num_pending_rows() == 0);
+  assert(dest.num_pending_rows() == 0);
+
+  const dimension_type old_source1_num_rows = source1.num_rows();
+  // `k1' and `k2' run through the rows of `source1' and `source2', resp.
+  dimension_type k1 = 0;
+  dimension_type k2 = 0;
+  dimension_type source2_num_rows = source2.num_rows();
+  while (k1 < old_source1_num_rows && k2 < source2_num_rows) {
+    // Add to `source1' the constraints from `source2', as pending rows.
+    // We exploit the property that initially both `source1' and `source2'
+    // are sorted and index `k1' only scans the non-pending rows of `source1',
+    // so that it is not influenced by the pending rows appended to it.
+    // This way no duplicate (i.e., trivially redundant) constraint
+    // is introduced in `source1'.
+    const int cmp = compare(source1[k1], source2[k2]);
+    if (cmp == 0) {
+      // We found the same row: there is no need to add `source2[k2]'.
+      ++k2;
+      // By sortedness, since `k1 < old_source1_num_rows',
+      // we can increment index `k1' too.
+      ++k1;
+    }
+    else if (cmp < 0)
+      // By sortedness, we can increment `k1'.
+      ++k1;
+    else {
+      // Here `cmp > 0'.
+      // By sortedness, `source2[k2]' cannot be in `source1'.
+      // We add it as a pending row of `source1' (sortedness unaffected).
+      source1.add_pending_row(source2[k2]);
+      // We can increment `k2'.
+      ++k2;
+    }
+  }
+  // Have we scanned all the rows in `source2'?
+  if (k2 < source2_num_rows)
+    // By sortedness, all the rows in `source2' having indexes
+    // greater than or equal to `k2' were not in `source1'.
+    // We add them as pending rows of 'source1' (sortedness not affected).
+    for ( ; k2 < source2_num_rows; ++k2)
+      source1.add_pending_row(source2[k2]);
+
+  if (source1.num_pending_rows() == 0)
+    // No row was appended to `source1', because all the constraints
+    // in `source2' were already in `source1'.
+    // There is nothing left to do ...
+    return false;
+
+  return add_and_minimize(con_to_gen, source1, dest, sat);
+}
+
+/*!
+  \return
+  <CODE>true</CODE> if the obtained polyhedron is empty,
+  <CODE>false</CODE> otherwise.
+
+  \param con_to_gen
+  <CODE>true</CODE> if \p source is a system of constraints,
+  <CODE>false</CODE> otherwise;
+
+  \param source
+  The first element of the given DD pair. It also contains the pending
+  rows to be processed;
+
+  \param dest
+  The second element of the given DD pair. It cannot have pending rows;
+
+  \param sat
+  The saturation matrix that bind the upper part of \p source to \p dest.
+
+  On entry, the rows of \p sat are indexed by the rows of \p dest
+  and its columns are indexed by the non-pending rows of \p source.
+  On exit, the rows of \p sat are indexed by the rows of \p dest
+  and its columns are indexed by the rows of \p source.
+
+  Let us suppose that \p source is a system of constraints.
+  This method assumes that the non-pending part of \p source and
+  system \p dest form a double description pair in minimal form and
+  will build a new DD pair in minimal form by processing the pending
+  constraints in \p source. To this end, it will call
+  <CODE>conversion()</CODE>) and <CODE>simplify</CODE>.
+
+  This method treats also the dual case, i.e., processing pending
+  generators. In this case \p source contains generators and \p dest
+  is the system of constraints corresponding to the non-pending part
+  of \p source.
+*/
+bool
+PPL::Polyhedron::add_and_minimize(const bool con_to_gen,
+				  Linear_System& source,
+				  Linear_System& dest,
+				  Saturation_Matrix& sat) {
+  assert(source.num_pending_rows() > 0);
+  assert(source.num_columns() == dest.num_columns());
+  assert(source.is_sorted());
+
+  // First, pad the saturation matrix with new columns (of zeroes)
+  // to accommodate for the pending rows of `source'.
+  sat.resize(dest.num_rows(), source.num_rows());
+
+  // Incrementally compute the new system of generators.
+  // Parameter `start' is set to the index of the first pending constraint.
+  const dimension_type num_lines_or_equalities
+    = conversion(source, source.first_pending_row(),
+		 dest, sat,
+		 dest.num_lines_or_equalities());
+
+  // conversion() may have modified the number of rows in `dest'.
+  const dimension_type dest_num_rows = dest.num_rows();
+
+  // Checking if the generators in `dest' represent an empty polyhedron:
+  // the polyhedron is empty if there are no points
+  // (because rays, lines and closure points need a supporting point).
+  // Points can be detected by looking at:
+  // - the divisor, for necessarily closed polyhedra;
+  // - the epsilon coordinate, for NNC polyhedra.
+  const dimension_type checking_index
+    = dest.is_necessarily_closed()
+    ? 0
+    : dest.num_columns() - 1;
+  dimension_type first_point;
+  for (first_point = num_lines_or_equalities;
+       first_point < dest_num_rows;
+       ++first_point)
+     if (dest[first_point][checking_index] > 0)
+      break;
+
+  if (first_point == dest_num_rows)
+    if (con_to_gen)
+      // No point has been found: the polyhedron is empty.
+      return true;
+    else
+      // Here `con_to_gen' is false: `dest' is a system of constraints.
+      // In this case the condition `first_point == dest_num_rows'
+      // actually means that all the constraints in `dest' have their
+      // inhomogeneous term equal to 0.
+      // This is an ILLEGAL situation, because it implies that
+      // the constraint system `dest' lacks the positivity constraint
+      // and no linear combination of the constraints in `dest'
+      // can reintroduce the positivity constraint.
+      throw std::runtime_error("PPL internal error");
+  else {
+    // A point has been found: the polyhedron is not empty.
+    // Now invoking `simplify()' to remove all the redundant constraints
+    // from the system `source'.
+    // Since the saturation matrix `sat' returned by `conversion()'
+    // has rows indexed by generators (the rows of `dest') and columns
+    // indexed by constraints (the rows of `source'), we have to
+    // transpose it to obtain the saturation matrix needed by `simplify()'.
+    sat.transpose();
+    simplify(source, sat);
+    // Transposing back.
+    sat.transpose();
+    return false;
+  }
+}
diff --git a/src/mp_numeric_limits.hh b/src/mp_numeric_limits.hh
new file mode 100644
index 0000000..ff69f14
--- /dev/null
+++ b/src/mp_numeric_limits.hh
@@ -0,0 +1,157 @@
+/* Specializations of std::numeric_limits for multi-precision types.
+   This will become obsolete when GMP and MPFR will provide the
+   specializations by themselves.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_mp_numeric_limits_hh
+#define PPL_mp_numeric_limits_hh 1
+
+#include <gmpxx.h>
+#include <limits>
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <>
+class numeric_limits<mpz_class> {
+private:
+  typedef mpz_class Type;
+
+public:
+  static const bool is_specialized = true;
+  static const int digits = 0;
+  static const int digits10 = 0;
+  static const bool is_signed = true;
+  static const bool is_integer = true;
+  static const bool is_exact = true;
+  static const int radix = 2;
+  static const int min_exponent = 0;
+  static const int min_exponent10 = 0;
+  static const int max_exponent = 0;
+  static const int max_exponent10 = 0;
+  static const bool has_infinity = false;
+  static const bool has_quiet_NaN =  false;
+  static const bool has_signaling_NaN = false;
+  static const float_denorm_style has_denorm = denorm_absent;
+  static const bool has_denorm_loss = false;
+  static const bool is_iec559 = false;
+  static const bool is_bounded = false;
+  static const bool is_modulo = false;
+  static const bool traps = false;
+  static const bool tinyness_before = false;
+  static const float_round_style round_style = round_toward_zero;
+
+  static Type min() {
+    return static_cast<Type>(0);
+  }
+
+  static Type max() {
+    return static_cast<Type>(0);
+  }
+
+  static Type epsilon() {
+    return static_cast<Type>(0);
+  }
+
+  static Type round_error() {
+    return static_cast<Type>(0);
+  }
+
+  static Type infinity() {
+    return static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return static_cast<Type>(0);
+  }
+
+  static Type denorm_min() {
+    return static_cast<Type>(1);
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <>
+class numeric_limits<mpq_class> {
+private:
+  typedef mpq_class Type;
+
+public:
+  static const bool is_specialized = true;
+  static const int digits = 0;
+  static const int digits10 = 0;
+  static const bool is_signed = true;
+  static const bool is_integer = false;
+  static const bool is_exact = true;
+  static const int radix = 2;
+  static const int min_exponent = 0;
+  static const int min_exponent10 = 0;
+  static const int max_exponent = 0;
+  static const int max_exponent10 = 0;
+  static const bool has_infinity = false;
+  static const bool has_quiet_NaN =  false;
+  static const bool has_signaling_NaN = false;
+  static const float_denorm_style has_denorm = denorm_absent;
+  static const bool has_denorm_loss = false;
+  static const bool is_iec559 = false;
+  static const bool is_bounded = false;
+  static const bool is_modulo = false;
+  static const bool traps = false;
+  static const bool tinyness_before = false;
+  static const float_round_style round_style = round_toward_zero;
+
+  static Type min() {
+    return static_cast<Type>(0);
+  }
+
+  static Type max() {
+    return static_cast<Type>(0);
+  }
+
+  static Type epsilon() {
+    return static_cast<Type>(0);
+  }
+
+  static Type round_error() {
+    return static_cast<Type>(0);
+  }
+
+  static Type infinity() {
+    return static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return static_cast<Type>(0);
+  }
+
+  static Type denorm_min() {
+    return static_cast<Type>(0);
+  }
+};
+
+} // namespace std
+
+#endif // !defined(PPL_mp_numeric_limits_hh)
diff --git a/src/namespaces.hh b/src/namespaces.hh
new file mode 100644
index 0000000..93c5083
--- /dev/null
+++ b/src/namespaces.hh
@@ -0,0 +1,100 @@
+/* Documentation for used namespaces.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_namespaces_hh
+#define PPL_namespaces_hh 1
+
+//! The entire library is confined to this namespace.
+/*! \ingroup PPL_CXX_interface */
+namespace Parma_Polyhedra_Library {
+
+//! All input/output operators are confined to this namespace.
+/*! \ingroup PPL_CXX_interface
+  This is done so that the library's input/output operators
+  do not interfere with those the user might want to define.
+  In fact, it is highly unlikely that any pre-defined I/O
+  operator will suit the needs of a client application.
+  On the other hand, those applications for which the PPL
+  I/O operator are enough can easily obtain access to them.
+  For example, a directive like
+  \code
+    using namespace Parma_Polyhedra_Library::IO_Operators;
+  \endcode
+  would suffice for most uses.
+  In more complex situations, such as
+  \code
+    const Constraint_System& cs = ...;
+    copy(cs.begin(), cs.end(),
+	 ostream_iterator<Constraint>(cout, "\n"));
+  \endcode
+  the Parma_Polyhedra_Library namespace must be suitably extended.
+  This can be done as follows:
+  \code
+    namespace Parma_Polyhedra_Library {
+      // Import all the output operators into the main PPL namespace.
+      using IO_Operators::operator<<;
+    }
+  \endcode
+*/
+namespace IO_Operators {
+} // namespace IO_Operators
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Types and functions implementing checked numbers.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+namespace Checked {
+} // namespace Checked
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! %Implementation related data and functions.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+namespace Implementation {
+} // namespace Implementation
+
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The standard C++ namespace.
+/*! \ingroup PPL_CXX_interface
+  The Parma Polyhedra Library conforms to the C++ standard and,
+  in particular, as far as reserved names are concerned (17.4.3.1,
+  [lib.reserved.names]).  The PPL, however, defines several
+  template specializations for the standard library function templates
+  <CODE>swap()</CODE> and <CODE>iter_swap()</CODE> (25.2.2, [lib.alg.swap]),
+  and for the class template <CODE>numeric_limits</CODE>
+  (18.2.1, [lib.limits]).
+
+  \note
+  The PPL provides the specializations of the class template
+  <CODE>numeric_limits</CODE> not only for PPL-specific numeric types,
+  but also for the GMP types <CODE>mpz_class</CODE> and
+  <CODE>mpq_class</CODE>. These specializations will be removed
+  as soon as they will be provided by the C++ interface of GMP.
+*/
+namespace std {
+} // namespace std
+
+
+#endif // !defined(PPL_namespaces_hh)
diff --git a/src/ppl-config.cc b/src/ppl-config.cc
new file mode 100644
index 0000000..a572e14
--- /dev/null
+++ b/src/ppl-config.cc
@@ -0,0 +1,720 @@
+/* A program to enquire about the configuration of the PPL  -*- C++ -*-
+   and of the applications using it.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 8
+#error "PPL version 0.8 or following is required"
+#endif
+
+#include <cstdarg>
+#include <cstring>
+#include <cctype>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+#include <stdexcept>
+#include <string>
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+// Include this for `getopt()': especially important if we do not have
+// <getopt.h>.
+#include <unistd.h>
+#endif
+
+namespace {
+
+enum Format {
+  NO_FORMAT,
+  PLAIN,
+  MAKEFILE,
+  SH,
+  CSH
+};
+
+enum Interface {
+  NO_INTERFACE,
+  CXX,
+  C,
+  CIAO_PROLOG,
+  GNU_PROLOG,
+  SICSTUS_PROLOG,
+  SWI_PROLOG,
+  XSB_PROLOG,
+  YAP_PROLOG,
+  OCAML,
+  JAVA
+};
+
+Format required_format = NO_FORMAT;
+
+Interface required_interface = NO_INTERFACE;
+
+#define PPL_LICENSE "GNU GENERAL PUBLIC LICENSE, Version 2"
+
+std::string prefix;
+std::string exec_prefix;
+
+const char* variable_prefix = "PPL_";
+
+bool exec_prefix_set = false;
+
+bool required_application = false;
+bool required_library = false;
+bool required_prefix = false;
+bool required_exec_prefix = false;
+bool required_configure_options = false;
+bool required_version = false;
+bool required_version_major = false;
+bool required_version_minor = false;
+bool required_version_revision = false;
+bool required_version_beta = false;
+bool required_banner = false;
+bool required_coefficients = false;
+bool required_includedir = false;
+bool required_bindir = false;
+bool required_libdir = false;
+bool required_cppflags = false;
+bool required_cflags = false;
+bool required_cxxflags = false;
+bool required_ldflags = false;
+bool required_license = false;
+bool required_copying = false;
+bool required_bugs = false;
+bool required_credits = false;
+
+unsigned num_required_items = 0;
+
+#ifdef HAVE_GETOPT_H
+struct option long_options[] = {
+  {"help",              no_argument,       0, 'h'},
+  {"format",            required_argument, 0, 'F'},
+  {"interface",         required_argument, 0, 'I'},
+  {"application",       no_argument,       0, 'A'},
+  {"library",           no_argument,       0, 'L'},
+  {"prefix",            optional_argument, 0, 'p'},
+  {"exec-prefix",       optional_argument, 0, 'e'},
+  {"configure-options", no_argument,       0, 'O'},
+  {"version",           no_argument,       0, 'V'},
+  {"version-major",     no_argument,       0, 'M'},
+  {"version-minor",     no_argument,       0, 'N'},
+  {"version-revision",  no_argument,       0, 'R'},
+  {"version-beta",      no_argument,       0, 'B'},
+  {"banner",            no_argument,       0, 'E'},
+  {"coefficients",      no_argument,       0, 'n'},
+  {"includedir",        no_argument,       0, 'i'},
+  {"bindir",            no_argument,       0, 'b'},
+  {"libdir",            no_argument,       0, 'l'},
+  {"cppflags",          no_argument,       0, 'P'},
+  {"cflags",            no_argument,       0, 'C'},
+  {"cxxflags",          no_argument,       0, 'X'},
+  {"ldflags",           no_argument,       0, 'D'},
+  {"license",           no_argument,       0, 'g'},
+  {"copying",           no_argument,       0, 'c'},
+  {"bugs",              no_argument,       0, 'u'},
+  {"credits",           no_argument,       0, 'r'},
+  {0, 0, 0, 0}
+};
+#endif
+
+static const char* usage_string
+= "Usage: %s [OPTION]...\n\n"
+"  -h, --help               prints this help text to stdout\n"
+"  -FFMT, --format=FMT      sets the output format to FMT\n"
+"                           (one of `plain', `makefile', `sh' or `csh')\n"
+"  -IINT, --interface=INT   selects a library interface (one of `C++', `C',\n"
+"                           `Ciao-Prolog', `GNU-Prolog', `SICStus-Prolog',\n"
+"                           `SWI-Prolog', `XSB-Prolog', `YAP-Prolog',\n"
+"                           `OCaml' or `Java')\n"
+"  -A, --application        selects output for building an application\n"
+"  -L, --library            selects output for building a library\n"
+"  -p[PFX], --prefix[=PFX]  prints or sets library prefix information\n"
+"  -e[PFX], --exec-prefix[=PFX]\n"
+"                           prints or sets library exec-prefix information\n"
+"  -O, --configure-options  prints configuration options\n"
+"  -V, --version            prints version information\n"
+"  -M, --version-major      prints version major number\n"
+"  -N, --version-minor      prints version minor number\n"
+"  -R, --version-revision   prints version revision number\n"
+"  -B, --version-beta       prints version beta number\n"
+"  -E, --banner             prints library banner\n"
+"  -n, --coefficients       prints type of library coefficients\n"
+"  -i, --includedir         prints include files directory\n"
+"  -b, --bindir             prints binary executables directory\n"
+"  -l, --libdir             prints library files directory\n"
+"  -P, --cppflags           prints preprocessor flags\n"
+"  -C, --cflags             prints C compiler flags\n"
+"  -X, --cxxflags           prints C++ compiler flags\n"
+"  -D, --ldflags            prints linker flags\n"
+"  -g, --license            prints synthetic licensing information\n"
+"  -c, --copying            prints detailed licensing information\n"
+"  -u, --bugs               prints bug reporting information\n"
+"  -r, --credits            prints credits\n"
+#ifndef HAVE_GETOPT_H
+"\n"
+"NOTE: this version does not support long options.\n"
+#endif
+"\n"
+"Report bugs to <ppl-devel at cs.unipr.it>.\n";
+
+#define OPTION_LETTERS "hF:I:ALp::e::OVMNRBEniblPCXDgcur"
+
+const char* program_name = 0;
+
+void
+fatal(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: ", program_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+  exit(1);
+}
+
+void
+warning(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: Warning: ", program_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+}
+
+void internal_error() {
+  fatal("internal error: please submit a bug report to ppl-devel at cs.unipr.it");
+}
+
+bool
+strcaseeq(const char* s1, const char* s2) {
+  while (*s1 && *s2
+	 && tolower(static_cast<unsigned char>(*s1))
+	 == tolower(static_cast<unsigned char>(*s2))) {
+    ++s1;
+    ++s2;
+  }
+  return tolower(static_cast<unsigned char>(*s1))
+    == tolower(static_cast<unsigned char>(*s2));
+}
+
+void
+process_options(int argc, char* argv[]) {
+  while (true) {
+#ifdef HAVE_GETOPT_H
+    int option_index = 0;
+    int c = getopt_long(argc, argv, OPTION_LETTERS, long_options,
+			&option_index);
+#else
+    int c = getopt(argc, argv, OPTION_LETTERS);
+#endif
+
+    if (c == EOF)
+      break;
+
+    switch (c) {
+    case 0:
+      break;
+
+    case '?':
+    case 'h':
+      fprintf(stdout, usage_string, argv[0]);
+      exit(0);
+      break;
+
+      // --format
+    case 'F':
+      if (strcaseeq(optarg, "plain"))
+	required_format = PLAIN;
+      else if (strcaseeq(optarg, "makefile"))
+	required_format = MAKEFILE;
+      else if (strcaseeq(optarg, "sh"))
+	required_format = SH;
+      else if (strcaseeq(optarg, "csh"))
+	required_format = CSH;
+      else
+	fatal("invalid argument `%s' to --format: "
+	      "must be `plain', `makefile', `sh' or `csh'",
+	      optarg);
+      break;
+
+      // --interface
+    case 'I':
+      if (strcaseeq(optarg, "C++"))
+	required_interface = CXX;
+      else if (strcaseeq(optarg, "C"))
+	required_interface = C;
+      else if (strcaseeq(optarg, "Ciao-Prolog"))
+	required_interface = CIAO_PROLOG;
+      else if (strcaseeq(optarg, "GNU-Prolog"))
+	required_interface = GNU_PROLOG;
+      else if (strcaseeq(optarg, "SICStus-Prolog"))
+	required_interface = SICSTUS_PROLOG;
+      else if (strcaseeq(optarg, "SWI-Prolog"))
+	required_interface = SWI_PROLOG;
+      else if (strcaseeq(optarg, "XSB-Prolog"))
+	required_interface = XSB_PROLOG;
+      else if (strcaseeq(optarg, "YAP-Prolog"))
+	required_interface = YAP_PROLOG;
+      else if (strcaseeq(optarg, "OCaml"))
+	required_interface = OCAML;
+      else if (strcaseeq(optarg, "Java"))
+	required_interface = JAVA;
+      else
+	fatal("invalid argument `%s' to --interface: "
+	      "must be `C++', `C', `Ciao-Prolog', `GNU-Prolog', "
+              "`SICStus-Prolog', `SWI-Prolog', `XSB-Prolog', `YAP-Prolog', "
+	      "`OCaml' or `Java'",
+	      optarg);
+      break;
+
+      // --application
+    case 'A':
+      required_application = true;
+      break;
+
+      // --library
+    case 'L':
+      required_library = true;
+      break;
+
+      // --prefix
+    case 'p':
+      if (optarg) {
+	prefix = optarg;
+	if (!exec_prefix_set) {
+	  exec_prefix = optarg;
+	  exec_prefix_set = true;
+	}
+      }
+      else {
+	required_prefix = true;
+	++num_required_items;
+      }
+      break;
+
+      // --exec_prefix
+    case 'e':
+      if (optarg) {
+	exec_prefix = optarg;
+	exec_prefix_set = true;
+      }
+      else {
+	required_exec_prefix = true;
+	++num_required_items;
+      }
+      break;
+
+      // --configure-options
+    case 'O':
+      required_configure_options = true;
+      ++num_required_items;
+      break;
+
+      // --version
+    case 'V':
+      required_version = true;
+      ++num_required_items;
+      break;
+
+      // --version-major
+    case 'M':
+      required_version_major = true;
+      ++num_required_items;
+      break;
+
+      // --version-minor
+    case 'N':
+      required_version_minor = true;
+      ++num_required_items;
+      break;
+
+      // --version-revision
+    case 'R':
+      required_version_revision = true;
+      ++num_required_items;
+      break;
+
+      // --version-beta
+    case 'B':
+      required_version_beta = true;
+      ++num_required_items;
+      break;
+
+      // --banner
+    case 'E':
+      required_banner = true;
+      ++num_required_items;
+      break;
+
+      // --coefficients
+    case 'n':
+      required_coefficients = true;
+      ++num_required_items;
+      break;
+
+      // --includedir
+    case 'i':
+      required_includedir = true;
+      ++num_required_items;
+      break;
+
+      // --bindir
+    case 'b':
+      required_bindir = true;
+      ++num_required_items;
+      break;
+
+      // --libdir
+    case 'l':
+      required_libdir = true;
+      ++num_required_items;
+      break;
+
+      // --cppflags
+    case 'P':
+      required_cppflags = true;
+      ++num_required_items;
+      break;
+
+      // --cflags
+    case 'C':
+      required_cflags = true;
+      ++num_required_items;
+      break;
+
+      // --cxxflags
+    case 'X':
+      required_cxxflags = true;
+      ++num_required_items;
+      break;
+
+      // --ldflags
+    case 'D':
+      required_ldflags = true;
+      ++num_required_items;
+      break;
+
+      // --license
+    case 'g':
+      required_license = true;
+      ++num_required_items;
+      break;
+
+      // --copying
+    case 'c':
+      required_copying = true;
+      ++num_required_items;
+      break;
+
+      // --bugs
+    case 'u':
+      required_bugs = true;
+      ++num_required_items;
+      break;
+
+      // --credits
+    case 'r':
+      required_credits = true;
+      ++num_required_items;
+      break;
+
+    default:
+      abort();
+    }
+  }
+
+  if (argc != optind)
+    // We have a spurious argument.
+    fatal("no arguments besides options are accepted");
+
+  if (required_application && required_library)
+    fatal("the --application and --library are mutually exclusive");
+
+  if (!required_application && !required_library)
+    required_application = true;
+
+  if (required_format == NO_FORMAT)
+    required_format = PLAIN;
+
+  if (required_interface == NO_INTERFACE)
+    required_interface = CXX;
+}
+
+void
+portray_name(const char* name) {
+  switch (required_format) {
+  case PLAIN:
+    if (num_required_items > 1)
+      std::cout << variable_prefix << name << ": ";
+    break;
+  case MAKEFILE:
+    std::cout << variable_prefix << name << '=';
+    break;
+  case SH:
+    std::cout << "export " << variable_prefix << name << '=';
+    break;
+  case CSH:
+    std::cout << "setenv " << variable_prefix << name << ' ';
+    break;
+  default:
+    internal_error();
+  }
+}
+
+void
+portray(const char* const array[]) {
+  for (unsigned i = 0; array[i] != 0; ++i)
+    std::cout << array[i] << std::endl;
+}
+
+void
+portray(const char* string) {
+  std::cout << string;
+}
+
+void
+portray(long n) {
+  std::cout << n;
+}
+
+void
+portray(const char* name, const char* const array[]) {
+  portray_name(name);
+  portray(array);
+  std::cout << std::endl;
+}
+
+void
+portray(const char* name, const char* string) {
+  portray_name(name);
+  portray(string);
+  std::cout << std::endl;
+}
+
+void
+portray(const char* name, std::string s) {
+  portray(name, s.c_str());
+}
+
+void
+portray(const char* name, long n) {
+  portray_name(name);
+  portray(n);
+  std::cout << std::endl;
+}
+
+void
+replace(std::string& s,
+	const std::string& pattern, const std::string& replacement) {
+  std::string::size_type pos = 0;
+  while (true) {
+    pos = s.find(pattern, pos);
+    if (pos == std::string::npos)
+      break;
+    s.replace(pos, pattern.size(), replacement);
+    pos += replacement.length();
+  }
+}
+
+void
+replace_prefixes(std::string& s) {
+  static const std::string prefix_reference = "${prefix}";
+  static const std::string exec_prefix_reference = "${exec_prefix}";
+  replace(s, prefix_reference, prefix);
+  replace(s, exec_prefix_reference, exec_prefix);
+}
+
+void
+portray_with_prefixes(const char* name, std::string s) {
+  replace_prefixes(s);
+  portray(name, s);
+}
+
+} // namespace
+
+int
+main(int argc, char* argv[]) try {
+  program_name = argv[0];
+
+  if (strcmp(PPL_VERSION, PPL::version()) != 0)
+    fatal("was compiled with PPL version %s, but linked with version %s",
+	  PPL_VERSION, PPL::version());
+
+  // Initialize prefixes.
+  prefix = "/usr/local";
+  exec_prefix = "${prefix}";
+  replace_prefixes(prefix);
+  replace_prefixes(exec_prefix);
+
+  // Process command line options.
+  process_options(argc, argv);
+
+  if (required_prefix)
+    portray("PREFIX", prefix);
+
+  if (required_exec_prefix)
+    portray("EXEC_PREFIX", exec_prefix);
+
+  if (required_configure_options)
+    portray("CONFIGURE_OPTIONS", PPL_CONFIGURE_OPTIONS);
+
+  if (required_version)
+    portray("VERSION", PPL_VERSION);
+
+  if (required_version_major)
+    portray("VERSION_MAJOR", long(PPL_VERSION_MAJOR));
+
+  if (required_version_minor)
+    portray("VERSION_MINOR", long(PPL_VERSION_MINOR));
+
+  if (required_version_revision)
+    portray("VERSION_REVISION", long(PPL_VERSION_REVISION));
+
+  if (required_version_beta)
+    portray("VERSION_BETA", long(PPL_VERSION_BETA));
+
+  if (required_banner)
+    portray("BANNER", PPL::banner());
+
+  if (required_coefficients)
+    portray("COEFFICIENTS", "mpz");
+
+  if (required_includedir)
+    portray_with_prefixes("INCLUDEDIR", "${prefix}/include");
+
+  if (required_bindir)
+    portray_with_prefixes("BINDIR", "${exec_prefix}/bin");
+
+  if (required_libdir)
+    portray_with_prefixes("LIBDIR", "${exec_prefix}/lib");
+
+  if (required_cppflags) {
+    if (required_application) {
+      std::string cppflags = "";
+      std::string s = "${prefix}/include";
+      replace_prefixes(s);
+      // `/usr/include' is the standard include directory:
+      // thus it needs not be specified.
+      if (s == "/usr/include")
+	s = cppflags;
+      else {
+	s = "-I" + s;
+	// Avoid duplicating the -I options.
+	if (cppflags.find(s) != std::string::npos)
+	  s = "";
+	if (s.length() > 0 && strlen("") > 0)
+	  s += ' ';
+	s += "";
+      }
+      if (s.length() > 0 && strlen("") > 0)
+	  s += ' ';
+      s += "";
+      portray("CPPFLAGS", s);
+    }
+    else
+      portray("CPPFLAGS", "");
+  }
+
+  if (required_cflags)
+    portray("CFLAGS", "-W -Wall  -g -O2");
+
+  if (required_cxxflags)
+    portray("CXXFLAGS", "-W -Wall  -g -O2");
+
+  if (required_ldflags) {
+    std::string s = "${exec_prefix}/lib";
+    replace_prefixes(s);
+    const std::string ldflags = "";
+    // `/usr/lib' is the standard library directory:
+    // thus it needs not be specified.
+    if (s == "/usr/lib")
+      s = ldflags;
+    else {
+      s = "-L" + s;
+      // Avoid duplicating the -L options.
+      if (ldflags.find(s) != std::string::npos)
+	s = "";
+      if (s.length() > 0 && ldflags.length() > 0)
+	s += ' ';
+      s += ldflags;
+    }
+    if (required_library) {
+      if (s.length() > 0 && strlen(" -lm -L/usr/local/lib -lgmpxx -L/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.2 -L/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.2/../../.. -L/usr/local/distrib/objdir/i686-pc-linux-gnu/libstdc++-v3/src -L/usr/local/distrib/objdir/i686-pc-linux-gnu/libstdc++-v3/src/.libs -L/usr/local/distrib/objdir/gcc -L/usr/local/lib -lgmp -R/usr/local/lib -lm -L/usr/local/lib -lgcc_s -lc -R/usr/local/lib") > 0)
+	s += ' ';
+      s += " -lm -L/usr/local/lib -lgmpxx -L/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.2 -L/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.2/../../.. -L/usr/local/distrib/objdir/i686-pc-linux-gnu/libstdc++-v3/src -L/usr/local/distrib/objdir/i686-pc-linux-gnu/libstdc++-v3/src/.libs -L/usr/local/distrib/objdir/gcc -L/usr/local/lib -lgmp -R/usr/local/lib -lm -L/usr/local/lib -lgcc_s -lc -R/usr/local/lib";
+    }
+    else {
+      assert(required_application);
+      if (s.length() > 0)
+	s += ' ';
+      s += "-lppl";
+      switch (required_interface) {
+      case C:
+	s += " -lppl_c";
+	break;
+      default:
+	break;
+      }
+      s += " -lgmpxx -lgmp";
+    }
+    portray("LDFLAGS", s);
+  }
+
+  if (required_license)
+    portray("LICENSE", PPL_LICENSE);
+
+  if (required_copying) {
+    extern const char* const COPYING_array[];
+    portray("COPYING", COPYING_array);
+  }
+
+  if (required_bugs) {
+    extern const char* const BUGS_array[];
+    portray("BUGS", BUGS_array);
+  }
+
+  if (required_credits) {
+    extern const char* const CREDITS_array[];
+    portray("CREDITS", CREDITS_array);
+  }
+
+  return 0;
+}
+catch (const std::bad_alloc&) {
+  fatal("out of memory");
+  exit(1);
+}
+catch (const std::overflow_error& e) {
+  fatal("arithmetic overflow (%s)", e.what());
+  exit(1);
+}
+catch (...) {
+  internal_error();
+}
diff --git a/src/ppl-config.cc.in b/src/ppl-config.cc.in
new file mode 100644
index 0000000..4ed2a06
--- /dev/null
+++ b/src/ppl-config.cc.in
@@ -0,0 +1,720 @@
+/* A program to enquire about the configuration of the PPL  -*- C++ -*-
+   and of the applications using it.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 8
+#error "PPL version 0.8 or following is required"
+#endif
+
+#include <cstdarg>
+#include <cstring>
+#include <cctype>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+#include <stdexcept>
+#include <string>
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+// Include this for `getopt()': especially important if we do not have
+// <getopt.h>.
+#include <unistd.h>
+#endif
+
+namespace {
+
+enum Format {
+  NO_FORMAT,
+  PLAIN,
+  MAKEFILE,
+  SH,
+  CSH
+};
+
+enum Interface {
+  NO_INTERFACE,
+  CXX,
+  C,
+  CIAO_PROLOG,
+  GNU_PROLOG,
+  SICSTUS_PROLOG,
+  SWI_PROLOG,
+  XSB_PROLOG,
+  YAP_PROLOG,
+  OCAML,
+  JAVA
+};
+
+Format required_format = NO_FORMAT;
+
+Interface required_interface = NO_INTERFACE;
+
+#define PPL_LICENSE "GNU GENERAL PUBLIC LICENSE, Version 2"
+
+std::string prefix;
+std::string exec_prefix;
+
+const char* variable_prefix = "PPL_";
+
+bool exec_prefix_set = false;
+
+bool required_application = false;
+bool required_library = false;
+bool required_prefix = false;
+bool required_exec_prefix = false;
+bool required_configure_options = false;
+bool required_version = false;
+bool required_version_major = false;
+bool required_version_minor = false;
+bool required_version_revision = false;
+bool required_version_beta = false;
+bool required_banner = false;
+bool required_coefficients = false;
+bool required_includedir = false;
+bool required_bindir = false;
+bool required_libdir = false;
+bool required_cppflags = false;
+bool required_cflags = false;
+bool required_cxxflags = false;
+bool required_ldflags = false;
+bool required_license = false;
+bool required_copying = false;
+bool required_bugs = false;
+bool required_credits = false;
+
+unsigned num_required_items = 0;
+
+#ifdef HAVE_GETOPT_H
+struct option long_options[] = {
+  {"help",              no_argument,       0, 'h'},
+  {"format",            required_argument, 0, 'F'},
+  {"interface",         required_argument, 0, 'I'},
+  {"application",       no_argument,       0, 'A'},
+  {"library",           no_argument,       0, 'L'},
+  {"prefix",            optional_argument, 0, 'p'},
+  {"exec-prefix",       optional_argument, 0, 'e'},
+  {"configure-options", no_argument,       0, 'O'},
+  {"version",           no_argument,       0, 'V'},
+  {"version-major",     no_argument,       0, 'M'},
+  {"version-minor",     no_argument,       0, 'N'},
+  {"version-revision",  no_argument,       0, 'R'},
+  {"version-beta",      no_argument,       0, 'B'},
+  {"banner",            no_argument,       0, 'E'},
+  {"coefficients",      no_argument,       0, 'n'},
+  {"includedir",        no_argument,       0, 'i'},
+  {"bindir",            no_argument,       0, 'b'},
+  {"libdir",            no_argument,       0, 'l'},
+  {"cppflags",          no_argument,       0, 'P'},
+  {"cflags",            no_argument,       0, 'C'},
+  {"cxxflags",          no_argument,       0, 'X'},
+  {"ldflags",           no_argument,       0, 'D'},
+  {"license",           no_argument,       0, 'g'},
+  {"copying",           no_argument,       0, 'c'},
+  {"bugs",              no_argument,       0, 'u'},
+  {"credits",           no_argument,       0, 'r'},
+  {0, 0, 0, 0}
+};
+#endif
+
+static const char* usage_string
+= "Usage: %s [OPTION]...\n\n"
+"  -h, --help               prints this help text to stdout\n"
+"  -FFMT, --format=FMT      sets the output format to FMT\n"
+"                           (one of `plain', `makefile', `sh' or `csh')\n"
+"  -IINT, --interface=INT   selects a library interface (one of `C++', `C',\n"
+"                           `Ciao-Prolog', `GNU-Prolog', `SICStus-Prolog',\n"
+"                           `SWI-Prolog', `XSB-Prolog', `YAP-Prolog',\n"
+"                           `OCaml' or `Java')\n"
+"  -A, --application        selects output for building an application\n"
+"  -L, --library            selects output for building a library\n"
+"  -p[PFX], --prefix[=PFX]  prints or sets library prefix information\n"
+"  -e[PFX], --exec-prefix[=PFX]\n"
+"                           prints or sets library exec-prefix information\n"
+"  -O, --configure-options  prints configuration options\n"
+"  -V, --version            prints version information\n"
+"  -M, --version-major      prints version major number\n"
+"  -N, --version-minor      prints version minor number\n"
+"  -R, --version-revision   prints version revision number\n"
+"  -B, --version-beta       prints version beta number\n"
+"  -E, --banner             prints library banner\n"
+"  -n, --coefficients       prints type of library coefficients\n"
+"  -i, --includedir         prints include files directory\n"
+"  -b, --bindir             prints binary executables directory\n"
+"  -l, --libdir             prints library files directory\n"
+"  -P, --cppflags           prints preprocessor flags\n"
+"  -C, --cflags             prints C compiler flags\n"
+"  -X, --cxxflags           prints C++ compiler flags\n"
+"  -D, --ldflags            prints linker flags\n"
+"  -g, --license            prints synthetic licensing information\n"
+"  -c, --copying            prints detailed licensing information\n"
+"  -u, --bugs               prints bug reporting information\n"
+"  -r, --credits            prints credits\n"
+#ifndef HAVE_GETOPT_H
+"\n"
+"NOTE: this version does not support long options.\n"
+#endif
+"\n"
+"Report bugs to <ppl-devel at cs.unipr.it>.\n";
+
+#define OPTION_LETTERS "hF:I:ALp::e::OVMNRBEniblPCXDgcur"
+
+const char* program_name = 0;
+
+void
+fatal(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: ", program_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+  exit(1);
+}
+
+void
+warning(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: Warning: ", program_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+}
+
+void internal_error() {
+  fatal("internal error: please submit a bug report to ppl-devel at cs.unipr.it");
+}
+
+bool
+strcaseeq(const char* s1, const char* s2) {
+  while (*s1 && *s2
+	 && tolower(static_cast<unsigned char>(*s1))
+	 == tolower(static_cast<unsigned char>(*s2))) {
+    ++s1;
+    ++s2;
+  }
+  return tolower(static_cast<unsigned char>(*s1))
+    == tolower(static_cast<unsigned char>(*s2));
+}
+
+void
+process_options(int argc, char* argv[]) {
+  while (true) {
+#ifdef HAVE_GETOPT_H
+    int option_index = 0;
+    int c = getopt_long(argc, argv, OPTION_LETTERS, long_options,
+			&option_index);
+#else
+    int c = getopt(argc, argv, OPTION_LETTERS);
+#endif
+
+    if (c == EOF)
+      break;
+
+    switch (c) {
+    case 0:
+      break;
+
+    case '?':
+    case 'h':
+      fprintf(stdout, usage_string, argv[0]);
+      exit(0);
+      break;
+
+      // --format
+    case 'F':
+      if (strcaseeq(optarg, "plain"))
+	required_format = PLAIN;
+      else if (strcaseeq(optarg, "makefile"))
+	required_format = MAKEFILE;
+      else if (strcaseeq(optarg, "sh"))
+	required_format = SH;
+      else if (strcaseeq(optarg, "csh"))
+	required_format = CSH;
+      else
+	fatal("invalid argument `%s' to --format: "
+	      "must be `plain', `makefile', `sh' or `csh'",
+	      optarg);
+      break;
+
+      // --interface
+    case 'I':
+      if (strcaseeq(optarg, "C++"))
+	required_interface = CXX;
+      else if (strcaseeq(optarg, "C"))
+	required_interface = C;
+      else if (strcaseeq(optarg, "Ciao-Prolog"))
+	required_interface = CIAO_PROLOG;
+      else if (strcaseeq(optarg, "GNU-Prolog"))
+	required_interface = GNU_PROLOG;
+      else if (strcaseeq(optarg, "SICStus-Prolog"))
+	required_interface = SICSTUS_PROLOG;
+      else if (strcaseeq(optarg, "SWI-Prolog"))
+	required_interface = SWI_PROLOG;
+      else if (strcaseeq(optarg, "XSB-Prolog"))
+	required_interface = XSB_PROLOG;
+      else if (strcaseeq(optarg, "YAP-Prolog"))
+	required_interface = YAP_PROLOG;
+      else if (strcaseeq(optarg, "OCaml"))
+	required_interface = OCAML;
+      else if (strcaseeq(optarg, "Java"))
+	required_interface = JAVA;
+      else
+	fatal("invalid argument `%s' to --interface: "
+	      "must be `C++', `C', `Ciao-Prolog', `GNU-Prolog', "
+              "`SICStus-Prolog', `SWI-Prolog', `XSB-Prolog', `YAP-Prolog', "
+	      "`OCaml' or `Java'",
+	      optarg);
+      break;
+
+      // --application
+    case 'A':
+      required_application = true;
+      break;
+
+      // --library
+    case 'L':
+      required_library = true;
+      break;
+
+      // --prefix
+    case 'p':
+      if (optarg) {
+	prefix = optarg;
+	if (!exec_prefix_set) {
+	  exec_prefix = optarg;
+	  exec_prefix_set = true;
+	}
+      }
+      else {
+	required_prefix = true;
+	++num_required_items;
+      }
+      break;
+
+      // --exec_prefix
+    case 'e':
+      if (optarg) {
+	exec_prefix = optarg;
+	exec_prefix_set = true;
+      }
+      else {
+	required_exec_prefix = true;
+	++num_required_items;
+      }
+      break;
+
+      // --configure-options
+    case 'O':
+      required_configure_options = true;
+      ++num_required_items;
+      break;
+
+      // --version
+    case 'V':
+      required_version = true;
+      ++num_required_items;
+      break;
+
+      // --version-major
+    case 'M':
+      required_version_major = true;
+      ++num_required_items;
+      break;
+
+      // --version-minor
+    case 'N':
+      required_version_minor = true;
+      ++num_required_items;
+      break;
+
+      // --version-revision
+    case 'R':
+      required_version_revision = true;
+      ++num_required_items;
+      break;
+
+      // --version-beta
+    case 'B':
+      required_version_beta = true;
+      ++num_required_items;
+      break;
+
+      // --banner
+    case 'E':
+      required_banner = true;
+      ++num_required_items;
+      break;
+
+      // --coefficients
+    case 'n':
+      required_coefficients = true;
+      ++num_required_items;
+      break;
+
+      // --includedir
+    case 'i':
+      required_includedir = true;
+      ++num_required_items;
+      break;
+
+      // --bindir
+    case 'b':
+      required_bindir = true;
+      ++num_required_items;
+      break;
+
+      // --libdir
+    case 'l':
+      required_libdir = true;
+      ++num_required_items;
+      break;
+
+      // --cppflags
+    case 'P':
+      required_cppflags = true;
+      ++num_required_items;
+      break;
+
+      // --cflags
+    case 'C':
+      required_cflags = true;
+      ++num_required_items;
+      break;
+
+      // --cxxflags
+    case 'X':
+      required_cxxflags = true;
+      ++num_required_items;
+      break;
+
+      // --ldflags
+    case 'D':
+      required_ldflags = true;
+      ++num_required_items;
+      break;
+
+      // --license
+    case 'g':
+      required_license = true;
+      ++num_required_items;
+      break;
+
+      // --copying
+    case 'c':
+      required_copying = true;
+      ++num_required_items;
+      break;
+
+      // --bugs
+    case 'u':
+      required_bugs = true;
+      ++num_required_items;
+      break;
+
+      // --credits
+    case 'r':
+      required_credits = true;
+      ++num_required_items;
+      break;
+
+    default:
+      abort();
+    }
+  }
+
+  if (argc != optind)
+    // We have a spurious argument.
+    fatal("no arguments besides options are accepted");
+
+  if (required_application && required_library)
+    fatal("the --application and --library are mutually exclusive");
+
+  if (!required_application && !required_library)
+    required_application = true;
+
+  if (required_format == NO_FORMAT)
+    required_format = PLAIN;
+
+  if (required_interface == NO_INTERFACE)
+    required_interface = CXX;
+}
+
+void
+portray_name(const char* name) {
+  switch (required_format) {
+  case PLAIN:
+    if (num_required_items > 1)
+      std::cout << variable_prefix << name << ": ";
+    break;
+  case MAKEFILE:
+    std::cout << variable_prefix << name << '=';
+    break;
+  case SH:
+    std::cout << "export " << variable_prefix << name << '=';
+    break;
+  case CSH:
+    std::cout << "setenv " << variable_prefix << name << ' ';
+    break;
+  default:
+    internal_error();
+  }
+}
+
+void
+portray(const char* const array[]) {
+  for (unsigned i = 0; array[i] != 0; ++i)
+    std::cout << array[i] << std::endl;
+}
+
+void
+portray(const char* string) {
+  std::cout << string;
+}
+
+void
+portray(long n) {
+  std::cout << n;
+}
+
+void
+portray(const char* name, const char* const array[]) {
+  portray_name(name);
+  portray(array);
+  std::cout << std::endl;
+}
+
+void
+portray(const char* name, const char* string) {
+  portray_name(name);
+  portray(string);
+  std::cout << std::endl;
+}
+
+void
+portray(const char* name, std::string s) {
+  portray(name, s.c_str());
+}
+
+void
+portray(const char* name, long n) {
+  portray_name(name);
+  portray(n);
+  std::cout << std::endl;
+}
+
+void
+replace(std::string& s,
+	const std::string& pattern, const std::string& replacement) {
+  std::string::size_type pos = 0;
+  while (true) {
+    pos = s.find(pattern, pos);
+    if (pos == std::string::npos)
+      break;
+    s.replace(pos, pattern.size(), replacement);
+    pos += replacement.length();
+  }
+}
+
+void
+replace_prefixes(std::string& s) {
+  static const std::string prefix_reference = "${prefix}";
+  static const std::string exec_prefix_reference = "${exec_prefix}";
+  replace(s, prefix_reference, prefix);
+  replace(s, exec_prefix_reference, exec_prefix);
+}
+
+void
+portray_with_prefixes(const char* name, std::string s) {
+  replace_prefixes(s);
+  portray(name, s);
+}
+
+} // namespace
+
+int
+main(int argc, char* argv[]) try {
+  program_name = argv[0];
+
+  if (strcmp(PPL_VERSION, PPL::version()) != 0)
+    fatal("was compiled with PPL version %s, but linked with version %s",
+	  PPL_VERSION, PPL::version());
+
+  // Initialize prefixes.
+  prefix = "@prefix@";
+  exec_prefix = "@exec_prefix@";
+  replace_prefixes(prefix);
+  replace_prefixes(exec_prefix);
+
+  // Process command line options.
+  process_options(argc, argv);
+
+  if (required_prefix)
+    portray("PREFIX", prefix);
+
+  if (required_exec_prefix)
+    portray("EXEC_PREFIX", exec_prefix);
+
+  if (required_configure_options)
+    portray("CONFIGURE_OPTIONS", PPL_CONFIGURE_OPTIONS);
+
+  if (required_version)
+    portray("VERSION", PPL_VERSION);
+
+  if (required_version_major)
+    portray("VERSION_MAJOR", long(PPL_VERSION_MAJOR));
+
+  if (required_version_minor)
+    portray("VERSION_MINOR", long(PPL_VERSION_MINOR));
+
+  if (required_version_revision)
+    portray("VERSION_REVISION", long(PPL_VERSION_REVISION));
+
+  if (required_version_beta)
+    portray("VERSION_BETA", long(PPL_VERSION_BETA));
+
+  if (required_banner)
+    portray("BANNER", PPL::banner());
+
+  if (required_coefficients)
+    portray("COEFFICIENTS", "@coefficient_mnemonic@");
+
+  if (required_includedir)
+    portray_with_prefixes("INCLUDEDIR", "@includedir@");
+
+  if (required_bindir)
+    portray_with_prefixes("BINDIR", "@bindir@");
+
+  if (required_libdir)
+    portray_with_prefixes("LIBDIR", "@libdir@");
+
+  if (required_cppflags) {
+    if (required_application) {
+      std::string cppflags = "@CPPFLAGS@";
+      std::string s = "@includedir@";
+      replace_prefixes(s);
+      // `/usr/include' is the standard include directory:
+      // thus it needs not be specified.
+      if (s == "/usr/include")
+	s = cppflags;
+      else {
+	s = "-I" + s;
+	// Avoid duplicating the -I options.
+	if (cppflags.find(s) != std::string::npos)
+	  s = "";
+	if (s.length() > 0 && strlen("@CPPFLAGS@") > 0)
+	  s += ' ';
+	s += "@CPPFLAGS@";
+      }
+      if (s.length() > 0 && strlen("@extra_includes@") > 0)
+	  s += ' ';
+      s += "@extra_includes@";
+      portray("CPPFLAGS", s);
+    }
+    else
+      portray("CPPFLAGS", "@CPPFLAGS@");
+  }
+
+  if (required_cflags)
+    portray("CFLAGS", "@CFLAGS@");
+
+  if (required_cxxflags)
+    portray("CXXFLAGS", "@CXXFLAGS@");
+
+  if (required_ldflags) {
+    std::string s = "@libdir@";
+    replace_prefixes(s);
+    const std::string ldflags = "@LDFLAGS@";
+    // `/usr/lib' is the standard library directory:
+    // thus it needs not be specified.
+    if (s == "/usr/lib")
+      s = ldflags;
+    else {
+      s = "-L" + s;
+      // Avoid duplicating the -L options.
+      if (ldflags.find(s) != std::string::npos)
+	s = "";
+      if (s.length() > 0 && ldflags.length() > 0)
+	s += ' ';
+      s += ldflags;
+    }
+    if (required_library) {
+      if (s.length() > 0 && strlen("@extra_libraries@") > 0)
+	s += ' ';
+      s += "@extra_libraries@";
+    }
+    else {
+      assert(required_application);
+      if (s.length() > 0)
+	s += ' ';
+      s += "-lppl";
+      switch (required_interface) {
+      case C:
+	s += " -lppl_c";
+	break;
+      default:
+	break;
+      }
+      s += " -lgmpxx -lgmp";
+    }
+    portray("LDFLAGS", s);
+  }
+
+  if (required_license)
+    portray("LICENSE", PPL_LICENSE);
+
+  if (required_copying) {
+    extern const char* const COPYING_array[];
+    portray("COPYING", COPYING_array);
+  }
+
+  if (required_bugs) {
+    extern const char* const BUGS_array[];
+    portray("BUGS", BUGS_array);
+  }
+
+  if (required_credits) {
+    extern const char* const CREDITS_array[];
+    portray("CREDITS", CREDITS_array);
+  }
+
+  return 0;
+}
+catch (const std::bad_alloc&) {
+  fatal("out of memory");
+  exit(1);
+}
+catch (const std::overflow_error& e) {
+  fatal("arithmetic overflow (%s)", e.what());
+  exit(1);
+}
+catch (...) {
+  internal_error();
+}
diff --git a/src/ppl.hh.dist b/src/ppl.hh.dist
new file mode 100644
index 0000000..f8b6702
--- /dev/null
+++ b/src/ppl.hh.dist
@@ -0,0 +1,41175 @@
+/* This is the header file of the Parma Polyhedra Library.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_hh
+#define PPL_ppl_hh 1
+
+#ifdef NDEBUG
+# define PPL_SAVE_NDEBUG 1
+# undef NDEBUG
+#endif
+
+// Automatically generated from PPL source file ../config.h line 1
+/* config.h.  Generated by configure.  */
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+
+
+/* Defined if the integral type to be used for coefficients is a checked one.
+   */
+/* #undef CHECKED_INTEGERS */
+
+/* The number of bits of coefficients; 0 if unbounded. */
+#define COEFFICIENT_BITS 0
+
+/* The integral type used to represent coefficients. */
+#define COEFFICIENT_TYPE mpz_class
+
+/* The binary format of C++ doubles, if supported; undefined otherwise. */
+#define CXX_DOUBLE_BINARY_FORMAT float_ieee754_double
+
+/* The binary format of C++ floats, if supported; undefined otherwise. */
+#define CXX_FLOAT_BINARY_FORMAT float_ieee754_single
+
+/* The binary format of C++ long doubles, if supported; undefined otherwise.
+   */
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_intel_double_extended
+
+/* Not zero if the C++ compiler supports __attribute__ ((weak)). */
+#define CXX_SUPPORTS_ATTRIBUTE_WEAK 1
+
+/* Not zero if the C++ compiler supports flexible arrays. */
+#define CXX_SUPPORTS_FLEXIBLE_ARRAYS 1
+
+/* Enable more assertions when defined. */
+/* #undef EXTRA_ROW_DEBUG */
+
+/* Defined if the integral type to be used for coefficients is GMP's one. */
+#define GMP_INTEGERS 1
+
+/* Not zero if GMP has been compiled with support for exceptions. */
+#define GMP_SUPPORTS_EXCEPTIONS 1
+
+/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
+#define HAVE_DECL_FFS 1
+
+/* Define to 1 if you have the declaration of `fma', and to 0 if you don't. */
+#define HAVE_DECL_FMA 1
+
+/* Define to 1 if you have the declaration of `fmaf', and to 0 if you don't.
+   */
+#define HAVE_DECL_FMAF 1
+
+/* Define to 1 if you have the declaration of `fmal', and to 0 if you don't.
+   */
+#define HAVE_DECL_FMAL 1
+
+/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
+   */
+#define HAVE_DECL_GETENV 1
+
+/* Define to 1 if you have the declaration of `rintf', and to 0 if you don't.
+   */
+#define HAVE_DECL_RINTF 1
+
+/* Define to 1 if you have the declaration of `rintl', and to 0 if you don't.
+   */
+#define HAVE_DECL_RINTL 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_AS', and to 0 if you
+   don't. */
+#define HAVE_DECL_RLIMIT_AS 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_DATA', and to 0 if you
+   don't. */
+#define HAVE_DECL_RLIMIT_DATA 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_RSS', and to 0 if you
+   don't. */
+#define HAVE_DECL_RLIMIT_RSS 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_VMEM', and to 0 if you
+   don't. */
+#define HAVE_DECL_RLIMIT_VMEM 0
+
+/* Define to 1 if you have the declaration of `strtod', and to 0 if you don't.
+   */
+#define HAVE_DECL_STRTOD 1
+
+/* Define to 1 if you have the declaration of `strtof', and to 0 if you don't.
+   */
+#define HAVE_DECL_STRTOF 1
+
+/* Define to 1 if you have the declaration of `strtold', and to 0 if you
+   don't. */
+#define HAVE_DECL_STRTOLD 1
+
+/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
+   don't. */
+#define HAVE_DECL_STRTOLL 1
+
+/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
+   don't. */
+#define HAVE_DECL_STRTOULL 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <fenv.h> header file. */
+#define HAVE_FENV_H 1
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#define HAVE_GETOPT_H 1
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+/* #undef HAVE_IEEEFP_H */
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if the system has the type `int_fast16_t'. */
+#define HAVE_INT_FAST16_T 1
+
+/* Define to 1 if the system has the type `int_fast32_t'. */
+#define HAVE_INT_FAST32_T 1
+
+/* Define to 1 if the system has the type `int_fast64_t'. */
+#define HAVE_INT_FAST64_T 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the <signal.h> header file. */
+#define HAVE_SIGNAL_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#define HAVE_SYS_RESOURCE_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if the system has the type `uint_fast16_t'. */
+#define HAVE_UINT_FAST16_T 1
+
+/* Define to 1 if the system has the type `uint_fast32_t'. */
+#define HAVE_UINT_FAST32_T 1
+
+/* Define to 1 if the system has the type `uint_fast64_t'. */
+#define HAVE_UINT_FAST64_T 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if `_mp_alloc' is member of `__mpz_struct'. */
+#define HAVE___MPZ_STRUCT__MP_ALLOC 1
+
+/* Define to 1 if `_mp_d' is member of `__mpz_struct'. */
+#define HAVE___MPZ_STRUCT__MP_D 1
+
+/* Define to 1 if `_mp_size' is member of `__mpz_struct'. */
+#define HAVE___MPZ_STRUCT__MP_SIZE 1
+
+/* Defined if the integral type to be used for coefficients is a native one.
+   */
+/* #undef NATIVE_INTEGERS */
+
+/* Assertions are disabled when this is defined. */
+#define NDEBUG 1
+
+/* Name of package */
+#define PACKAGE "ppl"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "ppl-devel at cs.unipr.it"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "the Parma Polyhedra Library"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "the Parma Polyhedra Library 0.9"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "ppl"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "0.9"
+
+/* Not zero if the FPU can be controlled. */
+#define PPL_CAN_CONTROL_FPU 1
+
+/* This contains the options with which `configure' was invoked. */
+#define PPL_CONFIGURE_OPTIONS ""
+
+/* Not zero if doubles are supported. */
+#define PPL_SUPPORTED_DOUBLE 1
+
+/* Not zero if floats are supported. */
+#define PPL_SUPPORTED_FLOAT 1
+
+/* Not zero if long doubles are supported. */
+#define PPL_SUPPORTED_LONG_DOUBLE 1
+
+/* The size of a `double', as computed by sizeof. */
+#define SIZEOF_DOUBLE 8
+
+/* The size of a `float', as computed by sizeof. */
+#define SIZEOF_FLOAT 4
+
+/* The size of a `int', as computed by sizeof. */
+#define SIZEOF_INT 4
+
+/* The size of a `long', as computed by sizeof. */
+#define SIZEOF_LONG 4
+
+/* The size of a `long double', as computed by sizeof. */
+#define SIZEOF_LONG_DOUBLE 12
+
+/* The size of a `long long', as computed by sizeof. */
+#define SIZEOF_LONG_LONG 8
+
+/* The size of a `mp_limb_t', as computed by sizeof. */
+#define SIZEOF_MP_LIMB_T 4
+
+/* The size of a `size_t', as computed by sizeof. */
+#define SIZEOF_SIZE_T 4
+
+/* The size of a `unsigned', as computed by sizeof. */
+#define SIZEOF_UNSIGNED 4
+
+/* The size of a `unsigned long', as computed by sizeof. */
+#define SIZEOF_UNSIGNED_LONG 4
+
+/* The size of a `unsigned long long', as computed by sizeof. */
+#define SIZEOF_UNSIGNED_LONG_LONG 8
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Version number of package */
+#define VERSION "0.9"
+
+/* Define to 1 if your processor stores words with the most significant byte
+   first (like Motorola and SPARC, unlike Intel and VAX). */
+/* #undef WORDS_BIGENDIAN */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+
+/*
+  In order for the definition of `int64_t' to be seen by Comeau C/C++,
+  we must make sure <stdint.h> is included before <sys/types.hh> is
+  (even indirectly) included.
+*/
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#endif /* !defined(PPL_ppl_config_h) */
+
+// Automatically generated from PPL source file ../src/version.hh line 1
+/* Declaration of macros and functions providing version  -*- C++ -*-
+   and licensing information.
+*/
+
+
+//! The major number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MAJOR 0
+
+//! The minor number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MINOR 9
+
+//! The revision number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_REVISION 0
+
+/*! \brief
+  The beta number of the PPL version.  This is zero for official
+  releases and nonzero for development snapshots.
+  \ingroup PPL_CXX_interface
+*/
+#define PPL_VERSION_BETA 0
+
+//! A string containing the PPL version.
+/*! \ingroup PPL_CXX_interface
+  Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+  to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively.  The
+  format of PPL_VERSION is <CODE>M "." m</CODE> if both
+  PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+  (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+  PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+  <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+  PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+  neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "0.9"
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the major number of the PPL version.
+unsigned
+version_major();
+
+//! Returns the minor number of the PPL version.
+unsigned
+version_minor();
+
+//! Returns the revision number of the PPL version.
+unsigned
+version_revision();
+
+//! Returns the beta number of the PPL version.
+unsigned
+version_beta();
+
+//! Returns a character string containing the PPL version.
+const char* version();
+
+//! Returns a character string containing the PPL banner.
+/*!
+  The banner provides information about the PPL version, the licensing,
+  the lack of any warranty whatsoever, the C++ compiler used to build
+  the library, where to report bugs and where to look for further
+  information.
+*/
+const char* banner();
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/namespaces.hh line 1
+/* Documentation for used namespaces.
+*/
+
+
+//! The entire library is confined to this namespace.
+/*! \ingroup PPL_CXX_interface */
+namespace Parma_Polyhedra_Library {
+
+//! All input/output operators are confined to this namespace.
+/*! \ingroup PPL_CXX_interface
+  This is done so that the library's input/output operators
+  do not interfere with those the user might want to define.
+  In fact, it is highly unlikely that any pre-defined I/O
+  operator will suit the needs of a client application.
+  On the other hand, those applications for which the PPL
+  I/O operator are enough can easily obtain access to them.
+  For example, a directive like
+  \code
+    using namespace Parma_Polyhedra_Library::IO_Operators;
+  \endcode
+  would suffice for most uses.
+  In more complex situations, such as
+  \code
+    const Constraint_System& cs = ...;
+    copy(cs.begin(), cs.end(),
+	 ostream_iterator<Constraint>(cout, "\n"));
+  \endcode
+  the Parma_Polyhedra_Library namespace must be suitably extended.
+  This can be done as follows:
+  \code
+    namespace Parma_Polyhedra_Library {
+      // Import all the output operators into the main PPL namespace.
+      using IO_Operators::operator<<;
+    }
+  \endcode
+*/
+namespace IO_Operators {
+} // namespace IO_Operators
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Types and functions implementing checked numbers.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+namespace Checked {
+} // namespace Checked
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! %Implementation related data and functions.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+namespace Implementation {
+} // namespace Implementation
+
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The standard C++ namespace.
+/*! \ingroup PPL_CXX_interface
+  The Parma Polyhedra Library conforms to the C++ standard and,
+  in particular, as far as reserved names are concerned (17.4.3.1,
+  [lib.reserved.names]).  The PPL, however, defines several
+  template specializations for the standard library function templates
+  <CODE>swap()</CODE> and <CODE>iter_swap()</CODE> (25.2.2, [lib.alg.swap]),
+  and for the class template <CODE>numeric_limits</CODE>
+  (18.2.1, [lib.limits]).
+
+  \note
+  The PPL provides the specializations of the class template
+  <CODE>numeric_limits</CODE> not only for PPL-specific numeric types,
+  but also for the GMP types <CODE>mpz_class</CODE> and
+  <CODE>mpq_class</CODE>. These specializations will be removed
+  as soon as they will be provided by the C++ interface of GMP.
+*/
+namespace std {
+} // namespace std
+
+
+// Automatically generated from PPL source file ../src/compiler.hh line 1
+/* C++ compiler related stuff.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Used to avoid unused variable warnings from the compiler.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline void
+used(const T&) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Coefficient_traits_template.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Coefficient>
+struct Coefficient_traits_template {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Checked_Number.types.hh line 1
+
+
+// Automatically generated from PPL source file ../src/Checked_Number.types.hh line 16
+
+namespace Parma_Polyhedra_Library {
+
+struct Checked_Number_Default_Policy;
+struct Extended_Number_Policy;
+
+template <typename T, typename Policy = Checked_Number_Default_Policy>
+class Checked_Number;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/GMP_Integer.types.hh line 1
+
+
+// Automatically generated from PPL source file ../src/GMP_Integer.types.hh line 16
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \class Parma_Polyhedra_Library::GMP_Integer
+  \brief
+  Unbounded integers as provided by the GMP library.
+
+  \ingroup PPL_CXX_interface
+  GMP_Integer is an alias for the <CODE>mpz_class</CODE> type
+  defined in the C++ interface of the GMP library.
+  For more information, see <CODE>http://www.swox.com/gmp/</CODE>
+*/
+typedef mpz_class GMP_Integer;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for unbounded integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <>
+struct Coefficient_traits_template<GMP_Integer> {
+  //! The type used for references to const unbounded integers.
+  typedef const GMP_Integer& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Coefficient.types.hh line 1
+
+
+// Automatically generated from PPL source file ../src/Checked_Number.defs.hh line 1
+/* Checked_Number class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/checked.defs.hh line 1
+/* Abstract checked arithmetic function container
+*/
+
+
+#include <iostream>
+#include <gmpxx.h>
+// Automatically generated from PPL source file ../src/Rounding_Dir.defs.hh line 1
+/* Declaration of Rounding_Dir and related functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Result.defs.hh line 1
+/* Result enum and supporting function declarations.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of a checked arithmetic computation.
+/*! \ingroup PPL_CXX_interface */
+enum Result {
+
+  VC_MASK = 48,
+
+  //! \hideinitializer Ordinary result class.
+  VC_NORMAL = 0,
+
+  //! \hideinitializer The computed result is inexact and rounded up.
+  V_LT = 1,
+
+  //! \hideinitializer The computed result is inexact and rounded down.
+  V_GT = 2,
+
+  //! \hideinitializer The computed result is exact.
+  V_EQ = 4,
+
+  //! \hideinitializer The computed result is inexact.
+  V_NE = V_LT | V_GT,
+
+  //! \hideinitializer The computed result may be inexact and rounded up.
+  V_LE = V_EQ | V_LT,
+
+  //! \hideinitializer The computed result may be inexact and rounded down.
+  V_GE = V_EQ | V_GT,
+
+  //! \hideinitializer The computed result may be inexact.
+  V_LGE = V_LT | V_EQ | V_GT,
+
+  //! \hideinitializer Negative infinity unrepresentable result class.
+  VC_MINUS_INFINITY = 16,
+
+  //! \hideinitializer A negative overflow occurred.
+  V_NEG_OVERFLOW = VC_MINUS_INFINITY | V_GT,
+
+  //! \hideinitializer Positive infinity unrepresentable result class.
+  VC_PLUS_INFINITY = 32,
+
+  //! \hideinitializer A positive overflow occurred.
+  V_POS_OVERFLOW = VC_PLUS_INFINITY | V_LT,
+
+  //! \hideinitializer Not a number result class.
+  VC_NAN = 48,
+
+  //! \hideinitializer Converting from unknown string.
+  V_CVT_STR_UNK = 49,
+
+  //! \hideinitializer Dividing by zero.
+  V_DIV_ZERO = 50,
+
+  //! \hideinitializer Adding two infinities having opposite signs.
+  V_INF_ADD_INF = 51,
+
+  //! \hideinitializer Dividing two infinities.
+  V_INF_DIV_INF = 52,
+
+  //! \hideinitializer Taking the modulus of an infinity.
+  V_INF_MOD = 53,
+
+  //! \hideinitializer Multiplying an infinity by zero.
+  V_INF_MUL_ZERO = 54,
+
+  //! \hideinitializer Subtracting two infinities having the same sign.
+  V_INF_SUB_INF = 55,
+
+  //! \hideinitializer Computing a remainder modulo zero.
+  V_MOD_ZERO = 56,
+
+  //! \hideinitializer Taking the square root of a negative number.
+  V_SQRT_NEG = 57,
+
+  //! \hideinitializer Unknown result due to intermediate negative overflow.
+  V_UNKNOWN_NEG_OVERFLOW = 58,
+
+  //! \hideinitializer Unknown result due to intermediate positive overflow.
+  V_UNKNOWN_POS_OVERFLOW = 59,
+
+  //! \hideinitializer Unordered comparison.
+  V_UNORD_COMP = 60
+};
+
+bool is_special(Result r);
+Result classify(Result r);
+Result sign(Result r);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Result.inlines.hh line 1
+/* Result supporting functions implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline Result
+classify(Result r) {
+  return static_cast<Result>(r & VC_MASK);
+}
+
+inline bool
+is_special(Result r) {
+  return classify(r) != VC_NORMAL;
+}
+
+inline Result
+sign(Result r) {
+  switch (r) {
+  case V_LT:
+  case V_EQ:
+  case V_GT:
+  case VC_NAN:
+    return r;
+  case VC_MINUS_INFINITY:
+    return V_LT;
+  case VC_PLUS_INFINITY:
+    return V_GT;
+  default:
+    assert(false);
+    return VC_NAN;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Result.defs.hh line 117
+
+// Automatically generated from PPL source file ../src/fpu.defs.hh line 1
+/* Floating point unit related functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/fpu.types.hh line 1
+
+
+#ifdef HAVE_IEEEFP_H
+#include <ieeefp.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+typedef int fpu_rounding_direction_type;
+typedef int fpu_rounding_control_word_type;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/fpu.defs.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the current FPU rounding direction.
+fpu_rounding_direction_type
+fpu_get_rounding_direction();
+
+//! Sets the FPU rounding direction to \p dir.
+void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir);
+
+/*! \brief
+  Sets the FPU rounding direction to \p dir and returns the rounding
+  control word previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir);
+
+/*! \brief
+  Sets the FPU rounding direction to \p dir, clears the <EM>inexact
+  computation</EM> status, and returns the rounding control word
+  previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir);
+
+//! Restores the FPU rounding rounding control word to \p cw.
+void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w);
+
+//! Clears the <EM>inexact computation</EM> status.
+void
+fpu_reset_inexact();
+
+/*! \brief
+  Queries the <EM>inexact computation</EM> status.
+
+  Returns 0 if the computation was definitely exact, 1 if it was
+  definitely inexact, -1 if definite exactness information is unavailable.
+*/
+int
+fpu_check_inexact();
+
+} // namespace Parma_Polyhedra_Library
+
+#if defined(__i386__)
+// Automatically generated from PPL source file ../src/fpu-ia32.inlines.hh line 1
+/* ia32 floating point unit related functions.
+*/
+
+// Automatically generated from PPL source file ../src/fpu-ia32.inlines.hh line 24
+
+#define FPU_INVALID      0x01
+#define FPU_DIVBYZERO    0x04
+#define FPU_OVERFLOW     0x08
+#define FPU_UNDERFLOW    0x10
+#define FPU_INEXACT      0x20
+
+#define FPU_ALL_EXCEPT \
+  (FPU_INEXACT | FPU_DIVBYZERO | FPU_UNDERFLOW | FPU_OVERFLOW | FPU_INVALID)
+
+#define FPU_TONEAREST    0
+#define FPU_DOWNWARD     0x400
+#define FPU_UPWARD       0x800
+#define FPU_TOWARDZERO   0xc00
+
+#define FPU_ROUNDING_MASK 0xc00
+
+#define PPL_FPU_CONTROL_DEFAULT_BASE 0x37f
+// This MUST be congruent with the definition of ROUND_DIRECT
+#define PPL_FPU_CONTROL_DEFAULT (PPL_FPU_CONTROL_DEFAULT_BASE | FPU_UPWARD)
+
+namespace Parma_Polyhedra_Library {
+
+typedef struct
+{
+  unsigned short control_word;
+  unsigned short unused1;
+  unsigned short status_word;
+  unsigned short unused2;
+  unsigned short tags;
+  unsigned short unused3;
+  unsigned int eip;
+  unsigned short cs_selector;
+  unsigned int opcode:11;
+  unsigned int unused4:5;
+  unsigned int data_offset;
+  unsigned short data_selector;
+  unsigned short unused5;
+} ia32_fenv_t;
+
+inline int
+fpu_get_control() {
+  unsigned short cw;
+  __asm__ __volatile__ ("fnstcw %0" : "=m" (cw));
+  return cw;
+}
+
+inline void
+fpu_set_control(unsigned short cw) {
+  __asm__ __volatile__ ("fldcw %0" : : "m" (cw));
+}
+
+inline int
+fpu_get_status() {
+  int sw;
+  __asm__ __volatile__ ("fnstsw %0" : "=a" (sw));
+  return sw;
+}
+
+inline void
+fpu_clear_status(unsigned short bits) {
+  /* There is no fldsw instruction */
+  ia32_fenv_t env;
+  __asm__ ("fnstenv %0" : "=m" (env));
+  env.status_word &= ~bits;
+  __asm__ ("fldenv %0" : : "m" (env));
+}
+
+inline void
+fpu_clear_exceptions() {
+  __asm__ __volatile__ ("fnclex" : /* No outputs.  */);
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return fpu_get_control() & FPU_ROUNDING_MASK;
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+  return 0;
+}
+
+inline void
+fpu_reset_inexact() {
+  fpu_clear_exceptions();
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
+  fpu_reset_inexact();
+  return fpu_save_rounding_direction(dir);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type) {
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT);
+}
+
+inline int
+fpu_check_inexact() {
+  return (fpu_get_status() & FPU_INEXACT) ? 1 : 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+// Automatically generated from PPL source file ../src/fpu.defs.hh line 74
+#elif defined(HAVE_FENV_H)
+// Automatically generated from PPL source file ../src/fpu-c99.inlines.hh line 1
+/* C99 Floating point unit related functions.
+*/
+
+#ifdef HAVE_FENV_H
+#include <fenv.h>
+
+#ifdef FE_TONEAREST
+#define FPU_TONEAREST FE_TONEAREST
+#endif
+#ifdef FE_UPWARD
+#define FPU_UPWARD FE_UPWARD
+#endif
+#ifdef FE_DOWNWARD
+#define FPU_DOWNWARD FE_DOWNWARD
+#endif
+#ifdef FE_TOWARDZERO
+#define FPU_TOWARDZERO FE_TOWARDZERO
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return fegetround();
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+  fesetround(dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+  fpu_rounding_direction_type old = fegetround();
+  fesetround(dir);
+  return old;
+}
+
+inline void
+fpu_reset_inexact() {
+  feclearexcept(FE_INEXACT);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
+  fpu_reset_inexact();
+  return fpu_save_rounding_direction(dir);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+  fesetround(w);
+}
+
+inline int
+fpu_check_inexact() {
+  return fetestexcept(FE_INEXACT) != 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(HAVE_FENV_H)
+// Automatically generated from PPL source file ../src/fpu.defs.hh line 76
+#elif defined(HAVE_IEEEFP_H)						\
+  && (defined(__sparc)							\
+      || defined(sparc)							\
+      || defined(__sparc__))
+// Automatically generated from PPL source file ../src/fpu-sparc.inlines.hh line 1
+/* SPARC floating point unit related functions.
+*/
+
+#ifdef HAVE_IEEEFP_H
+#include <ieeefp.h>
+
+#define FPU_TONEAREST ((int) FP_RN)
+#define FPU_UPWARD ((int) FP_RP)
+#define FPU_DOWNWARD ((int) FP_RM)
+#define FPU_TOWARDZERO ((int) FP_RZ)
+
+namespace Parma_Polyhedra_Library {
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return fpgetround();
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+  fpsetround((fp_rnd) dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+  return fpsetround((fp_rnd) dir);
+}
+
+inline void
+fpu_reset_inexact() {
+  fp_except except = fpgetmask();
+  except &= ~FP_X_IMP;
+  fpsetmask(except);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
+  fpu_reset_inexact();
+  return fpu_save_rounding_direction((fp_rnd) dir);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+  fpsetround((fp_rnd) w);
+}
+
+inline int
+fpu_check_inexact() {
+  return (fpgetmask() & FP_X_IMP) ? 1 : 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(HAVE_IEEEFP_H)
+// Automatically generated from PPL source file ../src/fpu.defs.hh line 81
+#else
+// Automatically generated from PPL source file ../src/fpu-none.inlines.hh line 1
+/* Null floating point unit related functions.
+*/
+
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+fpu_get_rounding_direction() {
+  throw std::logic_error("PPL::fpu_get_rounding_direction():"
+			 " cannot control the FPU");
+}
+
+inline void
+fpu_set_rounding_direction(int dir) {
+  throw std::logic_error("PPL::fpu_set_rounding_direction():"
+			 " cannot control the FPU");
+}
+
+inline int
+fpu_save_rounding_direction(int dir) {
+  throw std::logic_error("PPL::fpu_save_rounding_direction():"
+			 " cannot control the FPU");
+}
+
+inline void
+fpu_reset_inexact() {
+  throw std::logic_error("PPL::fpu_reset_inexact():"
+			 " cannot control the FPU");
+}
+
+inline int
+fpu_save_rounding_direction_reset_inexact(int dir) {
+  throw std::logic_error("PPL::fpu_save_rounding_direction_reset_inexact():"
+			 " cannot control the FPU");
+}
+
+inline void
+fpu_restore_rounding_direction(int dir) {
+  throw std::logic_error("PPL::fpu_restore_rounding_direction():"
+			 " cannot control the FPU");
+}
+
+inline int
+fpu_check_inexact() {
+  throw std::logic_error("PPL::fpu_check_inexact():"
+			 " cannot control the FPU");
+}
+
+} // namespace Parma_Polyhedra_Library
+// Automatically generated from PPL source file ../src/fpu.defs.hh line 83
+#endif
+
+// Automatically generated from PPL source file ../src/Rounding_Dir.defs.hh line 28
+
+namespace Parma_Polyhedra_Library {
+
+//! Rounding directions for arithmetic computations.
+/*! \ingroup PPL_CXX_interface */
+enum Rounding_Dir {
+  /*! \hideinitializer
+    Round toward \f$-\infty\f$.
+  */
+  ROUND_DOWN = FPU_DOWNWARD,
+
+  /*! \hideinitializer
+    Round toward \f$+\infty\f$.
+  */
+  ROUND_UP = FPU_UPWARD,
+
+  /*! \hideinitializer
+    Rounding is delegated to lower level. Result info is evaluated lazily.
+  */
+  ROUND_IGNORE = -1,
+  ROUND_NATIVE = ROUND_IGNORE,
+
+  /*! \hideinitializer
+    Rounding is not needed: client code must ensure the operation is exact.
+  */
+  ROUND_NOT_NEEDED = -2,
+
+  ROUND_DIRECT = ROUND_UP,
+  ROUND_INVERSE = ROUND_DOWN
+};
+
+/*! \brief
+  Returns the inverse rounding mode of \p dir,
+  <CODE>ROUND_IGNORE</CODE> being the inverse of itself.
+*/
+Rounding_Dir inverse(Rounding_Dir dir);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Rounding_Dir.inlines.hh line 1
+/* Inline functions operating on enum Rounding_Dir values.
+*/
+
+
+// Automatically generated from PPL source file ../src/Rounding_Dir.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+/*! \relates Parma_Polyhedra_Library::Rounding_Dir */
+inline Rounding_Dir
+inverse(Rounding_Dir dir) {
+  switch (dir) {
+  case ROUND_UP:
+    return ROUND_DOWN;
+  case ROUND_DOWN:
+    return ROUND_UP;
+  case ROUND_IGNORE:
+    return ROUND_IGNORE;
+  default:
+    assert(false);
+    return ROUND_IGNORE;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Rounding_Dir.defs.hh line 68
+
+
+// Automatically generated from PPL source file ../src/Numeric_Format.defs.hh line 1
+/* Numeric format.
+*/
+
+
+// Automatically generated from PPL source file ../src/Numeric_Format.defs.hh line 28
+
+namespace Parma_Polyhedra_Library {
+
+class Numeric_Format {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+
+// Automatically generated from PPL source file ../src/checked.defs.hh line 30
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A policy checking for overflows.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Check_Overflow_Policy {
+  static const int check_overflow = 1;
+  static const int check_inf_add_inf = 0;
+  static const int check_inf_sub_inf = 0;
+  static const int check_inf_mul_zero = 0;
+  static const int check_div_zero = 0;
+  static const int check_inf_div_inf = 0;
+  static const int check_inf_mod = 0;
+  static const int check_sqrt_neg = 0;
+  static const int handle_nan = 0;
+  static const int handle_infinity = 0;
+  static const int convertible = 1;
+  static const int fpu_check_inexact = 0;
+  static const int check_nan_args = 1;
+};
+
+// It is a pity that function partial specialization is not permitted
+// by C++.  To (partly) overcome this limitation, we use class
+// encapsulated functions and partial specialization of containing
+// classes.
+
+#define FUNCTION_CLASS(name) name ## _function_struct
+
+#define DECLARE_FUN1_0_0(name, ret_type, qual, type) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(arg); \
+}
+
+#define DECLARE_FUN1_0_1(name, ret_type, qual, type, after1) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1); \
+}
+
+#define DECLARE_FUN1_0_2(name, ret_type, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1, after2 a2) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1, a2); \
+}
+
+#define DECLARE_FUN1_0_3(name, ret_type, qual, type, after1, after2, after3) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1, after2 a2, after3 a3) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1, a2, a3); \
+}
+
+#define DECLARE_FUN1_1_1(name, ret_type, before1, qual, type, after1) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, qual type& arg, after1 a1) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(b1, arg, a1); \
+}
+
+#define DECLARE_FUN1_1_2(name, ret_type, before1, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, qual type& arg, after1 a1, after2 a2) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(b1, arg, a1, a2); \
+}
+
+#define DECLARE_FUN1_2_2(name, ret_type, before1, before2, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
+  return FUNCTION_CLASS(name)<Policy, type>::function(b1, b2, arg, a1, a2); \
+}
+
+#define DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \
+template <typename Policy, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2) { \
+  return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2); \
+}
+
+#define DECLARE_FUN2_0_1(name, ret_type, qual1, type1, qual2, type2, after1) \
+template <typename Policy, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1) { \
+  return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2, a1); \
+}
+
+#define DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, after1, after2) \
+template <typename Policy, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1, after2 a2) { \
+  return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2, a1, a2); \
+}
+
+#define DECLARE_FUN3_0_1(name, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
+template <typename Policy, typename type1, typename type2, typename type3> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2, typename type3> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, qual3 type3& arg3, after1 a1) { \
+  return FUNCTION_CLASS(name)<Policy, type1, type2, type3>::function(arg1, arg2, arg3, a1); \
+}
+
+#define DECLARE_FUN5_0_1(name, ret_type,				\
+			 qual1, type1, qual2, type2, qual3, type3,	\
+			 qual4, type4, qual5, type5,			\
+			 after1)					\
+template <typename Policy,						\
+	  typename type1, typename type2, typename type3,		\
+	  typename type4, typename type5>				\
+struct FUNCTION_CLASS(name);						\
+template <typename Policy,						\
+	  typename type1, typename type2, typename type3,		\
+	  typename type4, typename type5>				\
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2,		\
+		     qual3 type3& arg3, qual4 type4& arg4,		\
+		     qual5 type5& arg5,	after1 a1) {			\
+  return FUNCTION_CLASS(name)<Policy, type1, type2, type3, type4, type5> \
+    ::function(arg1, arg2, arg3, arg4, arg5, a1);			\
+}
+
+#define SPECIALIZE_FUN1_0_0(name, suf, ret_type, qual, type) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(qual type& arg) { \
+    return name ## _ ## suf<Policy>(arg); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_0_1(name, suf, ret_type, qual, type, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(qual type& arg, after1 a1) { \
+    return name ## _ ## suf<Policy>(arg, a1); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_0_2(name, suf, ret_type, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(qual type& arg, after1 a1, after2 a2) { \
+    return name ## _ ## suf<Policy>(arg, a1, a2); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_0_3(name, suf, ret_type, qual, type, after1, after2, after3) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(qual type& arg, after1 a1, after2 a2, after3 a3) { \
+    return name ## _ ## suf<Policy>(arg, a1, a2, a3); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_1_1(name, suf, ret_type, before1, qual, type, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(before1 b1, qual type& arg, after1 a1) { \
+    return name ## _ ## suf<Policy>(b1, arg, a1); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_1_2(name, suf, ret_type, before1, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(before1 b1, qual type& arg, after1 a1, after2 a2) { \
+    return name ## _ ## suf<Policy>(b1, arg, a1, a2); \
+  } \
+};
+
+#define SPECIALIZE_FUN1_2_2(name, suf, ret_type, before1, before2, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+  static inline ret_type function(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
+    return name ## _ ## suf<Policy>(b1, b2, arg, a1, a2); \
+  } \
+};
+
+#define SPECIALIZE_FUN2_0_0(name, suf, ret_type, qual1, type1, qual2, type2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+  static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2) { \
+    return name ## _ ## suf<Policy>(arg1, arg2); \
+  } \
+};
+
+#define SPECIALIZE_FUN2_0_1(name, suf, ret_type, qual1, type1, qual2, type2, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+  static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1) { \
+    return name ## _ ## suf<Policy>(arg1, arg2, a1); \
+  } \
+};
+
+#define SPECIALIZE_FUN2_0_2(name, suf, ret_type, qual1, type1, qual2, type2, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+  static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1, after2 a2) { \
+    return name ## _ ## suf<Policy>(arg1, arg2, a1, a2); \
+  } \
+};
+
+#define SPECIALIZE_FUN3_0_1(name, suf, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name) <Policy, type1, type2, type3> { \
+  static inline Result function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3, after1 a1) { \
+    return name ## _ ## suf<Policy>(arg1, arg2, arg3, a1); \
+  } \
+};
+
+#define SPECIALIZE_FUN5_0_1(name, suf, ret_type,			\
+			    qual1, type1, qual2, type2, qual3, type3,	\
+			    qual4, type4, qual5, type5, after1)		\
+template <typename Policy>						\
+struct FUNCTION_CLASS(name) <Policy,					\
+			     type1, type2, type3, type4, type5> {	\
+  static inline Result							\
+  function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3,	\
+	   qual4 type4 &arg4, qual5 type5 &arg5, after1 a1) {		\
+    return name ## _ ## suf<Policy>(arg1, arg2, arg3, arg4, arg5, a1);	\
+  }									\
+};
+
+#define nonconst
+
+#define SPECIALIZE_COPY(suf, Type) \
+  SPECIALIZE_FUN2_0_0(copy, suf, void, nonconst, Type, const, Type)
+#define SPECIALIZE_SGN(suf, From) \
+  SPECIALIZE_FUN1_0_0(sgn, suf, Result, const, From)
+#define SPECIALIZE_CMP(suf, Type1, Type2) \
+  SPECIALIZE_FUN2_0_0(cmp, suf, Result, const, Type1, const, Type2)
+#define SPECIALIZE_SET_SPECIAL(suf, Type) \
+  SPECIALIZE_FUN1_0_1(set_special, suf, Result, nonconst, Type, Result)
+#define SPECIALIZE_CLASSIFY(suf, Type) \
+  SPECIALIZE_FUN1_0_3(classify, suf, Result, const, Type, bool, bool, bool)
+#define SPECIALIZE_IS_NAN(suf, Type) \
+  SPECIALIZE_FUN1_0_0(is_nan, suf, bool, const, Type)
+#define SPECIALIZE_IS_MINF(suf, Type) \
+  SPECIALIZE_FUN1_0_0(is_minf, suf, bool, const, Type)
+#define SPECIALIZE_IS_PINF(suf, Type) \
+  SPECIALIZE_FUN1_0_0(is_pinf, suf, bool, const, Type)
+#define SPECIALIZE_IS_INT(suf, Type) \
+  SPECIALIZE_FUN1_0_0(is_int, suf, bool, const, Type)
+#define SPECIALIZE_CONSTRUCT(suf, To, From) \
+  SPECIALIZE_FUN2_0_1(construct, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ASSIGN(suf, To, From) \
+  SPECIALIZE_FUN2_0_1(assign, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_NEG(suf, To, From) \
+  SPECIALIZE_FUN2_0_1(neg, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ABS(suf, To, From) \
+  SPECIALIZE_FUN2_0_1(abs, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_SQRT(suf, To, From) \
+  SPECIALIZE_FUN2_0_1(sqrt, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ADD(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(add, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_SUB(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(sub, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_MUL(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_DIV(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(div, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_REM(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(rem, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_MUL2EXP(suf, To, From) \
+  SPECIALIZE_FUN2_0_2(mul2exp, suf, Result, nonconst, To, const, From, int, Rounding_Dir)
+#define SPECIALIZE_DIV2EXP(suf, To, From) \
+  SPECIALIZE_FUN2_0_2(div2exp, suf, Result, nonconst, To, const, From, int, Rounding_Dir)
+#define SPECIALIZE_ADD_MUL(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(add_mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_SUB_MUL(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(sub_mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_GCD(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(gcd, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_GCDEXT(suf, To1, From1, From2, To2, To3)		\
+  SPECIALIZE_FUN5_0_1(gcdext, suf, Result, nonconst, To1,		\
+		      const, From1, const, From2, nonconst, To2, nonconst, To3, Rounding_Dir)
+#define SPECIALIZE_LCM(suf, To, From1, From2) \
+  SPECIALIZE_FUN3_0_1(lcm, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_INPUT(suf, Type) \
+  SPECIALIZE_FUN1_0_2(input, suf, Result, nonconst, Type, std::istream&, Rounding_Dir)
+#define SPECIALIZE_OUTPUT(suf, Type) \
+  SPECIALIZE_FUN1_1_2(output, suf, Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+
+
+DECLARE_FUN2_0_0(copy,        void, nonconst, Type1, const, Type2)
+DECLARE_FUN1_0_0(sgn,         Result, const, From)
+DECLARE_FUN2_0_0(cmp,         Result, const, Type1, const, Type2)
+DECLARE_FUN1_0_1(set_special, Result, nonconst, Type, Result)
+DECLARE_FUN1_0_3(classify,    Result, const, Type, bool, bool, bool)
+DECLARE_FUN1_0_0(is_nan,      bool, const, Type)
+DECLARE_FUN1_0_0(is_minf,     bool, const, Type)
+DECLARE_FUN1_0_0(is_pinf,     bool, const, Type)
+DECLARE_FUN1_0_0(is_int,      bool, const, Type)
+DECLARE_FUN2_0_1(construct,   Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(assign,      Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(neg,         Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(abs,         Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(sqrt,        Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN3_0_1(add,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(sub,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(mul,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(div,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(rem,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN2_0_2(mul2exp,     Result, nonconst, To, const, From, int, Rounding_Dir)
+DECLARE_FUN2_0_2(div2exp,     Result, nonconst, To, const, From, int, Rounding_Dir)
+DECLARE_FUN3_0_1(add_mul,     Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(sub_mul,     Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(gcd,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN5_0_1(gcdext,      Result, nonconst, To1, const, From1, const, From2,
+		                      nonconst, To2, nonconst, To3, Rounding_Dir)
+DECLARE_FUN3_0_1(lcm,         Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN1_0_2(input,       Result, nonconst, Type, std::istream&, Rounding_Dir)
+DECLARE_FUN1_1_2(output,      Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+
+template <typename Policy, typename To>
+Result round(To& to, Result r, Rounding_Dir dir);
+
+Result input_mpq(mpq_class& to, std::istream& is);
+
+} // namespace Checked
+
+struct Minus_Infinity {
+};
+
+struct Plus_Infinity {
+};
+
+struct Not_A_Number {
+};
+
+extern Minus_Infinity MINUS_INFINITY;
+extern Plus_Infinity PLUS_INFINITY;
+extern Not_A_Number NOT_A_NUMBER;
+
+} // namespace Parma_Polyhedra_Library
+
+
+#define CHECK_P(cond, check) ((cond) ? (check) : (assert(!(check)), false))
+
+// Automatically generated from PPL source file ../src/checked.inlines.hh line 1
+/* Abstract checked arithmetic functions: fall-backs.
+*/
+
+// Automatically generated from PPL source file ../src/globals.types.hh line 1
+
+
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! An unsigned integral type for representing space dimensions.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t dimension_type;
+
+//! An unsigned integral type for representing memory size in bytes.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t memory_size_type;
+
+//! Kinds of degenerate abstract elements.
+/*! \ingroup PPL_CXX_interface */
+enum Degenerate_Element {
+  //! The universe element, i.e., the whole vector space.
+  UNIVERSE,
+  //! The empty element, i.e., the empty set.
+  EMPTY
+};
+
+//! Relation symbols.
+/*! \ingroup PPL_CXX_interface */
+enum Relation_Symbol {
+  //! Less than.
+  LESS_THAN,
+  //! Less than or equal to.
+  LESS_THAN_OR_EQUAL,
+  //! Equal to.
+  EQUAL,
+  //! Greater than or equal to.
+  GREATER_THAN_OR_EQUAL,
+  //! Greater than.
+  GREATER_THAN
+};
+
+//! Complexity pseudo-classes.
+/*! \ingroup PPL_CXX_interface */
+enum Complexity_Class {
+  //! Worst-case polynomial complexity.
+  POLYNOMIAL_COMPLEXITY,
+  //! Worst-case exponential complexity but typically polynomial behavior.
+  SIMPLEX_COMPLEXITY,
+  //! Any complexity.
+  ANY_COMPLEXITY
+};
+
+//! Possible optimization modes.
+/*! \ingroup PPL_CXX_interface */
+enum Optimization_Mode {
+  //! Minimization is requested.
+  MINIMIZATION,
+  //! Maximization is requested.
+  MAXIMIZATION
+};
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/checked.inlines.hh line 25
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy, typename Type>
+struct FUNCTION_CLASS(construct)<Policy, Type, Type> {
+  static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+    new (&to) Type(from);
+    return V_EQ;
+  }
+};
+
+template <typename Policy, typename To, typename From>
+struct FUNCTION_CLASS(construct) {
+  static inline Result function(To& to, const From& from, Rounding_Dir dir) {
+    new (&to) To();
+    return assign<Policy>(to, from, dir);
+  }
+};
+
+template <typename Policy, typename Type>
+struct FUNCTION_CLASS(assign)<Policy, Type, Type> {
+  static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+    to = from;
+    return V_EQ;
+  }
+};
+
+template <typename Policy, typename Type>
+inline void
+copy_generic(Type& to, const Type& from) {
+  to = from;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+abs_generic(To& to, const From& from, Rounding_Dir dir) {
+  if (from < 0)
+    return neg<Policy>(to, from, dir);
+  to = from;
+  return V_EQ;
+}
+
+inline Result
+neg(Result r) {
+  assert(!is_special(r));
+  Result ret = static_cast<Result>(r & V_EQ);
+  if (r & V_LT)
+    ret = static_cast<Result>(ret | V_GT);
+  if (r & V_GT)
+    ret = static_cast<Result>(ret | V_LT);
+  return ret;
+}
+
+inline Result
+add(Result r1, Result r2) {
+  assert(!is_special(r1));
+  assert(!is_special(r2));
+  if (r1 == V_EQ)
+    return r2;
+  if (r2 == V_EQ)
+    return r1;
+  if (((r1 & V_LT) && (r2 & V_GT))
+      || ((r1 & V_GT) && (r2 & V_LT)))
+    return V_LGE;
+  return static_cast<Result>((((r1 & r2) & V_EQ) ? V_EQ : 0) |
+			       (r1 & (V_LT | V_GT)));
+}
+
+inline Result
+sub(Result r1, Result r2) {
+  return add(r1, neg(r2));
+}
+
+template <typename Policy, typename To, typename From>
+inline void
+gcd_exact_noabs(To& to, const From& x, const From& y) {
+  To nx = x;
+  To ny = y;
+  To rm;
+  while (ny != 0) {
+    /* The following is derived from the assumption that x % y
+       is always representable. This is true for both native integers
+       and iec559 floating point numbers */
+    rem<Policy>(rm, nx, ny, ROUND_NOT_NEEDED);
+    nx = ny;
+    ny = rm;
+  }
+  to = nx;
+}
+
+template <typename Policy, typename To, typename From1, typename From2>
+inline Result
+gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  gcd_exact_noabs<Policy>(to, x, y);
+  return abs<Policy>(to, to, dir);
+}
+
+template <typename Policy, typename To1,
+	  typename From1, typename From2, typename To2, typename To3>
+inline Result
+gcdext_exact(To1& to, const From1& x, const From2& y, To2& s, To3& t,
+	     Rounding_Dir dir) {
+  if (y == 0) {
+    if (x == 0) {
+      s = 0;
+      t = 1;
+      return V_EQ;
+    }
+    else {
+      if (x < 0)
+	s = -1;
+      else
+	s = 1;
+      t = 0;
+      return abs<Policy>(to, x, dir);
+    }
+  }
+
+  s = 1;
+  t = 0;
+  bool negative_x = x < 0;
+  bool negative_y = y < 0;
+
+  Result r;
+  r = abs<Policy>(to, x, dir);
+  if (r != V_EQ)
+    return r;
+
+  From2 ay;
+  r = abs<Policy>(ay, y, dir);
+  if (r != V_EQ)
+    return r;
+
+  // If COPY_GMP is defined then s is favoured when the absolute
+  // values of the given numbers are equal.  For instance if x and y
+  // are both 5 then s will be 1 and t will be 0, instead of the other
+  // way round.  This is to match the behaviour of GMP.
+#define COPY_GMP
+#ifdef COPY_GMP
+  if (to == ay)
+    goto sign_check;
+#endif
+
+  {
+    To2 v1 = 0;
+    To3 v2 = 1;
+    To1 v3 = static_cast<To1>(ay);
+    while (true) {
+      To1 q = to / v3;
+      // Remainder, next candidate GCD.
+      To1 t3 = to - q*v3;
+      To2 t1 = s - static_cast<To2>(q)*v1;
+      To3 t2 = t - static_cast<To3>(q)*v2;
+      s = v1;
+      t = v2;
+      to = v3;
+      if (t3 == 0)
+	break;
+      v1 = t1;
+      v2 = t2;
+      v3 = t3;
+    }
+  }
+
+#ifdef COPY_GMP
+ sign_check:
+#endif
+  if (negative_x) {
+    r = neg<Policy>(s, s, dir);
+    if (r != V_EQ)
+      return r;
+  }
+  if (negative_y)
+    return neg<Policy>(t, t, dir);
+  return V_EQ;
+}
+
+template <typename Policy, typename To, typename From1, typename From2>
+inline Result
+lcm_gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (x == 0 || y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  To nx, ny;
+  Result r;
+  r = abs<Policy>(nx, x, dir);
+  if (r != V_EQ)
+    return r;
+  r = abs<Policy>(ny, y, dir);
+  if (r != V_EQ)
+    return r;
+  To gcd;
+  gcd_exact_noabs<Policy>(gcd, nx, ny);
+  /* The following is derived from the assumption that x / gcd(x, y)
+     is always representable. This is true for both native integers
+     and iec559 floating point numbers */
+  div<Policy>(to, nx, gcd, ROUND_NOT_NEEDED);
+  return mul<Policy>(to, to, ny, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sgn_generic(const Type& x) {
+  if (x > 0)
+    return V_GT;
+  if (x == 0)
+    return V_EQ;
+  return V_LT;
+}
+
+template <typename Policy, typename Type>
+inline Result
+cmp_generic(const Type& x, const Type& y) {
+  if (x > y)
+    return V_GT;
+  if (x < y)
+    return V_LT;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+input_generic(Type& to, std::istream& is, Rounding_Dir dir) {
+  mpq_class q;
+  Result r = input_mpq(q, is);
+  if (r == VC_MINUS_INFINITY)
+    return assign<Policy>(to, MINUS_INFINITY, dir);
+  if (r == VC_PLUS_INFINITY)
+    return assign<Policy>(to, PLUS_INFINITY, dir);
+  if (r == V_EQ)
+    return assign<Policy>(to, q, dir);
+  return set_special<Policy>(to, r);
+}
+
+template <typename T>
+inline memory_size_type
+external_memory_in_bytes(T) {
+  return 0;
+}
+
+template <typename T>
+inline memory_size_type
+total_memory_in_bytes(T& x) {
+  return sizeof(x) + external_memory_in_bytes(x);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+// Automatically generated from PPL source file ../src/checked_int.inlines.hh line 1
+/* Specialized "checked" functions for native integer numbers.
+*/
+
+
+// Automatically generated from PPL source file ../src/Limits.hh line 1
+/* Limits for native integer types.
+*/
+
+
+#include <climits>
+
+// C99 defines LLONG_MIN, LLONG_MAX and ULLONG_MAX, but this part of
+// C99 is not yet included into the C++ standard.
+// GCC defines LONG_LONG_MIN, LONG_LONG_MAX and ULONG_LONG_MAX.
+// Some compilers (such as Comeau C++ up to and including version 4.3.3)
+// define nothing.  In this last case we make a reasonable guess.
+#ifndef LLONG_MIN
+#if defined(LONG_LONG_MIN)
+#define LLONG_MIN LONG_LONG_MIN
+#elif SIZEOF_LONG_LONG == 8
+#define LLONG_MIN 0x8000000000000000LL
+#endif
+#endif
+
+#ifndef LLONG_MAX
+#if defined(LONG_LONG_MAX)
+#define LLONG_MAX LONG_LONG_MAX
+#elif SIZEOF_LONG_LONG == 8
+#define LLONG_MAX 0x7fffffffffffffffLL
+#endif
+#endif
+
+#ifndef ULLONG_MAX
+#if defined(ULONG_LONG_MAX)
+#define ULLONG_MAX ULONG_LONG_MAX
+#elif SIZEOF_UNSIGNED_LONG_LONG == 8
+#define ULLONG_MAX 0xffffffffffffffffULL
+#endif
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+/*
+  The only reason to use these definitions instead of std::numeric_limits
+  is a missing optimization in GCC 3.4.1.
+*/
+
+template <typename T>
+struct Limits;
+
+#define signed_limits(type, prefix) \
+template <> \
+struct Limits<type> { \
+	static const type min = prefix ## _MIN; \
+	static const type max = prefix ## _MAX; \
+}
+
+#define unsigned_limits(type, prefix) \
+template <> \
+struct Limits<type> { \
+	static const type min = 0; \
+	static const type max = prefix ## _MAX; \
+}
+
+signed_limits(signed char, SCHAR);
+signed_limits(short, SHRT);
+signed_limits(int, INT);
+signed_limits(long, LONG);
+signed_limits(long long, LLONG);
+
+unsigned_limits(unsigned char, UCHAR);
+unsigned_limits(unsigned short, USHRT);
+unsigned_limits(unsigned int, UINT);
+unsigned_limits(unsigned long, ULONG);
+unsigned_limits(unsigned long long, ULLONG);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/checked_int.inlines.hh line 27
+#include <cerrno>
+#include <cstdlib>
+#include <climits>
+#include <string>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if !HAVE_DECL_STRTOLL
+signed long long
+strtoll(const char* nptr, char** endptr, int base);
+#endif
+
+#if !HAVE_DECL_STRTOULL
+unsigned long long
+strtoull(const char* nptr, char** endptr, int base);
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifndef HAVE_INT_FAST16_T
+typedef int16_t int_fast16_t;
+#endif
+
+#ifndef HAVE_INT_FAST32_T
+typedef int32_t int_fast32_t;
+#endif
+
+#ifndef HAVE_INT_FAST64_T
+typedef int64_t int_fast64_t;
+#endif
+
+#ifndef HAVE_UINT_FAST16_T
+typedef uint16_t uint_fast16_t;
+#endif
+
+#ifndef HAVE_UINT_FAST32_T
+typedef uint32_t uint_fast32_t;
+#endif
+
+#ifndef HAVE_UINT_FAST64_T
+typedef uint64_t uint_fast64_t;
+#endif
+
+template <typename Policy, typename Type>
+struct Extended_Int {
+  static const Type plus_infinity = Limits<Type>::max;
+  static const Type minus_infinity = (Limits<Type>::min >= 0
+				      ? Limits<Type>::max - 1
+				      : Limits<Type>::min);
+  static const Type not_a_number = (Limits<Type>::min >= 0
+				    ? Limits<Type>::max - Policy::handle_infinity * 2
+				    : Limits<Type>::min + Policy::handle_infinity);
+  static const Type min = (Limits<Type>::min
+			   + (Limits<Type>::min >= 0 ? 0
+			      : (Policy::handle_infinity + Policy::handle_nan)));
+  static const Type max = (Limits<Type>::max
+			   - (Limits<Type>::min >= 0
+			      ? (2 * Policy::handle_infinity + Policy::handle_nan)
+			      : Policy::handle_infinity));
+};
+
+template <typename Policy, typename To>
+inline Result
+set_neg_overflow_int(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_UP) {
+    to = Extended_Int<Policy, To>::min;
+    return V_LT;
+  }
+  else {
+    if (Policy::handle_infinity) {
+      to = Extended_Int<Policy, To>::minus_infinity;
+      return V_GT;
+    }
+    return V_NEG_OVERFLOW;
+  }
+}
+
+template <typename Policy, typename To>
+inline Result
+set_pos_overflow_int(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_DOWN) {
+    to = Extended_Int<Policy, To>::max;
+    return V_GT;
+  }
+  else {
+    if (Policy::handle_infinity) {
+      to = Extended_Int<Policy, To>::plus_infinity;
+      return V_LT;
+    }
+    return V_POS_OVERFLOW;
+  }
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int_no_overflow(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_DOWN) {
+    to--;
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int_no_overflow(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_UP) {
+    to++;
+    return V_LT;
+  }
+  return V_GT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_DOWN) {
+    if (to == Extended_Int<Policy, To>::min) {
+      if (Policy::handle_infinity) {
+	to = Extended_Int<Policy, To>::minus_infinity;
+	return V_GT;
+      }
+      return V_NEG_OVERFLOW;
+    } else {
+      to--;
+      return V_GT;
+    }
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_UP) {
+    if (to == Extended_Int<Policy, To>::max) {
+      if (Policy::handle_infinity) {
+	to = Extended_Int<Policy, To>::plus_infinity;
+	return V_LT;
+      }
+      return V_POS_OVERFLOW;
+    } else {
+      to++;
+      return V_LT;
+    }
+  }
+  return V_GT;
+}
+
+SPECIALIZE_COPY(generic, signed char)
+SPECIALIZE_COPY(generic, signed short)
+SPECIALIZE_COPY(generic, signed int)
+SPECIALIZE_COPY(generic, signed long)
+SPECIALIZE_COPY(generic, signed long long)
+SPECIALIZE_COPY(generic, unsigned char)
+SPECIALIZE_COPY(generic, unsigned short)
+SPECIALIZE_COPY(generic, unsigned int)
+SPECIALIZE_COPY(generic, unsigned long)
+SPECIALIZE_COPY(generic, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+classify_int(const Type v, bool nan, bool inf, bool sign) {
+  if (Policy::handle_nan
+      && (nan || sign)
+      && v == Extended_Int<Policy, Type>::not_a_number)
+    return VC_NAN;
+  if (!inf & !sign)
+    return VC_NORMAL;
+  if (Policy::handle_infinity) {
+    if (v == Extended_Int<Policy, Type>::minus_infinity)
+      return inf ? VC_MINUS_INFINITY : V_LT;
+    if (v == Extended_Int<Policy, Type>::plus_infinity)
+      return inf ? VC_PLUS_INFINITY : V_GT;
+  }
+  if (sign) {
+    if (v < 0)
+      return V_LT;
+    if (v > 0)
+      return V_GT;
+    return V_EQ;
+  }
+  return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(int, signed char)
+SPECIALIZE_CLASSIFY(int, signed short)
+SPECIALIZE_CLASSIFY(int, signed int)
+SPECIALIZE_CLASSIFY(int, signed long)
+SPECIALIZE_CLASSIFY(int, signed long long)
+SPECIALIZE_CLASSIFY(int, unsigned char)
+SPECIALIZE_CLASSIFY(int, unsigned short)
+SPECIALIZE_CLASSIFY(int, unsigned int)
+SPECIALIZE_CLASSIFY(int, unsigned long)
+SPECIALIZE_CLASSIFY(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_nan_int(const Type v) {
+  return Policy::handle_nan && v == Extended_Int<Policy, Type>::not_a_number;
+}
+
+SPECIALIZE_IS_NAN(int, signed char)
+SPECIALIZE_IS_NAN(int, signed short)
+SPECIALIZE_IS_NAN(int, signed int)
+SPECIALIZE_IS_NAN(int, signed long)
+SPECIALIZE_IS_NAN(int, signed long long)
+SPECIALIZE_IS_NAN(int, unsigned char)
+SPECIALIZE_IS_NAN(int, unsigned short)
+SPECIALIZE_IS_NAN(int, unsigned int)
+SPECIALIZE_IS_NAN(int, unsigned long)
+SPECIALIZE_IS_NAN(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_minf_int(const Type v) {
+  return Policy::handle_infinity
+    && v == Extended_Int<Policy, Type>::minus_infinity;
+}
+
+SPECIALIZE_IS_MINF(int, signed char)
+SPECIALIZE_IS_MINF(int, signed short)
+SPECIALIZE_IS_MINF(int, signed int)
+SPECIALIZE_IS_MINF(int, signed long)
+SPECIALIZE_IS_MINF(int, signed long long)
+SPECIALIZE_IS_MINF(int, unsigned char)
+SPECIALIZE_IS_MINF(int, unsigned short)
+SPECIALIZE_IS_MINF(int, unsigned int)
+SPECIALIZE_IS_MINF(int, unsigned long)
+SPECIALIZE_IS_MINF(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_pinf_int(const Type v) {
+  return Policy::handle_infinity
+    && v == Extended_Int<Policy, Type>::plus_infinity;
+}
+
+SPECIALIZE_IS_PINF(int, signed char)
+SPECIALIZE_IS_PINF(int, signed short)
+SPECIALIZE_IS_PINF(int, signed int)
+SPECIALIZE_IS_PINF(int, signed long)
+SPECIALIZE_IS_PINF(int, signed long long)
+SPECIALIZE_IS_PINF(int, unsigned char)
+SPECIALIZE_IS_PINF(int, unsigned short)
+SPECIALIZE_IS_PINF(int, unsigned int)
+SPECIALIZE_IS_PINF(int, unsigned long)
+SPECIALIZE_IS_PINF(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_int_int(const Type v) {
+  return !is_nan<Policy>(v);
+}
+
+SPECIALIZE_IS_INT(int, signed char)
+SPECIALIZE_IS_INT(int, signed short)
+SPECIALIZE_IS_INT(int, signed int)
+SPECIALIZE_IS_INT(int, signed long)
+SPECIALIZE_IS_INT(int, signed long long)
+SPECIALIZE_IS_INT(int, unsigned char)
+SPECIALIZE_IS_INT(int, unsigned short)
+SPECIALIZE_IS_INT(int, unsigned int)
+SPECIALIZE_IS_INT(int, unsigned long)
+SPECIALIZE_IS_INT(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+set_special_int(Type& v, Result r) {
+  Result t = classify(r);
+  if (Policy::handle_nan && t == VC_NAN)
+    v = Extended_Int<Policy, Type>::not_a_number;
+  else if (Policy::handle_infinity) {
+    switch (t) {
+    case VC_MINUS_INFINITY:
+      v = Extended_Int<Policy, Type>::minus_infinity;
+      break;
+    case VC_PLUS_INFINITY:
+      v = Extended_Int<Policy, Type>::plus_infinity;
+      break;
+    default:
+      break;
+    }
+  }
+  return r;
+}
+
+SPECIALIZE_SET_SPECIAL(int, signed char)
+SPECIALIZE_SET_SPECIAL(int, signed short)
+SPECIALIZE_SET_SPECIAL(int, signed int)
+SPECIALIZE_SET_SPECIAL(int, signed long)
+SPECIALIZE_SET_SPECIAL(int, signed long long)
+SPECIALIZE_SET_SPECIAL(int, unsigned char)
+SPECIALIZE_SET_SPECIAL(int, unsigned short)
+SPECIALIZE_SET_SPECIAL(int, unsigned int)
+SPECIALIZE_SET_SPECIAL(int, unsigned long)
+SPECIALIZE_SET_SPECIAL(int, unsigned long long)
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_signed_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(From)) {
+    if (CHECK_P(Policy::check_overflow,
+		from < static_cast<From>(Extended_Int<Policy, To>::min)))
+      return set_neg_overflow_int<Policy>(to, dir);
+    if (CHECK_P(Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<Policy, To>::max)))
+      return set_pos_overflow_int<Policy>(to, dir);
+  }
+  to = To(from);
+  return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_signed_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(From)) {
+    if (CHECK_P(Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<Policy, To>::max)))
+      return set_pos_overflow_int<Policy>(to, dir);
+  }
+  to = To(from);
+  return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_overflow, from < 0))
+    return set_neg_overflow_int<Policy>(to, dir);
+  if (sizeof(To) < sizeof(From)) {
+    if (CHECK_P(Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<Policy, To>::max)))
+      return set_pos_overflow_int<Policy>(to, dir);
+  }
+  to = To(from);
+  return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(From)) {
+    if (CHECK_P(Policy::check_overflow,
+		from > static_cast<From>(Extended_Int<Policy, To>::max)))
+      return set_pos_overflow_int<Policy>(to, dir);
+  }
+  to = To(from);
+  return V_EQ;
+}
+
+
+#define ASSIGN2_SIGNED_SIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_signed_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_signed_int, Larger, Smaller)
+
+#define ASSIGN2_UNSIGNED_UNSIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Larger, Smaller)
+
+#define ASSIGN2_UNSIGNED_SIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_signed_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_unsigned_int, Larger, Smaller)
+
+#define ASSIGN2_SIGNED_UNSIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_unsigned_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_signed_int, Larger, Smaller)
+
+#define ASSIGN_SIGNED(Type) \
+SPECIALIZE_ASSIGN(signed_int_signed_int, Type, Type)
+#define ASSIGN_UNSIGNED(Type) \
+SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Type, Type)
+
+ASSIGN_SIGNED(signed char)
+ASSIGN_SIGNED(signed short)
+ASSIGN_SIGNED(signed int)
+ASSIGN_SIGNED(signed long)
+ASSIGN_SIGNED(signed long long)
+ASSIGN_UNSIGNED(unsigned char)
+ASSIGN_UNSIGNED(unsigned short)
+ASSIGN_UNSIGNED(unsigned int)
+ASSIGN_UNSIGNED(unsigned long)
+ASSIGN_UNSIGNED(unsigned long long)
+
+ASSIGN2_SIGNED_SIGNED(signed char, signed short)
+ASSIGN2_SIGNED_SIGNED(signed char, signed int)
+ASSIGN2_SIGNED_SIGNED(signed char, signed long)
+ASSIGN2_SIGNED_SIGNED(signed char, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed short, signed int)
+ASSIGN2_SIGNED_SIGNED(signed short, signed long)
+ASSIGN2_SIGNED_SIGNED(signed short, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed int, signed long)
+ASSIGN2_SIGNED_SIGNED(signed int, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed long, signed long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned short)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned int)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned int)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned long, unsigned long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed short)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed int)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed int)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned long, signed long long)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned char)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned short)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned short)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed long long, unsigned long long)
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_int_float(To& to, const From from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_overflow, (from < Extended_Int<Policy, To>::min)))
+    return set_neg_overflow_int<Policy>(to, dir);
+  if (CHECK_P(Policy::check_overflow, (from > Extended_Int<Policy, To>::max)))
+    return set_pos_overflow_int<Policy>(to, dir);
+  to = static_cast<To>(from);
+  if (dir == ROUND_IGNORE)
+    return V_LGE;
+  if (from < to)
+    return round_lt_int<Policy>(to, dir);
+  else if (from > to)
+    return round_gt_int<Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(int_float, signed char, float)
+SPECIALIZE_ASSIGN(int_float, signed short, float)
+SPECIALIZE_ASSIGN(int_float, signed int, float)
+SPECIALIZE_ASSIGN(int_float, signed long, float)
+SPECIALIZE_ASSIGN(int_float, signed long long, float)
+SPECIALIZE_ASSIGN(int_float, unsigned char, float)
+SPECIALIZE_ASSIGN(int_float, unsigned short, float)
+SPECIALIZE_ASSIGN(int_float, unsigned int, float)
+SPECIALIZE_ASSIGN(int_float, unsigned long, float)
+SPECIALIZE_ASSIGN(int_float, unsigned long long, float)
+
+SPECIALIZE_ASSIGN(int_float, signed char, double)
+SPECIALIZE_ASSIGN(int_float, signed short, double)
+SPECIALIZE_ASSIGN(int_float, signed int, double)
+SPECIALIZE_ASSIGN(int_float, signed long, double)
+SPECIALIZE_ASSIGN(int_float, signed long long, double)
+SPECIALIZE_ASSIGN(int_float, unsigned char, double)
+SPECIALIZE_ASSIGN(int_float, unsigned short, double)
+SPECIALIZE_ASSIGN(int_float, unsigned int, double)
+SPECIALIZE_ASSIGN(int_float, unsigned long, double)
+SPECIALIZE_ASSIGN(int_float, unsigned long long, double)
+
+SPECIALIZE_ASSIGN(int_float, signed char, long double)
+SPECIALIZE_ASSIGN(int_float, signed short, long double)
+SPECIALIZE_ASSIGN(int_float, signed int, long double)
+SPECIALIZE_ASSIGN(int_float, signed long, long double)
+SPECIALIZE_ASSIGN(int_float, signed long long, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned char, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned short, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned int, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned long, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned long long, long double)
+
+#undef ASSIGN2_SIGNED_SIGNED
+#undef ASSIGN2_UNSIGNED_UNSIGNED
+#undef ASSIGN2_UNSIGNED_SIGNED
+#undef ASSIGN2_SIGNED_UNSIGNED
+
+template <typename Policy, typename To>
+inline Result
+assign_signed_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(signed long)) {
+    if (!Policy::check_overflow) {
+      to = from.get_si();
+      return V_EQ;
+    }
+    if (from.fits_slong_p()) {
+      signed long v = from.get_si();
+      if (v < Limits<To>::min)
+	return set_neg_overflow_int<Policy>(to, dir);
+      if (v > Limits<To>::max)
+	return set_pos_overflow_int<Policy>(to, dir);
+      to = v;
+      return V_EQ;
+    }
+  }
+  else {
+    mpz_srcptr m = from.get_mpz_t();
+    size_t sz = mpz_size(m);
+    if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+      if (sz == 0) {
+	to = 0;
+	return V_EQ;
+      }
+      To v;
+      mpz_export(&v, 0, -1, sizeof(To), 0, 0, m);
+      if (v >= 0) {
+	if (::sgn(from) < 0)
+	  return neg<Policy>(to, v, dir);
+	to = v;
+	return V_EQ;
+      }
+    }
+  }
+  return ::sgn(from) < 0
+    ? set_neg_overflow_int<Policy>(to, dir)
+    : set_pos_overflow_int<Policy>(to, dir);
+}
+
+SPECIALIZE_ASSIGN(signed_int_mpz, signed char, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed short, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed int, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed long, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed long long, mpz_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_overflow, ::sgn(from) < 0))
+    return set_neg_overflow_int<Policy>(to, dir);
+  if (sizeof(To) <= sizeof(unsigned long)) {
+    if (!Policy::check_overflow) {
+      to = from.get_ui();
+      return V_EQ;
+    }
+    if (from.fits_ulong_p()) {
+      unsigned long v = from.get_ui();
+      if (v > Limits<To>::max)
+	return set_pos_overflow_int<Policy>(to, dir);
+      to = v;
+      return V_EQ;
+    }
+  }
+  else {
+    mpz_srcptr m = from.get_mpz_t();
+    size_t sz = mpz_size(m);
+    if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+      if (sz == 0)
+	to = 0;
+      else
+	mpz_export(&to, 0, -1, sizeof(To), 0, 0, m);
+      return V_EQ;
+    }
+  }
+  return set_pos_overflow_int<Policy>(to, dir);
+}
+
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned char, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned short, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned int, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned long, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned long long, mpz_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_int_mpq(To& to, const mpq_class& from, Rounding_Dir dir) {
+  mpz_srcptr n = from.get_num().get_mpz_t();
+  mpz_srcptr d = from.get_den().get_mpz_t();
+  mpz_class q;
+  mpz_ptr _q = q.get_mpz_t();
+  if (dir == ROUND_IGNORE) {
+    mpz_tdiv_q(_q, n, d);
+    Result r = assign<Policy>(to, q, dir);
+    if (r != V_EQ)
+      return r;
+    return V_LGE;
+  }
+  mpz_t rem;
+  int sign;
+  mpz_init(rem);
+  mpz_tdiv_qr(_q, rem, n, d);
+  sign = mpz_sgn(rem);
+  mpz_clear(rem);
+  Result r = assign<Policy>(to, q, dir);
+  if (r != V_EQ)
+    return r;
+  switch (sign) {
+  case -1:
+    return round_lt_int<Policy>(to, dir);
+  case 1:
+    return round_gt_int<Policy>(to, dir);
+  default:
+    return V_EQ;
+  }
+}
+
+SPECIALIZE_ASSIGN(int_mpq, signed char, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed short, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed int, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed long, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed long long, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned char, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned short, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned int, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned long, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned long long, mpq_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_int_minf(To& to, const Minus_Infinity&, Rounding_Dir dir) {
+  if (Policy::handle_infinity) {
+    to = Extended_Int<Policy, To>::minus_infinity;
+    return V_EQ;
+  }
+  if (dir == ROUND_UP) {
+    to = Extended_Int<Policy, To>::min;
+    return V_LT;
+  }
+  return VC_MINUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_int_pinf(To& to, const Plus_Infinity&, Rounding_Dir dir) {
+  if (Policy::handle_infinity) {
+    to = Extended_Int<Policy, To>::plus_infinity;
+    return V_EQ;
+  }
+  if (dir == ROUND_DOWN) {
+    to = Extended_Int<Policy, To>::max;
+    return V_GT;
+  }
+  return VC_PLUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_int_nan(To& to, const Not_A_Number&, Rounding_Dir) {
+  if (Policy::handle_nan) {
+    to = Extended_Int<Policy, To>::not_a_number;
+    return V_EQ;
+  }
+  return VC_NAN;
+}
+
+SPECIALIZE_ASSIGN(int_minf, signed char, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed short, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed int, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed long, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed long long, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned char, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned short, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned int, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned long, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned long long, Minus_Infinity)
+
+SPECIALIZE_ASSIGN(int_pinf, signed char, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed short, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed int, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed long, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed long long, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned char, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned short, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned int, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned long, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned long long, Plus_Infinity)
+
+SPECIALIZE_ASSIGN(int_nan, signed char, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed short, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed int, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed long, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed long long, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned char, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned short, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned int, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned long, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned long long, Not_A_Number)
+
+#if UCHAR_MAX == 0xff
+#define CHAR_BITS 8
+#else
+#error "Unexpected max for unsigned char"
+#endif
+
+#if USHRT_MAX == 0xffff
+#define SHRT_BITS 16
+#else
+#error "Unexpected max for unsigned short"
+#endif
+
+#if UINT_MAX == 0xffffffff
+#define INT_BITS 32
+#else
+#error "Unexpected max for unsigned int"
+#endif
+
+#if ULONG_MAX == 0xffffffffUL
+#define LONG_BITS 32
+#elif ULONG_MAX == 0xffffffffffffffffULL
+#define LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long"
+#endif
+
+#if ULLONG_MAX == 0xffffffffffffffffULL
+#define LONG_LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long long"
+#endif
+
+
+template <typename T>
+struct Larger;
+
+// The following may be tuned for performance on specific architecture.
+//
+// Current guidelines:
+//   - avoid division where possible (larger type variant for mul)
+//   - use larger type variant for types smaller than architecture bit size
+
+template <>
+struct Larger<signed char> {
+  static const bool use_for_neg = true;
+  static const bool use_for_add = true;
+  static const bool use_for_sub = true;
+  static const bool use_for_mul = true;
+  typedef int_fast16_t Type_For_Neg;
+  typedef int_fast16_t  Type_For_Add;
+  typedef int_fast16_t  Type_For_Sub;
+  typedef int_fast16_t  Type_For_Mul;
+};
+
+template <>
+struct Larger<unsigned char> {
+  static const bool use_for_neg = true;
+  static const bool use_for_add = true;
+  static const bool use_for_sub = true;
+  static const bool use_for_mul = true;
+  typedef int_fast16_t Type_For_Neg;
+  typedef uint_fast16_t Type_For_Add;
+  typedef int_fast16_t Type_For_Sub;
+  typedef uint_fast16_t Type_For_Mul;
+};
+
+template <>
+struct Larger<signed short> {
+  static const bool use_for_neg = true;
+  static const bool use_for_add = true;
+  static const bool use_for_sub = true;
+  static const bool use_for_mul = true;
+  typedef int_fast32_t Type_For_Neg;
+  typedef int_fast32_t Type_For_Add;
+  typedef int_fast32_t Type_For_Sub;
+  typedef int_fast32_t Type_For_Mul;
+};
+
+template <>
+struct Larger<unsigned short> {
+  static const bool use_for_neg = true;
+  static const bool use_for_add = true;
+  static const bool use_for_sub = true;
+  static const bool use_for_mul = true;
+  typedef int_fast32_t Type_For_Neg;
+  typedef uint_fast32_t Type_For_Add;
+  typedef int_fast32_t Type_For_Sub;
+  typedef uint_fast32_t Type_For_Mul;
+};
+
+template <>
+struct Larger<signed int> {
+  static const bool use_for_neg = (LONG_BITS == 64);
+  static const bool use_for_add = (LONG_BITS == 64);
+  static const bool use_for_sub = (LONG_BITS == 64);
+  static const bool use_for_mul = true;
+  typedef int_fast64_t Type_For_Neg;
+  typedef int_fast64_t Type_For_Add;
+  typedef int_fast64_t Type_For_Sub;
+  typedef int_fast64_t Type_For_Mul;
+};
+
+template <>
+struct Larger<unsigned int> {
+  static const bool use_for_neg = (LONG_BITS == 64);
+  static const bool use_for_add = (LONG_BITS == 64);
+  static const bool use_for_sub = (LONG_BITS == 64);
+  static const bool use_for_mul = true;
+  typedef int_fast64_t Type_For_Neg;
+  typedef uint_fast64_t Type_For_Add;
+  typedef int_fast64_t Type_For_Sub;
+  typedef uint_fast64_t Type_For_Mul;
+};
+
+template <>
+struct Larger<signed long> {
+  static const bool use_for_neg = false;
+  static const bool use_for_add = false;
+  static const bool use_for_sub = false;
+  static const bool use_for_mul = (LONG_BITS == 32);
+  typedef int_fast64_t Type_For_Neg;
+  typedef int_fast64_t Type_For_Add;
+  typedef int_fast64_t Type_For_Sub;
+  typedef int_fast64_t Type_For_Mul;
+};
+
+template <>
+struct Larger<unsigned long> {
+  static const bool use_for_neg = false;
+  static const bool use_for_add = false;
+  static const bool use_for_sub = false;
+  static const bool use_for_mul = (LONG_BITS == 32);
+  typedef int_fast64_t Type_For_Neg;
+  typedef uint_fast64_t Type_For_Add;
+  typedef int_fast64_t Type_For_Sub;
+  typedef uint_fast64_t Type_For_Mul;
+};
+
+template <>
+struct Larger<signed long long> {
+  static const bool use_for_neg = false;
+  static const bool use_for_add = false;
+  static const bool use_for_sub = false;
+  static const bool use_for_mul = false;
+  typedef int_fast64_t Type_For_Neg;
+  typedef int_fast64_t Type_For_Add;
+  typedef int_fast64_t Type_For_Sub;
+  typedef int_fast64_t Type_For_Mul;
+};
+
+template <>
+struct Larger<unsigned long long> {
+  static const bool use_for_neg = false;
+  static const bool use_for_add = false;
+  static const bool use_for_sub = false;
+  static const bool use_for_mul = false;
+  typedef int_fast64_t Type_For_Neg;
+  typedef uint_fast64_t Type_For_Add;
+  typedef int_fast64_t Type_For_Sub;
+  typedef uint_fast64_t Type_For_Mul;
+};
+
+template <typename Policy, typename Type>
+inline Result
+neg_int_larger(Type& to, const Type x, Rounding_Dir dir) {
+  typename Larger<Type>::Type_For_Neg l = x;
+  l = -l;
+  return assign<Policy>(to, l, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::Type_For_Add l = x;
+  l += y;
+  return assign<Policy>(to, l, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::Type_For_Sub l = x;
+  l -= y;
+  return assign<Policy>(to, l, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::Type_For_Mul l = x;
+  l *= y;
+  return assign<Policy>(to, l, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+neg_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_neg)
+    return neg_int_larger<Policy>(to, from, dir);
+  if (CHECK_P(Policy::check_overflow,
+	      (from < -Extended_Int<Policy, Type>::max)))
+    return set_pos_overflow_int<Policy>(to, dir);
+  to = -from;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_neg)
+    return neg_int_larger<Policy>(to, from, dir);
+  if (CHECK_P(Policy::check_overflow, from != 0))
+    return set_neg_overflow_int<Policy>(to, dir);
+  to = from;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_add)
+    return add_int_larger<Policy>(to, x, y, dir);
+  if (Policy::check_overflow) {
+    if (y >= 0) {
+      if (x > Extended_Int<Policy, Type>::max - y)
+	return set_pos_overflow_int<Policy>(to, dir);
+    }
+    else if (x < Extended_Int<Policy, Type>::min - y)
+	return set_neg_overflow_int<Policy>(to, dir);
+  }
+  to = x + y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_add)
+    return add_int_larger<Policy>(to, x, y, dir);
+  if (CHECK_P(Policy::check_overflow,
+	      (x > Extended_Int<Policy, Type>::max - y)))
+    return set_pos_overflow_int<Policy>(to, dir);
+  to = x + y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_sub)
+    return sub_int_larger<Policy>(to, x, y, dir);
+  if (Policy::check_overflow) {
+    if (y >= 0) {
+      if (x < Extended_Int<Policy, Type>::min + y)
+	return set_neg_overflow_int<Policy>(to, dir);
+    }
+    else if (x > Extended_Int<Policy, Type>::max + y)
+	return set_pos_overflow_int<Policy>(to, dir);
+  }
+  to = x - y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_sub)
+    return sub_int_larger<Policy>(to, x, y, dir);
+  if (CHECK_P(Policy::check_overflow,
+	      (x < Extended_Int<Policy, Type>::min + y)))
+    return set_neg_overflow_int<Policy>(to, dir);
+  to = x - y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_mul)
+    return mul_int_larger<Policy>(to, x, y, dir);
+  if (!Policy::check_overflow) {
+    to = x * y;
+    return V_EQ;
+  }
+  if (y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  if (y == -1)
+    return neg_signed_int<Policy>(to, x, dir);
+  if (x >= 0) {
+    if (y > 0) {
+      if (x > Extended_Int<Policy, Type>::max / y)
+	return set_pos_overflow_int<Policy>(to, dir);
+    }
+    else {
+      if (x > Extended_Int<Policy, Type>::min / y)
+	return set_neg_overflow_int<Policy>(to, dir);
+    }
+  }
+  else {
+    if (y < 0) {
+      if (x < Extended_Int<Policy, Type>::max / y)
+	return set_pos_overflow_int<Policy>(to, dir);
+    }
+    else {
+      if (x < Extended_Int<Policy, Type>::min / y)
+	return set_neg_overflow_int<Policy>(to, dir);
+    }
+  }
+  to = x * y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (Policy::check_overflow && Larger<Type>::use_for_mul)
+    return mul_int_larger<Policy>(to, x, y, dir);
+  if (!Policy::check_overflow) {
+    to = x * y;
+    return V_EQ;
+  }
+  if (y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  if (x > Extended_Int<Policy, Type>::max / y)
+    return set_pos_overflow_int<Policy>(to, dir);
+  to = x * y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_div_zero, y == 0))
+    return set_special<Policy>(to, V_DIV_ZERO);
+  if (Policy::check_overflow && y == -1)
+    return neg_signed_int<Policy>(to, x, dir);
+  to = x / y;
+  if (dir == ROUND_IGNORE)
+    return V_LGE;
+  Type m = x % y;
+  if (m < 0)
+    return round_lt_int_no_overflow<Policy>(to, dir);
+  else if (m > 0)
+    return round_gt_int_no_overflow<Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_div_zero, y == 0))
+    return set_special<Policy>(to, V_DIV_ZERO);
+  to = x / y;
+  if (dir == ROUND_IGNORE)
+    return V_GE;
+  Type m = x % y;
+  if (m == 0)
+    return V_EQ;
+  return round_gt_int<Policy>(to, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+rem_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(Policy::check_div_zero, y == 0))
+    return set_special<Policy>(to, V_MOD_ZERO);
+  to = x % y;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<Policy>(to, x, -exp, dir);
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+    to = 0;
+    if (dir == ROUND_IGNORE)
+      return V_GE;
+    if (x == 0)
+      return V_EQ;
+    return round_gt_int_no_overflow<Policy>(to, dir);
+  }
+  to = x >> exp;
+  if (dir == ROUND_IGNORE)
+    return V_GE;
+  if (x & ((static_cast<Type>(1) << exp) - 1))
+    return round_gt_int_no_overflow<Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<Policy>(to, x, -exp, dir);
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+  zero:
+    to = 0;
+    if (dir == ROUND_IGNORE)
+      return V_LGE;
+    if (x < 0)
+      return round_lt_int_no_overflow<Policy>(to, dir);
+    else if (x > 0)
+      return round_gt_int_no_overflow<Policy>(to, dir);
+    else
+      return V_EQ;
+  }
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
+    if (x == Limits<Type>::min) {
+      to = -1;
+      return V_EQ;
+    }
+    goto zero;
+  }
+#if 0
+  to = x / (static_cast<Type>(1) << exp);
+  if (dir == ROUND_IGNORE)
+    return V_GE;
+  Type r = x % (static_cast<Type>(1) << exp);
+  if (r < 0)
+    return round_lt_int_no_overflow<Policy>(to, dir);
+  else if (r > 0)
+    return round_gt_int_no_overflow<Policy>(to, dir);
+  else
+    return V_EQ;
+#else
+  // Faster but compiler implementation dependent (see C++98 5.8.3)
+  to = x >> exp;
+  if (dir == ROUND_IGNORE)
+    return V_GE;
+  if (x & ((static_cast<Type>(1) << exp) - 1))
+    return round_gt_int_no_overflow<Policy>(to, dir);
+  return V_EQ;
+#endif
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<Policy>(to, x, -exp, dir);
+  if (!Policy::check_overflow) {
+    to = x << exp;
+    return V_EQ;
+  }
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+    if (x == 0) {
+      to = 0;
+      return V_EQ;
+    }
+    return set_pos_overflow_int<Policy>(to, dir);
+  }
+  if (x & (((static_cast<Type>(1) << exp) - 1) << (sizeof(Type) * 8 - exp)))
+    return set_pos_overflow_int<Policy>(to, dir);
+  Type n = x << exp;
+  if (n > Extended_Int<Policy, Type>::max)
+    return set_pos_overflow_int<Policy>(to, dir);
+  to = n;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<Policy>(to, x, -exp, dir);
+  if (!Policy::check_overflow) {
+    to = x << exp;
+    return V_EQ;
+  }
+  if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
+    if (x < 0)
+      return set_neg_overflow_int<Policy>(to, dir);
+    else if (x > 0)
+      return set_pos_overflow_int<Policy>(to, dir);
+    else {
+      to = 0;
+      return V_EQ;
+    }
+  }
+  Type mask = ((static_cast<Type>(1) << exp) - 1)
+    << (sizeof(Type) * 8 - 1 - exp);
+  Type n;
+  if (x < 0) {
+    if ((x & mask) != mask)
+      return set_neg_overflow_int<Policy>(to, dir);
+    n = x << exp;
+    if (n < Extended_Int<Policy, Type>::min)
+      return set_neg_overflow_int<Policy>(to, dir);
+  }
+  else {
+    if (x & mask)
+      return set_pos_overflow_int<Policy>(to, dir);
+    n = x << exp;
+    if (n > Extended_Int<Policy, Type>::max)
+      return set_pos_overflow_int<Policy>(to, dir);
+  }
+  to = n;
+  return V_EQ;
+}
+
+template <typename Type>
+inline void
+isqrtrem_(Type& q, Type& r, const Type from) {
+  q = 0;
+  r = from;
+  Type t(1);
+  for (t <<= 8 * sizeof(Type) - 2; t != 0; t >>= 2) {
+    Type s = q + t;
+    if (s <= r) {
+      r -= s;
+      q = s + t;
+    }
+    q >>= 1;
+  }
+}
+
+template <typename Policy, typename Type>
+inline Result
+sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+  Type rem;
+  isqrtrem_(to, rem, from);
+  if (dir == ROUND_IGNORE)
+    return V_GE;
+  if (rem == 0)
+    return V_EQ;
+  return round_gt_int<Policy>(to, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sqrt_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_sqrt_neg, from < 0))
+    return set_special<Policy>(to, V_SQRT_NEG);
+  return sqrt_unsigned_int<Policy>(to, from, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type z;
+  Result r = mul<Policy>(z, x, y, dir);
+  switch (r) {
+  case V_NEG_OVERFLOW:
+  case V_LT:
+    if (to <= 0) {
+      to = z;
+      return r;
+    }
+    return set_special<Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+  case V_POS_OVERFLOW:
+  case V_GT:
+    if (to >= 0) {
+      to = z;
+      return r;
+    }
+    return set_special<Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+  default:
+    return add<Policy>(to, to, z, dir);
+  }
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type z;
+  Result r = mul<Policy>(z, x, y, dir);
+  switch (r) {
+  case V_NEG_OVERFLOW:
+  case V_LT:
+    if (to >= 0)
+      return set_pos_overflow_int<Policy>(to, dir);
+    return V_UNKNOWN_NEG_OVERFLOW;
+  case V_POS_OVERFLOW:
+  case V_GT:
+    if (to <= 0)
+      return set_neg_overflow_int<Policy>(to, dir);
+    return V_UNKNOWN_POS_OVERFLOW;
+  default:
+    return sub<Policy>(to, to, z, dir);
+  }
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_char(std::ostream& os, Type& from,
+	    const Numeric_Format&, Rounding_Dir) {
+  os << (int) from;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_int(std::ostream& os, Type& from, const Numeric_Format&, Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+SPECIALIZE_NEG(signed_int, signed char, signed char)
+SPECIALIZE_NEG(signed_int, signed short, signed short)
+SPECIALIZE_NEG(signed_int, signed int, signed int)
+SPECIALIZE_NEG(signed_int, signed long, signed long)
+SPECIALIZE_NEG(signed_int, signed long long, signed long long)
+SPECIALIZE_NEG(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_NEG(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_NEG(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_NEG(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_NEG(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_ADD(signed_int, signed char, signed char, signed char)
+SPECIALIZE_ADD(signed_int, signed short, signed short, signed short)
+SPECIALIZE_ADD(signed_int, signed int, signed int, signed int)
+SPECIALIZE_ADD(signed_int, signed long, signed long, signed long)
+SPECIALIZE_ADD(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_ADD(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_ADD(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_ADD(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_ADD(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_ADD(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SUB(signed_int, signed char, signed char, signed char)
+SPECIALIZE_SUB(signed_int, signed short, signed short, signed short)
+SPECIALIZE_SUB(signed_int, signed int, signed int, signed int)
+SPECIALIZE_SUB(signed_int, signed long, signed long, signed long)
+SPECIALIZE_SUB(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_SUB(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_SUB(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_SUB(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_SUB(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_SUB(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_MUL(signed_int, signed char, signed char, signed char)
+SPECIALIZE_MUL(signed_int, signed short, signed short, signed short)
+SPECIALIZE_MUL(signed_int, signed int, signed int, signed int)
+SPECIALIZE_MUL(signed_int, signed long, signed long, signed long)
+SPECIALIZE_MUL(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_MUL(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_MUL(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_MUL(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_MUL(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_MUL(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_DIV(signed_int, signed char, signed char, signed char)
+SPECIALIZE_DIV(signed_int, signed short, signed short, signed short)
+SPECIALIZE_DIV(signed_int, signed int, signed int, signed int)
+SPECIALIZE_DIV(signed_int, signed long, signed long, signed long)
+SPECIALIZE_DIV(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_DIV(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_DIV(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_DIV(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_DIV(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_DIV(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_REM(int, signed char, signed char, signed char)
+SPECIALIZE_REM(int, signed short, signed short, signed short)
+SPECIALIZE_REM(int, signed int, signed int, signed int)
+SPECIALIZE_REM(int, signed long, signed long, signed long)
+SPECIALIZE_REM(int, signed long long, signed long long, signed long long)
+SPECIALIZE_REM(int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_REM(int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_REM(int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_REM(int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_REM(int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_MUL2EXP(signed_int, signed char, signed char)
+SPECIALIZE_MUL2EXP(signed_int, signed short, signed short)
+SPECIALIZE_MUL2EXP(signed_int, signed int, signed int)
+SPECIALIZE_MUL2EXP(signed_int, signed long, signed long)
+SPECIALIZE_MUL2EXP(signed_int, signed long long, signed long long)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_DIV2EXP(signed_int, signed char, signed char)
+SPECIALIZE_DIV2EXP(signed_int, signed short, signed short)
+SPECIALIZE_DIV2EXP(signed_int, signed int, signed int)
+SPECIALIZE_DIV2EXP(signed_int, signed long, signed long)
+SPECIALIZE_DIV2EXP(signed_int, signed long long, signed long long)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_SQRT(signed_int, signed char, signed char)
+SPECIALIZE_SQRT(signed_int, signed short, signed short)
+SPECIALIZE_SQRT(signed_int, signed int, signed int)
+SPECIALIZE_SQRT(signed_int, signed long, signed long)
+SPECIALIZE_SQRT(signed_int, signed long long, signed long long)
+SPECIALIZE_SQRT(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_SQRT(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_SQRT(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_SQRT(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_SQRT(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_ABS(generic, signed char, signed char)
+SPECIALIZE_ABS(generic, signed short, signed short)
+SPECIALIZE_ABS(generic, signed int, signed int)
+SPECIALIZE_ABS(generic, signed long, signed long)
+SPECIALIZE_ABS(generic, signed long long, signed long long)
+SPECIALIZE_ABS(generic, unsigned char, unsigned char)
+SPECIALIZE_ABS(generic, unsigned short, unsigned short)
+SPECIALIZE_ABS(generic, unsigned int, unsigned int)
+SPECIALIZE_ABS(generic, unsigned long, unsigned long)
+SPECIALIZE_ABS(generic, unsigned long long, unsigned long long)
+
+SPECIALIZE_GCD(exact, signed char, signed char, signed char)
+SPECIALIZE_GCD(exact, signed short, signed short, signed short)
+SPECIALIZE_GCD(exact, signed int, signed int, signed int)
+SPECIALIZE_GCD(exact, signed long, signed long, signed long)
+SPECIALIZE_GCD(exact, signed long long, signed long long, signed long long)
+SPECIALIZE_GCD(exact, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_GCD(exact, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_GCD(exact, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_GCD(exact, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_GCD(exact, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_GCDEXT(exact, signed char, signed char, signed char, signed char, signed char)
+SPECIALIZE_GCDEXT(exact, signed short, signed short, signed short, signed short, signed short)
+SPECIALIZE_GCDEXT(exact, signed int, signed int, signed int, signed int, signed int)
+SPECIALIZE_GCDEXT(exact, signed long, signed long, signed long, signed long, signed long)
+SPECIALIZE_GCDEXT(exact, signed long long, signed long long, signed long long, signed long long, signed long long)
+SPECIALIZE_GCDEXT(exact, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_GCDEXT(exact, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_GCDEXT(exact, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_GCDEXT(exact, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_GCDEXT(exact, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_LCM(gcd_exact, signed char, signed char, signed char)
+SPECIALIZE_LCM(gcd_exact, signed short, signed short, signed short)
+SPECIALIZE_LCM(gcd_exact, signed int, signed int, signed int)
+SPECIALIZE_LCM(gcd_exact, signed long, signed long, signed long)
+SPECIALIZE_LCM(gcd_exact, signed long long, signed long long, signed long long)
+SPECIALIZE_LCM(gcd_exact, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_LCM(gcd_exact, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_LCM(gcd_exact, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_LCM(gcd_exact, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_LCM(gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SGN(generic, signed char)
+SPECIALIZE_SGN(generic, signed short)
+SPECIALIZE_SGN(generic, signed int)
+SPECIALIZE_SGN(generic, signed long)
+SPECIALIZE_SGN(generic, signed long long)
+SPECIALIZE_SGN(generic, unsigned char)
+SPECIALIZE_SGN(generic, unsigned short)
+SPECIALIZE_SGN(generic, unsigned int)
+SPECIALIZE_SGN(generic, unsigned long)
+SPECIALIZE_SGN(generic, unsigned long long)
+
+SPECIALIZE_CMP(generic, signed char, signed char)
+SPECIALIZE_CMP(generic, signed short, signed short)
+SPECIALIZE_CMP(generic, signed int, signed int)
+SPECIALIZE_CMP(generic, signed long, signed long)
+SPECIALIZE_CMP(generic, signed long long, signed long long)
+SPECIALIZE_CMP(generic, unsigned char, unsigned char)
+SPECIALIZE_CMP(generic, unsigned short, unsigned short)
+SPECIALIZE_CMP(generic, unsigned int, unsigned int)
+SPECIALIZE_CMP(generic, unsigned long, unsigned long)
+SPECIALIZE_CMP(generic, unsigned long long, unsigned long long)
+
+SPECIALIZE_ADD_MUL(int, signed char, signed char, signed char)
+SPECIALIZE_ADD_MUL(int, signed short, signed short, signed short)
+SPECIALIZE_ADD_MUL(int, signed int, signed int, signed int)
+SPECIALIZE_ADD_MUL(int, signed long, signed long, signed long)
+SPECIALIZE_ADD_MUL(int, signed long long, signed long long, signed long long)
+SPECIALIZE_ADD_MUL(int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_ADD_MUL(int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_ADD_MUL(int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_ADD_MUL(int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_ADD_MUL(int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SUB_MUL(int, signed char, signed char, signed char)
+SPECIALIZE_SUB_MUL(int, signed short, signed short, signed short)
+SPECIALIZE_SUB_MUL(int, signed int, signed int, signed int)
+SPECIALIZE_SUB_MUL(int, signed long, signed long, signed long)
+SPECIALIZE_SUB_MUL(int, signed long long, signed long long, signed long long)
+SPECIALIZE_SUB_MUL(int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_SUB_MUL(int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_SUB_MUL(int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_SUB_MUL(int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_SUB_MUL(int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_INPUT(generic, signed char)
+SPECIALIZE_INPUT(generic, signed short)
+SPECIALIZE_INPUT(generic, signed int)
+SPECIALIZE_INPUT(generic, signed long)
+SPECIALIZE_INPUT(generic, signed long long)
+SPECIALIZE_INPUT(generic, unsigned char)
+SPECIALIZE_INPUT(generic, unsigned short)
+SPECIALIZE_INPUT(generic, unsigned int)
+SPECIALIZE_INPUT(generic, unsigned long)
+SPECIALIZE_INPUT(generic, unsigned long long)
+
+SPECIALIZE_OUTPUT(char, signed char)
+SPECIALIZE_OUTPUT(int, signed short)
+SPECIALIZE_OUTPUT(int, signed int)
+SPECIALIZE_OUTPUT(int, signed long)
+SPECIALIZE_OUTPUT(int, signed long long)
+SPECIALIZE_OUTPUT(char, unsigned char)
+SPECIALIZE_OUTPUT(int, unsigned short)
+SPECIALIZE_OUTPUT(int, unsigned int)
+SPECIALIZE_OUTPUT(int, unsigned long)
+SPECIALIZE_OUTPUT(int, unsigned long long)
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/checked_float.inlines.hh line 1
+/* Specialized "checked" functions for native floating-point numbers.
+*/
+
+
+// Automatically generated from PPL source file ../src/Float.defs.hh line 1
+/* IEC 559 floating point format related functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Float.defs.hh line 27
+#include <gmp.h>
+#include <cassert>
+#include <cmath>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#ifndef NAN
+#define NAN (HUGE_VAL - HUGE_VAL)
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_ieee754_single {
+  uint32_t word;
+  static const uint32_t SGN_MASK = 0x80000000;
+  static const uint32_t EXP_MASK = 0x7f800000;
+  static const uint32_t POS_INF = 0x7f800000;
+  static const uint32_t NEG_INF = 0xff800000;
+  static const uint32_t POS_ZERO = 0x00000000;
+  static const uint32_t NEG_ZERO = 0x80000000;
+  static const unsigned int EXPONENT_BITS = 8;
+  static const unsigned int MANTISSA_BITS = 23;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+					- static_cast<int>(MANTISSA_BITS);
+  int is_inf() const;
+  int is_nan() const;
+  int is_zero() const;
+  int sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_ieee754_double {
+#ifdef WORDS_BIGENDIAN
+  uint32_t msp;
+  uint32_t lsp;
+#else
+  uint32_t lsp;
+  uint32_t msp;
+#endif
+  static const uint32_t MSP_SGN_MASK = 0x80000000;
+  static const uint32_t MSP_POS_INF = 0x7ff00000;
+  static const uint32_t MSP_NEG_INF = 0xfff00000;
+  static const uint32_t MSP_POS_ZERO = 0x00000000;
+  static const uint32_t MSP_NEG_ZERO = 0x80000000;
+  static const uint32_t LSP_INF = 0;
+  static const uint32_t LSP_ZERO = 0;
+  static const uint32_t LSP_MAX = 0xffffffff;
+  static const unsigned int EXPONENT_BITS = 11;
+  static const unsigned int MANTISSA_BITS = 52;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+					- static_cast<int>(MANTISSA_BITS);
+  int is_inf() const;
+  int is_nan() const;
+  int is_zero() const;
+  int sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_intel_double_extended {
+#ifdef WORDS_BIGENDIAN
+  uint32_t msp;
+  uint64_t lsp;
+#else
+  uint64_t lsp;
+  uint32_t msp;
+#endif
+  static const uint32_t MSP_SGN_MASK = 0x00008000;
+  static const uint32_t MSP_POS_INF = 0x00007fff;
+  static const uint32_t MSP_NEG_INF = 0x0000ffff;
+  static const uint32_t MSP_POS_ZERO = 0x00000000;
+  static const uint32_t MSP_NEG_ZERO = 0x00008000;
+  static const uint64_t LSP_INF = 0x8000000000000000ULL;
+  static const uint64_t LSP_ZERO = 0;
+  static const uint64_t LSP_DMAX = 0x7fffffffffffffffULL;
+  static const uint64_t LSP_NMAX = 0xffffffffffffffffULL;
+  static const unsigned int EXPONENT_BITS = 15;
+  static const unsigned int MANTISSA_BITS = 63;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+					- static_cast<int>(MANTISSA_BITS);
+  int is_inf() const;
+  int is_nan() const;
+  int is_zero() const;
+  int sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_ieee754_quad {
+#ifdef WORDS_BIGENDIAN
+  uint64_t msp;
+  uint64_t lsp;
+#else
+  uint64_t lsp;
+  uint64_t msp;
+#endif
+  static const uint64_t MSP_SGN_MASK = 0x8000000000000000ULL;
+  static const uint64_t MSP_POS_INF = 0x7fff000000000000ULL;
+  static const uint64_t MSP_NEG_INF = 0xffff000000000000ULL;
+  static const uint64_t MSP_POS_ZERO = 0x0000000000000000ULL;
+  static const uint64_t MSP_NEG_ZERO = 0x8000000000000000ULL;
+  static const uint64_t LSP_INF = 0;
+  static const uint64_t LSP_ZERO = 0;
+  static const uint64_t LSP_MAX = 0xffffffffffffffffULL;
+  static const unsigned int EXPONENT_BITS = 15;
+  static const unsigned int MANTISSA_BITS = 112;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+					- static_cast<int>(MANTISSA_BITS);
+  int is_inf() const;
+  int is_nan() const;
+  int is_zero() const;
+  int sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+class Float {
+public:
+  static const bool fpu_related = false;
+};
+
+#if PPL_SUPPORTED_FLOAT
+template <>
+class Float<float> {
+public:
+  typedef CXX_FLOAT_BINARY_FORMAT Binary;
+  union {
+    float number;
+    Binary binary;
+  } u;
+  Float();
+  Float(float v);
+  float value();
+  static const bool fpu_related = true;
+};
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+class Float<double> {
+public:
+  typedef CXX_DOUBLE_BINARY_FORMAT Binary;
+  union {
+    double number;
+    Binary binary;
+  } u;
+  Float();
+  Float(double v);
+  double value();
+  static const bool fpu_related = true;
+};
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <>
+class Float<long double> {
+public:
+  typedef CXX_LONG_DOUBLE_BINARY_FORMAT Binary;
+  union {
+    long double number;
+    Binary binary;
+  } u;
+  Float();
+  Float(long double v);
+  long double value();
+  static const bool fpu_related = true;
+};
+#endif
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Float.inlines.hh line 1
+/* IEC 559 floating point format related functions.
+*/
+
+
+#include <climits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+float_ieee754_single::is_inf() const {
+  if (word == NEG_INF)
+    return -1;
+  if (word == POS_INF)
+    return 1;
+  return 0;
+}
+
+inline int
+float_ieee754_single::is_nan() const {
+  return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ieee754_single::is_zero() const {
+  if (word == NEG_ZERO)
+    return -1;
+  if (word == POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_single::negate() {
+  word ^= SGN_MASK;
+}
+
+inline int
+float_ieee754_single::sign_bit() const {
+  return !!(word & SGN_MASK);
+}
+
+inline void
+float_ieee754_single::dec() {
+  word--;
+}
+
+inline void
+float_ieee754_single::inc() {
+  word++;
+}
+
+inline void
+float_ieee754_single::set_max(bool negative) {
+  word = 0x7f7fffff;
+  if (negative)
+    word |= SGN_MASK;
+}
+
+inline void
+float_ieee754_single::build(bool negative, mpz_t mantissa, int exponent) {
+  word = mpz_get_ui(mantissa) & ((1UL << MANTISSA_BITS) - 1);
+  if (negative)
+    word |= SGN_MASK;
+  word |= static_cast<uint32_t>(exponent + EXPONENT_BIAS) << MANTISSA_BITS;
+}
+
+inline int
+float_ieee754_double::is_inf() const {
+  if (lsp != LSP_INF)
+    return 0;
+  if (msp == MSP_NEG_INF)
+    return -1;
+  if (msp == MSP_POS_INF)
+    return 1;
+  return 0;
+}
+
+inline int
+float_ieee754_double::is_nan() const {
+  uint32_t a = msp & ~MSP_SGN_MASK;
+  return a > MSP_POS_INF || (a == MSP_POS_INF && lsp != LSP_INF);
+}
+
+inline int
+float_ieee754_double::is_zero() const {
+  if (lsp != LSP_ZERO)
+    return 0;
+  if (msp == MSP_NEG_ZERO)
+    return -1;
+  if (msp == MSP_POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_double::negate() {
+  msp ^= MSP_SGN_MASK;
+}
+
+inline int
+float_ieee754_double::sign_bit() const {
+  return !!(msp & MSP_SGN_MASK);
+}
+
+inline void
+float_ieee754_double::dec() {
+  if (lsp == 0) {
+    msp--;
+    lsp = LSP_MAX;
+  }
+  else
+    lsp--;
+}
+
+inline void
+float_ieee754_double::inc() {
+  if (lsp == LSP_MAX) {
+    msp++;
+    lsp = 0;
+  }
+  else
+    lsp++;
+}
+
+inline void
+float_ieee754_double::set_max(bool negative) {
+  msp = 0x7fefffff;
+  lsp = 0xffffffff;
+  if (negative)
+    msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_double::build(bool negative, mpz_t mantissa, int exponent) {
+#if ULONG_MAX == 0xffffffffUL
+  lsp = mpz_get_ui(mantissa);
+  mpz_tdiv_q_2exp(mantissa, mantissa, 32);
+  unsigned long m = mpz_get_ui(mantissa);
+#else
+  unsigned long m = mpz_get_ui(mantissa);
+  lsp = m;
+  m >>= 32;
+#endif
+  msp = m & ((1UL << (MANTISSA_BITS - 32)) - 1);
+  if (negative)
+    msp |= MSP_SGN_MASK;
+  msp |= static_cast<uint32_t>(exponent + EXPONENT_BIAS)
+    << (MANTISSA_BITS - 32);
+}
+
+inline int
+float_intel_double_extended::is_inf() const {
+  if (lsp != LSP_INF)
+    return 0;
+  uint32_t a = msp & MSP_NEG_INF;
+  if (a == MSP_NEG_INF)
+    return -1;
+  if (a == MSP_POS_INF)
+    return 1;
+  return 0;
+}
+
+inline int
+float_intel_double_extended::is_nan() const {
+  return (msp & MSP_POS_INF) == MSP_POS_INF
+    && lsp != LSP_INF;
+}
+
+inline int
+float_intel_double_extended::is_zero() const {
+  if (lsp != LSP_ZERO)
+    return 0;
+  uint32_t a = msp & MSP_NEG_INF;
+  if (a == MSP_NEG_ZERO)
+    return -1;
+  if (a == MSP_POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_intel_double_extended::negate() {
+  msp ^= MSP_SGN_MASK;
+}
+
+inline int
+float_intel_double_extended::sign_bit() const {
+  return !!(msp & MSP_SGN_MASK);
+}
+
+inline void
+float_intel_double_extended::dec() {
+  if ((lsp & LSP_DMAX) == 0) {
+    msp--;
+    lsp = (msp & MSP_NEG_INF) == 0 ? LSP_DMAX : LSP_NMAX;
+  }
+  else
+    lsp--;
+}
+
+inline void
+float_intel_double_extended::inc() {
+  if ((lsp & LSP_DMAX) == LSP_DMAX) {
+    msp++;
+    lsp = LSP_DMAX + 1;
+  }
+  else
+    lsp++;
+}
+
+inline void
+float_intel_double_extended::set_max(bool negative) {
+  msp = 0x00007ffe;
+  lsp = 0xffffffffffffffffULL;
+  if (negative)
+    msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_intel_double_extended::build(bool negative,
+				   mpz_t mantissa, int exponent) {
+#if ULONG_MAX == 0xffffffffUL
+  mpz_export(&lsp, 0, -1, 8, 0, 0, mantissa);
+#else
+  lsp = mpz_get_ui(mantissa);
+#endif
+  msp = (negative ? MSP_SGN_MASK : 0);
+  msp |= static_cast<uint32_t>(exponent + EXPONENT_BIAS);
+}
+
+inline int
+float_ieee754_quad::is_inf() const {
+  if (lsp != LSP_INF)
+    return 0;
+  if (msp == MSP_NEG_INF)
+    return -1;
+  if (msp == MSP_POS_INF)
+    return 1;
+  return 0;
+}
+
+inline int
+float_ieee754_quad::is_nan() const {
+  return (msp & ~MSP_SGN_MASK) == MSP_POS_INF
+    && lsp != LSP_INF;
+}
+
+inline int
+float_ieee754_quad::is_zero() const {
+  if (lsp != LSP_ZERO)
+    return 0;
+  if (msp == MSP_NEG_ZERO)
+    return -1;
+  if (msp == MSP_POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_quad::negate() {
+  msp ^= MSP_SGN_MASK;
+}
+
+inline int
+float_ieee754_quad::sign_bit() const {
+  return !!(msp & MSP_SGN_MASK);
+}
+
+inline void
+float_ieee754_quad::dec() {
+  if (lsp == 0) {
+    msp--;
+    lsp = LSP_MAX;
+  }
+  else
+    lsp--;
+}
+
+inline void
+float_ieee754_quad::inc() {
+  if (lsp == LSP_MAX) {
+    msp++;
+    lsp = 0;
+  }
+  else
+    lsp++;
+}
+
+inline void
+float_ieee754_quad::set_max(bool negative) {
+  msp = 0x7ffeffffffffffffULL;
+  lsp = 0xffffffffffffffffULL;
+  if (negative)
+    msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_quad::build(bool negative, mpz_t mantissa, int exponent) {
+  uint64_t parts[2];
+  mpz_export(parts, 0, -1, 8, 0, 0, mantissa);
+  lsp = parts[0];
+  msp = parts[1];
+  msp &= ((1ULL << (MANTISSA_BITS - 64)) - 1);
+  if (negative)
+    msp |= MSP_SGN_MASK;
+  msp |= static_cast<uint64_t>(exponent + EXPONENT_BIAS)
+    << (MANTISSA_BITS - 64);
+}
+
+#ifdef CXX_FLOAT_BINARY_FORMAT
+inline
+Float<float>::Float() {
+}
+
+inline
+Float<float>::Float(float v) {
+  u.number = v;
+}
+
+inline float
+Float<float>::value() {
+  return u.number;
+}
+#endif
+
+#ifdef CXX_DOUBLE_BINARY_FORMAT
+inline
+Float<double>::Float() {
+}
+
+inline
+Float<double>::Float(double v) {
+  u.number = v;
+}
+
+inline double
+Float<double>::value() {
+  return u.number;
+}
+#endif
+
+#ifdef CXX_LONG_DOUBLE_BINARY_FORMAT
+inline
+Float<long double>::Float() {
+}
+
+inline
+Float<long double>::Float(long double v) {
+  u.number = v;
+}
+
+inline long double
+Float<long double>::value() {
+  return u.number;
+}
+#endif
+
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Float.defs.hh line 248
+
+// Automatically generated from PPL source file ../src/checked_float.inlines.hh line 27
+#ifndef __alpha
+#include <cmath>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+inline float
+fma(float x, float y, float z) {
+#if HAVE_DECL_FMAF && !defined(__alpha)
+  return ::fmaf(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+#if HAVE_DECL_RINTF
+inline float
+rint(float x) {
+  return ::rintf(x);
+}
+#endif
+
+inline double
+fma(double x, double y, double z) {
+#if HAVE_DECL_FMA && !defined(__alpha)
+  return ::fma(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+inline double
+rint(double x) {
+  return ::rint(x);
+}
+
+inline long double
+fma(long double x, long double y, long double z) {
+#if HAVE_DECL_FMAL && !defined(__alpha)
+  return ::fmal(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+#if HAVE_DECL_RINTL
+inline long double
+rint(long double x) {
+  return ::rintl(x);
+}
+#endif
+
+inline bool
+fpu_direct_rounding(Rounding_Dir dir) {
+  return dir == ROUND_DIRECT || dir == ROUND_IGNORE;
+}
+
+inline bool
+fpu_inverse_rounding(Rounding_Dir dir) {
+  return dir == ROUND_INVERSE;
+}
+
+// The FPU mode is "round down".
+//
+// The result of the rounded down multiplication is thus computed directly.
+//
+//   a = 0.3
+//   b = 0.1
+//   c_i = a * b = 0.03
+//   c = c_i = 0.0
+//
+// To obtain the result of the rounded up multiplication
+// we do -(-a * b).
+//
+//   a = 0.3
+//   b = 0.1
+//   c_i = -a * b = -0.03
+//
+// Here c_i should be forced to lose excess precision, otherwise the
+// FPU will truncate using the rounding mode in force, which is "round down".
+//
+//   c_i = -c_i = 0.03
+//   c = c_i = 0.0
+//
+// Wrong result: we should have obtained c = 0.1.
+
+inline float
+limit_precision(float v) {
+  volatile float x = v;
+  return x;
+}
+
+inline double
+limit_precision(double v) {
+  volatile double x = v;
+  return x;
+}
+
+inline long double
+limit_precision(long double v) {
+#if __GNUC__ >= 4
+  return v;
+#else
+  // Not really needed for floating point operations done with the
+  // maximum available precision, but this avoids a bug in GCC 3.4.3
+  // that causes excessive optimization compiling -(-a * b).
+  // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21032
+  // and http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21067.
+  volatile long double x = v;
+  return x;
+#endif
+}
+
+template <typename Policy, typename T>
+inline Result
+classify_float(const T v, bool nan, bool inf, bool sign) {
+  Float<T> f(v);
+  if ((nan || sign) && f.u.binary.is_nan())
+    return VC_NAN;
+  if (inf) {
+    int i = f.u.binary.is_inf();
+    if (i < 0)
+      return VC_MINUS_INFINITY;
+    if (i > 0)
+      return VC_PLUS_INFINITY;
+  }
+  if (sign) {
+    if (v < 0)
+      return V_LT;
+    if (v > 0)
+      return V_GT;
+    return V_EQ;
+  }
+  return VC_NORMAL;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_nan_float(const T v) {
+  Float<T> f(v);
+  return f.u.binary.is_nan();
+}
+
+template <typename Policy, typename T>
+inline bool
+is_minf_float(const T v) {
+  Float<T> f(v);
+  return f.u.binary.is_inf() < 0;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_pinf_float(const T v) {
+  Float<T> f(v);
+  return f.u.binary.is_inf() > 0;
+}
+
+template <typename T>
+inline bool
+is_inf_float(const T v) {
+  Float<T> f(v);
+  return f.u.binary.is_inf() != 0;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_int_float(const T v) {
+  return rint(v) == v;
+}
+
+template <typename Policy, typename T>
+inline Result
+set_special_float(T& v, Result r) {
+  switch (classify(r)) {
+  case VC_MINUS_INFINITY:
+    v = -HUGE_VAL;
+    break;
+  case VC_PLUS_INFINITY:
+    v = HUGE_VAL;
+    break;
+  case VC_NAN:
+    v = NAN;
+    break;
+  default:
+    break;
+  }
+  return r;
+}
+
+template <typename T>
+inline void
+pred_float(T& v) {
+  Float<T> f(v);
+  assert(!f.u.binary.is_nan());
+  assert(f.u.binary.is_inf() >= 0);
+  if (f.u.binary.is_zero() > 0) {
+    f.u.binary.negate();
+    f.u.binary.inc();
+  }
+  else if (f.u.binary.sign_bit()) {
+    f.u.binary.inc();
+  }
+  else {
+    f.u.binary.dec();
+  }
+  v = f.value();
+}
+
+template <typename T>
+inline void
+succ_float(T& v) {
+  Float<T> f(v);
+  assert(!f.u.binary.is_nan());
+  assert(f.u.binary.is_inf() <= 0);
+  if (f.u.binary.is_zero() < 0) {
+    f.u.binary.negate();
+    f.u.binary.inc();
+  }
+  else if (!f.u.binary.sign_bit()) {
+    f.u.binary.inc();
+  }
+  else {
+    f.u.binary.dec();
+  }
+  v = f.value();
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_float(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_DOWN) {
+    pred_float(to);
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_float(To& to, Rounding_Dir dir) {
+  if (dir == ROUND_UP) {
+    succ_float(to);
+    return V_LT;
+  }
+  return V_GT;
+}
+
+template <typename Policy>
+inline void
+prepare_inexact(Rounding_Dir dir) {
+  if (Policy::fpu_check_inexact && dir != ROUND_IGNORE)
+    fpu_reset_inexact();
+}
+
+template <typename Policy>
+inline Result
+result_relation(Rounding_Dir dir) {
+  if (Policy::fpu_check_inexact) {
+    if (!fpu_check_inexact())
+      return V_EQ;
+    switch (dir) {
+    case ROUND_DOWN:
+      return V_GT;
+    case ROUND_UP:
+      return V_LT;
+    default:
+      return V_NE;
+    }
+  }
+  else {
+    switch (dir) {
+    case ROUND_DOWN:
+      return V_GE;
+    case ROUND_UP:
+      return V_LE;
+    default:
+      return V_LGE;
+    }
+  }
+}
+
+template <typename Policy, typename From, typename To>
+inline Result
+assign_float_float_exact(To& to, const From from, Rounding_Dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+    return VC_NAN;
+  to = from;
+  return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+    return VC_NAN;
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = from;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(-from);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = from;
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename From, typename To>
+inline Result
+assign_float_float(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(From) > sizeof(To))
+    return assign_float_float_inexact<Policy>(to, from, dir);
+  else
+    return assign_float_float_exact<Policy>(to, from, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+neg_float(Type& to, const Type from, Rounding_Dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+    return VC_NAN;
+  to = -from;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  if (CHECK_P(Policy::check_inf_add_inf, is_inf_float(x) && x == -y))
+    return V_INF_ADD_INF;
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x + y;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(-x - y);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = x + y;
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  if (CHECK_P(Policy::check_inf_sub_inf, is_inf_float(x) && x == y))
+    return V_INF_SUB_INF;
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x - y;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(y - x);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = x - y;
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  if (CHECK_P(Policy::check_inf_mul_zero, (x == 0 && is_inf_float(y)) ||
+	    (y == 0 && is_inf_float(x))))
+      return V_INF_MUL_ZERO;
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x * y;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(x * -y);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = x * y;
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+div_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  if (CHECK_P(Policy::check_inf_div_inf, is_inf_float(x) && is_inf_float(y)))
+      return V_INF_DIV_INF;
+  if (CHECK_P(Policy::check_div_zero, y == 0)) {
+    to = NAN;
+    return V_DIV_ZERO;
+  }
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x / y;
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(x / -y);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = x / y;
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+rem_float(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  if (CHECK_P(Policy::check_inf_mod, is_inf_float(x)))
+    return V_INF_MOD;
+  if (CHECK_P(Policy::check_div_zero, y == 0)) {
+    to = NAN;
+    return V_MOD_ZERO;
+  }
+  to = std::fmod(x, y);
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<Policy>(to, x, -exp, dir);
+  assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
+  return mul<Policy>(to, x, static_cast<Type>(1ULL << exp), dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+div2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<Policy>(to, x, -exp, dir);
+  assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
+  return div<Policy>(to, x, static_cast<Type>(1ULL << exp), dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+abs_float(Type& to, const Type from, Rounding_Dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+    return VC_NAN;
+  to = from < 0 ? -from : from;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+sqrt_float(Type& to, const Type from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+    return VC_NAN;
+  if (CHECK_P(Policy::check_sqrt_neg, from < 0)) {
+    to = NAN;
+    return V_SQRT_NEG;
+  }
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = std::sqrt(from);
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = std::sqrt(from);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sgn_float(const Type x) {
+  return classify<Policy>(x, false, false, true);
+}
+
+template <typename Policy, typename Type>
+inline Result
+cmp_float(const Type x, const Type y) {
+  if (x > y)
+    return V_GT;
+  if (x < y)
+    return V_LT;
+  if (x == y)
+    return V_EQ;
+  return V_UNORD_COMP;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_int_exact(To& to, const From from, Rounding_Dir) {
+  to = from;
+  return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) {
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = from;
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = from;
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(From) * 8 > Float<To>::Binary::MANTISSA_BITS)
+    return assign_float_int_inexact<Policy>(to, from, dir);
+  else
+    return assign_float_int_exact<Policy>(to, from, dir);
+}
+
+template <typename Policy, typename T>
+inline Result
+set_neg_overflow_float(T& to, Rounding_Dir dir) {
+  switch (dir) {
+  case ROUND_UP:
+    {
+      Float<T> f;
+      f.u.binary.set_max(true);
+      to = f.value();
+      return V_LT;
+    }
+  default:
+    to = -HUGE_VAL;
+    return V_GT;
+  }
+}
+
+template <typename Policy, typename T>
+inline Result
+set_pos_overflow_float(T& to, Rounding_Dir dir) {
+  switch (dir) {
+  case ROUND_DOWN:
+    {
+      Float<T> f;
+      f.u.binary.set_max(false);
+      to = f.value();
+      return V_GT;
+    }
+  default:
+    to = HUGE_VAL;
+    return V_LT;
+  }
+}
+
+template <typename Policy, typename T>
+inline Result
+assign_float_mpz(T& to, const mpz_class& _from, Rounding_Dir dir)
+{
+  mpz_srcptr from = _from.get_mpz_t();
+  int sign = mpz_sgn(from);
+  if (sign == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  size_t exponent = mpz_sizeinbase(from, 2) - 1;
+  if (exponent > (size_t) Float<T>::Binary::EXPONENT_MAX) {
+    if (sign < 0)
+      return set_neg_overflow_float<Policy>(to, dir);
+    else
+      return set_pos_overflow_float<Policy>(to, dir);
+  }
+  unsigned long zeroes = mpn_scan1(from->_mp_d, 0);
+  size_t meaningful_bits = exponent - zeroes;
+  mpz_t mantissa;
+  mpz_init(mantissa);
+  if (exponent > Float<T>::Binary::MANTISSA_BITS)
+    mpz_tdiv_q_2exp(mantissa,
+		    from,
+		    exponent - Float<T>::Binary::MANTISSA_BITS);
+  else
+    mpz_mul_2exp(mantissa, from, Float<T>::Binary::MANTISSA_BITS - exponent);
+  Float<T> f(to);
+  f.u.binary.build(sign < 0, mantissa, exponent);
+  mpz_clear(mantissa);
+  to = f.value();
+  if (meaningful_bits > Float<T>::Binary::MANTISSA_BITS) {
+    if (sign < 0)
+      return round_lt_float<Policy>(to, dir);
+    else
+      return round_gt_float<Policy>(to, dir);
+  }
+  return V_EQ;
+}
+
+template <typename Policy, typename T>
+inline Result
+assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir)
+{
+  const mpz_class& _num = from.get_num();
+  const mpz_class& _den = from.get_den();
+  if (_den == 1)
+    return assign_float_mpz<Policy>(to, _num, dir);
+  mpz_srcptr num = _num.get_mpz_t();
+  mpz_srcptr den = _den.get_mpz_t();
+  int sign = mpz_sgn(num);
+  signed long exponent = mpz_sizeinbase(num, 2) - mpz_sizeinbase(den, 2);
+  if (exponent < Float<T>::Binary::EXPONENT_MIN_DENORM) {
+    to = 0;
+  inexact:
+    if (sign < 0)
+      return round_lt_float<Policy>(to, dir);
+    else
+      return round_gt_float<Policy>(to, dir);
+  }
+  if (exponent > (signed int) Float<T>::Binary::EXPONENT_MAX + 1) {
+  overflow:
+    if (sign < 0)
+      return set_neg_overflow_float<Policy>(to, dir);
+    else
+      return set_pos_overflow_float<Policy>(to, dir);
+  }
+  unsigned int needed_bits = Float<T>::Binary::MANTISSA_BITS + 1;
+  if (exponent < Float<T>::Binary::EXPONENT_MIN)
+    needed_bits -= Float<T>::Binary::EXPONENT_MIN - exponent;
+  mpz_t mantissa;
+  mpz_init(mantissa);
+  signed long shift = needed_bits - exponent;
+  if (shift > 0) {
+    mpz_mul_2exp(mantissa, num, shift);
+    num = mantissa;
+  }
+  else if (shift < 0) {
+    mpz_mul_2exp(mantissa, den, -shift);
+    den = mantissa;
+  }
+  mpz_t r;
+  mpz_init(r);
+  mpz_tdiv_qr(mantissa, r, num, den);
+  size_t bits = mpz_sizeinbase(mantissa, 2);
+  bool inexact = (mpz_sgn(r) != 0);
+  mpz_clear(r);
+  if (bits == needed_bits + 1) {
+    inexact = (inexact || mpz_odd_p(mantissa));
+    mpz_div_2exp(mantissa, mantissa, 1);
+  }
+  else
+    --exponent;
+  if (exponent > (signed int)Float<T>::Binary::EXPONENT_MAX) {
+    mpz_clear(mantissa);
+    goto overflow;
+  } else if (exponent < Float<T>::Binary::EXPONENT_MIN - 1) {
+    /* Denormalized */
+    exponent = Float<T>::Binary::EXPONENT_MIN - 1;
+  }
+  Float<T> f(to);
+  f.u.binary.build(sign < 0, mantissa, exponent);
+  mpz_clear(mantissa);
+  to = f.value();
+  if (inexact)
+    goto inexact;
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(to))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = fma(x, y, to);
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(fma(-x, y, -to));
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = fma(x, y, to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(to))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+      || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+    return VC_NAN;
+  prepare_inexact<Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = fma(x, -y, to);
+  else if (fpu_inverse_rounding(dir))
+    to = -limit_precision(fma(x, y, -to));
+  else {
+    fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+    to = fma(x, -y, to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_float(std::ostream& os, const Type from, const Numeric_Format&,
+	     Rounding_Dir) {
+  if (from == 0)
+    os << "0";
+  else if (is_minf<Policy>(from))
+    os << "-inf";
+  else if (is_pinf<Policy>(from))
+    os << "+inf";
+  else if (is_nan<Policy>(from))
+    os << "nan";
+  else {
+    int old_precision = os.precision(10000);
+    os << from;
+    os.precision(old_precision);
+  }
+  return V_EQ;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_float_minf(To& to, const Minus_Infinity&, Rounding_Dir) {
+  to = -HUGE_VAL;
+  return V_EQ;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_float_pinf(To& to, const Plus_Infinity&, Rounding_Dir) {
+  to = HUGE_VAL;
+  return V_EQ;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_float_nan(To& to, const Not_A_Number&, Rounding_Dir) {
+  to = NAN;
+  return V_EQ;
+}
+
+#if PPL_SUPPORTED_FLOAT
+SPECIALIZE_ASSIGN(float_float_exact, float, float)
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_ASSIGN(float_float, float, double)
+SPECIALIZE_ASSIGN(float_float_exact, double, float)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(float_float, float, long double)
+SPECIALIZE_ASSIGN(float_float_exact, long double, float)
+#endif
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_ASSIGN(float_float_exact, double, double)
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(float_float, double, long double)
+SPECIALIZE_ASSIGN(float_float_exact, long double, double)
+#endif
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(float_float_exact, long double, long double)
+#endif
+
+#if PPL_SUPPORTED_FLOAT
+SPECIALIZE_CLASSIFY(float, float)
+SPECIALIZE_IS_NAN(float, float)
+SPECIALIZE_IS_MINF(float, float)
+SPECIALIZE_IS_PINF(float, float)
+SPECIALIZE_SET_SPECIAL(float, float)
+SPECIALIZE_ASSIGN(float_int, float, signed char)
+SPECIALIZE_ASSIGN(float_int, float, signed short)
+SPECIALIZE_ASSIGN(float_int, float, signed int)
+SPECIALIZE_ASSIGN(float_int, float, signed long)
+SPECIALIZE_ASSIGN(float_int, float, signed long long)
+SPECIALIZE_ASSIGN(float_int, float, unsigned char)
+SPECIALIZE_ASSIGN(float_int, float, unsigned short)
+SPECIALIZE_ASSIGN(float_int, float, unsigned int)
+SPECIALIZE_ASSIGN(float_int, float, unsigned long)
+SPECIALIZE_ASSIGN(float_int, float, unsigned long long)
+SPECIALIZE_ASSIGN(float_mpz, float, mpz_class)
+SPECIALIZE_ASSIGN(float_mpq, float, mpq_class)
+SPECIALIZE_COPY(generic, float)
+SPECIALIZE_IS_INT(float, float)
+SPECIALIZE_ASSIGN(float_minf, float, Minus_Infinity)
+SPECIALIZE_ASSIGN(float_pinf, float, Plus_Infinity)
+SPECIALIZE_ASSIGN(float_nan, float, Not_A_Number)
+SPECIALIZE_NEG(float, float, float)
+SPECIALIZE_ABS(float, float, float)
+SPECIALIZE_ADD(float, float, float, float)
+SPECIALIZE_SUB(float, float, float, float)
+SPECIALIZE_MUL(float, float, float, float)
+SPECIALIZE_DIV(float, float, float, float)
+SPECIALIZE_REM(float, float, float, float)
+SPECIALIZE_MUL2EXP(float, float, float)
+SPECIALIZE_DIV2EXP(float, float, float)
+SPECIALIZE_SQRT(float, float, float)
+SPECIALIZE_GCD(exact, float, float, float)
+SPECIALIZE_GCDEXT(exact, float, float, float, float, float)
+SPECIALIZE_LCM(gcd_exact, float, float, float)
+SPECIALIZE_SGN(float, float)
+SPECIALIZE_CMP(float, float, float)
+SPECIALIZE_ADD_MUL(float, float, float, float)
+SPECIALIZE_SUB_MUL(float, float, float, float)
+SPECIALIZE_INPUT(generic, float)
+SPECIALIZE_OUTPUT(float, float)
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_CLASSIFY(float, double)
+SPECIALIZE_IS_NAN(float, double)
+SPECIALIZE_IS_MINF(float, double)
+SPECIALIZE_IS_PINF(float, double)
+SPECIALIZE_SET_SPECIAL(float, double)
+SPECIALIZE_ASSIGN(float_int, double, signed char)
+SPECIALIZE_ASSIGN(float_int, double, signed short)
+SPECIALIZE_ASSIGN(float_int, double, signed int)
+SPECIALIZE_ASSIGN(float_int, double, signed long)
+SPECIALIZE_ASSIGN(float_int, double, signed long long)
+SPECIALIZE_ASSIGN(float_int, double, unsigned char)
+SPECIALIZE_ASSIGN(float_int, double, unsigned short)
+SPECIALIZE_ASSIGN(float_int, double, unsigned int)
+SPECIALIZE_ASSIGN(float_int, double, unsigned long)
+SPECIALIZE_ASSIGN(float_int, double, unsigned long long)
+SPECIALIZE_ASSIGN(float_mpz, double, mpz_class)
+SPECIALIZE_ASSIGN(float_mpq, double, mpq_class)
+SPECIALIZE_COPY(generic, double)
+SPECIALIZE_IS_INT(float, double)
+SPECIALIZE_ASSIGN(float_minf, double, Minus_Infinity)
+SPECIALIZE_ASSIGN(float_pinf, double, Plus_Infinity)
+SPECIALIZE_ASSIGN(float_nan, double, Not_A_Number)
+SPECIALIZE_NEG(float, double, double)
+SPECIALIZE_ABS(float, double, double)
+SPECIALIZE_ADD(float, double, double, double)
+SPECIALIZE_SUB(float, double, double, double)
+SPECIALIZE_MUL(float, double, double, double)
+SPECIALIZE_DIV(float, double, double, double)
+SPECIALIZE_REM(float, double, double, double)
+SPECIALIZE_MUL2EXP(float, double, double)
+SPECIALIZE_DIV2EXP(float, double, double)
+SPECIALIZE_SQRT(float, double, double)
+SPECIALIZE_GCD(exact, double, double, double)
+SPECIALIZE_GCDEXT(exact, double, double, double, double, double)
+SPECIALIZE_LCM(gcd_exact, double, double, double)
+SPECIALIZE_SGN(float, double)
+SPECIALIZE_CMP(float, double, double)
+SPECIALIZE_ADD_MUL(float, double, double, double)
+SPECIALIZE_SUB_MUL(float, double, double, double)
+SPECIALIZE_INPUT(generic, double)
+SPECIALIZE_OUTPUT(float, double)
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_CLASSIFY(float, long double)
+SPECIALIZE_IS_NAN(float, long double)
+SPECIALIZE_IS_MINF(float, long double)
+SPECIALIZE_IS_PINF(float, long double)
+SPECIALIZE_SET_SPECIAL(float, long double)
+SPECIALIZE_ASSIGN(float_int, long double, signed char)
+SPECIALIZE_ASSIGN(float_int, long double, signed short)
+SPECIALIZE_ASSIGN(float_int, long double, signed int)
+SPECIALIZE_ASSIGN(float_int, long double, signed long)
+SPECIALIZE_ASSIGN(float_int, long double, signed long long)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned char)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned short)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned int)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned long)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned long long)
+SPECIALIZE_ASSIGN(float_mpz, long double, mpz_class)
+SPECIALIZE_ASSIGN(float_mpq, long double, mpq_class)
+SPECIALIZE_COPY(generic, long double)
+SPECIALIZE_IS_INT(float, long double)
+SPECIALIZE_ASSIGN(float_minf, long double, Minus_Infinity)
+SPECIALIZE_ASSIGN(float_pinf, long double, Plus_Infinity)
+SPECIALIZE_ASSIGN(float_nan, long double, Not_A_Number)
+SPECIALIZE_NEG(float, long double, long double)
+SPECIALIZE_ABS(float, long double, long double)
+SPECIALIZE_ADD(float, long double, long double, long double)
+SPECIALIZE_SUB(float, long double, long double, long double)
+SPECIALIZE_MUL(float, long double, long double, long double)
+SPECIALIZE_DIV(float, long double, long double, long double)
+SPECIALIZE_REM(float, long double, long double, long double)
+SPECIALIZE_MUL2EXP(float, long double, long double)
+SPECIALIZE_DIV2EXP(float, long double, long double)
+SPECIALIZE_SQRT(float, long double, long double)
+SPECIALIZE_GCD(exact, long double, long double, long double)
+SPECIALIZE_GCDEXT(exact, long double, long double, long double,
+		  long double, long double)
+SPECIALIZE_LCM(gcd_exact, long double, long double, long double)
+SPECIALIZE_SGN(float, long double)
+SPECIALIZE_CMP(float, long double, long double)
+SPECIALIZE_ADD_MUL(float, long double, long double, long double)
+SPECIALIZE_SUB_MUL(float, long double, long double, long double)
+SPECIALIZE_INPUT(generic, long double)
+SPECIALIZE_OUTPUT(float, long double)
+#endif
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/checked_mpz.inlines.hh line 1
+/* Specialized "checked" functions for GMP's mpz_class numbers.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+round_lt_mpz(mpz_class& to, Rounding_Dir dir) {
+  if (dir == ROUND_DOWN) {
+    --to;
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy>
+inline Result
+round_gt_mpz(mpz_class& to, Rounding_Dir dir) {
+  if (dir == ROUND_UP) {
+    ++to;
+    return V_LT;
+  }
+  return V_GT;
+}
+
+// FIXME: change this when Autoconf will support AC_C_TYPEOF.
+#ifdef __GNUC__
+//! Type of the _mp_size field of GMP's __mpz_struct.
+typedef __typeof__(__mpz_struct()._mp_size) mp_size_field_t;
+#else
+//! This is assumed to be the type of the _mp_size field of GMP's __mpz_struct.
+typedef int mp_size_field_t;
+#endif
+
+inline mp_size_field_t
+get_mp_size(const mpz_class &v) {
+  return v.get_mpz_t()->_mp_size;
+}
+
+inline void
+set_mp_size(mpz_class &v, mp_size_field_t size) {
+  v.get_mpz_t()->_mp_size = size;
+}
+
+template <typename Policy>
+inline Result
+classify_mpz(const mpz_class& v, bool nan, bool inf, bool sign) {
+  if (Policy::handle_nan || Policy::handle_infinity) {
+    mp_size_field_t s = get_mp_size(v);
+    if (Policy::handle_nan
+	&& (nan || sign)
+	&& s == Limits<mp_size_field_t>::min + 1)
+      return VC_NAN;
+    if (!inf && !sign)
+      return VC_NORMAL;
+    if (Policy::handle_infinity) {
+      if (s == Limits<mp_size_field_t>::min)
+	return inf ? VC_MINUS_INFINITY : V_LT;
+      if (s == Limits<mp_size_field_t>::max)
+	return inf ? VC_PLUS_INFINITY : V_GT;
+    }
+  }
+  if (sign)
+    return sgn<Policy>(v);
+  return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpz(const mpz_class& v) {
+  return Policy::handle_nan
+    && get_mp_size(v) == Limits<mp_size_field_t>::min + 1;
+}
+
+SPECIALIZE_IS_NAN(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpz(const mpz_class& v) {
+  return Policy::handle_infinity
+    && get_mp_size(v) == Limits<mp_size_field_t>::min;
+}
+
+SPECIALIZE_IS_MINF(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpz(const mpz_class& v) {
+  return Policy::handle_infinity
+    && get_mp_size(v) == Limits<mp_size_field_t>::max;
+}
+
+SPECIALIZE_IS_PINF(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_int_mpz(const mpz_class& v) {
+  return !is_nan<Policy>(v);
+}
+
+SPECIALIZE_IS_INT(mpz, mpz_class)
+
+template <typename Policy>
+inline Result
+set_special_mpz(mpz_class& v, Result r) {
+  Result c = classify(r);
+  if (Policy::handle_nan && c == VC_NAN)
+    set_mp_size(v, Limits<mp_size_field_t>::min + 1);
+  else if (Policy::handle_infinity) {
+    switch (c) {
+    case VC_MINUS_INFINITY:
+      set_mp_size(v, Limits<mp_size_field_t>::min);
+      break;
+    case VC_PLUS_INFINITY:
+      set_mp_size(v, Limits<mp_size_field_t>::max);
+      break;
+    default:
+      break;
+    }
+  }
+  return r;
+}
+
+SPECIALIZE_SET_SPECIAL(mpz, mpz_class)
+
+template <typename Policy>
+inline void
+copy_mpz(mpz_class& to, const mpz_class& from) {
+  if (is_nan_mpz<Policy>(from) ||
+      is_minf_mpz<Policy>(from) || is_pinf_mpz<Policy>(from))
+    set_mp_size(to, get_mp_size(from));
+  else
+    to = from;
+}
+
+SPECIALIZE_COPY(mpz, mpz_class)
+
+template <typename Policy, typename From>
+inline Result
+construct_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+    new (&to) mpz_class(from);
+    return V_EQ;
+}
+
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed char)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed short)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed int)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed long)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned char)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned short)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned int)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+    to = static_cast<signed long>(from);
+    return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed char)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed short)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed int)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed long)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned char)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned short)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned int)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpz_signed_int(mpz_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(signed long))
+    to = static_cast<signed long>(from);
+  else {
+    mpz_ptr m = to.get_mpz_t();
+    if (from >= 0)
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+    else {
+      From n = -from;
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+      mpz_neg(m, m);
+    }
+  }
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpz_signed_int, mpz_class, signed long long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpz_unsigned_int(mpz_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(unsigned long))
+    to = static_cast<unsigned long>(from);
+  else
+    mpz_import(to.get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpz_unsigned_int, mpz_class, unsigned long long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) {
+  if (dir == ROUND_IGNORE) {
+    to = from;
+    return V_LGE;
+  }
+  From n = rint(from);
+  to = n;
+  if (from < n)
+    return round_lt_mpz<Policy>(to, dir);
+  else if (from > n)
+    return round_gt_mpz<Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpz_float, mpz_class, float)
+SPECIALIZE_ASSIGN(mpz_float, mpz_class, double)
+
+template <typename Policy>
+inline Result
+assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) {
+  if (dir == ROUND_IGNORE) {
+    to = from;
+    return V_LGE;
+  }
+  mpz_srcptr n = from.get_num().get_mpz_t();
+  mpz_srcptr d = from.get_den().get_mpz_t();
+  if (dir == ROUND_DOWN) {
+    mpz_fdiv_q(to.get_mpz_t(), n, d);
+    return mpz_divisible_p(n, d) ? V_EQ : V_GT;
+  }
+  else {
+    assert(dir == ROUND_UP);
+    mpz_cdiv_q(to.get_mpz_t(), n, d);
+    return mpz_divisible_p(n, d) ? V_EQ : V_LT;
+  }
+}
+
+SPECIALIZE_ASSIGN(mpz_mpq, mpz_class, mpq_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_mp_minf(To& to, const Minus_Infinity&, Rounding_Dir) {
+  if (Policy::handle_infinity) {
+    set_special<Policy>(to, VC_MINUS_INFINITY);
+    return V_EQ;
+  }
+  return VC_MINUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_mp_pinf(To& to, const Plus_Infinity&, Rounding_Dir) {
+  if (Policy::handle_infinity) {
+    set_special<Policy>(to, VC_PLUS_INFINITY);
+    return V_EQ;
+  }
+  return VC_PLUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_mp_nan(To& to, const Not_A_Number&, Rounding_Dir) {
+  if (Policy::handle_nan) {
+    set_special<Policy>(to, VC_NAN);
+    return V_EQ;
+  }
+  return VC_NAN;
+}
+
+SPECIALIZE_ASSIGN(mp_minf, mpz_class, Minus_Infinity)
+SPECIALIZE_ASSIGN(mp_pinf, mpz_class, Plus_Infinity)
+SPECIALIZE_ASSIGN(mp_nan, mpz_class, Not_A_Number)
+SPECIALIZE_ASSIGN(mp_minf, mpq_class, Minus_Infinity)
+SPECIALIZE_ASSIGN(mp_pinf, mpq_class, Plus_Infinity)
+SPECIALIZE_ASSIGN(mp_nan, mpq_class, Not_A_Number)
+
+template <typename Policy>
+inline Result
+neg_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+  mpz_neg(to.get_mpz_t(), from.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_NEG(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+add_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x + y;
+  return V_EQ;
+}
+
+SPECIALIZE_ADD(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+sub_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x - y;
+  return V_EQ;
+}
+
+SPECIALIZE_SUB(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x * y;
+  return V_EQ;
+}
+
+SPECIALIZE_MUL(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+div_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_div_zero, ::sgn(y) == 0))
+    return set_special<Policy>(to, V_DIV_ZERO);
+  mpz_srcptr n = x.get_mpz_t();
+  mpz_srcptr d = y.get_mpz_t();
+  if (dir == ROUND_IGNORE) {
+    mpz_divexact(to.get_mpz_t(), n, d);
+    return V_LGE;
+  }
+  if (dir == ROUND_DOWN) {
+    mpz_fdiv_q(to.get_mpz_t(), n, d);
+    return mpz_divisible_p(n, d) ? V_EQ : V_GT;
+  }
+  else {
+    assert(dir == ROUND_UP);
+    mpz_cdiv_q(to.get_mpz_t(), n, d);
+    return mpz_divisible_p(n, d) ? V_EQ : V_LT;
+  }
+}
+
+SPECIALIZE_DIV(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+rem_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  if (CHECK_P(Policy::check_div_zero, ::sgn(y) == 0))
+    return set_special<Policy>(to, V_MOD_ZERO);
+  to = x % y;
+  return V_EQ;
+}
+
+SPECIALIZE_REM(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+mul2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<Policy>(to, x, -exp, dir);
+  mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+  return V_EQ;
+}
+
+SPECIALIZE_MUL2EXP(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+div2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<Policy>(to, x, -exp, dir);
+  mpz_srcptr n = x.get_mpz_t();
+  if (dir == ROUND_IGNORE) {
+    mpz_tdiv_q_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+    return V_LGE;
+  }
+  if (dir == ROUND_DOWN) {
+    mpz_fdiv_q_2exp(to.get_mpz_t(), n, exp);
+    return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_GT;
+  }
+  else {
+    assert(dir == ROUND_UP);
+    mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp);
+    return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_LT;
+  }
+}
+
+SPECIALIZE_DIV2EXP(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+abs_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+  to = abs(from);
+  return V_EQ;
+}
+
+SPECIALIZE_ABS(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+add_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	    Rounding_Dir) {
+  mpz_addmul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_ADD_MUL(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+sub_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	    Rounding_Dir) {
+  mpz_submul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_SUB_MUL(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+gcd_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  mpz_gcd(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_GCD(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+gcdext_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+	   mpz_class& s, mpz_class& t, Rounding_Dir) {
+  mpz_gcdext(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t(),
+	     s.get_mpz_t(), t.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_GCDEXT(mpz, mpz_class, mpz_class, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+lcm_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  mpz_lcm(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+SPECIALIZE_LCM(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+sqrt_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_sqrt_neg, from < 0))
+    return set_special<Policy>(to, V_SQRT_NEG);
+  if (dir == ROUND_IGNORE) {
+    to = sqrt(from);
+    return V_GE;
+  }
+  mpz_class r;
+  mpz_sqrtrem(to.get_mpz_t(), r.get_mpz_t(), from.get_mpz_t());
+  if (r == 0)
+    return V_EQ;
+  return round_gt_mpz<Policy>(to, dir);
+}
+
+SPECIALIZE_SQRT(mpz, mpz_class, mpz_class)
+
+template <typename Policy, typename Type>
+inline Result
+sgn_mp(const Type& x) {
+  int i = ::sgn(x);
+  return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
+}
+
+SPECIALIZE_SGN(mp, mpz_class)
+SPECIALIZE_SGN(mp, mpq_class)
+
+template <typename Policy, typename Type>
+inline Result
+cmp_mp(const Type& x, const Type& y) {
+  int i = ::cmp(x, y);
+  return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
+}
+
+SPECIALIZE_CMP(mp, mpz_class, mpz_class)
+SPECIALIZE_CMP(mp, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+output_mpz(std::ostream& os, const mpz_class& from, const Numeric_Format&,
+	   Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+SPECIALIZE_INPUT(generic, mpz_class)
+SPECIALIZE_OUTPUT(mpz, mpz_class)
+
+inline memory_size_type
+external_memory_in_bytes(const mpz_class& x) {
+  return x.get_mpz_t()[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/checked_mpq.inlines.hh line 1
+/* Specialized "checked" functions for GMP's mpq_class numbers.
+*/
+
+
+#include <sstream>
+#include <climits>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+classify_mpq(const mpq_class& v, bool nan, bool inf, bool sign) {
+  if ((Policy::handle_nan || Policy::handle_infinity)
+      && ::sgn(v.get_den()) == 0) {
+    int s = ::sgn(v.get_num());
+    if (Policy::handle_nan && (nan || sign) && s == 0)
+      return VC_NAN;
+    if (!inf && !sign)
+      return VC_NORMAL;
+    if (Policy::handle_infinity) {
+      if (s < 0)
+	return inf ? VC_MINUS_INFINITY : V_LT;
+      if (s > 0)
+	return inf ? VC_PLUS_INFINITY : V_GT;
+    }
+  }
+  if (sign)
+    return sgn<Policy>(v);
+  return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpq(const mpq_class& v) {
+  return Policy::handle_nan
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) == 0;
+}
+
+SPECIALIZE_IS_NAN(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpq(const mpq_class& v) {
+  return Policy::handle_infinity
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) < 0;
+}
+
+SPECIALIZE_IS_MINF(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpq(const mpq_class& v) {
+  return Policy::handle_infinity
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) > 0;
+}
+
+SPECIALIZE_IS_PINF(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_int_mpq(const mpq_class& v) {
+  return !is_nan<Policy>(v) && v.get_den() == 1;
+}
+
+SPECIALIZE_IS_INT(mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+set_special_mpq(mpq_class& v, Result r) {
+  Result c = classify(r);
+  if (Policy::handle_nan && c == VC_NAN) {
+    v.get_num() = 0;
+    v.get_den() = 0;
+  }
+  else if (Policy::handle_infinity) {
+    switch (c) {
+    case VC_MINUS_INFINITY:
+      v.get_num() = -1;
+      v.get_den() = 0;
+      break;
+    case VC_PLUS_INFINITY:
+      v.get_num() = 1;
+      v.get_den() = 0;
+      break;
+    default:
+      break;
+    }
+  }
+  return r;
+}
+
+SPECIALIZE_SET_SPECIAL(mpq, mpq_class)
+
+SPECIALIZE_COPY(generic, mpq_class)
+
+template <typename Policy, typename From>
+inline Result
+construct_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+  new (&to) mpq_class(from);
+  return V_EQ;
+}
+
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, mpz_class)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed char)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed short)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed int)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed long)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned char)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned short)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned int)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned long)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, float)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, double)
+
+template <typename Policy, typename From>
+inline Result
+construct_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
+  // FIXME: this is an incredibly inefficient implementation!
+  new (&to) mpq_class;
+  std::stringstream ss;
+  output_float<Policy, long double>(ss, from, Numeric_Format(), dir);
+  return input_mpq(to, ss);
+}
+
+SPECIALIZE_CONSTRUCT(mpq_long_double, mpq_class, long double)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+  to = from;
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, mpz_class)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed char)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed short)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed int)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed long)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned char)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned short)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned int)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned long)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, float)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, double)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpq_signed_int(mpq_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(signed long))
+    to = static_cast<signed long>(from);
+  else {
+    mpz_ptr m = to.get_num().get_mpz_t();
+    if (from >= 0)
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+    else {
+      From n = -from;
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+      mpz_neg(m, m);
+    }
+    to.get_den() = 1;
+  }
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpq_signed_int, mpq_class, signed long long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpq_unsigned_int(mpq_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(unsigned long))
+    to = static_cast<unsigned long>(from);
+  else {
+    mpz_import(to.get_num().get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+    to.get_den() = 1;
+  }
+  return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpq_unsigned_int, mpq_class, unsigned long long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
+  // FIXME: this is an incredibly inefficient implementation!
+  std::stringstream ss;
+  output_float<Policy, long double>(ss, from, Numeric_Format(), dir);
+  return input_mpq(to, ss);
+}
+
+SPECIALIZE_ASSIGN(mpq_long_double, mpq_class, long double)
+
+template <typename Policy>
+inline Result
+neg_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpq_neg(to.get_mpq_t(), from.get_mpq_t());
+  return V_EQ;
+}
+
+SPECIALIZE_NEG(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+add_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x + y;
+  return V_EQ;
+}
+
+SPECIALIZE_ADD(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+sub_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x - y;
+  return V_EQ;
+}
+
+SPECIALIZE_SUB(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x * y;
+  return V_EQ;
+}
+
+SPECIALIZE_MUL(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+div_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  if (CHECK_P(Policy::check_div_zero, sgn(y) == 0))
+    return set_special<Policy>(to, V_DIV_ZERO);
+  to = x / y;
+  return V_EQ;
+}
+
+SPECIALIZE_DIV(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+rem_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  if (CHECK_P(Policy::check_div_zero, sgn(y) == 0))
+    return set_special<Policy>(to, V_MOD_ZERO);
+  to = x / y;
+  to.get_num() %= to.get_den();
+  return V_EQ;
+}
+
+SPECIALIZE_REM(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+mul2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return div2exp<Policy>(to, x, -exp, dir);
+  mpz_mul_2exp(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), exp);
+  to.get_den() = x.get_den();
+  to.canonicalize();
+  return V_EQ;
+}
+
+SPECIALIZE_MUL2EXP(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+div2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
+  if (exp < 0)
+    return mul2exp<Policy>(to, x, -exp, dir);
+  to.get_num() = x.get_num();
+  mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+  to.canonicalize();
+  return V_EQ;
+}
+
+SPECIALIZE_DIV2EXP(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+abs_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  to = abs(from);
+  return V_EQ;
+}
+
+SPECIALIZE_ABS(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+add_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+	    Rounding_Dir) {
+  to += x * y;
+  return V_EQ;
+}
+
+SPECIALIZE_ADD_MUL(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+sub_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+	    Rounding_Dir) {
+  to -= x * y;
+  return V_EQ;
+}
+
+SPECIALIZE_SUB_MUL(mpq, mpq_class, mpq_class, mpq_class)
+
+extern unsigned long rational_sqrt_precision_parameter;
+
+template <typename Policy>
+inline Result
+sqrt_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir dir) {
+  if (CHECK_P(Policy::check_sqrt_neg, from < 0))
+    return set_special<Policy>(to, V_SQRT_NEG);
+  const unsigned long k = rational_sqrt_precision_parameter;
+  mpz_class& to_num = to.get_num();
+  mul2exp<Policy>(to_num, from.get_num(), 2*k, dir);
+  Result rdiv = div<Policy>(to_num, to_num, from.get_den(), dir);
+  Result rsqrt = sqrt<Policy>(to_num, to_num, dir);
+  mpz_class& to_den = to.get_den();
+  to_den = 1;
+  mul2exp<Policy>(to_den, to_den, k, dir);
+  to.canonicalize();
+  return rdiv != V_EQ ? rdiv : rsqrt;
+}
+
+SPECIALIZE_SQRT(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+input_mpq(mpq_class& to, std::istream& is, Rounding_Dir dir) {
+  Result r = input_mpq(to, is);
+  if (r == VC_MINUS_INFINITY)
+    return assign<Policy>(to, MINUS_INFINITY, dir);
+  if (r == VC_PLUS_INFINITY)
+    return assign<Policy>(to, PLUS_INFINITY, dir);
+  return set_special<Policy>(to, r);
+}
+
+template <typename Policy>
+inline Result
+output_mpq(std::ostream& os,
+	   const mpq_class& from,
+	   const Numeric_Format&,
+	   Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+SPECIALIZE_INPUT(mpq, mpq_class)
+SPECIALIZE_OUTPUT(mpq, mpq_class)
+
+inline memory_size_type
+external_memory_in_bytes(const mpq_class& x) {
+  return external_memory_in_bytes(x.get_num())
+    + external_memory_in_bytes(x.get_den());
+}
+
+} // namespace Checked
+
+//! Returns the precision parameter used for rational square root calculations.
+inline unsigned
+rational_sqrt_precision_parameter() {
+  return Checked::rational_sqrt_precision_parameter;
+}
+
+//! Sets the precision parameter used for rational square root calculations.
+/*!
+  If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+  precision parameter used for rational square root calculations to \p p.
+
+  \exception std::invalid_argument
+  Thrown if \p p is greater than <CODE>INT_MAX</CODE>.
+*/
+inline void
+set_rational_sqrt_precision_parameter(const unsigned p) {
+  if (p <= INT_MAX)
+    Checked::rational_sqrt_precision_parameter = p;
+  else
+    throw std::invalid_argument("PPL::set_rational_sqrt_precision_parameter(p)"
+				" with p > INT_MAX");
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/checked_ext.inlines.hh line 1
+/* Checked extended arithmetic functions.
+*/
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#define handle_ext_natively(T) (Float<T>::fpu_related)
+
+template <typename Policy, typename Type>
+inline Result
+sgn_ext(const Type& x) {
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x)))
+    return VC_NAN;
+  else if (is_minf<Policy>(x))
+    return V_LT;
+  else if (is_pinf<Policy>(x))
+    return V_GT;
+  else
+    return sgn<Policy>(x);
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+construct_ext(To& to, const From& from, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(from)))
+    return construct<To_Policy>(to, NOT_A_NUMBER, dir);
+  else if (is_minf<From_Policy>(from))
+    return construct<To_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return construct<To_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return construct<To_Policy>(to, from, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+assign_ext(To& to, const From& from, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(from)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(from))
+    return assign<To_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return assign<To_Policy>(to, from, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+neg_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy>(to, MINUS_INFINITY, dir);
+  else {
+  native:
+    return neg<To_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+abs_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x) || is_pinf<From_Policy>(x))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return abs<To_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+add_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<From2_Policy>(y)))
+      goto inf_add_inf;
+    else
+      goto minf;
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<From2_Policy>(y))) {
+    inf_add_inf:
+      return set_special<To_Policy>(to, V_INF_ADD_INF);
+    }
+    else
+      goto pinf;
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+    minf:
+      return assign<To_Policy>(to, MINUS_INFINITY, dir);
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+    pinf:
+      return assign<To_Policy>(to, PLUS_INFINITY, dir);
+    }
+    else {
+    native:
+      return add<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+sub_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<From2_Policy>(y)))
+      goto inf_sub_inf;
+    else
+      goto minf;
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<From2_Policy>(y))) {
+    inf_sub_inf:
+      return set_special<To_Policy>(to, V_INF_SUB_INF);
+    }
+    else
+      goto pinf;
+  }
+  else {
+    if (is_pinf<From2_Policy>(y)) {
+    minf:
+      return assign<To_Policy>(to, MINUS_INFINITY, dir);
+    }
+    else if (is_minf<From2_Policy>(y)) {
+    pinf:
+      return assign<To_Policy>(to, PLUS_INFINITY, dir);
+    }
+    else {
+    native:
+      return sub<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto pinf;
+    case V_GT:
+      goto minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto minf;
+    case V_GT:
+      goto pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+	goto pinf;
+      case V_GT:
+	goto minf;
+      default:
+	goto inf_mul_zero;
+      }
+    } else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+      minf:
+	return assign<To_Policy>(to, MINUS_INFINITY, dir);
+      case V_GT:
+      pinf:
+	return assign<To_Policy>(to, PLUS_INFINITY, dir);
+	goto pinf;
+      default:
+      inf_mul_zero:
+	assert(To_Policy::check_inf_mul_zero);
+	return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+    native:
+      return mul<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(To_Policy::check_nan_args, is_nan<To_Policy>(to))
+      || CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto a_pinf;
+    case V_GT:
+      goto a_minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto a_minf;
+    case V_GT:
+      goto a_pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+	goto a_pinf;
+      case V_GT:
+	goto a_minf;
+      default:
+	goto inf_mul_zero;
+      }
+    } else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+      a_minf:
+	if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<To_Policy>(to)))
+	  goto inf_add_inf;
+	else
+	  goto minf;
+      case V_GT:
+      a_pinf:
+	if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<To_Policy>(to))) {
+	inf_add_inf:
+	  return set_special<To_Policy>(to, V_INF_ADD_INF);
+	}
+	else
+	  goto pinf;
+      default:
+      inf_mul_zero:
+	assert(To_Policy::check_inf_mul_zero);
+	return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+      if (is_minf<To_Policy>(to)) {
+      minf:
+	return assign<To_Policy>(to, MINUS_INFINITY, dir);
+      }
+      if (is_pinf<To_Policy>(to)) {
+      pinf:
+	return assign<To_Policy>(to, PLUS_INFINITY, dir);
+      }
+    native:
+      return add_mul<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(To_Policy::check_nan_args, is_nan<To_Policy>(to))
+      || CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto a_pinf;
+    case V_GT:
+      goto a_minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case V_LT:
+      goto a_minf;
+    case V_GT:
+      goto a_pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+	goto a_pinf;
+      case V_GT:
+	goto a_minf;
+      default:
+	goto inf_mul_zero;
+      }
+    } else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case V_LT:
+      a_minf:
+	if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<To_Policy>(to)))
+	  goto inf_sub_inf;
+	else
+	  goto pinf;
+      case V_GT:
+      a_pinf:
+	if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<To_Policy>(to))) {
+	inf_sub_inf:
+	  return set_special<To_Policy>(to, V_INF_SUB_INF);
+	}
+	else
+	  goto minf;
+      default:
+      inf_mul_zero:
+	assert(To_Policy::check_inf_mul_zero);
+	return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+      if (is_minf<To_Policy>(to)) {
+      minf:
+	return assign<To_Policy>(to, MINUS_INFINITY, dir);
+      }
+      if (is_pinf<To_Policy>(to)) {
+      pinf:
+	return assign<To_Policy>(to, PLUS_INFINITY, dir);
+      }
+    native:
+      return sub_mul<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+		|| is_pinf<From2_Policy>(y)))
+      goto inf_div_inf;
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case V_LT:
+	goto pinf;
+      case V_GT:
+	goto minf;
+      default:
+	goto div_zero;
+      }
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+		|| is_pinf<From2_Policy>(y))) {
+    inf_div_inf:
+      return set_special<To_Policy>(to, V_INF_DIV_INF);
+    }
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case V_LT:
+      minf:
+	return assign<To_Policy>(to, MINUS_INFINITY, dir);
+      case V_GT:
+      pinf:
+	return assign<To_Policy>(to, PLUS_INFINITY, dir);
+      default:
+      div_zero:
+	assert(To_Policy::check_div_zero);
+	return set_special<To_Policy>(to, V_DIV_ZERO);
+      }
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = 0;
+      return V_EQ;
+    }
+    else {
+    native:
+      return div<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+rem_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (handle_ext_natively(To)
+      && handle_ext_natively(From1)
+      && handle_ext_natively(From2))
+    goto native;
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From1_Policy>(x)
+		   || is_pinf<From1_Policy>(x)))
+    return set_special<To_Policy>(to, V_INF_MOD);
+  else {
+    if (is_minf<From1_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = x;
+      return V_EQ;
+    }
+    else {
+    native:
+      return rem<To_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+mul2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return mul2exp<To_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+div2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return assign<To_Policy>(to, MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return div2exp<To_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+	  typename To, typename From>
+inline Result
+sqrt_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (handle_ext_natively(To) && handle_ext_natively(From))
+    goto native;
+  if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From_Policy>(x))
+    return set_special<To_Policy>(to, V_SQRT_NEG);
+  else if (is_pinf<From_Policy>(x))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else {
+  native:
+    return sqrt<To_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+gcd_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x))
+    return abs_ext<To_Policy, From2_Policy>(to, y, dir);
+  else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+    return abs_ext<To_Policy, From1_Policy>(to, x, dir);
+  else
+    return gcd<To_Policy>(to, x, y, dir);
+}
+
+template <typename To1_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To2_Policy, typename To3_Policy,
+	  typename To1, typename From1, typename From2, typename To2, typename To3>
+inline Result
+gcdext_ext(To1& to, const From1& x, const From2& y,
+	   To2& s, To3& t, Rounding_Dir dir) {
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To1_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)) {
+    s = 0;
+    t = y > 0 ? -1 : 1;
+    return abs_ext<To1_Policy, From2_Policy>(to, y, dir);
+  }
+  else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+    s = x > 0 ? -1 : 1;
+    t = 0;
+    return abs_ext<To1_Policy, From1_Policy>(to, x, dir);
+  }
+  else
+    return gcdext<To1_Policy>(to, x, y, s, t, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+	  typename To, typename From1, typename From2>
+inline Result
+lcm_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+      || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+    return set_special<To_Policy>(to, VC_NAN);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)
+	   || is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+    return assign<To_Policy>(to, PLUS_INFINITY, dir);
+  else
+    return lcm<To_Policy>(to, x, y, dir);
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline Result
+cmp_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return V_UNORD_COMP;
+  else if (is_minf<Policy1>(x))
+    return is_minf<Policy2>(y) ? V_EQ : V_LT;
+  else if (is_pinf<Policy1>(x))
+    return is_pinf<Policy2>(y) ? V_EQ : V_GT;
+  else {
+    if (is_minf<Policy2>(y))
+      return V_GT;
+    if (is_pinf<Policy2>(y))
+      return V_LT;
+  native:
+    return cmp<Policy1>(x, y);
+  }
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+lt_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return false;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return false;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return true;
+ native:
+  return x < y;
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+gt_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return false;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return false;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return true;
+ native:
+  return x > y;
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+le_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return false;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return true;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return false;
+ native:
+  return x <= y;
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+ge_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return false;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return true;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return false;
+ native:
+  return x >= y;
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+eq_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return false;
+  if (is_minf<Policy1>(x))
+    return is_minf<Policy2>(y);
+  if (is_pinf<Policy1>(x))
+    return is_pinf<Policy2>(y);
+ native:
+  return x == y;
+}
+
+template <typename Policy1, typename Policy2,
+	  typename Type1, typename Type2>
+inline bool
+ne_ext(const Type1& x, const Type2& y) {
+  if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+    goto native;
+  if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+      || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+    return true;
+  if (is_minf<Policy1>(x))
+    return !is_minf<Policy2>(y);
+  if (is_pinf<Policy1>(x))
+    return !is_pinf<Policy2>(y);
+ native:
+  return x != y;
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_ext(std::ostream& os, const Type& x,
+	   const Numeric_Format& format, Rounding_Dir dir) {
+  if (handle_ext_natively(Type))
+    goto native;
+  if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))) {
+    os << "nan";
+    return VC_NAN;
+  }
+  if (is_minf<Policy>(x)) {
+    os << "-inf";
+    return V_EQ;
+  }
+  if (is_pinf<Policy>(x)) {
+    os << "+inf";
+    return V_EQ;
+  }
+ native:
+  return output<Policy>(os, x, format, dir);
+}
+
+template <typename To_Policy, typename To>
+inline Result
+input_ext(To& to, std::istream& is, Rounding_Dir dir) {
+  return input<To_Policy>(to, is, dir);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+// Automatically generated from PPL source file ../src/checked.defs.hh line 391
+
+// Automatically generated from PPL source file ../src/Checked_Number.defs.hh line 28
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Checked_Number_Transparent_Policy {
+  //! Checks for overflowed result.
+  static const int check_overflow = 0;
+
+  //! Checks for attempts to add infinities with different sign.
+  static const int check_inf_add_inf = 0;
+
+  //! Checks for attempts to sub infinities with same sign.
+  static const int check_inf_sub_inf = 0;
+
+  //! Checks for attempts to mul infinities by zero.
+  static const int check_inf_mul_zero = 0;
+
+  //! Checks for attempts to divide by zero.
+  static const int check_div_zero = 0;
+
+  //! Checks for attempts to divide infinities.
+  static const int check_inf_div_inf = 0;
+
+  //! Checks for attempts to compute remainder of infinities.
+  static const int check_inf_mod = 0;
+
+  //! Checks for attempts to take the square root of a negative number.
+  static const int check_sqrt_neg = 0;
+
+  //! Handles not-a-number special value.
+  static const int handle_nan = 0;
+
+  //! Handles infinity special values.
+  static const int handle_infinity = 0;
+
+  //! Representation is identical to primitive.
+  static const int convertible = 1;
+
+  //! Checks for FPU inexact result.
+  static const int fpu_check_inexact = 0;
+
+  //! Checks for NaN arguments
+  static const int check_nan_args = 0;
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Checked_Number_Default_Policy {
+  static const int check_overflow = 1;
+  static const int check_inf_add_inf = 0;
+  static const int check_inf_sub_inf = 0;
+  static const int check_inf_mul_zero = 0;
+  static const int check_div_zero = 0;
+  static const int check_inf_div_inf = 0;
+  static const int check_inf_mod = 0;
+  static const int check_sqrt_neg = 0;
+  static const int handle_nan = 0;
+  static const int handle_infinity = 0;
+  static const int convertible = 1;
+  static const int fpu_check_inexact = 0;
+  static const int check_nan_args = 1;
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Extended_Number_Policy {
+  static const int check_overflow = 1;
+  static const int check_inf_add_inf = 0;
+  static const int check_inf_sub_inf = 0;
+  static const int check_inf_mul_zero = 0;
+  static const int check_div_zero = 0;
+  static const int check_inf_div_inf = 0;
+  static const int check_inf_mod = 0;
+  static const int check_sqrt_neg = 0;
+  static const int handle_nan = 1;
+  static const int handle_infinity = 1;
+  // Don't uncomment the following.
+  // The compile time error on conversions is the expected behaviour.
+  // static const int convertible = 0;
+#ifdef DEBUG_ROUND_NOT_NEEDED
+  static const int fpu_check_inexact = 1;
+#else
+  static const int fpu_check_inexact = 0;
+#endif
+  static const int check_nan_args = 1;
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR_INF = ROUND_NOT_NEEDED;
+  static const Rounding_Dir ROUND_DEFAULT_ASSIGN_INF = ROUND_NOT_NEEDED;
+  // Don't uncomment the following.
+  // The compile time error is the expected behaviour.
+  // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_UP;
+  // static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_UP;
+  static void handle_result(Result r);
+};
+
+typedef Checked::Check_Overflow_Policy Default_To_Policy;
+typedef Checked_Number_Transparent_Policy Default_From_Policy;
+
+template <typename T>
+struct Native_Checked_From_Wrapper {
+  typedef Default_From_Policy Policy;
+  static const T& raw_value(const T& v) {
+    return v;
+  }
+};
+
+template <typename T, typename P>
+struct Native_Checked_From_Wrapper<Checked_Number<T, P> > {
+  typedef P Policy;
+  static const T& raw_value(const Checked_Number<T, P>& v) {
+    return v.raw_value();
+  }
+};
+
+template <typename T>
+struct Native_Checked_To_Wrapper {
+  typedef Default_To_Policy Policy;
+  static T& raw_value(T& v) {
+    return v;
+  }
+};
+
+template <typename T, typename P>
+struct Native_Checked_To_Wrapper<Checked_Number<T, P> > {
+  typedef P Policy;
+  static T& raw_value(Checked_Number<T, P>& v) {
+    return v.raw_value();
+  }
+};
+
+//! A wrapper for numeric types implementing a given policy.
+/*! \ingroup PPL_CXX_interface
+  The wrapper and related functions implement an interface which is common
+  to all kinds of coefficient types, therefore allowing for a uniform
+  coding style. This class also implements the policy encoded by the
+  second template parameter. The default policy is to perform the detection
+  of overflow errors.
+*/
+template <typename T, typename Policy>
+class Checked_Number {
+public:
+
+  //! \name Constructors
+  //@{
+
+  //! Default constructor.
+  Checked_Number();
+
+  //! Copy-constructor.
+  Checked_Number(const Checked_Number& y);
+
+  //! Direct initialization from a Checked_Number and rounding mode.
+  template <typename From, typename From_Policy>
+  Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed char and rounding mode.
+  Checked_Number(const signed char y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed short and rounding mode.
+  Checked_Number(const signed short y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed int and rounding mode.
+  Checked_Number(const signed int y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed long and rounding mode.
+  Checked_Number(const signed long y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed long long and rounding mode.
+  Checked_Number(const signed long long y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned char and rounding mode.
+  Checked_Number(const unsigned char y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned short and rounding mode.
+  Checked_Number(const unsigned short y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned int and rounding mode.
+  Checked_Number(const unsigned int y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned long and rounding mode.
+  Checked_Number(const unsigned long y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned long long and rounding mode.
+  Checked_Number(const unsigned long long y, Rounding_Dir dir);
+
+#if PPL_SUPPORTED_FLOAT
+  //! Direct initialization from a float and rounding mode.
+  Checked_Number(const float y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+  //! Direct initialization from a double and rounding mode.
+  Checked_Number(const double y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+  //! Direct initialization from a long double and rounding mode.
+  Checked_Number(const long double y, Rounding_Dir dir);
+#endif
+
+  //! Direct initialization from a rational and rounding mode.
+  Checked_Number(const mpq_class& y, Rounding_Dir dir);
+
+  //! Direct initialization from an unbounded integer and rounding mode.
+  Checked_Number(const mpz_class& y, Rounding_Dir dir);
+
+  //! Direct initialization from a C string and rounding mode.
+  Checked_Number(const char* y, Rounding_Dir dir);
+
+  //! Direct initialization from minus infinity and rounding mode.
+  Checked_Number(const Minus_Infinity& y, Rounding_Dir dir);
+
+  //! Direct initialization from plus infinity and rounding mode.
+  Checked_Number(const Plus_Infinity& y, Rounding_Dir dir);
+
+  //! Direct initialization from NAN and rounding mode.
+  Checked_Number(const Not_A_Number& y, Rounding_Dir dir);
+
+  //! Direct initialization from a Checked_Number, default rounding mode.
+  template <typename From, typename From_Policy>
+  explicit Checked_Number(const Checked_Number<From, From_Policy>& y);
+
+  //! Direct initialization from a signed char, default rounding mode.
+  Checked_Number(const signed char y);
+
+  //! Direct initialization from a signed short, default rounding mode.
+  Checked_Number(const signed short y);
+
+  //! Direct initialization from a signed int, default rounding mode.
+  Checked_Number(const signed int y);
+
+  //! Direct initialization from a signed long, default rounding mode.
+  Checked_Number(const signed long y);
+
+  //! Direct initialization from a signed long long, default rounding mode.
+  Checked_Number(const signed long long y);
+
+  //! Direct initialization from an unsigned char, default rounding mode.
+  Checked_Number(const unsigned char y);
+
+  //! Direct initialization from an unsigned short, default rounding mode.
+  Checked_Number(const unsigned short y);
+
+  //! Direct initialization from an unsigned int, default rounding mode.
+  Checked_Number(const unsigned int y);
+
+  //! Direct initialization from an unsigned long, default rounding mode.
+  Checked_Number(const unsigned long y);
+
+  //! Direct initialization from an unsigned long long, default rounding mode.
+  Checked_Number(const unsigned long long y);
+
+  //! Direct initialization from a float, default rounding mode.
+  Checked_Number(const float y);
+
+  //! Direct initialization from a double, default rounding mode.
+  Checked_Number(const double y);
+
+  //! Direct initialization from a long double, default rounding mode.
+  Checked_Number(const long double y);
+
+  //! Direct initialization from a rational, default rounding mode.
+  Checked_Number(const mpq_class& y);
+
+  //! Direct initialization from an unbounded integer, default rounding mode.
+  Checked_Number(const mpz_class& y);
+
+  //! Direct initialization from a C string, default rounding mode.
+  Checked_Number(const char* y);
+
+  //! Direct initialization from minus infinity, default rounding mode.
+  Checked_Number(const Minus_Infinity& y);
+
+  //! Direct initialization from plus infinity, default rounding mode.
+  Checked_Number(const Plus_Infinity& y);
+
+  //! Direct initialization from NAN, default rounding mode.
+  Checked_Number(const Not_A_Number& y);
+
+  //@} // Constructors
+
+  //! \name Accessors and Conversions
+  //@{
+
+  //! Conversion operator: returns a copy of the underlying numeric value.
+  operator T() const;
+
+  //! Returns a reference to the underlying numeric value.
+  T& raw_value();
+
+  //! Returns a const reference to the underlying numeric value.
+  const T& raw_value() const;
+
+  //@} // Accessors and Conversions
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Classifies *this.
+  /*!
+    Returns the appropriate Result characterizing:
+    - whether \p *this is NAN,
+      if \p nan is <CODE>true</CODE>;
+    - whether \p *this is a (positive or negative) infinity,
+      if \p inf is <CODE>true</CODE>;
+    - the sign of \p *this,
+      if \p sign is <CODE>true</CODE>.
+  */
+  Result classify(bool nan = true, bool inf = true, bool sign = true) const;
+
+  //! \name Assignment Operators
+  //@{
+
+  //! Assignment operator.
+  Checked_Number& operator=(const Checked_Number& y);
+
+  //! Assignment operator.
+  template <typename From, typename From_Policy>
+  Checked_Number& operator=(const Checked_Number<From, From_Policy>& y);
+
+  //! Assignment operator.
+  template <typename From>
+  Checked_Number& operator=(const From& y);
+
+  //! Assignment operator.
+  Checked_Number& operator=(const Not_A_Number& y);
+
+  //! Assignment operator.
+  Checked_Number& operator=(const Minus_Infinity& y);
+
+  //! Assignment operator.
+  Checked_Number& operator=(const Plus_Infinity& y);
+
+  //! Add and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator+=(const Checked_Number<T, From_Policy>& y);
+
+  //! Add and assign operator.
+  Checked_Number& operator+=(const T& y);
+
+  //! Add and assign operator.
+  template <typename From, typename From_Policy>
+  Checked_Number& operator+=(const Checked_Number<From, From_Policy>& y);
+
+  template <typename From>
+  Checked_Number& operator+=(const From& y);
+
+  //! Subtract and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator-=(const Checked_Number<T, From_Policy>& y);
+
+  //! Subtract and assign operator.
+  Checked_Number& operator-=(const T& y);
+
+  //! Subtract and assign operator.
+  template <typename From, typename From_Policy>
+  Checked_Number& operator-=(const Checked_Number<From, From_Policy>& y);
+
+  //! Subtract and assign operator.
+  template <typename From>
+  Checked_Number& operator-=(const From& y);
+
+  //! Multiply and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator*=(const Checked_Number<T, From_Policy>& y);
+
+  //! Multiply and assign operator.
+  Checked_Number& operator*=(const T& y);
+  template <typename From, typename From_Policy>
+
+  //! Multiply and assign operator.
+  Checked_Number& operator*=(const Checked_Number<From, From_Policy>& y);
+
+  //! Multiply and assign operator.
+  template <typename From>
+  Checked_Number& operator*=(const From& y);
+
+  //! Divide and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator/=(const Checked_Number<T, From_Policy>& y);
+
+  //! Divide and assign operator.
+  Checked_Number& operator/=(const T& y);
+
+  //! Divide and assign operator.
+  template <typename From, typename From_Policy>
+  Checked_Number& operator/=(const Checked_Number<From, From_Policy>& y);
+
+  //! Divide and assign operator.
+  template <typename From>
+  Checked_Number& operator/=(const From& y);
+
+  //! Compute remainder and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator%=(const Checked_Number<T, From_Policy>& y);
+
+  //! Compute remainder and assign operator.
+  Checked_Number& operator%=(const T& y);
+
+  //! Compute remainder and assign operator.
+  template <typename From, typename From_Policy>
+  Checked_Number& operator%=(const Checked_Number<From, From_Policy>& y);
+
+  //! Compute remainder and assign operator.
+  template <typename From>
+  Checked_Number& operator%=(const From& y);
+
+  //@} // Assignment Operators
+
+
+  //! \name Increment and Decrement Operators
+  //@{
+
+  //! Pre-increment operator.
+  Checked_Number& operator++();
+
+  //! Post-increment operator.
+  Checked_Number  operator++(int);
+
+  //! Pre-decrement operator.
+  Checked_Number& operator--();
+
+  //! Post-decrement operator.
+  Checked_Number  operator--(int);
+
+  //@} // Increment and Decrement Operators
+
+private:
+  //! The underlying numeric value.
+  T v;
+};
+
+template <typename T, typename Policy>
+bool is_not_a_number(const Checked_Number<T, Policy>& x);
+template <typename T, typename Policy>
+bool is_minus_infinity(const Checked_Number<T, Policy>& x);
+template <typename T, typename Policy>
+bool is_plus_infinity(const Checked_Number<T, Policy>& x);
+
+template <typename To>
+Result assign_r(To& to, const Minus_Infinity& x, Rounding_Dir dir);
+template <typename To>
+Result assign_r(To& to, const Plus_Infinity& x, Rounding_Dir dir);
+template <typename To>
+Result assign_r(To& to, const Not_A_Number& x, Rounding_Dir dir);
+template <typename To>
+Result assign_r(To& to, const char* x, Rounding_Dir dir);
+template <typename To, typename To_Policy>
+Result assign_r(To& to, char* x, Rounding_Dir dir);
+
+#define FUNC1(name) \
+template <typename To, typename From> \
+Result name(To& to, const From& x, Rounding_Dir dir);
+
+FUNC1(assign_r)
+FUNC1(neg_assign_r)
+FUNC1(abs_assign_r)
+FUNC1(sqrt_assign_r)
+
+#undef FUNC1
+
+#define FUNC1(name) \
+template <typename To, typename From> \
+Result name(To& to, const From& x, int exp, Rounding_Dir dir);
+
+FUNC1(mul2exp_assign_r)
+FUNC1(div2exp_assign_r)
+
+#undef FUNC1
+
+#define FUNC2(name) \
+template <typename To, typename From1, typename From2> \
+Result name(To& to, const From1& x, const From2& y, Rounding_Dir dir);
+
+FUNC2(add_assign_r)
+FUNC2(sub_assign_r)
+FUNC2(mul_assign_r)
+FUNC2(div_assign_r)
+FUNC2(rem_assign_r)
+FUNC2(gcd_assign_r)
+FUNC2(lcm_assign_r)
+FUNC2(add_mul_assign_r)
+FUNC2(sub_mul_assign_r)
+
+#undef FUNC2
+
+#define FUNC4(name) \
+template <typename To1, typename From1, typename From2,		\
+	  typename To2, typename To3>				\
+Result name(To1& to, const From1& x, const From2& y,		\
+	    To2& s, To3& t, Rounding_Dir dir);
+
+FUNC4(gcdext_assign_r)
+
+#undef FUNC4
+
+//! Swaps \p *this with \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y);
+
+//! \name Accessor Functions
+//@{
+
+//! Returns a const reference to the underlying native integer value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+const T&
+raw_value(const Checked_Number<T, Policy>& x);
+
+//! Returns a reference to the underlying native integer value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+T&
+raw_value(Checked_Number<T, Policy>& x);
+
+//@} // Accessor Functions
+
+//! \name Memory Size Inspection Functions
+//@{
+
+//! Returns the total size in bytes of the memory occupied by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+size_t
+total_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//! Returns the size in bytes of the memory managed by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+size_t
+external_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//@} // Memory Size Inspection Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Unary plus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x);
+
+//! Unary minus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x its negation.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+add_mul_assign(Checked_Number<T, Policy>& x,
+	       const Checked_Number<T, Policy>& y,
+	       const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+sub_mul_assign(Checked_Number<T, Policy>& x,
+	       const Checked_Number<T, Policy>& y,
+	       const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcd_assign(Checked_Number<T, Policy>& x,
+	   const Checked_Number<T, Policy>& y,
+	   const Checked_Number<T, Policy>& z);
+
+/*! \brief
+  Assigns to \p x the greatest common divisor of \p y and \p z,
+  setting \p s and \p t such that s*y + t*z = x = gcd(y, z).
+*/
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcdext_assign(Checked_Number<T, Policy>& x,
+	      const Checked_Number<T, Policy>& y,
+	      const Checked_Number<T, Policy>& z,
+	      Checked_Number<T, Policy>& s,
+	      Checked_Number<T, Policy>& t);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+lcm_assign(Checked_Number<T, Policy>& x,
+	   const Checked_Number<T, Policy>& y,
+	   const Checked_Number<T, Policy>& z);
+
+/*! \brief
+  If \p z divides \p y, assigns to \p x the quotient of the integer
+  division of \p y and \p z.
+
+  \relates Checked_Number
+  The behavior is undefined if \p z does not divide \p y.
+*/
+template <typename T, typename Policy>
+void
+exact_div_assign(Checked_Number<T, Policy>& x,
+		 const Checked_Number<T, Policy>& y,
+		 const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void sqrt_assign(Checked_Number<T, Policy>& x,
+		 const Checked_Number<T, Policy>& y);
+
+//@} // Arithmetic Operators
+
+
+//! \name Relational Operators and Comparison Functions
+//@{
+
+//! Equality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+bool
+operator==(const Checked_Number<T1, Policy1>& x,
+	   const Checked_Number<T2, Policy2>& y);
+
+//! Disequality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+bool
+operator!=(const Checked_Number<T1, Policy1>& x,
+	   const Checked_Number<T2, Policy2>& y);
+
+//! Greater than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+bool
+operator>=(const Checked_Number<T1, Policy1>& x,
+	   const Checked_Number<T2, Policy2>& y);
+
+//! Greater than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+bool
+operator>(const Checked_Number<T1, Policy1>& x,
+	  const Checked_Number<T2, Policy2>& y);
+
+//! Less than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+bool
+operator<=(const Checked_Number<T1, Policy1>& x,
+	   const Checked_Number<T2, Policy2>& y);
+
+//! Less than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+bool
+operator<(const Checked_Number<T1, Policy1>& x,
+	  const Checked_Number<T2, Policy2>& y);
+
+/*! \brief
+  Returns \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether the value
+  of \p x is negative, zero or positive, respectively.
+
+  \relates Checked_Number
+*/
+template <typename T, typename Policy>
+int
+sgn(const Checked_Number<T, Policy>& x);
+
+/*! \brief
+  Returns a negative, zero or positive value depending on whether
+  \p x is lower than, equal to or greater than \p y, respectively.
+
+  \relates Checked_Number
+*/
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+int
+cmp(const Checked_Number<T1, Policy1>& x,
+    const Checked_Number<T2, Policy2>& y);
+
+//@} // Relational Operators and Comparison Functions
+
+//! \name Input-Output Operators
+//@{
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Result
+output(std::ostream& os,
+       const Checked_Number<T, Policy>& x,
+       const Numeric_Format& fmt,
+       Rounding_Dir dir);
+
+//! Output operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x);
+
+//! Input function.
+/*!
+  \relates Checked_Number
+
+  \param is
+  Input stream to read from;
+
+  \param x
+  Number (possibly extended) to assign to in case of successful reading;
+
+  \param dir
+  Rounding mode to be applied.
+
+  \return
+  Result of the input operation.  Success, success with imprecision,
+  overflow, parsing error: all possibilities are taken into account,
+  checked for, and properly reported.
+
+  This function attempts reading a (possibly extended) number from the given
+  stream \p is, possibly rounding as specified by \p dir, assigning the result
+  to \p x upon success, and returning the appropriate Result.
+
+  The input syntax allows the specification of:
+  - plain base-10 integer numbers as <CODE>34976098</CODE>,
+    <CODE>-77</CODE> and <CODE>+13</CODE>;
+  - base-10 integer numbers in scientific notation as <CODE>15e2</CODE>
+    and <CODE>15*^2</CODE> (both meaning \f$15 \cdot 10^2 = 1500\f$),
+    <CODE>9200e-2</CODE> and <CODE>-18*^+11111111111111111</CODE>;
+  - base-10 rational numbers in fraction notation as
+    <CODE>15/3</CODE> and <CODE>15/-3</CODE>;
+  - base-10 rational numbers in fraction/scientific notation as
+    <CODE>15/30e-1</CODE> (meaning \f$5\f$) and <CODE>15*^-3/29e2</CODE>
+    (meaning \f$3/580000\f$);
+  - base-10 rational numbers in floating point notation as
+    <CODE>71.3</CODE> (meaning \f$713/10\f$) and
+    <CODE>-0.123456</CODE> (meaning \f$-1929/15625\f$);
+  - base-10 rational numbers in floating point scientific notation as
+    <CODE>2.2e-1</CODE> (meaning \f$11/50\f$) and <CODE>-2.20001*^+3</CODE>
+    (meaning \f$-220001/100\f$);
+  - integers and rationals (in fractional, floating point and scientific
+    notations) specified by using Mathematica-style bases, in the range
+    from 2 to 36, as
+    <CODE>2^^11</CODE> (meaning \f$3\f$),
+    <CODE>36^^z</CODE> (meaning \f$35\f$),
+    <CODE>36^^xyz</CODE> (meaning \f$44027\f$),
+    <CODE>2^^11.1</CODE> (meaning \f$7/2\f$),
+    <CODE>10^^2e3</CODE> (meaning \f$2000\f$),
+    <CODE>8^^2e3</CODE> (meaning \f$1024\f$),
+    <CODE>8^^2.1e3</CODE> (meaning \f$1088\f$),
+    <CODE>8^^20402543.120347e7</CODE> (meaning \f$9073863231288\f$),
+    <CODE>8^^2.1</CODE> (meaning \f$17/8\f$);
+    note that the base and the exponent are always written as plain
+    base-10 integer numbers; also, when an ambiguity may arise, the
+    character <CODE>e</CODE> is interpreted as a digit, so that
+    <CODE>16^^1e2</CODE> (meaning \f$482\f$) is different from
+    <CODE>16^^1*^2</CODE> (meaning \f$256\f$);
+  - the C-style hexadecimal prefix <CODE>0x</CODE> is interpreted as
+    the Mathematica-style prefix <CODE>16^^</CODE>;
+  - special values like <CODE>inf</CODE> and <CODE>+inf</CODE>
+    (meaning \f$+\infty\f$), <CODE>-inf</CODE> (meaning \f$-\infty\f$),
+    and <CODE>nan</CODE> (meaning "not a number").
+
+  The rationale behind the accepted syntax can be summarized as follows:
+  - if the syntax is accepted by Mathematica, then this function
+    accepts it with the same semantics;
+  - if the syntax is acceptable as standard C++ integer or floating point
+    literal (except for octal notation and type suffixes, which are not
+    supported), then this function accepts it with the same semantics;
+  - natural extensions of the above are accepted with the natural
+    extensions of the semantics;
+  - special values are accepted.
+
+  Valid syntax is more formally and completely specified by the
+  following grammar, with the additional provisos that everything is
+  <EM>case insensitive</EM>, that the syntactic category
+  <CODE>BDIGIT</CODE> is further restricted by the current base
+  and that for all bases above 14, any <CODE>e</CODE> is always
+  interpreted as a digit and never as a delimiter for the exponent part
+  (if such a delimiter is desired, it has to be written as <CODE>*^</CODE>).
+
+\code
+number	: NAN					INF	: 'inf'
+	| SIGN INF					;
+	| INF
+	| num					NAN	: 'nan'
+	| num DIV num					;
+	;
+						SIGN	: '-'
+num     : unum						| '+'
+        | SIGN unum					;
+
+unum	: unum1					EXP	: 'e'
+	| HEX unum1					| '*^'
+	| base BASE unum1				;
+	;
+						POINT	: '.'
+unum1	: mantissa					;
+	| mantissa EXP exponent
+	;					DIV	: '/'
+							;
+mantissa: bdigits
+        | POINT bdigits				MINUS	: '-'
+	| bdigits POINT					;
+	| bdigits POINT bdigits
+	;					PLUS	: '+'
+						;
+exponent: SIGN digits
+	| digits				HEX	: '0x'
+	;					;
+
+bdigits : BDIGIT				BASE	: '^^'
+	| bdigits BDIGIT				;
+	;
+						DIGIT   : '0' .. '9'
+digits  : DIGIT						;
+	| digits DIGIT
+	;					BDIGIT  : '0' .. '9'
+							| 'a' .. 'z'
+							;
+\endcode
+*/
+template <typename T, typename Policy>
+Result
+input(std::istream& is, Checked_Number<T, Policy>& x, Rounding_Dir dir);
+
+//! Input operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::istream&
+operator>>(std::istream& is, Checked_Number<T, Policy>& x);
+
+//@} // Input-Output Operators
+
+void throw_result_exception(Result r);
+
+template <typename T>
+T
+plus_infinity();
+
+template <typename T>
+T
+minus_infinity();
+
+template <typename T>
+T
+not_a_number();
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Checked_Number.inlines.hh line 1
+/* Checked_Number class implementation: inline functions.
+*/
+
+
+#include <stdexcept>
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline Rounding_Dir
+rounding_dir(Rounding_Dir dir) {
+  if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+    return ROUND_DIRECT;
+#else
+    return ROUND_IGNORE;
+#endif
+  }
+  return dir;
+}
+
+inline Result
+check_result(Result r, Rounding_Dir dir) {
+  if (dir == ROUND_NOT_NEEDED && !is_special(r)) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+    // FIXME: this is wrong. If an overflow happens the Result may be
+    // V_LT or V_GT. What's the better way to cope with that?
+    assert(r == V_EQ);
+#else
+    return V_EQ;
+#endif
+  }
+  return r;
+}
+
+
+inline void
+Checked_Number_Transparent_Policy::handle_result(Result) {
+}
+
+inline void
+Checked_Number_Default_Policy::handle_result(Result r) {
+  if (is_special(r))
+    throw_result_exception(r);
+}
+
+inline void
+Extended_Number_Policy::handle_result(Result r) {
+  if (is_special(r))
+    throw_result_exception(r);
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number()
+ : v(0) {
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Checked_Number& y) {
+  // TODO: avoid default construction of value member
+  Checked::copy<Policy>(v, y.raw_value());
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir) {
+  // TODO: avoid default construction of value member
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+				     (v,
+				      y.raw_value(),
+				      rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y) {
+  // TODO: avoid default construction of value member
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+				     (v,
+				      y.raw_value(),
+				      rounding_dir(dir)),
+				     dir));
+}
+
+// TODO: avoid default construction of value member
+#define DEF_CTOR(type) \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type x, Rounding_Dir dir) { \
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, Default_From_Policy>(v, x, rounding_dir(dir)), dir)); \
+} \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type x) { \
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; \
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, Default_From_Policy>(v, x, rounding_dir(dir)), dir)); \
+}
+
+#define COND_0(...)
+#define COND_1(...) __VA_ARGS__
+#define COND_(if, ...) COND_##if(__VA_ARGS__)
+#define COND(if, ...) COND_(if, __VA_ARGS__)
+
+DEF_CTOR(signed char)
+DEF_CTOR(signed short)
+DEF_CTOR(signed int)
+DEF_CTOR(signed long)
+DEF_CTOR(signed long long)
+DEF_CTOR(unsigned char)
+DEF_CTOR(unsigned short)
+DEF_CTOR(unsigned int)
+DEF_CTOR(unsigned long)
+DEF_CTOR(unsigned long long)
+COND(PPL_SUPPORTED_FLOAT, DEF_CTOR(float))
+COND(PPL_SUPPORTED_DOUBLE, DEF_CTOR(double))
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_CTOR(long double))
+DEF_CTOR(mpq_class&)
+DEF_CTOR(mpz_class&)
+
+#undef DEF_CTOR
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* x, Rounding_Dir dir) {
+  std::istringstream s(x);
+  Policy::handle_result(check_result(Checked::input<Policy>(v,
+							    s,
+							    rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* x) {
+  std::istringstream s(x);
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+  Policy::handle_result(check_result(Checked::input<Policy>(v,
+							    s,
+							    rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Not_A_Number& x,
+					  Rounding_Dir dir) {
+  // TODO: avoid default construction of value member
+  Policy::handle_result(check_result(Checked::assign<Policy>(v,
+							     x,
+							     rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Not_A_Number& x) {
+  // TODO: avoid default construction of value member
+  Rounding_Dir dir = ROUND_IGNORE;
+  Policy::handle_result(check_result(Checked::assign<Policy>(v,
+							     x,
+							     rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Minus_Infinity& x,
+					  Rounding_Dir dir) {
+  // TODO: avoid default construction of value member
+  Policy::handle_result(check_result(Checked::assign<Policy>(v,
+							     x,
+							     rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Minus_Infinity& x) {
+  // TODO: avoid default construction of value member
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR_INF;
+  Policy::handle_result(check_result(Checked::assign<Policy>(v,
+							     x,
+							     rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Plus_Infinity& x,
+					  Rounding_Dir dir) {
+  // TODO: avoid default construction of value member
+  Policy::handle_result(check_result(Checked::assign<Policy>(v,
+							     x,
+							     rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Plus_Infinity& x) {
+  // TODO: avoid default construction of value member
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR_INF;
+  Policy::handle_result(check_result(Checked::assign<Policy>(v,
+							     x,
+							     rounding_dir(dir)),
+				     dir));
+}
+
+template <typename T>
+inline bool
+is_minus_infinity(const T& x) {
+  return Checked::is_minf<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline bool
+is_plus_infinity(const T& x) {
+  return Checked::is_pinf<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline bool
+is_not_a_number(const T& x) {
+  return Checked::is_nan<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline bool
+is_integer(const T& x) {
+  return Checked::is_int<typename Native_Checked_From_Wrapper<T>::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::operator T() const {
+  if (Policy::convertible)
+    return v;
+}
+
+template <typename T, typename Policy>
+inline T&
+Checked_Number<T, Policy>::raw_value() {
+  return v;
+}
+
+template <typename T, typename Policy>
+inline const T&
+Checked_Number<T, Policy>::raw_value() const {
+  return v;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline const T&
+raw_value(const Checked_Number<T, Policy>& x) {
+  return x.raw_value();
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline T&
+raw_value(Checked_Number<T, Policy>& x) {
+  return x.raw_value();
+}
+
+template <typename T, typename Policy>
+inline bool
+Checked_Number<T, Policy>::OK() const {
+  return true;
+}
+
+template <typename T, typename Policy>
+inline Result
+Checked_Number<T, Policy>::classify(bool nan, bool inf, bool sign) const {
+  return Checked::classify<Policy>(v, nan, inf, sign);
+}
+
+template <typename T, typename Policy>
+inline bool
+is_not_a_number(const Checked_Number<T, Policy>& x) {
+  return Checked::is_nan<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_minus_infinity(const Checked_Number<T, Policy>& x) {
+  return Checked::is_minf<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_plus_infinity(const Checked_Number<T, Policy>& x) {
+  return Checked::is_pinf<Policy>(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+total_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+  return Checked::total_memory_in_bytes(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+external_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+  return Checked::external_memory_in_bytes(x.raw_value());
+}
+
+template <typename To>
+inline Result
+assign_r(To& to, const Minus_Infinity& x, Rounding_Dir dir) {
+  return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
+}
+template <typename To>
+inline Result
+assign_r(To& to, const Plus_Infinity& x, Rounding_Dir dir) {
+  return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
+}
+template <typename To>
+inline Result
+assign_r(To& to, const Not_A_Number& x, Rounding_Dir dir) {
+  return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
+}
+
+template <typename To>
+inline Result
+assign_r(To& to, const char* x, Rounding_Dir dir) {
+  std::istringstream s(x);
+  return check_result(Checked::input<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), s, rounding_dir(dir)), dir);
+}
+
+#define FUNC1(name, func) \
+template <typename To, typename From> \
+inline Result \
+name(To& to, const From& x, Rounding_Dir dir) { \
+  return check_result(Checked::func<typename Native_Checked_To_Wrapper<To>::Policy, typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), Native_Checked_From_Wrapper<From>::raw_value(x), rounding_dir(dir)), dir); \
+}
+
+FUNC1(construct, construct_ext)
+FUNC1(assign_r, assign_ext)
+FUNC1(neg_assign_r, neg_ext)
+FUNC1(abs_assign_r, abs_ext)
+FUNC1(sqrt_assign_r, sqrt_ext)
+
+#undef FUNC1
+
+#define FUNC1(name, func) \
+template <typename To, typename From> \
+inline Result \
+name(To& to, const From& x, int exp, Rounding_Dir dir) { \
+  return check_result(Checked::func<typename Native_Checked_To_Wrapper<To>::Policy, typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), Native_Checked_From_Wrapper<From>::raw_value(x), exp, rounding_dir(dir)), dir); \
+}
+
+FUNC1(mul2exp_assign_r, mul2exp_ext)
+FUNC1(div2exp_assign_r, div2exp_ext)
+
+#undef FUNC1
+
+#define FUNC2(name, func) \
+template <typename To, \
+          typename From1, \
+	  typename From2> \
+inline Result \
+name(To& to, const From1& x, const From2& y, Rounding_Dir dir) { \
+  return check_result(Checked::func<typename Native_Checked_To_Wrapper<To>::Policy, typename Native_Checked_From_Wrapper<From1>::Policy, typename Native_Checked_From_Wrapper<From2>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), Native_Checked_From_Wrapper<From1>::raw_value(x), Native_Checked_From_Wrapper<From2>::raw_value(y), rounding_dir(dir)), dir); \
+}
+
+FUNC2(add_assign_r, add_ext)
+FUNC2(sub_assign_r, sub_ext)
+FUNC2(mul_assign_r, mul_ext)
+FUNC2(div_assign_r, div_ext)
+FUNC2(rem_assign_r, rem_ext)
+FUNC2(gcd_assign_r, gcd_ext)
+FUNC2(lcm_assign_r, lcm_ext)
+FUNC2(add_mul_assign_r, add_mul_ext)
+FUNC2(sub_mul_assign_r, sub_mul_ext)
+
+#undef FUNC2
+
+#define FUNC4(name, func)						\
+template <typename To1,							\
+          typename From1,						\
+          typename From2,						\
+          typename To2,							\
+	  typename To3>							\
+inline Result								\
+name(To1& to, const From1& x, const From2& y, To2& s, To3& t,		\
+     Rounding_Dir dir) {						\
+  return								\
+    check_result							\
+    (Checked::func<typename Native_Checked_To_Wrapper<To1>::Policy,	\
+                   typename Native_Checked_From_Wrapper<From1>::Policy,	\
+                   typename Native_Checked_From_Wrapper<From2>::Policy,	\
+                   typename Native_Checked_To_Wrapper<To2>::Policy,	\
+                   typename Native_Checked_To_Wrapper<To3>::Policy>	\
+     (Native_Checked_To_Wrapper<To1>::raw_value(to),			\
+      Native_Checked_From_Wrapper<From1>::raw_value(x),			\
+      Native_Checked_From_Wrapper<From2>::raw_value(y),			\
+      Native_Checked_To_Wrapper<To2>::raw_value(s),			\
+      Native_Checked_To_Wrapper<To3>::raw_value(t),			\
+      rounding_dir(dir)),						\
+     dir);								\
+}
+
+FUNC4(gcdext_assign_r, gcdext_ext)
+
+#undef FUNC4
+
+#define DEF_INCREMENT(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f() { \
+  Policy::handle_result(fun(*this, *this, T(1), \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+Checked_Number<T, Policy>::f(int) {\
+  T r = v;\
+  Policy::handle_result(fun(*this, *this, T(1), \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r;\
+}
+
+DEF_INCREMENT(operator ++, add_assign_r)
+DEF_INCREMENT(operator --, sub_assign_r)
+
+#undef DEF_INCREMENT
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline void
+swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y) {
+  std::swap(x.raw_value(), y.raw_value());
+}
+
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Checked_Number<T, Policy>& y) {
+  Checked::copy<Policy>(v, y.raw_value());
+  return *this;
+}
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>
+::operator=(const Checked_Number<From, From_Policy>& y) {
+  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
+  return *this;
+}
+template <typename T, typename Policy>
+template <typename From>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const From& y) {
+  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
+  return *this;
+}
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Not_A_Number& y) {
+  Policy::handle_result(assign_r(*this, y, ROUND_IGNORE));
+  return *this;
+}
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Minus_Infinity& y) {
+  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_ASSIGN_INF));
+  return *this;
+}
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Plus_Infinity& y) {
+  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_ASSIGN_INF));
+  return *this;
+}
+
+#define DEF_BINARY_OP_ASSIGN(f, fun) \
+template <typename T, typename Policy> \
+template <typename From_Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const Checked_Number<T, From_Policy>& y) { \
+  Policy::handle_result(fun(*this, *this, y, \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const T& y) { \
+  Policy::handle_result(fun(*this, *this, y, \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+template <typename From, typename From_Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const Checked_Number<From, From_Policy>& y) { \
+  Checked_Number<T, Policy> cy(y); \
+  Policy::handle_result(fun(*this, *this, cy, \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+template <typename From> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const From& y) { \
+  Checked_Number<T, Policy> cy(y); \
+  Policy::handle_result(fun(*this, *this, cy, \
+			    Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+}
+
+DEF_BINARY_OP_ASSIGN(operator +=, add_assign_r)
+DEF_BINARY_OP_ASSIGN(operator -=, sub_assign_r)
+DEF_BINARY_OP_ASSIGN(operator *=, mul_assign_r)
+DEF_BINARY_OP_ASSIGN(operator /=, div_assign_r)
+DEF_BINARY_OP_ASSIGN(operator %=, rem_assign_r)
+
+#undef DEF_BINARY_OP_ASSIGN
+
+#define DEF_BINARY_OP_TYPE(f, fun, Type) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+f(const Type x, const Checked_Number<T, Policy>& y) { \
+  Checked_Number<T, Policy> r(x); \
+  Policy::handle_result(fun(r, r, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+f(const Checked_Number<T, Policy>& x, const Type y) { \
+  Checked_Number<T, Policy> r(y); \
+  Policy::handle_result(fun(r, x, r, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+}
+
+#define DEF_BINARY_OP(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+f(const Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+  Checked_Number<T, Policy> r; \
+  Policy::handle_result(fun(r, x, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+} \
+DEF_BINARY_OP_TYPE(f, fun, signed char) \
+DEF_BINARY_OP_TYPE(f, fun, signed short) \
+DEF_BINARY_OP_TYPE(f, fun, signed int) \
+DEF_BINARY_OP_TYPE(f, fun, signed long) \
+DEF_BINARY_OP_TYPE(f, fun, signed long long) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned char) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned short) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned int) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned long) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned long long) \
+COND(PPL_SUPPORTED_FLOAT, DEF_BINARY_OP_TYPE(f, fun, float)) \
+COND(PPL_SUPPORTED_DOUBLE, DEF_BINARY_OP_TYPE(f, fun, double)) \
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_BINARY_OP_TYPE(f, fun, long double)) \
+DEF_BINARY_OP_TYPE(f, fun, mpz_class&) \
+DEF_BINARY_OP_TYPE(f, fun, mpq_class&)
+
+DEF_BINARY_OP(operator +, add_assign_r)
+DEF_BINARY_OP(operator -, sub_assign_r)
+DEF_BINARY_OP(operator *, mul_assign_r)
+DEF_BINARY_OP(operator /, div_assign_r)
+DEF_BINARY_OP(operator %, rem_assign_r)
+
+#undef DEF_BINARY_OP_TYPE
+#undef DEF_BINARY_OP
+
+#define DEF_COMPARE_TYPE(f, fun, Type) \
+template <typename From, typename From_Policy> \
+inline bool \
+f(const Type x, const Checked_Number<From, From_Policy>& y) { \
+  return Checked::fun<Default_From_Policy, From_Policy>(x, y.raw_value()); \
+} \
+template <typename From, typename From_Policy> \
+inline bool \
+f(const Checked_Number<From, From_Policy>& x, const Type y) { \
+  return Checked::fun<From_Policy, Default_From_Policy>(x.raw_value(), y); \
+}
+
+#define DEF_COMPARE(f, fun) \
+template <typename T1, typename Policy1, \
+          typename T2, typename Policy2> \
+inline bool \
+f(const Checked_Number<T1, Policy1>& x, \
+  const Checked_Number<T2, Policy2>& y) { \
+  return Checked::fun<Policy1, Policy2>(x.raw_value(), y.raw_value()); \
+} \
+DEF_COMPARE_TYPE(f, fun, signed char) \
+DEF_COMPARE_TYPE(f, fun, signed short) \
+DEF_COMPARE_TYPE(f, fun, signed int) \
+DEF_COMPARE_TYPE(f, fun, signed long) \
+DEF_COMPARE_TYPE(f, fun, signed long long) \
+DEF_COMPARE_TYPE(f, fun, unsigned char) \
+DEF_COMPARE_TYPE(f, fun, unsigned short) \
+DEF_COMPARE_TYPE(f, fun, unsigned int) \
+DEF_COMPARE_TYPE(f, fun, unsigned long) \
+DEF_COMPARE_TYPE(f, fun, unsigned long long) \
+COND(PPL_SUPPORTED_FLOAT, DEF_COMPARE_TYPE(f, fun, float)) \
+COND(PPL_SUPPORTED_DOUBLE, DEF_COMPARE_TYPE(f, fun, double)) \
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_COMPARE_TYPE(f, fun, long double)) \
+DEF_COMPARE_TYPE(f, fun, mpz_class&) \
+DEF_COMPARE_TYPE(f, fun, mpq_class&)
+
+
+DEF_COMPARE(operator ==, eq_ext)
+DEF_COMPARE(operator !=, ne_ext)
+DEF_COMPARE(operator >=, ge_ext)
+DEF_COMPARE(operator >, gt_ext)
+DEF_COMPARE(operator <=, le_ext)
+DEF_COMPARE(operator <, lt_ext)
+
+#undef DEF_COMPARE_TYPE
+#undef DEF_COMPARE
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x) {
+  return x;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x) {
+  Checked_Number<T, Policy> r;
+  Policy::handle_result(neg_assign_r(r, x, Policy::ROUND_DEFAULT_OPERATOR));
+  return r;
+}
+
+#define DEF_ASSIGN_FUN2_1(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x) { \
+  Policy::handle_result(fun(x, x, Policy::ROUND_DEFAULT_FUNCTION));	\
+}
+
+#define DEF_ASSIGN_FUN2_2(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+  Policy::handle_result(fun(x, y, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define DEF_ASSIGN_FUN3_3(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y, \
+  const Checked_Number<T, Policy>& z) { \
+  Policy::handle_result(fun(x, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define DEF_ASSIGN_FUN5_5(f, fun)					\
+template <typename T, typename Policy>					\
+inline void								\
+f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y,	\
+  const Checked_Number<T, Policy>& z,					\
+  Checked_Number<T, Policy>& s, Checked_Number<T, Policy>& t) {		\
+  Policy::handle_result(fun(x, y, z, s, t, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+DEF_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r)
+
+DEF_ASSIGN_FUN2_1(neg_assign, neg_assign_r)
+DEF_ASSIGN_FUN2_2(neg_assign, neg_assign_r)
+
+DEF_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r)
+
+DEF_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r)
+
+DEF_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r)
+
+DEF_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r)
+
+DEF_ASSIGN_FUN3_3(lcm_assign, lcm_assign_r)
+
+#undef DEF_ASSIGN_FUN2_1
+#undef DEF_ASSIGN_FUN2_2
+#undef DEF_ASSIGN_FUN3_2
+#undef DEF_ASSIGN_FUN3_3
+
+template <typename T, typename Policy>
+inline void
+exact_div_assign(Checked_Number<T, Policy>& x,
+		 const Checked_Number<T, Policy>& y,
+		 const Checked_Number<T, Policy>& z) {
+  Policy::handle_result(div_assign_r(x, y, z, ROUND_NOT_NEEDED));
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline int
+sgn(const Checked_Number<T, Policy>& x) {
+  Result r = Checked::sgn_ext<Policy>(x.raw_value());
+  switch (r) {
+  case V_LT:
+    return -1;
+  case V_EQ:
+    return 0;
+  case V_GT:
+    return 1;
+  default:
+    throw(0);
+  }
+}
+
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+	  typename T2, typename Policy2>
+inline int
+cmp(const Checked_Number<T1, Policy1>& x,
+    const Checked_Number<T2, Policy2>& y) {
+  Result r = Checked::cmp_ext<Policy1, Policy2>(x.raw_value(), y.raw_value());
+  switch (r) {
+  case V_LT:
+    return -1;
+  case V_EQ:
+    return 0;
+  case V_GT:
+    return 1;
+  default:
+    throw(0);
+  }
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Result
+output(std::ostream& os, const Checked_Number<T, Policy>& x,
+       const Numeric_Format& fmt, Rounding_Dir dir) {
+  return check_result(Checked::output_ext<Policy>(os,
+						  x.raw_value(),
+						  fmt,
+						  rounding_dir(dir)),
+		      dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x) {
+  Policy::handle_result(output(os, x, Numeric_Format(), ROUND_IGNORE));
+  return os;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Result
+input(Checked_Number<T, Policy>& x, std::istream& is, Rounding_Dir dir) {
+  return check_result(Checked::input_ext<Policy>(x.raw_value(),
+						 is,
+						 rounding_dir(dir)),
+		      dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::istream& operator>>(std::istream& is,
+				Checked_Number<T, Policy>& x) {
+  Result r = input(x, is, Policy::ROUND_DEFAULT_INPUT);
+  if (r == V_CVT_STR_UNK)
+    is.setstate(std::ios::failbit);
+  else
+    Policy::handle_result(r);
+  return is;
+}
+
+template <typename T>
+inline T
+plus_infinity() {
+  return PLUS_INFINITY;
+}
+
+template <typename T>
+inline T
+minus_infinity() {
+  return MINUS_INFINITY;
+}
+
+template <typename T>
+inline T
+not_a_number() {
+  return NOT_A_NUMBER;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/checked_numeric_limits.hh line 1
+/* Specializations of std::numeric_limits for "checked" types.
+*/
+
+
+// Automatically generated from PPL source file ../src/mp_numeric_limits.hh line 1
+/* Specializations of std::numeric_limits for multi-precision types.
+   This will become obsolete when GMP and MPFR will provide the
+   specializations by themselves.
+*/
+
+
+#include <gmpxx.h>
+#include <limits>
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <>
+class numeric_limits<mpz_class> {
+private:
+  typedef mpz_class Type;
+
+public:
+  static const bool is_specialized = true;
+  static const int digits = 0;
+  static const int digits10 = 0;
+  static const bool is_signed = true;
+  static const bool is_integer = true;
+  static const bool is_exact = true;
+  static const int radix = 2;
+  static const int min_exponent = 0;
+  static const int min_exponent10 = 0;
+  static const int max_exponent = 0;
+  static const int max_exponent10 = 0;
+  static const bool has_infinity = false;
+  static const bool has_quiet_NaN =  false;
+  static const bool has_signaling_NaN = false;
+  static const float_denorm_style has_denorm = denorm_absent;
+  static const bool has_denorm_loss = false;
+  static const bool is_iec559 = false;
+  static const bool is_bounded = false;
+  static const bool is_modulo = false;
+  static const bool traps = false;
+  static const bool tinyness_before = false;
+  static const float_round_style round_style = round_toward_zero;
+
+  static Type min() {
+    return static_cast<Type>(0);
+  }
+
+  static Type max() {
+    return static_cast<Type>(0);
+  }
+
+  static Type epsilon() {
+    return static_cast<Type>(0);
+  }
+
+  static Type round_error() {
+    return static_cast<Type>(0);
+  }
+
+  static Type infinity() {
+    return static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return static_cast<Type>(0);
+  }
+
+  static Type denorm_min() {
+    return static_cast<Type>(1);
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <>
+class numeric_limits<mpq_class> {
+private:
+  typedef mpq_class Type;
+
+public:
+  static const bool is_specialized = true;
+  static const int digits = 0;
+  static const int digits10 = 0;
+  static const bool is_signed = true;
+  static const bool is_integer = false;
+  static const bool is_exact = true;
+  static const int radix = 2;
+  static const int min_exponent = 0;
+  static const int min_exponent10 = 0;
+  static const int max_exponent = 0;
+  static const int max_exponent10 = 0;
+  static const bool has_infinity = false;
+  static const bool has_quiet_NaN =  false;
+  static const bool has_signaling_NaN = false;
+  static const float_denorm_style has_denorm = denorm_absent;
+  static const bool has_denorm_loss = false;
+  static const bool is_iec559 = false;
+  static const bool is_bounded = false;
+  static const bool is_modulo = false;
+  static const bool traps = false;
+  static const bool tinyness_before = false;
+  static const float_round_style round_style = round_toward_zero;
+
+  static Type min() {
+    return static_cast<Type>(0);
+  }
+
+  static Type max() {
+    return static_cast<Type>(0);
+  }
+
+  static Type epsilon() {
+    return static_cast<Type>(0);
+  }
+
+  static Type round_error() {
+    return static_cast<Type>(0);
+  }
+
+  static Type infinity() {
+    return static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return static_cast<Type>(0);
+  }
+
+  static Type denorm_min() {
+    return static_cast<Type>(0);
+  }
+};
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/checked_numeric_limits.hh line 29
+#include <limits>
+
+namespace std {
+
+#define PPL_SPECIALIZE_LIMITS_INT(T)					\
+/*! \brief Partial specialization of std::numeric_limits. */		\
+template <typename Policy>						\
+class numeric_limits<Parma_Polyhedra_Library::Checked_Number<T, Policy> > \
+  : public numeric_limits<T> {						\
+ private:								\
+  typedef Parma_Polyhedra_Library::Checked_Number<T, Policy> Type;	\
+									\
+ public:								\
+  static const bool has_infinity = Policy::handle_infinity;		\
+  static const bool has_quiet_NaN =  Policy::handle_nan;			\
+									\
+  static Type min() {							\
+    return Parma_Polyhedra_Library::Checked::Extended_Int<Policy, T>::min; \
+  }									\
+									\
+  static Type max() {							\
+    return Parma_Polyhedra_Library::Checked::Extended_Int<Policy, T>::max; \
+  }									\
+									\
+  static Type infinity() {						\
+    return								\
+      Policy::handle_infinity						\
+      ? Parma_Polyhedra_Library::PLUS_INFINITY				\
+      : static_cast<Type>(0);						\
+  }									\
+									\
+  static Type quiet_NaN() {						\
+    return								\
+      Policy::handle_nan							\
+      ? Parma_Polyhedra_Library::NOT_A_NUMBER				\
+      : static_cast<Type>(0);						\
+  }									\
+};
+
+PPL_SPECIALIZE_LIMITS_INT(signed char)
+PPL_SPECIALIZE_LIMITS_INT(signed short)
+PPL_SPECIALIZE_LIMITS_INT(signed int)
+PPL_SPECIALIZE_LIMITS_INT(signed long)
+PPL_SPECIALIZE_LIMITS_INT(signed long long)
+
+PPL_SPECIALIZE_LIMITS_INT(unsigned char)
+PPL_SPECIALIZE_LIMITS_INT(unsigned short)
+PPL_SPECIALIZE_LIMITS_INT(unsigned int)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long long)
+
+#undef PPL_SPECIALIZE_LIMITS_INT
+
+#define PPL_SPECIALIZE_LIMITS_FLOAT(T)					\
+/*! \brief Partial specialization of std::numeric_limits. */		\
+template <typename Policy>						\
+struct numeric_limits<Parma_Polyhedra_Library::Checked_Number<T, Policy> > \
+  : public numeric_limits<T> {						\
+};
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_LIMITS_FLOAT(float)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(double)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(long double)
+#endif
+
+#undef PPL_SPECIALIZE_LIMITS_FLOAT
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+class
+numeric_limits<Parma_Polyhedra_Library::Checked_Number<mpz_class, Policy> >
+  : public numeric_limits<mpz_class> {
+private:
+  typedef Parma_Polyhedra_Library::Checked_Number<mpz_class, Policy> Type;
+
+public:
+  static const bool has_infinity = Policy::handle_infinity;
+  static const bool has_quiet_NaN =  Policy::handle_nan;
+
+  static Type infinity() {
+    return
+      Policy::handle_infinity
+      ? Parma_Polyhedra_Library::PLUS_INFINITY
+      : static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return
+      Policy::handle_nan
+      ? Parma_Polyhedra_Library::NOT_A_NUMBER
+      : static_cast<Type>(0);
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+class
+numeric_limits<Parma_Polyhedra_Library::Checked_Number<mpq_class, Policy> >
+: public numeric_limits<mpq_class> {
+private:
+  typedef Parma_Polyhedra_Library::Checked_Number<mpq_class, Policy> Type;
+
+public:
+  static const bool has_infinity = Policy::handle_infinity;
+  static const bool has_quiet_NaN =  Policy::handle_nan;
+
+  static Type infinity() {
+    return
+      Policy::handle_infinity
+      ? Parma_Polyhedra_Library::PLUS_INFINITY
+      : static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return
+      Policy::handle_nan
+      ? Parma_Polyhedra_Library::NOT_A_NUMBER
+      : static_cast<Type>(0);
+  }
+};
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Checked_Number.defs.hh line 912
+
+// Automatically generated from PPL source file ../src/Coefficient.types.hh line 16
+
+#if defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 8 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int8_t, Policy> > {
+  //! The type used for references to const 8 bit checked integers.
+  typedef Checked_Number<int8_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 16 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int16_t, Policy> > {
+  //! The type used for references to const 16 bit checked integers.
+  typedef Checked_Number<int16_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 32 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int32_t, Policy> > {
+  //! The type used for references to const 32 bit checked integers.
+  typedef Checked_Number<int32_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 64 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int64_t, Policy> > {
+  //! The type used for references to const 64 bit checked integers.
+  typedef const Checked_Number<int64_t, Policy>& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+
+#ifdef GMP_INTEGERS
+// Automatically generated from PPL source file ../src/Coefficient.types.hh line 67
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+//! An alias for easily naming the type of PPL coefficients.
+/*! \ingroup PPL_CXX_interface
+  Objects of type Coefficient are used to implement the integral valued
+  coefficients occurring in linear expressions, constraints, generators,
+  intervals, bounding boxes and so on. Depending on the chosen
+  configuration options (see file <CODE>README.configure</CODE>),
+  a Coefficient may actually be:
+    - The GMP_Integer type, which in turn is an alias for the
+      <CODE>mpz_class</CODE> type implemented by the C++ interface
+      of the GMP library (this is the default configuration);
+    - An instance of the Checked_Number class template: with its default
+      policy (Checked_Number_Default_Policy), this implements overflow
+      detection on top of a native integral type (available template
+      instances include checked integers having 8, 16, 32 or 64 bits);
+      with the Checked_Number_Transparent_Policy, this is a wrapper
+      for native integral types with no overflow detection
+      (available template instances are as above).
+*/
+typedef COEFFICIENT_TYPE Coefficient;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An alias for easily naming the coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+typedef Coefficient_traits_template<Coefficient> Coefficient_traits;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Interval.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Boundary;
+class LBoundary;
+class UBoundary;
+class Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Bounding_Box.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Bounding_Box;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Constraint.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Generator.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Generator;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Grid_Generator.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator;
+
+}
+
+// Automatically generated from PPL source file ../src/Congruence.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence;
+
+}
+
+// Automatically generated from PPL source file ../src/Init.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Init;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Row.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Row_Impl_Handler;
+class Row;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Linear_Row.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Matrix.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Variable.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Variable;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Linear_Expression.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Linear_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_System;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Saturation_Row.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Saturation_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Saturation_Matrix.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Saturation_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Constraint_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint_System;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Generator_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Generator_System;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Grid_Generator_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator_System;
+
+}
+
+// Automatically generated from PPL source file ../src/Congruence_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence_System;
+
+}
+
+// Automatically generated from PPL source file ../src/Scalar_Products.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Scalar_Products;
+class Topology_Adjusted_Scalar_Product_Sign;
+class Topology_Adjusted_Scalar_Product_Assign;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/LP_Problem.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the LP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum LP_Problem_Status {
+  //! The problem is unfeasible.
+  UNFEASIBLE_LP_PROBLEM,
+  //! The problem is unbounded.
+  UNBOUNDED_LP_PROBLEM,
+  //! The problem has an optimal solution.
+  OPTIMIZED_LP_PROBLEM
+};
+
+class LP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Poly_Con_Relation.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Con_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Poly_Gen_Relation.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Gen_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/BHRZ03_Certificate.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class BHRZ03_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/H79_Certificate.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class H79_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Grid_Certificate.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Certificate;
+
+}
+
+// Automatically generated from PPL source file ../src/Polyhedron.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/C_Polyhedron.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class C_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/NNC_Polyhedron.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class NNC_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Grid.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Ptr_Iterator.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+class Ptr_Iterator;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/DB_Row.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename BT>
+class DB_Row_Impl_Handler;
+
+template <typename BT>
+class DB_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/DB_Matrix.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class DB_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/BD_Shape.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class BD_Shape;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/GMP_Integer.defs.hh line 1
+/* GMP_Integer class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/GMP_Integer.defs.hh line 28
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Accessor Functions
+//@{
+
+//! Returns a const reference to the underlying integer value.
+/*! \relates GMP_Integer */
+const mpz_class& raw_value(const GMP_Integer& x);
+
+//! Returns a reference to the underlying integer value.
+/*! \relates GMP_Integer */
+mpz_class& raw_value(GMP_Integer& x);
+
+//@} // Accessor Functions
+
+//! \name Memory Size Inspection Functions
+//@{
+
+//! Returns the total size in bytes of the memory occupied by \p x.
+/*! \relates GMP_Integer */
+memory_size_type total_memory_in_bytes(const GMP_Integer& x);
+
+//! Returns the size in bytes of the memory managed by \p x.
+/*! \relates GMP_Integer */
+memory_size_type external_memory_in_bytes(const GMP_Integer& x);
+
+//@} // Memory Size Inspection Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Assigns to \p x its negation.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x);
+
+//! Assigns to \p x the negation of \p y.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates GMP_Integer */
+void gcd_assign(GMP_Integer& x,
+		const GMP_Integer& y, const GMP_Integer& z);
+
+//! Extended GCD.
+/*! \relates GMP_Integer
+  Assigns to \p x the greatest common divisor of \p y and \p z, and to
+  \p s and \p t the values such that \p y * \p s + \p z * \p t = \p x.
+*/
+void gcdext_assign(GMP_Integer& x,
+		   const GMP_Integer& y, const GMP_Integer& z,
+		   GMP_Integer& s, GMP_Integer& t);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates GMP_Integer */
+void lcm_assign(GMP_Integer& x,
+		const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates GMP_Integer */
+void add_mul_assign(GMP_Integer& x,
+		    const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates GMP_Integer */
+void sub_mul_assign(GMP_Integer& x,
+		    const GMP_Integer& y, const GMP_Integer& z);
+
+/*! \brief
+  If \p z divides \p y, assigns to \p x the quotient of the integer
+  division of \p y and \p z.
+
+  \relates GMP_Integer
+  The behavior is undefined if \p z does not divide \p y.
+*/
+void exact_div_assign(GMP_Integer& x,
+		      const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates GMP_Integer */
+void sqrt_assign(GMP_Integer& x, const GMP_Integer& y);
+
+/*! \brief
+  Returns a negative, zero or positive value depending on whether
+  \p x is lower than, equal to or greater than \p y, respectively.
+
+  \relates GMP_Integer
+*/
+int cmp(const GMP_Integer& x, const GMP_Integer& y);
+
+//@} // Arithmetic Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::GMP_Integer */
+void swap(Parma_Polyhedra_Library::GMP_Integer& x,
+	  Parma_Polyhedra_Library::GMP_Integer& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/GMP_Integer.inlines.hh line 1
+/* GMP_Integer class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+neg_assign(GMP_Integer& x) {
+  mpz_neg(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+neg_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_neg(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+gcd_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_gcd(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+gcdext_assign(GMP_Integer& x,
+	      const GMP_Integer& y, const GMP_Integer& z,
+	      GMP_Integer& s, GMP_Integer& t) {
+  mpz_gcdext(x.get_mpz_t(),
+	     s.get_mpz_t(), t.get_mpz_t(),
+	     y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+lcm_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_lcm(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+add_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_addmul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sub_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_submul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+exact_div_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  assert(y % z == 0);
+  mpz_divexact(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sqrt_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_sqrt(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline int
+cmp(const GMP_Integer& x, const GMP_Integer& y) {
+  return mpz_cmp(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline const mpz_class&
+raw_value(const GMP_Integer& x) {
+  return x;
+}
+
+inline mpz_class&
+raw_value(GMP_Integer& x) {
+  return x;
+}
+
+inline memory_size_type
+external_memory_in_bytes(const GMP_Integer& x) {
+  return x.get_mpz_t()[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+total_memory_in_bytes(const GMP_Integer& x) {
+  return sizeof(x) + external_memory_in_bytes(x);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::GMP_Integer */
+inline void
+std::swap(Parma_Polyhedra_Library::GMP_Integer& x,
+	  Parma_Polyhedra_Library::GMP_Integer& y) {
+  mpz_swap(x.get_mpz_t(), y.get_mpz_t());
+}
+
+// Automatically generated from PPL source file ../src/GMP_Integer.defs.hh line 135
+
+// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 1
+/* Coefficient class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 27
+#include <iosfwd>
+
+#if defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 32
+#endif
+
+#ifdef GMP_INTEGERS
+// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 36
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+Coefficient_traits::const_reference Coefficient_zero();
+Coefficient_traits::const_reference Coefficient_one();
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Coefficient.inlines.hh line 1
+/* Coefficient class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+  static Coefficient z(0);
+  return z;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+  static Coefficient o(1);
+  return o;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 46
+
+// Automatically generated from PPL source file ../src/globals.defs.hh line 1
+/* Declarations of global objects.
+*/
+
+
+// Automatically generated from PPL source file ../src/globals.defs.hh line 28
+#include <exception>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns a value that does not designate a valid dimension.
+dimension_type
+not_a_dimension();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A node of the list of available coefficients.
+/*! \ingroup PPL_CXX_interface */
+// FIXME: rewrite the comment.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Coefficient_free_list_element {
+private:
+  Coefficient i;
+  Coefficient_free_list_element* p;
+
+public:
+  Coefficient_free_list_element()
+    : i() {
+  }
+
+  Coefficient& integer() {
+    return i;
+  }
+
+  Coefficient_free_list_element*& next() {
+    return p;
+  }
+};
+
+extern Coefficient_free_list_element* Coefficient_free_list_first;
+
+inline Coefficient&
+get_tmp_Coefficient() {
+  Coefficient* p;
+  if (Coefficient_free_list_first != 0) {
+    p = &Coefficient_free_list_first->integer();
+    Coefficient_free_list_first = Coefficient_free_list_first->next();
+  }
+  else
+    p = reinterpret_cast<Coefficient*>(new Coefficient_free_list_element());
+  return *p;
+}
+
+inline void
+release_tmp_Coefficient(Coefficient& i) {
+  Coefficient_free_list_element& e
+    = reinterpret_cast<Coefficient_free_list_element&>(i);
+  e.next() = Coefficient_free_list_first;
+  Coefficient_free_list_first = &e;
+}
+
+class Temp_Coefficient_Holder {
+private:
+  Coefficient& hold;
+
+public:
+  Temp_Coefficient_Holder(Coefficient& i)
+    : hold(i) {
+  }
+  ~Temp_Coefficient_Holder() {
+    release_tmp_Coefficient(hold);
+  }
+};
+
+#if 1
+#define TEMP_INTEGER(id) \
+Coefficient& id = get_tmp_Coefficient(); \
+Temp_Coefficient_Holder temp_Coefficient_holder_ ## id = (id)
+#else
+#define TEMP_INTEGER(id) static Coefficient id
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Speculative allocation function.
+/*!
+  \return
+  The actual capacity to be allocated.
+
+  \param requested_size
+  The number of elements we need.
+
+  \param maximum_size
+  The maximum number of elements to be allocated. It is assumed
+  to be no less than \p requested_size.
+
+  Computes a capacity given a requested size.
+  Allows for speculative allocation aimed at reducing the number of
+  reallocations enough to guarantee amortized constant insertion time
+  for our vector-like data structures. In all cases, the speculative
+  allocation will not exceed \p maximum_size.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+dimension_type
+compute_capacity(dimension_type requested_size,
+		 dimension_type maximum_size);
+
+//! User objects the PPL can throw.
+/*! \ingroup PPL_CXX_interface
+  This abstract base class should be instantiated by those users
+  willing to provide a polynomial upper bound to the time spent
+  by any invocation of a library operator.
+*/
+class Throwable {
+public:
+  //! Throws the user defined exception object.
+  virtual void throw_me() const = 0;
+
+  //! Virtual destructor.
+  virtual ~Throwable();
+};
+
+/*! \brief
+  A pointer to an exception object.
+
+  \ingroup PPL_CXX_interface
+  This pointer, which is initialized to zero, is repeatedly checked
+  along any super-linear (i.e., computationally expensive) computation
+  path in the library.
+  When it is found nonzero the exception it points to is thrown.
+  In other words, making this pointer point to an exception (and
+  leaving it in this state) ensures that the library will return
+  control to the client application, possibly by throwing the given
+  exception, within a time that is a linear function of the size
+  of the representation of the biggest object (powerset of polyhedra,
+  polyhedron, system of constraints or generators) on which the library
+  is operating upon.
+
+  \note
+  The only sensible way to assign to this pointer is from within a
+  signal handler or from a parallel thread.  For this reason, the
+  library, apart from ensuring that the pointer is initially set to zero,
+  never assigns to it.  In particular, it does not zero it again when
+  the exception is thrown: it is the client's responsibility to do so.
+*/
+extern const Throwable* volatile abandon_expensive_computations;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If the pointer abandon_expensive_computations is found
+  to be nonzero, the exception it points to is thrown.
+
+  \relates Throwable
+*/
+#endif
+void
+maybe_abandon();
+
+//! A tag class.
+/*! \ingroup PPL_CXX_interface
+  Tag class to differentiate the C_Polyhedron and NNC_Polyhedron
+  constructors that build a polyhedron out of a bounding box.
+*/
+struct From_Bounding_Box {
+};
+
+//! A tag class.
+/*! \ingroup PPL_CXX_interface
+  Tag class to make the Grid covering box constructor unique.
+*/
+struct From_Covering_Box {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If \f$g\f$ is the GCD of \p x and \p y, the values of \p x and \p y
+  divided by \f$g\f$ are assigned to \p nx and \p ny, respectively.
+
+  \note
+  \p x and \p nx may be the same object and likewise for
+  \p y and \p ny.  Any other aliasing results in undefined behavior.
+*/
+#endif
+void
+normalize2(Coefficient_traits::const_reference x,
+	   Coefficient_traits::const_reference y,
+	   Coefficient& nx, Coefficient& ny);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns a mask for the lowest \p n bits,
+#endif
+template <typename T>
+T low_bits_mask(unsigned n);
+
+// Turn s into a string: PPL_STR(x + y) => "x + y".
+#define PPL_STR(s) #s
+// Turn the expansion of s into a string: PPL_XSTR(x) => "x expanded".
+#define PPL_XSTR(s) PPL_STR(s)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define PPL_OUTPUT_DECLARATIONS						\
+  /*! \brief Writes to \c std::cerr an ASCII representation of \p *this. */ \
+  void ascii_dump() const;						\
+  /*! \brief Writes to \p s an ASCII representation of \p *this. */	\
+  void ascii_dump(std::ostream& s) const;				\
+  /*! \brief Prints \p *this to \c std::cerr using \c operator<<. */	\
+  void print() const;
+#else
+#define PPL_OUTPUT_DECLARATIONS					\
+  void ascii_dump() const;					\
+  void ascii_dump(std::ostream& s) const;			\
+  void print() const;
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+#define PPL_OUTPUT_DEFINITIONS(class_name)			\
+  void								\
+  Parma_Polyhedra_Library::class_name::ascii_dump() const {	\
+    ascii_dump(std::cerr);					\
+  }								\
+								\
+  void								\
+  Parma_Polyhedra_Library::class_name::print() const {		\
+    using namespace IO_Operators;				\
+    std::cerr << *this;						\
+  }
+
+#define PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name)			\
+  void									\
+  Parma_Polyhedra_Library::class_name::ascii_dump() const {		\
+    ascii_dump(std::cerr);						\
+  }									\
+									\
+  void									\
+  Parma_Polyhedra_Library::class_name::print() const {			\
+    std::cerr << "No user level output operator defined "		\
+	      << "for class " PPL_XSTR(class_name) << "." << std::endl; \
+  }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix)	\
+  template <typename type_symbol>					\
+  void									\
+  class_prefix::ascii_dump() const {					\
+    ascii_dump(std::cerr);						\
+  }									\
+									\
+  template <typename type_symbol>					\
+  void									\
+  class_prefix::print() const {						\
+    using namespace IO_Operators;					\
+    std::cerr << *this;							\
+  }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol, class_prefix) \
+  template <typename type_symbol>					\
+  void									\
+  class_prefix::ascii_dump() const {					\
+    ascii_dump(std::cerr);						\
+  }									\
+									\
+  template <typename type_symbol>					\
+  void									\
+  class_prefix::print() const {						\
+    std::cerr << "No user level output operator defined "		\
+	      << "for " PPL_XSTR(class_prefix) << "." << std::endl;	\
+  }
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/globals.inlines.hh line 1
+/* Implementation of global objects: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/globals.inlines.hh line 27
+#include <limits>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+not_a_dimension() {
+  return std::numeric_limits<dimension_type>::max();
+}
+
+inline
+Throwable::~Throwable() {
+}
+
+inline void
+maybe_abandon() {
+  if (const Throwable* p = abandon_expensive_computations)
+    p->throw_me();
+}
+
+inline dimension_type
+compute_capacity(const dimension_type requested_size,
+		 const dimension_type maximum_size) {
+  assert(requested_size <= maximum_size);
+  // Speculation factor 2.
+  return (requested_size < maximum_size / 2)
+    ? 2*(requested_size + 1)
+    : maximum_size;
+  // Speculation factor 1.5.
+  // return (maximum_size - requested_size > requested_size/2)
+  //   ? requested_size + requested_size/2 + 1
+  //   : maximum_size;
+}
+
+inline void
+normalize2(Coefficient_traits::const_reference x,
+	   Coefficient_traits::const_reference y,
+	   Coefficient& nx, Coefficient& ny) {
+  TEMP_INTEGER(gcd);
+  gcd_assign(gcd, x, y);
+  exact_div_assign(nx, x, gcd);
+  exact_div_assign(ny, y, gcd);
+}
+
+template <typename T>
+inline T
+low_bits_mask(const unsigned n) {
+  assert(n < unsigned(std::numeric_limits<T>::digits));
+  return n == 0 ? 0 : ~(~(T(0u)) << n);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/globals.defs.hh line 289
+
+// Automatically generated from PPL source file ../src/Interval.defs.hh line 1
+/* Declarations for the Interval class and its constituents.
+*/
+
+
+// Automatically generated from PPL source file ../src/Interval.defs.hh line 29
+#include <gmpxx.h>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+typedef Checked_Number<mpq_class, Extended_Number_Policy> ERational;
+
+}
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is less than \p y.
+/*! \relates Boundary */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator<(const Boundary& x, const Boundary& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is greater than \p y.
+/*! \relates Boundary */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator>(const Boundary& x, const Boundary& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An extended rational bound of an interval.
+/*! \ingroup PPL_CXX_interface
+  An object of class Boundary represents either an upper or a lower
+  bound of an interval over the set of extended rational numbers.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Boundary {
+protected:
+  //! Kinds of bounds.
+  enum Flag {
+    //! An open upper bound.
+    NEG = -1,
+    //! A closed (lower or upper) bound.
+    ZERO = 0,
+    //! An open lower bound.
+    POS = 1
+  };
+
+  //! The extended rational value of the bound.
+  ERational value;
+  //! The kind of the bound.
+  Flag flag;
+
+  //! Builds a bound of kind \p f and having value \p v.
+  Boundary(const ERational& v, Flag f);
+
+  friend bool
+  Parma_Polyhedra_Library::operator<(const Boundary& x, const Boundary& y);
+  friend bool
+  Parma_Polyhedra_Library::operator>(const Boundary& x, const Boundary& y);
+
+public:
+  //! Returns <CODE>true</CODE> if and only if \p *this is a closed bound.
+  bool is_closed() const;
+
+  //! Returns a const reference to the value of the bound.
+  const ERational& bound() const;
+
+  //! Returns a reference to the value of the bound.
+  ERational& bound();
+};
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The lower bound of an extended rational interval.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::LBoundary : public Boundary {
+public:
+  //! Kinds of lower bounds.
+  enum Open_Closed {
+    //! An open lower bound.
+    OPEN = Boundary::POS,
+    //! A closed lower bound.
+    CLOSED = Boundary::ZERO
+  };
+
+  //! Builds a lower bound of kind \p f and having value \p v.
+  LBoundary(const ERational& v, Open_Closed f);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The upper bound of an extended rational interval.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::UBoundary : public Boundary {
+public:
+  //! Kinds of upper bounds.
+  enum Open_Closed {
+    //! An open upper bound.
+    OPEN = Boundary::NEG,
+    //! A closed upper bound.
+    CLOSED = Boundary::ZERO
+  };
+
+  //! Builds an upper bound of kind \p f and having value \p v.
+  UBoundary(const ERational& v, Open_Closed f);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A interval over the set of rational numbers.
+/*! \ingroup PPL_CXX_interface
+  An object of class Interval represents a closed/half-closed/open
+  interval over the set of rational numbers \f$\Qset\f$.
+
+  Note that, even though the implementation is capable to represent
+  any interval on the set of <EM>extended</EM> rational numbers,
+  the available public methods only allows for the construction
+  and manipulation of intervals over \f$\Qset\f$.
+  Namely, it is not possible to create a non-empty interval having
+  a <EM>closed</EM> bound whose value is \f$-\infty\f$ or \f$+\infty\f$.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Interval {
+public:
+  //! Constructs the universe interval \f$(-\infty, +\infty) = \Qset\f$.
+  Interval();
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is empty.
+  bool is_empty() const;
+
+  //! Returns a const reference to the interval's lower bound.
+  const LBoundary& lower_bound() const;
+
+  //! Returns a reference to the interval's lower bound.
+  LBoundary& lower_bound();
+
+  //! Returns a const reference to the interval's upper bound.
+  const UBoundary& upper_bound() const;
+
+  //! Returns a reference to the interval's upper bound.
+  UBoundary& upper_bound();
+
+  /*! \brief
+    Raises the interval's lower bound, if \p new_lower is higher
+    than the current one.
+  */
+  void raise_lower_bound(LBoundary new_lower);
+
+  /*! \brief
+    Lowers the interval's upper bound, if \p new_upper is lower
+    than the current one.
+  */
+  void lower_upper_bound(UBoundary new_upper);
+
+  //! Turns \p *this into the empty interval.
+  void set_empty();
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! The interval's lower bound.
+  LBoundary lower;
+
+  //! The interval's upper bound.
+  UBoundary upper;
+};
+
+// Automatically generated from PPL source file ../src/Interval.inlines.hh line 1
+/* Inline functions for the Interval class and its constituents.
+*/
+
+
+#include <cassert>
+// Automatically generated from PPL source file ../src/Interval.inlines.hh line 29
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Boundary::Boundary(const ERational& v, Flag f)
+  : value(v), flag(f) {
+}
+
+inline bool
+Boundary::is_closed() const {
+  return flag == ZERO;
+}
+
+inline const ERational&
+Boundary::bound() const {
+  return value;
+}
+
+inline ERational&
+Boundary::bound() {
+  return value;
+}
+
+inline
+LBoundary::LBoundary(const ERational& v, Open_Closed f)
+  : Boundary(v, f == CLOSED ? ZERO : POS) {
+}
+
+inline
+UBoundary::UBoundary(const ERational& v, Open_Closed f)
+  : Boundary(v, f == CLOSED ? ZERO : NEG) {
+}
+
+/*! \relates Boundary */
+inline bool
+operator<(const Boundary& x, const Boundary& y) {
+  return x.value < y.value ||
+    (x.value == y.value && x.flag < y.flag);
+}
+
+/*! \relates Boundary */
+inline bool
+operator>(const Boundary& x, const Boundary& y) {
+  return y < x;
+}
+
+inline
+Interval::Interval()
+  : lower(ERational(MINUS_INFINITY), LBoundary::OPEN),
+    upper(ERational(PLUS_INFINITY), UBoundary::OPEN) {
+}
+
+inline bool
+Interval::is_empty() const {
+  return lower > upper;
+}
+
+inline const LBoundary&
+Interval::lower_bound() const {
+  return lower;
+}
+
+inline LBoundary&
+Interval::lower_bound() {
+  return lower;
+}
+
+inline const UBoundary&
+Interval::upper_bound() const {
+  return upper;
+}
+
+inline UBoundary&
+Interval::upper_bound() {
+  return upper;
+}
+
+inline void
+Interval::raise_lower_bound(LBoundary new_lower) {
+  if (new_lower > lower)
+    lower = new_lower;
+}
+
+inline void
+Interval::lower_upper_bound(UBoundary new_upper) {
+  if (new_upper < upper)
+    upper = new_upper;
+}
+
+inline void
+Interval::set_empty() {
+  lower = LBoundary(ERational(PLUS_INFINITY), LBoundary::OPEN);
+  upper = UBoundary(ERational(MINUS_INFINITY), UBoundary::OPEN);
+  assert(is_empty());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Interval.defs.hh line 203
+
+// Automatically generated from PPL source file ../src/Bounding_Box.defs.hh line 1
+/* Bounding_Box class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Constraint_System.defs.hh line 1
+/* Constraint_System class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Linear_System.defs.hh line 1
+/* Linear_System class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Matrix.defs.hh line 1
+/* Matrix class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Row.defs.hh line 1
+/* Row class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Row.defs.hh line 29
+#include <vector>
+#include <limits>
+
+#ifndef EXTRA_ROW_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*!
+  \brief
+  Enables extra debugging information for class Row.
+
+  \ingroup PPL_CXX_interface
+  When <CODE>EXTRA_ROW_DEBUG</CODE> evaluates to <CODE>true</CODE>,
+  each instance of the class Row carries its own capacity; this enables
+  extra consistency checks to be performed.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define EXTRA_ROW_DEBUG 0
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The handler of the actual Row implementation.
+/*! \ingroup PPL_CXX_interface
+  Exception-safety is the only responsibility of this class: it has
+  to ensure that its \p impl member is correctly deallocated.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Row_Impl_Handler {
+public:
+  //! Default constructor.
+  Row_Impl_Handler();
+
+  //! Destructor.
+  ~Row_Impl_Handler();
+
+  class Impl;
+
+  //! A pointer to the actual implementation.
+  Impl* impl;
+
+#if EXTRA_ROW_DEBUG
+  //! The capacity of \p impl (only available during debugging).
+  dimension_type capacity_;
+#endif // EXTRA_ROW_DEBUG
+
+private:
+  //! Private and unimplemented: copy construction is not allowed.
+  Row_Impl_Handler(const Row_Impl_Handler&);
+
+  //! Private and unimplemented: copy assignment is not allowed.
+  Row_Impl_Handler& operator=(const Row_Impl_Handler&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sequence of coefficients.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Row : private Row_Impl_Handler {
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Wrapper class to represent a set of flags with bits in a native
+    unsigned integral type.
+    \ingroup PPL_CXX_interface
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  class Flags {
+  public:
+    //! Constructs an object with all the flags unset.
+    Flags();
+
+    //! Returns <CODE>true</CODE> if and only if \p *this and \p y are equal.
+    bool operator==(const Flags& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y
+      are different.
+    */
+    bool operator!=(const Flags& y) const;
+
+    PPL_OUTPUT_DECLARATIONS;
+
+    //! Uses the ASCII Flags representation from \p s to recreate *this.
+    /*!
+      Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+      otherwise.  The ASCII representation is as output by
+      \ref Parma_Polyhedra_Library::Row::Flags::ascii_dump.
+    */
+    bool ascii_load(std::istream& s);
+
+  protected:
+    //! A native integral type holding the bits that encode the flags.
+    typedef unsigned int base_type;
+
+    //! Index of the first bit derived classes can use.
+    static const unsigned first_free_bit = 0;
+
+    //! Total number of bits that can be stored.
+    static const unsigned num_bits = std::numeric_limits<base_type>::digits;
+
+    //! Constructs an object with flags set as in \p n.
+    explicit Flags(base_type n);
+
+    //! Returns the integer encoding \p *this.
+    base_type get_bits() const;
+
+    //! Sets the bits in \p mask.
+    void set_bits(base_type mask);
+
+    //! Resets the bits in \p mask.
+    void reset_bits(base_type mask);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if all the bits
+      in \p mask are set.
+    */
+    bool test_bits(base_type mask) const;
+
+  private:
+    //! The integer encoding \p *this.
+    base_type bits;
+
+    friend class Row;
+  };
+
+  //! Pre-constructs a row: construction must be completed by construct().
+  Row();
+
+  //! \name Post-constructors
+  //@{
+  //! Constructs properly a default-constructed element.
+  /*!
+    Builds a row with size and capacity \p sz and flags \p f.
+  */
+  void construct(dimension_type sz, Flags f);
+
+  //! Constructs properly a default-constructed element.
+  /*!
+    \param sz
+    The size of the row that will be constructed;
+
+    \param capacity
+    The capacity of the row that will be constructed;
+
+    \param f
+    Flags for the row that will be constructed.
+
+    The row that is constructed has storage for \p capacity elements,
+    \p sz of which are default-constructed now.
+    The row flags are set to \p f.
+  */
+  void construct(dimension_type sz, dimension_type capacity, Flags f);
+  //@} // Post-constructors
+
+  //! Tight constructor: resizing may require reallocation.
+  /*!
+    Constructs a row with size and capacity \p sz, and flags \p f.
+  */
+  Row(dimension_type sz, Flags f);
+
+  //! Sizing constructor with capacity.
+  /*!
+    \param sz
+    The size of the row that will be constructed;
+
+    \param capacity
+    The capacity of the row that will be constructed;
+
+    \param f
+    Flags for the row that will be constructed.
+
+    The row that is constructed has storage for \p capacity elements,
+    \p sz of which are default-constructed now.
+    The row flags are set to \p f.
+  */
+  Row(dimension_type sz, dimension_type capacity, Flags f);
+
+  //! Ordinary copy constructor.
+  Row(const Row& y);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to
+    the size of \p y.
+  */
+  Row(const Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is greater than or equal to the size of \p y
+    and, of course, that \p sz is less than or equal to \p capacity.
+  */
+  Row(const Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Destructor.
+  ~Row();
+
+  //! Assignment operator.
+  Row& operator=(const Row& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Row& y);
+
+  //! Assigns the implementation of \p y to \p *this.
+  /*!
+    To be used with extra care, since it may easily cause memory leaks
+    or undefined behavior.
+  */
+  void assign(Row& y);
+
+  /*! \brief
+    Allocates memory for a default constructed Row object, setting
+    flags to \p f and allowing for \p capacity coefficients at most.
+
+    It is assumed that no allocation has been performed before
+    (otherwise, a memory leak will occur).
+    After execution, the size of the Row object is zero.
+  */
+  void allocate(dimension_type capacity, Flags f);
+
+  //! Expands the row to size \p new_size.
+  /*!
+    Adds new positions to the implementation of the row
+    obtaining a new row with size \p new_size.
+    It is assumed that \p new_size is between the current size
+    and capacity of the row.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    Destroys elements of the row implementation
+    from position \p new_size to the end.
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Returns a const reference to the flags of \p *this.
+  const Flags& flags() const;
+
+  //! Returns a non-const reference to the flags of \p *this.
+  Flags& flags();
+
+  //! Returns the size() of the largest possible Row.
+  static dimension_type max_size();
+
+  //! Gives the number of coefficients currently in use.
+  dimension_type size() const;
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the element of the row indexed by \p k.
+  Coefficient& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  Coefficient_traits::const_reference operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  //! Normalizes the modulo of coefficients so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the elements of
+    the row and normalizes them by the GCD itself.
+  */
+  void normalize();
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  //! Uses the ASCII Row representation at \p s to recreate *this.
+  /*!
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+    otherwise.  The ASCII representation is as output by \ref ascii_dump.
+  */
+  bool ascii_load(std::istream& s);
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns the total size in bytes of the memory occupied by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  /*! \brief
+    Returns the size in bytes of the memory managed by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const Row& y);
+
+#if EXTRA_ROW_DEBUG
+  //! Returns the capacity of the row (only available during debugging).
+  dimension_type capacity() const;
+#endif // EXTRA_ROW_DEBUG
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Row */
+bool operator==(const Row& x, const Row& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Row */
+bool operator!=(const Row& x, const Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Row& x,
+	  Parma_Polyhedra_Library::Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
+	       std::vector<Parma_Polyhedra_Library::Row>::iterator y);
+
+} // namespace std
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The actual implementation of a Row object.
+/*! \ingroup PPL_CXX_interface
+  The class Row_Impl_Handler::Impl provides the implementation of Row
+  objects and, in particular, of the corresponding memory allocation
+  functions.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Row_Impl_Handler::Impl {
+public:
+  //! \name Custom allocator and deallocator
+  //@{
+
+  /*! \brief
+    Allocates a chunk of memory able to contain \p capacity Coefficient objects
+    beyond the specified \p fixed_size and returns a pointer to the new
+    allocated memory.
+  */
+  static void* operator new(size_t fixed_size, dimension_type capacity);
+
+  //! Uses the standard delete operator to free the memory \p p points to.
+  static void operator delete(void* p);
+
+  /*! \brief
+    Placement version:
+    uses the standard operator delete to free the memory \p p points to.
+  */
+  static void operator delete(void* p, dimension_type capacity);
+  //@} // Custom allocator and deallocator
+
+  //! Constructor.
+  Impl(Row::Flags f);
+
+  //! Destructor.
+  /*!
+    Uses <CODE>shrink()</CODE> method with argument \f$0\f$
+    to delete all the row elements.
+  */
+  ~Impl();
+
+  //! Expands the row to size \p new_size.
+  /*!
+    It is assumed that \p new_size is between the current size and capacity.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const Impl& y);
+
+  //! Returns the size() of the largest possible Impl.
+  static dimension_type max_size();
+
+  //! \name Flags accessors
+  //@{
+  //! Returns a const reference to the flags of \p *this.
+  const Row::Flags& flags() const;
+
+  //! Returns a non-const reference to the flags of \p *this.
+  Row::Flags& flags();
+  //@} // Flags accessors
+
+  //! \name Size accessors
+  //@{
+  //! Returns the actual size of \p this.
+  dimension_type size() const;
+
+  //! Sets to \p new_size the actual size of \p *this.
+  void set_size(dimension_type new_size);
+
+  //! Increment the size of \p *this by 1.
+  void bump_size();
+  //@} // Size accessors
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the element of \p *this indexed by \p k.
+  Coefficient& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of \p *this indexed by \p k.
+  Coefficient_traits::const_reference operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+private:
+  //! The number of coefficients in the row.
+  dimension_type size_;
+
+  //! The flags of this row.
+  Row::Flags flags_;
+
+  //! The vector of coefficients.
+  Coefficient vec_[
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+	       1
+#endif
+  ];
+
+  //! Private and unimplemented: default construction is not allowed.
+  Impl();
+
+  //! Private and unimplemented: copy construction is not allowed.
+  Impl(const Impl& y);
+
+  //! Private and unimplemented: assignment is not allowed.
+  Impl& operator=(const Impl&);
+};
+
+// Automatically generated from PPL source file ../src/Row.inlines.hh line 1
+/* Row class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Row.inlines.hh line 27
+#include <cassert>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Row::Flags::Flags()
+  : bits(0) {
+}
+
+inline
+Row::Flags::Flags(base_type n)
+  : bits(n) {
+}
+
+inline Row::Flags::base_type
+Row::Flags::get_bits() const {
+  return bits;
+}
+
+inline void
+Row::Flags::set_bits(const base_type mask) {
+  bits |= mask;
+}
+
+inline void
+Row::Flags::reset_bits(const base_type mask) {
+  bits &= ~mask;
+}
+
+inline bool
+Row::Flags::test_bits(const base_type mask) const {
+  return (bits & mask) == mask;
+}
+
+inline bool
+Row::Flags::operator==(const Flags& y) const {
+  base_type mask = low_bits_mask<base_type>(first_free_bit);
+  return (get_bits() & mask) == (y.get_bits() & mask);
+}
+
+inline bool
+Row::Flags::operator!=(const Flags& y) const {
+  return !operator==(y);
+}
+
+inline void*
+Row_Impl_Handler::Impl::operator new(const size_t fixed_size,
+				     const dimension_type capacity) {
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  return ::operator new(fixed_size + capacity*sizeof(Coefficient));
+#else
+  assert(capacity >= 1);
+  return ::operator new(fixed_size + (capacity-1)*sizeof(Coefficient));
+#endif
+}
+
+inline void
+Row_Impl_Handler::Impl::operator delete(void* p) {
+  ::operator delete(p);
+}
+
+inline void
+Row_Impl_Handler::Impl::operator delete(void* p, dimension_type) {
+  ::operator delete(p);
+}
+
+inline dimension_type
+Row_Impl_Handler::Impl::max_size() {
+  return size_t(-1)/sizeof(Coefficient);
+}
+
+inline dimension_type
+Row_Impl_Handler::Impl::size() const {
+  return size_;
+}
+
+inline void
+Row_Impl_Handler::Impl::set_size(const dimension_type new_size) {
+  size_ = new_size;
+}
+
+inline void
+Row_Impl_Handler::Impl::bump_size() {
+  ++size_;
+}
+
+inline
+Row_Impl_Handler::Impl::Impl(const Row::Flags f)
+  : size_(0), flags_(f) {
+}
+
+inline
+Row_Impl_Handler::Impl::~Impl() {
+  shrink(0);
+}
+
+inline const Row::Flags&
+Row_Impl_Handler::Impl::flags() const {
+  return flags_;
+}
+
+inline Row::Flags&
+Row_Impl_Handler::Impl::flags() {
+  return flags_;
+}
+
+inline Coefficient&
+Row_Impl_Handler::Impl::operator[](const dimension_type k) {
+  assert(k < size());
+  return vec_[k];
+}
+
+inline Coefficient_traits::const_reference
+Row_Impl_Handler::Impl::operator[](const dimension_type k) const {
+  assert(k < size());
+  return vec_[k];
+}
+
+inline memory_size_type
+Row_Impl_Handler::Impl::total_memory_in_bytes(dimension_type capacity) const {
+  return
+    sizeof(*this)
+    + capacity*sizeof(Coefficient)
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+    - 1*sizeof(Coefficient)
+#endif
+    + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Row_Impl_Handler::Impl::total_memory_in_bytes() const {
+  // In general, this is a lower bound, as the capacity of *this
+  // may be strictly greater than `size_'
+  return total_memory_in_bytes(size_);
+}
+
+inline dimension_type
+Row::max_size() {
+  return Impl::max_size();
+}
+
+inline dimension_type
+Row::size() const {
+  return impl->size();
+}
+
+inline const Row::Flags&
+Row::flags() const {
+  return impl->flags();
+}
+
+inline Row::Flags&
+Row::flags() {
+  return impl->flags();
+}
+
+#if EXTRA_ROW_DEBUG
+inline dimension_type
+Row::capacity() const {
+  return capacity_;
+}
+#endif
+
+inline
+Row_Impl_Handler::Row_Impl_Handler()
+  : impl(0) {
+#if EXTRA_ROW_DEBUG
+  capacity_ = 0;
+#endif
+}
+
+inline
+Row_Impl_Handler::~Row_Impl_Handler() {
+  delete impl;
+}
+
+inline
+Row::Row()
+  : Row_Impl_Handler() {
+}
+
+inline void
+Row::allocate(
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+	       const
+#endif
+	       dimension_type capacity,
+	       const Flags f) {
+  assert(capacity <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (capacity == 0)
+    ++capacity;
+#endif
+  assert(impl == 0);
+  impl = new (capacity) Impl(f);
+#if EXTRA_ROW_DEBUG
+  assert(capacity_ == 0);
+  capacity_ = capacity;
+#endif
+}
+
+inline void
+Row::expand_within_capacity(const dimension_type new_size) {
+  assert(impl);
+#if EXTRA_ROW_DEBUG
+  assert(new_size <= capacity_);
+#endif
+  impl->expand_within_capacity(new_size);
+}
+
+inline void
+Row::copy_construct_coefficients(const Row& y) {
+  assert(impl && y.impl);
+#if EXTRA_ROW_DEBUG
+  assert(y.size() <= capacity_);
+#endif
+  impl->copy_construct_coefficients(*(y.impl));
+}
+
+inline void
+Row::construct(const dimension_type sz,
+	       const dimension_type capacity,
+	       const Flags f) {
+  assert(sz <= capacity && capacity <= max_size());
+  allocate(capacity, f);
+  expand_within_capacity(sz);
+}
+
+inline void
+Row::construct(const dimension_type sz, const Flags f) {
+  construct(sz, sz, f);
+}
+
+inline
+Row::Row(const dimension_type sz,
+	 const dimension_type capacity,
+	 const Flags f)
+  : Row_Impl_Handler() {
+  construct(sz, capacity, f);
+}
+
+inline
+Row::Row(const dimension_type sz, const Flags f)
+  : Row_Impl_Handler() {
+  construct(sz, f);
+}
+
+inline
+Row::Row(const Row& y)
+  : Row_Impl_Handler() {
+  if (y.impl) {
+    allocate(compute_capacity(y.size(), max_size()), y.flags());
+    copy_construct_coefficients(y);
+  }
+}
+
+inline
+Row::Row(const Row& y,
+	 const dimension_type capacity)
+  : Row_Impl_Handler() {
+  assert(y.impl);
+  assert(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity, y.flags());
+  copy_construct_coefficients(y);
+}
+
+inline
+Row::Row(const Row& y,
+	 const dimension_type sz,
+	 const dimension_type capacity)
+  : Row_Impl_Handler() {
+  assert(y.impl);
+  assert(y.size() <= sz && sz <= capacity && capacity <= max_size());
+  allocate(capacity, y.flags());
+  copy_construct_coefficients(y);
+  expand_within_capacity(sz);
+}
+
+inline
+Row::~Row() {
+}
+
+inline void
+Row::shrink(const dimension_type new_size) {
+  assert(impl);
+  impl->shrink(new_size);
+}
+
+inline void
+Row::swap(Row& y) {
+  std::swap(impl, y.impl);
+#if EXTRA_ROW_DEBUG
+  std::swap(capacity_, y.capacity_);
+#endif
+}
+
+inline void
+Row::assign(Row& y) {
+  impl = y.impl;
+#if EXTRA_ROW_DEBUG
+  capacity_ = y.capacity_;
+#endif
+}
+
+inline Row&
+Row::operator=(const Row& y) {
+  // Copy-construct `tmp' from `y'.
+  Row tmp(y);
+  // Swap the implementation of `*this' with the one of `tmp'.
+  swap(tmp);
+  // Now `tmp' goes out of scope, so the old `*this' will be destroyed.
+  return *this;
+}
+
+inline Coefficient&
+Row::operator[](const dimension_type k) {
+  assert(impl);
+  return (*impl)[k];
+}
+
+inline Coefficient_traits::const_reference
+Row::operator[](const dimension_type k) const {
+  assert(impl);
+  return (*impl)[k];
+}
+
+inline memory_size_type
+Row::external_memory_in_bytes(dimension_type capacity) const {
+  return impl->total_memory_in_bytes(capacity);
+}
+
+inline memory_size_type
+Row::total_memory_in_bytes(dimension_type capacity) const {
+  return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+inline memory_size_type
+Row::external_memory_in_bytes() const {
+#if EXTRA_ROW_DEBUG
+  return impl->total_memory_in_bytes(capacity_);
+#else
+  return impl->total_memory_in_bytes();
+#endif
+}
+
+inline memory_size_type
+Row::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Row */
+inline bool
+operator!=(const Row& x, const Row& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Row */
+inline void
+swap(Parma_Polyhedra_Library::Row& x, Parma_Polyhedra_Library::Row& y) {
+  x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Row.defs.hh line 495
+
+// Automatically generated from PPL source file ../src/Matrix.defs.hh line 31
+#include <vector>
+#include <cstddef>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A 2-dimensional matrix of coefficients.
+/*! \ingroup PPL_CXX_interface
+  A Matrix object is a sequence of Row objects and is characterized
+  by the matrix dimensions (the number of rows and columns).
+  All the rows in a matrix, besides having the same size (corresponding
+  to the number of columns of the matrix), are also bound to have the
+  same capacity.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Matrix {
+public:
+  //! Returns the maximum number of rows of a Matrix.
+  static dimension_type max_num_rows();
+
+  //! Returns the maximum number of columns of a Matrix.
+  static dimension_type max_num_columns();
+
+  //! Builds an empty matrix.
+  /*!
+    Rows' size and capacity are initialized to \f$0\f$.
+  */
+  Matrix();
+
+  //! Builds a zero matrix with specified dimensions and flags.
+  /*!
+    \param n_rows
+    The number of rows of the matrix that will be created;
+
+    \param n_columns
+    The number of columns of the matrix that will be created.
+
+    \param row_flags
+    The flags used to build the rows of the matrix;
+    by default, the rows will have all flags unset.
+  */
+  Matrix(dimension_type n_rows, dimension_type n_columns,
+	 Row::Flags row_flags = Row::Flags());
+
+  //! Copy-constructor.
+  Matrix(const Matrix& y);
+
+  //! Destructor.
+  ~Matrix();
+
+  //! Assignment operator.
+  Matrix& operator=(const Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! An iterator over a matrix.
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each row contained in a Matrix object.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  class const_iterator {
+  private:
+    typedef std::vector<Row>::const_iterator Iter;
+    //! The const iterator on the rows' vector \p rows.
+    Iter i;
+
+  public:
+    typedef std::forward_iterator_tag iterator_category;
+    typedef std::iterator_traits<Iter>::value_type value_type;
+    typedef std::iterator_traits<Iter>::difference_type difference_type;
+    typedef std::iterator_traits<Iter>::pointer pointer;
+    typedef std::iterator_traits<Iter>::reference reference;
+
+    //! Default constructor.
+    const_iterator();
+
+    /*! \brief
+      Builds a const iterator on the matrix starting from
+      an iterator \p b on the elements of the vector \p rows.
+    */
+    explicit const_iterator(const Iter& b);
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    reference operator*() const;
+
+    //! Indirect member selector.
+    pointer operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first row, if \p *this is
+    not empty; otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  // FIXME: the following section must become private.
+protected:
+  //! Contains the rows of the matrix.
+  std::vector<Row> rows;
+
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
+
+  //! Capacity allocated for each row.
+  dimension_type row_capacity;
+
+public:
+  //! Swaps \p *this with \p y.
+  void swap(Matrix& y);
+
+  //! Adds to the matrix \p n rows of zeroes with flags set to \p row_flags.
+  /*!
+    \param n
+    The number of rows to be added: must be strictly positive.
+
+    \param row_flags
+    Flags for the newly added rows.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+n) \times c\f$ matrix \f$M \choose 0\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_zero_rows(dimension_type n, Row::Flags row_flags);
+
+  //! Adds \p n columns of zeroes to the matrix.
+  /*!
+    \param n
+    The number of columns to be added: must be strictly positive.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$r \times (c+n)\f$ matrix \f$(M \, 0)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_zero_columns(dimension_type n);
+
+  //! Adds \p n rows and \p m columns of zeroes to the matrix.
+  /*!
+    \param n
+    The number of rows to be added: must be strictly positive.
+
+    \param m
+    The number of columns to be added: must be strictly positive.
+
+    \param row_flags
+    Flags for the newly added rows.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+n) \times (c+m)\f$ matrix
+    \f$\bigl({M \atop 0}{0 \atop 0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_zero_rows_and_columns(dimension_type n, dimension_type m,
+				 Row::Flags row_flags);
+
+  //! Adds a copy of the row \p y to the matrix.
+  /*!
+    \param y
+    The row to be copied: it must have the same number of columns as
+    the matrix.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+1) \times c\f$ matrix
+    \f$\bigl({M \atop 0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_row(const Row& y);
+
+  //! Adds the row \p y to the matrix.
+  /*!
+    \param y
+    The row to be added: it must have the same size and capacity as \p
+    *this.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+1) \times c\f$ matrix
+    \f$\bigl({M \atop 0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_recycled_row(Row& y);
+
+  //! Makes the matrix shrink by removing its \p n trailing columns.
+  void remove_trailing_columns(dimension_type n);
+
+  //! Resizes the matrix without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows of the resized matrix;
+
+    \param new_n_columns
+    The number of columns of the resized matrix.
+
+    \param row_flags
+    The flags of the rows eventually added to the matrix.
+
+    The matrix is expanded to the specified dimensions avoiding
+    reallocation whenever possible.
+    The contents of the original matrix is lost.
+  */
+  void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns,
+		      Row::Flags row_flags);
+
+  //! Swaps the columns having indexes \p i and \p j.
+  void swap_columns(dimension_type i,  dimension_type j);
+
+  //! Permutes the columns of the matrix.
+  /*
+    \param cycles
+    A vector representing the non-trivial cycles of the permutation
+    according to which the columns must be rearranged.
+
+    The \p cycles vector contains, one after the other, the
+    non-trivial cycles (i.e., the cycles of length greater than one)
+    of a permutation of non-zero column indexes.  Each cycle is
+    terminated by zero.  For example, assuming the matrix has 6
+    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+    turn can be represented by a vector of 6 elements containing 1, 3,
+    6, 0, 2, 4, 0.
+  */
+  void permute_columns(const std::vector<dimension_type>& cycles);
+
+  //! \name Accessors
+  //@{
+
+  //! Returns the number of columns of the matrix (i.e., the size of the rows).
+  dimension_type num_columns() const;
+
+  //! Returns the number of rows in the matrix.
+  dimension_type num_rows() const;
+  //@} // Accessors
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the \p k-th row of the matrix.
+  Row& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the matrix.
+  const Row& operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  //! Clears the matrix deallocating all its rows.
+  void clear();
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
+    <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Erases from the matrix all the rows but those having
+    an index less than \p first_to_erase.
+  */
+  void erase_to_end(dimension_type first_to_erase);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Specializes <CODE>std::swap</CODE>.
+  /*! \relates Parma_Polyhedra_Library::Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Matrix& x,
+	  Parma_Polyhedra_Library::Matrix& y);
+
+} // namespace std
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator==(const Matrix& x, const Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator!=(const Matrix& x, const Matrix& y);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Matrix.inlines.hh line 1
+/* Matrix class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Matrix.inlines.hh line 27
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Matrix::max_num_rows() {
+  return std::vector<Row>().max_size();
+}
+
+inline dimension_type
+Matrix::max_num_columns() {
+  return Row::max_size();
+}
+
+inline memory_size_type
+Matrix::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline
+Matrix::const_iterator::const_iterator()
+  : i(Iter()) {
+}
+
+inline
+Matrix::const_iterator::const_iterator(const Iter& b)
+  : i(b) {
+}
+
+inline
+Matrix::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i) {
+}
+
+inline Matrix::const_iterator&
+Matrix::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  return *this;
+}
+
+inline Matrix::const_iterator::reference
+Matrix::const_iterator::operator*() const {
+  return *i;
+}
+
+inline Matrix::const_iterator::pointer
+Matrix::const_iterator::operator->() const {
+  return &*i;
+}
+
+inline Matrix::const_iterator&
+Matrix::const_iterator::operator++() {
+  ++i;
+  return *this;
+}
+
+inline Matrix::const_iterator
+Matrix::const_iterator::operator++(int) {
+  return const_iterator(i++);
+}
+
+inline bool
+Matrix::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Matrix::const_iterator::operator!=(const const_iterator& y) const {
+  return !operator==(y);
+}
+
+inline Matrix::const_iterator
+Matrix::begin() const {
+  return const_iterator(rows.begin());
+}
+
+inline Matrix::const_iterator
+Matrix::end() const {
+  return const_iterator(rows.end());
+}
+
+inline void
+Matrix::swap(Matrix& y) {
+  std::swap(rows, y.rows);
+  std::swap(row_size, y.row_size);
+  std::swap(row_capacity, y.row_capacity);
+}
+
+inline
+Matrix::Matrix()
+  : rows(),
+    row_size(0),
+    row_capacity(0) {
+}
+
+inline
+Matrix::Matrix(const Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+}
+
+inline
+Matrix::~Matrix() {
+}
+
+inline Matrix&
+Matrix::operator=(const Matrix& y) {
+  // Without the following guard against auto-assignments we would
+  // recompute the row capacity based on row size, possibly without
+  // actually increasing the capacity of the rows.  This would lead to
+  // an inconsistent state.
+  if (this != &y) {
+    // The following assignment may do nothing on auto-assignments...
+    rows = y.rows;
+    row_size = y.row_size;
+    // ... hence the following assignment must not be done on
+    // auto-assignments.
+    row_capacity = compute_capacity(y.row_size, max_num_columns());
+  }
+  return *this;
+}
+
+inline void
+Matrix::add_row(const Row& y) {
+  Row new_row(y, row_capacity);
+  add_recycled_row(new_row);
+}
+
+inline Row&
+Matrix::operator[](const dimension_type k) {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+inline const Row&
+Matrix::operator[](const dimension_type k) const {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+inline dimension_type
+Matrix::num_rows() const {
+  return rows.size();
+}
+
+inline dimension_type
+Matrix::num_columns() const {
+  return row_size;
+}
+
+/*! \relates Matrix */
+inline bool
+operator!=(const Matrix& x, const Matrix& y) {
+  return !(x == y);
+}
+
+inline void
+Matrix::erase_to_end(const dimension_type first_to_erase) {
+  assert(first_to_erase <= rows.size());
+  if (first_to_erase < rows.size())
+    rows.erase(rows.begin() + first_to_erase, rows.end());
+}
+
+inline void
+Matrix::clear() {
+  // Clear `rows' and minimize its capacity.
+  std::vector<Row>().swap(rows);
+  row_size = 0;
+  row_capacity = 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+inline void
+swap(Parma_Polyhedra_Library::Matrix& x,
+     Parma_Polyhedra_Library::Matrix& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Matrix.defs.hh line 355
+
+// Automatically generated from PPL source file ../src/Topology.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Kinds of polyhedra domains.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+enum Topology {
+  NECESSARILY_CLOSED = 0,
+  NOT_NECESSARILY_CLOSED = 1
+};
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Linear_Row.defs.hh line 1
+/* Linear_Row class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Linear_Row.defs.hh line 33
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for linear expressions, constraints and generators.
+/*! \ingroup PPL_CXX_interface
+  The class Linear_Row allows us to build objects of the form
+  \f$[b, a_0, \ldots, a_{d-1}]_{(t, k)}\f$,
+  i.e., a finite sequence of coefficients subscripted by a pair of flags,
+  which are both stored in a Linear_Row::Flags object.
+  The flag \f$t \in \{ \mathrm{c}, \mathrm{nnc} \}\f$ represents
+  the <EM>topology</EM> and
+  the flag \f$k \in \{\mathord{=}, \mathord{\geq} \}\f$ represents
+  the <EM>kind</EM> of the Linear_Row object.
+  Note that, even though all the four possible combinations of topology
+  and kind values will result in a legal Linear_Row::Flags object, some
+  of these pose additional constraints on the values of the Linear_Row's
+  coefficients.
+
+  When \f$t = c\f$, we have the following cases
+  (\f$d\f$ is the dimension of the vector space):
+    - \f$[b, a_0, \ldots, a_{d-1}]_{(c,=)}\f$
+      represents the equality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$
+      represents the non-strict inequality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$.
+    - \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$
+      represents the line of direction
+      \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+    - \f$[0, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$
+      represents the ray of direction
+      \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$, with \f$b > 0\f$,
+      represents the point
+      \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+
+  When \f$t = \mathrm{nnc}\f$, the last coefficient of the Linear_Row is
+  associated to the slack variable \f$\epsilon\f$, so that we have the
+  following cases (\f$d\f$ is again the dimension of the vector space,
+  but this time we have \f$d+2\f$ coefficients):
+    - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$
+      represents the equality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$
+      represents the non-strict inequality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$,
+      with \f$e < 0\f$, represents the strict inequality constraint
+      \f$\sum_{i=0}^{d-1} a_i x_i + b > 0\f$.
+    - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$
+      represents the line of direction
+      \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+    - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$
+      represents the ray of direction
+      \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$,
+      with \f$b > 0\f$ and \f$e > 0\f$, represents the point
+      \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+    - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$,
+      with \f$b > 0\f$, represents the closure point
+      \f$\vect{c} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+
+  So, a Linear_Row can be both a constraint and a generator: it can be an
+  equality, a strict or non-strict inequality, a line, a ray, a point
+  or a closure point.
+
+  The inhomogeneous term of a constraint can be zero or different from zero.
+
+  Points and closure points must have a positive inhomogeneous term
+  (which is used as a common divisor for all the other coefficients),
+  lines and rays must have the inhomogeneous term equal to zero.
+  If needed, the coefficients of points and closure points are negated
+  at creation time so that they satisfy this invariant.
+  The invariant is maintained because, when combining a point or closure
+  point with another generator, we only consider positive combinations.
+
+  The \f$\epsilon\f$ coefficient, when present, is negative for strict
+  inequality constraints, positive for points and equal to zero in all
+  the other cases.
+  Note that the above description corresponds to the end-user, high-level
+  view of a Linear_Row object. In the implementation, to allow for code reuse,
+  it is sometimes useful to regard an \f$\mathrm{nnc}\f$-object on
+  the vector space \f$\Rset^d\f$ as if it was a \f$\mathrm{c}\f$-object
+  on the vector space \f$\Rset^{d+1}\f$, therefore interpreting the slack
+  variable \f$\epsilon\f$ as an ordinary dimension of the vector space.
+
+  A Linear_Row object implementing a Linear_Expression is always of the form
+  \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$, which represents the
+  linear expression \f$\sum_{i=0}^{d-1} a_i x_i\f$.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Linear_Row : public Row {
+public:
+  //! The possible kinds of Linear_Row objects.
+  enum Kind {
+    LINE_OR_EQUALITY = 0,
+    RAY_OR_POINT_OR_INEQUALITY = 1
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    The type of the object to which the coefficients refer to,
+    encoding both topology and kind.
+
+    \ingroup PPL_CXX_interface
+    This combines the information about the topology (necessarily closed
+    or not) and the kind (line/equality or ray/point/inequality)
+    of a Linear_Row object.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  class Flags : public Row::Flags {
+  public:
+    //! Default constructor: builds an object where all flags are invalid.
+    Flags();
+
+    //! Builds an object corresponding to the topology \p t.
+    explicit Flags(Topology t);
+
+    //! Builds an object corresponding to the topology \p t and kind \p k.
+    Flags(Topology t, Kind k);
+
+    //! \name Testing and setting the type
+    //@{
+    Topology topology() const;
+    bool is_necessarily_closed() const;
+    bool is_not_necessarily_closed() const;
+    bool is_line_or_equality() const;
+    bool is_ray_or_point_or_inequality() const;
+
+    void set_necessarily_closed();
+    void set_not_necessarily_closed();
+    void set_is_line_or_equality();
+    void set_is_ray_or_point_or_inequality();
+    //@} // Testing and setting the type
+
+    //! Returns <CODE>true</CODE> if and only if \p *this and \p y are equal.
+    bool operator==(const Flags& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y
+      are different.
+    */
+    bool operator!=(const Flags& y) const;
+
+    PPL_OUTPUT_DECLARATIONS;
+
+    //! Uses the ASCII Flags representation from \p s to recreate *this.
+    /*!
+      Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+      otherwise.  The ASCII representation is as output by \ref ascii_dump.
+    */
+    bool ascii_load(std::istream& s);
+
+  private:
+    //! Builds the type from a bit-mask.
+    explicit Flags(base_type mask);
+
+    //! \name The bits that are currently in use
+    //@{
+    // NB: ascii_load assumes that these are sequential.
+    static const unsigned rpi_validity_bit
+    = Row::Flags::first_free_bit + 0;
+    static const unsigned rpi_bit
+    = Row::Flags::first_free_bit + 1;
+    static const unsigned nnc_validity_bit
+    = Row::Flags::first_free_bit + 2;
+    static const unsigned nnc_bit
+    = Row::Flags::first_free_bit + 3;
+    //@}
+
+  protected:
+    //! Index of the first bit derived classes can use.
+    static const unsigned first_free_bit
+    = Row::Flags::first_free_bit + 4;
+
+    friend class Parma_Polyhedra_Library::Linear_Row;
+  };
+
+  //! Pre-constructs a row: construction must be completed by construct().
+  Linear_Row();
+
+  //! \name Post-constructors
+  //@{
+  //! Constructs properly a default-constructed element.
+  /*!
+    Builds a row with type \p t, size \p sz and minimum capacity.
+  */
+  void construct(dimension_type sz, Flags f);
+
+  //! Constructs properly a default-constructed element.
+  /*!
+    \param sz
+    The size of the row that will be constructed;
+
+    \param capacity
+    The minimum capacity of the row that will be constructed.
+
+    \param f
+    Flags for the row that will be constructed.
+
+    The row that we are constructing has a minimum capacity, i.e., it
+    can contain at least \p capacity elements, \p sz of which will be
+    default-constructed now. The row flags are set to \p f.
+  */
+  void construct(dimension_type sz, dimension_type capacity, Flags f);
+  //@} // Post-constructors
+
+  //! Tight constructor: resizing will require reallocation.
+  Linear_Row(dimension_type sz, Flags f);
+
+  //! Sizing constructor with capacity.
+  Linear_Row(dimension_type sz, dimension_type capacity, Flags f);
+
+  //! Ordinary copy constructor.
+  Linear_Row(const Linear_Row& y);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to \p y size.
+  */
+  Linear_Row(const Linear_Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is greater than or equal to the size of \p y
+    and, of course, that \p sz is less than or equal to \p capacity.
+  */
+  Linear_Row(const Linear_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Destructor.
+  ~Linear_Row();
+
+  //! \name Flags inspection methods
+  //@{
+  //! Returns a const reference to the flags of \p *this.
+  const Flags& flags() const;
+
+  //! Returns a non-const reference to the flags of \p *this.
+  Flags& flags();
+
+  //! Returns the topological kind of \p *this.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is not necessarily closed.
+  */
+  bool is_not_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a line or an equality.
+  */
+  bool is_line_or_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a ray, a point or an inequality.
+  */
+  bool is_ray_or_point_or_inequality() const;
+  //@} // Flags inspection methods
+
+  //! \name Flags coercion methods
+  //@{
+  //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_necessarily_closed();
+
+  //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_not_necessarily_closed();
+
+  //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+  void set_is_line_or_equality();
+
+  //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+  void set_is_ray_or_point_or_inequality();
+  //@} // Flags coercion methods
+
+  //! Returns the maximum space dimension a Linear_Row can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the inhomogeneous term.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns the coefficient \f$a_n\f$.
+  Coefficient_traits::const_reference coefficient(dimension_type n) const;
+
+  /*! \brief
+    Normalizes the sign of the coefficients so that the first non-zero
+    (homogeneous) coefficient of a line-or-equality is positive.
+  */
+  void sign_normalize();
+
+  /*! \brief
+    Strong normalization: ensures that different Linear_Row objects
+    represent different hyperplanes or hyperspaces.
+
+    Applies both Linear_Row::normalize() and Linear_Row::sign_normalize().
+  */
+  void strong_normalize();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the coefficients are
+    strongly normalized.
+  */
+  bool check_strong_normalized() const;
+
+  //! Linearly combines \p *this with \p y so that <CODE>*this[k]</CODE> is 0.
+  /*!
+    \param y
+    The Linear_Row that will be combined with \p *this object;
+
+    \param k
+    The position of \p *this that have to be \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the element of index \p k equal to \f$0\f$. Then it assigns
+    the resulting Linear_Row to \p *this and normalizes it.
+  */
+  void linear_combine(const Linear_Row& y, dimension_type k);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are \f$0\f$.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  //! Uses the ASCII Linear_Row representation from \p s to recreate *this.
+  /*!
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+    otherwise.  The ASCII representation is as output by \ref ascii_dump.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+  friend class Parma_Polyhedra_Library::Linear_Expression;
+  friend class Parma_Polyhedra_Library::Constraint;
+  friend class Parma_Polyhedra_Library::Generator;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Linear_Row */
+bool operator==(const Linear_Row& x, const Linear_Row& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_Row */
+bool operator!=(const Linear_Row& x, const Linear_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Linear_Row
+  \return
+  The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+  \param x
+  A row of coefficients;
+
+  \param y
+  Another row.
+
+  Compares \p x and \p y, where \p x and \p y may be of different size,
+  in which case the "missing" coefficients are assumed to be zero.
+  The comparison is such that:
+  -# equalities are smaller than inequalities;
+  -# lines are smaller than points and rays;
+  -# the ordering is lexicographic;
+  -# the positions compared are, in decreasing order of significance,
+     1, 2, ..., \p size(), 0;
+  -# the result is negative, zero, or positive if x is smaller than,
+     equal to, or greater than y, respectively;
+  -# when \p x and \p y are different, the absolute value of the
+     result is 1 if the difference is due to the coefficient in
+     position 0; it is 2 otherwise.
+
+  When \p x and \p y represent the hyper-planes associated
+  to two equality or inequality constraints, the coefficient
+  at 0 is the known term.
+  In this case, the return value can be characterized as follows:
+  - -2, if \p x is smaller than \p y and they are \e not parallel;
+  - -1, if \p x is smaller than \p y and they \e are parallel;
+  -  0, if \p x and y are equal;
+  - +1, if \p y is smaller than \p x and they \e are parallel;
+  - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+int compare(const Linear_Row& x, const Linear_Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Linear_Row& x,
+	  Parma_Polyhedra_Library::Linear_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
+	       std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Linear_Row.inlines.hh line 1
+/* Linear_Row class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Linear_Row.inlines.hh line 27
+#include <cassert>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Linear_Row::Flags::Flags()
+  : Row::Flags() {
+  // Note that the constructed type has its validity bit unset.
+}
+
+inline
+Linear_Row::Flags::Flags(const Topology t)
+  : Row::Flags(t << nnc_bit) {
+#ifndef NDEBUG
+  set_bits(1 << nnc_validity_bit);
+#endif
+}
+
+inline
+Linear_Row::Flags::Flags(const Topology t, const Kind k)
+  : Row::Flags((k << rpi_bit) | (t << nnc_bit)) {
+#ifndef NDEBUG
+  set_bits((1 << rpi_validity_bit)
+	   | (1 << nnc_validity_bit));
+#endif
+}
+
+inline bool
+Linear_Row::Flags::is_ray_or_point_or_inequality() const {
+  assert(test_bits(1 << rpi_validity_bit));
+  return test_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline void
+Linear_Row::Flags::set_is_ray_or_point_or_inequality() {
+#ifndef NDEBUG
+  set_bits(1 << rpi_validity_bit);
+#endif
+  set_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_line_or_equality() const {
+  assert(test_bits(1 << rpi_validity_bit));
+  return !is_ray_or_point_or_inequality();
+}
+
+inline void
+Linear_Row::Flags::set_is_line_or_equality() {
+#ifndef NDEBUG
+  set_bits(1 << rpi_validity_bit);
+#endif
+  reset_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_not_necessarily_closed() const {
+  assert(test_bits(1 << nnc_validity_bit));
+  return test_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_necessarily_closed() const {
+  assert(test_bits(1 << nnc_validity_bit));
+  return !is_not_necessarily_closed();
+}
+
+inline void
+Linear_Row::Flags::set_not_necessarily_closed() {
+#ifndef NDEBUG
+  set_bits(1 << nnc_validity_bit);
+#endif
+  set_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline void
+Linear_Row::Flags::set_necessarily_closed() {
+#ifndef NDEBUG
+  set_bits(1 << nnc_validity_bit);
+#endif
+  reset_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline Topology
+Linear_Row::Flags::topology() const {
+  return is_necessarily_closed() ? NECESSARILY_CLOSED : NOT_NECESSARILY_CLOSED;
+}
+
+inline bool
+Linear_Row::Flags::operator==(const Flags& y) const {
+  base_type mask = low_bits_mask<base_type>(first_free_bit);
+  return (get_bits() & mask) == (y.get_bits() & mask);
+}
+
+inline bool
+Linear_Row::Flags::operator!=(const Flags& y) const {
+  return !operator==(y);
+}
+
+inline const Linear_Row::Flags&
+Linear_Row::flags() const {
+  return static_cast<const Flags&>(Row::flags());
+}
+
+inline Linear_Row::Flags&
+Linear_Row::flags() {
+  return static_cast<Flags&>(Row::flags());
+}
+
+inline bool
+Linear_Row::is_necessarily_closed() const {
+  return flags().is_necessarily_closed();
+}
+
+inline dimension_type
+Linear_Row::max_space_dimension() {
+  // The first coefficient holds the inhomogeneous term or the divisor.
+  // In NNC rows, the last coefficient is for the epsilon dimension.
+  return max_size() - 2;
+}
+
+inline dimension_type
+Linear_Row::space_dimension() const {
+  const dimension_type sz = size();
+  return (sz == 0)
+    ? 0
+    : sz - (is_necessarily_closed() ? 1 : 2);
+}
+
+inline
+Linear_Row::Linear_Row()
+  : Row() {
+}
+
+inline void
+Linear_Row::construct(const dimension_type sz, const dimension_type capacity,
+		      const Flags f) {
+  Row::construct(sz, capacity, f);
+}
+
+inline
+Linear_Row::Linear_Row(const dimension_type sz, const dimension_type capacity,
+		       const Flags f) {
+  construct(sz, capacity, f);
+}
+
+inline void
+Linear_Row::construct(const dimension_type sz, const Flags f) {
+  construct(sz, sz, f);
+}
+
+inline
+Linear_Row::Linear_Row(const dimension_type sz, const Flags f) {
+  construct(sz, f);
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y)
+  : Row(y) {
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y,
+		       const dimension_type capacity)
+  : Row(y, capacity) {
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y,
+		       const dimension_type sz, const dimension_type capacity)
+  : Row(y, sz, capacity) {
+}
+
+inline
+Linear_Row::~Linear_Row() {
+}
+
+inline bool
+Linear_Row::is_line_or_equality() const {
+  return flags().is_line_or_equality();
+}
+
+inline bool
+Linear_Row::is_ray_or_point_or_inequality() const {
+  return flags().is_ray_or_point_or_inequality();
+}
+
+inline Topology
+Linear_Row::topology() const {
+  return flags().topology();
+}
+
+inline void
+Linear_Row::set_is_line_or_equality() {
+  flags().set_is_line_or_equality();
+}
+
+inline void
+Linear_Row::set_is_ray_or_point_or_inequality() {
+  flags().set_is_ray_or_point_or_inequality();
+}
+
+inline void
+Linear_Row::set_necessarily_closed() {
+  flags().set_necessarily_closed();
+}
+
+inline void
+Linear_Row::set_not_necessarily_closed() {
+  flags().set_not_necessarily_closed();
+}
+
+inline Coefficient_traits::const_reference
+Linear_Row::inhomogeneous_term() const {
+  return (*this)[0];
+}
+
+inline Coefficient_traits::const_reference
+Linear_Row::coefficient(const dimension_type k) const {
+  return (*this)[k+1];
+}
+
+inline void
+Linear_Row::strong_normalize() {
+  normalize();
+  sign_normalize();
+}
+
+/*! \relates Linear_Row */
+inline bool
+operator==(const Linear_Row& x, const Linear_Row& y) {
+  return x.flags() == y.flags()
+    && static_cast<const Row&>(x) == static_cast<const Row&>(y);
+}
+
+/*! \relates Linear_Row */
+inline bool
+operator!=(const Linear_Row& x, const Linear_Row& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+inline void
+swap(Parma_Polyhedra_Library::Linear_Row& x,
+     Parma_Polyhedra_Library::Linear_Row& y) {
+  x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Linear_Row.defs.hh line 457
+
+// Automatically generated from PPL source file ../src/Linear_System.defs.hh line 33
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for systems of constraints and generators.
+/*! \ingroup PPL_CXX_interface
+  An object of this class represents either a constraint system
+  or a generator system. Each Linear_System object can be viewed
+  as a finite sequence of strong-normalized Linear_Row objects,
+  where each Linear_Row implements a constraint or a generator.
+  Linear systems are characterized by the matrix of coefficients,
+  also encoding the number, size and capacity of Linear_row objects,
+  as well as a few additional information, including:
+   - the topological kind of (all) the rows;
+   - an indication of whether or not some of the rows in the Linear_System
+     are <EM>pending</EM>, meaning that they still have to undergo
+     an (unspecified) elaboration; if there are pending rows, then these
+     form a proper suffix of the overall sequence of rows;
+   - a Boolean flag that, when <CODE>true</CODE>, ensures that the
+     non-pending prefix of the sequence of rows is sorted.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Linear_System : public Matrix {
+public:
+  //! Builds an empty linear system with specified topology.
+  /*!
+    Rows size and capacity are initialized to \f$0\f$.
+  */
+  Linear_System(Topology topol);
+
+  //! Builds a system with specified topology and dimensions.
+  /*!
+    \param topol
+    The topology of the system that will be created;
+
+    \param n_rows
+    The number of rows of the system that will be created;
+
+    \param n_columns
+    The number of columns of the system that will be created.
+
+    Creates a \p n_rows \f$\times\f$ \p n_columns system whose
+    coefficients are all zero and whose rows are all initialized
+    to be of the given topology.
+  */
+  Linear_System(Topology topol,
+		dimension_type n_rows, dimension_type n_columns);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A tag class.
+  /*! \ingroup PPL_CXX_interface
+    Tag class to differentiate the Linear_System copy-constructor that
+    copies pending rows as pending from the one that transforms
+    pending rows into non-pending ones.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  struct With_Pending {
+  };
+
+  //! Copy-constructor: pending rows are transformed into non-pending ones.
+  Linear_System(const Linear_System& y);
+
+  //! Full copy-constructor: pending rows are copied as pending.
+  Linear_System(const Linear_System& y, With_Pending);
+
+  //! Assignment operator: pending rows are transformed into non-pending ones.
+  Linear_System& operator=(const Linear_System& y);
+
+  //! Full assignment operator: pending rows are copied as pending.
+  void assign_with_pending(const Linear_System& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Linear_System& y);
+
+  //! Returns the maximum space dimension a Linear_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the rows in the system.
+  /*!
+    The computation of the space dimension correctly ignores
+    the column encoding the inhomogeneous terms of constraint
+    (resp., the divisors of generators);
+    if the system topology is <CODE>NOT_NECESSARILY_CLOSED</CODE>,
+    also the column of the \f$\epsilon\f$-dimension coefficients
+    will be ignored.
+  */
+  dimension_type space_dimension() const;
+
+  //! Makes the system shrink by removing its \p n trailing columns.
+  void remove_trailing_columns(dimension_type n);
+
+  //! Permutes the columns of the system.
+  /*
+    \param cycles
+    A vector representing the non-trivial cycles of the permutation
+    according to which the columns must be rearranged.
+
+    The \p cycles vector contains, one after the other, the
+    non-trivial cycles (i.e., the cycles of length greater than one)
+    of a permutation of non-zero column indexes.  Each cycle is
+    terminated by zero.  For example, assuming the system has 6
+    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+    turn can be represented by a vector of 6 elements containing 1, 3,
+    6, 0, 2, 4, 0.
+  */
+  void permute_columns(const std::vector<dimension_type>& cycles);
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the \p k-th row of the system.
+  Linear_Row& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the system.
+  const Linear_Row& operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  //! Strongly normalizes the system.
+  void strong_normalize();
+
+  //! Sign-normalizes the system.
+  void sign_normalize();
+
+  //! \name Accessors
+  //@{
+  //! Returns the system topology.
+  Topology topology() const;
+
+  //! Returns the value of the sortedness flag.
+  bool is_sorted() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+  */
+  bool is_necessarily_closed() const;
+
+  /*! \brief
+    Returns the number of rows in the system
+    that represent either lines or equalities.
+  */
+  dimension_type num_lines_or_equalities() const;
+
+  //! Returns the index of the first pending row.
+  dimension_type first_pending_row() const;
+
+  //! Returns the number of rows that are in the pending part of the system.
+  dimension_type num_pending_rows() const;
+  //@} // Accessors
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is sorted,
+    without checking for duplicates.
+  */
+  bool check_sorted() const;
+
+  //! Sets the system topology to <CODE>NECESSARILY_CLOSED</CODE>.
+  void set_necessarily_closed();
+
+  //! Sets the system topology to <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  void set_not_necessarily_closed();
+
+  //! Sets the topology of all rows equal to the system topology.
+  void set_rows_topology();
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  //! Resizes the system without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows of the resized system;
+
+    \param new_n_columns
+    The number of columns of the resized system.
+
+    The system is expanded to the specified dimensions avoiding
+    reallocation whenever possible.
+    The contents of the original system is lost.
+  */
+  void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns);
+
+  //! Adds \p n rows and columns to the system.
+  /*!
+    \param n
+    The number of rows and columns to be added: must be strictly positive.
+
+    Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+    the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+    such that
+    \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+    where \f$J\f$ is the specular image
+    of the \f$n \times n\f$ identity matrix.
+  */
+  void add_rows_and_columns(dimension_type n);
+
+  /*! \brief
+    Adds a copy of \p r to the system,
+    automatically resizing the system or the row's copy, if needed.
+  */
+  void insert(const Linear_Row& r);
+
+  /*! \brief
+    Adds a copy of the given row to the pending part of the system,
+    automatically resizing the system or the row, if needed.
+  */
+  void insert_pending(const Linear_Row& r);
+
+  //! Adds a copy of the given row to the system.
+  void add_row(const Linear_Row& r);
+
+  //! Adds a new empty row to the system, setting only its flags.
+  void add_pending_row(Linear_Row::Flags flags);
+
+  //! Adds a copy of the given row to the pending part of the system.
+  void add_pending_row(const Linear_Row& r);
+
+  //! Adds to \p *this a copy of the rows of `y'.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void add_rows(const Linear_System& y);
+
+  //! Adds a copy of the rows of `y' to the pending part of `*this'.
+  void add_pending_rows(const Linear_System& y);
+
+  /*! \brief
+    Sorts the non-pending rows (in growing order) and eliminates
+    duplicated ones.
+  */
+  void sort_rows();
+
+  /*! \brief
+    Sorts the rows (in growing order) form \p first_row to
+    \p last_row and eliminates duplicated ones.
+  */
+  void sort_rows(dimension_type first_row, dimension_type last_row);
+
+  /*! \brief
+    Assigns to \p *this the result of merging its rows with
+    those of \p y, obtaining a sorted system.
+
+    Duplicated rows will occur only once in the result.
+    On entry, both systems are assumed to be sorted and have
+    no pending rows.
+  */
+  void merge_rows_assign(const Linear_System& y);
+
+  /*! \brief
+    Sorts the pending rows and eliminates those that also occur
+    in the non-pending part of the system.
+  */
+  void sort_pending_and_remove_duplicates();
+
+  class With_Saturation_Matrix_iterator;
+
+  /*! \brief
+    Sorts the system, removing duplicates, keeping the saturation
+    matrix consistent.
+
+    \param sat
+    Saturation matrix with rows corresponding to the rows of \p *this.
+  */
+  void sort_and_remove_with_sat(Saturation_Matrix& sat);
+
+  //! Minimizes the subsystem of equations contained in \p *this.
+  /*!
+    This method works only on the equalities of the system:
+    the system is required to be partially sorted, so that
+    all the equalities are grouped at its top; it is assumed that
+    the number of equalities is exactly \p n_lines_or_equalities.
+    The method finds a minimal system for the equalities and
+    returns its rank, i.e., the number of linearly independent equalities.
+    The result is an upper triangular subsystem of equalities:
+    for each equality, the pivot is chosen starting from
+    the right-most columns.
+  */
+  dimension_type gauss(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Back-substitutes the coefficients to reduce
+    the complexity of the system.
+
+    Takes an upper triangular system having \p n_lines_or_equalities rows.
+    For each row, starting from the one having the minimum number of
+    coefficients different from zero, computes the expression of an element
+    as a function of the remaining ones and then substitutes this expression
+    in all the other rows.
+  */
+  void back_substitute(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Applies Gaussian's elimination and back-substitution so as to
+    simplify the linear system.
+  */
+  void simplify();
+
+  /*! \brief
+    Normalizes the system by dividing each row for the GCD of the
+    row's elements.
+  */
+  void normalize();
+
+  //! Clears the system deallocating all its rows.
+  void clear();
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref
+    ascii_dump) and sets \p *this accordingly.  Returns <CODE>true</CODE>
+    if successful, <CODE>false</CODE> otherwise.
+
+    Reads into a Linear_System object the information produced by the
+    output of <CODE>ascii_dump()</CODE>.  The specialized methods
+    provided by Constraint_System and Generator_System take care of
+    properly reading the contents of the system.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \param check_strong_normalized
+    <CODE>true</CODE> if and only if the strong normalization of all
+    the rows in the system has to be checked.
+
+    By default, the strong normalization check is performed.
+    This check may be turned off to avoid useless repeated checking;
+    e.g., when re-checking a well-formed Linear_System after the permutation
+    or deletion of some of its rows.
+  */
+  bool OK(bool check_strong_normalized = true) const;
+
+private:
+  //! The topological kind of the rows in the system.
+  Topology row_topology;
+
+  //! The index of the first pending row.
+  dimension_type index_first_pending;
+
+  /*! \brief
+    <CODE>true</CODE> if rows are sorted in the ascending order as defined by
+    <CODE>bool compare(const Linear_Row&, const Linear_Row&)</CODE>.
+    If <CODE>false</CODE> may not be sorted.
+  */
+  bool sorted;
+
+  //! Ordering predicate (used when implementing the sort algorithm).
+  struct Row_Less_Than {
+    bool operator()(const Row& x, const Row& y) const;
+  };
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Linear_System& x,
+	  Parma_Polyhedra_Library::Linear_System& y);
+
+} // namespace std
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Linear_System */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator==(const Linear_System& x, const Linear_System& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_System */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator!=(const Linear_System& x, const Linear_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator keeping a Linear_System consistent with a Saturation_Matrix.
+/*! \ingroup PPL_CXX_interface
+  An iterator on the vector of Row objects encoded in a Linear_System
+  extended to maintain a corresponding iterator on a vector of
+  Saturation_Row objects.  Access to values is always done on the Row
+  objects, but iterator
+  movements and swaps are done on both components.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator {
+public:
+  typedef std::vector<Row>::iterator Iter1;
+  typedef std::vector<Saturation_Row>::iterator Iter2;
+
+private:
+  Iter1 i1;
+  Iter2 i2;
+
+public:
+  // Same traits as Iter1.
+  typedef std::iterator_traits<Iter1>::iterator_category iterator_category;
+  typedef std::iterator_traits<Iter1>::value_type value_type;
+  typedef std::iterator_traits<Iter1>::difference_type difference_type;
+  typedef std::iterator_traits<Iter1>::pointer pointer;
+  typedef std::iterator_traits<Iter1>::reference reference;
+
+  //! Constructor.
+  With_Saturation_Matrix_iterator(Iter1 iter1, Iter2 iter2);
+
+  //! Copy-constructor.
+  With_Saturation_Matrix_iterator(const With_Saturation_Matrix_iterator& y);
+
+  //! Destructor.
+  ~With_Saturation_Matrix_iterator();
+
+  //! Assignment operator.
+  With_Saturation_Matrix_iterator&
+  operator=(const With_Saturation_Matrix_iterator& y);
+
+  //! \name Operators Implementing Iterator Movement
+  //@{
+  With_Saturation_Matrix_iterator& operator++();
+  With_Saturation_Matrix_iterator operator++(int);
+
+  With_Saturation_Matrix_iterator& operator--();
+  With_Saturation_Matrix_iterator operator--(int);
+
+  With_Saturation_Matrix_iterator& operator+=(difference_type d);
+  With_Saturation_Matrix_iterator operator+(difference_type d) const;
+
+  With_Saturation_Matrix_iterator& operator-=(difference_type d);
+  With_Saturation_Matrix_iterator operator-(difference_type d) const;
+  //@}
+
+  //! Distance operator.
+  difference_type operator-(const With_Saturation_Matrix_iterator& y) const;
+
+  //! \name Comparisons between Iterators
+  //@{
+  bool operator==(const With_Saturation_Matrix_iterator& y) const;
+  bool operator!=(const With_Saturation_Matrix_iterator& y) const;
+  bool operator<(const With_Saturation_Matrix_iterator& y) const;
+  //@}
+
+  //! Dereferencing operator.
+  reference operator*() const;
+
+  //! Access-through operator.
+  pointer operator->() const;
+
+  //! Swaps the pointed Row objects while keeping Saturation_Matrix consistent.
+  void iter_swap(const With_Saturation_Matrix_iterator& y) const;
+
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void
+iter_swap(Parma_Polyhedra_Library
+	  ::Linear_System::With_Saturation_Matrix_iterator x,
+	  Parma_Polyhedra_Library
+	  ::Linear_System::With_Saturation_Matrix_iterator y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Linear_System.inlines.hh line 1
+/* Linear_System class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Saturation_Row.defs.hh line 1
+/* Saturation_Row class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Saturation_Row.defs.hh line 28
+#include <iosfwd>
+#include <gmp.h>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friends later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator==(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator!=(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Saturation_Row
+  Compares \p x with \p y starting from the least significant bits.
+  The ordering is total and has the following property: if \p x and \p y
+  are two rows seen as sets of naturals, if \p x is a strict subset
+  of \p y, then \p x comes before \p y.
+
+  Returns
+  - -1 if \p x comes before \p y in the ordering;
+  -  0 if \p x and \p y are equal;
+  -  1 if \p x comes after \p y in the ordering.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+int compare(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic inclusion test.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool subset_or_equal(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Set-theoretic inclusion test: sets \p strict_subset to a boolean
+  indicating whether the inclusion is strict or not.
+
+  \relates Saturation_Row
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool subset_or_equal(const Saturation_Row& x, const Saturation_Row& y,
+		     bool& strict_subset);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic strict inclusion test.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool strict_subset(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic union.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void set_union(const Saturation_Row& x,
+	       const Saturation_Row& y,
+	       Saturation_Row& z);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A row of a saturation matrix.
+/*! \ingroup PPL_CXX_interface
+  An object of this class represents a single row of a saturation matrix.
+  The saturation row corresponds to a constraint and a system of generators
+  (resp., a generator and a system of constraints) and records whether or
+  not the constraint is saturated by each one of the generators (resp.,
+  the generator saturates each one of the constraints).
+
+  The saturation relation is encoded by using a bitset, so that the
+  constraint is saturated by the \f$i\f$-th generator in the system
+  (resp., the generator saturates the \f$i\f$-th constraint in the system)
+  if and only if the \f$i\f$-th bit is not set.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Saturation_Row {
+public:
+  //! Default constructor.
+  Saturation_Row();
+
+  //! Copy-constructor.
+  Saturation_Row(const Saturation_Row& y);
+
+  //! Destructor.
+  ~Saturation_Row();
+
+  //! Assignment operator.
+  Saturation_Row& operator=(const Saturation_Row& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Saturation_Row& y);
+
+  //! Returns the truth value corresponding to the bit in position \p k.
+  bool operator[](unsigned long k) const;
+
+  //! Sets the bit in position \p k.
+  void set(unsigned long k);
+
+  //! Clears the bit in position \p k.
+  void clear(unsigned long k);
+
+  //! Clears bits from position \p k (included) onward.
+  void clear_from(unsigned long k);
+
+  //! Clears all the bits of the row.
+  void clear();
+
+  friend int
+  Parma_Polyhedra_Library::compare(const Saturation_Row& x,
+				   const Saturation_Row& y);
+
+  friend bool
+  Parma_Polyhedra_Library::operator==(const Saturation_Row& x,
+				      const Saturation_Row& y);
+
+  friend bool
+  Parma_Polyhedra_Library::operator!=(const Saturation_Row& x,
+				      const Saturation_Row& y);
+
+  friend bool
+  Parma_Polyhedra_Library::subset_or_equal(const Saturation_Row& x,
+					   const Saturation_Row& y);
+
+  friend bool
+  Parma_Polyhedra_Library::subset_or_equal(const Saturation_Row& x,
+					   const Saturation_Row& y,
+					   bool& strict_subset);
+
+  friend bool
+  Parma_Polyhedra_Library::strict_subset(const Saturation_Row& x,
+					 const Saturation_Row& y);
+
+  friend void
+  Parma_Polyhedra_Library::set_union(const Saturation_Row& x,
+				     const Saturation_Row& y,
+				     Saturation_Row& z);
+
+  //! Returns the index of the first set bit or ULONG_MAX if no bit is set.
+  unsigned long first() const;
+
+  /*! \brief
+    Returns the index of the first set bit after \p position
+    or ULONG_MAX if no bit after \p position is set.
+  */
+  unsigned long next(unsigned long position) const;
+
+  //! Returns the index of the last set bit or ULONG_MAX if no bit is set.
+  unsigned long last() const;
+
+  /*! \brief
+    Returns the index of the first set bit before \p position
+    or ULONG_MAX if no bits before \p position is set.
+  */
+  unsigned long prev(unsigned long position) const;
+
+  //! Returns the number of set bits in the row.
+  unsigned long count_ones() const;
+
+  //! Returns <CODE>true</CODE> if no bit is set in the row.
+  bool empty() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied
+  bool OK() const;
+
+private:
+  //! Bit-vector representing the row.
+  mpz_t vec;
+
+  //! Assuming \p w is nonzero, returns the index of the first set bit in \p w.
+  static unsigned int first_one(mp_limb_t w);
+
+  //! Assuming \p w is nonzero, returns the index of the last set bit in \p w.
+  static unsigned int last_one(mp_limb_t w);
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Saturation_Row& x,
+	  Parma_Polyhedra_Library::Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void
+iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Saturation_Row.inlines.hh line 1
+/* Saturation_Row class implementation: inline functions.
+*/
+
+
+#include <cassert>
+// For the declaration of ffs(3).
+#include <cstring>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Saturation_Row::Saturation_Row() {
+  mpz_init(vec);
+}
+
+inline
+Saturation_Row::Saturation_Row(const Saturation_Row& y) {
+  mpz_init_set(vec, y.vec);
+}
+
+inline
+Saturation_Row::~Saturation_Row() {
+  mpz_clear(vec);
+}
+
+inline Saturation_Row&
+Saturation_Row::operator=(const Saturation_Row& y) {
+  mpz_set(vec, y.vec);
+  return *this;
+}
+
+inline void
+Saturation_Row::set(const unsigned long k) {
+  mpz_setbit(vec, k);
+}
+
+inline void
+Saturation_Row::clear(const unsigned long k) {
+  mpz_clrbit(vec, k);
+}
+
+inline void
+Saturation_Row::clear_from(const unsigned long k) {
+  mpz_tdiv_r_2exp(vec, vec, k);
+}
+
+inline unsigned long
+Saturation_Row::count_ones() const {
+  assert(vec->_mp_size >= 0);
+  return mpn_popcount(vec->_mp_d, vec->_mp_size);
+}
+
+inline bool
+Saturation_Row::empty() const {
+  return mpz_sgn(vec) == 0;
+}
+
+inline void
+Saturation_Row::swap(Saturation_Row& y) {
+  mpz_swap(vec, y.vec);
+}
+
+inline void
+Saturation_Row::clear() {
+  mpz_set_ui(vec, 0UL);
+}
+
+inline memory_size_type
+Saturation_Row::external_memory_in_bytes() const {
+  return vec[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+Saturation_Row::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+#if HAVE_DECL_FFS && SIZEOF_MP_LIMB_T == SIZEOF_INT
+
+inline unsigned int
+Saturation_Row::first_one(mp_limb_t w) {
+  return ffs(w)-1;
+}
+
+#endif
+
+/*! \relates Saturation_Row */
+inline void
+set_union(const Saturation_Row& x, const Saturation_Row& y,
+	  Saturation_Row& z) {
+  mpz_ior(z.vec, x.vec, y.vec);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+inline void
+swap(Parma_Polyhedra_Library::Saturation_Row& x,
+     Parma_Polyhedra_Library::Saturation_Row& y) {
+  x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
+	  std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Saturation_Row.defs.hh line 238
+
+// Automatically generated from PPL source file ../src/Linear_System.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline memory_size_type
+Linear_System::external_memory_in_bytes() const {
+  return Matrix::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_System::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Linear_System::is_sorted() const {
+  // The flag `sorted' does not really reflect the sortedness status
+  // of a system (if `sorted' evaluates to `false' nothing is known).
+  // This assertion is used to ensure that the system
+  // is actually sorted when `sorted' value is 'true'.
+  assert(!sorted || check_sorted());
+  return sorted;
+}
+
+inline void
+Linear_System::set_sorted(const bool b) {
+  sorted = b;
+}
+
+inline
+Linear_System::Linear_System(Topology topol)
+  : Matrix(),
+    row_topology(topol),
+    index_first_pending(0),
+    sorted(true) {
+}
+
+inline
+Linear_System::Linear_System(Topology topol,
+			     dimension_type n_rows, dimension_type n_columns)
+  : Matrix(n_rows, n_columns, Linear_Row::Flags(topol)),
+    row_topology(topol),
+    index_first_pending(n_rows),
+    sorted(true) {
+}
+
+inline dimension_type
+Linear_System::first_pending_row() const {
+  return index_first_pending;
+}
+
+inline dimension_type
+Linear_System::num_pending_rows() const {
+  assert(num_rows() >= first_pending_row());
+  return num_rows() - first_pending_row();
+}
+
+inline void
+Linear_System::unset_pending_rows() {
+  index_first_pending = num_rows();
+}
+
+inline void
+Linear_System::set_index_first_pending_row(const dimension_type i) {
+  index_first_pending = i;
+}
+
+inline
+Linear_System::Linear_System(const Linear_System& y)
+  : Matrix(y),
+    row_topology(y.row_topology) {
+  unset_pending_rows();
+  // Previously pending rows may violate sortedness.
+  sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+  assert(num_pending_rows() == 0);
+}
+
+inline
+Linear_System::Linear_System(const Linear_System& y, With_Pending)
+  : Matrix(y),
+    row_topology(y.row_topology),
+    index_first_pending(y.index_first_pending),
+    sorted(y.sorted) {
+}
+
+inline Linear_System&
+Linear_System::operator=(const Linear_System& y) {
+  Matrix::operator=(y);
+  row_topology = y.row_topology;
+  unset_pending_rows();
+  // Previously pending rows may violate sortedness.
+  sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+  assert(num_pending_rows() == 0);
+  return *this;
+}
+
+inline void
+Linear_System::assign_with_pending(const Linear_System& y) {
+  Matrix::operator=(y);
+  row_topology = y.row_topology;
+  index_first_pending = y.index_first_pending;
+  sorted = y.sorted;
+}
+
+inline void
+Linear_System::swap(Linear_System& y) {
+  Matrix::swap(y);
+  std::swap(row_topology, y.row_topology);
+  std::swap(index_first_pending, y.index_first_pending);
+  std::swap(sorted, y.sorted);
+}
+
+inline void
+Linear_System::clear() {
+  // Note: do NOT modify the value of `row_topology'.
+  Matrix::clear();
+  index_first_pending = 0;
+  sorted = true;
+}
+
+inline void
+Linear_System::resize_no_copy(const dimension_type new_n_rows,
+			      const dimension_type new_n_columns) {
+  Matrix::resize_no_copy(new_n_rows, new_n_columns,
+			 Linear_Row::Flags(row_topology));
+  // Even though `*this' may happen to keep its sortedness, we believe
+  // that checking such a property is not worth the effort.  In fact,
+  // it is very likely that the system will be overwritten as soon as
+  // we return.
+  set_sorted(false);
+}
+
+inline void
+Linear_System::set_necessarily_closed() {
+  row_topology = NECESSARILY_CLOSED;
+  if (num_rows() > 0)
+    set_rows_topology();
+}
+
+inline void
+Linear_System::set_not_necessarily_closed() {
+  row_topology = NOT_NECESSARILY_CLOSED;
+  if (num_rows() > 0)
+    set_rows_topology();
+}
+
+inline bool
+Linear_System::is_necessarily_closed() const {
+  return row_topology == NECESSARILY_CLOSED;
+}
+
+inline Linear_Row&
+Linear_System::operator[](const dimension_type k) {
+  return static_cast<Linear_Row&>(Matrix::operator[](k));
+}
+
+inline const Linear_Row&
+Linear_System::operator[](const dimension_type k) const {
+  return static_cast<const Linear_Row&>(Matrix::operator[](k));
+}
+
+inline Topology
+Linear_System::topology() const {
+  return row_topology;
+}
+
+inline dimension_type
+Linear_System::max_space_dimension() {
+  // Column zero holds the inhomogeneous term or the divisor.
+  // In NNC linear systems, the last column holds the coefficient
+  // of the epsilon dimension.
+  return max_num_columns() - 2;
+}
+
+inline dimension_type
+Linear_System::space_dimension() const {
+  const dimension_type n_columns = num_columns();
+  return (n_columns == 0)
+    ? 0
+    : n_columns - (is_necessarily_closed() ? 1 : 2);
+}
+
+inline void
+Linear_System::remove_trailing_columns(const dimension_type n) {
+  Matrix::remove_trailing_columns(n);
+  // Have to re-normalize the rows of the system,
+  // since we removed some coefficients.
+  strong_normalize();
+}
+
+inline void
+Linear_System::permute_columns(const std::vector<dimension_type>& cycles) {
+  Matrix::permute_columns(cycles);
+  // The rows with permuted columns are still normalized but may
+  // be not strongly normalized: sign normalization is necessary.
+  sign_normalize();
+}
+
+/*! \relates Linear_System */
+inline bool
+operator!=(const Linear_System& x, const Linear_System& y) {
+  return !(x == y);
+}
+
+inline bool
+Linear_System::Row_Less_Than::operator()(const Row& x, const Row& y) const {
+  return compare(static_cast<const Linear_Row&>(x),
+		 static_cast<const Linear_Row&>(y)) < 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+inline void
+swap(Parma_Polyhedra_Library::Linear_System& x,
+     Parma_Polyhedra_Library::Linear_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Linear_System::With_Saturation_Matrix_iterator::
+With_Saturation_Matrix_iterator(Iter1 iter1, Iter2 iter2)
+  : i1(iter1), i2(iter2) {
+}
+
+inline
+Linear_System::With_Saturation_Matrix_iterator::
+With_Saturation_Matrix_iterator(const With_Saturation_Matrix_iterator& y)
+  : i1(y.i1), i2(y.i2) {
+}
+
+inline
+Linear_System::With_Saturation_Matrix_iterator::
+~With_Saturation_Matrix_iterator() {
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::
+operator=(const With_Saturation_Matrix_iterator& y) {
+  i1 = y.i1;
+  i2 = y.i2;
+  return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator++() {
+  ++i1;
+  ++i2;
+  return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::operator++(int) {
+  With_Saturation_Matrix_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator--() {
+  --i1;
+  --i2;
+  return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::operator--(int) {
+  With_Saturation_Matrix_iterator tmp = *this;
+  operator--();
+  return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator+=(difference_type d) {
+  i1 += d;
+  i2 += d;
+  return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::
+operator+(difference_type d) const {
+  With_Saturation_Matrix_iterator tmp = *this;
+  tmp += d;
+  return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator-=(difference_type d) {
+  i1 -= d;
+  i2 -= d;
+  return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::
+operator-(difference_type d) const {
+  With_Saturation_Matrix_iterator tmp = *this;
+  tmp -= d;
+  return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator::difference_type
+Linear_System::With_Saturation_Matrix_iterator::
+operator-(const With_Saturation_Matrix_iterator& y) const {
+  return i1 - y.i1;
+}
+
+inline bool
+Linear_System::With_Saturation_Matrix_iterator::
+operator==(const With_Saturation_Matrix_iterator& y) const {
+  return i1 == y.i1;
+}
+
+inline bool
+Linear_System::With_Saturation_Matrix_iterator::
+operator!=(const With_Saturation_Matrix_iterator& y) const {
+  return i1 != y.i1;
+}
+
+inline bool
+Linear_System::With_Saturation_Matrix_iterator::
+operator<(const With_Saturation_Matrix_iterator& y) const {
+  return i1 < y.i1;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator::reference
+Linear_System::With_Saturation_Matrix_iterator::operator*() const {
+  return *i1;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator::pointer
+Linear_System::With_Saturation_Matrix_iterator::operator->() const {
+  return &*i1;
+}
+
+inline void
+Linear_System::With_Saturation_Matrix_iterator::
+iter_swap(const With_Saturation_Matrix_iterator& y) const {
+  std::iter_swap(i1, y.i1);
+  std::iter_swap(i2, y.i2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+inline void
+iter_swap(Parma_Polyhedra_Library
+	  ::Linear_System::With_Saturation_Matrix_iterator x,
+	  Parma_Polyhedra_Library
+	  ::Linear_System::With_Saturation_Matrix_iterator y) {
+  x.iter_swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Linear_System.defs.hh line 516
+
+// Automatically generated from PPL source file ../src/Constraint_System.defs.hh line 33
+#include <iterator>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Constraint_System
+  Writes <CODE>true</CODE> if \p cs is empty.  Otherwise, writes on
+  \p s the constraints of \p cs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Constraint_System& cs);
+
+} // namespace IO_Operators
+
+// Put it in the namespace here to declare it friend later.
+/*! \relates Polyhedron */
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+void swap(Parma_Polyhedra_Library::Constraint_System& x,
+	  Parma_Polyhedra_Library::Constraint_System& y);
+
+} // namespace std
+
+//! A system of constraints.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Constraint_System is a system of constraints,
+    i.e., a multiset of objects of the class Constraint.
+    When inserting constraints in a system, space dimensions are
+    automatically adjusted so that all the constraints in the system
+    are defined on the same vector space.
+
+    \par
+    In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code builds a system of constraints corresponding to
+    a square in \f$\Rset^2\f$:
+    \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  cs.insert(y >= 0);
+  cs.insert(y <= 3);
+    \endcode
+    Note that:
+    the constraint system is created with space dimension zero;
+    the first and third constraint insertions increase the space
+    dimension to \f$1\f$ and \f$2\f$, respectively.
+
+    \par Example 2
+    By adding four strict inequalities to the constraint system
+    of the previous example, we can remove just the four
+    vertices from the square defined above.
+    \code
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 6);
+  cs.insert(x - y < 3);
+  cs.insert(y - x < 3);
+    \endcode
+
+    \par Example 3
+    The following code builds a system of constraints corresponding to
+    a half-strip in \f$\Rset^2\f$:
+    \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x - y <= 0);
+  cs.insert(x - y + 1 >= 0);
+    \endcode
+
+    \note
+    After inserting a multiset of constraints in a constraint system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> constraint system
+    will be available, where original constraints may have been
+    reordered, removed (if they are trivial, duplicate or
+    implied by other constraints), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Constraint_System : private Linear_System {
+public:
+  //! Default constructor: builds an empty system of constraints.
+  Constraint_System();
+
+  //! Builds the singleton system containing only constraint \p c.
+  explicit Constraint_System(const Constraint& c);
+
+  //! Ordinary copy-constructor.
+  Constraint_System(const Constraint_System& cs);
+
+  //! Destructor.
+  ~Constraint_System();
+
+  //! Assignment operator.
+  Constraint_System& operator=(const Constraint_System& y);
+
+  //! Returns the maximum space dimension a Constraint_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more strict inequality constraints.
+  */
+  bool has_strict_inequalities() const;
+
+  /*! \brief
+    Removes all the constraints from the constraint system
+    and sets its space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the constraint \p c,
+    increasing the number of space dimensions if needed.
+  */
+  void insert(const Constraint& c);
+
+  /*! \brief
+    Returns the singleton system containing only
+    Constraint::zero_dim_false().
+  */
+  static const Constraint_System& zero_dim_empty();
+
+  //! An iterator over a system of constraints.
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each constraint contained in a Constraint_System object.
+
+    \par Example
+    The following code prints the system of constraints
+    defining the polyhedron <CODE>ph</CODE>:
+    \code
+  const Constraint_System& cs = ph.constraints();
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    cout << *i << endl;
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+			   Constraint,
+			   ptrdiff_t,
+			   const Constraint*,
+			   const Constraint&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Constraint& operator*() const;
+
+    //! Indirect member selector.
+    const Constraint* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Constraint_System;
+
+    //! The const iterator over the matrix of constraints.
+    Linear_System::const_iterator i;
+
+    //! A const pointer to the matrix of constraints.
+    const Linear_System* csp;
+
+    //! Constructor.
+    const_iterator(const Linear_System::const_iterator& iter,
+		   const Constraint_System& csys);
+
+    //! \p *this skips to the next non-trivial constraint.
+    void skip_forward();
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first constraint,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Linear_System and each row in the system is a valid Constraint.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Constraint_System& y);
+
+private:
+  friend class const_iterator;
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  friend class Parma_Polyhedra_Library::LP_Problem;
+
+  friend bool
+  Parma_Polyhedra_Library::operator==(const Polyhedron& x,
+				      const Polyhedron& y);
+
+  //! Builds an empty system of constraints having the specified topology.
+  explicit Constraint_System(Topology topol);
+
+  /*! \brief
+    Builds a system of \p n_rows constraints on a \p n_columns - 1
+    dimensional space (including the \f$\epsilon\f$ dimension, if
+    \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE>).
+  */
+  Constraint_System(Topology topol,
+		    dimension_type n_rows, dimension_type n_columns);
+
+  /*! \brief
+    Adjusts \p *this so that it matches the topology and
+    the number of space dimensions given as parameters
+    (adding or removing columns if needed).
+    Returns <CODE>false</CODE> if and only if \p topol is
+    equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+    contains strict inequalities.
+  */
+  bool adjust_topology_and_space_dimension(Topology topol,
+					   dimension_type num_dimensions);
+
+  //! Returns the \p k- th constraint of the system.
+  Constraint& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k- th constraint of the system.
+  const Constraint& operator[](dimension_type k) const;
+
+  //! Returns <CODE>true</CODE> if \p g satisfies all the constraints.
+  bool satisfies_all_constraints(const Generator& g) const;
+
+  //! Substitutes a given column of coefficients by a given affine expression.
+  /*!
+    \param v
+    Index of the column to which the affine transformation is substituted.
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We want to allow affine transformations
+    (see Section \ref Images_and_Preimages_of_Affine_Transfer_Relations)
+    having any rational coefficients. Since the coefficients of the
+    constraints are integers we must also provide an integer \p
+    denominator that will be used as denominator of the affine
+    transformation.
+    The denominator is required to be a positive integer.
+
+    The affine transformation substitutes the matrix of constraints
+    by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+    the old one \f$a_{ij}\f$ as follows:
+    \f[
+      {a'}_{ij} =
+        \begin{cases}
+          a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+            \quad \text{for } j \neq v; \\
+          \mathrm{expr}[v] * a_{iv}
+            \quad \text{for } j = v.
+        \end{cases}
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_preimage(dimension_type v,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator);
+
+  //! Returns the number of equality constraints.
+  dimension_type num_equalities() const;
+
+  //! Returns the number of inequality constraints.
+  dimension_type num_inequalities() const;
+
+  /*! \brief
+    Applies Gaussian's elimination and back-substitution so as
+    to provide a partial simplification of the system of constraints.
+
+    It is assumed that the system has no pending constraints.
+  */
+  void simplify();
+
+  /*! \brief
+    Inserts in \p *this a copy of the constraint \p c,
+    increasing the number of space dimensions if needed.
+    It is a pending constraint.
+  */
+  void insert_pending(const Constraint& c);
+
+  //! Adds low-level constraints to the constraint system.
+  void add_low_level_constraints();
+};
+
+// Constraint_System.inlines.hh is not included here on purpose.
+
+// Automatically generated from PPL source file ../src/Bounding_Box.defs.hh line 31
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A not necessarily closed bounding-box.
+/*! \ingroup PPL_CXX_interface
+  A Bounding_Box object represents the Cartesian product of \f$n\f$
+  not necessarily closed and possibly unbounded intervals,
+  where \f$n\f$ is the space dimension of the box.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Bounding_Box {
+public:
+  //! Constructs a universe bounding box of dimension \p num_dimensions.
+  Bounding_Box(dimension_type num_dimensions);
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns a reference the interval that bounds
+    the box on the <CODE>k</CODE>-th space dimension.
+  */
+  const Interval& operator[](dimension_type k) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is empty.
+  bool is_empty() const;
+
+  /*! \brief
+    If the <CODE>k</CODE>-th space dimension is unbounded below, returns
+    <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
+    \p closed, \p n and \p d accordingly.
+
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+
+    An undefined behavior is obtained if \p k is greater than
+    or equal to the space dimension of \p *this.
+  */
+  bool get_lower_bound(dimension_type k, bool& closed,
+		       Coefficient& n, Coefficient& d) const;
+
+  /*! \brief
+    If the <CODE>k</CODE>-th space dimension is unbounded above, returns
+    <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
+    \p closed, \p n and \p d accordingly.
+
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
+
+    An undefined behavior is obtained if \p k is greater than
+    or equal to the space dimension of \p *this.
+  */
+  bool get_upper_bound(dimension_type k, bool& closed,
+		       Coefficient& n, Coefficient& d) const;
+
+  //! Causes the box to become empty, i.e., to represent the empty set.
+  void set_empty();
+
+  /*! \brief
+    Raises the lower bound of the interval corresponding
+    to the <CODE>k</CODE>-th space dimension.
+
+    Intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension
+    with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+    with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>false</CODE>.
+    An undefined behavior is obtained if \p k is greater than or equal to
+    the space dimension of \p *this or if \p d is equal to zero.
+  */
+  void raise_lower_bound(dimension_type k, bool closed,
+			 Coefficient_traits::const_reference n,
+			 Coefficient_traits::const_reference d);
+
+  /*! \brief
+    Lowers the upper bound of the interval corresponding
+    to the <CODE>k</CODE>-th space dimension.
+
+    Intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension
+    with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+    with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE>
+    is <CODE>false</CODE>.
+    An undefined behavior is obtained if \p k is greater than or equal to
+    the space dimension of \p *this or if \p d is equal to zero.
+  */
+  void lower_upper_bound(dimension_type k, bool closed,
+			 Coefficient_traits::const_reference n,
+			 Coefficient_traits::const_reference d);
+
+  //! Returns a system of constraints corresponding to \p *this.
+  Constraint_System constraints() const;
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+    \param y
+    A bounding box that <EM>must</EM> be contained in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_widening_assign(const Bounding_Box& y);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+    \param y
+    A bounding box that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator that points to the first stop-point.
+
+    \param last
+    An iterator that points one past the last stop-point.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_widening_assign(const Bounding_Box& y,
+			    Iterator first, Iterator last);
+
+private:
+  /*! \brief
+    A vector of rational intervals, one for each dimension
+    of the vector space.
+  */
+  std::vector<Interval> vec;
+  /*! \brief
+    A boolean flag indicating emptiness of the bounding box.
+    Only meaningful when \p empty_up_to_date is <CODE>true</CODE>.
+  */
+  mutable bool empty;
+  //! Tells whether or not the flag \p empty is meaningful.
+  mutable bool empty_up_to_date;
+
+  //! Records the stop points for CC76_widening_assign(const Bounding_Box&).
+  static ERational default_stop_points[];
+};
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Bounding_Box */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+std::ostream& operator<<(std::ostream& s, const Bounding_Box& bbox);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Bounding_Box.inlines.hh line 1
+/* Bounding_Box class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bounding_Box::Bounding_Box(dimension_type num_dimensions)
+  : vec(num_dimensions), empty(false), empty_up_to_date(true) {
+}
+
+inline dimension_type
+Bounding_Box::space_dimension() const {
+  return vec.size();
+}
+
+inline const Interval&
+Bounding_Box::operator[](const dimension_type k) const {
+  assert(k < vec.size());
+  return vec[k];
+}
+
+inline bool
+Bounding_Box::is_empty() const {
+  if (empty_up_to_date)
+    return empty;
+  else {
+    empty_up_to_date = true;
+    for (dimension_type k = vec.size(); k-- > 0; )
+      if (vec[k].is_empty()) {
+	empty = true;
+	return true;
+      }
+    empty = false;
+    return false;
+  }
+}
+
+inline bool
+Bounding_Box::get_lower_bound(const dimension_type k, bool& closed,
+			      Coefficient& n, Coefficient& d) const {
+  assert(k < vec.size());
+  const LBoundary& lb = vec[k].lower_bound();
+  const ERational& lr = lb.bound();
+
+  if (is_plus_infinity(lr) || is_minus_infinity(lr))
+    return false;
+
+  closed = lb.is_closed();
+  n = raw_value(lr).get_num();
+  d = raw_value(lr).get_den();
+
+  return true;
+}
+
+inline bool
+Bounding_Box::get_upper_bound(const dimension_type k, bool& closed,
+			     Coefficient& n, Coefficient& d) const {
+  assert(k < vec.size());
+  const UBoundary& ub = vec[k].upper_bound();
+  const ERational& ur = ub.bound();
+
+  if (is_plus_infinity(ur) || is_minus_infinity(ur))
+    return false;
+
+  closed = ub.is_closed();
+  n = raw_value(ur).get_num();
+  d = raw_value(ur).get_den();
+
+  return true;
+}
+
+inline void
+Bounding_Box::set_empty() {
+  for (dimension_type k = vec.size(); k-- > 0; )
+    vec[k].set_empty();
+  empty = empty_up_to_date = true;
+}
+
+inline void
+Bounding_Box::raise_lower_bound(const dimension_type k, const bool closed,
+				Coefficient_traits::const_reference n,
+				Coefficient_traits::const_reference d) {
+  assert(k < vec.size());
+  assert(d != 0);
+  mpq_class q;
+  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+  q.canonicalize();
+  vec[k].raise_lower_bound(LBoundary(ERational(q, ROUND_NOT_NEEDED),
+				     (closed
+				      ? LBoundary::CLOSED
+				      : LBoundary::OPEN)));
+  empty_up_to_date = false;
+}
+
+inline void
+Bounding_Box::lower_upper_bound(const dimension_type k, const bool closed,
+				Coefficient_traits::const_reference n,
+				Coefficient_traits::const_reference d) {
+  assert(k < vec.size());
+  assert(d != 0);
+  mpq_class q;
+  assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+  assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+  q.canonicalize();
+  vec[k].lower_upper_bound(UBoundary(ERational(q, ROUND_NOT_NEEDED),
+				     (closed
+				      ? UBoundary::CLOSED
+				      : UBoundary::OPEN)));
+  empty_up_to_date = false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Bounding_Box.defs.hh line 206
+
+// Automatically generated from PPL source file ../src/Variable.defs.hh line 1
+/* Variable class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Variable.defs.hh line 29
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variable */
+std::ostream&
+operator<<(std::ostream& s, const Variable& v);
+
+} // namespace IO_Operators
+
+//! Defines a total ordering on variables.
+/*! \relates Variable */
+bool less(Variable v, Variable w);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A dimension of the vector space.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Variable represents a dimension of the space,
+  that is one of the Cartesian axes.
+  Variables are used as basic blocks in order to build
+  more complex linear expressions.
+  Each variable is identified by a non-negative integer,
+  representing the index of the corresponding Cartesian axis
+  (the first axis has index 0).
+  The space dimension of a variable is the dimension of the vector space
+  made by all the Cartesian axes having an index less than or equal to
+  that of the considered variable; thus, if a variable has index \f$i\f$,
+  its space dimension is \f$i+1\f$.
+
+  Note that the ``meaning'' of an object of the class Variable
+  is completely specified by the integer index provided to its
+  constructor:
+  be careful not to be mislead by C++ language variable names.
+  For instance, in the following example the linear expressions
+  <CODE>e1</CODE> and <CODE>e2</CODE> are equivalent,
+  since the two variables <CODE>x</CODE> and <CODE>z</CODE> denote
+  the same Cartesian axis.
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(0);
+  Linear_Expression e1 = x + y;
+  Linear_Expression e2 = y + z;
+  \endcode
+
+*/
+class Parma_Polyhedra_Library::Variable {
+
+public:
+  //! Builds the variable corresponding to the Cartesian axis of index \p i.
+  /*!
+    \exception std::length_error
+    Thrown if the <CODE>i+1</CODE> exceeds
+    <CODE>Variable::max_space_dimension()</CODE>.
+  */
+  explicit Variable(dimension_type i);
+
+  //! Returns the index of the Cartesian axis associated to the variable.
+  dimension_type id() const;
+
+  //! Returns the maximum space dimension a Variable can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  /*!
+    The returned value is <CODE>id()+1</CODE>.
+  */
+  dimension_type space_dimension() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Type of output functions.
+  typedef void output_function_type(std::ostream& s, const Variable& v);
+
+  //! Sets the output function to be used for printing Variable objects.
+  static void set_output_function(output_function_type* p);
+
+  //! Returns the pointer to the current output function.
+  static output_function_type* get_output_function();
+
+  //! Binary predicate defining the total ordering on variables.
+  /*! \ingroup PPL_CXX_interface */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(Variable x, Variable y) const;
+  };
+
+private:
+  //! The index of the Cartesian axis.
+  dimension_type varid;
+
+  // The initialization class needs to set the default output function.
+  friend class Init;
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+						    const Variable& v);
+
+  //! Pointer to the current output function.
+  static output_function_type* current_output_function;
+
+  //! The default output function.
+  static void default_output_function(std::ostream& s, const Variable& v);
+};
+
+// Automatically generated from PPL source file ../src/Variable.inlines.hh line 1
+/* Variable class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Variable.inlines.hh line 27
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Variable::max_space_dimension() {
+  return not_a_dimension() - 1;
+}
+
+inline
+Variable::Variable(dimension_type i)
+  : varid(i < max_space_dimension()
+	  ? i
+	  : (throw std::length_error("PPL::Variable::Variable(i):\n"
+				     "i exceeds the maximum allowed "
+				     "variable identifier."), i)) {
+}
+
+inline dimension_type
+Variable::id() const {
+  return varid;
+}
+
+inline dimension_type
+Variable::space_dimension() const {
+  return varid + 1;
+}
+
+inline memory_size_type
+Variable::external_memory_in_bytes() const {
+  return 0;
+}
+
+inline memory_size_type
+Variable::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Variable::set_output_function(output_function_type* p) {
+  current_output_function = p;
+}
+
+inline Variable::output_function_type*
+Variable::get_output_function() {
+  return current_output_function;
+}
+
+/*! \relates Variable */
+inline bool
+less(const Variable v, const Variable w) {
+  return v.id() < w.id();
+}
+
+inline bool
+Variable::Compare::operator()(const Variable x, const Variable y) const {
+  return less(x, y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Variable.defs.hh line 147
+
+namespace Parma_Polyhedra_Library {
+
+//! An std::set containing variables in increasing order of dimension index.
+/*! \ingroup PPL_CXX_interface */
+typedef std::set<Variable, Variable::Compare> Variables_Set;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Init.defs.hh line 1
+/* Init class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Init.defs.hh line 28
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Class for initialization and finalization.
+/*! \ingroup PPL_CXX_interface
+  <EM>Nifty Counter</EM> initialization class,
+  ensuring that the library is initialized only once
+  and before its first use.
+  A count of the number of translation units using the library
+  is maintained. A static object of Init type will be declared
+  by each translation unit using the library.  As a result,
+  only one of them will initialize and properly finalize
+  the library.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Init {
+private:
+  //! Count the number of objects created.
+  static unsigned int count;
+  static fpu_rounding_direction_type old_rounding_direction;
+
+public:
+  //! Initializes the PPL.
+  Init();
+
+  //! Finalizes the PPL.
+  ~Init();
+};
+
+// Automatically generated from PPL source file ../src/initializer.hh line 1
+/* Nifty counter object for the initialization of the library.
+*/
+
+
+// Automatically generated from PPL source file ../src/initializer.hh line 27
+
+namespace {
+
+Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer;
+
+} // namespace
+
+// Automatically generated from PPL source file ../src/Saturation_Matrix.defs.hh line 1
+/* Saturation_Matrix class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Saturation_Matrix.defs.hh line 29
+#include <vector>
+#include <iosfwd>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A saturation matrix.
+/*! \ingroup PPL_CXX_interface
+  A saturation matrix is used to encode the relation between the
+  generators and the constraints of a polyhedron: if a generator
+  saturates a constraint the corresponding element of the saturation
+  matrix is \f$0\f$, otherwise (i.e., if the generator satisfies but
+  does not saturate the constraint) the corresponding element is \f$1\f$.
+  \note
+  since the constraints and generators are taken from the same polyhedron
+  description, it cannot be the case that a generator <EM>violates</EM>
+  a constraint.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Saturation_Matrix {
+public:
+  //! Default constructor.
+  Saturation_Matrix();
+
+  /*! \brief
+    Construct a saturation matrix with \p n_rows rows
+    and \p n_columns columns.
+  */
+  Saturation_Matrix(dimension_type n_rows, dimension_type n_columns);
+
+  //! Copy-constructor.
+  Saturation_Matrix(const Saturation_Matrix& y);
+
+  //! Destructor.
+  ~Saturation_Matrix();
+
+  //! Assignment operator.
+  Saturation_Matrix& operator=(const Saturation_Matrix& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Saturation_Matrix& y);
+
+  //! Subscript operator.
+  Saturation_Row& operator[](dimension_type k);
+
+  //! Constant subscript operator.
+  const Saturation_Row& operator[](dimension_type k) const;
+
+  //! Clears the matrix deallocating all its rows.
+  void clear();
+
+  //! Transposes the matrix.
+  void transpose();
+
+  //! Makes \p *this a transposed copy of \p y.
+  void transpose_assign(const Saturation_Matrix& y);
+
+  //! Returns the maximum number of rows of a Saturation_Matrix.
+  static dimension_type max_num_rows();
+
+  //! Returns the number of columns of \p *this.
+  dimension_type num_columns() const;
+
+  //! Returns the number of rows of \p *this.
+  dimension_type num_rows() const;
+
+  //! Sorts the rows and removes duplicates.
+  void sort_rows();
+
+  //! Looks for \p row in \p *this, which is assumed to be sorted.
+  /*!
+    \return
+    <CODE>true</CODE> if \p row belongs to \p *this, false otherwise.
+
+    \param row
+    The row that will be searched for in the matrix.
+
+    Given a sorted saturation matrix (this ensures better efficiency),
+    tells whether it contains the given row.
+  */
+  bool sorted_contains(const Saturation_Row& row) const;
+
+  //! Adds \p row to \p *this.
+  void add_row(const Saturation_Row& row);
+
+  //! Erases the rows from the \p first_to_erase -th to the last one.
+  void rows_erase_to_end(dimension_type first_to_erase);
+
+  //! Erases the columns from the \p first_to_erase -th to the last one.
+  void columns_erase_to_end(dimension_type first_to_erase);
+
+  //! Resizes the matrix copying the old contents.
+  void resize(dimension_type new_n_rows, dimension_type new_n_columns);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
+    <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+#ifndef NDEBUG
+  //! Checks whether \p *this is sorted. It does NOT check for duplicates.
+  bool check_sorted() const;
+#endif
+
+private:
+  //! Contains the rows of the matrix.
+  std::vector<Saturation_Row> rows;
+
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
+
+  //! Ordering predicate (used when implementing the sort algorithm).
+  /*! \ingroup PPL_CXX_interface */
+  struct Saturation_Row_Less_Than {
+    bool operator()(const Saturation_Row& x, const Saturation_Row& y) const;
+  };
+
+  friend
+  void Parma_Polyhedra_Library::
+  Linear_System::sort_and_remove_with_sat(Saturation_Matrix& sat);
+
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Saturation_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
+	  Parma_Polyhedra_Library::Saturation_Matrix& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Saturation_Matrix.inlines.hh line 1
+/* Saturation_Matrix class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Saturation_Matrix::Saturation_Matrix()
+  : rows(),
+    row_size(0) {
+}
+
+inline dimension_type
+Saturation_Matrix::max_num_rows() {
+  return std::vector<Saturation_Row>().max_size();
+}
+
+inline
+Saturation_Matrix::Saturation_Matrix(const dimension_type n_rows,
+		     const dimension_type n_columns)
+  : rows(n_rows),
+    row_size(n_columns) {
+}
+
+inline
+Saturation_Matrix::Saturation_Matrix(const Saturation_Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size) {
+}
+
+inline
+Saturation_Matrix::~Saturation_Matrix() {
+}
+
+inline void
+Saturation_Matrix::rows_erase_to_end(const dimension_type first_to_erase) {
+  // The first row to be erased cannot be greater
+  // than the actual number of the rows of the matrix.
+  assert(first_to_erase <= rows.size());
+  if (first_to_erase < rows.size())
+    rows.erase(rows.begin() + first_to_erase, rows.end());
+  assert(OK());
+}
+
+inline void
+Saturation_Matrix::columns_erase_to_end(const dimension_type first_to_erase) {
+  // The first column to be erased cannot be greater
+  // than the actual number of the columns of the matrix.
+  assert(first_to_erase <= row_size);
+  row_size = first_to_erase;
+  assert(OK());
+}
+
+inline void
+Saturation_Matrix::swap(Saturation_Matrix& y) {
+  std::swap(row_size, y.row_size);
+  std::swap(rows, y.rows);
+}
+
+inline Saturation_Row&
+Saturation_Matrix::operator[](const dimension_type k) {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+inline const Saturation_Row&
+Saturation_Matrix::operator[](const dimension_type k) const {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+inline dimension_type
+Saturation_Matrix::num_columns() const {
+  return row_size;
+}
+
+inline dimension_type
+Saturation_Matrix::num_rows() const {
+  return rows.size();
+}
+
+inline void
+Saturation_Matrix::clear() {
+  // Clear `rows' and minimize its capacity.
+  std::vector<Saturation_Row>().swap(rows);
+  row_size = 0;
+}
+
+inline memory_size_type
+Saturation_Matrix::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Saturation_Matrix::Saturation_Row_Less_Than::
+operator()(const Saturation_Row& x, const Saturation_Row& y) const {
+  return compare(x, y) < 0;
+}
+
+inline bool
+Saturation_Matrix::sorted_contains(const Saturation_Row& row) const {
+  assert(check_sorted());
+  return std::binary_search(rows.begin(), rows.end(), row,
+			    Saturation_Row_Less_Than());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Matrix */
+inline void
+swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
+     Parma_Polyhedra_Library::Saturation_Matrix& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Saturation_Matrix.defs.hh line 176
+
+// Automatically generated from PPL source file ../src/Generator_System.defs.hh line 1
+/* Generator_System class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Poly_Con_Relation.defs.hh line 1
+/* Poly_Con_Relation class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Poly_Con_Relation.defs.hh line 28
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Con_Relation */
+Poly_Con_Relation operator&&(const Poly_Con_Relation& x,
+			     const Poly_Con_Relation& y);
+
+/*! \brief
+  Yields the assertion with all the conjuncts of \p x
+  that are not in \p y.
+
+  \relates Poly_Con_Relation
+*/
+Poly_Con_Relation operator-(const Poly_Con_Relation& x,
+			    const Poly_Con_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Con_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a constraint.
+/*! \ingroup PPL_CXX_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a constraint.
+*/
+class Parma_Polyhedra_Library::Poly_Con_Relation {
+private:
+  //! Poly_Con_Relation is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t NOTHING             = 0U;
+  static const flags_t IS_DISJOINT         = 1U << 0;
+  static const flags_t STRICTLY_INTERSECTS = 1U << 1;
+  static const flags_t IS_INCLUDED         = 1U << 2;
+  static const flags_t SATURATES           = 1U << 3;
+  //@} // Bit-masks for the individual assertions
+
+  //! All assertions together.
+  static const flags_t EVERYTHING
+  = IS_DISJOINT
+  | STRICTLY_INTERSECTS
+  | IS_INCLUDED
+  | SATURATES;
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! True if and only if the conjunction \p x implies the conjunction \p y.
+  static bool implies(flags_t x, flags_t y);
+
+  //! Construct from a bit-mask.
+  Poly_Con_Relation(flags_t mask);
+
+  friend bool
+  Parma_Polyhedra_Library::operator==(const Poly_Con_Relation& x,
+				      const Poly_Con_Relation& y);
+
+  friend bool
+  Parma_Polyhedra_Library::operator!=(const Poly_Con_Relation& x,
+				      const Poly_Con_Relation& y);
+
+  friend Poly_Con_Relation
+  Parma_Polyhedra_Library::operator&&(const Poly_Con_Relation& x,
+				      const Poly_Con_Relation& y);
+
+  friend Poly_Con_Relation
+  Parma_Polyhedra_Library::operator-(const Poly_Con_Relation& x,
+				     const Poly_Con_Relation& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::
+  IO_Operators::operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Access the internal flags: this is needed for some foreign
+    language interfaces.
+  */
+#endif
+  flags_t get_flags() const;
+
+public:
+  //! The assertion that says nothing.
+  static Poly_Con_Relation nothing();
+
+  /*! \brief
+    The polyhedron and the set of points satisfying
+    the constraint are disjoint.
+  */
+  static Poly_Con_Relation is_disjoint();
+
+  /*! \brief
+    The polyhedron intersects the set of points satisfying
+    the constraint, but it is not included in it.
+  */
+  static Poly_Con_Relation strictly_intersects();
+
+  /*! \brief
+    The polyhedron is included in the set of points satisfying
+    the constraint.
+  */
+  static Poly_Con_Relation is_included();
+
+  /*! \brief
+    The polyhedron is included in the set of points saturating
+    the constraint.
+  */
+  static Poly_Con_Relation saturates();
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  //! True if and only if \p *this implies \p y.
+  bool implies(const Poly_Con_Relation& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+// Automatically generated from PPL source file ../src/Poly_Con_Relation.inlines.hh line 1
+/* Poly_Con_Relation class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Con_Relation::Poly_Con_Relation(flags_t mask)
+  : flags(mask) {
+}
+
+inline Poly_Con_Relation::flags_t
+Poly_Con_Relation::get_flags() const {
+  return flags;
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::nothing() {
+  return Poly_Con_Relation(NOTHING);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_disjoint() {
+  return Poly_Con_Relation(IS_DISJOINT);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::strictly_intersects() {
+  return Poly_Con_Relation(STRICTLY_INTERSECTS);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_included() {
+  return Poly_Con_Relation(IS_INCLUDED);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::saturates() {
+  return Poly_Con_Relation(SATURATES);
+}
+
+inline bool
+Poly_Con_Relation::implies(flags_t x, flags_t y) {
+  return (x & y) == y;
+}
+
+inline bool
+Poly_Con_Relation::implies(const Poly_Con_Relation& y) const {
+  return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return x.flags == y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return x.flags != y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return Poly_Con_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return Poly_Con_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Poly_Con_Relation.defs.hh line 169
+
+// Automatically generated from PPL source file ../src/Generator_System.defs.hh line 35
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Generator_System
+  Writes <CODE>false</CODE> if \p gs is empty.  Otherwise, writes on
+  \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Generator_System& gs);
+
+} // namespace IO_Operators
+
+// Put it in the namespace here to declare it friend later.
+/*! \relates Polyhedron */
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Generator_System */
+void swap(Parma_Polyhedra_Library::Generator_System& x,
+	  Parma_Polyhedra_Library::Generator_System& y);
+
+} // namespace std
+
+//! A system of generators.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Generator_System is a system of generators,
+    i.e., a multiset of objects of the class Generator
+    (lines, rays, points and closure points).
+    When inserting generators in a system, space dimensions are automatically
+    adjusted so that all the generators in the system are defined
+    on the same vector space.
+    A system of generators which is meant to define a non-empty
+    polyhedron must include at least one point: the reason is that
+    lines, rays and closure points need a supporting point
+    (lines and rays only specify directions while closure points only
+    specify points in the topological closure of the NNC polyhedron).
+
+    \par
+     In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code defines the line having the same direction
+    as the \f$x\f$ axis (i.e., the first Cartesian axis)
+    in \f$\Rset^2\f$:
+    \code
+  Generator_System gs;
+  gs.insert(line(x + 0*y));
+    \endcode
+    As said above, this system of generators corresponds to
+    an empty polyhedron, because the line has no supporting point.
+    To define a system of generators that does correspond to
+    the \f$x\f$ axis, we can add the following code which
+    inserts the origin of the space as a point:
+    \code
+  gs.insert(point(0*x + 0*y));
+    \endcode
+    Since space dimensions are automatically adjusted, the following
+    code obtains the same effect:
+    \code
+  gs.insert(point(0*x));
+    \endcode
+    In contrast, if we had added the following code, we would have
+    defined a line parallel to the \f$x\f$ axis through
+    the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+    \code
+  gs.insert(point(0*x + 1*y));
+    \endcode
+
+    \par Example 2
+    The following code builds a ray having the same direction as
+    the positive part of the \f$x\f$ axis in \f$\Rset^2\f$:
+    \code
+  Generator_System gs;
+  gs.insert(ray(x + 0*y));
+    \endcode
+    To define a system of generators indeed corresponding to the set
+    \f[
+      \bigl\{\,
+        (x, 0)^\transpose \in \Rset^2
+      \bigm|
+        x \geq 0
+      \,\bigr\},
+    \f]
+    one just has to add the origin:
+    \code
+  gs.insert(point(0*x + 0*y));
+    \endcode
+
+    \par Example 3
+    The following code builds a system of generators having four points
+    and corresponding to a square in \f$\Rset^2\f$
+    (the same as Example 1 for the system of constraints):
+    \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 3*y));
+  gs.insert(point(3*x + 0*y));
+  gs.insert(point(3*x + 3*y));
+    \endcode
+
+    \par Example 4
+    By using closure points, we can define the \e kernel
+    (i.e., the largest open set included in a given set)
+    of the square defined in the previous example.
+    Note that a supporting point is needed and, for that purpose,
+    any inner point could be considered.
+    \code
+  Generator_System gs;
+  gs.insert(point(x + y));
+  gs.insert(closure_point(0*x + 0*y));
+  gs.insert(closure_point(0*x + 3*y));
+  gs.insert(closure_point(3*x + 0*y));
+  gs.insert(closure_point(3*x + 3*y));
+    \endcode
+
+    \par Example 5
+    The following code builds a system of generators having two points
+    and a ray, corresponding to a half-strip in \f$\Rset^2\f$
+    (the same as Example 2 for the system of constraints):
+    \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 1*y));
+  gs.insert(ray(x - y));
+    \endcode
+
+    \note
+    After inserting a multiset of generators in a generator system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> generator system
+    will be available, where original generators may have been
+    reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Generator_System : private Linear_System {
+public:
+  //! Default constructor: builds an empty system of generators.
+  Generator_System();
+
+  //! Builds the singleton system containing only generator \p g.
+  explicit Generator_System(const Generator& g);
+
+  //! Ordinary copy-constructor.
+  Generator_System(const Generator_System& gs);
+
+  //! Destructor.
+  ~Generator_System();
+
+  //! Assignment operator.
+  Generator_System& operator=(const Generator_System& y);
+
+  //! Returns the maximum space dimension a Generator_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Removes all the generators from the generator system
+    and sets its space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the generator \p g,
+    increasing the number of space dimensions if needed.
+  */
+  void insert(const Generator& g);
+
+  /*! \brief
+    Returns the singleton system containing only
+    Generator::zero_dim_point().
+  */
+  static const Generator_System& zero_dim_univ();
+
+  //! An iterator over a system of generators
+  /*! \ingroup PPL_CXX_interface
+      A const_iterator is used to provide read-only access
+      to each generator contained in an object of Generator_System.
+
+      \par Example
+      The following code prints the system of generators
+      of the polyhedron <CODE>ph</CODE>:
+      \code
+  const Generator_System& gs = ph.generators();
+  for (Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i)
+    cout << *i << endl;
+      \endcode
+      The same effect can be obtained more concisely by using
+      more features of the STL:
+      \code
+  const Generator_System& gs = ph.generators();
+  copy(gs.begin(), gs.end(), ostream_iterator<Generator>(cout, "\n"));
+      \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+			   Generator,
+			   ptrdiff_t,
+			   const Generator*,
+			   const Generator&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Generator& operator*() const;
+
+    //! Indirect member selector.
+    const Generator* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Generator_System;
+
+    //! The const iterator over the Linear_System.
+    Linear_System::const_iterator i;
+
+    //! A const pointer to the Linear_System.
+    const Linear_System* gsp;
+
+    //! Constructor.
+    const_iterator(const Linear_System::const_iterator& iter,
+		   const Generator_System& gsys);
+
+    /*! \brief
+      \p *this skips to the next generator, skipping those
+      closure points that are immediately followed by a matching point.
+    */
+    void skip_forward();
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first generator,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Linear_System and each row in the system is a valid Generator.
+  */
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Resizes the matrix of generators using the numbers of rows and columns
+    read from \p s, then initializes the coordinates of each generator
+    and its type reading the contents from \p s.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Generator_System& y);
+
+private:
+  friend class const_iterator;
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+  friend bool
+  Parma_Polyhedra_Library::operator==(const Polyhedron& x,
+				      const Polyhedron& y);
+
+  //! Builds an empty system of generators having the specified topology.
+  explicit Generator_System(Topology topol);
+
+  /*! \brief
+    Builds a system of \p n_rows rays/points on a \p n_columns - 1
+    dimensional space (including the \f$\epsilon\f$ dimension, if
+    \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE>).
+  */
+  Generator_System(Topology topol,
+		   dimension_type n_rows, dimension_type n_columns);
+
+  /*! \brief
+    Adjusts \p *this so that it matches the topology and
+    the number of space dimensions given as parameters
+    (adding or removing columns if needed).
+    Returns <CODE>false</CODE> if and only if \p topol is
+    equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+    contains closure points.
+  */
+  bool adjust_topology_and_space_dimension(Topology topol,
+					   dimension_type num_dimensions);
+
+  /*! \brief
+    For each unmatched closure point in \p *this, adds the
+    corresponding point.
+
+    It is assumed that the topology of \p *this
+    is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  */
+  void add_corresponding_points();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more points.
+  */
+  bool has_points() const;
+
+  /*! \brief
+    For each unmatched point in \p *this, adds the corresponding
+    closure point.
+
+    It is assumed that the topology of \p *this
+    is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  */
+  void add_corresponding_closure_points();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more closure points.
+
+    Note: the check for the presence of closure points is
+    done under the point of view of the user. Namely, we scan
+    the generator system using high-level iterators, so that
+    closure points that are matching the corresponding points
+    will be disregarded.
+  */
+  bool has_closure_points() const;
+
+  //! Returns the \p k- th generator of the system.
+  Generator& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k- th generator of the system.
+  const Generator& operator[](dimension_type k) const;
+
+  /*! \brief
+    Returns the relations holding between the generator system
+    and the constraint \p c.
+  */
+  Parma_Polyhedra_Library::Poly_Con_Relation
+  relation_with(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  bool satisfied_by_all_generators(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  /*!
+    It is assumed that <CODE>c.is_necessarily_closed()</CODE> holds.
+  */
+  bool satisfied_by_all_generators_C(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  /*!
+    It is assumed that <CODE>c.is_necessarily_closed()</CODE> does not hold.
+  */
+  bool satisfied_by_all_generators_NNC(const Constraint& c) const;
+
+  //! Assigns to a given variable an affine expression.
+  /*!
+    \param v
+    Index of the column to which the affine transformation is assigned;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We want to allow affine transformations (see the Introduction) having
+    any rational coefficients. Since the coefficients of the
+    constraints are integers we must also provide an integer \p denominator
+    that will be used as denominator of the affine transformation.
+    The denominator is required to be a positive integer.
+
+    The affine transformation assigns to each element of \p v -th
+    column the follow expression:
+    \f[
+      \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+           {\mathrm{denominator}}.
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_image(dimension_type v,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator);
+
+  //! Returns the number of lines of the system.
+  dimension_type num_lines() const;
+
+  //! Returns the number of rays of the system.
+  dimension_type num_rays() const;
+
+  //! Removes all the invalid lines and rays.
+  /*!
+    The invalid lines and rays are those with all
+    the homogeneous terms set to zero.
+  */
+  void remove_invalid_lines_and_rays();
+
+  /*! \brief
+    Applies Gaussian's elimination and back-substitution so as
+    to provide a partial simplification of the system of generators.
+
+    It is assumed that the system has no pending generators.
+  */
+  void simplify();
+
+  /*! \brief
+    Inserts in \p *this a copy of the generator \p g,
+    increasing the number of space dimensions if needed.
+    It is a pending generator.
+  */
+  void insert_pending(const Generator& g);
+};
+
+// Generator_System.inlines.hh is not included here on purpose.
+
+// Automatically generated from PPL source file ../src/Grid_Generator_System.defs.hh line 1
+/* Grid_Generator_System class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Grid_Generator_System.defs.hh line 30
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Grid_Generator_System
+  Writes <CODE>false</CODE> if \p gs is empty.  Otherwise, writes on
+  \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Grid_Generator_System& gs);
+
+} // namespace IO_Operators
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Grid_Generator_System */
+bool operator==(const Grid_Generator_System& x,
+		const Grid_Generator_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator_System */
+void swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
+	  Parma_Polyhedra_Library::Grid_Generator_System& y);
+
+} // namespace std
+
+
+//! A system of grid generators.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Grid_Generator_System is a system of
+    grid generators, i.e., a multiset of objects of the class
+    Grid_Generator (lines, parameters and points).
+    When inserting generators in a system, space dimensions are
+    automatically adjusted so that all the generators in the system
+    are defined on the same vector space.
+    A system of grid generators which is meant to define a non-empty
+    grid must include at least one point: the reason is that
+    lines and parameters need a supporting point
+    (lines only specify directions while parameters only
+    specify direction and distance.
+
+    \par
+     In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code defines the line having the same direction
+    as the \f$x\f$ axis (i.e., the first Cartesian axis)
+    in \f$\Rset^2\f$:
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_line(x + 0*y));
+    \endcode
+    As said above, this system of generators corresponds to
+    an empty grid, because the line has no supporting point.
+    To define a system of generators that does correspond to
+    the \f$x\f$ axis, we can add the following code which
+    inserts the origin of the space as a point:
+    \code
+  gs.insert(grid_point(0*x + 0*y));
+    \endcode
+    Since space dimensions are automatically adjusted, the following
+    code obtains the same effect:
+    \code
+  gs.insert(grid_point(0*x));
+    \endcode
+    In contrast, if we had added the following code, we would have
+    defined a line parallel to the \f$x\f$ axis through
+    the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+    \code
+  gs.insert(grid_point(0*x + 1*y));
+    \endcode
+
+    \par Example 2
+    The following code builds a system of generators corresponding
+    to the grid consisting of all the integral points on the \f$x\f$ axes;
+    that is, all points satisfying the congruence relation
+    \f[
+      \bigl\{\,
+        (x, 0)^\transpose \in \Rset^2
+      \bigm|
+        x \pmod{1}\ 0
+      \,\bigr\},
+    \f]
+    \code
+  Grid_Generator_System gs;
+  gs.insert(parameter(x + 0*y));
+  gs.insert(grid_point(0*x + 0*y));
+    \endcode
+
+    \par Example 3
+    The following code builds a system of generators having three points
+    corresponding to a non-relational grid consisting of all points
+    whose coordinates are integer multiple of 3.
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_point(0*x + 3*y));
+  gs.insert(grid_point(3*x + 0*y));
+    \endcode
+
+    \par Example 4
+    By using parameters instead of two of the points we
+    can define the same grid as that defined in the previous example.
+    Note that there has to be at least one point and, for this purpose,
+    any point in the grid could be considered.
+    Thus the following code builds two identical grids from the
+    grid generator systems \p gs and \p gs1.
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(parameter(0*x + 3*y));
+  gs.insert(parameter(3*x + 0*y));
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(3*x + 3*y));
+  gs1.insert(parameter(0*x + 3*y));
+  gs1.insert(parameter(3*x + 0*y));
+    \endcode
+
+    \par Example 5
+    The following code builds a system of generators having one point and
+    a parameter corresponding to all the integral points that
+    lie on \f$x + y = 2\f$ in \f$\Rset^2\f$
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(1*x + 1*y));
+  gs.insert(parameter(1*x - 1*y));
+    \endcode
+
+    \note
+    After inserting a multiset of generators in a grid generator system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> grid generator system
+    will be available, where original generators may have been
+    reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Grid_Generator_System
+  : private Generator_System {
+public:
+  // FIXME: Add wrappers of any other public Generator_System methods.
+
+  //! Default constructor: builds an empty system of generators.
+  Grid_Generator_System();
+
+  //! Ordinary copy-constructor.
+  Grid_Generator_System(const Grid_Generator_System& gs);
+
+  //! Builds an empty system of generators of dimension \p dim.
+  explicit Grid_Generator_System(dimension_type dim);
+
+  //! Builds the singleton system containing only generator \p g.
+  explicit Grid_Generator_System(const Grid_Generator& g);
+
+  //! Returns the maximum space dimension a Grid_Generator_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Removes all the generators from the generator system and sets its
+    space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts into \p *this a copy of the generator \p g, increasing the
+    number of space dimensions if needed.
+
+    If \p g is an all-zero parameter then the only action is to ensure
+    that the space dimension of \p *this is at least the space
+    dimension of \p g.
+  */
+  void insert(const Grid_Generator& g);
+
+  /*! \brief
+    Inserts into \p *this the generator \p g, increasing the number of
+    space dimensions if needed.
+  */
+  void recycling_insert(Grid_Generator& g);
+
+  /*! \brief
+    Inserts into \p *this the generators in \p gs, increasing the
+    number of space dimensions if needed.
+  */
+  void recycling_insert(Grid_Generator_System& gs);
+
+  //! An iterator over a system of grid generators
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each generator contained in an object of Grid_Generator_System.
+
+    \par Example
+    The following code prints the system of generators
+    of the grid <CODE>gr</CODE>:
+    \code
+  const Grid_Generator_System& gs = gr.generators();
+  for (Grid_Generator_System::const_iterator i = gs.begin(),
+        gs_end = gs.end(); i != gs_end; ++i)
+    cout << *i << endl;
+    \endcode
+    The same effect can be obtained more concisely by using
+    more features of the STL:
+    \code
+  const Generator_System& gs = gr.generators();
+  copy(gs.begin(), gs.end(), ostream_iterator<Grid_Generator>(cout, "\n"));
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+			   Grid_Generator,
+			   ptrdiff_t,
+			   const Grid_Generator*,
+			   const Grid_Generator&>,
+      private Generator_System::const_iterator {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Grid_Generator& operator*() const;
+
+    //! Indirect member selector.
+    const Grid_Generator* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Grid_Generator_System;
+
+    //! Copy-constructor from Generator_System::const_iterator.
+    const_iterator(const Generator_System::const_iterator& y);
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first generator, if \p
+    *this is not empty; otherwise, returns the past-the-end
+    const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Grid_Generator_System& y);
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Assigns to a given variable an affine expression.
+  /*!
+    \param v
+    Index of the column to which the affine transformation is assigned;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation;
+
+    We allow affine transformations (see the Section \ref
+    rational_grid_operations)to have rational
+    coefficients. Since the coefficients of linear expressions are
+    integers we also provide an integer \p denominator that will
+    be used as denominator of the affine transformation.  The
+    denominator is required to be a positive integer and its
+    default value is 1.
+
+    The affine transformation assigns to each element of \p v -th
+    column the follow expression:
+    \f[
+      \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+           {\mathrm{denominator}}.
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_image(dimension_type v,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator);
+
+  //! Returns the number of generators in the system.
+  dimension_type num_generators() const;
+
+  //! Returns the number of parameters in the system.
+  dimension_type num_parameters() const;
+
+  //! Returns the number of lines in the system.
+  dimension_type num_lines() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains one or
+    more points.
+  */
+  bool has_points() const;
+
+  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+  bool is_equal_to(const Grid_Generator_System y) const;
+
+  //! Returns the \p k- th generator of the system.
+  Grid_Generator& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k- th generator of the system.
+  const Grid_Generator& operator[](dimension_type k) const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref
+    ascii_dump) and sets \p *this accordingly.  Returns
+    <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Resizes the matrix of generators using the numbers of rows and columns
+    read from \p s, then initializes the coordinates of each generator
+    and its type reading the contents from \p s.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Linear_System and each row in the system is a valid Grid_Generator.
+  */
+  bool OK() const;
+
+  /*! \brief
+    Adds \p dims rows and \p dims columns of zeroes to the matrix,
+    initializing the added rows as in the universe system.
+
+    \param dims
+    The number of rows and columns to be added: must be strictly
+    positive.
+
+    Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims)
+    \times (c+dims)\f$ matrix \f$\bigl({A \atop 0}{0 \atop B}\bigr)\f$
+    where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the
+    form \f$\bigl({1 \atop 0}{0 \atop 1}\bigr)\f$.  The matrix is
+    expanded avoiding reallocation whenever possible.
+  */
+  void add_universe_rows_and_columns(dimension_type dims);
+
+  //! Removes all the specified dimensions from the generator system.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the highest space dimension of the variables in \p
+    to_be_removed is higher than the space dimension of \p *this.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher dimensions of the system so that the resulting
+    system will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if the \p new_dimension is higher than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+private:
+  friend bool operator==(const Grid_Generator_System& x,
+			 const Grid_Generator_System& y);
+  // FIXME: The following friend declaration grants Grid::conversion
+  //        access to Matrix (for the Grid::reduce_reduced call) and
+  //        Matrix::resize_no_copy, and the following methods.
+  friend class Grid;
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  //! Resizes the system without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows of the resized system;
+
+    \param new_n_columns
+    The number of columns of the resized system.
+
+    The system is expanded to the specified dimensions avoiding
+    reallocation whenever possible.
+    The contents of the original system is lost.
+  */
+  void resize_no_copy(dimension_type new_n_rows,
+		      dimension_type new_n_columns);
+
+  /*! \brief
+    Returns the number of columns of the matrix (i.e., the size of the
+    rows).
+  */
+  dimension_type num_columns() const;
+
+  /*! \brief
+    Erases from the matrix all the rows but those having an index less
+    than \p first_to_erase.
+  */
+  void erase_to_end(dimension_type first_to_erase);
+
+  //! Permutes the columns of the matrix.
+  /*
+    \param cycles
+    A vector representing the non-trivial cycles of the permutation
+    according to which the columns must be rearranged.
+
+    The \p cycles vector contains, one after the other, the
+    non-trivial cycles (i.e., the cycles of length greater than one)
+    of a permutation of non-zero column indexes.  Each cycle is
+    terminated by zero.  For example, assuming the matrix has 6
+    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+    turn can be represented by a vector of 6 elements containing 1, 3,
+    6, 0, 2, 4, 0.
+  */
+  void permute_columns(const std::vector<dimension_type>& cycles);
+};
+
+// Grid_Generator_System.inlines.hh is not included here on purpose.
+
+// Automatically generated from PPL source file ../src/Congruence_System.defs.hh line 1
+/* Congruence_System class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Congruence_System.defs.hh line 33
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Congruence_System
+  Writes <CODE>true</CODE> if \p cgs is empty.  Otherwise, writes on
+  \p s the congruences of \p cgs, all in one row and separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Congruence_System& cgs);
+
+} // namespace IO_Operators
+
+// Put this in the namespace here to declare it a friend later.
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence_System */
+bool
+operator==(const Congruence_System& x, const Congruence_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+void
+swap(Parma_Polyhedra_Library::Congruence_System& x,
+     Parma_Polyhedra_Library::Congruence_System& y);
+
+} // namespace std
+
+//! A system of congruences.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Congruence_System is a system of congruences,
+    i.e., a multiset of objects of the class Congruence.
+    When inserting congruences in a system, space dimensions are
+    automatically adjusted so that all the congruences in the system
+    are defined on the same vector space.
+
+    \par
+    In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code builds a system of congruences corresponding to
+    an integer grid in \f$\Rset^2\f$:
+    \code
+  Congruence_System cgs;
+  cgs.insert(x %= 0);
+  cgs.insert(y %= 0);
+    \endcode
+    Note that:
+    the congruence system is created with space dimension zero;
+    the first and second congruence insertions increase the space
+    dimension to \f$1\f$ and \f$2\f$, respectively.
+
+    \par Example 2
+    By adding to the congruence system of the previous example,
+    the congruence \f$x + y = 1 \pmod{2}\f$:
+    \code
+  cgs.insert((x + y %= 1) / 2);
+    \endcode
+    we obtain the grid containing just those integral
+    points where the sum of the \p x and \p y values is odd.
+
+    \par Example 3
+    The following code builds a system of congruences corresponding to
+    the grid in \f$\Zset^2\f$ containing just the integral points on
+    the \p x axis:
+    \code
+  Congruence_System cgs;
+  cgs.insert(x %= 0);
+  cgs.insert((y %= 0) / 0);
+    \endcode
+
+    \note
+    After inserting a multiset of congruences in a congruence system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> congruence system
+    will be available, where original congruences may have been
+    reordered, removed (if they are trivial, duplicate or
+    implied by other congruences), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Congruence_System : private Matrix {
+public:
+  //! Default constructor: builds an empty system of congruences.
+  Congruence_System();
+
+  //! Builds the singleton system containing only congruence \p cg.
+  explicit Congruence_System(const Congruence& cg);
+
+  /*! \brief
+    If \p c represents the constraint \f$ e_1 = e_2 \f$, builds the
+    singleton system containing only constraint \f$ e_1 = e_2
+    \pmod{0}\f$.
+
+    \exception std::invalid_argument
+    Thrown if \p c is not an equality constraint.
+  */
+  explicit Congruence_System(const Constraint& c);
+
+  //! Builds a system containing copies of any equalities in \p cs.
+  explicit Congruence_System(const Constraint_System& cs);
+
+  //! Ordinary copy-constructor.
+  Congruence_System(const Congruence_System& cgs);
+
+  //! Destructor.
+  ~Congruence_System();
+
+  //! Assignment operator.
+  Congruence_System& operator=(const Congruence_System& cgs);
+
+  //! Returns the maximum space dimension a Congruence_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is exactly equal
+    to \p cgs.
+  */
+  bool is_equal_to(const Congruence_System& cgs) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains one or
+    more linear equalities.
+  */
+  bool has_linear_equalities() const;
+
+  //! Removes all the congruences and sets the space dimension to 0.
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the congruence \p cg, increasing the
+    number of space dimensions if needed.
+
+    The copy of \p cg will be strongly normalized after being
+    inserted.
+  */
+  void insert(const Congruence& cg);
+
+  /*! \brief
+    Inserts in \p *this a copy of the equality constraint \p c, seen
+    as a modulo 0 congruence, increasing the number of space
+    dimensions if needed.
+
+    The modulo 0 congruence will be strongly normalized after being
+    inserted.
+
+    \exception std::invalid_argument
+    Thrown if \p c is a relation.
+  */
+  void insert(const Constraint& c);
+
+  // TODO: Consider adding a recycling_insert(cg).
+
+  /*! \brief
+    Inserts in \p *this a copy of the congruences in \p cgs,
+    increasing the number of space dimensions if needed.
+
+    The inserted copies will be strongly normalized.
+  */
+  void insert(const Congruence_System& cgs);
+
+  /*! \brief
+    Inserts into \p *this the congruences in \p cgs, increasing the
+    number of space dimensions if needed.
+  */
+  void recycling_insert(Congruence_System& cgs);
+
+  //! Returns the system containing only Congruence::zero_dim_false().
+  static const Congruence_System& zero_dim_empty();
+
+  //! An iterator over a system of congruences.
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each congruence contained in an object of Congruence_System.
+
+    \par Example
+    The following code prints the system of congruences
+    defining the grid <CODE>gr</CODE>:
+    \code
+  const Congruence_System& cgs = gr.congruences();
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    cout << *i << endl;
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+			   Congruence,
+			   ptrdiff_t,
+			   const Congruence*,
+			   const Congruence&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Congruence& operator*() const;
+
+    //! Indirect member selector.
+    const Congruence* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Congruence_System;
+
+    //! The const iterator over the matrix of congruences.
+    Matrix::const_iterator i;
+
+    //! A const pointer to the matrix of congruences.
+    const Matrix* csp;
+
+    //! Constructor.
+    const_iterator(const Matrix::const_iterator& iter,
+		   const Congruence_System& cgs);
+
+    //! \p *this skips to the next non-trivial congruence.
+    void skip_forward();
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first congruence, if \p
+    *this is not empty; otherwise, returns the past-the-end
+    const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*!
+    Returns <CODE>true</CODE> if and only if \p *this is a valid
+    Matrix, each row in the system is a valid Congruence and the
+    number of columns is consistent with the number of congruences.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref
+    ascii_dump) and sets \p *this accordingly.  Returns
+    <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Returns the number of equalities.
+  dimension_type num_equalities() const;
+
+  //! Returns the number of proper congruences.
+  dimension_type num_proper_congruences() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Congruence_System& cgs);
+
+  /*! \brief
+    Adds \p dims rows and \p dims columns of zeroes to the matrix,
+    initializing the added rows as in the unit congruence system.
+
+    \param dims
+    The number of rows and columns to be added: must be strictly
+    positive.
+
+    Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims) \times
+    (c+dims)\f$ matrix \f$\bigl({0 \atop A}{B \atop A}\bigr)\f$ where
+    \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+    \f$\bigl({0 \atop 1}{1 \atop 0}\bigr)\f$.  The matrix is expanded
+    avoiding reallocation whenever possible.
+  */
+  void add_unit_rows_and_columns(dimension_type dims);
+
+  /*! \brief
+    Concatenates copies of the congruences from \p cgs onto \p *this.
+
+    The matrix for the new system of congruences is obtained by
+    leaving the old system in the upper left-hand side and placing the
+    congruences of \p cgs in the lower right-hand side, and padding
+    with zeroes.
+  */
+  void concatenate(const Congruence_System& cgs);
+
+protected:
+
+  //! Returns <CODE>true</CODE> if \p g satisfies all the congruences.
+  bool satisfies_all_congruences(const Grid_Generator& g) const;
+
+private:
+
+  //! Adjusts all expressions to have the same moduli.
+  void normalize_moduli();
+
+  //! Increase the number of space dimensions to \p new_space_dim.
+  /*!
+    \p new_space_dim must at least equal to the current space
+    dimension.
+  */
+  bool increase_space_dimension(const dimension_type new_space_dim);
+
+  /*! \brief
+    Inserts in \p *this an exact copy of the congruence \p cg,
+    increasing the number of space dimensions if needed.
+
+    This method inserts a copy of \p cg in the given form, instead of
+    first strong normalizing \p cg as \ref insert would do.
+  */
+  void insert_verbatim(const Congruence& cg);
+
+  friend class const_iterator;
+  // FIXME: Reduce the dependence on this declaration.
+  friend class Grid;
+  friend class Grid_Certificate;
+
+  friend void std::swap(Parma_Polyhedra_Library::Congruence_System& x,
+			Parma_Polyhedra_Library::Congruence_System& y);
+
+  friend bool
+  Parma_Polyhedra_Library::operator==(const Congruence_System& x,
+				      const Congruence_System& y);
+
+  //! Returns the \p k- th congruence of the system.
+  Congruence& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k- th congruence of the system.
+  const Congruence& operator[](dimension_type k) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if any of the dimensions in
+    \p *this is free of constraint.
+
+    Any equality or proper congruence affecting a dimension constrains
+    that dimension.
+
+    This method assumes the system is in minimal form.
+  */
+  bool has_a_free_dimension() const;
+
+  /*! \brief
+    Substitutes a given column of coefficients by a given affine
+    expression.
+
+    \param v
+    Index of the column to which the affine transformation is
+    substituted;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We allow affine transformations (see the Section \ref
+    rational_grid_operations) to have rational
+    coefficients. Since the coefficients of linear expressions are
+    integers we also provide an integer \p denominator that will
+    be used as denominator of the affine transformation.  The
+    denominator is required to be a positive integer and its default value
+    is 1.
+
+    The affine transformation substitutes the matrix of congruences
+    by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+    the old one \f$a_{ij}\f$ as follows:
+    \f[
+      {a'}_{ij} =
+        \begin{cases}
+          a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+            \quad \text{for } j \neq v; \\
+          \mathrm{expr}[v] * a_{iv}
+            \quad \text{for } j = v.
+        \end{cases}
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_preimage(dimension_type v,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator);
+
+  //! Resizes the system without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows of the resized system;
+
+    \param new_n_columns
+    The number of columns of the resized system.
+
+    The system is expanded to the specified dimensions avoiding
+    reallocation whenever possible.
+    The contents of the original system is lost.
+  */
+  void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns);
+};
+
+// Congruence_System.inlines.hh is not included here on purpose.
+
+// Automatically generated from PPL source file ../src/Linear_Expression.defs.hh line 1
+/* Linear_Expression class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Linear_Expression.defs.hh line 42
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the congruence \p e1 = \p e2 \p \pmod{1}.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the congruence \p e = \p n \p \pmod{1}.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 + \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v + \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, Variable w);
+
+//! Returns the linear expression \p v + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e);
+
+//! Returns the linear expression - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e);
+
+//! Returns the linear expression \p e1 - \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v - \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, Variable w);
+
+//! Returns the linear expression \p v - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e * \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 + \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e + \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator+=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e + \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 - \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e - \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator-=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e - \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+std::ostream& operator<<(std::ostream& s, const Linear_Expression& e);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+void swap(Parma_Polyhedra_Library::Linear_Expression& x,
+	  Parma_Polyhedra_Library::Linear_Expression& y);
+
+} // namespace std
+
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Linear_Expression represents the linear expression
+  \f[
+    \sum_{i=0}^{n-1} a_i x_i + b
+  \f]
+  where \f$n\f$ is the dimension of the vector space,
+  each \f$a_i\f$ is the integer coefficient
+  of the \f$i\f$-th variable \f$x_i\f$
+  and \f$b\f$ is the integer for the inhomogeneous term.
+
+  \par How to build a linear expression.
+
+  Linear expressions are the basic blocks for defining
+  both constraints (i.e., linear equalities or inequalities)
+  and generators (i.e., lines, rays, points and closure points).
+  A full set of functions is defined to provide a convenient interface
+  for building complex linear expressions starting from simpler ones
+  and from objects of the classes Variable and Coefficient:
+  available operators include unary negation,
+  binary addition and subtraction,
+  as well as multiplication by a Coefficient.
+  The space dimension of a linear expression is defined as the maximum
+  space dimension of the arguments used to build it:
+  in particular, the space dimension of a Variable <CODE>x</CODE>
+  is defined as <CODE>x.id()+1</CODE>,
+  whereas all the objects of the class Coefficient have space dimension zero.
+
+  \par Example
+  The following code builds the linear expression \f$4x - 2y - z + 14\f$,
+  having space dimension \f$3\f$:
+  \code
+  Linear_Expression e = 4*x - 2*y - z + 14;
+  \endcode
+  Another way to build the same linear expression is:
+  \code
+  Linear_Expression e1 = 4*x;
+  Linear_Expression e2 = 2*y;
+  Linear_Expression e3 = z;
+  Linear_Expression e = Linear_Expression(14);
+  e += e1 - e2 - e3;
+  \endcode
+  Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3,
+  respectively; also, in the fourth line of code, \p e is created
+  with space dimension zero and then extended to space dimension 3
+  in the fifth line.
+*/
+class Parma_Polyhedra_Library::Linear_Expression : private Linear_Row {
+public:
+  //! Default constructor: returns a copy of Linear_Expression::zero().
+  Linear_Expression();
+
+  //! Ordinary copy-constructor.
+  Linear_Expression(const Linear_Expression& e);
+
+  //! Destructor.
+  ~Linear_Expression();
+
+  /*! \brief
+    Builds the linear expression corresponding
+    to the inhomogeneous term \p n.
+  */
+  explicit Linear_Expression(Coefficient_traits::const_reference n);
+
+  //! Builds the linear expression corresponding to the variable \p v.
+  /*! \relates Linear_Expression
+    \exception std::length_error
+    Thrown if the space dimension of \p v exceeds
+    <CODE>Linear_Expression::max_space_dimension()</CODE>.
+  */
+  Linear_Expression(Variable v);
+
+  //! Builds the linear expression corresponding to constraint \p c.
+  /*!
+    Given the constraint
+    \f$c = \bigl(\sum_{i=0}^{n-1} a_i x_i + b \relsym 0\bigr)\f$,
+    where \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$,
+    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$.
+    If \p c is an inequality (resp., equality) constraint, then
+    the built linear expression is unique up to a positive
+    (resp., non-zero) factor.
+  */
+  explicit Linear_Expression(const Constraint& c);
+
+  /*! \brief
+    Builds the linear expression corresponding to generator \p g
+    (for points and closure points, the divisor is not copied).
+
+    Given the generator
+    \f$g = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$
+    (where, for lines and rays, we have \f$d = 1\f$),
+    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i\f$.
+    The inhomogeneous term of the linear expression will always be 0.
+    If \p g is a ray, point or closure point (resp., a line), then
+    the linear expression is unique up to a positive
+    (resp., non-zero) factor.
+  */
+  explicit Linear_Expression(const Generator& g);
+
+  //! Builds the linear expression corresponding to congruence \p cg.
+  /*!
+    Given the congruence
+    \f$cg = \bigl(\sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod{m}\bigr)\f$,
+    this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$.
+  */
+  explicit Linear_Expression(const Congruence& cg);
+
+  //! Returns the maximum space dimension a Linear_Expression can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns the (zero-dimension space) constant 0.
+  static const Linear_Expression& zero();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Linear_Expression& y);
+
+private:
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Constraint;
+  friend class Parma_Polyhedra_Library::Generator;
+  // The following declaration grants access to Grid_Generator::parameter.
+  friend class Parma_Polyhedra_Library::Grid_Generator;
+  friend class Parma_Polyhedra_Library::Congruence;
+  // FIXME: the following friend declaration should be avoided.
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  friend class Parma_Polyhedra_Library::Grid;
+  friend class Parma_Polyhedra_Library::LP_Problem;
+
+  // FIXME: the following friend declaration is only to grant access to
+  // Constraint_System::affine_preimage().
+  friend class Parma_Polyhedra_Library::Constraint_System;
+
+  // FIXME: the following friend declaration is only to grant access to
+  // Generator_System::affine_image().
+  friend class Parma_Polyhedra_Library::Generator_System;
+
+  // FIXME: the following friend declaration is only to grant access to
+  // Congruence_System::affine_preimage().
+  friend class Parma_Polyhedra_Library::Congruence_System;
+
+  // FIXME: the following friend declaration is only to grant access to
+  // Grid_Generator_System::affine_image().
+  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+  //! Copy-constructor with a specified space dimension.
+  Linear_Expression(const Linear_Expression& e, dimension_type sz);
+
+  //! Implementation sizing constructor.
+  /*!
+    The bool parameter is just to avoid problems with
+    the constructor Linear_Expression(Coefficient_traits::const_reference n).
+  */
+  Linear_Expression(dimension_type sz, bool);
+
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator+(const Linear_Expression& e1,
+				     const Linear_Expression& e2);
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator+(Coefficient_traits::const_reference n,
+				     const Linear_Expression& e);
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator+(const Linear_Expression& e,
+				     Coefficient_traits::const_reference n);
+
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator-(const Linear_Expression& e);
+
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator-(const Linear_Expression& e1,
+				     const Linear_Expression& e2);
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator-(Coefficient_traits::const_reference n,
+				     const Linear_Expression& e);
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator-(const Linear_Expression& e,
+				     Coefficient_traits::const_reference n);
+
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator*(Coefficient_traits::const_reference n,
+				     const Linear_Expression& e);
+  friend Linear_Expression
+  Parma_Polyhedra_Library::operator*(const Linear_Expression& e,
+				     Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator+=(Linear_Expression& e1,
+				      const Linear_Expression& e2);
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
+				      Variable v);
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator-=(Linear_Expression& e1,
+				      const Linear_Expression& e2);
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
+				      Variable v);
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  Parma_Polyhedra_Library::operator*=(Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+						    const Linear_Expression& e);
+
+  friend Congruence
+  Parma_Polyhedra_Library::operator%=(const Linear_Expression& e1,
+				      const Linear_Expression& e2);
+
+  friend Congruence
+  Parma_Polyhedra_Library::operator%=(const Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+};
+
+// Automatically generated from PPL source file ../src/Linear_Expression.inlines.hh line 1
+/* Linear_Expression class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Linear_Expression.inlines.hh line 28
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Linear_Expression::max_space_dimension() {
+  return Linear_Row::max_space_dimension();
+}
+
+inline
+Linear_Expression::Linear_Expression()
+  : Linear_Row(1, Linear_Row::Flags()) {
+}
+
+inline
+Linear_Expression::Linear_Expression(dimension_type sz, bool)
+  : Linear_Row(sz, Linear_Row::Flags()) {
+}
+
+inline
+Linear_Expression::Linear_Expression(const Variable v)
+  : Linear_Row(v.space_dimension() <= max_space_dimension()
+	       ? v.id() + 2
+	       : (throw std::length_error("PPL::Linear_Expression::"
+					  "Linear_Expression(v):\n"
+					  "v exceeds the maximum allowed "
+					  "space dimension."),
+		  v.id() + 2)
+	       , Linear_Row::Flags()) {
+  (*this)[v.id() + 1] = 1;
+}
+
+inline
+Linear_Expression::Linear_Expression(const Linear_Expression& e)
+  : Linear_Row(e) {
+}
+
+inline
+Linear_Expression::~Linear_Expression() {
+}
+
+inline
+Linear_Expression::Linear_Expression(const Linear_Expression& e,
+				     dimension_type sz)
+  : Linear_Row(e, sz, sz) {
+}
+
+inline
+Linear_Expression::Linear_Expression(Coefficient_traits::const_reference n)
+  : Linear_Row(1, Linear_Row::Flags()) {
+  (*this)[0] = n;
+}
+
+inline dimension_type
+Linear_Expression::space_dimension() const {
+  return size() - 1;
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::coefficient(Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    return Coefficient_zero();
+  return Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::inhomogeneous_term() const {
+  return Linear_Row::inhomogeneous_term();
+}
+
+inline const Linear_Expression&
+Linear_Expression::zero() {
+  static Linear_Expression z = Linear_Expression(Coefficient_zero());
+  return z;
+}
+
+inline memory_size_type
+Linear_Expression::external_memory_in_bytes() const {
+  return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_Expression::total_memory_in_bytes() const {
+  return Linear_Row::total_memory_in_bytes();
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e) {
+  return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Variable w) {
+  // FIXME: provide a better implementation.
+  return Linear_Expression(v) + Linear_Expression(w);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Linear_Expression& e) {
+  // FIXME: provide a better implementation.
+  return e + Linear_Expression(v);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, const Variable v) {
+  return v + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return -n + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Variable w) {
+  // FIXME: provide a better implementation.
+  return Linear_Expression(v) - Linear_Expression(w);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Linear_Expression& e) {
+  // FIXME: provide a better implementation.
+  return Linear_Expression(v) - e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, const Variable v) {
+  // FIXME: provide a better implementation.
+  return e - Linear_Expression(v);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n * e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  e[0] += n;
+  return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  e[0] -= n;
+  return e;
+}
+
+inline void
+Linear_Expression::swap(Linear_Expression& y) {
+  Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+swap(Parma_Polyhedra_Library::Linear_Expression& x,
+     Parma_Polyhedra_Library::Linear_Expression& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Linear_Expression.defs.hh line 443
+
+// Automatically generated from PPL source file ../src/Constraint.defs.hh line 1
+/* Constraint class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Constraint.defs.hh line 33
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator==(const Constraint& x, const Constraint& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator!=(const Constraint& x, const Constraint& y);
+
+//! Returns the constraint \p e1 = \p e2.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+//! Returns the constraint \p e = \p n.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+//! Returns the constraint \p n = \p e.
+/*! \relates Constraint */
+Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \<= \p e2.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+//! Returns the constraint \p e \<= \p n.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+//! Returns the constraint \p n \<= \p e.
+/*! \relates Constraint */
+Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \>= \p e2.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+//! Returns the constraint \p e \>= \p n.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+//! Returns the constraint \p n \>= \p e.
+/*! \relates Constraint */
+Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \< \p e2.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+//! Returns the constraint \p e \< \p n.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+//! Returns the constraint \p n \< \p e.
+/*! \relates Constraint */
+Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \> \p e2.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+//! Returns the constraint \p e \> \p n.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+//! Returns the constraint \p n \> \p e.
+/*! \relates Constraint */
+Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+void swap(Parma_Polyhedra_Library::Constraint& x,
+	  Parma_Polyhedra_Library::Constraint& y);
+
+} // namespace std
+
+//! A linear equality or inequality.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Constraint is either:
+  - an equality: \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$;
+  - a non-strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b \geq 0\f$; or
+  - a strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b > 0\f$;
+
+  where \f$n\f$ is the dimension of the space,
+  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$
+  and \f$b\f$ is the integer inhomogeneous term.
+
+  \par How to build a constraint
+  Constraints are typically built by applying a relation symbol
+  to a pair of linear expressions.
+  Available relation symbols are equality (<CODE>==</CODE>),
+  non-strict inequalities (<CODE>\>=</CODE> and <CODE>\<=</CODE>) and
+  strict inequalities (<CODE>\<</CODE> and <CODE>\></CODE>).
+  The space dimension of a constraint is defined as the maximum
+  space dimension of the arguments of its constructor.
+
+  \par
+  In the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds the equality constraint
+  \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+  \code
+  Constraint eq_c(3*x + 5*y - z == 0);
+  \endcode
+  The following code builds the (non-strict) inequality constraint
+  \f$4x \geq 2y - 13\f$, having space dimension \f$2\f$:
+  \code
+  Constraint ineq_c(4*x >= 2*y - 13);
+  \endcode
+  The corresponding strict inequality constraint
+  \f$4x > 2y - 13\f$ is obtained as follows:
+  \code
+  Constraint strict_ineq_c(4*x > 2*y - 13);
+  \endcode
+  An unsatisfiable constraint on the zero-dimension space \f$\Rset^0\f$
+  can be specified as follows:
+  \code
+  Constraint false_c = Constraint::zero_dim_false();
+  \endcode
+  Equivalent, but more involved ways are the following:
+  \code
+  Constraint false_c1(Linear_Expression::zero() == 1);
+  Constraint false_c2(Linear_Expression::zero() >= 1);
+  Constraint false_c3(Linear_Expression::zero() > 0);
+  \endcode
+  In contrast, the following code defines an unsatisfiable constraint
+  having space dimension \f$3\f$:
+  \code
+  Constraint false_c(0*z == 1);
+  \endcode
+
+  \par How to inspect a constraint
+  Several methods are provided to examine a constraint and extract
+  all the encoded information: its space dimension, its type
+  (equality, non-strict inequality, strict inequality) and
+  the value of its integer coefficients.
+
+  \par Example 2
+  The following code shows how it is possible to access each single
+  coefficient of a constraint. Given an inequality constraint
+  (in this case \f$x - 5y + 3z \leq 4\f$), we construct a new constraint
+  corresponding to its complement (thus, in this case we want to obtain
+  the strict inequality constraint \f$x - 5y + 3z > 4\f$).
+  \code
+  Constraint c1(x - 5*y + 3*z <= 4);
+  cout << "Constraint c1: " << c1 << endl;
+  if (c1.is_equality())
+    cout << "Constraint c1 is not an inequality." << endl;
+  else {
+    Linear_Expression e;
+    for (int i = c1.space_dimension() - 1; i >= 0; i--)
+      e += c1.coefficient(Variable(i)) * Variable(i);
+    e += c1.inhomogeneous_term();
+    Constraint c2 = c1.is_strict_inequality() ? (e <= 0) : (e < 0);
+    cout << "Complement c2: " << c2 << endl;
+  }
+  \endcode
+  The actual output is the following:
+  \code
+  Constraint c1: -A + 5*B - 3*C >= -4
+  Complement c2: A - 5*B + 3*C > 4
+  \endcode
+  Note that, in general, the particular output obtained can be
+  syntactically different from the (semantically equivalent)
+  constraint considered.
+*/
+class Parma_Polyhedra_Library::Constraint : private Linear_Row {
+public:
+  //! Ordinary copy-constructor.
+  Constraint(const Constraint& c);
+
+  //! Destructor.
+  ~Constraint();
+
+  //! Assignment operator.
+  Constraint& operator=(const Constraint& c);
+
+  //! Returns the maximum space dimension a Constraint can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! The constraint type.
+  enum Type {
+    /*! The constraint is an equality. */
+    EQUALITY,
+    /*! The constraint is a non-strict inequality. */
+    NONSTRICT_INEQUALITY,
+    /*! The constraint is a strict inequality. */
+    STRICT_INEQUALITY
+  };
+
+  //! Returns the constraint type of \p *this.
+  Type type() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is an equality constraint.
+  */
+  bool is_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is an inequality constraint (either strict or non-strict).
+  */
+  bool is_inequality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a non-strict inequality constraint.
+  */
+  bool is_nonstrict_inequality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a strict inequality constraint.
+  */
+  bool is_strict_inequality() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument thrown if the index of \p v
+    is greater than or equal to the space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! The unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+  static const Constraint& zero_dim_false();
+
+  /*! \brief
+    The true (zero-dimension space) constraint \f$0 \leq 1\f$,
+    also known as <EM>positivity constraint</EM>.
+  */
+  static const Constraint& zero_dim_positivity();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a tautology (i.e., an always true constraint).
+
+    A tautology can have either one of the following forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 = 0\f$; or
+    - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+      where \f$b \geq 0\f$; or
+    - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+      where \f$b > 0\f$.
+  */
+  bool is_tautological() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is inconsistent (i.e., an always false constraint).
+
+    An inconsistent constraint can have either one of the following forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b = 0\f$,
+      where \f$b \neq 0\f$; or
+    - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+      where \f$b < 0\f$; or
+    - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+      where \f$b \leq 0\f$.
+  */
+  bool is_inconsistent() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent constraints.
+
+    Constraints having different space dimensions are not equivalent.
+    Note that constraints having different types may nonetheless be
+    equivalent, if they both are tautologies or inconsistent.
+  */
+  bool is_equivalent_to(const Constraint& y) const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Constraint& y);
+
+private:
+  friend class Parma_Polyhedra_Library::Congruence;
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
+  friend class Parma_Polyhedra_Library::Constraint_System;
+  friend class Parma_Polyhedra_Library::Constraint_System::const_iterator;
+  // FIXME: the following friend declaration should be avoided.
+  friend class Parma_Polyhedra_Library::Polyhedron;
+
+  friend
+  Parma_Polyhedra_Library
+  ::Linear_Expression::Linear_Expression(const Constraint& c);
+
+  //! Default constructor: private and not implemented.
+  Constraint();
+
+  /*! \brief
+    Builds a constraint of type \p type and topology \p topology,
+    stealing the coefficients from \p e.
+  */
+  Constraint(Linear_Expression& e, Type type, Topology topology);
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+			       const char* name_var,
+			       Variable v) const;
+
+  friend Constraint
+  Parma_Polyhedra_Library::operator==(const Linear_Expression& e1,
+				      const Linear_Expression& e2);
+  friend Constraint
+  Parma_Polyhedra_Library::operator==(const Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+  friend Constraint
+  Parma_Polyhedra_Library::operator==(Coefficient_traits::const_reference n,
+				      const Linear_Expression& e);
+
+  friend Constraint
+  Parma_Polyhedra_Library::operator>=(const Linear_Expression& e1,
+				      const Linear_Expression& e2);
+  friend Constraint
+  Parma_Polyhedra_Library::operator>=(const Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+  friend Constraint
+  Parma_Polyhedra_Library::operator>=(Coefficient_traits::const_reference n,
+				      const Linear_Expression& e);
+
+  friend Constraint
+  Parma_Polyhedra_Library::operator<=(const Linear_Expression& e1,
+				      const Linear_Expression& e2);
+  friend Constraint
+  Parma_Polyhedra_Library::operator<=(const Linear_Expression& e,
+				      Coefficient_traits::const_reference n);
+  friend Constraint
+  Parma_Polyhedra_Library::operator<=(Coefficient_traits::const_reference n,
+				      const Linear_Expression& e);
+
+  friend Constraint
+  Parma_Polyhedra_Library::operator>(const Linear_Expression& e1,
+				     const Linear_Expression& e2);
+  friend Constraint
+  Parma_Polyhedra_Library::operator>(const Linear_Expression& e,
+				     Coefficient_traits::const_reference n);
+  friend Constraint
+  Parma_Polyhedra_Library::operator>(Coefficient_traits::const_reference n,
+				     const Linear_Expression& e);
+
+  friend Constraint
+  Parma_Polyhedra_Library::operator<(const Linear_Expression& e1,
+				     const Linear_Expression& e2);
+  friend Constraint
+  Parma_Polyhedra_Library::operator<(const Linear_Expression& e,
+				     Coefficient_traits::const_reference n);
+  friend Constraint
+  Parma_Polyhedra_Library::operator<(Coefficient_traits::const_reference n,
+				     const Linear_Expression& e);
+
+  //! Copy-constructor with given size.
+  Constraint(const Constraint& c, dimension_type sz);
+
+  /*! \brief
+    Builds a new copy of the zero-dimension space constraint
+    \f$\epsilon \geq 0\f$ (used to implement NNC polyhedra).
+  */
+  static Constraint construct_epsilon_geq_zero();
+
+  //! Returns the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+  static const Constraint& epsilon_geq_zero();
+
+  /*! \brief
+    The zero-dimension space constraint \f$\epsilon \leq 1\f$
+    (used to implement NNC polyhedra).
+  */
+  static const Constraint& epsilon_leq_one();
+
+  //! Sets the constraint type to <CODE>EQUALITY</CODE>.
+  void set_is_equality();
+
+  //! Sets the constraint to be an inequality.
+  /*!
+    Whether the constraint type will become <CODE>NONSTRICT_INEQUALITY</CODE>
+    or <CODE>STRICT_INEQUALITY</CODE> depends on the topology and the value
+    of the low-level coefficients of the constraint.
+  */
+  void set_is_inequality();
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint& c);
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Constraint.inlines.hh line 1
+/* Constraint class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Constraint.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint::Constraint(Linear_Expression& e, Type type, Topology topology) {
+  assert(type != STRICT_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+  Linear_Row::swap(e);
+  flags() = Flags(topology, (type == EQUALITY
+			     ? LINE_OR_EQUALITY
+			     : RAY_OR_POINT_OR_INEQUALITY));
+}
+
+inline
+Constraint::Constraint(const Constraint& c)
+  : Linear_Row(c) {
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type sz)
+  : Linear_Row(c, sz, sz) {
+}
+
+inline
+Constraint::~Constraint() {
+}
+
+inline Constraint&
+Constraint::operator=(const Constraint& c) {
+  Linear_Row::operator=(c);
+  return *this;
+}
+
+inline dimension_type
+Constraint::max_space_dimension() {
+  return Linear_Row::max_space_dimension();
+}
+
+inline dimension_type
+Constraint::space_dimension() const {
+  return Linear_Row::space_dimension();
+}
+
+inline bool
+Constraint::is_equality() const {
+  return is_line_or_equality();
+}
+
+inline bool
+Constraint::is_inequality() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline Constraint::Type
+Constraint::type() const {
+  if (is_equality())
+    return EQUALITY;
+  if (is_necessarily_closed())
+    return NONSTRICT_INEQUALITY;
+  else
+    return ((*this)[size() - 1] < 0)
+      ? STRICT_INEQUALITY
+      : NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_nonstrict_inequality() const {
+  return type() == NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_strict_inequality() const {
+  return type() == STRICT_INEQUALITY;
+}
+
+inline void
+Constraint::set_is_equality() {
+  set_is_line_or_equality();
+}
+
+inline void
+Constraint::set_is_inequality() {
+  set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Constraint::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Constraint::inhomogeneous_term() const {
+  return Linear_Row::inhomogeneous_term();
+}
+
+inline memory_size_type
+Constraint::external_memory_in_bytes() const {
+  return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint::total_memory_in_bytes() const {
+  return Linear_Row::total_memory_in_bytes();
+}
+
+/*! \relates Constraint */
+inline bool
+operator==(const Constraint& x, const Constraint& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline bool
+operator!=(const Constraint& x, const Constraint& y) {
+  return !x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff = e1 - e2;
+  Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.strong_normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff = e1 - e2;
+  Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff;
+  // Setting the epsilon coefficient to -1.
+  // NOTE: this also enforces normalization.
+  const dimension_type e1_dim = e1.space_dimension();
+  const dimension_type e2_dim = e2.space_dimension();
+  if (e1_dim > e2_dim)
+    diff -= Variable(e1_dim);
+  else
+    diff -= Variable(e2_dim);
+  diff += e1;
+  diff -= e2;
+
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff = n - e;
+  Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.strong_normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff = n - e;
+  Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff;
+  // Setting the epsilon coefficient to -1.
+  // NOTE: this also enforces normalization.
+  diff -= Variable(e.space_dimension());
+  diff += n;
+  diff -= e;
+
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff = e - n;
+  Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.strong_normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff = e - n;
+  Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+  // Enforce normalization.
+  c.normalize();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff;
+  // Setting the epsilon coefficient to -1.
+  // NOTE: this also enforces normalization.
+  diff -= Variable(e.space_dimension());
+  diff += e;
+  diff -= n;
+
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+  c.set_not_necessarily_closed();
+  c.set_is_inequality();
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return e2 >= e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  return e >= n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n >= e;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return e2 > e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  return e > n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n > e;
+}
+
+inline const Constraint&
+Constraint::zero_dim_false() {
+  static const Constraint zdf(Linear_Expression::zero() == Coefficient_one());
+  return zdf;
+}
+
+inline const Constraint&
+Constraint::zero_dim_positivity() {
+  static const Constraint zdp(Linear_Expression::zero() <= Coefficient_one());
+  return zdp;
+}
+
+inline const Constraint&
+Constraint::epsilon_geq_zero() {
+  static const Constraint eps_geq_zero = construct_epsilon_geq_zero();
+  return eps_geq_zero;
+}
+
+inline const Constraint&
+Constraint::epsilon_leq_one() {
+  static const Constraint
+    eps_leq_one(Linear_Expression::zero() < Coefficient_one());
+  return eps_leq_one;
+}
+
+inline void
+Constraint::ascii_dump(std::ostream& s) const {
+  Linear_Row::ascii_dump(s);
+}
+
+inline bool
+Constraint::ascii_load(std::istream& s) {
+  return Linear_Row::ascii_load(s);
+}
+
+inline void
+Constraint::swap(Constraint& y) {
+  Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+inline void
+swap(Parma_Polyhedra_Library::Constraint& x,
+     Parma_Polyhedra_Library::Constraint& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Constraint.defs.hh line 488
+
+// Automatically generated from PPL source file ../src/Constraint_System.inlines.hh line 1
+/* Constraint_System class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Constraint_System.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint_System::Constraint_System()
+  : Linear_System(NECESSARILY_CLOSED) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint& c)
+  : Linear_System(c.topology()) {
+  Linear_System::insert(c);
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs)
+  : Linear_System(cs) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol)
+  : Linear_System(topol) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol,
+				     const dimension_type n_rows,
+				     const dimension_type n_columns)
+  : Linear_System(topol, n_rows, n_columns) {
+}
+
+inline
+Constraint_System::~Constraint_System() {
+}
+
+inline Constraint_System&
+Constraint_System::operator=(const Constraint_System& y) {
+  Linear_System::operator=(y);
+  return *this;
+}
+
+inline Constraint&
+Constraint_System::operator[](const dimension_type k) {
+  return static_cast<Constraint&>(Linear_System::operator[](k));
+}
+
+inline const Constraint&
+Constraint_System::operator[](const dimension_type k) const {
+  return static_cast<const Constraint&>(Linear_System::operator[](k));
+}
+
+inline dimension_type
+Constraint_System::max_space_dimension() {
+  return Linear_System::max_space_dimension();
+}
+
+inline dimension_type
+Constraint_System::space_dimension() const {
+  return Linear_System::space_dimension();
+}
+
+inline void
+Constraint_System::clear() {
+  Linear_System::clear();
+}
+
+inline const Constraint_System&
+Constraint_System::zero_dim_empty() {
+  static const Constraint_System zdf(Constraint::zero_dim_false());
+  return zdf;
+}
+
+inline
+Constraint_System::const_iterator::const_iterator()
+  : i(), csp(0) {
+}
+
+inline
+Constraint_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i), csp(y.csp) {
+}
+
+inline
+Constraint_System::const_iterator::~const_iterator() {
+}
+
+inline Constraint_System::const_iterator&
+Constraint_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  csp = y.csp;
+  return *this;
+}
+
+inline const Constraint&
+Constraint_System::const_iterator::operator*() const {
+  return static_cast<const Constraint&>(*i);
+}
+
+inline const Constraint*
+Constraint_System::const_iterator::operator->() const {
+  return static_cast<const Constraint*>(i.operator->());
+}
+
+inline Constraint_System::const_iterator&
+Constraint_System::const_iterator::operator++() {
+  ++i;
+  skip_forward();
+  return *this;
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Constraint_System::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Constraint_System::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Constraint_System::const_iterator::
+const_iterator(const Linear_System::const_iterator& iter,
+	       const Constraint_System& csys)
+  : i(iter), csp(&csys) {
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::begin() const {
+  const_iterator i(Linear_System::begin(), *this);
+  i.skip_forward();
+  return i;
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::end() const {
+  const const_iterator i(Linear_System::end(), *this);
+  return i;
+}
+
+inline void
+Constraint_System::add_low_level_constraints() {
+  if (is_necessarily_closed())
+    // The positivity constraint.
+    insert(Constraint::zero_dim_positivity());
+  else {
+    // Add the epsilon constraints.
+    insert(Constraint::epsilon_leq_one());
+    insert(Constraint::epsilon_geq_zero());
+  }
+}
+
+inline void
+Constraint_System::swap(Constraint_System& y) {
+  Linear_System::swap(y);
+}
+
+inline memory_size_type
+Constraint_System::external_memory_in_bytes() const {
+  return Linear_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint_System::total_memory_in_bytes() const {
+  return Linear_System::total_memory_in_bytes();
+}
+
+inline void
+Constraint_System::simplify() {
+  Linear_System::simplify();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Constraint_System& x,
+     Parma_Polyhedra_Library::Constraint_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Generator.defs.hh line 1
+/* Generator class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Generator.defs.hh line 37
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator& g);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Generator */
+void swap(Parma_Polyhedra_Library::Generator& x,
+	  Parma_Polyhedra_Library::Generator& y);
+
+} // namespace std
+
+
+//! A line, ray, point or closure point.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Generator is one of the following:
+
+  - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a ray \f$\vect{r} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a point
+    \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  - a closure point
+    \f$\vect{c} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  where \f$n\f$ is the dimension of the space
+  and, for points and closure points, \f$d > 0\f$ is the divisor.
+
+  \par A note on terminology.
+  As observed in Section \ref representation, there are cases when,
+  in order to represent a polyhedron \f$\cP\f$ using the generator system
+  \f$\cG = (L, R, P, C)\f$, we need to include in the finite set
+  \f$P\f$ even points of \f$\cP\f$ that are <EM>not</EM> vertices
+  of \f$\cP\f$.
+  This situation is even more frequent when working with NNC polyhedra
+  and it is the reason why we prefer to use the word `point'
+  where other libraries use the word `vertex'.
+
+  \par How to build a generator.
+  Each type of generator is built by applying the corresponding
+  function (<CODE>line</CODE>, <CODE>ray</CODE>, <CODE>point</CODE>
+  or <CODE>closure_point</CODE>) to a linear expression,
+  representing a direction in the space;
+  the space dimension of the generator is defined as the space dimension
+  of the corresponding linear expression.
+  Linear expressions used to define a generator should be homogeneous
+  (any constant term will be simply ignored).
+  When defining points and closure points, an optional Coefficient argument
+  can be used as a common <EM>divisor</EM> for all the coefficients
+  occurring in the provided linear expression;
+  the default value for this argument is 1.
+
+  \par
+  In all the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a line with direction \f$x-y-z\f$
+  and having space dimension \f$3\f$:
+  \code
+  Generator l = line(x - y - z);
+  \endcode
+  As mentioned above, the constant term of the linear expression
+  is not relevant. Thus, the following code has the same effect:
+  \code
+  Generator l = line(x - y - z + 15);
+  \endcode
+  By definition, the origin of the space is not a line, so that
+  the following code throws an exception:
+  \code
+  Generator l = line(0*x);
+  \endcode
+
+  \par Example 2
+  The following code builds a ray with the same direction as the
+  line in Example 1:
+  \code
+  Generator r = ray(x - y - z);
+  \endcode
+  As is the case for lines, when specifying a ray the constant term
+  of the linear expression is not relevant; also, an exception is thrown
+  when trying to build a ray from the origin of the space.
+
+  \par Example 3
+  The following code builds the point
+  \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+  \code
+  Generator p = point(1*x + 0*y + 2*z);
+  \endcode
+  The same effect can be obtained by using the following code:
+  \code
+  Generator p = point(x + 2*z);
+  \endcode
+  Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+  using either one of the following lines of code:
+  \code
+  Generator origin3 = point(0*x + 0*y + 0*z);
+  Generator origin3_alt = point(0*z);
+  \endcode
+  Note however that the following code would have defined
+  a different point, namely \f$\vect{0} \in \Rset^2\f$:
+  \code
+  Generator origin2 = point(0*y);
+  \endcode
+  The following two lines of code both define the only point
+  having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+  In the second case we exploit the fact that the first argument
+  of the function <CODE>point</CODE> is optional.
+  \code
+  Generator origin0 = Generator::zero_dim_point();
+  Generator origin0_alt = point();
+  \endcode
+
+  \par Example 4
+  The point \f$\vect{p}\f$ specified in Example 3 above
+  can also be obtained with the following code,
+  where we provide a non-default value for the second argument
+  of the function <CODE>point</CODE> (the divisor):
+  \code
+  Generator p = point(2*x + 0*y + 4*z, 2);
+  \endcode
+  Obviously, the divisor can be usefully exploited to specify
+  points having some non-integer (but rational) coordinates.
+  For instance, the point
+  \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be specified by the following code:
+  \code
+  Generator q = point(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par Example 5
+  Closure points are specified in the same way we defined points,
+  but invoking their specific constructor function.
+  For instance, the closure point
+  \f$\vect{c} = (1, 0, 2)^\transpose \in \Rset^3\f$ is defined by
+  \code
+  Generator c = closure_point(1*x + 0*y + 2*z);
+  \endcode
+  For the particular case of the (only) closure point
+  having space dimension zero, we can use any of the following:
+  \code
+  Generator closure_origin0 = Generator::zero_dim_closure_point();
+  Generator closure_origin0_alt = closure_point();
+  \endcode
+
+  \par How to inspect a generator
+  Several methods are provided to examine a generator and extract
+  all the encoded information: its space dimension, its type and
+  the value of its integer coefficients.
+
+  \par Example 6
+  The following code shows how it is possible to access each single
+  coefficient of a generator.
+  If <CODE>g1</CODE> is a point having coordinates
+  \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+  we construct the closure point <CODE>g2</CODE> having coordinates
+  \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+  \code
+  if (g1.is_point()) {
+    cout << "Point g1: " << g1 << endl;
+    Linear_Expression e;
+    for (int i = g1.space_dimension() - 1; i >= 0; i--)
+      e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+    Generator g2 = closure_point(e, g1.divisor());
+    cout << "Closure point g2: " << g2 << endl;
+  }
+  else
+    cout << "Generator g1 is not a point." << endl;
+  \endcode
+  Therefore, for the point
+  \code
+  Generator g1 = point(2*x - y + 3*z, 2);
+  \endcode
+  we would obtain the following output:
+  \code
+  Point g1: p((2*A - B + 3*C)/2)
+  Closure point g2: cp((2*A - 2*B + 9*C)/2)
+  \endcode
+  When working with (closure) points, be careful not to confuse
+  the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+  these are equivalent only when the divisor of the (closure) point is 1.
+*/
+class Parma_Polyhedra_Library::Generator : private Linear_Row {
+public:
+  //! Returns the line of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Generator line(const Linear_Expression& e);
+
+  //! Returns the ray of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Generator ray(const Linear_Expression& e);
+
+  //! Returns the point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Generator point(const Linear_Expression& e
+			 = Linear_Expression::zero(),
+			 Coefficient_traits::const_reference d
+			 = Coefficient_one());
+
+  //! Returns the closure point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Generator
+  closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+		Coefficient_traits::const_reference d = Coefficient_one());
+
+  //! Ordinary copy-constructor.
+  Generator(const Generator& g);
+
+  //! Destructor.
+  ~Generator();
+
+  //! Assignment operator.
+  Generator& operator=(const Generator& g);
+
+  //! Returns the maximum space dimension a Generator can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! The generator type.
+  enum Type {
+    /*! The generator is a line. */
+    LINE,
+    /*! The generator is a ray. */
+    RAY,
+    /*! The generator is a point. */
+    POINT,
+    /*! The generator is a closure point. */
+    CLOSURE_POINT
+  };
+
+  //! Returns the generator type of \p *this.
+  Type type() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+  bool is_line() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a ray.
+  bool is_ray() const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line or a ray.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool is_line_or_ray() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+  bool is_point() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a closure point.
+  bool is_closure_point() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the index of \p v is greater than or equal to the
+    space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! If \p *this is either a point or a closure point, returns its divisor.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is neither a point nor a closure point.
+  */
+  Coefficient_traits::const_reference divisor() const;
+
+  //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+  static const Generator& zero_dim_point();
+
+  /*! \brief
+    Returns, as a closure point,
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Generator& zero_dim_closure_point();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent generators.
+
+    Generators having different space dimensions are not equivalent.
+  */
+  bool is_equivalent_to(const Generator& y) const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Generator& y);
+
+private:
+  /*! \brief
+    Builds a generator of type \p type and topology \p topology,
+    stealing the coefficients from \p e.
+  */
+  Generator(Linear_Expression& e, Type type, Topology topology);
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+			       const char* name_var,
+			       Variable v) const;
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* reason) const;
+
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Assign;
+  friend class Parma_Polyhedra_Library::Generator_System;
+  friend class Parma_Polyhedra_Library::Generator_System::const_iterator;
+  // FIXME: the following friend declaration should be avoided.
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  friend class Parma_Polyhedra_Library::Grid_Generator;
+  // This is for access to Row and Linear_Row in `insert'.
+  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+  friend
+  Parma_Polyhedra_Library
+  ::Linear_Expression::Linear_Expression(const Generator& g);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+						    const Generator& g);
+
+  //! Copy-constructor with given space dimension.
+  Generator(const Generator& g, dimension_type dimension);
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is not a line.
+  bool is_ray_or_point() const;
+
+  //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
+  void set_is_line();
+
+  //! Sets the Linear_Row kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+  void set_is_ray_or_point();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the closure point
+    \p *this has the same \e coordinates of the point \p p.
+
+    It is \e assumed that \p *this is a closure point, \p p is a point
+    and both topologies and space dimensions agree.
+  */
+  bool is_matching_closure_point(const Generator& p) const;
+
+  //! Default constructor: private and not implemented.
+  Generator();
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Shorthand for Generator Generator::line(const Linear_Expression& e).
+/*! \relates Generator */
+Generator line(const Linear_Expression& e);
+
+//! Shorthand for Generator Generator::ray(const Linear_Expression& e).
+/*! \relates Generator */
+Generator ray(const Linear_Expression& e);
+
+/*! \brief
+  Shorthand for Generator
+  Generator::point(const Linear_Expression& e, Coefficient_traits::const_reference d).
+
+  \relates Generator
+*/
+Generator
+point(const Linear_Expression& e = Linear_Expression::zero(),
+      Coefficient_traits::const_reference d = Coefficient_one());
+
+/*! \brief
+  Shorthand for Generator
+  Generator::closure_point(const Linear_Expression& e, Coefficient_traits::const_reference d).
+
+  \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+	      Coefficient_traits::const_reference d = Coefficient_one());
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Generator */
+bool operator==(const Generator& x, const Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Generator */
+bool operator!=(const Generator& x, const Generator& y);
+
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Generator.inlines.hh line 1
+/* Generator class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Generator::Generator(Linear_Expression& e, Type type, Topology topology) {
+  assert(type != CLOSURE_POINT || topology == NOT_NECESSARILY_CLOSED);
+  Linear_Row::swap(e);
+  flags() = Flags(topology, (type == LINE
+			     ? LINE_OR_EQUALITY
+			     : RAY_OR_POINT_OR_INEQUALITY));
+}
+
+inline
+Generator::Generator(const Generator& g)
+  : Linear_Row(g) {
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type dimension)
+  : Linear_Row(g, dimension, dimension) {
+}
+
+inline
+Generator::~Generator() {
+}
+
+inline Generator&
+Generator::operator=(const Generator& g) {
+  Linear_Row::operator=(g);
+  return *this;
+}
+
+inline dimension_type
+Generator::max_space_dimension() {
+  return Linear_Row::max_space_dimension();
+}
+
+inline dimension_type
+Generator::space_dimension() const {
+  return Linear_Row::space_dimension();
+}
+
+inline bool
+Generator::is_line() const {
+  return is_line_or_equality();
+}
+
+inline bool
+Generator::is_ray_or_point() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline bool
+Generator::is_line_or_ray() const {
+  return (*this)[0] == 0;
+}
+
+inline bool
+Generator::is_ray() const {
+  return is_ray_or_point() && is_line_or_ray();
+}
+
+inline Generator::Type
+Generator::type() const {
+  if (is_line())
+    return LINE;
+  if (is_line_or_ray())
+    return RAY;
+  if (is_necessarily_closed())
+    return POINT;
+  else {
+    // Checking the value of the epsilon coefficient.
+    const Generator& g = *this;
+    return (g[size() - 1] == 0) ? CLOSURE_POINT : POINT;
+  }
+}
+
+inline bool
+Generator::is_point() const {
+  return type() == POINT;
+}
+
+inline bool
+Generator::is_closure_point() const {
+  return type() == CLOSURE_POINT;
+}
+
+inline void
+Generator::set_is_line() {
+  set_is_line_or_equality();
+}
+
+inline void
+Generator::set_is_ray_or_point() {
+  set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Generator::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Generator::divisor() const {
+  Coefficient_traits::const_reference d = Linear_Row::inhomogeneous_term();
+  if (!is_ray_or_point() || d == 0)
+    throw_invalid_argument("divisor()",
+			   "*this is neither a point nor a closure point");
+  return d;
+}
+
+inline memory_size_type
+Generator::external_memory_in_bytes() const {
+  return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator::total_memory_in_bytes() const {
+  return Linear_Row::total_memory_in_bytes();
+}
+
+inline const Generator&
+Generator::zero_dim_point() {
+  static const Generator zdp = point();
+  return zdp;
+}
+
+inline const Generator&
+Generator::zero_dim_closure_point() {
+  static const Generator zdcp = closure_point();
+  return zdcp;
+}
+
+/*! \relates Generator */
+inline Generator
+line(const Linear_Expression& e) {
+  return Generator::line(e);
+}
+
+/*! \relates Generator */
+inline Generator
+ray(const Linear_Expression& e) {
+  return Generator::ray(e);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Coefficient_traits::const_reference d) {
+  return Generator::point(e, d);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+	      Coefficient_traits::const_reference d) {
+  return Generator::closure_point(e, d);
+}
+
+/*! \relates Generator */
+inline bool
+operator==(const Generator& x, const Generator& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Generator */
+inline bool
+operator!=(const Generator& x, const Generator& y) {
+  return !x.is_equivalent_to(y);
+}
+
+inline void
+Generator::ascii_dump(std::ostream& s) const {
+  Linear_Row::ascii_dump(s);
+}
+
+inline bool
+Generator::ascii_load(std::istream& s) {
+  return Linear_Row::ascii_load(s);
+}
+
+inline void
+Generator::swap(Generator& y) {
+  Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+inline void
+swap(Parma_Polyhedra_Library::Generator& x,
+     Parma_Polyhedra_Library::Generator& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Generator.defs.hh line 507
+
+// Automatically generated from PPL source file ../src/Grid_Generator.inlines.hh line 1
+/* Grid Generator class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Grid_Generator.defs.hh line 1
+/* Grid_Generator class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Grid_Generator.defs.hh line 30
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put these in the namespace here to declare them friend later.
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator& g);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+void swap(Parma_Polyhedra_Library::Grid_Generator& x,
+	  Parma_Polyhedra_Library::Grid_Generator& y);
+
+} // namespace std
+
+//! A line, parameter or point.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Grid_Generator is one of the following:
+
+  - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a parameter
+    \f$\vect{q} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  - a point
+    \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  where \f$n\f$ is the dimension of the space
+  and, for points and parameters, \f$d > 0\f$ is the divisor.
+
+  \par How to build a grid generator.
+  Each type of generator is built by applying the corresponding
+  function (<CODE>line</CODE>, <CODE>parameter</CODE> or <CODE>point</CODE>)
+  to a linear expression;
+  the space dimension of the generator is defined as the space dimension
+  of the corresponding linear expression.
+  Linear expressions used to define a generator should be homogeneous
+  (any constant term will be simply ignored).
+  When defining points and parameters, an optional Coefficient argument
+  can be used as a common <EM>divisor</EM> for all the coefficients
+  occurring in the provided linear expression;
+  the default value for this argument is 1.
+
+  \par
+  In all the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a line with direction \f$x-y-z\f$
+  and having space dimension \f$3\f$:
+  \code
+  Grid_Generator l = grid_line(x - y - z);
+  \endcode
+  By definition, the origin of the space is not a line, so that
+  the following code throws an exception:
+  \code
+  Grid_Generator l = grid_line(0*x);
+  \endcode
+
+  \par Example 2
+  The following code builds the parameter as the vector
+  \f$\vect{p} = (1, -1, -1)^\transpose \in \Rset^3\f$
+  which has the same direction as the line in Example 1:
+  \code
+  Grid_Generator q = parameter(x - y - z);
+  \endcode
+  Note that, unlike lines, for parameters, the length as well
+  as the direction of the vector represented by the code is significant.
+  Thus \p q is \e not the same as the parameter \p q1 defined by
+  \code
+  Grid_Generator q1 = parameter(2x - 2y - 2z);
+  \endcode
+  By definition, the origin of the space is not a parameter, so that
+  the following code throws an exception:
+  \code
+  Grid_Generator q = parameter(0*x);
+  \endcode
+
+  \par Example 3
+  The following code builds the point
+  \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+  \code
+  Grid_Generator p = grid_point(1*x + 0*y + 2*z);
+  \endcode
+  The same effect can be obtained by using the following code:
+  \code
+  Grid_Generator p = grid_point(x + 2*z);
+  \endcode
+  Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+  using either one of the following lines of code:
+  \code
+  Grid_Generator origin3 = grid_point(0*x + 0*y + 0*z);
+  Grid_Generator origin3_alt = grid_point(0*z);
+  \endcode
+  Note however that the following code would have defined
+  a different point, namely \f$\vect{0} \in \Rset^2\f$:
+  \code
+  Grid_Generator origin2 = grid_point(0*y);
+  \endcode
+  The following two lines of code both define the only point
+  having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+  In the second case we exploit the fact that the first argument
+  of the function <CODE>point</CODE> is optional.
+  \code
+  Grid_Generator origin0 = Generator::zero_dim_point();
+  Grid_Generator origin0_alt = grid_point();
+  \endcode
+
+  \par Example 4
+  The point \f$\vect{p}\f$ specified in Example 3 above
+  can also be obtained with the following code,
+  where we provide a non-default value for the second argument
+  of the function <CODE>grid_point</CODE> (the divisor):
+  \code
+  Grid_Generator p = grid_point(2*x + 0*y + 4*z, 2);
+  \endcode
+  Obviously, the divisor can be used to specify
+  points having some non-integer (but rational) coordinates.
+  For instance, the point
+  \f$\vect{p1} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be specified by the following code:
+  \code
+  Grid_Generator p1 = grid_point(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par Example 5
+  Parameters, like points can have a divisor.
+  For instance, the parameter
+  \f$\vect{q} = (1, 0, 2)^\transpose \in \Rset^3\f$ can be defined:
+  \code
+  Grid_Generator q = parameter(2*x + 0*y + 4*z, 2);
+  \endcode
+  Also, the divisor can be used to specify
+  parameters having some non-integer (but rational) coordinates.
+  For instance, the parameter
+  \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be defined:
+  \code
+  Grid_Generator q = parameter(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par How to inspect a grid generator
+  Several methods are provided to examine a grid generator and extract
+  all the encoded information: its space dimension, its type and
+  the value of its integer coefficients and the value of the denominator.
+
+  \par Example 6
+  The following code shows how it is possible to access each single
+  coefficient of a grid generator.
+  If <CODE>g1</CODE> is a point having coordinates
+  \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+  we construct the parameter <CODE>g2</CODE> having coordinates
+  \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+  \code
+  if (g1.is_point()) {
+    cout << "Point g1: " << g1 << endl;
+    Linear_Expression e;
+    for (int i = g1.space_dimension() - 1; i >= 0; i--)
+      e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+    Grid_Generator g2 = parameter(e, g1.divisor());
+    cout << "Parameter g2: " << g2 << endl;
+  }
+  else
+    cout << "Grid Generator g1 is not a point." << endl;
+  \endcode
+  Therefore, for the point
+  \code
+  Grid_Generator g1 = grid_point(2*x - y + 3*z, 2);
+  \endcode
+  we would obtain the following output:
+  \code
+  Point g1: p((2*A - B + 3*C)/2)
+  Parameter g2: parameter((2*A - 2*B + 9*C)/2)
+  \endcode
+  When working with points and parameters, be careful not to confuse
+  the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+  these are equivalent only when the divisor is 1.
+*/
+class Parma_Polyhedra_Library::Grid_Generator : private Generator {
+public:
+  // FIXME: Add wrappers of any other public Generator methods.
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! The generator type.
+  enum Type {
+    /*! The generator is a line. */
+    LINE,
+    /*! The generator is a parameter. */
+    PARAMETER,
+    /*! The generator is a point. */
+    POINT
+  };
+
+  //! Returns the generator type of \p *this.
+  Type type() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+  bool is_line() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a parameter.
+  bool is_parameter() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a line or
+    a parameter.
+  */
+  bool is_line_or_parameter() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+  bool is_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row represents a
+    parameter or a point.
+  */
+  bool is_parameter_or_point() const;
+
+  //! Returns the line of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Grid_Generator line(const Linear_Expression& e);
+
+  //! Returns the parameter at \p e.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Grid_Generator parameter(const Linear_Expression& e
+				  = Linear_Expression::zero(),
+				  Coefficient_traits::const_reference d
+				  = Coefficient_one());
+
+  //! Returns the point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Grid_Generator point(const Linear_Expression& e
+			      = Linear_Expression::zero(),
+			      Coefficient_traits::const_reference d
+			      = Coefficient_one());
+
+  //! Assignment operator.
+  Grid_Generator& operator=(const Grid_Generator& g);
+
+  //! Assignment operator.
+  Grid_Generator& operator=(const Generator& g);
+
+  //! Returns the divisor of \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is a line.
+  */
+  Coefficient_traits::const_reference divisor() const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    equivalent generators.
+
+    Generators having different space dimensions are not equivalent.
+  */
+  bool is_equivalent_to(const Grid_Generator& y) const;
+
+  //! Returns <CODE>true</CODE> if \p *this is exactly equal to \p y.
+  bool is_equal_to(const Grid_Generator& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous terms
+    of \p *this are \f$0\f$.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  /*! \brief
+    Scales \p *this to be represented with a divisor of \p d (if
+    \*this is a parameter or point).
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  void scale_to_divisor(Coefficient_traits::const_reference d);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(Grid_Generator& y);
+
+  /*! \brief
+    Swaps \p *this with \p y, leaving \p *this with the original
+    capacity.
+
+    All up to and including the last element of the smaller of \p
+    *this and \p y are swapped.  The parameter divisor element of \p y
+    is swapped with the divisor element of \p *this.
+  */
+  void coefficient_swap(Grid_Generator& y);
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+private:
+  /*! \brief
+    Constructs from polyhedron generator \p g, stealing the underlying
+    data structures from \p g.
+
+    The last column in \p g becomes the parameter divisor column of
+    the new Grid_Generator.
+  */
+  explicit Grid_Generator(Generator g);
+
+  //! Returns the actual size of \p this.
+  dimension_type size() const;
+
+  //! Negates the elements from index \p start to index \p end.
+  void negate(dimension_type start, dimension_type end);
+
+  //! Returns the divisor of \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is a line.
+  */
+  Coefficient& divisor();
+
+  //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
+  void set_is_line();
+
+  //! Sets the Linear_Row kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+  void set_is_parameter_or_point();
+
+  /*! \brief
+    Strong normalization: ensures that different Grid_Generator
+    objects represent different hyperplanes or hyperspaces.
+
+    Applies both Linear_Row::normalize() and Linear_Row::sign_normalize().
+
+    This is simply a wrapper around the Generator::strong_normalize,
+    which means applying it to a parameter may change the parameter.
+  */
+  void strong_normalize();
+
+  //! Returns a reference to the element of the row indexed by \p k.
+  Coefficient& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  Coefficient_traits::const_reference operator[](dimension_type k) const;
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception containing
+    the appropriate error message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* reason) const;
+
+  friend std::ostream&
+  IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g);
+  // FIXME: The following friend declaration is for operator[] and
+  //        divisor() access in Grid::conversion and Grid::simplify.
+  friend class Grid;
+
+  friend class Grid_Generator_System;
+  friend class Grid_Generator_System::const_iterator;
+  friend class Congruence_System;
+  friend class Scalar_Products;
+  friend class Topology_Adjusted_Scalar_Product_Sign;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  Shorthand for Grid_Generator
+  Grid_Generator::line(const Linear_Expression& e).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator grid_line(const Linear_Expression& e);
+
+/*! \brief
+  Shorthand for Grid_Generator
+  Grid_Generator::parameter(const Linear_Expression& e,
+  Coefficient_traits::const_reference d).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator
+parameter(const Linear_Expression& e = Linear_Expression::zero(),
+	  Coefficient_traits::const_reference d = Coefficient_one());
+
+/*! \brief
+  Shorthand for Grid_Generator
+  Grid_Generator::point(const Linear_Expression& e,
+  Coefficient_traits::const_reference d).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator
+grid_point(const Linear_Expression& e = Linear_Expression::zero(),
+	   Coefficient_traits::const_reference d = Coefficient_one());
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator==(const Grid_Generator& x, const Grid_Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator!=(const Grid_Generator& x, const Grid_Generator& y);
+
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Grid_Generator.defs.hh line 492
+
+// Automatically generated from PPL source file ../src/Grid_Generator.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Generator::Grid_Generator(Generator g)
+  : Generator(Generator::point()) {
+  Generator::swap(g);
+}
+
+inline dimension_type
+Grid_Generator::space_dimension() const {
+  return Generator::space_dimension() - 1;
+}
+
+inline Grid_Generator::Type
+Grid_Generator::type() const {
+  switch (Generator::type()) {
+  case Generator::POINT:
+    return POINT;
+  case Generator::RAY:
+    return PARAMETER;
+  case Generator::LINE:
+    return LINE;
+  case Generator::CLOSURE_POINT:
+  default:
+    assert(false);
+    return POINT;
+  }
+}
+
+inline bool
+Grid_Generator::is_line() const {
+  return Generator::is_line();
+}
+
+inline bool
+Grid_Generator::is_parameter() const {
+  return is_ray();
+}
+
+inline bool
+Grid_Generator::is_line_or_parameter() const {
+  return is_line_or_ray();
+}
+
+inline bool
+Grid_Generator::is_point() const {
+  return Generator::is_point();
+}
+
+inline bool
+Grid_Generator::is_parameter_or_point() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline void
+Grid_Generator::set_is_line() {
+  Generator::set_is_line();
+}
+
+inline void
+Grid_Generator::set_is_parameter_or_point() {
+  Generator::set_is_ray_or_point();
+}
+
+inline Grid_Generator&
+Grid_Generator::operator=(const Grid_Generator& g) {
+  Generator::operator=(g);
+  return *this;
+}
+
+inline Grid_Generator&
+Grid_Generator::operator=(const Generator& g) {
+  Generator::operator=(g);
+  return *this;
+}
+
+inline void
+Grid_Generator::negate(dimension_type start, dimension_type end) {
+  while (start <= end)
+    neg_assign(operator[](start++));
+}
+
+inline Coefficient&
+Grid_Generator::divisor() {
+  if (is_line())
+    throw_invalid_argument("divisor()", "*this is a line");
+  if (is_line_or_parameter())
+    return Generator::operator[](size() - 1);
+  return Generator::operator[](0);
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::divisor() const {
+  if (is_line())
+    throw_invalid_argument("divisor()", "*this is a line");
+  if (is_line_or_parameter())
+    return Generator::operator[](size() - 1);
+  return Generator::operator[](0);
+}
+
+inline memory_size_type
+Grid_Generator::total_memory_in_bytes() const {
+  return Generator::total_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator::external_memory_in_bytes() const {
+  return Generator::external_memory_in_bytes();
+}
+
+inline void
+Grid_Generator::strong_normalize() {
+  Generator::strong_normalize();
+}
+
+inline dimension_type
+Grid_Generator::size() const {
+  return Generator::size();
+}
+
+inline void
+Grid_Generator::swap(Grid_Generator& y) {
+  Generator::swap(y);
+}
+
+inline void
+Grid_Generator::ascii_dump(std::ostream& s) const {
+  Generator::ascii_dump(s);
+}
+
+inline bool
+Grid_Generator::ascii_load(std::istream& s) {
+  return Generator::ascii_load(s);
+}
+
+inline Coefficient&
+Grid_Generator::operator[](dimension_type k) {
+  return Generator::operator[](k);
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::operator[](dimension_type k) const {
+  return Generator::operator[](k);
+}
+
+/*! \relates Grid_Generator */
+inline bool
+operator==(const Grid_Generator& x, const Grid_Generator& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Grid_Generator */
+inline bool
+operator!=(const Grid_Generator& x, const Grid_Generator& y) {
+  return !(x == y);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_line(const Linear_Expression& e) {
+  return Grid_Generator::line(e);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e,
+	  Coefficient_traits::const_reference d) {
+  return Grid_Generator::parameter(e, d);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e,
+	   Coefficient_traits::const_reference d) {
+  return Grid_Generator::point(e, d);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+inline void
+swap(Parma_Polyhedra_Library::Grid_Generator& x,
+     Parma_Polyhedra_Library::Grid_Generator& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Congruence.defs.hh line 1
+/* Congruence class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Congruence.defs.hh line 36
+#include <iosfwd>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operators.
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+operator<<(std::ostream& s, const Congruence& c);
+
+// Put this in the namespace here to declare it a friend later.
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+std::ostream&
+operator<<(std::ostream& s, const Congruence_System& cgs);
+
+
+} // namespace IO_Operators
+
+// Put these in the namespace here to declare them friend later.
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator==(const Congruence& x, const Congruence& y);
+
+//! Returns <CODE>false</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator!=(const Congruence& x, const Congruence& y);
+
+//! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the congruence \f$e = n \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e,
+	   const Coefficient_traits::const_reference n);
+
+//! Returns a copy of \p cg, multiplying \p k into the copy's modulus.
+/*!
+    If \p cg represents the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then the result represents the
+    congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  \relates Congruence
+*/
+Congruence
+operator/(const Congruence& cg,
+	  const Coefficient_traits::const_reference k);
+
+//! Creates a congruence from \p c, with \p m as the modulus.
+/*! \relates Congruence */
+Congruence
+operator/(const Constraint& c,
+	  const Coefficient_traits::const_reference m);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Congruence */
+void
+swap(Parma_Polyhedra_Library::Congruence& x,
+     Parma_Polyhedra_Library::Congruence& y);
+
+} // namespace std
+
+//! A linear congruence.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Congruence is a congruence:
+  - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod m\f$
+
+  where \f$n\f$ is the dimension of the space,
+  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$,
+  \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus;
+  if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence
+  \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$
+  and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is
+  said to be a proper congruence.
+
+  \par How to build a congruence
+  Congruences \f$\pmod{1}\f$ are typically built by
+  applying the congruence symbol `<CODE>\%=</CODE>'
+  to a pair of linear expressions.
+  Congruences with modulus \p m
+  are typically constructed by building a congruence \f$\pmod{1}\f$
+  using the given pair of linear expressions
+  and then adding the modulus \p m
+  using the modulus symbol is `<CODE>/</CODE>'.
+
+  The space dimension of a congruence is defined as the maximum
+  space dimension of the arguments of its constructor.
+
+  \par
+  In the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds the equality congruence
+  \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+  \code
+  Congruence eq_cg((3*x + 5*y - z %= 0) / 0);
+  \endcode
+  The following code builds the congruence
+  \f$4x = 2y - 13 \pmod{1}\f$, having space dimension \f$2\f$:
+  \code
+  Congruence mod1_cg(4*x %= 2*y - 13);
+  \endcode
+  The following code builds the congruence
+  \f$4x = 2y - 13 \pmod{2}\f$, having space dimension \f$2\f$:
+  \code
+  Congruence mod2_cg((4*x %= 2*y - 13) / 2);
+  \endcode
+  An unsatisfiable congruence on the zero-dimension space \f$\Rset^0\f$
+  can be specified as follows:
+  \code
+  Congruence false_cg = Congruence::zero_dim_false();
+  \endcode
+  Equivalent, but more involved ways are the following:
+  \code
+  Congruence false_cg1((Linear_Expression::zero() %= 1) / 0);
+  Congruence false_cg2((Linear_Expression::zero() %= 1) / 2);
+  \endcode
+  In contrast, the following code defines an unsatisfiable congruence
+  having space dimension \f$3\f$:
+  \code
+  Congruence false_cg3((0*z %= 1) / 0);
+  \endcode
+
+  \par How to inspect a congruence
+  Several methods are provided to examine a congruence and extract
+  all the encoded information: its space dimension, its modulus
+  and the value of its integer coefficients.
+
+  \par Example 2
+  The following code shows how it is possible to access the modulus
+  as well as each of the coefficients.
+  Given a congruence with linear expression \p e and modulus \p m
+  (in this case \f$x - 5y + 3z = 4 \pmod{5}\f$), we construct a new
+  congruence with the same modulus \p m but where the linear
+  expression is \f$2 e\f$ (\f$2x - 10y + 6z = 8 \pmod{5}\f$).
+  \code
+  Congruence cg1((x - 5*y + 3*z %= 4) / 5);
+  cout << "Congruence cg1: " << cg1 << endl;
+  Coefficient m = cg1.modulus();
+  if (m == 0)
+    cout << "Congruence cg1 is an equality." << endl;
+  else {
+    Linear_Expression e;
+    for (int i = cg1.space_dimension() - 1; i >= 0; --i)
+      e += 2 * cg1.coefficient(Variable(i)) * Variable(i);
+      e += 2 * cg1.inhomogeneous_term();
+    Congruence cg2((e %= 0) / m);
+    cout << "Congruence cg2: " << cg2 << endl;
+  }
+  \endcode
+  The actual output could be the following:
+  \code
+  Congruence cg1: A - 5*B + 3*C %= 4 / 5
+  Congruence cg2: 2*A - 10*B + 6*C %= 8 / 5
+  \endcode
+  Note that, in general, the particular output obtained can be
+  syntactically different from the (semantically equivalent)
+  congruence considered.
+*/
+class Parma_Polyhedra_Library::Congruence : private Row {
+public:
+  //! Ordinary copy-constructor.
+  Congruence(const Congruence& cg);
+
+  //! Copy-constructs (modulo 0) from equality constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p c is a relation.
+  */
+  explicit Congruence(const Constraint& c);
+
+  //! Destructor.
+  ~Congruence();
+
+  //! Assignment operator.
+  Congruence& operator=(const Congruence& cg);
+
+  //! Returns the maximum space dimension a Congruence can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument thrown if the index of \p v
+    is greater than or equal to the space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns a const reference to the modulus of \p *this.
+  Coefficient_traits::const_reference modulus() const;
+
+  //! Multiplies \p k into the modulus of \p *this.
+  /*!
+    If called with \p *this representing the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then it returns with *this representing
+    the congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  */
+  Congruence&
+  operator/=(const Coefficient_traits::const_reference k);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a trivially
+    true congruence.
+
+    Trivially true congruences are of one the following two forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 == 0\f$; or
+    - a proper congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+    where n is the space dimension and m is the modulus.
+  */
+  bool is_trivial_true() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a trivially
+    false congruence.
+
+    Trivially false congruences have one of the following two forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b == 0\f$
+      where \f$b \neq 0\f$; or
+    - a congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+      where \f$b \neq 0 \pmod{m}\f$.
+  */
+  bool is_trivial_false() const;
+
+  //! Returns <CODE>true</CODE> if the modulus is greater than zero.
+  /*!
+    A congruence with a modulus of 0 is a linear equality.
+  */
+  bool is_proper_congruence() const;
+
+  //! Returns <CODE>true</CODE> if \p *this is an equality.
+  /*!
+    A modulus of zero denotes a linear equality.
+  */
+  bool is_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this is equal to \p cg in
+    dimension \p dim.
+  */
+  bool is_equal_at_dimension(dimension_type dim,
+			     const Congruence& cg) const;
+
+  /*! \brief
+    Returns a reference to the true (zero-dimension space) congruence
+    \f$0 = 1 \pmod{1}\f$, also known as the <EM>integrality
+    congruence</EM>.
+  */
+  static const Congruence& zero_dim_integrality();
+
+  /*! \brief
+    Returns a reference to the false (zero-dimension space) congruence
+    \f$0 = 1 \pmod{0}\f$.
+  */
+  static const Congruence& zero_dim_false();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation of the internal
+    representation of \p *this.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+protected:
+
+  //! Normalizes the signs.
+  /*!
+    The signs of the coefficients and the inhomogeneous term are
+    normalized, leaving the first non-zero homogeneous coefficient
+    positive.
+  */
+  void sign_normalize();
+
+  //! Normalizes signs and the inhomogeneous term.
+  /*!
+    Applies sign_normalize, then reduces the inhomogeneous term to the
+    smallest possible positive number.
+  */
+  void normalize();
+
+  //! Calls normalize, then divides out common factors.
+  /*!
+    Strongly normalized Congruences have equivalent semantics if and
+    only if their syntaxes (as output by operator<<) are equal.
+  */
+  void strong_normalize();
+
+private:
+
+  //! Returns a reference to the modulus of \p *this.
+  Coefficient& modulus();
+
+  //! Marks this congruence as a linear equality.
+  void set_is_equality();
+
+  //! Negates the elements from index \p start to index \p end.
+  void negate(dimension_type start, dimension_type end);
+
+  //! Default constructor: private and not implemented.
+  Congruence();
+
+  //! Copy-constructs with specified size and capacity.
+  Congruence(const Congruence& cg,
+	     dimension_type sz,
+	     dimension_type capacity);
+
+  //! Constructs from a constraint, with specified size and capacity.
+  Congruence(const Constraint& c,
+	     dimension_type sz,
+	     dimension_type capacity);
+
+  //! Copy-constructs from \p cg, multiplying \p k into the modulus.
+  /*!
+    If \p cg represents the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then the result represents the
+    congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  */
+  Congruence(const Congruence& cg, Coefficient_traits::const_reference k);
+
+  //! Constructs from Linear_Expression \p le, using modulus \p m.
+  /*!
+     Builds a congruence with modulus \p m, stealing the coefficients
+     from \p le.
+
+     \param le
+     The Linear_Expression holding the coefficients.
+
+     \param m
+     The modulus for the congruence.
+
+     \param capacity
+     If <CODE>true</CODE> then the size of the \p le row is expanded
+     and the modulus is stored in the extra space.  In this case it is
+     assumed that \p le has spare capacity of at least one element.
+     If <CODE>false</CODE> then the modulus is stored in the last
+     element of the \p le row.
+  */
+  Congruence(Linear_Expression& le,
+	     Coefficient_traits::const_reference m,
+	     bool capacity = true);
+
+  //! Swaps \p *this with \p y.
+  void swap(Congruence& y);
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    error message \p message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* message) const;
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+			       const char* v_name,
+			       Variable v) const;
+
+  friend Congruence
+  PPL::operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  friend Congruence
+  PPL::operator%=(const Linear_Expression& e,
+		  const Coefficient_traits::const_reference n);
+
+  friend Congruence
+  PPL::operator/(const Congruence& cg,
+		 const Coefficient_traits::const_reference k);
+
+  friend Congruence
+  PPL::operator/(const Constraint& c,
+		 const Coefficient_traits::const_reference m);
+
+  friend bool
+  PPL::operator==(const Congruence& x, const Congruence& y);
+
+  friend bool
+  PPL::operator!=(const Congruence& x, const Congruence& y);
+
+  friend std::ostream&
+  PPL::IO_Operators::operator<<(std::ostream& s,
+				const Congruence_System& cgs);
+
+  friend class PPL::Scalar_Products;
+  friend class PPL::Congruence_System;
+  friend class PPL::Congruence_System::const_iterator;
+  // FIXME: The following friend declaration is at least for
+  //        operator[] access in Grid::conversion.
+  friend class PPL::Grid;
+  friend class PPL::Linear_Expression;
+
+  friend void
+  std::swap(PPL::Congruence& x, PPL::Congruence& y);
+};
+
+// Automatically generated from PPL source file ../src/Congruence.inlines.hh line 1
+/* Congruence class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Congruence.inlines.hh line 28
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence::Congruence(const Congruence& cg)
+  : Row(cg) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+		       dimension_type sz, dimension_type capacity)
+  : Row(cg, sz, capacity) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+		       Coefficient_traits::const_reference k)
+  : Row(cg) {
+  if (k >= 0)
+    (*this)[size()-1] *= k;
+  else
+    (*this)[size()-1] *= -k;
+}
+
+inline
+Congruence::~Congruence() {
+}
+
+inline const Congruence&
+Congruence::zero_dim_integrality() {
+  static const Congruence zdi(Linear_Expression::zero() %= Coefficient(-1));
+  return zdi;
+}
+
+inline const Congruence&
+Congruence::zero_dim_false() {
+  static const Congruence
+    zdf((Linear_Expression::zero() %= Coefficient_one()) / 0);
+  return zdf;
+}
+
+inline Congruence&
+Congruence::operator=(const Congruence& c) {
+  Row::operator=(c);
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e,
+	   const Coefficient_traits::const_reference n) {
+  // Ensure that diff has capacity for the modulus.
+  Linear_Expression diff(e, e.space_dimension() + 2);
+  diff -= n;
+  Congruence cg(diff, 1, false);
+  return cg;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator/(const Congruence& cg,
+	  const Coefficient_traits::const_reference k) {
+  Congruence ret (cg, k);
+  return ret;
+}
+
+/*! \relates Congruence */
+inline Congruence
+operator/(const Constraint& c,
+	  const Coefficient_traits::const_reference m) {
+  Congruence ret (c);
+  return ret / m;
+}
+
+inline Congruence&
+Congruence::operator/=(const Coefficient_traits::const_reference k) {
+  if (k >= 0)
+    (*this)[size()-1] *= k;
+  else
+    (*this)[size()-1] *= -k;
+  return *this;
+}
+
+/*! \relates Congruence */
+inline bool
+operator==(const Congruence& x, const Congruence& y) {
+  Congruence x_temp(x);
+  Congruence y_temp(y);
+  x_temp.strong_normalize();
+  y_temp.strong_normalize();
+  return static_cast<const Row&>(x_temp) == static_cast<const Row&>(y_temp);
+}
+
+/*! \relates Congruence */
+inline bool
+operator!=(const Congruence& x, const Congruence& y) {
+  return !(x == y);
+}
+
+inline dimension_type
+Congruence::max_space_dimension() {
+  // The first coefficient holds the inhomogeneous term, while
+  // the last coefficient is for the modulus.
+  return max_size() - 2;
+}
+
+inline dimension_type
+Congruence::space_dimension() const {
+  return size() - 2;
+}
+
+inline Coefficient_traits::const_reference
+Congruence::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return (*this)[v.id()+1];
+}
+
+inline Coefficient_traits::const_reference
+Congruence::inhomogeneous_term() const {
+  return (*this)[0];
+}
+
+inline Coefficient_traits::const_reference
+Congruence::modulus() const {
+  assert(size() > 0);
+  return (*this)[size()-1];
+}
+
+inline Coefficient&
+Congruence::modulus() {
+  assert(size() > 0);
+  return (*this)[size()-1];
+}
+
+inline bool
+Congruence::is_proper_congruence() const {
+  return modulus() > 0;
+}
+
+inline bool
+Congruence::is_equality() const {
+  return modulus() == 0;
+}
+
+inline bool
+Congruence::is_equal_at_dimension(dimension_type dim,
+				  const Congruence& cg) const {
+  return operator[](dim) * cg.modulus() == cg[dim] * modulus();
+}
+
+inline void
+Congruence::set_is_equality() {
+  modulus() = 0;
+}
+
+inline void
+Congruence::negate(dimension_type start, dimension_type end) {
+  while (start <= end)
+    neg_assign(operator[](start++));
+}
+
+inline memory_size_type
+Congruence::external_memory_in_bytes() const {
+  return Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence::total_memory_in_bytes() const {
+  return Row::total_memory_in_bytes();
+}
+
+inline
+Congruence::Congruence(Linear_Expression& le,
+		       Coefficient_traits::const_reference m,
+		       bool capacity) {
+  Row::swap(static_cast<Row&>(le));
+  if (capacity)
+    Row::expand_within_capacity(size()+1);
+  if (m >= 0)
+    (*this)[size()-1] = m;
+  else
+    (*this)[size()-1] = -m;
+}
+
+inline void
+Congruence::swap(Congruence& y) {
+  Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline void
+swap(Parma_Polyhedra_Library::Congruence& x,
+     Parma_Polyhedra_Library::Congruence& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Congruence.defs.hh line 473
+
+// Automatically generated from PPL source file ../src/Generator_System.inlines.hh line 1
+/* Generator_System class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Generator_System.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Generator_System::Generator_System()
+  : Linear_System(NECESSARILY_CLOSED) {
+}
+
+inline
+Generator_System::Generator_System(const Generator& g)
+  : Linear_System(g.topology()) {
+  Linear_System::insert(g);
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs)
+  : Linear_System(gs) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol)
+  : Linear_System(topol) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol,
+				   const dimension_type n_rows,
+				   const dimension_type n_columns)
+  : Linear_System(topol, n_rows, n_columns) {
+}
+
+inline
+Generator_System::~Generator_System() {
+}
+
+inline Generator_System&
+Generator_System::operator=(const Generator_System& y) {
+  Linear_System::operator=(y);
+  return *this;
+}
+
+inline dimension_type
+Generator_System::max_space_dimension() {
+  return Linear_System::max_space_dimension();
+}
+
+inline dimension_type
+Generator_System::space_dimension() const {
+  return Linear_System::space_dimension();
+}
+
+inline void
+Generator_System::clear() {
+  Linear_System::clear();
+}
+
+inline Generator&
+Generator_System::operator[](const dimension_type k) {
+  return static_cast<Generator&>(Linear_System::operator[](k));
+}
+
+inline const Generator&
+Generator_System::operator[](const dimension_type k) const {
+  return static_cast<const Generator&>(Linear_System::operator[](k));
+}
+
+inline
+Generator_System::const_iterator::const_iterator()
+  : i(), gsp(0) {
+}
+
+inline
+Generator_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i), gsp(y.gsp) {
+}
+
+inline
+Generator_System::const_iterator::~const_iterator() {
+}
+
+inline
+Generator_System::const_iterator&
+Generator_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  gsp = y.gsp;
+  return *this;
+}
+
+inline const Generator&
+Generator_System::const_iterator::operator*() const {
+  return static_cast<const Generator&>(*i);
+}
+
+inline const Generator*
+Generator_System::const_iterator::operator->() const {
+  return static_cast<const Generator*>(i.operator->());
+}
+
+inline Generator_System::const_iterator&
+Generator_System::const_iterator::operator++() {
+  ++i;
+  if (!gsp->is_necessarily_closed())
+    skip_forward();
+  return *this;
+}
+
+inline Generator_System::const_iterator
+Generator_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Generator_System::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Generator_System::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Generator_System::const_iterator::
+const_iterator(const Linear_System::const_iterator& iter,
+	       const Generator_System& gsys)
+  : i(iter), gsp(&gsys) {
+}
+
+inline Generator_System::const_iterator
+Generator_System::begin() const {
+  const_iterator i(Linear_System::begin(), *this);
+  if (!is_necessarily_closed())
+    i.skip_forward();
+  return i;
+}
+
+inline Generator_System::const_iterator
+Generator_System::end() const {
+  const const_iterator i(Linear_System::end(), *this);
+  return i;
+}
+
+inline const Generator_System&
+Generator_System::zero_dim_univ() {
+  static const Generator_System zdu(Generator::zero_dim_point());
+  return zdu;
+}
+
+inline void
+Generator_System::swap(Generator_System& y) {
+  Linear_System::swap(y);
+}
+
+inline memory_size_type
+Generator_System::external_memory_in_bytes() const {
+  return Linear_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator_System::total_memory_in_bytes() const {
+  return Linear_System::total_memory_in_bytes();
+}
+
+inline void
+Generator_System::simplify() {
+  Linear_System::simplify();
+  remove_invalid_lines_and_rays();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Generator_System& x,
+     Parma_Polyhedra_Library::Generator_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Grid_Generator_System.inlines.hh line 1
+/* Grid_Generator_System class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Grid_Generator_System.inlines.hh line 28
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Generator_System::Grid_Generator_System()
+  : Generator_System(NECESSARILY_CLOSED) {
+  adjust_topology_and_space_dimension(NECESSARILY_CLOSED, 1);
+  set_sorted(false);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs)
+  : Generator_System(gs) {
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(dimension_type dim)
+  : Generator_System(NECESSARILY_CLOSED) {
+  adjust_topology_and_space_dimension(NECESSARILY_CLOSED, dim + 1);
+  set_sorted(false);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g)
+  : Generator_System(g) {
+  set_sorted(false);
+}
+
+inline dimension_type
+Grid_Generator_System::max_space_dimension() {
+  // Grid generators use an extra column for the parameter divisor.
+  return Generator_System::max_space_dimension() - 1;
+}
+
+inline dimension_type
+Grid_Generator_System::space_dimension() const {
+  assert(Generator_System::space_dimension() > 0);
+  // Grid generators use an extra column for the parameter divisor.
+  return Generator_System::space_dimension() - 1;
+}
+
+inline void
+Grid_Generator_System::clear() {
+  Generator_System::clear();
+  // For grid generators, two extra columns are needed.
+  add_zero_columns(2);
+  set_sorted(false);
+  unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::swap(Grid_Generator_System& y) {
+  Generator_System::swap(y);
+}
+
+inline memory_size_type
+Grid_Generator_System::external_memory_in_bytes() const {
+  return Generator_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator_System::total_memory_in_bytes() const {
+  return Generator_System::total_memory_in_bytes();
+}
+
+inline dimension_type
+Grid_Generator_System::num_generators() const {
+  return Generator_System::num_rows();
+}
+
+inline dimension_type
+Grid_Generator_System::num_parameters() const {
+  return Generator_System::num_rays();
+}
+
+inline dimension_type
+Grid_Generator_System::num_lines() const {
+  return Generator_System::num_lines();
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator()
+  : Generator_System::const_iterator() {
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator(const const_iterator& y)
+  : Generator_System::const_iterator(y) {
+}
+
+inline
+Grid_Generator_System::const_iterator::~const_iterator() {
+}
+
+inline
+Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator=(const const_iterator& y) {
+  return static_cast<Grid_Generator_System::const_iterator&>
+    (Generator_System::const_iterator::operator=(y));
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::const_iterator::operator*() const {
+  return static_cast<const Grid_Generator&>
+    (Generator_System::const_iterator::operator*());
+}
+
+inline const Grid_Generator*
+Grid_Generator_System::const_iterator::operator->() const {
+  return static_cast<const Grid_Generator*>
+    (Generator_System::const_iterator::operator->());
+}
+
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator++() {
+  return static_cast<Grid_Generator_System::const_iterator&>
+    (Generator_System::const_iterator::operator++());
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator==(const const_iterator& y) const {
+  return Generator_System::const_iterator::operator==(y);
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator!=(const const_iterator& y) const {
+  return Generator_System::const_iterator::operator!=(y);
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::begin() const {
+  return static_cast<Grid_Generator_System::const_iterator>
+    (Generator_System::begin());
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::end() const {
+  return static_cast<Grid_Generator_System::const_iterator>
+    (Generator_System::end());
+}
+
+inline
+Grid_Generator_System
+::const_iterator::const_iterator(const Generator_System::const_iterator& y)
+  : Generator_System::const_iterator::const_iterator(y) {
+}
+
+inline bool
+Grid_Generator_System::has_points() const {
+  return Generator_System::has_points();
+}
+
+inline Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) {
+  return static_cast<Grid_Generator&>(Generator_System::operator[](k));
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) const {
+  return static_cast<const Grid_Generator&>(Generator_System::operator[](k));
+}
+
+inline void
+Grid_Generator_System::ascii_dump(std::ostream& s) const {
+  return Generator_System::ascii_dump(s);
+}
+
+inline void
+Grid_Generator_System::set_sorted(bool b) {
+  Generator_System::set_sorted(b);
+}
+
+inline void
+Grid_Generator_System::unset_pending_rows() {
+  Generator_System::unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::set_index_first_pending_row(const dimension_type i) {
+  Generator_System::set_index_first_pending_row(i);
+}
+
+inline void
+Grid_Generator_System::resize_no_copy(const dimension_type new_n_rows,
+				      const dimension_type new_n_columns) {
+  Generator_System::resize_no_copy(new_n_rows, new_n_columns);
+}
+
+inline dimension_type
+Grid_Generator_System::num_columns() const {
+  return Generator_System::num_columns();
+}
+
+inline void
+Grid_Generator_System::erase_to_end(dimension_type first_to_erase) {
+  return Generator_System::erase_to_end(first_to_erase);
+}
+
+inline void
+Grid_Generator_System
+::permute_columns(const std::vector<dimension_type>& cycles) {
+  return Generator_System::permute_columns(cycles);
+}
+
+inline bool
+Grid_Generator_System::is_equal_to(const Grid_Generator_System y) const {
+  return operator==(static_cast<const Generator_System&>(*this),
+		    static_cast<const Generator_System&>(y));
+}
+
+/*! \relates Grid_Generator_System */
+inline bool
+operator==(const Grid_Generator_System& x,
+	   const Grid_Generator_System& y) {
+  return x.is_equal_to(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
+     Parma_Polyhedra_Library::Grid_Generator_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Congruence_System.inlines.hh line 1
+/* Congruence_System class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Congruence_System.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence_System::Congruence_System()
+  : Matrix(0, 2) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence& cg)
+  : Matrix(0, 2) {
+  insert(cg);
+}
+
+inline
+Congruence_System::Congruence_System(const Constraint& c)
+  : Matrix(0, 2) {
+  insert(c);
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cs)
+  : Matrix(cs) {
+}
+
+inline
+Congruence_System::~Congruence_System() {
+}
+
+inline Congruence_System&
+Congruence_System::operator=(const Congruence_System& y) {
+  Matrix::operator=(y);
+  return *this;
+}
+
+inline Congruence&
+Congruence_System::operator[](const dimension_type k) {
+  return static_cast<Congruence&>(Matrix::operator[](k));
+}
+
+inline const Congruence&
+Congruence_System::operator[](const dimension_type k) const {
+  return static_cast<const Congruence&>(Matrix::operator[](k));
+}
+
+inline dimension_type
+Congruence_System::max_space_dimension() {
+  return Matrix::max_num_columns() - 2;
+}
+
+inline dimension_type
+Congruence_System::space_dimension() const {
+  return Matrix::num_columns() - 2;
+}
+
+inline void
+Congruence_System::clear() {
+  Matrix::clear();
+  add_zero_columns(2);		// Modulus and constant term.
+}
+
+inline void
+Congruence_System::insert(const Congruence& cg) {
+  insert_verbatim(cg);
+  static_cast<Congruence&>(operator[](rows.size()-1)).strong_normalize();
+  assert(OK());
+}
+
+inline void
+Congruence_System::resize_no_copy(const dimension_type new_n_rows,
+				  const dimension_type new_n_columns) {
+  Matrix::resize_no_copy(new_n_rows, new_n_columns, Row::Flags());
+}
+
+inline const Congruence_System&
+Congruence_System::zero_dim_empty() {
+  static const Congruence_System zdf(Congruence::zero_dim_false());
+  return zdf;
+}
+
+inline
+Congruence_System::const_iterator::const_iterator()
+  : i(), csp(0) {
+}
+
+inline
+Congruence_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i), csp(y.csp) {
+}
+
+inline
+Congruence_System::const_iterator::~const_iterator() {
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  csp = y.csp;
+  return *this;
+}
+
+inline const Congruence&
+Congruence_System::const_iterator::operator*() const {
+  return static_cast<const Congruence&>(*i);
+}
+
+inline const Congruence*
+Congruence_System::const_iterator::operator->() const {
+  return static_cast<const Congruence*>(i.operator->());
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator++() {
+  ++i;
+  skip_forward();
+  return *this;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Congruence_System::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Congruence_System::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Congruence_System::const_iterator::
+const_iterator(const Matrix::const_iterator& iter,
+	       const Congruence_System& csys)
+  : i(iter), csp(&csys) {
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::begin() const {
+  const_iterator i(Matrix::begin(), *this);
+  i.skip_forward();
+  return i;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::end() const {
+  const const_iterator i(Matrix::end(), *this);
+  return i;
+}
+
+inline void
+Congruence_System::swap(Congruence_System& y) {
+  Matrix::swap(y);
+}
+
+inline memory_size_type
+Congruence_System::external_memory_in_bytes() const {
+  return Matrix::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence_System::total_memory_in_bytes() const {
+  return Matrix::total_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+inline void
+swap(Parma_Polyhedra_Library::Congruence_System& x,
+     Parma_Polyhedra_Library::Congruence_System& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Scalar_Products.defs.hh line 1
+/* Scalar_Products class definition.
+*/
+
+
+// Automatically generated from PPL source file ../src/Scalar_Products.defs.hh line 34
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class implementing various scalar product functions.
+/*! \ingroup PPL_CXX_interface
+  When computing the scalar product of (Linear_Row or Constraint or
+  Generator) objects <CODE>x</CODE> and <CODE>y</CODE>, it is assumed
+  that the space dimension of the first object <CODE>x</CODE> is less
+  than or equal to the space dimension of the second object <CODE>y</CODE>.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Scalar_Products {
+public:
+  //! Computes the scalar product of \p x and \p y and assigns it to \p z.
+  static void assign(Coefficient& z, const Linear_Row& x, const Linear_Row& y);
+  //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+  static void assign(Coefficient& z, const Constraint& c, const Generator& g);
+  //! Computes the scalar product of \p g and \p c and assigns it to \p z.
+  static void assign(Coefficient& z, const Generator& g, const Constraint& c);
+  //! Computes the scalar product of \p g and \p cg and assigns it to \p z.
+  static void assign(Coefficient& z,
+		     const Grid_Generator& g, const Congruence& cg);
+  //! Computes the scalar product of \p cg and \p g and assigns it to \p z.
+  static void assign(Coefficient& z,
+		     const Congruence& cg, const Grid_Generator& g);
+
+  //! Returns the sign of the scalar product between \p x and \p y.
+  static int sign(const Linear_Row& x, const Linear_Row& y);
+  //! Returns the sign of the scalar product between \p c and \p g.
+  static int sign(const Constraint& c, const Generator& g);
+  //! Returns the sign of the scalar product between \p g and \p c.
+  static int sign(const Generator& g, const Constraint& c);
+
+  /*! \brief
+    Computes the \e reduced scalar product of \p x and \p y,
+    where the \f$\epsilon\f$ coefficient of \p x is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+			     const Linear_Row& x, const Linear_Row& y);
+  /*! \brief
+    Computes the \e reduced scalar product of \p c and \p g,
+    where the \f$\epsilon\f$ coefficient of \p c is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+			     const Constraint& c, const Generator& g);
+  /*! \brief
+    Computes the \e reduced scalar product of \p g and \p c,
+    where the \f$\epsilon\f$ coefficient of \p g is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+			     const Generator& g, const Constraint& c);
+  //! \brief
+  //! Computes the \e reduced scalar product of \p g and \p cg,
+  //! where the \f$\epsilon\f$ coefficient of \p g is ignored,
+  //! and assigns the result to \p z.
+  static void reduced_assign(Coefficient& z,
+			     const Grid_Generator& g, const Congruence& cg);
+
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p x and \p y,
+    where the \f$\epsilon\f$ coefficient of \p x is ignored.
+  */
+  static int reduced_sign(const Linear_Row& x, const Linear_Row& y);
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p c and \p g,
+    where the \f$\epsilon\f$ coefficient of \p c is ignored.
+  */
+  static int reduced_sign(const Constraint& c, const Generator& g);
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p g and \p c,
+    where the \f$\epsilon\f$ coefficient of \p g is ignored.
+  */
+  static int reduced_sign(const Generator& g, const Constraint& c);
+
+  /*! \brief
+    Computes the \e homogeneous scalar product of \p x and \p y,
+    where the inhomogeneous terms are ignored,
+    and assigns the result to \p z.
+  */
+  static void homogeneous_assign(Coefficient& z,
+				 const Linear_Row& x, const Linear_Row& y);
+  /*! \brief
+    Computes the \e homogeneous scalar product of \p e and \p g,
+    where the inhomogeneous terms are ignored,
+    and assigns the result to \p z.
+  */
+  static void homogeneous_assign(Coefficient& z,
+				 const Linear_Expression& e,
+				 const Generator& g);
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p g and \p cg,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+				 const Grid_Generator& g, const Congruence& cg);
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p e and \p g,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+				 const Linear_Expression& e,
+				 const Grid_Generator& g);
+
+  /*! \brief
+    Returns the sign of the \e homogeneous scalar product of \p x and \p y,
+    where the inhomogeneous terms are ignored.
+  */
+  static int homogeneous_sign(const Linear_Row& x, const Linear_Row& y);
+  /*! \brief
+    Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+    where the inhomogeneous terms are ignored.
+  */
+  static int homogeneous_sign(const Linear_Expression& e, const Generator& g);
+  //! \brief
+  //! Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+  //! where the inhomogeneous terms are ignored,
+  static int homogeneous_sign(const Linear_Expression& e,
+			      const Grid_Generator& g);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Scalar product sign function object depending on topology.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign {
+public:
+  //! Constructs the function object according to the topology of \p c.
+  Topology_Adjusted_Scalar_Product_Sign(const Constraint& c);
+  //! Constructs the function object according to the topology of \p g.
+  Topology_Adjusted_Scalar_Product_Sign(const Generator& g);
+
+  //! Computes the (topology adjusted) scalar product sign of \p c and \p g.
+  int operator()(const Constraint&, const Generator&) const;
+  //! Computes the (topology adjusted) scalar product sign of \p g and \p c.
+  int operator()(const Generator&, const Constraint&) const;
+
+private:
+  //! The type of the scalar product sign function pointer.
+  typedef int (*SPS_type)(const Linear_Row&, const Linear_Row&);
+
+  //! The scalar product sign function pointer.
+  SPS_type sps_fp;
+};
+
+// Automatically generated from PPL source file ../src/Scalar_Products.inlines.hh line 1
+/* Scalar_Products class implementation (inline functions).
+*/
+
+
+// Automatically generated from PPL source file ../src/Scalar_Products.inlines.hh line 32
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+Scalar_Products::sign(const Linear_Row& x, const Linear_Row& y) {
+  TEMP_INTEGER(z);
+  assign(z, x, y);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Linear_Row& x, const Linear_Row& y) {
+  TEMP_INTEGER(z);
+  reduced_assign(z, x, y);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Row& x, const Linear_Row& y) {
+  TEMP_INTEGER(z);
+  homogeneous_assign(z, x, y);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::sign(const Constraint& c, const Generator& g) {
+  return sign(static_cast<const Linear_Row&>(c),
+	      static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::sign(const Generator& g, const Constraint& c) {
+  return sign(static_cast<const Linear_Row&>(g),
+	      static_cast<const Linear_Row&>(c));
+}
+
+inline int
+Scalar_Products::reduced_sign(const Constraint& c, const Generator& g) {
+  return reduced_sign(static_cast<const Linear_Row&>(c),
+		      static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::reduced_sign(const Generator& g, const Constraint& c) {
+  return reduced_sign(static_cast<const Linear_Row&>(g),
+		      static_cast<const Linear_Row&>(c));
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+				    const Linear_Expression& e,
+				    const Generator& g) {
+  homogeneous_assign(z,
+		     static_cast<const Linear_Row&>(e),
+		     static_cast<const Linear_Row&>(g));
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+				    const Linear_Expression& e,
+				    const Grid_Generator& g) {
+  homogeneous_assign(z,
+		     static_cast<const Linear_Row&>(e),
+		     static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+				  const Generator& g) {
+  return homogeneous_sign(static_cast<const Linear_Row&>(e),
+			  static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+				  const Grid_Generator& g) {
+  return homogeneous_sign(static_cast<const Linear_Row&>(e),
+			  static_cast<const Linear_Row&>(g));
+}
+
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Constraint& c)
+  : sps_fp(c.is_necessarily_closed()
+	   ? static_cast<SPS_type>(&Scalar_Products::sign)
+	   : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
+}
+
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Generator& g)
+  : sps_fp(g.is_necessarily_closed()
+	   ? static_cast<SPS_type>(&Scalar_Products::sign)
+	   : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Constraint& c,
+						  const Generator& g) const {
+  assert(c.space_dimension() <= g.space_dimension());
+  assert(sps_fp == (c.is_necessarily_closed()
+		    ? static_cast<SPS_type>(&Scalar_Products::sign)
+		    : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+  return sps_fp(static_cast<const Linear_Row&>(c),
+		static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Generator& g,
+						  const Constraint& c) const {
+  assert(g.space_dimension() <= c.space_dimension());
+  assert(sps_fp == (g.is_necessarily_closed()
+		    ? static_cast<SPS_type>(&Scalar_Products::sign)
+		    : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+  return sps_fp(static_cast<const Linear_Row&>(g),
+		static_cast<const Linear_Row&>(c));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Scalar_Products.defs.hh line 181
+
+// Automatically generated from PPL source file ../src/LP_Problem.defs.hh line 1
+/* LP_Problem class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/LP_Problem.defs.hh line 34
+#include <vector>
+#include <map>
+#include <iosfwd>
+
+//! A Linear Programming problem.
+/*! \ingroup PPL_CXX_interface */
+class Parma_Polyhedra_Library::LP_Problem {
+public:
+  //! Default constructor: builds a trivial LP problem.
+  /*!
+    The trivial LP problem requires to maximize the objective function
+    \f$0\f$ on the zero-dimensional vector space under no constraints
+    at all: the origin of the vector space is the optimal solution.
+  */
+  LP_Problem();
+
+  /*! \brief
+    Builds an LP problem from the constraint system \p cs, the objective
+    function \p obj and optimization mode \p mode.
+
+    \param cs
+    The constraint system defining the feasible region for the LP problem.
+
+    \param obj
+    The objective function for the LP problem (optional argument with
+    default value \f$0\f$).
+
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
+
+    \exception std::invalid_argument
+    Thrown if the constraint system contains any strict inequality
+    or if the space dimension of the objective function is strictly
+    greater than the space dimension of the constraint system.
+  */
+  explicit LP_Problem(const Constraint_System& cs,
+		      const Linear_Expression& obj = Linear_Expression::zero(),
+		      Optimization_Mode mode = MAXIMIZATION);
+
+  //! Ordinary copy-constructor.
+  LP_Problem(const LP_Problem& y);
+
+  //! Destructor.
+  ~LP_Problem();
+
+  //! Assignment operator.
+  LP_Problem& operator=(const LP_Problem& y);
+
+  //! Returns the maximum space dimension a LP_Problem can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the current LP problem.
+  dimension_type space_dimension() const;
+
+  //! Returns the constraints defining the current feasible region.
+  const Constraint_System& constraints() const;
+
+  //! Returns the current objective function.
+  const Linear_Expression& objective_function() const;
+
+  //! Returns the current optimization mode.
+  Optimization_Mode optimization_mode() const;
+
+  //! Resets \p *this to be equal to the trivial LP problem.
+  void clear();
+
+  /*! \brief
+    Adds a copy of constraint \p c to the current LP problem,
+    increasing the number of space dimensions if needed.
+
+    \exception std::invalid_argument
+    Thrown if the constraint \p c is a strict inequality.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the current LP problem,
+    increasing the number of space dimensions if needed.
+
+    \exception std::invalid_argument
+    Thrown if the constraint system \p cs contains any strict inequality.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  //! Sets the objective function to \p obj.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the space dimension of \p obj is strictly greater than
+    the space dimension of \p *this.
+  */
+  void set_objective_function(const Linear_Expression& obj);
+
+  //! Sets the optimization mode to \p mode.
+  void set_optimization_mode(Optimization_Mode mode);
+
+  //! Checks satisfiability of \p *this.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if the LP problem is satisfiable.
+  */
+  bool is_satisfiable() const;
+
+  //! Optimizes the current LP problem using the primal simplex algorithm.
+  /*!
+    \return
+    An LP_Problem_Status flag indicating the outcome of the optimization
+    attempt (unfeasible, unbounded or optimized problem).
+  */
+  LP_Problem_Status solve() const;
+
+  /*! \brief
+    Sets \p num and \p den so that \f$\frac{num}{den}\f$ is the result
+    of evaluating the objective function on \p evaluating_point.
+
+    \param evaluating_point
+    The point on which the objective function will be evaluated.
+
+    \param num
+    On exit will contain the numerator of the evaluated value.
+
+    \param den
+    On exit will contain the denominator of the evaluated value.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p evaluating_point are dimension-incompatible
+    or if the generator \p evaluating_point is not a point.
+  */
+  void evaluate_objective_function(const Generator& evaluating_point,
+				   Coefficient& num,
+				   Coefficient& den) const;
+
+  //! Returns a feasible point for \p *this, if it exists.
+  /*!
+    \exception std::domain_error
+    Thrown if the LP problem is not satisfiable.
+  */
+  const Generator& feasible_point() const;
+
+  //! Returns an optimal point for \p *this, if it exists.
+  /*!
+    \exception std::domain_error
+    Thrown if \p *this doesn't not have an optimizing point, i.e.,
+    if the LP problem is unbounded or not satisfiable.
+  */
+  const Generator& optimizing_point() const;
+
+  /*! \brief
+    Sets \p num and \p den so that \f$\frac{num}{den}\f$ is
+    the solution of the optimization problem.
+
+    \exception std::domain_error
+    Thrown if \p *this doesn't not have an optimizing point, i.e.,
+    if the LP problem is unbounded or not satisfiable.
+  */
+  void optimal_value(Coefficient& num, Coefficient& den) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void swap(LP_Problem& y);
+
+private:
+  //! The matrix encoding the current feasible region in tableau form.
+  Matrix tableau;
+  //! The working cost function.
+  Row working_cost;
+  //! The current basic solution.
+  std::vector<dimension_type> base;
+  //! A mapping between original variables and split ones.
+  /*!
+    Contains all the pairs (i, j) such that Variable(i) (that was not found
+    to be constrained in sign) has been split into two nonnegative variables.
+    The "positive" one is represented again by Variable(i), and
+    the "negative" one is represented by Variable(j).
+  */
+  std::map<dimension_type, dimension_type> dim_map;
+
+  //! An enumerated type describing the internal status of the LP problem.
+  enum Status {
+    //! The LP problem has not been solved yet.
+    UNSOLVED,
+    //! The LP problem is unsatisfiable.
+    UNSATISFIABLE,
+    //! The LP problem is satisfiable; a feasible solution has been computed.
+    SATISFIABLE,
+    //! The LP problem is unbounded; a feasible solution has been computed.
+    UNBOUNDED,
+    //! The LP problem is optimized; an optimal solution has been computed.
+    OPTIMIZED,
+    /*! \brief
+      The feasible region of the LP problem has been changed by adding
+      new constraints; a feasible solution for the old constraints has
+      been computed.
+    */
+    PARTIALLY_SATISFIABLE
+  };
+
+  //! The internal state of the LP problem.
+  Status status;
+
+  //! The constraint system describing the feasible region.
+  Constraint_System input_cs;
+
+  //! The objective function to be optimized.
+  Linear_Expression input_obj_function;
+
+  //! The optimization mode requested.
+  Optimization_Mode opt_mode;
+
+  //! The last successfully computed feasible or optimizing point.
+  Generator last_generator;
+
+  /*! \brief
+    Optimizes the current LP problem using the second phase of the
+    primal simplex algorithm.
+  */
+  void second_phase();
+
+  /*! \brief
+    Assigns to \p this->tableau a simplex tableau representing the
+    current LP problem, inserting into \p this->dim_map the information
+    that is required to recover the original LP problem.
+
+    \return
+    <CODE>UNFEASIBLE_LP_PROBLEM</CODE> if the constraint system contains
+    any trivially unfeasible constraint (tableau was not computed);
+    <CODE>UNBOUNDED_LP_PROBLEM</CODE> if the problem is trivially unbounded
+    (the computed tableau contains no constraints);
+    <CODE>OPTIMIZED_LP_PROBLEM></CODE> if the problem is neither trivially
+    unfeasible nor trivially unbounded (the tableau was computed successfully).
+  */
+  LP_Problem_Status compute_tableau();
+
+  /*! \brief
+    Checks for optimality and, if it does not hold, computes the column
+    index of the variable entering the base of the LP problem.
+    Implemented with anti-cycling rule.
+
+    \return
+    The column index of the variable that enters the base. If no such
+    variable exists, optimality was achieved and <CODE>0</CODE> is retuned.
+  */
+  dimension_type get_entering_var_index() const;
+
+  /*! \brief
+    Computes the row index of the variable exiting the base
+    of the LP problem. Implemented with anti-cycling rules.
+
+    \return
+    The row index of the variable exiting the base.
+
+    \param entering_var_index
+    The column index of the variable entering the base.
+  */
+  dimension_type
+  get_exiting_base_index(dimension_type entering_var_index) const;
+
+  //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
+  /*!
+    \param x
+    The Row that will be combined with \p y object.
+
+    \param y
+    The Row that will be combined with \p x object.
+
+    \param k
+    The position of \p *this that have to be \f$0\f$.
+
+    Computes a linear combination of \p x and \p y having
+    the element of index \p k equal to \f$0\f$. Then it assigns
+    the resulting Linear_Row to \p x and normalizes it.
+  */
+  static void linear_combine(Row& x, const Row& y, const dimension_type k);
+
+  /*! \brief
+    Swaps two variables in base during the simplex algorithm,
+    performing the needed linear combinations.
+
+    \param entering_var_index
+    The index of the variable entering the base.
+
+    \param exiting_base_index
+    The index of the row exiting the base.
+  */
+  void swap_base(const dimension_type entering_var_index,
+		 const dimension_type exiting_base_index);
+
+  /*! \brief
+    Checks for optimality and, if it does not hold, computes the column
+    index of the variable entering the base of the LP problem.
+
+    \return
+    The column index of the variable that enters the base. If no such
+    variable exists, optimality was achieved and <CODE>0</CODE> is retuned.
+
+    To compute the entering_index, the steepest edge algorithm chooses
+    the index `j' such that \f$\frac{d_{j}}{\|\Delta x^{j} \|}\f$ is the
+    largest in absolute value, where
+    \f[
+      \|\Delta x^{j} \|
+        = \left(
+            1+\sum_{i=1}^{m} \alpha_{ij}^2
+          \right)^{\frac{1}{2}}.
+    \f]
+    Recall that, due to the Integer implementation of the algorithm, our
+    tableau doesn't contain the ``real'' \f$\alpha\f$ values, but these
+    can be computed dividing the value of the cofficient by the value of
+    the variable in base. Obviously the result may not be an Integer, so
+    we will proceed in another way: the following code will compute the
+    lcm of all the variables in base to get the good ``weight'' of each
+    Coefficient of the tableau.
+  */
+  dimension_type steepest_edge() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and if only the algorithm successfully
+    computed a feasible solution.
+  */
+  bool compute_simplex();
+
+  /*! \brief
+    Adds the slack variables to satisfy the standard form of a LP problem,
+    inserts the "sign" to the cost functions, and makes the
+    necessary swaps to express the problem with the 1st phase base.
+  */
+  void prepare_first_phase();
+
+  /*! \brief
+    Drop unnecessary slack variables from the tableau and get ready
+    for the second phase of the simplex algorithm.
+  */
+  void erase_slacks();
+
+  bool is_in_base(const dimension_type var_index,
+		  dimension_type& row_index) const;
+
+  Generator compute_generator() const;
+};
+
+// Automatically generated from PPL source file ../src/LP_Problem.inlines.hh line 1
+/* LP_Problem class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/LP_Problem.inlines.hh line 28
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+LP_Problem::LP_Problem()
+  : tableau(), working_cost(0, Row::Flags()),
+    base(),  dim_map(), status(OPTIMIZED),
+    input_cs(), input_obj_function(), opt_mode(MAXIMIZATION),
+    last_generator(point()) {
+  assert(OK());
+}
+
+inline
+LP_Problem::LP_Problem(const Constraint_System& cs,
+		       const Linear_Expression& obj,
+		       const Optimization_Mode mode)
+  : tableau(), working_cost(0, Row::Flags()),
+    base(), dim_map(), status(UNSOLVED),
+    input_cs(!cs.has_strict_inequalities()
+	     ? cs
+	     : (throw std::invalid_argument("PPL::LP_Problem::"
+			   "LP_Problem(cs, obj, m):\n"
+			   "cs contains strict inequalities."),
+		cs)),
+    input_obj_function(obj.space_dimension() <= cs.space_dimension()
+		       ? obj
+		       : (throw std::invalid_argument("PPL::LP_Problem::"
+			             "LP_Problem(cs, obj, m):\n"
+				     "cs and obj have "
+				     "incompatible space dimensions."),
+			  obj)),
+    opt_mode(mode),
+    last_generator(point()) {
+  assert(OK());
+}
+
+inline
+LP_Problem::LP_Problem(const LP_Problem& y)
+  : tableau(y.tableau), working_cost(y.working_cost),
+    base(y.base), dim_map(y.dim_map), status(y.status),
+    input_cs(y.input_cs), input_obj_function(y.input_obj_function),
+    opt_mode(y.opt_mode), last_generator(y.last_generator) {
+  assert(OK());
+}
+
+inline
+LP_Problem::~LP_Problem() {
+}
+
+inline void
+LP_Problem::swap(LP_Problem& y) {
+  std::swap(tableau, y.tableau);
+  std::swap(working_cost, y.working_cost);
+  std::swap(base, y.base);
+  std::swap(dim_map, y.dim_map);
+  std::swap(status, y.status);
+  std::swap(input_cs, y.input_cs);
+  std::swap(input_obj_function, y.input_obj_function);
+  std::swap(opt_mode, y.opt_mode);
+  std::swap(last_generator, y.last_generator);
+}
+
+inline LP_Problem&
+LP_Problem::operator=(const LP_Problem& y) {
+  LP_Problem tmp(y);
+  swap(tmp);
+  return *this;
+}
+
+inline dimension_type
+LP_Problem::max_space_dimension() {
+  return Constraint_System::max_space_dimension();
+}
+
+inline dimension_type
+LP_Problem::space_dimension() const {
+  return input_cs.space_dimension();
+}
+
+inline const Constraint_System&
+LP_Problem::constraints() const {
+  return input_cs;
+}
+
+inline const Linear_Expression&
+LP_Problem::objective_function() const {
+  return input_obj_function;
+}
+
+inline Optimization_Mode
+LP_Problem::optimization_mode() const {
+  return opt_mode;
+}
+
+inline void
+LP_Problem::clear() {
+  LP_Problem tmp;
+  swap(tmp);
+}
+
+inline void
+LP_Problem::add_constraint(const Constraint& c) {
+  if (c.is_strict_inequality())
+    throw std::invalid_argument("PPL::LP_Problem::add_constraint(c):\n"
+				"c is a strict inequality.");
+  input_cs.insert(c);
+  if (status != UNSATISFIABLE)
+    // TODO: apply an incremental version of the simplex algorithm,
+    // setting `status' to PARTIALLY_SATISFIABLE;
+    status = UNSOLVED;
+}
+
+inline void
+LP_Problem::add_constraints(const Constraint_System& cs) {
+  if (cs.has_strict_inequalities())
+    throw std::invalid_argument("PPL::LP_Problem::add_constraints(cs):\n"
+				"cs contains strict inequalities.");
+  const dimension_type cs_num_rows = cs.num_rows();
+  for (dimension_type i = cs_num_rows; i-- > 0; )
+    input_cs.insert(cs[i]);
+  if (status != UNSATISFIABLE)
+    // TODO: apply an incremental version of the simplex algorithm,
+    // setting `status' to PARTIALLY_SATISFIABLE;
+    status = UNSOLVED;
+  assert(OK());
+}
+
+inline void
+LP_Problem::set_objective_function(const Linear_Expression& obj) {
+  if (space_dimension() < obj.space_dimension())
+    throw std::invalid_argument("PPL::LP_Problem::"
+				"set_objective_function(obj):\n"
+				"*this and obj are dimension incompatible.");
+  switch (status) {
+  case UNBOUNDED:
+    status = SATISFIABLE;
+    break;
+  case OPTIMIZED:
+    status = SATISFIABLE;
+    break;
+  default:
+    break;
+  }
+  input_obj_function = obj;
+  assert(OK());
+}
+
+inline void
+LP_Problem::set_optimization_mode(Optimization_Mode mode) {
+  if (opt_mode == mode)
+    return;
+  switch (status) {
+  case UNBOUNDED:
+    status = SATISFIABLE;
+    break;
+  case OPTIMIZED:
+    status = SATISFIABLE;
+    break;
+  default:
+    break;
+  }
+  opt_mode = mode;
+  assert(OK());
+}
+
+inline LP_Problem_Status
+LP_Problem::solve() const {
+  if (is_satisfiable()) {
+    LP_Problem& x = const_cast<LP_Problem&>(*this);
+    x.second_phase();
+    if (x.status == UNBOUNDED)
+      return UNBOUNDED_LP_PROBLEM;
+    if (x.status == OPTIMIZED)
+      return OPTIMIZED_LP_PROBLEM;
+  }
+  return UNFEASIBLE_LP_PROBLEM;
+}
+
+inline const Generator&
+LP_Problem::feasible_point() const {
+  if (is_satisfiable()) {
+    assert(OK());
+    return last_generator;
+  }
+  throw std::domain_error("PPL::LP_Problem::feasible_point():\n"
+			  "*this is not satisfiable.");
+}
+
+inline const Generator&
+LP_Problem::optimizing_point() const {
+  if (solve() == OPTIMIZED_LP_PROBLEM)
+    return last_generator;
+  throw std::domain_error("PPL::LP_Problem::optimizing_point():\n"
+			  "*this doesn't have an optimizing point.");
+}
+
+inline void
+LP_Problem::optimal_value(Coefficient& num, Coefficient& den) const {
+  const Generator& g_ref = optimizing_point();
+  evaluate_objective_function(g_ref, num, den);
+  assert(OK());
+}
+
+inline memory_size_type
+LP_Problem::external_memory_in_bytes() const {
+  memory_size_type n
+    = tableau.external_memory_in_bytes()
+    + working_cost.external_memory_in_bytes()
+    + input_cs.external_memory_in_bytes()
+    + input_obj_function.external_memory_in_bytes()
+    + last_generator.external_memory_in_bytes();
+  // Adding the external memory for `base'.
+  n += base.capacity() * sizeof(dimension_type);
+  // Adding the external memory for `dim_map'.
+  // CHECK ME: just a lower approximation?
+  n += dim_map.size()
+    * sizeof(std::map<dimension_type, dimension_type>::value_type);
+  return n;
+}
+
+inline memory_size_type
+LP_Problem::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::LP_Problem */
+inline void
+swap(Parma_Polyhedra_Library::LP_Problem& x,
+     Parma_Polyhedra_Library::LP_Problem& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/LP_Problem.defs.hh line 393
+
+// Automatically generated from PPL source file ../src/Poly_Gen_Relation.defs.hh line 1
+/* Poly_Gen_Relation class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Poly_Gen_Relation.defs.hh line 28
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Gen_Relation */
+Poly_Gen_Relation operator&&(const Poly_Gen_Relation& x,
+			     const Poly_Gen_Relation& y);
+
+/*! \brief
+  Yields the assertion with all the conjuncts of \p x
+  that are not in \p y.
+
+  \relates Poly_Gen_Relation
+*/
+Poly_Gen_Relation operator-(const Poly_Gen_Relation& x,
+			    const Poly_Gen_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Gen_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a generator
+/*! \ingroup PPL_CXX_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a generator.
+*/
+class Parma_Polyhedra_Library::Poly_Gen_Relation {
+private:
+  //! Poly_Gen_Relation is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t NOTHING  = 0U;
+  static const flags_t SUBSUMES = 1U << 0;
+  //@} // Bit-masks for the individual assertions
+
+  //! All assertions together.
+  static const flags_t EVERYTHING
+  = SUBSUMES;
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! True if and only if the conjunction \p x implies the conjunction \p y.
+  static bool implies(flags_t x, flags_t y);
+
+  //! Construct from a bit-mask.
+  Poly_Gen_Relation(flags_t mask);
+
+  friend bool
+  Parma_Polyhedra_Library::operator==(const Poly_Gen_Relation& x,
+				      const Poly_Gen_Relation& y);
+
+  friend bool
+  Parma_Polyhedra_Library::operator!=(const Poly_Gen_Relation& x,
+				      const Poly_Gen_Relation& y);
+
+  friend Poly_Gen_Relation
+  Parma_Polyhedra_Library::operator&&(const Poly_Gen_Relation& x,
+				      const Poly_Gen_Relation& y);
+
+  friend Poly_Gen_Relation
+  Parma_Polyhedra_Library::operator-(const Poly_Gen_Relation& x,
+				     const Poly_Gen_Relation& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::
+  IO_Operators::operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Access the internal flags: this is needed for some foreign
+    language interfaces.
+  */
+#endif
+  flags_t get_flags() const;
+
+public:
+  //! The assertion that says nothing.
+  static Poly_Gen_Relation nothing();
+
+  //! Adding the generator would not change the polyhedron.
+  static Poly_Gen_Relation subsumes();
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  //! True if and only if \p *this implies \p y.
+  bool implies(const Poly_Gen_Relation& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+// Automatically generated from PPL source file ../src/Poly_Gen_Relation.inlines.hh line 1
+/* Poly_Gen_Relation class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Gen_Relation::Poly_Gen_Relation(flags_t mask)
+  : flags(mask) {
+}
+
+inline Poly_Gen_Relation::flags_t
+Poly_Gen_Relation::get_flags() const {
+  return flags;
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::nothing() {
+  return Poly_Gen_Relation(NOTHING);
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::subsumes() {
+  return Poly_Gen_Relation(SUBSUMES);
+}
+
+inline bool
+Poly_Gen_Relation::implies(flags_t x, flags_t y) {
+  return (x & y) == y;
+}
+
+inline bool
+Poly_Gen_Relation::implies(const Poly_Gen_Relation& y) const {
+  return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return x.flags == y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return x.flags != y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return Poly_Gen_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return Poly_Gen_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Poly_Gen_Relation.defs.hh line 142
+
+// Automatically generated from PPL source file ../src/BHRZ03_Certificate.defs.hh line 1
+/* BHRZ03_Certificate class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/BHRZ03_Certificate.defs.hh line 29
+#include <cassert>
+#include <vector>
+
+//! The convergence certificate for the BHRZ03 widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+
+  \note
+  Each convergence certificate has to be used together with a
+  compatible widening operator. In particular, BHRZ03_Certificate
+  can certify the convergence of both the BHRZ03 and the H79 widenings.
+*/
+class Parma_Polyhedra_Library::BHRZ03_Certificate {
+public:
+  //! Default constructor.
+  BHRZ03_Certificate();
+
+  //! Constructor: computes the certificate for \p ph.
+  BHRZ03_Certificate(const Polyhedron& ph);
+
+  //! Copy constructor.
+  BHRZ03_Certificate(const BHRZ03_Certificate& y);
+
+  //! Destructor.
+  ~BHRZ03_Certificate();
+
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+
+    Compares \p *this with \p y, using a total ordering which is a
+    refinement of the limited growth ordering relation for the
+    BHRZ03 widening.
+  */
+  int compare(const BHRZ03_Certificate& y) const;
+
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  int compare(const Polyhedron& ph) const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the certificate for
+    polyhedron \p ph is strictly smaller than \p *this.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool is_stabilizing(const Polyhedron& ph) const;
+
+  //! A total ordering on BHRZ03 certificates.
+  /*! \ingroup PPL_CXX_interface
+    This binary predicate defines a total ordering on BHRZ03 certificates
+    which is used when storing information about sets of polyhedra.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const BHRZ03_Certificate& x,
+		    const BHRZ03_Certificate& y) const;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Check if gathered information is meaningful.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool OK() const;
+
+private:
+  //! Affine dimension of the polyhedron.
+  dimension_type affine_dim;
+  //! Dimension of the lineality space of the polyhedron.
+  dimension_type lin_space_dim;
+  //! Cardinality of a non-redundant constraint system for the polyhedron.
+  dimension_type num_constraints;
+  /*! \brief
+    Number of non-redundant points in a generator system
+    for the polyhedron.
+  */
+  dimension_type num_points;
+  /*! \brief
+    A vector containing, for each index `0 <= i < space_dim',
+    the number of non-redundant rays in a generator system of the
+    polyhedron having exactly `i' null coordinates.
+  */
+  std::vector<dimension_type> num_rays_null_coord;
+};
+
+// Automatically generated from PPL source file ../src/BHRZ03_Certificate.inlines.hh line 1
+/* BHRZ03_Certificate class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+BHRZ03_Certificate::BHRZ03_Certificate()
+  : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(1),
+    num_rays_null_coord() {
+  // This is the certificate for a zero-dim universe polyhedron.
+  assert(OK());
+}
+
+inline
+BHRZ03_Certificate::BHRZ03_Certificate(const BHRZ03_Certificate& y)
+  : affine_dim(y.affine_dim), lin_space_dim(y.lin_space_dim),
+    num_constraints(y.num_constraints), num_points(y.num_points),
+    num_rays_null_coord(y.num_rays_null_coord) {
+}
+
+inline
+BHRZ03_Certificate::~BHRZ03_Certificate() {
+}
+
+inline bool
+BHRZ03_Certificate::is_stabilizing(const Polyhedron& ph) const {
+  return compare(ph) == 1;
+}
+
+inline bool
+BHRZ03_Certificate::Compare::operator()(const BHRZ03_Certificate& x,
+					const BHRZ03_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this lgo relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/BHRZ03_Certificate.defs.hh line 116
+
+// Automatically generated from PPL source file ../src/H79_Certificate.defs.hh line 1
+/* H79_Certificate class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/H79_Certificate.defs.hh line 29
+#include <cassert>
+#include <vector>
+
+//! A convergence certificate for the H79 widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+  \note
+  The convergence of the H79 widening can also be certified by
+  BHRZ03_Certificate.
+*/
+class Parma_Polyhedra_Library::H79_Certificate {
+public:
+  //! Default constructor.
+  H79_Certificate();
+
+  //! Constructor: computes the certificate for \p ph.
+  template <typename PH>
+  H79_Certificate(const PH& ph);
+
+  //! Constructor: computes the certificate for \p ph.
+  H79_Certificate(const Polyhedron& ph);
+
+  //! Copy constructor.
+  H79_Certificate(const H79_Certificate& y);
+
+  //! Destructor.
+  ~H79_Certificate();
+
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+
+    Compares \p *this with \p y, using a total ordering which is a
+    refinement of the limited growth ordering relation for the
+    H79 widening.
+  */
+  int compare(const H79_Certificate& y) const;
+
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  template <typename PH>
+  int compare(const PH& ph) const;
+
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  int compare(const Polyhedron& ph) const;
+
+  //! A total ordering on H79 certificates.
+  /*! \ingroup PPL_CXX_interface
+    This binary predicate defines a total ordering on H79 certificates
+    which is used when storing information about sets of polyhedra.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const H79_Certificate& x,
+		    const H79_Certificate& y) const;
+  };
+
+private:
+  //! Affine dimension of the polyhedron.
+  dimension_type affine_dim;
+  //! Cardinality of a non-redundant constraint system for the polyhedron.
+  dimension_type num_constraints;
+};
+
+// Automatically generated from PPL source file ../src/H79_Certificate.inlines.hh line 1
+/* H79_Certificate class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 1
+/* Polyhedron class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 44
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Polyhedron
+  Writes a textual representation of \p ph on \p s:
+  <CODE>false</CODE> is written if \p ph is an empty polyhedron;
+  <CODE>true</CODE> is written if \p ph is a universe polyhedron;
+  a minimized system of constraints defining \p ph is written otherwise,
+  all constraints in one row separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Polyhedron& ph);
+
+} // namespace IO_Operators
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are the same polyhedron.
+
+  \relates Polyhedron
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are different polyhedra.
+
+  \relates Polyhedron
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The base class for convex polyhedra.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Polyhedron represents a convex polyhedron
+  in the vector space \f$\Rset^n\f$.
+
+  A polyhedron can be specified as either a finite system of constraints
+  or a finite system of generators (see Section \ref representation)
+  and it is always possible to obtain either representation.
+  That is, if we know the system of constraints, we can obtain
+  from this the system of generators that define the same polyhedron
+  and vice versa.
+  These systems can contain redundant members: in this case we say
+  that they are not in the minimal form.
+  Most operators on polyhedra are provided with two implementations:
+  one of these, denoted <CODE>\<operator-name\>_and_minimize</CODE>,
+  also enforces the minimization of the representations,
+  and returns the Boolean value <CODE>false</CODE> whenever
+  the resulting polyhedron turns out to be empty.
+
+  Two key attributes of any polyhedron are its topological kind
+  (recording whether it is a C_Polyhedron or an NNC_Polyhedron object)
+  and its space dimension (the dimension \f$n \in \Nset\f$ of
+  the enclosing vector space):
+
+  - all polyhedra, the empty ones included, are endowed with
+    a specific topology and space dimension;
+  - most operations working on a polyhedron and another object
+    (i.e., another polyhedron, a constraint or generator,
+    a set of variables, etc.) will throw an exception if
+    the polyhedron and the object are not both topology-compatible
+    and dimension-compatible (see Section \ref representation);
+  - the topology of a polyhedron cannot be changed;
+    rather, there are constructors for each of the two derived classes
+    that will build a new polyhedron with the topology of that class
+    from another polyhedron from either class and any topology;
+  - the only ways in which the space dimension of a polyhedron can
+    be changed are:
+    - <EM>explicit</EM> calls to operators provided for that purpose;
+    - standard copy, assignment and swap operators.
+
+  Note that four different polyhedra can be defined on
+  the zero-dimension space:
+  the empty polyhedron, either closed or NNC,
+  and the universe polyhedron \f$R^0\f$, again either closed or NNC.
+
+  \par
+  In all the examples it is assumed that variables
+  <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+  used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
+
+  \par Example 1
+  The following code builds a polyhedron corresponding to
+  a square in \f$\Rset^2\f$, given as a system of constraints:
+  \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  cs.insert(y >= 0);
+  cs.insert(y <= 3);
+  C_Polyhedron ph(cs);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from a system of generators specifying
+  the four vertices of the square:
+  \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 3*y));
+  gs.insert(point(3*x + 0*y));
+  gs.insert(point(3*x + 3*y));
+  C_Polyhedron ph(gs);
+  \endcode
+
+  \par Example 2
+  The following code builds an unbounded polyhedron
+  corresponding to a half-strip in \f$\Rset^2\f$,
+  given as a system of constraints:
+  \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x - y <= 0);
+  cs.insert(x - y + 1 >= 0);
+  C_Polyhedron ph(cs);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from the system of generators specifying
+  the two vertices of the polyhedron and one ray:
+  \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + y));
+  gs.insert(ray(x - y));
+  C_Polyhedron ph(gs);
+  \endcode
+
+  \par Example 3
+  The following code builds the polyhedron corresponding to
+  a half-plane by adding a single constraint
+  to the universe polyhedron in \f$\Rset^2\f$:
+  \code
+  C_Polyhedron ph(2);
+  ph.add_constraint(y >= 0);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from the empty polyhedron in the space \f$\Rset^2\f$
+  and inserting the appropriate generators
+  (a point, a ray and a line).
+  \code
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(0*x + 0*y));
+  ph.add_generator(ray(y));
+  ph.add_generator(line(x));
+  \endcode
+  Note that, although the above polyhedron has no vertices, we must add
+  one point, because otherwise the result of the Minkowski's sum
+  would be an empty polyhedron.
+  To avoid subtle errors related to the minimization process,
+  it is required that the first generator inserted in an empty
+  polyhedron is a point (otherwise, an exception is thrown).
+
+  \par Example 4
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_embed</CODE>:
+  \code
+  C_Polyhedron ph(1);
+  ph.add_constraint(x == 2);
+  ph.add_space_dimensions_and_embed(1);
+  \endcode
+  We build the universe polyhedron in the 1-dimension space \f$\Rset\f$.
+  Then we add a single equality constraint,
+  thus obtaining the polyhedron corresponding to the singleton set
+  \f$\{ 2 \} \sseq \Rset\f$.
+  After the last line of code, the resulting polyhedron is
+  \f[
+    \bigl\{\,
+      (2, y)^\transpose \in \Rset^2
+    \bigm|
+      y \in \Rset
+    \,\bigr\}.
+  \f]
+
+  \par Example 5
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_project</CODE>:
+  \code
+  C_Polyhedron ph(1);
+  ph.add_constraint(x == 2);
+  ph.add_space_dimensions_and_project(1);
+  \endcode
+  The first two lines of code are the same as in Example 4 for
+  <CODE>add_space_dimensions_and_embed</CODE>.
+  After the last line of code, the resulting polyhedron is
+  the singleton set
+  \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+
+  \par Example 6
+  The following code shows the use of the function
+  <CODE>affine_image</CODE>:
+  \code
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(0*x + 0*y));
+  ph.add_generator(point(0*x + 3*y));
+  ph.add_generator(point(3*x + 0*y));
+  ph.add_generator(point(3*x + 3*y));
+  Linear_Expression expr = x + 4;
+  ph.affine_image(x, expr);
+  \endcode
+  In this example the starting polyhedron is a square in
+  \f$\Rset^2\f$, the considered variable is \f$x\f$ and the affine
+  expression is \f$x+4\f$.  The resulting polyhedron is the same
+  square translated to the right.  Moreover, if the affine
+  transformation for the same variable \p x is \f$x+y\f$:
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting polyhedron is a parallelogram with the height equal to
+  the side of the square and the oblique sides parallel to the line
+  \f$x-y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable; for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting polyhedron is a diagonal of the square.
+
+  \par Example 7
+  The following code shows the use of the function
+  <CODE>affine_preimage</CODE>:
+  \code
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(x <= 3);
+  ph.add_constraint(y >= 0);
+  ph.add_constraint(y <= 3);
+  Linear_Expression expr = x + 4;
+  ph.affine_preimage(x, expr);
+  \endcode
+  In this example the starting polyhedron, \p var and the affine
+  expression and the denominator are the same as in Example 6,
+  while the resulting polyhedron is again the same square,
+  but translated to the left.
+  Moreover, if the affine transformation for \p x is \f$x+y\f$
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting polyhedron is a parallelogram with the height equal to
+  the side of the square and the oblique sides parallel to the line
+  \f$x+y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable \p x, for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting polyhedron is a line that corresponds to the \f$y\f$ axis.
+
+  \par Example 8
+  For this example we use also the variables:
+  \code
+  Variable z(2);
+  Variable w(3);
+  \endcode
+  The following code shows the use of the function
+  <CODE>remove_space_dimensions</CODE>:
+  \code
+  Generator_System gs;
+  gs.insert(point(3*x + y +0*z + 2*w));
+  C_Polyhedron ph(gs);
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  ph.remove_space_dimensions(to_be_removed);
+  \endcode
+  The starting polyhedron is the singleton set
+  \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+  the resulting polyhedron is
+  \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+  Be careful when removing space dimensions <EM>incrementally</EM>:
+  since dimensions are automatically renamed after each application
+  of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+  results can be obtained.
+  For instance, by using the following code we would obtain
+  a different result:
+  \code
+  set<Variable> to_be_removed1;
+  to_be_removed1.insert(y);
+  ph.remove_space_dimensions(to_be_removed1);
+  set<Variable> to_be_removed2;
+  to_be_removed2.insert(z);
+  ph.remove_space_dimensions(to_be_removed2);
+  \endcode
+  In this case, the result is the polyhedron
+  \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+  when removing the set of dimensions \p to_be_removed2
+  we are actually removing variable \f$w\f$ of the original polyhedron.
+  For the same reason, the operator \p remove_space_dimensions
+  is not idempotent: removing twice the same non-empty set of dimensions
+  is never the same as removing them just once.
+*/
+
+class Parma_Polyhedra_Library::Polyhedron {
+public:
+  //! Returns the maximum space dimension all kinds of Polyhedron can handle.
+  static dimension_type max_space_dimension();
+
+protected:
+  //! Builds a polyhedron having the specified properties.
+  /*!
+    \param topol
+    The topology of the polyhedron;
+
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the polyhedron;
+
+    \param kind
+    Specifies whether the universe or the empty polyhedron has to be built.
+  */
+  Polyhedron(Topology topol,
+	     dimension_type num_dimensions,
+	     Degenerate_Element kind);
+
+  //! Ordinary copy-constructor.
+  Polyhedron(const Polyhedron& y);
+
+  //! Builds a polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param cs
+    The system of constraints defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p cs is incompatible with \p topol.
+  */
+  Polyhedron(Topology topol, const Constraint_System& cs);
+
+  //! Builds a polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p cs is incompatible with \p topol.
+  */
+  Polyhedron(Topology topol, Constraint_System& cs);
+
+  //! Builds a polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param gs
+    The system of generators defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p gs is incompatible with \p topol,
+    or if the system of generators is not empty but has no points.
+  */
+  Polyhedron(Topology topol, const Generator_System& gs);
+
+  //! Builds a polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p gs is incompatible with \p topol,
+    or if the system of generators is not empty but has no points.
+  */
+  Polyhedron(Topology topol, Generator_System& gs);
+
+  //! Builds a polyhedron out of a generic, interval-based bounding box.
+  /*!
+    \param topol
+    The topology of the polyhedron;
+
+    \param box
+    The bounding box representing the polyhedron to be built.
+
+    \exception std::invalid_argument
+    Thrown if \p box has intervals that are incompatible with \p topol.
+
+    The template class Box must provide the following methods.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the dimension of the vector space enclosing the polyhedron
+    represented by the bounding box.
+    \code
+      bool is_empty() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the bounding box
+    describes the empty set.
+    The <CODE>is_empty()</CODE> method will always be called before the
+    methods below.  However, if <CODE>is_empty()</CODE> returns
+    <CODE>true</CODE>, none of the functions below will be called.
+    \code
+      bool get_lower_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+    \code
+      bool get_upper_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
+  */
+  template <typename Box>
+  Polyhedron(Topology topol, const Box& box);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  Polyhedron& operator=(const Polyhedron& y);
+
+public:
+  //! \name Member Functions that Do Not Modify the Polyhedron
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns the system of constraints.
+  const Constraint_System& constraints() const;
+
+  //! Returns the system of constraints, with no redundant constraint.
+  const Constraint_System& minimized_constraints() const;
+
+  //! Returns the system of generators.
+  const Generator_System& generators() const;
+
+  //! Returns the system of generators, with no redundant generator.
+  const Generator_System& minimized_generators() const;
+
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is
+    an empty polyhedron.
+  */
+  bool is_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a universe polyhedron.
+  */
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const Polyhedron& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a bounded polyhedron.
+  */
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param point
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p point are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		Generator& point) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param point
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		Generator& point) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool contains(const Polyhedron& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool strictly_contains(const Polyhedron& y) const;
+
+  /*! \brief
+    Uses \p *this to shrink a generic, interval-based bounding box.
+    Assigns to \p box the intersection of \p box with the smallest
+    bounding box containing \p *this.
+
+    \param box
+    The bounding box to be shrunk;
+
+    \param complexity
+    The complexity class of the algorithm to be used.
+
+    If the polyhedron \p *this or \p box is empty, then the empty box
+    is returned.
+
+    If \p *this and \p box are non-empty, then, for
+    each space dimension \f$k\f$ with variable \f$\mathrm{var}\f$, let
+    \f$u\f$ be the upper and \f$l\f$ the lower bound of the smallest
+    interval containing \p *this.
+
+    If \f$l\f$ is infinite, then \p box is unaltered; if \f$l\f$ is
+    finite, then the \p box interval for space dimension \f$k\f$ is
+    (destructively) intersected with \f$[l, +\mathrm{infty})\f$ if a
+    point of \p *this satisfies \f$\mathrm{var} == l\f$ and with
+    \f$(l, +\mathrm{infty})\f$ otherwise.
+
+    Similarly, if \f$u\f$ is infinite, then \p box is unaltered; if
+    \f$u\f$ is finite, then the \p box interval for space dimension
+    \f$k\f$ is (destructively) intersected with \f$(-\mathrm{infty},
+    u]\f$ if a point of \p *this satisfies \f$\mathrm{var} == u\f$ and
+    with \f$(-\mathrm{infty}, u)\f$ otherwise.
+
+    The template class Box must provide the following methods, whose
+    return values, if any, are simply ignored.
+    \code
+      set_empty()
+    \endcode
+    causes the box to become empty, i.e., to represent the empty set.
+    \code
+      raise_lower_bound(dimension_type k, bool closed,
+                        Coefficient_traits::const_reference n,
+                        Coefficient_traits::const_reference d)
+    \endcode
+    intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension
+    with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+    with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>false</CODE>.
+    \code
+      lower_upper_bound(dimension_type k, bool closed,
+                        Coefficient_traits::const_reference n,
+                        Coefficient_traits::const_reference d)
+    \endcode
+    intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension
+    with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+    with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE>
+    is <CODE>false</CODE>.
+
+    The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
+    will be called at most once for each possible value for <CODE>k</CODE>
+    and for all such calls the fraction \f$n/d\f$ will be in canonical form,
+    that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
+    is positive, \f$0/1\f$ being the unique representation for zero.
+    The same guarantee is offered for the function
+    <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
+  */
+  template <typename Box>
+  void shrink_bounding_box(Box& box,
+			   Complexity_Class complexity = ANY_COMPLEXITY) const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if \p *this satisfies all the
+    invariants and either \p check_not_empty is <CODE>false</CODE> or
+    \p *this is not empty.
+
+    \param check_not_empty
+    <CODE>true</CODE> if and only if, in addition to checking the
+    invariants, \p *this must be checked to be not empty.
+
+    The check is performed so as to intrude as little as possible.  If
+    the library has been compiled with run-time assertions enabled,
+    error messages are written on <CODE>std::cerr</CODE> in case
+    invariants are violated. This is useful for the purpose of
+    debugging the library.
+  */
+  bool OK(bool check_not_empty = false) const;
+
+  //@} // Member Functions that Do Not Modify the Polyhedron
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Polyhedron
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    of \p *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    of \p *this, minimizing the result
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  bool add_constraint_and_minimize(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators
+    of \p *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are topology-incompatible or
+    dimension-incompatible, or if \p *this is an empty polyhedron and
+    \p g is not a point.
+  */
+  void add_generator(const Generator& g);
+
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators
+    of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are topology-incompatible or
+    dimension-incompatible, or if \p *this is an empty polyhedron and
+    \p g is not a point.
+  */
+  bool add_generator_and_minimize(const Generator& g);
+
+  /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences of \p
+    *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the system
+    of constraints of \p *this (without minimizing the result).
+
+    \param cs
+    Contains the constraints that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this (without minimizing the result).
+
+    \param cs
+    The constraint system that will be recycled, adding its
+    constraints to the system of constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the system
+    of constraints of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    Contains the constraints that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool add_constraints_and_minimize(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    The constraint system that will be recycled, adding its
+    constraints to the system of constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  bool add_recycled_constraints_and_minimize(Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system
+    of generators of \p *this (without minimizing the result).
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the system of
+    generators \p gs is not empty, but has no points.
+  */
+  void add_generators(const Generator_System& gs);
+
+  /*! \brief
+    Adds the generators in \p gs to the system of generators
+    of \p *this (without minimizing the result).
+
+    \param gs
+    The generator system that will be recycled, adding its generators
+    to the system of generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the system of
+    generators \p gs is not empty, but has no points.
+
+    \warning
+    The only assumption that can be made on \p gs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_generators(Generator_System& gs);
+
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system
+    of generators of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the the system
+    of generators \p gs is not empty, but has no points.
+  */
+  bool add_generators_and_minimize(const Generator_System& gs);
+
+  /*! \brief
+    Adds the generators in \p gs to the system of generators
+    of \p *this, minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param gs
+    The generator system that will be recycled, adding its generators
+    to the system of generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the the system
+    of generators \p gs is not empty, but has no points.
+
+    \warning
+    The only assumption that can be made on \p gs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  bool add_recycled_generators_and_minimize(Generator_System& gs);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p
+    cgs (without minimizing the result).
+
+    \param cgs
+    Contains the congruences that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y.
+    The result is not guaranteed to be minimized.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void intersection_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y,
+    minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool intersection_assign_and_minimize(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the poly-hull of \p *this and \p y.
+    The result is not guaranteed to be minimized.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void poly_hull_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the poly-hull of \p *this and \p y,
+    minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool poly_hull_assign_and_minimize(const Polyhedron& y);
+
+  //! Same as poly_hull_assign(y).
+  void upper_bound_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this
+    the \ref Convex_Polyhedral_Difference "poly-difference"
+    of \p *this and \p y. The result is not guaranteed to be minimized.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void poly_difference_assign(const Polyhedron& y);
+
+  //! Same as poly_difference_assign(y).
+  void difference_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1.)
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering the generators of a polyhedron, the
+    affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If constraints are up-to-date, it uses the specialized function
+    affine_preimage() (for the system of constraints)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+	   = a_\mathrm{var} x_\mathrm{var}
+	     + \sum_{i \neq var} a_i x_i + b,
+       \f]
+       so that the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+             - \sum_{i \neq j} a_i x_i - b.
+       \f]
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only generators remain
+    up-to-date.
+
+    In other words, if \f$R\f$ is a \f$m_1 \times n\f$ matrix representing
+    the rays of the polyhedron, \f$V\f$ is a \f$m_2 \times n\f$
+    matrix representing the points of the polyhedron and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            \vect{x} = \vect{\lambda} R + \vect{\mu} V,
+	    \vect{\lambda} \in \Rset^{m_1}_+,
+	    \vect{\mu} \in \Rset^{m_2}_+,
+	    \sum_{i = 0}^{m_2 - 1} \mu_i = 1
+          \,\bigr\}
+    \f]
+    and \f$T\f$ is the affine transformation to apply to \f$P\f$, then
+    the resulting polyhedron is
+    \f[
+      P' = \bigl\{\,
+             (x_0, \ldots, T(x_0, \ldots, x_{n-1}),
+                     \ldots, x_{n-1})^\mathrm{T}
+           \bigm|
+             (x_0, \ldots, x_{n-1})^\mathrm{T} \in P
+           \,\bigr\}.
+    \f]
+
+    Affine transformations are, for example:
+    - translations
+    - rotations
+    - symmetries.
+    \endif
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1.)
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering constraints of a polyhedron, the affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If generators are up-to-date, then the specialized function
+    affine_image() is used (for the system of generators)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation, we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+       \f],
+       the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+               - \sum_{i \neq j} a_i x_i - b.
+       \f].
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only constraints remain
+    up-to-date.
+
+    In other words, if \f$A\f$ is a \f$m \times n\f$ matrix representing
+    the constraints of the polyhedron, \f$T\f$ is the affine transformation
+    to apply to \f$P\f$ and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            A\vect{x} \geq \vect{0}
+          \,\bigr\}.
+    \f]
+    The resulting polyhedron is
+    \f[
+      P' = \bigl\{\,
+             \vect{x} = (x_0, \ldots, x_{n-1}))^\mathrm{T}
+           \bigm|
+             A'\vect{x} \geq \vect{0}
+           \,\bigr\},
+    \f]
+    where \f$A'\f$ is defined as follows:
+    \f[
+      {a'}_{ij}
+        = \begin{cases}
+            a_{ij} * \mathrm{denominator} + a_{i\mathrm{var}}*\mathrm{expr}[j]
+              \quad \mathrm{for } j \neq \mathrm{var}; \\
+            \mathrm{expr}[\mathrm{var}] * a_{i\mathrm{var}},
+              \quad \text{for } j = \mathrm{var}.
+          \end{cases}
+    \f]
+    \endif
+  */
+  void affine_preimage(Variable var,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator
+		         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1.)
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+				const Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				  = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1.)
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+			      const Relation_Symbol relsym,
+			      const Linear_Expression& expr,
+			      Coefficient_traits::const_reference denominator
+			      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+				const Relation_Symbol relsym,
+				const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+				   const Relation_Symbol relsym,
+				   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1.)
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+			    const Linear_Expression& lb_expr,
+			    const Linear_Expression& ub_expr,
+			    Coefficient_traits::const_reference denominator
+			    = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1.)
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+			       const Linear_Expression& lb_expr,
+			       const Linear_Expression& ub_expr,
+			       Coefficient_traits::const_reference denominator
+			       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void time_elapse_assign(const Polyhedron& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHRZ03_widening "BHRZ03-widening" between \p *this and \p y.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref BHRZ03_widening "BHRZ03-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void limited_BHRZ03_extrapolation_assign(const Polyhedron& y,
+					   const Constraint_System& cs,
+					   unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref BHRZ03_widening "BHRZ03-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this, plus all the constraints
+    of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
+    \f$r \in \Qset\f$, that are satisfied by all the points of \p *this.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
+					   const Constraint_System& cs,
+					   unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref H79_widening "H79-widening" between \p *this and \p y.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void H79_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void limited_H79_extrapolation_assign(const Polyhedron& y,
+					const Constraint_System& cs,
+					unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this, plus all the constraints
+    of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
+    \f$r \in \Qset\f$, that are satisfied by all the points of \p *this.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void bounded_H79_extrapolation_assign(const Polyhedron& y,
+					const Constraint_System& cs,
+					unsigned* tp = 0);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old polyhedron
+    in the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new polyhedron, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are not constrained.
+    For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the polyhedron
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new space dimensions to the polyhedron
+    and does not embed it in the new vector space.
+
+    \param m
+    The number of space dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new polyhedron, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are all constrained to be equal to 0.
+    For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the polyhedron
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Polyhedron& y);
+
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher dimensions of the vector space so that
+    the resulting space will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each space dimension.
+
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain
+    of the partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing the polyhedron.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.
+    Also thrown if \p var is contained in \p to_be_folded.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  friend bool Parma_Polyhedra_Library::operator==(const Polyhedron& x,
+						  const Polyhedron& y);
+
+  //! \name Miscellaneous Member Functions
+  //@{
+
+  //! Destructor.
+  ~Polyhedron();
+
+  /*! \brief
+    Swaps \p *this with polyhedron \p y.
+    (\p *this and \p y can be dimension-incompatible.)
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible.
+  */
+  void swap(Polyhedron& y);
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //@} // Miscellaneous Member Functions
+
+private:
+  //! The system of constraints.
+  Constraint_System con_sys;
+
+  //! The system of generators.
+  Generator_System gen_sys;
+
+  //! The saturation matrix having constraints on its columns.
+  Saturation_Matrix sat_c;
+
+  //! The saturation matrix having generators on its columns.
+  Saturation_Matrix sat_g;
+
+#define PPL_IN_Polyhedron_CLASS
+// Automatically generated from PPL source file ../src/Ph_Status.idefs.hh line 1
+/* Polyhedron::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_Polyhedron_CLASS
+#error "Do not include Ph_Status.idefs.hh directly; use Polyhedron.defs.hh instead."
+#endif
+
+//! A conjunctive assertion about a polyhedron.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimension
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the polyhedron is the empty set;
+  - <EM>constraints pending</EM>: the polyhedron is correctly
+    characterized by the attached system of constraints, which is
+    split in two non-empty subsets: the already processed constraints,
+    which are in minimal form, and the pending constraints, which
+    still have to be processed and may thus be inconsistent or
+    contain redundancies;
+  - <EM>generators pending</EM>: the polyhedron is correctly
+    characterized by the attached system of generators, which is
+    split in two non-empty subsets: the already processed generators,
+    which are in minimal form, and the pending generators, which still
+    have to be processed and may thus contain redundancies;
+  - <EM>constraints up-to-date</EM>: the polyhedron is correctly
+    characterized by the attached system of constraints, modulo the
+    processing of pending generators;
+  - <EM>generators up-to-date</EM>: the polyhedron is correctly
+    characterized by the attached system of generators, modulo the
+    processing of pending constraints;
+  - <EM>constraints minimized</EM>: the non-pending part of the system
+    of constraints attached to the polyhedron is in minimal form;
+  - <EM>generators minimized</EM>: the non-pending part of the system
+    of generators attached to the polyhedron is in minimal form;
+  - <EM>constraints' saturation matrix up-to-date</EM>: the attached
+    saturation matrix having rows indexed by non-pending generators and
+    columns indexed by non-pending constraints correctly expresses
+    the saturation relation between the attached non-pending constraints
+    and generators;
+  - <EM>generators' saturation matrix up-to-date</EM>: the attached
+    saturation matrix having rows indexed by non-pending constraints and
+    columns indexed by non-pending generators correctly expresses
+    the saturation relation between the attached non-pending constraints
+    and generators;
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>constraints pending</EM> and <EM>generators pending</EM>
+    are mutually exclusive;
+  - <EM>constraints pending</EM> implies both <EM>constraints minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>generators pending</EM> implies both <EM>constraints minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>constraints minimized</EM> implies <EM>constraints up-to-date</EM>;
+  - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+  - <EM>constraints' saturation matrix up-to-date</EM> implies both
+    <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>;
+  - <EM>generators' saturation matrix up-to-date</EM> implies both
+    <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_c_up_to_date() const;
+  void reset_c_up_to_date();
+  void set_c_up_to_date();
+
+  bool test_g_up_to_date() const;
+  void reset_g_up_to_date();
+  void set_g_up_to_date();
+
+  bool test_c_minimized() const;
+  void reset_c_minimized();
+  void set_c_minimized();
+
+  bool test_g_minimized() const;
+  void reset_g_minimized();
+  void set_g_minimized();
+
+  bool test_sat_c_up_to_date() const;
+  void reset_sat_c_up_to_date();
+  void set_sat_c_up_to_date();
+
+  bool test_sat_g_up_to_date() const;
+  void reset_sat_g_up_to_date();
+  void set_sat_g_up_to_date();
+
+  bool test_c_pending() const;
+  void reset_c_pending();
+  void set_c_pending();
+
+  bool test_g_pending() const;
+  void reset_g_pending();
+  void set_g_pending();
+  //@} // Test, remove or add an individual assertion from the conjunction
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
+    <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t ZERO_DIM_UNIV    = 0U;
+  static const flags_t EMPTY            = 1U << 0;
+  static const flags_t C_UP_TO_DATE     = 1U << 1;
+  static const flags_t G_UP_TO_DATE     = 1U << 2;
+  static const flags_t C_MINIMIZED      = 1U << 3;
+  static const flags_t G_MINIMIZED      = 1U << 4;
+  static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+  static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+  static const flags_t CS_PENDING       = 1U << 7;
+  static const flags_t GS_PENDING       = 1U << 8;
+  //@} // Bit-masks for the individual assertions
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+// Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 1856
+#undef PPL_IN_Polyhedron_CLASS
+
+  //! The status flags to keep track of the polyhedron's internal state.
+  Status status;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  //! Returns the topological kind of the polyhedron.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the polyhedron
+    is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+
+  //! \name Private Verifiers: Verify if Individual Flags are Set
+  //@{
+
+  //! Returns <CODE>true</CODE> if the polyhedron is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  //! Returns <CODE>true</CODE> if the system of constraints is up-to-date.
+  bool constraints_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+  bool generators_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of constraints is minimized.
+  /*!
+    Note that only \em weak minimization is entailed, so that
+    an NNC polyhedron may still have \f$\epsilon\f$-redundant constraints.
+  */
+  bool constraints_are_minimized() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is minimized.
+  /*!
+    Note that only \em weak minimization is entailed, so that
+    an NNC polyhedron may still have \f$\epsilon\f$-redundant generators.
+  */
+  bool generators_are_minimized() const;
+
+  //! Returns <CODE>true</CODE> if there are pending constraints.
+  bool has_pending_constraints() const;
+
+  //! Returns <CODE>true</CODE> if there are pending generators.
+  bool has_pending_generators() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if there are
+    either pending constraints or pending generators.
+  */
+  bool has_something_pending() const;
+
+  //! Returns <CODE>true</CODE> if the polyhedron can have something pending.
+  bool can_have_something_pending() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the saturation matrix \p sat_c
+    is up-to-date.
+  */
+  bool sat_c_is_up_to_date() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the saturation matrix \p sat_g
+    is up-to-date.
+  */
+  bool sat_g_is_up_to_date() const;
+
+  //@} // Private Verifiers: Verify if Individual Flags are Set
+
+  //! \name State Flag Setters: Set Only the Specified Flags
+  //@{
+
+  /*! \brief
+    Sets \p status to express that the polyhedron is the universe
+    0-dimension vector space, clearing all corresponding matrices.
+  */
+  void set_zero_dim_univ();
+
+  /*! \brief
+    Sets \p status to express that the polyhedron is empty,
+    clearing all corresponding matrices.
+  */
+  void set_empty();
+
+  //! Sets \p status to express that constraints are up-to-date.
+  void set_constraints_up_to_date();
+
+  //! Sets \p status to express that generators are up-to-date.
+  void set_generators_up_to_date();
+
+  //! Sets \p status to express that constraints are minimized.
+  void set_constraints_minimized();
+
+  //! Sets \p status to express that generators are minimized.
+  void set_generators_minimized();
+
+  //! Sets \p status to express that constraints are pending.
+  void set_constraints_pending();
+
+  //! Sets \p status to express that generators are pending.
+  void set_generators_pending();
+
+  //! Sets \p status to express that \p sat_c is up-to-date.
+  void set_sat_c_up_to_date();
+
+  //! Sets \p status to express that \p sat_g is up-to-date.
+  void set_sat_g_up_to_date();
+
+  //@} // State Flag Setters: Set Only the Specified Flags
+
+  //! \name State Flag Cleaners: Clear Only the Specified Flag
+  //@{
+
+  //! Clears the \p status flag indicating that the polyhedron is empty.
+  void clear_empty();
+
+  //! Sets \p status to express that constraints are no longer up-to-date.
+  /*!
+    This also implies that they are neither minimized
+    and both saturation matrices are no longer meaningful.
+  */
+  void clear_constraints_up_to_date();
+
+  //! Sets \p status to express that generators are no longer up-to-date.
+  /*!
+    This also implies that they are neither minimized
+    and both saturation matrices are no longer meaningful.
+  */
+  void clear_generators_up_to_date();
+
+  //! Sets \p status to express that constraints are no longer minimized.
+  void clear_constraints_minimized();
+
+  //! Sets \p status to express that generators are no longer minimized.
+  void clear_generators_minimized();
+
+  //! Sets \p status to express that there are no longer pending constraints.
+  void clear_pending_constraints();
+
+  //! Sets \p status to express that there are no longer pending generators.
+  void clear_pending_generators();
+
+  //! Sets \p status to express that \p sat_c is no longer up-to-date.
+  void clear_sat_c_up_to_date();
+
+  //! Sets \p status to express that \p sat_g is no longer up-to-date.
+  void clear_sat_g_up_to_date();
+
+  //@} // State Flag Cleaners: Clear Only the Specified Flag
+
+  //! \name The Handling of Pending Rows
+  //@{
+
+  /*! \brief
+    Processes the pending rows of either description of the polyhedron
+    and obtains a minimized polyhedron.
+
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  bool process_pending() const;
+
+  //! Processes the pending constraints and obtains a minimized polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    It is assumed that the polyhedron does have some pending constraints.
+  */
+  bool process_pending_constraints() const;
+
+  //! Processes the pending generators and obtains a minimized polyhedron.
+  /*!
+    It is assumed that the polyhedron does have some pending generators.
+  */
+  void process_pending_generators() const;
+
+  /*! \brief
+    Lazily integrates the pending descriptions of the polyhedron
+    to obtain a constraint system without pending rows.
+
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  void remove_pending_to_obtain_constraints() const;
+
+  /*! \brief
+    Lazily integrates the pending descriptions of the polyhedron
+    to obtain a generator system without pending rows.
+
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  bool remove_pending_to_obtain_generators() const;
+
+  //@} // The Handling of Pending Rows
+
+  //! \name Updating and Sorting Matrices
+  //@{
+
+  //! Updates constraints starting from generators and minimizes them.
+  /*!
+    The resulting system of constraints is only partially sorted:
+    the equalities are in the upper part of the matrix,
+    while the inequalities in the lower part.
+  */
+  void update_constraints() const;
+
+  //! Updates generators starting from constraints and minimizes them.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    The resulting system of generators is only partially sorted:
+    the lines are in the upper part of the matrix,
+    while rays and points are in the lower part.
+    It is illegal to call this method when the Status field
+    already declares the polyhedron to be empty.
+  */
+  bool update_generators() const;
+
+  //! Updates \p sat_c using the updated constraints and generators.
+  /*!
+    It is assumed that constraints and generators are up-to-date
+    and minimized and that the Status field does not already flag
+    \p sat_c to be up-to-date.
+    The values of the saturation matrix are computed as follows:
+    \f[
+      \begin{cases}
+        sat\_c[i][j] = 0,
+          \quad \text{if } G[i] \cdot C^\mathrm{T}[j] = 0; \\
+        sat\_c[i][j] = 1,
+          \quad \text{if } G[i] \cdot C^\mathrm{T}[j] > 0.
+      \end{cases}
+    \f]
+  */
+  void update_sat_c() const;
+
+  //! Updates \p sat_g using the updated constraints and generators.
+  /*!
+    It is assumed that constraints and generators are up-to-date
+    and minimized and that the Status field does not already flag
+    \p sat_g to be up-to-date.
+    The values of the saturation matrix are computed as follows:
+    \f[
+      \begin{cases}
+        sat\_g[i][j] = 0,
+          \quad \text{if } C[i] \cdot G^\mathrm{T}[j] = 0; \\
+        sat\_g[i][j] = 1,
+          \quad \text{if } C[i] \cdot G^\mathrm{T}[j] > 0.
+      \end{cases}
+    \f]
+  */
+  void update_sat_g() const;
+
+  //! Sorts the matrix of constraints keeping status consistency.
+  /*!
+    It is assumed that constraints are up-to-date.
+    If at least one of the saturation matrices is up-to-date,
+    then \p sat_g is kept consistent with the sorted matrix
+    of constraints.
+    The method is declared \p const because reordering
+    the constraints does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_constraints() const;
+
+  //! Sorts the matrix of generators keeping status consistency.
+  /*!
+    It is assumed that generators are up-to-date.
+    If at least one of the saturation matrices is up-to-date,
+    then \p sat_c is kept consistent with the sorted matrix
+    of generators.
+    The method is declared \p const because reordering
+    the generators does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_generators() const;
+
+  //! Sorts the matrix of constraints and updates \p sat_c.
+  /*!
+    It is assumed that both constraints and generators
+    are up-to-date and minimized.
+    The method is declared \p const because reordering
+    the constraints does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_constraints_with_sat_c() const;
+
+  //! Sorts the matrix of generators and updates \p sat_g.
+  /*!
+    It is assumed that both constraints and generators
+    are up-to-date and minimized.
+    The method is declared \p const because reordering
+    the generators does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_generators_with_sat_g() const;
+
+  //@} // Updating and Sorting Matrices
+
+  //! \name Weak and Strong Minimization of Descriptions
+  //@{
+
+  //! Applies (weak) minimization to both the constraints and generators.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    Minimization is not attempted if the Status field already declares
+    both systems to be minimized.
+  */
+  bool minimize() const;
+
+  //! Applies strong minimization to the constraints of an NNC polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+  */
+  bool strongly_minimize_constraints() const;
+
+  //! Applies strong minimization to the generators of an NNC polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+  */
+  bool strongly_minimize_generators() const;
+
+  //@} // Weak and Strong Minimization of Descriptions
+
+  enum Three_Valued_Boolean {
+    TVB_TRUE,
+    TVB_FALSE,
+    TVB_DONT_KNOW
+  };
+
+  //! Polynomial but incomplete equivalence test between polyhedra.
+  Three_Valued_Boolean quick_equivalence_test(const Polyhedron& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+  bool is_included_in(const Polyhedron& y) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \param point
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+	       const bool maximize,
+	       Coefficient& ext_n, Coefficient& ext_d, bool& included,
+	       Generator& point) const;
+
+  //! \name Widening- and Extrapolation-Related Functions
+  //@{
+
+  /*! \brief
+    Copies to \p cs_selection the constraints of \p y corresponding
+    to the definition of the CH78-widening of \p *this and \p y.
+  */
+  void select_CH78_constraints(const Polyhedron& y,
+			       Constraint_System& cs_selected) const;
+
+  /*! \brief
+    Splits the constraints of `x' into two subsets, depending on whether
+    or not they are selected to compute the \ref H79_widening "H79-widening"
+    of \p *this and \p y.
+  */
+  void select_H79_constraints(const Polyhedron& y,
+			      Constraint_System& cs_selected,
+			      Constraint_System& cs_not_selected) const;
+
+  bool BHRZ03_combining_constraints(const Polyhedron& y,
+				    const BHRZ03_Certificate& y_cert,
+ 				    const Polyhedron& H79,
+				    const Constraint_System& x_minus_H79_con_sys);
+
+  bool BHRZ03_evolving_points(const Polyhedron& y,
+			      const BHRZ03_Certificate& y_cert,
+			      const Polyhedron& H79);
+
+  bool BHRZ03_evolving_rays(const Polyhedron& y,
+			    const BHRZ03_Certificate& y_cert,
+			    const Polyhedron& H79);
+
+  //@} // Widening- and Extrapolation-Related Functions
+
+  //! Adds new space dimensions to the given matrices.
+  /*!
+    \param mat1
+    The matrix to which columns are added;
+
+    \param mat2
+    The matrix to which rows and columns are added;
+
+    \param sat1
+    The saturation matrix whose columns are indexed by the rows of
+    matrix \p mat1. On entry it is up-to-date;
+
+    \param sat2
+    The saturation matrix whose columns are indexed by the rows of \p
+    mat2;
+
+    \param add_dim
+    The number of space dimensions to add.
+
+    Adds new space dimensions to the vector space modifying the matrices.
+    This function is invoked only by
+    <CODE>add_space_dimensions_and_embed()</CODE> and
+    <CODE>add_space_dimensions_and_project()</CODE>, passing the matrix of
+    constraints and that of generators (and the corresponding saturation
+    matrices) in different order (see those methods for details).
+  */
+  static void add_space_dimensions(Linear_System& mat1,
+				   Linear_System& mat2,
+				   Saturation_Matrix& sat1,
+				   Saturation_Matrix& sat2,
+				   dimension_type add_dim);
+
+  //! \name Minimization-Related Static Member Functions
+  //@{
+
+  //! Builds and simplifies constraints from generators (or vice versa).
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  static bool minimize(bool con_to_gen,
+		       Linear_System& source,
+		       Linear_System& dest,
+		       Saturation_Matrix& sat);
+
+  /*! \brief
+    Adds given constraints and builds minimized corresponding generators
+    or vice versa.
+  */
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  static bool add_and_minimize(bool con_to_gen,
+			       Linear_System& source1,
+			       Linear_System& dest,
+			       Saturation_Matrix& sat,
+			       const Linear_System& source2);
+
+  /*! \brief
+    Adds given constraints and builds minimized corresponding generators
+    or vice versa. The given constraints are in \p source.
+  */
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  static bool add_and_minimize(bool con_to_gen,
+			       Linear_System& source,
+			       Linear_System& dest,
+			       Saturation_Matrix& sat);
+
+  //! Performs the conversion from constraints to generators and vice versa.
+  // Detailed Doxygen comment to be found in file conversion.cc.
+  static dimension_type conversion(Linear_System& source,
+				   dimension_type start,
+				   Linear_System& dest,
+				   Saturation_Matrix& sat,
+				   dimension_type num_lines_or_equalities);
+
+  /*! \brief
+    Uses Gauss' elimination method to simplify the result of
+    <CODE>conversion()</CODE>.
+  */
+  // Detailed Doxygen comment to be found in file simplify.cc.
+  static int simplify(Linear_System& mat, Saturation_Matrix& sat);
+
+  //@} // Minimization-Related Static Member Functions
+
+  template <typename T> friend class Parma_Polyhedra_Library::BD_Shape;
+  friend class Parma_Polyhedra_Library::BHRZ03_Certificate;
+  friend class Parma_Polyhedra_Library::H79_Certificate;
+
+
+  //! \name Exception Throwers
+  //@{
+protected:
+  void throw_runtime_error(const char* method) const;
+  void throw_invalid_argument(const char* method, const char* reason) const;
+
+  void throw_topology_incompatible(const char* method,
+				   const char* ph_name,
+				   const Polyhedron& ph) const;
+  void throw_topology_incompatible(const char* method,
+				   const char* c_name,
+				   const Constraint& c) const;
+  void throw_topology_incompatible(const char* method,
+				   const char* g_name,
+				   const Generator& g) const;
+  void throw_topology_incompatible(const char* method,
+				   const char* cs_name,
+				   const Constraint_System& cs) const;
+  void throw_topology_incompatible(const char* method,
+				   const char* gs_name,
+				   const Generator_System& gs) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const char* other_name,
+				    dimension_type other_dim) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* ph_name,
+				    const Polyhedron& ph) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* e_name,
+				    const Linear_Expression& e) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* c_name,
+				    const Constraint& c) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* g_name,
+				    const Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cg_name,
+				    const Congruence& cg) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cs_name,
+				    const Constraint_System& cs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* gs_name,
+				    const Generator_System& gs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cgs_name,
+				    const Congruence_System& cgs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* var_name,
+				    const Variable var) const;
+  void throw_dimension_incompatible(const char* method,
+				    dimension_type required_space_dim) const;
+
+  // Note: it has to be a static method, because it can be called inside
+  // constructors (before actually constructing the polyhedron object).
+  static void throw_space_dimension_overflow(Topology topol,
+					     const char* method,
+					     const char* reason);
+
+  void throw_invalid_generator(const char* method,
+			       const char* g_name) const;
+  void throw_invalid_generators(const char* method,
+				const char* gs_name) const;
+  //@} // Exception Throwers
+
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+void swap(Parma_Polyhedra_Library::Polyhedron& x,
+	  Parma_Polyhedra_Library::Polyhedron& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Ph_Status.inlines.hh line 1
+/* Polyhedron::Status class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Polyhedron::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+inline
+Polyhedron::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+inline bool
+Polyhedron::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+inline bool
+Polyhedron::Status::test_any(flags_t mask) const {
+  return flags & mask;
+}
+
+inline void
+Polyhedron::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+inline void
+Polyhedron::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+inline bool
+Polyhedron::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+inline void
+Polyhedron::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+inline void
+Polyhedron::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+inline bool
+Polyhedron::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+inline void
+Polyhedron::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+inline void
+Polyhedron::Status::set_empty() {
+  flags = EMPTY;
+}
+
+inline bool
+Polyhedron::Status::test_c_up_to_date() const {
+  return test_any(C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_c_up_to_date() {
+  reset(C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_c_up_to_date() {
+  set(C_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_g_up_to_date() const {
+  return test_any(G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_g_up_to_date() {
+  reset(G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_g_up_to_date() {
+  set(G_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_c_minimized() const {
+  return test_any(C_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::reset_c_minimized() {
+  reset(C_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::set_c_minimized() {
+  set(C_MINIMIZED);
+}
+
+inline bool
+Polyhedron::Status::test_g_minimized() const {
+  return test_any(G_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::reset_g_minimized() {
+  reset(G_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::set_g_minimized() {
+  set(G_MINIMIZED);
+}
+
+
+inline bool
+Polyhedron::Status::test_c_pending() const {
+  return test_any(CS_PENDING);
+}
+
+inline void
+Polyhedron::Status::reset_c_pending() {
+  reset(CS_PENDING);
+}
+
+inline void
+Polyhedron::Status::set_c_pending() {
+  set(CS_PENDING);
+}
+
+inline bool
+Polyhedron::Status::test_g_pending() const {
+  return test_any(GS_PENDING);
+}
+
+inline void
+Polyhedron::Status::reset_g_pending() {
+  reset(GS_PENDING);
+}
+
+inline void
+Polyhedron::Status::set_g_pending() {
+  set(GS_PENDING);
+}
+
+
+inline bool
+Polyhedron::Status::test_sat_c_up_to_date() const {
+  return test_any(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_sat_c_up_to_date() {
+  reset(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_sat_c_up_to_date() {
+  set(SAT_C_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_sat_g_up_to_date() const {
+  return test_any(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_sat_g_up_to_date() {
+  reset(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_sat_g_up_to_date() {
+  set(SAT_G_UP_TO_DATE);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Polyhedron.inlines.hh line 1
+/* Polyhedron class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Polyhedron.inlines.hh line 29
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+inline memory_size_type
+Polyhedron::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline dimension_type
+Polyhedron::max_space_dimension() {
+  using std::min;
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return min(std::numeric_limits<dimension_type>::max() - 1,
+	     min(Constraint_System::max_space_dimension(),
+		 Generator_System::max_space_dimension()
+		 )
+	     );
+}
+
+inline Topology
+Polyhedron::topology() const {
+  // We can check either one of the two matrices.
+  // (`con_sys' is slightly better, since it is placed at offset 0.)
+  return con_sys.topology();
+}
+
+inline bool
+Polyhedron::is_necessarily_closed() const {
+  // We can check either one of the two matrices.
+  // (`con_sys' is slightly better, since it is placed at offset 0.)
+  return con_sys.is_necessarily_closed();
+}
+
+inline dimension_type
+Polyhedron::space_dimension() const {
+  return space_dim;
+}
+
+inline void
+Polyhedron::upper_bound_assign(const Polyhedron& y) {
+  poly_hull_assign(y);
+}
+
+inline void
+Polyhedron::difference_assign(const Polyhedron& y) {
+  poly_difference_assign(y);
+}
+
+inline
+Polyhedron::~Polyhedron() {
+}
+
+inline void
+Polyhedron::swap(Polyhedron& y) {
+  if (topology() != y.topology())
+    throw_topology_incompatible("swap(y)", "y", y);
+  std::swap(con_sys, y.con_sys);
+  std::swap(gen_sys, y.gen_sys);
+  std::swap(sat_c, y.sat_c);
+  std::swap(sat_g, y.sat_g);
+  std::swap(status, y.status);
+  std::swap(space_dim, y.space_dim);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+inline void
+std::swap(Parma_Polyhedra_Library::Polyhedron& x,
+	  Parma_Polyhedra_Library::Polyhedron& y) {
+  x.swap(y);
+}
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Polyhedron::marked_empty() const {
+  return status.test_empty();
+}
+
+inline bool
+Polyhedron::constraints_are_up_to_date() const {
+  return status.test_c_up_to_date();
+}
+
+inline bool
+Polyhedron::generators_are_up_to_date() const {
+  return status.test_g_up_to_date();
+}
+
+inline bool
+Polyhedron::constraints_are_minimized() const {
+  return status.test_c_minimized();
+}
+
+inline bool
+Polyhedron::generators_are_minimized() const {
+  return status.test_g_minimized();
+}
+
+inline bool
+Polyhedron::sat_c_is_up_to_date() const {
+  return status.test_sat_c_up_to_date();
+}
+
+inline bool
+Polyhedron::sat_g_is_up_to_date() const {
+  return status.test_sat_g_up_to_date();
+}
+
+inline bool
+Polyhedron::has_pending_constraints() const {
+  return status.test_c_pending();
+}
+
+inline bool
+Polyhedron::has_pending_generators() const {
+  return status.test_g_pending();
+}
+
+inline bool
+Polyhedron::has_something_pending() const {
+  return status.test_c_pending() || status.test_g_pending();
+}
+
+inline bool
+Polyhedron::can_have_something_pending() const {
+  return constraints_are_minimized()
+    && generators_are_minimized()
+    && (sat_c_is_up_to_date() || sat_g_is_up_to_date());
+}
+
+inline void
+Polyhedron::set_constraints_up_to_date() {
+  status.set_c_up_to_date();
+}
+
+inline void
+Polyhedron::set_generators_up_to_date() {
+  status.set_g_up_to_date();
+}
+
+inline void
+Polyhedron::set_constraints_minimized() {
+  set_constraints_up_to_date();
+  status.set_c_minimized();
+}
+
+inline void
+Polyhedron::set_generators_minimized() {
+  set_generators_up_to_date();
+  status.set_g_minimized();
+}
+
+inline void
+Polyhedron::set_constraints_pending() {
+  status.set_c_pending();
+}
+
+inline void
+Polyhedron::set_generators_pending() {
+  status.set_g_pending();
+}
+
+inline void
+Polyhedron::set_sat_c_up_to_date() {
+  status.set_sat_c_up_to_date();
+}
+
+inline void
+Polyhedron::set_sat_g_up_to_date() {
+  status.set_sat_g_up_to_date();
+}
+
+inline void
+Polyhedron::clear_empty() {
+  status.reset_empty();
+}
+
+inline void
+Polyhedron::clear_constraints_minimized() {
+  status.reset_c_minimized();
+}
+
+inline void
+Polyhedron::clear_generators_minimized() {
+  status.reset_g_minimized();
+}
+
+inline void
+Polyhedron::clear_pending_constraints() {
+  status.reset_c_pending();
+}
+
+inline void
+Polyhedron::clear_pending_generators() {
+  status.reset_g_pending();
+}
+
+inline void
+Polyhedron::clear_sat_c_up_to_date() {
+  status.reset_sat_c_up_to_date();
+  // Can get rid of sat_c here.
+}
+
+inline void
+Polyhedron::clear_sat_g_up_to_date() {
+  status.reset_sat_g_up_to_date();
+  // Can get rid of sat_g here.
+}
+
+inline void
+Polyhedron::clear_constraints_up_to_date() {
+  clear_pending_constraints();
+  clear_constraints_minimized();
+  clear_sat_c_up_to_date();
+  clear_sat_g_up_to_date();
+  status.reset_c_up_to_date();
+  // Can get rid of con_sys here.
+}
+
+inline void
+Polyhedron::clear_generators_up_to_date() {
+  clear_pending_generators();
+  clear_generators_minimized();
+  clear_sat_c_up_to_date();
+  clear_sat_g_up_to_date();
+  status.reset_g_up_to_date();
+  // Can get rid of gen_sys here.
+}
+
+inline bool
+Polyhedron::process_pending() const {
+  assert(space_dim > 0 && !marked_empty());
+  assert(has_something_pending());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  if (x.has_pending_constraints())
+    return x.process_pending_constraints();
+
+  assert(x.has_pending_generators());
+  x.process_pending_generators();
+  return true;
+}
+
+inline bool
+Polyhedron::is_empty() const {
+  if (marked_empty())
+    return true;
+  // Try a fast-fail test: if generators are up-to-date and
+  // there are no pending constraints, then the generator system
+  // (since it is well formed) contains a point.
+  if (generators_are_up_to_date() && !has_pending_constraints())
+    return false;
+  return !minimize();
+}
+
+inline bool
+Polyhedron::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+inline bool
+Polyhedron::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+		     Coefficient& sup_n, Coefficient& sup_d,
+		     bool& maximum) const {
+  Generator g(point());
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+		     Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		     Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+inline bool
+Polyhedron::minimize(const Linear_Expression& expr,
+		     Coefficient& inf_n, Coefficient& inf_d,
+		     bool& minimum) const {
+  Generator g(point());
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+inline bool
+Polyhedron::minimize(const Linear_Expression& expr,
+		     Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		     Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+/*! \relates Polyhedron */
+inline bool
+operator!=(const Polyhedron& x, const Polyhedron& y) {
+  return !(x == y);
+}
+
+inline bool
+Polyhedron::strictly_contains(const Polyhedron& y) const {
+  const Polyhedron& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Polyhedron.templates.hh line 1
+/* Polyhedron class implementation: non-inline template functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Polyhedron.templates.hh line 29
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Box>
+Polyhedron::Polyhedron(Topology topol, const Box& box)
+  : con_sys(topol),
+    gen_sys(topol),
+    sat_c(),
+    sat_g() {
+  // Initialize the space dimension as indicated by the box.
+  space_dim = box.space_dimension();
+
+  // Check for emptiness.
+  if (box.is_empty()) {
+    set_empty();
+    return;
+  }
+
+  // Zero-dim universe polyhedron.
+  if (space_dim == 0) {
+    set_zero_dim_univ();
+    return;
+  }
+
+  // Insert a dummy constraint of the highest dimension to avoid the
+  // need of resizing the matrix of constraints later;
+  // this constraint will be removed at the end.
+  con_sys.insert(Variable(space_dim - 1) >= 0);
+
+  for (dimension_type k = space_dim; k-- > 0; ) {
+    // See if we have a valid lower bound.
+    bool l_closed = false;
+    Coefficient l_n, l_d;
+    bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d);
+    if (l_bounded && topol == NECESSARILY_CLOSED && !l_closed)
+      throw_invalid_argument("C_Polyhedron(const Box& box):",
+			     " box has an open lower bound");
+    // See if we have a valid upper bound.
+    bool u_closed = false;
+    Coefficient u_n, u_d;
+    bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d);
+    if (u_bounded && topol == NECESSARILY_CLOSED && !u_closed)
+      throw_invalid_argument("C_Polyhedron(const Box& box):",
+			     " box has an open upper bound");
+
+    // See if we have an implicit equality constraint.
+    if (l_bounded && u_bounded
+	&& l_closed && u_closed
+	&& l_n == u_n && l_d == u_d) {
+      // Add the constraint `l_d*v_k == l_n'.
+      con_sys.insert(l_d * Variable(k) == l_n);
+    }
+    else {
+      // Check if a lower bound constraint is required.
+      if (l_bounded) {
+       if (l_closed)
+	 // Add the constraint `l_d*v_k >= l_n'.
+	 con_sys.insert(l_d * Variable(k) >= l_n);
+       else
+	 // Add the constraint `l_d*v_k > l_n'.
+	 con_sys.insert(l_d * Variable(k) > l_n);
+      }
+      // Check if an upper bound constraint is required.
+      if (u_bounded) {
+       if (u_closed)
+	 // Add the constraint `u_d*v_k <= u_n'.
+	 con_sys.insert(u_d * Variable(k) <= u_n);
+       else
+	 // Add the constraint `u_d*v_k < u_n'.
+	 con_sys.insert(u_d * Variable(k) < u_n);
+      }
+    }
+  }
+
+  // Adding the low-level constraints.
+  con_sys.add_low_level_constraints();
+  // Now removing the dummy constraint inserted before.
+  dimension_type n_rows = con_sys.num_rows() - 1;
+  con_sys[0].swap(con_sys[n_rows]);
+  con_sys.set_sorted(false);
+  // NOTE: here there are no pending constraints.
+  con_sys.set_index_first_pending_row(n_rows);
+  con_sys.erase_to_end(n_rows);
+
+  // Constraints are up-to-date.
+  set_constraints_up_to_date();
+  assert(OK());
+}
+
+template <typename Box>
+void
+Polyhedron::shrink_bounding_box(Box& box, Complexity_Class complexity) const {
+  bool reduce_complexity = (complexity != ANY_COMPLEXITY);
+  if (!reduce_complexity
+      || (!has_something_pending() && constraints_are_minimized())) {
+    // If the constraint system is minimized, the test `is_universe()'
+    // is not exponential.
+    if (is_universe())
+      return;
+  }
+  if (reduce_complexity) {
+    if (marked_empty()
+	|| (generators_are_up_to_date() && gen_sys.num_rows() == 0)) {
+      box.set_empty();
+      return;
+    }
+    else if (constraints_are_up_to_date()) {
+      // See if there is at least one inconsistent constraint in `con_sys'.
+      for (Constraint_System::const_iterator i = con_sys.begin(),
+	     cs_end = con_sys.end(); i != cs_end; ++i)
+	if (i->is_inconsistent()) {
+	  box.set_empty();
+	  return;
+	}
+      // If `complexity' allows it, use the LP_Problem solver to determine
+      // whether or not the polyhedron is empty.
+      if (complexity == SIMPLEX_COMPLEXITY
+	  // TODO: find a workaround for NNC polyhedra.
+	  && is_necessarily_closed()) {
+	LP_Problem lp(con_sys);
+	if (!lp.is_satisfiable()) {
+	  box.set_empty();
+	  return;
+	}
+      }
+    }
+  }
+  else
+    // The flag `reduce_complexity' is `false'.
+    // Note that the test `is_empty()' is exponential in the worst case.
+    if (is_empty()) {
+      box.set_empty();
+      return;
+    }
+
+  if (space_dim == 0)
+    return;
+
+  // The following vectors will store the lower and upper bound
+  // for each dimension.
+  // Lower bounds are initialized to open plus infinity.
+  std::vector<LBoundary>
+    lower_bound(space_dim,
+		LBoundary(ERational(PLUS_INFINITY), LBoundary::OPEN));
+  // Upper bounds are initialized to open minus infinity.
+  std::vector<UBoundary>
+    upper_bound(space_dim,
+		UBoundary(ERational(MINUS_INFINITY), UBoundary::OPEN));
+
+  if (!reduce_complexity && has_something_pending())
+    process_pending();
+
+  // TODO: use simplex to derive variable bounds, if the complexity
+  // is SIMPLEX_COMPLEXITY.
+
+  if (reduce_complexity &&
+       (!generators_are_up_to_date() || has_pending_constraints())) {
+    // Extract easy-to-find bounds from constraints.
+    assert(constraints_are_up_to_date());
+
+    // We must copy `con_sys' to a temporary matrix,
+    // as we need to simplify all of the matrix
+    // (not just the non-pending part of it).
+    Constraint_System cs(con_sys);
+    if (cs.num_pending_rows() > 0)
+      cs.unset_pending_rows();
+    if (has_pending_constraints() || !constraints_are_minimized())
+      cs.simplify();
+
+    const Constraint_System::const_iterator cs_begin = cs.begin();
+    const Constraint_System::const_iterator cs_end = cs.end();
+
+    for (Constraint_System::const_iterator i = cs_begin; i != cs_end; ++i) {
+      dimension_type varid = space_dim;
+      const Constraint& c = *i;
+      // After `simplify()' some constraints may have become inconsistent.
+      if (c.is_inconsistent()) {
+	box.set_empty();
+	return;
+      }
+      for (dimension_type j = space_dim; j-- > 0; ) {
+	// We look for constraints of the form `Variable(j) == k',
+	// `Variable(j) >= k', and `Variable(j) > k'.
+	if (c.coefficient(Variable(j)) != 0)
+	  if (varid != space_dim) {
+	    varid = space_dim;
+	    break;
+	  }
+	  else
+	    varid = j;
+      }
+      if (varid != space_dim) {
+	Coefficient_traits::const_reference d = c.coefficient(Variable(varid));
+	Coefficient_traits::const_reference n = c.inhomogeneous_term();
+	// The constraint `c' is of the form
+	// `Variable(varid) + n / d rel 0', where
+	// `rel' is either the relation `==', `>=', or `>'.
+	// For the purpose of shrinking intervals, this is
+	// (morally) turned into `Variable(varid) rel -n/d'.
+	mpq_class q;
+	assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+	assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+	q.canonicalize();
+	// Turn `n/d' into `-n/d'.
+	q = -q;
+	const ERational r(q, ROUND_NOT_NEEDED);
+	const Constraint::Type c_type = c.type();
+	switch (c_type) {
+	case Constraint::EQUALITY:
+	  lower_bound[varid] = LBoundary(r, LBoundary::CLOSED);
+	  upper_bound[varid] = UBoundary(r, UBoundary::CLOSED);
+	  break;
+	case Constraint::NONSTRICT_INEQUALITY:
+	case Constraint::STRICT_INEQUALITY:
+	  if (d > 0)
+	  // If `d' is strictly positive, we have a constraint of the
+	  // form `Variable(varid) >= k' or `Variable(varid) > k'.
+	    lower_bound[varid]
+	      = LBoundary(r, (c_type == Constraint::NONSTRICT_INEQUALITY
+			      ? LBoundary::CLOSED
+			      : LBoundary::OPEN));
+	  else {
+	    // Otherwise, we are sure that `d' is strictly negative
+	    // and, in this case, we have a constraint of the form
+	    // `Variable(varid) <= k' or `Variable(varid) < k'.
+	    assert(d < 0);
+	    upper_bound[varid]
+	      = UBoundary(r, (c_type == Constraint::NONSTRICT_INEQUALITY
+			      ? UBoundary::CLOSED
+			      : UBoundary::OPEN));
+	  }
+	  break;
+	}
+      }
+    }
+  }
+  else {
+    // We are in the case where either the generators are up-to-date
+    // or reduced complexity is not required.
+    // Get the generators for *this.
+
+    // We have not to copy `gen_sys', because in this case
+    // we only read the generators.
+    const Generator_System& gs = gen_sys;
+
+    // We first need to identify those axes that are unbounded below
+    // and/or above.
+    for (Generator_System::const_iterator i = gs.begin(),
+	   gs_end = gs.end(); i != gs_end; ++i) {
+      // Note: using an iterator, we read also the pending part of the matrix.
+      const Generator& g = *i;
+      Generator::Type g_type = g.type();
+      switch (g_type) {
+      case Generator::LINE:
+	// Any axes `j' in which the coefficient is non-zero is unbounded
+	// both below and above.
+	for (dimension_type j = space_dim; j-- > 0; )
+	  if (g.coefficient(Variable(j)) != 0) {
+	    lower_bound[j] = LBoundary(ERational(MINUS_INFINITY),
+				       LBoundary::OPEN);
+	    upper_bound[j] = UBoundary(ERational(PLUS_INFINITY),
+				       UBoundary::OPEN);
+	  }
+	break;
+      case Generator::RAY:
+	// Axes in which the coefficient is negative are unbounded below.
+	// Axes in which the coefficient is positive are unbounded above.
+	for (dimension_type j = space_dim; j-- > 0; ) {
+	  int sign = sgn(g.coefficient(Variable(j)));
+	  if (sign < 0)
+	    lower_bound[j] = LBoundary(ERational(MINUS_INFINITY),
+				       LBoundary::OPEN);
+	  else if (sign > 0)
+	    upper_bound[j] = UBoundary(ERational(PLUS_INFINITY),
+				       UBoundary::OPEN);
+	}
+	break;
+      case Generator::POINT:
+      case Generator::CLOSURE_POINT:
+	{
+	  Coefficient_traits::const_reference d = g.divisor();
+	  for (dimension_type j = space_dim; j-- > 0; ) {
+	    Coefficient_traits::const_reference n = g.coefficient(Variable(j));
+	    mpq_class q;
+	    assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+	    assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+	    q.canonicalize();
+	    const ERational r(q, ROUND_NOT_NEEDED);
+	    LBoundary lb(r,(g_type == Generator::CLOSURE_POINT
+			    ? LBoundary::OPEN
+			    : LBoundary::CLOSED));
+	    if (lb < lower_bound[j])
+	      lower_bound[j] = lb;
+	    UBoundary ub(r, (g_type == Generator::CLOSURE_POINT
+			     ? UBoundary::OPEN
+			     : UBoundary::CLOSED));
+	    if (ub > upper_bound[j])
+	      upper_bound[j] = ub;
+	  }
+	}
+	break;
+      }
+    }
+  }
+
+  TEMP_INTEGER(n);
+  TEMP_INTEGER(d);
+
+  // Now shrink the bounded axes.
+  for (dimension_type j = space_dim; j-- > 0; ) {
+    // Lower bound.
+    const LBoundary& lb = lower_bound[j];
+    const ERational& lr = lb.bound();
+    if (!is_plus_infinity(lr) && !is_minus_infinity(lr)) {
+      n = raw_value(lr).get_num();
+      d = raw_value(lr).get_den();
+      box.raise_lower_bound(j, lb.is_closed(), n, d);
+    }
+
+    // Upper bound.
+    const UBoundary& ub = upper_bound[j];
+    const ERational& ur = ub.bound();
+    if (!is_plus_infinity(ur) && !is_minus_infinity(ur)) {
+      n = raw_value(ur).get_num();
+      d = raw_value(ur).get_den();
+      box.lower_upper_bound(j, ub.is_closed(), n, d);
+    }
+  }
+}
+
+template <typename Partial_Function>
+void
+Polyhedron::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the polyhedron becomes zero_dimensional.
+    if (marked_empty()
+	|| (has_pending_constraints()
+	    && !remove_pending_to_obtain_generators())
+	|| (!generators_are_up_to_date() && !update_generators())) {
+      // Removing all dimensions from the empty polyhedron.
+      space_dim = 0;
+      con_sys.clear();
+    }
+    else
+      // Removing all dimensions from a non-empty polyhedron.
+      set_zero_dim_univ();
+
+    assert(OK());
+    return;
+  }
+
+  const dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+  if (new_space_dimension == space_dim) {
+    // The partial function `pfunc' is indeed total and thus specifies
+    // a permutation, that is, a renaming of the dimensions.  For
+    // maximum efficiency, we will simply permute the columns of the
+    // constraint system and/or the generator system.
+
+    // We first compute suitable permutation cycles for the columns of
+    // the `con_sys' and `gen_sys' matrices.  We will represent them
+    // with a linear array, using 0 as a terminator for each cycle
+    // (notice that the columns with index 0 of `con_sys' and
+    // `gen_sys' represent the inhomogeneous terms, and thus are
+    // unaffected by the permutation of dimensions).
+    // Cycles of length 1 will be omitted so that, in the worst case,
+    // we will have `space_dim' elements organized in `space_dim/2'
+    // cycles, which means we will have at most `space_dim/2'
+    // terminators.
+    std::vector<dimension_type> cycles;
+    cycles.reserve(space_dim + space_dim/2);
+
+    // Used to mark elements as soon as they are inserted in a cycle.
+    std::deque<bool> visited(space_dim);
+
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      if (!visited[i]) {
+	dimension_type j = i;
+	do {
+	  visited[j] = true;
+	  // The following initialization is only to make the compiler happy.
+	  dimension_type k = 0;
+	  if (!pfunc.maps(j, k))
+	    throw_invalid_argument("map_space_dimensions(pfunc)",
+				   " pfunc is inconsistent");
+	  if (k == j)
+	    // Cycle of length 1: skip it.
+	    goto skip;
+
+	  cycles.push_back(j+1);
+	  // Go along the cycle.
+	  j = k;
+	} while (!visited[j]);
+	// End of cycle: mark it.
+	cycles.push_back(0);
+      skip:
+	;
+      }
+    }
+
+    // If `cycles' is empty then `pfunc' is the identity.
+    if (cycles.empty())
+      return;
+
+    // Permute all that is up-to-date.  Notice that the contents of
+    // the saturation matrices is unaffected by the permutation of
+    // columns: they remain valid, if they were so.
+    if (constraints_are_up_to_date())
+      con_sys.permute_columns(cycles);
+
+    if (generators_are_up_to_date())
+      gen_sys.permute_columns(cycles);
+
+    assert(OK());
+    return;
+  }
+
+  // If control gets here, then `pfunc' is not a permutation and some
+  // dimensions must be projected away.
+
+  // If there are pending constraints, using `generators()' we process them.
+  const Generator_System& old_gensys = generators();
+
+  if (old_gensys.num_rows() == 0) {
+    // The polyhedron is empty.
+    Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY);
+    std::swap(*this, new_polyhedron);
+    assert(OK());
+    return;
+  }
+
+  // Make a local copy of the partial function.
+  std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+  for (dimension_type j = space_dim; j-- > 0; ) {
+    dimension_type pfunc_j;
+    if (pfunc.maps(j, pfunc_j))
+      pfunc_maps[j] = pfunc_j;
+  }
+
+  Generator_System new_gensys;
+  for (Generator_System::const_iterator i = old_gensys.begin(),
+	 old_gensys_end = old_gensys.end(); i != old_gensys_end; ++i) {
+    const Generator& old_g = *i;
+    Linear_Expression e(0 * Variable(new_space_dimension-1));
+    bool all_zeroes = true;
+    for (dimension_type j = space_dim; j-- > 0; ) {
+      if (old_g.coefficient(Variable(j)) != 0
+	  && pfunc_maps[j] != not_a_dimension()) {
+	e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j));
+	all_zeroes = false;
+      }
+    }
+    switch (old_g.type()) {
+    case Generator::LINE:
+      if (!all_zeroes)
+	new_gensys.insert(line(e));
+      break;
+    case Generator::RAY:
+      if (!all_zeroes)
+	new_gensys.insert(ray(e));
+      break;
+    case Generator::POINT:
+      // A point in the origin has all zero homogeneous coefficients.
+      new_gensys.insert(point(e, old_g.divisor()));
+      break;
+    case Generator::CLOSURE_POINT:
+      // A closure point in the origin has all zero homogeneous coefficients.
+      new_gensys.insert(closure_point(e, old_g.divisor()));
+      break;
+    }
+  }
+  Polyhedron new_polyhedron(topology(), new_gensys);
+  std::swap(*this, new_polyhedron);
+  assert(OK(true));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 2474
+
+// Automatically generated from PPL source file ../src/H79_Certificate.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+H79_Certificate::H79_Certificate()
+  : affine_dim(0), num_constraints(0) {
+  // This is the certificate for a zero-dim universe polyhedron.
+}
+
+inline
+H79_Certificate::H79_Certificate(const H79_Certificate& y)
+  : affine_dim(y.affine_dim), num_constraints(y.num_constraints) {
+}
+
+inline
+H79_Certificate::~H79_Certificate() {
+}
+
+inline bool
+H79_Certificate::Compare::operator()(const H79_Certificate& x,
+				     const H79_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this lgo relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
+
+template <typename PH>
+inline
+H79_Certificate::H79_Certificate(const PH& ph)
+  : affine_dim(0), num_constraints(0) {
+  H79_Certificate cert(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+  affine_dim = cert.affine_dim;
+  num_constraints = cert.num_constraints;
+}
+
+template <typename PH>
+inline int
+H79_Certificate::compare(const PH& ph) const {
+  return this->compare(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/H79_Certificate.defs.hh line 96
+
+// Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 1
+/* Grid_Certificate class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 27
+
+// Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 30
+#include <cassert>
+#include <vector>
+
+//! The convergence certificate for the Grid widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+
+  \note
+  Each convergence certificate has to be used together with a
+  compatible widening operator. In particular, Grid_Certificate can
+  certify the Grid widening.
+*/
+class Parma_Polyhedra_Library::Grid_Certificate {
+public:
+  //! Default constructor.
+  Grid_Certificate();
+
+  //! Constructor: computes the certificate for \p gr.
+  Grid_Certificate(const Grid& gr);
+
+  //! Copy constructor.
+  Grid_Certificate(const Grid_Certificate& y);
+
+  //! Destructor.
+  ~Grid_Certificate();
+
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+  */
+  int compare(const Grid_Certificate& y) const;
+
+  //! Compares \p *this with the certificate for grid \p gr.
+  int compare(const Grid& gr) const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the certificate for grid
+    \p gr is strictly smaller than \p *this.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool is_stabilizing(const Grid& gr) const;
+
+  //! A total ordering on Grid certificates.
+  /*!
+    This binary predicate defines a total ordering on Grid certificates
+    which is used when storing information about sets of grids.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const Grid_Certificate& x,
+		    const Grid_Certificate& y) const;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Check if gathered information is meaningful.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool OK() const;
+
+private:
+  //! Number of a equalities in a minimized congruence system for the
+  //! grid.
+  dimension_type num_equalities;
+  //! Number of a proper congruences in a minimized congruence system
+  //! for the grid.
+  dimension_type num_proper_congruences;
+};
+
+// Automatically generated from PPL source file ../src/Grid_Certificate.inlines.hh line 1
+/* Grid_Certificate class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Certificate::Grid_Certificate()
+  : num_equalities(0), num_proper_congruences(0) {
+  // This is the certificate for a zero-dim universe grid.
+  assert(OK());
+}
+
+inline
+Grid_Certificate::Grid_Certificate(const Grid_Certificate& y)
+  : num_equalities(y.num_equalities),
+    num_proper_congruences(y.num_proper_congruences) {
+}
+
+inline
+Grid_Certificate::~Grid_Certificate() {
+}
+
+inline bool
+Grid_Certificate::is_stabilizing(const Grid& gr) const {
+  return compare(gr) == 1;
+}
+
+inline bool
+Grid_Certificate::Compare::operator()(const Grid_Certificate& x,
+				      const Grid_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this lgo relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 102
+
+// Automatically generated from PPL source file ../src/Grid.defs.hh line 1
+/* Grid class declaration.
+*/
+
+
+#define STRONG_REDUCTION
+
+// Automatically generated from PPL source file ../src/Grid.defs.hh line 43
+#include <vector>
+#include <iosfwd>
+
+// Dimension kind vector tracing
+#define print_dim_kinds(msg, dim_kinds)					\
+  std::cout << msg << "dim_kinds:";					\
+  for (Dimension_Kinds::iterator i = dim_kinds.begin(); i != dim_kinds.end(); ++i) \
+    std::cout << " " << *i;						\
+  std::cout << std::endl;
+#if 0
+#define trace_dim_kinds(msg, dim_kinds) print_dim_kinds(msg, dim_kinds)
+#else
+#define trace_dim_kinds(msg, dim_kinds)
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Grid
+  Writes a textual representation of \p gr on \p s: <CODE>false</CODE>
+  is written if \p gr is an empty grid; <CODE>true</CODE> is written
+  if \p gr is a universe grid; a minimized system of congruences
+  defining \p gr is written otherwise, all congruences in one row
+  separated by ", "s.
+*/
+std::ostream&
+operator<<(std::ostream& s, const Grid& gr);
+
+} // namespace IO_Operators
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are the same
+  grid.
+
+  \relates Grid
+  Note that \p x and \p y may be dimension-incompatible grids: in
+  those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Grid& x, const Grid& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are different
+  grids.
+
+  \relates Grid
+  Note that \p x and \p y may be dimension-incompatible grids: in
+  those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Grid& x, const Grid& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A grid.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Grid represents a rational grid.
+
+  A grid can be specified as either a finite system of congruences
+  or a finite system of generators (see Section \ref
+  sect_rational_grids) and it is always possible to obtain either
+  representation.
+  That is, if we know the system of congruences, we can obtain
+  from this the system of generators that define the same grid
+  and vice versa.
+  These systems can contain redundant members, or they can be in the
+  minimal form.
+  Most operators on grids are provided with two implementations:
+  one of these, denoted <CODE>\<operator-name\>_and_minimize</CODE>,
+  also enforces the minimization of the representations,
+  and returns the boolean value <CODE>false</CODE> whenever
+  the resulting grid turns out to be empty.
+
+  A key attributes of any grid is its space dimension (the dimension
+  \f$n \in \Nset\f$ of the enclosing vector space):
+
+  - all grids, the empty ones included, are endowed with a space
+    dimension;
+  - most operations working on a grid and another object (another
+    grid, a congruence, a generator, a set of variables, etc.) will
+    throw an exception if the grid and the object are not
+    dimension-compatible (see Section \ref Grid_Space_Dimensions);
+  - the only ways in which the space dimension of a grid can be
+    changed are with <EM>explicit</EM> calls to operators provided for
+    that purpose, and with standard copy, assignment and swap
+    operators.
+
+  Note that two different grids can be defined on the zero-dimension
+  space: the empty grid and the universe grid \f$R^0\f$.
+
+  \par
+  In all the examples it is assumed that variables
+  <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+  used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
+
+  \par Example 1
+  The following code builds a grid corresponding to the even integer
+  pairs in \f$\Rset^2\f$, given as a system of congruences:
+  \code
+  Congruence_System cgs;
+  cgs.insert((x %= 0) / 2);
+  cgs.insert((y %= 0) / 2);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying three of the points:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_point(0*x + 2*y));
+  gs.insert(grid_point(2*x + 0*y));
+  Grid gr(gs);
+  \endcode
+
+  \par Example 2
+  The following code builds a grid corresponding to a line in
+  \f$\Rset^2\f$ by adding a single congruence to the universe grid:
+  \code
+  Congruence_System cgs;
+  cgs.insert(x - y == 0);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying a point and a line:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_line(x + y));
+  Grid gr(gs);
+  \endcode
+
+  \par Example 3
+  The following code builds a grid corresponding to the integral
+  points on the line \f$x = y\f$ in \f$\Rset^2\f$ constructed
+  by adding an equality and congruence to the universe grid:
+  \code
+  Congruence_System cgs;
+  cgs.insert(x - y == 0);
+  cgs.insert(x %= 0);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying a point and a parameter:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(parameter(x + y));
+  Grid gr(gs);
+  \endcode
+
+  \par Example 4
+  The following code builds the grid corresponding to a plane by
+  creating the universe grid in \f$\Rset^2\f$:
+  \code
+  Grid gr(2);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from the empty grid in \f$\Rset^2\f$ and inserting the appropriate
+  generators (a point, and two lines).
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(0*x + 0*y));
+  gr.add_generator(grid_line(x));
+  gr.add_generator(grid_line(y));
+  \endcode
+  Note that a generator system must contain a point when describing
+  a grid.  To ensure that this is always the case it is required
+  that the first generator inserted in an empty grid is a point
+  (otherwise, an exception is thrown).
+
+  \par Example 5
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_embed</CODE>:
+  \code
+  Grid gr(1);
+  gr.add_congruence(x == 2);
+  gr.add_space_dimensions_and_embed(1);
+  \endcode
+  We build the universe grid in the 1-dimension space \f$\Rset\f$.
+  Then we add a single equality congruence,
+  thus obtaining the grid corresponding to the singleton set
+  \f$\{ 2 \} \sseq \Rset\f$.
+  After the last line of code, the resulting grid is
+  \f[
+  \bigl\{\,
+  (2, y)^\transpose \in \Rset^2
+  \bigm|
+  y \in \Rset
+  \,\bigr\}.
+  \f]
+
+  \par Example 6
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_project</CODE>:
+  \code
+  Grid gr(1);
+  gr.add_congruence(x == 2);
+  gr.add_space_dimensions_and_project(1);
+  \endcode
+  The first two lines of code are the same as in Example 4 for
+  <CODE>add_space_dimensions_and_embed</CODE>.
+  After the last line of code, the resulting grid is
+  the singleton set
+  \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+
+  \par Example 7
+  The following code shows the use of the function
+  <CODE>affine_image</CODE>:
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(0*x + 0*y));
+  gr.add_generator(grid_point(4*x + 0*y));
+  gr.add_generator(grid_point(0*x + 2*y));
+  Linear_Expression expr = x + 3;
+  gr.affine_image(x, expr);
+  \endcode
+  In this example the starting grid is all the pairs of \f$x\f$ and
+  \f$y\f$ in \f$\Rset^2\f$ where \f$x\f$ is an integer multiple of 4
+  and \f$y\f$ is an integer multiple of 2.  The considered variable
+  is \f$x\f$ and the affine expression is \f$x+3\f$.  The resulting
+  grid is the given grid translated 3 integers to the right (all the
+  pairs \f$(x, y)\f$ where \f$x\f$ is -1 plus an integer multiple of 4
+  and \f$y\f$ is an integer multiple of 2).
+  Moreover, if the affine transformation for the same variable \p x
+  is instead \f$x+y\f$:
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting grid is every second integral point along the \f$x=y\f$
+  line, with this line of points repeated at every fourth integral value
+  along the \f$x\f$ axis.
+  Instead, if we do not use an invertible transformation for the
+  same variable; for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting grid is every second point along the \f$x=y\f$ line.
+
+  \par Example 8
+  The following code shows the use of the function
+  <CODE>affine_preimage</CODE>:
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(0*x + 0*y));
+  gr.add_generator(grid_point(4*x + 0*y));
+  gr.add_generator(grid_point(0*x + 2*y));
+  Linear_Expression expr = x + 3;
+  gr.affine_preimage(x, expr);
+  \endcode
+  In this example the starting grid, \p var and the affine
+  expression and the denominator are the same as in Example 6, while
+  the resulting grid is similar but translated 3 integers to the
+  left (all the pairs \f$(x, y)\f$
+  where \f$x\f$ is -3 plus an integer multiple of 4 and
+  \f$y\f$ is an integer multiple of 2)..
+  Moreover, if the affine transformation for \p x is \f$x+y\f$
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting grid is a similar grid to the result in Example 6,
+  only the grid is slanted along \f$x=-y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable \p x, for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting grid is every fourth line parallel to the \f$x\f$
+  axis.
+
+  \par Example 9
+  For this example we also use the variables:
+  \code
+  Variable z(2);
+  Variable w(3);
+  \endcode
+  The following code shows the use of the function
+  <CODE>remove_space_dimensions</CODE>:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(3*x + y +0*z + 2*w));
+  Grid gr(gs);
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  gr.remove_space_dimensions(to_be_removed);
+  \endcode
+  The starting grid is the singleton set
+  \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+  the resulting grid is
+  \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+  Be careful when removing space dimensions <EM>incrementally</EM>:
+  since dimensions are automatically renamed after each application
+  of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+  results can be obtained.
+  For instance, by using the following code we would obtain
+  a different result:
+  \code
+  set<Variable> to_be_removed1;
+  to_be_removed1.insert(y);
+  gr.remove_space_dimensions(to_be_removed1);
+  set<Variable> to_be_removed2;
+  to_be_removed2.insert(z);
+  gr.remove_space_dimensions(to_be_removed2);
+  \endcode
+  In this case, the result is the grid
+  \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+  when removing the set of dimensions \p to_be_removed2
+  we are actually removing variable \f$w\f$ of the original grid.
+  For the same reason, the operator \p remove_space_dimensions
+  is not idempotent: removing twice the same non-empty set of dimensions
+  is never the same as removing them just once.
+*/
+
+class Parma_Polyhedra_Library::Grid {
+public:
+  //! Returns the maximum space dimension all kinds of Grid can handle.
+  static dimension_type max_space_dimension();
+
+  //! Builds a grid having the specified properties.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the grid;
+
+    \param kind
+    Specifies whether the universe or the empty grid has to be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(dimension_type num_dimensions = 0,
+		const Degenerate_Element kind = UNIVERSE);
+
+  //! Builds a grid, copying a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the grid.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Congruence_System& cgs);
+
+  //! Builds a grid, recycling a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the grid.  Its data-structures
+    will be recycled to build the grid.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(Congruence_System& cgs);
+
+  //! Builds a grid, copying a system of constraints.
+  /*!
+    The grid inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the grid.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Constraint_System& cs);
+
+  //! Builds a grid, recycling a system of constraints.
+  /*!
+    The grid inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the grid.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(Constraint_System& cs);
+
+  //! Builds a grid, copying a system of generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
+
+    \param const_gs
+    The system of generators defining the grid.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Grid_Generator_System& const_gs);
+
+  //! Builds a grid, recycling a system of generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the grid.  Its data-structures
+    will be recycled to build the grid.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+  */
+  explicit Grid(Grid_Generator_System& gs);
+
+  //! Builds a grid out of a generic, interval-based bounding box.
+  /*!
+    \param box
+    The bounding box representing the grid to be built.  The box can
+    contain only point and universe intervals;
+
+    \param dummy
+    A dummy tag to make this constructor syntactically unique.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p box contains at least one interval with: a
+    topologically open bound, a single bound, or two bounds which have
+    space between them.
+
+    The template class Box must provide the following methods.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the dimension of the vector space enclosing the grid
+    represented by the bounding box.
+    \code
+      bool is_empty() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the bounding box
+    describes the empty set.
+    \code
+      bool get_lower_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+    \code
+      bool get_upper_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
+  */
+  template <typename Box>
+  Grid(const Box& box, From_Bounding_Box dummy);
+
+  //! Builds a grid out of a generic, interval-based covering box.
+  /*!
+    The covering box is a set of upper and lower values for each
+    dimension.  When a covering box is tiled onto empty space the
+    corners of the tiles form a rectilinear grid.
+
+    A box interval with only one bound fixes the values of all grid
+    points in the dimension associated with the box to the value of
+    the bound.  A box interval which has upper and lower bounds of
+    equal value allows all grid points with any value in the dimension
+    associated with the interval.  The presence of a universe interval
+    results in the empty grid.  The empty box produces the empty grid
+    of the same dimension as the box.
+
+    \param box
+    The covering box representing the grid to be built;
+
+    \param dummy
+    A dummy tag to make this constructor syntactically unique.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p box contains any topologically open bounds.
+
+    The template class Box must provide the following methods.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the dimension of the vector space enclosing the grid
+    represented by the covering box.
+    \code
+      bool is_empty() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the covering box
+    describes the empty set.
+    \code
+      bool get_lower_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+    \code
+      bool get_upper_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
+  */
+  template <typename Box>
+  Grid(const Box& box, From_Covering_Box dummy);
+
+  //! Ordinary copy-constructor.
+  Grid(const Grid& y);
+
+  /*! \brief
+    The assignment operator.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  Grid& operator=(const Grid& y);
+
+  //! \name Member Functions that Do Not Modify the Grid
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns
+    the \ref Grid_Affine_Dimension "affine dimension" of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns the system of congruences.
+  const Congruence_System& congruences() const;
+
+  //! Returns the system of congruences in reduced form.
+  const Congruence_System& minimized_congruences() const;
+
+  //! Returns the system of generators.
+  const Grid_Generator_System& generators() const;
+
+  //! Returns the minimized system of generators.
+  const Grid_Generator_System& minimized_generators() const;
+
+  //! Returns the relations holding between \p *this and \p cg.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  // FIXME: Poly_Con_Relation seems to encode exactly what we want
+  // here.  We must find a new name for that class.  Temporarily,
+  // we keep using it without changing the name.
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  // FIXME: see the comment for Poly_Con_Relation above.
+  Poly_Gen_Relation
+  relation_with(const Grid_Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is an empty
+    grid.
+  */
+  bool is_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a universe
+    grid.
+  */
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a
+    topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    disjoint.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool is_disjoint_from(const Grid& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  /*!
+    A grid is discrete if it can be defined by a generator system which
+    contains only points and parameters.  This includes the empty grid
+    and any grid in dimension zero.
+  */
+  bool is_discrete() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is bounded.
+  bool is_bounded() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_below.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_above.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+    Always <CODE>true</CODE> when \p this bounds \p expr.  Present for
+    interface compatibility with class Polyhedron, where closure
+    points can result in a value of false.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+    maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+    Always <CODE>true</CODE> when \p this bounds \p expr.  Present for
+    interface compatibility with class Polyhedron, where closure
+    points can result in a value of false;
+
+    \param point
+    When maximization succeeds, will be assigned a point where \p expr
+    reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p point are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+		Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+		Grid_Generator& point) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the is the infimum value can be reached in \p
+    this.  Always <CODE>true</CODE> when \p this bounds \p expr.
+    Present for interface compatibility with class Polyhedron, where
+    closure points can result in a value of false.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the is the infimum value can be reached in \p
+    this.  Always <CODE>true</CODE> when \p this bounds \p expr.
+    Present for interface compatibility with class Polyhedron, where
+    closure points can result in a value of false;
+
+    \param point
+    When minimization succeeds, will be assigned a point where \p expr
+    reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+		Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+		Grid_Generator& point) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Grid& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this strictly
+    contains \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Grid& y) const;
+
+  //! Uses \p *this to shrink a generic, interval-based bounding box.
+  /*!
+    \param box
+    The bounding box to be shrunk.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p box are dimension-incompatible, or if \p
+    box contains any topologically open bounds.
+
+    The template class Box must provide the following methods
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the dimension of the vector space enclosing the grid
+    represented by the bounding box.
+    \code
+      bool get_lower_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from below, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the greatest lower bound of \f$I\f$.  The fraction
+    \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$
+    have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+    the unique representation for zero.
+    \code
+      bool get_upper_bound(dimension_type k, bool closed,
+                           Coefficient& n, Coefficient& d) const
+    \endcode
+    Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+    space dimension.  If \f$I\f$ is not bounded from above, simply return
+    <CODE>false</CODE>.  Otherwise, set <CODE>closed</CODE>,
+    <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+    is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+    is closed and is set to <CODE>false</CODE> otherwise;
+    <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+    \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+    corresponds to the least upper bound of \f$I\f$.
+    \code
+      set_empty()
+    \endcode
+    Causes the box to become empty, i.e., to represent the empty set.
+    \code
+      raise_lower_bound(dimension_type k, bool closed,
+                        Coefficient_traits::const_reference n,
+                        Coefficient_traits::const_reference d)
+    \endcode
+    intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension with \f$[n/d, +\infty)\f$.  <CODE>closed</CODE> is
+    always passed as <CODE>true</CODE>.
+    \code
+      lower_upper_bound(dimension_type k, bool closed,
+                        Coefficient_traits::const_reference n,
+                        Coefficient_traits::const_reference d)
+    \endcode
+    intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension with \f$(-\infty, n/d]\f$.  <CODE>closed</CODE> is
+    always passed as <CODE>true</CODE>.
+
+    The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
+    will be called at most once for each possible value for <CODE>k</CODE>
+    and for all such calls the fraction \f$n/d\f$ will be in canonical form,
+    that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
+    is positive, \f$0/1\f$ being the unique representation for zero.
+    The same guarantee is offered for the function
+    <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
+  */
+  template <typename Box>
+  void shrink_bounding_box(Box& box) const;
+
+  //! Writes the covering box for \p *this into \p box.
+  /*!
+    The covering box is a set of upper and lower values for each
+    dimension.  When the covering box written into \p box is tiled
+    onto empty space the corners of the tiles form the sparsest
+    rectilinear grid that includes \p *this.
+
+    The value of the lower bound of each interval of the resulting \p
+    box are as close as possible to the origin, with positive values
+    taking preference when the lowest positive value equals the lowest
+    negative value.
+
+    If all the points have a single value in a particular dimension of
+    the grid then there is only a lower bound on the interval produced
+    in \p box, and the lower bound denotes the single value for the
+    dimension.  If the coordinates of the points in a particular
+    dimension include every value then the upper and lower bounds of
+    the associated interval in \p box are set equal.  The empty grid
+    produces the empty \p box.  The zero dimension universe grid
+    produces the zero dimension universe box.
+
+    \param box
+    The Box into which the covering box is written.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p box are dimension-incompatible.
+
+    The template class Box must provide the following methods
+    \code
+      Box(dimension_type space_dimension)
+    \endcode
+    Creates a universe box of space_dimension dimensions.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the dimension of the vector space enclosing the grid
+    represented by the covering box.
+    \code
+      set_empty()
+    \endcode
+    Causes the box to become empty, i.e., to represent the empty set.
+    \code
+      raise_lower_bound(dimension_type k, bool closed,
+                        Coefficient_traits::const_reference n,
+                        Coefficient_traits::const_reference d)
+    \endcode
+    intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension with \f$[n/d, +\infty)\f$.  <CODE>closed</CODE> is
+    always passed as <CODE>true</CODE>.
+    \code
+      lower_upper_bound(dimension_type k, bool closed,
+                        Coefficient_traits::const_reference n,
+                        Coefficient_traits::const_reference d)
+    \endcode
+    intersects the interval corresponding to the <CODE>k</CODE>-th
+    space dimension with \f$(-\infty, n/d]\f$.  <CODE>closed</CODE> is
+    always passed as <CODE>true</CODE>.
+
+    The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
+    will be called at most once for each possible value for <CODE>k</CODE>
+    and for all such calls the fraction \f$n/d\f$ will be in canonical form,
+    that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
+    is positive, \f$0/1\f$ being the unique representation for zero.
+    The same guarantee is offered for the function
+    <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
+  */
+  template <typename Box>
+  void get_covering_box(Box& box) const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if \p *this satisfies all the
+    invariants and either \p check_not_empty is <CODE>false</CODE> or
+    \p *this is not empty.
+
+    \param check_not_empty
+    <CODE>true</CODE> if and only if, in addition to checking the
+    invariants, \p *this must be checked to be not empty.
+
+    The check is performed so as to intrude as little as possible.  If
+    the library has been compiled with run-time assertions enabled,
+    error messages are written on <CODE>std::cerr</CODE> in case
+    invariants are violated. This is useful for the purpose of
+    debugging the library.
+  */
+  bool OK(bool check_not_empty = false) const;
+
+  //@} // Member Functions that Do Not Modify the Grid
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Grid
+  //@{
+
+  //! Adds a copy of congruence \p cg to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are
+    dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  //! Adds constraint \p c to \p *this.
+  /*!
+    The addition can only affect \p *this if \p c is an equality.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void add_congruence(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences of \p
+    *this, reducing the result
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  bool add_congruence_and_minimize(const Congruence& c);
+
+  //! Adds a copy of constraint \p c to \p *this, reducing the result.
+  /*!
+    The addition can only affect \p *this if \p c is an equality.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  bool add_congruence_and_minimize(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators of \p
+    *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible,
+    or if \p *this is an empty grid and \p g is not a point.
+  */
+  void add_generator(const Grid_Generator& g);
+
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators of \p
+    *this, reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible,
+    or if \p *this is an empty grid and \p g is not a point.
+  */
+  bool add_generator_and_minimize(const Grid_Generator& g);
+
+  //! Adds a copy of each congruence in \p cgs to \p *this.
+  /*!
+    \param cgs
+    Contains the congruences that will be added to the system of
+    congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  //! Adds a copy of each equality constraint in \p cs to \p *this.
+  /*!
+    \param cs
+    The congruences that will be considered for addition to the system
+    of congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Constraint_System& cs);
+
+  //! Adds the congruences in \p cgs to *this.
+  /*!
+    \param cgs
+    The congruence system that will be recycled, adding its
+    congruences to the system of congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cgs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  //! Adds the equality constraints in \p cs to \p *this.
+  /*!
+    \param cs
+    The constraint system from which constraints will be considered
+    for addition to the system of congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of the congruences in \p cgs to the system of
+    congruences of \p *this, reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cgs
+    Contains the congruences that will be added to the system of
+    congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  bool add_congruences_and_minimize(const Congruence_System& cgs);
+
+  /*! \brief
+    Adds a copy of each equality constraint in \p cs to \p *this,
+    reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    Contains the constraints that will be added to the system of
+    congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  bool add_congruences_and_minimize(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the congruences in \p cgs to the system of congruences of \p
+    *this, reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cgs
+    The congruence system that will be recycled, adding its
+    congruences to the system of congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cgs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  bool add_recycled_congruences_and_minimize(Congruence_System& cgs);
+
+  //! Adds the equalities in \p cs to \p *this, reducing the result.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    The constraint system that will be recycled, adding its
+    equalities to the system of congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  bool add_recycled_congruences_and_minimize(Constraint_System& cs);
+
+  //! Adds constraint \p c to \p *this.
+  /*!
+    The addition can only affect \p *this if \p c is an equality.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  //! Adds constraint \p c to \p *this, reducing the result.
+  /*!
+    The addition can only affect \p *this if \p c is an equality.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  bool add_constraint_and_minimize(const Constraint& c);
+
+  //! Adds copies of the equality constraints in \p cs to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds copies of the equality constraints in \p cs to \p *this,
+    reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  bool add_constraints_and_minimize(const Constraint_System& cs);
+
+  //! Adds the equality constraints in \p cs to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  bool add_recycled_constraints_and_minimize(Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system of generators
+    of \p *this.
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible, or if
+    \p *this is empty and the system of generators \p gs is not empty,
+    but has no points.
+  */
+  void add_generators(const Grid_Generator_System& gs);
+
+  /*! \brief
+    Adds the generators in \p gs to the system of generators of \p
+    *this.
+
+    \param gs
+    The generator system that will be recycled, adding its generators
+    to the system of generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible, or if
+    \p *this is empty and the system of generators \p gs is not empty,
+    but has no points.
+
+    \warning
+    The only assumption that can be made about \p gs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_generators(Grid_Generator_System& gs);
+
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system of generators
+    of \p *this, reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible, or if \p
+    *this is empty and the system of generators \p gs is not empty,
+    but has no points.
+  */
+  bool add_generators_and_minimize(const Grid_Generator_System& gs);
+
+  /*! \brief
+    Adds the generators in \p gs to the system of generators of \p
+    *this, reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param gs
+    The generator system that will be recycled, adding its generators
+    to the system of generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible, or if \p
+    *this is empty and the system of generators \p gs is not empty,
+    but has no points.
+
+    \warning
+    The only assumption that can be made about \p gs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  bool add_recycled_generators_and_minimize(Grid_Generator_System& gs);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y.  The
+    result is not guaranteed to be reduced.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y,
+    reducing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool intersection_assign_and_minimize(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the join of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void join_assign(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the join of \p *this and \p y, reducing the
+    result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool join_assign_and_minimize(const Grid& y);
+
+  //! Same as join_assign(y).
+  void upper_bound_assign(const Grid& y);
+
+  /*! \brief
+    If the join of \p *this and \p y is exact it is assigned to \p
+    *this and <CODE>true</CODE> is returned, otherwise
+    <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool join_assign_if_exact(const Grid& y);
+
+  //! Same as join_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Difference "grid-difference" of
+    \p *this and \p y.
+
+    The grid difference between grids x and y is the smallest grid
+    containing all the points from x and y that are only in x.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void grid_difference_assign(const Grid& y);
+
+  //! Same as grid_difference_assign(y).
+  void difference_assign(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Affine_Transformation
+    "affine image" of \p
+    *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering the generators of a grid, the
+    affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If congruences are up-to-date, it uses the specialized function
+    affine_preimage() (for the system of congruences)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+	   = a_\mathrm{var} x_\mathrm{var}
+	     + \sum_{i \neq var} a_i x_i + b,
+       \f]
+       so that the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+             - \sum_{i \neq j} a_i x_i - b.
+       \f]
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only generators remain
+    up-to-date.
+
+    \endif
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		    = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Affine_Transformation
+    "affine preimage" of
+    \p *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering congruences of a grid, the affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If generators are up-to-date, then the specialized function
+    affine_image() is used (for the system of generators)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation, we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+  	 \mathrm{denominator} * {x'}_\mathrm{var}
+	   = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+       \f],
+       the inverse transformation is
+       \f[
+	 a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+               - \sum_{i \neq j} a_i x_i - b.
+       \f].
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only congruences remain
+    up-to-date.
+
+    \endif
+  */
+  void affine_preimage(Variable var,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator
+		         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to
+    the \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+    \pmod{\mathrm{modulus}}\f$.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+    Optional argument with an automatic value of one;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of one.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p
+    *this.
+  */
+  void generalized_affine_image(Variable var,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				= Coefficient_one(),
+				Coefficient_traits::const_reference modulus
+				= Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+    \pmod{\mathrm{modulus}}\f$.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+    Optional argument with an automatic value of one;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of one.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p
+    *this.
+  */
+  void generalized_affine_preimage(Variable var,
+				   const Linear_Expression& expr,
+				   Coefficient_traits::const_reference denominator
+				   = Coefficient_one(),
+				   Coefficient_traits::const_reference modulus
+				   = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to
+    the \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param rhs
+    The right hand side affine expression.
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of one.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p
+    rhs.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+				const Linear_Expression& rhs,
+				Coefficient_traits::const_reference modulus
+				= Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param rhs
+    The right hand side affine expression;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of one.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p
+    rhs.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+				   const Linear_Expression& rhs,
+				   Coefficient_traits::const_reference modulus
+				   = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Time_Elapse
+    "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Grid& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void widening_assign(const Grid& y, unsigned* tp = NULL);
+
+  /*! \brief
+    Improves the result of the \ref Grid_Widening "Grid widening"
+    computation by also enforcing those congruences in \p cgs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param cgs
+    The system of congruences used to improve the widened grid;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  */
+  void limited_extrapolation_assign(const Grid& y,
+				    const Congruence_System& cgs,
+				    unsigned* tp = NULL);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old grid in the new
+    vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new grid, which is characterized by a system of congruences
+    in which the variables which are the new dimensions can have any
+    value.  For instance, when starting from the grid \f$\cL \sseq
+    \Rset^2\f$ and adding a third space dimension, the result will be
+    the grid
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cL
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new space dimensions to the grid and does not embed it
+    in the new vector space.
+
+    \param m
+    The number of space dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new grid, which is characterized by a system of congruences
+    in which the variables running through the new dimensions are all
+    constrained to be equal to 0.  For instance, when starting from
+    the grid \f$\cL \sseq \Rset^2\f$ and adding a third space
+    dimension, the result will be the grid
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cL
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Concatenate "concatenation" of
+    \p *this and \p y, taken in this order.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Grid& y);
+
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher dimensions of the vector space so that the
+    resulting space will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Grid_Map_Space_Dimensions "partial function".
+
+    If \p pfunc maps only some of the dimensions of \p *this then the
+    rest will be projected away.
+
+    If the highest dimension mapped to by \p pfunc is higher than the
+    highest dimension in \p *this then the number of dimensions in \p
+    *this will be increased to the highest dimension mapped to by \p
+    pfunc.
+
+    \param pfunc
+    The partial function specifying the destiny of each space
+    dimension.
+
+    The template class Partial_Function must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain of the
+    partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.  If \f$f\f$ is
+    undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing the grid.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Grid_Map_Space_Dimensions "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Grid_Expand_Space_Dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p to_be_folded into \p var.
+  /*!
+    \param to_be_folded
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param var
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p var or with
+    one of the Variable objects contained in \p to_be_folded.  Also
+    thrown if \p var is contained in \p to_be_folded.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    \p to_be_folded is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p var is not a member
+    of \p to_be_folded, then the space dimensions corresponding to
+    variables in \p to_be_folded are \ref Grid_Fold_Space_Dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  friend bool Parma_Polyhedra_Library::operator==(const Grid& x,
+						  const Grid& y);
+
+  friend class Parma_Polyhedra_Library::Grid_Certificate;
+
+  //! \name Miscellaneous Member Functions
+  //@{
+
+  //! Destructor.
+  ~Grid();
+
+  /*! \brief
+    Swaps \p *this with grid \p y.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  void swap(Grid& y);
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    \ref ascii_dump) and sets \p *this accordingly.
+
+     \return
+     <CODE>true</CODE> if successful, else <CODE>false</CODE>.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //@} // Miscellaneous Member Functions
+
+private:
+
+  //! The system of congruences.
+  Congruence_System con_sys;
+
+  //! The system of generators.
+  Grid_Generator_System gen_sys;
+
+#define PPL_IN_Grid_CLASS
+// Automatically generated from PPL source file ../src/Grid_Status.idefs.hh line 1
+/* Grid::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_Grid_CLASS
+#error "Do not include Grid_Status.idefs.hh directly; use Grid.defs.hh instead."
+#endif
+
+//! A conjunctive assertion about a grid.
+/*!
+  The assertions supported that are in use are:
+  - <EM>zero-dim universe</EM>: the grid is the zero-dimension
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the grid is the empty set;
+  - <EM>congruences up-to-date</EM>: the grid is correctly
+    characterized by the attached system of congruences, modulo the
+    processing of pending generators;
+  - <EM>generators up-to-date</EM>: the grid is correctly
+    characterized by the attached system of generators, modulo the
+    processing of pending congruences;
+  - <EM>congruences minimized</EM>: the non-pending part of the system
+    of congruences attached to the grid is in minimal form;
+  - <EM>generators minimized</EM>: the non-pending part of the system
+    of generators attached to the grid is in minimal form.
+
+  Other supported assertions are:
+  - <EM>congruences pending</EM>
+  - <EM>generators pending</EM>
+  - <EM>congruences' saturation matrix up-to-date</EM>
+  - <EM>generators' saturation matrix up-to-date</EM>.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>congruences pending</EM> and <EM>generators pending</EM>
+    are mutually exclusive;
+  - <EM>congruences pending</EM> implies both <EM>congruences minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>generators pending</EM> implies both <EM>congruences minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>congruences minimized</EM> implies <EM>congruences up-to-date</EM>;
+  - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+  - <EM>congruences' saturation matrix up-to-date</EM> implies both
+    <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>;
+  - <EM>generators' saturation matrix up-to-date</EM> implies both
+    <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_c_up_to_date() const;
+  void reset_c_up_to_date();
+  void set_c_up_to_date();
+
+  bool test_g_up_to_date() const;
+  void reset_g_up_to_date();
+  void set_g_up_to_date();
+
+  bool test_c_minimized() const;
+  void reset_c_minimized();
+  void set_c_minimized();
+
+  bool test_g_minimized() const;
+  void reset_g_minimized();
+  void set_g_minimized();
+
+  bool test_sat_c_up_to_date() const;
+  void reset_sat_c_up_to_date();
+  void set_sat_c_up_to_date();
+
+  bool test_sat_g_up_to_date() const;
+  void reset_sat_g_up_to_date();
+  void set_sat_g_up_to_date();
+
+  bool test_c_pending() const;
+  void reset_c_pending();
+  void set_c_pending();
+
+  bool test_g_pending() const;
+  void reset_g_pending();
+  void set_g_pending();
+  //@} // Test, remove or add an individual assertion from the conjunction
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref
+    ascii_dump) and sets \p *this accordingly.  Returns
+    <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bitmasks for the individual assertions
+  //@{
+  static const flags_t ZERO_DIM_UNIV    = 0U;
+  static const flags_t EMPTY            = 1U << 0;
+  static const flags_t C_UP_TO_DATE     = 1U << 1;
+  static const flags_t G_UP_TO_DATE     = 1U << 2;
+  static const flags_t C_MINIMIZED      = 1U << 3;
+  static const flags_t G_MINIMIZED      = 1U << 4;
+  static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+  static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+  static const flags_t CS_PENDING       = 1U << 7;
+  static const flags_t GS_PENDING       = 1U << 8;
+  //@} // Bitmasks for the individual assertions
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bitmask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+// Automatically generated from PPL source file ../src/Grid.defs.hh line 1959
+#undef PPL_IN_Grid_CLASS
+
+  //! The status flags to keep track of the grid's internal state.
+  Status status;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  enum Dimension_Kind {
+    PARAMETER,
+    LINE,
+    GEN_VIRTUAL,
+    PROPER_CONGRUENCE = PARAMETER,
+    CON_VIRTUAL = LINE,
+    EQUALITY = GEN_VIRTUAL
+  };
+
+  typedef std::vector<Dimension_Kind> Dimension_Kinds;
+
+  // The type of row associated with each dimension.  If the virtual
+  // rows existed then the reduced systems would be square and upper
+  // or lower triangular, and the rows in each would have the types
+  // given in this vector.  As the congruence system is reduced to an
+  // upside-down lower triangular form the ordering of the congruence
+  // types is last to first.
+  Dimension_Kinds dim_kinds;
+
+  //! Builds a grid from a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the grid.
+  */
+  void construct(const Congruence_System& cgs);
+
+  //! Builds a grid from a system of generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the grid;
+  */
+  void construct(const Grid_Generator_System& gs);
+
+  //! \name Private Verifiers: Verify if Individual Flags are Set
+  //@{
+
+  //! Returns <CODE>true</CODE> if the grid is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  //! Returns <CODE>true</CODE> if the system of congruences is up-to-date.
+  bool congruences_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+  bool generators_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of congruences is minimized.
+  bool congruences_are_minimized() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is minimized.
+  bool generators_are_minimized() const;
+
+  //@} // Private Verifiers: Verify if Individual Flags are Set
+
+  //! \name State Flag Setters: Set Only the Specified Flags
+  //@{
+
+  /*! \brief
+    Sets \p status to express that the grid is the universe
+    0-dimension vector space, clearing all corresponding matrices.
+  */
+  void set_zero_dim_univ();
+
+  /*! \brief
+    Sets \p status to express that the grid is empty, clearing all
+    corresponding matrices.
+  */
+  void set_empty();
+
+  //! Sets \p status to express that congruences are up-to-date.
+  void set_congruences_up_to_date();
+
+  //! Sets \p status to express that generators are up-to-date.
+  void set_generators_up_to_date();
+
+  //! Sets \p status to express that congruences are minimized.
+  void set_congruences_minimized();
+
+  //! Sets \p status to express that generators are minimized.
+  void set_generators_minimized();
+
+  //@} // State Flag Setters: Set Only the Specified Flags
+
+  //! \name State Flag Cleaners: Clear Only the Specified Flag
+  //@{
+
+  //! Clears the \p status flag indicating that the grid is empty.
+  void clear_empty();
+
+  //! Sets \p status to express that congruences are out of date.
+  void clear_congruences_up_to_date();
+
+  //! Sets \p status to express that parameters are out of date.
+  void clear_generators_up_to_date();
+
+  //! Sets \p status to express that congruences are no longer minimized.
+  void clear_congruences_minimized();
+
+  //! Sets \p status to express that generators are no longer minimized.
+  void clear_generators_minimized();
+
+  //@} // State Flag Cleaners: Clear Only the Specified Flag
+
+  //! \name Updating Matrices
+  //@{
+
+  //! Updates and minimizes the congruences from the generators.
+  /*!
+    \return
+    Always <CODE>true</CODE>.
+  */
+  bool update_congruences() const;
+
+  //! Updates and minimizes the generators from the congruences.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty grid.
+
+    It is illegal to call this method when the Status field already
+    declares the grid to be empty.
+  */
+  bool update_generators() const;
+
+  //@} // Updating Matrices
+
+  //! \name Minimization of Descriptions
+  //@{
+
+  //! Minimizes both the congruences and the generators.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty grid.
+
+    Minimization is performed on each system only if the minimized
+    Status field is clear.
+  */
+  bool minimize() const;
+
+  //@} // Minimization of Descriptions
+
+  enum Three_Valued_Boolean {
+    TVB_TRUE,
+    TVB_FALSE,
+    TVB_DONT_KNOW
+  };
+
+  //! Polynomial but incomplete equivalence test between grids.
+  Three_Valued_Boolean quick_equivalence_test(const Grid& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+  bool is_included_in(const Grid& y) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param method_call
+    The call description of the public parent method, for example
+    "bounded_from_above(e)".  Passed to throw_dimension_incompatible,
+    as the first argument.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, const char* method_call) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param method_call
+    The call description of the public parent method, for example
+    "maximize(e)".  Passed to throw_dimension_incompatible, as the
+    first argument;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr in \p
+    *this can actually be reached (which is always the case);
+
+    \param point
+    When maximization or minimization succeeds, will be assigned the
+    point where \p expr reaches the extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+	       char* method_call,
+	       Coefficient& ext_n, Coefficient& ext_d, bool& included,
+	       Grid_Generator* point = NULL) const;
+
+  //! \name Widening- and Extrapolation-Related Functions
+  //@{
+
+  //! Copies a widened selection of congruences from \p y to \p selected_cgs.
+  void select_wider_congruences(const Grid& y,
+				Congruence_System& selected_cgs) const;
+
+  //@} // Widening- and Extrapolation-Related Functions
+
+  //! Adds new space dimensions to the given systems.
+  /*!
+    \param cgs
+    A congruence system, to which columns are added;
+
+    \param gs
+    A generator system, to which rows and columns are added;
+
+    \param dims
+    The number of space dimensions to add.
+
+    This method is invoked only by
+    <CODE>add_space_dimensions_and_embed()</CODE>.
+  */
+  void add_space_dimensions(Congruence_System& cgs,
+			    Grid_Generator_System& gs,
+			    const dimension_type dims);
+
+  //! Adds new space dimensions to the given systems.
+  /*!
+    \param gs
+    A generator system, to which columns are added;
+
+    \param cgs
+    A congruence system, to which rows and columns are added;
+
+    \param dims
+    The number of space dimensions to add.
+
+    This method is invoked only by
+    <CODE>add_space_dimensions_and_project()</CODE>.
+  */
+  void add_space_dimensions(Grid_Generator_System& gs,
+			    Congruence_System& cgs,
+			    const dimension_type dims);
+
+  //! \name Minimization-related Static Member Functions
+  //@{
+
+  //! Normalizes the divisors in \p sys.
+  /*!
+    Converts \p sys to an equivalent system in which the divisors are
+    of equal value.
+
+    \return
+    The new system divisor, or zero if \p divisor was zero.
+
+    \param sys
+    The generator system to be normalized.
+
+    \param divisor
+    An extra divisor to include in the calculation of the common
+    divisor of \p sys.
+
+    \param first_point
+    If \p first_point has a value other than NULL then it is taken as
+    the first point in \p sys, and it is assumed that any following
+    points have the same divisor as \p first_point.
+  */
+  static Coefficient
+  normalize_divisors(Grid_Generator_System& sys,
+		     Coefficient_traits::const_reference divisor
+		     = Coefficient_one(),
+		     Grid_Generator* first_point = NULL);
+
+  //! Normalize all the divisors in \p sys and \p gen_sys.
+  /*!
+    Modify \p sys and \p gen_sys to use the same single divisor value
+    for all generators, leaving each system representing the grid it
+    represented originally.
+  */
+  static void normalize_divisors(Grid_Generator_System& sys,
+				 Grid_Generator_System& gen_sys);
+
+  /*! \brief
+    Converts generator system \p dest to be equivalent to congruence
+    system \p source.
+  */
+  static void conversion(Congruence_System& source,
+			 Grid_Generator_System& dest,
+			 Dimension_Kinds& dim_kinds);
+
+  /*! \brief
+    Converts congruence system \p dest to be equivalent to generator
+    system \p source.
+  */
+  static void conversion(Grid_Generator_System& source,
+			 Congruence_System& dest,
+			 Dimension_Kinds& dim_kinds);
+
+  //! Converts \p cgs to upper triangular (i.e. minimized) form.
+  /*!
+    Returns <CODE>true</CODE> if \p cgs represents the empty set,
+    otherwise returns <CODE>false</CODE>.
+  */
+  static bool simplify(Congruence_System& cgs,
+		       Dimension_Kinds& dim_kinds);
+
+  //! Converts \p gs to lower triangular (i.e. minimized) form.
+  /*!
+    Expects \p gs to contain at least one point.
+  */
+  static void simplify(Grid_Generator_System& gs,
+		       Dimension_Kinds& dim_kinds);
+
+  //! Reduces the line \p row using the line \p pivot.
+  /*!
+    Uses the line \p pivot to change the representation of the line \p
+    row so that the element at index \p col of \p row is zero.
+  */
+  // A member of Grid for access to Matrix::rows.
+  static void reduce_line_with_line(Grid_Generator& row,
+				    Grid_Generator& pivot,
+				    dimension_type col);
+
+  //! Reduces the equality \p row using the equality \p pivot.
+  /*!
+    Uses the equality \p pivot to change the representation of the
+    equality \p row so that the element at index \p col of \p row is
+    zero.
+  */
+  // A member of Grid for access to Matrix::rows.
+  static void reduce_equality_with_equality(Congruence& row,
+					    Congruence& pivot,
+					    dimension_type col);
+
+  //! Reduces \p row using \p pivot.
+  /*!
+    Uses the point, parameter or proper congruence at \p pivot to
+    change the representation of the point, parameter or proper
+    congruence at \p row so that the element at index \p col of \p row
+    is zero.  Only elements from index \p start to index \p end are
+    modified (i.e. it is assumed that all other elements are zero).
+  */
+  // Part of Grid for access to Matrix::rows.
+  template <typename R>
+  static void reduce_pc_with_pc(R& row,
+				R& pivot,
+				dimension_type col,
+				dimension_type start,
+				dimension_type end);
+
+  //! Reduce \p row using \p pivot.
+  /*!
+    Use the line \p pivot to change the representation of the
+    parameter \p row such that the element at index \p col of \p row
+    is zero.
+  */
+  // A member of Grid for access to Matrix::rows.
+  static void reduce_parameter_with_line(Grid_Generator& row,
+					 Grid_Generator& pivot,
+					 dimension_type col,
+					 Grid_Generator_System& sys);
+
+  //! Reduce \p row using \p pivot.
+  /*!
+    Use the equality \p pivot to change the representation of the
+    congruence \p row such that element at index \p col of \p row is
+    zero.
+  */
+  // A member of Grid for access to Matrix::rows.
+  static void reduce_congruence_with_equality(Congruence& row,
+					      Congruence& pivot,
+					      dimension_type col,
+					      Congruence_System& sys);
+
+  //! Reduce column \p dim in rows preceding \p pivot_index in \p sys.
+  /*!
+    Only consider from index \p start to index \p end of the row at \p
+    pivot_index.  Flag \p generators indicates whether \p sys is a
+    congruence or generator system.
+  */
+  template <typename M, typename R>
+  static void reduce_reduced(M& sys, dimension_type dim,
+			     dimension_type pivot_index,
+			     dimension_type start, dimension_type end,
+			     Dimension_Kinds& dim_kinds,
+			     bool generators = true);
+
+  //! Multiply the elements of \p dest by \p multiplier.
+  // A member of Grid for access to Matrix::rows and cgs::operator[].
+  static void multiply_grid(const Coefficient& multiplier,
+			    Congruence& cg, Congruence_System& dest,
+			    const dimension_type num_rows,
+			    const dimension_type num_dims);
+
+  //! Multiply the elements of \p dest by \p multiplier.
+  // A member of Grid for access to Grid_Generator::operator[].
+  static void multiply_grid(const Coefficient& multiplier, Grid_Generator& gen,
+			    Grid_Generator_System& dest, const dimension_type num_rows,
+			    const dimension_type num_dims);
+
+  /*! \brief
+    If \p sys is lower triangular return <CODE>true</CODE>, else
+    return <CODE>false</CODE>.
+  */
+  static bool lower_triangular(const Congruence_System& sys,
+			       const Dimension_Kinds& dim_kinds);
+
+  /*! \brief
+    If \p sys is upper triangular return <CODE>true</CODE>, else
+    return <CODE>false</CODE>.
+  */
+  static bool upper_triangular(const Grid_Generator_System& sys,
+			       const Dimension_Kinds& dim_kinds);
+
+#ifndef NDEBUG
+  //! Checks that trailing rows contain only zero terms.
+  /*!
+    If all columns contain zero in the rows of \p system from row
+    index \p first to row index \p last then return <code>true</code>,
+    else return <code>false</code>.  \p row_size gives the number of
+    columns in each row.
+
+    This method is only used in assertions in the simplify methods.
+  */
+  template <typename M, typename R>
+  static bool rows_are_zero(M& system,
+			    dimension_type first,
+			    dimension_type last,
+			    dimension_type row_size);
+#endif
+
+  //@} // Minimization-Related Static Member Functions
+
+  //! \name Exception Throwers
+  //@{
+protected:
+  void throw_runtime_error(const char* method) const;
+  void throw_invalid_argument(const char* method, const char* reason) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const char* other_name,
+				    dimension_type other_dim) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* gr_name,
+				    const Grid& gr) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* e_name,
+				    const Linear_Expression& e) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cg_name,
+				    const Congruence& cg) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* c_name,
+				    const Constraint& c) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* g_name,
+				    const Grid_Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cgs_name,
+				    const Congruence_System& cgs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* cs_name,
+				    const Constraint_System& cs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* gs_name,
+				    const Grid_Generator_System& gs) const;
+  void throw_dimension_incompatible(const char* method,
+				    const char* var_name,
+				    const Variable var) const;
+  void throw_dimension_incompatible(const char* method,
+				    dimension_type required_space_dim) const;
+
+  // Note: it has to be a static method, because it can be called inside
+  // constructors (before actually constructing the grid object).
+  static void throw_space_dimension_overflow(const char* method,
+					     const char* reason);
+
+  void throw_invalid_generator(const char* method,
+			       const char* g_name) const;
+  void throw_invalid_generators(const char* method,
+				const char* gs_name) const;
+  //@} // Exception Throwers
+
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid */
+void swap(Parma_Polyhedra_Library::Grid& x,
+	  Parma_Polyhedra_Library::Grid& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Grid_Status.inlines.hh line 1
+/* Grid::Status class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+inline
+Grid::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+inline bool
+Grid::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+inline bool
+Grid::Status::test_any(flags_t mask) const {
+  return flags & mask;
+}
+
+inline void
+Grid::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+inline void
+Grid::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+inline bool
+Grid::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+inline void
+Grid::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+inline void
+Grid::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+inline bool
+Grid::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+inline void
+Grid::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+inline void
+Grid::Status::set_empty() {
+  flags = EMPTY;
+}
+
+inline bool
+Grid::Status::test_c_up_to_date() const {
+  return test_any(C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_c_up_to_date() {
+  reset(C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_c_up_to_date() {
+  set(C_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_g_up_to_date() const {
+  return test_any(G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_g_up_to_date() {
+  reset(G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_g_up_to_date() {
+  set(G_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_c_minimized() const {
+  return test_any(C_MINIMIZED);
+}
+
+inline void
+Grid::Status::reset_c_minimized() {
+  reset(C_MINIMIZED);
+}
+
+inline void
+Grid::Status::set_c_minimized() {
+  set(C_MINIMIZED);
+}
+
+inline bool
+Grid::Status::test_g_minimized() const {
+  return test_any(G_MINIMIZED);
+}
+
+inline void
+Grid::Status::reset_g_minimized() {
+  reset(G_MINIMIZED);
+}
+
+inline void
+Grid::Status::set_g_minimized() {
+  set(G_MINIMIZED);
+}
+
+
+inline bool
+Grid::Status::test_c_pending() const {
+  return test_any(CS_PENDING);
+}
+
+inline void
+Grid::Status::reset_c_pending() {
+  reset(CS_PENDING);
+}
+
+inline void
+Grid::Status::set_c_pending() {
+  set(CS_PENDING);
+}
+
+inline bool
+Grid::Status::test_g_pending() const {
+  return test_any(GS_PENDING);
+}
+
+inline void
+Grid::Status::reset_g_pending() {
+  reset(GS_PENDING);
+}
+
+inline void
+Grid::Status::set_g_pending() {
+  set(GS_PENDING);
+}
+
+
+inline bool
+Grid::Status::test_sat_c_up_to_date() const {
+  return test_any(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_sat_c_up_to_date() {
+  reset(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_sat_c_up_to_date() {
+  set(SAT_C_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_sat_g_up_to_date() const {
+  return test_any(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_sat_g_up_to_date() {
+  reset(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_sat_g_up_to_date() {
+  set(SAT_G_UP_TO_DATE);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Grid.inlines.hh line 1
+/* Grid class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Grid.inlines.hh line 28
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Grid::max_space_dimension() {
+  using std::min;
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return min(std::numeric_limits<dimension_type>::max() - 1,
+	     min(Congruence_System::max_space_dimension(),
+		 Grid_Generator_System::max_space_dimension()
+		 )
+	     );
+}
+
+inline void
+Grid::set_congruences_up_to_date() {
+  status.set_c_up_to_date();
+}
+
+inline
+Grid::Grid(const Congruence_System& ccgs) {
+  if (ccgs.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(ccgs)",
+				   "the space dimension of ccgs "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+  construct(ccgs);
+}
+
+inline
+Grid::Grid(Congruence_System& cgs) {
+  if (cgs.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(cgs)",
+				   "the space dimension of cgs "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+  construct(cgs);
+}
+
+inline
+Grid::Grid(const Grid_Generator_System& gs) {
+  if (gs.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(gs)",
+				   "the space dimension of gs "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+  construct(gs);
+}
+
+inline
+Grid::Grid(Grid_Generator_System& gs) {
+  if (gs.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(gs)",
+				   "the space dimension of gs "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+  construct(gs);
+}
+
+inline
+Grid::~Grid() {
+}
+
+inline memory_size_type
+Grid::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline dimension_type
+Grid::space_dimension() const {
+  return space_dim;
+}
+
+inline void
+Grid::upper_bound_assign(const Grid& y) {
+  join_assign(y);
+}
+
+inline bool
+Grid::upper_bound_assign_if_exact(const Grid& y) {
+  return join_assign_if_exact(y);
+}
+
+inline void
+Grid::difference_assign(const Grid& y) {
+  grid_difference_assign(y);
+}
+
+inline void
+Grid::swap(Grid& y) {
+  std::swap(con_sys, y.con_sys);
+  std::swap(gen_sys, y.gen_sys);
+  std::swap(status, y.status);
+  std::swap(space_dim, y.space_dim);
+  std::swap(dim_kinds, y.dim_kinds);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::Grid */
+inline void
+std::swap(Parma_Polyhedra_Library::Grid& x,
+	  Parma_Polyhedra_Library::Grid& y) {
+  x.swap(y);
+}
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Grid::marked_empty() const {
+  return status.test_empty();
+}
+
+inline bool
+Grid::congruences_are_up_to_date() const {
+  return status.test_c_up_to_date();
+}
+
+inline bool
+Grid::generators_are_up_to_date() const {
+  return status.test_g_up_to_date();
+}
+
+inline bool
+Grid::congruences_are_minimized() const {
+  return status.test_c_minimized();
+}
+
+inline bool
+Grid::generators_are_minimized() const {
+  return status.test_g_minimized();
+}
+
+inline void
+Grid::set_generators_up_to_date() {
+  status.set_g_up_to_date();
+}
+
+inline void
+Grid::set_congruences_minimized() {
+  set_congruences_up_to_date();
+  status.set_c_minimized();
+}
+
+inline void
+Grid::set_generators_minimized() {
+  set_generators_up_to_date();
+  status.set_g_minimized();
+}
+
+inline void
+Grid::clear_empty() {
+  status.reset_empty();
+}
+
+inline void
+Grid::clear_congruences_minimized() {
+  status.reset_c_minimized();
+}
+
+inline void
+Grid::clear_generators_minimized() {
+  status.reset_g_minimized();
+}
+
+inline void
+Grid::clear_congruences_up_to_date() {
+  clear_congruences_minimized();
+  status.reset_c_up_to_date();
+  // Can get rid of con_sys here.
+}
+
+inline void
+Grid::clear_generators_up_to_date() {
+  clear_generators_minimized();
+  status.reset_g_up_to_date();
+  // Can get rid of gen_sys here.
+}
+
+inline bool
+Grid::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, "bounds_from_above(e)");
+}
+
+inline bool
+Grid::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, "bounds_from_below(e)");
+}
+
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+	       Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const {
+  return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum);
+}
+
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+	       Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+	       Grid_Generator& point) const {
+  return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum, &point);
+}
+
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+	       Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const {
+  return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum);
+}
+
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+	       Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+	       Grid_Generator& point) const {
+  return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum, &point);
+}
+
+/*! \relates Grid */
+inline bool
+operator!=(const Grid& x, const Grid& y) {
+  return !(x == y);
+}
+
+inline bool
+Grid::strictly_contains(const Grid& y) const {
+  const Grid& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+inline void
+Grid::topological_closure_assign() {
+  return;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Grid.templates.hh line 1
+/* Grid class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Grid.templates.hh line 29
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Box>
+Grid::Grid(const Box& box, From_Bounding_Box dummy)
+  : con_sys(),
+    gen_sys(NECESSARILY_CLOSED) {
+  used(dummy);
+
+  if (box.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(box, from_bounding_box)",
+				   "the space dimension of box "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+
+  space_dim = box.space_dimension();
+
+  TEMP_INTEGER(l_n);
+  TEMP_INTEGER(l_d);
+
+  // Check that all bounds are closed.  This must be done before the
+  // empty check below, in case an open bound makes the grid empty.
+  for (dimension_type k = space_dim; k-- > 0; ) {
+    bool closed;
+    // FIXME: Perhaps introduce box::is_bounded_and_closed.
+    if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+    if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+  }
+
+  if (box.is_empty()) {
+    // Empty grid.
+    set_empty();
+    assert(OK());
+    return;
+  }
+
+  if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    // Initialize the space dimension as indicated by the box.
+    con_sys.increase_space_dimension(space_dim);
+    // Add congruences according to `box'.
+    TEMP_INTEGER(u_n);
+    TEMP_INTEGER(u_d);
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      bool closed;
+      // TODO: Consider producing the system(s) in minimized form.
+      // FIXME: Also create the generator system.
+      if (box.get_lower_bound(k, closed, l_n, l_d)) {
+	if (box.get_upper_bound(k, closed, u_n, u_d))
+	  if (l_n * u_d == u_n * l_d) {
+	    // A point interval sets dimension k of every point to a
+	    // single value.
+	    con_sys.insert(l_d * Variable(k) == l_n);
+	    continue;
+	  }
+	// The only valid bounded interval is a point interval.
+	throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+      }
+      else if (box.get_upper_bound(k, closed, u_n, u_d))
+	// An interval can only be a point or the universe.
+	throw_invalid_argument("Grid(box, from_covering_box)",
+			       "box");
+      // A universe interval allows any value in dimension k.
+    }
+    set_congruences_up_to_date();
+    gen_sys.unset_pending_rows();
+    gen_sys.set_sorted(false);
+  }
+
+  assert(OK());
+}
+
+template <typename Box>
+Grid::Grid(const Box& box, From_Covering_Box dummy)
+  : con_sys(),
+    gen_sys(NECESSARILY_CLOSED) {
+  used(dummy);
+
+  if (box.space_dimension() > max_space_dimension())
+    throw_space_dimension_overflow("Grid(box, from_covering_box)",
+				   "the space dimension of box "
+				   "exceeds the maximum allowed "
+				   "space dimension");
+
+  space_dim = box.space_dimension();
+
+  TEMP_INTEGER(l_n);
+  TEMP_INTEGER(l_d);
+
+  // Check that all bounds are closed.  This must be done before the
+  // empty check below, in case an open bound makes the grid empty.
+  for (dimension_type k = space_dim; k-- > 0; ) {
+    bool closed;
+    // FIXME: Perhaps introduce box::is_bounded_and_closed.
+    if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("Grid(box, from_covering_box)", "box");
+    if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("Grid(box, from_covering_box)", "box");
+  }
+
+  if (box.is_empty()) {
+    // Empty grid.
+    set_empty();
+    assert(OK());
+    return;
+  }
+
+  if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    // Initialize the space dimension as indicated by the box.
+    con_sys.increase_space_dimension(space_dim);
+    // Add congruences according to `box'.
+    TEMP_INTEGER(u_n);
+    TEMP_INTEGER(u_d);
+    TEMP_INTEGER(d);
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      bool closed;
+      // TODO: Consider producing the system(s) in minimized form.
+      // FIXME: Also create the generator system.
+      if (box.get_lower_bound(k, closed, l_n, l_d)) {
+	if (box.get_upper_bound(k, closed, u_n, u_d)) {
+	  if (l_n * u_d == u_n * l_d)
+	    // A point interval allows any point along the dimension
+	    // k axis.
+	    continue;
+	  gcd_assign(d, l_d, u_d);
+	  // `d' is the gcd of the divisors.
+	  l_n *= (u_d / d);
+	  d = l_d / d;
+	  // `d' is now the smallest integer expression of the size
+	  // of l_d relative to u_d.  `d * u_d' is the lcm of the
+	  // divisors.
+	  con_sys.insert((d * u_d * Variable(k) %= l_n) / ((u_n * d) - l_n));
+	}
+	else
+	  // An interval bounded only from below produces an
+	  // equality.
+	  con_sys.insert(l_d * Variable(k) == l_n);
+      }
+      else
+	if (box.get_upper_bound(k, closed, u_n, u_d))
+	  // An interval bounded only from above produces an equality.
+	  con_sys.insert(u_d * Variable(k) == u_n);
+	else {
+	  // Any universe interval produces an empty grid.
+	  set_empty();
+	  assert(OK());
+	  return;
+	}
+    }
+    set_congruences_up_to_date();
+    gen_sys.set_sorted(false);
+    gen_sys.unset_pending_rows();
+  }
+
+  assert(OK());
+}
+
+template <typename Box>
+void
+Grid::shrink_bounding_box(Box& box) const {
+  // Dimension-compatibility check.
+  if (space_dim > box.space_dimension())
+    throw_dimension_incompatible("shrink_bounding_box(box)", "box",
+				 box.space_dimension());
+
+  TEMP_INTEGER(l_n);
+  TEMP_INTEGER(l_d);
+
+  // Check that all bounds are closed.
+  for (dimension_type k = space_dim; k-- > 0; ) {
+    bool closed;
+    // FIXME: Perhaps introduce box::is_bounded_and_closed.
+    if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("shrink_bounding_box(box)", "box");
+    if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+      throw_invalid_argument("shrink_bounding_box(box)", "box");
+  }
+
+  if (marked_empty()) {
+    box.set_empty();
+    return;
+  }
+  if (space_dim == 0)
+    return;
+  if (!generators_are_up_to_date() && !update_generators()) {
+    // Updating found the grid empty.
+    box.set_empty();
+    return;
+  }
+
+  assert(gen_sys.num_generators() > 0);
+
+  dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
+  dimension_type num_rows = gen_sys.num_generators();
+
+  // Create a vector to record which dimensions are bounded.
+  std::vector<bool> bounded_interval(num_dims, true);
+
+  const Grid_Generator *first_point = NULL;
+  // Clear the bound flag in `bounded_interval' for all dimensions in
+  // which a line or sequence of points extends away from a single
+  // value in the dimension.
+  for (dimension_type row = 0; row < num_rows; ++row) {
+    Grid_Generator& gen = const_cast<Grid_Generator&>(gen_sys[row]);
+    if (gen.is_point()) {
+      if (first_point == NULL) {
+	first_point = &gen_sys[row];
+	continue;
+      }
+      const Grid_Generator& point = *first_point;
+      // Convert the point `gen' to a parameter.
+      for (dimension_type dim = 0; dim < num_dims; ++dim)
+	gen[dim] -= point[dim];
+      gen.divisor() = point.divisor();
+    }
+    for (dimension_type col = num_dims; col > 0; )
+      if (gen[col--] != 0)
+	bounded_interval[col] = false;
+  }
+
+  // Attempt to set both bounds of each boundable interval to the
+  // value of the associated coefficient in the point.
+  const Grid_Generator& point = *first_point;
+  TEMP_INTEGER(divisor);
+  TEMP_INTEGER(gcd);
+  TEMP_INTEGER(bound);
+  TEMP_INTEGER(reduced_divisor);
+  divisor = point.divisor();
+  for (dimension_type dim = 0; dim < num_dims; ++dim)
+    if (bounded_interval[dim]) {
+      // Reduce the bound fraction first.
+      gcd_assign(gcd, point[dim+1], divisor);
+      exact_div_assign(bound, point[dim+1], gcd);
+      exact_div_assign(reduced_divisor, divisor, gcd);
+      box.raise_lower_bound(dim, true, bound, reduced_divisor);
+      box.lower_upper_bound(dim, true, bound, reduced_divisor);
+    }
+}
+
+template <typename Box>
+void
+Grid::get_covering_box(Box& box) const {
+  // Dimension-compatibility check.
+  if (space_dim > box.space_dimension())
+    throw_dimension_incompatible("get_covering_box(box)", "box",
+				 box.space_dimension());
+
+  Box new_box(box.space_dimension());
+
+  if (marked_empty()) {
+    box = new_box;
+    box.set_empty();
+    return;
+  }
+  if (space_dim == 0) {
+    return;
+  }
+  if (!generators_are_up_to_date() && !update_generators()) {
+    // Updating found the grid empty.
+    box = new_box;
+    box.set_empty();
+    return;
+  }
+
+  assert(gen_sys.num_generators() > 0);
+
+  dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
+  dimension_type num_rows = gen_sys.num_generators();
+
+  TEMP_INTEGER(divisor);
+  TEMP_INTEGER(gcd);
+  TEMP_INTEGER(bound);
+  TEMP_INTEGER(reduced_divisor);
+
+  if (num_rows > 1) {
+    Row interval_sizes(num_dims, Row::Flags());
+    std::vector<bool> interval_emptiness(num_dims, false);
+
+    // Store in `interval_sizes', for each column (that is, for each
+    // dimension), the GCD of all the values in that column where the
+    // row is of type parameter.
+
+    for (dimension_type dim = num_dims; dim-- > 0; )
+      interval_sizes[dim] = 0;
+    const Grid_Generator *first_point = NULL;
+    for (dimension_type row = 0; row < num_rows; ++row) {
+      Grid_Generator& gen = const_cast<Grid_Generator&>(gen_sys[row]);
+      if (gen.is_line()) {
+	for (dimension_type dim = 0; dim < num_dims; ++dim)
+	  if (!interval_emptiness[dim] && gen[dim+1] != 0) {
+	    // Empty interval, set both bounds for associated
+      	    // dimension to zero.
+	    new_box.lower_upper_bound(dim, true, 0, 1);
+	    new_box.raise_lower_bound(dim, true, 0, 1);
+	    interval_emptiness[dim] = true;
+	  }
+	continue;
+      }
+      if (gen.is_point()) {
+	if (first_point == NULL) {
+	  first_point = &gen_sys[row];
+	  continue;
+	}
+	const Grid_Generator& point = *first_point;
+	// Convert the point `gen' to a parameter.
+	for (dimension_type dim = 0; dim <= num_dims; ++dim)
+	  gen[dim] -= point[dim];
+	gen.divisor() = point.divisor();
+      }
+      for (dimension_type dim = 0; dim < num_dims; ++dim)
+	if (!interval_emptiness[dim])
+	  gcd_assign(interval_sizes[dim], interval_sizes[dim], gen[dim+1]);
+    }
+
+    // For each dimension set the lower bound of the interval to the
+    // grid value closest to the origin, and the upper bound to the
+    // addition of the lower bound and the shortest distance in the
+    // given dimension between any two grid points.
+    const Grid_Generator& point = *first_point;
+    divisor = point.divisor();
+    TEMP_INTEGER(lower_bound);
+    for (dimension_type dim = 0; dim < num_dims; ++dim) {
+      if (interval_emptiness[dim])
+	continue;
+
+      lower_bound = point[dim+1];
+
+      // If the interval size is zero then all points have the same
+      // value in this dimension, so set only the lower bound.
+      if (interval_sizes[dim] != 0) {
+	// Make the lower bound as close as possible to the origin,
+	// leaving the sign the same.
+	lower_bound %= interval_sizes[dim];
+	// Check if the lowest value the other side of the origin is
+	// closer to the origin, prefering the lowest positive if they
+	// are equal.
+	if (lower_bound > 0) {
+	  if (interval_sizes[dim] - lower_bound < lower_bound)
+	    lower_bound -= interval_sizes[dim];
+	}
+	else if (lower_bound < 0
+		 && interval_sizes[dim] + lower_bound < - lower_bound)
+	  lower_bound += interval_sizes[dim];
+
+	// Reduce the bound fraction first.
+	bound = interval_sizes[dim] + lower_bound;
+	gcd_assign(gcd, bound, divisor);
+	exact_div_assign(bound, bound, gcd);
+	exact_div_assign(reduced_divisor, divisor, gcd);
+	new_box.lower_upper_bound(dim, true, bound, reduced_divisor);
+      }
+
+      // Reduce the bound fraction first.
+      gcd_assign(gcd, lower_bound, divisor);
+      exact_div_assign(lower_bound, lower_bound, gcd);
+      exact_div_assign(reduced_divisor, divisor, gcd);
+      new_box.raise_lower_bound(dim, true, lower_bound, reduced_divisor);
+    }
+  }
+  else {
+    const Grid_Generator& point = gen_sys[0];
+    divisor = point.divisor();
+    // The covering box of a single point has only lower bounds.
+    for (dimension_type dim = 0; dim < num_dims; ++dim) {
+      // Reduce the bound fraction first.
+      gcd_assign(gcd, point[dim+1], divisor);
+      exact_div_assign(bound, point[dim+1], gcd);
+      exact_div_assign(reduced_divisor, divisor, gcd);
+      new_box.raise_lower_bound(dim, true, bound, reduced_divisor);
+    }
+  }
+
+  box = new_box;
+}
+
+template <typename Partial_Function>
+void
+Grid::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the grid becomes zero_dimensional.
+    if (marked_empty()
+	|| (!generators_are_up_to_date() && !update_generators())) {
+      // Removing all dimensions from the empty grid.
+      space_dim = 0;
+      set_empty();
+    }
+    else
+      // Removing all dimensions from a non-empty grid.
+      set_zero_dim_univ();
+
+    assert(OK());
+    return;
+  }
+
+  dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+  if (new_space_dimension == space_dim) {
+    // The partial function `pfunc' is indeed total and thus specifies
+    // a permutation, that is, a renaming of the dimensions.  For
+    // maximum efficiency, we will simply permute the columns of the
+    // constraint system and/or the generator system.
+
+    // We first compute suitable permutation cycles for the columns of
+    // the `con_sys' and `gen_sys' matrices.  We will represent them
+    // with a linear array, using 0 as a terminator for each cycle
+    // (notice that the columns with index 0 of `con_sys' and
+    // `gen_sys' represent the inhomogeneous terms, and thus are
+    // unaffected by the permutation of dimensions).
+    // Cycles of length 1 will be omitted so that, in the worst case,
+    // we will have `space_dim' elements organized in `space_dim/2'
+    // cycles, which means we will have at most `space_dim/2'
+    // terminators.
+    std::vector<dimension_type> cycles;
+    cycles.reserve(space_dim + space_dim/2);
+
+    // Used to mark elements as soon as they are inserted in a cycle.
+    std::deque<bool> visited(space_dim);
+
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      if (!visited[i]) {
+	dimension_type j = i;
+	do {
+	  visited[j] = true;
+	  dimension_type k;
+	  (void) pfunc.maps(j, k);
+	  if (k == j)
+	    // Cycle of length 1: skip it.
+	    goto skip;
+
+	  cycles.push_back(j+1);
+	  // Go along the cycle.
+	  j = k;
+	} while (!visited[j]);
+	// End of cycle: mark it.
+	cycles.push_back(0);
+      skip:
+	;
+      }
+    }
+
+    // If `cycles' is empty then `pfunc' is the identity.
+    if (cycles.empty())
+      return;
+
+    // Permute all that is up-to-date.
+    if (congruences_are_up_to_date()) {
+      con_sys.permute_columns(cycles);
+      clear_congruences_minimized();
+    }
+
+    if (generators_are_up_to_date()) {
+      gen_sys.permute_columns(cycles);
+      clear_generators_minimized();
+    }
+
+    assert(OK());
+    return;
+  }
+
+  // If control gets here, then `pfunc' is not a permutation and some
+  // dimensions must be projected away.
+
+  const Grid_Generator_System& old_gensys = generators();
+
+  if (old_gensys.num_generators() == 0) {
+    // The grid is empty.
+    Grid new_grid(new_space_dimension, EMPTY);
+    std::swap(*this, new_grid);
+    assert(OK());
+    return;
+  }
+
+  // Make a local copy of the partial function.
+  std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+  for (dimension_type j = space_dim; j-- > 0; ) {
+    dimension_type pfunc_j;
+    if (pfunc.maps(j, pfunc_j))
+      pfunc_maps[j] = pfunc_j;
+  }
+
+  Grid_Generator_System new_gensys;
+  // Set sortedness, for the assertion met via gs::insert.
+  new_gensys.set_sorted(false);
+  // Get the divisor of the first point.
+  Grid_Generator_System::const_iterator i;
+  Grid_Generator_System::const_iterator old_gensys_end = old_gensys.end();
+  for (i = old_gensys.begin(); i != old_gensys_end; ++i)
+    if (i->is_point())
+      break;
+  assert(i != old_gensys_end);
+  Coefficient_traits::const_reference system_divisor = i->divisor();
+  for (Grid_Generator_System::const_iterator i = old_gensys.begin();
+       i != old_gensys_end;
+       ++i) {
+    const Grid_Generator& old_g = *i;
+    Linear_Expression e(0 * Variable(new_space_dimension-1));
+    bool all_zeroes = true;
+    for (dimension_type j = space_dim; j-- > 0; ) {
+      if (old_g.coefficient(Variable(j)) != 0
+	  && pfunc_maps[j] != not_a_dimension()) {
+	e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j));
+	all_zeroes = false;
+      }
+    }
+    switch (old_g.type()) {
+    case Grid_Generator::LINE:
+      if (!all_zeroes)
+	new_gensys.insert(grid_line(e));
+      break;
+    case Grid_Generator::PARAMETER:
+      if (!all_zeroes)
+	new_gensys.insert(parameter(e, system_divisor));
+      break;
+    case Grid_Generator::POINT:
+      new_gensys.insert(grid_point(e, old_g.divisor()));
+      break;
+    case Grid_Generator::CLOSURE_POINT:
+    default:
+      assert(0);
+    }
+  }
+
+  Grid new_grid(new_gensys);
+  std::swap(*this, new_grid);
+
+  assert(OK(true));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Grid.defs.hh line 2484
+
+// Automatically generated from PPL source file ../src/C_Polyhedron.defs.hh line 1
+/* C_Polyhedron class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/C_Polyhedron.defs.hh line 29
+
+//! A closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+    An object of the class C_Polyhedron represents a
+    <EM>topologically closed</EM> convex polyhedron
+    in the vector space \f$\Rset^n\f$.
+
+    When building a closed polyhedron starting from
+    a system of constraints, an exception is thrown if the system
+    contains a <EM>strict inequality</EM> constraint.
+    Similarly, an exception is thrown when building a closed polyhedron
+    starting from a system of generators containing a <EM>closure point</EM>.
+
+    \note
+    Such an exception will be obtained even if the system of
+    constraints (resp., generators) actually defines
+    a topologically closed subset of the vector space, i.e.,
+    even if all the strict inequalities (resp., closure points)
+    in the system happen to be redundant with respect to the
+    system obtained by removing all the strict inequality constraints
+    (resp., all the closure points).
+    In contrast, when building a closed polyhedron starting from
+    an object of the class NNC_Polyhedron,
+    the precise topological closure test will be performed.
+*/
+
+class Parma_Polyhedra_Library::C_Polyhedron : public Polyhedron {
+public:
+  //! Builds either the universe or the empty C polyhedron.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the C polyhedron;
+
+    \param kind
+    Specifies whether a universe or an empty C polyhedron should be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+
+    Both parameters are optional:
+    by default, a 0-dimension space universe C polyhedron is built.
+  */
+  explicit C_Polyhedron(dimension_type num_dimensions = 0,
+			Degenerate_Element kind = UNIVERSE);
+
+  //! Builds a C polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of constraints contains strict inequalities.
+  */
+  explicit C_Polyhedron(const Constraint_System& cs);
+
+  //! Builds a C polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of constraints contains strict inequalities.
+  */
+  explicit C_Polyhedron(Constraint_System& cs);
+
+  //! Builds a C polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points,
+    or if it contains closure points.
+  */
+  explicit C_Polyhedron(const Generator_System& gs);
+
+  //! Builds a C polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points,
+    or if it contains closure points.
+  */
+  explicit C_Polyhedron(Generator_System& gs);
+
+  //! Builds a C polyhedron from a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+  */
+  explicit C_Polyhedron(const Congruence_System& cgs);
+
+  //! Builds an C polyhedron recycling a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence
+    system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+  */
+  explicit C_Polyhedron(Congruence_System& cgs);
+
+  /*! \brief
+    Builds a C polyhedron representing the topological closure
+    of the NNC polyhedron \p y.
+  */
+  explicit C_Polyhedron(const NNC_Polyhedron& y);
+
+  //! Builds a C polyhedron out of a generic, interval-based bounding box.
+  /*!
+    For a description of the methods that should be provided by
+    the template class Box, see the documentation of the protected method:
+      template \<typename Box\>
+      Polyhedron::Polyhedron(Topology topol, const Box& box);
+
+    \param box
+    The bounding box representing the polyhedron to be built;
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one from the other
+    constructors.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum allowed
+    space dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p box has intervals that are not topologically closed
+    (i.e., having some finite but open bounds).
+  */
+  template <typename Box>
+  C_Polyhedron(const Box& box, From_Bounding_Box dummy);
+
+  //! Ordinary copy-constructor.
+  C_Polyhedron(const C_Polyhedron& y);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  C_Polyhedron& operator=(const C_Polyhedron& y);
+
+  //! Assigns to \p *this the topological closure of the NNC polyhedron \p y.
+  C_Polyhedron& operator=(const NNC_Polyhedron& y);
+
+  //! Destructor.
+  ~C_Polyhedron();
+
+  /*! \brief
+    If the poly-hull of \p *this and \p y is exact it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool poly_hull_assign_if_exact(const C_Polyhedron& y);
+
+  //! Same as poly_hull_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const C_Polyhedron& y);
+};
+
+// Automatically generated from PPL source file ../src/C_Polyhedron.inlines.hh line 1
+/* C_Polyhedron class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+C_Polyhedron::C_Polyhedron(dimension_type num_dimensions,
+			   Degenerate_Element kind)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       num_dimensions <= max_space_dimension()
+	       ? num_dimensions
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(n, k)",
+						 "n exceeds the maximum "
+						 "allowed space dimension"),
+		  num_dimensions),
+	       kind) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Constraint_System& cs)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       cs.space_dimension() <= max_space_dimension()
+	       ? cs
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(cs)",
+						 "the space dimension of cs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), cs)) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Constraint_System& cs)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       cs.space_dimension() <= max_space_dimension()
+	       ? cs
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(cs)",
+						 "the space dimension of cs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), cs)) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Generator_System& gs)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       gs.space_dimension() <= max_space_dimension()
+	       ? gs
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(cs)",
+						 "the space dimension of gs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), gs)){
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Generator_System& gs)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       gs.space_dimension() <= max_space_dimension()
+	       ? gs
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(cs)",
+						 "the space dimension of gs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), gs)){
+}
+
+template <typename Box>
+inline
+C_Polyhedron::C_Polyhedron(const Box& box, From_Bounding_Box)
+  : Polyhedron(NECESSARILY_CLOSED,
+	       box.space_dimension() <= max_space_dimension()
+	       ? box
+	       : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+						 "C_Polyhedron(box): ",
+						 "the space dimension of box "
+						 "exceeds the maximum allowed "
+						 "space dimension"), box)) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const C_Polyhedron& y)
+  : Polyhedron(y) {
+}
+
+inline C_Polyhedron&
+C_Polyhedron::operator=(const C_Polyhedron& y) {
+  Polyhedron::operator=(y);
+  return *this;
+}
+
+inline C_Polyhedron&
+C_Polyhedron::operator=(const NNC_Polyhedron& y) {
+  C_Polyhedron c_y(y);
+  swap(c_y);
+  return *this;
+}
+
+inline
+C_Polyhedron::~C_Polyhedron() {
+}
+
+inline bool
+C_Polyhedron::upper_bound_assign_if_exact(const C_Polyhedron& y) {
+  return poly_hull_assign_if_exact(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/C_Polyhedron.defs.hh line 212
+
+// Automatically generated from PPL source file ../src/NNC_Polyhedron.defs.hh line 1
+/* NNC_Polyhedron class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/NNC_Polyhedron.defs.hh line 29
+
+//! A not necessarily closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+    An object of the class NNC_Polyhedron represents a
+    <EM>not necessarily closed</EM> (NNC) convex polyhedron
+    in the vector space \f$\Rset^n\f$.
+
+    \note
+    Since NNC polyhedra are a generalization of closed polyhedra,
+    any object of the class C_Polyhedron can be (explicitly) converted
+    into an object of the class NNC_Polyhedron.
+    The reason for defining two different classes is that objects of
+    the class C_Polyhedron are characterized by a more efficient
+    implementation, requiring less time and memory resources.
+*/
+class Parma_Polyhedra_Library::NNC_Polyhedron : public Polyhedron {
+public:
+  //! Builds either the universe or the empty NNC polyhedron.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the NNC polyhedron;
+
+    \param kind
+    Specifies whether a universe or an empty NNC polyhedron should be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+
+    Both parameters are optional:
+    by default, a 0-dimension space universe NNC polyhedron is built.
+  */
+  explicit NNC_Polyhedron(dimension_type num_dimensions = 0,
+			  Degenerate_Element kind = UNIVERSE);
+
+  //! Builds an NNC polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.
+  */
+  explicit NNC_Polyhedron(const Constraint_System& cs);
+
+  //! Builds an NNC polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+  */
+  explicit NNC_Polyhedron(Constraint_System& cs);
+
+  //! Builds an NNC polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit NNC_Polyhedron(const Generator_System& gs);
+
+  //! Builds an NNC polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit NNC_Polyhedron(Generator_System& gs);
+
+  //! Builds an NNC polyhedron from a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+  */
+  explicit NNC_Polyhedron(const Congruence_System& cgs);
+
+  //! Builds an NNC polyhedron recycling a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence
+    system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures will be
+    recycled to build the polyhedron.
+  */
+  explicit NNC_Polyhedron(Congruence_System& cgs);
+
+  //! Builds an NNC polyhedron from the C polyhedron \p y.
+  explicit NNC_Polyhedron(const C_Polyhedron& y);
+
+  //! Builds an NNC polyhedron out of a generic, interval-based bounding box.
+  /*!
+    For a description of the methods that should be provided by
+    the template class Box, see the documentation of the protected method:
+      template \<typename Box\>
+      Polyhedron::Polyhedron(Topology topol, const Box& box);
+
+    \param box
+    The bounding box representing the polyhedron to be built;
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one from the other
+    constructors.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum allowed
+    space dimension.
+  */
+  template <typename Box>
+  NNC_Polyhedron(const Box& box, From_Bounding_Box dummy);
+
+  //! Ordinary copy-constructor.
+  NNC_Polyhedron(const NNC_Polyhedron& y);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  NNC_Polyhedron& operator=(const NNC_Polyhedron& y);
+
+  //! Assigns to \p *this the C polyhedron \p y.
+  NNC_Polyhedron& operator=(const C_Polyhedron& y);
+
+  //! Destructor.
+  ~NNC_Polyhedron();
+
+  /*! \brief
+    If the poly-hull of \p *this and \p y is exact it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool poly_hull_assign_if_exact(const NNC_Polyhedron& y);
+
+  //! Same as poly_hull_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const NNC_Polyhedron& y);
+};
+
+// Automatically generated from PPL source file ../src/NNC_Polyhedron.inlines.hh line 1
+/* NNC_Polyhedron class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/NNC_Polyhedron.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(dimension_type num_dimensions,
+			       Degenerate_Element kind)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       num_dimensions <= max_space_dimension()
+	       ? num_dimensions
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(n, k)",
+						 "n exceeds the maximum "
+						 "allowed space dimension"),
+		  num_dimensions),
+	       kind) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       cs.space_dimension() <= max_space_dimension()
+	       ? cs
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(cs)",
+						 "the space dimension of cs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), cs)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       cs.space_dimension() <= max_space_dimension()
+	       ? cs
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(cs)",
+						 "the space dimension of cs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), cs)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       gs.space_dimension() <= max_space_dimension()
+	       ? gs
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(gs)",
+						 "the space dimension of gs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), gs)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       gs.space_dimension() <= max_space_dimension()
+	       ? gs
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(gs)",
+						 "the space dimension of gs "
+						 "exceeds the maximum allowed "
+						 "space dimension"), gs)) {
+}
+
+template <typename Box>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Box& box, From_Bounding_Box)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+	       box.space_dimension() <= max_space_dimension()
+	       ? box
+	       : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+						 "NNC_Polyhedron(box)",
+						 "the space dimension of box "
+						 "exceeds the maximum allowed "
+						 "space dimension"), box)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const NNC_Polyhedron& y)
+  : Polyhedron(y) {
+}
+
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const NNC_Polyhedron& y) {
+  Polyhedron::operator=(y);
+  return *this;
+}
+
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const C_Polyhedron& y) {
+  NNC_Polyhedron nnc_y(y);
+  swap(nnc_y);
+  return *this;
+}
+
+inline
+NNC_Polyhedron::~NNC_Polyhedron() {
+}
+
+inline bool
+NNC_Polyhedron::upper_bound_assign_if_exact(const NNC_Polyhedron& y) {
+  return poly_hull_assign_if_exact(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/NNC_Polyhedron.defs.hh line 186
+
+// Automatically generated from PPL source file ../src/Widening_Function.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+class Widening_Function;
+
+template <typename PH, typename CS>
+class Limited_Widening_Function;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Widening_Function.defs.hh line 1
+/* Widening_Function class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Widening_Function.defs.hh line 28
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+class Parma_Polyhedra_Library::Widening_Function {
+public:
+  //! The (parametric) type of a widening method.
+  typedef void (PH::* Widening_Method)(const PH&, unsigned*);
+
+  //! Explicit unary constructor.
+  explicit
+  Widening_Function(Widening_Method wm);
+
+  //! Function-application operator.
+  /*!
+    Computes <CODE>(x.*wm)(y, tp)</CODE>, where \p wm is the widening
+    method stored at construction time.
+  */
+  void operator()(PH& x, const PH& y, unsigned* tp = 0) const;
+
+private:
+  //! The widening method.
+  Widening_Method w_method;
+};
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a limited widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH, typename CS>
+class Parma_Polyhedra_Library::Limited_Widening_Function {
+public:
+  //! The (parametric) type of a limited widening method.
+  typedef void (PH::* Limited_Widening_Method)(const PH&,
+					       const CS&,
+					       unsigned*);
+
+  //! Constructor.
+  /*!
+    \param lwm
+    The limited widening method.
+
+    \param cs
+    The constraint system limiting the widening.
+  */
+  Limited_Widening_Function(Limited_Widening_Method lwm,
+			    const CS& cs);
+
+  //! Function-application operator.
+  /*!
+    Computes <CODE>(x.*lwm)(y, cs, tp)</CODE>, where \p lwm and \p cs
+    are the limited widening method and the constraint system stored
+    at construction time.
+  */
+  void operator()(PH& x, const PH& y, unsigned* tp = 0) const;
+
+private:
+  //! The limited widening method.
+  Limited_Widening_Method lw_method;
+  //! A constant reference to the constraint system limiting the widening.
+  const CS& limiting_cs;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Wraps a widening method into a function object.
+/*!
+  \relates Polyhedra_Powerset
+
+  \param wm
+  The widening method.
+*/
+template <typename PH>
+Widening_Function<PH>
+widen_fun_ref(void (PH::* wm)(const PH&, unsigned*));
+
+//! Wraps a limited widening method into a function object.
+/*!
+  \relates Polyhedra_Powerset
+
+  \param lwm
+  The limited widening method.
+
+  \param cs
+  The constraint system limiting the widening.
+*/
+template <typename PH, typename CS>
+Limited_Widening_Function<PH, CS>
+widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
+	      const CS& cs);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Widening_Function.inlines.hh line 1
+/* Widening_Function class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+Widening_Function<PH>::Widening_Function(Widening_Method wm)
+  : w_method(wm) {
+}
+
+template <typename PH>
+inline void
+Widening_Function<PH>::
+operator()(PH& x, const PH& y, unsigned* tp) const {
+  (x.*w_method)(y, tp);
+}
+
+template <typename PH, typename CS>
+Limited_Widening_Function<PH, CS>::
+Limited_Widening_Function(Limited_Widening_Method lwm,
+			  const CS& cs)
+  : lw_method(lwm), limiting_cs(cs) {
+}
+
+template <typename PH, typename CS>
+inline void
+Limited_Widening_Function<PH, CS>::
+operator()(PH& x, const PH& y, unsigned* tp) const {
+  (x.*lw_method)(y, limiting_cs, tp);
+}
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH>
+inline Widening_Function<PH>
+widen_fun_ref(void (PH::* wm)(const PH&, unsigned*)) {
+  return Widening_Function<PH>(wm);
+}
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH, typename CS>
+inline Limited_Widening_Function<PH, CS>
+widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
+	      const CS& cs) {
+  return Limited_Widening_Function<PH, CS>(lwm, cs);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+// Automatically generated from PPL source file ../src/Widening_Function.defs.hh line 125
+
+// Automatically generated from PPL source file ../src/Ptr_Iterator.defs.hh line 1
+/* Ptr_Iterator class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Ptr_Iterator.defs.hh line 27
+#include <iterator>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template<typename Q, typename R>
+bool operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+typename Ptr_Iterator<Q>::difference_type operator-(const Ptr_Iterator<Q>& x,
+						    const Ptr_Iterator<R>& y);
+
+template<typename P>
+Ptr_Iterator<P> operator+(typename Ptr_Iterator<P>::difference_type m,
+			  const Ptr_Iterator<P>& y);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class to define STL const and non-const iterators from pointer types.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename P>
+class Parma_Polyhedra_Library::Implementation::Ptr_Iterator
+  : public std::iterator<typename std::iterator_traits<P>::iterator_category,
+			 typename std::iterator_traits<P>::value_type,
+			 typename std::iterator_traits<P>::difference_type,
+			 typename std::iterator_traits<P>::pointer,
+			 typename std::iterator_traits<P>::reference> {
+public:
+  typedef typename std::iterator_traits<P>::difference_type difference_type;
+  typedef typename std::iterator_traits<P>::reference reference;
+  typedef typename std::iterator_traits<P>::pointer pointer;
+
+  //! Default constructor: no guarantees.
+  Ptr_Iterator();
+
+  //! Construct an iterator pointing at \p q.
+  explicit Ptr_Iterator(const P& q);
+
+  /*! \brief
+    Copy-constructor allowing the construction of a const_iterator
+    from a non-const iterator.
+  */
+  template<typename Q>
+  Ptr_Iterator(const Ptr_Iterator<Q>& q);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect member selector.
+  pointer operator->() const;
+
+  //! Subscript operator.
+  reference operator[](const difference_type m) const;
+
+  //! Prefix increment operator.
+  Ptr_Iterator& operator++();
+
+  //! Postfix increment operator.
+  Ptr_Iterator operator++(int);
+
+  //! Prefix decrement operator
+  Ptr_Iterator& operator--();
+
+  //! Postfix decrement operator.
+  Ptr_Iterator operator--(int);
+
+  //! Assignment-increment operator.
+  Ptr_Iterator& operator+=(const difference_type m);
+
+  //! Assignment-decrement operator.
+  Ptr_Iterator& operator-=(const difference_type m);
+
+  //! Returns the difference between \p *this and \p y.
+  difference_type operator-(const Ptr_Iterator& y) const;
+
+  //! Returns the sum of \p *this and \p m.
+  Ptr_Iterator operator+(const difference_type m) const;
+
+  //! Returns the difference of \p *this and \p m.
+  Ptr_Iterator operator-(const difference_type m) const;
+
+private:
+  //! The base pointer implementing the iterator.
+  P p;
+
+  //! Returns the hidden pointer.
+  const P& base() const;
+
+  template <typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template <typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend typename Ptr_Iterator<Q>::difference_type
+  Parma_Polyhedra_Library::Implementation::
+  operator-(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  friend Ptr_Iterator<P>
+  Parma_Polyhedra_Library::Implementation::
+  operator+<>(typename Ptr_Iterator<P>::difference_type m,
+	      const Ptr_Iterator<P>& y);
+};
+
+// Automatically generated from PPL source file ../src/Ptr_Iterator.inlines.hh line 1
+/* Ptr_Iterator class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+inline const P&
+Ptr_Iterator<P>::base() const {
+  return p;
+}
+
+template <typename P>
+inline
+Ptr_Iterator<P>::Ptr_Iterator()
+  : p(P()) {
+}
+
+template <typename P>
+inline
+Ptr_Iterator<P>::Ptr_Iterator(const P& q)
+  : p(q) {
+}
+
+template <typename P>
+template <typename Q>
+inline
+Ptr_Iterator<P>::Ptr_Iterator(const Ptr_Iterator<Q>& y)
+  : p(y.base()) {
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator*() const {
+  return *p;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::pointer
+Ptr_Iterator<P>::operator->() const {
+  return p;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator[](const difference_type m) const {
+  return p[m];
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator++() {
+  ++p;
+  return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator++(int) {
+  return Ptr_Iterator(p++);
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator--() {
+  --p;
+  return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator--(int) {
+  return Ptr_Iterator(p--);
+}
+
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator+=(const difference_type m) {
+  p += m;
+  return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator-=(const difference_type m) {
+  p -= m;
+  return *this;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::difference_type
+Ptr_Iterator<P>::operator-(const Ptr_Iterator& y) const {
+  return p - y.p;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator+(const difference_type m) const {
+  return Ptr_Iterator(p + m);
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator-(const difference_type m) const {
+  return Ptr_Iterator(p - m);
+}
+
+template<typename P, typename Q>
+inline bool
+operator==(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() == y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator!=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() != y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator<(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() < y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator<=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() <= y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator>(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() > y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator>=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() >= y.base();
+}
+
+template<typename P, typename Q>
+inline typename Ptr_Iterator<P>::difference_type
+operator-(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() - y.base();
+}
+
+template<typename P>
+inline Ptr_Iterator<P>
+operator+(typename Ptr_Iterator<P>::difference_type m,
+	  const Ptr_Iterator<P>& y) {
+  return Ptr_Iterator<P>(m + y.base());
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Ptr_Iterator.defs.hh line 170
+
+// Automatically generated from PPL source file ../src/DB_Row.defs.hh line 1
+/* DB_Row class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/DB_Row.defs.hh line 29
+#include <cstddef>
+#include <vector>
+
+#ifndef EXTRA_ROW_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  When EXTRA_ROW_DEBUG evaluates to <CODE>true</CODE>, each instance
+  of the class DB_Row carries its own capacity; this enables extra
+  consistency checks to be performed.
+  \ingroup PPL_CXX_interface
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define EXTRA_ROW_DEBUG 0
+#endif
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The handler of the actual DB_Row implementation.
+/*! \ingroup PPL_CXX_interface
+  Exception-safety is the only responsibility of this class: it has
+  to ensure that its \p impl member is correctly deallocated.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler {
+public:
+  //! Default constructor.
+  DB_Row_Impl_Handler();
+
+  //! Destructor.
+  ~DB_Row_Impl_Handler();
+
+  class Impl;
+
+  //! A pointer to the actual implementation.
+  Impl* impl;
+
+#if EXTRA_ROW_DEBUG
+  //! The capacity of \p impl (only available during debugging).
+  dimension_type capacity_;
+#endif // EXTRA_ROW_DEBUG
+
+private:
+  //! Private and unimplemented: copy construction is not allowed.
+  DB_Row_Impl_Handler(const DB_Row_Impl_Handler&);
+
+  //! Private and unimplemented: copy assignment is not allowed.
+  DB_Row_Impl_Handler& operator=(const DB_Row_Impl_Handler&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the single rows of matrices.
+/*! \ingroup PPL_CXX_interface
+  The class template DB_Row<T> allows for the efficient representation of
+  the single rows of a DB_Matrix. It contains elements of type T stored
+  as a vector. The class T is a family of extended numbers that
+  must provide representation for
+  \f$ -\infty \f$, \f$0\f$,\f$ +\infty \f$ (and, consequently for <EM>nan</EM>,
+  <EM>not a number</EM>, since this arises as the ``result'' of
+  undefined sums like \f$ +\infty + (-\infty) \f$).
+
+  The class T must provide the following methods:
+
+  \code
+    T()
+  \endcode
+  is the default constructor: no assumption is made on the particular
+  object constructed, provided <CODE>T().OK()</CODE> gives <CODE>true</CODE>
+  (see below).
+  \code
+    ~T()
+  \endcode
+  is the destructor.
+  \code
+    bool is_nan() const
+  \endcode
+  returns <CODE>true</CODE> if and only \p *this represents
+  the  <EM>not a number</EM> value.
+  \code
+    bool OK() const
+  \endcode
+  returns <CODE>true</CODE> if and only if \p *this satisfies all
+  its invariants.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row : private DB_Row_Impl_Handler<T> {
+public:
+  //! Pre-constructs a row: construction must be completed by construct().
+  DB_Row();
+
+  //! \name Post-constructors.
+  //@{
+  //! Constructs properly a default-constructed element.
+  /*!
+    Builds a row with size \p sz and minimum capacity.
+  */
+  void construct(dimension_type sz);
+
+  //! Constructs properly a default-constructed element.
+  /*!
+    \param sz
+    The size of the row that will be constructed.
+
+    \param capacity
+    The minimum capacity of the row that will be constructed.
+
+    The row that we are constructing has a minimum capacity of
+    (i.e., it can contain at least) \p elements, \p sz of which
+    will be constructed now.
+  */
+  void construct(dimension_type sz, dimension_type capacity);
+
+  //! Constructs properly a conservative approximation of \p y.
+  /*!
+    \param y
+    A row containing the elements whose upward approximations will
+    be used to properly construct \p *this.
+
+    \param capacity
+    The capacity of the constructed row.
+
+    It is assumed that \p capacity is greater than or equal to the
+    size of \p y.
+  */
+  template <typename U>
+  void construct_upward_approximation(const DB_Row<U>& y,
+				      dimension_type capacity);
+
+  //@}
+
+  //! Tight constructor: resizing will require reallocation.
+  DB_Row(dimension_type sz);
+
+  //! Sizing constructor with capacity.
+  DB_Row(dimension_type sz, dimension_type capacity);
+
+  //! Ordinary copy constructor.
+  DB_Row(const DB_Row& y);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to \p y size.
+  */
+  DB_Row(const DB_Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is greater than or equal to the size of \p y
+    and, of course, that \p sz is less than or equal to \p capacity.
+    Any new position is initialized to \f$+\infty\f$.
+  */
+  DB_Row(const DB_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Destructor.
+  ~DB_Row();
+
+  //! Assignment operator.
+  DB_Row& operator=(const DB_Row& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(DB_Row& y);
+
+  //! Assigns the implementation of \p y to \p *this.
+  void assign(DB_Row& y);
+
+  /*! \brief
+    Allocates memory for a default constructed DB_Row object,
+    allowing for \p capacity coefficients at most.
+
+    It is assumed that no allocation has been performed before
+    (otherwise, a memory leak will occur).
+    After execution, the size of the DB_Row object is zero.
+  */
+  void allocate(dimension_type capacity);
+
+  //! Expands the row to size \p new_size.
+  /*!
+    Adds new positions to the implementation of the row
+    obtaining a new row with size \p new_size.
+    It is assumed that \p new_size is between the current size
+    and capacity of the row. The new positions are initialized
+    to \f$+\infty\f$.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    Destroys elements of the row implementation
+    from position \p new_size to the end.
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Returns the size() of the largest possible DB_Row.
+  static dimension_type max_size();
+
+  //! Gives the number of coefficients currently in use.
+  dimension_type size() const;
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the element of the row indexed by \p k.
+  T& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  const T& operator[](dimension_type k) const;
+  //@}
+
+  //! A (non const) random access iterator to access the row's elements.
+  typedef Implementation::Ptr_Iterator<T*> iterator;
+
+  //! A const random access iterator to access the row's elements.
+  typedef Implementation::Ptr_Iterator<const T*> const_iterator;
+
+  /*! \brief
+    Returns the const iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const iterator.
+  */
+  iterator begin();
+
+  //! Returns the past-the-end iterator.
+  iterator end();
+
+  /*! \brief
+    Returns the const iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::DB_Row;
+
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const DB_Row& y);
+
+#if EXTRA_ROW_DEBUG
+  //! Returns the capacity of the row (only available during debugging).
+  dimension_type capacity() const;
+#endif // defined(EXTRA_ROW_DEBUG)
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Classical comparison operators.
+//@{
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Row */
+template <typename T>
+bool operator==(const DB_Row<T>& x, const DB_Row<T>& y);
+
+/*! \relates DB_Row */
+template <typename T>
+bool operator!=(const DB_Row<T>& x, const DB_Row<T>& y);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//@}
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The real implementation of a DB_Row object.
+/*! \ingroup PPL_CXX_interface
+  The class DB_Row_Impl_Handler::Impl provides the implementation of
+  DB_Row objects and, in particular, of the corresponding memory
+  allocation functions.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler<T>::Impl {
+public:
+  //! \name Custom allocator and deallocator.
+  //@{
+
+  /*! \brief
+    Allocates a chunk of memory able to contain \p capacity T objects
+    beyond the specified \p fixed_size and returns a pointer to the new
+    allocated memory.
+  */
+  static void* operator new(size_t fixed_size, dimension_type capacity);
+
+  //! Uses the standard delete operator to free the memory \p p points to.
+  static void operator delete(void* p);
+
+  /*! \brief
+    Placement version: uses the standard operator delete to free
+    the memory \p p points to.
+  */
+  static void operator delete(void* p, dimension_type capacity);
+  //@}
+
+  //! Default constructor.
+  Impl();
+
+  //! Destructor.
+  /*!
+    Uses <CODE>shrink()</CODE> method with argument \f$0\f$
+    to delete all the row elements.
+  */
+  ~Impl();
+
+  //! Expands the row to size \p new_size.
+  /*!
+    It is assumed that \p new_size is between the current size and capacity.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const Impl& y);
+
+  /*! \brief
+    Exception-safe upward approximation construction mechanism
+    for coefficients.
+  */
+  template <typename U>
+  void construct_upward_approximation(const U& y);
+
+  //! Returns the size() of the largest possible Impl.
+  static dimension_type max_size();
+
+  //! \name Size accessors.
+  //@{
+  //! Returns the actual size of \p this.
+  dimension_type size() const;
+
+  //! Sets to \p new_sz the actual size of \p *this.
+  void set_size(dimension_type new_sz);
+
+  //! Increments the size of \p *this by 1.
+  void bump_size();
+  //@}
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the element of \p *this indexed by \p k.
+  T& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of \p *this indexed by \p k.
+  const T& operator[](dimension_type k) const;
+  //@}
+
+private:
+  //! The number of coefficients in the row.
+  dimension_type size_;
+
+  //! The vector of coefficients.
+  T vec_[
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+	       1
+#endif
+  ];
+
+  //! Private and unimplemented: copy construction is not allowed.
+  Impl(const Impl& y);
+
+  //! Private and unimplemented: assignment is not allowed.
+  Impl& operator=(const Impl&);
+
+  //! Exception-safe copy construction mechanism.
+  void copy_construct(const Impl& y);
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+void swap(Parma_Polyhedra_Library::DB_Row<T>& x,
+	  Parma_Polyhedra_Library::DB_Row<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+void iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+	       ::iterator x,
+	       typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+	       ::iterator y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/DB_Row.inlines.hh line 1
+/* DB_Row class implementation: inline functions.
+*/
+
+
+#include <cassert>
+#include <algorithm>
+#include <iostream>
+// Automatically generated from PPL source file ../src/DB_Row.inlines.hh line 30
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void*
+DB_Row_Impl_Handler<T>::Impl::operator new(const size_t fixed_size,
+					   const dimension_type capacity) {
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  return ::operator new(fixed_size + capacity*sizeof(T));
+#else
+  assert(capacity >= 1);
+  return ::operator new(fixed_size + (capacity-1)*sizeof(T));
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p) {
+  ::operator delete(p);
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p, dimension_type) {
+  ::operator delete(p);
+}
+
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::max_size() {
+  return size_t(-1)/sizeof(T);
+}
+
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::size() const {
+  return size_;
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::set_size(const dimension_type new_sz) {
+  size_ = new_sz;
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::bump_size() {
+  ++size_;
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::Impl()
+  : size_(0) {
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::~Impl() {
+  shrink(0);
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::DB_Row_Impl_Handler()
+  : impl(0) {
+#if EXTRA_ROW_DEBUG
+  capacity_ = 0;
+#endif
+}
+
+template <typename T>
+template <typename U>
+void
+DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const U& y) {
+  const dimension_type y_size = y.size();
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < y_size; ++i) {
+    construct(vec_[i], y[i], ROUND_UP);
+    bump_size();
+  }
+#else
+  assert(y_size > 0);
+  if (y_size > 0) {
+    vec_[0] = y[0];
+    bump_size();
+    // Construct in direct order: will destroy in reverse order.
+    for (dimension_type i = 1; i < y_size; ++i) {
+      construct(vec_[i], y[i], ROUND_UP);
+      bump_size();
+    }
+  }
+#endif
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::~DB_Row_Impl_Handler() {
+  delete impl;
+}
+
+template <typename T>
+inline T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) {
+  assert(k < size());
+  return vec_[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) const {
+  assert(k < size());
+  return vec_[k];
+}
+
+template <typename T>
+inline dimension_type
+DB_Row<T>::max_size() {
+  return DB_Row_Impl_Handler<T>::Impl::max_size();
+}
+
+template <typename T>
+inline dimension_type
+DB_Row<T>::size() const {
+  return this->impl->size();
+}
+
+#if EXTRA_ROW_DEBUG
+template <typename T>
+inline dimension_type
+DB_Row<T>::capacity() const {
+  return this->capacity_;
+}
+#endif // EXTRA_ROW_DEBUG
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row()
+  : DB_Row_Impl_Handler<T>() {
+}
+
+template <typename T>
+inline void
+DB_Row<T>::allocate(
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+	       const
+#endif
+	       dimension_type capacity) {
+  DB_Row<T>& x = *this;
+  assert(capacity <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (capacity == 0)
+    ++capacity;
+#endif
+  assert(x.impl == 0);
+  x.impl = new (capacity) typename DB_Row_Impl_Handler<T>::Impl();
+#if EXTRA_ROW_DEBUG
+  assert(x.capacity_ == 0);
+  x.capacity_ = capacity;
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row<T>::expand_within_capacity(const dimension_type new_size) {
+  DB_Row<T>& x = *this;
+  assert(x.impl);
+#if EXTRA_ROW_DEBUG
+  assert(new_size <= x.capacity_);
+#endif
+  x.impl->expand_within_capacity(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::copy_construct_coefficients(const DB_Row& y) {
+  DB_Row<T>& x = *this;
+  assert(x.impl && y.impl);
+#if EXTRA_ROW_DEBUG
+  assert(y.size() <= x.capacity_);
+#endif
+  x.impl->copy_construct_coefficients(*(y.impl));
+}
+
+template <typename T>
+template <typename U>
+inline void
+DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+					  const dimension_type capacity) {
+  DB_Row<T>& x = *this;
+  assert(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity);
+  assert(y.impl);
+  x.impl->construct_upward_approximation(*(y.impl));
+}
+
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz,
+		     const dimension_type capacity) {
+  assert(sz <= capacity && capacity <= max_size());
+  allocate(capacity);
+  expand_within_capacity(sz);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz) {
+  construct(sz, sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz,
+		  const dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  construct(sz, capacity);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz) {
+  construct(sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y)
+  : DB_Row_Impl_Handler<T>() {
+  if (y.impl) {
+    allocate(compute_capacity(y.size(), max_size()));
+    copy_construct_coefficients(y);
+  }
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+		  const	dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  assert(y.impl);
+  assert(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity);
+  copy_construct_coefficients(y);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+		  const dimension_type sz,
+		  const	dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  assert(y.impl);
+  assert(y.size() <= sz && sz <= capacity && capacity <= max_size());
+  allocate(capacity);
+  copy_construct_coefficients(y);
+  expand_within_capacity(sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::~DB_Row() {
+}
+
+template <typename T>
+inline void
+DB_Row<T>::shrink(const dimension_type new_size) {
+  DB_Row<T>& x = *this;
+  assert(x.impl);
+  x.impl->shrink(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::swap(DB_Row& y) {
+  DB_Row<T>& x = *this;
+  std::swap(x.impl, y.impl);
+#if EXTRA_ROW_DEBUG
+  std::swap(x.capacity_, y.capacity_);
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row<T>::assign(DB_Row& y) {
+  DB_Row<T>& x = *this;
+  x.impl = y.impl;
+#if EXTRA_ROW_DEBUG
+  x.capacity_ = y.capacity_;
+#endif
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Row<T>::operator=(const DB_Row& y) {
+  // Copy-construct `tmp' from `y'.
+  DB_Row tmp(y);
+  // Swap the implementation of `*this' with the one of `tmp'.
+  swap(tmp);
+  // Now `tmp' goes out of scope, so the old `*this' will be destroyed.
+  return *this;
+}
+
+template <typename T>
+inline T&
+DB_Row<T>::operator[](const dimension_type k) {
+  DB_Row<T>& x = *this;
+  return (*x.impl)[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row<T>::operator[](const dimension_type k) const {
+  const DB_Row<T>& x = *this;
+  return (*x.impl)[k];
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::
+Impl::expand_within_capacity(const dimension_type new_size) {
+  assert(size() <= new_size && new_size <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // vec_[0] is already constructed.
+  if (size() == 0 && new_size > 0)
+    bump_size();
+#endif
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = size(); i < new_size; ++i) {
+    new (&vec_[i]) T(PLUS_INFINITY);
+    bump_size();
+  }
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
+  const dimension_type old_size = size();
+  assert(new_size <= old_size);
+  // Since ~T() does not throw exceptions, nothing here does.
+  set_size(new_size);
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Make sure we do not try to destroy vec_[0].
+  if (new_size == 0)
+    ++new_size;
+#endif
+  // We assume construction was done "forward".
+  // We thus perform destruction "backward".
+  for (dimension_type i = old_size; i-- > new_size; )
+    vec_[i].~T();
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::copy_construct_coefficients(const Impl& y) {
+  const dimension_type y_size = y.size();
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < y_size; ++i) {
+    new (&vec_[i]) T(y.vec_[i]);
+    bump_size();
+  }
+#else
+  assert(y_size > 0);
+  if (y_size > 0) {
+    vec_[0] = y.vec_[0];
+    bump_size();
+    // Construct in direct order: will destroy in reverse order.
+    for (dimension_type i = 1; i < y_size; ++i) {
+      new (&vec_[i]) T(y.vec_[i]);
+      bump_size();
+    }
+  }
+#endif
+}
+
+template <typename T>
+typename DB_Row<T>::iterator
+DB_Row<T>::begin() {
+  DB_Row<T>& x = *this;
+  return iterator(x.impl->vec_);
+}
+
+template <typename T>
+typename DB_Row<T>::iterator
+DB_Row<T>::end() {
+  DB_Row<T>& x = *this;
+  return iterator(x.impl->vec_ + x.impl->size_);
+}
+
+template <typename T>
+typename DB_Row<T>::const_iterator
+DB_Row<T>::begin() const {
+  const DB_Row<T>& x = *this;
+  return const_iterator(x.impl->vec_);
+}
+
+template <typename T>
+typename DB_Row<T>::const_iterator
+DB_Row<T>::end() const {
+  const DB_Row<T>& x = *this;
+  return const_iterator(x.impl->vec_ + x.impl->size_);
+}
+
+template <typename T>
+inline bool
+DB_Row<T>::OK(const dimension_type row_size,
+	      const dimension_type
+#if EXTRA_ROW_DEBUG
+	      row_capacity
+#endif
+	      ) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  const DB_Row<T>& x = *this;
+
+  bool is_broken = false;
+#if EXTRA_ROW_DEBUG
+# if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+  if (x.capacity_ == 0) {
+    cerr << "Illegal row capacity: is 0, should be at least 1"
+	 << endl;
+    is_broken = true;
+  }
+  else if (x.capacity_ == 1 && row_capacity == 0)
+    // This is fine.
+    ;
+  else
+# endif
+  if (x.capacity_ != row_capacity) {
+    cerr << "DB_Row capacity mismatch: is " << x.capacity_
+	 << ", should be " << row_capacity << "."
+	 << endl;
+    is_broken = true;
+  }
+#endif
+  if (x.size() != row_size) {
+#ifndef NDEBUG
+    cerr << "DB_Row size mismatch: is " << x.size()
+	 << ", should be " << row_size << "."
+	 << endl;
+#endif
+    is_broken = true;
+  }
+#if EXTRA_ROW_DEBUG
+  if (x.capacity_ < x.size()) {
+#ifndef NDEBUG
+    cerr << "DB_Row is completely broken: capacity is " << x.capacity_
+	 << ", size is " << x.size() << "."
+	 << endl;
+#endif
+    is_broken = true;
+  }
+#endif
+
+  for (dimension_type i = x.size(); i-- > 0; ) {
+    const T& element = x[i];
+    // Not OK is bad.
+    if (!element.OK()) {
+      is_broken = true;
+      break;
+    }
+    // In addition, nans should never occur.
+    if (is_not_a_number(element)) {
+#ifndef NDEBUG
+      cerr << "Not-a-number found in DB_Row."
+	   << endl;
+#endif
+      is_broken = true;
+      break;
+    }
+  }
+
+  return !is_broken;
+}
+
+
+/*! \relates DB_Row */
+template <typename T>
+inline bool
+operator==(const DB_Row<T>& x, const DB_Row<T>& y) {
+  if (x.size() != y.size())
+    return false;
+  for (dimension_type i = x.size(); i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline bool
+operator!=(const DB_Row<T>& x, const DB_Row<T>& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::DB_Row<T>& x,
+     Parma_Polyhedra_Library::DB_Row<T>& y) {
+  x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+template <typename T>
+inline void
+iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+	  ::iterator x,
+	  typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+	  ::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/DB_Row.defs.hh line 430
+
+// Automatically generated from PPL source file ../src/DB_Matrix.defs.hh line 1
+/* DB_Matrix class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/DB_Matrix.defs.hh line 31
+#include <vector>
+#include <cstddef>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const DB_Matrix<T>& c);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the square matrices.
+/*! \ingroup PPL_CXX_interface
+  The templatic class DB_Matrix<T> allows for the representation of
+  a square matrix of T objects.
+  Each DB_Matrix<T> object can be viewed as a multiset of DB_Row<T>.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+class Parma_Polyhedra_Library::DB_Matrix {
+public:
+  //! Returns the maximum number of rows a DB_Matrix can handle.
+  static dimension_type max_num_rows();
+
+  //! Returns the maximum number of columns a DB_Matrix can handle.
+  static dimension_type max_num_columns();
+
+  //! Builds an empty matrix.
+  /*!
+    DB_Rows' size and capacity are initialized to \f$0\f$.
+  */
+  DB_Matrix();
+
+  //! Builds a square matrix having the specified dimension.
+  explicit DB_Matrix(dimension_type n_rows);
+
+  //! Copy-constructor.
+  DB_Matrix(const DB_Matrix& y);
+
+  //! Constructs a conservative approximation of \p y.
+  template <typename U>
+  explicit DB_Matrix(const DB_Matrix<U>& y);
+
+  //! Destructor.
+  ~DB_Matrix();
+
+  //! Assignment operator.
+  DB_Matrix& operator=(const DB_Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A read-only iterator over the rows of the matrix.
+  /*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  class const_iterator {
+  private:
+    typedef typename std::vector<DB_Row<T> >::const_iterator Iter;
+    //! The const iterator on the rows' vector \p rows.
+    Iter i;
+
+  public:
+    typedef std::forward_iterator_tag iterator_category;
+    typedef typename std::iterator_traits<Iter>::value_type value_type;
+    typedef typename std::iterator_traits<Iter>::difference_type
+    difference_type;
+    typedef typename std::iterator_traits<Iter>::pointer pointer;
+    typedef typename std::iterator_traits<Iter>::reference reference;
+
+    //! Default constructor.
+    const_iterator();
+
+    /*! \brief
+      Builds a const iterator on the matrix starting from
+      an iterator \p b on the elements of the vector \p rows.
+    */
+    explicit const_iterator(const Iter& b);
+
+    //! Ordinary copy-constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    reference operator*() const;
+
+    //! Indirect member selector.
+    pointer operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+private:
+  template <typename U> friend class DB_Matrix;
+
+  //! The rows of the matrix.
+  std::vector<DB_Row<T> > rows;
+
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
+
+  /*! \brief
+    Capacity allocated for each row, i.e., number of
+    <CODE>long</CODE> objects that each row can contain.
+  */
+  dimension_type row_capacity;
+
+public:
+  //! Swaps \p *this with \p y.
+  void swap(DB_Matrix& y);
+
+
+  //! Makes the matrix grow by adding more rows and more columns.
+  /*!
+    \param new_n_rows
+    The number of rows and columns of the resized matrix.
+
+    A new matrix, with the specified dimension, is created.
+    The contents of the old matrix are copied in the upper, left-hand
+    corner of the new matrix, which is then assigned to \p *this.
+  */
+  void grow(dimension_type new_n_rows);
+
+  //! Resizes the matrix without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows and columns of the resized matrix.
+
+    A new matrix, with the specified dimension, is created without copying
+    the content of the old matrix and assigned to \p *this.
+  */
+  void resize_no_copy(dimension_type new_n_rows);
+
+  //! Returns the number of rows in the matrix.
+  dimension_type num_rows() const;
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the \p k-th row of the matrix.
+  DB_Row<T>& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the matrix.
+  const DB_Row<T>& operator[](dimension_type k) const;
+  //@}
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+    and sets \p *this accordingly.  Returns <CODE>true</CODE>
+    if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+void swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
+	  Parma_Polyhedra_Library::DB_Matrix<T>& y);
+
+} // namespace std
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+bool operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+bool operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const DB_Matrix<T>& x,
+				 const DB_Matrix<T>& y,
+				 const Rounding_Dir dir,
+				 Temp& tmp0,
+				 Temp& tmp1,
+				 Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the Euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			       const DB_Matrix<T>& x,
+			       const DB_Matrix<T>& y,
+			       const Rounding_Dir dir,
+			       Temp& tmp0,
+			       Temp& tmp1,
+			       Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const DB_Matrix<T>& x,
+				 const DB_Matrix<T>& y,
+				 const Rounding_Dir dir,
+				 Temp& tmp0,
+				 Temp& tmp1,
+				 Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/DB_Matrix.inlines.hh line 1
+/* DB_Matrix class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/DB_Matrix.inlines.hh line 28
+#include <cassert>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void
+DB_Matrix<T>::swap(DB_Matrix& y) {
+  std::swap(rows, y.rows);
+  std::swap(row_size, y.row_size);
+  std::swap(row_capacity, y.row_capacity);
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_rows() {
+  return std::vector<DB_Row<T> >().max_size();
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_columns() {
+  return DB_Row<T>::max_size();
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator()
+  : i(Iter()) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const Iter& b)
+  : i(b) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i) {
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  return *this;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::reference
+DB_Matrix<T>::const_iterator::operator*() const {
+  return *i;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::pointer
+DB_Matrix<T>::const_iterator::operator->() const {
+  return &*i;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator++() {
+  ++i;
+  return *this;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::const_iterator::operator++(int) {
+  return const_iterator(i++);
+}
+
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator!=(const const_iterator& y) const {
+  return !operator==(y);
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::begin() const {
+  return const_iterator(rows.begin());
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::end() const {
+  return const_iterator(rows.end());
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix()
+  : rows(),
+    row_size(0),
+    row_capacity(0) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::~DB_Matrix() {
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+template <typename T>
+inline const DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) const {
+  assert(k < rows.size());
+  return rows[k];
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::num_rows() const {
+  return rows.size();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline bool
+operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+  return !(x == y);
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix(const dimension_type n_rows)
+  : rows(n_rows),
+    row_size(n_rows),
+    row_capacity(compute_capacity(n_rows, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < n_rows; ++i)
+    rows[i].construct(n_rows, row_capacity);
+  assert(OK());
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix(const DB_Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+}
+
+template <typename T>
+template <typename U>
+inline
+DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y)
+  : rows(y.rows.size()),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i)
+    rows[i].construct_upward_approximation(y[i], row_capacity);
+  assert(OK());
+}
+
+template <typename T>
+inline DB_Matrix<T>&
+DB_Matrix<T>::operator=(const DB_Matrix& y) {
+  // Without the following guard against auto-assignments we would
+  // recompute the row capacity based on row size, possibly without
+  // actually increasing the capacity of the rows.  This would lead to
+  // an inconsistent state.
+  if (this != &y) {
+    // The following assignment may do nothing on auto-assignments...
+    rows = y.rows;
+    row_size = y.row_size;
+    // ... hence the following assignment must not be done on
+    // auto-assignments.
+    row_capacity = compute_capacity(y.row_size, max_num_columns());
+  }
+  return *this;
+}
+
+template <typename T>
+void
+DB_Matrix<T>::grow(const dimension_type new_n_rows) {
+  const dimension_type old_n_rows = rows.size();
+  assert(new_n_rows >= old_n_rows);
+
+  if (new_n_rows > old_n_rows) {
+    if (new_n_rows <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+	// Reallocation will take place.
+	std::vector<DB_Row<T> > new_rows;
+	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+	new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+	// Construct the new rows.
+	dimension_type i = new_n_rows;
+	while (i-- > old_n_rows)
+	  new_rows[i].construct(new_n_rows, row_capacity);
+	// Steal the old rows.
+	++i;
+	while (i-- > 0)
+	  new_rows[i].swap(rows[i]);
+	// Put the new vector into place.
+	std::swap(rows, new_rows);
+      }
+      else {
+	// Reallocation will NOT take place.
+	rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+	  rows[i].construct(new_n_rows, row_capacity);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows.
+      DB_Matrix new_matrix;
+      new_matrix.rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+      new_matrix.rows.insert(new_matrix.rows.end(), new_n_rows, DB_Row<T>());
+      // Construct the new rows.
+      new_matrix.row_size = new_n_rows;
+      new_matrix.row_capacity = compute_capacity(new_n_rows,
+						 max_num_columns());
+      dimension_type i = new_n_rows;
+      while (i-- > old_n_rows)
+	new_matrix.rows[i].construct(new_matrix.row_size,
+				     new_matrix.row_capacity);
+      // Copy the old rows.
+      ++i;
+      while (i-- > 0) {
+	DB_Row<T> new_row(rows[i],
+			  new_matrix.row_size,
+			  new_matrix.row_capacity);
+	std::swap(new_matrix.rows[i], new_row);
+      }
+      // Put the new vector into place.
+      swap(new_matrix);
+      return;
+    }
+  }
+  // Here we have the right number of rows.
+  if (new_n_rows > row_size) {
+    // We need more columns.
+    if (new_n_rows <= row_capacity)
+      // But we have enough capacity: we resize existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+	rows[i].expand_within_capacity(new_n_rows);
+    else {
+      // Capacity exhausted: we must reallocate the rows and
+      // make sure all the rows have the same capacity.
+      const dimension_type new_row_capacity
+	= compute_capacity(new_n_rows, max_num_columns());
+      for (dimension_type i = old_n_rows; i-- > 0; ) {
+	DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity);
+	std::swap(rows[i], new_row);
+      }
+      row_capacity = new_row_capacity;
+    }
+    // Rows have grown or shrunk.
+    row_size = new_n_rows;
+  }
+}
+
+template <typename T>
+void
+DB_Matrix<T>::resize_no_copy(const dimension_type new_n_rows) {
+  dimension_type old_n_rows = rows.size();
+
+  if (new_n_rows > old_n_rows) {
+    // Rows will be inserted.
+    if (new_n_rows <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+	// Reallocation (of vector `rows') will take place.
+	std::vector<DB_Row<T> > new_rows;
+	new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+	new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+	// Construct the new rows (be careful: each new row must have
+	// the same capacity as each one of the old rows).
+	dimension_type i = new_n_rows;
+	while (i-- > old_n_rows)
+	  new_rows[i].construct(new_n_rows, row_capacity);
+	// Steal the old rows.
+	++i;
+	while (i-- > 0)
+	  new_rows[i].swap(rows[i]);
+	// Put the new vector into place.
+	std::swap(rows, new_rows);
+      }
+      else {
+	// Reallocation (of vector `rows') will NOT take place.
+	rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+	// Be careful: each new row must have
+	// the same capacity as each one of the old rows.
+	for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+	  rows[i].construct(new_n_rows, row_capacity);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows: allocate a new matrix and swap.
+      DB_Matrix new_matrix(new_n_rows);
+      swap(new_matrix);
+      return;
+    }
+  }
+  else if (new_n_rows < old_n_rows) {
+    // Drop some rows.
+    rows.erase(rows.begin() + new_n_rows, rows.end());
+    // Shrink the existing rows.
+    for (dimension_type i = new_n_rows; i-- > 0; )
+      rows[i].shrink(new_n_rows);
+    old_n_rows = new_n_rows;
+  }
+  // Here we have the right number of rows.
+  if (new_n_rows > row_size) {
+    // We need more columns.
+    if (new_n_rows <= row_capacity)
+      // But we have enough capacity: we resize existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+	rows[i].expand_within_capacity(new_n_rows);
+    else {
+      // Capacity exhausted: we must reallocate the rows and
+      // make sure all the rows have the same capacity.
+      const dimension_type new_row_capacity
+	= compute_capacity(new_n_rows, max_num_columns());
+      for (dimension_type i = old_n_rows; i-- > 0; ) {
+	DB_Row<T> new_row(new_n_rows, new_row_capacity);
+	std::swap(rows[i], new_row);
+      }
+      row_capacity = new_row_capacity;
+    }
+  }
+  // DB_Rows have grown or shrunk.
+  row_size = new_n_rows;
+}
+
+template <typename T>
+void
+DB_Matrix<T>::ascii_dump(std::ostream& s) const {
+  const DB_Matrix<T>& x = *this;
+  const char separator = ' ';
+  const dimension_type nrows = x.num_rows();
+  s << nrows << separator << "\n";
+  for (dimension_type i = 0; i < nrows;  ++i) {
+    for (dimension_type j = 0; j < nrows; ++j) {
+      using namespace IO_Operators;
+      s << x[i][j] << separator;
+    }
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, DB_Matrix<T>);
+
+template <typename T>
+bool
+DB_Matrix<T>::ascii_load(std::istream& s) {
+  dimension_type nrows;
+   if (!(s >> nrows))
+    return false;
+  resize_no_copy(nrows);
+  DB_Matrix& x = *this;
+  for (dimension_type i = 0; i < nrows;  ++i)
+    for (dimension_type j = 0; j < nrows; ++j) {
+      Result r = input(x[i][j], s, ROUND_UP);
+      // FIXME: V_CVT_STR_UNK is probably not the only possible error.
+      if (!s || r == V_CVT_STR_UNK)
+	return false;
+    }
+  // Check for well-formedness.
+  assert(OK());
+  return true;
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline bool
+operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows())
+    return false;
+  for (dimension_type i = x_num_rows; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+template <typename To, typename From>
+struct maybe_assign_struct {
+  static inline Result
+  function(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+    // When `To' and `From' are different types, we make the conversion
+    // and use `tmp'.
+    top = &tmp;
+    return assign_r(tmp, from, dir);
+  }
+};
+
+template <typename Type>
+struct maybe_assign_struct<Type, Type> {
+  static inline Result
+  function(const Type*& top, Type&, const Type& from, Rounding_Dir) {
+    // When the types are the same, conversion is unnecessary.
+    top = &from;
+    return V_EQ;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Assigns to \p top a pointer to a location that holds the
+  conversion, according to \p dir, of \p from to type \p To.  When
+  necessary, and only when necessary, the variable \p tmp is used to
+  hold the result of conversion.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename To, typename From>
+inline Result
+maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+  return maybe_assign_struct<To, From>::function(top, tmp, from, dir);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+		    const DB_Matrix<T>& x,
+		    const DB_Matrix<T>& y,
+		    const Rounding_Dir dir,
+		    Temp& tmp0,
+		    Temp& tmp1,
+		    Temp& tmp2) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows())
+    return false;
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (dimension_type i = x_num_rows; i-- > 0; ) {
+    const DB_Row<T>& x_i = x[i];
+    const DB_Row<T>& y_i = y[i];
+    for (dimension_type j = x_num_rows; j-- > 0; ) {
+      const T& x_i_j = x_i[j];
+      const T& y_i_j = y_i[j];
+      if (is_plus_infinity(x_i_j)) {
+	if (is_plus_infinity(y_i_j))
+	  continue;
+	else {
+	pinf:
+	  r = PLUS_INFINITY;
+	  return true;
+	}
+      }
+      else if (is_plus_infinity(y_i_j))
+	goto pinf;
+
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i_j > y_i_j) {
+	maybe_assign(tmp1p, tmp1, x_i_j, dir);
+	maybe_assign(tmp2p, tmp2, y_i_j, inverse(dir));
+      }
+      else {
+	maybe_assign(tmp1p, tmp1, y_i_j, dir);
+	maybe_assign(tmp2p, tmp2, x_i_j, inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      assert(tmp1 >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+}
+
+template <typename Temp>
+struct Rectilinear_Distance_Specialization {
+  static inline void
+  combine(Temp& running, const Temp& current, Rounding_Dir dir) {
+    add_assign_r(running, running, current, dir);
+  }
+
+  static inline void
+  finalize(Temp&, Rounding_Dir) {
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const DB_Matrix<T>& x,
+			    const DB_Matrix<T>& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  return
+    l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+								    dir,
+								    tmp0,
+								    tmp1,
+								    tmp2);
+}
+
+
+template <typename Temp>
+struct Euclidean_Distance_Specialization {
+  static inline void
+  combine(Temp& running, Temp& current, Rounding_Dir dir) {
+    mul_assign_r(current, current, current, dir);
+    add_assign_r(running, running, current, dir);
+  }
+
+  static inline void
+  finalize(Temp& running, Rounding_Dir dir) {
+    sqrt_assign_r(running, running, dir);
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const DB_Matrix<T>& x,
+			  const DB_Matrix<T>& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  return
+    l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+								  dir,
+								  tmp0,
+								  tmp1,
+								  tmp2);
+}
+
+
+template <typename Temp>
+struct L_Infinity_Distance_Specialization {
+  static inline void
+  combine(Temp& running, const Temp& current, Rounding_Dir) {
+    if (current > running)
+      running = current;
+  }
+
+  static inline void
+  finalize(Temp&, Rounding_Dir) {
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const DB_Matrix<T>& x,
+			   const DB_Matrix<T>& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  return
+    l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+								   dir,
+								   tmp0,
+								   tmp1,
+								   tmp2);
+}
+
+template <typename T>
+bool
+DB_Matrix<T>::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // The matrix must be square.
+  if (num_rows() != row_size) {
+#ifndef NDEBUG
+    cerr << "DB_Matrix has fewer columns than rows:\n"
+	 << "row_size is " << row_size
+	 << ", num_rows() is " << num_rows() << "!"
+	 << endl;
+#endif
+    return false;
+  }
+
+  const DB_Matrix& x = *this;
+  const dimension_type n_rows = x.num_rows();
+  for (dimension_type i = 0; i < n_rows; ++i) {
+    if (!x[i].OK(row_size, row_capacity))
+      return false;
+  }
+
+  // All checks passed.
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */  //FIXME!!
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const DB_Matrix<T>& c) {
+  const dimension_type n = c.num_rows();
+  for (dimension_type i = 0; i < n; ++i) {
+    for (dimension_type j = 0; j < n; ++j)
+      s << c[i][j] << " ";
+    s << "\n";
+  }
+  return s;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
+     Parma_Polyhedra_Library::DB_Matrix<T>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/DB_Matrix.defs.hh line 323
+
+// Automatically generated from PPL source file ../src/BD_Shape.defs.hh line 1
+/* BD_Shape class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/BD_Shape.defs.hh line 40
+#include <cstddef>
+#include <iosfwd>
+#include <vector>
+#include <deque>
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::BD_Shape
+  Writes a textual representation of \p bds on \p s:
+  <CODE>false</CODE> is written if \p bds is an empty polyhedron;
+  <CODE>true</CODE> is written if \p bds is the universe polyhedron;
+  a system of constraints defining \p bds is written otherwise,
+  all constraints separated by ", ".
+*/
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const BD_Shape<T>& bds);
+
+} // namespace IO_Operators
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same BDS.
+/*!
+  \relates BD_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename T>
+bool operator==(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y aren't the same BDS.
+/*!
+ \relates BD_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const BD_Shape<T>& x,
+				 const BD_Shape<T>& y,
+				 const Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const BD_Shape<T>& x,
+				 const BD_Shape<T>& y,
+				 const Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				 const BD_Shape<T>& x,
+				 const BD_Shape<T>& y,
+				 const Rounding_Dir dir,
+				 Temp& tmp0,
+				 Temp& tmp1,
+				 Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			       const BD_Shape<T>& x,
+			       const BD_Shape<T>& y,
+			       const Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			       const BD_Shape<T>& x,
+			       const BD_Shape<T>& y,
+			       const Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			       const BD_Shape<T>& x,
+			       const BD_Shape<T>& y,
+			       const Rounding_Dir dir,
+			       Temp& tmp0,
+			       Temp& tmp1,
+			       Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<To, Extended_Number_Policy>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				const BD_Shape<T>& x,
+				const BD_Shape<T>& y,
+				const Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  Checked_Number<Temp, Extended_Number_Policy>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				const BD_Shape<T>& x,
+				const BD_Shape<T>& y,
+				const Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+				const BD_Shape<T>& x,
+				const BD_Shape<T>& y,
+				const Rounding_Dir dir,
+				Temp& tmp0,
+				Temp& tmp1,
+				Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Decodes the constraint \p c as a bounded difference.
+/*!
+  \return
+  <CODE>true</CODE> if the constraint \p c is a
+  \ref Bounded_Difference_Shapes "bounded difference";
+  <CODE>false</CODE> otherwise.
+
+  \param c
+  The constraint to be decoded.
+
+  \param c_space_dim
+  The space dimension of the constraint \p c (it is <EM>assumed</EM>
+  to match the actual space dimension of \p c).
+
+  \param c_num_vars
+  If <CODE>true</CODE> is returned, then it will be set to the number
+  of variables having a non-zero coefficient. The only legal values
+  will therefore be 0, 1 and 2.
+
+  \param c_first_var
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the index of the first variable having
+  a non-zero coefficient in \p c.
+
+  \param c_second_var
+  If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+  then it will be set to the index of the second variable having
+  a non-zero coefficient in \p c.
+
+  \param c_coeff
+  If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+  then it will be set to the value of the first non-zero coefficient
+  in \p c.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool extract_bounded_difference(const Constraint& c,
+				const dimension_type c_space_dim,
+				dimension_type& c_num_vars,
+				dimension_type& c_first_var,
+				dimension_type& c_second_var,
+				Coefficient& c_coeff);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extracts leader indices from the predecessor relation.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void compute_leader_indices(const std::vector<dimension_type>& predecessor,
+			    std::vector<dimension_type>& indices);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A bounded difference shape.
+/*! \ingroup PPL_CXX_interface
+  The class template BD_Shape<T> allows for the efficient representation
+  of a restricted kind of <EM>topologically closed</EM> convex polyhedra
+  called <EM>bounded difference shapes</EM> (BDSs, for short).
+  The name comes from the fact that the closed affine half-spaces that
+  characterize the polyhedron can be expressed by constraints of the form
+  \f$\pm x_i \leq k\f$ or \f$x_i - x_j \leq k\f$, where the inhomogeneous
+  term \f$k\f$ is a rational number.
+
+  Based on the class template type parameter \p T, a family of extended
+  numbers is built and used to approximate the inhomogeneous term of
+  bounded differences. These extended numbers provide a representation
+  for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+  implementations for several arithmetic functions.
+  The value of the type parameter \p T may be one of the following:
+    - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+    - a bounded precision floating point type (e.g., \c float or \c double);
+    - an unbounded integer or rational type, as provided by GMP
+      (i.e., \c mpz_class or \c mpq_class).
+
+  The user interface for BDSs is meant to be as similar as possible to
+  the one developed for the polyhedron class C_Polyhedron.  At the
+  interface level, bounded differences are specified using objects of
+  type Constraint: such a constraint is a bounded difference if it is
+  of the form
+    \f[
+      a_i x_i - a_j x_j \relsym b
+    \f]
+  where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+  \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+  \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+  The user is warned that the above Constraint object will be mapped
+  into a <EM>correct</EM> approximation that, depending on the expressive
+  power of the chosen template argument \p T, may loose some precision.
+  In particular, constraint objects that do not encode a bounded difference
+  will be simply (and safely) ignored.
+
+  For instance, a Constraint object encoding \f$3x - 3y \leq 1\f$ will be
+  approximated by:
+    - \f$x - y \leq 1\f$,
+      if \p T is a (bounded or unbounded) integer type;
+    - \f$x - y \leq \frac{1}{3}\f$,
+      if \p T is the unbounded rational type \c mpq_class;
+    - \f$x - y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+      if \p T is a floating point type (having no exact representation
+      for \f$\frac{1}{3}\f$).
+
+  On the other hand, a Constraint object encoding \f$3x - y \leq 1\f$
+  will be safely ignored in all of the above cases.
+
+  In the following examples it is assumed that the type argument \p T
+  is one of the possible instances listed above and that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE> are defined
+  (where they are used) as follows:
+  \code
+    Variable x(0);
+    Variable y(1);
+    Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a BDS corresponding to a cube in \f$\Rset^3\f$,
+  given as a system of constraints:
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 1);
+    cs.insert(y >= 0);
+    cs.insert(y <= 1);
+    cs.insert(z >= 0);
+    cs.insert(z <= 1);
+    BD_Shape<T> bd(cs);
+  \endcode
+  Since only those constraints having the syntactic form of a
+  <EM>bounded difference</EM> are considered, the following code
+  will build the same BDS as above (i.e., the constraints 7, 8, and 9
+  are ignored):
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 1);
+    cs.insert(y >= 0);
+    cs.insert(y <= 1);
+    cs.insert(z >= 0);
+    cs.insert(z <= 1);
+    cs.insert(x + y <= 0);      // 7
+    cs.insert(x - z + x >= 0);  // 8
+    cs.insert(3*z - y <= 1);    // 9
+    BD_Shape<T> bd(cs);
+  \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::BD_Shape {
+private:
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of
+    the inequalities defining a BDS.
+  */
+  typedef Checked_Number<T, Extended_Number_Policy> N;
+
+public:
+  //! The numeric base type upon which bounded differences are built.
+  typedef T base_type;
+
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of the
+    inequalities defining a BDS.
+  */
+  typedef N coefficient_type;
+
+  //! Returns the maximum space dimension that a BDS can handle.
+  static dimension_type max_space_dimension();
+
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
+
+  //! Builds a universe or empty BDS of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the BDS;
+
+    \param kind
+    Specifies whether the universe or the empty BDS has to be built.
+  */
+  explicit BD_Shape(dimension_type num_dimensions = 0,
+		    Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy-constructor.
+  BD_Shape(const BD_Shape& y);
+
+  //! Builds a conservative, upward approximation of \p y.
+  template <typename U>
+  explicit BD_Shape(const BD_Shape<U>& y);
+
+  //! Builds a BDS from the system of constraints \p cs.
+  /*!
+    The BDS inherits the space dimension of \p cs.
+
+    \param cs
+    A system of constraints: constraints that are not
+    \ref Bounded_Difference_Shapes "bounded differences"
+    are ignored (even though they may have contributed
+    to the space dimension).
+
+    \exception std::invalid_argument
+    Thrown if the system of constraints \p cs contains strict inequalities.
+  */
+  BD_Shape(const Constraint_System& cs);
+
+  //! Builds a BDS from the system of generators \p gs.
+  /*!
+    Builds the smallest BDS containing the polyhedron defined by \p gs.
+    The BDS inherits the space dimension of \p gs.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  BD_Shape(const Generator_System& gs);
+
+  //! Builds a BDS from the polyhedron \p ph.
+  /*!
+    Builds a BDS containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the BDS built is the
+    smallest one containing \p ph.
+  */
+  BD_Shape(const Polyhedron& ph, Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  BD_Shape& operator=(const BD_Shape& y);
+
+  /*! \brief
+    Swaps \p *this with \p y
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  void swap(BD_Shape& y);
+
+  //! Destructor.
+  ~BD_Shape();
+
+  //@} Constructors, Assignment, Swap and Destructor
+
+  //! \name Member Functions that Do Not Modify the BD_Shape
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns a system of constraints defining \p *this.
+  Constraint_System constraints() const;
+
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const BD_Shape& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const BD_Shape& y) const;
+
+  //! Returns the relations holding between \p *this and the constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible
+    or if \p c is a strict inequality or if \p c is not a bounded
+    difference constraint.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns the relations holding between \p *this and the generator \p g.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty BDS.
+  bool is_empty() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe BDS.
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this satisfies
+    all its invariants.
+  */
+  bool OK() const;
+
+  //@} Member Functions that Do Not Modify the BD_Shape
+
+  //! \name Space-Dimension Preserving Member Functions that May Modify the BD_Shape
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of bounded differences
+    defining \p *this.
+
+    \param c
+    The constraint to be added. If it is not a bounded difference, it
+    will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or if \p c is a strict inequality.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of bounded differences
+    defining \p *this.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param c
+    The constraint to be added. If it is not a bounded difference, it
+    will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or if \p c is a strict inequality.
+  */
+  bool add_constraint_and_minimize(const Constraint& c);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of bounded differences
+    defining \p *this.
+
+    \param  cs
+    The constraints that will be added. Constraints that are not bounded
+    differences will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or if \p cs contains a strict inequality.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of bounded differences
+    defining \p *this.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param  cs
+    The constraints that will be added. Constraints that are not bounded
+    differences will be simply ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or if \p cs contains a strict inequality.
+  */
+  bool add_constraints_and_minimize(const Constraint_System& cs);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const BD_Shape& y);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool intersection_assign_and_minimize(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest BDS containing the convex union
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void bds_hull_assign(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest BDS containing the convex union
+    of \p *this and \p y.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool bds_hull_assign_and_minimize(const BD_Shape& y);
+
+  //! Same as bds_hull_assign.
+  void upper_bound_assign(const BD_Shape& y);
+
+  /*! \brief
+    If the bds-hull of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool bds_hull_assign_if_exact(const BD_Shape& y);
+
+  //! Same as bds_hull_assign_if_exact.
+  bool upper_bound_assign_if_exact(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this
+    the \ref Convex_Polyhedral_Difference "poly-difference"
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void bds_difference_assign(const BD_Shape& y);
+
+  //! Same as bds_difference_assign.
+  void difference_assign(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_image(Variable var,
+		    const Linear_Expression& expr,
+		    Coefficient_traits::const_reference denominator
+		    = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+		       const Linear_Expression& expr,
+		       Coefficient_traits::const_reference denominator
+		       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+				Relation_Symbol relsym,
+				const Linear_Expression& expr,
+				Coefficient_traits::const_reference denominator
+				= Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param relsym
+    The relation symbol.
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+				Relation_Symbol relsym,
+				const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(Variable var,
+				   Relation_Symbol relsym,
+				   const Linear_Expression& expr,
+				   Coefficient_traits::const_reference
+				   denominator = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator referencing the first stop-point.
+
+    \param last
+    An iterator referencing one past the last stop-point.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_extrapolation_assign(const BD_Shape& y,
+				 Iterator first, Iterator last,
+				 unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHMZ05_widening "BHMZ05-widening" of \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened BDS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+					   const Constraint_System& cs,
+					   unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of restoring in \p y the constraints
+    of \p *this that were lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+    \param y
+    A BDS that <EM>must</EM> contain \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \note
+    As was the case for widening operators, the argument \p y is meant to
+    denote the value computed in the previous iteration step, whereas
+    \p *this denotes the value computed in the current iteration step
+    (in the <EM>descreasing</EM> iteration sequence). Hence, the call
+    <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+    the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+  */
+  void CC76_narrowing_assign(const BD_Shape& y);
+
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened BDS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const BD_Shape& y,
+					 const Constraint_System& cs,
+					 unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref H79_widening "H79-widening" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void H79_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened BDS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  */
+  void limited_H79_extrapolation_assign(const BD_Shape& y,
+					const Constraint_System& cs,
+					unsigned* tp = 0);
+
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  //! Adds \p m new dimensions and embeds the old BDS into the new space.
+  /*!
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the new
+    BDS, which is defined by a system of bounded differences in which the
+    variables running through the new dimensions are unconstrained.
+    For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the BDS
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the BDS and does not embed it in
+    the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the
+    new BDS, which is defined by a system of bounded differences in
+    which the variables running through the new dimensions are all
+    constrained to be equal to 0.
+    For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the BDS
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Seeing a BDS as a set of tuples (its points),
+    assigns to \p *this all the tuples that can be obtained by concatenating,
+    in the order given, a tuple of \p *this with a tuple of \p y.
+
+    Let \f$B \sseq \Rset^n\f$ and \f$D \sseq \Rset^m\f$ be the BDSs
+    corresponding, on entry, to \p *this and \p y, respectively.
+    Upon successful completion, \p *this will represent the BDS
+    \f$R \sseq \Rset^{n+m}\f$ such that
+    \f[
+      R \defeq
+          \Bigl\{\,
+            (x_1, \ldots, x_n, y_1, \ldots, y_m)^\transpose
+          \Bigm|
+            (x_1, \ldots, x_n)^\transpose \in B,
+            (y_1, \ldots, y_m)^\transpose \in D
+          \,\Bigl\}.
+    \f]
+    Another way of seeing it is as follows: first increases the space
+    dimension of \p *this by adding \p y.space_dimension() new
+    dimensions; then adds to the system of constraints of \p *this a
+    renamed-apart version of the constraints of \p y.
+  */
+  void concatenate_assign(const BD_Shape& y);
+
+  //! Removes all the specified dimensions.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the dimensions to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
+
+    The template class PartialFunction must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty co-domain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the co-domain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename PartialFunction>
+  void map_space_dimensions(const PartialFunction& pfunc);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+    and sets \p *this accordingly.  Returns <CODE>true</CODE> if successful,
+    <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+  friend bool Parma_Polyhedra_Library::operator==<T>(const BD_Shape<T>& x,
+						     const BD_Shape<T>& y);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::BD_Shape;
+
+  //! The matrix representing the system of bounded differences.
+  DB_Matrix<N> dbm;
+
+#define PPL_IN_BD_Shape_CLASS
+// Automatically generated from PPL source file ../src/BDS_Status.idefs.hh line 1
+/* BD_Shape<T>::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_BD_Shape_CLASS
+#error "Do not include BDS_Status.idefs.hh directly; use BD_Shape.defs.hh instead."
+#endif
+
+//! A conjunctive assertion about a BD_Shape<T> object.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the BDS is the zero-dimension
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the BDS is the empty set;
+  - <EM>shortest-path closed</EM>: the BDS is represented by a shortest-path
+    closed system of bounded differences, so that all the constraints are
+    as tight as possible;
+  - <EM>shortest-path reduced</EM>: the BDS is represented by a shortest-path
+    closed system of bounded differences and each constraint in such a system
+    is marked as being either redundant or non-redundant.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>shortest-path reduced</EM> implies <EM>shortest-path closed</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_shortest_path_closed() const;
+  void reset_shortest_path_closed();
+  void set_shortest_path_closed();
+
+  bool test_shortest_path_reduced() const;
+  void reset_shortest_path_reduced();
+  void set_shortest_path_reduced();
+  //@}
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+    and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions.
+  //@{
+  static const flags_t ZERO_DIM_UNIV         = 0U;
+  static const flags_t EMPTY                 = 1U << 0;
+  static const flags_t SHORTEST_PATH_CLOSED  = 1U << 1;
+  static const flags_t SHORTEST_PATH_REDUCED = 1U << 2;
+  //@}
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+// Automatically generated from PPL source file ../src/BD_Shape.defs.hh line 1158
+#undef PPL_IN_BD_Shape_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  //! A matrix of Booleans indicating which constraints are redundant.
+  std::vector<std::deque<bool> > redundancy_dbm;
+
+  //! Returns <CODE>true</CODE> if the BDS is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty()const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the system of bounded differences
+    is known to be shortest-path closed.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that <CODE>this->dbm</CODE> is not shortest-path closed.
+  */
+  bool marked_shortest_path_closed()const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the system of bounded differences
+    is known to be shortest-path reduced.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that <CODE>this->dbm</CODE> is not shortest-path reduced.
+  */
+  bool marked_shortest_path_reduced()const;
+
+  //! Turns \p *this into an empty BDS.
+  void set_empty();
+
+  //! Turns \p *this into an zero-dimensional universe BDS.
+  void set_zero_dim_univ();
+
+  //! Assigns to <CODE>this->dbm</CODE> its shortest-path closure.
+  void shortest_path_closure_assign() const;
+
+  /*! \brief
+    Assigns to <CODE>this->dbm</CODE> its shortest-path closure and
+    records into <CODE>this->redundancy_dbm</CODE> which of the entries
+    in <CODE>this->dbm</CODE> are redundant.
+  */
+  void shortest_path_reduction_assign() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if <CODE>this->dbm</CODE>
+    is shortest-path closed and <CODE>this->redundancy_dbm</CODE>
+    correctly flags the redundant entries in <CODE>this->dbm</CODE>.
+  */
+  bool is_shortest_path_reduced() const;
+
+  //! Adds the constraint <CODE>dbm[i][j] \<= k</CODE>.
+  void add_dbm_constraint(dimension_type i, dimension_type j, N k);
+  //! Adds the constraint <CODE>dbm[i][j] \<= num/den</CODE>.
+  void add_dbm_constraint(dimension_type i, dimension_type j,
+			  Coefficient_traits::const_reference num,
+			  Coefficient_traits::const_reference den);
+
+  //! Removes all the constraints on row/column \p v.
+  void forget_all_dbm_constraints(dimension_type v);
+  //! Removes all binary constraints on row/column \p v.
+  void forget_binary_dbm_constraints(dimension_type v);
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each dbm index \p u (less than or equal to \p last_v and different
+    from \p v), deduce constraints of the form <CODE>v - u \<= c</CODE>,
+    starting from \p pos_sum which is an upper bound for \p v.
+
+    The shortest-path closure is able to deduce the constraint
+    <CODE>v - u \<= ub_v - lb_u</CODE>. We can be more precise if variable
+    \p u played an active role in the computation of the upper bound for
+    \p v, i.e., if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_den</CODE> is greater than zero. In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
+  */
+  void deduce_v_minus_u_bounds(dimension_type v,
+			       dimension_type last_v,
+			       const Linear_Expression& sc_expr,
+			       Coefficient_traits::const_reference sc_den,
+			       const N& pos_sum);
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each dbm index \p u (less than or equal to \p last_v and different
+    from \p v), deduce constraints of the form <CODE>u - v \<= c</CODE>,
+    starting from \p neg_sum which is a lower bound for \p v.
+
+    The shortest-path closure is able to deduce the constraint
+    <CODE>u - v \<= ub_u - lb_v</CODE>. We can be more precise if variable
+    \p u played an active role in the computation of the lower bound for
+    \p v, i.e., if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_den</CODE> is greater than zero.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>u - v \<= lb_u - lb_v</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>u - v \<= (q*lb_u + (1-q)*ub_u) - lb_v</CODE>.
+  */
+  void deduce_u_minus_v_bounds(dimension_type v,
+			       dimension_type last_v,
+			       const Linear_Expression& sc_expr,
+			       Coefficient_traits::const_reference sc_den,
+			       const N& neg_sum);
+
+  /*! \brief
+    Adds to \p limiting_shape the bounded differences in \p cs
+    that are satisfied by \p *this.
+  */
+  void get_limiting_shape(const Constraint_System& cs,
+			  BD_Shape& limiting_shape) const;
+
+  //! Compute the (zero-equivalence classes) predecessor relation.
+  /*!
+    It is assumed that the BDS is not empty and shortest-path closed.
+  */
+  void compute_predecessors(std::vector<dimension_type>& predecessor) const;
+
+  //! Compute the leaders of zero-equivalence classes.
+  /*!
+    It is assumed that the BDS is not empty and shortest-path closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& leaders) const;
+
+#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<<>(std::ostream& s,
+						      const BD_Shape<T>& c);
+#else
+  // This is too lax than wanted.
+  template <typename U>
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+						    const BD_Shape<U>& c);
+#endif
+
+  //! \name Exception Throwers
+  //@{
+  void throw_dimension_incompatible(const char* method,
+				    const BD_Shape& x) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    dimension_type required_dim) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Constraint& c) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const Generator& g) const;
+
+  void throw_dimension_incompatible(const char* method,
+				    const char* name_row,
+				    const Linear_Expression& y) const;
+
+  static void throw_constraint_incompatible(const char* method);
+
+  static void throw_expression_too_complex(const char* method,
+					   const Linear_Expression& e);
+
+  static void throw_generic(const char* method, const char* reason);
+  //@} // Exception Throwers
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+void swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
+	  Parma_Polyhedra_Library::BD_Shape<T>& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/BDS_Status.inlines.hh line 1
+/* BD_Shape<T>::Status class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+BD_Shape<T>::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+template <typename T>
+inline
+BD_Shape<T>::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_any(flags_t mask) const {
+  return flags & mask;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_empty() {
+  flags = EMPTY;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_shortest_path_closed() const {
+  return test_any(SHORTEST_PATH_CLOSED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_closed() {
+  // A system is reduced only if it is also closed.
+  reset(SHORTEST_PATH_CLOSED | SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_shortest_path_closed() {
+  set(SHORTEST_PATH_CLOSED);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_shortest_path_reduced() const {
+  return test_any(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_reduced() {
+  reset(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_shortest_path_reduced() {
+  assert(test_shortest_path_closed());
+  set(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+bool
+BD_Shape<T>::Status::OK() const {
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
+
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The empty flag is incompatible with any other one."
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // Shortest-path reduction implies shortest-path closure.
+  if (test_shortest_path_reduced())
+    if (test_shortest_path_closed())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The shortest-path reduction flag should also imply "
+		<< "the closure flag."
+		<< std::endl;
+#endif
+      return false;
+    }
+
+  // Any other case is OK.
+  return true;
+}
+
+
+namespace Implementation {
+
+namespace BD_Shapes {
+
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string sp_closed = "SPC";
+const std::string sp_reduced = "SPR";
+const char yes = '+';
+const char no = '-';
+const char sep = ' ';
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
+
+} // namespace BD_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+void
+BD_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::BD_Shapes;
+  s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ << sep
+    << (test_empty() ? yes : no) << empty << sep
+    << sep
+    << (test_shortest_path_closed() ? yes : no) << sp_closed << sep
+    << (test_shortest_path_reduced() ? yes : no) << sp_reduced << sep;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(T, BD_Shape<T>::Status);
+
+template <typename T>
+bool
+BD_Shape<T>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::BD_Shapes;
+  bool positive;
+
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
+
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, sp_closed, positive))
+    return false;
+  if (positive)
+    set_shortest_path_closed();
+  else
+    reset_shortest_path_closed();
+
+  if (!get_field(s, sp_reduced, positive))
+    return false;
+  if (positive)
+    set_shortest_path_reduced();
+  else
+    reset_shortest_path_reduced();
+
+  // Check for well-formedness.
+  assert(OK());
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/BD_Shape.inlines.hh line 1
+/* BD_Shape class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/BD_Shape.inlines.hh line 29
+#include <cassert>
+#include <vector>
+#include <iostream>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+namespace BD_Shapes {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extract the numerator and denominator components of \p from.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T, typename Policy>
+inline void
+numer_denom(const Checked_Number<T, Policy>& from,
+	    Coefficient& num, Coefficient& den) {
+  assert(!is_not_a_number(from)
+	 && !is_minus_infinity(from)
+	 && !is_plus_infinity(from));
+  mpq_class q;
+  assign_r(q, from, ROUND_NOT_NEEDED);
+  num = q.get_num();
+  den = q.get_den();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Divides \p x by \p y into \p to, rounding the result towards plus infinity.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T, typename Policy>
+inline void
+div_round_up(Checked_Number<T, Policy>& to,
+	     Coefficient_traits::const_reference x,
+	     Coefficient_traits::const_reference y) {
+  mpq_class qx;
+  mpq_class qy;
+  // Note: this code assumes that a Coefficient is always convertible
+  // to an mpq_class without loss of precision.
+  assign_r(qx, x, ROUND_NOT_NEEDED);
+  assign_r(qy, y, ROUND_NOT_NEEDED);
+  div_assign_r(qx, qx, qy, ROUND_NOT_NEEDED);
+  assign_r(to, qx, ROUND_UP);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the minimum between \p x and \p y.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename N>
+inline void
+min_assign(N& x, const N& y) {
+  if (x > y)
+    x = y;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the maximum between \p x and \p y.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename N>
+inline void
+max_assign(N& x, const N& y) {
+  if (x < y)
+    x = y;
+}
+
+} // namespace BD_Shapes
+} // namespace Implementation
+
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::max_space_dimension() {
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return std::min(DB_Matrix<N>::max_num_rows() - 1,
+		  DB_Matrix<N>::max_num_columns() - 1);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_empty() const {
+  return status.test_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_empty() {
+  status.set_empty();
+  assert(OK());
+  assert(marked_empty());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_closed() const {
+  return status.test_shortest_path_closed();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_reduced() const {
+  return status.test_shortest_path_reduced();
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const dimension_type num_dimensions,
+		      const Degenerate_Element kind)
+  : dbm(num_dimensions + 1), status(), redundancy_dbm() {
+  if (kind == EMPTY)
+    set_empty();
+  else {
+    if (num_dimensions > 0)
+      // A (non zero-dim) universe BDS is closed.
+      status.set_shortest_path_closed();
+  }
+  assert(OK());
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape& y)
+  : dbm(y.dbm), status(y.status), redundancy_dbm() {
+  if (y.marked_shortest_path_reduced())
+    redundancy_dbm = y.redundancy_dbm;
+}
+
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape<U>& y)
+  : dbm(y.dbm), status(), redundancy_dbm() {
+  // TODO: handle flags properly, possibly taking special cases into account.
+  if (y.marked_empty())
+    set_empty();
+  else if (y.status.test_zero_dim_univ())
+    set_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::add_constraint_and_minimize(const Constraint& c) {
+  add_constraint(c);
+  shortest_path_closure_assign();
+  return !marked_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_constraints(const Constraint_System& cs) {
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 iend = cs.end(); i != iend; ++i)
+    add_constraint(*i);
+  assert(OK());
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::add_constraints_and_minimize(const Constraint_System& cs) {
+  add_constraints(cs);
+  shortest_path_closure_assign();
+  return !marked_empty();
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Constraint_System& cs)
+  : dbm(cs.space_dimension() + 1), status(), redundancy_dbm() {
+  if (cs.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    status.set_shortest_path_closed();
+  add_constraints(cs);
+  assert(OK());
+}
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::affine_dimension() const {
+  const dimension_type space_dim = space_dimension();
+
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return 0;
+
+  // The vector `predecessor' is used to represent equivalence classes:
+  // `predecessor[i] == i' if and only if `i' is the leader of its
+  // equivalence class (i.e., the minimum index in the class);
+  std::vector<dimension_type> predecessor;
+  compute_predecessors(predecessor);
+
+  // Due to the fictitious variable `0', the affine dimension is one
+  // less the number of equivalence classes.
+  dimension_type affine_dim = 0;
+  // Note: disregard the first equivalence class.
+  for (dimension_type i = 1; i <= space_dim; ++i)
+    if (predecessor[i] == i)
+      ++affine_dim;
+
+  return affine_dim;
+}
+
+template <typename T>
+inline BD_Shape<T>&
+BD_Shape<T>::operator=(const BD_Shape& y) {
+  dbm = y.dbm;
+  status = y.status;
+  if (y.marked_shortest_path_reduced())
+    redundancy_dbm = y.redundancy_dbm;
+  return *this;
+}
+
+template <typename T>
+inline
+BD_Shape<T>::~BD_Shape() {
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::swap(BD_Shape& y) {
+  std::swap(dbm, y.dbm);
+  std::swap(status, y.status);
+  std::swap(redundancy_dbm, y.redundancy_dbm);
+}
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::space_dimension() const {
+  return dbm.num_rows() - 1;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_empty() const {
+  shortest_path_closure_assign();
+  return marked_empty();
+}
+
+template <typename T>
+inline bool
+operator==(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0)
+    if (x.marked_empty())
+      return y.marked_empty();
+    else
+      return !y.marked_empty();
+
+  // The exact equivalence test requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal
+  // if and only if the other BDS is empty too.
+  if (x.marked_empty())
+    return y.marked_empty();
+  if (y.marked_empty())
+    return false;
+  // Check for syntactic equivalence of the two (shortest-path closed)
+  // systems of bounded differences.
+  return x.dbm == y.dbm;
+}
+
+template <typename T>
+inline bool
+operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+  return !(x == y);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const BD_Shape<T>& x,
+			    const BD_Shape<T>& y,
+			    const Rounding_Dir dir,
+			    Temp& tmp0,
+			    Temp& tmp1,
+			    Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      r = PLUS_INFINITY;
+    return true;
+  }
+
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      r = PLUS_INFINITY;
+   return true;
+  }
+
+  return rectilinear_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const BD_Shape<T>& x,
+			    const BD_Shape<T>& y,
+			    const Rounding_Dir dir) {
+  static Checked_Number<Temp, Extended_Number_Policy> tmp0;
+  static Checked_Number<Temp, Extended_Number_Policy> tmp1;
+  static Checked_Number<Temp, Extended_Number_Policy> tmp2;
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			    const BD_Shape<T>& x,
+			    const BD_Shape<T>& y,
+			    const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const BD_Shape<T>& x,
+			  const BD_Shape<T>& y,
+			  const Rounding_Dir dir,
+			  Temp& tmp0,
+			  Temp& tmp1,
+			  Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      r = PLUS_INFINITY;
+    return true;
+  }
+
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      r = PLUS_INFINITY;
+   return true;
+  }
+
+  return euclidean_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const BD_Shape<T>& x,
+			  const BD_Shape<T>& y,
+			  const Rounding_Dir dir) {
+  static Checked_Number<Temp, Extended_Number_Policy> tmp0;
+  static Checked_Number<Temp, Extended_Number_Policy> tmp1;
+  static Checked_Number<Temp, Extended_Number_Policy> tmp2;
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			  const BD_Shape<T>& x,
+			  const BD_Shape<T>& y,
+			  const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const BD_Shape<T>& x,
+			   const BD_Shape<T>& y,
+			   const Rounding_Dir dir,
+			   Temp& tmp0,
+			   Temp& tmp1,
+			   Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      r = PLUS_INFINITY;
+    return true;
+  }
+
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+   if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      r = PLUS_INFINITY;
+   return true;
+  }
+
+  return l_infinity_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const BD_Shape<T>& x,
+			   const BD_Shape<T>& y,
+			   const Rounding_Dir dir) {
+  static Checked_Number<Temp, Extended_Number_Policy> tmp0;
+  static Checked_Number<Temp, Extended_Number_Policy> tmp1;
+  static Checked_Number<Temp, Extended_Number_Policy> tmp2;
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+			   const BD_Shape<T>& x,
+			   const BD_Shape<T>& y,
+			   const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+				const dimension_type j,
+				N k) {
+  // Private method: the caller has to ensure the following.
+  assert(i <= space_dimension() && j <= space_dimension() && i != j);
+  N& dbm_ij = dbm[i][j];
+  if (dbm_ij > k) {
+    dbm_ij = k;
+    if (marked_shortest_path_closed())
+      status.reset_shortest_path_closed();
+  }
+  assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+				const dimension_type j,
+				Coefficient_traits::const_reference num,
+				Coefficient_traits::const_reference den) {
+  // Private method: the caller has to ensure the following.
+  assert(i <= space_dimension() && j <= space_dimension() && i != j);
+  assert(den != 0);
+  N k;
+  Implementation::BD_Shapes::div_round_up(k, num, den);
+  add_dbm_constraint(i, j, k);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::strictly_contains(const BD_Shape& y) const {
+  const BD_Shape<T>& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bds_hull_assign_and_minimize(const BD_Shape& y) {
+  bds_hull_assign(y);
+  assert(marked_empty()
+	 || space_dimension() == 0 || marked_shortest_path_closed());
+  return !marked_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::upper_bound_assign(const BD_Shape& y) {
+  bds_hull_assign(y);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bds_hull_assign_if_exact(const BD_Shape&) {
+  // TODO: this must be properly implemented.
+  return false;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::upper_bound_assign_if_exact(const BD_Shape& y) {
+  return bds_hull_assign_if_exact(y);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::difference_assign(const BD_Shape& y) {
+  bds_difference_assign(y);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::remove_higher_space_dimensions(const dimension_type new_dim) {
+  // Dimension-compatibility check: the variable having
+  // maximum index is the one occurring last in the set.
+  if (new_dim > space_dimension())
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+				 new_dim);
+
+  // The removal of no dimensions from any BDS is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a zero-dim space BDS.
+  if (new_dim == space_dimension()) {
+    assert(OK());
+    return;
+  }
+
+  // Shortest-path closure is necessary as in remove_space_dimensions().
+  shortest_path_closure_assign();
+  dbm.resize_no_copy(new_dim + 1);
+
+  // Shortest-path closure is maintained.
+  // TODO: see whether or not reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    status.reset_shortest_path_reduced();
+
+  // If we removed _all_ dimensions from a non-empty BDS,
+  // the zero-dim universe BDS has been obtained.
+  if (new_dim == 0 && !marked_empty())
+    set_zero_dim_univ();
+  assert(OK());
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::intersection_assign_and_minimize(const BD_Shape& y) {
+  intersection_assign(y);
+  shortest_path_closure_assign();
+  return !marked_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp) {
+  static N stop_points[] = {
+    N(-2, ROUND_UP),
+    N(-1, ROUND_UP),
+    N( 0, ROUND_UP),
+    N( 1, ROUND_UP),
+    N( 2, ROUND_UP)
+  };
+  CC76_extrapolation_assign(y,
+			    stop_points,
+			    stop_points
+			    + sizeof(stop_points)/sizeof(stop_points[0]),
+			    tp);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::H79_widening_assign(const BD_Shape& y, unsigned* tp) {
+  // See the documentation for polyhedra.
+  C_Polyhedron px(constraints());
+  C_Polyhedron py(y.constraints());
+  px.H79_widening_assign(py, tp);
+  BD_Shape x(px);
+  swap(x);
+  assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::limited_H79_extrapolation_assign(const BD_Shape& y,
+					      const Constraint_System& cs,
+					      unsigned* tp) {
+  // See the documentation for polyhedra.
+  C_Polyhedron px(constraints());
+  C_Polyhedron py(y.constraints());
+  px.limited_H79_extrapolation_assign(py, cs, tp);
+  BD_Shape x(px);
+  swap(x);
+  assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::time_elapse_assign(const BD_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("time_elapse_assign(y)", y);
+  // See the documentation for polyhedra.
+  C_Polyhedron px(constraints());
+  C_Polyhedron py(y.constraints());
+  px.time_elapse_assign(py);
+  BD_Shape x(px);
+  swap(x);
+  assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::forget_all_dbm_constraints(const dimension_type v) {
+  assert(0 < v && v <= dbm.num_rows());
+  DB_Row<N>& dbm_v = dbm[v];
+  for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+    dbm_v[i] = PLUS_INFINITY;
+    dbm[i][v] = PLUS_INFINITY;
+  }
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::forget_binary_dbm_constraints(const dimension_type v) {
+  assert(0 < v && v <= dbm.num_rows());
+  DB_Row<N>& dbm_v = dbm[v];
+  for (dimension_type i = dbm.num_rows()-1; i > 0; --i) {
+    dbm_v[i] = PLUS_INFINITY;
+    dbm[i][v] = PLUS_INFINITY;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
+     Parma_Polyhedra_Library::BD_Shape<T>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/BD_Shape.templates.hh line 1
+/* BD_Shape class implementation: non-inline template functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/BD_Shape.templates.hh line 29
+#include <cassert>
+#include <vector>
+#include <deque>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Generator_System& gs)
+  : dbm(gs.space_dimension() + 1), status(), redundancy_dbm() {
+  using Implementation::BD_Shapes::max_assign;
+  using Implementation::BD_Shapes::div_round_up;
+
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty polyhedron.
+    set_empty();
+    assert(OK());
+    return;
+  }
+
+  const dimension_type space_dim = space_dimension();
+  DB_Row<N>& dbm_0 = dbm[0];
+  N tmp;
+
+  bool dbm_initialized = false;
+  bool point_seen = false;
+  // Going through all the points and closure points.
+  for (Generator_System::const_iterator i = gs_begin; i != gs_end; ++i) {
+    const Generator& g = *i;
+    switch (g.type()) {
+    case Generator::POINT:
+      point_seen = true;
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      if (!dbm_initialized) {
+	// When handling the first (closure) point, we initialize the DBM.
+	dbm_initialized = true;
+	const Coefficient& d = g.divisor();
+	for (dimension_type i = space_dim; i > 0; --i) {
+	  const Coefficient& g_i = g.coefficient(Variable(i-1));
+	  DB_Row<N>& dbm_i = dbm[i];
+	  for (dimension_type j = space_dim; j > 0; --j)
+	    if (i != j)
+	      div_round_up(dbm_i[j], g.coefficient(Variable(j-1)) - g_i, d);
+	  div_round_up(dbm_i[0], -g_i, d);
+	}
+	for (dimension_type j = space_dim; j > 0; --j)
+	  div_round_up(dbm_0[j], g.coefficient(Variable(j-1)), d);
+	// Note: no need to initialize the first element of the main diagonal.
+      }
+      else {
+	// This is not the first point: the DBM already contains
+	// valid values and we must compute maxima.
+	const Coefficient& d = g.divisor();
+	for (dimension_type i = space_dim; i > 0; --i) {
+	  const Coefficient& g_i = g.coefficient(Variable(i-1));
+	  DB_Row<N>& dbm_i = dbm[i];
+	  // The loop correctly handles the case when i == j.
+	  for (dimension_type j = space_dim; j > 0; --j) {
+	    div_round_up(tmp, g.coefficient(Variable(j-1)) - g_i, d);
+	    max_assign(dbm_i[j], tmp);
+	  }
+	  div_round_up(tmp, -g_i, d);
+	  max_assign(dbm_i[0], tmp);
+	}
+	for (dimension_type j = space_dim; j > 0; --j) {
+	  div_round_up(tmp, g.coefficient(Variable(j-1)), d);
+	  max_assign(dbm_0[j], tmp);
+	}
+      }
+      break;
+    default:
+      // Lines and rays temporarily ignored.
+      break;
+    }
+  }
+
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw std::invalid_argument("PPL::BD_Shape<T>::BD_Shape(gs):\n"
+				"the non-empty generator system gs "
+				"contains no points.");
+
+  // Going through all the lines and rays.
+  for (Generator_System::const_iterator i = gs_begin; i != gs_end; ++i) {
+    const Generator& g = *i;
+    switch (g.type()) {
+    case Generator::LINE:
+      for (dimension_type i = space_dim; i > 0; --i) {
+	const Coefficient& g_i = g.coefficient(Variable(i-1));
+	DB_Row<N>& dbm_i = dbm[i];
+	// The loop correctly handles the case when i == j.
+	for (dimension_type j = space_dim; j > 0; --j)
+	  if (g_i != g.coefficient(Variable(j-1)))
+	    dbm_i[j] = PLUS_INFINITY;
+	if (g_i != 0)
+	  dbm_i[0] = PLUS_INFINITY;
+      }
+      for (dimension_type j = space_dim; j > 0; --j)
+	if (g.coefficient(Variable(j-1)) != 0)
+	  dbm_0[j] = PLUS_INFINITY;
+      break;
+    case Generator::RAY:
+      for (dimension_type i = space_dim; i > 0; --i) {
+	const Coefficient& g_i = g.coefficient(Variable(i-1));
+	DB_Row<N>& dbm_i = dbm[i];
+	// The loop correctly handles the case when i == j.
+	for (dimension_type j = space_dim; j > 0; --j)
+	  if (g_i < g.coefficient(Variable(j-1)))
+	    dbm_i[j] = PLUS_INFINITY;
+	if (g_i < 0)
+	  dbm_i[0] = PLUS_INFINITY;
+      }
+      for (dimension_type j = space_dim; j > 0; --j)
+	if (g.coefficient(Variable(j-1)) > 0)
+	  dbm_0[j] = PLUS_INFINITY;
+      break;
+    default:
+      // Points and closure points already dealt with.
+      break;
+    }
+  }
+  status.set_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
+  : dbm(), status(), redundancy_dbm() {
+  using Implementation::BD_Shapes::div_round_up;
+  const dimension_type num_dimensions = ph.space_dimension();
+
+  if (ph.marked_empty()) {
+    *this = BD_Shape(num_dimensions, EMPTY);
+    return;
+  }
+
+  if (num_dimensions == 0) {
+    *this = BD_Shape(num_dimensions, UNIVERSE);
+    return;
+  }
+
+  // Build from generators when we do not care about complexity
+  // or when the process has polynomial complexity.
+  if (complexity == ANY_COMPLEXITY
+      || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+    *this = BD_Shape(ph.generators());
+    return;
+  }
+
+  // We cannot afford exponential complexity, we do not have a complete set
+  // of generators for the polyhedron, and the polyhedron is not trivially
+  // empty or zero-dimensional.  Constraints, however, are up to date.
+  assert(ph.constraints_are_up_to_date());
+
+  if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+    // If the constraint system of the polyhedron is minimized,
+    // the test `is_universe()' has polynomial complexity.
+    if (ph.is_universe()) {
+      *this = BD_Shape(num_dimensions, UNIVERSE);
+      return;
+    }
+  }
+
+  // See if there is at least one inconsistent constraint in `ph.con_sys'.
+  for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+	 cs_end = ph.con_sys.end(); i != cs_end; ++i)
+    if (i->is_inconsistent()) {
+      *this = BD_Shape(num_dimensions, EMPTY);
+      return;
+    }
+
+  // If `complexity' allows it, use simplex to derive the exact (modulo
+  // the fact that our BDSs are topologically closed) variable bounds.
+  if (complexity == SIMPLEX_COMPLEXITY) {
+    LP_Problem lp;
+    lp.set_optimization_mode(MAXIMIZATION);
+
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+	     iend = ph_cs.end(); i != iend; ++i) {
+	const Constraint& c = *i;
+	lp.add_constraint(c.is_equality()
+			  ? (Linear_Expression(c) == 0)
+			  : (Linear_Expression(c) >= 0));
+      }
+
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      *this = BD_Shape(num_dimensions, EMPTY);
+      return;
+    }
+
+    // Get all the upper bounds.
+    LP_Problem_Status lp_status;
+    Generator g(point());
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
+    for (dimension_type i = 1; i <= num_dimensions; ++i) {
+      Variable x(i-1);
+      // Evaluate optimal upper bound for `x <= ub'.
+      lp.set_objective_function(x);
+      lp_status = lp.solve();
+      if (lp_status == UNBOUNDED_LP_PROBLEM)
+	dbm[0][i] = PLUS_INFINITY;
+      else {
+	assert(lp_status == OPTIMIZED_LP_PROBLEM);
+	g = lp.optimizing_point();
+	lp.evaluate_objective_function(g, num, den);
+	div_round_up(dbm[0][i], num, den);
+      }
+      // Evaluate optimal upper bound for `x - y <= ub'.
+      for (dimension_type j = 1; j <= num_dimensions; ++j) {
+	if (i == j)
+	  continue;
+	Variable y(j-1);
+	lp.set_objective_function(x - y);
+	lp_status = lp.solve();
+	if (lp_status == UNBOUNDED_LP_PROBLEM)
+	  dbm[j][i] = PLUS_INFINITY;
+	else {
+	  assert(lp_status == OPTIMIZED_LP_PROBLEM);
+	  g = lp.optimizing_point();
+	  lp.evaluate_objective_function(g, num, den);
+	  div_round_up(dbm[j][i], num, den);
+	}
+      }
+      // Evaluate optimal upper bound for `-x <= ub'.
+      lp.set_objective_function(-x);
+      lp_status = lp.solve();
+      if (lp_status == UNBOUNDED_LP_PROBLEM)
+	dbm[i][0] = PLUS_INFINITY;
+      else {
+	assert(lp_status == OPTIMIZED_LP_PROBLEM);
+	g = lp.optimizing_point();
+	lp.evaluate_objective_function(g, num, den);
+	div_round_up(dbm[i][0], num, den);
+      }
+    }
+    status.set_shortest_path_closed();
+    return;
+  }
+
+  // Extract easy-to-find bounds from constraints.
+  *this = BD_Shape(ph.con_sys);
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_constraint(const Constraint& c) {
+  using Implementation::BD_Shapes::div_round_up;
+
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", c);
+  // Strict inequalities are not allowed.
+  if (c.is_strict_inequality())
+    throw_constraint_incompatible("add_constraint(c)");
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  // Constraints that are not bounded differences are ignored.
+  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
+    return;
+
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if (c.inhomogeneous_term() < 0)
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+  N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+  if (coeff < 0)
+    coeff = -coeff;
+
+  bool changed = false;
+  // Compute the bound for `x', rounding towards plus infinity.
+  N d;
+  div_round_up(d, c.inhomogeneous_term(), coeff);
+  if (x > d) {
+    x = d;
+    changed = true;
+  }
+
+  if (c.is_equality()) {
+    // Also compute the bound for `y', rounding towards plus infinity.
+    div_round_up(d, -c.inhomogeneous_term(), coeff);
+    if (y > d) {
+      y = d;
+      changed = true;
+    }
+  }
+
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the system of bounded differences.
+  if (changed && marked_shortest_path_closed())
+    status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::concatenate_assign(const BD_Shape& y) {
+  BD_Shape& x = *this;
+
+  const dimension_type x_space_dim = x.space_dimension();
+  const dimension_type y_space_dim = y.space_dimension();
+
+  // If `y' is an empty 0-dim space system of bounded differences,
+  // let `*this' become empty.
+  if (y_space_dim == 0 && y.marked_empty()) {
+    set_empty();
+    assert(OK());
+    return;
+  }
+
+  // If `x' is an empty 0-dim space BDS, then it is sufficient to adjust
+  // the dimension of the vector space.
+  if (x_space_dim == 0 && marked_empty()) {
+    dbm.grow(y_space_dim + 1);
+    assert(OK());
+    return;
+  }
+  // First we increase the space dimension of `x' by adding
+  // `y.space_dimension()' new dimensions.
+  // The matrix for the new system of constraints is obtained
+  // by leaving the old system of constraints in the upper left-hand side
+  // and placing the constraints of `y' in the lower right-hand side,
+  // except the constraints as `y(i) >= cost' or `y(i) <= cost', that are
+  // placed in the right position on the new matrix.
+  add_space_dimensions_and_embed(y_space_dim);
+  const dimension_type new_space_dim = x_space_dim + y_space_dim;
+  for (dimension_type i = x_space_dim + 1; i <= new_space_dim; ++i) {
+    DB_Row<N>& dbm_i = dbm[i];
+    dbm_i[0] = y.dbm[i - x_space_dim][0];
+    dbm[0][i] = y.dbm[0][i - x_space_dim];
+    for (dimension_type j = x_space_dim + 1; j <= new_space_dim; ++j)
+      dbm_i[j] = y.dbm[i - x_space_dim][j - x_space_dim];
+  }
+
+  if (marked_shortest_path_closed())
+    status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::contains(const BD_Shape& y) const {
+  const BD_Shape<T>& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    throw_dimension_incompatible("contains(y)", y);
+
+  // The zero-dimensional universe shape contains any other
+  // dimension-compatible shape.
+  // The zero-dimensional empty shape only contains another
+  // zero-dimensional empty shape.
+  if (x_space_dim == 0) {
+    if (!marked_empty())
+      return true;
+    else
+      return y.marked_empty();
+  }
+
+  /*
+    The `y' system of bounded differences need be closed.
+    In fact if, for example, in `*this' we have the constraints:
+
+    x1 - x2 <= 1;
+    x1      <= 3;
+    x2      <= 2;
+
+    in `y' the constraints are:
+
+    x1 - x2 <= 0;
+    x2      <= 1;
+
+    without closure it returns "false", instead if we close `y' we have
+    the implicit constraint
+
+    x1      <= 1;
+
+    and so we obtain the right result "true".
+  */
+  y.shortest_path_closure_assign();
+
+  // An empty shape is contained in any other dimension-compatible shapes.
+  if (y.marked_empty())
+    return true;
+
+  // `*this' contains `y' if and only if every cell of `dbm'
+  // is greater than or equal to the correspondent one of `y.dbm'.
+  for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& x_dbm_i = x.dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = x_space_dim + 1; j-- > 0; )
+      if (x_dbm_i[j] < y_dbm_i[j])
+	return false;
+  }
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_universe() const {
+  if (marked_empty())
+    return false;
+
+  const dimension_type space_dim = space_dimension();
+  // If the BDS is non-empty and zero-dimensional,
+  // then it is necessarily the universe BDS.
+  if (space_dim == 0)
+    return true;
+
+  // A system of bounded differences defining the universe BDS can only
+  // contain trivial constraints.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; )
+      if (!is_plus_infinity(dbm_i[j]))
+	return false;
+  }
+  return true;
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::compute_predecessors(std::vector<dimension_type>& predecessor) const {
+  assert(!marked_empty() && marked_shortest_path_closed());
+  assert(predecessor.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `predecessor' is used to indicate which variable
+  // immediately precedes a given one in the corresponding equivalence class.
+  // The `leader' of an equivalence class is the element having minimum
+  // index: leaders are their own predecessors.
+  const dimension_type pred_size = dbm.num_rows();
+  // Initially, each variable is leader of its own zero-equivalence class.
+  predecessor.reserve(pred_size);
+  for (dimension_type i = 0; i < pred_size; ++i)
+    predecessor.push_back(i);
+  // Now compute actual predecessors.
+  for (dimension_type i = pred_size; i-- > 1; )
+    if (i == predecessor[i]) {
+      const DB_Row<N>& dbm_i = dbm[i];
+      for (dimension_type j = i; j-- > 0; )
+	if (j == predecessor[j]) {
+	  N negated_dbm_ji;
+	  if (neg_assign_r(negated_dbm_ji, dbm[j][i], ROUND_NOT_NEEDED) == V_EQ
+	      && negated_dbm_ji == dbm_i[j]) {
+	    // Choose as predecessor the variable having the smaller index.
+	    predecessor[i] = j;
+	    break;
+	  }
+	}
+    }
+}
+
+template <typename T>
+void
+BD_Shape<T>::compute_leaders(std::vector<dimension_type>& leaders) const {
+  assert(!marked_empty() && marked_shortest_path_closed());
+  assert(leaders.size() == 0);
+  // Compute predecessor information.
+  compute_predecessors(leaders);
+  // Flatten the predecessor chains so as to obtain leaders.
+  assert(leaders[0] == 0);
+  for (dimension_type i = 1, iend = leaders.size(); i != iend; ++i) {
+    const dimension_type l_i = leaders[i];
+    assert(l_i <= i);
+    if (l_i != i) {
+      const dimension_type ll_i = leaders[l_i];
+      assert(ll_i == leaders[ll_i]);
+      leaders[i] = ll_i;
+    }
+  }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_shortest_path_reduced() const {
+  // If the BDS is empty, it is also reduced.
+  if (marked_empty())
+    return true;
+
+  // A shortest-path reduced dbm is just a dbm with an indication of
+  // those constraints that are redundant. If there is no indication
+  // of the redundant constraints, then it cannot be reduced.
+  if (!marked_shortest_path_reduced())
+    return false;
+
+  const BD_Shape x_copy = *this;
+  const dimension_type x_space_dim = x_copy.space_dimension();
+  x_copy.shortest_path_closure_assign();
+  // If we just discovered emptyness, it cannot be reduced.
+  if (x_copy.marked_empty())
+    return false;
+
+  // The vector `leader' is used to indicate which variables are equivalent.
+  std::vector<dimension_type> leader(x_space_dim + 1);
+
+  // We store the leader.
+  for (dimension_type i = x_space_dim + 1; i-- > 0; )
+    leader[i] = i;
+
+  // Step 1: we store really the leader with the corrected value.
+  // We search for the equivalent or zero-equivalent variables.
+  // The variable(i-1) and variable(j-1) are equivalent if and only if
+  // m_i_j == -(m_j_i).
+  for (dimension_type i = 0; i < x_space_dim; ++i) {
+    const DB_Row<N>& xdbm_i = x_copy.dbm[i];
+    for (dimension_type j = i + 1; j <= x_space_dim; ++j) {
+      N negated_xdbm_ji;
+      if (neg_assign_r(negated_xdbm_ji, x_copy.dbm[j][i],
+		       ROUND_NOT_NEEDED) == V_EQ
+	  && negated_xdbm_ji == xdbm_i[j])
+	// Two equivalent variables have got the same leader
+	// (the smaller variable).
+	leader[j] = leader[i];
+    }
+  }
+
+  // Step 2: we check if there are redundant constraints in the zero_cycle
+  // free systems of bounded differences, considering only the leaders.
+  // A constraint `c' is redundant, when there are two constraints such that
+  // their sum is the same constraint with the inhomogeneous term
+  // less than or equal to the `c' one.
+  N c;
+  for (dimension_type k = 0; k <= x_space_dim; ++k)
+    if (leader[k] == k) {
+      const DB_Row<N>& x_k = x_copy.dbm[k];
+      for (dimension_type i = 0; i <= x_space_dim; ++i)
+	if (leader[i] == i) {
+	  const DB_Row<N>& x_i = x_copy.dbm[i];
+	  const std::deque<bool>& redundancy_i = redundancy_dbm[i];
+	  const N& x_i_k = x_i[k];
+	  for (dimension_type j = 0; j <= x_space_dim; ++j)
+	    if (leader[j] == j) {
+	      const N& x_i_j = x_i[j];
+	      if (!is_plus_infinity(x_i_j)) {
+		add_assign_r(c, x_i_k, x_k[j], ROUND_UP);
+		if (x_i_j >= c && !redundancy_i[j])
+		  return false;
+	      }
+	    }
+	}
+    }
+
+  // The vector `var_conn' is used to check if there is a single cycle
+  // that connected all zero-equivalent variables between them.
+  // The value `space_dim + 1' is used to indicate that the equivalence
+  // class contains a single variable.
+  std::vector<dimension_type> var_conn(x_space_dim + 1);
+  for (dimension_type i = x_space_dim + 1; i-- > 0; )
+    var_conn[i] = x_space_dim + 1;
+
+  // Step 3: we store really the `var_conn' with the right value, putting
+  // the variable with the selected variable is connected:
+  // we check the row of each variable:
+  // a- each leader could be connected with only zero-equivalent one,
+  // b- each no-leader with only another zero-equivalent one.
+  for (dimension_type i = 0; i <= x_space_dim; ++i) {
+    // It count with how many variables the selected variable is
+    // connected.
+    dimension_type t = 0;
+    dimension_type ld_i = leader[i];
+    // Case a: leader.
+    if (ld_i == i) {
+      for (dimension_type j = 0; j <= x_space_dim; ++j) {
+	dimension_type ld_j = leader[j];
+	// Only the connectedness with equivalent variables
+	// is considered.
+	if (j != ld_j)
+	  if (!redundancy_dbm[i][j]) {
+	    if (t == 1)
+	      // Two no-leaders couldn't connected with the same leader.
+	      return false;
+	    else
+	      if (ld_j != i)
+		// The variables isn't in the same equivalence class.
+		return false;
+	      else {
+		++t;
+		var_conn[i] = j;
+	      }
+	  }
+      }
+    }
+    // Case b: no-leader.
+    else {
+      for (dimension_type j = 0; j <= x_space_dim; ++j) {
+	if (!redundancy_dbm[i][j]) {
+	  dimension_type ld_j = leader[j];
+	  if (ld_i != ld_j)
+	    // The variables isn't in the same equivalence class.
+	    return false;
+	  else {
+	    if (t == 1)
+	      // Two variables couldn't connected with the same leader.
+	      return false;
+	    else {
+	      ++t;
+	      var_conn[i] = j;
+	    }
+	  }
+	  // A no-leader must be connected with
+	  // another variable.
+	  if (t == 0)
+	    return false;
+	}
+      }
+    }
+  }
+
+  // The vector `just_checked' is used to check if
+  // a variable is already checked.
+  std::vector<bool> just_checked(x_space_dim + 1);
+  for (dimension_type i = x_space_dim + 1; i-- > 0; )
+    just_checked[i] = false;
+
+  // Step 4: we check if there are single cycles that
+  // connected all the zero-equivalent variables between them.
+  for (dimension_type i = 0; i <= x_space_dim; ++i) {
+    bool jc_i = just_checked[i];
+    // We do not re-check the already considered single cycles.
+    if (!jc_i) {
+      dimension_type v_con = var_conn[i];
+      // We consider only the equivalence classes with
+      // 2 or plus variables.
+      if (v_con != x_space_dim + 1) {
+	// There is a single cycle if taken a variable,
+	// we return to this same variable.
+	while (v_con != i) {
+	  just_checked[v_con] = true;
+	  v_con = var_conn[v_con];
+	  // If we re-pass to an already considered variable,
+	  // then we haven't a single cycle.
+	  if (just_checked[v_con])
+	    return false;
+	}
+      }
+    }
+    just_checked[i] = true;
+  }
+
+  // The system bounded differences is just reduced.
+  return true;
+}
+
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Constraint& c) const {
+  using Implementation::BD_Shapes::div_round_up;
+
+  const dimension_type c_space_dim = c.space_dimension();
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
+
+  shortest_path_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+	|| (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_disjoint();
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  TEMP_INTEGER(coeff);
+  // Constraints that are not bounded differences are not compatible.
+  if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
+    throw_constraint_incompatible("relation_with(c)");
+
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    switch (sgn(c.inhomogeneous_term())) {
+    case -1:
+      return Poly_Con_Relation::is_disjoint();
+    case 0:
+      if (c.is_strict_inequality())
+	return Poly_Con_Relation::saturates()
+	  && Poly_Con_Relation::is_disjoint();
+      else
+	return Poly_Con_Relation::saturates()
+	  && Poly_Con_Relation::is_included();
+    case 1:
+      return Poly_Con_Relation::is_included();
+    }
+  }
+
+  // Select the cell to be checked for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+  const N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+  if (coeff < 0)
+    coeff = -coeff;
+  N d;
+  div_round_up(d, c.inhomogeneous_term(), coeff);
+  N d1;
+  div_round_up(d1, -c.inhomogeneous_term(), coeff);
+
+  switch (c.type()) {
+  case Constraint::EQUALITY:
+    if (d == x && d1 == y)
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+    else if (d < y && d1 > x)
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::strictly_intersects();
+  case Constraint::NONSTRICT_INEQUALITY:
+    if (d >= x && d1 >= y)
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_included();
+    else if (d >= x)
+      return Poly_Con_Relation::is_included();
+    else if (d < x && d1 > y)
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::strictly_intersects();
+  case Constraint::STRICT_INEQUALITY:
+    if (d >= x && d1 >= y)
+      return Poly_Con_Relation::saturates()
+	&& Poly_Con_Relation::is_disjoint();
+    else if (d > x)
+      return Poly_Con_Relation::is_included();
+    else if (d <= x && d1 >= y)
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::strictly_intersects();
+  }
+  // Quiet a compiler warning: this program point is unreachable.
+  throw std::runtime_error("PPL internal error");
+}
+
+template <typename T>
+Poly_Gen_Relation
+BD_Shape<T>::relation_with(const Generator& g) const {
+  const dimension_type space_dim = space_dimension();
+  const dimension_type g_space_dim = g.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
+
+  // The empty bdiff cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe BD shape in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  const bool is_line = g.is_line();
+
+  // The relation between the bdiff and the given generator is obtained
+  // checking if the generator satisfies all the constraints in the bdiff.
+  // To check if the generator satisfies all the constraints it's enough
+  // studying the sign of the scalar product between the generator and
+  // all the constraints in the bdiff.
+
+  // We find in `*this' all the constraints.
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    for (dimension_type j = i + 1; j <= space_dim; ++j) {
+      const Variable x(j - 1);
+      const bool x_dimension_incompatible = x.space_dimension() > g_space_dim;
+      const N& dbm_ij = dbm[i][j];
+      const N& dbm_ji = dbm[j][i];
+      N negated_dbm_ji;
+      const bool is_equality
+	= neg_assign_r(negated_dbm_ji, dbm_ji, ROUND_NOT_NEEDED) == V_EQ
+	&& negated_dbm_ji == dbm_ij;
+      const bool dbm_ij_is_infinity = is_plus_infinity(dbm_ij);
+      const bool dbm_ji_is_infinity = is_plus_infinity(dbm_ji);
+      if (i != 0) {
+	const Variable y(i - 1);
+	const bool y_dimension_incompatible
+	  = y.space_dimension() > g_space_dim;
+	const bool is_trivial_zero
+	  = (x_dimension_incompatible && g.coefficient(y) == 0)
+	  || (y_dimension_incompatible && g.coefficient(x) == 0)
+	  || (x_dimension_incompatible && y_dimension_incompatible);
+	if (is_equality) {
+	  // We have one equality constraint.
+	  // The constraint has form ax - ay = b.
+	  // The scalar product has the form
+	  // 'a * y_i - a * x_j'
+	  // where y_i = g.coefficient(y) and x_j = g.coefficient(x).
+	  // It is not zero when both the coefficients of the
+	  // variables x and y are not zero or when these coefficients
+ 	  if (!is_trivial_zero && g.coefficient(x) != g.coefficient(y))
+	    return Poly_Gen_Relation::nothing();
+	}
+	else
+	  // We have the binary inequality constraints.
+	  if (!dbm_ij_is_infinity) {
+	  // The constraint has form ax - ay <= b.
+	  // The scalar product has the form
+	  // 'a * y_i - a * x_j'
+	    if (is_line
+		&& !is_trivial_zero
+		&& g.coefficient(x) != g.coefficient(y))
+	      return Poly_Gen_Relation::nothing();
+	    else
+	      if (g.coefficient(y) < g.coefficient(x))
+		return Poly_Gen_Relation::nothing();
+	  }
+	  else if (!dbm_ji_is_infinity) {
+	    // The constraint has form ay - ax <= b.
+	    // The scalar product has the form
+	    // 'a * x_j - a* y_i'.
+	    if (is_line
+		&& !is_trivial_zero
+		&& g.coefficient(x) != g.coefficient(y))
+	      return Poly_Gen_Relation::nothing();
+	    else if (g.coefficient(x) < g.coefficient(y))
+	      return Poly_Gen_Relation::nothing();
+	  }
+      }
+      else {
+	// Here i == 0.
+	if (is_equality) {
+	  // The constraint has form ax = b.
+	  // To satisfy the constraint it's necessary that the scalar product
+	  // is not zero.It happens when the coefficient of the variable 'x'
+	  // in the generator is not zero, because the scalar
+	  // product has the form:
+	  // 'a * x_i' where x_i = g.coefficient(x)..
+	  if (!x_dimension_incompatible && g.coefficient(x) != 0)
+	    return Poly_Gen_Relation::nothing();
+	}
+	else
+	  // We have the unary inequality constraints.
+	  if (!dbm_ij_is_infinity) {
+	    // The constraint has form ax <= b.
+	    // The scalar product has the form:
+	    // '-a * x_i' where x_i = g.coefficient(x).
+	    if (is_line
+		&& !x_dimension_incompatible
+		&& g.coefficient(x) != 0)
+	      return Poly_Gen_Relation::nothing();
+	    else if (g.coefficient(x) > 0)
+	      return Poly_Gen_Relation::nothing();
+	  }
+	  else if (!dbm_ji_is_infinity) {
+	    // The constraint has form -ax <= b.
+	    // The scalar product has the form:
+	    // 'a * x_i' where x_i = g.coefficient(x).
+	    if (is_line
+		&& !x_dimension_incompatible
+		&& g.coefficient(x) != 0)
+	      return Poly_Gen_Relation::nothing();
+	    else if (g.coefficient(x) < 0)
+	      return Poly_Gen_Relation::nothing();
+	  }
+      }
+    }
+  }
+  return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_closure_assign() const {
+  using Implementation::BD_Shapes::min_assign;
+
+  // Do something only if necessary.
+  if (marked_empty() || marked_shortest_path_closed())
+    return;
+  const dimension_type num_dimensions = space_dimension();
+  // Zero-dimensional BDSs are necessarily shortest-path closed.
+  if (num_dimensions == 0)
+    return;
+
+  // Even though the BDS will not change, its internal representation
+  // is going to be modified by the Floyd-Warshall algorithm.
+  BD_Shape& x = const_cast<BD_Shape<T>&>(*this);
+
+  // Fill the main diagonal with zeros.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    assert(is_plus_infinity(x.dbm[h][h]));
+    assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+  }
+
+  N sum;
+  for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+    const DB_Row<N>& xdbm_k = x.dbm[k];
+    for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+      DB_Row<N>& xdbm_i = x.dbm[i];
+      const N& xdbm_i_k = xdbm_i[k];
+      if (!is_plus_infinity(xdbm_i_k))
+	for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+	  const N& xdbm_k_j = xdbm_k[j];
+	  if (!is_plus_infinity(xdbm_k_j)) {
+	    // Rounding upward for correctness.
+	    add_assign_r(sum, xdbm_i_k, xdbm_k_j, ROUND_UP);
+	    min_assign(xdbm_i[j], sum);
+	  }
+	}
+    }
+  }
+
+  // Check for emptyness: the BDS is empty if and only if there is a
+  // negative value on the main diagonal of `dbm'.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    N& x_dbm_hh = x.dbm[h][h];
+    if (x_dbm_hh < 0) {
+      x.status.set_empty();
+      return;
+    }
+    else {
+      assert(x_dbm_hh == 0);
+      // Restore PLUS_INFINITY on the main diagonal.
+      x_dbm_hh = PLUS_INFINITY;
+    }
+  }
+
+  // The BDS is not empty and it is now shortest-path closed.
+  x.status.set_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_reduction_assign() const {
+  // Do something only if necessary.
+  if (marked_shortest_path_reduced())
+    return;
+
+  // First find the tighest constraints for this BDS.
+  shortest_path_closure_assign();
+
+  // If `*this' is empty, then there is nothing to reduce.
+  if (marked_empty())
+    return;
+
+  // Step 1: compute zero-equivalence classes.
+  // Variables corresponding to indices `i' and `j' are zero-equivalent
+  // if they lie on a zero-weight loop; since the matrix is shortest-path
+  // closed, this happens if and only if dbm[i][j] == -dbm[j][i].
+  std::vector<dimension_type> predecessor;
+  compute_predecessors(predecessor);
+  std::vector<dimension_type> leaders;
+  compute_leader_indices(predecessor, leaders);
+  const dimension_type num_leaders = leaders.size();
+
+  const dimension_type space_dim = space_dimension();
+  // TODO: directly work on `redundancy_dbm' so as to minimize allocations.
+  std::deque<bool> redundancy_row(space_dim + 1, true);
+  std::vector<std::deque<bool> > redundancy(space_dim + 1, redundancy_row);
+
+  // Step 2: flag non-redundant constraints in the (zero-cycle-free)
+  // subsystem of bounded differences having only leaders as variables.
+  N c;
+  for (dimension_type l_i = 0; l_i < num_leaders; ++l_i) {
+    const dimension_type i = leaders[l_i];
+    const DB_Row<N>& dbm_i = dbm[i];
+    std::deque<bool>& redundancy_i = redundancy[i];
+    for (dimension_type l_j = 0; l_j < num_leaders; ++l_j) {
+      const dimension_type j = leaders[l_j];
+      if (redundancy_i[j]) {
+	const N& dbm_i_j = dbm_i[j];
+	redundancy_i[j] = false;
+	for (dimension_type l_k = 0; l_k < num_leaders; ++l_k) {
+	  const dimension_type k = leaders[l_k];
+	  add_assign_r(c, dbm_i[k], dbm[k][j], ROUND_UP);
+	  if (dbm_i_j >= c) {
+	    redundancy_i[j] = true;
+	    break;
+	  }
+	}
+      }
+    }
+  }
+
+  // Step 3: flag non-redundant constraints in zero-equivalence classes.
+  // Each equivalence class must have a single 0-cycle connecting
+  // all the equivalent variables in increasing order.
+  std::deque<bool> dealt_with(space_dim + 1, false);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    // We only need to deal with non-singleton zero-equivalence classes
+    // that haven't already been dealt with.
+    if (i != predecessor[i] && !dealt_with[i]) {
+      dimension_type j = i;
+      while (true) {
+	const dimension_type pred_j = predecessor[j];
+	if (j == pred_j) {
+	  // We finally found the leader of `i'.
+	  assert(redundancy[i][j]);
+	  redundancy[i][j] = false;
+	  // Here we dealt with `j' (i.e., `pred_j'), but it is useless
+	  // to update `dealt_with' because `j' is a leader.
+	  break;
+	}
+	// We haven't found the leader of `i' yet.
+	assert(redundancy[pred_j][j]);
+	redundancy[pred_j][j] = false;
+	dealt_with[pred_j] = true;
+	j = pred_j;
+      }
+    }
+
+  // Even though shortest-path reduction is not going to change the BDS,
+  // it might change its internal representation.
+  BD_Shape<T>& x = const_cast<BD_Shape<T>&>(*this);
+  std::swap(x.redundancy_dbm, redundancy);
+  x.status.set_shortest_path_reduced();
+
+  assert(is_shortest_path_reduced());
+}
+
+template <typename T>
+void
+BD_Shape<T>::bds_hull_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("bds_hull_assign(y)", y);
+
+  // The poly-hull of a polyhedron `bd' with an empty polyhedron is `bd'.
+  y.shortest_path_closure_assign();
+  if (y.marked_empty())
+    return;
+  shortest_path_closure_assign();
+  if (marked_empty()) {
+    *this = y;
+    return;
+  }
+
+  // The bds-hull consists in constructing `*this' with the maximum
+  // elements selected from `*this' and `y'.
+  assert(space_dim == 0 || marked_shortest_path_closed());
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (dbm_ij < y_dbm_ij)
+	dbm_ij = y_dbm_ij;
+    }
+  }
+  // The result is still closed.
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::bds_difference_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("bds_difference_assign(y)", y);
+
+  BD_Shape new_bdiffs(space_dim, EMPTY);
+
+  BD_Shape& x = *this;
+
+  x.shortest_path_closure_assign();
+  // The difference of an empty system of bounded differences
+  // and of a system of bounded differences `p' is empty.
+  if (x.marked_empty())
+    return;
+  y.shortest_path_closure_assign();
+  // The difference of a system of bounded differences `p'
+  // and an empty system of bounded differences is `p'.
+  if (y.marked_empty())
+    return;
+
+  // If both systems of bounded differences are zero-dimensional,
+  // then at this point they are necessarily universe system of
+  // bounded differences, so that their difference is empty.
+  if (space_dim == 0) {
+    x.set_empty();
+    return;
+  }
+
+  // TODO: This is just an executable specification.
+  //       Have to find a more efficient method.
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
+
+  // We take a constraint of the system y at the time and we
+  // consider its complementary. Then we intersect the union
+  // of these complementaries with the system x.
+  const Constraint_System& y_cs = y.constraints();
+  for (Constraint_System::const_iterator i = y_cs.begin(),
+	 y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+    const Constraint& c = *i;
+    // If the system of bounded differences `x' is included
+    // in the system of bounded differences defined by `c',
+    // then `c' _must_ be skipped, as adding its complement to `x'
+    // would result in the empty system of bounded differences,
+    // and as we would obtain a result that is less precise
+    // than the bds-difference.
+    if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    BD_Shape z = x;
+    const Linear_Expression e = Linear_Expression(c);
+    bool change = false;
+    if (c.is_nonstrict_inequality())
+      change = z.add_constraint_and_minimize(e <= 0);
+    if (c.is_equality()) {
+      BD_Shape w = x;
+      if (w.add_constraint_and_minimize(e <= 0))
+	new_bdiffs.bds_hull_assign(w);
+      change = z.add_constraint_and_minimize(e >= 0);
+    }
+    if (change)
+      new_bdiffs.bds_hull_assign(z);
+  }
+  *this = new_bdiffs;
+  // The result is still closed, because both bds_hull_assign() and
+  // add_constraint_and_minimize() preserve closure.
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_embed(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type space_dim = space_dimension();
+  const dimension_type new_space_dim = space_dim + m;
+  const bool was_zero_dim_univ = (!marked_empty() && space_dim == 0);
+
+  // To embed an n-dimension space BDS in a (n+m)-dimension space,
+  // we just add `m' rows and columns in the system of bounded differences,
+  // initialized to PLUS_INFINITY.
+  dbm.grow(new_space_dim + 1);
+
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    status.reset_shortest_path_reduced();
+
+  // If `*this' was the zero-dim space universe BDS,
+  // the we can set the shortest-path closure flag.
+  if (was_zero_dim_univ)
+    status.set_shortest_path_closed();
+
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_project(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type space_dim = space_dimension();
+
+  // If `*this' was zero-dimensional, then we add `m' rows and columns.
+  // If it also was non-empty, then we zero all the added elements
+  // and set the flag for shortest-path closure.
+  if (space_dim == 0) {
+    dbm.grow(m + 1);
+    if (!marked_empty()) {
+      for (dimension_type i = m + 1; i-- > 0; ) {
+	DB_Row<N>& dbm_i = dbm[i];
+	for (dimension_type j = m + 1; j-- > 0; )
+	  if (i != j)
+	    assign_r(dbm_i[j], 0, ROUND_NOT_NEEDED);
+      }
+      status.set_shortest_path_closed();
+    }
+    assert(OK());
+    return;
+  }
+
+  // To project an n-dimension space system of bounded differences
+  // in a (n+m)-dimension space, we add `m' rows and columns.
+  // In the first row and column of the matrix we add `zero' from
+  // the (n+1)-th position to the end.
+  const dimension_type new_space_dim = space_dim + m;
+  dbm.grow(new_space_dim + 1);
+
+  // Bottom of the matrix and first row.
+  DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = space_dim + 1; i <= new_space_dim; ++i) {
+    assign_r(dbm[i][0], 0, ROUND_NOT_NEEDED);
+    assign_r(dbm_0[i], 0, ROUND_NOT_NEEDED);
+  }
+
+  if (marked_shortest_path_closed())
+    status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::remove_space_dimensions(const Variables_Set& to_be_removed) {
+  // The removal of no dimensions from any BDS is a no-op.
+  // Note that this case also captures the only legal removal of
+  // space dimensions from a BDS in a 0-dim space.
+  if (to_be_removed.empty()) {
+    assert(OK());
+    return;
+  }
+
+  // Dimension-compatibility check: the variable having
+  // maximum cardinality is the one occurring last in the set.
+  const dimension_type max_dim_to_be_removed = to_be_removed.rbegin()->id();
+  const dimension_type old_space_dim = space_dimension();
+  if (max_dim_to_be_removed >= old_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)",
+				 max_dim_to_be_removed);
+
+  // Shortest-path closure is necessary to keep precision.
+  shortest_path_closure_assign();
+
+  // When removing _all_ dimensions from a BDS,
+  // we obtain the zero-dimensional BDS.
+  const dimension_type new_space_dim = old_space_dim - to_be_removed.size();
+  if (new_space_dim == 0) {
+    dbm.resize_no_copy(1);
+    if (!marked_empty())
+      // We set the zero_dim_univ flag.
+      set_zero_dim_univ();
+    assert(OK());
+    return;
+  }
+
+  // Shortest-path closure is maintained.
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    status.reset_shortest_path_reduced();
+
+  // For each variable to remove, we erase the corresponding column and
+  // row by shifting the other columns and rows, than are not removed,
+  // respectively left and above.
+  Variables_Set::const_iterator tbr = to_be_removed.begin();
+  Variables_Set::const_iterator tbr_end = to_be_removed.end();
+  dimension_type dst = tbr->id() + 1;
+  dimension_type src = dst + 1;
+  for (++tbr; tbr != tbr_end; ++tbr) {
+    const dimension_type tbr_next = tbr->id() + 1;
+    // All other columns and rows are moved respectively to the left
+    // and above.
+    while (src < tbr_next) {
+      dbm[dst] = dbm[src];
+      for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+	DB_Row<N>& dbm_i = dbm[i];
+	dbm_i[dst] = dbm_i[src];
+      }
+      ++dst;
+      ++src;
+    }
+    ++src;
+  }
+
+  // Moving the remaining rows and columns.
+  while (src <= old_space_dim) {
+    dbm[dst] = dbm[src];
+    for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+      DB_Row<N>& dbm_i = dbm[i];
+      dbm_i[dst] = dbm_i[src];
+    }
+    ++src;
+    ++dst;
+  }
+
+  // Update the space dimension.
+  dbm.resize_no_copy(new_space_dim + 1);
+  assert(OK());
+}
+
+template <typename T>
+template <typename PartialFunction>
+void
+BD_Shape<T>::map_space_dimensions(const PartialFunction& pfunc) {
+  const dimension_type space_dim = space_dimension();
+  // TODO: this implementation is just an executable specification.
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the BDS becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    assert(OK());
+    return;
+  }
+
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If we are going to actually reduce the space dimension,
+  // then shortest-path closure is required to keep precision.
+  if (new_space_dim < space_dim)
+    shortest_path_closure_assign();
+
+  // If the BDS is empty, then it is sufficient to adjust the
+  // space dimension of the system of bounded differences.
+  if (marked_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
+
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    status.reset_shortest_path_reduced();
+
+  // We create a new matrix with the new space dimension.
+  DB_Matrix<N> x(new_space_dim+1);
+  // First of all we must map the unary constraints, because
+  // there is the fictitious variable `zero', that can't be mapped
+  // at all.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& x_0 = x[0];
+  for (dimension_type j = 1; j <= space_dim; ++j) {
+    dimension_type new_j;
+    if (pfunc.maps(j - 1, new_j)) {
+      x_0[new_j + 1] = dbm_0[j];
+      x[new_j + 1][0] = dbm[j][0];
+    }
+  }
+  // Now we map the binary constraints, exchanging the indexes.
+  for (dimension_type i = 1; i <= space_dim; ++i) {
+    dimension_type new_i;
+    if (pfunc.maps(i - 1, new_i)) {
+      const DB_Row<N>& dbm_i = dbm[i];
+      ++new_i;
+      DB_Row<N>& x_new_i = x[new_i];
+      for (dimension_type j = i+1; j <= space_dim; ++j) {
+	dimension_type new_j;
+	if (pfunc.maps(j - 1, new_j)) {
+	  ++new_j;
+	  x_new_i[new_j] = dbm_i[j];
+	  x[new_j][new_i] = dbm[j][i];
+	}
+      }
+    }
+  }
+
+  std::swap(dbm, x);
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::intersection_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("intersection_assign(y)", y);
+
+  // If one of the two systems of bounded differences is empty,
+  // the intersection is empty.
+  if (marked_empty())
+    return;
+  if (y.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // If both systems of bounded differences are zero-dimensional,
+  // then at this point they are necessarily non-empty,
+  // so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
+
+  // To intersect two systems of bounded differences we compare
+  // the constraints and we choose the less values.
+  bool changed = false;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (dbm_ij > y_dbm_ij) {
+	dbm_ij = y_dbm_ij;
+	changed = true;
+      }
+    }
+  }
+
+  if (changed && marked_shortest_path_closed())
+    status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+template <typename Iterator>
+void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y,
+				       Iterator first, Iterator last,
+				       unsigned* tp) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // If both systems of bounded differences are zero-dimensional,
+  // since `*this' contains `y', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  shortest_path_closure_assign();
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  y.shortest_path_closure_assign();
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    BD_Shape<T> x_tmp(*this);
+    x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Compare each constraint in `y' to the corresponding one in `*this'.
+  // The constraint in `*this' is kept as is if it is stronger than or
+  // equal to the constraint in `y'; otherwise, the inhomogeneous term
+  // of the constraint in `*this' is further compared with elements taken
+  // from a sorted container (the stop-points, provided by the user), and
+  // is replaced by the first entry, if any, which is greater than or equal
+  // to the inhomogeneous term. If no such entry exists, the constraint
+  // is removed altogether.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (y_dbm_ij < dbm_ij) {
+	Iterator k = std::lower_bound(first, last, dbm_ij);
+	if (k != last) {
+	  if (dbm_ij < *k)
+	    assign_r(dbm_ij, *k, ROUND_UP);
+	}
+	else
+	  dbm_ij = PLUS_INFINITY;
+      }
+    }
+  }
+  status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::get_limiting_shape(const Constraint_System& cs,
+				BD_Shape& limiting_shape) const {
+  using Implementation::BD_Shapes::div_round_up;
+
+  const dimension_type cs_space_dim = cs.space_dimension();
+  // Private method: the caller has to ensure the following.
+  assert(cs_space_dim <= space_dimension());
+
+  bool changed = false;
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 iend = cs.end(); i != iend; ++i) {
+    const Constraint& c = *i;
+    dimension_type num_vars = 0;
+    dimension_type i = 0;
+    dimension_type j = 0;
+    TEMP_INTEGER(coeff);
+    // Constraints that are not bounded differences are ignored.
+    if (extract_bounded_difference(c, cs_space_dim, num_vars, i, j, coeff)) {
+      // Select the cell to be modified for the "<=" part of the constraint,
+      // and set `coeff' to the absolute value of itself.
+      const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+      const N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+      DB_Matrix<N>& ls_dbm = limiting_shape.dbm;
+      N& ls_x = (coeff < 0) ? ls_dbm[i][j] : ls_dbm[j][i];
+      N& ls_y = (coeff < 0) ? ls_dbm[j][i] : ls_dbm[i][j];
+      if (coeff < 0)
+	coeff = -coeff;
+      // Compute the bound for `x', rounding towards plus infinity.
+      N d;
+      div_round_up(d, c.inhomogeneous_term(), coeff);
+      if (x <= d)
+	if (c.is_inequality())
+	  if (ls_x > d) {
+	    ls_x = d;
+	    changed = true;
+	  }
+	else {
+	  // Compute the bound for `y', rounding towards plus infinity.
+	  div_round_up(d, -c.inhomogeneous_term(), coeff);
+	  if (y <= d)
+	    if (ls_y > d) {
+	      ls_y = d;
+	      changed = true;
+	    }
+
+	}
+    }
+  }
+
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure of the system of bounded differences.
+  if (changed && limiting_shape.marked_shortest_path_closed())
+    limiting_shape.status.reset_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::limited_CC76_extrapolation_assign(const BD_Shape& y,
+					       const Constraint_System& cs,
+					       unsigned* tp) {
+  // Dimension-compatibility check.
+  const dimension_type space_dim = space_dimension();
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+				 y);
+
+  // `cs' must be dimension-compatible with the two systems
+  // of bounded differences.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+  // The limited CC76-extrapolation between two systems of bounded
+  // differences in a zero-dimensional space is a system of bounded
+  // differences in a zero-dimensional space, too.
+  if (space_dim == 0)
+    return;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+  get_limiting_shape(cs, limiting_shape);
+  CC76_extrapolation_assign(y, tp);
+  intersection_assign(limiting_shape);
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // Compute the affine dimension of `y'.
+  const dimension_type y_affine_dim = y.affine_dimension();
+  // If the affine dimension of `y' is zero, then either `y' is
+  // zero-dimensional, or it is empty, or it is a singleton.
+  // In all cases, due to the inclusion hypothesis, the result is `*this'.
+  if (y_affine_dim == 0)
+    return;
+
+  // If the affine dimension has changed, due to the inclusion hypothesis,
+  // the result is `*this'.
+  const dimension_type x_affine_dim = affine_dimension();
+  assert(x_affine_dim >= y_affine_dim);
+  if (x_affine_dim != y_affine_dim)
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    BD_Shape<T> x_tmp(*this);
+    x_tmp.BHMZ05_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Here no token is available.
+  assert(marked_shortest_path_closed() && y.marked_shortest_path_closed());
+  // Minimize `y'.
+  y.shortest_path_reduction_assign();
+
+  // Extrapolate unstable bounds, taking into account redundancy in `y'.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    const std::deque<bool>& y_redundancy_i = y.redundancy_dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      // Note: in the following line the use of `!=' (as opposed to
+      // the use of `<' that would seem -but is not- equivalent) is
+      // intentional.
+      if (y_redundancy_i[j] || y_dbm_i[j] != dbm_ij)
+	dbm_ij = PLUS_INFINITY;
+    }
+  }
+  // NOTE: this will also reset the shortest-path reduction flag,
+  // even though the dbm is still in reduced form. However, the
+  // current implementation invariant requires that any reduced dbm
+  // is closed too.
+  status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+						 const Constraint_System& cs,
+						 unsigned* tp) {
+  // Dimension-compatibility check.
+  const dimension_type space_dim = space_dimension();
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+				 y);
+  // `cs' must be dimension-compatible with the two systems
+  // of bounded differences.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
+				  "(y, cs)");
+
+  // Strict inequalities are not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
+				  "(y, cs)");
+
+  // The limited BHMZ05-extrapolation between two systems of bounded
+  // differences in a zero-dimensional space is a system of bounded
+  // differences in a zero-dimensional space, too.
+  if (space_dim == 0)
+    return;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' is contained in or equal to `*this'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(x_copy.contains(y_copy));
+  }
+#endif
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+  get_limiting_shape(cs, limiting_shape);
+  BHMZ05_widening_assign(y, tp);
+  intersection_assign(limiting_shape);
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::CC76_narrowing_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+#ifndef NDEBUG
+  {
+    // We assume that `*this' is contained in or equal to `y'.
+    const BD_Shape x_copy = *this;
+    const BD_Shape y_copy = y;
+    assert(y_copy.contains(x_copy));
+  }
+#endif
+
+  // If both systems of bounded differences are zero-dimensional,
+  // since `y' contains `*this', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  y.shortest_path_closure_assign();
+  // If `y' is empty, since `y' contains `this', `*this' is empty too.
+  if (y.marked_empty())
+    return;
+  shortest_path_closure_assign();
+  // If `*this' is empty, we return.
+  if (marked_empty())
+    return;
+
+  // Replace each constraint in `*this' by the corresponding constraint
+  // in `y' if the corresponding inhomogeneous terms are both finite.
+  bool changed = false;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (!is_plus_infinity(dbm_ij)
+	  && !is_plus_infinity(y_dbm_ij)
+	  && dbm_ij != y_dbm_ij) {
+	dbm_ij = y_dbm_ij;
+	changed = true;
+      }
+    }
+  }
+  if (changed && marked_shortest_path_closed())
+    status.reset_shortest_path_closed();
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::deduce_v_minus_u_bounds(const dimension_type v,
+			  const dimension_type last_v,
+			  const Linear_Expression& sc_expr,
+			  Coefficient_traits::const_reference sc_den,
+			  const N& pos_sum) {
+  // Deduce constraints of the form `v - u', where `u != v'.
+  // Note: the shortest-path closure is able to deduce the constraint
+  // `v - u <= ub_v - lb_u'. We can be more precise if variable `u'
+  // played an active role in the computation of the upper bound for `v',
+  // i.e., if the corresponding coefficient `q == expr_u/den' is
+  // greater than zero. In particular:
+  // if `q >= 1',    then `v - u <= ub_v - ub_u';
+  // if `0 < q < 1', then `v - u <= ub_v - (q*ub_u + (1-q)*lb_u)'.
+  mpq_class mpq_sc_den;
+  assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // No need to consider indices greater than `last_v'.
+  for (dimension_type u = last_v; u > 0; --u)
+    if (u != v) {
+      const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
+      if (expr_u > 0)
+	if (expr_u >= sc_den)
+	  // Deducing `v - u <= ub_v - ub_u'.
+	  sub_assign_r(dbm[u][v], pos_sum, dbm_0[u], ROUND_UP);
+	else {
+	  DB_Row<N>& dbm_u = dbm[u];
+	  const N& dbm_u0 = dbm_u[0];
+	  if (!is_plus_infinity(dbm_u0)) {
+	    // Let `ub_u' and `lb_u' be the known upper and lower bound
+	    // for `u', respectively. Letting `q = expr_u/sc_den' be the
+	    // rational coefficient of `u' in `sc_expr/sc_den',
+	    // the upper bound for `v - u' is computed as
+	    // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e.,
+	    // `pos_sum + (-lb_u) - q * (ub_u + (-lb_u))'.
+	    mpq_class minus_lb_u;
+	    assign_r(minus_lb_u, dbm_u0, ROUND_NOT_NEEDED);
+	    mpq_class q;
+	    assign_r(q, expr_u, ROUND_NOT_NEEDED);
+	    div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+	    mpq_class ub_u;
+	    assign_r(ub_u, dbm_0[u], ROUND_NOT_NEEDED);
+	    // Compute `ub_u - lb_u'.
+	    add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+	    // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+	    sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+	    N up_approx;
+	    assign_r(up_approx, minus_lb_u, ROUND_UP);
+	    // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+	    add_assign_r(dbm_u[v], pos_sum, up_approx, ROUND_UP);
+	  }
+	}
+    }
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::deduce_u_minus_v_bounds(const dimension_type v,
+			  const dimension_type last_v,
+			  const Linear_Expression& sc_expr,
+			  Coefficient_traits::const_reference sc_den,
+			  const N& neg_sum) {
+  // Deduce constraints of the form `u - v', where `u != v'.
+  // Note: the shortest-path closure is able to deduce the constraint
+  // `u - v <= ub_u - lb_v'. We can be more precise if variable `u'
+  // played an active role in the computation of the lower bound for `v',
+  // i.e., if the corresponding coefficient `q == expr_u/den' is
+  // greater than zero. In particular:
+  // if `q >= 1',    then `u - v <= lb_u - lb_v';
+  // if `0 < q < 1', then `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+  mpq_class mpq_sc_den;
+  assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& dbm_v = dbm[v];
+  // No need to consider indices greater than `last_v'.
+  for (dimension_type u = last_v; u > 0; --u)
+    if (u != v) {
+      const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
+      if (expr_u > 0)
+	if (expr_u >= sc_den)
+	  // Deducing `u - v <= lb_u - lb_v',
+	  // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+	  sub_assign_r(dbm_v[u], neg_sum, dbm[u][0], ROUND_UP);
+	else {
+	  const N& dbm_0u = dbm_0[u];
+	  if (!is_plus_infinity(dbm_0u)) {
+	    // Let `ub_u' and `lb_u' be the known upper and lower bound
+	    // for `u', respectively. Letting `q = expr_u/sc_den' be the
+	    // rational coefficient of `u' in `sc_expr/sc_den',
+	    // the upper bound for `u - v' is computed as
+	    // `(q * lb_u + (1-q) * ub_u) - lb_v', i.e.,
+	    // `ub_u - q * (ub_u + (-lb_u)) + neg_sum'.
+	    mpq_class ub_u;
+	    assign_r(ub_u, dbm_0u, ROUND_NOT_NEEDED);
+	    mpq_class q;
+	    assign_r(q, expr_u, ROUND_NOT_NEEDED);
+	    div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+	    mpq_class minus_lb_u;
+	    assign_r(minus_lb_u, dbm[u][0], ROUND_NOT_NEEDED);
+	    // Compute `ub_u - lb_u'.
+	    add_assign_r(minus_lb_u, minus_lb_u, ub_u, ROUND_NOT_NEEDED);
+	    // Compute `ub_u - q * (ub_u - lb_u)'.
+	    sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+	    N up_approx;
+	    assign_r(up_approx, ub_u, ROUND_UP);
+	    // Deducing `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+	    add_assign_r(dbm_v[u], up_approx, neg_sum, ROUND_UP);
+	  }
+	}
+    }
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_image(const Variable var,
+			  const Linear_Expression& expr,
+			  Coefficient_traits::const_reference denominator) {
+  using Implementation::BD_Shapes::div_round_up;
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of the shape.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", var.id());
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0)
+      if (t++ == 1)
+	break;
+      else
+	w = i+1;
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+  TEMP_INTEGER(minus_den);
+  neg_assign(minus_den, denominator);
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      status.reset_shortest_path_reduced();
+    // Add the constraint `var == b/denominator'.
+    add_dbm_constraint(0, v, b, denominator);
+    add_dbm_constraint(v, 0, b, minus_den);
+    assert(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.coefficient(Variable(w-1));
+    if (a == denominator || a == minus_den) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      if (w == v) {
+	// `expr' is of the form: a*v + b.
+	if (a == denominator) {
+	  if (b == 0)
+	    // The transformation is the identity function.
+	    return;
+	  else {
+	    // Translate all the constraints on `var',
+	    // adding or subtracting the value `b/denominator'.
+	    N d;
+	    div_round_up(d, b, denominator);
+	    N c;
+	    div_round_up(c, b, minus_den);
+	    DB_Row<N>& dbm_v = dbm[v];
+	    for (dimension_type i = space_dim + 1; i-- > 0; ) {
+	      N& dbm_vi = dbm_v[i];
+	      add_assign_r(dbm_vi, dbm_vi, c, ROUND_UP);
+	      N& dbm_iv = dbm[i][v];
+	      add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+	    }
+	    // Both shortest-path closure and reduction are preserved.
+	  }
+	}
+	else {
+	  // Here `a == -denominator'.
+	  // Remove the binary constraints on `var'.
+	  forget_binary_dbm_constraints(v);
+	  // Swap the unary constraints on `var'.
+	  std::swap(dbm[v][0], dbm[0][v]);
+	  // Shortest-path closure is not preserved.
+	  status.reset_shortest_path_closed();
+	  if (b != 0) {
+	    // Translate the unary constraints on `var',
+	    // adding or subtracting the value `b/denominator'.
+	    N c;
+	    div_round_up(c, b, minus_den);
+	    N& dbm_v0 = dbm[v][0];
+	    add_assign_r(dbm_v0, dbm_v0, c, ROUND_UP);
+	    N d;
+	    div_round_up(d, b, denominator);
+	    N& dbm_0v = dbm[0][v];
+	    add_assign_r(dbm_0v, dbm_0v, d, ROUND_UP);
+	  }
+	}
+      }
+      else {
+	// Here `w != v', so that `expr' is of the form
+	// +/-denominator * w + b.
+	// Remove all constraints on `var'.
+	forget_all_dbm_constraints(v);
+	// Shortest-path closure is preserved, but not reduction.
+	if (marked_shortest_path_reduced())
+	  status.reset_shortest_path_reduced();
+	if (a == denominator) {
+	  // Add the new constraint `v - w == b/denominator'.
+	  add_dbm_constraint(w, v, b, denominator);
+	  add_dbm_constraint(v, w, b, minus_den);
+	}
+	else {
+	  // Here a == -denominator, so that we should be adding
+	  // the constraint `v + w == b/denominator'.
+	  // Approximate it by computing lower and upper bounds for `w'.
+	  const N& dbm_w0 = dbm[w][0];
+	  if (!is_plus_infinity(dbm_w0)) {
+	    // Add the constraint `v <= b/denominator - lower_w'.
+	    N d;
+	    div_round_up(d, b, denominator);
+	    add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+	    status.reset_shortest_path_closed();
+	  }
+	  const N& dbm_0w = dbm[0][w];
+	  if (!is_plus_infinity(dbm_0w)) {
+	    // Add the constraint `v >= b/denominator - upper_w'.
+	    N c;
+	    div_round_up(c, b, minus_den);
+	    add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP);
+	    status.reset_shortest_path_closed();
+	  }
+	}
+      }
+      assert(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  N pos_sum;
+  N neg_sum;
+  // Indices of the variables that are unbounded in `this->dbm'.
+  // (The initializations are just to quiet a compiler warning.)
+  dimension_type pos_pinf_index = 0;
+  dimension_type neg_pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
+  dimension_type neg_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = w; i > 0; --i) {
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      N coeff_i;
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+	const N& up_approx_i = dbm_0[i];
+	if (!is_plus_infinity(up_approx_i))
+	  add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+	else {
+	  ++pos_pinf_count;
+	  pos_pinf_index = i;
+	}
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+	const N& up_approx_minus_i = dbm[i][0];
+	if (!is_plus_infinity(up_approx_minus_i))
+	  add_mul_assign_r(neg_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+	else {
+	  ++neg_pinf_count;
+	  neg_pinf_index = i;
+	}
+      }
+    }
+    else if (sign_i < 0) {
+      TEMP_INTEGER(minus_sc_i);
+      neg_assign(minus_sc_i, sc_i);
+      N minus_coeff_i;
+      assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+	const N& up_approx_minus_i = dbm[i][0];
+	if (!is_plus_infinity(up_approx_minus_i))
+	  add_mul_assign_r(pos_sum,
+			   minus_coeff_i, up_approx_minus_i, ROUND_UP);
+	else {
+	  ++pos_pinf_count;
+	  pos_pinf_index = i;
+	}
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+	const N& up_approx_i = dbm_0[i];
+	if (!is_plus_infinity(up_approx_i))
+	  add_mul_assign_r(neg_sum, minus_coeff_i, up_approx_i, ROUND_UP);
+	else {
+	  ++neg_pinf_count;
+	  neg_pinf_index = i;
+	}
+      }
+    }
+  }
+
+  // Remove all constraints on 'v'.
+  forget_all_dbm_constraints(v);
+  // Shortest-path closure is maintained, but not reduction.
+  if (marked_shortest_path_reduced())
+    status.reset_shortest_path_reduced();
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+    assert(OK());
+    return;
+  }
+
+  // In the following, shortest-path closure will be definitely lost.
+  status.reset_shortest_path_closed();
+
+  // Before computing quotients, the denominator should be approximated
+  // towards zero. Since `sc_den' is known to be positive, this amounts to
+  // rounding downwards, which is achieved as usual by rounding upwards
+  // `minus_sc_den' and negating again the result.
+  N down_sc_den;
+  assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+  neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (down_sc_den != 1)
+      div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP);
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      DB_Row<N>& dbm_0 = dbm[0];
+      assign_r(dbm_0[v], pos_sum, ROUND_UP);
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != v
+	  && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den)
+	// Add the constraint `v - pos_pinf_index <= pos_sum'.
+	assign_r(dbm[pos_pinf_index][v], pos_sum, ROUND_UP);
+  }
+
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (down_sc_den != 1)
+      div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP);
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      DB_Row<N>& dbm_v = dbm[v];
+      assign_r(dbm_v[0], neg_sum, ROUND_UP);
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != v
+	  && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den)
+	// Add the constraint `v - neg_pinf_index >= -neg_sum',
+	// i.e., `neg_pinf_index - v <= neg_sum'.
+	assign_r(dbm[v][neg_pinf_index], neg_sum, ROUND_UP);
+  }
+
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_preimage(const Variable var,
+			     const Linear_Expression& expr,
+			     Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of
+  // the systems of bounded differences.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", var.id());
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type j = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0)
+      if (t++ == 1)
+	break;
+      else
+        j = i;
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr = b, with `b' a constant;
+  // - If t == 1, then expr = a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t > 1, the `expr' is of the general form.
+  if (t == 0) {
+    // Case 1: expr = n; remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      status.reset_shortest_path_reduced();
+    assert(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.coefficient(Variable(j));
+    if (a == denominator || a == -denominator) {
+      // Case 2: expr = a*w + b, with a = +/- denominator.
+      if (j == var.id())
+	// Apply affine_image() on the inverse of this transformation.
+	affine_image(var, a*var - b, denominator);
+      else {
+	// `expr == a*w + b', where `w != v'.
+	// Remove all constraints on `var'.
+	forget_all_dbm_constraints(v);
+	// Shortest-path closure is preserved, but not reduction.
+	if (marked_shortest_path_reduced())
+	  status.reset_shortest_path_reduced();
+      }
+      assert(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t = 1, expr = a*w + b, but a <> +/- denominator.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    // The transformation is invertible.
+    Linear_Expression inverse((expr_v + denominator)*var);
+    inverse -= expr;
+    affine_image(var, inverse, expr_v);
+  }
+  else {
+    // Transformation not invertible: all constraints on `var' are lost.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      status.reset_shortest_path_reduced();
+  }
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Variable var,
+				      const Relation_Symbol relsym,
+				      const Linear_Expression& expr,
+				      Coefficient_traits::const_reference
+				      denominator) {
+  using Implementation::BD_Shapes::div_round_up;
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+				 "e", expr);
+
+  // `var' should be one of the dimensions of the BDS.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+				 var.id());
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_image(v, r, e, d)",
+  		  "r is a strict relation symbol and "
+  		  "*this is a BD_Shape");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "==":
+    // this is just an affine image computation.
+    affine_image(var, expr, denominator);
+    assert(OK());
+    return;
+  }
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0)
+      if (t++ == 1)
+	break;
+      else
+	w = i+1;
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& dbm_v = dbm[v];
+  TEMP_INTEGER(minus_den);
+  neg_assign(minus_den, denominator);
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Both shortest-path closure and reduction are lost.
+    status.reset_shortest_path_closed();
+    switch (relsym) {
+    case LESS_THAN_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      break;
+    case GREATER_THAN_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_dbm_constraint(v, 0, b, minus_den);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+      break;
+    }
+    assert(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.coefficient(Variable(w-1));
+    if (a == denominator || a == minus_den) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      N d;
+      switch (relsym) {
+      case LESS_THAN_OR_EQUAL:
+	div_round_up(d, b, denominator);
+	if (w == v) {
+	  // `expr' is of the form: a*v + b.
+	  // Shortest-path closure and reduction are not preserved.
+	  status.reset_shortest_path_closed();
+	  if (a == denominator) {
+	    // Translate each constraint `v - w <= dbm_wv'
+	    // into the constraint `v - w <= dbm_wv + b/denominator';
+	    // forget each constraint `w - v <= dbm_vw'.
+	    for (dimension_type i = space_dim + 1; i-- > 0; ) {
+	      N& dbm_iv = dbm[i][v];
+	      add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+	      dbm_v[i] = PLUS_INFINITY;
+	    }
+	  }
+	  else {
+	    // Here `a == -denominator'.
+	    // Translate the constraint `0 - v <= dbm_v0'
+	    // into the constraint `0 - v <= dbm_v0 + b/denominator'.
+	    N& dbm_v0 = dbm_v[0];
+	    add_assign_r(dbm_0[v], dbm_v0, d, ROUND_UP);
+	    // Forget all the other constraints on `v'.
+	    dbm_v0 = PLUS_INFINITY;
+	    forget_binary_dbm_constraints(v);
+	  }
+	}
+	else {
+	  // Here `w != v', so that `expr' is of the form
+	  // +/-denominator * w + b, with `w != v'.
+	  // Remove all constraints on `v'.
+	  forget_all_dbm_constraints(v);
+	  // Shortest-path closure is preserved, but not reduction.
+	  if (marked_shortest_path_reduced())
+	    status.reset_shortest_path_reduced();
+	  if (a == denominator)
+	    // Add the new constraint `v - w <= b/denominator'.
+	    add_dbm_constraint(w, v, d);
+	  else {
+	    // Here a == -denominator, so that we should be adding
+	    // the constraint `v <= b/denominator - w'.
+	    // Approximate it by computing a lower bound for `w'.
+	    const N& dbm_w0 = dbm[w][0];
+	    if (!is_plus_infinity(dbm_w0)) {
+	      // Add the constraint `v <= b/denominator - lb_w'.
+	      add_assign_r(dbm_0[v], d, dbm_w0, ROUND_UP);
+	      // Shortest-path closure is not preserved.
+	      status.reset_shortest_path_closed();
+	    }
+	  }
+	}
+	break;
+
+      case GREATER_THAN_OR_EQUAL:
+	div_round_up(d, b, minus_den);
+	if (w == v) {
+	  // `expr' is of the form: a*w + b.
+	  // Shortest-path closure and reduction are not preserved.
+	  status.reset_shortest_path_closed();
+	  if (a == denominator) {
+	    // Translate each constraint `w - v <= dbm_vw'
+	    // into the constraint `w - v <= dbm_vw - b/denominator';
+	    // forget each constraint `v - w <= dbm_wv'.
+	    for (dimension_type i = space_dim + 1; i-- > 0; ) {
+	      N& dbm_vi = dbm_v[i];
+	      add_assign_r(dbm_vi, dbm_vi, d, ROUND_UP);
+	      dbm[i][v] = PLUS_INFINITY;
+	    }
+	  }
+	  else {
+	    // Here `a == -denominator'.
+	    // Translate the constraint `0 - v <= dbm_v0'
+	    // into the constraint `0 - v <= dbm_0v - b/denominator'.
+	    N& dbm_0v = dbm_0[v];
+	    add_assign_r(dbm_v[0], dbm_0v, d, ROUND_UP);
+	    // Forget all the other constraints on `v'.
+	    dbm_0v = PLUS_INFINITY;
+	    forget_binary_dbm_constraints(v);
+	  }
+	}
+	else {
+	  // Here `w != v', so that `expr' is of the form
+	  // +/-denominator * w + b, with `w != v'.
+	  // Remove all constraints on `v'.
+	  forget_all_dbm_constraints(v);
+	  // Shortest-path closure is preserved, but not reduction.
+	  if (marked_shortest_path_reduced())
+	    status.reset_shortest_path_reduced();
+	  if (a == denominator)
+	    // Add the new constraint `v - w >= b/denominator',
+	    // i.e., `w - v <= -b/denominator'.
+	    add_dbm_constraint(v, w, d);
+	  else {
+	    // Here a == -denominator, so that we should be adding
+	    // the constraint `v >= -w + b/denominator',
+	    // i.e., `-v <= w - b/denominator'.
+	    // Approximate it by computing an upper bound for `w'.
+	    const N& dbm_0w = dbm_0[w];
+	    if (!is_plus_infinity(dbm_0w)) {
+	      // Add the constraint `-v <= ub_w - b/denominator'.
+	      add_assign_r(dbm_v[0], dbm_0w, d, ROUND_UP);
+	      // Shortest-path closure is not preserved.
+	      status.reset_shortest_path_closed();
+	    }
+	  }
+	}
+	break;
+
+      default:
+	// We already dealt with the other cases.
+	throw std::runtime_error("PPL internal error");
+	break;
+      }
+      assert(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `v' and add back
+  // a constraint providing an upper or a lower bound for `v'
+  // (depending on `relsym').
+  const bool is_sc = (denominator > 0);
+  TEMP_INTEGER(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_den = is_sc ? denominator : minus_den;
+  const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  N sum;
+  // Index of variable that is unbounded in `this->dbm'.
+  // (The initialization is just to quiet a compiler warning.)
+  dimension_type pinf_index = 0;
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
+
+  switch (relsym) {
+  case LESS_THAN_OR_EQUAL:
+    // Compute an upper approximation for `sc_expr' into `sum'.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, sc_b, ROUND_UP);
+    // Approximate the homogeneous part of `sc_expr'.
+    // Note: indices above `w' can be disregarded, as they all have
+    // a zero coefficient in `sc_expr'.
+    for (dimension_type i = w; i > 0; --i) {
+      const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+      const int sign_i = sgn(sc_i);
+      if (sign_i == 0)
+	continue;
+      // Choose carefully: we are approximating `sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
+      if (is_plus_infinity(approx_i)) {
+	if (++pinf_count > 1)
+	  break;
+	pinf_index = i;
+	continue;
+      }
+      N coeff_i;
+      if (sign_i > 0)
+	assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+	TEMP_INTEGER(minus_sc_i);
+	neg_assign(minus_sc_i, sc_i);
+	assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Remove all constraints on `v'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      status.reset_shortest_path_reduced();
+    // Return immediately if no approximation could be computed.
+    if (pinf_count > 1) {
+      assert(OK());
+      return;
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_den != 1) {
+      // Before computing the quotient, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      N down_sc_den;
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v <= sum'.
+      add_dbm_constraint(0, v, sum);
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v
+	  && expr.coefficient(Variable(pinf_index-1)) == denominator)
+	// Add the constraint `v - pinf_index <= sum'.
+	add_dbm_constraint(pinf_index, v, sum);
+    break;
+
+  case GREATER_THAN_OR_EQUAL:
+    // Compute an upper approximation for `-sc_expr' into `sum'.
+    // Note: approximating `-sc_expr' from above and then negating the
+    // result is the same as approximating `sc_expr' from below.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, minus_sc_b, ROUND_UP);
+    // Approximate the homogeneous part of `-sc_expr'.
+    for (dimension_type i = expr_space_dim + 1; i > 0; --i) {
+      const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+      const int sign_i = sgn(sc_i);
+      if (sign_i == 0)
+	continue;
+      // Choose carefully: we are approximating `-sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
+      if (is_plus_infinity(approx_i)) {
+	if (++pinf_count > 1)
+	  break;
+	pinf_index = i;
+	continue;
+      }
+      N coeff_i;
+      if (sign_i > 0)
+	assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+	TEMP_INTEGER(minus_sc_i);
+	neg_assign(minus_sc_i, sc_i);
+	assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      status.reset_shortest_path_reduced();
+    // Return immediately if no approximation could be computed.
+    if (pinf_count > 1) {
+      assert(OK());
+      return;
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_den != 1) {
+      // Before computing the quotient, the denominator should be approximated
+      // towards zero. Since `sc_den' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_den' and negating again the result.
+      N down_sc_den;
+      assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+      neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+      add_dbm_constraint(v, 0, sum);
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v
+	  && expr.coefficient(Variable(pinf_index-1)) == denominator)
+	// Add the constraint `v - pinf_index >= -sum',
+	// i.e., `pinf_index - v <= sum'.
+	add_dbm_constraint(v, pinf_index, sum);
+    break;
+
+  default:
+    // We already dealt with the other cases.
+    throw std::runtime_error("PPL internal error");
+    break;
+  }
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+				      const Relation_Symbol relsym,
+				      const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e1", lhs);
+
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+				 "e2", rhs);
+
+  // Strict relation symbols are not admitted for BDSs.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_image(e1, r, e2)",
+		  "r is a strict relation symbol and "
+		  "*this is a BD_Shape");
+
+  // The image of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = 0;
+  // Compute the number of the non-zero components of `lhs'.
+  for (dimension_type i = lhs_space_dim; i-- > 0; )
+    if (lhs.coefficient(Variable(i)) != 0)
+      if (t_lhs++ == 1)
+	break;
+      else
+	j_lhs = i;
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+    // Note that this constraint is a bounded difference if `t_rhs <= 1'
+    // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs'. If `rhs' is of a
+    // more general form, it will be simply ignored.
+    // TODO: if it is not a bounded difference, should we compute
+    // approximations for this constraint?
+    switch (relsym) {
+    case LESS_THAN_OR_EQUAL:
+      add_constraint(lhs <= rhs);
+      break;
+    case EQUAL:
+      add_constraint(lhs == rhs);
+      break;
+    case GREATER_THAN_OR_EQUAL:
+      add_constraint(lhs >= rhs);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+      break;
+    }
+  }
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine images for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& den = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (den < 0)
+      if (relsym == LESS_THAN_OR_EQUAL)
+	new_relsym = GREATER_THAN_OR_EQUAL;
+      else if (relsym == GREATER_THAN_OR_EQUAL)
+	new_relsym = LESS_THAN_OR_EQUAL;
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_image(v, new_relsym, expr, den);
+  }
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    bool lhs_vars_intersects_rhs_vars = false;
+    std::vector<Variable> lhs_vars;
+    for (dimension_type i = lhs_space_dim; i-- > 0; )
+      if (lhs.coefficient(Variable(i)) != 0) {
+	lhs_vars.push_back(Variable(i));
+	if (rhs.coefficient(Variable(i)) != 0)
+	  lhs_vars_intersects_rhs_vars = true;
+      }
+
+    if (!lhs_vars_intersects_rhs_vars) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Cylindrificate on all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+	forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT a bounded difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_THAN_OR_EQUAL:
+	add_constraint(lhs <= rhs);
+	break;
+      case EQUAL:
+	add_constraint(lhs == rhs);
+	break;
+      case GREATER_THAN_OR_EQUAL:
+	add_constraint(lhs >= rhs);
+	break;
+      default:
+	// We already dealt with the other cases.
+	throw std::runtime_error("PPL internal error");
+	break;
+      }
+    }
+    else {
+      // Some variables in `lhs' also occur in `rhs'.
+
+#if 1 // Simplified computation (see the TODO note below).
+
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+	forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+
+#else // Currently unnecessarily complex computation.
+
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
+
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var = Variable(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of add_constraint()
+      // ensures some approximation is tried even when the constraint
+      // is not a bounded difference.
+      affine_image(new_var, rhs);
+      // Cylindrificate on all variables in the lhs.
+      // NOTE: enforce shortest-path closure for precision.
+      shortest_path_closure_assign();
+      assert(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+	forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // TODO: each one of the following constraints is definitely NOT
+      // a bounded differences (since it has 3 variables at least).
+      // Thus, the method add_constraint() will simply ignore it.
+      // Should we compute approximations for this constraint?
+      switch (relsym) {
+      case LESS_THAN_OR_EQUAL:
+	add_constraint(lhs <= new_var);
+	break;
+      case EQUAL:
+	add_constraint(lhs == new_var);
+	break;
+      case GREATER_THAN_OR_EQUAL:
+	add_constraint(lhs >= new_var);
+	break;
+      default:
+	// We already dealt with the other cases.
+	throw std::runtime_error("PPL internal error");
+	break;
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+    }
+  }
+
+  assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Variable var,
+					 const Relation_Symbol relsym,
+					 const Linear_Expression& expr,
+					 Coefficient_traits::const_reference
+					 denominator) {
+  using Implementation::BD_Shapes::div_round_up;
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_generic("generalized_affine_preimage(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+				 "e", expr);
+
+  // `var' should be one of the dimensions of the BDS.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+				 var.id());
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_generic("generalized_affine_preimage(v, r, e, d)",
+  		  "r is a strict relation symbol and "
+  		  "*this is a BD_Shape");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "==":
+    // this is just an affine preimage computation.
+    affine_preimage(var, expr, denominator);
+    assert(OK());
+    return;
+  }
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    const Relation_Symbol reversed_relsym = (relsym == LESS_THAN_OR_EQUAL)
+      ? GREATER_THAN_OR_EQUAL : LESS_THAN_OR_EQUAL;
+    const Linear_Expression inverse
+      = expr - (expr_v + denominator)*var;
+    TEMP_INTEGER(inverse_den);
+    neg_assign(inverse_den, expr_v);
+    const Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_den)) ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse, inverse_den);
+    return;
+  }
+
+  // Here `var_coefficient == 0', so that the preimage cannot
+  // be easily computed by inverting the affine relation.
+  // Shrink the BD shape by adding the constraint induced
+  // by the affine relation.
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type j = 0;
+  // Get information about the number of non-zero coefficients in `expr'.
+  for (dimension_type i = expr_space_dim; i-- > 0; )
+    if (expr.coefficient(Variable(i)) != 0)
+      if (t++ == 1)
+	break;
+      else
+	j = i+1;
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*j + b, where `j != v';
+  // - If t == 2, the `expr' is of the general form.
+  DB_Row<N>& dbm_0 = dbm[0];
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    switch (relsym) {
+    case LESS_THAN_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      break;
+    case GREATER_THAN_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_dbm_constraint(v, 0, -b, denominator);
+      break;
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+      break;
+    }
+  }
+  else if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& expr_j = expr.coefficient(Variable(j-1));
+    N d;
+    switch (relsym) {
+    case LESS_THAN_OR_EQUAL:
+      div_round_up(d, b, denominator);
+      // Note that: `j != v', so that `expr' is of the form
+      // expr_j * j + b, with `j != v'.
+      if (expr_j == denominator)
+	// Add the new constraint `v - j <= b/denominator'.
+	add_dbm_constraint(j, v, d);
+      else {
+	// Here expr_j != denominator, so that we should be adding
+	// the constraint `v <= b/denominator - j'.
+	N sum;
+	// Approximate the homogeneous part of `expr'.
+	const int sign_j = sgn(expr_j);
+	const N& approx_j = (sign_j > 0) ? dbm_0[j] : dbm[j][0];
+	if (!is_plus_infinity(approx_j)) {
+	  N coeff_j;
+	  if (sign_j > 0)
+	    assign_r(coeff_j, expr_j, ROUND_UP);
+	  else {
+	    TEMP_INTEGER(minus_expr_j);
+	    neg_assign(minus_expr_j, expr_j);
+	    assign_r(coeff_j, minus_expr_j, ROUND_UP);
+	  }
+	  add_mul_assign_r(sum, coeff_j, approx_j, ROUND_UP);
+	  add_dbm_constraint(0, v, sum);
+	}
+      }
+      break;
+
+    case GREATER_THAN_OR_EQUAL:
+      div_round_up(d, -b, denominator);
+      // Note that: `j != v', so that `expr' is of the form
+      // expr_j * j + b, with `j != v'.
+      if (expr_j == denominator)
+	// Add the new constraint `v - j >= b/denominator'.
+	add_dbm_constraint(j, v, d);
+      else {
+	// Here expr_j != denominator, so that we should be adding
+	// the constraint `v <= b/denominator - j'.
+	N sum;
+	// Approximate the homogeneous part of `expr_j'.
+	const int sign_j = sgn(expr_j);
+	const N& approx_j = (sign_j > 0) ? dbm_0[j] : dbm[j][0];
+	if (!is_plus_infinity(approx_j)) {
+	  N coeff_j;
+	  if (sign_j > 0)
+	    assign_r(coeff_j, expr_j, ROUND_UP);
+	  else {
+	    TEMP_INTEGER(minus_expr_j);
+	    neg_assign(minus_expr_j, expr_j);
+	    assign_r(coeff_j, minus_expr_j, ROUND_UP);
+	  }
+	  add_mul_assign_r(sum, coeff_j, approx_j, ROUND_UP);
+	  add_dbm_constraint(0, v, sum);
+	}
+      }
+      break;
+
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+      break;
+    }
+  }
+  else {
+    // Here t == 2, so that
+    // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2.
+    const bool is_sc = (denominator > 0);
+    TEMP_INTEGER(minus_b);
+    neg_assign(minus_b, b);
+    const Coefficient& sc_b = is_sc ? b : minus_b;
+    const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+    TEMP_INTEGER(minus_den);
+    neg_assign(minus_den, denominator);
+    const Coefficient& sc_den = is_sc ? denominator : minus_den;
+    const Coefficient& minus_sc_den = is_sc ? minus_den : denominator;
+    // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+    // when `denominator' is negative. Do not use it unless you are sure
+    // it has been correctly assigned.
+    Linear_Expression minus_expr;
+    if (!is_sc)
+      minus_expr = -expr;
+    const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+    N sum;
+    // Index of variable that is unbounded in `this->dbm'.
+    // (The initialization is just to quiet a compiler warning.)
+    dimension_type pinf_index = 0;
+    // Number of unbounded variables found.
+    dimension_type pinf_count = 0;
+
+    switch (relsym) {
+    case LESS_THAN_OR_EQUAL:
+      // Compute an upper approximation for `expr' into `sum',
+      // taking into account the sign of `denominator'.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, sc_b, ROUND_UP);
+
+      // Approximate the homogeneous part of `sc_expr'.
+      // Note: indices above `w' can be disregarded, as they all have
+      // a zero coefficient in `expr'.
+      for (dimension_type i = j; i > 0; --i) {
+	const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+	const int sign_i = sgn(sc_i);
+	if (sign_i == 0)
+	  continue;
+	// Choose carefully: we are approximating `sc_expr'.
+	const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
+	if (is_plus_infinity(approx_i)) {
+	  if (++pinf_count > 1)
+	    break;
+	  pinf_index = i;
+	  continue;
+	}
+	N coeff_i;
+	if (sign_i > 0)
+	  assign_r(coeff_i, sc_i, ROUND_UP);
+	else {
+	  TEMP_INTEGER(minus_sc_i);
+	  neg_assign(minus_sc_i, sc_i);
+	  assign_r(coeff_i, minus_sc_i, ROUND_UP);
+	}
+	add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+      }
+
+      // Divide by the (sign corrected) denominator (if needed).
+      if (sc_den != 1) {
+	// Before computing the quotient, the denominator should be
+	// approximated towards zero. Since `sc_den' is known to be
+	// positive, this amounts to rounding downwards, which is achieved
+	// by rounding upwards `minus_sc-den' and negating again the result.
+	N down_sc_den;
+	assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+	neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+	div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+      }
+
+      if (pinf_count == 0) {
+	// Add the constraint `v <= sum'.
+	add_dbm_constraint(0, v, sum);
+	// Deduce constraints of the form `v - u', where `u != v'.
+	deduce_v_minus_u_bounds(v, j, sc_expr, sc_den, sum);
+      }
+      else if (pinf_count == 1)
+	if (expr.coefficient(Variable(pinf_index-1)) == denominator)
+	  // Add the constraint `v - pinf_index <= sum'.
+	  add_dbm_constraint(pinf_index, v, sum);
+      break;
+
+    case GREATER_THAN_OR_EQUAL:
+      // Compute an upper approximation for `-sc_expr' into `sum'.
+      // Note: approximating `-sc_expr' from above and then negating the
+      // result is the same as approximating `sc_expr' from below.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, minus_sc_b, ROUND_UP);
+
+      // Approximate the homogeneous part of `-sc_expr'.
+      for (dimension_type i = j; i > 0; --i) {
+	const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+	const int sign_i = sgn(sc_i);
+	if (sign_i == 0)
+	  continue;
+	// Choose carefully: we are approximating `-sc_expr'.
+	const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
+	if (is_plus_infinity(approx_i)) {
+	  if (++pinf_count > 1)
+	    break;
+	  pinf_index = i;
+	  continue;
+	}
+	N coeff_i;
+	if (sign_i > 0)
+	  assign_r(coeff_i, sc_i, ROUND_UP);
+	else {
+	  TEMP_INTEGER(minus_sc_i);
+	  neg_assign(minus_sc_i, sc_i);
+	  assign_r(coeff_i, minus_sc_i, ROUND_UP);
+	}
+	add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+      }
+
+      // Divide by the (sign corrected) denominator (if needed).
+      if (sc_den != 1) {
+	// Before computing the quotient, the denominator should be
+	// approximated towards zero. Since `sc_den' is known to be positive,
+	// this amounts to rounding downwards, which is achieved by rounding
+	// upwards `minus_sc_den' and negating again the result.
+	N down_sc_den;
+	assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+	neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+	div_assign_r(sum, sum, down_sc_den, ROUND_UP);
+      }
+
+      if (pinf_count == 0) {
+	// Add the constraint `v >= -sum', i.e., `-v <= sum'.
+	add_dbm_constraint(v, 0, sum);
+	// Deduce constraints of the form `u - v', where `u != v'.
+	deduce_u_minus_v_bounds(v, j, sc_expr, sc_den, sum);
+      }
+      else if (pinf_count == 1)
+	if (pinf_index != v
+	    && expr.coefficient(Variable(pinf_index-1)) == denominator)
+	  // Add the constraint `v - pinf_index >= -sum',
+	  // i.e., `pinf_index - v <= sum'.
+	  add_dbm_constraint(v, pinf_index, sum);
+      break;
+
+    default:
+      // We already dealt with the other cases.
+      throw std::runtime_error("PPL internal error");
+      break;
+    }
+  }
+
+  // If the shrunk BD_Shape is empty, its preimage is empty too.
+  if (is_empty())
+    return;
+  forget_all_dbm_constraints(v);
+  // Shortest-path closure is preserved, but not reduction.
+  if (marked_shortest_path_reduced())
+    status.reset_shortest_path_reduced();
+  assert(OK());
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::constraints() const {
+  using Implementation::BD_Shapes::numer_denom;
+
+  Constraint_System cs;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else if (marked_shortest_path_reduced())
+    // Disregard redundant constraints.
+    cs = minimized_constraints();
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
+
+    TEMP_INTEGER(a);
+    TEMP_INTEGER(b);
+    // Go through all the unary constraints in `dbm'.
+    const DB_Row<N>& dbm_0 = dbm[0];
+    for (dimension_type j = 1; j <= space_dim; ++j) {
+      const Variable x(j-1);
+      const N& dbm_0j = dbm_0[j];
+      const N& dbm_j0 = dbm[j][0];
+      N negated_dbm_j0;
+      if (neg_assign_r(negated_dbm_j0, dbm_j0, ROUND_NOT_NEEDED) == V_EQ
+	  && negated_dbm_j0 == dbm_0j) {
+	// We have a unary equality constraint.
+	numer_denom(dbm_0j, b, a);
+	cs.insert(a*x == b);
+      }
+      else {
+	// We have 0, 1 or 2 unary inequality constraints.
+	if (!is_plus_infinity(dbm_0j)) {
+	  numer_denom(dbm_0j, b, a);
+	  cs.insert(a*x <= b);
+	}
+	if (!is_plus_infinity(dbm_j0)) {
+	  numer_denom(dbm_j0, b, a);
+	  cs.insert(-a*x <= b);
+	}
+      }
+    }
+
+    // Go through all the binary constraints in `dbm'.
+    for (dimension_type i = 1; i <= space_dim; ++i) {
+      const Variable y(i-1);
+      const DB_Row<N>& dbm_i = dbm[i];
+      for (dimension_type j = i + 1; j <= space_dim; ++j) {
+	const Variable x(j-1);
+	const N& dbm_ij = dbm_i[j];
+	const N& dbm_ji = dbm[j][i];
+	N negated_dbm_ji;
+	if (neg_assign_r(negated_dbm_ji, dbm_ji, ROUND_NOT_NEEDED) == V_EQ
+	    && negated_dbm_ji == dbm_ij) {
+	  // We have a binary equality constraint.
+	  numer_denom(dbm_ij, b, a);
+	  cs.insert(a*x - a*y == b);
+	}
+	else {
+	  // We have 0, 1 or 2 binary inequality constraints.
+	  if (!is_plus_infinity(dbm_ij)) {
+	    numer_denom(dbm_ij, b, a);
+	    cs.insert(a*x - a*y <= b);
+	  }
+	  if (!is_plus_infinity(dbm_ji)) {
+	    numer_denom(dbm_ji, b, a);
+	    cs.insert(a*y - a*x <= b);
+	  }
+	}
+      }
+    }
+  }
+  return cs;
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::minimized_constraints() const {
+  using Implementation::BD_Shapes::numer_denom;
+
+  shortest_path_reduction_assign();
+  Constraint_System cs;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+  }
+  else if (marked_empty())
+    cs.insert(0*Variable(space_dim-1) <= -1);
+  else {
+    // KLUDGE: in the future `cs' will be constructed of the right dimension.
+    // For the time being, we force the dimension with the following line.
+    cs.insert(0*Variable(space_dim-1) <= 0);
+
+    TEMP_INTEGER(num);
+    TEMP_INTEGER(den);
+
+    // Compute leader information.
+    std::vector<dimension_type> leaders;
+    compute_leaders(leaders);
+    std::vector<dimension_type> leader_indices;
+    compute_leader_indices(leaders, leader_indices);
+    const dimension_type num_leaders = leader_indices.size();
+
+    // Go through the non-leaders to generate equality constraints.
+    const DB_Row<N>& dbm_0 = dbm[0];
+    for (dimension_type i = 1; i <= space_dim; ++i) {
+      const dimension_type leader = leaders[i];
+      if (i != leader)
+	// Generate the constraint relating `i' and its leader.
+	if (leader == 0) {
+	  // A unary equality has to be generated.
+	  assert(!is_plus_infinity(dbm_0[i]));
+	  numer_denom(dbm_0[i], num, den);
+	  cs.insert(den*Variable(i-1) == num);
+	}
+	else {
+	  // A binary equality has to be generated.
+	  assert(!is_plus_infinity(dbm[i][leader]));
+	  numer_denom(dbm[i][leader], num, den);
+	  cs.insert(den*Variable(leader-1) - den*Variable(i-1) == num);
+	}
+    }
+
+    // Go through the leaders to generate inequality constraints.
+    // First generate all the unary inequalities.
+    const std::deque<bool>& red_0 = redundancy_dbm[0];
+    for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+      const dimension_type i = leader_indices[l_i];
+      if (!red_0[i]) {
+	numer_denom(dbm_0[i], num, den);
+	cs.insert(den*Variable(i-1) <= num);
+      }
+      if (!redundancy_dbm[i][0]) {
+	numer_denom(dbm[i][0], num, den);
+	cs.insert(-den*Variable(i-1) <= num);
+      }
+    }
+    // Then generate all the binary inequalities.
+    for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+      const dimension_type i = leader_indices[l_i];
+      const DB_Row<N>& dbm_i = dbm[i];
+      const std::deque<bool>& red_i = redundancy_dbm[i];
+      for (dimension_type l_j = l_i + 1; l_j < num_leaders; ++l_j) {
+	const dimension_type j = leader_indices[l_j];
+	if (!red_i[j]) {
+	  numer_denom(dbm_i[j], num, den);
+	  cs.insert(den*Variable(j-1) - den*Variable(i-1) <= num);
+	}
+	if (!redundancy_dbm[j][i]) {
+	  numer_denom(dbm[j][i], num, den);
+	  cs.insert(den*Variable(i-1) - den*Variable(j-1) <= num);
+	}
+      }
+    }
+  }
+  return cs;
+}
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const BD_Shape<T>& c) {
+  typedef typename BD_Shape<T>::coefficient_type N;
+  if (c.is_universe())
+    s << "true";
+  else {
+    // We control empty system of bounded differences.
+    dimension_type n = c.space_dimension();
+    if (c.marked_empty())
+      s << "false";
+    else {
+      bool first = true;
+      for (dimension_type i = 0; i <= n; ++i)
+	for (dimension_type j = i + 1; j <= n; ++j) {
+	  const N& c_i_j = c.dbm[i][j];
+	  const N& c_j_i = c.dbm[j][i];
+	  N negated_c_ji;
+	  if (neg_assign_r(negated_c_ji, c_j_i, ROUND_NOT_NEEDED) == V_EQ
+	      && negated_c_ji == c_i_j) {
+	    // We will print an equality.
+	    if (first)
+	      first = false;
+	    else
+	      s << ", ";
+	    if (i == 0) {
+	      // We have got a equality constraint with one Variable.
+	      s << Variable(j - 1);
+	      s << " == " << c_i_j;
+	    }
+	    else {
+	      // We have got a equality constraint with two Variables.
+	      if (c_i_j >= 0) {
+		s << Variable(j - 1);
+		s << " - ";
+		s << Variable(i - 1);
+		s << " == " << c_i_j;
+	      }
+	      else {
+		s << Variable(i - 1);
+		s << " - ";
+		s << Variable(j - 1);
+		s << " == " << c_j_i;
+	      }
+	    }
+	  }
+	  else {
+	    // We will print a non-strict inequality.
+	    if (!is_plus_infinity(c_j_i)) {
+	      if (first)
+		first = false;
+	      else
+		s << ", ";
+	      if (i == 0) {
+		// We have got a constraint with an only Variable.
+		s << Variable(j - 1);
+		N v;
+		neg_assign_r(v, c_j_i, ROUND_DOWN);
+		s << " >= " << v;
+	      }
+	      else {
+		// We have got a constraint with two Variables.
+		if (c_j_i >= 0) {
+		  s << Variable(i - 1);
+		  s << " - ";
+		  s << Variable(j - 1);
+		  s << " <= " << c_j_i;
+		}
+		else {
+		  s << Variable(j - 1);
+		  s << " - ";
+		  s << Variable(i - 1);
+		  N v;
+		  neg_assign_r(v, c_j_i, ROUND_DOWN);
+		  s << " >= " << v;
+		}
+	      }
+	    }
+	    if (!is_plus_infinity(c_i_j)) {
+	      if (first)
+		first = false;
+	      else
+		s << ", ";
+	      if (i == 0) {
+		// We have got a constraint with an only Variable.
+		s << Variable(j - 1);
+		s << " <= " << c_i_j;
+	      }
+	      else {
+		// We have got a constraint with two Variables.
+		if (c_i_j >= 0) {
+		  s << Variable(j - 1);
+		  s << " - ";
+		  s << Variable(i - 1);
+		  s << " <= " << c_i_j;
+		}
+		else {
+		  s << Variable(i - 1);
+		  s << " - ";
+		  s << Variable(j - 1);
+		  N v;
+		  neg_assign_r(v, c_i_j, ROUND_DOWN);
+		  s << " >= " << v;
+		}
+	      }
+	    }
+	  }
+	}
+    }
+  }
+  return s;
+}
+
+template <typename T>
+void
+BD_Shape<T>::ascii_dump(std::ostream& s) const {
+  status.ascii_dump(s);
+  s << "\n";
+  dbm.ascii_dump(s);
+  // Redundancy info.
+  s << "\n";
+  const char separator = ' ';
+  const dimension_type nrows = redundancy_dbm.size();
+  s << nrows << separator << "\n";
+  for (dimension_type i = 0; i < nrows;  ++i) {
+    for (dimension_type j = 0; j < nrows; ++j)
+      s << redundancy_dbm[i][j] << separator;
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, BD_Shape<T>);
+
+template <typename T>
+bool
+BD_Shape<T>::ascii_load(std::istream& s) {
+  if (!status.ascii_load(s))
+    return false;
+  if (!dbm.ascii_load(s))
+    return false;
+  // Load redundancy info.
+  dimension_type nrows;
+   if (!(s >> nrows))
+    return false;
+  redundancy_dbm.clear();
+  redundancy_dbm.reserve(nrows);
+  std::deque<bool> redundancy_row(nrows, false);
+  for (dimension_type i = 0; i < nrows;  ++i) {
+    for (dimension_type j = 0; j < nrows; ++j)
+      if (!(s >> redundancy_row[j]))
+	return false;
+    redundancy_dbm.push_back(redundancy_row);
+  }
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::OK() const {
+  // Check whether the difference-bound matrix is well-formed.
+  if (!dbm.OK())
+    return false;
+
+  // Check whether the status information is legal.
+  if (!status.OK())
+    return false;
+
+  // An empty BDS is OK.
+  if (marked_empty())
+    return true;
+
+  // MINUS_INFINITY cannot occur at all.
+  for (dimension_type i = dbm.num_rows(); i-- > 0; )
+    for (dimension_type j = dbm.num_rows(); j-- > 0; )
+    if (is_minus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+      using namespace Parma_Polyhedra_Library::IO_Operators;
+      std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
+		<< dbm[i][i] << "!"
+		<< std::endl;
+#endif
+      return false;
+    }
+
+  // On the main diagonal only PLUS_INFINITY can occur.
+  for (dimension_type i = dbm.num_rows(); i-- > 0; )
+    if (!is_plus_infinity(dbm[i][i])) {
+#ifndef NDEBUG
+      using namespace Parma_Polyhedra_Library::IO_Operators;
+      std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
+		<< dbm[i][i] << "!  (+inf was expected.)"
+		<< std::endl;
+#endif
+      return false;
+    }
+
+  // Check whether the shortest-path closure information is legal.
+  if (marked_shortest_path_closed()) {
+    BD_Shape x = *this;
+    x.status.reset_shortest_path_closed();
+    x.shortest_path_closure_assign();
+    if (x.dbm != dbm) {
+#ifndef NDEBUG
+      std::cerr << "BD_Shape is marked as closed but it is not!"
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // Check whether the shortest-path reduction information is legal.
+  if (marked_shortest_path_reduced()) {
+    // A non-redundant constraint cannot be equal to PLUS_INFINITY.
+    for (dimension_type i = dbm.num_rows(); i-- > 0; )
+      for (dimension_type j = dbm.num_rows(); j-- > 0; )
+	if (!redundancy_dbm[i][j] && is_plus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+	  using namespace Parma_Polyhedra_Library::IO_Operators;
+	  std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
+		    << dbm[i][i] << " is marked as non-redundant!"
+		    << std::endl;
+#endif
+	  return false;
+	}
+
+    BD_Shape x = *this;
+    x.status.reset_shortest_path_reduced();
+    x.shortest_path_reduction_assign();
+    if (x.redundancy_dbm != redundancy_dbm) {
+#ifndef NDEBUG
+      std::cerr << "BD_Shape is marked as reduced but it is not!"
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // All checks passed.
+  return true;
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+					  const BD_Shape& y) const {
+  std::ostringstream s;
+  s << "PPL::";
+  s << "BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+					  dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::";
+  s << "BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+					  const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::";
+  s << "BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+					  const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::";
+  s << "BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_constraint_incompatible(const char* method) {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "the constraint is incompatible.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_expression_too_complex(const char* method,
+					  const Linear_Expression& e) {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << e << " is too complex.";
+  throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+					  const char* name_row,
+					  const Linear_Expression& y) const {
+  std::ostringstream s;
+  s << "PPL::";
+  s << "BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << name_row << "->space_dimension() == "
+    << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+BD_Shape<T>::throw_generic(const char* method, const char* reason) {
+  std::ostringstream s;
+  s << "PPL::";
+  s << "BD_Shape::" << method << ":" << std::endl
+    << reason;
+  throw std::invalid_argument(s.str());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/BD_Shape.defs.hh line 1341
+
+// Automatically generated from PPL source file ../src/Determinate.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+class Determinate;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Determinate.defs.hh line 1
+/* Determinate class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Determinate.defs.hh line 31
+#include <iosfwd>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are the same domain element.
+
+  \relates Determinate
+*/
+template <typename PH>
+bool operator==(const Determinate<PH>& x, const Determinate<PH>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are different domain elements.
+
+  \relates Determinate
+*/
+template <typename PH>
+bool operator!=(const Determinate<PH>& x, const Determinate<PH>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+std::ostream&
+operator<<(std::ostream&, const Determinate<PH>&);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! Wraps a PPL class into a determinate constraint system interface.
+/*! \ingroup PPL_CXX_interface */
+template <typename PH>
+class Parma_Polyhedra_Library::Determinate {
+public:
+  //! \name Constructors and Destructor
+  //@{
+
+  /*! \brief
+    Injection operator: builds the determinate constraint system element
+    corresponding to the base-level element \p p.
+  */
+  Determinate(const PH& p);
+
+  /*! \brief
+    Injection operator: builds the determinate constraint system element
+    corresponding to the base-level element represented by \p cs.
+  */
+  Determinate(const Constraint_System& cs);
+
+  //! \brief
+  //! Injection operator: builds the determinate constraint system element
+  //! corresponding to the base-level element represented by \p cgs.
+  Determinate(const Congruence_System& cgs);
+
+  //! Copy constructor.
+  Determinate(const Determinate& y);
+
+  //! Destructor.
+  ~Determinate();
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Domain Element
+  //@{
+
+  //! Returns a const reference to the embedded element.
+  const PH& element() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the top of the
+    determinate constraint system (i.e., the whole vector space).
+  */
+  bool is_top() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the bottom
+    of the determinate constraint system.
+  */
+  bool is_bottom() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this entails \p y.
+  bool definitely_entails(const Determinate& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent.
+  */
+  bool is_definitely_equivalent_to(const Determinate& y) const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} // Member Functions that Do Not Modify the Domain Element
+
+
+  //! \name Member Functions that May Modify the Domain Element
+  //@{
+
+  //! Assigns to \p *this the upper bound of \p *this and \p y.
+  void upper_bound_assign(const Determinate& y);
+
+  //! Assigns to \p *this the meet of \p *this and \p y.
+  void meet_assign(const Determinate& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+  */
+  void concatenate_assign(const Determinate& y);
+
+  //! Returns a reference to the embedded element.
+  PH& element();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    On return from this method, the representation of \p *this
+    is not shared by different Determinate objects.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  void mutate();
+
+  //! Assignment operator.
+  Determinate& operator=(const Determinate& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Determinate& y);
+
+  //@} // Member Functions that May Modify the Domain Element
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A function adapter for the Determinate class.
+  /*! \ingroup PPL_CXX_interface
+    It lifts a Binary_Operator_Assign function object, taking arguments
+    of type PH, producing the corresponding function object taking
+    arguments of type Determinate<PH>.
+
+    The template parameter Binary_Operator_Assign is supposed to
+    implement an <EM>apply and assign</EM> function, i.e., a function
+    having signature <CODE>void foo(PH& x, const PH& y)</CODE> that
+    applies an operator to \c x and \c y and assigns the result to \c x.
+    For instance, such a function object is obtained by
+    <CODE>std::mem_fun_ref(&C_Polyhedron::intersection_assign)</CODE>.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  template <typename Binary_Operator_Assign>
+  class Binary_Operator_Assign_Lifter {
+  public:
+    //! Explicit unary constructor.
+    explicit
+    Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign);
+
+    //! Function-application operator.
+    void operator()(Determinate& x, const Determinate& y) const;
+
+  private:
+    //! The function object to be lifted.
+    Binary_Operator_Assign op_assign_;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Helper function returning a Binary_Operator_Assign_Lifter object,
+    also allowing for the deduction of template arguments.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  template <typename Binary_Operator_Assign>
+  static Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+  lift_op_assign(Binary_Operator_Assign op_assign);
+
+private:
+  //! The possibly shared representation of a Determinate object.
+  /*! \ingroup PPL_CXX_interface
+    By adopting the <EM>copy-on-write</EM> technique, a single
+    representation of the base-level object may be shared by more than
+    one object of the class Determinate.
+  */
+  class Rep {
+  private:
+    /*! \brief
+      Count the number of references:
+      -   0: leaked, \p ph is non-const;
+      -   1: one reference, \p ph is non-const;
+      - > 1: more than one reference, \p ph is const.
+    */
+    mutable unsigned long references;
+
+    //! Private and unimplemented: assignment not allowed.
+    Rep& operator=(const Rep& y);
+
+    //! Private and unimplemented: copies not allowed.
+    Rep(const Rep& y);
+
+    //! Private and unimplemented: default construction not allowed.
+    Rep();
+
+  public:
+    //! A possibly shared base-level domain element.
+    PH ph;
+
+    /*! \brief
+      Builds a new representation by creating a domain element
+      of the specified kind, in the specified vector space.
+    */
+    Rep(dimension_type num_dimensions, Degenerate_Element kind);
+
+    //! Builds a new representation by copying base-level element \p p.
+    Rep(const PH& p);
+
+    //! Builds a new representation by copying the constraints in \p cs.
+    Rep(const Constraint_System& cs);
+
+    //! Builds a new representation by copying the constraints in \p cgs.
+    Rep(const Congruence_System& cgs);
+
+    //! Destructor.
+    ~Rep();
+
+    //! Registers a new reference.
+    void new_reference() const;
+
+    /*! \brief
+      Unregisters one reference; returns <CODE>true</CODE> if and only if
+      the representation has become unreferenced.
+    */
+    bool del_reference() const;
+
+    //! True if and only if this representation is currently shared.
+    bool is_shared() const;
+
+    /*! \brief
+      Returns a lower bound to the total size in bytes of the memory
+      occupied by \p *this.
+    */
+    memory_size_type total_memory_in_bytes() const;
+
+    /*! \brief
+      Returns a lower bound to the size in bytes of the memory
+      managed by \p *this.
+    */
+    memory_size_type external_memory_in_bytes() const;
+  };
+
+  /*! \brief
+    A pointer to the possibly shared representation of
+    the base-level domain element.
+  */
+  Rep* prep;
+
+  friend bool
+  operator==<PH>(const Determinate<PH>& x, const Determinate<PH>& y);
+  friend bool
+  operator!=<PH>(const Determinate<PH>& x, const Determinate<PH>& y);
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+void swap(Parma_Polyhedra_Library::Determinate<PH>& x,
+	  Parma_Polyhedra_Library::Determinate<PH>& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Determinate.inlines.hh line 1
+/* Determinate class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(dimension_type num_dimensions,
+			  Degenerate_Element kind)
+  : references(0), ph(num_dimensions, kind) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(const PH& p)
+  : references(0), ph(p) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(const Constraint_System& cs)
+  : references(0), ph(cs) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(const Congruence_System& cgs)
+  : references(0), ph(cgs) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::~Rep() {
+  assert(references == 0);
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::Rep::new_reference() const {
+  ++references;
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::Rep::del_reference() const {
+  return --references == 0;
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::Rep::is_shared() const {
+  return references > 1;
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::Rep::external_memory_in_bytes() const {
+  return ph.external_memory_in_bytes();
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::Rep::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const PH& ph)
+  : prep(new Rep(ph)) {
+  prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const Constraint_System& cs)
+  : prep(new Rep(cs)) {
+  prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const Congruence_System& cgs)
+  : prep(new Rep(cgs)) {
+  prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const Determinate& y)
+  : prep(y.prep) {
+  prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::~Determinate() {
+  if (prep->del_reference())
+    delete prep;
+}
+
+template <typename PH>
+inline Determinate<PH>&
+Determinate<PH>::operator=(const Determinate& y) {
+  y.prep->new_reference();
+  if (prep->del_reference())
+    delete prep;
+  prep = y.prep;
+  return *this;
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::swap(Determinate& y) {
+  std::swap(prep, y.prep);
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::mutate() {
+  if (prep->is_shared()) {
+    Rep* new_prep = new Rep(prep->ph);
+    (void) prep->del_reference();
+    new_prep->new_reference();
+    prep = new_prep;
+  }
+}
+
+template <typename PH>
+inline const PH&
+Determinate<PH>::element() const {
+  return prep->ph;
+}
+
+template <typename PH>
+inline PH&
+Determinate<PH>::element() {
+  mutate();
+  return prep->ph;
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::upper_bound_assign(const Determinate& y) {
+  element().upper_bound_assign(y.element());
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::meet_assign(const Determinate& y) {
+  element().intersection_assign(y.element());
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::concatenate_assign(const Determinate& y) {
+  element().concatenate_assign(y.element());
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::definitely_entails(const Determinate& y) const {
+  return prep == y.prep || y.prep->ph.contains(prep->ph);
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::is_definitely_equivalent_to(const Determinate& y) const {
+  return prep == y.prep || prep->ph == y.prep->ph;
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::is_top() const {
+  return prep->ph.is_universe();
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::is_bottom() const {
+  return prep->ph.is_empty();
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::external_memory_in_bytes() const {
+  return prep->total_memory_in_bytes();
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::OK() const {
+  return prep->ph.OK();
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+inline std::ostream&
+operator<<(std::ostream& s, const Determinate<PH>& x) {
+  s << x.element();
+  return s;
+}
+
+} // namespace IO_Operators
+
+/*! \relates Determinate */
+template <typename PH>
+inline bool
+operator==(const Determinate<PH>& x, const Determinate<PH>& y) {
+  return x.prep == y.prep || x.prep->ph == y.prep->ph;
+}
+
+/*! \relates Determinate */
+template <typename PH>
+inline bool
+operator!=(const Determinate<PH>& x, const Determinate<PH>& y) {
+  return x.prep != y.prep && x.prep->ph != y.prep->ph;
+}
+
+template <typename PH>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign)
+  : op_assign_(op_assign) {
+}
+
+template <typename PH>
+template <typename Binary_Operator_Assign>
+inline void
+Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+operator()(Determinate& x, const Determinate& y) const {
+  op_assign_(x.element(), y.element());
+}
+
+template <typename PH>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+Determinate<PH>::lift_op_assign(Binary_Operator_Assign op_assign) {
+  return Binary_Operator_Assign_Lifter<Binary_Operator_Assign>(op_assign);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+inline void
+swap(Parma_Polyhedra_Library::Determinate<PH>& x,
+     Parma_Polyhedra_Library::Determinate<PH>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Determinate.defs.hh line 315
+
+// Automatically generated from PPL source file ../src/Powerset.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+class Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Powerset.defs.hh line 1
+/* Powerset class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Powerset.defs.hh line 27
+#include <iosfwd>
+#include <iterator>
+#include <list>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator!=(const Powerset<D>& x, const Powerset<D>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The powerset construction on a base-level domain.
+/*! \ingroup PPL_CXX_interface
+  This class offers a generic implementation of a
+  <EM>powerset</EM> domain as defined in Section \ref powerset.
+
+  Besides invoking the available methods on the disjuncts of a Powerset,
+  this class also provides bidirectional iterators that allow for a
+  direct inspection of these disjuncts. For a consistent handling of
+  Omega-reduction, all the iterators are <EM>read-only</EM>, meaning
+  that the disjuncts cannot be overwritten. Rather, by using the class
+  <CODE>iterator</CODE>, it is possible to drop one or more disjuncts
+  (possibly so as to later add back modified versions).  As an example
+  of iterator usage, the following templatic function drops from
+  powerset \p ps all the disjuncts that would have become redundant by
+  the addition of an external element \p d.
+
+  \code
+template <typename D>
+void
+drop_subsumed(Powerset<D>& ps, const D& d) {
+  for (typename Powerset<D>::iterator i = ps.begin(),
+         ps_end = ps.end(), i != ps_end; )
+    if (i->definitely_entails(d))
+      i = ps.drop_disjunct(i);
+    else
+      ++i;
+}
+  \endcode
+
+  The template class D must provide the following methods.
+  \code
+    memory_size_type total_memory_in_bytes() const
+  \endcode
+  Returns a lower bound on the total size in bytes of the memory
+  occupied by the instance of D.
+  \code
+    bool is_top() const
+  \endcode
+  Returns <CODE>true</CODE> if and only if the instance of D is the top
+  element of the domain.
+  \code
+    bool is_bottom() const
+  \endcode
+  Returns <CODE>true</CODE> if and only if the instance of D is the
+  bottom element of the domain.
+  \code
+    bool definitely_entails(const D& y) const
+  \endcode
+  Returns <CODE>true</CODE> if the instance of D definitely entails
+  <CODE>y</CODE>.  Returns <CODE>false</CODE> if the instance may not
+  entail <CODE>y</CODE> (i.e., if the instance does not entail
+  <CODE>y</CODE> or if entailment could not be decided).
+  \code
+    void upper_bound_assign(const D& y)
+  \endcode
+  Assigns to the instance of D an upper bound of the instance and
+  <CODE>y</CODE>.
+  \code
+    void meet_assign(const D& y)
+  \endcode
+  Assigns to the instance of D the meet of the instance and
+  <CODE>y</CODE>.
+  \code
+    bool OK() const
+  \endcode
+  Returns <CODE>true</CODE> if the instance of D is in a consistent
+  state, else returns <CODE>false</CODE>.
+
+  The following operators on the template class D must be defined.
+  \code
+    operator<<(std::ostream& s, const D& x)
+  \endcode
+  Writes a textual representation of the instance of D on
+  <CODE>s</CODE>.
+  \code
+    operator==(const D& x, const D& y)
+  \endcode
+  Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+  <CODE>y</CODE> are equivalent D's.
+  \code
+    operator!=(const D& x, const D& y)
+  \endcode
+  Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+  <CODE>y</CODE> are different D's.
+*/
+template <typename D>
+class Parma_Polyhedra_Library::Powerset {
+public:
+  //! \name Constructors and Destructor
+  //@{
+
+  /*! \brief
+    Default constructor: builds the bottom of the powerset constraint
+    system (i.e., the empty powerset).
+  */
+  Powerset();
+
+  //! Copy constructor.
+  Powerset(const Powerset& y);
+
+  /*! \brief
+    If \p d is not bottom, builds a powerset containing only \p d.
+    Builds the empty powerset otherwise.
+  */
+  explicit Powerset(const D& d);
+
+  //! Destructor.
+  ~Powerset();
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Powerset Element
+  //@{
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this definitely entails \p y.
+    Returns <CODE>false</CODE> if \p *this may not entail \p y
+    (i.e., if \p *this does not entail \p y or if entailment could
+    not be decided).
+  */
+  bool definitely_entails(const Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the top
+    element of the powerset constraint system (i.e., it represents
+    the universe).
+  */
+  bool is_top() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the bottom
+    element of the powerset constraint system (i.e., it represents
+    the empty set).
+  */
+  bool is_bottom() const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  // FIXME: document and perhaps use an enum instead of a bool.
+  bool OK(bool disallow_bottom = false) const;
+
+  //@} // Member Functions that Do Not Modify the Powerset Element
+
+protected:
+  //! A powerset is implemented as a sequence of elements.
+  /*!
+    The particular sequence employed must support efficient deletion
+    in any position and efficient back insertion.
+  */
+  typedef std::list<D> Sequence;
+
+  //! Alias for the low-level iterator on the disjuncts.
+  typedef typename Sequence::iterator Sequence_iterator;
+
+  //! Alias for the low-level %const_iterator on the disjuncts.
+  typedef typename Sequence::const_iterator Sequence_const_iterator;
+
+  //! The sequence container holding powerset's elements.
+  Sequence sequence;
+
+  //! If <CODE>true</CODE>, \p *this is Omega-reduced.
+  mutable bool reduced;
+
+public:
+  // Sequence manipulation types, accessors and modifiers
+  typedef typename Sequence::size_type size_type;
+  typedef typename Sequence::value_type value_type;
+
+  class omega_iterator;
+  class omega_const_iterator;
+
+  /*! \brief
+    Alias for a <EM>read-only</EM> bidirectional %iterator on the
+    disjuncts of a Powerset element.
+
+    By using this iterator type, the disjuncts cannot be overwritten,
+    but they can be removed using methods
+    <CODE>drop_disjunct(iterator position)</CODE> and
+    <CODE>drop_disjuncts(iterator first, iterator last)</CODE>,
+    while still ensuring a correct handling of Omega-reduction.
+  */
+  typedef omega_iterator iterator;
+  //! A bidirectional %const_iterator on the disjuncts of a Powerset element.
+  typedef omega_const_iterator const_iterator;
+
+  //! The reverse iterator type built from Powerset::iterator.
+  typedef std::reverse_iterator<iterator> reverse_iterator;
+  //! The reverse iterator type built from Powerset::const_iterator.
+  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+
+  //! \name Member Functions for the Direct Manipulation of Disjuncts
+  //@{
+
+  /*! \brief
+    Drops from the sequence of disjuncts in \p *this all the
+    non-maximal elements so that \p *this is non-redundant.
+
+    This method is declared <CODE>const</CODE> because, even though
+    Omega-reduction may change the syntactic representation of \p *this,
+    its semantics will be unchanged.
+  */
+  void omega_reduce() const;
+
+  //! Returns the number of disjuncts.
+  size_type size() const;
+
+  //! Returns <CODE>true</CODE> if and only if there are no disjuncts.
+  bool empty() const;
+
+  /*! \brief
+    Returns an iterator pointing to the first disjunct, if \p *this
+    is not empty; otherwise, returns the past-the-end iterator.
+  */
+  iterator begin();
+
+  //! Returns the past-the-end iterator.
+  iterator end();
+
+  /*! \brief
+    Returns a const_iterator pointing to the first disjunct, if \p *this
+    is not empty; otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  /*! \brief
+    Returns a reverse_iterator pointing to the last disjunct, if \p *this
+    is not empty; otherwise, returns the before-the-start reverse_iterator.
+  */
+  reverse_iterator rbegin();
+  //! Returns the before-the-start reverse_iterator.
+  reverse_iterator rend();
+  /*! \brief
+    Returns a const_reverse_iterator pointing to the last disjunct,
+    if \p *this is not empty; otherwise, returns the before-the-start
+    const_reverse_iterator.
+  */
+  const_reverse_iterator rbegin() const;
+  //! Returns the before-the-start const_reverse_iterator.
+  const_reverse_iterator rend() const;
+
+  //! Adds to \p *this the disjunct \p d.
+  void add_disjunct(const D& d);
+
+  /*! \brief
+    Drops the disjunct in \p *this pointed to by \p position, returning
+    an iterator to the disjunct following \p position.
+  */
+  iterator drop_disjunct(iterator position);
+
+  //! Drops all the disjuncts from \p first to \p last (excluded).
+  void drop_disjuncts(iterator first, iterator last);
+
+  //! Drops all the disjuncts, making \p *this an empty powerset.
+  void clear();
+
+  //@} // Member Functions for the Direct Manipulation of Disjuncts
+
+  //! \name Member Functions that May Modify the Powerset Element
+  //@{
+
+  //! The assignment operator.
+  Powerset& operator=(const Powerset& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Powerset& y);
+
+  //! Assigns to \p *this the least upper bound of \p *this and \p y.
+  void least_upper_bound_assign(const Powerset& y);
+
+  //! Assigns to \p *this an upper bound of \p *this and \p y.
+  /*!
+    The result will be the least upper bound of \p *this and \p y.
+  */
+  void upper_bound_assign(const Powerset& y);
+
+  //! Assigns to \p *this the meet of \p *this and \p y.
+  void meet_assign(const Powerset& y);
+
+  /*! \brief
+    If \p *this is not empty (i.e., it is not the bottom element),
+    it is reduced to a singleton obtained by computing an upper-bound
+    of all the disjuncts.
+  */
+  void collapse();
+
+  //@} // Member Functions that May Modify the Powerset element
+
+protected:
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this does not contain
+    non-maximal elements.
+  */
+  bool is_omega_reduced() const;
+
+  /*! \brief Upon return, \p *this will contain at most \p
+    max_disjuncts elements; the set of disjuncts in positions greater
+    than or equal to \p max_disjuncts, will be replaced at that
+    position by their upper-bound.
+  */
+  void collapse(unsigned max_disjuncts);
+
+  /*! \brief
+    Adds to \p *this the disjunct \p d,
+    assuming \p d is not the bottom element and ensuring
+    partial Omega-reduction.
+
+    If \p d is not the bottom element and is not Omega-redundant with
+    respect to elements in positions between \p first and \p last, all
+    elements in these positions that would be made Omega-redundant by the
+    addition of \p d are dropped and \p d is added to the reduced
+    sequence.
+  */
+  iterator add_non_bottom_disjunct(const D& d,
+				   iterator first,
+				   iterator last);
+
+  /*! \brief
+    Adds to \p *this the disjunct \p d,
+    assuming \p d is not the bottom element.
+  */
+  void add_non_bottom_disjunct(const D& d);
+
+  /*! \brief
+    Assigns to \p *this the result of applying \p op_assign pairwise
+    to the elements in \p *this and \p y.
+
+    The elements of the powerset result are obtained by applying
+    \p op_assign to each pair of elements whose components are drawn
+    from \p *this and \p y, respectively.
+  */
+  template <typename Binary_Operator_Assign>
+  void pairwise_apply_assign(const Powerset& y,
+			     Binary_Operator_Assign op_assign);
+
+private:
+  /*! \brief
+    Does the hard work of checking whether \p *this contains non-maximal
+    elements and returns <CODE>true</CODE> if and only if it does not.
+  */
+  bool check_omega_reduced() const;
+
+  /*! \brief
+    Replaces the disjunct \p *sink by an upper bound of itself and
+    all the disjuncts following it.
+  */
+  void collapse(Sequence_iterator sink);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A %const_iterator on the disjuncts of a Powerset element.
+/*! \ingroup PPL_CXX_interface
+  This class implements a read-only bidirectional iterator
+  on the sequence of disjuncts.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+class Parma_Polyhedra_Library::Powerset<D>::omega_const_iterator {
+protected:
+  //! The type of the underlying %const_iterator.
+  typedef typename Powerset::Sequence::const_iterator Base;
+
+  //! A shortcut for naming traits.
+  typedef typename std::iterator_traits<Base> Traits;
+
+  //! A %const_iterator on the sequence of elements.
+  Base base;
+
+  //! Constructs from the lower-level const_iterator.
+  omega_const_iterator(const Base& b);
+
+  friend class Powerset;
+
+public:
+  // Same traits of the underlying const_iterator.
+  typedef typename Traits::iterator_category iterator_category;
+  typedef typename Traits::value_type value_type;
+  typedef typename Traits::difference_type difference_type;
+  typedef typename Traits::pointer pointer;
+  typedef typename Traits::reference reference;
+
+  //! Default constructor.
+  omega_const_iterator();
+
+  //! Copy constructor.
+  omega_const_iterator(const omega_const_iterator& y);
+
+  //! Constructs from the corresponding non-const iterator.
+  omega_const_iterator(const omega_iterator& y);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect member selector.
+  pointer operator->() const;
+
+  //! Prefix increment operator.
+  omega_const_iterator& operator++();
+
+  //! Postfix increment operator.
+  omega_const_iterator operator++(int);
+
+  //! Prefix decrement operator.
+  omega_const_iterator& operator--();
+
+  //! Postfix decrement operator.
+  omega_const_iterator operator--(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const omega_const_iterator& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const omega_const_iterator& y) const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator on the disjuncts of a Powerset element.
+/*! \ingroup PPL_CXX_interface
+  This class implements a <EM>read-only</EM> bidirectional iterator
+  on the sequence of disjuncts. That is, by using an instance of
+  this iterator class it is not possible to overwrite the disjuncts
+  contained in a Powerset element. However, using such an instance
+  allows for the removal of disjuncts by using methods
+  <CODE>Powerset::drop_disjunct(iterator position)</CODE> and
+  <CODE>Powerset::drop_disjuncts(iterator first, iterator last)</CODE>.
+  Such a policy is needed to allow for a reliable use of the Boolean
+  flag <CODE>Powerset::reduced</CODE>.
+
+  \note
+  For any developers' need, (low-level) iterators on the sequence of
+  disjuncts are still available by accessing the protected member
+  <CODE>Powerset::sequence</CODE>.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+class Parma_Polyhedra_Library::Powerset<D>::omega_iterator {
+protected:
+  //! The type of the underlying mutable iterator.
+  typedef typename Powerset::Sequence::iterator Base;
+
+  //! A shortcut for naming the const_iterator traits.
+  typedef typename
+  std::iterator_traits<typename Powerset::Sequence::const_iterator> Traits;
+
+  //! A (mutable) iterator on the sequence of elements.
+  Base base;
+
+  //! Constructs from the lower-level iterator.
+  omega_iterator(const Base& b);
+
+  friend class Powerset;
+  friend Powerset<D>::omega_const_iterator
+  ::omega_const_iterator(const omega_iterator& y);
+
+public:
+  // Same traits of the const_iterator, therefore
+  // forbidding the direct modification of sequence elements.
+  typedef typename Traits::iterator_category iterator_category;
+  typedef typename Traits::value_type value_type;
+  typedef typename Traits::difference_type difference_type;
+  typedef typename Traits::pointer pointer;
+  typedef typename Traits::reference reference;
+
+  //! Default constructor.
+  omega_iterator();
+
+  //! Copy constructor.
+  omega_iterator(const omega_iterator& y);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect access operator.
+  pointer operator->() const;
+
+  //! Prefix increment operator.
+  omega_iterator& operator++();
+
+  //! Postfix increment operator.
+  omega_iterator operator++(int);
+
+  //! Prefix decrement operator.
+  omega_iterator& operator--();
+
+  //! Postfix decrement operator.
+  omega_iterator operator--(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const omega_iterator& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const omega_iterator& y) const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Mixed comparison operator: returns <CODE>true</CODE> if and only
+  if (the const version of) \p x is identical to \p y.
+
+  \relates Powerset::omega_const_iterator
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+bool
+operator==(const typename Powerset<D>::omega_iterator& x,
+	   const typename Powerset<D>::omega_const_iterator& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Mixed comparison operator: returns <CODE>true</CODE> if and only
+  if (the const version of) \p x is different from \p y.
+
+  \relates Powerset::omega_const_iterator
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+bool
+operator!=(const typename Powerset<D>::omega_iterator& x,
+	   const typename Powerset<D>::omega_const_iterator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+void swap(Parma_Polyhedra_Library::Powerset<D>& x,
+	  Parma_Polyhedra_Library::Powerset<D>& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Powerset.inlines.hh line 1
+/* Powerset class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+inline
+Powerset<D>::omega_iterator::omega_iterator()
+  : base() {
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_iterator::omega_iterator(const omega_iterator& y)
+  : base(y.base) {
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_iterator::omega_iterator(const Base& b)
+  : base(b) {
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator::reference
+Powerset<D>::omega_iterator::operator*() const {
+  return *base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator::pointer
+Powerset<D>::omega_iterator::operator->() const {
+  return &*base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator&
+Powerset<D>::omega_iterator::operator++() {
+  ++base;
+  return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator
+Powerset<D>::omega_iterator::operator++(int) {
+  omega_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator&
+Powerset<D>::omega_iterator::operator--() {
+  --base;
+  return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator
+Powerset<D>::omega_iterator::operator--(int) {
+  omega_iterator tmp = *this;
+  operator--();
+  return tmp;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::omega_iterator::operator==(const omega_iterator& y) const {
+  return base == y.base;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::omega_iterator::operator!=(const omega_iterator& y) const {
+  return !operator==(y);
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_const_iterator::omega_const_iterator()
+  : base() {
+}
+
+template <typename D>
+inline
+Powerset<D>
+::omega_const_iterator::omega_const_iterator(const omega_const_iterator& y)
+  : base(y.base) {
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_const_iterator::omega_const_iterator(const Base& b)
+  : base(b) {
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator::reference
+Powerset<D>::omega_const_iterator::operator*() const {
+  return *base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator::pointer
+Powerset<D>::omega_const_iterator::operator->() const {
+  return &*base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator&
+Powerset<D>::omega_const_iterator::operator++() {
+  ++base;
+  return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator
+Powerset<D>::omega_const_iterator::operator++(int) {
+  omega_const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator&
+Powerset<D>::omega_const_iterator::operator--() {
+  --base;
+  return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator
+Powerset<D>::omega_const_iterator::operator--(int) {
+  omega_const_iterator tmp = *this;
+  operator--();
+  return tmp;
+}
+
+template <typename D>
+inline bool
+Powerset<D>
+::omega_const_iterator::operator==(const omega_const_iterator& y) const {
+  return base == y.base;
+}
+
+template <typename D>
+inline bool
+Powerset<D>
+::omega_const_iterator::operator!=(const omega_const_iterator& y) const {
+  return !operator==(y);
+}
+
+template <typename D>
+inline
+Powerset<D>
+::omega_const_iterator::omega_const_iterator(const omega_iterator& y)
+  : base(y.base) {
+}
+
+/*! \relates Powerset::omega_const_iterator */
+template <typename D>
+inline bool
+operator==(const typename Powerset<D>::omega_iterator& x,
+	   const typename Powerset<D>::omega_const_iterator& y) {
+  return Powerset<D>::omega_const_iterator(x).operator==(y);
+}
+
+/*! \relates Powerset::omega_const_iterator */
+template <typename D>
+inline bool
+operator!=(const typename Powerset<D>::omega_iterator& x,
+	   const typename Powerset<D>::omega_const_iterator& y) {
+  return !(x == y);
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::begin() {
+  return sequence.begin();
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::end() {
+  return sequence.end();
+}
+
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::begin() const {
+  return sequence.begin();
+}
+
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::end() const {
+  return sequence.end();
+}
+
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rbegin() {
+  return reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rend() {
+  return reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rbegin() const {
+  return const_reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rend() const {
+  return const_reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::size_type
+Powerset<D>::size() const {
+  return sequence.size();
+}
+
+template <typename D>
+inline bool
+Powerset<D>::empty() const {
+  return sequence.empty();
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::drop_disjunct(iterator position) {
+  return sequence.erase(position.base);
+}
+
+template <typename D>
+inline void
+Powerset<D>::drop_disjuncts(iterator first, iterator last) {
+  sequence.erase(first.base, last.base);
+}
+
+template <typename D>
+inline void
+Powerset<D>::clear() {
+  sequence.clear();
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset(const Powerset& y)
+  : sequence(y.sequence), reduced(y.reduced) {
+}
+
+template <typename D>
+inline Powerset<D>&
+Powerset<D>::operator=(const Powerset& y) {
+  sequence = y.sequence;
+  reduced = y.reduced;
+  return *this;
+}
+
+template <typename D>
+inline void
+Powerset<D>::swap(Powerset& y) {
+  std::swap(sequence, y.sequence);
+  std::swap(reduced, y.reduced);
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset()
+  : sequence(), reduced(true) {
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset(const D& d)
+  : sequence(), reduced(true) {
+  if (!d.is_bottom())
+    sequence.push_back(d);
+  assert(OK());
+}
+
+template <typename D>
+inline
+Powerset<D>::~Powerset() {
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_non_bottom_disjunct(const D& d) {
+  assert(!d.is_bottom());
+  add_non_bottom_disjunct(d, begin(), end());
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_disjunct(const D& d) {
+  if (!d.is_bottom())
+    add_non_bottom_disjunct(d);
+}
+
+/*! \relates Powerset */
+template <typename D>
+inline
+bool operator!=(const Powerset<D>& x, const Powerset<D>& y) {
+  return !(x == y);
+}
+
+template <typename D>
+inline bool
+Powerset<D>::is_top() const {
+  // Must perform omega-reduction for correctness.
+  omega_reduce();
+  const_iterator xi = begin();
+  const_iterator x_end = end();
+  return xi != x_end && xi->is_top() && ++xi == x_end;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::is_bottom() const {
+  // Must perform omega-reduction for correctness.
+  omega_reduce();
+  return empty();
+}
+
+template <typename D>
+inline void
+Powerset<D>::collapse() {
+  if (!empty())
+    collapse(sequence.begin());
+}
+
+template <typename D>
+inline void
+Powerset<D>::meet_assign(const Powerset& y) {
+  pairwise_apply_assign(y, std::mem_fun_ref(&D::meet_assign));
+}
+
+template <typename D>
+inline void
+Powerset<D>::upper_bound_assign(const Powerset& y) {
+  least_upper_bound_assign(y);
+}
+
+template <typename D>
+inline memory_size_type
+Powerset<D>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+inline void
+swap(Parma_Polyhedra_Library::Powerset<D>& x,
+     Parma_Polyhedra_Library::Powerset<D>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Powerset.templates.hh line 1
+/* Powerset class implementation: non-inline template functions.
+*/
+
+
+#include <algorithm>
+#include <cassert>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+void
+Powerset<D>::collapse(const Sequence_iterator sink) {
+  assert(sink != sequence.end());
+  D& d = *sink;
+  iterator x_sink = sink;
+  iterator next_x_sink = x_sink;
+  ++next_x_sink;
+  iterator x_end = end();
+  for (const_iterator xi = next_x_sink; xi != x_end; ++xi)
+    d.upper_bound_assign(*xi);
+  // Drop the surplus disjuncts.
+  drop_disjuncts(next_x_sink, x_end);
+
+  // Ensure omega-reduction.
+  for (iterator xi = begin(); xi != x_sink; )
+    if (xi->definitely_entails(d))
+      xi = drop_disjunct(xi);
+    else
+      ++xi;
+
+  assert(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::omega_reduce() const {
+  if (reduced)
+    return;
+
+  Powerset& x = const_cast<Powerset&>(*this);
+  // First remove all bottom elements.
+  for (iterator xi = x.begin(), x_end = x.end(); xi != x_end; )
+    if (xi->is_bottom())
+      xi = x.drop_disjunct(xi);
+    else
+      ++xi;
+  // Then remove non-maximal elements.
+  for (iterator xi = x.begin(); xi != x.end(); ) {
+    const D& xv = *xi;
+    bool dropping_xi = false;
+    for (iterator yi = x.begin(); yi != x.end(); )
+      if (xi == yi)
+	++yi;
+      else {
+	const D& yv = *yi;
+	if (yv.definitely_entails(xv))
+	  yi = x.drop_disjunct(yi);
+	else if (xv.definitely_entails(yv)) {
+	  dropping_xi = true;
+	  break;
+	}
+	else
+	  ++yi;
+      }
+    if (dropping_xi)
+      xi = x.drop_disjunct(xi);
+    else
+      ++xi;
+    if (abandon_expensive_computations && xi != x.end()) {
+      // Hurry up!
+      x.collapse(xi.base);
+      break;
+    }
+  }
+  reduced = true;
+  assert(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::collapse(const unsigned max_disjuncts) {
+  assert(max_disjuncts > 0);
+  // Omega-reduce before counting the number of disjuncts.
+  omega_reduce();
+  size_type n = size();
+  if (n > max_disjuncts) {
+    // Let `i' point to the last disjunct that will survive.
+    iterator i = begin();
+    std::advance(i, max_disjuncts-1);
+    // This disjunct will be assigned an upper-bound of itself and of
+    // all the disjuncts that follow.
+    collapse(i.base);
+  }
+  assert(OK());
+  assert(is_omega_reduced());
+}
+
+template <typename D>
+bool
+Powerset<D>::check_omega_reduced() const {
+  for (const_iterator x_begin = begin(), x_end = end(),
+	 xi = x_begin; xi != x_end; ++xi) {
+    const D& xv = *xi;
+    if (xv.is_bottom())
+      return false;
+    for (const_iterator yi = x_begin; yi != x_end; ++yi) {
+      if (xi == yi)
+	continue;
+      const D& yv = *yi;
+      if (xv.definitely_entails(yv) || yv.definitely_entails(xv))
+	return false;
+    }
+  }
+  return true;
+}
+
+template <typename D>
+bool
+Powerset<D>::is_omega_reduced() const {
+  if (!reduced && check_omega_reduced())
+    reduced = true;
+  return reduced;
+}
+
+template <typename D>
+typename Powerset<D>::iterator
+Powerset<D>::add_non_bottom_disjunct(const D& d,
+				      iterator first,
+				      iterator last) {
+  for (iterator xi = first; xi != last; ) {
+    const D& xv = *xi;
+    if (d.definitely_entails(xv))
+      return first;
+    else if (xv.definitely_entails(d)) {
+      if (xi == first)
+	++first;
+      xi = drop_disjunct(xi);
+    }
+    else
+      ++xi;
+  }
+  sequence.push_back(d);
+  return first;
+}
+
+template <typename D>
+bool
+Powerset<D>::definitely_entails(const Powerset& y) const {
+  const Powerset<D>& x = *this;
+  bool found = true;
+  for (const_iterator xi = x.begin(),
+	 x_end = x.end(); found && xi != x_end; ++xi) {
+    found = false;
+    for (const_iterator yi = y.begin(),
+	   y_end = y.end(); !found && yi != y_end; ++yi)
+      found = (*xi).definitely_entails(*yi);
+  }
+  return found;
+}
+
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y) {
+  x.omega_reduce();
+  y.omega_reduce();
+  if (x.size() != y.size())
+    return false;
+  // Take a copy of `y' and work with it.
+  Powerset<D> yy = y;
+  for (typename Powerset<D>::const_iterator xi = x.begin(),
+	 x_end = x.end(); xi != x_end; ++xi) {
+    typename Powerset<D>::iterator yyi = yy.begin();
+    typename Powerset<D>::iterator yy_end = yy.end();
+    yyi = std::find(yyi, yy_end, *xi);
+    if (yyi == yy_end)
+      return false;
+    else
+      yy.drop_disjunct(yyi);
+  }
+  return true;
+}
+
+template <typename D>
+template <typename Binary_Operator_Assign>
+void
+Powerset<D>::pairwise_apply_assign(const Powerset& y,
+				    Binary_Operator_Assign op_assign) {
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  omega_reduce();
+  y.omega_reduce();
+  Sequence new_sequence;
+  for (const_iterator xi = begin(), x_end = end(),
+	 y_begin = y.begin(), y_end = y.end(); xi != x_end; ++xi)
+    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+      D zi = *xi;
+      op_assign(zi, *yi);
+      if (!zi.is_bottom())
+	new_sequence.push_back(zi);
+    }
+  // Put the new sequence in place.
+  std::swap(sequence, new_sequence);
+  reduced = false;
+}
+
+template <typename D>
+void
+Powerset<D>::least_upper_bound_assign(const Powerset& y) {
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  omega_reduce();
+  y.omega_reduce();
+  iterator old_begin = begin();
+  iterator old_end = end();
+  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+    old_begin = add_non_bottom_disjunct(*i, old_begin, old_end);
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x) {
+  if (x.is_bottom())
+    s << "false";
+  else if (x.is_top())
+    s << "true";
+  else
+    for (typename Powerset<D>::const_iterator i = x.begin(),
+	   x_end = x.end(); i != x_end; ) {
+      s << "{ " << *i++ << " }";
+      if (i != x_end)
+	s << ", ";
+    }
+  return s;
+}
+
+} // namespace IO_Operators
+
+template <typename D>
+memory_size_type
+Powerset<D>::external_memory_in_bytes() const {
+  memory_size_type bytes = 0;
+  for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+    bytes += xi->total_memory_in_bytes();
+    // We assume there is at least a forward and a backward link, and
+    // that the pointers implementing them are at least the size of
+    // pointers to `D'.
+    bytes += 2*sizeof(D*);
+  }
+  return bytes;
+}
+
+template <typename D>
+bool
+Powerset<D>::OK(const bool disallow_bottom) const {
+  for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+    if (!xi->OK())
+      return false;
+    if (disallow_bottom && xi->is_bottom()) {
+#ifndef NDEBUG
+      std::cerr << "Bottom element in powerset!"
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+  if (reduced && !check_omega_reduced()) {
+#ifndef NDEBUG
+    std::cerr << "Powerset claims to be reduced, but it is not!"
+	      << std::endl;
+#endif
+    return false;
+  }
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Powerset.defs.hh line 619
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+class Polyhedra_Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.defs.hh line 1
+/* Polyhedra_Powerset class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.defs.hh line 39
+#include <iosfwd>
+#include <list>
+#include <map>
+
+//! The powerset construction instantiated on PPL polyhedra.
+/*! \ingroup PPL_CXX_interface */
+template <typename PH>
+class Parma_Polyhedra_Library::Polyhedra_Powerset
+  : public Parma_Polyhedra_Library::Powerset
+<Parma_Polyhedra_Library::Determinate<PH> > {
+public:
+  typedef PH element_type;
+
+private:
+  typedef Determinate<PH> CS;
+  typedef Powerset<CS> Base;
+
+public:
+  //! Returns the maximum space dimension a Polyhedra_Powerset<PH> can handle.
+  static dimension_type max_space_dimension();
+
+  //! \name Constructors
+  //@{
+
+  //! Builds a universe (top) or empty (bottom) Polyhedra_Powerset.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the powerset;
+
+    \param kind
+    Specifies whether the universe or the empty powerset has to be built.
+  */
+  explicit
+  Polyhedra_Powerset(dimension_type num_dimensions = 0,
+		     Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy-constructor.
+  Polyhedra_Powerset(const Polyhedra_Powerset& y);
+
+  /*! \brief
+    If \p ph is nonempty, builds a powerset containing only \p ph.
+    Builds the empty powerset otherwise.
+  */
+  explicit Polyhedra_Powerset(const PH& ph);
+
+  /*! \brief
+    Copy-constructor allowing a source powerset with elements of a
+    different polyhedron kind.
+  */
+  template <typename QH>
+  explicit Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+
+  /*! \brief
+    Creates a Polyhedra_Powerset with a single polyhedron
+    with the same information contents as \p cs.
+  */
+  explicit Polyhedra_Powerset(const Constraint_System& cs);
+
+  //! Creates a Polyhedra_Powerset with a single polyhedron
+  //! with the same information contents as \p cgs.
+  explicit Polyhedra_Powerset(const Congruence_System& cgs);
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Powerset of Polyhedra
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this geometrically
+    covers \p y, i.e., if any point (in some element) of \p y is also
+    a point (of some element) of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    This may be <EM>really</EM> expensive!
+  */
+  bool geometrically_covers(const Polyhedra_Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is geometrically
+    equal to \p y, i.e., if (the elements of) \p *this and \p y
+    contain the same set of points.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    This may be <EM>really</EM> expensive!
+  */
+  bool geometrically_equals(const Polyhedra_Powerset& y) const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} // Member Functions that Do Not Modify the Powerset
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Powerset of Polyhedra
+  //@{
+
+  //! Adds to \p *this the disjunct \p ph.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p ph are dimension-incompatible.
+  */
+  void add_disjunct(const PH& ph);
+
+  //! Intersects \p *this with constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  //! Intersects \p *this with the constraint \p c, minimizing the result.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool add_constraint_and_minimize(const Constraint& c);
+
+  //! Intersects \p *this with the constraints in \p cs.
+  /*!
+    \param cs
+    The constraints to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Intersects \p *this with the constraints in \p cs,
+    minimizing the result.
+
+    \return
+    <CODE>false</CODE> if and only if the result is empty.
+
+    \param cs
+    The constraints to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool add_constraints_and_minimize(const Constraint_System& cs);
+
+  /*! \brief
+    Assign to \p *this the result of (recursively) merging together
+    the pairs of polyhedra whose poly-hull is the same as their
+    set-theoretical union.
+
+    On exit, for all the pairs \f$\cP\f$, \f$\cQ\f$ of different polyhedra
+    in \p *this, we have \f$\cP \uplus \cQ \neq \cP \union \cQ\f$.
+  */
+  void pairwise_reduce();
+
+  /*! \brief
+    Assigns to \p *this the result of applying the
+    \ref pps_bgp99_extrapolation "BGP99 extrapolation operator"
+    to \p *this and \p y, using the widening function \p wf
+    and the cardinality threshold \p max_disjuncts.
+
+    \param y
+    A finite powerset of polyhedra.
+    It <EM>must</EM> definitely entail \p *this;
+
+    \param wf
+    The widening function to be used on polyhedra objects. It is obtained
+    from the corresponding widening method by using the helper function
+    Parma_Polyhedra_Library::widen_fun_ref. Legal values are, e.g.,
+    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>;
+
+    \param max_disjuncts
+    The maximum number of disjuncts occurring in the powerset \p *this
+    <EM>before</EM> starting the computation. If this number is exceeded,
+    some of the disjuncts in \p *this are collapsed (i.e., joined together).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+
+    For a description of the extrapolation operator,
+    see \ref BGP99 "[BGP99]" and \ref BHZ03b "[BHZ03b]".
+  */
+  template <typename Widening>
+  void BGP99_extrapolation_assign(const Polyhedra_Powerset& y,
+				  Widening wf,
+				  unsigned max_disjuncts);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref pps_certificate_widening "BHZ03-widening"
+    between \p *this and \p y, using the widening function \p wf
+    certified by the convergence certificate \p Cert.
+
+    \param y
+    The finite powerset of polyhedra computed in the previous iteration step.
+    It <EM>must</EM> definitely entail \p *this;
+
+    \param wf
+    The widening function to be used on polyhedra objects.
+    It is obtained from the corresponding widening method by using
+    the helper function widen_fun_ref. Legal values are, e.g.,
+    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    In order to obtain a proper widening operator, the template parameter
+    \p Cert should be a finite convergence certificate for the base-level
+    widening function \p wf; otherwise, an extrapolation operator is
+    obtained.
+    For a description of the methods that should be provided
+    by \p Cert, see BHRZ03_Certificate or H79_Certificate.
+  */
+  template <typename Cert, typename Widening>
+  void BHZ03_widening_assign(const Polyhedra_Powerset& y, Widening wf);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  Polyhedra_Powerset& operator=(const Polyhedra_Powerset& y);
+
+  /*! \brief
+    Assignment operator allowing a source powerset with elements of a
+    different polyhedron kind
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  template <typename QH>
+  Polyhedra_Powerset& operator=(const Polyhedra_Powerset<QH>& y);
+
+  //! Swaps \p *this with \p y.
+  void swap(Polyhedra_Powerset& y);
+
+  /*! \brief
+    Adds \p m new dimensions to the vector space containing \p *this
+    and embeds each polyhedron in \p *this in the new space.
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the vector space containing \p *this
+    without embedding the polyhedra in \p *this in the new space.
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    The result is obtained by intersecting each polyhedron in \p *this
+    with each polyhedron in \p y and collecting all these intersections.
+  */
+  void intersection_assign(const Polyhedra_Powerset& y);
+
+  //! Assigns to \p *this the difference of \p *this and \p y.
+  /*!
+    The result is obtained by computing the
+    \ref Convex_Polyhedral_Difference "poly-difference" of each polyhedron
+    in \p *this with each polyhedron in \p y and collecting all these
+    differences.
+  */
+  void poly_difference_assign(const Polyhedra_Powerset& y);
+
+  //! Assigns to \p *this the concatenation of \p *this and \p y.
+  /*!
+    The result is obtained by computing the pairwise
+    \ref Concatenating_Polyhedra "concatenation" of each polyhedron
+    in \p *this with each polyhedron in \p y.
+  */
+  void concatenate_assign(const Polyhedra_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    The result is obtained by computing the pairwise
+    \ref Time_Elapse_Operator "time elapse" of each polyhedron
+    in \p *this with each polyhedron in \p y.
+  */
+  void time_elapse_assign(const Polyhedra_Powerset& y);
+
+  //! Removes all the specified space dimensions.
+  /*!
+    \param to_be_removed
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p to_be_removed.
+  */
+  void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+  /*! \brief
+    Removes the higher space dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a partial function.
+
+    See also Polyhedron::map_space_dimensions.
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+public:
+  typedef typename Base::size_type size_type;
+  typedef typename Base::value_type value_type;
+  typedef typename Base::iterator iterator;
+  typedef typename Base::const_iterator const_iterator;
+  typedef typename Base::reverse_iterator reverse_iterator;
+  typedef typename Base::const_reverse_iterator const_reverse_iterator;
+
+  PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by \ref
+    ascii_dump) and sets \p *this accordingly.  Returns <CODE>true</CODE>
+    if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  bool ascii_load(std::istream& s);
+
+private:
+  typedef typename Base::Sequence Sequence;
+  typedef typename Base::Sequence_iterator Sequence_iterator;
+  typedef typename Base::Sequence_const_iterator Sequence_const_iterator;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  /*! \brief
+    Assigns to \p *this the result of applying the BGP99 heuristics
+    to \p *this and \p y, using the widening function \p wf.
+  */
+  template <typename Widening>
+  void BGP99_heuristics_assign(const Polyhedra_Powerset& y, Widening wf);
+
+  //! Records in \p cert_ms the certificates for this set of polyhedra.
+  template <typename Cert>
+  void collect_certificates(std::map<Cert, size_type,
+		                     typename Cert::Compare>& cert_ms) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the current set of polyhedra
+    is stabilizing with respect to the multiset of certificates \p y_cert_ms.
+  */
+  template <typename Cert>
+  bool is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+                                                   typename Cert::Compare>&
+				    y_cert_ms) const;
+
+  // FIXME: here it should be enough to befriend the templatic constructor
+  //   template <typename QH>
+  //   Polyhedra_Powerset(const Polyhedra_Powerset<QH>&)
+  // but, apparently, this cannot be done.
+  // As a workaround, we could use
+  //   friend class Polyhedra_Powerset<NNC_Polyhedron>
+  // but GCC 3.3.3 has a bug that causes its rejection.
+  // So, temporarily, we make all Polyhedra_Powerset's friends of each other.
+  template <typename QH> friend class Polyhedra_Powerset;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Partitions \p q with respect to \p p.
+/*! \relates Polyhedra_Powerset
+  Let \p p and \p q be two polyhedra.
+  The function returns an object <CODE>r</CODE> of type
+  <CODE>std::pair\<PH, Polyhedra_Powerset\<NNC_Polyhedron\> \></CODE>
+  such that
+  - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+  - <CODE>r.second</CODE> has the property that all its elements are
+    pairwise disjoint and disjoint from \p p;
+  - the union of <CODE>r.first</CODE> with all the elements of
+    <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE> is the
+    representation of a partition of \p q).
+
+  \if Include_Implementation_Details
+
+  See
+  <A HREF="http://www.cs.unipr.it/ppl/Documentation/bibliography#Srivastava93">
+  this paper</A> for more information about the implementation.
+  \endif
+*/
+template <typename PH>
+std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+linear_partition(const PH& p, const PH& q);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the NNC polyhedra in \p ps contains the NNC polyhedron \p ph.
+
+  \relates Polyhedra_Powerset
+*/
+bool
+check_containment(const NNC_Polyhedron& ph,
+		  const Polyhedra_Powerset<NNC_Polyhedron>& ps);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the objects in \p ps contains \p ph.
+
+  \relates Polyhedra_Powerset
+  \note
+  It is assumed that the template parameter PH can be converted
+  without precision loss into an NNC_Polyhedron; otherwise,
+  an incorrect result might be obtained.
+*/
+template <typename PH>
+bool
+check_containment(const PH& ph, const Polyhedra_Powerset<PH>& ps);
+
+// CHECK ME: according to the Intel compiler, the declaration of the
+// following specialization (of the class template parameter) should come
+// before the declaration of the corresponding full specialization
+// (where the member template parameter is specialized too).
+template <>
+template <typename QH>
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+
+// CHECK ME: according to the Intel compiler, the declaration of the
+// following specialization (of the class template parameter) should come
+// before the declaration of the corresponding full specialization
+// (where the member template parameter is specialized too).
+template <>
+template <typename QH>
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+
+// Non-inline full specializations should be declared here
+// so as to inhibit multiple instantiations of the generic template.
+template <>
+template <>
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y);
+
+template <>
+template <>
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y);
+
+template <>
+void
+Polyhedra_Powerset<NNC_Polyhedron>
+::poly_difference_assign(const Polyhedra_Powerset& y);
+
+template <>
+bool
+Polyhedra_Powerset<NNC_Polyhedron>
+::geometrically_covers(const Polyhedra_Powerset& y) const;
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
+template <typename PH>
+void swap(Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& x,
+	  Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.inlines.hh line 1
+/* Polyhedra_Powerset class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.inlines.hh line 34
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+inline dimension_type
+Polyhedra_Powerset<PH>::space_dimension() const {
+  return space_dim;
+}
+
+template <typename PH>
+inline dimension_type
+Polyhedra_Powerset<PH>::max_space_dimension() {
+  return PH::max_space_dimension();
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(dimension_type num_dimensions,
+					   Degenerate_Element kind)
+  : Base(), space_dim(num_dimensions) {
+  Polyhedra_Powerset& x = *this;
+  if (kind == UNIVERSE)
+    x.sequence.push_back(Determinate<PH>(PH(num_dimensions, kind)));
+  assert(x.OK());
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Polyhedra_Powerset& y)
+  : Base(y), space_dim(y.space_dim) {
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const PH& ph)
+  : Base(ph), space_dim(ph.space_dimension()) {
+}
+
+// FIXME: This full specialization is declared inline and placed here
+// just as a workaround to a bug in GCC 3.3.3. In principle, it should
+// not be declared inline and moved in Polyhedra_Powerset.cc.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+template <>
+template <>
+inline
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
+  : Base(), space_dim(y.space_dimension()) {
+  Polyhedra_Powerset& x = *this;
+  for (Polyhedra_Powerset<C_Polyhedron>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<NNC_Polyhedron>(
+                           NNC_Polyhedron(i->element()))
+			 );
+  x.reduced = y.reduced;
+  assert(x.OK());
+}
+
+// FIXME: This full specialization is declared inline and placed here
+// just as a workaround to a bug in GCC 3.3.3. In principle, it should
+// not be declared inline and moved in Polyhedra_Powerset.cc.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+template <>
+template <>
+inline
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y)
+  : Base(), space_dim(y.space_dimension()) {
+  Polyhedra_Powerset& x = *this;
+  for (Polyhedra_Powerset<NNC_Polyhedron>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<C_Polyhedron>(
+                           C_Polyhedron(i->element()))
+			 );
+  // Note: this might be non-reduced even when `y' is known to be
+  // omega-reduced, because the constructor of C_Polyhedron, by
+  // enforcing topological closure, may have made different elements
+  // comparable.
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Constraint_System& cs)
+  // FIXME: calling Base(Determinate<PH>(cs)) will automatically handle
+  // the flag `reduced', but it will also force a non-emptiness test
+  // on the constraint system `cs'.
+  : Base(), space_dim(cs.space_dimension()) {
+  Polyhedra_Powerset& x = *this;
+  x.sequence.push_back(Determinate<PH>(cs));
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Congruence_System& cgs)
+  // FIXME: calling Base(Determinate<PH>(cgs)) will automatically handle
+  // the flag `reduced', but it will also force a non-emptiness test
+  // on the congruence system `cgs'.
+  : Base(), space_dim(cgs.space_dimension()) {
+  Polyhedra_Powerset& x = *this;
+  x.sequence.push_back(Determinate<PH>(cgs));
+  x.reduced = false;
+  assert(OK());
+}
+
+template <typename PH>
+inline Polyhedra_Powerset<PH>&
+Polyhedra_Powerset<PH>::operator=(const Polyhedra_Powerset& y) {
+  Polyhedra_Powerset& x = *this;
+  x.Base::operator=(y);
+  x.space_dim = y.space_dim;
+  return x;
+}
+
+template <typename PH>
+inline void
+Polyhedra_Powerset<PH>::swap(Polyhedra_Powerset& y) {
+  Polyhedra_Powerset& x = *this;
+  x.Base::swap(y);
+  std::swap(x.space_dim, y.space_dim);
+}
+
+template <typename PH>
+template <typename QH>
+inline Polyhedra_Powerset<PH>&
+Polyhedra_Powerset<PH>::operator=(const Polyhedra_Powerset<QH>& y) {
+  Polyhedra_Powerset& x = *this;
+  Polyhedra_Powerset<PH> pps(y);
+  x.swap(pps);
+  return x;
+}
+
+template <typename PH>
+inline void
+Polyhedra_Powerset<PH>::intersection_assign(const Polyhedra_Powerset& y) {
+  Polyhedra_Powerset& x = *this;
+  x.pairwise_apply_assign
+    (y, CS::lift_op_assign(std::mem_fun_ref(&PH::intersection_assign)));
+}
+
+template <typename PH>
+inline void
+Polyhedra_Powerset<PH>::time_elapse_assign(const Polyhedra_Powerset& y) {
+  Polyhedra_Powerset& x = *this;
+  x.pairwise_apply_assign
+    (y, CS::lift_op_assign(std::mem_fun_ref(&PH::time_elapse_assign)));
+}
+
+template <typename PH>
+inline bool
+Polyhedra_Powerset<PH>
+::geometrically_covers(const Polyhedra_Powerset& y) const {
+  const Polyhedra_Powerset<NNC_Polyhedron> xx(*this);
+  const Polyhedra_Powerset<NNC_Polyhedron> yy(y);
+  return xx.geometrically_covers(yy);
+}
+
+template <typename PH>
+inline bool
+Polyhedra_Powerset<PH>
+::geometrically_equals(const Polyhedra_Powerset& y) const {
+  const Polyhedra_Powerset<NNC_Polyhedron> xx(*this);
+  const Polyhedra_Powerset<NNC_Polyhedron> yy(y);
+  return xx.geometrically_covers(yy) && yy.geometrically_covers(xx);
+}
+
+template <>
+inline bool
+Polyhedra_Powerset<NNC_Polyhedron>
+::geometrically_equals(const Polyhedra_Powerset& y) const {
+  const Polyhedra_Powerset& x = *this;
+  return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <typename PH>
+inline memory_size_type
+Polyhedra_Powerset<PH>::external_memory_in_bytes() const {
+  return Base::external_memory_in_bytes();
+}
+
+template <typename PH>
+inline memory_size_type
+Polyhedra_Powerset<PH>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <>
+inline void
+Polyhedra_Powerset<C_Polyhedron>
+::poly_difference_assign(const Polyhedra_Powerset& y) {
+  Polyhedra_Powerset<NNC_Polyhedron> nnc_this(*this);
+  Polyhedra_Powerset<NNC_Polyhedron> nnc_y(y);
+  nnc_this.poly_difference_assign(nnc_y);
+  *this = nnc_this;
+}
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH>
+inline bool
+check_containment(const PH& ph, const Polyhedra_Powerset<PH>& ps) {
+  const NNC_Polyhedron pph = NNC_Polyhedron(ph.constraints());
+  const Polyhedra_Powerset<NNC_Polyhedron> pps(ps);
+  return check_containment(pph, pps);
+}
+
+/*! \relates Polyhedra_Powerset */
+template <>
+inline bool
+check_containment(const C_Polyhedron& ph,
+		  const Polyhedra_Powerset<C_Polyhedron>& ps) {
+  return check_containment(NNC_Polyhedron(ph),
+			   Polyhedra_Powerset<NNC_Polyhedron>(ps));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
+template <typename PH>
+inline void
+swap(Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& x,
+     Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& y) {
+  x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.templates.hh line 1
+/* Polyhedra_Powerset class implementation: non-inline template functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.templates.hh line 31
+#include <algorithm>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_disjunct(const PH& ph) {
+  Polyhedra_Powerset& x = *this;
+  if (x.space_dimension() != ph.space_dimension()) {
+    std::ostringstream s;
+    s << "PPL::Polyhedra_Powerset<PH>::add_disjunct(ph):\n"
+      << "this->space_dimension() == " << x.space_dimension() << ", "
+      << "ph.space_dimension() == " << ph.space_dimension() << ".";
+    throw std::invalid_argument(s.str());
+  }
+  x.sequence.push_back(Determinate<PH>(ph));
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <>
+template <typename QH>
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y)
+  : Base(), space_dim(y.space_dimension()) {
+  Polyhedra_Powerset& x = *this;
+  for (typename Polyhedra_Powerset<QH>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<NNC_Polyhedron>(
+                           NNC_Polyhedron(i->element().constraints()))
+			 );
+  x.reduced = y.reduced;
+  assert(x.OK());
+}
+
+template <>
+template <typename QH>
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y)
+  : Base(), space_dim(y.space_dimension()) {
+  Polyhedra_Powerset& x = *this;
+  for (typename Polyhedra_Powerset<QH>::const_iterator i = y.begin(),
+	 y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<C_Polyhedron>(
+                           C_Polyhedron(i->element().constraints()))
+			 );
+  // Note: this might be non-reduced even when `y' is known to be
+  // omega-reduced, because the constructor of C_Polyhedron, by
+  // enforcing topological closure, may have made different elements
+  // comparable.
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::concatenate_assign(const Polyhedra_Powerset& y) {
+  Polyhedra_Powerset& x = *this;
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  x.omega_reduce();
+  y.omega_reduce();
+  Polyhedra_Powerset<PH> new_x(x.space_dim + y.space_dim, EMPTY);
+  for (const_iterator xi = x.begin(), x_end = x.end(),
+	 y_begin = y.begin(), y_end = y.end(); xi != x_end; ) {
+    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+      CS zi = *xi;
+      zi.concatenate_assign(*yi);
+      assert(!zi.is_bottom());
+      new_x.sequence.push_back(zi);
+    }
+    ++xi;
+    if (abandon_expensive_computations && xi != x_end && y_begin != y_end) {
+      // Hurry up!
+      PH xph = xi->element();
+      for (++xi; xi != x_end; ++xi)
+	xph.upper_bound_assign(xi->element());
+      const_iterator yi = y_begin;
+      PH yph = yi->element();
+      for (++yi; yi != y_end; ++yi)
+	yph.upper_bound_assign(yi->element());
+      xph.concatenate_assign(yph);
+      x.swap(new_x);
+      x.add_disjunct(xph);
+      assert(x.OK());
+      return;
+    }
+  }
+  x.swap(new_x);
+  assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_constraint(const Constraint& c) {
+  Polyhedra_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_constraint(c);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::add_constraint_and_minimize(const Constraint& c) {
+  Polyhedra_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; )
+    if (!si->element().add_constraint_and_minimize(c))
+      si = x.sequence.erase(si);
+    else {
+      x.reduced = false;
+      ++si;
+    }
+  assert(x.OK());
+  return !x.empty();
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_constraints(const Constraint_System& cs) {
+  Polyhedra_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_constraints(cs);
+  x.reduced = false;
+  assert(x.OK());
+}
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::
+add_constraints_and_minimize(const Constraint_System& cs) {
+  Polyhedra_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; )
+    if (!si->element().add_constraints_and_minimize(cs))
+      si = x.sequence.erase(si);
+    else {
+      x.reduced = false;
+      ++si;
+    }
+  assert(x.OK());
+  return !x.empty();
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_space_dimensions_and_embed(dimension_type m) {
+  Polyhedra_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_space_dimensions_and_embed(m);
+  x.space_dim += m;
+  assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_space_dimensions_and_project(dimension_type m) {
+  Polyhedra_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+	 s_end = x.sequence.end(); si != s_end; ++si)
+    si->element().add_space_dimensions_and_project(m);
+  x.space_dim += m;
+  assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::
+remove_space_dimensions(const Variables_Set& to_be_removed) {
+  Polyhedra_Powerset& x = *this;
+  Variables_Set::size_type num_removed = to_be_removed.size();
+  if (num_removed > 0) {
+    for (Sequence_iterator si = x.sequence.begin(),
+	   s_end = x.sequence.end(); si != s_end; ++si) {
+      si->element().remove_space_dimensions(to_be_removed);
+      x.reduced = false;
+    }
+    x.space_dim -= num_removed;
+    assert(x.OK());
+  }
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::remove_higher_space_dimensions(dimension_type
+						       new_dimension) {
+  Polyhedra_Powerset& x = *this;
+  if (new_dimension < x.space_dim) {
+    for (Sequence_iterator si = x.sequence.begin(),
+	   s_end = x.sequence.end(); si != s_end; ++si) {
+      si->element().remove_higher_space_dimensions(new_dimension);
+      x.reduced = false;
+    }
+    x.space_dim = new_dimension;
+    assert(x.OK());
+  }
+}
+
+template <typename PH>
+template <typename Partial_Function>
+void
+Polyhedra_Powerset<PH>::map_space_dimensions(const Partial_Function& pfunc) {
+  Polyhedra_Powerset& x = *this;
+  if (x.is_bottom()) {
+    dimension_type n = 0;
+    for (dimension_type i = x.space_dim; i-- > 0; ) {
+      dimension_type new_i;
+      if (pfunc.maps(i, new_i))
+	++n;
+    }
+    x.space_dim = n;
+  }
+  else {
+    Sequence_iterator s_begin = x.sequence.begin();
+    for (Sequence_iterator si = s_begin,
+	   s_end = x.sequence.end(); si != s_end; ++si)
+      si->element().map_space_dimensions(pfunc);
+    x.space_dim = s_begin->element().space_dimension();
+    x.reduced = false;
+  }
+  assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::pairwise_reduce() {
+  Polyhedra_Powerset& x = *this;
+  // It is wise to omega-reduce before pairwise-reducing.
+  x.omega_reduce();
+
+  size_type n = x.size();
+  size_type deleted;
+  do {
+    Polyhedra_Powerset new_x(x.space_dim, EMPTY);
+    std::deque<bool> marked(n, false);
+    deleted = 0;
+    Sequence_iterator s_begin = x.sequence.begin();
+    Sequence_iterator s_end = x.sequence.end();
+    unsigned si_index = 0;
+    for (Sequence_iterator si = s_begin; si != s_end; ++si, ++si_index) {
+      if (marked[si_index])
+	continue;
+      PH& pi = si->element();
+      Sequence_const_iterator sj = si;
+      unsigned sj_index = si_index;
+      for (++sj, ++sj_index; sj != s_end; ++sj, ++sj_index) {
+	if (marked[sj_index])
+	  continue;
+	const PH& pj = sj->element();
+	if (pi.upper_bound_assign_if_exact(pj)) {
+	  marked[si_index] = marked[sj_index] = true;
+	  new_x.add_non_bottom_disjunct(pi);
+	  ++deleted;
+	  goto next;
+	}
+      }
+    next:
+      ;
+    }
+    iterator nx_begin = new_x.begin();
+    iterator nx_end = new_x.end();
+    unsigned xi_index = 0;
+    for (const_iterator xi = x.begin(),
+	   x_end = x.end(); xi != x_end; ++xi, ++xi_index)
+      if (!marked[xi_index])
+	nx_begin = new_x.add_non_bottom_disjunct(*xi, nx_begin, nx_end);
+    std::swap(x.sequence, new_x.sequence);
+    n -= deleted;
+  } while (deleted > 0);
+  assert(x.OK());
+}
+
+template <typename PH>
+template <typename Widening>
+void
+Polyhedra_Powerset<PH>::
+BGP99_heuristics_assign(const Polyhedra_Powerset& y, Widening wf) {
+  // `x' is the current iteration value.
+  Polyhedra_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Polyhedra_Powerset<PH> x_copy = x;
+    const Polyhedra_Powerset<PH> y_copy = y;
+    assert(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  size_type n = x.size();
+  Polyhedra_Powerset new_x(x.space_dim, EMPTY);
+  std::deque<bool> marked(n, false);
+  const_iterator x_begin = x.begin();
+  const_iterator x_end = x.end();
+  unsigned i_index = 0;
+  for (const_iterator i = x_begin,
+	 y_begin = y.begin(), y_end = y.end(); i != x_end; ++i, ++i_index)
+    for (const_iterator j = y_begin; j != y_end; ++j) {
+      const PH& pi = i->element();
+      const PH& pj = j->element();
+      if (pi.contains(pj)) {
+	PH pi_copy = pi;
+	wf(pi_copy, pj);
+	new_x.add_non_bottom_disjunct(pi_copy);
+	marked[i_index] = true;
+      }
+    }
+  iterator nx_begin = new_x.begin();
+  iterator nx_end = new_x.end();
+  i_index = 0;
+  for (const_iterator i = x_begin; i != x_end; ++i, ++i_index)
+    if (!marked[i_index])
+      nx_begin = new_x.add_non_bottom_disjunct(*i, nx_begin, nx_end);
+  std::swap(x.sequence, new_x.sequence);
+  assert(x.OK());
+  assert(x.is_omega_reduced());
+}
+
+template <typename PH>
+template <typename Widening>
+void
+Polyhedra_Powerset<PH>::
+BGP99_extrapolation_assign(const Polyhedra_Powerset& y,
+			   Widening wf,
+			   unsigned max_disjuncts) {
+  // `x' is the current iteration value.
+  Polyhedra_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Polyhedra_Powerset<PH> x_copy = x;
+    const Polyhedra_Powerset<PH> y_copy = y;
+    assert(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  x.pairwise_reduce();
+  if (max_disjuncts != 0)
+    x.collapse(max_disjuncts);
+  x.BGP99_heuristics_assign(y, wf);
+}
+
+template <typename PH>
+template <typename Cert>
+void
+Polyhedra_Powerset<PH>::
+collect_certificates(std::map<Cert, size_type,
+		              typename Cert::Compare>& cert_ms) const {
+  const Polyhedra_Powerset& x = *this;
+  assert(x.is_omega_reduced());
+  assert(cert_ms.size() == 0);
+  for (const_iterator i = x.begin(), end = x.end(); i != end; i++) {
+    Cert ph_cert(i->element());
+    ++cert_ms[ph_cert];
+  }
+}
+
+template <typename PH>
+template <typename Cert>
+bool
+Polyhedra_Powerset<PH>::
+is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+			                    typename Cert::Compare>& y_cert_ms
+			     ) const {
+  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+  Cert_Multiset x_cert_ms;
+  collect_certificates(x_cert_ms);
+  typename Cert_Multiset::const_iterator
+    xi = x_cert_ms.begin(),
+    xend = x_cert_ms.end(),
+    yi = y_cert_ms.begin(),
+    yend = y_cert_ms.end();
+  while (xi != xend && yi != yend) {
+    const Cert& xi_cert = xi->first;
+    const Cert& yi_cert = yi->first;
+    switch (xi_cert.compare(yi_cert)) {
+    case 0:
+      // xi_cert == yi_cert: check the number of multiset occurrences.
+      {
+	const size_type& xi_count = xi->second;
+	const size_type& yi_count = yi->second;
+	if (xi_count == yi_count) {
+	  // Same number of occurrences: compare the next pair.
+	  ++xi;
+	  ++yi;
+	}
+	else
+	  // Different number of occurrences: can decide ordering.
+	  return xi_count < yi_count;
+	break;
+      }
+    case 1:
+      // xi_cert > yi_cert: it is not stabilizing.
+      return false;
+
+    case -1:
+      // xi_cert < yi_cert: it is stabilizing.
+      return true;
+    }
+  }
+  // Here xi == xend or yi == yend.
+  // Stabilization is achieved if `y_cert_ms' still has other elements.
+  return yi != yend;
+}
+
+template <typename PH>
+template <typename Cert, typename Widening>
+void
+Polyhedra_Powerset<PH>::BHZ03_widening_assign(const Polyhedra_Powerset& y,
+					      Widening wf) {
+  // `x' is the current iteration value.
+  Polyhedra_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Polyhedra_Powerset<PH> x_copy = x;
+    const Polyhedra_Powerset<PH> y_copy = y;
+    assert(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  // First widening technique: do nothing.
+
+  // If `y' is the empty collection, do nothing.
+  assert(x.size() > 0);
+  if (y.size() == 0)
+    return;
+
+  // Compute the poly-hull of `x'.
+  PH x_hull(x.space_dim, EMPTY);
+  for (const_iterator i = x.begin(), x_end = x.end(); i != x_end; ++i)
+    x_hull.upper_bound_assign(i->element());
+
+  // Compute the poly-hull of `y'.
+  PH y_hull(y.space_dim, EMPTY);
+  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+    y_hull.upper_bound_assign(i->element());
+  // Compute the certificate for `y_hull'.
+  const Cert y_hull_cert(y_hull);
+
+  // If the hull is stabilizing, do nothing.
+  int hull_stabilization = y_hull_cert.compare(x_hull);
+  if (hull_stabilization == 1)
+    return;
+
+  // Multiset ordering is only useful when `y' is not a singleton.
+  const bool y_is_not_a_singleton = y.size() > 1;
+
+  // The multiset certificate for `y':
+  // we want to be lazy about its computation.
+  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+  Cert_Multiset y_cert_ms;
+  bool y_cert_ms_computed = false;
+
+  if (hull_stabilization == 0 && y_is_not_a_singleton) {
+    // Collect the multiset certificate for `y'.
+    y.collect_certificates(y_cert_ms);
+    y_cert_ms_computed = true;
+    // If multiset ordering is stabilizing, do nothing.
+    if (x.is_cert_multiset_stabilizing(y_cert_ms))
+      return;
+  }
+
+  // Second widening technique: try the BGP99 powerset heuristics.
+  Polyhedra_Powerset<PH> bgp99_heuristics = x;
+  bgp99_heuristics.BGP99_heuristics_assign(y, wf);
+
+  // Compute the poly-hull of `bgp99_heuristics'.
+  PH bgp99_heuristics_hull(x.space_dim, EMPTY);
+  for (const_iterator i = bgp99_heuristics.begin(),
+	 bh_end = bgp99_heuristics.end(); i != bh_end; ++i)
+    bgp99_heuristics_hull.upper_bound_assign(i->element());
+
+  // Check for stabilization and, if successful,
+  // commit to the result of the extrapolation.
+  hull_stabilization = y_hull_cert.compare(bgp99_heuristics_hull);
+  if (hull_stabilization == 1) {
+    // The poly-hull is stabilizing.
+    std::swap(x, bgp99_heuristics);
+    return;
+  }
+  else if (hull_stabilization == 0 && y_is_not_a_singleton) {
+    // If not already done, compute multiset certificate for `y'.
+    if (!y_cert_ms_computed) {
+      y.collect_certificates(y_cert_ms);
+      y_cert_ms_computed = true;
+    }
+    if (bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+      std::swap(x, bgp99_heuristics);
+      return;
+    }
+    // Third widening technique: pairwise-reduction on `bgp99_heuristics'.
+    // Note that pairwise-reduction does not affect the computation
+    // of the poly-hulls, so that we only have to check the multiset
+    // certificate relation.
+    Polyhedra_Powerset<PH> reduced_bgp99_heuristics(bgp99_heuristics);
+    reduced_bgp99_heuristics.pairwise_reduce();
+    if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+      std::swap(x, reduced_bgp99_heuristics);
+      return;
+    }
+  }
+
+  // Fourth widening technique: this is applicable only when
+  // `y_hull' is a proper subset of `bgp99_heuristics_hull'.
+  if (bgp99_heuristics_hull.strictly_contains(y_hull)) {
+    // Compute (y_hull \widen bgp99_heuristics_hull).
+    PH ph = bgp99_heuristics_hull;
+    wf(ph, y_hull);
+    // Compute the difference between `ph' and `bgp99_heuristics_hull'.
+    ph.difference_assign(bgp99_heuristics_hull);
+    x.add_disjunct(ph);
+    return;
+  }
+
+  // Fall back to the computation of the poly-hull.
+  Polyhedra_Powerset<PH> x_hull_singleton(x.space_dim, EMPTY);
+  x_hull_singleton.add_disjunct(x_hull);
+  std::swap(x, x_hull_singleton);
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::ascii_dump(std::ostream& s) const {
+  const Polyhedra_Powerset& x = *this;
+  s << "size " << x.size()
+    << "\nspace_dim " << x.space_dim
+    << "\n";
+  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi)
+    xi->element().ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(PH, Polyhedra_Powerset<PH>);
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::ascii_load(std::istream& s) {
+  Polyhedra_Powerset& x = *this;
+  std::string str;
+
+  if (!(s >> str) || str != "size")
+    return false;
+
+  size_type sz;
+
+  if (!(s >> sz))
+    return false;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> x.space_dim))
+    return false;
+
+  Polyhedra_Powerset new_x(x.space_dim, EMPTY);
+  while (sz-- > 0) {
+    PH ph;
+    if (!ph.ascii_load(s))
+      return false;
+    new_x.add_disjunct(ph);
+  }
+  x.swap(new_x);
+
+  // Check for well-formedness.
+  assert(x.OK());
+  return true;
+}
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::OK() const {
+  const Polyhedra_Powerset& x = *this;
+  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) {
+    const PH& pi = xi->element();
+    if (pi.space_dimension() != x.space_dim) {
+#ifndef NDEBUG
+      std::cerr << "Space dimension mismatch: is " << pi.space_dimension()
+		<< " in an element of the sequence,\nshould be "
+		<< x.space_dim << "."
+		<< std::endl;
+#endif
+      return false;
+    }
+  }
+  return x.Base::OK();
+}
+
+
+namespace Implementation {
+
+namespace Polyhedra_Powersets {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions polyhedron \p qq according to constraint \p c.
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset
+  On exit, the intersection of \p qq and constraint \p c is stored
+  in \p qq, whereas the intersection of \p qq with the negation of \p c
+  is added as a new disjunct of the powerset \p r.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+void
+linear_partition_aux(const Constraint& c,
+		     PH& qq,
+		     Polyhedra_Powerset<NNC_Polyhedron>& r) {
+  Linear_Expression le(c);
+  Constraint neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0);
+  NNC_Polyhedron qqq(qq);
+  if (qqq.add_constraint_and_minimize(neg_c))
+    r.add_disjunct(qqq);
+  qq.add_constraint(c);
+}
+
+} // namespace Polyhedra_Powersets
+
+} // namespace Implementation
+
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH>
+std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+linear_partition(const PH& p, const PH& q) {
+  using Implementation::Polyhedra_Powersets::linear_partition_aux;
+
+  Polyhedra_Powerset<NNC_Polyhedron> r(p.space_dimension(), EMPTY);
+  PH qq = q;
+  const Constraint_System& pcs = p.constraints();
+  for (Constraint_System::const_iterator i = pcs.begin(),
+	 pcs_end = pcs.end(); i != pcs_end; ++i) {
+    const Constraint c = *i;
+    if (c.is_equality()) {
+      Linear_Expression le(c);
+      linear_partition_aux(le <= 0, qq, r);
+      linear_partition_aux(le >= 0, qq, r);
+    }
+    else
+      linear_partition_aux(c, qq, r);
+  }
+  return std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >(qq, r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.defs.hh line 552
+
+// Automatically generated from PPL source file ../src/max_space_dimension.hh line 1
+/* Definition of functions yielding maximal space dimensions.
+*/
+
+
+// Automatically generated from PPL source file ../src/max_space_dimension.hh line 30
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the maximum space dimension this library can handle.
+inline dimension_type
+max_space_dimension() {
+  using std::min;
+  return
+    min(Polyhedron::max_space_dimension(),
+	min(Polyhedra_Powerset<C_Polyhedron>::max_space_dimension(),
+	    Polyhedra_Powerset<NNC_Polyhedron>::max_space_dimension()
+	    )
+	);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/algorithms.hh line 1
+/* A collection of useful convex polyhedra algorithms: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/algorithms.hh line 28
+#include <utility>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If the poly-hull of \p p and \p q is exact it is assigned
+  to \p p and <CODE>true</CODE> is returned,
+  otherwise <CODE>false</CODE> is returned.
+
+  \relates Polyhedron
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Polyhedron */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q) {
+  PH phull = p;
+  NNC_Polyhedron nnc_p(p);
+  phull.poly_hull_assign(q);
+  std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+    partition = linear_partition(q, phull);
+  const Polyhedra_Powerset<NNC_Polyhedron>& s = partition.second;
+  typedef Polyhedra_Powerset<NNC_Polyhedron>::const_iterator iter;
+  for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i)
+    // The polyhedral hull is exact if and only if all the elements
+    // of the partition of the polyhedral hull of `p' and `q' with
+    // respect to `q' are included in `p'
+    if (!nnc_p.contains(i->element()))
+      return false;
+  p = phull;
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_SAVE_NDEBUG
+# define NDEBUG 1
+# undef PPL_SAVE_NDEBUG
+#else
+# undef NDEBUG
+#endif
+#include <cassert>
+
+#undef PACKAGE
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#undef VERSION
+
+#endif
diff --git a/src/ppl_header.hh b/src/ppl_header.hh
new file mode 100644
index 0000000..b24a9b1
--- /dev/null
+++ b/src/ppl_header.hh
@@ -0,0 +1,51 @@
+/* This is the header file of the Parma Polyhedra Library.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_hh
+#define PPL_ppl_hh 1
+
+#ifdef NDEBUG
+# define PPL_SAVE_NDEBUG 1
+# undef NDEBUG
+#endif
+
+#include "config.h"
+#include "version.hh"
+#include "ppl_include_files.hh"
+
+#ifdef PPL_SAVE_NDEBUG
+# define NDEBUG 1
+# undef PPL_SAVE_NDEBUG
+#else
+# undef NDEBUG
+#endif
+#include <cassert>
+
+#undef PACKAGE
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#undef VERSION
+
+#endif
diff --git a/src/simplify.cc b/src/simplify.cc
new file mode 100644
index 0000000..6d8b45e
--- /dev/null
+++ b/src/simplify.cc
@@ -0,0 +1,307 @@
+/* Polyhedron class implementation: simplify().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Linear_Row.defs.hh"
+#include "Linear_System.defs.hh"
+#include "Saturation_Row.defs.hh"
+#include "Saturation_Matrix.defs.hh"
+#include "Polyhedron.defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+/*!
+  \return
+  The rank of \p sys.
+
+  \param sys
+  The system to simplify: it will be modified;
+
+  \param sat
+  The saturation matrix corresponding to \p sys.
+
+  \p sys may be modified by swapping some of its rows and by possibly
+  removing some of them, if they turn out to be redundant.
+
+  If \p sys is a system of constraints, then the rows of \p sat are
+  indexed by constraints and its columns are indexed by generators;
+  otherwise, if \p sys is a system of generators, then the rows of
+  \p sat are indexed by generators and its columns by constraints.
+
+  Given a system of constraints or a system of generators, this function
+  simplifies it using Gauss' elimination method (to remove redundant
+  equalities/lines), deleting redundant inequalities/rays/points and
+  making back-substitution.
+  The explanation that follows assumes that \p sys is a system of
+  constraints. For the case when \p sys is a system of generators,
+  a similar explanation can be obtain by applying duality.
+
+  The explanation relies on the notion of <EM>redundancy</EM>.
+  (See the Introduction.)
+
+  First we make some observations that can help the reader
+  in understanding the function:
+
+  Proposition: An inequality that is saturated by all the generators
+  can be transformed to an equality.
+
+  In fact, by combining any number of generators that saturate the
+  constraints, we obtain a generator that saturates the constraints too:
+  \f[
+    \langle \vect{c}, \vect{r}_1 \rangle = 0 \land
+    \langle \vect{c}, \vect{r}_2 \rangle = 0
+    \Rightarrow
+    \langle \vect{c}, (\lambda_1 \vect{r}_1 + \lambda_2 \vect{r}_2) \rangle =
+    \lambda_1 \langle \vect{c}, \vect{r}_1 \rangle
+    + \lambda_2 \langle \vect{c}, \vect{r}_2 \rangle
+    = 0,
+  \f]
+  where \f$\lambda_1, \lambda_2\f$ can be any real number.
+*/
+int
+PPL::Polyhedron::simplify(Linear_System& sys, Saturation_Matrix& sat) {
+  // This method is only applied to a well-formed system `sys'.
+  assert(sys.OK(true));
+
+  dimension_type num_rows = sys.num_rows();
+  const dimension_type num_columns = sys.num_columns();
+  const dimension_type num_cols_sat = sat.num_columns();
+
+  // Looking for the first inequality in `sys'.
+  dimension_type num_lines_or_equalities = 0;
+  while (num_lines_or_equalities < num_rows
+	 && sys[num_lines_or_equalities].is_line_or_equality())
+    ++num_lines_or_equalities;
+
+  // `num_saturators[i]' will contain the number of generators
+  // that saturate the constraint `sys[i]'.
+  static std::vector<dimension_type> num_saturators;
+  num_saturators.reserve(num_rows);
+
+  // Computing the number of saturators for each inequality,
+  // possibly identifying and swapping those that happen to be
+  // equalities (see Proposition above).
+  for (dimension_type i = num_lines_or_equalities; i < num_rows; ++i) {
+    if (sat[i].empty()) {
+      // The constraint `sys[i]' is saturated by all the generators.
+      // Thus, either it is already an equality or it can be transformed
+      // to an equality (see Proposition above).
+      sys[i].set_is_line_or_equality();
+      // Note: simple normalization already holds.
+      sys[i].sign_normalize();
+      // We also move it just after all the other equalities,
+      // so that system `sys' keeps its partial sortedness.
+      if (i != num_lines_or_equalities) {
+	std::swap(sys[i], sys[num_lines_or_equalities]);
+	std::swap(sat[i], sat[num_lines_or_equalities]);
+	std::swap(num_saturators[i], num_saturators[num_lines_or_equalities]);
+      }
+      ++num_lines_or_equalities;
+      // `sys' is no longer sorted.
+      sys.set_sorted(false);
+    }
+    else
+      // There exists a generator which does not saturate `sys[i]',
+      // so that `sys[i]' is indeed an inequality.
+      // We store the number of its saturators.
+      num_saturators[i] = num_cols_sat - sat[i].count_ones();
+  }
+
+  // At this point, all the equalities of `sys' (included those
+  // inequalities that we just transformed to equalities) have
+  // indexes between 0 and `num_lines_or_equalities' - 1,
+  // which is the property needed by method gauss().
+  // We can simplify the system of equalities, obtaining the rank
+  // of `sys' as result.
+  const dimension_type rank = sys.gauss(num_lines_or_equalities);
+
+  // Now the irredundant equalities of `sys' have indexes from 0
+  // to `rank' - 1, whereas the equalities having indexes from `rank'
+  // to `num_lines_or_equalities' - 1 are all redundant.
+  // (The inequalities in `sys' have been left untouched.)
+  // The rows containing equalities are not sorted.
+
+  if (rank < num_lines_or_equalities) {
+    // We identified some redundant equalities.
+    // Moving them at the bottom of `sys':
+    // - index `redundant' runs through the redundant equalities
+    // - index `erasing' identifies the first row that should
+    //   be erased after this loop.
+    // Note that we exit the loop either because we have moved all
+    // redundant equalities or because we have moved all the
+    // inequalities.
+    for (dimension_type redundant = rank,
+	   erasing = num_rows;
+	 redundant < num_lines_or_equalities
+	   && erasing > num_lines_or_equalities;
+	 ) {
+      --erasing;
+      std::swap(sys[redundant], sys[erasing]);
+      std::swap(sat[redundant], sat[erasing]);
+      std::swap(num_saturators[redundant], num_saturators[erasing]);
+      sys.set_sorted(false);
+      ++redundant;
+    }
+    // Adjusting the value of `num_rows' to the number of meaningful
+    // rows of `sys': `num_lines_or_equalities' - `rank' is the number of
+    // redundant equalities moved to the bottom of `sys', which are
+    // no longer meaningful.
+    num_rows -= num_lines_or_equalities - rank;
+    // Adjusting the value of `num_lines_or_equalities'.
+    num_lines_or_equalities = rank;
+  }
+
+  // Now we use the definition of redundancy (given in the Introduction)
+  // to remove redundant inequalities.
+
+  // First we check the saturation rule, which provides a necessary
+  // condition for an inequality to be irredundant (i.e., it provides
+  // a sufficient condition for identifying redundant inequalities).
+  // Let
+  //   num_saturators[i] = num_sat_lines[i] + num_sat_rays_or_points[i];
+  //   dim_lin_space = num_irred_lines;
+  //   dim_ray_space
+  //     = dim_vector_space - num_irred_equalities - dim_lin_space
+  //     = num_columns - 1 - num_lines_or_equalities - dim_lin_space;
+  //   min_sat_rays_or_points = dim_ray_space.
+  //
+  // An inequality saturated by less than `dim_ray_space' _rays/points_
+  // is redundant. Thus we have the implication
+  //
+  //   (num_saturators[i] - num_sat_lines[i] < dim_ray_space)
+  //      ==>
+  //        redundant(sys[i]).
+  //
+  // Moreover, since every line saturates all inequalities, we also have
+  //     dim_lin_space = num_sat_lines[i]
+  // so that we can rewrite the condition above as follows:
+  //
+  //   (num_saturators[i] < num_columns - num_lines_or_equalities - 1)
+  //      ==>
+  //        redundant(sys[i]).
+  //
+  const dimension_type min_saturators
+    = num_columns - num_lines_or_equalities - 1;
+  for (dimension_type i = num_lines_or_equalities; i < num_rows; ) {
+    if (num_saturators[i] < min_saturators) {
+      // The inequality `sys[i]' is redundant.
+      --num_rows;
+      std::swap(sys[i], sys[num_rows]);
+      std::swap(sat[i], sat[num_rows]);
+      std::swap(num_saturators[i], num_saturators[num_rows]);
+      sys.set_sorted(false);
+    }
+    else
+      ++i;
+  }
+
+  // Now we check the independence rule.
+  for (dimension_type i = num_lines_or_equalities; i < num_rows; ) {
+    bool redundant = false;
+    // NOTE: in the inner loop, index `j' runs through _all_ the
+    // inequalities and we do not test if `sat[i]' is strictly
+    // contained into `sat[j]'.  Experimentation has shown that this
+    // is faster than having `j' only run through the indexes greater
+    // than `i' and also doing the test `strict_subset(sat[i],
+    // sat[k])'.
+    for (dimension_type j = num_lines_or_equalities; j < num_rows; ) {
+      if (i == j)
+	// We want to compare different rows of `sys'.
+	++j;
+      else {
+	// Let us recall that each generator lies on a facet of the
+	// polyhedron (see the Introduction).
+	// Given two constraints `c_1' and `c_2', if there are `m'
+	// generators lying on the hyper-plane corresponding to `c_1',
+	// the same `m' generators lie on the hyper-plane
+	// corresponding to `c_2', too, and there is another one lying
+	// on the latter but not on the former, then `c_2' is more
+	// restrictive than `c_1', i.e., `c_1' is redundant.
+	bool strict_subset;
+	if (subset_or_equal(sat[j], sat[i], strict_subset))
+	  if (strict_subset) {
+	    // All the saturators of the inequality `sys[i]' are
+	    // saturators of the inequality `sys[j]' too,
+	    // and there exists at least one saturator of `sys[j]'
+	    // which is not a saturator of `sys[i]'.
+	    // It follows that inequality `sys[i]' is redundant.
+	    redundant = true;
+	    break;
+	  }
+	  else {
+	    // We have `sat[j] == sat[i]'.  Hence inequalities
+	    // `sys[i]' and `sys[j]' are saturated by the same set of
+	    // generators. Then we can remove either one of the two
+	    // inequalities: we remove `sys[j]'.
+	    --num_rows;
+	    std::swap(sys[j], sys[num_rows]);
+	    std::swap(sat[j], sat[num_rows]);
+	    std::swap(num_saturators[j], num_saturators[num_rows]);
+	    sys.set_sorted(false);
+	  }
+	else
+	  // If we reach this point then we know that `sat[i]' does
+	  // not contain (and is different from) `sat[j]', so that
+	  // `sys[i]' is not made redundant by inequality `sys[j]'.
+	  ++j;
+      }
+    }
+    if (redundant) {
+      // The inequality `sys[i]' is redundant.
+      --num_rows;
+      std::swap(sys[i], sys[num_rows]);
+      std::swap(sat[i], sat[num_rows]);
+      std::swap(num_saturators[i], num_saturators[num_rows]);
+      sys.set_sorted(false);
+    }
+    else
+      // The inequality `sys[i]' is not redundant.
+      ++i;
+  }
+
+  // Here we physically remove the redundant inequalities previously
+  // moved to the bottom of `sys' and the corresponding `sat' rows.
+  sys.erase_to_end(num_rows);
+  sys.unset_pending_rows();
+  sat.rows_erase_to_end(num_rows);
+  // At this point the first `num_lines_or_equalities' rows of 'sys'
+  // represent the irredundant equalities, while the remaining rows
+  // (i.e., those having indexes from `num_lines_or_equalities' to
+  // `num_rows' - 1) represent the irredundant inequalities.
+#ifndef NDEBUG
+  // Check if the flag is set (that of the equalities is already set).
+  for (dimension_type i = num_lines_or_equalities; i < num_rows; ++i)
+    assert(sys[i].is_ray_or_point_or_inequality());
+#endif
+
+  // Finally, since now the sub-system (of `sys') of the irredundant
+  // equalities is in triangular form, we back substitute each
+  // variables with the expression obtained considering the equalities
+  // starting from the last one.
+  sys.back_substitute(num_lines_or_equalities);
+
+  // The returned value is the number of irredundant equalities i.e.,
+  // the rank of the sub-system of `sys' containing only equalities.
+  // (See the Introduction for definition of lineality space dimension.)
+  return num_lines_or_equalities;
+}
diff --git a/src/swapping_sort.icc b/src/swapping_sort.icc
new file mode 100644
index 0000000..a5de46b
--- /dev/null
+++ b/src/swapping_sort.icc
@@ -0,0 +1,141 @@
+/* Sorting objects for which copies cost more than swaps.  -*- C++ -*-
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_swapping_sort_icc
+#define PPL_swapping_sort_icc 1
+
+#include <iterator>
+#include <algorithm>
+
+namespace {
+/*
+  This sorting algorithm avoids (almost all) copies of objects
+  by performing more iter_swap's: it is meant to be used when
+  object copying costs much more than object swapping.
+
+  Moreover, the algorithm always uses std:iter_swap() instead of
+  std::swap() so as to behave as expected when instantiated on
+  Linear_System::With_Saturation_Matrix_iterator. Namely, using a sorting
+  routine that either copies objects or directly swaps them
+  (i.e., without calling std::iter_swap) would not be correct
+  when using Linear_System::With_Saturation_Matrix_iterator.
+*/
+
+template <typename Value_Type, typename Compare>
+inline const Value_Type&
+median(const Value_Type& x, const Value_Type& y, const Value_Type& z,
+       Compare comp) {
+  return comp(x, y)
+    ? (comp(y, z) ? y : (comp(x, z) ? z : x))
+    : (comp(x, z) ? x : (comp(y, z) ? z : y));
+}
+
+template <typename Iter, typename Value_Type, typename Compare>
+Iter
+swapping_partition(Iter first, Iter last, const Value_Type& pivot,
+		   Compare comp) {
+  for ( ; ; ) {
+    while (comp(*first, pivot))
+      ++first;
+    --last;
+    while (comp(pivot, *last))
+      --last;
+    if (first < last) {
+      std::iter_swap(first, last);
+      ++first;
+    }
+    else
+      return first;
+  }
+}
+
+template <typename Iter, typename Compare>
+void
+swapping_insertion_sort(Iter first, Iter last, Compare comp) {
+  if (first == last)
+    return;
+  for (Iter i = first + 1; i != last; ++i) {
+    Iter current = i;
+    if (comp(*current, *first)) {
+      Iter next = current + 1;
+      while (current != first)
+	std::iter_swap(--current, --next);
+    }
+    else {
+      Iter previous = current - 1;
+      while (comp(*current, *previous))
+	std::iter_swap(current--, previous--);
+    }
+  }
+}
+
+template <typename Iter, typename Compare>
+void
+swapping_quicksort_loop(Iter first, Iter last, Compare comp) {
+  const typename std::iterator_traits<Iter>::difference_type threshold = 16;
+  while (last - first > threshold) {
+    // The construction of this temporary object is
+    // required for the correctness of the algorithm.
+    Iter middle = first + (last - first) / 2;
+    typename std::iterator_traits<Iter>::value_type
+      pivot = median(*first, *middle, *(last - 1), comp);
+    Iter part_point = swapping_partition(first, last, pivot, comp);
+    swapping_quicksort_loop(part_point, last, comp);
+    last = part_point;
+  }
+}
+
+template <typename Iter, typename Compare>
+inline void
+swapping_sort(Iter first, Iter last, Compare comp) {
+  if (first == last)
+    return;
+  swapping_quicksort_loop(first, last, comp);
+  swapping_insertion_sort(first, last, comp);
+}
+
+template <typename Iter>
+Iter
+swapping_unique(Iter first, Iter last) {
+  if (first == last)
+    return last;
+  Iter current = first;
+  Iter next = current;
+  ++next;
+  while(next != last && *current != *next) {
+    current = next;
+    ++next;
+  }
+  if (next == last)
+    return last;
+  ++next;
+  while (next != last) {
+    if (*current != *next)
+      std::iter_swap(++current, next);
+    ++next;
+  }
+  return ++current;
+}
+
+} // namespace
+
+#endif // !defined(PPL_swapping_sort_icc)
diff --git a/src/version.cc b/src/version.cc
new file mode 100644
index 0000000..72cbeab
--- /dev/null
+++ b/src/version.cc
@@ -0,0 +1,83 @@
+/* Definition of functions providing version and licensing information.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "version.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+const char version_string[] = PACKAGE_VERSION;
+
+const char banner_string[] =
+"This is "PACKAGE_NAME" (PPL) version "PACKAGE_VERSION".\n"
+"Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>.\n"
+"The PPL is free software; see the source for copying conditions.\n"
+"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n"
+"PARTICULAR PURPOSE.\n"
+#if defined(__GNUC__)
+"Compiled by the GNU C++ compiler version "__VERSION__".\n"
+#elif defined(__INTEL_COMPILER)
+#define str(s) # s
+#define xstr(s) str(s)
+"Compiled by the Intel C++ compiler version "xstr(__INTEL_COMPILER)".\n"
+#elif defined(__COMO__)
+#define str(s) # s
+#define xstr(s) str(s)
+"Compiled by the Comeau C++ compiler version "xstr(__COMO_VERSION__)".\n"
+#endif
+"Report bugs to "PACKAGE_BUGREPORT".\n"
+"For the most up-to-date information see the Parma Polyhedra Library\n"
+"site: http://www.cs.unipr.it/ppl/ .\n";
+
+} // namespace
+
+unsigned
+PPL::version_major() {
+  return PPL_VERSION_MAJOR;
+}
+
+unsigned
+PPL::version_minor() {
+  return PPL_VERSION_MINOR;
+}
+
+unsigned
+PPL::version_revision() {
+  return PPL_VERSION_REVISION;
+}
+
+unsigned
+PPL::version_beta() {
+  return PPL_VERSION_BETA;
+}
+
+const char*
+PPL::version() {
+  return version_string;
+}
+
+const char*
+PPL::banner() {
+  return banner_string;
+}
diff --git a/src/version.hh.in b/src/version.hh.in
new file mode 100644
index 0000000..01d76d8
--- /dev/null
+++ b/src/version.hh.in
@@ -0,0 +1,92 @@
+/* Declaration of macros and functions providing version  -*- C++ -*-
+   and licensing information.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_version_hh
+#define PPL_version_hh 1
+
+//! The major number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MAJOR @PPL_VERSION_MAJOR@
+
+//! The minor number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MINOR @PPL_VERSION_MINOR@
+
+//! The revision number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_REVISION @PPL_VERSION_REVISION@
+
+/*! \brief
+  The beta number of the PPL version.  This is zero for official
+  releases and nonzero for development snapshots.
+  \ingroup PPL_CXX_interface
+*/
+#define PPL_VERSION_BETA @PPL_VERSION_BETA@
+
+//! A string containing the PPL version.
+/*! \ingroup PPL_CXX_interface
+  Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+  to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively.  The
+  format of PPL_VERSION is <CODE>M "." m</CODE> if both
+  PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+  (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+  PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+  <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+  PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+  neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "@VERSION@"
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the major number of the PPL version.
+unsigned
+version_major();
+
+//! Returns the minor number of the PPL version.
+unsigned
+version_minor();
+
+//! Returns the revision number of the PPL version.
+unsigned
+version_revision();
+
+//! Returns the beta number of the PPL version.
+unsigned
+version_beta();
+
+//! Returns a character string containing the PPL version.
+const char* version();
+
+//! Returns a character string containing the PPL banner.
+/*!
+  The banner provides information about the PPL version, the licensing,
+  the lack of any warranty whatsoever, the C++ compiler used to build
+  the library, where to report bugs and where to look for further
+  information.
+*/
+const char* banner();
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_version_hh)
diff --git a/tests/BBox.cc b/tests/BBox.cc
new file mode 100644
index 0000000..a113b88
--- /dev/null
+++ b/tests/BBox.cc
@@ -0,0 +1,188 @@
+/* Implementation of class BBox (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "globals.defs.hh"
+#include "Coefficient.defs.hh"
+#include "BBox.hh"
+
+#include "Variable.defs.hh"
+#include <iostream>
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+void
+BInterval::raise_lower_bound(bool closed,
+			     Coefficient_traits::const_reference c,
+			     Coefficient_traits::const_reference d) {
+  assert(d > 0 && ld >= 0);
+  if ((closed && lc*d <= c*ld) || (!closed && lc*d < c*ld))  {
+    lc = c;
+    ld = d;
+    lclosed = closed;
+  }
+}
+
+void
+BInterval::lower_upper_bound(bool closed,
+			     Coefficient_traits::const_reference c,
+			     Coefficient_traits::const_reference d) {
+  assert(d > 0 && ud >= 0);
+  if ((!closed && uc*d >= c*ud) || (closed && uc*d > c*ud))  {
+    uc = c;
+    ud = d;
+    uclosed = closed;
+  }
+}
+
+void
+BInterval::set_empty() {
+  uc = -1;
+  lc = 1;
+  ud = 1;
+  ld = 1;
+}
+
+static void
+print_rational(std::ostream& s,
+	       Coefficient_traits::const_reference c,
+	       Coefficient_traits::const_reference d) {
+  s << c;
+  if (d != 1)
+    s << "/" << d;
+}
+
+void
+BInterval::print(std::ostream& s) const {
+  if (ld != 0) {
+    s << (lclosed ? "[" : "(");
+    print_rational(s, lc, ld);
+  }
+  else
+    s << "(-inf";
+  s << ", ";
+  if (ud != 0) {
+    print_rational(s, uc, ud);
+    s << (uclosed ? "]" : ")");
+  }
+  else
+    s << "+inf)";
+}
+
+bool
+operator==(const BInterval& x, const BInterval& y) {
+  return x.lclosed == y.lclosed
+    && x.uclosed == y.uclosed
+    && x.lc*y.ld == y.lc*x.ld
+    && x.uc*y.ud == y.uc*x.ud;
+}
+
+bool
+operator<=(const BInterval& x, const BInterval& y) {
+  int l_sign = sgn(x.ld) * sgn(y.ld);
+  int u_sign = sgn(x.ud) * sgn(y.ud);
+  if (y.lclosed || (!x.lclosed && !y.lclosed)) {
+    if (l_sign > 0 && x.lc * y.ld < y.lc * x.ld)
+      return false;
+    if (l_sign < 0 && x.lc * y.ld > y.lc * x.ld)
+      return false;
+    if (l_sign == 0)
+      if (x.ld == 0 && x.lc < 0 && (y.ld != 0 || (y.ld == 0 && y.ld > 0)))
+	return false;
+  }
+  else {
+    assert(!y.lclosed && x.lclosed);
+    if (l_sign > 0 && x.lc * y.ld <= y.lc * x.ld)
+      return false;
+    if (l_sign < 0 && x.lc * y.ld >= y.lc * x.ld)
+      return false;
+    if (l_sign == 0)
+      if (x.ld == 0 && x.lc < 0)
+	return false;
+  }
+  if (y.uclosed || (!x.uclosed && !y.uclosed)) {
+    if (u_sign > 0 && x.uc * y.ud > y.uc * x.ud)
+      return false;
+    if (u_sign < 0 && x.uc * y.ud < y.uc * x.ud)
+      return false;
+    if (u_sign == 0)
+      if (x.ud == 0 && x.uc > 0 && (y.ud != 0 || (y.ud == 0 && y.ud < 0)))
+	return false;
+  }
+  else {
+    assert(!y.uclosed && x.uclosed);
+    if (u_sign > 0 && x.uc * y.ud >= y.uc * x.ud)
+      return false;
+    if (u_sign < 0 && x.uc * y.ud <= y.uc * x.ud)
+      return false;
+    if (u_sign == 0)
+      if (x.ud == 0 && x.uc > 0)
+	return false;
+  }
+  return true;
+}
+
+void
+BBox::print(std::ostream& s, const std::string& intro) const {
+  if (!intro.empty())
+    s << intro << std::endl;
+  dimension_type dim = box.size();
+  for (dimension_type j = 0; j != dim ; j++) {
+    s << Variable(j) << ": ";
+    box[j].print(s);
+    s << std::endl;
+  }
+}
+
+void
+BBox::set_empty() {
+  for (dimension_type k = box.size(); k-- > 0; )
+    box[k].set_empty();
+}
+
+bool
+operator==(const BBox& x, const BBox& y) {
+  dimension_type dimension = x.space_dimension();
+  if (dimension != y.space_dimension())
+    return false;
+
+  for (dimension_type i = dimension; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+
+  return true;
+}
+
+bool
+operator<=(const BBox& x, const BBox& y) {
+  dimension_type dimension = x.space_dimension();
+  if (dimension > y.space_dimension())
+    return false;
+
+  for (dimension_type i = dimension; i-- > 0; )
+    if (!(x[i] <= y[i]))
+      return false;
+
+  return true;
+}
diff --git a/tests/BBox.hh b/tests/BBox.hh
new file mode 100644
index 0000000..ff3327b
--- /dev/null
+++ b/tests/BBox.hh
@@ -0,0 +1,129 @@
+/* Declarations and inline functions for class BBox, a toy bounding box.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BBox_hh
+#define PPL_BBox_hh 1
+
+#include <iosfwd>
+#include <vector>
+
+class BInterval {
+public:
+  BInterval();
+  void raise_lower_bound
+  (bool closed,
+   Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
+   Parma_Polyhedra_Library::Coefficient_traits::const_reference d);
+  void lower_upper_bound
+  (bool closed,
+   Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
+   Parma_Polyhedra_Library::Coefficient_traits::const_reference d);
+  void set_empty();
+  void print(std::ostream& s) const;
+
+private:
+  bool uclosed;
+  Parma_Polyhedra_Library::Coefficient uc;
+  Parma_Polyhedra_Library::Coefficient ud;
+  bool lclosed;
+  Parma_Polyhedra_Library::Coefficient lc;
+  Parma_Polyhedra_Library::Coefficient ld;
+
+  friend bool operator==(const BInterval& x, const BInterval& y);
+  friend bool operator<=(const BInterval& x, const BInterval& y);
+};
+
+inline
+BInterval::BInterval()
+  : uclosed(true), uc(1), ud(0), lclosed(true), lc(-1), ld(0) {
+}
+
+inline bool
+operator!=(const BInterval& x, const BInterval& y) {
+  return !(x == y);
+}
+
+class BBox {
+public:
+  BBox(Parma_Polyhedra_Library::dimension_type dimension);
+  Parma_Polyhedra_Library::dimension_type space_dimension() const;
+  const BInterval& operator[](Parma_Polyhedra_Library::dimension_type k) const;
+  void print(std::ostream& s, const std::string& intro = "") const;
+  void raise_lower_bound
+  (Parma_Polyhedra_Library::dimension_type k, bool closed,
+   Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
+   Parma_Polyhedra_Library::Coefficient_traits::const_reference d);
+  void lower_upper_bound
+  (Parma_Polyhedra_Library::dimension_type k, bool closed,
+   Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
+   Parma_Polyhedra_Library::Coefficient_traits::const_reference d);
+  void set_empty();
+
+private:
+  std::vector<BInterval> box;
+};
+
+inline
+BBox::BBox(Parma_Polyhedra_Library::dimension_type dimension) {
+  box.resize(dimension);
+}
+
+inline Parma_Polyhedra_Library::dimension_type
+BBox::space_dimension() const {
+  return box.size();
+}
+
+inline const BInterval&
+BBox::operator[](Parma_Polyhedra_Library::dimension_type k) const {
+  return box[k];
+}
+
+inline void
+BBox::raise_lower_bound
+(Parma_Polyhedra_Library::dimension_type k, bool closed,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference d) {
+  assert(k < box.size());
+  box[k].raise_lower_bound(closed, c, d);
+}
+
+inline void
+BBox::lower_upper_bound
+(Parma_Polyhedra_Library::dimension_type k, bool closed,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference d) {
+  assert(k < box.size());
+  box[k].lower_upper_bound(closed, c, d);
+}
+
+bool
+operator==(const BBox& x, const BBox& y);
+
+bool
+operator<=(const BBox& x, const BBox& y);
+
+inline bool
+operator!=(const BBox& x, const BBox& y) {
+  return !(x == y);
+}
+
+#endif // !defined(PPL_BBox_hh)
diff --git a/tests/BD_Shape/Makefile.am b/tests/BD_Shape/Makefile.am
new file mode 100644
index 0000000..ff2ab73
--- /dev/null
+++ b/tests/BD_Shape/Makefile.am
@@ -0,0 +1,202 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+#CHECKER =
+CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = CHEKER="$(CHECKER)"
+
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+check_PROGRAMS = \
+	addconstraints1 \
+	addspacedims1 \
+	affinedimension1 \
+	affineimage1 affineimage2 \
+	affinepreimage1 affinepreimage2 \
+	ascii_dump_load1 \
+	bdsdifference1 \
+	bdshull1 \
+	bgp99extrapolation1 \
+	bhmz05widening1 \
+	bhz03widening1 \
+	cc76narrowing1 \
+	cc76extrapolation1 \
+	closure1 \
+	concatenate1 \
+	constraints1 \
+	contains1 \
+	empty1 \
+	equality1 \
+	fromgensys1 \
+	generalizedaffineimage1 generalizedaffineimage2 \
+	generalizedaffinepreimage1 generalizedaffinepreimage2 \
+	geomcovers1 \
+	h79widening1 \
+	intersection1 \
+	limitedbhmz05extrapolation1 \
+	limitedcc76extrapolation1 \
+	limitedh79extrapolation1 \
+	mapspacedims1 \
+	maxspacedim \
+	minconstraints1 \
+	relations1 relations2 relations3 \
+	removespacedims1 \
+	timeelapse1 \
+	universe1 \
+	writebdshape1
+
+# This will be overriden by the `run_tests' script.
+TEST_CPPFLAGS=-DBD_SHAPE_INSTANCE=mpq_class
+
+dist_check_SCRIPTS = run_tests
+
+TESTS = $(dist_check_SCRIPTS)
+
+XFAIL_TESTS =
+
+if SUPPORTED_FLOAT
+FLOAT_INSTANCE=float
+endif
+if SUPPORTED_DOUBLE
+DOUBLE_INSTANCE=double
+endif
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_INSTANCE=long_double
+endif
+
+# NOTE: mpq_class must be the first in the list.
+INSTANCES = \
+mpq_class \
+$(FLOAT_INSTANCE) \
+$(DOUBLE_INSTANCE) \
+$(LONG_DOUBLE_INSTANCE) \
+mpz_class \
+int8_t \
+int16_t \
+int32_t \
+int64_t
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+
+#
+# Sources for the tests
+#
+
+addconstraints1_SOURCES = addconstraints1.cc
+
+addspacedims1_SOURCES = addspacedims1.cc
+
+affinedimension1_SOURCES = affinedimension1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+bdsdifference1_SOURCES = bdsdifference1.cc
+
+bdshull1_SOURCES = bdshull1.cc
+
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+
+closure1_SOURCES = closure1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+empty1_SOURCES = empty1.cc
+
+equality1_SOURCES = equality1.cc
+
+fromgensys1_SOURCES = fromgensys1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+
+geomcovers1_SOURCES = geomcovers1.cc
+
+h79widening1_SOURCES = h79widening1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+maxspacedim_SOURCES = maxspacedim.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+universe1_SOURCES = universe1.cc
+
+writebdshape1_SOURCES = writebdshape1.cc
+
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
diff --git a/tests/BD_Shape/Makefile.in b/tests/BD_Shape/Makefile.in
new file mode 100644
index 0000000..147ca7c
--- /dev/null
+++ b/tests/BD_Shape/Makefile.in
@@ -0,0 +1,1217 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = addconstraints1$(EXEEXT) addspacedims1$(EXEEXT) \
+	affinedimension1$(EXEEXT) affineimage1$(EXEEXT) \
+	affineimage2$(EXEEXT) affinepreimage1$(EXEEXT) \
+	affinepreimage2$(EXEEXT) ascii_dump_load1$(EXEEXT) \
+	bdsdifference1$(EXEEXT) bdshull1$(EXEEXT) \
+	bgp99extrapolation1$(EXEEXT) bhmz05widening1$(EXEEXT) \
+	bhz03widening1$(EXEEXT) cc76narrowing1$(EXEEXT) \
+	cc76extrapolation1$(EXEEXT) closure1$(EXEEXT) \
+	concatenate1$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+	empty1$(EXEEXT) equality1$(EXEEXT) fromgensys1$(EXEEXT) \
+	generalizedaffineimage1$(EXEEXT) \
+	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffinepreimage1$(EXEEXT) \
+	generalizedaffinepreimage2$(EXEEXT) geomcovers1$(EXEEXT) \
+	h79widening1$(EXEEXT) intersection1$(EXEEXT) \
+	limitedbhmz05extrapolation1$(EXEEXT) \
+	limitedcc76extrapolation1$(EXEEXT) \
+	limitedh79extrapolation1$(EXEEXT) mapspacedims1$(EXEEXT) \
+	maxspacedim$(EXEEXT) minconstraints1$(EXEEXT) \
+	relations1$(EXEEXT) relations2$(EXEEXT) relations3$(EXEEXT) \
+	removespacedims1$(EXEEXT) timeelapse1$(EXEEXT) \
+	universe1$(EXEEXT) writebdshape1$(EXEEXT)
+subdir = tests/BD_Shape
+DIST_COMMON = $(dist_check_SCRIPTS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT)
+affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS)
+affinedimension1_LDADD = $(LDADD)
+affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage2_OBJECTS = affineimage2.$(OBJEXT)
+affineimage2_OBJECTS = $(am_affineimage2_OBJECTS)
+affineimage2_LDADD = $(LDADD)
+affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage2_OBJECTS = affinepreimage2.$(OBJEXT)
+affinepreimage2_OBJECTS = $(am_affinepreimage2_OBJECTS)
+affinepreimage2_LDADD = $(LDADD)
+affinepreimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bdsdifference1_OBJECTS = bdsdifference1.$(OBJEXT)
+bdsdifference1_OBJECTS = $(am_bdsdifference1_OBJECTS)
+bdsdifference1_LDADD = $(LDADD)
+bdsdifference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bdshull1_OBJECTS = bdshull1.$(OBJEXT)
+bdshull1_OBJECTS = $(am_bdshull1_OBJECTS)
+bdshull1_LDADD = $(LDADD)
+bdshull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bgp99extrapolation1_OBJECTS = bgp99extrapolation1.$(OBJEXT)
+bgp99extrapolation1_OBJECTS = $(am_bgp99extrapolation1_OBJECTS)
+bgp99extrapolation1_LDADD = $(LDADD)
+bgp99extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhmz05widening1_OBJECTS = bhmz05widening1.$(OBJEXT)
+bhmz05widening1_OBJECTS = $(am_bhmz05widening1_OBJECTS)
+bhmz05widening1_LDADD = $(LDADD)
+bhmz05widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cc76extrapolation1_OBJECTS = cc76extrapolation1.$(OBJEXT)
+cc76extrapolation1_OBJECTS = $(am_cc76extrapolation1_OBJECTS)
+cc76extrapolation1_LDADD = $(LDADD)
+cc76extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cc76narrowing1_OBJECTS = cc76narrowing1.$(OBJEXT)
+cc76narrowing1_OBJECTS = $(am_cc76narrowing1_OBJECTS)
+cc76narrowing1_LDADD = $(LDADD)
+cc76narrowing1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_closure1_OBJECTS = closure1.$(OBJEXT)
+closure1_OBJECTS = $(am_closure1_OBJECTS)
+closure1_LDADD = $(LDADD)
+closure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_equality1_OBJECTS = equality1.$(OBJEXT)
+equality1_OBJECTS = $(am_equality1_OBJECTS)
+equality1_LDADD = $(LDADD)
+equality1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgensys1_OBJECTS = fromgensys1.$(OBJEXT)
+fromgensys1_OBJECTS = $(am_fromgensys1_OBJECTS)
+fromgensys1_LDADD = $(LDADD)
+fromgensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS =  \
+	generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS =  \
+	$(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS =  \
+	generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS =  \
+	$(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS =  \
+	generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS =  \
+	$(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage2_OBJECTS =  \
+	generalizedaffinepreimage2.$(OBJEXT)
+generalizedaffinepreimage2_OBJECTS =  \
+	$(am_generalizedaffinepreimage2_OBJECTS)
+generalizedaffinepreimage2_LDADD = $(LDADD)
+generalizedaffinepreimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_geomcovers1_OBJECTS = geomcovers1.$(OBJEXT)
+geomcovers1_OBJECTS = $(am_geomcovers1_OBJECTS)
+geomcovers1_LDADD = $(LDADD)
+geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_h79widening1_OBJECTS = h79widening1.$(OBJEXT)
+h79widening1_OBJECTS = $(am_h79widening1_OBJECTS)
+h79widening1_LDADD = $(LDADD)
+h79widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedbhmz05extrapolation1_OBJECTS =  \
+	limitedbhmz05extrapolation1.$(OBJEXT)
+limitedbhmz05extrapolation1_OBJECTS =  \
+	$(am_limitedbhmz05extrapolation1_OBJECTS)
+limitedbhmz05extrapolation1_LDADD = $(LDADD)
+limitedbhmz05extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedcc76extrapolation1_OBJECTS =  \
+	limitedcc76extrapolation1.$(OBJEXT)
+limitedcc76extrapolation1_OBJECTS =  \
+	$(am_limitedcc76extrapolation1_OBJECTS)
+limitedcc76extrapolation1_LDADD = $(LDADD)
+limitedcc76extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedh79extrapolation1_OBJECTS =  \
+	limitedh79extrapolation1.$(OBJEXT)
+limitedh79extrapolation1_OBJECTS =  \
+	$(am_limitedh79extrapolation1_OBJECTS)
+limitedh79extrapolation1_LDADD = $(LDADD)
+limitedh79extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxspacedim_OBJECTS = maxspacedim.$(OBJEXT)
+maxspacedim_OBJECTS = $(am_maxspacedim_OBJECTS)
+maxspacedim_LDADD = $(LDADD)
+maxspacedim_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
+minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS)
+minconstraints1_LDADD = $(LDADD)
+minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations2_OBJECTS = relations2.$(OBJEXT)
+relations2_OBJECTS = $(am_relations2_OBJECTS)
+relations2_LDADD = $(LDADD)
+relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations3_OBJECTS = relations3.$(OBJEXT)
+relations3_OBJECTS = $(am_relations3_OBJECTS)
+relations3_LDADD = $(LDADD)
+relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writebdshape1_OBJECTS = writebdshape1.$(OBJEXT)
+writebdshape1_OBJECTS = $(am_writebdshape1_OBJECTS)
+writebdshape1_LDADD = $(LDADD)
+writebdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+	$(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+	$(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+	$(affinepreimage2_SOURCES) $(ascii_dump_load1_SOURCES) \
+	$(bdsdifference1_SOURCES) $(bdshull1_SOURCES) \
+	$(bgp99extrapolation1_SOURCES) $(bhmz05widening1_SOURCES) \
+	$(bhz03widening1_SOURCES) $(cc76extrapolation1_SOURCES) \
+	$(cc76narrowing1_SOURCES) $(closure1_SOURCES) \
+	$(concatenate1_SOURCES) $(constraints1_SOURCES) \
+	$(contains1_SOURCES) $(empty1_SOURCES) $(equality1_SOURCES) \
+	$(fromgensys1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) $(geomcovers1_SOURCES) \
+	$(h79widening1_SOURCES) $(intersection1_SOURCES) \
+	$(limitedbhmz05extrapolation1_SOURCES) \
+	$(limitedcc76extrapolation1_SOURCES) \
+	$(limitedh79extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(maxspacedim_SOURCES) $(minconstraints1_SOURCES) \
+	$(relations1_SOURCES) $(relations2_SOURCES) \
+	$(relations3_SOURCES) $(removespacedims1_SOURCES) \
+	$(timeelapse1_SOURCES) $(universe1_SOURCES) \
+	$(writebdshape1_SOURCES)
+DIST_SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+	$(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+	$(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+	$(affinepreimage2_SOURCES) $(ascii_dump_load1_SOURCES) \
+	$(bdsdifference1_SOURCES) $(bdshull1_SOURCES) \
+	$(bgp99extrapolation1_SOURCES) $(bhmz05widening1_SOURCES) \
+	$(bhz03widening1_SOURCES) $(cc76extrapolation1_SOURCES) \
+	$(cc76narrowing1_SOURCES) $(closure1_SOURCES) \
+	$(concatenate1_SOURCES) $(constraints1_SOURCES) \
+	$(contains1_SOURCES) $(empty1_SOURCES) $(equality1_SOURCES) \
+	$(fromgensys1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) $(geomcovers1_SOURCES) \
+	$(h79widening1_SOURCES) $(intersection1_SOURCES) \
+	$(limitedbhmz05extrapolation1_SOURCES) \
+	$(limitedcc76extrapolation1_SOURCES) \
+	$(limitedh79extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(maxspacedim_SOURCES) $(minconstraints1_SOURCES) \
+	$(relations1_SOURCES) $(relations2_SOURCES) \
+	$(relations3_SOURCES) $(removespacedims1_SOURCES) \
+	$(timeelapse1_SOURCES) $(universe1_SOURCES) \
+	$(writebdshape1_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+
+#CHECKER =
+CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+TESTS_ENVIRONMENT = CHEKER="$(CHECKER)"
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+# This will be overriden by the `run_tests' script.
+TEST_CPPFLAGS = -DBD_SHAPE_INSTANCE=mpq_class
+dist_check_SCRIPTS = run_tests
+TESTS = $(dist_check_SCRIPTS)
+XFAIL_TESTS = 
+ at SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCE = float
+ at SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCE = double
+ at SUPPORTED_LONG_DOUBLE_TRUE@LONG_DOUBLE_INSTANCE = long_double
+
+# NOTE: mpq_class must be the first in the list.
+INSTANCES = \
+mpq_class \
+$(FLOAT_INSTANCE) \
+$(DOUBLE_INSTANCE) \
+$(LONG_DOUBLE_INSTANCE) \
+mpz_class \
+int8_t \
+int16_t \
+int32_t \
+int64_t
+
+
+#
+# Sources for the tests
+#
+addconstraints1_SOURCES = addconstraints1.cc
+addspacedims1_SOURCES = addspacedims1.cc
+affinedimension1_SOURCES = affinedimension1.cc
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+bdsdifference1_SOURCES = bdsdifference1.cc
+bdshull1_SOURCES = bdshull1.cc
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+closure1_SOURCES = closure1.cc
+concatenate1_SOURCES = concatenate1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+empty1_SOURCES = empty1.cc
+equality1_SOURCES = equality1.cc
+fromgensys1_SOURCES = fromgensys1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+geomcovers1_SOURCES = geomcovers1.cc
+h79widening1_SOURCES = h79widening1.cc
+intersection1_SOURCES = intersection1.cc
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+maxspacedim_SOURCES = maxspacedim.cc
+minconstraints1_SOURCES = minconstraints1.cc
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+removespacedims1_SOURCES = removespacedims1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+universe1_SOURCES = universe1.cc
+writebdshape1_SOURCES = writebdshape1.cc
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/BD_Shape/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  tests/BD_Shape/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) 
+	@rm -f addconstraints1$(EXEEXT)
+	$(CXXLINK) $(addconstraints1_LDFLAGS) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) 
+	@rm -f addspacedims1$(EXEEXT)
+	$(CXXLINK) $(addspacedims1_LDFLAGS) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) 
+	@rm -f affinedimension1$(EXEEXT)
+	$(CXXLINK) $(affinedimension1_LDFLAGS) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) 
+	@rm -f affineimage1$(EXEEXT)
+	$(CXXLINK) $(affineimage1_LDFLAGS) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) 
+	@rm -f affineimage2$(EXEEXT)
+	$(CXXLINK) $(affineimage2_LDFLAGS) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) 
+	@rm -f affinepreimage1$(EXEEXT)
+	$(CXXLINK) $(affinepreimage1_LDFLAGS) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES) 
+	@rm -f affinepreimage2$(EXEEXT)
+	$(CXXLINK) $(affinepreimage2_LDFLAGS) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS)
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) 
+	@rm -f ascii_dump_load1$(EXEEXT)
+	$(CXXLINK) $(ascii_dump_load1_LDFLAGS) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+bdsdifference1$(EXEEXT): $(bdsdifference1_OBJECTS) $(bdsdifference1_DEPENDENCIES) 
+	@rm -f bdsdifference1$(EXEEXT)
+	$(CXXLINK) $(bdsdifference1_LDFLAGS) $(bdsdifference1_OBJECTS) $(bdsdifference1_LDADD) $(LIBS)
+bdshull1$(EXEEXT): $(bdshull1_OBJECTS) $(bdshull1_DEPENDENCIES) 
+	@rm -f bdshull1$(EXEEXT)
+	$(CXXLINK) $(bdshull1_LDFLAGS) $(bdshull1_OBJECTS) $(bdshull1_LDADD) $(LIBS)
+bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) 
+	@rm -f bgp99extrapolation1$(EXEEXT)
+	$(CXXLINK) $(bgp99extrapolation1_LDFLAGS) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+bhmz05widening1$(EXEEXT): $(bhmz05widening1_OBJECTS) $(bhmz05widening1_DEPENDENCIES) 
+	@rm -f bhmz05widening1$(EXEEXT)
+	$(CXXLINK) $(bhmz05widening1_LDFLAGS) $(bhmz05widening1_OBJECTS) $(bhmz05widening1_LDADD) $(LIBS)
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) 
+	@rm -f bhz03widening1$(EXEEXT)
+	$(CXXLINK) $(bhz03widening1_LDFLAGS) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+cc76extrapolation1$(EXEEXT): $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_DEPENDENCIES) 
+	@rm -f cc76extrapolation1$(EXEEXT)
+	$(CXXLINK) $(cc76extrapolation1_LDFLAGS) $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_LDADD) $(LIBS)
+cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) 
+	@rm -f cc76narrowing1$(EXEEXT)
+	$(CXXLINK) $(cc76narrowing1_LDFLAGS) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS)
+closure1$(EXEEXT): $(closure1_OBJECTS) $(closure1_DEPENDENCIES) 
+	@rm -f closure1$(EXEEXT)
+	$(CXXLINK) $(closure1_LDFLAGS) $(closure1_OBJECTS) $(closure1_LDADD) $(LIBS)
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) 
+	@rm -f concatenate1$(EXEEXT)
+	$(CXXLINK) $(concatenate1_LDFLAGS) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) 
+	@rm -f constraints1$(EXEEXT)
+	$(CXXLINK) $(constraints1_LDFLAGS) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) 
+	@rm -f contains1$(EXEEXT)
+	$(CXXLINK) $(contains1_LDFLAGS) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) 
+	@rm -f empty1$(EXEEXT)
+	$(CXXLINK) $(empty1_LDFLAGS) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+equality1$(EXEEXT): $(equality1_OBJECTS) $(equality1_DEPENDENCIES) 
+	@rm -f equality1$(EXEEXT)
+	$(CXXLINK) $(equality1_LDFLAGS) $(equality1_OBJECTS) $(equality1_LDADD) $(LIBS)
+fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) 
+	@rm -f fromgensys1$(EXEEXT)
+	$(CXXLINK) $(fromgensys1_LDFLAGS) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS)
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f generalizedaffineimage1$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage1_LDFLAGS) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) 
+	@rm -f generalizedaffineimage2$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage2_LDFLAGS) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage1$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage1_LDFLAGS) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage2$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage2_LDFLAGS) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) 
+	@rm -f geomcovers1$(EXEEXT)
+	$(CXXLINK) $(geomcovers1_LDFLAGS) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+h79widening1$(EXEEXT): $(h79widening1_OBJECTS) $(h79widening1_DEPENDENCIES) 
+	@rm -f h79widening1$(EXEEXT)
+	$(CXXLINK) $(h79widening1_LDFLAGS) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS)
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) 
+	@rm -f intersection1$(EXEEXT)
+	$(CXXLINK) $(intersection1_LDFLAGS) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+limitedbhmz05extrapolation1$(EXEEXT): $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_DEPENDENCIES) 
+	@rm -f limitedbhmz05extrapolation1$(EXEEXT)
+	$(CXXLINK) $(limitedbhmz05extrapolation1_LDFLAGS) $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_LDADD) $(LIBS)
+limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES) 
+	@rm -f limitedcc76extrapolation1$(EXEEXT)
+	$(CXXLINK) $(limitedcc76extrapolation1_LDFLAGS) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS)
+limitedh79extrapolation1$(EXEEXT): $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_DEPENDENCIES) 
+	@rm -f limitedh79extrapolation1$(EXEEXT)
+	$(CXXLINK) $(limitedh79extrapolation1_LDFLAGS) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS)
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) 
+	@rm -f mapspacedims1$(EXEEXT)
+	$(CXXLINK) $(mapspacedims1_LDFLAGS) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+maxspacedim$(EXEEXT): $(maxspacedim_OBJECTS) $(maxspacedim_DEPENDENCIES) 
+	@rm -f maxspacedim$(EXEEXT)
+	$(CXXLINK) $(maxspacedim_LDFLAGS) $(maxspacedim_OBJECTS) $(maxspacedim_LDADD) $(LIBS)
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) 
+	@rm -f minconstraints1$(EXEEXT)
+	$(CXXLINK) $(minconstraints1_LDFLAGS) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) 
+	@rm -f relations1$(EXEEXT)
+	$(CXXLINK) $(relations1_LDFLAGS) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) 
+	@rm -f relations2$(EXEEXT)
+	$(CXXLINK) $(relations2_LDFLAGS) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) 
+	@rm -f relations3$(EXEEXT)
+	$(CXXLINK) $(relations3_LDFLAGS) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) 
+	@rm -f removespacedims1$(EXEEXT)
+	$(CXXLINK) $(removespacedims1_LDFLAGS) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) 
+	@rm -f timeelapse1$(EXEEXT)
+	$(CXXLINK) $(timeelapse1_LDFLAGS) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) 
+	@rm -f universe1$(EXEEXT)
+	$(CXXLINK) $(universe1_LDFLAGS) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+writebdshape1$(EXEEXT): $(writebdshape1_OBJECTS) $(writebdshape1_DEPENDENCIES) 
+	@rm -f writebdshape1$(EXEEXT)
+	$(CXXLINK) $(writebdshape1_LDFLAGS) $(writebdshape1_OBJECTS) $(writebdshape1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bdsdifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bdshull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bgp99extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhmz05widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76narrowing1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/closure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equality1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/geomcovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h79widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedbhmz05extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedcc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writebdshape1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	srcdir=$(srcdir); export srcdir; \
+	list='$(TESTS)'; \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *" $$tst "*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		echo "XPASS: $$tst"; \
+	      ;; \
+	      *) \
+		echo "PASS: $$tst"; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *" $$tst "*) \
+		xfail=`expr $$xfail + 1`; \
+		echo "XFAIL: $$tst"; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		echo "FAIL: $$tst"; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      echo "SKIP: $$tst"; \
+	    fi; \
+	  done; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="All $$all tests passed"; \
+	    else \
+	      banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all tests failed"; \
+	    else \
+	      banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    skipped="($$skip tests were not run)"; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  echo "$$dashes"; \
+	  echo "$$banner"; \
+	  test -z "$$skipped" || echo "$$skipped"; \
+	  test -z "$$report" || echo "$$report"; \
+	  echo "$$dashes"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
+	  $(dist_check_SCRIPTS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-info-am
+
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/BD_Shape/addconstraints1.cc b/tests/BD_Shape/addconstraints1.cc
new file mode 100644
index 0000000..fa79a46
--- /dev/null
+++ b/tests/BD_Shape/addconstraints1.cc
@@ -0,0 +1,231 @@
+/* Test BD_Shape::add_constraints_and_minimize().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B == 5);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraints_and_minimize(cs);
+
+  print_constraints(bd1, "*** bd1.add_constraints_and_minimize(cs) ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+  known_result.add_constraint(B - A <= 5);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+
+  try {
+    // This is an invalid use of function
+    // BD_Shape::add_constraint: it is illegal
+    // to add a strict inequality.
+    bd1.add_constraint(x <= 0);
+    bd1.add_constraint(y < 0);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd1(2);
+
+  try {
+    // This is an invalid use of function
+    // BD_Shape::add_constraint: it is illegal
+    // to add a constraint with bigger dimension.
+    bd1.add_constraint(x <= 0);
+    bd1.add_constraint(y - x + z >= 0);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd1(3);
+
+  try {
+    // This is an invalid use of function
+    // BD_Shape::add_constraint: it is illegal
+    // to add a constraint with three dimension.
+    bd1.add_constraint(x <= 0);
+    bd1.add_constraint(y - x + z >= 0);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bd1(3);
+
+  try {
+    // This is an invalid use of function
+    // BD_Shape::add_constraint: it is illegal
+    // to add a constraint with two different coefficients.
+    bd1.add_constraint(x <= 0);
+    bd1.add_constraint(2*y - 3*x <= 0);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(1);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::add_constraints_and_minimize(cs): it is illegal to
+    // add a system of constraints that is not dimensional incompatible
+    // with the polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y >= 0);
+    bd.add_constraints_and_minimize(cs);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test07() {
+  Variable y(1);
+
+  TBD_Shape bd(1);
+
+  try {
+    // This is an invalid use of the function
+    // RBD_Shape::add_constraint(c): it is illegal to insert a
+    // constraints that contains a variable that is not in the space
+    // of the polyhedron.
+    bd.add_constraint(y >= 0);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(1);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::add_constraints(cs): it is illegal to add a system
+    // of constraints that is dimensional incompatible with the
+    // polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y == 0);
+    bd.add_constraints(cs);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/addspacedims1.cc b/tests/BD_Shape/addspacedims1.cc
new file mode 100644
index 0000000..ee7852a
--- /dev/null
+++ b/tests/BD_Shape/addspacedims1.cc
@@ -0,0 +1,277 @@
+/* Test BD_Shape::add_space_dimensions_and_embed():
+   we add two variables to a BD_Shape.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  //Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.add_space_dimensions_and_embed(2);
+  bd.add_constraint(z <= 2);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(z <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd,
+		    "*** bd.add_space_dimensions_and_embed(2) "
+		    "and bd.add_constraint(z <= 2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bd1(0, EMPTY);
+  TBD_Shape bd2(1, EMPTY);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.add_space_dimensions_and_embed(2);
+  bd2.add_space_dimensions_and_embed(1);
+
+  bool ok = (bd1 == bd2) ;
+
+  print_constraints(bd1, "*** bd1.add_space_dimensions_and_embed(2) ***");
+  print_constraints(bd2, "*** bd2.add_space_dimensions_and_embed(1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TBD_Shape bd1(0, UNIVERSE);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.add_space_dimensions_and_embed(3);
+
+  BD_Shape<mpq_class> known_result(3, UNIVERSE);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1, "*** bd1.add_space_dimension_and_embed(3) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bd1(0);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.add_space_dimensions_and_project(4);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D == 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(4) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(A == 1);
+  bd1.add_constraint(C - B >= 9);
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.add_space_dimensions_and_project(0);
+
+  print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(0) ***");
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  return ok;
+}
+
+bool
+test06() {
+  //Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bd1(1);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.add_space_dimensions_and_project(3);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D == 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  TBD_Shape bd(10, UNIVERSE);
+
+  bd.remove_higher_space_dimensions(5);
+  bd.add_space_dimensions_and_embed(6);
+
+  return bd == TBD_Shape(11, UNIVERSE);
+}
+
+bool
+test08() {
+  Variable x(0);
+  //Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.add_space_dimensions_and_project(2);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(w == 0);
+  known_result.add_constraint(z == 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  TBD_Shape bd1(0, EMPTY);
+  TBD_Shape bd2(1, EMPTY);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.add_space_dimensions_and_project(2);
+  bd2.add_space_dimensions_and_project(1);
+
+  bool ok = (bd1 == bd2) ;
+
+  print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(2) ***");
+  print_constraints(bd2, "*** bd2.add_space_dimensions_and_project(1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  TBD_Shape bd1(0, EMPTY);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.add_space_dimensions_and_project(3);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1, "*** bd1.add_space_dimension_and_project(3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bd1(0);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.add_space_dimensions_and_project(4);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D == 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(4) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/BD_Shape/affinedimension1.cc b/tests/BD_Shape/affinedimension1.cc
new file mode 100644
index 0000000..2958abb
--- /dev/null
+++ b/tests/BD_Shape/affinedimension1.cc
@@ -0,0 +1,236 @@
+/* Test BD_Shape::affine_dimension().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+
+  bd1.add_constraint(x <= 2);
+  bd1.add_constraint(x - y == 3);
+  bd1.add_constraint(y <= 2);
+
+  TBD_Shape bd2(2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  dimension_type affine_dim1 = bd1.affine_dimension();
+  dimension_type affine_dim2 = bd2.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bd1' "
+       << endl
+       << affine_dim1
+       << endl;
+
+  nout << endl
+       << "The affine dimension of a system of `bd2' "
+       << endl
+       << affine_dim2
+       << endl;
+
+  bool ok = (affine_dim1 == affine_dim2);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bd1(5);
+
+  bd1.add_constraint(A <= 5);
+  bd1.add_constraint(A - B == 3);
+  bd1.add_constraint(C <= 2);
+  bd1.add_constraint(E - D == 2);
+
+  TBD_Shape bd2(4);
+
+  bd2.add_constraint(A <= 1);
+  bd2.add_constraint(A - D == 8);
+  bd2.add_constraint(B <= 7);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  dimension_type affine_dim1 = bd1.affine_dimension();
+  dimension_type affine_dim2 = bd2.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bd1' "
+       << endl
+       << affine_dim1
+       << endl;
+
+  nout << endl
+       << "The affine dimension of a system of `bd2' "
+       << endl
+       << affine_dim2
+       << endl;
+
+  bool ok = (affine_dim1 == affine_dim2);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bd1(5);
+
+  bd1.add_constraint(A == 5);
+  bd1.add_constraint(A - B == 3);
+  bd1.add_constraint(C <= 2);
+  bd1.add_constraint(E - D == 2);
+
+  TBD_Shape bd2(5);
+
+  bd2.add_constraint(A == 1);
+  bd2.add_constraint(E == 1);
+  bd2.add_constraint(A - D == 8);
+  bd2.add_constraint(B <= 7);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  dimension_type affine_dim1 = bd1.affine_dimension();
+  dimension_type affine_dim2 = bd2.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bd1' "
+       << endl
+       << affine_dim1
+       << endl;
+
+  nout << endl
+       << "The affine dimension of a system of `bd2' "
+       << endl
+       << affine_dim2
+       << endl;
+
+  bool ok = (affine_dim1 == affine_dim2);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+
+  bd1.add_constraint(A <= 3);
+  bd1.add_constraint(B - A <= -5);
+  bd1.add_constraint(-B <= 2);
+
+  TBD_Shape bd2(2);
+
+  bd2.add_constraint(A == 0);
+  bd2.add_constraint(B == 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  dimension_type affine_dim1 = bd1.affine_dimension();
+  dimension_type affine_dim2 = bd2.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bd1' "
+       << endl
+       << affine_dim1
+       << endl;
+
+  nout << endl
+       << "The affine dimension of a system of `bd2' "
+       << endl
+       << affine_dim2
+       << endl;
+
+  bool ok = (affine_dim1 == affine_dim2);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2, EMPTY);
+
+  TBD_Shape bd2(7);
+
+  bd2.add_constraint(A <= 1);
+  bd2.add_constraint(B == 2);
+  bd2.add_constraint(B - A <= -6);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  dimension_type affine_dim1 = bd1.affine_dimension();
+  dimension_type affine_dim2 = bd2.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bd1' "
+       << endl
+       << affine_dim1
+       << endl;
+
+  nout << endl
+       << "The affine dimension of a system of `bd2' "
+       << endl
+       << affine_dim2
+       << endl;
+
+  bool ok = (affine_dim1 == affine_dim2);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
+
diff --git a/tests/BD_Shape/affineimage1.cc b/tests/BD_Shape/affineimage1.cc
new file mode 100644
index 0000000..540f84b
--- /dev/null
+++ b/tests/BD_Shape/affineimage1.cc
@@ -0,0 +1,467 @@
+/* Test BD_Shape::affine_image().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 2);
+  bd1.add_constraint(x - y <= 3);
+  bd1.add_constraint(y <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.affine_image(x, y);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y == 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.affine_image(x, y) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 2);
+  bd1.add_constraint(x - y <= 3);
+  bd1.add_constraint(y <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.affine_image(x, x + 4);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y <= 7);
+  known_result.add_constraint(x <= 6);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.affine_image(x, x + 4) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 2);
+  bd1.add_constraint(x - y <= 3);
+  bd1.add_constraint(y <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.affine_image(x, Linear_Expression(4));
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x == 4);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.affine_image(x, 4) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 2);
+  bd1.add_constraint(x - y <= 3);
+  bd1.add_constraint(y <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  bd1.affine_image(x, x);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.affine_image(x, x) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 2);
+  bd1.add_constraint(x - y <= 3);
+  bd1.add_constraint(y <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.affine_image(x, 2*x - 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.affine_image(x, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 2);
+  bd1.add_constraint(x - y <= 3);
+  bd1.add_constraint(y <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.affine_image(y, 2*x, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y - x == 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.affine_image(y, 2*x, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 2);
+  bd1.add_constraint(x - y <= 3);
+  bd1.add_constraint(y <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.affine_image(y, 3*x + 3, 3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y - x == 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.affine_image(y, 3*x + 3, 3) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(x >= 0);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(y >= -1);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, -2*x - 3*y + 1, -5);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(5*x >= -4);
+  known_result.add_constraint(5*x <= 7);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+  known_result.add_constraint(y - x <= 1);
+  known_result.add_constraint(5*x - 5*y <= 3);
+
+  bool ok = check_result(bd, known_result, "3.70e-7", "2.10e-7", "1.44e-7");
+
+  print_constraints(bd, "*** bd.affine_image(x, -2*x - 3*y + 1, -5) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(z >= 3);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(z, x + 2*y -3*z + 2, 4);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(2*z <= -1);
+
+  bool ok = check_result(bd, known_result);
+
+  print_constraints(bd, "*** bd.affine_image(z, x + 2*y -3*z + 2, 4) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bd(4);
+  bd.add_constraint(A <= 1);
+  bd.add_constraint(B <= 2);
+  bd.add_constraint(B >= 1);
+  bd.add_constraint(C <= 0);
+  bd.add_constraint(D == 3);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(A, -B + 2*C + 1, -3);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(C <= 0);
+  known_result.add_constraint(D == 3);
+  known_result.add_constraint(3*B - 3*A <= 5);
+
+  bool ok = check_result(bd, known_result, "7.95e-8", "7.95e-8", "7.95e-8");
+
+  print_constraints(bd, "*** bd.affine_image(A, -B + 2*C + 1, -3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(y <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, 2*y + z + 2, 4);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_image(x, 2*y + z + 2, 4) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x - y >= 0);
+  bd.add_constraint(x >= 0);
+  bd.add_constraint(x <= 2);
+
+  Linear_Expression coeff1 = x + 1;
+
+  try {
+    // This is an incorrect use of function
+    // BD_Shape::affine_image(v, expr,d): it is illegal applying
+    // the function with a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    bd.affine_image(x, coeff1, d);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(1);
+  bd.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid used of the function
+    // BD_Shape::affine_image(v, expr, d): it is illegal to
+    // apply this function to a variable that is not in the space of
+    // the polyhedron.
+    bd.affine_image(y, x + 1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x >= 1);
+  bd.add_constraint(y >= 1);
+
+  try {
+    // This is an invalid used of the function
+    // BD_Shape::affine_image(v, expr, d): it is illegal to
+    // use a variable in the expression that does not appear in the
+    // space of the polyhedron.
+    bd.affine_image(y, x + z + 1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x - y >= 0);
+  bd.add_constraint(x >= 0);
+  bd.add_constraint(x <= 2);
+
+  Linear_Expression coeff1 = 2*x + 1;
+
+  try {
+    // This is an incorrect use of function
+    // BD_Shape::affine_image(v, expr,d): it is illegal applying
+    // the function with a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 3;
+    bd.affine_image(x, coeff1, d);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x >= 1);
+  bd.add_constraint(y >= 1);
+
+  try {
+    // This is an invalid used of the function
+    // BD_Shape::affine_image(v, expr, d): it is illegal to
+    // use two variables in the expression.
+    bd.affine_image(y, y - x);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/BD_Shape/affineimage2.cc b/tests/BD_Shape/affineimage2.cc
new file mode 100644
index 0000000..4099504
--- /dev/null
+++ b/tests/BD_Shape/affineimage2.cc
@@ -0,0 +1,351 @@
+/* Test BD_Shape::affine_image().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(z >= 3);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, -x);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x >= -1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(z >= 3);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_image(x, -x) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(z >= 3);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, -z);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= -3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(z >= 3);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_image(x, -z) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(y >= 1);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, -y + 1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 0);
+  known_result.add_constraint(x >= -1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_image(x, -y + 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(y >= 1);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, -2*y + 1, -2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*x - 2*y == -1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = check_result(bd, known_result);
+
+  print_constraints(bd, "*** bd.affine_image(x, -2*y + 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(y >= 1);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, -2*y + 1, 2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*x <= -1);
+  known_result.add_constraint(2*x >= -3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = check_result(bd, known_result);
+
+  print_constraints(bd, "*** bd.affine_image(x, -2*y + 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(x >= 0);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(y >= -1);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, 2*x + y + 1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+  known_result.add_constraint(x - y <= 3);
+  known_result.add_constraint(x - y >= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_image(x, 2*x + y + 1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(x >= 0);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(y >= -1);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, -2*x + y + 1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+  known_result.add_constraint(x - y <= 1);
+  known_result.add_constraint(x - y >= -1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_image(x, -2*x + y + 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(x >= 0);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(y >= -1);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, 2*x - 3*y + 1, 5);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(5*x <= 6);
+  known_result.add_constraint(x >= -1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+
+  bool ok = check_result(bd, known_result, "9.54e-8", "6.75e-8", "4.77e-8");
+
+  print_constraints(bd, "*** bd.affine_image(x, 2*x - 3*y + 1, 5) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(x >= 0);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(y >= -1);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, -2*x - 3*y + 1, 5);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(5*x <= 4);
+  known_result.add_constraint(5*x >= -7);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+
+  bool ok = check_result(bd, known_result, "2.15e-7", "1.36e-7", "9.54e-8");
+
+  print_constraints(bd, "*** bd.affine_image(x, -2*x - 3*y + 1, 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(x >= 0);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(y >= -1);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, 2*x - 3*y + 1, -5);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(5*x >= -6);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+  known_result.add_constraint(5*x - 5*y <= 1);
+  known_result.add_constraint(5*x - 5*y >= -7);
+
+  bool ok = check_result(bd, known_result, "1.91e-7", "1.17e-7", "9.54e-8");
+
+  print_constraints(bd, "*** bd.affine_image(x, 2*x - 3*y + 1, -5) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(y >= 0);
+  bd.add_constraint(y <= 2);
+  bd.add_constraint(z <= 3);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_image(x, y + 5*z, 3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*x <= 17);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(z <= 3);
+  known_result.add_constraint(x - y <= 5);
+  known_result.add_constraint(3*x - 3*z <= 8);
+
+  bool ok = check_result(bd, known_result, "1.12e-6", "6.56e-7", "4.77e-7");
+
+  print_constraints(bd, "*** bd.affine_image(x, y + 5*z, 3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/BD_Shape/affinepreimage1.cc b/tests/BD_Shape/affinepreimage1.cc
new file mode 100644
index 0000000..6eb17b9
--- /dev/null
+++ b/tests/BD_Shape/affinepreimage1.cc
@@ -0,0 +1,181 @@
+/* Test BD_Shape::affine_preimage().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 2);
+  bd1.add_constraint(x - y <= 3);
+  bd1.add_constraint(y <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.affine_preimage(x, y);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.affine_preimage(x, y) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(B >= 0);
+  bd.add_constraint(A - B - 3 >= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_preimage(A, B-1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.affine_preimage(A, B-1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 2);
+  bd.add_constraint(B >= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_preimage(A, 2*A + 2, 2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.affine_preimage(A, 2*A + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 2);
+  bd.add_constraint(B >= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_preimage(B, Linear_Expression(3));
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.affine_preimage(B, 3) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the function
+    // BD_Shape::affine_preimage(v, expr, d): it is illegal
+    // to apply to a expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    bd.affine_preimage(x, x + 1, d);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the function
+    // BD_Shape::affine_preimage(v, expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greather than the space dimension of the BDS.
+    bd.affine_preimage(y, z);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/affinepreimage2.cc b/tests/BD_Shape/affinepreimage2.cc
new file mode 100644
index 0000000..d37c10a
--- /dev/null
+++ b/tests/BD_Shape/affinepreimage2.cc
@@ -0,0 +1,253 @@
+/* Test BD_Shape::affine_preimage().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A <= -1);
+  bd.add_constraint(B <= 0);
+  bd.add_constraint(C >= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_preimage(A, 4*B + 6*C + 2, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_preimage(A, 4*B + 6*C + 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A <= -1);
+  bd.add_constraint(B <= 0);
+  bd.add_constraint(C >= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_preimage(A, 2*A + 3*C + 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -2);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_preimage(A, 2*A + 3*C + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A <= -1);
+  bd.add_constraint(B <= 0);
+  bd.add_constraint(C >= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_preimage(A, 2*A + 3*C + 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -2);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_preimage(A, -3*A + C - 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A <= -1);
+  bd.add_constraint(B <= 0);
+  bd.add_constraint(C >= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_preimage(A, 3*A + C - 1, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_preimage(A, 3*A + C - 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A <= -1);
+  bd.add_constraint(B <= 0);
+  bd.add_constraint(C >= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_preimage(A, -3*A + C - 1, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_preimage(A, -3*A + C - 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bd(4);
+  bd.add_constraint(A == 2);
+  bd.add_constraint(B == 0);
+  bd.add_constraint(C >= -3);
+  bd.add_constraint(D <= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_preimage(D, 4*A - B + 2*C + 5*D - 1, 3);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A == 2);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C >= -3);
+  known_result.add_constraint(5*D <= 14);
+
+  bool ok = check_result(bd, known_result, "7.63e-7", "3.82e-7", "1.91e-7");
+
+  print_constraints(bd, "*** bd.affine_preimage"
+		        "(D, 4*A - B + 2*C + 5*D - 1, 3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A <= -1);
+  bd.add_constraint(B <= 0);
+  bd.add_constraint(C >= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.affine_preimage(B, -B);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_preimage(B, -B) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A <= -1);
+  bd.add_constraint(B <= 0);
+  bd.add_constraint(C >= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  BD_Shape<mpq_class> known_result(bd);
+
+  bd.affine_preimage(B, -B, -1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.affine_preimage(B, -B, -1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
+
diff --git a/tests/BD_Shape/ascii_dump_load1.cc b/tests/BD_Shape/ascii_dump_load1.cc
new file mode 100644
index 0000000..78db9a0
--- /dev/null
+++ b/tests/BD_Shape/ascii_dump_load1.cc
@@ -0,0 +1,246 @@
+/* Test BD_Shape::ascii_dump() and BD_Shape::ascii_load().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+const char* my_file = "ascii_dump_load1.dat";
+
+bool
+test01() {
+
+  nout << "test01()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  bd.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-EM");
+  f.seekp(0, ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBD_Shape bd2;
+  bool ok = !bd2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test02() {
+
+  nout << "test02()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(B >= 1);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  bd.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "+ZE");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBD_Shape bd2;
+  bool ok = !bd2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+
+  nout << "test03()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(B >= 2);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  bd.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-SPC");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBD_Shape bd2;
+  bool ok = !bd2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+
+  nout << "test04()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(B >= 3);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  bd.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "+inf");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBD_Shape bd2;
+  bool ok = !bd2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+
+  nout << "test05()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(B >= 3);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  bd.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "+inf");
+  do
+    f >> str;
+  while (str != "+inf");
+  f.seekp(0, ios_base::cur);
+  f << " 3 ";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBD_Shape bd2;
+  bool ok = !bd2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(A - B >= 2);
+  bd1.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  bd1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBD_Shape bd2;
+  bd2.ascii_load(f);
+  close(f);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bool ok = (bd1 == bd2) ;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/bdsdifference1.cc b/tests/BD_Shape/bdsdifference1.cc
new file mode 100644
index 0000000..8b3f64f
--- /dev/null
+++ b/tests/BD_Shape/bdsdifference1.cc
@@ -0,0 +1,278 @@
+/* Test BD_Shape::bds_difference_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A >= 0);
+  bd1.add_constraint(A <= -2);
+  bd1.add_constraint(B == 0);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A >= 0);
+  bd2.add_constraint(A <= 2);
+  bd2.add_constraint(B >= 0);
+  bd2.add_constraint(B <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** ph2 ***");
+
+  bd1.bds_difference_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** After bd1.bds_difference_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bd1;
+  TBD_Shape bd2;
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.bds_difference_assign(bd2);
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(-4) >= 0);
+  BD_Shape<mpq_class> known_result(cs);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x <= 2);
+  bd1.add_constraint(x >= 0);
+  bd1.add_constraint(y <= 5);
+  bd1.add_constraint(y >= 2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(x <= 3);
+  bd2.add_constraint(x >= 1);
+  bd2.add_constraint(y <= 4);
+  bd2.add_constraint(y >= 1);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.bds_difference_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 5);
+  known_result.add_constraint(y >= 2);
+  known_result.add_constraint(y - x >= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x <= 8);
+  bd1.add_constraint(x >= 0);
+  bd1.add_constraint(y <= 7);
+  bd1.add_constraint(y >= 2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(x <= 3);
+  bd2.add_constraint(x >= 1);
+  bd2.add_constraint(y <= 0);
+  bd2.add_constraint(y >= 1);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  bd1.bds_difference_assign(bd2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x <= 8);
+  bd1.add_constraint(x >= 0);
+  bd1.add_constraint(y <= 7);
+  bd1.add_constraint(y >= 2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(x <= 9);
+  bd2.add_constraint(x >= 0);
+  bd2.add_constraint(y <= 8);
+  bd2.add_constraint(y >= 1);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.bds_difference_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 8);
+  bd1.add_constraint(y <= 7);
+  bd1.add_constraint(y >= 1);
+  bd1.add_constraint(z <= 2);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(x == 8);
+  bd2.add_constraint(y <= 2);
+  bd2.add_constraint(y >= 1);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.bds_difference_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 8);
+  known_result.add_constraint(y <= 7);
+  known_result.add_constraint(y >= 1);
+  known_result.add_constraint(z <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A >= 0);
+  bd1.add_constraint(A <= 4);
+  bd1.add_constraint(B >= 0);
+  bd1.add_constraint(B <= 2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A >= 2);
+  bd2.add_constraint(A <= 4);
+  bd2.add_constraint(B >= 0);
+  bd2.add_constraint(B <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  bd1.bds_difference_assign(bd2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  TBD_Shape bd1(3);
+  TBD_Shape bd2(5);
+
+  try {
+    // This is an incorrect use of function
+    // BD_Shape::bds_difference_assign(bd2): it is impossible to apply
+    // this function to two polyhedra of different dimensions.
+    bd1.bds_difference_assign(bd2);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/bdshull1.cc b/tests/BD_Shape/bdshull1.cc
new file mode 100644
index 0000000..5163992
--- /dev/null
+++ b/tests/BD_Shape/bdshull1.cc
@@ -0,0 +1,220 @@
+/* Test BD_Shape::bds_hull_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TBD_Shape bd1(5);
+  bd1.add_constraint(x1 <= 5);
+  bd1.add_constraint(x2 <= -1);
+  bd1.add_constraint(x1 -x2 <= 10);
+
+  TBD_Shape bd2(5);
+  bd2.add_constraint(x1  <= 2);
+  bd2.add_constraint(x4 <= 7);
+  bd2.add_constraint(x1 - x2 <= 20);
+  bd2.add_constraint(x4 - x3 <= 3);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.bds_hull_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(x1 <= 5);
+  known_result.add_constraint(x1 - x2 <= 20);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.bds_hull_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 4);
+  bd1.add_constraint(-x <= -1);
+  bd1.add_constraint(y <= 3);
+  bd1.add_constraint(-y <= -1);
+  bd1.add_constraint(x - y <= 1);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(y - x <= -1);
+  bd2.add_constraint(x <= 3);
+  bd2.add_constraint(-y <= 5);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.bds_hull_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 4);
+  known_result.add_constraint(y >= -5);
+  known_result.add_constraint(x >= -4);
+  known_result.add_constraint(y <= 3);
+  known_result.add_constraint(x - y <= 8);
+  known_result.add_constraint(y - x <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.bds_hull_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x <= 4);
+  bd1.add_constraint(-x <= -1);
+  bd1.add_constraint(y <= 3);
+  bd1.add_constraint(-y <= -1);
+  bd1.add_constraint(x - y <= 1);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(y - x <= -1);
+  bd2.add_constraint(x <= 3);
+  bd2.add_constraint(x >= 5);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  bd1.bds_hull_assign(bd2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.bds_hull_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A <= 4);
+  bd1.add_constraint(A >= 1);
+  bd1.add_constraint(B <= 3);
+  bd1.add_constraint(-B <= -1);
+  bd1.add_constraint(A - B <= 1);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(B - A <= -1);
+  bd2.add_constraint(A <= 3);
+  bd2.add_constraint(-B <= 5);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.bds_hull_assign_and_minimize(bd2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B >= -5);
+  known_result.add_constraint(A >= -4);
+  known_result.add_constraint(B <= 3);
+  known_result.add_constraint(A - B <= 8);
+  known_result.add_constraint(B - A <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.bds_hull_assign_and_minimize(bd2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bd1(12);
+  TBD_Shape bd2(5);
+
+  try {
+    // This is an incorrect use of function
+    // BD_Shape::bds_hull_assign(bd2): it is impossible to apply
+    // this function to two polyhedra of different dimensions.
+    bd1.bds_hull_assign(bd2);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x >= y);
+
+  TBD_Shape bd2(3);
+
+  try {
+    // This is an invalid use of function
+    // BD_Shape::bds_hull_assign_and_minimize(bd2): it is illegal
+    // to apply this function to two polyhedra of different dimensions.
+    bd1.bds_hull_assign_and_minimize(bd2);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/bgp99extrapolation1.cc b/tests/BD_Shape/bgp99extrapolation1.cc
new file mode 100644
index 0000000..0cdcd94
--- /dev/null
+++ b/tests/BD_Shape/bgp99extrapolation1.cc
@@ -0,0 +1,93 @@
+/* Test Polyhedra_Powerset<PH>::BGP99_extrapolation_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  typedef Polyhedra_Powerset<TBD_Shape> BDS_Set;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(-A + B >= 2);
+  bds1.add_constraint(A - B >= -4);
+  bds1.add_constraint(A >= 0);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(-A + B >= 3);
+  bds2.add_constraint(A - B >= -8);
+  bds2.add_constraint(A >= 1);
+  TBD_Shape bds3(2);
+  bds3.add_constraint(-A + B >= 4);
+  bds3.add_constraint(A - B >= -12);
+  bds3.add_constraint(A >= 2);
+  TBD_Shape bds4(2);
+  bds4.add_constraint(-A + B >= 6);
+  bds4.add_constraint(A - B >= -16);
+  bds4.add_constraint(A >= 3);
+
+  BDS_Set bdss1(2, EMPTY);
+  bdss1.add_disjunct(bds1);
+  bdss1.add_disjunct(bds2);
+  bdss1.add_disjunct(bds3);
+
+  BDS_Set bdss2(bdss1);
+  bdss1.add_disjunct(bds4);
+
+  using namespace IO_Operators;
+  nout << "*** bdss1 ***" << endl
+       << bdss1 << endl;
+  nout << "*** bdss2 ***" << endl
+       << bdss2 << endl;
+
+  TBD_Shape bds5(2);
+  bds5.add_constraint(-A + B >= 4);
+  bds5.add_constraint(A >= 2);
+  bds5.add_constraint(B >= 6);
+
+  BDS_Set known_result(2, EMPTY);
+  known_result.add_disjunct(bds1);
+  known_result.add_disjunct(bds2);
+  known_result.add_disjunct(bds5);
+
+  bdss1.BGP99_extrapolation_assign
+    (bdss2, widen_fun_ref(&TBD_Shape::H79_widening_assign), 3);
+
+  bool ok = bdss1.geometrically_equals(known_result);
+
+  nout
+    << "*** bdss1.BGP99_extrapolation_assign"
+    << "(bdss2, widen_fun_ref(&H79_widening_assign), 3) ***"
+    << endl
+    << bdss1 << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/bhmz05widening1.cc b/tests/BD_Shape/bhmz05widening1.cc
new file mode 100644
index 0000000..2619918
--- /dev/null
+++ b/tests/BD_Shape/bhmz05widening1.cc
@@ -0,0 +1,343 @@
+/* Test BD_Shape::BHMZ05_widening_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x <= 1);
+  bd1.add_constraint(x - y <= 2);
+  bd1.add_constraint(y - x <= 7);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(x - y <= 2);
+  bd2.add_constraint(-x <= 3);
+  bd2.add_constraint(x <= 0);
+  bd2.add_constraint(y - x <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.BHMZ05_widening_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bd1;
+  TBD_Shape bd2(0, EMPTY);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.BHMZ05_widening_assign(bd2);
+
+  BD_Shape<mpq_class> known_result;
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** After bd1.BHMZ05_widening_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bd1(5);
+  bd1.add_constraint(A >= 0);
+  bd1.add_constraint(B >= 0);
+  bd1.add_constraint(C >= 1);
+  bd1.add_constraint(D >= 0);
+  bd1.add_constraint(E >= 0);
+  bd1.add_constraint(C - D <= 76);
+  bd1.add_constraint(C - E <= 76);
+  bd1.add_constraint(E - D == 0);
+
+  TBD_Shape bd2(5);
+  bd2.add_constraint(A >= 0);
+  bd2.add_constraint(B >= 0);
+  bd2.add_constraint(C >= 1);
+  bd2.add_constraint(D >= 0);
+  bd2.add_constraint(E >= 0);
+  bd2.add_constraint(C - D <= 75);
+  bd2.add_constraint(C - E <= 75);
+  bd2.add_constraint(E - D == 0);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.BHMZ05_widening_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 1);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(E - D == 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(A - B <= 1);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(A - B <= 1);
+  bd2.add_constraint(A - C <= 1);
+  bd2.add_constraint(C - B <= 0);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.BHMZ05_widening_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(3);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(A - B <= 1);
+  bd1.add_constraint(A - B >= 2);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(A - B <= 1);
+  bd2.add_constraint(A - B >= 2);
+  bd2.add_constraint(A - C <= 1);
+  bd2.add_constraint(C - B <= 0);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.BHMZ05_widening_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+
+  return ok;
+}
+
+TBD_Shape
+aux_test06(int i, Variable a, Variable b, Variable c) {
+  TBD_Shape bd(3);
+  if (i == 0) {
+    bd.add_constraint(0 <= a-b);
+    bd.add_constraint(     a-b <= 0);
+    bd.add_constraint(-1 <= b-c);
+    bd.add_constraint(      b-c <= 1);
+  }
+  else {
+    bd.add_constraint(-i <= a-b);
+    bd.add_constraint(      a-b <= i);
+    bd.add_constraint(-1 <= b-c);
+    bd.add_constraint(      b-c <= 1);
+    bd.add_constraint(-i <= a-c);
+    bd.add_constraint(      a-c <= i);
+  }
+
+  using namespace IO_Operators;
+  nout << "*** n_" << i << " ***" << endl
+       << bd << endl;
+
+  // Force closure.
+  (void) (bd == bd);
+  return bd;
+}
+
+bool
+test06() {
+  Variable a(0);
+  Variable b(1);
+  Variable c(2);
+  unsigned i = 0;
+  TBD_Shape m_i = aux_test06(i, a, b, c);
+  TBD_Shape m_i_next;
+  while (i < 100) {
+
+    using namespace IO_Operators;
+    nout << "*** m_" << i << " ***" << endl
+	 << m_i << endl;
+
+    m_i_next = aux_test06(++i, a, b, c);
+    m_i_next.bds_hull_assign(m_i);
+    m_i_next.BHMZ05_widening_assign(m_i);
+    // Force closure.
+    (void) (m_i_next == m_i_next);
+    if (m_i == m_i_next) {
+      BD_Shape<mpq_class> known_result(3);
+      known_result.add_constraint(-1 <= b-c);
+      known_result.add_constraint(      b-c <= 1);
+
+      bool ok = (BD_Shape<mpq_class>(m_i) == known_result) ;
+
+      nout << "*** m_" << i << " (fixpoint) ***" << endl
+	   << m_i << endl;
+      print_constraints(known_result, "*** known_result ***");
+
+      return ok;
+    }
+    m_i = m_i_next;
+  }
+
+  return false;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(A - B <= 1);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(A - B <= 1);
+  bd2.add_constraint(A - B >= 2);
+  bd2.add_constraint(A - C <= 1);
+  bd2.add_constraint(C - B <= 0);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  bd1.BHMZ05_widening_assign(bd2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y == 0);
+
+  TBD_Shape bd1(cs1);
+
+  Constraint_System cs2;
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(y - x <= 0);
+
+  TBD_Shape bd2(cs2);
+
+  print_constraints(bd1, "*** bd1 ****");
+  print_constraints(bd2, "*** bd2 ****");
+
+  BD_Shape<mpq_class> known_result(bd2);
+
+  bd2.BHMZ05_widening_assign(bd1);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+  print_constraints(bd2,
+		    "*** bd2.BHMZ05_widening_assign(bd1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  TBD_Shape bd1(5);
+  TBD_Shape bd2(10);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::BHMZ05_widening_assign(bd1): it is illegal to apply
+    // this function to two polyhedra that are not dimensional
+    // compatible.
+    bd2.BHMZ05_widening_assign(bd1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/BD_Shape/bhz03widening1.cc b/tests/BD_Shape/bhz03widening1.cc
new file mode 100644
index 0000000..b7dcfe0
--- /dev/null
+++ b/tests/BD_Shape/bhz03widening1.cc
@@ -0,0 +1,76 @@
+/* Test Polyhedra_Powerset<PH>::BHZ03_widening_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  typedef Polyhedra_Powerset<TBD_Shape> PSet;
+
+  TBD_Shape p(2);
+  TBD_Shape q(2);
+  TBD_Shape r(2);
+  TBD_Shape s(2);
+  p.add_constraint(A >= 1);
+  p.add_constraint(B == 0);
+  q.add_constraint(A >= 2);
+  q.add_constraint(A <= 7);
+  q.add_constraint(B == 1);
+  r.add_constraint(A >= 3);
+  r.add_constraint(A <= 8);
+  r.add_constraint(B == 1);
+  s.add_constraint(A >= 1);
+  s.add_constraint(A <= 6);
+  s.add_constraint(B == 1);
+  PSet P(2, EMPTY);
+  P.add_disjunct(p);
+  P.add_disjunct(q);
+  P.add_disjunct(r);
+  P.add_disjunct(s);
+  PSet Q(2, EMPTY);
+  Q.add_disjunct(p);
+  Q.add_disjunct(q);
+  Q.add_disjunct(s);
+
+  using namespace IO_Operators;
+  nout << "P = " << P << endl
+       << "Q = " << Q << endl;
+
+  PSet old_P = P;
+  P.BHZ03_widening_assign<H79_Certificate>
+    (Q, widen_fun_ref(&TBD_Shape::H79_widening_assign));
+
+  nout << "P.BHZ03(Q, H79)" << " = " << P << endl;
+
+  return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/cc76extrapolation1.cc b/tests/BD_Shape/cc76extrapolation1.cc
new file mode 100644
index 0000000..9246220
--- /dev/null
+++ b/tests/BD_Shape/cc76extrapolation1.cc
@@ -0,0 +1,488 @@
+/* Test BD_Shape::CC76_extrapolation_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 1);
+  bd1.add_constraint(x - y <= 2);
+  bd1.add_constraint(y - x <= 7);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(x - y <= 2);
+  bd2.add_constraint(-x <= 3);
+  bd2.add_constraint(x <= 0);
+  bd2.add_constraint(y - x <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.CC76_extrapolation_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bd1(4);
+  bd1.add_constraint(A >= 0);
+  bd1.add_constraint(B >= 0);
+  bd1.add_constraint(B <= 25);
+  bd1.add_constraint(C >= 0);
+  bd1.add_constraint(C <= 29);
+  bd1.add_constraint(D >= 0);
+  bd1.add_constraint(D <= 27);
+  bd1.add_constraint(B - A <= 25);
+  bd1.add_constraint(C - A <= 29);
+  bd1.add_constraint(D - A <= 27);
+  bd1.add_constraint(B - C <= 2);
+  bd1.add_constraint(C - B <= 6);
+  bd1.add_constraint(B - D <= 2);
+  bd1.add_constraint(D - B <= 4);
+  bd1.add_constraint(C - D <= 4);
+  bd1.add_constraint(D - C <= 4);
+
+  TBD_Shape bd2(4);
+  bd2.add_constraint(A >= 0);
+  bd2.add_constraint(B >= 0);
+  bd2.add_constraint(B <= 26);
+  bd2.add_constraint(C >= 3);
+  bd2.add_constraint(C <= 29);
+  bd2.add_constraint(D >= 2);
+  bd2.add_constraint(D <= 28);
+  bd2.add_constraint(B - A <= 26);
+  bd2.add_constraint(C - A <= 29);
+  bd2.add_constraint(D - A <= 28);
+  bd2.add_constraint(B - C <= 0);
+  bd2.add_constraint(C - B <= 6);
+  bd2.add_constraint(B - D == 2);
+  bd2.add_constraint(C - D <= 4);
+  bd2.add_constraint(D - C <= 2);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(C >= 0);
+  cs.insert(D >= 0);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bd1.bds_hull_assign(bd2);
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 26);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(B - A <= 26);
+  known_result.add_constraint(B - C <= 2);
+  known_result.add_constraint(B - D <= 2);
+  known_result.add_constraint(C - D <= 4);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1,
+		    "bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bd1(4);
+  bd1.add_constraint(A >= 0);
+  bd1.add_constraint(B >= 0);
+  bd1.add_constraint(B <= 39);
+  bd1.add_constraint(C >= 0);
+  bd1.add_constraint(C <= 40);
+  bd1.add_constraint(D >= 0);
+  bd1.add_constraint(D <= 40);
+  bd1.add_constraint(B - A <= 39);
+  bd1.add_constraint(C - A <= 40);
+  bd1.add_constraint(D - A <= 40);
+  bd1.add_constraint(B - C <= 0);
+  bd1.add_constraint(C - B <= 1);
+  bd1.add_constraint(B - D <= 0);
+  bd1.add_constraint(D - B <= 2);
+  bd1.add_constraint(C - D <= 0);
+  bd1.add_constraint(D - C <= 1);
+
+  TBD_Shape bd2(4);
+  bd2.add_constraint(A >= 0);
+  bd2.add_constraint(B >= 0);
+  bd2.add_constraint(B <= 38);
+  bd2.add_constraint(C >= 0);
+  bd2.add_constraint(C <= 39);
+  bd2.add_constraint(D >= 0);
+  bd2.add_constraint(D <= 40);
+  bd2.add_constraint(B - A <= 38);
+  bd2.add_constraint(C - A <= 39);
+  bd2.add_constraint(D - A <= 40);
+  bd2.add_constraint(B - C <= 0);
+  bd2.add_constraint(C - B <= 1);
+  bd2.add_constraint(B - D <= 0);
+  bd2.add_constraint(D - B <= 2);
+  bd2.add_constraint(C - D <= 0);
+  bd2.add_constraint(D - C <= 1);
+
+  // Force the closure of `bd1'.
+  bd1 == bd2;
+
+  BD_Shape<mpq_class> known_widening(4);
+  known_widening.add_constraint(A >= 0);
+  known_widening.add_constraint(B >= 0);
+  known_widening.add_constraint(C >= 0);
+  known_widening.add_constraint(D >= 0);
+  known_widening.add_constraint(D <= 40);
+  known_widening.add_constraint(D - A <= 40);
+  known_widening.add_constraint(B - C <= 0);
+  known_widening.add_constraint(C - B <= 1);
+  known_widening.add_constraint(B - D <= 0);
+  known_widening.add_constraint(D - B <= 2);
+  known_widening.add_constraint(C - D <= 0);
+  known_widening.add_constraint(D - C <= 1);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.CC76_extrapolation_assign(bd2);
+
+  print_constraints(bd1, "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+  // Force the closure of `bd1'.
+  bd1 == bd2;
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_widening) ;
+
+  print_constraints(bd1, "*** bd1.closure_assign() ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A <= 0);
+  bd1.add_constraint(B >= 0);
+  bd1.add_constraint(B <= 2);
+  bd1.add_constraint(B - A <= 2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A <= 0);
+  bd2.add_constraint(B >= 0);
+  bd2.add_constraint(B <= 1);
+  bd2.add_constraint(B - A <= 1);
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.CC76_extrapolation_assign(bd2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+TBD_Shape
+aux_test05(int i, Variable a, Variable b, Variable c) {
+  TBD_Shape bd(3);
+  if (i == 0) {
+    bd.add_constraint(0 <= a-b);
+    bd.add_constraint(     a-b <= 0);
+    bd.add_constraint(-1 <= b-c);
+    bd.add_constraint(      b-c <= 1);
+  }
+  else {
+    bd.add_constraint(-i <= a-b);
+    bd.add_constraint(      a-b <= i);
+    bd.add_constraint(-1 <= b-c);
+    bd.add_constraint(      b-c <= 1);
+    bd.add_constraint(-i <= a-c);
+    bd.add_constraint(      a-c <= i);
+  }
+
+  using namespace IO_Operators;
+  nout << "*** n_" << i << " ***" << endl
+       << bd << endl;
+
+  // Force closure.
+  (void) (bd == bd);
+  return bd;
+}
+
+bool
+test05() {
+  Variable a(0);
+  Variable b(1);
+  Variable c(2);
+  unsigned i = 0;
+  TBD_Shape m_i = aux_test05(i, a, b, c);
+  TBD_Shape m_i_next;
+  while (i < 100) {
+
+    using namespace IO_Operators;
+    nout << "*** m_" << i << " ***" << endl
+	 << m_i << endl;
+
+    m_i_next = aux_test05(++i, a, b, c);
+    TBD_Shape::base_type* no_stop_points = 0;
+    m_i_next.CC76_extrapolation_assign(m_i, no_stop_points, no_stop_points);
+    m_i_next.bds_hull_assign(m_i);
+    // Force closure.
+    (void) (m_i_next == m_i_next);
+    if (m_i == m_i_next) {
+
+      nout << "*** m_" << i << " (fixpoint) ***" << endl
+	   << m_i << endl;
+
+      return false;
+    }
+    m_i = m_i_next;
+  }
+  return true;
+}
+
+bool
+test06() {
+  TBD_Shape bd1(0);
+
+  TBD_Shape bd2(0, EMPTY);
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.CC76_extrapolation_assign(bd2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  TBD_Shape bd1(2, EMPTY);
+  TBD_Shape bd2(2, EMPTY);
+  BD_Shape<mpq_class> known_result(bd2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd2.CC76_extrapolation_assign(bd1);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result);
+
+  print_constraints(bd2,
+		    "*** bd2.CC76_extrapolation_assign(bd1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(A - B >= 2);
+  bd1.add_constraint(B - C >= -1);
+  bd1.add_constraint(C - A >= -3);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(A - B >= 2);
+  bd2.add_constraint(B - C >= 1);
+  bd2.add_constraint(C - A >= 3);
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.CC76_extrapolation_assign(bd2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A <= 1);
+  bd2.add_constraint(B == -1);
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.CC76_extrapolation_assign(bd2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(C <= 4);
+  bd1.add_constraint(B >= 2);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(C == 3);
+  bd2.add_constraint(A - C >= 0);
+  bd2.add_constraint(B - A >= 1);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(C - B <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.CC76_extrapolation_assign(bd2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  TBD_Shape bd1(1);
+  TBD_Shape bd2(2);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::CC76_extrapolation_assign(bd): it is
+    // illegal to apply this function to two polyhedra that are not
+    // dimension-compatible.
+    bd2.CC76_extrapolation_assign(bd1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test12() {
+  TBD_Shape bd1(5);
+  TBD_Shape bd2(10);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::CC76_widening_assign(bd2): it is illegal to apply
+    // this function to two polyhedra that are not dimensional
+    // compatible.
+    bd2.CC76_extrapolation_assign(bd1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/cc76narrowing1.cc b/tests/BD_Shape/cc76narrowing1.cc
new file mode 100644
index 0000000..46f4d68
--- /dev/null
+++ b/tests/BD_Shape/cc76narrowing1.cc
@@ -0,0 +1,216 @@
+/* Test BD_Shape::CC76_narrowing_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 1);
+  bd1.add_constraint(y - x <= 7);
+  bd1.add_constraint(x - y <= 6);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(-x <= 3);
+  bd2.add_constraint(y - x <= 2);
+  bd2.add_constraint(x - y <= 5);
+  bd2.add_constraint(x <= 0);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd2.CC76_narrowing_assign(bd1);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y - x <= 7);
+  known_result.add_constraint(-x <= 3);
+  known_result.add_constraint(x - y <= 6);
+  known_result.add_constraint(-y <= 8);
+  known_result.add_constraint(y <= 8);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+  print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd1(4);
+  bd1.add_constraint(z <= 1);
+
+  TBD_Shape bd2(4);
+  bd2.add_constraint(-y <= 3);
+  bd2.add_constraint(-x <= 2);
+  bd2.add_constraint(x <= 3);
+  bd2.add_constraint(y - x <= 4);
+  bd2.add_constraint(z <= 0);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd2.CC76_narrowing_assign(bd1);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(z <= 1);
+  known_result.add_constraint(-y <= 3);
+  known_result.add_constraint(y <= 7);
+  known_result.add_constraint(-x <= 2);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(y - x <= 4);
+  known_result.add_constraint(x - y <= 6);
+  known_result.add_constraint(z - y <= 3);
+  known_result.add_constraint(z - x <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+  print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd1(3);
+  TBD_Shape bd2(3);
+
+  bd1.add_constraint(z <= 1);
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bd2.add_constraint(-y <= 3);
+  bd2.add_constraint(x >= 4);
+  bd2.add_constraint(x <= 3);
+  bd2.add_constraint(y - x <= 4);
+  bd2.add_constraint(z <= 0);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd2.CC76_narrowing_assign(bd1);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+  print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(z <= 1);
+  bd1.add_constraint(z >= 3);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(-y <= 3);
+  bd2.add_constraint(x >= 4);
+  bd2.add_constraint(x <= 3);
+  bd2.add_constraint(y - x <= 4);
+  bd2.add_constraint(z <= 0);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd2.CC76_narrowing_assign(bd1);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+  print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bd1;
+  TBD_Shape bd2(0, EMPTY);
+  BD_Shape<mpq_class> known_result(bd2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd2.CC76_narrowing_assign(bd1);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+  print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable y(1);
+
+  TBD_Shape bd1(1);
+  TBD_Shape bd2(2);
+
+  Constraint_System cs;
+  cs.insert(y >= 6);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::CC76_narrowing_assign(bd2, cs): it is
+    // illegal to apply this function to two polyhedra that are not
+    // dimension-compatible.
+    bd2.CC76_narrowing_assign(bd1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/closure1.cc b/tests/BD_Shape/closure1.cc
new file mode 100644
index 0000000..4deacea
--- /dev/null
+++ b/tests/BD_Shape/closure1.cc
@@ -0,0 +1,379 @@
+/* Test shortest path closure.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+struct Edge {
+  unsigned int from;
+  unsigned int to;
+  unsigned long distance;
+};
+
+Edge hawaii[] = {
+  { 0, 1, 6191 },
+  { 1, 0, 6191 },
+  { 2, 3, 4147 },
+  { 3, 2, 4147 },
+  { 4, 5, 3884 },
+  { 5, 4, 3884 },
+  { 5, 6, 1609 },
+  { 6, 5, 1609 },
+  { 7, 0, 12521 },
+  { 0, 7, 12521 },
+  { 8, 1, 2872 },
+  { 1, 8, 2872 },
+  { 9, 10, 4036 },
+  { 10, 9, 4036 },
+  { 4, 11, 2959 },
+  { 11, 4, 2959 },
+  { 12, 13, 27415 },
+  { 13, 12, 27415 },
+  { 14, 15, 6068 },
+  { 15, 14, 6068 },
+  { 15, 16, 7337 },
+  { 16, 15, 7337 },
+  { 17, 18, 2894 },
+  { 18, 17, 2894 },
+  { 18, 19, 5425 },
+  { 19, 18, 5425 },
+  { 20, 21, 2265 },
+  { 21, 20, 2265 },
+  { 19, 20, 3008 },
+  { 20, 19, 3008 },
+  { 21, 12, 6654 },
+  { 12, 21, 6654 },
+  { 22, 23, 1563 },
+  { 23, 22, 1563 },
+  { 23, 24, 3470 },
+  { 24, 23, 3470 },
+  { 25, 26, 6536 },
+  { 26, 25, 6536 },
+  { 27, 28, 10373 },
+  { 28, 27, 10373 },
+  { 28, 29, 7866 },
+  { 29, 28, 7866 },
+  { 29, 30, 8961 },
+  { 30, 29, 8961 },
+  { 31, 32, 6954 },
+  { 32, 31, 6954 },
+  { 33, 34, 24135 },
+  { 34, 33, 24135 },
+  { 34, 35, 5943 },
+  { 35, 34, 5943 },
+  { 33, 36, 2389 },
+  { 36, 33, 2389 },
+  { 35, 37, 3374 },
+  { 37, 35, 3374 },
+  { 34, 38, 4494 },
+  { 38, 34, 4494 },
+  { 37, 38, 8295 },
+  { 38, 37, 8295 },
+  { 38, 39, 12091 },
+  { 39, 38, 12091 },
+  { 39, 40, 4356 },
+  { 40, 39, 4356 },
+  { 39, 30, 3986 },
+  { 30, 39, 3986 },
+  { 29, 41, 3937 },
+  { 41, 29, 3937 },
+  { 41, 28, 7159 },
+  { 28, 41, 7159 },
+  { 42, 43, 3887 },
+  { 43, 42, 3887 },
+  { 43, 44, 3685 },
+  { 44, 43, 3685 },
+  { 43, 45, 20903 },
+  { 45, 43, 20903 },
+  { 45, 46, 2226 },
+  { 46, 45, 2226 },
+  { 47, 44, 7487 },
+  { 44, 47, 7487 },
+  { 44, 48, 22511 },
+  { 48, 44, 22511 },
+  { 46, 48, 7280 },
+  { 48, 46, 7280 },
+  { 48, 49, 3112 },
+  { 49, 48, 3112 },
+  { 49, 50, 2530 },
+  { 50, 49, 2530 },
+  { 50, 51, 17408 },
+  { 51, 50, 17408 },
+  { 45, 52, 15249 },
+  { 52, 45, 15249 },
+  { 53, 54, 36470 },
+  { 54, 53, 36470 },
+  { 54, 49, 7694 },
+  { 49, 54, 7694 },
+  { 51, 55, 11400 },
+  { 55, 51, 11400 },
+  { 52, 46, 15473 },
+  { 46, 52, 15473 },
+  { 55, 56, 37433 },
+  { 56, 55, 37433 },
+  { 53, 57, 3855 },
+  { 57, 53, 3855 },
+  { 57, 58, 1508 },
+  { 58, 57, 1508 },
+  { 59, 60, 3574 },
+  { 60, 59, 3574 },
+  { 59, 53, 7377 },
+  { 53, 59, 7377 },
+  { 58, 60, 6801 },
+  { 60, 58, 6801 },
+  { 60, 61, 9191 },
+  { 61, 60, 9191 },
+  { 61, 62, 3940 },
+  { 62, 61, 3940 },
+  { 62, 63, 1941 },
+  { 63, 62, 1941 },
+  { 63, 64, 17861 },
+  { 64, 63, 17861 },
+  { 65, 66, 12138 },
+  { 66, 65, 12138 },
+  { 66, 67, 5764 },
+  { 67, 66, 5764 },
+  { 68, 62, 2365 },
+  { 62, 68, 2365 },
+  { 69, 70, 14756 },
+  { 70, 69, 14756 },
+  { 70, 71, 3931 },
+  { 71, 70, 3931 },
+  { 71, 72, 6955 },
+  { 72, 71, 6955 },
+  { 69, 73, 4265 },
+  { 73, 69, 4265 },
+  { 73, 56, 5278 },
+  { 56, 73, 5278 },
+  { 74, 75, 1088 },
+  { 75, 74, 1088 },
+  { 76, 77, 2549 },
+  { 77, 76, 2549 },
+  { 78, 79, 2029 },
+  { 79, 78, 2029 },
+  { 80, 81, 4607 },
+  { 81, 80, 4607 },
+  { 81, 82, 995 },
+  { 82, 81, 995 },
+  { 82, 83, 5708 },
+  { 83, 82, 5708 },
+  { 83, 84, 1015 },
+  { 84, 83, 1015 },
+  { 85, 86, 2592 },
+  { 86, 85, 2592 },
+  { 86, 75, 9272 },
+  { 75, 86, 9272 },
+  { 86, 87, 1549 },
+  { 87, 86, 1549 },
+  { 87, 88, 1155 },
+  { 88, 87, 1155 },
+  { 85, 84, 8375 },
+  { 84, 85, 8375 },
+  { 84, 89, 3022 },
+  { 89, 84, 3022 },
+  { 89, 90, 6455 },
+  { 90, 89, 6455 },
+  { 80, 91, 2912 },
+  { 91, 80, 2912 },
+  { 78, 92, 2087 },
+  { 92, 78, 2087 },
+  { 91, 76, 7736 },
+  { 76, 91, 7736 },
+  { 88, 85, 2143 },
+  { 85, 88, 2143 },
+  { 93, 8, 9507 },
+  { 8, 93, 9507 },
+  { 89, 88, 9385 },
+  { 88, 89, 9385 },
+  { 64, 65, 24795 },
+  { 65, 64, 24795 },
+  { 54, 94, 32035 },
+  { 94, 54, 32035 },
+  { 94, 56, 35025 },
+  { 56, 94, 35025 },
+  { 69, 95, 25243 },
+  { 95, 69, 25243 },
+  { 67, 96, 30757 },
+  { 96, 67, 30757 },
+  { 96, 97, 859 },
+  { 97, 96, 859 },
+  { 97, 95, 3230 },
+  { 95, 97, 3230 },
+  { 1, 9, 16155 },
+  { 9, 1, 16155 },
+  { 98, 51, 11706 },
+  { 51, 98, 11706 },
+  { 75, 99, 51590 },
+  { 99, 75, 51590 },
+  { 11, 100, 23417 },
+  { 100, 11, 23417 },
+  { 100, 101, 12368 },
+  { 101, 100, 12368 },
+  { 102, 103, 4846 },
+  { 103, 102, 4846 },
+  { 103, 104, 2901 },
+  { 104, 103, 2901 },
+  { 10, 104, 7849 },
+  { 104, 10, 7849 },
+  { 104, 2, 2147 },
+  { 2, 104, 2147 },
+  { 2, 102, 1761 },
+  { 102, 2, 1761 },
+  { 102, 4, 4444 },
+  { 4, 102, 4444 },
+  { 74, 105, 8183 },
+  { 105, 74, 8183 },
+  { 106, 107, 7075 },
+  { 107, 106, 7075 },
+  { 89, 107, 1178 },
+  { 107, 89, 1178 },
+  { 108, 81, 1312 },
+  { 81, 108, 1312 },
+  { 81, 109, 1793 },
+  { 109, 81, 1793 },
+  { 82, 108, 1001 },
+  { 108, 82, 1001 },
+  { 108, 80, 7421 },
+  { 80, 108, 7421 },
+  { 110, 92, 434 },
+  { 92, 110, 434 },
+  { 92, 79, 3285 },
+  { 79, 92, 3285 },
+  { 79, 99, 2706 },
+  { 99, 79, 2706 },
+  { 111, 78, 3052 },
+  { 78, 111, 3052 },
+  { 77, 111, 2036 },
+  { 111, 77, 2036 },
+  { 24, 25, 2634 },
+  { 25, 24, 2634 },
+  { 25, 21, 1832 },
+  { 21, 25, 1832 },
+  { 33, 112, 14461 },
+  { 112, 33, 14461 },
+  { 113, 114, 7998 },
+  { 114, 113, 7998 },
+  { 41, 115, 6937 },
+  { 115, 41, 6937 },
+  { 32, 116, 47595 },
+  { 116, 32, 47595 },
+  { 99, 117, 3887 },
+  { 117, 99, 3887 },
+  { 117, 118, 736 },
+  { 118, 117, 736 },
+  { 85, 83, 9281 },
+  { 83, 85, 9281 },
+  { 118, 80, 4823 },
+  { 80, 118, 4823 },
+  { 77, 119, 22341 },
+  { 119, 77, 22341 },
+  { 56, 120, 1612 },
+  { 120, 56, 1612 },
+  { 79, 121, 3258 },
+  { 121, 79, 3258 },
+  { 52, 57, 25357 },
+  { 57, 52, 25357 },
+  { 99, 121, 1646 },
+  { 121, 99, 1646 },
+  { 121, 76, 1359 },
+  { 76, 121, 1359 },
+  { 37, 27, 3890 },
+  { 27, 37, 3890 },
+  { 27, 31, 5066 },
+  { 31, 27, 5066 },
+  { 122, 123, 2556 },
+  { 123, 122, 2556 },
+  { 90, 122, 947 },
+  { 122, 90, 947 },
+  { 122, 124, 911 },
+  { 124, 122, 911 },
+  { 124, 125, 23829 },
+  { 125, 124, 23829 },
+  { 91, 119, 7911 },
+  { 119, 91, 7911 },
+};
+
+const mpq_class&
+perturbate(unsigned long a) {
+  static mpq_class q;
+  q = a;
+  q = (q*q)/(q-1);
+  return q;
+}
+
+template <typename T>
+void
+add_edges(BD_Shape<T>& bd, const Edge* edges, unsigned n) {
+  for (unsigned i = 0; i < n; ++i) {
+    const mpq_class& q = perturbate(edges[i].distance);
+    Coefficient a;
+    assign_r(a, q.get_den(), ROUND_NOT_NEEDED);
+    Coefficient b;
+    assign_r(b, q.get_num(), ROUND_NOT_NEEDED);
+
+    nout << "a = " << a << "; b = " << b << endl;
+
+    bd.add_constraint(a*Variable(edges[i].from) - a*Variable(edges[i].to)
+		      <= b);
+  }
+}
+
+} // namespace
+
+#define DISTANCE(To, Temp)			       \
+  do { \
+    Checked_Number<To, Extended_Number_Policy> distance; \
+    rectilinear_distance_assign<Temp>(distance, qbd1, qbd2, ROUND_UP); \
+    nout << "Rectilinear distance<" #To ", " #Temp "> = " << distance \
+         << endl; \
+    euclidean_distance_assign<Temp>(distance, qbd1, qbd2, ROUND_UP); \
+    nout << "Euclidean distance<" #To ", " #Temp "> = " << distance \
+         << endl; \
+    l_infinity_distance_assign<Temp>(distance, qbd1, qbd2, ROUND_UP); \
+    nout << "L-infinity distance<" #To ", " #Temp "> = " << distance \
+         << endl; \
+  } while (0)
+
+bool test01() {
+  BD_Shape<mpq_class> qbd1(126);
+  add_edges(qbd1, hawaii, sizeof(hawaii)/sizeof(Edge));
+
+  TBD_Shape tbd(126);
+  add_edges(tbd, hawaii, sizeof(hawaii)/sizeof(Edge));
+
+  BD_Shape<mpq_class> qbd2(tbd);
+  if (!qbd2.contains(qbd1))
+    return false;
+
+  // FIXME!!!
+#if 1
+  DISTANCE(double, float);
+  DISTANCE(double, mpq_class);
+  DISTANCE(int, double);
+#endif
+  return true;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/concatenate1.cc b/tests/BD_Shape/concatenate1.cc
new file mode 100644
index 0000000..3ddda80
--- /dev/null
+++ b/tests/BD_Shape/concatenate1.cc
@@ -0,0 +1,203 @@
+/* Test BD_Shape::concatenate_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  // Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  // Variable x7(6);
+  Variable x8(7);
+  Variable x9(8);
+
+  TBD_Shape bd1(6);
+  bd1.add_constraint(x2 - x3 <= 0);
+  bd1.add_constraint(x3 <= 2);
+  bd1.add_constraint(x6 - x5 <= 2);
+  bd1.add_constraint(x5 <= 3);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(x2 - x3 <= 2);
+  bd2.add_constraint(x3 <= 7);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.concatenate_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(9);
+  known_result.add_constraint(x2 - x3 <= 0);
+  known_result.add_constraint(x3 <= 2);
+  known_result.add_constraint(x6 - x5 <= 2);
+  known_result.add_constraint(x5 <= 3);
+  known_result.add_constraint(x8 - x9 <= 2);
+  known_result.add_constraint(x9 <= 7);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.concatenate_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x <= 3);
+  bd1.add_constraint(x - y <= 4);
+
+  TBD_Shape bd2(0, EMPTY);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd2.concatenate_assign(bd1);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+  print_constraints(bd2, "*** bd2.concatenate_assign(bd1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x <= 0);
+  cs.insert(y == 3);
+  cs.insert(3*x - 3*y <= 5);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraints(cs);
+
+  TBD_Shape bd2(0);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.concatenate_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 0);
+  known_result.add_constraint(y == 3);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.concatenate_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(A >= 0);
+  bd1.add_constraint(B >= 0);
+  bd1.add_constraint_and_minimize(C >= 0);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A >= 0);
+  bd2.add_constraint(A <= 1);
+  bd2.add_constraint(B >= 0);
+  bd2.add_constraint(B <= 2);
+  bd2.add_constraint(A - B <= 0);
+  bd2.add_constraint_and_minimize(B - A <= 1);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.concatenate_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D <= 1);
+  known_result.add_constraint(E >= 0);
+  known_result.add_constraint(E <= 2);
+  known_result.add_constraint(D - E <= 0);
+  known_result.add_constraint(E - D <= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.concatenate_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x <= 3);
+  bd1.add_constraint(x - y <= 4);
+
+  TBD_Shape bd2(0, EMPTY);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.concatenate_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.concatenate_assign(bd2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/constraints1.cc b/tests/BD_Shape/constraints1.cc
new file mode 100644
index 0000000..6e3569c
--- /dev/null
+++ b/tests/BD_Shape/constraints1.cc
@@ -0,0 +1,124 @@
+/* Test BD_Shape::constraints().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBD_Shape bd1(0, EMPTY);
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  Constraint_System cs = bd1.constraints();
+  TBD_Shape bd2(cs);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bd1(0, UNIVERSE);
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  Constraint_System cs = bd1.constraints();
+  TBD_Shape bd2(cs);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(A >= 0);
+  bd1.add_constraint(B >= 0);
+  bd1.add_constraint(B - C >= 1);
+  bd1.add_constraint(C - A <= 9);
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  bd1.contains(bd1);
+
+  Constraint_System cs = bd1.constraints();
+  TBD_Shape bd2(cs);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(A >= 0);
+  bd1.add_constraint(B >= 0);
+  bd1.add_constraint(B - C == 1);
+  bd1.add_constraint(C - A <= 9);
+
+  Constraint_System cs = bd1.constraints();
+  TBD_Shape bd2(cs);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/BD_Shape/contains1.cc b/tests/BD_Shape/contains1.cc
new file mode 100644
index 0000000..6d4afa6
--- /dev/null
+++ b/tests/BD_Shape/contains1.cc
@@ -0,0 +1,124 @@
+/* Test BD_Shape::contains().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x - y <= 1);
+
+  // The BD_Shape is empty, because it has got a negative cycle.
+  TBD_Shape bd2(3);
+  bd2.add_constraint(x - y <= 2);
+  bd2.add_constraint(y - z <= 2);
+  bd2.add_constraint(z - x <= -5);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bool ok = bd1.contains(bd2);
+
+  nout << "*** bd1.contains(bd2) ***"
+       << endl
+       << (ok ? "true" : "false")
+       << endl;
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bd1;
+  TBD_Shape bd2(0, EMPTY);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bool ok = bd1.contains(bd2);
+
+  nout << "*** bd1.contains(bd2) ***"
+       << endl
+       << (ok ? "true" : "false")
+       << endl;
+
+  return ok;
+}
+
+bool
+test03() {
+  TBD_Shape bd1(0, EMPTY);
+  TBD_Shape bd2(0, EMPTY);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bool ok = bd1.contains(bd2);
+
+  nout << "*** bd1.contains(bd2) ***"
+       << endl
+       << (ok ? "true" : "false")
+       << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x - y >= 0);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(x - y == 0);
+
+  try {
+    // This is an invalid use of Polyhedron::contains(): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    bd1.contains(bd2);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/BD_Shape/empty1.cc b/tests/BD_Shape/empty1.cc
new file mode 100644
index 0000000..37e7806
--- /dev/null
+++ b/tests/BD_Shape/empty1.cc
@@ -0,0 +1,206 @@
+/* Different ways of creating an empty BD_Shape.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd1(4);
+  TBD_Shape bd2(4);
+
+  bd1.add_constraint(-x <= 4);
+  bd1.add_constraint(y - x <= 0);
+  bd1.add_constraint(x - y <= -5);
+
+  bool empty = bd1.is_empty();
+
+  nout << "*** bd1.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false ") << endl;
+
+  bd2.add_constraint(-x <= 4);
+  bd2.add_constraint(y - x <= 0);
+  bd2.add_constraint(x - y <= 5);
+  bd2.add_constraint(z - x <= 1);
+
+  bool empty1 = bd2.is_empty();
+
+  nout << "*** bd2.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  return !empty1 && empty;
+
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd1(4);
+  TBD_Shape bd2(4);
+
+  bd1.add_constraint(-x <= 2);
+  bd1.add_constraint(y - x <= -9);
+  bd1.add_constraint(x - y <= -7);
+
+  bool empty = bd1.is_empty();
+
+  print_constraints(bd1, "*** bd1 ***");
+  nout << "*** bd1.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  bd2.add_constraint(-x <= 7);
+  bd2.add_constraint(y - x <= 1);
+  bd2.add_constraint(-y <= 2);
+  bd2.add_constraint(z - x <= 1);
+
+  bool empty1 = bd2.is_empty();
+
+  print_constraints(bd2, "*** bd2 ***");
+  nout << "*** bd2.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  return !empty1 && empty;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  // Variable x6(5);
+
+  TBD_Shape bd1(6);
+  TBD_Shape bd2(6);
+
+  bd1.add_constraint(x1 <= 3);
+  bd1.add_constraint(x4 <= 3);
+  bd1.add_constraint(x2 - x1 <= 0);
+  bd1.add_constraint(x3 - x1 <= -2);
+  bd1.add_constraint(x5 - x1 <= 2);
+  bd1.add_constraint(-x2 <= 0);
+  bd1.add_constraint(x3 - x2 <= 5);
+  bd1.add_constraint(x4 - x3 <= -6);
+  bd1.add_constraint(x1 - x4 <= 5);
+  bd1.add_constraint(x5 - x4 <= 2);
+  bd1.add_constraint(-x5 <= -5);
+  bd1.add_constraint(x3 - x5 <= 7);
+
+  bool empty = bd1.is_empty();
+
+  nout << "*** bd1.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  bd2.add_constraint(x1 <= 3);
+  bd2.add_constraint(x4 <= 3);
+  bd2.add_constraint(x2 - x1 <= 0);
+  bd2.add_constraint(x3 - x1 <= 2);
+  bd2.add_constraint(x5 - x1 <= 2);
+  bd2.add_constraint(-x2 <= 0);
+  bd2.add_constraint(x3 - x2 <= 5);
+  bd2.add_constraint(x4 - x3 <= 6);
+  bd2.add_constraint(x1 - x4 <= 5);
+  bd2.add_constraint(x5 - x4 <= 2);
+  bd2.add_constraint(-x5 <= 5);
+  bd2.add_constraint(x3 - x5 <= 7);
+
+  bool empty1 = bd2.is_empty();
+
+  nout << "*** bd2.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  return !empty1 && empty;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+
+  bd.add_constraint(A == 0);
+  bd.add_constraint(C >= 0);
+  bd.add_constraint(B - C >= 1);
+
+  bool empty = bd.is_empty();
+
+  print_constraints(bd, "*** bd ***");
+  nout << "*** bd.is_empty() ***"
+       << endl
+       << (empty ? "true" : "false") << endl;
+
+  return !empty;
+}
+
+bool
+test05() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  TBD_Shape bd(5);
+
+  Coefficient a;
+  if (std::numeric_limits<Coefficient>::is_bounded)
+    a = -(std::numeric_limits<Coefficient>::min()/2) + 1;
+  else
+    a = 1300000000;
+
+  bd.add_constraint(x1 - x2 <= -a);
+  bd.add_constraint(x2 - x3 <= -a);
+  bd.add_constraint(x3 - x4 <= a);
+  bd.add_constraint(x4 - x5 <= a);
+  bd.add_constraint(x5 - x1 <= a);
+
+  print_constraints(bd, "*** bd ***");
+
+  bool empty = bd.is_empty();
+
+  nout << "*** bd.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  return !empty;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
+
diff --git a/tests/BD_Shape/equality1.cc b/tests/BD_Shape/equality1.cc
new file mode 100644
index 0000000..19d1fb7
--- /dev/null
+++ b/tests/BD_Shape/equality1.cc
@@ -0,0 +1,131 @@
+/* Test BD_Shape::operator==().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bd1(3);
+  TBD_Shape bd2(2);
+
+  bd1.add_constraint(x <= 3);
+  bd1.add_constraint(x - y <= 4);
+
+  bd2.add_constraint(x - y <= 5);
+  bd2.add_constraint(-y <= -2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bool known_result = false;
+  bool ok = ((bd1 == bd2) == known_result);
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bd1(0, EMPTY);
+  TBD_Shape bd2(0);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bool known_result = false;
+  bool ok = ((bd1 == bd2) == known_result);
+
+  return ok;
+}
+
+bool
+test03() {
+  TBD_Shape bd1(0);
+  TBD_Shape bd2(0, EMPTY);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bool known_result = false;
+  bool ok = ((bd1 == bd2) == known_result);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A - B <= 1);
+  bd1.add_constraint(B - A <= -2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A - B <= 1);
+  bd2.add_constraint(B - A <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bool known_result = false;
+  bool ok = ((bd1 == bd2) == known_result);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A - B <= 1);
+  bd1.add_constraint(B - A <= 2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A - B <= 1);
+  bd2.add_constraint(B - A <= -2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bool known_result = false;
+  bool ok = ((bd1 == bd2) == known_result);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/fromgensys1.cc b/tests/BD_Shape/fromgensys1.cc
new file mode 100644
index 0000000..1294e03
--- /dev/null
+++ b/tests/BD_Shape/fromgensys1.cc
@@ -0,0 +1,163 @@
+/* Test BD_Shape::BD_Shape(const Generator_System&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Generator_System gs;
+  TBD_Shape bd(gs);
+
+  BD_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable V(10);
+
+  Generator_System gs;
+  gs.insert(closure_point(V));
+
+  try {
+    // It is illegal to build a BD_Shape starting from a non-empty
+    // generator system having no points.
+    TBD_Shape bd(gs);
+
+    // It is an error if the exception is not thrown.
+    return false;
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    return false;
+  }
+  return true;
+}
+
+bool
+test03() {
+  Variable V(10);
+
+  Generator_System gs;
+  gs.insert(ray(V));
+
+  try {
+    // It is illegal to build a BD_Shape starting from a non-empty
+    // generator system having no points.
+    TBD_Shape bd(gs);
+
+    // It is an error if the exception is not thrown.
+    return false;
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    return false;
+  }
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(ray(A + B));
+  gs.insert(point(1*A + 2*B + 3*C + 4*D));
+  gs.insert(point(2*A + 3*B + 4*C + 5*D));
+  TBD_Shape bd(gs);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(C >= 3);
+  known_result.add_constraint(C <= 4);
+  known_result.add_constraint(D >= 4);
+  known_result.add_constraint(D <= 5);
+  known_result.add_constraint(A == B-1);
+  known_result.add_constraint(C == D-1);
+  known_result.add_constraint(C <= A+2);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(A >= B);
+  ph.add_constraint(B >= 2*C);
+  ph.add_constraint(C >= 3*D);
+  ph.add_constraint(D >= 4);
+  ph.add_constraint(A-D <= 50);
+
+  TBD_Shape bd(ph.generators());
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(C <= 30);
+  known_result.add_constraint(D >= 4);
+  known_result.add_constraint(D <= 10);
+  known_result.add_constraint(B - A <= 0);
+  known_result.add_constraint(A - D <= 50);
+  known_result.add_constraint(B - C >= 12);
+  known_result.add_constraint(C - D <= 23);
+  known_result.add_constraint(C - D >= 8);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffineimage1.cc b/tests/BD_Shape/generalizedaffineimage1.cc
new file mode 100644
index 0000000..18b4a29
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffineimage1.cc
@@ -0,0 +1,592 @@
+/* Test BD_Shape::generalized_affine_image().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(A <= 4);
+  bd.add_constraint(B <= 5);
+  bd.add_constraint(A <= B);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, A+2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B - A >= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.generalized_affine_image"
+		        "(B, GREATER_THAN_OR_EQUAL, A+2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(B >= 0);
+  bd.add_constraint(A - B >= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  BD_Shape<mpq_class> known_result(bd);
+
+  bd.generalized_affine_image(A, EQUAL, A + 2);
+
+  known_result.affine_image(A, A + 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.generalized_affine_image"
+		    "(A, EQUAL, A + 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2, EMPTY);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(A, LESS_THAN_OR_EQUAL, B + 1);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.generalized_affine_image"
+		    "(A, LESS_THAN_OR_EQUAL, B + 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(3);
+
+  bd.add_constraint(x >= 2);
+  bd.add_constraint(x - y <= 3);
+  bd.add_constraint(y <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(x,GREATER_THAN_OR_EQUAL, 2*x - 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x >= 1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(- y <= 1);
+  known_result.add_constraint(x - y >= -1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.generalized_affine_image(x, "
+                        "GREATER_THAN_OR_EQUAL, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(x >= 2);
+  bd.add_constraint(x - y <= 3);
+  bd.add_constraint(y <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(y,GREATER_THAN_OR_EQUAL, 2*x - 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x >= 2);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y >= x - 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.generalized_affine_image(y, "
+                        "GREATER_THAN_OR_EQUAL, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A);
+  Linear_Expression e2(A);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(A <= 4);
+  bd.add_constraint(B <= 5);
+  bd.add_constraint(A <= B);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(e1, GREATER_THAN_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.generalized_affine_image(A, "
+                        "GREATER_THAN_OR_EQUAL, A) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(A <= 4);
+  bd.add_constraint(B <= 5);
+  bd.add_constraint(A - B <= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, Linear_Expression(1));
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.generalized_affine_image(A, "
+                        "GREATER_THAN_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(A <= 4);
+  bd.add_constraint(B <= 5);
+  bd.add_constraint(A - B <= 0);
+  bd.add_constraint(B - C == 2);
+  bd.add_constraint(C - A <= -2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(-B, LESS_THAN_OR_EQUAL, Linear_Expression(1));
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(A - C == 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(B >= -1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.generalized_affine_image(-B, "
+                        "LESS_THAN_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C);
+  Linear_Expression e2(A + 1);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(A <= 4);
+  bd.add_constraint(B <= 5);
+  bd.add_constraint(C <= 2);
+  bd.add_constraint(C - A <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(e1, LESS_THAN_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B <= 5);
+  known_result.add_constraint(C - A <= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.generalized_affine_image(C, "
+                        "LESS_THAN_OR_EQUAL, A + 1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(A <= 4);
+  bd.add_constraint(B <= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(A, LESS_THAN_OR_EQUAL, Linear_Expression(1));
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.generalized_affine_image(A, "
+                        "LESS_THAN_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x == 4);
+  bd.add_constraint(y <= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(3*x + 2, LESS_THAN_OR_EQUAL, 2*x - 3);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_image(3*x + 2, "
+		    "LESS_THAN_OR_EQUAL, 2*x - 3) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x - y <= 7);
+  bd.add_constraint(y >= 1);
+
+  print_constraints(bd, "*** bd ***");
+
+  BD_Shape<mpq_class> known_result(bd);
+
+  bd.generalized_affine_image(Linear_Expression(6), EQUAL, 3*x - 4);
+
+  known_result.add_constraint(3*x == 10);
+
+  bool ok = check_result(bd, known_result, "3.98e-7", "2.39e-7", "1.59e-7");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_image(6, EQUAL, 3*x - 4) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(B >= 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(2*B + 3*A,
+			      LESS_THAN_OR_EQUAL, Linear_Expression(1));
+
+  BD_Shape<mpq_class> known_result(2);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(3*A + 2*B, "
+                        "LESS_THAN_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A == 0);
+  bd.add_constraint(B >= 1);
+
+  print_constraints(bd, "*** bd ***");
+
+  BD_Shape<mpq_class> known_result(bd);
+
+  bd.generalized_affine_image(-2*A + 5, EQUAL, -4*B);
+
+  known_result.affine_image(A, 4*B + 5, 2);
+
+  bool ok = check_result(bd, known_result);
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_image(-2*A + 5, "
+		    "EQUAL, -4*B) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A - B == 0);
+  bd.add_constraint(B <= 1);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(A + 2*B - 5, GREATER_THAN_OR_EQUAL, 3*B);
+
+  BD_Shape<mpq_class> known_result(2);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(A + 2*B - 5, "
+                        "GREATER_THAN_OR_EQUAL, 3*B) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A - B == 0);
+  bd.add_constraint(B <= 1);
+  bd.add_constraint(C - A <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(2*B + C + 1, LESS_THAN_OR_EQUAL, A - 3*B + 2*C);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_image(2*B + C + 1, "
+		    "LESS_THAN_OR_EQUAL, A - 3*B + 2*C) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A - B == 0);
+  bd.add_constraint(B <= 1);
+  bd.add_constraint(C - A <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(2*B + C + 1,
+			      GREATER_THAN_OR_EQUAL, A - 3*B + 2*C);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(2*B + C + 1, "
+		        "GREATER_THAN_OR_EQUAL, A - 3*B + 2*C) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A - B == 0);
+  bd.add_constraint(B <= 1);
+  bd.add_constraint(C - A <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(-2*A - B - 1,
+			      GREATER_THAN_OR_EQUAL, 3*A + B + 4*C - 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 3);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(-2*A - B - 1, "
+                        "GREATER_THAN_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A - B == 0);
+  bd.add_constraint(B <= 1);
+  bd.add_constraint(C - A <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(-2*C + 3, LESS_THAN_OR_EQUAL, -3*B + 4);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(-2*C + 3, "
+                        "LESS_THAN_OR_EQUAL, -3*B + 4) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A - B == 0);
+  bd.add_constraint(B <= 1);
+  bd.add_constraint(C + A <=2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(Linear_Expression(3),
+			      GREATER_THAN_OR_EQUAL,
+			      Linear_Expression(4));
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_image(3, "
+		    "GREATER_THAN_OR_EQUAL, 4) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffineimage2.cc b/tests/BD_Shape/generalizedaffineimage2.cc
new file mode 100644
index 0000000..a467da6
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffineimage2.cc
@@ -0,0 +1,516 @@
+/* Test BD_Shape::generalized_affine_image().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 4);
+  bd.add_constraint(x >= -6);
+  bd.add_constraint(y == 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(y, LESS_THAN_OR_EQUAL, -y + 1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 4);
+  known_result.add_constraint(x >= -6);
+  known_result.add_constraint(y <= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(y, "
+                        "LESS_THAN_OR_EQUAL, -y + 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 4);
+  bd.add_constraint(x >= -6);
+  bd.add_constraint(y == 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(x, GREATER_THAN_OR_EQUAL, -x - 3);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= -7);
+  known_result.add_constraint(y == 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(x, "
+		        "GREATER_THAN_OR_EQUAL, -x - 3) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(B <= 1);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(B, LESS_THAN_OR_EQUAL, 3*B + 1, 2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(B, "
+		        "LESS_THAN_OR_EQUAL, 3*B + 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A == 0);
+  bd.add_constraint(B >= 1);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, B - 2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B >= -1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(B, "
+		        "GREATER_THAN_OR_EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(B <= 1);
+  bd.add_constraint(A - B == 0);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, 2*A + 3, 2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(2*B - 2*A <= -3);
+
+  bool ok = check_result(bd, known_result, "7.63e-17", "3.82e-17", "1.91e-17");
+
+  print_constraints(bd, "*** bd.generalized_affine_image(A, "
+		        "GREATER_THAN_OR_EQUAL, 2*A + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A - B == 0);
+  bd.add_constraint(B <= 1);
+  bd.add_constraint(C - A <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(C, LESS_THAN_OR_EQUAL, 2*C + 1, 5);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(5*C <= 7);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = check_result(bd, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(bd, "*** bd.generalized_affine_image(C, "
+                        "LESS_THAN_OR_EQUAL, 2*C + 1, 5) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A - B == 0);
+  bd.add_constraint(B <= 1);
+  bd.add_constraint(C - A <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  BD_Shape<mpq_class> known_result(bd);
+
+  bd.generalized_affine_image(C, EQUAL, 5*C - 3, 4);
+
+  known_result.affine_image(C, 5*C - 3, 4);
+
+  bool ok = check_result(bd, known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(C, "
+		        "EQUAL, 5*C - 3, 4) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A - B == 0);
+  bd.add_constraint(B <= 1);
+  bd.add_constraint(C - A <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, -B - 2, 3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -1);
+  known_result.add_constraint(C - A <= 2);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(B, "
+                        "GREATER_THAN_OR_EQUAL, -B - 2, 3) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A - B == 0);
+  bd.add_constraint(B <= 1);
+  bd.add_constraint(C - A <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(B, LESS_THAN_OR_EQUAL, 4*A -2*C + 3, -3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(C - A <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(B, "
+                        "LESS_THAN_OR_EQUAL, 4*A - 2*C + 3, -3) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A - B == 0);
+  bd.add_constraint(B <= 1);
+  bd.add_constraint(C - A <=2);
+
+  print_constraints(bd, "*** bd ***");
+
+  BD_Shape<mpq_class> known_result(bd);
+
+  bd.generalized_affine_image(B, EQUAL, 2*A - 4*B + C + 3, 3);
+
+  known_result.affine_image(B, 2*A - 4*B + C + 3, 3);
+
+  bool ok = check_result(bd, known_result);
+
+  print_constraints(bd, "*** bd.generalized_affine_image(B, "
+		        "EQUAL, 2*A - 4*B + C + 3, 3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A);
+  Linear_Expression e2(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(A <= 4);
+  bd.add_constraint(B <= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(e1, EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.generalized_affine_image(A, EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(B - 3);
+  Linear_Expression e2(B + 1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+  bd.add_constraint(A <= 4);
+  bd.add_constraint(B <= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_image(e1, EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B <= 9);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.generalized_affine_image(B-3,EQUAL, B+1) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the function
+    // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to use a strict relation symbol.
+    bd.generalized_affine_image(x, LESS_THAN, x + 1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the function
+    // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to use a strict relation symbol.
+    bd.generalized_affine_image(x, GREATER_THAN, x + 1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the function
+    // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to apply to a expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    bd.generalized_affine_image(x, LESS_THAN_OR_EQUAL, x + 1, d);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the function
+    // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greather than the BDS's space dimension.
+    bd.generalized_affine_image(y, GREATER_THAN_OR_EQUAL, z);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of the function
+    // BD_Shape::generalized_affine_image(lhs, r, rhs):
+    // it is illegal to use a variable in the `rhs' expression that
+    // does not appear in the BDS.
+
+    bd.generalized_affine_image(A + B, GREATER_THAN_OR_EQUAL, B + C);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of function
+    // BD_Shape::generalized_affine_image(lhs, r, rhs):
+    // it is illegal to use a variable in the `lhs' expression that
+    // does not appear in the BDS.
+    bd.generalized_affine_image(B + C, LESS_THAN_OR_EQUAL, A + 1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffinepreimage1.cc b/tests/BD_Shape/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..3fb01e8
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffinepreimage1.cc
@@ -0,0 +1,477 @@
+/* Test BD_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(2*A == 1);
+  bd.add_constraint(B >= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL,
+				 Linear_Expression(-1));
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A == 1);
+
+  bool ok = check_result(bd, known_result);
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "GREATER_THAN_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(2*A == 1);
+  bd.add_constraint(B >= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, Linear_Expression(-1));
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "LESS_THAN_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(4*A == 1);
+  bd.add_constraint(B >= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -B+1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A == 1);
+  known_result.add_constraint(-B >= 4);
+
+  bool ok = check_result(bd, known_result);
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "LESS_THAN_OR_EQUAL, -B+1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(4*A == 1);
+  bd.add_constraint(B >= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, B+1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A == 1);
+  known_result.add_constraint(B >= 4);
+
+  bool ok = check_result(bd, known_result);
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "LESS_THAN_OR_EQUAL, B+1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(7*A == 1);
+  bd.add_constraint(B >= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, 2*B+1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(7*A == 1);
+  known_result.add_constraint(B >= 2);
+
+  bool ok = check_result(bd, known_result, "2.13e-8", "1.25e-8", "8.52e-9");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "LESS_THAN_OR_EQUAL, 2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(5*A == 1);
+  bd.add_constraint(B >= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -2*B+1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(5*A == 1);
+  known_result.add_constraint(-B >= 2);
+
+  bool ok = check_result(bd, known_result, "2.69e-8", "1.72e-8", "1.20e-8");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "LESS_THAN_OR_EQUAL, -2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(3*A == 1);
+  bd.add_constraint(B >= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, 3*A-2*B+1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(-2*B >= 3);
+
+  bool ok = check_result(bd, known_result, "2.89e-7", "1.85e-7", "1.40e-7");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "LESS_THAN_OR_EQUAL, 3*A-2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(3*A == 1);
+  bd.add_constraint(B >= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -3*A-2*B+1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(-2*B >= 5);
+
+  bool ok = check_result(bd, known_result, "5.27e-7", "3.53e-7", "2.59e-7");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "LESS_THAN_OR_EQUAL, -3*A-2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(3*A == 1);
+  bd.add_constraint(2*B >= 7);
+  bd.add_constraint(3*C <= 7);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*B <= 14);
+  known_result.add_constraint(3*B - 3*A <= 13);
+  known_result.add_constraint(3*B - 3*C <= 7);
+  known_result.add_constraint(3*C <= 7);
+
+  bool ok = check_result(bd, known_result, "5.48e-6", "2.97e-6", "1.77e-6");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "LESS_THAN_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  // If the Coefficient type is not wide enough, do nothing.
+  if (std::numeric_limits<Coefficient>::is_bounded
+      && (std::numeric_limits<Coefficient>::min() > -203
+	  || std::numeric_limits<Coefficient>::max() < 629))
+    return true;
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(3*A == 1);
+  bd.add_constraint(2*B >= 7);
+  bd.add_constraint(3*C <= 7);
+  bd.add_constraint(5*C >= 7);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(20*B <= -203);
+  known_result.add_constraint(60*A - 60*B >= 629);
+  known_result.add_constraint(20*C - 20*B >= 231);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(bd, known_result, "4.48e-6", "2.36e-6", "1.36e-6");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "LESS_THAN_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(3*A == 1);
+  bd.add_constraint(2*B >= 7);
+  bd.add_constraint(3*C <= 7);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*C <= 7);
+
+  bool ok = check_result(bd, known_result, "3.68e-7", "2.41e-7", "1.79e-7");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "LESS_THAN_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(3*A == 1);
+  bd.add_constraint(2*B >= 7);
+  bd.add_constraint(3*C <= 7);
+  bd.add_constraint(5*C >= 7);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, -3*A-2*B-7*C+1, -3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(12*B >= -35);
+  known_result.add_constraint(4*A - 4*B <= 13);
+  known_result.add_constraint(4*C - 4*B <= 21);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(bd, known_result, "5.13e-6", "2.73e-6", "1.67e-6");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "LESS_THAN_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(3*A == 1);
+  bd.add_constraint(2*B <= 7);
+  bd.add_constraint(3*C <= 7);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*B <= 35);
+  known_result.add_constraint(3*B - 3*A <= 34);
+  known_result.add_constraint(3*B - 3*C <= 28);
+  known_result.add_constraint(3*C <= 7);
+
+  bool ok = check_result(bd, known_result, "7.39e-6", "4.07e-6", "2.55e-6");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "GREATER_THAN_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(3*A == 1);
+  bd.add_constraint(2*B <= 7);
+  bd.add_constraint(3*C <= 7);
+  bd.add_constraint(5*C >= 7);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(20*B <= 27);
+  known_result.add_constraint(60*B - 60*A <= 61);
+  known_result.add_constraint(20*C - 20*B >= 1);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(bd, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "GREATER_THAN_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(3*A == 1);
+  bd.add_constraint(2*B >= 7);
+  bd.add_constraint(3*C <= 7);
+  bd.add_constraint(5*C >= 7);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(bd, known_result, "4.26e-7", "2.44e-7", "1.79e-7");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "GREATER_THAN_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffinepreimage2.cc b/tests/BD_Shape/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..f55e894
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffinepreimage2.cc
@@ -0,0 +1,118 @@
+/* Test BD_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(2*A == 1);
+  bd.add_constraint(B >= 5);
+  bd.add_constraint(3*C <= 7);
+  bd.add_constraint(5*C >= 7);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A == 1);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(bd, known_result, "3.66e-7", "2.28e-7", "1.59e-7");
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(2*A == 1);
+  bd.add_constraint(B <= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL,
+				 Linear_Expression(-1));
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A == 1);
+
+  bool ok = check_result(bd, known_result);
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "GREATER_THAN_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(2*A == 1);
+  bd.add_constraint(B <= 5);
+  bd.add_constraint(3*C <= 8);
+  bd.add_constraint(2*C >= 7);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bd,  known_result);
+
+  print_constraints(bd,
+		    "*** bd.generalized_affine_preimage(B, "
+		    "EQUAL, 3*A+2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/BD_Shape/geomcovers1.cc b/tests/BD_Shape/geomcovers1.cc
new file mode 100644
index 0000000..15a1696
--- /dev/null
+++ b/tests/BD_Shape/geomcovers1.cc
@@ -0,0 +1,69 @@
+/* Test Polyhedra_Powerset<BD_Shape>::geometrically_covers().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  Constraint_System cs1, cs2, cs3, cs4;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 4);
+  cs2.insert(x >= 4);
+  cs2.insert(x <= 6);
+  cs3.insert(x >= 1);
+  cs3.insert(x <= 5);
+  TBD_Shape bd1(cs1), bd2(cs2), bd3(cs3);
+
+  Polyhedra_Powerset<TBD_Shape> ps12(1, EMPTY);
+  ps12.add_disjunct(bd1);
+  ps12.add_disjunct(bd2);
+
+  Polyhedra_Powerset<TBD_Shape> ps3(1, EMPTY);
+  ps3.add_disjunct(bd3);
+
+  using namespace IO_Operators;
+  nout << "ps12 = " << ps12 << endl
+       << " ps3 = " << ps3 << endl;
+
+  if (ps12.geometrically_covers(ps3)) {
+
+    nout << "ps12 covers ps3." << endl;
+
+    return true;
+  }
+  else {
+
+    nout << "ps12 does not cover ps3." << endl;
+
+    return false;
+  }
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/h79widening1.cc b/tests/BD_Shape/h79widening1.cc
new file mode 100644
index 0000000..3b36700
--- /dev/null
+++ b/tests/BD_Shape/h79widening1.cc
@@ -0,0 +1,62 @@
+/* Test BD_Shape::H79_widening_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x <= 1);
+  bd1.add_constraint(x - y <= 2);
+  bd1.add_constraint(y - x <= 7);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(x - y <= 2);
+  bd2.add_constraint(-x <= 3);
+  bd2.add_constraint(x <= 0);
+  bd2.add_constraint(y - x <= 2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.H79_widening_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/intersection1.cc b/tests/BD_Shape/intersection1.cc
new file mode 100644
index 0000000..83b5ea7
--- /dev/null
+++ b/tests/BD_Shape/intersection1.cc
@@ -0,0 +1,324 @@
+/* Test BD_Shape::intersection_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 3);
+  bd1.add_constraint(x - y <= 4);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(-y <= -2);
+  bd2.add_constraint(x - y <= 5);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.intersection_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-y <= -2);
+  known_result.add_constraint(x - y <= 4);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd1(4);
+  bd1.add_constraint(x - y <= 4);
+  bd1.add_constraint(x <= 3);
+
+  TBD_Shape bd2(4);
+  bd2.add_constraint(x - y <= 5);
+  bd2.add_constraint(-y <= -2);
+  bd2.add_constraint(z - x <= 0);
+  bd2.add_constraint(y - z <= -1);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.intersection_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x - y <= 4);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-y <= -2);
+  known_result.add_constraint(z - x <= 0);
+  known_result.add_constraint(y - z <= -1);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 4);
+  bd1.add_constraint(-x <= -1);
+  bd1.add_constraint(y <= 3);
+  bd1.add_constraint(-y <= -1);
+  bd1.add_constraint(x - y <= 1);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(y - x <= -1);
+  bd2.add_constraint(x <= 3);
+  bd2.add_constraint(-y <= 5);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.intersection_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-x <= -1);
+  known_result.add_constraint(y <= 3);
+  known_result.add_constraint(-y <= -1);
+  known_result.add_constraint(y - x <= -1);
+  known_result.add_constraint(x - y <= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 4);
+  bd1.add_constraint(x >= 5);
+  bd1.add_constraint(y <= 3);
+  bd1.add_constraint(y >= 1);
+  bd1.add_constraint(x - y <= 1);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(y - x <= -1);
+  bd2.add_constraint(x <= 3);
+  bd2.add_constraint(y >= -5);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.intersection_assign(bd2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(x <= 4);
+  bd1.add_constraint(x >= 5);
+  bd1.add_constraint(y <= 3);
+  bd1.add_constraint(y >= 1);
+  bd1.add_constraint(x - y <= 1);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(y - x <= -1);
+  bd2.add_constraint(x <= 3);
+  bd2.add_constraint(y >= -5);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd2.intersection_assign(bd1);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+  print_constraints(bd2, "*** bd2.intersection_assign(bd1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TBD_Shape bd1;
+  TBD_Shape bd2;
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  bd1.intersection_assign(bd2);
+
+  BD_Shape<mpq_class> known_result;
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bd1(3);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(y - x <= -1);
+  bd2.add_constraint(x <= 3);
+  bd2.add_constraint(y >= -5);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  BD_Shape<mpq_class> known_result(bd2);
+
+  bd1.intersection_assign(bd2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bd1(3);
+  TBD_Shape bd2(3);
+  bd2.add_constraint(y - x <= -1);
+  bd2.add_constraint(x <= 3);
+  bd2.add_constraint(y >= -5);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  BD_Shape<mpq_class> known_result(bd2);
+
+  bd1.intersection_assign_and_minimize(bd2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x >= y);
+
+  TBD_Shape bd2(3);
+
+  try {
+    // This is an invalid use of function
+    // BD_Shape::intersection_assign_and_minimize(bd2): it is illegal
+    // to apply this function to two polyhedra of different dimensions.
+    bd1.intersection_assign_and_minimize(bd2);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test10() {
+  TBD_Shape bd1(7);
+  TBD_Shape bd2(15);
+
+  try {
+    // This is an invalid use of function
+    // BD_Shape::intersection_assign(bd2): it is illegal
+    // to apply this function to two polyhedra of different dimensions.
+    bd1.intersection_assign(bd2);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/BD_Shape/limitedbhmz05extrapolation1.cc b/tests/BD_Shape/limitedbhmz05extrapolation1.cc
new file mode 100644
index 0000000..ba1e521
--- /dev/null
+++ b/tests/BD_Shape/limitedbhmz05extrapolation1.cc
@@ -0,0 +1,526 @@
+/* Test BD_Shape::limited_BHMZ05_extrapolation_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 4);
+
+  Constraint_System cs2;
+  cs2.insert(x <= 0);
+  cs2.insert(y >= 5);
+
+  TBD_Shape bd1(cs1);
+  TBD_Shape bd2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 20);
+  cs.insert(y >= 3);
+
+  print_constraints(bd1, "*** bd1 ****");
+  print_constraints(bd2, "*** bd2 ****");
+  print_constraints(cs, "*** cs ***");
+
+  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(y >= 3);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1,
+		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ****");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x >= 0);
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+
+  TBD_Shape bd1(cs1);
+  TBD_Shape bd2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+
+  print_constraints(bd1, "*** bd1 ****");
+  print_constraints(bd2, "*** bd2 ****");
+  print_constraints(cs, "*** cs ****");
+
+  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y - x <= 0);
+  known_result.add_constraint(x >= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1,
+		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 3);
+  cs1.insert(x <= 2);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x >= 2);
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+
+  TBD_Shape bd1(cs1);
+  TBD_Shape bd2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+
+  print_constraints(bd1, "*** bd1 ****");
+  print_constraints(bd2, "*** bd2 ****");
+  print_constraints(cs, "*** cs ****");
+
+  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(bd2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1,
+		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x >= 3);
+  cs2.insert(x <= 2);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x + y <= 0);
+  cs.insert(x - y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+
+  TBD_Shape bd1(cs1);
+  TBD_Shape bd2(cs2);
+  BD_Shape<mpq_class> known_result(bd1);
+
+  print_constraints(bd1, "*** bd1 ****");
+  print_constraints(bd2, "*** bd2 ****");
+  print_constraints(cs, "*** cs ****");
+
+  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1,
+		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bd1;
+  TBD_Shape bd2;
+  Constraint_System cs;
+
+  print_constraints(bd1, "*** bd1 ****");
+  print_constraints(bd2, "*** bd2 ****");
+  print_constraints(cs, "*** cs ****");
+
+  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result;
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1,
+		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+  cs1.insert(z <= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x >= 0);
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+  cs2.insert(z <= 0);
+
+  TBD_Shape bd1(cs1);
+  TBD_Shape bd2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+  cs.insert(x - y + z <= 5);
+
+  print_constraints(bd1, "*** bd1 ****");
+  print_constraints(bd2, "*** bd2 ****");
+  print_constraints(cs, "*** cs ****");
+
+  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y - x <= 0);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(z <= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1,
+		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs1;
+  cs1.insert(x == 0);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+  cs1.insert(z <= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+  cs2.insert(z <= -1);
+
+  TBD_Shape bd1(cs1);
+  TBD_Shape bd2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x == 0);
+  cs.insert(y >= 0);
+  cs.insert(y <= 5);
+  cs.insert(x - y + z <= 5);
+
+  print_constraints(bd1, "*** bd1 ****");
+  print_constraints(bd2, "*** bd2 ****");
+  print_constraints(cs, "*** cs ****");
+
+  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y - x <= 0);
+  known_result.add_constraint(x == 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1,
+		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+  cs1.insert(z <= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x >= 0);
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+  cs2.insert(z <= 0);
+
+  TBD_Shape bd1(cs1);
+  TBD_Shape bd2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+  cs.insert(2*x - 3*y <= 5);
+
+  print_constraints(bd1, "*** bd1 ****");
+  print_constraints(bd2, "*** bd2 ****");
+  print_constraints(cs, "*** cs ****");
+
+  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y - x <= 0);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(z <= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1,
+		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+  cs1.insert(z <= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x >= 0);
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+  cs2.insert(z <= 0);
+
+  TBD_Shape bd1(cs1);
+  TBD_Shape bd2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+  cs.insert(x - y >= 0);
+
+  print_constraints(bd1, "*** bd1 ****");
+  print_constraints(bd2, "*** bd2 ****");
+  print_constraints(cs, "*** cs ****");
+
+  bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y - x <= 0);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(z <= 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1,
+		    "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x - y >= 0);
+  bd1.add_constraint(x >= 0);
+  bd1.add_constraint(x <= 2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(x - y >= 0);
+  bd2.add_constraint(x >= 0);
+  bd2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(z <= 5);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::limited_BHMZ05_extrapolation_assign(bd, cs): it is
+    // illegal to apply this function to a system of constraints that
+    // is not dimension-compatible with the two polyhedra.
+    bd2.limited_BHMZ05_extrapolation_assign(bd1, cs);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test11() {
+  Variable y(1);
+
+  TBD_Shape bd1(1);
+  TBD_Shape bd2(2);
+
+  Constraint_System cs;
+  cs.insert(y <= 9);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::limited_BHMZ05_extrapolation_assign(bd2, cs): it is
+    // illegal to apply this function to two polyhedra that are not
+    // dimension-compatible.
+    bd2.limited_BHMZ05_extrapolation_assign(bd1, cs);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x - y >= 0);
+  bd1.add_constraint(x >= 0);
+  bd1.add_constraint(x <= 2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(x - y >= 0);
+  bd2.add_constraint(x >= 0);
+  bd2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(x < 5);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::limited_BHMZ05_extrapolation_assign(bd, cs): it is
+    // illegal to apply this function to a system of constraints that
+    // has a strict-inequality.
+    bd2.limited_BHMZ05_extrapolation_assign(bd1, cs);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/limitedcc76extrapolation1.cc b/tests/BD_Shape/limitedcc76extrapolation1.cc
new file mode 100644
index 0000000..a8bcc01
--- /dev/null
+++ b/tests/BD_Shape/limitedcc76extrapolation1.cc
@@ -0,0 +1,537 @@
+/* Test BD_Shape::limited_CC76_extrapolation_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBD_Shape bd1(0);
+  TBD_Shape bd2(0);
+  Constraint_System cs;
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.limited_CC76_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A == -2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A == -2);
+  bd2.add_constraint(B == 3);
+
+  Constraint_System cs;
+  cs.insert(A <= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A <= 4);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A == -2);
+
+  Constraint_System cs;
+  cs.insert(A <= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd1(3);
+  bd1.add_constraint(A <= 4);
+  bd1.add_constraint(B >= 1);
+
+  TBD_Shape bd2(3);
+  bd2.add_constraint(A <= -2);
+  bd2.add_constraint(B >= 4);
+
+  Constraint_System cs;
+  cs.insert(A <= 5);
+  cs.insert(A - B + C <= 6);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 5);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A <= 4);
+  bd1.add_constraint(B >= 1);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A <= -2);
+  bd2.add_constraint(B >= 4);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A + B <= 6);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A <= 4);
+  bd1.add_constraint(B >= 1);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A <= -2);
+  bd2.add_constraint(B >= 4);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A <= 4);
+  bd1.add_constraint(A >= 5);
+  bd1.add_constraint(B >= 1);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A <= -2);
+  bd2.add_constraint(A >= 3);
+  bd2.add_constraint(B >= 4);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(A <= 4);
+  bd1.add_constraint(B >= 1);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(A <= -2);
+  bd2.add_constraint(A >= 3);
+  bd2.add_constraint(B >= 4);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bd1(4);
+  bd1.add_constraint(A <= 4);
+  bd1.add_constraint(B <= 6);
+  bd1.add_constraint(C - D == 5);
+
+  TBD_Shape bd2(4);
+  bd2.add_constraint(A <= 4);
+  bd2.add_constraint(C - D == 5);
+  bd2.add_constraint(B <= 5);
+
+  Constraint_System cs;
+  cs.insert(A == 4);
+  cs.insert(C - D == 5);
+  cs.insert(A - B <= 6);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(C - D == 5);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 4);
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  cs2.insert(y >= 5);
+
+  TBD_Shape bd1(cs1);
+  TBD_Shape bd2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 20);
+  cs.insert(y >= 3);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ****");
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 3);
+  known_result.add_constraint(y - x >= 2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1,
+		    "*** bd1.limited_CC76_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3, EMPTY);
+  TBD_Shape bd2(3, EMPTY);
+
+  Constraint_System cs;
+  cs.insert(x <= 1);
+  cs.insert(y >= 4);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.limited_CC76_extrapolation_assign(bd2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 4);
+  cs1.insert(x - y >= 2);
+
+  TBD_Shape bd1(cs1);
+  TBD_Shape bd2(2, EMPTY);
+
+  Constraint_System cs2;
+  cs2.insert(x <= 0);
+  cs2.insert(y >= 3);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(cs2, "*** cs2 ***");
+
+  BD_Shape<mpq_class> known_result(bd1);
+
+  bd1.limited_CC76_extrapolation_assign(bd2, cs2);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.limited_CC76_extrapolation_assign(bd2, cs2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable y(1);
+
+  TBD_Shape bd1(1);
+  TBD_Shape bd2(2);
+
+  Constraint_System cs;
+  cs.insert(y <= 9);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::limited_CC76_extrapolation_assign(bd2, cs): it is
+    // illegal to apply this function to two polyhedra that are not
+    // dimension-compatible.
+    bd2.limited_CC76_extrapolation_assign(bd1, cs);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x - y >= 0);
+  bd1.add_constraint(x >= 0);
+  bd1.add_constraint(x <= 2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(x - y >= 0);
+  bd2.add_constraint(x >= 0);
+  bd2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(z <= 5);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::limited_CC76_extrapolation_assign(bd, cs): it is
+    // illegal to apply this function to a system of constraints that
+    // is not dimension-compatible with the two polyhedra.
+    bd2.limited_CC76_extrapolation_assign(bd1, cs);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(2);
+  bd1.add_constraint(x - y >= 0);
+  bd1.add_constraint(x >= 0);
+  bd1.add_constraint(x <= 2);
+
+  TBD_Shape bd2(2);
+  bd2.add_constraint(x - y >= 0);
+  bd2.add_constraint(x >= 0);
+  bd2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(x < 5);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::limited_CC76_extrapolation_assign(bd, cs): it is
+    // illegal to apply this function to a system of constraints that
+    // in which there is a strict inequality.
+    bd2.limited_CC76_extrapolation_assign(bd1, cs);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/BD_Shape/limitedh79extrapolation1.cc b/tests/BD_Shape/limitedh79extrapolation1.cc
new file mode 100644
index 0000000..3128732
--- /dev/null
+++ b/tests/BD_Shape/limitedh79extrapolation1.cc
@@ -0,0 +1,70 @@
+/* Test BD_Shape::limited_H79_extrapolation_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 4);
+
+  TBD_Shape bd1(cs1);
+
+  print_constraints(bd1, "*** bd1 ****");
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  cs2.insert(y >= 5);
+
+  TBD_Shape bd2(cs2);
+
+  print_constraints(bd2, "*** bd2 ****");
+
+  Constraint_System cs;
+  cs.insert(x >= 20);
+  cs.insert(y >= 3);
+
+  print_constraints(cs, "*** cs ***");
+
+  bd1.limited_H79_extrapolation_assign(bd2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(y >= 3);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.limited_H79_extrapolation_assign(bd2) ****");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/mapspacedims1.cc b/tests/BD_Shape/mapspacedims1.cc
new file mode 100644
index 0000000..5c14a34
--- /dev/null
+++ b/tests/BD_Shape/mapspacedims1.cc
@@ -0,0 +1,291 @@
+/* Test BD_Shape::map_space_dimensions().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Partial_Function function;
+
+  TBD_Shape bd1(3);
+
+  print_function(function, "*** function ***");
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result;
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Partial_Function function;
+
+  TBD_Shape bd1(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TBD_Shape bd1(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(2, 1);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 3);
+
+  TBD_Shape bd1(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x == 1);
+  known_result.add_constraint(y - x <= 3);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 0);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 3);
+  cs.insert(z - y <= 7);
+  cs.insert(y - x <= 2);
+
+  TBD_Shape bd1(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(x <= 4);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 1);
+  function.insert(1, 0);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 1);
+  cs.insert(z - y <= 7);
+  cs.insert(y - x <= 1);
+
+  TBD_Shape bd1(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(bd1, "*** bd1 ***");
+
+  bd1.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y - x <= 7);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(y <= -1);
+  bd.add_constraint(y - x <= 3);
+
+  print_constraints(bd, "*** bd ***");
+  print_function(function, "*** function ***");
+
+  bd.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= -1);
+  known_result.add_constraint(y <= 1);
+  known_result.add_constraint(x - y <= 3);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.map_space_dimension(function) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(C >= 0);
+  cs.insert(D == 0);
+  cs.insert(B - A == 0);
+  TBD_Shape bd(cs);
+
+  Partial_Function function;
+  function.insert(0, 2);
+  function.insert(1, 1);
+  function.insert(3, 0);
+
+  print_function(function, "*** function ***");
+  print_constraints(bd, "*** bd ***");
+
+  bd.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(B - C == 0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TBD_Shape bd(0);
+
+  print_constraints(bd, "*** bd ***");
+  print_function(function, "*** function ***");
+
+  bd.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(0);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+  print_constraints(bd, "*** bd.map_space_dimension(function) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/BD_Shape/maxspacedim.cc b/tests/BD_Shape/maxspacedim.cc
new file mode 100644
index 0000000..010b314
--- /dev/null
+++ b/tests/BD_Shape/maxspacedim.cc
@@ -0,0 +1,92 @@
+/* Test BD_Shape::max_space_dimension().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  BD_Shape<mpq_class> bd1(1);
+  BD_Shape<long> bd2(1);
+  BD_Shape<int> bd3(1);
+  BD_Shape<signed char> bd4(1);
+
+  dimension_type max_spacedim1 = bd1.max_space_dimension();
+  dimension_type max_spacedim2 = bd2.max_space_dimension();
+  dimension_type max_spacedim3 = bd3.max_space_dimension();
+  dimension_type max_spacedim4 = bd4.max_space_dimension();
+
+  nout << endl
+       << "The maximum space-dimension of a system of bounded differences "
+       << endl
+       << "of Rational is: "
+       << endl
+       << max_spacedim1
+       << endl;
+
+  nout << endl
+       << "The maximum space-dimension of a system of bounded differences "
+       << endl
+       << "of long: "
+       << endl
+       << max_spacedim2
+       << endl;
+
+  nout << endl
+       << "The maximum space-dimension of a system of bounded differences "
+       << endl
+       << "of int: "
+       << endl
+       << max_spacedim3
+       << endl;
+
+  nout << endl
+       << "The maximum space-dimension of a system of bounded differences "
+       << endl
+       << "of signed char"
+       << endl
+       << max_spacedim4
+       << endl;
+
+  if (max_spacedim1 < max_spacedim2) {
+
+    print_constraints(bd1, "*** bd1 ***");
+    print_constraints(bd2, "*** bd2 ***");
+
+  }
+
+  if (max_spacedim3 < max_spacedim4) {
+
+    print_constraints(bd3, "*** bd3 ***");
+    print_constraints(bd4, "*** bd4 ***");
+
+  }
+  // FIXME!!!
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/minconstraints1.cc b/tests/BD_Shape/minconstraints1.cc
new file mode 100644
index 0000000..d3afe13
--- /dev/null
+++ b/tests/BD_Shape/minconstraints1.cc
@@ -0,0 +1,70 @@
+/* Test BD_Shape<T>::minimized_constraints().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 1);
+  bd.add_constraint(B >= 0);
+  bd.add_constraint(A - B >= -2);
+  bd.add_constraint(A >= -3);
+  bd.add_constraint(A <= 1);
+
+  print_constraints(bd, "*** bd ***");
+
+  const Constraint_System cs = bd.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** bd.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  C_Polyhedron ph_bd(cs);
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = (num_constraints == 3 && known_result == ph_bd) ;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/relations1.cc b/tests/BD_Shape/relations1.cc
new file mode 100644
index 0000000..8dea47f
--- /dev/null
+++ b/tests/BD_Shape/relations1.cc
@@ -0,0 +1,470 @@
+/* Test BD_Shape::relation_with().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TBD_Shape bd(2, EMPTY);
+
+  Poly_Con_Relation rel = bd.relation_with(A >= 0);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(A >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  // Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(y <= -1);
+
+  Constraint c(y >= 0);
+  Poly_Con_Relation rel = bd.relation_with(c);
+
+  print_constraints(bd, "--- bd ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  // Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(y <= 1);
+
+  Constraint c(y >= 0);
+  Poly_Con_Relation rel = bd.relation_with(c);
+
+  print_constraints(bd, "--- bd ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  // Variable x(0);
+  // Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(z >= 1);
+
+  Constraint c(z >= 0);
+  Poly_Con_Relation rel = bd.relation_with(c);
+
+  print_constraints(bd, "--- bd ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable x(0);
+  // Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x == 1);
+
+  Constraint c(x >= 1);
+  Poly_Con_Relation rel = bd.relation_with(c);
+
+  print_constraints(bd, "--- bd ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(x == 1);
+  bd.add_constraint(y <= 0);
+  bd.add_constraint(z >= 2);
+
+  Constraint c(x == 1);
+  Poly_Con_Relation rel = bd.relation_with(c);
+
+  print_constraints(bd, "--- bd ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(x >= 3);
+  bd.add_constraint(y <= 0);
+  bd.add_constraint(z >= 2);
+
+  Constraint c(x == 2);
+  Poly_Con_Relation rel = bd.relation_with(c);
+
+  print_constraints(bd, "--- bd ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(x <= 3);
+  bd.add_constraint(y <= 0);
+  bd.add_constraint(z >= 2);
+
+  Constraint c(x == 2);
+  Poly_Con_Relation rel = bd.relation_with(c);
+
+  print_constraints(bd, "--- bd ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(x <= 3);
+  bd.add_constraint(y <= 0);
+  bd.add_constraint(z >= 2);
+
+  Constraint c(-x >= 2);
+  Poly_Con_Relation rel = bd.relation_with(c);
+
+  print_constraints(bd, "--- bd ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  // The zero-dim universe BDS.
+  TBD_Shape bd(0);
+  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) >= 0);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(0 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  // The zero-dim universe BDS.
+  TBD_Shape bd(0);
+  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) >= 1);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(0 >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  // The zero-dim universe BDS.
+  TBD_Shape bd;
+  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) >= 0);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(1 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable x(0);
+  // Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x == 1);
+
+  Constraint c(x > 1);
+  Poly_Con_Relation rel = bd.relation_with(c);
+
+  print_constraints(bd, "--- bd ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(x == 1);
+  bd.add_constraint(y <= 0);
+  bd.add_constraint(z >= 2);
+
+  Constraint c(x > 1);
+  Poly_Con_Relation rel = bd.relation_with(c);
+
+  print_constraints(bd, "--- bd ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x == 0);
+  bd.add_constraint(y >= 1);
+
+  Poly_Con_Relation rel = bd.relation_with(-y >= -1);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(-y >= -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+
+  bd.add_constraint(x - y <= 2);
+  bd.add_constraint(x - z >= -1);
+  bd.add_constraint(y <= 3);
+
+  Poly_Con_Relation rel = bd.relation_with(y > 3);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(y > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bd(3);
+
+  bd.add_constraint(x - y <= 2);
+  bd.add_constraint(x - z >= -1);
+  bd.add_constraint(y <= 3);
+
+  Poly_Con_Relation rel = bd.relation_with(-y >= -4);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(1 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+
+  TBD_Shape bd(1);
+  bd.add_constraint(A <= 0);
+  bd.add_constraint(A >= -2);
+
+  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) >= -1);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(0 >= -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  // We verify that a generator is not subsumed by an empty BDS.
+  Variable x(0);
+
+  TBD_Shape bd(2, EMPTY);
+
+  Generator g = point(x);
+  Poly_Gen_Relation rel = bd.relation_with(g);
+
+  print_constraints(bd, "--- bd ---");
+  print_generator(g, "--- g ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(v(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  // We verify that a zero-dimensional generator is subsumed
+  // by a zero-dimensional, universal BDS.
+  TBD_Shape bd;
+
+  Generator g = point();
+  Poly_Gen_Relation rel = bd.relation_with(g);
+
+  print_constraints(bd, "--- bd ---");
+  print_generator(g, "--- g ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/relations2.cc b/tests/BD_Shape/relations2.cc
new file mode 100644
index 0000000..b519c46
--- /dev/null
+++ b/tests/BD_Shape/relations2.cc
@@ -0,0 +1,449 @@
+/* Test BD_Shape::relation_with().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // The zero-dim universe BDS.
+  TBD_Shape bd(0);
+  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) > 0);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(0 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  // The zero-dim universe BDS.
+  TBD_Shape bd(0);
+  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) > 1);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(0 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  // The zero-dim universe BDS.
+  TBD_Shape bd(0);
+  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) > 0);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(1 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  // An empty BDS.
+  TBD_Shape bd(1);
+  bd.add_constraint(Linear_Expression(0) >= 1);
+
+  Variable A(0);
+
+  Poly_Con_Relation rel = bd.relation_with(A > 0);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(A > 0) = " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A - B == 3);
+  TBD_Shape bd(cs);
+
+  Poly_Con_Relation rel = bd.relation_with(A - B > 3);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(A - B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A - B <= 3);
+  TBD_Shape bd(cs);
+
+  Poly_Con_Relation rel = bd.relation_with(A - B > 3);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(A - B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  Constraint_System cs;
+  cs.insert(A <= 1);
+
+  TBD_Shape bd(cs);
+
+  Poly_Con_Relation rel = bd.relation_with(A > 0);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(A > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBD_Shape bd(cs);
+
+  Poly_Con_Relation rel = bd.relation_with(A - B > 1);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(A - B > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBD_Shape bd(cs);
+
+  Poly_Con_Relation rel = bd.relation_with(A > 0);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(A > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 0);
+  cs.insert(B <= -1);
+  cs.insert(A - B <= 2);
+
+  TBD_Shape bd(cs);
+
+  Poly_Con_Relation rel = bd.relation_with(B - A > 1);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(B - A > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+
+  TBD_Shape bd(1);
+  bd.add_constraint(A >= 0);
+
+  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) >= 1);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(1 >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A == 1);
+  bd.add_constraint(B >= 2);
+
+  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) > 1);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(1 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A == 1);
+  bd.add_constraint(B >= 2);
+  bd.add_constraint(C <= 1);
+
+  Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) == 1);
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(1 == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A - B >= 0);
+  bd.add_constraint(B >= 0);
+
+  Poly_Gen_Relation rel1 = bd.relation_with(point(B));
+  Poly_Gen_Relation rel2 = bd.relation_with(point(-B));
+
+  print_constraints(bd, "*** bd ***");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(point(B)) == " << rel1 << endl;
+  nout << "bd.relation_with(point(-B)) == " << rel2 << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+
+  Poly_Gen_Relation rel = bd.relation_with(ray(-A));
+
+  print_constraints(bd, "*** bd ***");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(ray(-A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 0);
+
+  Poly_Gen_Relation rel = bd.relation_with(line(A));
+
+  print_constraints(bd, "*** bd ***");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A == 0);
+  bd.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel = bd.relation_with(closure_point(A));
+
+  print_constraints(bd, "*** bd ***");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(closure_point(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 2);
+  bd.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel = bd.relation_with(ray(A + B));
+
+  print_constraints(bd, "*** bd ***");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(ray(A + B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  // The system of constraints of the BDS contains only
+  // an equality and the generator `g' is a point.
+  Variable A(0);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A == 0);
+
+  Poly_Gen_Relation rel = bd.relation_with(point(2*A));
+
+  print_constraints(bd, "--- bd ---");
+  using namespace IO_Operators;
+  nout << "bd.relation_with(point(2*A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of function
+    // BD_Shape::relation_with(c):
+    // it is illegal to use a constraint with three
+    // dimensions.
+    Poly_Con_Relation rel = bd.relation_with(A - C - B <= 2);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/relations3.cc b/tests/BD_Shape/relations3.cc
new file mode 100644
index 0000000..0557ddd
--- /dev/null
+++ b/tests/BD_Shape/relations3.cc
@@ -0,0 +1,108 @@
+/* Test BD_Shape::relation_with().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of function
+    // BD_Shape::relation_with(c):
+    // it is illegal to use a constraint that is
+    // dimensional incompatible with the BDS.
+    Poly_Con_Relation rel = bd.relation_with(C - B <= 2);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of function
+    // BD_Shape::relation_with(c):
+    // it is illegal to use a constraint that is
+    // not a bounded difference.
+    Poly_Con_Relation rel = bd.relation_with(A - 2*B <= 2);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of function
+    // BD_Shape::relation_with(c):
+    // it is illegal to use a generator that is
+    // dimensional incompatible with the BDS.
+    Poly_Gen_Relation rel = bd.relation_with(ray(C));
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/BD_Shape/removespacedims1.cc b/tests/BD_Shape/removespacedims1.cc
new file mode 100644
index 0000000..86ea205
--- /dev/null
+++ b/tests/BD_Shape/removespacedims1.cc
@@ -0,0 +1,311 @@
+/* Remove some variables from the space.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+
+  TBD_Shape bd1(6);
+  bd1.add_constraint(x2 - x3 <= 0);
+  bd1.add_constraint(x3 <= 2);
+  bd1.add_constraint(x6 - x5 <= 2);
+  bd1.add_constraint(x5 <= 3);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x5);
+
+  bd1.remove_space_dimensions(to_be_removed);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x2 <= 2);
+  known_result.add_constraint(x4 <= 5);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+  print_constraints(bd1, "*** bd1.remove_space_dimensions({x3,x5}) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  Variable x7(6);
+  Variable x8(7);
+
+  TBD_Shape bd1(8);
+  bd1.add_constraint(x7 - x3 <= 0);
+  bd1.add_constraint(x1 <= 2);
+  bd1.add_constraint(x4 - x8 <= 2);
+  bd1.add_constraint(x5 <= 7);
+  bd1.add_constraint(x2 <= 10);
+  bd1.add_constraint(x6 - x8 <= 4);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x1);
+  to_be_removed.insert(x2);
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x4);
+  to_be_removed.insert(x5);
+  to_be_removed.insert(x6);
+  to_be_removed.insert(x7);
+  to_be_removed.insert(x8);
+
+  bd1.remove_space_dimensions(to_be_removed);
+
+  BD_Shape<mpq_class> known_result(0);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1,
+		    "*** bd1.remove_space_dimensions"
+		    "({x1,x2,x3,x4,x5,x6,x7,x8}) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TBD_Shape bd1(4);
+  bd1.add_constraint(x1 - x2 <=1);
+  bd1.add_constraint(x2 - x3 <= -2);
+  bd1.add_constraint(x3 - x1 <= 0);
+  bd1.add_constraint(x2 >= 5);
+  bd1.add_constraint(x4 >= 3);
+
+  print_constraints(bd1, "*** bd1 ***");
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x1);
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x4);
+
+  bd1.remove_space_dimensions(to_be_removed);
+
+  BD_Shape<mpq_class> known_result(1, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+  print_constraints(bd1, "*** bd1.remove_space_dimensions({x1,x3,x4}) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x1 <= 2);
+  bd.add_constraint(x2 <= 10);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.remove_higher_space_dimensions(0);
+
+  BD_Shape<mpq_class> known_result(0, UNIVERSE);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.remove_higher_space_dimensions(0) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TBD_Shape bd(4);
+  bd.add_constraint(x1 - x2 <=1);
+  bd.add_constraint(x2 - x3 <= -2);
+  bd.add_constraint(x3 - x1 <= 0);
+  bd.add_constraint(x2 >= 5);
+  bd.add_constraint(x4 >= 3);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.remove_higher_space_dimensions(1);
+
+  BD_Shape<mpq_class> known_result(1, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.remove_higher_space_dimensions(1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  TBD_Shape bd(5);
+  bd.add_constraint(x1 - x2 <=1);
+  bd.add_constraint(x2 - x3 <= 2);
+  bd.add_constraint(x3 - x1 <= 0);
+  bd.add_constraint(x2 >= 5);
+  bd.add_constraint(x4 >= 3);
+  bd.add_constraint(x5 - x3 == 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  bd.remove_higher_space_dimensions(3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 - x2 <=1);
+  known_result.add_constraint(x2 - x3 <= 2);
+  known_result.add_constraint(x3 - x1 <= 0);
+  known_result.add_constraint(x2 >= 5);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TBD_Shape bd(3);
+  bd.add_constraint(x1 - x2 <=1);
+  bd.add_constraint(x2 - x3 <= 2);
+  bd.add_constraint(x3 - x1 <= 0);
+  bd.add_constraint(x2 >= 5);
+
+  print_constraints(bd, "*** bd ***");
+
+  BD_Shape<mpq_class> known_result(bd);
+
+  bd.remove_higher_space_dimensions(3);
+
+  bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+  print_constraints(bd, "*** bd.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  TBD_Shape bd(5);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::remove_higher_dimensions(n): it is illegal to erase
+    // a variable that is not in the space of the polyhedron.
+    bd.remove_higher_space_dimensions(7);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x <= 3);
+  cs.insert(y - z <= 2);
+  TBD_Shape bd(cs);
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(z);
+
+  bd.remove_space_dimensions(to_be_removed);
+
+  try {
+    to_be_removed.insert(x);
+    // This is an incorrect use use of function
+    // BD_Shape::remove_dimensions(to_be_remove).
+    // Here the set `to_be_removed' still contains variable `z'.
+    // This variable is now beyond the space dimension,
+    // so that a dimension-incompatibility exception is obtained.
+    bd.remove_space_dimensions(to_be_removed);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/BD_Shape/run_tests b/tests/BD_Shape/run_tests
new file mode 100755
index 0000000..438d552
--- /dev/null
+++ b/tests/BD_Shape/run_tests
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+mpz_class_XFAIL_TESTS=
+mpq_class_XFAIL_TESTS=
+int8_t_XFAIL_TESTS=
+int16_t_XFAIL_TESTS=
+int32_t_XFAIL_TESTS=
+int64_t_XFAIL_TESTS=
+float_XFAIL_TESTS=
+double_XFAIL_TESTS=
+long_double_XFAIL_TESTS=
+
+if [ -z "$MAKE" ]
+then
+    MAKE=make
+fi
+
+instances=`MAKEFLAGS='' $MAKE -s print_INSTANCES`
+
+check_PROGRAMS=`MAKEFLAGS='' $MAKE -s print_check_PROGRAMS`
+
+for instance in $instances
+do
+  echo "**************************** " $instance " ****************************"
+  eval xfail_tests='"$'$instance'_XFAIL_TESTS"'
+  [ -f dirty_marker ] && $MAKE clean
+  touch dirty_marker
+  $MAKE check TESTS="$check_PROGRAMS" TESTS_ENVIRONMENT="$CHECKER" TEST_CPPFLAGS="-DBD_SHAPE_INSTANCE=$instance" XFAIL_TESTS=$xfail_tests || exit 1
+  $MAKE clean && rm dirty_marker
+done
diff --git a/tests/BD_Shape/timeelapse1.cc b/tests/BD_Shape/timeelapse1.cc
new file mode 100644
index 0000000..7296067
--- /dev/null
+++ b/tests/BD_Shape/timeelapse1.cc
@@ -0,0 +1,209 @@
+/* Test time_elapse_assign() for particular polyhedra.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBD_Shape oc1(2, EMPTY);
+  TBD_Shape oc2(2);
+
+  print_constraints(oc1, "**** oc1 ****");
+  print_constraints(oc2, "**** oc2 ****");
+
+  oc1.time_elapse_assign(oc2);
+
+  TBD_Shape oc3(2);
+  TBD_Shape oc4(2, EMPTY);
+
+  print_constraints(oc3, "**** oc3 ****");
+  print_constraints(oc4, "**** oc4 ****");
+
+  oc3.time_elapse_assign(oc4);
+
+  bool ok = (oc1.is_empty()
+		&& oc3.is_empty()) ;
+
+  print_constraints(oc1, "**** oc1_time_elapse_assign(oc2) ****");
+  print_constraints(oc3, "**** oc3_time_elapse_assign(oc4) ****");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape oc1(2);
+  oc1.add_constraint(x >= 0);
+  oc1.add_constraint(y >= 0);
+  oc1.add_constraint(x + y - 2 <= 0);
+
+  TBD_Shape oc2(2);
+  oc2.add_constraint(x >= 2);
+  oc2.add_constraint(x <= 4);
+  oc2.add_constraint(y == 3);
+
+  print_constraints(oc1, "**** oc1 ****");
+  print_constraints(oc2, "**** oc2 ****");
+
+  oc1.time_elapse_assign(oc2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y >= 0);
+
+  bool ok = (BD_Shape<mpq_class>(oc1) == known_result) ;
+
+  print_constraints(oc1, "**** oc1_time_elapse_assign(oc2) ****");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape oc1(2);
+  oc1.add_constraint(x >= 1);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(y >= 1);
+  oc1.add_constraint(y <= 3);
+
+  TBD_Shape oc2(2);
+  oc2.add_constraint(y == 5);
+
+  print_constraints(oc1, "**** oc1 ****");
+  print_constraints(oc2, "**** oc2 ****");
+
+  oc1.time_elapse_assign(oc2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = (BD_Shape<mpq_class>(oc1) == known_result) ;
+
+  print_constraints(oc1, "**** oc1_time_elapse_assign(oc2) ****");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape oc1(3);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(y <= 5);
+
+  TBD_Shape oc2(3);
+  oc2.add_constraint(x <= 2);
+  oc2.add_constraint(y <= 3);
+
+  print_constraints(oc1, "**** oc1 ****");
+  print_constraints(oc2, "**** oc2 ****");
+
+  oc1.time_elapse_assign(oc2);
+
+  BD_Shape<mpq_class> known_result(3);
+
+  bool ok = (BD_Shape<mpq_class>(oc1) == known_result) ;
+
+  print_constraints(oc1, "**** oc1_time_elapse_assign(oc2) ****");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x >= 1);
+  oc1.add_constraint(y <= 5);
+  oc1.add_constraint(y >= 10);
+  oc1.add_constraint(z >= 1);
+
+  TBD_Shape oc2(3);
+  oc2.add_constraint(x <= 9);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(y <= 3);
+  oc2.add_constraint(y >= -1);
+  oc2.add_constraint(z >= 2);
+
+  print_constraints(oc1, "**** oc1 ****");
+  print_constraints(oc2, "**** oc2 ****");
+
+  oc1.time_elapse_assign(oc2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (BD_Shape<mpq_class>(oc1) == known_result) ;
+
+  print_constraints(oc1, "**** oc1.time_elapse_assign(oc2) ****");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+
+  TBD_Shape bd1(1);
+  bd1.add_constraint(x == 1);
+
+  TBD_Shape bd2(2);
+
+  try {
+    // This is an invalid use of the function
+    // BD_Shape::time_elapse_assign(bd2): it is
+    // illegal to apply this function to two polyhedra that are not
+    // dimension-compatible.
+    bd1.time_elapse_assign(bd2);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/universe1.cc b/tests/BD_Shape/universe1.cc
new file mode 100644
index 0000000..34d48e3
--- /dev/null
+++ b/tests/BD_Shape/universe1.cc
@@ -0,0 +1,57 @@
+/* Test BD_Shape::is_universe().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bd1(4);
+  TBD_Shape bd2(4);
+
+  bd1.add_constraint(-x <= 4);
+  bd1.add_constraint(y - x <= 0);
+  bd1.add_constraint(x - y <= -5);
+
+  bool universe1 = bd1.is_universe();
+
+  nout << "*** bd1.is_universe() ***" << endl;
+  nout << (universe1 ? "true" : "false") << endl;
+
+  bool universe2 = bd2.is_universe();
+
+  nout << "*** bd2.is_universe() ***" << endl;
+  nout << (universe2 ? "true" : "false") << endl;
+
+  return universe1 != universe2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/writebdshape1.cc b/tests/BD_Shape/writebdshape1.cc
new file mode 100644
index 0000000..0b4009e
--- /dev/null
+++ b/tests/BD_Shape/writebdshape1.cc
@@ -0,0 +1,78 @@
+/* Test operator<<(ostream&, const BD_Shape&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(3);
+  TBD_Shape bd2(3);
+
+  bd1.add_constraint(x <= 3);
+  bd1.add_constraint(x - y <= 4);
+
+  bd2.add_constraint(x - y <= 5);
+  bd2.add_constraint(-y <= -2);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+
+  // FIXME!!!
+  return true;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd1(0, EMPTY);
+  TBD_Shape bd2(3);
+  TBD_Shape bd3(3);
+
+  bd2.add_constraint(x - y <= 5);
+  bd2.add_constraint(-y <= -2);
+
+  bd3.add_constraint(x <= 0);
+  bd3.add_constraint(-x <= -1);
+  bd3.add_constraint(y <= 3);
+
+  print_constraints(bd1, "*** bd1 ***");
+  print_constraints(bd2, "*** bd2 ***");
+  print_constraints(bd3, "*** bd3 ***");
+
+  // FIXME!!!
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
+
diff --git a/tests/Grid/Makefile.am b/tests/Grid/Makefile.am
new file mode 100644
index 0000000..192b06d
--- /dev/null
+++ b/tests/Grid/Makefile.am
@@ -0,0 +1,261 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+CHECKER =
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+addcongruence1 \
+addcongruences1 \
+addconstraint1 \
+addconstraints1 \
+addgenerator1 \
+addgenerators1 \
+addspacedims1 \
+affinedim1 \
+affineimage1 affineimage2 \
+affinepreimage1 affinepreimage2 \
+asciidumpload1 \
+bhz03widening1 \
+bounded1 \
+boundingbox1 boundingbox2 \
+bounds1 \
+certificate1 \
+concatenate1 \
+congruence1 \
+congruences1 \
+congruencesystem1 \
+contains1 \
+copyconstruct1 \
+coveringbox1 coveringbox2 \
+discrete1 \
+disjoint1 \
+equals1 \
+expandspacedim1 \
+foldspacedims1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generator1 \
+generators1 \
+grid1 grid2 grid3 \
+griddifference1 \
+intersection1 \
+isempty1 \
+isuniverse1 \
+join1 join2 \
+limitedextrapolation1 \
+mapspacedims1 \
+maxmin1 \
+membytes1 \
+mingenerators1 \
+mincongruences1 \
+outputoperator1 \
+relations1 relations2 \
+removespacedims1 \
+timeelapse1 \
+topclosed1 \
+topclosure1 \
+widening1 \
+writecongruencesystem
+
+#
+# Sources for the tests
+#
+
+addcongruence1_SOURCES = addcongruence1.cc
+
+addcongruences1_SOURCES = addcongruences1.cc
+
+addconstraint1_SOURCES = addconstraint1.cc
+
+addconstraints1_SOURCES = addconstraints1.cc
+
+addgenerator1_SOURCES = addgenerator1.cc
+
+addgenerators1_SOURCES = addgenerators1.cc
+
+addspacedims1_SOURCES = addspacedims1.cc
+
+affinedim1_SOURCES = affinedim1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+
+asciidumpload1_SOURCES = asciidumpload1.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundingbox1_SOURCES = boundingbox1.cc
+boundingbox2_SOURCES = boundingbox2.cc
+
+bounds1_SOURCES = bounds1.cc
+
+certificate1_SOURCES = certificate1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruence1_SOURCES = congruence1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+congruencesystem1_SOURCES = congruencesystem1.cc
+
+contains1_SOURCES = contains1.cc
+
+copyconstruct1_SOURCES = copyconstruct1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+equals1_SOURCES = equals1.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+
+generator1_SOURCES = generator1.cc
+
+generators1_SOURCES = generators1.cc
+
+coveringbox1_SOURCES = coveringbox1.cc
+coveringbox2_SOURCES = coveringbox2.cc
+
+grid1_SOURCES = grid1.cc
+grid2_SOURCES = grid2.cc
+grid3_SOURCES = grid3.cc
+
+griddifference1_SOURCES = griddifference1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+isempty1_SOURCES = isempty1.cc
+
+isuniverse1_SOURCES = isuniverse1.cc
+
+join1_SOURCES = join1.cc
+join2_SOURCES = join2.cc
+
+limitedextrapolation1_SOURCES = limitedextrapolation1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+maxmin1_SOURCES = maxmin1.cc
+
+membytes1_SOURCES = membytes1.cc
+
+mincongruences1_SOURCES = mincongruences1.cc
+
+mingenerators1_SOURCES = mingenerators1.cc
+
+outputoperator1_SOURCES = outputoperator1.cc
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+topclosure1_SOURCES = topclosure1.cc
+
+widening1_SOURCES = widening1.cc
+
+writecongruencesystem_SOURCES = writecongruencesystem.cc
+
+XFAIL_ALWAYS =
+
+XFAIL_WITH_INT64 = \
+$(XFAIL_ALWAYS)
+
+XFAIL_WITH_INT32 = \
+$(XFAIL_WITH_INT64)
+
+XFAIL_WITH_INT16 = \
+$(XFAIL_WITH_INT32)
+
+XFAIL_WITH_INT8 = \
+$(XFAIL_WITH_INT16)
+
+if USE_INT64
+
+XFAIL_SET = $(XFAIL_WITH_INT64)
+
+else !USE_INT64
+if USE_INT32
+
+XFAIL_SET = $(XFAIL_WITH_INT32)
+
+else !USE_INT32
+if USE_INT16
+
+XFAIL_SET = $(XFAIL_WITH_INT16)
+
+else !USE_INT16
+if USE_INT8
+
+XFAIL_SET = $(XFAIL_WITH_INT8)
+
+else !USE_INT8
+
+XFAIL_SET = $(XFAIL_ALWAYS)
+
+endif !USE_INT8
+endif !USE_INT16
+endif !USE_INT32
+endif !USE_INT64
+
+XFAIL_TESTS = $(XFAIL_SET)
+
+check_PROGRAMS = $(TESTS)
+
+MOSTLYCLEANFILES = \
+writecongruencesystem.dat
diff --git a/tests/Grid/Makefile.in b/tests/Grid/Makefile.in
new file mode 100644
index 0000000..229b9e0
--- /dev/null
+++ b/tests/Grid/Makefile.in
@@ -0,0 +1,1494 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = $(am__EXEEXT_1)
+subdir = tests/Grid
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__EXEEXT_1 = addcongruence1$(EXEEXT) addcongruences1$(EXEEXT) \
+	addconstraint1$(EXEEXT) addconstraints1$(EXEEXT) \
+	addgenerator1$(EXEEXT) addgenerators1$(EXEEXT) \
+	addspacedims1$(EXEEXT) affinedim1$(EXEEXT) \
+	affineimage1$(EXEEXT) affineimage2$(EXEEXT) \
+	affinepreimage1$(EXEEXT) affinepreimage2$(EXEEXT) \
+	asciidumpload1$(EXEEXT) bhz03widening1$(EXEEXT) \
+	bounded1$(EXEEXT) boundingbox1$(EXEEXT) boundingbox2$(EXEEXT) \
+	bounds1$(EXEEXT) certificate1$(EXEEXT) concatenate1$(EXEEXT) \
+	congruence1$(EXEEXT) congruences1$(EXEEXT) \
+	congruencesystem1$(EXEEXT) contains1$(EXEEXT) \
+	copyconstruct1$(EXEEXT) coveringbox1$(EXEEXT) \
+	coveringbox2$(EXEEXT) discrete1$(EXEEXT) disjoint1$(EXEEXT) \
+	equals1$(EXEEXT) expandspacedim1$(EXEEXT) \
+	foldspacedims1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffinepreimage1$(EXEEXT) \
+	generalizedaffinepreimage2$(EXEEXT) generator1$(EXEEXT) \
+	generators1$(EXEEXT) grid1$(EXEEXT) grid2$(EXEEXT) \
+	grid3$(EXEEXT) griddifference1$(EXEEXT) intersection1$(EXEEXT) \
+	isempty1$(EXEEXT) isuniverse1$(EXEEXT) join1$(EXEEXT) \
+	join2$(EXEEXT) limitedextrapolation1$(EXEEXT) \
+	mapspacedims1$(EXEEXT) maxmin1$(EXEEXT) membytes1$(EXEEXT) \
+	mingenerators1$(EXEEXT) mincongruences1$(EXEEXT) \
+	outputoperator1$(EXEEXT) relations1$(EXEEXT) \
+	relations2$(EXEEXT) removespacedims1$(EXEEXT) \
+	timeelapse1$(EXEEXT) topclosed1$(EXEEXT) topclosure1$(EXEEXT) \
+	widening1$(EXEEXT) writecongruencesystem$(EXEEXT)
+am_addcongruence1_OBJECTS = addcongruence1.$(OBJEXT)
+addcongruence1_OBJECTS = $(am_addcongruence1_OBJECTS)
+addcongruence1_LDADD = $(LDADD)
+addcongruence1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addcongruences1_OBJECTS = addcongruences1.$(OBJEXT)
+addcongruences1_OBJECTS = $(am_addcongruences1_OBJECTS)
+addcongruences1_LDADD = $(LDADD)
+addcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addconstraint1_OBJECTS = addconstraint1.$(OBJEXT)
+addconstraint1_OBJECTS = $(am_addconstraint1_OBJECTS)
+addconstraint1_LDADD = $(LDADD)
+addconstraint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addgenerator1_OBJECTS = addgenerator1.$(OBJEXT)
+addgenerator1_OBJECTS = $(am_addgenerator1_OBJECTS)
+addgenerator1_LDADD = $(LDADD)
+addgenerator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addgenerators1_OBJECTS = addgenerators1.$(OBJEXT)
+addgenerators1_OBJECTS = $(am_addgenerators1_OBJECTS)
+addgenerators1_LDADD = $(LDADD)
+addgenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinedim1_OBJECTS = affinedim1.$(OBJEXT)
+affinedim1_OBJECTS = $(am_affinedim1_OBJECTS)
+affinedim1_LDADD = $(LDADD)
+affinedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage2_OBJECTS = affineimage2.$(OBJEXT)
+affineimage2_OBJECTS = $(am_affineimage2_OBJECTS)
+affineimage2_LDADD = $(LDADD)
+affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage2_OBJECTS = affinepreimage2.$(OBJEXT)
+affinepreimage2_OBJECTS = $(am_affinepreimage2_OBJECTS)
+affinepreimage2_LDADD = $(LDADD)
+affinepreimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload1_OBJECTS = asciidumpload1.$(OBJEXT)
+asciidumpload1_OBJECTS = $(am_asciidumpload1_OBJECTS)
+asciidumpload1_LDADD = $(LDADD)
+asciidumpload1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundingbox1_OBJECTS = boundingbox1.$(OBJEXT)
+boundingbox1_OBJECTS = $(am_boundingbox1_OBJECTS)
+boundingbox1_LDADD = $(LDADD)
+boundingbox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundingbox2_OBJECTS = boundingbox2.$(OBJEXT)
+boundingbox2_OBJECTS = $(am_boundingbox2_OBJECTS)
+boundingbox2_LDADD = $(LDADD)
+boundingbox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_certificate1_OBJECTS = certificate1.$(OBJEXT)
+certificate1_OBJECTS = $(am_certificate1_OBJECTS)
+certificate1_LDADD = $(LDADD)
+certificate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruence1_OBJECTS = congruence1.$(OBJEXT)
+congruence1_OBJECTS = $(am_congruence1_OBJECTS)
+congruence1_LDADD = $(LDADD)
+congruence1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruencesystem1_OBJECTS = congruencesystem1.$(OBJEXT)
+congruencesystem1_OBJECTS = $(am_congruencesystem1_OBJECTS)
+congruencesystem1_LDADD = $(LDADD)
+congruencesystem1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_copyconstruct1_OBJECTS = copyconstruct1.$(OBJEXT)
+copyconstruct1_OBJECTS = $(am_copyconstruct1_OBJECTS)
+copyconstruct1_LDADD = $(LDADD)
+copyconstruct1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_coveringbox1_OBJECTS = coveringbox1.$(OBJEXT)
+coveringbox1_OBJECTS = $(am_coveringbox1_OBJECTS)
+coveringbox1_LDADD = $(LDADD)
+coveringbox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_coveringbox2_OBJECTS = coveringbox2.$(OBJEXT)
+coveringbox2_OBJECTS = $(am_coveringbox2_OBJECTS)
+coveringbox2_LDADD = $(LDADD)
+coveringbox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_equals1_OBJECTS = equals1.$(OBJEXT)
+equals1_OBJECTS = $(am_equals1_OBJECTS)
+equals1_LDADD = $(LDADD)
+equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS =  \
+	generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS =  \
+	$(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS =  \
+	generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS =  \
+	$(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS =  \
+	generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS =  \
+	$(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage2_OBJECTS =  \
+	generalizedaffinepreimage2.$(OBJEXT)
+generalizedaffinepreimage2_OBJECTS =  \
+	$(am_generalizedaffinepreimage2_OBJECTS)
+generalizedaffinepreimage2_LDADD = $(LDADD)
+generalizedaffinepreimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generator1_OBJECTS = generator1.$(OBJEXT)
+generator1_OBJECTS = $(am_generator1_OBJECTS)
+generator1_LDADD = $(LDADD)
+generator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generators1_OBJECTS = generators1.$(OBJEXT)
+generators1_OBJECTS = $(am_generators1_OBJECTS)
+generators1_LDADD = $(LDADD)
+generators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_grid1_OBJECTS = grid1.$(OBJEXT)
+grid1_OBJECTS = $(am_grid1_OBJECTS)
+grid1_LDADD = $(LDADD)
+grid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_grid2_OBJECTS = grid2.$(OBJEXT)
+grid2_OBJECTS = $(am_grid2_OBJECTS)
+grid2_LDADD = $(LDADD)
+grid2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_grid3_OBJECTS = grid3.$(OBJEXT)
+grid3_OBJECTS = $(am_grid3_OBJECTS)
+grid3_LDADD = $(LDADD)
+grid3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_griddifference1_OBJECTS = griddifference1.$(OBJEXT)
+griddifference1_OBJECTS = $(am_griddifference1_OBJECTS)
+griddifference1_LDADD = $(LDADD)
+griddifference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_isempty1_OBJECTS = isempty1.$(OBJEXT)
+isempty1_OBJECTS = $(am_isempty1_OBJECTS)
+isempty1_LDADD = $(LDADD)
+isempty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_isuniverse1_OBJECTS = isuniverse1.$(OBJEXT)
+isuniverse1_OBJECTS = $(am_isuniverse1_OBJECTS)
+isuniverse1_LDADD = $(LDADD)
+isuniverse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_join1_OBJECTS = join1.$(OBJEXT)
+join1_OBJECTS = $(am_join1_OBJECTS)
+join1_LDADD = $(LDADD)
+join1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_join2_OBJECTS = join2.$(OBJEXT)
+join2_OBJECTS = $(am_join2_OBJECTS)
+join2_LDADD = $(LDADD)
+join2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedextrapolation1_OBJECTS = limitedextrapolation1.$(OBJEXT)
+limitedextrapolation1_OBJECTS = $(am_limitedextrapolation1_OBJECTS)
+limitedextrapolation1_LDADD = $(LDADD)
+limitedextrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxmin1_OBJECTS = maxmin1.$(OBJEXT)
+maxmin1_OBJECTS = $(am_maxmin1_OBJECTS)
+maxmin1_LDADD = $(LDADD)
+maxmin1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mincongruences1_OBJECTS = mincongruences1.$(OBJEXT)
+mincongruences1_OBJECTS = $(am_mincongruences1_OBJECTS)
+mincongruences1_LDADD = $(LDADD)
+mincongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mingenerators1_OBJECTS = mingenerators1.$(OBJEXT)
+mingenerators1_OBJECTS = $(am_mingenerators1_OBJECTS)
+mingenerators1_LDADD = $(LDADD)
+mingenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_outputoperator1_OBJECTS = outputoperator1.$(OBJEXT)
+outputoperator1_OBJECTS = $(am_outputoperator1_OBJECTS)
+outputoperator1_LDADD = $(LDADD)
+outputoperator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations2_OBJECTS = relations2.$(OBJEXT)
+relations2_OBJECTS = $(am_relations2_OBJECTS)
+relations2_LDADD = $(LDADD)
+relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_topclosed1_OBJECTS = topclosed1.$(OBJEXT)
+topclosed1_OBJECTS = $(am_topclosed1_OBJECTS)
+topclosed1_LDADD = $(LDADD)
+topclosed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_topclosure1_OBJECTS = topclosure1.$(OBJEXT)
+topclosure1_OBJECTS = $(am_topclosure1_OBJECTS)
+topclosure1_LDADD = $(LDADD)
+topclosure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_widening1_OBJECTS = widening1.$(OBJEXT)
+widening1_OBJECTS = $(am_widening1_OBJECTS)
+widening1_LDADD = $(LDADD)
+widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writecongruencesystem_OBJECTS = writecongruencesystem.$(OBJEXT)
+writecongruencesystem_OBJECTS = $(am_writecongruencesystem_OBJECTS)
+writecongruencesystem_LDADD = $(LDADD)
+writecongruencesystem_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
+	$(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
+	$(addgenerator1_SOURCES) $(addgenerators1_SOURCES) \
+	$(addspacedims1_SOURCES) $(affinedim1_SOURCES) \
+	$(affineimage1_SOURCES) $(affineimage2_SOURCES) \
+	$(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
+	$(asciidumpload1_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundingbox1_SOURCES) \
+	$(boundingbox2_SOURCES) $(bounds1_SOURCES) \
+	$(certificate1_SOURCES) $(concatenate1_SOURCES) \
+	$(congruence1_SOURCES) $(congruences1_SOURCES) \
+	$(congruencesystem1_SOURCES) $(contains1_SOURCES) \
+	$(copyconstruct1_SOURCES) $(coveringbox1_SOURCES) \
+	$(coveringbox2_SOURCES) $(discrete1_SOURCES) \
+	$(disjoint1_SOURCES) $(equals1_SOURCES) \
+	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) $(generator1_SOURCES) \
+	$(generators1_SOURCES) $(grid1_SOURCES) $(grid2_SOURCES) \
+	$(grid3_SOURCES) $(griddifference1_SOURCES) \
+	$(intersection1_SOURCES) $(isempty1_SOURCES) \
+	$(isuniverse1_SOURCES) $(join1_SOURCES) $(join2_SOURCES) \
+	$(limitedextrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(maxmin1_SOURCES) $(membytes1_SOURCES) \
+	$(mincongruences1_SOURCES) $(mingenerators1_SOURCES) \
+	$(outputoperator1_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(removespacedims1_SOURCES) \
+	$(timeelapse1_SOURCES) $(topclosed1_SOURCES) \
+	$(topclosure1_SOURCES) $(widening1_SOURCES) \
+	$(writecongruencesystem_SOURCES)
+DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
+	$(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
+	$(addgenerator1_SOURCES) $(addgenerators1_SOURCES) \
+	$(addspacedims1_SOURCES) $(affinedim1_SOURCES) \
+	$(affineimage1_SOURCES) $(affineimage2_SOURCES) \
+	$(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
+	$(asciidumpload1_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundingbox1_SOURCES) \
+	$(boundingbox2_SOURCES) $(bounds1_SOURCES) \
+	$(certificate1_SOURCES) $(concatenate1_SOURCES) \
+	$(congruence1_SOURCES) $(congruences1_SOURCES) \
+	$(congruencesystem1_SOURCES) $(contains1_SOURCES) \
+	$(copyconstruct1_SOURCES) $(coveringbox1_SOURCES) \
+	$(coveringbox2_SOURCES) $(discrete1_SOURCES) \
+	$(disjoint1_SOURCES) $(equals1_SOURCES) \
+	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) $(generator1_SOURCES) \
+	$(generators1_SOURCES) $(grid1_SOURCES) $(grid2_SOURCES) \
+	$(grid3_SOURCES) $(griddifference1_SOURCES) \
+	$(intersection1_SOURCES) $(isempty1_SOURCES) \
+	$(isuniverse1_SOURCES) $(join1_SOURCES) $(join2_SOURCES) \
+	$(limitedextrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(maxmin1_SOURCES) $(membytes1_SOURCES) \
+	$(mincongruences1_SOURCES) $(mingenerators1_SOURCES) \
+	$(outputoperator1_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(removespacedims1_SOURCES) \
+	$(timeelapse1_SOURCES) $(topclosed1_SOURCES) \
+	$(topclosure1_SOURCES) $(widening1_SOURCES) \
+	$(writecongruencesystem_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+CHECKER = 
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+addcongruence1 \
+addcongruences1 \
+addconstraint1 \
+addconstraints1 \
+addgenerator1 \
+addgenerators1 \
+addspacedims1 \
+affinedim1 \
+affineimage1 affineimage2 \
+affinepreimage1 affinepreimage2 \
+asciidumpload1 \
+bhz03widening1 \
+bounded1 \
+boundingbox1 boundingbox2 \
+bounds1 \
+certificate1 \
+concatenate1 \
+congruence1 \
+congruences1 \
+congruencesystem1 \
+contains1 \
+copyconstruct1 \
+coveringbox1 coveringbox2 \
+discrete1 \
+disjoint1 \
+equals1 \
+expandspacedim1 \
+foldspacedims1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generator1 \
+generators1 \
+grid1 grid2 grid3 \
+griddifference1 \
+intersection1 \
+isempty1 \
+isuniverse1 \
+join1 join2 \
+limitedextrapolation1 \
+mapspacedims1 \
+maxmin1 \
+membytes1 \
+mingenerators1 \
+mincongruences1 \
+outputoperator1 \
+relations1 relations2 \
+removespacedims1 \
+timeelapse1 \
+topclosed1 \
+topclosure1 \
+widening1 \
+writecongruencesystem
+
+
+#
+# Sources for the tests
+#
+addcongruence1_SOURCES = addcongruence1.cc
+addcongruences1_SOURCES = addcongruences1.cc
+addconstraint1_SOURCES = addconstraint1.cc
+addconstraints1_SOURCES = addconstraints1.cc
+addgenerator1_SOURCES = addgenerator1.cc
+addgenerators1_SOURCES = addgenerators1.cc
+addspacedims1_SOURCES = addspacedims1.cc
+affinedim1_SOURCES = affinedim1.cc
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+asciidumpload1_SOURCES = asciidumpload1.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+boundingbox1_SOURCES = boundingbox1.cc
+boundingbox2_SOURCES = boundingbox2.cc
+bounds1_SOURCES = bounds1.cc
+certificate1_SOURCES = certificate1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruence1_SOURCES = congruence1.cc
+congruences1_SOURCES = congruences1.cc
+congruencesystem1_SOURCES = congruencesystem1.cc
+contains1_SOURCES = contains1.cc
+copyconstruct1_SOURCES = copyconstruct1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+equals1_SOURCES = equals1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generator1_SOURCES = generator1.cc
+generators1_SOURCES = generators1.cc
+coveringbox1_SOURCES = coveringbox1.cc
+coveringbox2_SOURCES = coveringbox2.cc
+grid1_SOURCES = grid1.cc
+grid2_SOURCES = grid2.cc
+grid3_SOURCES = grid3.cc
+griddifference1_SOURCES = griddifference1.cc
+intersection1_SOURCES = intersection1.cc
+isempty1_SOURCES = isempty1.cc
+isuniverse1_SOURCES = isuniverse1.cc
+join1_SOURCES = join1.cc
+join2_SOURCES = join2.cc
+limitedextrapolation1_SOURCES = limitedextrapolation1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+maxmin1_SOURCES = maxmin1.cc
+membytes1_SOURCES = membytes1.cc
+mincongruences1_SOURCES = mincongruences1.cc
+mingenerators1_SOURCES = mingenerators1.cc
+outputoperator1_SOURCES = outputoperator1.cc
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+removespacedims1_SOURCES = removespacedims1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+topclosed1_SOURCES = topclosed1.cc
+topclosure1_SOURCES = topclosure1.cc
+widening1_SOURCES = widening1.cc
+writecongruencesystem_SOURCES = writecongruencesystem.cc
+XFAIL_ALWAYS = 
+XFAIL_WITH_INT64 = \
+$(XFAIL_ALWAYS)
+
+XFAIL_WITH_INT32 = \
+$(XFAIL_WITH_INT64)
+
+XFAIL_WITH_INT16 = \
+$(XFAIL_WITH_INT32)
+
+XFAIL_WITH_INT8 = \
+$(XFAIL_WITH_INT16)
+
+ at USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_FALSE at XFAIL_SET = $(XFAIL_ALWAYS)
+ at USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_TRUE at XFAIL_SET = $(XFAIL_WITH_INT8)
+ at USE_INT16_TRUE@@USE_INT32_FALSE@@USE_INT64_FALSE at XFAIL_SET = $(XFAIL_WITH_INT16)
+ at USE_INT32_TRUE@@USE_INT64_FALSE at XFAIL_SET = $(XFAIL_WITH_INT32)
+ at USE_INT64_TRUE@XFAIL_SET = $(XFAIL_WITH_INT64)
+XFAIL_TESTS = $(XFAIL_SET)
+MOSTLYCLEANFILES = \
+writecongruencesystem.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Grid/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  tests/Grid/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+addcongruence1$(EXEEXT): $(addcongruence1_OBJECTS) $(addcongruence1_DEPENDENCIES) 
+	@rm -f addcongruence1$(EXEEXT)
+	$(CXXLINK) $(addcongruence1_LDFLAGS) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS)
+addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) 
+	@rm -f addcongruences1$(EXEEXT)
+	$(CXXLINK) $(addcongruences1_LDFLAGS) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+addconstraint1$(EXEEXT): $(addconstraint1_OBJECTS) $(addconstraint1_DEPENDENCIES) 
+	@rm -f addconstraint1$(EXEEXT)
+	$(CXXLINK) $(addconstraint1_LDFLAGS) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS)
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) 
+	@rm -f addconstraints1$(EXEEXT)
+	$(CXXLINK) $(addconstraints1_LDFLAGS) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+addgenerator1$(EXEEXT): $(addgenerator1_OBJECTS) $(addgenerator1_DEPENDENCIES) 
+	@rm -f addgenerator1$(EXEEXT)
+	$(CXXLINK) $(addgenerator1_LDFLAGS) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS)
+addgenerators1$(EXEEXT): $(addgenerators1_OBJECTS) $(addgenerators1_DEPENDENCIES) 
+	@rm -f addgenerators1$(EXEEXT)
+	$(CXXLINK) $(addgenerators1_LDFLAGS) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS)
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) 
+	@rm -f addspacedims1$(EXEEXT)
+	$(CXXLINK) $(addspacedims1_LDFLAGS) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+affinedim1$(EXEEXT): $(affinedim1_OBJECTS) $(affinedim1_DEPENDENCIES) 
+	@rm -f affinedim1$(EXEEXT)
+	$(CXXLINK) $(affinedim1_LDFLAGS) $(affinedim1_OBJECTS) $(affinedim1_LDADD) $(LIBS)
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) 
+	@rm -f affineimage1$(EXEEXT)
+	$(CXXLINK) $(affineimage1_LDFLAGS) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) 
+	@rm -f affineimage2$(EXEEXT)
+	$(CXXLINK) $(affineimage2_LDFLAGS) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) 
+	@rm -f affinepreimage1$(EXEEXT)
+	$(CXXLINK) $(affinepreimage1_LDFLAGS) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES) 
+	@rm -f affinepreimage2$(EXEEXT)
+	$(CXXLINK) $(affinepreimage2_LDFLAGS) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS)
+asciidumpload1$(EXEEXT): $(asciidumpload1_OBJECTS) $(asciidumpload1_DEPENDENCIES) 
+	@rm -f asciidumpload1$(EXEEXT)
+	$(CXXLINK) $(asciidumpload1_LDFLAGS) $(asciidumpload1_OBJECTS) $(asciidumpload1_LDADD) $(LIBS)
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) 
+	@rm -f bhz03widening1$(EXEEXT)
+	$(CXXLINK) $(bhz03widening1_LDFLAGS) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) 
+	@rm -f bounded1$(EXEEXT)
+	$(CXXLINK) $(bounded1_LDFLAGS) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+boundingbox1$(EXEEXT): $(boundingbox1_OBJECTS) $(boundingbox1_DEPENDENCIES) 
+	@rm -f boundingbox1$(EXEEXT)
+	$(CXXLINK) $(boundingbox1_LDFLAGS) $(boundingbox1_OBJECTS) $(boundingbox1_LDADD) $(LIBS)
+boundingbox2$(EXEEXT): $(boundingbox2_OBJECTS) $(boundingbox2_DEPENDENCIES) 
+	@rm -f boundingbox2$(EXEEXT)
+	$(CXXLINK) $(boundingbox2_LDFLAGS) $(boundingbox2_OBJECTS) $(boundingbox2_LDADD) $(LIBS)
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) 
+	@rm -f bounds1$(EXEEXT)
+	$(CXXLINK) $(bounds1_LDFLAGS) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+certificate1$(EXEEXT): $(certificate1_OBJECTS) $(certificate1_DEPENDENCIES) 
+	@rm -f certificate1$(EXEEXT)
+	$(CXXLINK) $(certificate1_LDFLAGS) $(certificate1_OBJECTS) $(certificate1_LDADD) $(LIBS)
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) 
+	@rm -f concatenate1$(EXEEXT)
+	$(CXXLINK) $(concatenate1_LDFLAGS) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+congruence1$(EXEEXT): $(congruence1_OBJECTS) $(congruence1_DEPENDENCIES) 
+	@rm -f congruence1$(EXEEXT)
+	$(CXXLINK) $(congruence1_LDFLAGS) $(congruence1_OBJECTS) $(congruence1_LDADD) $(LIBS)
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) 
+	@rm -f congruences1$(EXEEXT)
+	$(CXXLINK) $(congruences1_LDFLAGS) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+congruencesystem1$(EXEEXT): $(congruencesystem1_OBJECTS) $(congruencesystem1_DEPENDENCIES) 
+	@rm -f congruencesystem1$(EXEEXT)
+	$(CXXLINK) $(congruencesystem1_LDFLAGS) $(congruencesystem1_OBJECTS) $(congruencesystem1_LDADD) $(LIBS)
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) 
+	@rm -f contains1$(EXEEXT)
+	$(CXXLINK) $(contains1_LDFLAGS) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+copyconstruct1$(EXEEXT): $(copyconstruct1_OBJECTS) $(copyconstruct1_DEPENDENCIES) 
+	@rm -f copyconstruct1$(EXEEXT)
+	$(CXXLINK) $(copyconstruct1_LDFLAGS) $(copyconstruct1_OBJECTS) $(copyconstruct1_LDADD) $(LIBS)
+coveringbox1$(EXEEXT): $(coveringbox1_OBJECTS) $(coveringbox1_DEPENDENCIES) 
+	@rm -f coveringbox1$(EXEEXT)
+	$(CXXLINK) $(coveringbox1_LDFLAGS) $(coveringbox1_OBJECTS) $(coveringbox1_LDADD) $(LIBS)
+coveringbox2$(EXEEXT): $(coveringbox2_OBJECTS) $(coveringbox2_DEPENDENCIES) 
+	@rm -f coveringbox2$(EXEEXT)
+	$(CXXLINK) $(coveringbox2_LDFLAGS) $(coveringbox2_OBJECTS) $(coveringbox2_LDADD) $(LIBS)
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) 
+	@rm -f discrete1$(EXEEXT)
+	$(CXXLINK) $(discrete1_LDFLAGS) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) 
+	@rm -f disjoint1$(EXEEXT)
+	$(CXXLINK) $(disjoint1_LDFLAGS) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) 
+	@rm -f equals1$(EXEEXT)
+	$(CXXLINK) $(equals1_LDFLAGS) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) 
+	@rm -f expandspacedim1$(EXEEXT)
+	$(CXXLINK) $(expandspacedim1_LDFLAGS) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) 
+	@rm -f foldspacedims1$(EXEEXT)
+	$(CXXLINK) $(foldspacedims1_LDFLAGS) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f generalizedaffineimage1$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage1_LDFLAGS) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) 
+	@rm -f generalizedaffineimage2$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage2_LDFLAGS) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage1$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage1_LDFLAGS) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage2$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage2_LDFLAGS) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+generator1$(EXEEXT): $(generator1_OBJECTS) $(generator1_DEPENDENCIES) 
+	@rm -f generator1$(EXEEXT)
+	$(CXXLINK) $(generator1_LDFLAGS) $(generator1_OBJECTS) $(generator1_LDADD) $(LIBS)
+generators1$(EXEEXT): $(generators1_OBJECTS) $(generators1_DEPENDENCIES) 
+	@rm -f generators1$(EXEEXT)
+	$(CXXLINK) $(generators1_LDFLAGS) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS)
+grid1$(EXEEXT): $(grid1_OBJECTS) $(grid1_DEPENDENCIES) 
+	@rm -f grid1$(EXEEXT)
+	$(CXXLINK) $(grid1_LDFLAGS) $(grid1_OBJECTS) $(grid1_LDADD) $(LIBS)
+grid2$(EXEEXT): $(grid2_OBJECTS) $(grid2_DEPENDENCIES) 
+	@rm -f grid2$(EXEEXT)
+	$(CXXLINK) $(grid2_LDFLAGS) $(grid2_OBJECTS) $(grid2_LDADD) $(LIBS)
+grid3$(EXEEXT): $(grid3_OBJECTS) $(grid3_DEPENDENCIES) 
+	@rm -f grid3$(EXEEXT)
+	$(CXXLINK) $(grid3_LDFLAGS) $(grid3_OBJECTS) $(grid3_LDADD) $(LIBS)
+griddifference1$(EXEEXT): $(griddifference1_OBJECTS) $(griddifference1_DEPENDENCIES) 
+	@rm -f griddifference1$(EXEEXT)
+	$(CXXLINK) $(griddifference1_LDFLAGS) $(griddifference1_OBJECTS) $(griddifference1_LDADD) $(LIBS)
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) 
+	@rm -f intersection1$(EXEEXT)
+	$(CXXLINK) $(intersection1_LDFLAGS) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+isempty1$(EXEEXT): $(isempty1_OBJECTS) $(isempty1_DEPENDENCIES) 
+	@rm -f isempty1$(EXEEXT)
+	$(CXXLINK) $(isempty1_LDFLAGS) $(isempty1_OBJECTS) $(isempty1_LDADD) $(LIBS)
+isuniverse1$(EXEEXT): $(isuniverse1_OBJECTS) $(isuniverse1_DEPENDENCIES) 
+	@rm -f isuniverse1$(EXEEXT)
+	$(CXXLINK) $(isuniverse1_LDFLAGS) $(isuniverse1_OBJECTS) $(isuniverse1_LDADD) $(LIBS)
+join1$(EXEEXT): $(join1_OBJECTS) $(join1_DEPENDENCIES) 
+	@rm -f join1$(EXEEXT)
+	$(CXXLINK) $(join1_LDFLAGS) $(join1_OBJECTS) $(join1_LDADD) $(LIBS)
+join2$(EXEEXT): $(join2_OBJECTS) $(join2_DEPENDENCIES) 
+	@rm -f join2$(EXEEXT)
+	$(CXXLINK) $(join2_LDFLAGS) $(join2_OBJECTS) $(join2_LDADD) $(LIBS)
+limitedextrapolation1$(EXEEXT): $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_DEPENDENCIES) 
+	@rm -f limitedextrapolation1$(EXEEXT)
+	$(CXXLINK) $(limitedextrapolation1_LDFLAGS) $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_LDADD) $(LIBS)
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) 
+	@rm -f mapspacedims1$(EXEEXT)
+	$(CXXLINK) $(mapspacedims1_LDFLAGS) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+maxmin1$(EXEEXT): $(maxmin1_OBJECTS) $(maxmin1_DEPENDENCIES) 
+	@rm -f maxmin1$(EXEEXT)
+	$(CXXLINK) $(maxmin1_LDFLAGS) $(maxmin1_OBJECTS) $(maxmin1_LDADD) $(LIBS)
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) 
+	@rm -f membytes1$(EXEEXT)
+	$(CXXLINK) $(membytes1_LDFLAGS) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+mincongruences1$(EXEEXT): $(mincongruences1_OBJECTS) $(mincongruences1_DEPENDENCIES) 
+	@rm -f mincongruences1$(EXEEXT)
+	$(CXXLINK) $(mincongruences1_LDFLAGS) $(mincongruences1_OBJECTS) $(mincongruences1_LDADD) $(LIBS)
+mingenerators1$(EXEEXT): $(mingenerators1_OBJECTS) $(mingenerators1_DEPENDENCIES) 
+	@rm -f mingenerators1$(EXEEXT)
+	$(CXXLINK) $(mingenerators1_LDFLAGS) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS)
+outputoperator1$(EXEEXT): $(outputoperator1_OBJECTS) $(outputoperator1_DEPENDENCIES) 
+	@rm -f outputoperator1$(EXEEXT)
+	$(CXXLINK) $(outputoperator1_LDFLAGS) $(outputoperator1_OBJECTS) $(outputoperator1_LDADD) $(LIBS)
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) 
+	@rm -f relations1$(EXEEXT)
+	$(CXXLINK) $(relations1_LDFLAGS) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) 
+	@rm -f relations2$(EXEEXT)
+	$(CXXLINK) $(relations2_LDFLAGS) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) 
+	@rm -f removespacedims1$(EXEEXT)
+	$(CXXLINK) $(removespacedims1_LDFLAGS) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) 
+	@rm -f timeelapse1$(EXEEXT)
+	$(CXXLINK) $(timeelapse1_LDFLAGS) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) 
+	@rm -f topclosed1$(EXEEXT)
+	$(CXXLINK) $(topclosed1_LDFLAGS) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES) 
+	@rm -f topclosure1$(EXEEXT)
+	$(CXXLINK) $(topclosure1_LDFLAGS) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+widening1$(EXEEXT): $(widening1_OBJECTS) $(widening1_DEPENDENCIES) 
+	@rm -f widening1$(EXEEXT)
+	$(CXXLINK) $(widening1_LDFLAGS) $(widening1_OBJECTS) $(widening1_LDADD) $(LIBS)
+writecongruencesystem$(EXEEXT): $(writecongruencesystem_OBJECTS) $(writecongruencesystem_DEPENDENCIES) 
+	@rm -f writecongruencesystem$(EXEEXT)
+	$(CXXLINK) $(writecongruencesystem_LDFLAGS) $(writecongruencesystem_OBJECTS) $(writecongruencesystem_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/certificate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruencesystem1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/copyconstruct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/coveringbox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/coveringbox2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grid2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grid3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/griddifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/isempty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/isuniverse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/join1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/join2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedextrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxmin1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mincongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mingenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/outputoperator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writecongruencesystem.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	srcdir=$(srcdir); export srcdir; \
+	list='$(TESTS)'; \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *" $$tst "*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		echo "XPASS: $$tst"; \
+	      ;; \
+	      *) \
+		echo "PASS: $$tst"; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *" $$tst "*) \
+		xfail=`expr $$xfail + 1`; \
+		echo "XFAIL: $$tst"; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		echo "FAIL: $$tst"; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      echo "SKIP: $$tst"; \
+	    fi; \
+	  done; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="All $$all tests passed"; \
+	    else \
+	      banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all tests failed"; \
+	    else \
+	      banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    skipped="($$skip tests were not run)"; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  echo "$$dashes"; \
+	  echo "$$banner"; \
+	  test -z "$$skipped" || echo "$$skipped"; \
+	  test -z "$$report" || echo "$$report"; \
+	  echo "$$dashes"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Grid/addcongruence1.cc b/tests/Grid/addcongruence1.cc
new file mode 100644
index 0000000..176dbe1
--- /dev/null
+++ b/tests/Grid/addcongruence1.cc
@@ -0,0 +1,135 @@
+/* Test methods which add a single congruence to a grid.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+// Many cases are covered in addgenerator1, in which the known grid is
+// always created with Grid::add_congruence.
+
+namespace {
+
+// Test add_congruence_and_minimize.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruence((A + B %= 0) / 6);
+
+  print_congruences(gr,
+		    "*** gr.add_congruence((A + B %= 0) / 6) ***");
+
+  gr.add_congruence_and_minimize((A + B %= 0) / 3);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 6);
+
+  bool ok = (gr == known_gr) ;
+
+  print_congruences(gr,
+	"*** gr.add_congruence_and_minimize((A + B %= 0) / 3) ***");
+
+  return ok;
+}
+
+// Add to an empty grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruence((A + B + C %= 0) / 3);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruence((A + B + C %= 0) / 3) ***");
+
+  return ok;
+}
+
+// Add a congruence with less dimensions than the grid.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 7);
+  gr.add_congruence((A %= 0) / 7);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(parameter(7*A));
+  known_gr.add_generator(parameter(7*B));
+  known_gr.add_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "***  gr.add_congruence((A %= 0) / 7) ***");
+
+  return ok;
+}
+
+// Add a congruence and minimize with less dimensions than the grid.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 7);
+  gr.add_congruence_and_minimize((A %= 0) / 7);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(parameter(7*A));
+  known_gr.add_generator(parameter(7*B));
+  known_gr.add_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "***  gr.add_congruence((A %= 0) / 7) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Grid/addcongruences1.cc b/tests/Grid/addcongruences1.cc
new file mode 100644
index 0000000..e449d19
--- /dev/null
+++ b/tests/Grid/addcongruences1.cc
@@ -0,0 +1,409 @@
+/* Test methods which can add multiple congruences to a grid.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// add_congruences
+bool
+test01() {
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((B == 0) / 2);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruences(cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((B == 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_congruences_and_minimize
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert(A + B == 0);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(2*A - 2*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences_and_minimize
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((B %= 0) / 2);
+  cgs.insert(A - B == 0);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences_and_minimize(cgs);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(2*A + 2*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences(cgs) -- space dimension exception
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+
+  Grid gr(1);
+
+  try {
+    gr.add_recycled_congruences(cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_congruences(cgs) -- space dimension exception
+
+bool
+test06() {
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert(B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_congruences(cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_recycled_congruences_and_minimize(cgs) -- space dimension
+// exception
+bool
+test07() {
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert(B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_recycled_congruences_and_minimize(cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_recycled_congruences, empty grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences_and_minimize, add empty system.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_generator(grid_point(3*A + B));
+
+  Grid known_gr = gr;
+
+  Congruence_System cgs;
+
+  gr.add_recycled_congruences_and_minimize(cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_recycled_congruences_and_minimize(cgs ***");
+
+  return ok;
+}
+
+// add_recycled_congruences_and_minimize, add system of single trivial
+// congruence to zero dim grid.
+bool
+test10() {
+
+  Grid gr(0);
+
+  print_congruences(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  Congruence_System cgs;
+  cgs.insert(Congruence::zero_dim_integrality());
+
+  gr.add_recycled_congruences_and_minimize(cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences_and_minimize, add to empty grid.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  Congruence_System cgs;
+  cgs.insert(A + B == 0);
+
+  gr.add_recycled_congruences_and_minimize(cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences_and_minimize, add empty system to grid
+// with minimized generators and up to date congruences.
+bool
+test12() {
+  Variable A(0);
+
+  Grid gr(2);
+
+  // Ensure both systems are up to date with only generators minimal.
+  gr.affine_image(A, 1*A);
+  gr.minimized_generators();
+
+  print_congruences(gr, "*** gr ***");
+
+  Congruence_System cgs;
+
+  gr.add_recycled_congruences_and_minimize(cgs);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences_and_minimize, add empty system to grid
+// with up to date congruences and generators.
+bool
+test13() {
+  Variable A(0);
+
+  Grid gr(2);
+
+  // Ensure both systems are just up to date.
+  gr.affine_image(A, 1*A);
+
+  print_congruences(gr, "*** gr ***");
+
+  Congruence_System cgs;
+
+  gr.add_recycled_congruences_and_minimize(cgs);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences_and_minimize, add congruence in 1D to
+// universe grid in 2D.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 7);
+
+  gr1.add_recycled_congruences_and_minimize(cgs);
+  print_generators(gr1, "gr1: ");
+  print_congruences(gr1, "gr1: ");
+
+  Grid gr2(2);
+  gr2.add_congruence((A %= 0) / 7);
+  print_generators(gr2, "gr2: ");
+  print_congruences(gr2, "gr2: ");
+
+  Grid known_gr = gr2;
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr2.add_congruence_and_minimize((22*A %= 3) / 7) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/addconstraint1.cc b/tests/Grid/addconstraint1.cc
new file mode 100644
index 0000000..3aa5af0
--- /dev/null
+++ b/tests/Grid/addconstraint1.cc
@@ -0,0 +1,244 @@
+/* Test adding single constraints to grids.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_constraint
+bool
+test01() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraint(A == 3);
+  print_congruences(gr, "*** gr.add_constraint(A == 3) ***");
+  gr.add_constraint(B >= 0);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A == 3);
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraint(B >= 0) ***");
+
+  return ok;
+}
+
+// Add an NNC constraint with add_constraint.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B + 0*C == 0);
+
+  NNC_Polyhedron ph(cs);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraint(*ph.constraints().begin());
+
+  Grid known_gr(3);
+  known_gr.add_congruence(B == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_constraint(*ph.constraints().begin()) ***");
+
+  return ok;
+}
+
+// add_constraint_and_minimize(cs)
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4);
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraint_and_minimize(2*A == C);
+  print_congruences(gr, "*** gr.add_constraint_and_minimize(2*A == C) ***");
+  gr.add_constraint_and_minimize(D == 0);
+  print_congruences(gr, "*** gr.add_constraint_and_minimize(D == 0) ***");
+  gr.add_constraint_and_minimize(B > 2);
+
+  Grid known_gr(4);
+  known_gr.add_congruence(2*A == C);
+  known_gr.add_congruence(D == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraint_and_minimize(B > 2) ***");
+
+  return ok;
+}
+
+// add_congruence(c), adding equality
+bool
+test04() {
+  Variable D(3);
+
+  Grid gr(4);
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruence(D == 4);
+
+  Grid known_gr(4);
+
+  known_gr.add_congruence(D == 4);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruence(D == 4) ***");
+
+  return ok;
+}
+
+// add_congruence(c), where grid stays the same
+bool
+test05() {
+  Variable D(3);
+
+  Grid gr(4);
+  print_congruences(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.add_congruence(D > 4);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruence(D > 4) ***");
+
+  return ok;
+}
+
+// add_congruence_and_minimize(c), add equality.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruence_and_minimize(C == 4*A);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(C == 4*A);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** add_congruence_and_minimize(C == 4*A) ***");
+
+  return ok;
+}
+
+// add_congruence_and_minimize(c), where grid stays the same.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B == 0) / 0);
+
+  Grid known_gr = gr;
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruence_and_minimize(C > 4*A);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_congruence_and_minimize(C > 4*A) ***");
+
+  return ok;
+}
+
+// add_constraint -- space dimension exception
+bool
+test08() {
+  Variable B(1);
+
+  Grid gr(1);
+
+  try {
+    gr.add_constraint(B == 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_constraint_and_minimize -- space dimension exception
+bool
+test09() {
+  Variable B(1);
+
+  Grid gr(1);
+
+  try {
+    gr.add_constraint_and_minimize(B == 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/addconstraints1.cc b/tests/Grid/addconstraints1.cc
new file mode 100644
index 0000000..65b7ecf
--- /dev/null
+++ b/tests/Grid/addconstraints1.cc
@@ -0,0 +1,516 @@
+/* Test adding constraints to a grid.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_congruences_and_minimize(cs)
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+  cs.insert(A >= 0);
+  cs.insert(C > 0);
+
+  gr.add_congruences_and_minimize(cs);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(B == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cs) ***");
+
+  return ok;
+}
+
+// add_constraints
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+  cs.insert(A >= 0);
+  cs.insert(C > 0);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraints(cs);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(B == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+  return ok;
+}
+
+// add_constraints, resulting grid empty.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B < 0);
+  cs.insert(A >= 0);
+  cs.insert(C > 0);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraints(cs);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+  return ok;
+}
+
+// add_congruences(cs)
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(B < 0);
+  cs.insert(B > 0);
+  cs.insert(A == 0);
+  cs.insert(C > 0);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruences(cs);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(A == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences(cs)
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(2*B == 3);
+  cs.insert(A == 0);
+  cs.insert(C > 0);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences(cs);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(A == 0);
+  known_gr.add_congruence(2*B == 3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences_and_minimize(cs)
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(2*B >= 3);
+  cs.insert(2*A == 7);
+  cs.insert(C > 0);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences_and_minimize(cs);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(2*A == 7);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_recycled_congruences_and_minimize(cs) ***");
+
+  return ok;
+}
+
+// add_constraints_and_minimize(cs)
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(2*B >= 3);
+  cs.insert(D == 0);
+  cs.insert(2*A == C);
+
+  Grid gr(4);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraints_and_minimize(cs);
+
+  Grid known_gr(4);
+  known_gr.add_congruence(2*A == C);
+  known_gr.add_congruence(D == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraints_and_minimize(cs) ***");
+
+  return ok;
+}
+
+// add_recycled_constraints
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(2*B > 2);
+  cs.insert(2*D == 0);
+
+  Grid gr(4);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_constraints(cs);
+
+  Grid known_gr(4);
+  known_gr.add_congruence(D == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_constraints(cs) ***");
+
+  return ok;
+}
+
+// add_recycled_constraints_and_minimize
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(2*B > 6);
+  cs.insert(2*C == 6*D);
+
+  Grid gr(4);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_constraints_and_minimize(cs);
+
+  Grid known_gr(4);
+  known_gr.add_congruence(C == 3*D);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_recycled_constraints_and_minimize(cs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences(cs) -- space dimension exception
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_recycled_congruences(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_congruences(cs) -- space dimension exception
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_congruences(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_recycled_congruences_and_minimize(cs) -- space dimension
+// exception
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_recycled_congruences_and_minimize(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_congruences_and_minimize(cs) -- space dimension exception
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_congruences_and_minimize(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_constraints(cs) -- space dimension exception
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_constraints(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_constraints(cs) -- space dimension exception
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_constraints(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_recycled_constraints(cs) -- space dimension exception
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_recycled_constraints(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_recycled_constraints_and_minimize(cs) -- space dimension
+// exception
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_recycled_constraints_and_minimize(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_constraints_and_minimize(cs) -- space dimension exception
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_constraints_and_minimize(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
diff --git a/tests/Grid/addgenerator1.cc b/tests/Grid/addgenerator1.cc
new file mode 100644
index 0000000..5b6f7e9
--- /dev/null
+++ b/tests/Grid/addgenerator1.cc
@@ -0,0 +1,366 @@
+/* Test Grid::add_generator*().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+// grid1.cc also tests add_generator_and_minimize.
+
+// One dimension.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_generator(grid_point(-A));
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A == -1) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_generator(grid_point(-A)) ***");
+
+  return ok;
+}
+
+// Two dimensions.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+  gr.add_generator(grid_point(A + B));
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A == 1) / 0);
+  known_gr.add_congruence((B == 1) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_generator(grid_point(A + B)) ***");
+
+  return ok;
+}
+
+// Add many generators to grid of two dimensions.
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A + 2*B));
+  gr.add_generator(grid_point(A + B));
+  gr.add_generator(grid_point(2*A + 2*B));
+  gr.add_generator(grid_line(A));
+
+  Grid known_gr(2);
+  known_gr.add_congruence(B %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_generator(...) ***");
+
+  return ok;
+}
+
+// Add NNC generators.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  //gs.insert(closure_point(3*A, 4)); // FIX
+  gs.insert(grid_point(7*A, 4));
+  gs.insert(grid_line(A - B));
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  for (Grid_Generator_System::const_iterator i = gs.begin(),
+	 gs_end = gs.end(); i != gs_end; ++i)
+    gr.add_generator(*i);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((4*A + 4*B == 7) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_generator(*i) ***");
+
+  return ok;
+}
+
+// Add generators to a grid of a higher space dimension.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_generator(grid_point(7*A, 3));
+  print_congruences(gr, "*** gr.add_generator(grid_point(7*A, 3)) ***");
+  gr.add_generator(grid_line(A - B));
+
+  Grid known_gr(4);
+
+  known_gr.add_congruence((3*A + 3*B == 7) / 0);
+  known_gr.add_congruence((C == 0) / 0);
+  known_gr.add_congruence((D == 0) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_generator(grid_line(A - B)) ***");
+
+  return ok;
+}
+
+// add_generator_and_minimize
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(2*A + 2*B));
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_generator(grid_point(8*A + 8*B));
+
+  gr.add_generator_and_minimize(grid_line(A));
+
+  Grid known_gr(2);
+  known_gr.add_congruence((B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_generator_and_minimize(grid_line(A)) ***");
+
+  return ok;
+}
+
+// Add a generator to a universe grid.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_generator(grid_point(12*A + 7*D));
+
+  Grid known_gr(4);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "***  ***");
+
+  return ok;
+}
+
+// add_generator_and_minimize, adding a generator with a divisor to a
+// grid of many generators.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A));
+
+  print_congruences(gr, "*** gr ***");
+
+  // Minimize the grid.
+
+  gr.add_generator_and_minimize(grid_point(B, 3));
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence(3*B %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_generator_and_minimize(grid_point(B, 3)) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test09() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.add_generator(grid_point(A + C));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Zero dimensions empty.
+bool
+test10() {
+  Grid gr(0, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_generator(grid_point());
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_generator(grid_point()) ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test11() {
+  Grid gr(0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_generator(grid_point());
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_generator(grid_point()) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test12() {
+  Variable A(0);
+
+  Grid gr(2, EMPTY);
+
+  try {
+    gr.add_generator(grid_line(A));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Try add parameter to empty grid.
+bool
+test13() {
+  Grid gr(2, EMPTY);
+
+  try {
+    gr.add_generator(parameter());
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Try add parameter to zero dimension empty grid.
+bool
+test14() {
+  Grid gr(0, EMPTY);
+
+  try {
+    gr.add_generator(parameter());
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/addgenerators1.cc b/tests/Grid/addgenerators1.cc
new file mode 100644
index 0000000..28374b1
--- /dev/null
+++ b/tests/Grid/addgenerators1.cc
@@ -0,0 +1,281 @@
+/* Test methods which can add multiple generators to a grid.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// grid1*.cc use add_generators_and_minimize often.
+
+// add_recycled_generators -- space dimension exception.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(B));
+
+  Grid gr(1);
+
+  try {
+    gr.add_recycled_generators(gs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_recycled_generators_and_minimize -- space dimension exception.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(B));
+
+  Grid gr(1);
+
+  try {
+    gr.add_recycled_generators_and_minimize(gs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_recycled_generators -- zero dimension universe.
+bool
+test03() {
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+
+  Grid gr(0);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_recycled_generators(gs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_recycled_generators(gs) ***");
+
+  return ok;
+}
+
+// add_recycled_generators -- zero dimension empty.
+bool
+test04() {
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+
+  Grid gr(0, EMPTY);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_recycled_generators(gs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_recycled_generators(gs) ***");
+
+  return ok;
+}
+
+// add_recycled_generators -- add system with a single parameter
+// generator to the zero dimension empty grid.
+bool
+test05() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(parameter(A));
+
+  Variables_Set vs;
+  vs.insert(A);
+
+  // This may be the only was to create a zero dimension generator
+  // system that contains only parameters and/or lines.
+  gs.remove_space_dimensions(vs);
+
+  Grid gr(0, EMPTY);
+
+  try {
+    gr.add_recycled_generators(gs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_recycled_generators_and_minimize -- add system with a single
+// parameter generator to the zero dimension empty grid.
+bool
+test06() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(parameter(A));
+
+  Variables_Set vs;
+  vs.insert(A);
+
+  // This may be the only was to create a zero dimension generator
+  // system that contains only parameters and/or lines.
+  gs.remove_space_dimensions(vs);
+
+  Grid gr(0, EMPTY);
+
+  try {
+    gr.add_recycled_generators_and_minimize(gs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_recycled_generators -- add system with a single parameter
+// generator to the empty grid.
+bool
+test07() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(parameter(A));
+
+  Grid gr(2, EMPTY);
+
+  try {
+    gr.add_recycled_generators(gs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_recycled_generators_and_minimize -- add to the zero dim grid.
+bool
+test08() {
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+
+  Grid gr(0, EMPTY);
+  gr.add_recycled_generators_and_minimize(gs);
+
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+      "*** gr.add_recycled_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// add_recycled_generators_and_minimize -- try add system with a
+// single parameter generator to the empty grid.
+bool
+test09() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(parameter(A));
+
+  Grid gr(2, EMPTY);
+
+  try {
+    gr.add_recycled_generators_and_minimize(gs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// add_recycled_generators_and_minimize -- add an empty system.
+bool
+test10() {
+  Grid_Generator_System gs;
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point());
+
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.add_recycled_generators_and_minimize(gs);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+      "*** gr.add_recycled_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/addspacedims1.cc b/tests/Grid/addspacedims1.cc
new file mode 100644
index 0000000..92b2580
--- /dev/null
+++ b/tests/Grid/addspacedims1.cc
@@ -0,0 +1,546 @@
+/* Test Grid::add_space_dimensions_and_embed().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+// From congruences, adding to both congruences and generators.
+bool
+test01() {
+  Variable A(0);
+  Variable C(2);
+  Variable E(4);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 0) / 2);
+
+  Grid gr(cgs);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A + 0*E %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "***  ***");
+
+  return ok;
+}
+
+// An empty grid.
+bool
+test02() {
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(3);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_embed(3) ***");
+
+  return ok;
+}
+
+// A universe grid.
+bool
+test03() {
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(4);
+
+  Grid known_gr(5);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_embed(4) ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(A + C));
+
+  Grid gr(gs);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A == 1) / 0);
+  known_cgs.insert((C + 0*E %= 0) / 1);
+  known_cgs.insert((B == 0) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_embed(2) ***");
+
+  return ok;
+}
+
+// From congruences, where dimensions are only added to the grid's
+// congruence system.
+bool
+test05() {
+  Variable A(0);
+  Variable C(2);
+  Variable E(4);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 0) / 2);
+
+  Grid gr(cgs);
+
+  print_congruences(gr, "*** gr ***");
+
+  // Add space dimensions directly after creating the grid, to ensure
+  // that only the congruences are up to date.
+
+  gr.add_space_dimensions_and_embed(2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A + 0*E %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_embed(2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test06() {
+  Grid gr(10);
+
+  try {
+    gr.add_space_dimensions_and_embed(Grid::max_space_dimension());
+  }
+  catch (const std::length_error& e) {
+    nout << "max_space_dimension_exceeded: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Zero dimension universe grid.
+bool
+test07() {
+  Grid gr(0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(13);
+
+  Grid known_gr(13);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_embed(13) ***");
+
+  return ok;
+}
+
+// Add to a grid which has minimized congruences.
+bool
+test08() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  gr.minimized_congruences();
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(2);
+
+  Grid known_gr(4);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_embed(2) ***");
+
+  return ok;
+}
+
+// Add to a grid which has out of date congruences and minimized
+// generators.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_line(A));
+
+  gr.minimized_generators();
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(2);
+
+  Grid known_gr(4);
+  known_gr.add_congruence(B == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_embed(2) ***");
+
+  return ok;
+}
+
+// From congruences.
+bool
+test10() {
+  Variable A(0);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 0) / 2);
+
+  Grid gr(cgs);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((E %= 0) / 0);
+  known_cgs.insert((D %= 0) / 0);
+  known_cgs.insert((A %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test11() {
+  Grid gr(2, EMPTY);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(3);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_project(3) ***");
+
+  return ok;
+}
+
+// Universe grid, compared to congruences.
+bool
+test12() {
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(4);
+
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((B %= 0) / 0);
+  known_cgs.insert((C %= 0) / 0);
+  known_cgs.insert((D %= 0) / 0);
+  known_cgs.insert((E %= 0) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_project(4) ***");
+
+  return ok;
+}
+
+// Universe grid, compared to generators.
+bool
+test13() {
+  Grid gr(1);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(3);
+
+  Variable A(0);
+  Variable D(3);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_line(A + 0*D));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "***  ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(A + B + C));
+
+  Grid gr(gs);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(A == 1);
+  known_cgs.insert(B - C == 0);
+  known_cgs.insert(B %= 0);
+  known_cgs.insert(D == 0);
+  known_cgs.insert(E == 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+// From generators, where dimensions are only added to the grid's
+// generator system.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(A + B + C));
+
+  Grid gr(gs);
+
+  print_generators(gr, "*** gr ***");
+
+  // Add space dimensions directly after creating the grid, to ensure
+  // that only the generators are up to date.
+
+  gr.add_space_dimensions_and_project(2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A == 1) / 0);
+  known_cgs.insert((B - C %= 0) / 0);
+  known_cgs.insert((B %= 0) / 1);
+  known_cgs.insert((D %= 0) / 0);
+  known_cgs.insert((E %= 0) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test16() {
+  Grid gr(10);
+
+  try {
+  }
+  catch (const std::length_error& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Zero dimension universe grid.
+bool
+test17() {
+  Grid gr(0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(13);
+
+  Grid known_gr(13);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_project(13) ***");
+
+  return ok;
+}
+
+// Add to a grid which has minimized congruences.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  gr.minimized_congruences();
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(2);
+
+  Grid known_gr(4, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(parameter(A));
+  known_gr.add_generator(grid_line(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+// Add to a grid which has out of date congruences and minimized
+// generators.
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_line(A));
+
+  gr.minimized_generators();
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(2);
+
+  Grid known_gr(4);
+  known_gr.add_congruence(B == 0);
+  known_gr.add_congruence(C == 0);
+  known_gr.add_congruence(D == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/affinedim1.cc b/tests/Grid/affinedim1.cc
new file mode 100644
index 0000000..18f1685
--- /dev/null
+++ b/tests/Grid/affinedim1.cc
@@ -0,0 +1,321 @@
+/* Test Grid::affine_dimension().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  bool ok = (gr.affine_dimension() == 0);
+
+  print_congruences(gr, "*** gr**");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+  Grid gr(0, EMPTY);
+
+  bool ok = (gr.affine_dimension() == 0);
+
+  print_congruences(gr, "*** gr**");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.affine_dimension() == 0);
+
+  print_congruences(gr, "*** gr**");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 2*B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B == 2);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = gr_gs_min.affine_dimension() == 0
+    && gr_gs_needs_min.affine_dimension() == 0
+    && gr_cgs_needs_min.affine_dimension() == 0;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Line.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B == 2);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = gr_gs_min.affine_dimension() == 1
+    && gr_gs_needs_min.affine_dimension() == 1
+    && gr_cgs_needs_min.affine_dimension() == 1;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + B));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_generator(grid_point(3*A + B));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+  gr_cgs_needs_min.add_congruence(C == 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = gr_gs_min.affine_dimension() == 1
+    && gr_gs_needs_min.affine_dimension() == 1
+    && gr_cgs_needs_min.affine_dimension() == 1;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_generator(grid_point(3*A + B));
+  gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = gr_gs_min.affine_dimension() == 2
+    && gr_gs_needs_min.affine_dimension() == 2
+    && gr_cgs_needs_min.affine_dimension() == 2;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Skew.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_point(A));
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_point(A));
+  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = gr_gs_min.affine_dimension() == 2
+    && gr_gs_needs_min.affine_dimension() == 2
+    && gr_cgs_needs_min.affine_dimension() == 2;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Skew with lines.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_point(A));
+  gr_gs_min.add_generator(grid_line(C));
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_point(A));
+  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = gr_gs_min.affine_dimension() == 3
+    && gr_gs_needs_min.affine_dimension() == 3
+    && gr_cgs_needs_min.affine_dimension() == 3;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Plane.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(4, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_line(B));
+  gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(4, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(B));
+  gr_gs_needs_min.add_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(4);
+  gr_cgs_needs_min.add_congruence(A == 0);
+  gr_cgs_needs_min.add_congruence(D == 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = gr_gs_min.affine_dimension() == 2
+    && gr_gs_needs_min.affine_dimension() == 2
+    && gr_cgs_needs_min.affine_dimension() == 2;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/affineimage1.cc b/tests/Grid/affineimage1.cc
new file mode 100644
index 0000000..9c96d5c
--- /dev/null
+++ b/tests/Grid/affineimage1.cc
@@ -0,0 +1,402 @@
+/* Test Grid::affine_image().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Variable to be updated does not occur in expression.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(B, A + 2, 1);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(2*B - 2*C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(B, A + 2, 1) ***");
+
+  return ok;
+}
+
+// Variable to be updated occurs in expression.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A - B %= 0) / 0);
+  gr.add_congruence((A %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, A + B + 1);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_point(7*A + 3*B));
+  known_gr.add_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.affine_image(A, A + B + 1) ***");
+
+  return ok;
+}
+
+// Denominator.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 3) / 0);
+  gr.add_congruence((B %= 2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, A + 1, 2);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(2*A + 2*B));
+  known_gr.add_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, A + 1, 2) ***");
+
+  return ok;
+}
+
+// Invertible transformation with denominator, modulus and up-to-date
+// congruences.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 3) / 5);
+  gr.add_congruence((B %= 2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, A + 1, 3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(4*A + 6*B, 3));
+  known_gr.add_generator(grid_point(9*A + 6*B, 3));
+  known_gr.add_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Simple invertible transformation with denominator and modulus.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point(3*A + 2*B));
+  gr.add_generator(grid_point(8*A + 2*B));
+  gr.add_generator(grid_line(C));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_image(A, A + 1, 3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(4*A + 6*B, 3));
+  known_gr.add_generator(grid_point(9*A + 6*B, 3));
+  known_gr.add_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Simple invertible transformation with denominator and modulus
+// Congruences are up-to-date and minimized.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr = Grid(3);
+  gr.add_congruence((A %= 3) / 5);
+  gr.add_congruence((B %= 2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, A + 1, 3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(4*A + 6*B, 3));
+  known_gr.add_generator(grid_point(9*A + 6*B, 3));
+  known_gr.add_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Invertible transformation which changes the modulus.
+// Congruences are out-of-date.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A));
+  gr.add_generator(grid_point(B));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_image(A, 3*A + 2*B + 4);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(4*A));
+  known_gr.add_generator(grid_point(7*A));
+  known_gr.add_generator(grid_point(6*A + B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, 3*A + 2*B + 4) ***");
+
+  return ok;
+}
+
+// Invertible transformation which changes the modulus.
+// Congruences are up-to-date.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr = Grid(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, 3*A + 2*B + 4);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(4*A));
+  known_gr.add_generator(grid_point(7*A));
+  known_gr.add_generator(grid_point(6*A + B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, 3*A + 2*B + 4) ***");
+
+  return ok;
+}
+
+// One dimension.
+// Congruences are out-of-date.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_image(A, 2*A);
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, 2*A) ***");
+
+  return ok;
+}
+
+// One dimension.
+// Congruences are up-to-date.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr = Grid(1);
+  gr.add_congruence(A %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, 2*A);
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, 2*A) ***");
+
+  return ok;
+}
+
+// The first example described at anchor grid_affine_transformation in
+// definitions.dox.
+// Congruences are out-of-date.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(3*A));
+  gr.add_generator(grid_point(3*B));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_image(A, 3*A + 2*B + 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_point(7*A + 3*B));
+  known_gr.add_generator(grid_point(10*A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, 3*A + 2*B + 1) ***");
+
+  return ok;
+}
+
+// This example considers the case when the congruences are out-of-date.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(3*A));
+  gr.add_generator(grid_point(3*B));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_image(A, B);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(3*A + 3*B));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.affine_image(A, B) ***");
+
+  return ok;
+}
+
+// This example is as described at anchor grid_affine_transformation
+// in definitions.dox.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr = Grid(2);
+  gr.add_congruence((A %= 0) / 3);
+  gr.add_congruence((B %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, B);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(3*A + 3*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, B) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/affineimage2.cc b/tests/Grid/affineimage2.cc
new file mode 100644
index 0000000..cabe44a
--- /dev/null
+++ b/tests/Grid/affineimage2.cc
@@ -0,0 +1,317 @@
+/* Test Grid::affine_image().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Denominator, with generators having a variety of divisors.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(A, 3));
+  gs.insert(grid_point(B, 2));
+
+  // The divisors are normalized on construction.
+  Grid gr(gs);
+
+  print_generators(gr, "*** gr ***");
+
+  // All divisors should change, even when the coefficient of A is 0.
+  gr.affine_image(A, 2*A, 5);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(2*A, 15));
+  known_gr.add_generator(grid_point(5*B, 10));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.affine_image(A, 2*A, 5) ***");
+
+  return ok;
+}
+
+// Negative denominator.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(A));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_image(A, B + 2, -3);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(-2*A, 3));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.affine_image(A, B + 2, -3) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, 2*A + B + 1);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, 2*A + B + 1) ***");
+
+  return ok;
+}
+
+// Shift a rectilinear pointed grid along A.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 0) / 4);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, A + 3);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A %= 3) / 4);
+  known_gr.add_congruence((B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, A + 3) ***");
+
+  return ok;
+}
+
+// Slant a rectilinear pointed grid along A == B.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 4);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, A + B);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 4);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, A + B) ***");
+
+  return ok;
+}
+
+// Compress a rectilinear pointed grid to a line of points.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruence((A %= 0) / 4);
+  gr.add_congruence((B %= 0) / 2);
+
+  gr.affine_image(A, B);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A - B == 0);
+  known_gr.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_image(A, B) ***");
+
+  return ok;
+}
+
+// Zero denominator.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.affine_image(B, A + 2, 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.affine_image(B, D + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.affine_image(D, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Based on an example in a paper by Muller-Olm and Seidl in SAS 2005
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(2*A + 0*B));
+
+  print_congruences(gr, "*** gr ***");
+
+  Grid gr0 = gr;  // first grid (using trivial transformation)
+
+  Grid gr1 = gr;  // second grid - initial state
+
+  gr1.generalized_affine_image(B, 18*A + B, 1, 0);
+  gr1.generalized_affine_image(A, 15*A, 1, 0);
+                  // second grid - 1 pass through procedure
+
+  Grid gr2 = gr;  // third grid - initial state
+
+  gr2.affine_image(B, 282*A + B);
+  gr2.affine_image(A, 225*A);
+                  // third grid - 2 passes through procedure
+
+  gr.join_assign(gr1); // join of gr0 and gr1
+
+  print_congruences(gr,
+        "*** gr.join_assign(gr1) ***");
+
+  gr.join_assign(gr2); // join of gr0, gr1 and gr2
+
+  Grid known_gr(2);
+
+  known_gr.add_congruence((A %= 2) / 28);
+  known_gr.add_congruence((B %= 0) / 12);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.join_assign(gr2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST_F16A(test10);
+END_MAIN
diff --git a/tests/Grid/affinepreimage1.cc b/tests/Grid/affinepreimage1.cc
new file mode 100644
index 0000000..f5f441f
--- /dev/null
+++ b/tests/Grid/affinepreimage1.cc
@@ -0,0 +1,443 @@
+/* Test Grid::affine_preimage().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// The first twelve tests mirror those in affineimage1.cc.
+
+// Grid defined by generators.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point(2*B - 2*C));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(B, A + 2, 1);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((C == -2) / 0);
+  known_gr.add_congruence((A ==  0) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.affine_preimage(B, A + 2, 1) ***");
+
+  return ok;
+}
+
+// Grid defined by congruences.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 1) / 6);
+  gr.add_congruence((3*A - 6*B %= 3) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, A + B + 1);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A - B %= 0) / 0);
+  known_gr.add_congruence((A %= 0) / 3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(A, A + B + 1) ***");
+
+  return ok;
+}
+
+// Denominator.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point(2*A + 2*B));
+  gr.add_generator(grid_line(C));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(A, A + 1, 2);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A %= 3) / 0);
+  known_gr.add_congruence((B %= 2) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(A, A + 1, 2) ***");
+
+  return ok;
+}
+
+// Invertible transformation with denominator, modulus and up-to-date
+// congruences.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 2) / 0);
+  gr.add_congruence((3*A %= 4) / 5);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, A + 1, 3);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A %= 3) / 5);
+  known_gr.add_congruence((B %= 2) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(A, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Simple invertible transformation with denominator and modulus.
+// Congruences are out-of-date
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point(4*A + 6*B, 3));
+  gr.add_generator(grid_point(9*A + 6*B, 3));
+  gr.add_generator(grid_line(C));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(A, A + 1, 3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(3*A + 2*B));
+  known_gr.add_generator(grid_point(8*A + 2*B));
+  known_gr.add_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.affine_preimage(A, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Simple invertible transformation with denominator and modulus.
+// Congruences are up-to-date
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr = Grid(3);
+  gr.add_congruence((3*A %= 4) / 5);
+  gr.add_congruence((B %= 2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, A + 1, 3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(3*A + 2*B));
+  known_gr.add_generator(grid_point(8*A + 2*B));
+  known_gr.add_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(A, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Invertible transformation which changes the modulus.
+// Congruences are out-of-date
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(4*A));
+  gr.add_generator(grid_point(7*A));
+  gr.add_generator(grid_point(6*A + B));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 3*A + 2*B + 4);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_point(B));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.affine_preimage(A, 3*A + 2*B + 4) ***");
+
+  return ok;
+}
+
+// Invertible transformation which changes the modulus.
+// Congruences are up-to-date
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr = Grid(2);
+  gr.add_congruence((A - 2*B %= 4) / 3);
+  gr.add_congruence(B %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 3*A + 2*B + 4);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_point(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(A, 3*A + 2*B + 4) ***");
+
+  return ok;
+}
+
+// One dimension.
+// Congruences are out-of-date
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(2*A));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 2*A);
+
+  Grid known_gr(1, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.affine_preimage(A, 2*A) ***");
+
+  return ok;
+}
+
+// One dimension.
+// Congruences are up-to-date
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr = Grid(1);
+  gr.add_congruence((A %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 2*A);
+
+  Grid known_gr(1, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(A, 2*A) ***");
+
+  return ok;
+}
+
+// The first affine_image example described at anchor
+// grid_affine_transformation in definitions.dox.
+// Congruences are out-of-date
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(A));
+  gr.add_generator(grid_point(7*A + 3*B));
+  gr.add_generator(grid_point(10*A));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 3*A + 2*B + 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(3*A));
+  known_gr.add_generator(grid_point(3*B));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.affine_preimage(A, 3*A + 2*B + 1) ***");
+
+  return ok;
+}
+
+// The first affine_image example described at anchor
+// grid_affine_transformation in definitions.dox.
+// Congruences are up-to-date
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr = Grid(2);
+  // FIX Confirm that this should fail when Grid_nonpublic.cc
+  //     BE_LAZY=0.
+  //gr.add_congruence((3*A - 6*B %= 3) / 9);
+  gr.add_congruence((A - 2*B %= 1) / 9);
+  gr.add_congruence((B %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 3*A + 2*B + 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(3*A));
+  known_gr.add_generator(grid_point(3*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(A, 3*A + 2*B + 1) ***");
+
+  return ok;
+}
+
+// The second affine_image example described at anchor
+// grid_affine_transformation in definitions.dox.
+// Congruences are out-of-date
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(3*A + 3*B));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(A, B);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_line(A));
+  known_gr.add_generator(grid_point(3*B));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "***  ***");
+
+  return ok;
+}
+
+// The second affine_image example described at anchor
+// grid_affine_transformation in definitions.dox.
+// Congruences are up-to-date
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr = Grid(2);
+  gr.add_congruence((A - B == 0) / 0);
+  gr.add_congruence((A %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, B);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_line(A));
+  known_gr.add_generator(grid_point(3*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(A, B) ***");
+
+  return ok;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/affinepreimage2.cc b/tests/Grid/affinepreimage2.cc
new file mode 100644
index 0000000..56dda2c
--- /dev/null
+++ b/tests/Grid/affinepreimage2.cc
@@ -0,0 +1,372 @@
+/* Test Grid::affine_preimage().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Denominator, with generators having a variety of divisors.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(2*A, 15));
+  gs.insert(grid_point(5*B, 10));
+
+  // The divisors are normalized on construction.
+  Grid gr(gs);
+
+  print_generators(gr, "*** gr ***");
+
+  // All divisors should change, even when the coefficient of A is 0.
+  gr.affine_preimage(A, 2*A, 5);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A, 3));
+  known_gr.add_generator(grid_point(B, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.affine_preimage(A, 2*A, 5) ***");
+
+  return ok;
+}
+
+// Negative denominator.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(-2*A, 3));
+
+  gr.affine_preimage(A, B + 2, -3);
+
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_line(A));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.affine_preimage(A, B + 2, -3) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 11*A - B + 1);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(A, 11*A - B + 1) ***");
+
+  return ok;
+}
+
+// A negative coefficient of the variable to transform and a negative
+// denominator.
+// Congruences are out-of-date
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(5*A + 4*B, 7));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(B, A - B, -1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(5*A + 9*B, 7));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.affine_preimage(B, A - B, -1) ***");
+
+  return ok;
+}
+
+// A negative coefficient of the variable to transform and a negative
+// denominator.
+// Congruences are up-to-date
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr = Grid(2);
+  gr.add_congruence((7*A == 5) / 0);
+  gr.add_congruence((7*B == 4) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(B, A - B, -1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(5*A + 9*B, 7));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(B, A - B, -1) ***");
+
+  return ok;
+}
+
+// Shift a rectilinear pointed grid along A.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 0) / 4);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, A + 3);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A %= -3) / 4);
+  known_gr.add_congruence((B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(A, A + 3) ***");
+
+  return ok;
+}
+
+// Slant a rectilinear pointed grid along A == -B.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 4);
+  gr.add_congruence((B %= 0) / 2);
+
+  gr.affine_preimage(A, A + B);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 4);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(A, A + B) ***");
+
+  return ok;
+}
+
+// Expand a rectilinear pointed grid to a sequence of lines.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 4);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, B);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((B %= 0) / 4);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(A, B) ***");
+
+  return ok;
+}
+
+// Transform a grid into the empty grid.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A == 3);
+  gr.add_congruence(B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(B, A);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(B, A) ***");
+
+  return ok;
+}
+
+// Transform away the constraint on a dimension (B).
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A == 3);
+  gr.add_congruence(B == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(B, A);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A == 3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.affine_preimage(B, A) ***");
+
+  return ok;
+}
+
+// Zero denominator.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.affine_preimage(B, A + 2, 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.affine_preimage(B, D + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.affine_preimage(D, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/asciidumpload1.cc b/tests/Grid/asciidumpload1.cc
new file mode 100644
index 0000000..c54c35a
--- /dev/null
+++ b/tests/Grid/asciidumpload1.cc
@@ -0,0 +1,178 @@
+/* Test Grid::ascii_dump() and Grid::ascii_load().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// One dimension universe and empty.
+bool
+test01() {
+  Grid gr1(1, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  stringstream ss1;
+  gr1.ascii_dump(ss1);
+
+  gr1.ascii_dump(vnout);
+
+  Grid gr2(1);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  stringstream ss2;
+  gr2.ascii_dump(ss2);
+
+  gr2.ascii_dump(vnout);
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Many dimensioned universe and empty.
+bool
+test02() {
+  Grid gr1(3, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  stringstream ss1;
+  gr1.ascii_dump(ss1);
+
+  gr1.ascii_dump(vnout);
+
+  Grid gr2(3);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  stringstream ss2;
+  gr2.ascii_dump(ss2);
+
+  gr2.ascii_dump(vnout);
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Universe and empty, mixed dimensions.
+bool
+test03() {
+  Grid gr1(4, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  stringstream ss1;
+  gr1.ascii_dump(ss1);
+
+  gr1.ascii_dump(vnout);
+
+  Grid gr2(3);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  stringstream ss2;
+  gr2.ascii_dump(ss2);
+
+  gr2.ascii_dump(vnout);
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Grids of same dimensions.
+bool
+test04() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr1(4, EMPTY);
+  gr1.add_generator(grid_point(3*A + C));
+  gr1.add_generator(parameter(3*A));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  stringstream ss1;
+  gr1.ascii_dump(ss1);
+
+  gr1.ascii_dump(vnout);
+
+  Grid gr2(4);
+  gr2.add_congruence(3*A == 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  stringstream ss2;
+  gr2.ascii_dump(ss2);
+
+  gr2.ascii_dump(vnout);
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Grids of mixed dimensions.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(3*A + C));
+  gr1.add_generator(parameter(3*A));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  stringstream ss1;
+  gr1.ascii_dump(ss1);
+
+  gr1.ascii_dump(vnout);
+
+  Grid gr2(4);
+  gr2.add_congruence(3*A == 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  stringstream ss2;
+  gr2.ascii_dump(ss2);
+
+  gr2.ascii_dump(vnout);
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/bhz03widening1.cc b/tests/Grid/bhz03widening1.cc
new file mode 100644
index 0000000..58000fb
--- /dev/null
+++ b/tests/Grid/bhz03widening1.cc
@@ -0,0 +1,111 @@
+/* Test Polyhedra_Powerset<Grid>::BHZ03_widening_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+typedef Polyhedra_Powerset<Grid> GSet;
+
+namespace {
+
+// Joins of grids in powersets shows that series is stabilising.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  GSet grs1(2, EMPTY);
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence(B %= 0);
+  grs1.add_disjunct(gr1);
+
+  print_congruences<Grid>(grs1, "*** grs1 ***");
+
+  GSet grs2(2, EMPTY);
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  grs2.add_disjunct(gr2);
+
+  print_congruences<Grid>(grs2, "*** grs2 ***");
+
+  GSet known_grs = grs2;
+
+  grs2.BHZ03_widening_assign<Grid_Certificate>
+    (grs1, widen_fun_ref(&Grid::widening_assign));
+
+  bool ok = (grs2 == known_grs);
+
+  print_congruences<Grid>(grs1, "*** grs2.BHZ03_widening_assign<Grid_Certificate>(grs1, widen_fun_ref(&Grid::widening_assign) ***");
+
+  return ok;
+}
+
+// Widening falls back to a singleton join of the grids in the larger
+// grid set.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  GSet grs1(2, EMPTY);
+  Grid gr1(2);
+  gr1.add_congruence(A - B %= 0);
+  Grid gr2(2);
+  gr2.add_congruence((A %= 0) / 2);
+  grs1.add_disjunct(gr1);
+  grs1.add_disjunct(gr2);
+
+  print_congruences<Grid>(grs1, "*** grs1 ***");
+
+  GSet grs2(2, EMPTY);
+  Grid gr3(2);
+  gr3.add_congruence(A - B %= 0);
+  Grid gr4(2);
+  gr4.add_congruence((A %= 0) / 2);
+  grs2.add_disjunct(gr3);
+  grs2.add_disjunct(gr4);
+
+  print_congruences<Grid>(grs2, "*** grs2 ***");
+
+  Grid known_gr = gr3;
+  known_gr.upper_bound_assign(gr4);
+
+  grs2.BHZ03_widening_assign<Grid_Certificate>
+    (grs1, widen_fun_ref(&Grid::widening_assign));
+
+  GSet known_grs(2, EMPTY);
+  known_grs.add_disjunct(known_gr);
+
+  bool ok = (grs2 == known_grs);
+
+  print_congruences<Grid>(grs1, "*** grs2.BHZ03_widening_assign<Grid_Certificate>(grs1, widen_fun_ref(&Grid::widening_assign) ***");
+
+  return ok;
+}
+
+} // namespace
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/bounded1.cc b/tests/Grid/bounded1.cc
new file mode 100644
index 0000000..53db200
--- /dev/null
+++ b/tests/Grid/bounded1.cc
@@ -0,0 +1,397 @@
+/* Test Grid::is_bounded().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  bool ok = (gr.is_bounded());
+
+  print_congruences(gr,
+        "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+  Grid gr(0, EMPTY);
+
+  bool ok = (gr.is_bounded());
+
+  print_congruences(gr,
+        "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.is_bounded());
+
+  print_congruences(gr,
+        "*** gr ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 2*B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B == 2);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = gr_gs_min.is_bounded()
+    && gr_gs_needs_min.is_bounded()
+    && gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Line.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B == 2);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = !gr_gs_min.is_bounded()
+    && !gr_gs_needs_min.is_bounded()
+    && !gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + B));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_generator(grid_point(3*A + B));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+  gr_cgs_needs_min.add_congruence(C == 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = !gr_gs_min.is_bounded()
+    && !gr_gs_needs_min.is_bounded()
+    && !gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_generator(grid_point(3*A + B));
+  gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = !gr_gs_min.is_bounded()
+    && !gr_gs_needs_min.is_bounded()
+    && !gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Skew.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_point(A));
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_point(A));
+  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = !gr_gs_min.is_bounded()
+    && !gr_gs_needs_min.is_bounded()
+    && !gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Skew with lines.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_point(A));
+  gr_gs_min.add_generator(grid_line(C));
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_point(A));
+  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = !gr_gs_min.is_bounded()
+    && !gr_gs_needs_min.is_bounded()
+    && !gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Plane.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(4, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_line(B));
+  gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(4, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(B));
+  gr_gs_needs_min.add_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(4);
+  gr_cgs_needs_min.add_congruence(A == 0);
+  gr_cgs_needs_min.add_congruence(D == 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = !gr_gs_min.is_bounded()
+    && !gr_gs_needs_min.is_bounded()
+    && !gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Point in 6D.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Grid gr_gs_min(6, EMPTY);
+  gr_gs_min.add_generator_and_minimize(grid_point(7*A - 11*B + 19*F));
+
+  Grid gr_gs_needs_min(6, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(7*A - 11*B + 19*F));
+
+  Grid gr_cgs_needs_min(6);
+  gr_cgs_needs_min.add_congruence(A == 7);
+  gr_cgs_needs_min.add_congruence(B == -11);
+  gr_cgs_needs_min.add_congruence(C == 0);
+  gr_cgs_needs_min.add_congruence(D == 0);
+  gr_cgs_needs_min.add_congruence(E == 0);
+  gr_cgs_needs_min.add_congruence(F == 19);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = gr_gs_min.is_bounded()
+    && gr_gs_needs_min.is_bounded()
+    && gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// A single point, duplicated.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(3*A + 2*B));
+  gr.add_generator(grid_point(3*A + 2*B));
+
+  bool ok = (gr.is_bounded());
+
+  print_congruences(gr,
+        "*** gr ***");
+
+  return ok;
+}
+
+// A parameter that comes first in the generator system.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(parameter(3*A + 2*B));
+  gs.insert(grid_point(3*A + 2*B));
+
+  Grid gr(gs);
+
+  bool ok = (!gr.is_bounded());
+
+  print_congruences(gr,
+        "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/boundingbox1.cc b/tests/Grid/boundingbox1.cc
new file mode 100644
index 0000000..51875c1
--- /dev/null
+++ b/tests/Grid/boundingbox1.cc
@@ -0,0 +1,295 @@
+/* Test Grid::Grid(Box&, From_Bounding_Box).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+// This constructor is also tested via coveringbox2.cc.
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe box.
+bool
+test01() {
+  Bounding_Box box(2);
+
+  Grid gr(box, From_Bounding_Box());
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr(box, From_Bounding_Box() ***");
+
+  return ok;
+}
+
+// A 2D box which is a line parallel to the x axis.
+bool
+test02() {
+  Variable B(1);
+
+  Bounding_Box box(2);
+  box.raise_lower_bound(1, true, 2, 3);
+  box.lower_upper_bound(1, true, 2, 3);
+
+  Grid gr(box, From_Bounding_Box());
+
+  Grid known_gr(2);
+  known_gr.add_congruence(3*B == 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr(box, From_Bounding_Box() ***");
+
+  return ok;
+}
+
+// A 2D box that is a point, with divisors.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, -2, 3);
+  box.lower_upper_bound(0, true, -2, 3);
+  box.raise_lower_bound(1, true, -10, 1);
+  box.lower_upper_bound(1, true, -10, 1);
+
+  Grid gr(box, From_Bounding_Box());
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(-2*A - 30*B, 3));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr(box, From_Bounding_Box() ***");
+
+  return ok;
+}
+
+// A 3D box which is a 2D plane.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box(3);
+  box.raise_lower_bound(2, true, 15, 5);
+  box.lower_upper_bound(2, true, 15, 5);
+
+  Grid gr(box, From_Bounding_Box());
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(3*C));
+  known_gr.add_generator(grid_line(A));
+  known_gr.add_generator(grid_line(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr(box, From_Bounding_Box() ***");
+
+  return ok;
+}
+
+// Zero-dimensional box.
+bool
+test05() {
+  Bounding_Box box(0);
+
+  Grid gr(box, From_Bounding_Box());
+
+  Grid known_gr;
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr(box, From_Bounding_Box()) ***");
+
+  return ok;
+}
+
+// Empty box in 2D.
+bool
+test06() {
+  Bounding_Box box(2);
+  box.set_empty();
+
+  Grid gr(box, From_Bounding_Box());
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr(box, From_Bounding_Box()) ***");
+
+  return ok;
+}
+
+// A 4D box containing a single 3D space.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Bounding_Box box(4);
+  box.raise_lower_bound(3, true, 4, 1);
+  box.lower_upper_bound(3, true, 4, 1);
+
+  Grid gr(box, From_Bounding_Box());
+
+  Grid known_gr(4);
+  known_gr.add_constraint(D == 4);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr(box, From_Bounding_Box()) ***");
+
+  return ok;
+}
+
+// Unit square.
+bool
+test08() {
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 0, 1);
+  box.lower_upper_bound(0, true, 1, 1);
+  box.raise_lower_bound(1, true, 0, 1);
+  box.lower_upper_bound(1, true, 1, 1);
+
+  try {
+    Grid gr(box, From_Bounding_Box());
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Simple box with divisor and an interval bounded only from below.
+bool
+test09() {
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 0, 1);
+  box.raise_lower_bound(1, true, 0, 1);
+  box.lower_upper_bound(1, true, 1, 2);
+
+  try {
+    Grid gr(box, From_Bounding_Box());
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Box with a dimension bounded only from above.
+bool
+test10() {
+  Bounding_Box box(2);
+  box.lower_upper_bound(0, true, 3, 7);
+  box.raise_lower_bound(1, true, 0, 1);
+  box.lower_upper_bound(1, true, 1, 2);
+
+  try {
+    Grid gr(box, From_Bounding_Box());
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// An otherwise valid box having a dimension with an open bound, where
+// the open bound makes the box empty.
+bool
+test11() {
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 3, 7);
+  box.lower_upper_bound(0, true, 3, 7);
+  box.raise_lower_bound(1, false, 1, 2);
+  box.lower_upper_bound(1, true, 1, 2);
+
+  try {
+    Grid gr(box, From_Bounding_Box());
+   }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Zero-dimensional empty box.
+bool
+test12() {
+  Bounding_Box box(0);
+  box.set_empty();
+
+  Grid gr(box, From_Bounding_Box());
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr(box, From_Bounding_Box()) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/boundingbox2.cc b/tests/Grid/boundingbox2.cc
new file mode 100644
index 0000000..30330ff
--- /dev/null
+++ b/tests/Grid/boundingbox2.cc
@@ -0,0 +1,520 @@
+/* Test Grid::shrink_bounding_box(Box&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+bool
+operator==(const Bounding_Box& x, const Bounding_Box& y) {
+  dimension_type dimension = x.space_dimension();
+  if (dimension != y.space_dimension())
+    return false;
+
+  if (x.is_empty() && y.is_empty())
+    return true;
+
+  if (x.is_empty() || y.is_empty())
+    return false;
+
+  TEMP_INTEGER(n_x);
+  TEMP_INTEGER(n_y);
+  TEMP_INTEGER(d_x);
+  TEMP_INTEGER(d_y);
+
+  for (dimension_type i = dimension; i-- > 0; ) {
+    bool tem;
+    bool x_closed = x.get_lower_bound(i, tem, n_x, d_x);
+    bool y_closed = y.get_lower_bound(i, tem, n_y, d_y);
+    if (x_closed == y_closed) {
+      if (x_closed && (n_x != n_y || d_x != d_y))
+	return false;
+    }
+    else
+      return false;
+    x_closed = x.get_upper_bound(i, tem, n_x, d_x);
+    y_closed = y.get_upper_bound(i, tem, n_y, d_y);
+    if (x_closed == y_closed) {
+      if (x_closed && (n_x != n_y || d_x != d_y))
+	return false;
+    }
+    else
+      return false;
+  }
+
+  return true;
+}
+
+// Minimized rectilinear grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 0, 1);
+  box.lower_upper_bound(0, true, 3, 1);
+  box.raise_lower_bound(1, true, 1, 1);
+  box.lower_upper_bound(1, true, 3, 1);
+
+  Bounding_Box known_box(box);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(B));
+  gr.add_generator(grid_point(3*A + B));
+  gr.add_generator(grid_point(3*A + 3*B));
+
+  gr.shrink_bounding_box(box);
+  nout << "*** box ***" << endl << box << endl;
+
+  bool ok = (box == known_box);
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box) ***");
+
+  return ok;
+}
+
+// Skew grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 3, 2);
+  box.lower_upper_bound(0, true, 4, 2);
+  box.raise_lower_bound(1, true, 7, 1);
+  box.lower_upper_bound(1, true, 8, 1);
+
+  Bounding_Box known_box(box);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(  A +   B));
+  gr.add_generator(grid_point(2*A + 3*B));
+  gr.add_generator(grid_point(  A + 4*B));
+
+  gr.shrink_bounding_box(box);
+  nout << "*** box ***" << endl << box << endl;
+
+  bool ok = (box == known_box);
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box) ***");
+
+  return ok;
+}
+
+// Skew grid, with a divisor.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 0, 2);
+  box.lower_upper_bound(0, true, 1, 2);
+  box.raise_lower_bound(1, true, 0, 2);
+  box.lower_upper_bound(1, true, 2, 2);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(2*A));
+  gr.add_generator(grid_point(  A + 2*B, 2));
+
+  Bounding_Box known_box(box);
+
+  gr.shrink_bounding_box(box);
+  nout << "*** box ***" << endl << box << endl;
+
+  bool ok = (box == known_box);
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box) ***");
+  return ok;
+}
+
+// Grid containing a line.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box(3);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_line(A + 2*B));
+  gr.add_generator(grid_point(C, 2));
+
+  gr.shrink_bounding_box(box);
+  nout << "*** box ***" << endl << box << endl;
+
+  Bounding_Box known_box(3);
+
+  bool ok = (box == known_box);
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test05() {
+  Bounding_Box box(3);
+  box.raise_lower_bound(0, true, 0, 1);
+  box.lower_upper_bound(0, true, 0, 1);
+
+  Grid gr(3);
+
+  Bounding_Box known_box(box);
+
+  gr.shrink_bounding_box(box);
+  nout << "*** box ***" << endl << box << endl;
+
+  bool ok = (box == known_box);
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box) ***");
+
+  return ok;
+}
+
+// Grid which is a single point.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box1(3);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point(16*A + 6*B - 6*C, 7));
+
+  gr.shrink_bounding_box(box1);
+  nout << "*** box1 ***" << endl << box1 << endl;
+
+  Bounding_Box known_box(3);
+  known_box.raise_lower_bound(0, true, 16, 7);
+  known_box.lower_upper_bound(0, true, 16, 7);
+  known_box.raise_lower_bound(1, true, 6, 7);
+  known_box.lower_upper_bound(1, true, 6, 7);
+  known_box.raise_lower_bound(2, true, -6, 7);
+  known_box.lower_upper_bound(2, true, -6, 7);
+
+  bool ok = (box1 == known_box);
+  if (ok) {
+    Grid tem_gr(box1, From_Bounding_Box());
+    Bounding_Box box2(3);
+
+    tem_gr.shrink_bounding_box(box2);
+    nout << "*** box2 ***" << endl << box2 << endl;
+
+    ok = (box2 == known_box);
+  }
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box2) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test07() {
+  Bounding_Box box1(3);
+
+  Grid gr(3, EMPTY);
+
+  gr.shrink_bounding_box(box1);
+  nout << "*** box1 ***" << endl << box1 << endl;
+
+  Bounding_Box known_box(3);
+  known_box.set_empty();
+
+  bool ok = (box1 == known_box);
+  if (ok) {
+    Grid tem_gr(box1, From_Bounding_Box());
+    Bounding_Box box2(3);
+
+    tem_gr.shrink_bounding_box(box2);
+    nout << "*** box2 ***" << endl << box2 << endl;
+
+    ok = (box2 == known_box);
+  }
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box2) ***");
+
+  return ok;
+}
+
+// A grid with redundant generators.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box(3);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A + B));
+  gr.add_generator(grid_point(A));
+  gr.add_generator(grid_point(2*A));
+
+  gr.shrink_bounding_box(box);
+  nout << "*** box ***" << endl << box << endl;
+
+  Bounding_Box known_box(3);
+  known_box.lower_upper_bound(2, true, 0, 1);
+  known_box.raise_lower_bound(2, true, 0, 1);
+
+  bool ok = (box == known_box);
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box) ***");
+
+  return ok;
+}
+
+// A grid defined by congruences.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box(3);
+
+  Grid gr(3);
+  gr.add_congruence((A + 2*C %= 0) / 2);
+  gr.add_congruence((A %= 0) / 5);
+  gr.add_congruence(2*B == 3);
+
+  gr.shrink_bounding_box(box);
+  nout << "*** box ***" << endl << box << endl;
+
+  Bounding_Box known_box(3);
+  known_box.raise_lower_bound(1, true, 3, 2);
+  known_box.lower_upper_bound(1, true, 3, 2);
+
+  bool ok = (box == known_box);
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box) ***");
+
+  return ok;
+}
+
+// An otherwise valid box having a dimension with an open bound, where
+// the open bound makes the box empty.
+bool
+test10() {
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 3, 7);
+  box.lower_upper_bound(0, true, 3, 7);
+  box.raise_lower_bound(1, false, 1, 2);
+  box.lower_upper_bound(1, true, 1, 2);
+
+  Grid gr(3);
+
+  try {
+    gr.shrink_bounding_box(box);
+    }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// An empty grid defined by congruences.
+bool
+test11() {
+  Variable A(0);
+
+  Bounding_Box box1(3);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 0) / 2);
+  gr.add_congruence((A %= 1) / 2);
+
+  gr.shrink_bounding_box(box1);
+  nout << "*** box1 ***" << endl << box1 << endl;
+
+  Bounding_Box known_box(3);
+  known_box.set_empty();
+
+  bool ok = (box1 == known_box);
+  if (ok) {
+    Grid tem_gr(box1, From_Bounding_Box());
+    Bounding_Box box2(3);
+
+    tem_gr.shrink_bounding_box(box2);
+    nout << "*** box2 ***" << endl << box2 << endl;
+
+    ok = (box2 == known_box);
+  }
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box2) ***");
+
+  return ok;
+}
+
+// Simple grid where all the points have the same value in one of the
+// dimensions (B).
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Bounding_Box box1(4);
+
+  Grid gr(4, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A));
+  gr.add_generator(grid_point(C));
+  gr.add_generator(grid_point(D));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.shrink_bounding_box(box1);
+  nout << "*** box1 ***" << endl << box1 << endl;
+
+  Bounding_Box known_box(4);
+  known_box.lower_upper_bound(1, true, 0, 1);
+  known_box.raise_lower_bound(1, true, 0, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box) ***");
+
+  return ok;
+}
+
+// Simple grid, with a divisor, such that the fractions for some
+// intervals (B and C) will be reduced before being assigned to the
+// intervals.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Bounding_Box box(4);
+
+  Grid gr(4, EMPTY);
+  gr.add_generator(grid_point(  A + 2*B + 4*C, 4));
+  gr.add_generator(grid_point(2*A + 2*B + 4*C, 4));
+  gr.add_generator(grid_point(  A + 2*B + 4*C + D, 4));
+
+  gr.shrink_bounding_box(box);
+  nout << "*** box ***" << endl << box << endl;
+
+  Bounding_Box known_box(4);
+  known_box.lower_upper_bound(1, true, 1, 2);
+  known_box.raise_lower_bound(1, true, 1, 2);
+  known_box.lower_upper_bound(2, true, 1, 1);
+  known_box.raise_lower_bound(2, true, 1, 1);
+
+  bool ok = (box == known_box);
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test14() {
+  Bounding_Box box(0);
+
+  Grid gr(0, EMPTY);
+
+  gr.shrink_bounding_box(box);
+  nout << "*** box ***" << endl << box << endl;
+
+  Bounding_Box known_box(0);
+  known_box.set_empty();
+
+  bool ok = (box == known_box);
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box) ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test15() {
+  Bounding_Box box(0);
+
+  Grid gr(0);
+
+  gr.shrink_bounding_box(box);
+  nout << "*** box ***" << endl << box << endl;
+
+  Bounding_Box known_box(0);
+
+  bool ok = (box == known_box);
+
+  print_congruences(gr,
+      "*** gr.shrink_bounding_box(box) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/bounds1.cc b/tests/Grid/bounds1.cc
new file mode 100644
index 0000000..26b15d9
--- /dev/null
+++ b/tests/Grid/bounds1.cc
@@ -0,0 +1,441 @@
+/* Test Grid::bounds_from_above() and Grid::bounds_from_below().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  bool ok = (gr.bounds_from_above(Linear_Expression(0))
+	     && gr.bounds_from_below(Linear_Expression(0)));
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+  Grid gr(0, EMPTY);
+
+  bool ok = (gr.bounds_from_above(Linear_Expression(3))
+	     && gr.bounds_from_below(Linear_Expression(3)));
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.bounds_from_above(Linear_Expression(1))
+	     && gr.bounds_from_below(Linear_Expression(1)));
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 2*B, 3));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B, 3));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(A == 1);
+  gr_cgs_needs_min.add_congruence(3*B == 2);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = A + B;
+  bool ok = gr_gs_min.bounds_from_above(le)
+    && gr_gs_min.bounds_from_below(le)
+    && gr_gs_needs_min.bounds_from_above(le)
+    && gr_gs_needs_min.bounds_from_below(le)
+    && gr_cgs_needs_min.bounds_from_above(le)
+    && gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Rectilinear line.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator_and_minimize(grid_line(B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(A == 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = 2*A - B;
+
+  bool ok = !gr_gs_min.bounds_from_above(le)
+    && !gr_gs_min.bounds_from_below(le)
+    && !gr_gs_needs_min.bounds_from_above(le)
+    && !gr_gs_needs_min.bounds_from_below(le)
+    && !gr_cgs_needs_min.bounds_from_above(le)
+    && !gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Line.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator_and_minimize(grid_line(2*A + B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(2*A + B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(A - 2*B == 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = 2*A + B;
+  bool ok = !gr_gs_min.bounds_from_above(le)
+    && !gr_gs_min.bounds_from_below(le)
+    && !gr_gs_needs_min.bounds_from_above(le)
+    && !gr_gs_needs_min.bounds_from_below(le)
+    && !gr_cgs_needs_min.bounds_from_above(le)
+    && !gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// A line along expr in the grid.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator_and_minimize(grid_line(A + 2*B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(2*A - B == 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = 2*A - B;
+  bool ok = gr_gs_min.bounds_from_above(le)
+    && gr_gs_min.bounds_from_below(le)
+    && gr_gs_needs_min.bounds_from_above(le)
+    && gr_gs_needs_min.bounds_from_below(le)
+    && gr_cgs_needs_min.bounds_from_above(le)
+    && gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+
+// A parameter along expr in the grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator_and_minimize(grid_point(A + 2*B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_point(A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(2*A - B == 0);
+  gr_cgs_needs_min.add_congruence((B %= 0) / 2);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = 2*A - B;
+  bool ok = gr_gs_min.bounds_from_above(le)
+    && gr_gs_min.bounds_from_below(le)
+    && gr_gs_needs_min.bounds_from_above(le)
+    && gr_gs_needs_min.bounds_from_below(le)
+    && gr_cgs_needs_min.bounds_from_above(le)
+    && gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Two lines which combine to cover any line bounded by expr.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_line(A));
+  gr_gs_min.add_generator_and_minimize(grid_line(B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(A));
+  gr_gs_needs_min.add_generator(grid_line(B));
+
+  Grid gr_cgs_needs_min(2);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = A - B;
+  bool ok = !gr_gs_min.bounds_from_above(le)
+    && !gr_gs_min.bounds_from_below(le)
+    && !gr_gs_needs_min.bounds_from_above(le)
+    && !gr_gs_needs_min.bounds_from_below(le)
+    && !gr_cgs_needs_min.bounds_from_above(le)
+    && !gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// In three dimensions, lines and parameters which combine to include
+// expr.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_line(A));
+  gr_gs_min.add_generator_and_minimize(grid_point(B + C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(A));
+  gr_gs_needs_min.add_generator(grid_point(B + C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(B - C == 0);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = 2*A + B - C;
+   bool ok = !gr_gs_min.bounds_from_above(le)
+     && !gr_gs_min.bounds_from_below(le)
+     && !gr_gs_needs_min.bounds_from_above(le)
+     && !gr_gs_needs_min.bounds_from_below(le)
+     && !gr_cgs_needs_min.bounds_from_above(le)
+     && !gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Grid which bounds a 3D expr.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_line(3*B + C));
+  gr_gs_min.add_generator_and_minimize(grid_line(A - 2*B));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(3*B + C));
+  gr_gs_needs_min.add_generator(grid_line(A - 2*B));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(2*A + B - 3*C == 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = 2*A + B - 3*C;
+  bool ok = gr_gs_min.bounds_from_above(le)
+    && gr_gs_min.bounds_from_below(le)
+    && gr_gs_needs_min.bounds_from_above(le)
+    && gr_gs_needs_min.bounds_from_below(le)
+    && gr_cgs_needs_min.bounds_from_above(le)
+    && gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Point in 6D.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Grid gr_gs_min(6, EMPTY);
+  gr_gs_min.add_generator_and_minimize(grid_point(7*A - 11*B + 19*F));
+
+  Grid gr_gs_needs_min(6, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(7*A - 11*B + 19*F));
+
+  Grid gr_cgs_needs_min(6);
+  gr_cgs_needs_min.add_congruence(A == 7);
+  gr_cgs_needs_min.add_congruence(B == -11);
+  gr_cgs_needs_min.add_congruence(C == 0);
+  gr_cgs_needs_min.add_congruence(D == 0);
+  gr_cgs_needs_min.add_congruence(E == 0);
+  gr_cgs_needs_min.add_congruence(F == 19);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = A + 2*B + 3*C + 4*D + 6*F;
+  bool ok = gr_gs_min.bounds_from_above(le)
+    && gr_gs_min.bounds_from_below(le)
+    && gr_gs_needs_min.bounds_from_above(le)
+    && gr_gs_needs_min.bounds_from_below(le)
+    && gr_cgs_needs_min.bounds_from_above(le)
+    && gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+
+  Linear_Expression le = A + 2*B + 3*C + 4*D + 6*F;
+
+  try {
+    gr.bounds_from_above(le);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/certificate1.cc b/tests/Grid/certificate1.cc
new file mode 100644
index 0000000..03acf29
--- /dev/null
+++ b/tests/Grid/certificate1.cc
@@ -0,0 +1,228 @@
+/* Test class Grid_Certificate.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Compare a grid to one that is more constrained (due to equalities).
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A + C %= 0);
+  gr1.add_congruence(B == 3);
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point(3*B + A));
+  gr2.add_generator(grid_point(3*B + A + C));
+
+  Grid_Certificate grc2(gr2);
+
+  bool ok = grc1.compare(grc2) == -1;
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Compare a grid to one that is more constrained (due to proper
+// congruences).
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A + C %= 0);
+  gr1.add_congruence(B == 3);
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point(3*B + A));
+  gr2.add_generator(grid_point(3*B + A + C));
+
+  bool ok = grc1.compare(gr2) == -1;
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Compare a grid to an equally constrained one.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A + C %= 0);
+  gr1.add_congruence(B == 3);
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point(3*B));
+  gr2.add_generator(grid_line(A - C));
+  gr2.add_generator(grid_point(3*B + A));
+
+  Grid_Certificate grc2(gr2);
+
+  bool ok = grc1.compare(grc2) == 0
+    && !grc1.is_stabilizing(gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Compare a grid to one that is less constrained (due to equalities).
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(3*B + A));
+  gr1.add_generator(grid_point(3*B + A + C));
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(3);
+  gr2.add_congruence(A + C %= 0);
+  gr2.add_congruence(B == 3);
+
+  bool ok = grc1.compare(gr2) == 1
+    && grc1.is_stabilizing(gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Compare a grid to one that is less constrained (due to proper
+// congruences).
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + C %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 3);
+  gr1.add_congruence(A %= 0);
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(3);
+  gr2.add_congruence((A + C %= 0) / 2);
+  gr2.add_congruence((B %= 0) / 3);
+
+  Grid_Certificate grc2(gr2);
+
+  Grid_Certificate::Compare cmp;
+
+  bool ok = cmp(grc1, grc2)
+    && grc1.is_stabilizing(gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Compare certificates for zero dimension universe grids.
+bool
+test06() {
+  Grid gr1(0);
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(0);
+
+  Grid_Certificate grc2(gr2);
+
+  bool ok (grc1.compare(grc2) == 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Compare a grid to one that is more constrained, where the minimized
+// generators are used for the comparison.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A + C %= 0);
+  gr1.add_congruence(B == 3);
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point(3*B + A + C));
+  gr2.add_generator_and_minimize(grid_point(3*B + A));
+
+  // Ensure up to date congruences and minimized generators.
+  gr2.affine_image(A, 1*A);
+  gr2.minimized_generators();
+
+  bool ok = (grc1.compare(gr2) == -1);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Grid/concatenate1.cc b/tests/Grid/concatenate1.cc
new file mode 100644
index 0000000..81f432b
--- /dev/null
+++ b/tests/Grid/concatenate1.cc
@@ -0,0 +1,341 @@
+/* Test Grid::concatenate_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// From congruences.
+bool
+test01() {
+  Variable B(1);
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+
+  Grid gr1(cgs);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  cgs.clear();
+  cgs.insert((A %= 1) / 2);
+
+  Grid gr2(cgs);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 0) / 2);
+  known_cgs.insert((B %= 1) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// First grid empty.
+bool
+test02() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr1(2, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 0) / 2);
+
+  Grid gr2(cgs);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid empty.
+bool
+test03() {
+  Variable A(0);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 0) / 2);
+
+  Grid gr1(cgs);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// First grid a universe.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr1(1, UNIVERSE);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(A + C));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(gs);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(B));
+  known_gs.insert(grid_point(B + D));
+  known_gs.insert(grid_line(A));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(A + C));
+
+  Grid gr1(gs);
+
+  print_generators(gr1, "*** gr1 ***");
+
+  gs.clear();
+  gs.insert(grid_point(0*B));
+  gs.insert(grid_point(B));
+
+  Grid gr2(gs);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A == 1) / 0);
+  known_cgs.insert((C %= 0) / 1);
+  known_cgs.insert((B == 0) / 0);
+  known_cgs.insert((D == 0) / 0);
+  known_cgs.insert((E %= 0) / 1);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// First grid empty via the congruence system.
+bool
+test06() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((A %= 1) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid empty via the congruence system.
+bool
+test07() {
+  Variable A(0);
+
+  Grid gr1(2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence((A %= 1) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test08() {
+  Variable A(0);
+
+  Grid gr1(0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr1(0, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test10() {
+  Grid gr1(7);
+
+  Grid gr2(1);
+  gr2.add_congruence(Congruence::zero_dim_integrality());
+  gr2.minimized_congruences();
+  gr2.ascii_dump();
+  // This needs to allocate a lot of memory, in order to create the
+  // integrality congruence.  The presence of the integrality
+  // congruence is required by the conversion.
+
+  gr2.add_space_dimensions_and_embed(Grid::max_space_dimension() - 1);
+  print_congruences(gr2, "*** gr2 ***");
+
+  try {
+    gr1.concatenate_assign(gr2);
+  }
+  catch (const std::length_error& e) {
+    nout << "max_space_dimension_exceeded: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  //  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/congruence1.cc b/tests/Grid/congruence1.cc
new file mode 100644
index 0000000..be273a7
--- /dev/null
+++ b/tests/Grid/congruence1.cc
@@ -0,0 +1,377 @@
+/* Test class Congruence.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+class Test_Congruence : public Congruence {
+public:
+  Test_Congruence(Congruence cg) : Congruence(cg) {}
+  Test_Congruence(Constraint c) : Congruence(c) {}
+  void strong_normalize() { Congruence::strong_normalize(); }
+  void normalize() { Congruence::normalize(); }
+};
+
+// Negative inhomogeneous term.
+static bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((A + 2*B + 3*C %= 5) / 7);
+  a.strong_normalize();
+
+  Test_Congruence b((A %= 5 - 3*C - 2*B) / 7);
+  b.strong_normalize();
+
+  bool ok (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Positive inhomogeneous term.
+static bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((A + 2*B + 3*C %= -5) / 7);
+  a.strong_normalize();
+
+  Test_Congruence b((A %= -5 - 3*C - 2*B) / 7);
+  b.strong_normalize();
+
+  bool ok (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Common factors and reducible positive inhomogeneous term.
+static bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((16*A + 2*B + 8*C + 64 %= 0) / 4);
+  a.strong_normalize();
+
+  Test_Congruence b((16*A + 2*B %= - 64 - 8*C) / 4);
+  b.strong_normalize();
+
+  bool ok (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Negative first coefficient.
+static bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((- A + 2*B + 3*C %= 5) / 7);
+  a.strong_normalize();
+
+  Test_Congruence b((- A %= - 2*B + 5 - 3*C) / 7);
+  b.strong_normalize();
+
+  bool ok (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Constructed with only the %= operator.
+static bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence c(A + 4*B + 3*C %= 5);
+  Test_Congruence a(c);
+  //Test_Congruence a = (A + 4*B + 3*C %= 5);
+  //Test_Congruence a(A + 4*B + 3*C %= 5);
+  a.strong_normalize();
+
+  Test_Congruence b(A + 4*B %= 5 - 3*C);
+  b.strong_normalize();
+
+  bool ok (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Equality congruence (a modulus of 0).
+static bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((3*A + 24*B + 3*C %= -19) / 0);
+  a.strong_normalize();
+
+  Test_Congruence b((3*A + 24*B %= -19 - 3*C) / 0);
+  b.strong_normalize();
+
+  bool ok (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Constructed from a Constraint with the `/' operator.
+static bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((A + 4*B + 3*C == 17) / 3);
+  a.strong_normalize();
+
+  Test_Congruence b((A + 4*B == 17 - 3*C) / 3);
+  b.strong_normalize();
+
+  bool ok (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Constructed from a Constraint.
+static bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a(A + 4*B + 3*C == 17);
+  a.strong_normalize();
+
+  Test_Congruence b(A + 4*B == 17 - 3*C);
+  b.strong_normalize();
+
+  bool ok (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Set modulus with `/='.
+static bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a(A + 4*B + 3*C == 17);
+  a /= 3;
+  a.strong_normalize();
+
+  Test_Congruence b(A + 4*B == 17 - 3*C);
+  b /= 3;
+  b.strong_normalize();
+
+  bool ok (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// is_trivial_true and is_trivial_false.
+static bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a(0*A + 0*B + 0*C %= 17);
+
+  bool ok = (a.is_trivial_true()) && (!a.is_trivial_false());
+
+  print_congruence(a, "*** a(0*A + 0*B + 0*C %= 17) ***");
+
+  a = Test_Congruence((0*A + 0*B + 0*C %= 0) / 3);
+  ok &= a.is_trivial_true()
+    && !a.is_trivial_false();
+
+  a = Test_Congruence((0*A + 0*B + 8 %= 0) / 4);
+  ok &= a.is_trivial_true()
+    && !a.is_trivial_false();
+
+  print_congruence(a, "*** a = Test_Congruence((0*A + 0*B + 8 %= 0) / 4) ***");
+
+  a = Test_Congruence(0*A + 0*B %= 17);
+  a /= 0;
+  ok &= !a.is_trivial_true()
+    && a.is_trivial_false();
+
+  print_congruence(a, "*** a = Test_Congruence(0*A + 0*B %= 17) ***");
+
+  a = Test_Congruence((0*A + 0*B + 3 %= 0) / 0);
+  a.strong_normalize();
+  ok &= !a.is_trivial_true()
+    && a.is_trivial_false();
+
+  print_congruence(a, "*** a = Test_Congruence((0*A + 0*B + 3 %= 0) / 0) ***");
+
+  a = Test_Congruence((0*A + 0*B + 4 %= 0) / 3);
+  a.strong_normalize();
+  ok &= !a.is_trivial_true()
+    && a.is_trivial_false();
+
+  print_congruence(a, "*** a = Test_Congruence((0*A + 0*B + 4 %= 0) / 3) ***");
+
+  return ok;
+}
+
+// Negative moduli.
+static bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((A + 4*B + 3*C %= -4) / -3);
+  a.strong_normalize();
+
+  Test_Congruence b((A + 4*B %= -1 - 3*C) / -3);
+  b.strong_normalize();
+
+  bool ok (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Negative modulus and negative first coefficient.
+
+static bool
+test12() {
+  Variable x0(0);
+  Variable x1(1);
+  Variable x2(2);
+  Variable x3(3);
+  Variable x4(4);
+
+  Test_Congruence a((-x0 + 4*x1 + 3*x2 + 17*x3 + 2*x4 %= -4) / -3);
+  a.strong_normalize();
+
+  Test_Congruence b((-x0 + 4*x1 %= - 3*x2 - 17*x3 - 2*x4 - 4) / -3);
+  b.strong_normalize();
+
+  bool ok (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Create from empty linear expression.
+static bool
+test13() {
+  Linear_Expression le;
+  Test_Congruence a(le %= le);
+  a.strong_normalize();
+
+  Test_Congruence b(le %= 0);
+  b.strong_normalize();
+
+  bool ok (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+static bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.add_congruence(A + C %= 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/congruences1.cc b/tests/Grid/congruences1.cc
new file mode 100644
index 0000000..b827194
--- /dev/null
+++ b/tests/Grid/congruences1.cc
@@ -0,0 +1,213 @@
+/* Test Grid::congruences().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+  Grid gr1(7, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test02() {
+  Grid gr1(7);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.congruences();
+
+  print_congruences(cgs, "*** cgs ***");
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+  Grid gr1(0, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+  Grid gr1(0);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 7);
+  gr1.add_congruence((A %= 0) / 5);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// 3D rectilinear grid defined by generators.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_generator(grid_point(10*B));
+  gr1.add_generator(grid_point(10*A + 10*B));
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Get a reference to the congruences, empty the grid, use the
+// reference to create a new grid.
+bool
+test07() {
+  Grid gr1(3);
+  gr1.add_congruence(Congruence::zero_dim_integrality());
+
+  const Congruence_System& cgs = gr1.congruences();
+
+  // Empty the grid.  The idea is to check that `cgs' still refers to
+  // a congruence system that matches the grid.
+  gr1.add_congruence(Congruence::zero_dim_false());
+
+  Grid known_gr = gr1;
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// In zero dimensions get a reference to the universe congruences,
+// empty the grid, use the reference to create a new grid.
+bool
+test08() {
+  Grid gr1(0);
+  gr1.add_congruence(Congruence::zero_dim_integrality());
+
+  const Congruence_System& cgs = gr1.congruences();
+
+  // Empty the grid.  The idea is to check that `cgs' still refers to
+  // a congruence system that matches the grid.
+  gr1.add_congruence_and_minimize(Congruence::zero_dim_false());
+
+  Grid known_gr = gr1;
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Grid/congruencesystem1.cc b/tests/Grid/congruencesystem1.cc
new file mode 100644
index 0000000..bef0083
--- /dev/null
+++ b/tests/Grid/congruencesystem1.cc
@@ -0,0 +1,419 @@
+/* Test Congruence_System::satisfies_all_congruences().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+class Test_Congruence_System : public Congruence_System {
+public:
+  Test_Congruence_System() : Congruence_System() {}
+  Test_Congruence_System(Congruence_System cgs) : Congruence_System(cgs) {}
+  Test_Congruence_System(Congruence cg) : Congruence_System(cg) {}
+  bool
+  satisfies_all_congruences(const Grid_Generator& g) const {
+    return Congruence_System::satisfies_all_congruences(g);
+  }
+};
+
+// Public constructors.
+bool
+test01() {
+  Test_Congruence_System cgs0;
+
+  print_congruences(cgs0, "*** cgs0 ***");
+
+  Test_Congruence_System cgs1(cgs0);
+
+  bool ok = (cgs1 == cgs0);
+
+  print_congruences(cgs1, "*** cgs1(cgs0) ***");
+
+  if (ok) {
+    Variable A(0);
+    Variable B(1);
+
+    Test_Congruence_System cgs2((A - 3*B %= 5) / 2);
+
+    ok &= !(cgs2 == cgs0) && !(cgs2 == cgs1);
+
+    print_congruences(cgs2, "*** cgs2((A - 3*B %= 5) / 2) ***");
+  };
+
+  return ok;
+}
+
+// operator=
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence_System cgs0;
+
+  Test_Congruence_System cgs1((A - 3*B + 21*C %= 5) / 2);
+
+  cgs0 = cgs1;
+
+  bool ok = (cgs0 == cgs1);
+
+  print_congruences(cgs0, "*** cgs0 ***");
+
+  return ok;
+}
+
+// space_dimension
+bool
+test03() {
+  Variable A(3);
+  Variable B(7);
+  Variable C(4);
+
+  Test_Congruence_System cgs0((A - 3*B + 21*C %= 55) / 21);
+
+  bool ok = (cgs0.space_dimension() == 8);
+
+  print_congruences(cgs0, "*** cgs0((A - 3*B + 21*C %= 55) / 21) ***");
+
+  return ok;
+}
+
+// clear
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Test_Congruence_System cgs0((A - 3*B %= 5) / 7);
+
+  print_congruences(cgs0, "*** cgs0 ***");
+
+  cgs0.clear();
+
+  bool ok = (cgs0.space_dimension() == 0);
+
+  print_congruences(cgs0, "*** cgs0.clear() ***");
+
+  return ok;
+}
+
+// insert
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Test_Congruence_System cgs0((A - 3*B + C - 18*D %= 5) / 7);
+  cgs0.insert((A %= 0) / 3);
+  cgs0.insert((A + B %= 3) / 5);
+
+  dimension_type tem = cgs0.num_proper_congruences();
+  bool ok = (tem == 3);
+
+  print_congruences(cgs0, "*** cgs0.insert ***");
+
+  return ok;
+}
+
+// num_[non_]equalities
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence_System cgs0((-A - B + 13*C %= 6) / 7);
+  cgs0.insert((A %= 0) / 0);
+  cgs0.insert((A + B %= 3) / 0);
+
+  dimension_type neqs = cgs0.num_equalities();
+  dimension_type npcgs = cgs0.num_proper_congruences();
+  bool ok = (neqs == 2 && npcgs == 1);
+
+  print_congruences(cgs0, "*** cgs0.insert ***");
+
+  return ok;
+}
+
+// insert, including a row with all terms zero and an equality.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence_System cgs0(0*A + 0*B %= -1);
+  cgs0.insert((A + 0*B %= 1) / 0);
+  cgs0.insert(0*A + 1*B %= 1);
+
+  dimension_type neqs = cgs0.num_equalities();
+  dimension_type npcgs = cgs0.num_proper_congruences();
+  bool ok = (neqs == 1 && npcgs == 2);
+
+  print_congruences(cgs0, "*** cgs0.insert ***");
+
+  return ok;
+}
+
+/* If PASS_EXPECTED is true:
+     If the first generator in GS satifies CGS, then return true, else
+     print an error message and return false.
+
+   And, symmetrically, if PASS_EXPECTED is false:
+     If the first generator in GS fails to satify CGS, then return
+     false, else print an error message and return true.
+
+   FIXME: If Generator::ascii_dump was public this could take a
+          Generator.
+*/
+bool
+fulfils(const Grid_Generator_System& gs,
+	const Test_Congruence_System& cgs,
+	bool pass_expected = false) {
+  Grid_Generator_System::const_iterator gi = gs.begin();
+
+  if (cgs.satisfies_all_congruences(*gi) == pass_expected)
+    return pass_expected;
+
+  nout << *gi << " should";
+  pass_expected || nout << "fail to";
+  nout << " satisfy " << cgs << "." << endl
+       << "ASCII dump of system holding " << *gi << ":" << endl;
+  gs.ascii_dump(nout);
+  nout << "ASCII dump of " << cgs << ":" << endl;
+  cgs.ascii_dump(nout);
+
+  return !pass_expected;
+}
+
+#define satisfies fulfils
+
+inline bool
+fails_to_satisfy(const Grid_Generator_System& gs,
+		 const Congruence_System& cgs) {
+  if (fulfils(gs, cgs, true))
+    return false;
+  return true;
+}
+
+// Divisor of 1.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Test_Congruence_System cgs0((A - B %= 0) / 7);
+  print_congruences(cgs0, "*** cgs0((A - B %= 0) / 7) ***");
+
+  Grid_Generator_System gs0;
+
+  // Points.
+
+  gs0.insert(grid_point());
+  bool ok = (!fails_to_satisfy(gs0, cgs0));
+  print_generators(gs0, "*** gs0.insert(grid_point()) ***");
+
+  gs0.clear();
+  gs0.insert(grid_point(A + B));
+  ok &= (!fails_to_satisfy(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_point(A + B)) ***");
+
+  gs0.clear();
+  gs0.insert(grid_point(A + 2*B));
+  ok &= (!satisfies(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_point(A + 2*B)) ***");
+
+  gs0.clear();
+  gs0.insert(grid_point(5*A + 2*B));
+  ok &= (!satisfies(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_point(5*A + 2*B)) ***");
+
+  gs0.clear();
+  gs0.insert(grid_point(5*A - 2*B));
+  ok &= (!fails_to_satisfy(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_point(5*A - 2*B)) ***");
+
+  // Parameters.
+
+  gs0.clear();
+  gs0.insert(parameter(3*A + 3*B));
+  ok &= (!fails_to_satisfy(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(parameter(3*A + 3*B)) ***");
+
+  gs0.clear();
+  gs0.insert(parameter(A + 14*B));
+  ok &= (satisfies(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(parameter(A + 14*B)) ***");
+
+  gs0.clear();
+  gs0.insert(parameter(-A + 13*B));
+  ok = (!fails_to_satisfy(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(parameter(-A + 13*B)) ***");
+
+  // Lines.
+
+  gs0.clear();
+  gs0.insert(grid_line(13*A + 13*B));
+  ok = (!fails_to_satisfy(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_line(13*A + 13*B)) ***");
+
+  gs0.clear();
+  gs0.insert(grid_line(18*A + 14*B));
+  ok = (!satisfies(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_line(18*A + 14*B)) ***");
+
+  gs0.clear();
+  gs0.insert(grid_line(14*A - 21*B));
+  ok = (!satisfies(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_line(14*A - 21*B)) ***");
+
+  cgs0.clear();
+  cgs0.insert((A %= 0) / 2);
+  gs0.clear();
+  gs0.insert(grid_line(3*A));
+  ok = (!satisfies(gs0, cgs0));
+  print_congruences(cgs0,
+    "*** cgs0.clear(); cgs0.insert((A %= 0) / 2) ***");
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_line(3*A)) ***");
+
+  return ok;
+}
+
+// Divisors greater than 1.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Test_Congruence_System cgs0((A - B %= 0) / 7);
+  print_congruences(cgs0,
+    "*** cgs0((A - B %= 0) / 7) ***");
+
+  Grid_Generator_System gs0;
+
+  // Points.
+  gs0.clear();
+  gs0.insert(grid_point(A + B, 3));
+  bool ok = (!fails_to_satisfy(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_point(A + B, 3)) ***");
+
+  gs0.clear();
+  gs0.insert(grid_point(A + 2*B, 3));
+  ok &= (!satisfies(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_point(A + 2*B, 3)) ***");
+
+  gs0.clear();
+  gs0.insert(grid_point(5*A + 2*B, 5));
+  ok &= (!satisfies(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_point(5*A + 2*B, 5)) ***");
+
+  gs0.clear();
+  gs0.insert(grid_point(5*A - 2*B, 7));
+  ok &= (!satisfies(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_point(5*A - 2*B, 7)) ***");
+
+  // Parameters.
+
+  gs0.clear();
+  gs0.insert(parameter(3*A + 3*B, 4));
+  ok &= (!fails_to_satisfy(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(parameter(3*A + 3*B, 4)) ***");
+
+  gs0.clear();
+  gs0.insert(parameter(A + 14*B, 5));
+  ok &= (!satisfies(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(parameter(A + 14*B, 5)) ***");
+
+  gs0.clear();
+  gs0.insert(parameter(-A + 13*B, 2));
+  ok &= (!fails_to_satisfy(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(parameter(-A + 13*B, 2)) ***");
+
+  // Lines.
+
+  gs0.clear();
+  gs0.insert(grid_line(13*A + 13*B));
+  ok &= (!fails_to_satisfy(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_line(13*A + 13*B)) ***");
+
+  gs0.clear();
+  gs0.insert(grid_line(18*A + 14*B));
+  ok &= (!satisfies(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_line(18*A + 14*B)) ***");
+
+  gs0.clear();
+  gs0.insert(grid_line(14*A - 21*B));
+  ok &= (!satisfies(gs0, cgs0));
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_line(14*A - 21*B)) ***");
+
+  cgs0.clear();
+  cgs0.insert((A %= 0) / 2);
+  gs0.clear();
+  gs0.insert(grid_line(3*A));
+  ok &= (!satisfies(gs0, cgs0));
+  print_congruences(cgs0,
+    "*** cgs0.clear(); cgs0.insert((A %= 0) / 2) ***");
+  print_generators(gs0,
+    "*** gs0.clear(); gs0.insert(grid_line(3*A)) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/contains1.cc b/tests/Grid/contains1.cc
new file mode 100644
index 0000000..4791e85
--- /dev/null
+++ b/tests/Grid/contains1.cc
@@ -0,0 +1,213 @@
+/* Test Grid::contains().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grid of points containing empty grid.
+bool
+test01() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+
+  Grid gr1(gs);
+
+  Grid gr2(1, EMPTY);
+
+  bool ok = (gr1.contains(gr2));
+
+  print_generators(gr1, "*** gr1 ***");
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Empty grid and grid of points.
+bool
+test02() {
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(B));
+
+  Grid gr2(gs);
+
+  bool ok = (!gr1.contains(gr2));
+
+  print_generators(gr1, "*** gr1 ***");
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Both empty.
+bool
+test03() {
+  Grid gr1(4, EMPTY);
+
+  Grid gr2(4, EMPTY);
+
+  bool ok = (gr1.contains(gr2));
+
+  print_generators(gr1, "*** gr1 ***");
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Zero dimension universes.
+bool
+test04() {
+  Grid gr1(0);
+
+  Grid gr2(0);
+
+  bool ok = (gr1.contains(gr2));
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Self containment.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A - B %= 0);
+  gr.add_congruence(C %= 0);
+
+  bool ok = (gr.contains(gr));
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// A grid strictly containing another.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A - B %= 0);
+  gr1.add_congruence(C %= 0);
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point());
+  gr2.add_generator(grid_point(2*A + 2*B + 2*C));
+
+  bool ok = (gr1.contains(gr2));
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// test06, the other way round.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point());
+  gr1.add_generator(grid_point(2*A + 2*B + 2*C));
+
+  Grid gr2(3);
+  gr2.add_congruence(A - B %= 0);
+  gr2.add_congruence(C %= 0);
+
+  bool ok = (!gr1.contains(gr2));
+
+  print_generators(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// CHINA example that showed an error in cgs::is_included_in.
+bool
+test08() {
+  Variable A(0);
+
+  Grid gr1(1, EMPTY);
+  gr1.add_generator(grid_point());
+
+  Grid gr2(1, EMPTY);
+  gr2.add_generator(grid_point(A));
+
+  bool ok = !gr1.contains(gr2) && !gr2.contains(gr1);
+
+  print_generators(gr1, "*** gr1 ***");
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Space dimension exception
+bool
+test09() {
+  Grid gr1(1, EMPTY);
+  gr1.add_generator(grid_point());
+
+  Grid gr2(21, EMPTY);
+
+  try {
+    gr1.contains(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/copyconstruct1.cc b/tests/Grid/copyconstruct1.cc
new file mode 100644
index 0000000..dd7699b
--- /dev/null
+++ b/tests/Grid/copyconstruct1.cc
@@ -0,0 +1,70 @@
+/* Test copy construction of grids.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe and empty grids of the first ten dimensions.
+
+bool
+test01() {
+  bool ok = true;
+  for (unsigned int dim = 0; dim < 10; ++dim) {
+
+    nout << "dimension: " << dim << endl;
+
+    // Universe.
+
+    Grid gr(dim);
+    print_congruences(gr, "*** gr ***");
+
+    Grid gr_copy = gr;
+    print_congruences(gr_copy, "*** gr_copy ***");
+
+    Grid known_gr(dim);
+
+    ok &= (gr_copy == known_gr);
+    if (ok) {
+
+      // Empty.
+
+      gr = Grid(dim, EMPTY);
+      print_generators(gr, "*** gr ***");
+
+      Grid gr_copy = gr;
+      print_generators(gr_copy, "*** gr_copy ***");
+
+      Grid known_gr(dim, EMPTY);
+
+      ok &= (gr_copy == known_gr);
+    }
+  };
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Grid/coveringbox1.cc b/tests/Grid/coveringbox1.cc
new file mode 100644
index 0000000..9097e2b
--- /dev/null
+++ b/tests/Grid/coveringbox1.cc
@@ -0,0 +1,305 @@
+/* Test Grid(Box& box, From_Covering_Box()).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+// This constructor is also tested via coveringbox2.cc.
+
+#include "ppl_test.hh"
+
+namespace {
+
+#define SPACE_DIM 2
+
+// Universe box.
+bool
+test01() {
+  Bounding_Box box(SPACE_DIM);
+
+  Grid gr(box, From_Covering_Box());
+
+  Grid known_gr(SPACE_DIM, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+  return ok;
+}
+
+// The box is the positive quadrant.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box(SPACE_DIM);
+  box.raise_lower_bound(0, true, 0, 1);
+  box.raise_lower_bound(1, true, 0, 1);
+
+  Grid gr(box, From_Covering_Box());
+
+  Grid known_gr(SPACE_DIM);
+  known_gr.add_congruence(A == 0);
+  known_gr.add_congruence(B == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+  return ok;
+}
+
+// A bounded box in 2D.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box(SPACE_DIM);
+  box.raise_lower_bound(0, true, -2, 3);
+  box.lower_upper_bound(0, true, 4, 1);
+  box.raise_lower_bound(1, true, -10, 1);
+  box.lower_upper_bound(1, true, 12, 3);
+
+  Grid gr(box, From_Covering_Box());
+
+  Grid known_gr(SPACE_DIM);
+  known_gr.add_congruence((3*A %= -2) / 14);
+  known_gr.add_congruence((B %= -10) / 14);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+  return ok;
+}
+
+// A 3D box which is bounded in 2D.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box(3);
+  box.raise_lower_bound(0, true, -2, 3);
+  box.lower_upper_bound(0, true, 4, 1);
+  box.raise_lower_bound(1, true, -10, 1);
+  box.lower_upper_bound(1, true, 12, 3);
+  box.raise_lower_bound(2, true, 15, 3);
+
+  Grid gr(box, From_Covering_Box());
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(-2*A - 30*B + 15*C, 3));
+  known_gr.add_generator(grid_point(4*A - 10*B + 5*C));
+  known_gr.add_generator(grid_point(-2*A + 12*B + 15*C, 3));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+  return ok;
+}
+
+// Zero-dimensional box.
+bool
+test05() {
+  Bounding_Box box(0);
+
+  Grid gr(box, From_Covering_Box());
+
+  Grid known_gr;
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+  return ok;
+}
+
+// Empty box in 2D.
+bool
+test06() {
+  Bounding_Box box(2);
+  box.set_empty();
+
+  Grid gr(box, From_Covering_Box());
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+  return ok;
+}
+
+// A box which is a point.
+bool
+test07() {
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 2, 1);
+  box.lower_upper_bound(0, true, 2, 1);
+  box.raise_lower_bound(1, true, 4, 1);
+  box.lower_upper_bound(1, true, 4, 1);
+
+  Grid gr(box, From_Covering_Box());
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+  return ok;
+}
+
+// Unit square.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 0, 1);
+  box.lower_upper_bound(0, true, 1, 1);
+  box.raise_lower_bound(1, true, 0, 1);
+  box.lower_upper_bound(1, true, 1, 1);
+
+  Grid gr(box, From_Covering_Box());
+
+  Congruence_System known_cgs;
+  known_cgs.insert(A %= 0);
+  known_cgs.insert(B %= 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+  return ok;
+}
+
+// Simple box with divisor.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 0, 1);
+  box.raise_lower_bound(1, true, 0, 1);
+  box.lower_upper_bound(1, true, 1, 2);
+
+  Grid gr(box, From_Covering_Box());
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A == 0);
+  known_gr.add_congruence(2*B %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+  return ok;
+}
+
+// Box with a dimension bounded only from above.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box(2);
+  box.lower_upper_bound(0, true, 3, 7);
+  box.raise_lower_bound(1, true, 0, 1);
+  box.lower_upper_bound(1, true, 1, 2);
+
+  Grid gr(box, From_Covering_Box());
+
+  Grid known_gr(2);
+  known_gr.add_congruence(7*A == 3);
+  known_gr.add_congruence(2*B %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+  return ok;
+}
+
+// Box with a dimension having an open bound, where the open bound
+// makes the box empty.
+bool
+test11() {
+  Bounding_Box box(2);
+  box.raise_lower_bound(1, true, 0, 1);
+  box.lower_upper_bound(0, true, 3, 7);
+  box.raise_lower_bound(1, false, 1, 2);
+  box.lower_upper_bound(1, true, 1, 2);
+
+  try {
+    Grid gr(box, From_Covering_Box());
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Zero-dimensional empty box.
+bool
+test12() {
+  Bounding_Box box(0);
+  box.set_empty();
+
+  Grid gr(box, From_Covering_Box());
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/coveringbox2.cc b/tests/Grid/coveringbox2.cc
new file mode 100644
index 0000000..68bd1a0
--- /dev/null
+++ b/tests/Grid/coveringbox2.cc
@@ -0,0 +1,879 @@
+ /* Test Grid::get_covering_box().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+#define SPACE_DIM 2
+
+bool
+operator==(const Bounding_Box& x, const Bounding_Box& y) {
+  dimension_type dimension = x.space_dimension();
+  if (dimension != y.space_dimension())
+    return false;
+
+  if (x.is_empty() && y.is_empty())
+    return true;
+
+  if (x.is_empty() || y.is_empty())
+    return false;
+
+  TEMP_INTEGER(n_x);
+  TEMP_INTEGER(n_y);
+  TEMP_INTEGER(d_x);
+  TEMP_INTEGER(d_y);
+
+  for (dimension_type i = dimension; i-- > 0; ) {
+    bool tem;
+    bool x_closed = x.get_lower_bound(i, tem, n_x, d_x);
+    bool y_closed = y.get_lower_bound(i, tem, n_y, d_y);
+    if (x_closed == y_closed) {
+      if (x_closed && (n_x != n_y || d_x != d_y))
+	return false;
+    }
+    else
+      return false;
+    x_closed = x.get_upper_bound(i, tem, n_x, d_x);
+    y_closed = y.get_upper_bound(i, tem, n_y, d_y);
+    if (x_closed == y_closed) {
+      if (x_closed && (n_x != n_y || d_x != d_y))
+	return false;
+    }
+    else
+      return false;
+  }
+
+  return true;
+}
+
+// Rectilinear grid defined by points with the origin
+// not a point of the grid or a point of the covering box..
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point(B));
+  gr.add_generator(grid_point(3*A + B));
+  gr.add_generator(grid_point(3*A + 3*B));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 0, 1);
+  known_box.lower_upper_bound(0, true, 3, 1);
+  known_box.raise_lower_bound(1, true, 1, 1);
+  known_box.lower_upper_bound(1, true, 3, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// Skew grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point(  A +   B));
+  gr.add_generator(grid_point(2*A + 3*B));
+  gr.add_generator(grid_point(  A + 4*B));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 0, 1);
+  known_box.lower_upper_bound(0, true, 1, 1);
+  known_box.raise_lower_bound(1, true, 0, 1);
+  known_box.lower_upper_bound(1, true, 1, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// Skew grid, with a divisor.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(2*A));
+  gr.add_generator(grid_point(  A + 2*B, 2));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 0, 2);
+  known_box.lower_upper_bound(0, true, 1, 2);
+  known_box.raise_lower_bound(1, true, 0, 2);
+  known_box.lower_upper_bound(1, true, 2, 2);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+#undef SPACE_DIM
+#define SPACE_DIM 3
+
+// Grid containing a line.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_line(A + 2*B));
+  gr.add_generator(grid_point(C, 2));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 0, 1);
+  known_box.lower_upper_bound(0, true, 0, 1);
+  known_box.raise_lower_bound(1, true, 0, 1);
+  known_box.lower_upper_bound(1, true, 0, 1);
+  known_box.raise_lower_bound(2, true, 0, 1);
+  known_box.lower_upper_bound(2, true, 1, 2);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test05() {
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM);
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 0, 1);
+  known_box.lower_upper_bound(0, true, 0, 1);
+  known_box.raise_lower_bound(1, true, 0, 1);
+  known_box.lower_upper_bound(1, true, 0, 1);
+  known_box.raise_lower_bound(2, true, 0, 1);
+  known_box.lower_upper_bound(2, true, 0, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_congruences(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// Grid which is a single point.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point(16*A + 6*B - 6*C, 7));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 16, 7);
+  known_box.raise_lower_bound(1, true, 6, 7);
+  known_box.raise_lower_bound(2, true, -6, 7);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test07() {
+  Bounding_Box box1(SPACE_DIM);
+  // Set bounds, to check that get_covering_box clears them.
+  box1.raise_lower_bound(0, true, 16, 7);
+  box1.raise_lower_bound(1, true, 6, 7);
+  box1.raise_lower_bound(2, true, -6, 7);
+
+  Grid gr(SPACE_DIM, EMPTY);
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.set_empty();
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+
+    Bounding_Box box2(SPACE_DIM);
+    // Set bounds, to check that get_covering_box clears them.
+    box2.raise_lower_bound(0, true, 1, 3);
+    box2.raise_lower_bound(1, true, 2, 2);
+    box2.raise_lower_bound(2, true, 3, 1);
+
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// A grid which get_covering_box has to minimize.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A + B));
+  gr.add_generator(grid_point(A));
+  gr.add_generator(grid_point(2*A));
+  gr.add_generator(grid_point(C));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 0, 1);
+  known_box.lower_upper_bound(0, true, 1, 1);
+  known_box.raise_lower_bound(1, true, 0, 1);
+  known_box.lower_upper_bound(1, true, 1, 1);
+  known_box.raise_lower_bound(2, true, 0, 1);
+  known_box.lower_upper_bound(2, true, 1, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// A grid defined by congruences.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM);
+  gr.add_congruence((A + 2*B %= 0) / 2);
+  gr.add_congruence((A %= 0) / 5);
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 0, 1);
+  known_box.lower_upper_bound(0, true, 5, 1);
+  known_box.raise_lower_bound(1, true, 0, 1);
+  known_box.lower_upper_bound(1, true, 1, 2);
+  known_box.raise_lower_bound(2, true, 0, 1);
+  known_box.lower_upper_bound(2, true, 0, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// Grid where the only line is the final generator.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A));
+  gr.add_generator(grid_point(B));
+  gr.add_generator(grid_line(C));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 0, 1);
+  known_box.lower_upper_bound(0, true, 1, 1);
+  known_box.raise_lower_bound(1, true, 0, 1);
+  known_box.lower_upper_bound(1, true, 1, 1);
+  known_box.raise_lower_bound(2, true, 0, 1);
+  known_box.lower_upper_bound(2, true, 0, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+#undef SPACE_DIM
+#define SPACE_DIM 4
+
+// A grid where, for a particular dimension (D), many coefficients
+// between the first and last rows contribute towards the size of the
+// resulting interval.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A + 2*D));
+  gr.add_generator(grid_point(B + 4*D));
+  gr.add_generator(grid_point(C + 8*D));
+  gr.add_generator(grid_point(16*D));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 0, 1);
+  known_box.lower_upper_bound(0, true, 1, 1);
+  known_box.raise_lower_bound(1, true, 0, 1);
+  known_box.lower_upper_bound(1, true, 1, 1);
+  known_box.raise_lower_bound(2, true, 0, 1);
+  known_box.lower_upper_bound(2, true, 1, 1);
+  known_box.raise_lower_bound(3, true, 0, 1);
+  known_box.lower_upper_bound(3, true, 2, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// A grid where all the points have the same value in one of the
+// dimensions (B).
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A));
+  gr.add_generator(grid_point(C));
+  gr.add_generator(grid_point(D));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 0, 1);
+  known_box.lower_upper_bound(0, true, 1, 1);
+  known_box.raise_lower_bound(1, true, 0, 1);
+  known_box.raise_lower_bound(2, true, 0, 1);
+  known_box.lower_upper_bound(2, true, 1, 1);
+  known_box.raise_lower_bound(3, true, 0, 1);
+  known_box.lower_upper_bound(3, true, 1, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// An empty grid defined by congruences.
+bool
+test13() {
+  Variable A(0);
+
+  Bounding_Box box1(SPACE_DIM);
+  // Set bounds, to check that get_covering_box clears them.
+  box1.raise_lower_bound(0, true, 1, 7);
+  box1.raise_lower_bound(1, true, 2, 7);
+  box1.raise_lower_bound(2, true, 3, 7);
+
+  Grid gr(SPACE_DIM);
+  gr.add_congruence((A %= 0) / 2);
+  gr.add_congruence((A %= 1) / 2);
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.set_empty();
+
+  bool ok = (box1 == known_box);
+
+  print_congruences(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+
+    Bounding_Box box2(SPACE_DIM);
+    // Set bounds, to check that get_covering_box clears them.
+    box2.raise_lower_bound(0, true, 3, 7);
+    box2.raise_lower_bound(1, true, 1, 7);
+    box2.raise_lower_bound(2, true, 2, 7);
+
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// Grid which is a single point, with a divisor, such that the
+// fractions for some intervals (B and C) will be reduced before being
+// assigned to the intervals.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point(16*A + 14*B - 7*C, 7));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 16, 7);
+  known_box.raise_lower_bound(1, true, 2, 1);
+  known_box.raise_lower_bound(2, true, -1, 1);
+  known_box.raise_lower_bound(3, true, 0, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// Many-pointed grid, with a divisor, such that the fractions for some
+// intervals (B and C) will be reduced before being assigned to the
+// intervals.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A, 6));
+  gr.add_generator(grid_point(B, 3));
+  gr.add_generator(grid_point(C, 2));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 0, 1);
+  known_box.lower_upper_bound(0, true, 1, 6);
+  known_box.raise_lower_bound(1, true, 0, 1);
+  known_box.lower_upper_bound(1, true, 1, 3);
+  known_box.raise_lower_bound(2, true, 0, 1);
+  known_box.lower_upper_bound(2, true, 1, 2);
+  known_box.raise_lower_bound(3, true, 0, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+#undef SPACE_DIM
+#define SPACE_DIM 0
+
+// Zero dimension empty grid.
+bool
+test16() {
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.set_empty();
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test17() {
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM);
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+
+  bool ok = (box1 == known_box);
+
+  print_congruences(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+#undef SPACE_DIM
+#define SPACE_DIM 2
+
+// Rectilinear grid as in test01 but this time
+// defined by a point and 2 parameters.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point(B));
+  gr.add_generator(parameter(3*A));
+  gr.add_generator(parameter(3*A + 2*B));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 0, 1);
+  known_box.lower_upper_bound(0, true, 3, 1);
+  known_box.raise_lower_bound(1, true, 1, 1);
+  known_box.lower_upper_bound(1, true, 3, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+#undef SPACE_DIM
+#define SPACE_DIM 4
+
+// 4D grid defined with points and parameters.
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Bounding_Box box1(SPACE_DIM);
+
+  Grid gr(SPACE_DIM, EMPTY);
+  gr.add_generator(grid_point(A));
+  gr.add_generator(grid_point(7*A));
+  gr.add_generator(parameter(5*B-3*A));
+  gr.add_generator(parameter(3*A));
+  gr.add_generator(grid_point(C+A));
+
+  gr.get_covering_box(box1);
+
+  Bounding_Box known_box(SPACE_DIM);
+  known_box.raise_lower_bound(0, true, 1, 1);
+  known_box.lower_upper_bound(0, true, 4, 1);
+  known_box.raise_lower_bound(1, true, 0, 1);
+  known_box.lower_upper_bound(1, true, 5, 1);
+  known_box.raise_lower_bound(2, true, 0, 1);
+  known_box.lower_upper_bound(2, true, 1, 1);
+  known_box.raise_lower_bound(3, true, 0, 1);
+
+  bool ok = (box1 == known_box);
+
+  print_generators(gr, "*** gr ***");
+  nout << "box1:" << endl << box1;
+
+  if (ok) {
+    Grid tem_gr(box1, From_Covering_Box());
+    Bounding_Box box2(SPACE_DIM);
+    tem_gr.get_covering_box(box2);
+
+    ok = (box2 == known_box);
+
+    nout << "box2:" << endl << box2;
+  }
+
+  return ok;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/discrete1.cc b/tests/Grid/discrete1.cc
new file mode 100644
index 0000000..1154679
--- /dev/null
+++ b/tests/Grid/discrete1.cc
@@ -0,0 +1,342 @@
+/* Test Grid::is_pointed().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  bool ok = (gr.is_discrete());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+
+  Grid gr(0, EMPTY);
+
+  bool ok = (gr.is_discrete());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.is_discrete());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 2*B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B == 2);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (gr_gs_min.is_discrete())
+    && (gr_gs_needs_min.is_discrete())
+    && (gr_cgs_needs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Line.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B == 2);
+
+  Grid gr_cgs_min(3);
+  gr_cgs_min.add_congruence(A == 3);
+  gr_cgs_min.add_congruence(B == 2);
+  // Minimize the congruences.
+  gr_cgs_min.minimized_congruences();
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+  assert(copy_compare(gr_cgs_needs_min, gr_cgs_min));
+
+  bool ok = (!gr_gs_min.is_discrete())
+    && (!gr_gs_needs_min.is_discrete())
+    && (!gr_cgs_needs_min.is_discrete())
+    && (!gr_cgs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+  print_congruences(gr_cgs_min, "*** gr_cgs_min ***");
+
+  return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + B));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_generator(grid_point(3*A + B));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+  gr_cgs_needs_min.add_congruence(C == 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (gr_gs_min.is_discrete())
+    && (gr_gs_needs_min.is_discrete())
+    && (gr_cgs_needs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_generator(grid_point(3*A + B));
+  gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (!gr_gs_min.is_discrete())
+    && (!gr_gs_needs_min.is_discrete())
+    && (!gr_cgs_needs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Skew.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_point(A));
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_point(A));
+  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (gr_gs_min.is_discrete())
+    && (gr_gs_needs_min.is_discrete())
+    && (gr_cgs_needs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Skew with lines.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_point(A));
+  gr_gs_min.add_generator(grid_line(C));
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_point(A));
+  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (!gr_gs_min.is_discrete())
+    && (!gr_gs_needs_min.is_discrete())
+    && (!gr_cgs_needs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Plane.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(4, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_line(B));
+  gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(4, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(B));
+  gr_gs_needs_min.add_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(4);
+  gr_cgs_needs_min.add_congruence(A == 0);
+  gr_cgs_needs_min.add_congruence(D == 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (!gr_gs_min.is_discrete())
+    && (!gr_gs_needs_min.is_discrete())
+    && (!gr_cgs_needs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Empty.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr(3);
+  gr.add_congruence(A == 1);
+  gr.add_congruence(A == 2);
+
+  bool ok (gr.is_discrete());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/disjoint1.cc b/tests/Grid/disjoint1.cc
new file mode 100644
index 0000000..c1eaf1d
--- /dev/null
+++ b/tests/Grid/disjoint1.cc
@@ -0,0 +1,234 @@
+/* Test Grid::is_disjoint_from().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Grid of points and empty grid.
+bool
+test01() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+
+  Grid gr1(gs);
+
+  Grid gr2(1, EMPTY);
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Empty grid and grid of points.
+bool
+test02() {
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(B));
+
+  Grid gr2(gs);
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Both empty.
+bool
+test03() {
+  Grid gr1(4, EMPTY);
+
+  Grid gr2(4, EMPTY);
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Zero dimension universes.
+bool
+test04() {
+  Grid gr1(0);
+
+  Grid gr2(0);
+
+  bool ok = (!gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Grid and itself.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A - B %= 0);
+  gr.add_congruence(C %= 0);
+
+  bool ok = (!gr.is_disjoint_from(gr));
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Two grids which alternate AB planes along C.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A - B %= 0);
+  gr1.add_congruence((C %= 0) / 2);
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point(C));
+  gr2.add_generator(grid_line(A + B));
+  gr2.add_generator(grid_point(C + B));
+  gr2.add_generator(grid_point(3*C));
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// A sequence of points and a plane.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(A + B + C));
+  gr1.add_generator(grid_point(3*A + 3*B + 3*C));
+
+  Grid gr2(3);
+  gr2.add_congruence(A - B %= 0);
+  gr2.add_congruence(C == 0);
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// A line and a plane.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(A + B + C));
+  gr1.add_generator(grid_line(3*A + 3*B + 3*C));
+
+  Grid gr2(3);
+  gr2.add_congruence(A - B %= 0);
+  gr2.add_congruence(C == 0);
+
+  bool ok = (!gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// CHINA contains example that showed an error in cgs::is_included_in.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr1(1, EMPTY);
+  gr1.add_generator(grid_point());
+  gr1.minimized_generators();
+
+  Grid gr2(1, EMPTY);
+  gr2.add_generator(grid_point(A));
+  gr2.minimized_generators();
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr2, "*** gr2 ***");
+  print_congruences(gr1, "*** gr1.is_disjoint_from(gr2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test10() {
+  Grid gr1(1, EMPTY);
+  gr1.add_generator(grid_point());
+
+  Grid gr2(19, EMPTY);
+
+  try {
+    gr1.is_disjoint_from(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/equals1.cc b/tests/Grid/equals1.cc
new file mode 100644
index 0000000..42862ed
--- /dev/null
+++ b/tests/Grid/equals1.cc
@@ -0,0 +1,253 @@
+/* Test operator==(const Grid&, const Grid&)
+   and operator!=(const Grid&, const Grid&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grids the same, gr defined by generatorss and known_gr by congruences.
+bool
+test01() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(3*A));
+
+  Grid gr(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 0) / 3);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr ***");
+  print_congruences(known_gr, "*** known_gr ***");
+
+  return ok;
+}
+
+// Grids the same, gr defined by congruences and known_gr by generators.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert(A - B %= 0);
+  cgs.insert((C %= 0) / 7);
+
+  Grid gr(cgs);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_line(A + B));
+  gs.insert(grid_point(B));
+  gs.insert(grid_point(7*C));
+
+  Grid known_gr(gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr ***");
+  print_congruences(known_gr, "*** known_gr ***");
+
+  return ok;
+}
+
+// Grids differ, gr defined by congruences and known_gr by generators.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert(A - B %= 0);
+  cgs.insert((C %= 0) / 7);
+
+  Grid gr(cgs);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_line(A - B));
+  gs.insert(grid_point(B));
+  gs.insert(grid_point(7*C, 3));
+
+  Grid known_gr(gs);
+
+  bool ok = (gr != known_gr);
+
+  print_congruences(gr, "*** gr ***");
+  print_congruences(known_gr, "*** known_gr ***");
+
+  return ok;
+}
+
+// Grids differ by the affine dimension and are defined by points.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*A));
+  gs.insert(grid_point(1*A));
+
+  Grid gr(gs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(0*A + 0*B));
+  known_gs.insert(grid_point(1*A + 0*B));
+  known_gs.insert(grid_point(0*A + 1*B));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr != known_gr);
+
+  print_congruences(gr, "*** gr ***");
+  print_congruences(known_gr, "*** known_gr ***");
+
+  return ok;
+}
+
+// Where the equality of two grids is decided by comparing the number
+// of equalities.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence(A == 0);
+
+  gr1.minimized_congruences();
+
+  Grid gr2(3);
+  gr2.add_congruence(B %= 0);
+
+  gr2.minimized_congruences();
+
+  bool ok = (gr1 != gr2);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Where the equality of two grids is decided by comparing the number
+// of generators.
+bool
+test06() {
+  Variable A(0);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point());
+
+  gr1.minimized_generators();
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point());
+  gr2.add_generator(grid_line(A));
+
+  gr2.minimized_generators();
+
+  bool ok = (gr1 != gr2);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Where the equality of two grids is decided by comparing the number
+// of lines.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point());
+  gr1.add_generator(parameter(B));
+
+  gr1.minimized_generators();
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point());
+  gr2.add_generator(grid_line(A));
+
+  gr2.minimized_generators();
+
+  bool ok = (gr1 != gr2);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// No equalities and no lines, number of congruences and generators
+// are the same. But the generators are different.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point());
+  gr1.add_generator(parameter(A));
+  gr1.add_generator(parameter(B));
+  gr1.add_generator(parameter(C));
+
+  gr1.minimized_generators();
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point());
+  gr2.add_generator(parameter(2*A));
+  gr2.add_generator(parameter(2*B));
+  gr2.add_generator(parameter(2*C));
+
+  gr2.minimized_generators();
+
+  bool ok = (gr1 != gr2);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Grid/expandspacedim1.cc b/tests/Grid/expandspacedim1.cc
new file mode 100644
index 0000000..fc1f423
--- /dev/null
+++ b/tests/Grid/expandspacedim1.cc
@@ -0,0 +1,238 @@
+/* Test Grid::expand_space_dimension().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+
+  gr.expand_space_dimension(A, 1);
+
+  Grid known_gr(4);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+// Empty.
+bool
+test02() {
+  Variable B(1);
+
+  Grid gr(3, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  gr.expand_space_dimension(B, 1);
+
+  Grid known_gr(4, EMPTY);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(B, 1) ***");
+
+  return ok;
+}
+
+// Trivial expansion.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(A + B %= 2);
+
+  gr.expand_space_dimension(A, 0);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence(A + B %= 2);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(A, 0) ***");
+
+  return ok;
+}
+
+// From generators, expanding one dimension.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(A));
+  gr.add_generator(grid_point(A + 2*B));
+  gr.add_generator(grid_point());
+  print_generators(gr, "***  ***");
+
+  gr.expand_space_dimension(A, 1);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_point(A + 2*B));
+  known_gr.add_generator(grid_point(C));
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+// From congruences, expanding one dimension.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(2);
+  gr.add_congruence((A + B %= 2) / 7);
+  print_generators(gr, "***  ***");
+
+  gr.expand_space_dimension(A, 1);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A + B     %= 2) / 7);
+  known_gr.add_congruence((    B + C %= 2) / 7);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+// From congruences, expanding two dimensions.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(2);
+  gr.add_congruence((A + 2*B %= 3) / 5);
+  print_generators(gr, "***  ***");
+
+  gr.expand_space_dimension(B, 2);
+
+  Grid known_gr(4);
+  known_gr.add_congruence((A + 2*B             %= 3) / 5);
+  known_gr.add_congruence((A       + 2*C       %= 3) / 5);
+  known_gr.add_congruence((A             + 2*D %= 3) / 5);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(B, 2) ***");
+
+  return ok;
+}
+
+// From congruences, with an equality.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid gr(3);
+  gr.add_congruence(2*C == 1);
+  gr.add_congruence(A - B %= 0);
+
+  gr.expand_space_dimension(A, 1);
+  gr.expand_space_dimension(C, 1);
+
+  Grid known_gr(5);
+  known_gr.add_congruence(2*C == 1);
+  known_gr.add_congruence(2*E == 1);
+  known_gr.add_congruence(A - B         %= 0);
+  known_gr.add_congruence(  - B + D     %= 0);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(...) ***");
+
+  return ok;
+}
+
+// Variable of higher space dimension than grid.
+bool
+test08() {
+  Variable B(1);
+
+  Grid gr(1, EMPTY);
+
+  try {
+    gr.expand_space_dimension(B, 3);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Add more dimensions than are available.
+bool
+test09() {
+  Variable B(1);
+
+  Grid gr(10, EMPTY);
+
+  try {
+    gr.expand_space_dimension(B, Grid::max_space_dimension());
+  }
+  catch (const std::length_error& e) {
+    nout << "length_error: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/foldspacedims1.cc b/tests/Grid/foldspacedims1.cc
new file mode 100644
index 0000000..a244896
--- /dev/null
+++ b/tests/Grid/foldspacedims1.cc
@@ -0,0 +1,400 @@
+/* Test Grid::fold_space_dimensions().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  gr.fold_space_dimensions(to_fold, B);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(3, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  gr.fold_space_dimensions(to_fold, B);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+  return ok;
+}
+
+// Trivial fold.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B + C %= 2) / 3);
+  print_congruences(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  Variables_Set to_fold;
+
+  gr.fold_space_dimensions(to_fold, B);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+  return ok;
+}
+
+// Simple fold from congruences.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 1);
+  gr.add_congruence((B %= 1) / 3);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  gr.fold_space_dimensions(to_fold, B);
+
+  Grid known_gr(1);
+  known_gr.add_congruence(A %= 1);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+  return ok;
+}
+
+// Simple fold from generators.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point(A + 2*B + 2*C));
+  gr.add_generator(grid_point(A + 2*B + 4*C));
+  gr.add_generator(grid_point(A + 6*B + 2*C));
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(C);
+
+  gr.fold_space_dimensions(to_fold, B);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(A + 2*B));
+  known_gr.add_generator(grid_point(A + 4*B));
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+  return ok;
+}
+
+// Folding several dimensions into a higher dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 2) / 3);
+  gr.add_congruence((B %= 8) / 9);
+  gr.add_congruence((C == 17) / 0);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(B);
+
+  gr.fold_space_dimensions(to_fold, C);
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A %= 2) / 3);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, C) ***");
+
+  return ok;
+}
+
+// Folding dimensions into a lower dimension.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4);
+  gr.add_congruence((A - B %= 3) / 4);
+  gr.add_congruence((C %= 5) / 9);
+  gr.add_congruence((D %= 2) / 6);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(C);
+  to_fold.insert(D);
+
+  gr.fold_space_dimensions(to_fold, A);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, A) ***");
+
+  return ok;
+}
+
+// Folding dimensions into an intermediate dimension.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4);
+  gr.add_congruence((A %= 0) / 2);
+  gr.add_congruence((B %= 0) / 9);
+  gr.add_congruence((C %= 0) / 6);
+  gr.add_congruence((D %= 0) / 12);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  gr.fold_space_dimensions(to_fold, C);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((B %= 0) / 3);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, C) ***");
+
+  return ok;
+}
+
+// Test folding dimensions of a relational grid into an intermediate
+// dimension.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4);
+  gr.add_congruence((A - B %= 0) / 9);
+  gr.add_congruence((C %= 0) / 6);
+  gr.add_congruence((D %= 0) / 12);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  gr.fold_space_dimensions(to_fold, C);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, C) ***");
+
+  return ok;
+}
+
+// One dimension.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_congruence((A %= 3) / 7);
+  print_congruences(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  Variables_Set to_fold;
+
+  gr.fold_space_dimensions(to_fold, A);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, A) ***");
+
+  return ok;
+}
+
+// Test folding dimensions of a relational grid into an intermediate
+// dimension, where the resulting grid is smaller than the universe.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A - B == 0);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(C == 0);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  gr.fold_space_dimensions(to_fold, C);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence(B %= 0);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, C) ***");
+
+  return ok;
+}
+
+// Second parameer of greater dimension than grid.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1, EMPTY);
+
+  Variables_Set vars;
+  vars.insert(A);
+
+  try {
+    gr.fold_space_dimensions(vars, B);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Highest variable in set of greater dimension than grid.
+bool
+test13() {
+  Variable B(1);
+
+  Grid gr(3, EMPTY);
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  try {
+    gr.fold_space_dimensions(vars, B);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Dimension of highest variable in set greater than dimension of
+// grid.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1, EMPTY);
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  try {
+    gr.fold_space_dimensions(vars, A);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/generalizedaffineimage1.cc b/tests/Grid/generalizedaffineimage1.cc
new file mode 100644
index 0000000..292fbb2
--- /dev/null
+++ b/tests/Grid/generalizedaffineimage1.cc
@@ -0,0 +1,555 @@
+/* Test Grid::generalized_affine_image(var, ...).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simplest expression.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+
+  gr.generalized_affine_image(B, Linear_Expression::zero(), 1, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+    "*** gr.generalized_affine_image(B, Linear_Expression::zero(), 1, 0) ***");
+
+  return ok;
+}
+
+// Simplest expression, with denominator.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(B, Linear_Expression::zero(), 2);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_point(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+    "*** gr.generalized_affine_image(B, Linear_Expression::zero(), 2) ***");
+
+  return ok;
+}
+
+// Simple expression.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(B, A + 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A - B));
+  known_gr.add_generator(grid_point(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(B, A + 1) ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(B, A + 1, 2);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(B, 2));
+  known_gr.add_generator(grid_point(B + A));
+  known_gr.add_generator(grid_point(3*B, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(B, A + 1, 2) ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator and modulus.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(B, A + 1, 2, 3);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(B, 2));
+  known_gr.add_generator(grid_point(A + B));
+  known_gr.add_generator(grid_point(7*B, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(B, A + 1, 2, 3) ***");
+
+  return ok;
+}
+
+// Negative denominator.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A - B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(B, A + 2, -2);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(-B));
+  known_gr.add_generator(grid_point(-3*B + 2*A, 2));
+  known_gr.add_generator(grid_point(-2*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(B, A + 2, -2) ***");
+
+  return ok;
+}
+
+// Negative modulus.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A - B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(B, A + 2, 1, -7);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(2*B));
+  known_gr.add_generator(grid_point(A + 3*B));
+  known_gr.add_generator(grid_point(9*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(B, A + 2, 1, -7) ***");
+
+  return ok;
+}
+
+// Expression of many variables.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 3);
+  gr.add_congruence((A - 2*C %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, A - C + 2, 1, 5);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(2*A));
+  known_gr.add_generator(grid_point(2*A + 3*B));
+  known_gr.add_generator(grid_line(A + C));
+  known_gr.add_generator(grid_point(4*A));  // Original modulus.
+  known_gr.add_generator(grid_point(7*A));  // Transformation modulus.
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(A, A - C + 2, 1, 5) ***");
+
+  return ok;
+}
+
+// Equality expression comparing
+// generalized_affine_image and affine_image
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 3);
+  gr.add_congruence((A - 2*C %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, A - C + 2, 1, 0);
+
+  Grid known_gr = Grid(3);
+  known_gr.add_congruence((B %= 0) / 3);
+  known_gr.add_congruence((A - 2*C %= 0) / 2);
+
+  known_gr.affine_image(A, A - C + 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(A, A - C + 2, 1, 0) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(5, EMPTY);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, A - 2*C + 3, 4, 7);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+        "*** gr.generalized_affine_image(A, A - 2*C + 3, 4, 7) ***");
+
+  return ok;
+}
+
+// Empty with congruences.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_congruence(A == 0);
+  gr.add_congruence(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, A + 2);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(A, A + 2) ***");
+
+  return ok;
+}
+
+// Universe.
+bool
+test12() {
+  Variable A(0);
+
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, A + 2);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(A, A + 2) ***");
+
+  return ok;
+}
+
+// Zero denominator.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(B, A + 2, 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(B, D + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(D, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Expressions having common variables.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C %= 0) / 3);
+  gr.add_congruence(A - 2*B == 1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - B + C, 2*A - B - C, 5);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(A - B + C, 2*A - B - C, 5) ***");
+
+  return ok;
+}
+
+// Expressions having common variables, where generalized_affine_image
+// must minimize the grid.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - B, 2*A - 2*B, 5);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 5);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(A - B, 2*A - 2*B, 5) ***");
+
+  return ok;
+}
+
+// Expressions having common variables.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(2*A - 2*B, A - B, 5);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((2*A - 2*B %= 0) / 5);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(2*A - 2*B, A - B, 5) ***");
+
+  return ok;
+}
+
+// Right hand side expression of greater space dimension than the
+// grid.
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence(C %= -2);
+
+  try {
+    gr.generalized_affine_image(B + C, D + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Left hand side expression of space dimension greater than the grid.
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+
+  try {
+    gr.generalized_affine_image(A + D, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Grid/generalizedaffineimage2.cc b/tests/Grid/generalizedaffineimage2.cc
new file mode 100644
index 0000000..9ec43d3
--- /dev/null
+++ b/tests/Grid/generalizedaffineimage2.cc
@@ -0,0 +1,552 @@
+/* Test Grid::generalized_affine_image(lhs, rhs, modulus).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests 1 to 13 are equivalent to tests 1 to 13 in
+// generalizedaffineimage1.cc.
+
+// Simplest expression.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*B, Linear_Expression::zero(), 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+   "*** gr.generalized_affine_image(1*B, Linear_Expression::zero(), 0) ***");
+
+  return ok;
+}
+
+// Simplest expression, with denominator.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(2*B, Linear_Expression::zero());
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_point(B, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+    "*** gr.generalized_affine_image(2*B, Linear_Expression::zero()) ***");
+
+  return ok;
+}
+
+// Simple expression.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*B, A + 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A - B));
+  known_gr.add_generator(grid_point(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(1*B, A + 1) ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(2*B, A + 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_point(B, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(2*B, A + 1) ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator and modulus.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(2*B, A + 1, 3);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(B, 2));
+  known_gr.add_generator(grid_point(A + B));
+  known_gr.add_generator(grid_point(2*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(2*B, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator and modulus.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(2*B, A + 1, 3);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(B, 2));
+  known_gr.add_generator(grid_point(A + B));
+  known_gr.add_generator(grid_point(2*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(2*B, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Negative denominator.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A - B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(-2*B, A + 2);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(-B, 2));
+  known_gr.add_generator(grid_point(2*A + -3*B, 2));
+  known_gr.add_generator(grid_point(-B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(-2*B, A + 2) ***");
+
+  return ok;
+}
+
+// Negative modulus.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A - B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*B, A + 2, -7);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(2*B));
+  known_gr.add_generator(grid_point(A + 3*B));
+  known_gr.add_generator(grid_point(9*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(1*B, A + 2, -7) ***");
+
+  return ok;
+}
+
+// Expression of many variables.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 3);
+  gr.add_congruence((A - 2*C %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*A, A - C + 2, 5);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(2*A));
+  known_gr.add_generator(grid_point(2*A + 3*B));
+  known_gr.add_generator(grid_line(A + C));
+  known_gr.add_generator(grid_point(4*A));  // Original modulus.
+  known_gr.add_generator(grid_point(7*A));  // Transformation modulus.
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(1*A, A - C + 2, 5) ***");
+
+  return ok;
+}
+
+// Equality expression.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 3);
+  gr.add_congruence((A - 2*C %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*A, A - C + 2, 0);
+
+  Grid known_gr = Grid(3);
+  known_gr.add_congruence((B %= 0) / 3);
+  known_gr.add_congruence((A - 2*C %= 0) / 2);
+
+  known_gr.affine_image(A, A - C + 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(1*A, A - C + 2, 0) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(5, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(4*A, A - 2*C + 3, 7);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(1*A, A + 2) ***");
+
+  return ok;
+}
+
+// Empty with congruences.
+bool
+test12() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_congruence(A == 0);
+  gr.add_congruence(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*A, A + 2);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(1*A, A + 2) ***");
+
+  return ok;
+}
+
+// Universe.
+bool
+test13() {
+  Variable A(0);
+
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*A, A + 2);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(1*A, A + 2) ***");
+
+  return ok;
+}
+
+// Expressions both constants.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(Linear_Expression::zero(),
+			      Linear_Expression(1));
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_line(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+    "*** gr.generalized_affine_image(Linear_Expression::zero(), Linear_Expression(1)) ***");
+
+  return ok;
+}
+
+// Left hand side constant.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(Linear_Expression::zero(), A - B, 5);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A + B));
+  known_gr.add_generator(grid_point(5*A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+   "*** gr.generalized_affine_image(Linear_Expression::zero(), A - B, 5) ***");
+
+  return ok;
+}
+
+// Expressions with unique variables.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A - B == 0);
+  gr.add_congruence((C %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - B, C);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_line(A + B));
+  known_gr.add_generator(grid_point(B));
+  known_gr.add_generator(grid_point(3*C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(A - B, C) ***");
+
+  return ok;
+}
+
+// Simple expressions having common variables.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - B, A, 0);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(A - B, A, 0) ***");
+
+  return ok;
+}
+
+// Expressions having common variables.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 1);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A + 2*B, A - B, 3);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(B, 2));
+  known_gr.add_generator(grid_line(2*A - B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(A + 2*B, A - B, 3) ***");
+
+  return ok;
+}
+
+// The equivalent of test1 from Polyhedron/generalizedaffineimage10.cc
+// (expressions with unique variables).
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(C == 0);
+  gr.add_congruence(A + 3*B == 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - C, B + 3, 0);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(A - C == B + 3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_image(A - C, B + 3, 0) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/generalizedaffinepreimage1.cc b/tests/Grid/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..5da113d
--- /dev/null
+++ b/tests/Grid/generalizedaffinepreimage1.cc
@@ -0,0 +1,514 @@
+/* Test Grid::generalized_affine_preimage(var, ...).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simplest expression.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence(B %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2 = gr1;
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1,
+    "*** gr1.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 0 ***");
+
+  if (ok) {
+    print_congruences(gr2, "*** gr2 ***");
+
+    // Congruence expression.
+    gr2.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 2);
+    ok = (gr2 == known_gr);
+  }
+
+  print_congruences(gr2,
+    "*** gr2.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 2) ***");
+
+  return ok;
+}
+
+// Simple expression, including positive modulus.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2 = gr1;
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1,
+    "*** gr1.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 0) ***");
+
+  if (ok) {
+    print_congruences(gr2, "*** gr2 ***");
+
+    // Congruence expression.
+    gr2.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 3);
+    ok = (gr2 == known_gr);
+  }
+
+  print_congruences(gr2,
+    "*** gr2.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 3) ***");
+
+  return ok;
+}
+
+// Simple expression, including negative modulus.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2 = gr1;
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, A + 1, 1, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(-A));
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1,
+        "*** gr1.generalized_affine_preimage(B, A + 1, 1, 0) ***");
+
+  if (ok) {
+    print_congruences(gr2, "*** gr2 ***");
+
+    known_gr.add_generator(grid_point());
+
+    // Congruence expression.
+    gr2.generalized_affine_preimage(B, A + 1, 1, -7);
+    ok = (gr2 == known_gr);
+  }
+
+  print_congruences(gr2,
+    "*** gr2.generalized_affine_preimage(B, A + 1, 1, -7) ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2 = gr1;
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, A + 1, 2, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(-3*A));
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1,
+        "*** gr1.generalized_affine_preimage(B, A + 1, 2, 0) ***");
+
+  if (ok) {
+    print_congruences(gr2, "*** gr2 ***");
+
+    known_gr.add_generator(grid_point(-A));
+
+    // Congruence expression.
+    gr2.generalized_affine_preimage(B, A + 1, 2, 3);
+    ok = (gr2 == known_gr);
+  }
+
+  print_congruences(gr2,
+    "*** gr2.generalized_affine_preimage(B, A + 1, 2, 3) ***");
+
+  return ok;
+}
+
+// Negative denominator.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((A - B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2 = gr1;
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, A + 2, -2, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(-2*A));
+  known_gr.add_generator(grid_point(2*A));
+  known_gr.add_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1,
+        "*** gr1.generalized_affine_preimage(B, A + 2, -2, 0) ***");
+
+  if (ok) {
+    print_congruences(gr2, "*** gr2 ***");
+
+    known_gr.add_generator(grid_point());
+
+    // Congruence expression.
+    gr2.generalized_affine_preimage(B, A + 2, -2);
+    ok = (gr2 == known_gr);
+  }
+
+  print_congruences(gr2,
+    "*** gr2.generalized_affine_preimage(B, A + 1, 2, 3) ***");
+
+  return ok;
+}
+
+// Expression of many variables.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 3);
+  gr.add_congruence((A - 2*C %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, A - C + 2, 1, 5);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(2*A));
+  known_gr.add_generator(grid_point(2*A + 3*B));
+  known_gr.add_generator(grid_line(3*A + C));
+  known_gr.add_generator(grid_point(4*A));  // Original modulus.
+  known_gr.add_generator(grid_point(7*A));  // Transformation modulus.
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(A, A - C + 2, 1, 5) ***");
+
+  return ok;
+}
+
+// Equality expression.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 3);
+  gr.add_congruence((A - 2*C %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, A - C + 2, 1, 0);
+
+  Grid known_gr = Grid(3);
+  known_gr.add_congruence((B %= 0) / 3);
+  known_gr.add_congruence((A - 2*C %= 0) / 2);
+
+  known_gr.affine_preimage(A, A - C + 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(A, A - C + 2, 1, 0) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(5, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, A - 2*C + 3, 4, 7);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(A, A - 2*C + 3, 4, 7) ***");
+
+  return ok;
+}
+
+// Empty with congruences.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_congruence(A == 0);
+  gr.add_congruence(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, A + 2);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(A, A + 2) ***");
+
+  return ok;
+}
+
+// Universe.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, A + 2);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(A, A + 2) ***");
+
+  return ok;
+}
+
+// Zero denominator.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(B, A + 2, 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(B, D + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(D, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Expression with a 0 modulus, where the variable occurs in
+// the expression.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  // Equality expression.
+  gr.generalized_affine_preimage(B, A + B, 1, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(parameter(2*B));
+  known_gr.add_generator(parameter(A + B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(B, A + B, 1, 0) ***");
+
+  return ok;
+
+}
+
+// Expression with a negative modulus, where the variable occurs in
+// the expression.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(B, A + B, 1, -7);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(parameter(2*B));
+  known_gr.add_generator(parameter(A + B));
+  known_gr.add_generator(parameter(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(B, A + B, 1, -7) ***");
+
+  return ok;
+
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/generalizedaffinepreimage2.cc b/tests/Grid/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..becf9b6
--- /dev/null
+++ b/tests/Grid/generalizedaffinepreimage2.cc
@@ -0,0 +1,359 @@
+/* Test Grid::generalized_affine_preimage(lhs, rhs, modulus).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Expressions both constants.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(Linear_Expression::zero(),
+				 Linear_Expression(1));
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_line(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+    "*** gr.generalized_affine_preimage(Linear_Expression::zero(), Linear_Expression(1)) ***");
+
+  return ok;
+}
+
+// Left hand side constant.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(Linear_Expression::zero(), A - B, 5);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A + B));
+  known_gr.add_generator(grid_point(5*A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+    "*** gr.generalized_affine_preimage(Linear_Expression::zero(), A - B, 5) ***");
+
+  return ok;
+}
+
+// Expressions with unique variables.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A - B == 0);
+  gr.add_congruence((C %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B, C);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_line(A));
+  known_gr.add_generator(grid_line(B));
+  known_gr.add_generator(grid_point(3*C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "***  ***");
+
+  return ok;
+}
+
+// Simple expressions having common variables.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B, A, 0);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(A - B, A, 0) ***");
+
+  return ok;
+}
+
+// Expressions having common variables.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 1);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A + 2*B, A - B, 3);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_line(A + B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "***  ***");
+
+  return ok;
+}
+
+// Test0 similar to the test in
+// ppl/test0s/Polyhedron/generalizedaffinepreimage4.cc
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(A + B));
+  gr.add_generator(grid_point(2*A));
+  gr.add_generator(grid_point(2*A + 2*B));
+  gr.add_generator(grid_point(3*A + B));
+
+  Grid known_gr(gr);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(B, B+2, 1, 5);
+
+// A longer way of computing the generalized affine preimage below.
+  known_gr.add_space_dimensions_and_embed(1);
+  known_gr.add_congruence((B %= C+2) / 5);
+  Variables_Set vset;
+  vset.insert(B);
+  known_gr.remove_space_dimensions(vset);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(A + 2*B, A - B, 3) ***");
+
+  return ok;
+}
+
+
+// Expressions having common variables.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C %= 0) / 3);
+  gr.add_congruence(A - 2*B == 1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B + C, 2*A - B - C, 5);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(A - B + C, 2*A - B - C, 5) ***");
+
+  return ok;
+}
+
+// Expressions having common variables, where
+// generalized_affine_preimage must minimize the grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B, 2*A - 2*B, 5);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((2*A - 2*B %= 0) / 5);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(A - B, 2*A - 2*B, 5) ***");
+
+  return ok;
+}
+
+// Expressions having common variables, where
+// generalized_affine_preimage must minimize the grid.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(2*A - 2*B, A - B, 5);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 5);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(2*A - 2*B, A - B, 5) ***");
+
+  return ok;
+}
+
+// Right hand side expression of greater space dimension than the
+// grid.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence(C %= -2);
+
+  try {
+    gr.generalized_affine_preimage(B + C, D + 2);
+ }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Left hand side expression of space dimension greater than the grid.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+
+  try {
+    gr.generalized_affine_preimage(A + D, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Expressions having common variables, with a negative modulus.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C %= 0) / 3);
+  gr.add_congruence(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B, C, -5);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((C %= 0) / 15);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+        "*** gr.generalized_affine_preimage(A - B, C, -5) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/generator1.cc b/tests/Grid/generator1.cc
new file mode 100644
index 0000000..1f98103
--- /dev/null
+++ b/tests/Grid/generator1.cc
@@ -0,0 +1,209 @@
+/* Test class Grid_Generator.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Point.
+static bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_point(A + 2*B + 3*C));
+
+  Grid_Generator b(grid_point(3*C + A + 2*B));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Point with divisor.
+static bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_point(A + 2*B + 3*C, 5));
+
+  Grid_Generator b(grid_point(15*C + 5*A + 10*B, 25));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Line.
+static bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_line(A + 2*B + 3*C));
+
+  Grid_Generator b(grid_line(15*C + 5*A + 10*B));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Parameter.
+static bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(parameter(A + 2*B + 3*C));
+
+  Grid_Generator b(parameter(2*B + 2*A - A + 3*C));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Parameter with divisor.
+static bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(parameter(A + 2*B + 3*C, 4));
+
+  Grid_Generator b(parameter(6*B + 3*A + 9*C, 12));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Negative first coefficient.
+static bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_point(- A + 2*B + 3*C, 4));
+
+  Grid_Generator b(grid_point(6*B - 3*A + 9*C, 12));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Construction from Generator.
+static bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_point(- A + 2*B + 3*C, 4));
+
+  Grid_Generator b(grid_point(6*B - 3*A + 9*C, 12));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Construction from reference to Generator.
+static bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator g = grid_point(- A + 2*B + 3*C, 4);
+  Grid_Generator& g_ref = g;
+
+  Grid_Generator a(g_ref);
+
+  Grid_Generator b(grid_point(6*B - 3*A + 9*C, 12));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Create from empty linear expression.
+static bool
+test09() {
+  Linear_Expression le;
+  Grid_Generator a(grid_point(le));
+
+  Grid_Generator b(grid_point(le));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+} // namespace
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/generators1.cc b/tests/Grid/generators1.cc
new file mode 100644
index 0000000..1efe24a
--- /dev/null
+++ b/tests/Grid/generators1.cc
@@ -0,0 +1,309 @@
+/* Test Grid::generators().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+  Grid gr1(7, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test02() {
+  Grid gr1(7);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+  Grid gr1(0, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+  Grid gr1(0);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+  Variable A(0);
+  Variable C(2);
+  Variable B(1);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(3*B));
+  gr1.add_generator(grid_point(5*A + 2*B));
+  gr1.add_generator(grid_point(7*B));
+  gr1.add_generator(grid_line(C));
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// 3D rectilinear grid defined by congruences.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 10);
+  gr1.add_congruence((B %= 10) / 0);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Get a reference to the empty generators, add a point, use the
+// reference to create a new grid.
+bool
+test07() {
+  Grid gr1(3, EMPTY);
+
+  const Grid_Generator_System& gs = gr1.generators();
+
+  // Add a point.  The idea is to check that `gs' still refers to a
+  // generator system that matches the grid.
+  gr1.add_generator(grid_point());
+
+  Grid known_gr = gr1;
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// In zero dimensions get a reference to the universe generators,
+// empty the grid, and then use the reference to create a new grid.
+bool
+test08() {
+  Grid gr1(0);
+
+  const Grid_Generator_System& gs = gr1.generators();
+
+  // Empty the grid.  The idea is to check that `gs' still refers to a
+  // generator system that matches the grid.
+  gr1.add_congruence_and_minimize(Congruence::zero_dim_false());
+
+  Grid known_gr = gr1;
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Empty grid, where updating the generators finds the grid empty.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr1(7);
+  gr1.add_congruence(A == 1);
+  gr1.add_congruence(A == 0);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Skew grid in 3D defined with generators with a non-integral parameter.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(3*B, 2));
+  gr1.add_generator(grid_point(5*A + 2*B));
+  gr1.add_generator(parameter(11*B, 2));
+  gr1.add_generator(grid_line(C));
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Grid defined with an integral point but non-integral parameter.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(3*B));
+  gr1.add_generator(grid_point(5*A + 2*B));
+  gr1.add_generator(parameter(11*B, 2));
+  gr1.add_generator(grid_line(C));
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Grid defined with an integral point and parameter.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(3*B));
+  gr1.add_generator(grid_point(5*A + 2*B));
+  gr1.add_generator(parameter(11*B));
+  gr1.add_generator(grid_line(C));
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/grid1.cc b/tests/Grid/grid1.cc
new file mode 100644
index 0000000..4bad322
--- /dev/null
+++ b/tests/Grid/grid1.cc
@@ -0,0 +1,586 @@
+/* Test reduction and conversion of grids created from generators.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_generator_and_minimize, one variable.
+bool
+test01() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generator_and_minimize(grid_point(2*A));
+
+  Congruence_System known_cgs;
+  known_cgs.insert(A %= 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+     "*** gr.add_generator_and_minimize(grid_point(2*A)) ***");
+
+  return ok;
+}
+
+// add_generator_and_minimize, two variables.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A + B));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  Grid_Generator g(grid_point(A + 2*B));
+  gr.add_generator_and_minimize(g);
+
+  Congruence_System known_cgs;
+  known_cgs.insert( 0*A + 0*B %= -1);
+  known_cgs.insert((  A + 0*B %=  1) / 0);
+  known_cgs.insert( 0*A + 1*B %=  1);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+     "*** gr.add_generator_and_minimize(g) ***");
+
+  return ok;
+}
+
+// add_generators_and_minimize
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_line(0*A +   B));
+  gs.insert(grid_point(3*A + 4*B));
+  gs.insert(grid_point(9*A + 0*B));
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_line(0*A +   B));
+  known_gs.insert(grid_point(3*A + 4*B));
+  known_gs.insert(grid_point(9*A + 0*B));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+     "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// test from Chiara conversion_test.cc
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(4*A -   B + 0*C, 3));
+  gs.insert(grid_line(2*A + 3*B + 0*C));
+  gs.insert(grid_point(4*A + 0*B + 0*C, 3));
+  gs.insert(grid_point(4*A -   B +   C, 3));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(( 0*A + 0*B + 0*C %= -2) / 2);
+  known_cgs.insert((-9*A + 6*B + 0*C %= 14) / 2);
+  known_cgs.insert(( 0*A - 0*B + 6*C %=  0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+     "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// test1 from Chiara conversion_test.cc.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-1*A + 4*B + 3*C, 2));
+  gs.insert(grid_line( 3*A + 2*B - 4*C));
+  gs.insert(grid_line( 0*A + 0*B - 2*C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(0*A + 0*B + 0*C %= -1);
+  known_cgs.insert((-2*A + 3*B + 0*C %= 7) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+     "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// test2 from Chiara conversion_test.cc.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-1*A + 4*B +  3*C, 2));
+  gs.insert(grid_point( 2*A + 6*B -    C, 2));
+  gs.insert(grid_point(-1*A + 9*B +  7*C, 2));
+  gs.insert(grid_line( 0*A + 0*B -  2*C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((  0*A + 0*B + 0*C %=  15) / 15);
+  known_cgs.insert((-10*A + 0*B + 0*C %=   5) / 15);
+  known_cgs.insert((  4*A - 6*B + 0*C %= -14) / 15);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+     "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// test3 from Chiara conversion_test.cc.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-1*A + 4*B + 3*C, 2));
+  gs.insert(grid_line( 2*A +   B - 2*C));
+  gs.insert(grid_point(-1*A + 9*B + 7*C, 2));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(( 0*A + 0*B + 0*C %= -10) / 10);
+  known_cgs.insert((-2*A + 4*B + 0*C %=   9) / 10);
+  known_cgs.insert(( 7*A - 4*B + 5*C %=  -4) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// param_test1 from Chiara Convert_Test.cc.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(2*A));
+  gs.insert(grid_point(A + B));
+  gs.insert(grid_point(A + C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(A %= 0);
+  known_cgs.insert(B %= 0);
+  known_cgs.insert(C %= 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// param_test2 from Chiara Convert_Test.cc.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A +   B));
+  gs.insert(grid_point(A + 2*B));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 1) / 0);
+  known_cgs.insert(B %= 0);
+  known_cgs.insert((C %= 0) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// param_test3 from Chiara Convert_Test.cc.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A +   B + 0*C));
+  gs.insert(grid_point(A + 2*B + 0*C));
+  gs.insert(grid_point(A +   B +   C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %=  1) / 0);
+  known_cgs.insert(B %= 0);
+  known_cgs.insert(C %= 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// param_test5 from Chiara Convert_Test.cc.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*A + 7*B + 0*C, 3));
+  gs.insert(grid_line(3*A + 2*B + 0*C));
+  gs.insert(grid_line(0*A + 0*B +   C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(( 0*A + 0*B + 0*C %= -1) / 1);
+  known_cgs.insert((-2*A + 3*B + 0*C %=  7) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// param_test6 from Chiara Convert_Test.cc.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-1*A + 0*B + 3*C, 4));
+  gs.insert(grid_line( 3*A + 2*B + 0*C));
+  gs.insert(grid_line( 0*A + 0*B +   C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((-4*A + 6*B + 0*C %= 1) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// Empty grid, one dimension.
+bool
+test13() {
+  Grid gr(1, EMPTY);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(1, EMPTY) ***");
+
+  return ok;
+}
+
+// Empty grid, many dimensions.
+bool
+test14() {
+  Grid gr(112, EMPTY);
+
+  Grid known_gr(112, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(112, EMPTY) ***");
+
+  return ok;
+}
+
+// Bigger values (param_test7a from Chiara Convert_Test.cc) -- in
+// grid1_64.cc.
+// Test reduce_line_with_line (param_test9 from Chiara Convert_Test.cc).
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point( -A + 0*B + 3*C, 4));
+  gs.insert(grid_line(0*A + 2*B + 0*C));
+  gs.insert(grid_line(0*A + 4*B + 0*C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((4*A + 0*B + 0*C %= -1) / 0);
+  known_cgs.insert((0*A + 0*B + 4*C %=  3) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// Grids from a water monitor example (from param_test10 from Chiara
+// Convert_test.cc).
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(   A));
+  gs.insert(grid_point( 2*A +    B));
+  gs.insert(grid_point(12*A + 11*B));
+  gs.insert(grid_point(10*A + 12*B));
+  gs.insert(grid_point( 2*A + 33*B, 2));
+  gs.insert(grid_point( 4*A + 35*B, 2));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((C %= 0) / 0);
+  known_cgs.insert((-2*A + 2*B %= 1) / 3);
+  known_cgs.insert(( 3*A %= 0) / 3);
+  known_cgs.insert(( 0*A %= 3) / 3);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// param_test11 from Chiara Convert_Test.cc.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(4*A -   B + 0*C, 3));
+  gs.insert(grid_line(2*A + 3*B));
+  gs.insert(grid_point(4*A            , 3));
+  gs.insert(grid_point(4*A -   B +   C, 3));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((-9*A + 6*B + 0*C %= 0) / 2);
+  known_cgs.insert((             6*C %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// Universe grid, one dimension.
+bool
+test18() {
+  Grid gr(1);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(1) ***");
+
+  return ok;
+}
+
+// Universe grid, many dimensions.
+bool
+test19() {
+  Grid gr(21);
+
+  Grid known_gr(21);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(21) ***");
+
+  return ok;
+}
+
+// Universe grid, zero dimensions.
+bool
+test20() {
+  Grid gr(0);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(0) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Grid/grid2.cc b/tests/Grid/grid2.cc
new file mode 100644
index 0000000..e816177
--- /dev/null
+++ b/tests/Grid/grid2.cc
@@ -0,0 +1,558 @@
+/* Test reduction and conversion of grids created from congruences.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_congruence_and_minimize, one dimension.
+bool
+test01() {
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+
+  Grid gr(cgs);
+
+  Congruence cg(A %= 0);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruence_and_minimize(cg);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(0*A));
+  known_gs.insert(grid_point(2*A));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruence_and_minimize(cg) ***");
+
+  return ok;
+}
+
+// add_congruence_and_minimize, two dimensions.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A - 3*B %= 4) / 5);
+
+  Grid gr(cgs);
+
+  Congruence cg((2*A - B %= 3) / 4);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruence_and_minimize(cg);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(0*A - 15*B, 5));
+  known_gs.insert(grid_point(  A + 27*B, 5));
+  known_gs.insert(grid_point(0*A + 85*B, 5));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruence_and_minimize(cg) ***");
+
+  return ok;
+}
+
+// add_congruences_and_minimize, one dimension.
+bool
+test03() {
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 3);
+
+  Grid gr(1);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(0*A));
+  known_gs.insert(grid_point(3*A));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// add_congruences_and_minimize, one dimension with factors.
+bool
+test04() {
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 3);
+
+  Grid gr(1);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(1*A));
+  known_gs.insert(grid_point(4*A));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_congruences_and_minimize, two dimensions.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A - B %= 0) / 3);
+
+  Grid gr(2);
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(3*A));
+  known_gs.insert(grid_point(3*B));
+  known_gs.insert(grid_line(A + B));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// cong_test0 from Chiara Convert_Test.cc.
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert(A %= 0);
+  cgs.insert(A + B %= 0);
+  cgs.insert(A + B + C %= 0);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(A));
+  known_gs.insert(grid_point(B));
+  known_gs.insert(grid_point(C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// cong_test1 from Chiara Convert_Test.cc.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert(  -A %= 64);
+  cgs.insert(-6*A +   B + 0*C %= -8);
+  cgs.insert( 3*A + 2*B +   C %= -4);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(A));
+  known_gs.insert(grid_point(B));
+  known_gs.insert(grid_point(C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// Adding a false equality (cong_test2 from Chiara Convert_Test.cc).
+bool
+test08() {
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert((0*A %= -1) / 0);
+  cgs.insert((  A %= -1) / 2);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+ }
+
+// cong_test3 from Chiara Convert_Test.cc.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A         %= 0) / 2);
+  cgs.insert((    B     %= 0) / 2);
+  cgs.insert((A + B + C %= 0) / 2);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(2*A));
+  known_gs.insert(grid_point(2*B));
+  known_gs.insert(grid_point(2*C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// cong_test4 from Chiara Convert_Test.cc -- in grid4.cc.
+
+// cong_test5 from Chiara Convert_Test.cc.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + 2*B +   C %= -2) / 5);
+  cgs.insert((    3*B       %=  0) / 5);
+  cgs.insert((      B       %=  0) / 5);
+  cgs.insert((          3*C %= -4) / 5);
+  cgs.insert((    3*B +   C %= -3) / 5);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(  A       - 3*C));
+  known_gs.insert(grid_point(6*A       - 3*C));
+  known_gs.insert(grid_point(  A + 5*B - 3*C));
+  known_gs.insert(grid_point(  A       + 2*C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// cong_test6 from Chiara Convert_Test.cc.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((3*A           %= -2) / 5);
+  cgs.insert((      B + 2*C %=  0) / 5);
+  cgs.insert((    2*B + 3*C %= -3) / 5);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(-2*A -  3*B - 6*C, 3));
+  known_gs.insert(grid_point( 3*A -  3*B - 6*C, 3));
+  known_gs.insert(grid_point(-2*A + 12*B - 6*C, 3));
+  known_gs.insert(grid_point(-2*A -  3*B + 9*C, 3));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// cong_test7 from Chiara Convert_Test.cc.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 1) / 0);
+  cgs.insert((B %= 1) / 0);
+  cgs.insert((C %= 1) / 0);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(A + B + C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// cong_test8 from Chiara Convert_Test.cc.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 1) / 0);
+  cgs.insert(B %= 1);
+  cgs.insert((C %= 1) / 0);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(A + C));
+  known_gs.insert(grid_point(A + B + C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// An empty grid constructed from congruences.
+bool
+test14() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((C %= 2) / 5);
+  cgs.insert((C %= 3) / 5);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+// Adding a congruence system with a capacity larger than the capacity
+// of the existing system.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs1;
+  cgs1.insert(B %= 2);
+
+  Grid gr(2);
+  gr.add_congruences_and_minimize(cgs1);
+
+  gr.add_space_dimensions_and_embed(1);
+  print_congruences(gr, "*** gr ***");
+
+  // gr.con_sys is likely to be expanded within capacity.
+
+  Congruence_System cgs2;
+  cgs2.insert(C %= 2);
+
+  // cgs2 is likely to now have more capacity than gr.con_sys does.
+
+  gr.add_congruences_and_minimize(cgs2);
+
+  Congruence_System cgs3;
+  cgs3.insert(B %= 2);
+  cgs3.insert(C %= 2);
+
+  Grid known_gr(cgs3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs2) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+
+bool
+test16() {
+  Congruence_System cgs;
+  cgs.insert(Congruence::zero_dim_false());
+
+  Grid gr(cgs);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+
+bool
+test17() {
+  Congruence_System cgs;
+  cgs.insert(Congruence::zero_dim_integrality());
+
+  Grid gr(cgs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruence, add empty system to zero dimension
+// universe.
+
+bool
+test18() {
+  Grid gr(0);
+
+  Congruence_System cgs;
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruence, zero dimension empty.
+
+bool
+test19() {
+  Grid gr(0);
+
+  Congruence_System cgs;
+  cgs.insert(Congruence::zero_dim_false());
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/grid3.cc b/tests/Grid/grid3.cc
new file mode 100644
index 0000000..f04ca0e
--- /dev/null
+++ b/tests/Grid/grid3.cc
@@ -0,0 +1,488 @@
+/* Test construction of grids from constraints.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grid(cs)
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+  cs.insert(A >= 0);
+  cs.insert(C > 0);
+
+  Grid gr(cs);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(B == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(cs) ***");
+
+  return ok;
+}
+
+// Grid(cs), resulting grid empty.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B < 0);
+  cs.insert(A >= 0);
+  cs.insert(C > 0);
+
+  Grid gr(cs);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(cs) ***");
+
+  return ok;
+}
+
+// Grid(const cs)
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(2*B == A);
+  cs.insert(A >= 0);
+  cs.insert(C > 0);
+
+  const Constraint_System ccs = cs;
+
+  Grid gr(ccs);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(2*B == A);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ccs) ***");
+
+  return ok;
+}
+
+// Grid(const cs), resulting grid empty.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(2*B >= A);
+  cs.insert(A >= 0);
+  cs.insert(C > 0);
+
+  const Constraint_System ccs = cs;
+
+  Grid gr(ccs);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ccs) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test05() {
+  try {
+    Grid gr(Constraint_System::max_space_dimension() + 1);
+  }
+  catch (const std::length_error& e) {
+    nout << "length_error: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Even bigger values (param_test8 from Chiara Convert_Test.cc).
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-9933*A + 2000*B + 3953*C, 9113));
+  gs.insert(grid_point(    0*A +    0*B + 8888*C, 7302));
+  gs.insert(grid_point(   29*A +   23*B + 1111*C, 1010));
+  gs.insert(grid_point( 2394*A + 7273*B +    0*C,   30));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+
+  // Create coefficients with string constructors as they're too big
+  // for the long type.
+
+  // 37315344498526  0  0  0  congruence, modulus = 37315344498526
+  // 0  343455281759218112380  0  0  congruence, modulus = 37315344498526
+  // 0  -133815138923073144612  223892066991156  0  congruence, modulus = 37315344498526
+  // -22220  -31385495955559489171  93798931757298  18255  congruence, modulus = 37315344498526
+
+  Coefficient* tem1 = new Coefficient("37315344498526");
+  known_cgs.insert((     0*A +     0*B +     0*C %= -*tem1) / *tem1);
+
+  Coefficient* tem2 = new Coefficient("343455281759218112380");
+  known_cgs.insert(( *tem2*A +     0*B +     0*C %= 0) / *tem1);
+  delete tem2;
+
+  tem2 = new Coefficient("-133815138923073144612");
+  Coefficient* tem3 = new Coefficient("223892066991156");
+  known_cgs.insert(( *tem2*A + *tem3*B +     0*C %= 0) / *tem1);
+  delete tem2; delete tem3;
+
+  tem2 = new Coefficient("-31385495955559489171");
+  tem3 = new Coefficient("93798931757298");
+  known_cgs.insert(( *tem2*A + *tem3*B + 18255*C %= 22220) / *tem1);
+  delete tem1; delete tem2; delete tem3;
+
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  //  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// Bigger values (param_test7a from Chiara Convert_Test.cc).
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-93*A +   0*B +  39*C, 113));
+  gs.insert(grid_line( 29*A +  23*B + 111*C));
+  gs.insert(grid_point(117*A + 200*B +  88*C, 33));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((       0*A +       0*B +      0*C %=  280730) / 280730);
+  known_cgs.insert((  -85767*A +  108141*B +      0*C %=   70587) / 280730);
+  known_cgs.insert((-2309489*A + 1557137*B + 280730*C %= 1997619) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// test4 from Chiara conversion_test.cc.
+bool
+test08 () {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point( 3*A +   B + 0*C, 4));
+  gs.insert(grid_point(11*A + 2*B + 0*C, 4));
+  gs.insert(grid_point( 3*A + 6*B + 0*C, 4));
+  gs.insert(grid_point( 3*A +   B + 2*C, 4));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(( 0*A +  0*B +  0*C %= -40) / 40);
+  known_cgs.insert((20*A +  0*B +  0*C %=  15) / 40);
+  known_cgs.insert((-4*A + 32*B +  0*C %=   5) / 40);
+  known_cgs.insert(( 0*A +  0*B + 80*C %=   0) / 40);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// param_test4 from Chiara Convert_Test.cc.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point( 3*A +   B + 0*C, 4));
+  gs.insert(grid_point(11*A + 2*B + 0*C, 4));
+  gs.insert(grid_point( 3*A + 6*B + 0*C, 4));
+  gs.insert(grid_point( 3*A +   B + 2*C, 4));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((20*A +  0*B        %= 15) / 40);
+  known_cgs.insert((-4*A + 32*B        %=  5) / 40);
+  known_cgs.insert((              80*C %=  0) / 40);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// add_generators_and_minimize, with more rows than columns.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(3*A + 7*B - 2*C + 3*D));
+  gs.insert(grid_point(0*A + 0*B +   C +   D));
+  gs.insert(grid_point(3*A + 4*B + 2*C + 0*D));
+  gs.insert(grid_point(3*A + 2*B +   C + 2*D));
+  gs.insert(grid_point(9*A + 0*B + 4*C +   D));
+
+  Grid gr(4, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((  9*A +   0*B +  0*C + 0*D %=   0) / 27);
+  known_cgs.insert((-18*A +  27*B +  0*C + 0*D %=   0) / 27);
+  known_cgs.insert((-90*A + 135*B + 27*C + 0*D %=  27) / 27);
+  known_cgs.insert((-17*A +  25*B +  6*C +   D %=   7) / 27);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// Example from Muller-Olm and Seidl SAS 2005 paper
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(2*A + 0*B));
+  gs.insert(grid_point(30*A + 36*B));
+  gs.insert(grid_point(450*A + 564*B));
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_generators_and_minimize(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 2) / 28);
+  known_cgs.insert((B %= 0) / 12);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_generators_and_minimize(gs) ***");
+
+  return ok;
+}
+
+// A generator system with only a line.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_line(0*A + 2*B + 0*C));
+
+  try {
+    Grid gr(gs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// A generator system containing a parameter.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*C));
+  gs.insert(grid_line(A));
+  gs.insert(grid_line(B));
+  gs.insert(parameter(-C));
+
+  Grid gr(gs);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(C %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(gs) ***");
+
+  return ok;
+}
+
+// Assignment of universe grid, zero dimensions.
+bool
+test14() {
+  Grid gr(0, EMPTY);
+
+  gr = Grid(0);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test15() {
+  try {
+    Grid gr(Grid::max_space_dimension() + 1);
+  }
+  catch (const std::length_error& e) {
+    nout << "length_error: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// cong_test4 from Chiara Convert_Test.cc.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((3*A             %= -2) / 3);
+  cgs.insert((5*A + 9*B +   C %= -1) / 3);
+  cgs.insert((        B + 3*C %= -2) / 3);
+  cgs.insert((      2*B + 3*C %= -2) / 3);
+
+  Grid gr(3);
+
+  gr.add_congruences_and_minimize(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(-2*A + 0*B +  7*C, 3));
+  known_gs.insert(grid_point( 1*A + 0*B +    C, 3));
+  known_gs.insert(grid_point(-2*A + 9*B +  7*C, 3));
+  known_gs.insert(grid_point(-2*A + 0*B + 16*C, 3));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST_F64(test06);
+  DO_TEST_F32(test07);
+  DO_TEST_F8(test08);
+  DO_TEST_F8(test09);
+  DO_TEST_F8(test10);
+  DO_TEST_F8(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST_F8(test16);
+END_MAIN
diff --git a/tests/Grid/griddifference1.cc b/tests/Grid/griddifference1.cc
new file mode 100644
index 0000000..17d2e8a
--- /dev/null
+++ b/tests/Grid/griddifference1.cc
@@ -0,0 +1,349 @@
+/* Test Grid::grid_difference_assign() (a.k.a. Grid::difference_assign()).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simple grids.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence(A %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 0) / 2);
+
+  gr1.grid_difference_assign(gr2);
+
+  Grid known_gr(1, EMPTY);
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_point(3*A));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.grid_difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test02() {
+  Grid gr1;
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2;
+
+  gr1.difference_assign(gr2);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.grid_difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// First contained in second.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A - B %= 0) / 3);
+  gr1.add_congruence((A %= 0) / 2);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence(B %= 0);
+
+  gr1.grid_difference_assign(gr2);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.grid_difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second contains single equality.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A - B %= 0) / 3);
+  gr1.add_congruence((A %= 0) / 2);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A == 5);
+
+  Grid known_gr(gr1);
+
+  gr1.grid_difference_assign(gr2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.grid_difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// First empty.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A + 2*B %= 0);
+
+  Grid gr2(2, EMPTY);
+
+  Grid known_gr(gr1);
+
+  gr1.difference_assign(gr2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.grid_difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second empty.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A + 2*B %= 0);
+
+  gr1.grid_difference_assign(gr2);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.grid_difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// More complex example, from generators.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point());
+  gr1.add_generator(grid_point(A - 2*C));
+  gr1.add_generator(grid_point(3*B));
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point(A));
+  gr2.add_generator(grid_point(A + 2*C));
+  gr2.add_generator(grid_point(3*A));
+  gr2.add_generator(grid_point(A + 3*B));
+
+  gr1.grid_difference_assign(gr2);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(2*A + C == 0);
+  known_gr.add_congruence((B %= 0) / 3);
+  known_gr.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.grid_difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Zero dimension grids.
+bool
+test08() {
+  Grid gr1(0);
+
+  Grid gr2(0);
+
+  gr1.grid_difference_assign(gr2);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.grid_difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// The smallest resulting grid is the first grid, even though the
+// first grid has more points than the second.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_generator(grid_point());
+  gr1.add_generator(grid_line(A));
+  gr1.add_generator(grid_point(B));
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((B %= 0) / 3);
+
+  Grid known_gr(gr1);
+
+  gr1.grid_difference_assign(gr2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.grid_difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Simpler example where the resulting grid contains points.
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_generator(grid_point());
+  gr1.add_generator(grid_point(A));
+  gr1.add_generator(grid_point(B));
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A - B %= 0) / 2);
+  gr2.add_congruence(A %= 0);
+
+  gr1.difference_assign(gr2);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 1) / 2);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.grid_difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Where the 2-complements of more than one congruence are added to
+// the result.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence(B == 0);
+  gr1.add_congruence(C == 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence((A + C %= 0) / 4);
+  gr2.add_congruence((A + B %= 0) / 4);
+
+  gr1.difference_assign(gr2);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A %= 2) / 4);
+  known_gr.add_congruence(B == 0);
+  known_gr.add_congruence(C == 0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.grid_difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(B + 0*C));
+
+  Grid gr1(gs);
+
+  Grid gr2(4);
+  gr2.add_congruence(A == 0);
+  gr2.add_congruence(B == 0);
+  gr2.add_congruence(C == 0);
+
+  try {
+    gr1.difference_assign(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/intersection1.cc b/tests/Grid/intersection1.cc
new file mode 100644
index 0000000..fbf90a3
--- /dev/null
+++ b/tests/Grid/intersection1.cc
@@ -0,0 +1,500 @@
+/* Test Grid::intersection_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simple grids, one dimensions.
+bool
+test01() {
+  Variable A(0);
+
+  Congruence_System cgs1;
+  cgs1.insert((A %= 1) / 2);
+
+  Congruence_System cgs2;
+  cgs2.insert((A %= 0) / 3);
+
+  Grid gr1(cgs1);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(cgs2);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 3) / 6);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// Simple grids, many dimensions.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs1;
+  cgs1.insert((A + 0*C %= 0) / 2);
+
+  Congruence_System cgs2;
+  cgs2.insert((B + 0*C %= 0) / 2);
+
+  Grid gr1(cgs1);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(cgs2);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A + 0*C %= 0) / 2);
+  known_cgs.insert((B %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// First grid empty.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((B + 0*C %= 0) / 2);
+
+  Grid gr1(3, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(cgs);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid empty.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((B + 0*C %= 0) / 2);
+
+  Grid gr1(cgs);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(3, EMPTY);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// First grid universe.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((5*A + 3*B + C %= 7) / 9);
+
+  Grid gr1(3, UNIVERSE);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(cgs);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((5*A + 3*B + C %= 7) / 9);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid universe.
+bool
+test06() {
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((2*B + 2*C %= 1) / 3);
+
+  Grid gr1(cgs);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(3, UNIVERSE);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((2*B + 2*C %= 1) / 3);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// Zero dimension grids.
+
+bool
+test07() {
+  Congruence_System cgs;
+  Linear_Expression le;
+  cgs.insert((le %= le) / 1);	// (0 %= 0) / 1
+
+  Grid gr1(cgs);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(0, UNIVERSE);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Grid known_gr(cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// Many dimensioned grids from generators.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(A + C));
+  gs1.insert(grid_line(C));
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(A));
+  gs2.insert(grid_point(A + B));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generators(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((C == 0) / 0);
+  known_cgs.insert((A == 1) / 0);
+  known_cgs.insert((B == 0) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test09() {
+  Grid gr1(1, EMPTY);
+  gr1.add_generator(grid_point());
+
+  Grid gr2(3);
+
+  try {
+    gr1.intersection_assign(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// intersection_assign_and_minimize: Simple grids, one dimension.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs1;
+  cgs1.insert((A + 0*C %= 0) / 2);
+
+  Congruence_System cgs2;
+  cgs2.insert((2*A + 0*C %= 0) / 2);
+
+  Grid gr1(cgs1);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(cgs2);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign_and_minimize(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A + 0*C %= 0) / 2);
+  known_cgs.insert((2*A %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***");
+
+  return ok;
+}
+
+// intersection_assign_and_minimize: First grid empty.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + B + C %= 0) / 2);
+
+  Grid gr1(3, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(cgs);
+
+  gr1.intersection_assign_and_minimize(gr2);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***");
+
+  return ok;
+}
+
+// intersection_assign_and_minimize: Second grid empty.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + B + C %= 0) / 2);
+
+  Grid gr1(cgs);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(3, EMPTY);
+
+  gr1.intersection_assign_and_minimize(gr2);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***");
+
+  return ok;
+}
+
+// intersection_assign_and_minimize: First grid universe.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((  A +   B + C %= 7) / 9);
+  cgs.insert((5*A + 3*B + C %= 7) / 9);
+
+  Grid gr1(3, UNIVERSE);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(cgs);
+
+  gr1.intersection_assign_and_minimize(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((  A +   B + C %= 7) / 9);
+  known_cgs.insert((5*A + 3*B + C %= 7) / 9);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***");
+
+  return ok;
+}
+
+// intersection_assign_and_minimize: Second grid universe.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((2*B + 2*C %= 1) / 3);
+  cgs.insert((2*B %= 1) / 3);
+
+  Grid gr1(cgs);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(3, UNIVERSE);
+
+  gr1.intersection_assign_and_minimize(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((2*B + 2*C %= 1) / 3);
+  known_cgs.insert((2*B %= 1) / 3);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***");
+
+  return ok;
+}
+
+// intersection_assign_and_minimize: Zero dimension grids.
+bool
+test15() {
+  Grid gr1(0);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign_and_minimize(gr2);
+
+  Grid known_gr(0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***");
+
+  return ok;
+}
+
+// intersection_assign_and_minimize: Many dimension grids from generators.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(A + C));
+  gs1.insert(grid_point(A + 2*C));
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(A));
+  gs2.insert(grid_point(A + B));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generators(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign_and_minimize(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((C == 0) / 0);
+  known_cgs.insert((A == 1) / 0);
+  known_cgs.insert((B == 0) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_generators(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Grid/isempty1.cc b/tests/Grid/isempty1.cc
new file mode 100644
index 0000000..efbde6e
--- /dev/null
+++ b/tests/Grid/isempty1.cc
@@ -0,0 +1,293 @@
+/* Test Grid::is_empty().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// One dimension.
+bool
+test01() {
+  Grid gr(1, EMPTY);
+
+  bool ok = (gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Many dimensions.
+bool
+test02() {
+  Grid gr(6, EMPTY);
+
+  bool ok = (gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test03() {
+  Grid gr(0, EMPTY);
+
+  bool ok = (gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test04() {
+  Grid gr(0);
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe grid.
+
+bool
+test05() {
+  Grid gr(2);
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Grid of congruences.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + B + C %= 0) / 3);
+
+  Grid gr(cgs);
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Empty grid of congruences.
+bool
+test07() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((0*C %= 4) / 3);
+
+  Grid gr(cgs);
+
+  bool ok = (gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Grid of generators.
+bool
+test08() {
+  Variable A(0);
+  Variable E(4);
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A + 3*E));
+
+  Grid gr(gs);
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe grid of generators.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A + 3*E));
+  gs.insert(grid_line(A));
+  gs.insert(grid_line(B));
+  gs.insert(grid_line(C));
+  gs.insert(grid_line(D));
+  gs.insert(grid_line(E));
+
+  Grid gr(5);
+  gr.add_generators(gs);
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Minimized congruences.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + B + C %= 0) / 3);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Minimized empty congruences.
+bool
+test11() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((0*C %= 4) / 3);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Minimized universe congruences.
+
+bool
+test12() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((0*C %= 4) / 2);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe after remove_space_dimensions.
+bool
+test13() {
+  Variable A(0);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 4) / 2);
+
+  Grid gr(cgs);
+
+  Variables_Set vars;
+  vars.insert(A);
+
+  gr.remove_space_dimensions(vars);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Empty from a simple constraint.
+bool
+test14() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert(0*C == 1);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+
+  bool ok = (gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/isuniverse1.cc b/tests/Grid/isuniverse1.cc
new file mode 100644
index 0000000..2171295
--- /dev/null
+++ b/tests/Grid/isuniverse1.cc
@@ -0,0 +1,321 @@
+/* Test Grid::is_universe().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// One dimension.
+bool
+test01() {
+  Grid gr(1);
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Many dimensions.
+
+bool
+test02() {
+  Grid gr(6);
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+
+bool
+test04() {
+  Grid gr(0, EMPTY);
+
+  bool ok = (!gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Empty grid.
+
+bool
+test05() {
+  Grid gr(2, EMPTY);
+
+  bool ok = (!gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Grid of congruences.
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + B + C %= 0) / 3);
+
+  Grid gr(cgs);
+
+  bool ok = (!gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe grid of congruences.
+
+bool
+test07() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((0*C %= 6) / 3);
+
+  Grid gr(cgs);
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Grid of generators.
+
+bool
+test08() {
+  Variable A(0);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A + 3*E));
+
+  Grid gr(gs);
+
+  bool ok = (!gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe grid of generators.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A + 3*E));
+  gs.insert(grid_line(A));
+  gs.insert(grid_line(B));
+  gs.insert(grid_line(C));
+  gs.insert(grid_line(D));
+  gs.insert(grid_line(E));
+
+  Grid gr(gs);
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Minimized congruences.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + B + C %= 0) / 3);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (!gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Minimized universe congruences.
+bool
+test11() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((0*C %= 3) / 3);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Minimized universe congruences.
+bool
+test12() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((0*C %= 4) / 2);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe after remove_space_dimensions.
+
+bool
+test13() {
+  Variable A(0);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 4) / 2);
+
+  Grid gr(cgs);
+
+  Variables_Set vars;
+  vars.insert(A);
+
+  gr.remove_space_dimensions(vars);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Empty from a simple constraint.
+
+bool
+test14() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert(0*C == 0);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Congruences before minimization, where a point is required to
+// determine that the grid is a strict subset of the universe.
+
+bool
+test15() {
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert(A == 3);
+
+  Grid gr(cgs);
+
+  bool ok = (!gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/join1.cc b/tests/Grid/join1.cc
new file mode 100644
index 0000000..48b7263
--- /dev/null
+++ b/tests/Grid/join1.cc
@@ -0,0 +1,376 @@
+/* Test Grid::join_assign() (a.k.a. Grid::upper_bound_assign()).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Two grids each with one point and two lines
+bool
+test01() {
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(C));
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(B + 0*C));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.join_assign(gr2);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(C));
+  known_gs.insert(grid_point(B));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign(gr2) ***");
+
+  return ok;
+}
+
+// Two universe grids.
+bool
+test02() {
+  Grid gr1(3);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(3);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.upper_bound_assign(gr2);
+
+  Grid known_gr(3);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid universe.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_line(A));
+  gs.insert(grid_line(B));
+  gs.insert(grid_line(-C));
+
+  Grid gr2(gs);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.join_assign(gr2);
+
+  Grid known_gr(3);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign(gr2) ***");
+
+  return ok;
+}
+
+// Inserting a parameter.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(0*C));
+  gs1.insert(grid_line(A));
+  gs1.insert(grid_line(B));
+
+  Grid gr1(gs1);
+
+  gr1.add_generator(parameter(-C));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(0*C));
+
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.upper_bound_assign(gr2);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(C %= 0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign(gr2) ***");
+
+  return ok;
+}
+
+// join_assign_and_minimize - Divisor normalization.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(0*C));
+  gs1.insert(grid_line(A));
+  gs1.insert(grid_line(B));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point());
+  gs2.insert(grid_point(C, 3));
+
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.join_assign_and_minimize(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((3*C %= 0) / 1);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign_and_minimize(gr2) ***");
+
+  return ok;
+}
+
+// Out-of-date generators in the first grid.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(B == 0);
+  gr1.add_congruence(C == 0);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(B + 0*C));
+
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.join_assign(gr2);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(B + 0*C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign(gr2) ***");
+
+  return ok;
+}
+
+// Out-of-date generators in the second grid.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(B + 0*C));
+
+  Grid gr1(gs);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence(A == 0);
+  gr2.add_congruence(B == 0);
+  gr2.add_congruence(C == 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.upper_bound_assign(gr2);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(B + 0*C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(B + 0*C));
+
+  Grid gr1(gs);
+
+  Grid gr2(4);
+  gr2.add_congruence(A == 0);
+  gr2.add_congruence(B == 0);
+  gr2.add_congruence(C == 0);
+
+  try {
+    gr1.upper_bound_assign(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Out-of-date generators in the first grid, which is empty.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(A == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(B + 0*C));
+
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr1.join_assign(gr2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign(gr2) ***");
+
+  return ok;
+}
+
+// Based on an example in a paper by Muller-Olm and Seidl in SAS 2005
+// Here there is an input and output version of each variable
+// A, B being input and A1, B1 the output.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr0(4); // initial point
+  gr0.add_congruence(A == 2);
+  gr0.add_congruence(B == 0);
+
+  Grid gr1(4); // a pass through the procedure may do nothing
+  gr1.add_congruence(A == C);
+  gr1.add_congruence(B == D);
+
+  gr1.intersection_assign(gr0); // add the inital point
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(4); // one non-trivial pass through procedure
+  gr2.add_congruence(15 * A == C);
+  gr2.add_congruence(18 * A + B == D);
+
+  gr2.intersection_assign(gr0); // add the inital point
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid gr3(4); // two non-trivial passes through procedure
+  gr3.add_congruence(225 * A == C);
+  gr3.add_congruence(282 * A + B == D);
+
+  gr3.intersection_assign(gr0); // add the inital point
+  print_congruences(gr3, "*** gr3 ***");
+
+  gr1.join_assign(gr2); // combine alternative paths 1 and 2
+  print_generators(gr1, "*** gr1.join_assign(gr2) ***");
+  gr1.join_assign(gr3); // combine alternative paths 1, 2 and 3
+  print_generators(gr1, "*** gr1.join_assign(gr3) ***");
+
+  Variables_Set vars;
+  vars.insert(A);
+  vars.insert(B);
+
+  gr1.remove_space_dimensions(vars);
+
+  Grid known_gr(2); // as in paper
+
+  known_gr.add_congruence((A %= 2) / 28);
+  known_gr.add_congruence((B %= 0) / 12);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST_F8(test10);
+END_MAIN
diff --git a/tests/Grid/join2.cc b/tests/Grid/join2.cc
new file mode 100644
index 0000000..ceb4537
--- /dev/null
+++ b/tests/Grid/join2.cc
@@ -0,0 +1,325 @@
+/* Test Grid::join_assign_and_minimize().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// join_assign_and_minimize - two grids in 3D
+// each defined by a single point.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(A + 0*C));
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(2*A + 0*C));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.join_assign_and_minimize(gr2);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(A + 0*C));
+  known_gs.insert(grid_point(2*A));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign_and_minimize(gr2) ***");
+
+  return ok;
+}
+
+// join_assign_and_minimize - Two universe grids.
+bool
+test02() {
+  Grid gr1(3);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(3);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.join_assign_and_minimize(gr2);
+
+  Grid known_gr(3);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign_and_minimize(gr2) ***");
+
+  return ok;
+}
+
+// join_assign and join_assign_if_exact - Two empty grids.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(4, EMPTY);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(4, EMPTY);
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr(4, EMPTY);
+
+  bool ok = (gr1.join_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// join_assign_if_exact - First grid empty.
+bool
+test04() {
+  Variable A(0);
+
+  Grid gr1(4, EMPTY);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  gr2.add_generator(grid_point(2*A));
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  bool ok = (gr1.join_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// join_assign_if_exact - Second grid empty.
+bool
+test05() {
+  Variable B(1);
+
+  Grid gr1(4, EMPTY);
+  gr1.add_generator(grid_point());
+  gr1.add_generator(grid_line(B));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr1;
+
+  bool ok = (gr1.join_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// join_assign_if_exact - Zero dimension universes.
+bool
+test06() {
+  Grid gr1(0);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(0);
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr1;
+
+  bool ok = (gr1.join_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// join_assign_if_exact - First included in second.
+bool
+test07() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence((A %= 0) / 2);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  bool ok = (gr1.join_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// join_assign_if_exact - Second included in first.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A - B %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A - B == 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr1;
+
+  bool ok = (gr1.join_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// join_assign_if_exact - Exact join.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A %= 1) / 2);
+  gr2.add_congruence((B %= 1) / 2);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 2);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr1.join_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// join_assign_if_exact - Two points (join adds more points).
+bool
+test10() {
+  Variable A(0);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(A));
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(3*A, 5));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr1;
+
+  bool ok = (!gr1.join_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// upper_bound_assign_if_exact - Space dimension exception.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(B + 0*C));
+
+  Grid gr1(gs);
+
+  Grid gr2(4);
+  gr2.add_congruence(A == 0);
+  gr2.add_congruence(B == 0);
+  gr2.add_congruence(C == 0);
+
+  try {
+    gr1.upper_bound_assign_if_exact(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/limitedextrapolation1.cc b/tests/Grid/limitedextrapolation1.cc
new file mode 100644
index 0000000..69da938
--- /dev/null
+++ b/tests/Grid/limitedextrapolation1.cc
@@ -0,0 +1,496 @@
+/* Test Grid::limited_extrapolation_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(2, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs((A %= 0) / 2);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Empty after minimization.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(A == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs((A %= 0) / 3);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Equivalent of just widening.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(B == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A == 0);
+  gr2.add_congruence(B %= 1);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs(B %= 0);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keep all congruences, including a limiting congruence.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs(C %= 0);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keep some congruences.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((B %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs(A + 0*C %= 0);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test06() {
+  Variable E(4);
+
+  Grid gr1(5);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(5);
+
+  Congruence_System cgs(0*E %= 0);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(5);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keeping many limiting congruences.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  gr1.add_congruence((B %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(B %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A %= 0);
+  cgs.insert(B %= 0);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Tokens.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 6;
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*B %= 0) / 2);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_extrapolation_assign(gr1, cgs, &tokens);
+
+#undef TOKENS
+#define TOKENS 5
+
+  bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_congruences(gr2,
+     "*** gr2.limited_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+  return ok;
+}
+
+// 0 tokens.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+  unsigned int tokens = TOKENS;
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*B %= 0) / 2);
+
+  Grid known_gr(2);
+
+  gr2.limited_extrapolation_assign(gr1, cgs, &tokens);
+
+  bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_congruences(gr2,
+     "*** gr2.limited_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+  return ok;
+}
+
+// Zero dimension.
+bool
+test10() {
+  Grid gr1(0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs(
+     (Linear_Expression::zero() %= Linear_Expression::zero()) / 4);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Congruences and equalities.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((A - B == 0) / 27);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A - B == 0) / 9);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert((A - B == 0) / 3);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence((A - B == 0) / 3);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// From generators, with a limiting equality.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(C, 3));
+  gr1.add_generator(grid_line(A - 2*B));
+  gr1.add_generator(grid_point(C + 3*A + 3*C, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point(C, 3));
+  gr2.add_generator(grid_line(A - 2*B));
+  gr2.add_generator(grid_line(A + C));
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Exception due to space dimensions of grids.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(C, 3));
+  gr1.add_generator(grid_point(C + A - 2*B, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(5, EMPTY);
+  gr2.add_generator(grid_point(C, 3));
+  gr2.add_generator(grid_point(2*C + A - 2*B, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  try {
+    gr2.limited_extrapolation_assign(gr1, cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Exception due to space dimension of congruence system.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_generator(grid_point(A));
+  gr1.add_generator(parameter(B, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_generator(grid_point(A));
+  gr2.add_generator(parameter(B, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  try {
+    gr2.limited_extrapolation_assign(gr1, cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Limit with an empty congruence system.
+bool
+test15() {
+  Variable A(0);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point());
+  gr1.add_generator(parameter(A, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point());
+  gr2.add_generator(parameter(A, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr = gr2;
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_line(A));
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/mapspacedims1.cc b/tests/Grid/mapspacedims1.cc
new file mode 100644
index 0000000..4543c3e
--- /dev/null
+++ b/tests/Grid/mapspacedims1.cc
@@ -0,0 +1,313 @@
+/* Test Grid::map_space_dimensions().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid, empty mapping.
+bool
+test01() {
+  Partial_Function function;
+
+  Grid gr(3, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping all dimensions.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Partial_Function function;
+  function.insert(0, 2);
+  function.insert(2, 0);
+  function.insert(1, 1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(2*C));
+  gs.insert(grid_point(4*C));
+  gs.insert(grid_point(A));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(2*A));
+  known_gs.insert(grid_point(4*A));
+  known_gs.insert(grid_point(C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping all dimensions, with overlap.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(2, 0);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(2*A));
+  gs.insert(grid_line(A - C));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(2*B));
+  known_gs.insert(grid_line(B - A));
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping more dimensions than there are in the grid.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Partial_Function function;
+  function.insert(2, 0);
+  function.insert(3, 2);
+  function.insert(4, 1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(B));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(0*C));
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping all dimensions to themselves.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(1, 1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(B));
+  gs.insert(grid_point(A + B));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+  Grid known_gr(gr);
+
+  gr.map_space_dimensions(function);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping all additional dimensions (in the mapping) to themselves.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+  function.insert(2, 2);
+  function.insert(3, 3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(2*B));
+  gs.insert(grid_point(A + 2*B));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid known_gr(4, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(B));
+  known_gr.add_generator(grid_point(2*A));
+  known_gr.add_generator(grid_point(2*A + B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping new dimensions over existing ones.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(2, 1);
+  function.insert(3, 2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(A));
+  gs.insert(grid_line(B));
+  gs.insert(grid_line(A + B));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_line(A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping away a dimension in an empty grid.
+bool
+test08() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// A minimized grid in which the point contains factors and the
+// divisor is greater than one.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point(4*A, 2));
+  gr.add_generator(grid_point(4*A + B, 2));
+
+  // Force minimization.
+  gr.minimized_generators();
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_generator(grid_point(4*B, 2));
+  known_gr.add_generator(grid_point(4*B + A, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/maxmin1.cc b/tests/Grid/maxmin1.cc
new file mode 100644
index 0000000..462027a
--- /dev/null
+++ b/tests/Grid/maxmin1.cc
@@ -0,0 +1,494 @@
+/* Test Grid::maximize(const Linear_Expression&, ...)
+   and Grid::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+bool
+check_both(Grid& gr, Linear_Expression& le, string grid_name) {
+  Grid_Generator ext_pnt(grid_point());
+  bool dummy;
+  Coefficient ext_n, ext_d;
+
+  bool ok = (!gr.minimize(le, ext_n, ext_d, dummy, ext_pnt)
+      && !gr.maximize(le, ext_n, ext_d, dummy, ext_pnt));
+
+  if (!ok)
+    nout << grid_name << " bounded expr" << endl;
+
+  return ok;
+}
+
+bool
+check_minimize(Grid& gr, Linear_Expression& le,
+	       Coefficient expected_n, Coefficient expected_d,
+	       Grid_Generator& expected_pnt, string grid_name) {
+  Grid_Generator inf_pnt(grid_point());
+
+  bool dummy;
+  Coefficient inf_n, inf_d;
+
+  bool ok = (gr.minimize(le, inf_n, inf_d, dummy, inf_pnt)
+    && inf_n == expected_n
+    && inf_d == expected_d
+    && inf_pnt == expected_pnt);
+
+  if (!ok)
+    nout << "grid name " << grid_name << " min point " << inf_pnt
+	        << " (expected " << expected_pnt << ")" << endl;
+
+  return ok;
+}
+
+bool
+check_maximize(Grid& gr, Linear_Expression& le,
+	       Coefficient expected_n, Coefficient expected_d,
+	       Grid_Generator& expected_pnt, string grid_name) {
+  Grid_Generator sup_pnt(grid_point());
+
+  bool dummy;
+  Coefficient sup_n, sup_d;
+
+  bool ok = (gr.maximize(le, sup_n, sup_d, dummy, sup_pnt)
+    && sup_n == expected_n
+    && sup_d == expected_d
+	     && sup_pnt == expected_pnt);
+
+  if (!ok)
+    nout << "grid name " << grid_name << " max point " << sup_pnt
+	        << " (expected " << expected_pnt << ")" << endl;
+
+  return ok;
+}
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  Coefficient extr_n, extr_d;
+  bool dummy;
+  Grid_Generator pnt(grid_point());
+
+  bool ok = (!gr.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt)
+	     && !gr.minimize(Linear_Expression(0), extr_n, extr_d, dummy, pnt));
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+  Grid gr(0, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  Linear_Expression le = Linear_Expression::zero();
+
+  return check_both(gr, le, "gr");
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Grid gr(0);
+  print_congruences(gr, "*** gr ***");
+
+  Linear_Expression le = Linear_Expression::zero();
+
+  Grid_Generator exp_pnt(grid_point());
+
+  bool ok = check_maximize(gr, le, 0, 1, exp_pnt, "gr")
+    && check_minimize(gr, le, 0, 1, exp_pnt, "gr");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 2*B, 3));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B, 3));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(A == 1);
+  gr_cgs_needs_min.add_congruence(3*B == 2);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = A + B;
+
+  Grid_Generator exp_pnt(grid_point(3*A + 2*B, 3));
+
+  bool ok = check_maximize(gr_gs_min, le, 5, 3, exp_pnt, "gr_gs_min")
+    && check_minimize(gr_gs_min, le, 5, 3, exp_pnt, "gr_gs_min");
+
+  ok &= check_maximize(
+        gr_gs_needs_min, le, 5, 3, exp_pnt, "gr_gs_needs_min")
+    && check_minimize(gr_gs_needs_min, le, 5, 3, exp_pnt, "gr_gs_needs_min");
+
+  ok &= check_maximize(
+        gr_cgs_needs_min, le, 5, 3, exp_pnt, "gr_cgs_needs_min")
+    && check_minimize(gr_cgs_needs_min, le, 5, 3, exp_pnt, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// Rectilinear line.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator_and_minimize(grid_line(B));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(B));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(A == 0);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = 2*A - B;
+
+  bool ok = check_both(gr_gs_min, le, "gr_gs_min")
+    && check_both(gr_gs_needs_min, le, "gr_gs_needs_min")
+    && check_both(gr_cgs_needs_min, le, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// Line.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator_and_minimize(grid_line(2*A + B));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(2*A + B));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(A - 2*B == 0);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = 2*A + B;
+
+  bool ok = check_both(gr_gs_min, le, "gr_gs_min")
+    && check_both(gr_gs_needs_min, le, "gr_gs_needs_min")
+    && check_both(gr_cgs_needs_min, le, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// A line along the equality `expr == 0'.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator_and_minimize(grid_line(A + 2*B));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(A + 2*B));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(2*A - B == 0);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = 2*A - B;
+
+  Grid_Generator exp_pnt(grid_point(0*B));
+
+  bool ok = check_maximize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min")
+    && check_minimize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min");
+
+  ok &= check_maximize(gr_gs_needs_min, le, 0, 1, exp_pnt, "gr_gs_needs_min")
+    && check_minimize(gr_gs_needs_min, le, 0, 1, exp_pnt, "gr_gs_needs_min");
+
+  ok &= check_maximize(
+          gr_cgs_needs_min, le, 0, 1, exp_pnt, "gr_cgs_needs_min")
+    && check_minimize(
+          gr_cgs_needs_min, le, 0, 1, exp_pnt, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// A parameter along the equality `expr == 0'.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator_and_minimize(grid_point(A + 2*B));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_point(A + 2*B));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(2*A - B == 0);
+  gr_cgs_needs_min.add_congruence((B %= 0) / 2);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = 2*A - B;
+
+  Grid_Generator exp_pnt(grid_point(0*B));
+
+  bool ok = check_maximize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min")
+    && check_minimize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min");
+
+  ok &= check_maximize(gr_gs_needs_min, le, 0, 1, exp_pnt, "gr_gs_needs_min")
+    && check_minimize(gr_gs_needs_min, le, 0, 1, exp_pnt, "gr_gs_needs_min");
+
+  ok &= check_maximize(
+          gr_cgs_needs_min, le, 0, 1, exp_pnt, "gr_cgs_needs_min")
+    && check_minimize(
+          gr_cgs_needs_min, le, 0, 1, exp_pnt, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// Two lines which combine to cover any (affine) line defined by expr.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_line(A));
+  gr_gs_min.add_generator_and_minimize(grid_line(B));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(A));
+  gr_gs_needs_min.add_generator(grid_line(B));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(2);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = A - B;
+
+  bool ok = check_both(gr_gs_min, le, "gr_gs_min")
+    && check_both(gr_gs_needs_min, le, "gr_gs_needs_min")
+    && check_both(gr_cgs_needs_min, le, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// In three dimensions, lines and parameters which combine to include
+// expr.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_line(A));
+  gr_gs_min.add_generator_and_minimize(grid_point(B + C));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(A));
+  gr_gs_needs_min.add_generator(grid_point(B + C));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(B - C == 0);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = 2*A + B - C;
+
+  bool ok = check_both(gr_gs_min, le, "gr_gs_min")
+    && check_both(gr_gs_needs_min, le, "gr_gs_needs_min")
+    && check_both(gr_cgs_needs_min, le, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// Grid which bounds a 3D expr.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(A));
+  gr_gs_min.add_generator(grid_line(3*B + C));
+  gr_gs_min.add_generator_and_minimize(grid_line(A - 2*B));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(A));
+  gr_gs_needs_min.add_generator(grid_line(3*B + C));
+  gr_gs_needs_min.add_generator(grid_line(A - 2*B));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(2*A + B - 3*C - 2 == 0);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = 2*A + B - 3*C;
+
+  Grid_Generator exp_pnt1(grid_point(2*B + 0*C));
+
+  bool ok = check_maximize(gr_gs_min, le, 2, 1, exp_pnt1, "gr_gs_min")
+    && check_minimize(gr_gs_min, le, 2, 1, exp_pnt1, "gr_gs_min");
+
+  ok &= check_maximize(gr_gs_needs_min, le, 2, 1, exp_pnt1, "gr_gs_needs_min")
+    &&check_minimize(gr_gs_needs_min, le, 2, 1, exp_pnt1, "gr_gs_needs_min");
+
+  Grid_Generator exp_pnt2(grid_point(-2*C, 3));
+
+  ok &= check_maximize(
+          gr_cgs_needs_min, le, 2, 1, exp_pnt2, "gr_cgs_needs_min")
+    && check_minimize(
+          gr_cgs_needs_min, le, 2, 1, exp_pnt2, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// Point in 6D.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Grid gr_gs_min(6, EMPTY);
+  gr_gs_min.add_generator_and_minimize(grid_point(7*A - 11*B + 19*F));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(6, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(7*A - 11*B + 19*F));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(6);
+  gr_cgs_needs_min.add_congruence(A == 7);
+  gr_cgs_needs_min.add_congruence(B == -11);
+  gr_cgs_needs_min.add_congruence(C == 0);
+  gr_cgs_needs_min.add_congruence(D == 0);
+  gr_cgs_needs_min.add_congruence(E == 0);
+  gr_cgs_needs_min.add_congruence(F == 19);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  Linear_Expression le = A + 2*B + 3*C + 4*D + 6*F;
+
+  Grid_Generator exp_pnt(grid_point(7*A - 11*B + 19*F));
+
+  bool ok = check_maximize(gr_gs_min, le, 99, 1, exp_pnt, "gr_gs_min")
+    && check_minimize(gr_gs_min, le, 99, 1, exp_pnt, "gr_gs_min");
+
+  ok &= check_maximize(gr_gs_needs_min, le, 99, 1, exp_pnt, "gr_gs_needs_min")
+    &&check_minimize(gr_gs_needs_min, le, 99, 1, exp_pnt, "gr_gs_needs_min");
+
+  ok &= check_maximize(
+          gr_cgs_needs_min, le, 99, 1, exp_pnt, "gr_cgs_needs_min")
+    && check_minimize(
+          gr_cgs_needs_min, le, 99, 1, exp_pnt, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/membytes1.cc b/tests/Grid/membytes1.cc
new file mode 100644
index 0000000..9a2d3de
--- /dev/null
+++ b/tests/Grid/membytes1.cc
@@ -0,0 +1,284 @@
+/* Test Grid::total_memory_in_bytes() and
+   Grid::external_memory_in_bytes().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+add_congruence(Grid& gr, const Congruence& cg) {
+  const memory_size_type gr_memory_before = gr.total_memory_in_bytes();
+  const memory_size_type cg_memory = cg.total_memory_in_bytes();
+  gr.add_congruence(cg);
+  const memory_size_type gr_memory_after = gr.total_memory_in_bytes();
+  nout << gr_memory_before
+       << " + " << cg_memory
+       << " -> " << gr_memory_after
+       << endl;
+}
+
+void
+add_generator(Grid& gr, const Grid_Generator& g) {
+  const memory_size_type gr_memory_before = gr.total_memory_in_bytes();
+  const memory_size_type g_memory = g.total_memory_in_bytes();
+  gr.add_generator(g);
+  const memory_size_type gr_memory_after = gr.total_memory_in_bytes();
+  nout << gr_memory_before
+       << " + " << g_memory
+       << " -> " << gr_memory_after
+       << endl;
+}
+
+void
+minimize(Grid& gr) {
+  const memory_size_type gr_memory_before = gr.total_memory_in_bytes();
+  (void) gr.minimized_generators();
+  const memory_size_type gr_memory_after = gr.total_memory_in_bytes();
+  nout << gr_memory_before
+       << " -m-> " << gr_memory_after
+       << endl;
+}
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  const memory_size_type x_total_size = x.total_memory_in_bytes();
+  const memory_size_type x_external_size = x.external_memory_in_bytes();
+
+  nout << "*** Size of variables ***"
+       << endl
+       << "x.total_memory_in_bytes() = " << x_total_size
+       << endl
+       << "x.external_memory_in_bytes() = " << x_external_size
+       << endl << endl;
+
+  nout << "*** Size of linear expressions ***"
+       << endl;
+
+  Linear_Expression le(0);
+  memory_size_type le_total_size = le.total_memory_in_bytes();
+  memory_size_type le_external_size = le.external_memory_in_bytes();
+  using namespace IO_Operators;
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+  le += x;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+  le += 2*y;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+  le += 4*z;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl << endl;
+
+  nout << "*** Adding congruences to a grid ***" << endl;
+
+  Grid gr1(3);
+  add_congruence(gr1, 4*x - 2*y - z + 14 %= 0);
+  add_congruence(gr1, 4*x + 2*y - z + 2 %= 0);
+  add_congruence(gr1, x + y - 1 %= 0);
+  add_congruence(gr1, x + y + 2*z - 5 %= 0);
+  minimize(gr1);
+  add_congruence(gr1, x + 1 %= 0);
+  add_congruence(gr1, x + z - 1 %= 0);
+  add_congruence(gr1, 2*x + y -2*z + 7 %= 0);
+  add_congruence(gr1, x - y + 2*z + 1 %= 0);
+  minimize(gr1);
+  add_congruence(gr1, x - y + 5 %= 0);
+  add_congruence(gr1, 2*x - y - 2*z + 13 %= 0);
+  add_congruence(gr1, -2*x - y + 2*z + 1 %= 0);
+  add_congruence(gr1, -x + y - 1 %= 0);
+  minimize(gr1);
+  add_congruence(gr1, -x + y -2*z + 7 %= 0);
+  add_congruence(gr1, -4*x + 2*y + z - 4 %= 0);
+  add_congruence(gr1, -2*x + y + 2*z - 5 %= 0);
+  add_congruence(gr1, -x + 1 %= 0);
+  minimize(gr1);
+  add_congruence(gr1, -x - z + 5 %= 0);
+  add_congruence(gr1, -4*x - 2*y + z + 8 %= 0);
+  add_congruence(gr1, -x - y + 5 %= 0);
+  add_congruence(gr1, -x - y -2*z +13 %= 0);
+  minimize(gr1);
+
+  const memory_size_type gr1_total_size = gr1.total_memory_in_bytes();
+  const memory_size_type gr1_external_size = gr1.external_memory_in_bytes();
+  const Congruence_System& cgs = gr1.congruences();
+  const memory_size_type cgs_total_size = cgs.total_memory_in_bytes();
+  const memory_size_type cgs_external_size = cgs.external_memory_in_bytes();
+  const Grid_Generator_System& gs = gr1.generators();
+  const memory_size_type gs_total_size = gs.total_memory_in_bytes();
+  const memory_size_type gs_external_size = gs.external_memory_in_bytes();
+
+  nout << endl
+       << "*** Size of the user-visible grid components ***"
+       << endl
+       << "gr1.total_memory_in_bytes() = " << gr1_total_size
+       << endl
+       << "cgs.total_memory_in_bytes() = " << cgs_total_size
+       << endl
+       << "gs.total_memory_in_bytes() = " << gs_total_size
+       << endl
+       << "gr1.external_memory_in_bytes() = " << gr1_external_size
+       << endl
+       << "cgs.external_memory_in_bytes() = " << cgs_external_size
+       << endl
+       << "gs.external_memory_in_bytes() = " << gs_external_size
+       << endl << endl;
+
+  nout << "*** Adding generators to a grid ***" << endl;
+
+  Grid gr2(3, EMPTY);
+  unsigned n = 0;
+  for (Grid_Generator_System::const_iterator i = gs.begin(),
+	 gs_end = gs.end(); i != gs_end; ++i) {
+    add_generator(gr2, *i);
+    if (++n % 4 == 0)
+      minimize(gr2);
+  }
+
+  nout << endl
+       << "*** Size of a congruence system vs size of contained congruences"
+       << endl
+       << "cgs.total_memory_in_bytes() = " << cgs_total_size
+       << endl;
+
+  memory_size_type cgs_elements_size = 0;
+  for (Congruence_System::const_iterator i = cgs.begin(),
+	 cgs_end = cgs.end(); i != cgs_end; ++i)
+    cgs_elements_size += i->total_memory_in_bytes();
+
+  nout << "Sum of sizes of contained congruences = " << cgs_elements_size
+       << endl << endl
+       << "*** Size of a generator system vs size of contained generators"
+       << endl
+       << "gs.total_memory_in_bytes() = " << gs_total_size
+       << endl;
+
+  memory_size_type gs_elements_size = 0;
+  for (Grid_Generator_System::const_iterator i = gs.begin(),
+	 gs_end = gs.end(); i != gs_end; ++i)
+    gs_elements_size += i->total_memory_in_bytes();
+
+  nout << "Sum of sizes of contained generators = " << gs_elements_size
+       << endl << endl;
+
+  return true;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr1(3);
+  gr1.add_constraint(4*x - 2*y - z + 14 >= 0);
+  gr1.add_constraint(4*x + 2*y - z + 2 >= 0);
+  gr1.add_constraint(x + y - 1 >= 0);
+  gr1.add_constraint(x + y + 2*z - 5 >= 0);
+
+  const memory_size_type gr1_total_size = gr1.total_memory_in_bytes();
+  const memory_size_type gr1_external_size = gr1.external_memory_in_bytes();
+
+  Determinate<Grid> dgr(gr1);
+
+  const memory_size_type dgr_total_size = dgr.total_memory_in_bytes();
+  const memory_size_type dgr_external_size = dgr.external_memory_in_bytes();
+
+  nout << "gr1.total_memory_in_bytes() = " << gr1_total_size
+       << endl
+       << "gr1.external_memory_in_bytes() = " << gr1_external_size
+       << endl
+       << "dgr.total_memory_in_bytes() = " << dgr_total_size
+       << endl
+       << "dgr.external_memory_in_bytes() = " << dgr_external_size
+       << endl;
+
+  Polyhedra_Powerset<Grid> pgr1(gr1);
+
+  Grid gr2(3);
+  gr2.add_constraint(x >= 0);
+  gr2.add_constraint(y >= 0);
+  gr2.add_constraint(z >= 0);
+  gr2.add_constraint(x <= 1);
+  gr2.add_constraint(y <= 1);
+  gr2.add_constraint(z <= 1);
+  Polyhedra_Powerset<Grid> pgr2(gr2);
+
+  // TODO: Include these sections when poly_difference_assign is
+  //       defined for Grid.
+#if 0
+  Polyhedra_Powerset<Grid> p2gr2 = pgr2;
+  p2gr2.poly_difference_assign(pgr1);
+#endif
+
+  const memory_size_type pgr1_total_size = pgr1.total_memory_in_bytes();
+  const memory_size_type pgr1_external_size = pgr1.external_memory_in_bytes();
+  const memory_size_type pgr2_total_size = pgr2.total_memory_in_bytes();
+  const memory_size_type pgr2_external_size = pgr2.external_memory_in_bytes();
+#if 0
+  const memory_size_type p2gr2_total_size = p2gr2.total_memory_in_bytes();
+  const memory_size_type p2gr2_external_size = p2gr2.external_memory_in_bytes();
+#endif
+
+  nout << "pgr1.total_memory_in_bytes() = " << pgr1_total_size
+       << endl
+       << "pgr1.external_memory_in_bytes() = " << pgr1_external_size
+       << endl
+       << "pgr2.total_memory_in_bytes() = " << pgr2_total_size
+       << endl
+       << "pgr2.external_memory_in_bytes() = " << pgr2_external_size
+#if 0
+       << endl
+       << "p2gr2.total_memory_in_bytes() = " << p2gr2_total_size
+       << endl
+       << "p2gr2.external_memory_in_bytes() = " << p2gr2_external_size
+#endif
+       << endl;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/mincongruences1.cc b/tests/Grid/mincongruences1.cc
new file mode 100644
index 0000000..aeab564
--- /dev/null
+++ b/tests/Grid/mincongruences1.cc
@@ -0,0 +1,214 @@
+/* Test Grid::minimized_congruences().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+  Grid gr1(4, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.minimized_congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test02() {
+  Grid gr1(6);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.minimized_congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+  Grid gr1(0, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.minimized_congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+  Grid gr1(0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.minimized_congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A - B %= 3) / 7);
+  gr1.add_congruence((A - B %= 3) / 14);
+  gr1.add_congruence((A %= 0) / 5);
+  gr1.add_congruence((A %= 0) / 10);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.minimized_congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Get a reference to the minimized_congruences, empty the grid, use the
+// reference to create a new grid.
+bool
+test06() {
+  Grid gr1(3);
+  gr1.add_congruence(Congruence::zero_dim_integrality());
+  print_congruences(gr1, "*** gr1 ***");
+
+  const Congruence_System& cgs = gr1.minimized_congruences();
+
+  // Empty the grid.  The idea is to check that `cgs' still refers to
+  // a congruence system that matches the grid.
+  gr1.add_congruence(Congruence::zero_dim_false());
+
+  Grid known_gr = gr1;
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// In zero dimensions get a reference to the universe minimized_congruences,
+// empty the grid, use the reference to create a new grid.
+bool
+test07() {
+  Grid gr1(0);
+  gr1.add_congruence(Congruence::zero_dim_integrality());
+  print_congruences(gr1, "*** gr1 ***");
+
+  const Congruence_System& cgs = gr1.minimized_congruences();
+
+  // Empty the grid.  The idea is to check that `cgs' still refers to
+  // a congruence system that matches the grid.
+  gr1.add_congruence(Congruence::zero_dim_false());
+
+  Grid known_gr = gr1;
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Empty grid, where minimizing the congruences finds the grid empty.
+
+bool
+test08() {
+  Variable A(0);
+
+  Grid gr1(4);
+  gr1.add_congruence(A == 1);
+  gr1.add_congruence(A == 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr(4, EMPTY);
+
+  Congruence_System cgs = gr1.minimized_congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Grid/mingenerators1.cc b/tests/Grid/mingenerators1.cc
new file mode 100644
index 0000000..55b3b8b
--- /dev/null
+++ b/tests/Grid/mingenerators1.cc
@@ -0,0 +1,240 @@
+/* Test Grid::minimized_generators().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+  Grid gr1(17, EMPTY);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// Universe grid.
+
+bool
+test02() {
+  Grid gr1(1);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+  Grid gr1(0, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+  Grid gr1(0);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(3*B));
+  gr1.add_generator(grid_point(5*A + 2*B));
+  gr1.add_generator(grid_point(10*A + B));
+  gr1.add_generator(grid_point(7*B));
+  gr1.add_generator(grid_point(3*B + 4*C));
+  gr1.add_generator(grid_line(C));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// 3D rectilinear grid defined by congruences.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 10);
+  gr1.add_congruence((B %= 10) / 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// Get a reference to the empty generators, add a point, use the
+// reference to create a new grid.
+bool
+test07() {
+  Grid gr1(2, EMPTY);
+
+  const Grid_Generator_System& gs = gr1.minimized_generators();
+
+  // Add a point.  The idea is to check that `gs' still refers to a
+  // generator system that matches the grid.
+  gr1.add_generator(grid_point());
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// In zero dimensions get a reference to the universe generators,
+// empty the grid, and then use the reference to create a new grid.
+bool
+test08() {
+  Grid gr1(0);
+
+  const Grid_Generator_System& gs = gr1.minimized_generators();
+
+  // Empty the grid.  The idea is to check that `gs' still refers to a
+  // generator system that matches the grid.
+  gr1.add_congruence_and_minimize(Congruence::zero_dim_false());
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// Empty grid, where updating the generators finds the grid empty.
+bool
+test09() {
+  Variable C(2);
+
+  Grid gr1(4);
+  gr1.add_congruence(C == 4);
+  gr1.add_congruence(C == 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/outputoperator1.cc b/tests/Grid/outputoperator1.cc
new file mode 100644
index 0000000..726c35c
--- /dev/null
+++ b/tests/Grid/outputoperator1.cc
@@ -0,0 +1,139 @@
+/* Test IO_Operators::operator<<(s, gr).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// One dimension universe and empty.
+bool
+test01() {
+  Grid gr1(1, EMPTY);
+
+  stringstream ss1;
+  ss1 << gr1;
+
+  Grid gr2(1);
+
+  stringstream ss2;
+  ss2 << gr2;
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Many dimensioned universe and empty.
+bool
+test02() {
+  Grid gr1(3, EMPTY);
+
+  stringstream ss1;
+  ss1 << gr1;
+
+  Grid gr2(3);
+
+  stringstream ss2;
+  ss2 << gr2;
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Universe and empty, mixed dimensions.
+bool
+test03() {
+  Grid gr1(4, EMPTY);
+
+  stringstream ss1;
+  ss1 << gr1;
+
+  Grid gr2(3);
+
+  stringstream ss2;
+  ss2 << gr2;
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Grids of same dimensions.
+bool
+test04() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr1(4, EMPTY);
+  gr1.add_generator(grid_point(3*A + C));
+  gr1.add_generator(parameter(3*A));
+
+  stringstream ss1;
+  ss1 << gr1;
+
+  Grid gr2(4);
+  gr2.add_congruence(3*A == 0);
+
+  stringstream ss2;
+  ss2 << gr2;
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Grids of mixed dimensions.
+bool
+test05() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(3*A + C));
+  gr1.add_generator(parameter(3*A));
+
+  stringstream ss1;
+  ss1 << gr1;
+
+  Grid gr2(4);
+  gr2.add_congruence(3*A == 0);
+
+  stringstream ss2;
+  ss2 << gr2;
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/relations1.cc b/tests/Grid/relations1.cc
new file mode 100644
index 0000000..3972058
--- /dev/null
+++ b/tests/Grid/relations1.cc
@@ -0,0 +1,180 @@
+/* Test Grid::relation_with(g).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid and point.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr(2, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(grid_point(A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Universe and point.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr(2);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(grid_point(A)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Lined grid and point.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(B));
+  gs.insert(grid_line(A));
+
+  Grid gr(gs);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(grid_point(A + B)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Equality and point.
+
+bool
+test04() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 0);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+     = (gr.relation_with(grid_point(2*A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Congruences and points.
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A - B %= 1) / 2);
+  gr.add_congruence((A %= 1) / 3);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(grid_point()) == Poly_Gen_Relation::nothing()
+       && gr.relation_with(grid_point(-B)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Congruence and parameter.
+
+bool
+test06() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_congruence(2*A %= 0);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(parameter(A, 2)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Congruence and line.
+
+bool
+test07() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_congruence(2*A %= 0);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(grid_line(A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test08() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.relation_with(grid_line(A + C));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Zero dimension universe grid.
+bool
+test09() {
+  Grid gr(0);
+
+  bool ok = (gr.relation_with(grid_point()) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/relations2.cc b/tests/Grid/relations2.cc
new file mode 100644
index 0000000..42b7d46
--- /dev/null
+++ b/tests/Grid/relations2.cc
@@ -0,0 +1,376 @@
+/* Test Grid::relation_with(cg).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// A proper congruence and a disjoint point.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(A - B));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = gr.relation_with((A - B %= 1) / 2) == Poly_Con_Relation::is_disjoint();
+
+  return ok;
+}
+
+// A proper congruence and an included grid.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(4*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A %= 0) / 2) == Poly_Con_Relation::is_included());
+
+  return ok;
+}
+
+// A proper congruence and an intersected grid.
+bool
+test03() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(2*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    =  (gr.relation_with((A + C %= 0) / 3) == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// A line and equalities.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_line(A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+     = (gr.relation_with((A + 0*B %= 0) / 0) == Poly_Con_Relation::strictly_intersects()
+	&& gr.relation_with((B + 0*B %= -2) / 0) == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Inclusion of a point.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point(A + B));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(A + 0*B %= 0) == Poly_Con_Relation::is_included());
+
+  return ok;
+}
+
+// Empty grid.
+
+bool
+test06() {
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with((B %= 0) / 2)
+      == (Poly_Con_Relation::is_included()
+	  && Poly_Con_Relation::is_disjoint()));
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test07() {
+  Grid gr;
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (// Trivially false congruence.
+      gr.relation_with(Congruence::zero_dim_false())
+      == Poly_Con_Relation::is_disjoint()
+      // False congruence.
+      && gr.relation_with((Linear_Expression(5) %= 1) / 3)
+      == Poly_Con_Relation::is_disjoint()
+      // False equality.
+      && gr.relation_with((Linear_Expression(1) %= 0) / 0)
+      == Poly_Con_Relation::is_disjoint()
+      // Proper congruence.
+      && gr.relation_with(Linear_Expression(1) %= 1)
+      == Poly_Con_Relation::is_included()
+      // Proper congruence.
+      && gr.relation_with((Linear_Expression(5) %= 1) / 4)
+      == Poly_Con_Relation::is_included()
+      // Equality.
+      && gr.relation_with(Linear_Expression(1) %= 1)
+      == Poly_Con_Relation::is_included()
+      // Integrality congruence.
+      && gr.relation_with(Congruence::zero_dim_integrality())
+      == Poly_Con_Relation::is_included());
+
+  return ok;
+}
+
+// A congruence and a disjoint grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(2*A + 5*B));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((5*A - 2*B == 1) / 0)
+      == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// A congruence and a disjoint grid.
+bool
+test09() {
+  Variable A(0);
+  Variable D(3);
+
+  Grid gr(4);
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(A - 2*D %= 0)
+       == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// Point with a divisor that is greater than zero.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point(A, 2));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A %= 3) / 0)
+      == Poly_Con_Relation::is_disjoint()
+      && gr.relation_with((2*A %= 1) / 0)
+      == Poly_Con_Relation::is_included()
+      && gr.relation_with(2*A %= 1)
+      == Poly_Con_Relation::is_included());
+
+  return ok;
+}
+
+// Grid with a divisor that is greater than zero: seperate spaces.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(parameter(A, 5));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with((10*A %= 1) / 0)
+      == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Grid with a divisor that is greater than zero: inclusion.
+bool
+test12() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(parameter(A, 5));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((10*A %= 0) / 1)
+      == Poly_Con_Relation::is_included());
+
+  return ok;
+}
+
+// Grid with a divisor that is greater than zero: strict intersection.
+bool
+test13() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(parameter(A, 5));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(A %= 0)
+      == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  print_generators(gr, "*** gr ***");
+
+  try {
+    gr.relation_with(A + B %= 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Empty grid, where updating finds the grid empty.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A == 1);
+  gr.add_congruence(A == 2);
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((B %= 0) / 2)
+        == (Poly_Con_Relation::is_included()
+	    && Poly_Con_Relation::is_disjoint()));
+
+  return ok;
+}
+
+// Generators that require the relation_with(cg) GCD calculation.
+bool
+test16() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_generator(grid_point(A));
+  gr.add_generator(grid_point(3*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A %= 0) / 4)
+      == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Strict intersection, where generators require the relation_with(cg)
+// GCD calculation.
+bool
+test17() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_generator(grid_point(3*A));
+  gr.add_generator(grid_point(6*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A %= 0) / 8)
+      == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// Strict intersection, where generators require the relation_with(cg)
+// GCD calculation, with a parameter.
+bool
+test18() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_generator(grid_point(3*A));
+  gr.add_generator(parameter(3*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A %= 0) / 8)
+      == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
diff --git a/tests/Grid/removespacedims1.cc b/tests/Grid/removespacedims1.cc
new file mode 100644
index 0000000..44ea452
--- /dev/null
+++ b/tests/Grid/removespacedims1.cc
@@ -0,0 +1,484 @@
+/* Test Grid::remove_space_dimensions().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simple grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A - B == 0);
+  gr.add_congruence(A %= 0);
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(1);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+  Variable B(1);
+
+  Grid gr(4, EMPTY);
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// Universe grid.
+
+bool
+test03() {
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(7, UNIVERSE);
+
+  Variables_Set vars;
+  vars.insert(C);
+  vars.insert(D);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(5, UNIVERSE);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*A));
+  gs.insert(grid_point(2*A));
+  gs.insert(grid_point(3*B));
+
+  Grid gr(gs);
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  gr.remove_space_dimensions(vars);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// From congruences.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Variables_Set vars;
+  vars.insert(B);
+  vars.insert(D);
+
+  Congruence_System cgs;
+  cgs.insert((A + 2*C %= 0) / 3);
+  cgs.insert((B - E %= 0) / 2);
+
+  Grid gr(cgs);
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  gr.remove_space_dimensions(vars);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_line(2*A - B));
+  known_gs.insert(grid_point(3*B, 2));
+  known_gs.insert(grid_line(C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// Variable set includes first dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A - B == 0);
+  gr.add_congruence(A %= 0);
+
+  Variables_Set vars;
+  vars.insert(A);
+  vars.insert(C);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(1);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// The resulting grid contains a parameter that is all zeros.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A));
+  gr.add_generator_and_minimize(grid_point(B));
+  gr.add_generator(grid_line(C));
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Empty variable set.
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A));
+  gr.add_generator_and_minimize(grid_point(B));
+  gr.add_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vars;
+
+  Grid known_gr = gr;
+
+  gr.remove_space_dimensions(vars);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+
+bool
+test09() {
+  Variable B(1);
+
+  Grid gr(1, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  try {
+    gr.remove_space_dimensions(vars);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Zero dimension universe resulting grid.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A));
+  gr.add_generator_and_minimize(grid_point(B));
+  gr.add_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vars;
+  vars.insert(A);
+  vars.insert(B);
+  vars.insert(C);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// From congruences.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + 2*C %= 0) / 3);
+
+  Grid gr(cgs);
+  print_generators(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(2);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(0*B));
+  known_gs.insert(grid_line(A));
+  known_gs.insert(grid_line(B));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test12() {
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(1);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(1) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test13() {
+  Grid gr(7);
+
+  gr.remove_higher_space_dimensions(3);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*A));
+  gs.insert(grid_point(2*A));
+  gs.insert(grid_point(3*B));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(1);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(1) ***");
+
+  return ok;
+}
+
+// Resulting grid the same.
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A));
+  gr.add_generator_and_minimize(grid_point(B));
+  gr.add_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.remove_higher_space_dimensions(gr.space_dimension());
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions() ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test16() {
+  Grid gr(1, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  try {
+    gr.remove_higher_space_dimensions(6);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Zero dimension universe resulting grid.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_generator(grid_point());
+  gr.add_generator(grid_point(A));
+  gr.add_generator_and_minimize(grid_point(B));
+  gr.add_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(0);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(0) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
diff --git a/tests/Grid/timeelapse1.cc b/tests/Grid/timeelapse1.cc
new file mode 100644
index 0000000..8b50902
--- /dev/null
+++ b/tests/Grid/timeelapse1.cc
@@ -0,0 +1,340 @@
+/* Test Grid::time_elapse_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Zero dimension.
+bool
+test01() {
+  Grid gr1(0);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(0);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// Zero dimension, second grid empty.
+bool
+test02() {
+  Grid gr1(0);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(0, EMPTY);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// First grid empty.
+bool
+test03() {
+  Variable A(0);
+
+  Grid gr1(4, EMPTY);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4);
+  gr2.add_congruence(A %= 3);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(4, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid empty.
+bool
+test04() {
+  Variable A(0);
+
+  Grid gr1(4);
+  gr1.add_congruence(A %= 3);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(4, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid a single point at the origin.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A + 2*B %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_generator(grid_point());
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr(gr1);
+
+  gr1.time_elapse_assign(gr2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+
+// One dimension grids of equalities.
+bool
+test06() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence(A == 2);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence(A == 1);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(1);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// One dimension grids with congruences.
+bool
+test07() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence(A == 2);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 0) / 3);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A %= 2) / 3);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// Multi-dimension grids.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A - B %= 1) / 6);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(B == 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 1) / 2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// Multi-dimension grids with denominators, in timeelapse2.
+
+// Multi-dimension grids from generators in sub-optimal form.
+bool
+test09() {
+  Variable A(0);
+  Variable D(3);
+
+  Grid gr1(4, EMPTY);
+  gr1.add_generator(grid_point());
+  gr1.add_generator(grid_point(2*A));
+  gr1.add_generator(grid_point(4*A));
+  gr1.add_generator(grid_point(D));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  gr2.add_generator(grid_point(A));
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(4, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A));
+  known_gr.add_generator(grid_point(D));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// A grid of a single point, where the position of the second grid
+// causes the result to be more dense than the second grid.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence(A == 2);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 1) / 3);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(1);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test11() {
+  Grid gr1(1, EMPTY);
+  gr1.add_generator(grid_point());
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(19, EMPTY);
+  print_generators(gr2, "*** gr2 ***");
+
+  try {
+    gr1.time_elapse_assign(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Multi-dimension grids with denominators.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point());
+  gr1.add_generator(grid_point(A + 2*B - 3*C, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point(3*A - B + 4*C, 7));
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point());
+  known_gr.add_generator(grid_point(A + 2*B - 3*C, 3));
+  known_gr.add_generator(grid_point(3*A - B + 4*C, 7));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST_F8(test12);
+END_MAIN
diff --git a/tests/Grid/topclosed1.cc b/tests/Grid/topclosed1.cc
new file mode 100644
index 0000000..3c73ba1
--- /dev/null
+++ b/tests/Grid/topclosed1.cc
@@ -0,0 +1,336 @@
+/* Test Grid::is_topologically_closed().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  bool ok = (gr.is_topologically_closed());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+
+bool
+test02() {
+  Grid gr(0, EMPTY);
+
+  bool ok = (gr.is_topologically_closed());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.is_topologically_closed());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Point.
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 2*B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B == 2);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Line.
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B == 2);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + B));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_generator(grid_point(3*A + B));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+  gr_cgs_needs_min.add_congruence(C == 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (!gr_gs_min.is_topologically_closed())
+    && (!gr_gs_needs_min.is_topologically_closed())
+    && (!gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_generator(grid_point(3*A + B));
+  gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence(A == 3);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (!gr_gs_min.is_topologically_closed())
+    && (!gr_gs_needs_min.is_topologically_closed())
+    && (!gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Skew.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_point(A));
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_point(A));
+  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (!gr_gs_min.is_topologically_closed())
+    && (!gr_gs_needs_min.is_topologically_closed())
+    && (!gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Skew with lines.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_point(A));
+  gr_gs_min.add_generator(grid_line(C));
+  gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_point(A));
+  gr_gs_needs_min.add_generator(grid_line(C));
+  gr_gs_needs_min.add_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (!gr_gs_min.is_topologically_closed())
+    && (!gr_gs_needs_min.is_topologically_closed())
+    && (!gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Plane.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(4, EMPTY);
+  gr_gs_min.add_generator(grid_point());
+  gr_gs_min.add_generator(grid_line(B));
+  gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+  Grid gr_gs_needs_min(4, EMPTY);
+  gr_gs_needs_min.add_generator(grid_point());
+  gr_gs_needs_min.add_generator(grid_line(B));
+  gr_gs_needs_min.add_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(4);
+  gr_cgs_needs_min.add_congruence(A == 0);
+  gr_cgs_needs_min.add_congruence(D == 0);
+
+  assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+  assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Empty.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr(3);
+  gr.add_congruence(A == 1);
+  gr.add_congruence(A == 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.is_topologically_closed());
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/topclosure1.cc b/tests/Grid/topclosure1.cc
new file mode 100644
index 0000000..9e92d21
--- /dev/null
+++ b/tests/Grid/topclosure1.cc
@@ -0,0 +1,93 @@
+/* Test Grid::topological_closure_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(6, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.topological_closure_assign();
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.topological_closure_assign() ***");
+
+  return ok;
+}
+
+// Universe
+bool
+test02() {
+  Grid gr(5);
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.topological_closure_assign();
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.topological_closure_assign() ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*C));
+  gs.insert(grid_line(A));
+  gs.insert(grid_line(B));
+  gs.insert(parameter(-C));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.topological_closure_assign();
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.topological_closure_assign() ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Grid/widening1.cc b/tests/Grid/widening1.cc
new file mode 100644
index 0000000..db4ba7b
--- /dev/null
+++ b/tests/Grid/widening1.cc
@@ -0,0 +1,616 @@
+/* Test Grid::widening_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(2, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Empty after minimization.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(A == 1);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence(A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Both empty.
+bool
+test03() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(A == 1);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1, EMPTY);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// An equality that becomes a congruence.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(B == 1);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A == 0);
+  gr2.add_congruence(B %= 1);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Keep all congruences.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Keep some congruences.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((B %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((B %= 0) / 2);
+  known_gr.add_congruence(C %= 0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Already minimized.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence((C %= 0) / 3);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((B %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((B %= 0) / 2);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test08() {
+  Grid gr1(5);
+  Grid gr2(5);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(5);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Widening when increasing to universe.
+
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr1(4);
+  gr1.add_congruence((A %= 0) / 4);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(4);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(4);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Tokens.
+bool
+test10() {
+  using namespace IO_Operators;
+
+  Variable A(0);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 4;
+
+  Grid known_gr = gr2;
+
+  gr2.widening_assign(gr1, &tokens);
+
+  bool ok = ((gr2 == known_gr) && (tokens == 3));
+
+  nout << "*** `tokens' should be 3 ***" << tokens << endl;
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1, &tokens) ***");
+
+  return ok;
+}
+
+// Zero dimension.
+bool
+test11() {
+  Grid gr1(0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// First case of Example 8 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(5*A + B %= 0);
+  gr1.add_congruence(22*A %= 0);
+
+  print_congruences(gr1, "gr1: ");
+
+  Grid gr2(2);
+  gr2.add_congruence(5*A + B %= 0);
+  gr2.add_congruence(44*A %= 0);
+
+  print_congruences(gr2, "gr2: ");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(5*A + B %= 0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Second case in Example 8 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(9*A + B %= 0);
+  gr1.add_congruence(22*A %= 0);
+
+  print_congruences(gr1, "gr1: ");
+
+  Grid gr2(2);
+  gr2.add_congruence(9*A + B %= 0);
+  gr2.add_congruence(44*A %= 0);
+
+  print_congruences(gr2, "gr2: ");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(9*A + B %= 0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// First case in Example 9 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Second case in Example 9 in Section 6 of [BagnaraDHMZ05TR]
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((3*A + B %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Congruences and equalities.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((A - B == 0) / 6);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A - B == 0) / 3);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B == 0) / 3);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(C, 3));
+  gr1.add_generator(grid_point(C + A - 2*B, 3));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_generator(grid_point(C, 3));
+  gr2.add_generator(grid_point(2*C + A - 2*B, 6));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_generator(grid_point(C, 3));
+  known_gr.add_generator(grid_line(A - 2*B));
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+
+// Space dimension exception.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_generator(grid_point(C, 3));
+  gr1.add_generator(grid_point(C + A - 2*B, 3));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  gr2.add_generator(grid_point(C, 3));
+  gr2.add_generator(grid_point(2*C + A - 2*B, 6));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  try {
+    gr2.widening_assign(gr1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+// Minimizing the first congruence system finds the empty grid.
+bool
+test19() {
+  Variable A(0);
+
+  Grid gr1(3);
+  gr1.add_congruence(A == 0);
+  gr1.add_congruence(A == 1);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence(A == 0);
+  gr2.add_congruence(A == 1);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2,
+        "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/writecongruencesystem.cc b/tests/Grid/writecongruencesystem.cc
new file mode 100644
index 0000000..3ee674b
--- /dev/null
+++ b/tests/Grid/writecongruencesystem.cc
@@ -0,0 +1,61 @@
+/* Test operator<<(std::ostream&, const Congruence_System&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+
+  bool ok = (cgs.OK());
+
+  stringstream ss;
+  ss << cgs;
+  ok &= (!ss.str().compare("true"));
+
+  cgs.insert(A - 2*B %= 2);
+  cgs.insert(2*A %= 4);
+
+#define OUTPUT "A - 2*B = 0 (mod 1), 2*A = 0 (mod 1)"
+
+  ss.str("");
+  ss << cgs;
+  ok &= (!ss.str().compare(OUTPUT));
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
+
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..e34e86d
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,50 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SUBDIRS = . BD_Shape Polyhedron Grid
+
+AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src @extra_includes@
+
+check_LIBRARIES = libppl_tests.a
+
+libppl_tests_a_SOURCES = \
+files.hh \
+files.cc \
+print.hh \
+print.cc \
+ppl_test.cc \
+BBox.cc \
+Partial_Function.cc
+
+LDADD = $(top_builddir)/src/libppl.la libppl_tests.a -lppl @extra_libraries@
+
+noinst_HEADERS = \
+ppl_test.hh \
+BBox.hh \
+Partial_Function.defs.hh \
+Partial_Function.inlines.hh \
+Partial_Function.types.hh \
+Random_Number_Generator.defs.hh \
+Random_Number_Generator.inlines.hh \
+Random_Number_Generator.types.hh
+
+MOSTLYCLEANFILES =
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 0000000..35de578
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,693 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = tests
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+ARFLAGS = cru
+libppl_tests_a_AR = $(AR) $(ARFLAGS)
+libppl_tests_a_LIBADD =
+am_libppl_tests_a_OBJECTS = files.$(OBJEXT) print.$(OBJEXT) \
+	ppl_test.$(OBJEXT) BBox.$(OBJEXT) Partial_Function.$(OBJEXT)
+libppl_tests_a_OBJECTS = $(am_libppl_tests_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_tests_a_SOURCES)
+DIST_SOURCES = $(libppl_tests_a_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+SUBDIRS = . BD_Shape Polyhedron Grid
+AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src @extra_includes@
+check_LIBRARIES = libppl_tests.a
+libppl_tests_a_SOURCES = \
+files.hh \
+files.cc \
+print.hh \
+print.cc \
+ppl_test.cc \
+BBox.cc \
+Partial_Function.cc
+
+LDADD = $(top_builddir)/src/libppl.la libppl_tests.a -lppl @extra_libraries@
+noinst_HEADERS = \
+ppl_test.hh \
+BBox.hh \
+Partial_Function.defs.hh \
+Partial_Function.inlines.hh \
+Partial_Function.types.hh \
+Random_Number_Generator.defs.hh \
+Random_Number_Generator.inlines.hh \
+Random_Number_Generator.types.hh
+
+MOSTLYCLEANFILES = 
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-checkLIBRARIES:
+	-test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES)
+libppl_tests.a: $(libppl_tests_a_OBJECTS) $(libppl_tests_a_DEPENDENCIES) 
+	-rm -f libppl_tests.a
+	$(libppl_tests_a_AR) libppl_tests.a $(libppl_tests_a_OBJECTS) $(libppl_tests_a_LIBADD)
+	$(RANLIB) libppl_tests.a
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BBox.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Partial_Function.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/files.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/print.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_LIBRARIES)
+check: check-recursive
+all-am: Makefile $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-checkLIBRARIES clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+	clean clean-checkLIBRARIES clean-generic clean-libtool \
+	clean-recursive ctags ctags-recursive distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-recursive distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic maintainer-clean-recursive \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Partial_Function.cc b/tests/Partial_Function.cc
new file mode 100644
index 0000000..ee28c87
--- /dev/null
+++ b/tests/Partial_Function.cc
@@ -0,0 +1,73 @@
+/* Implementation of class Partial_Function (non-inline functions).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "Partial_Function.defs.hh"
+#include <stdexcept>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Partial_Function::insert(dim_t x, dim_t y) {
+ std::pair<Map::iterator, bool> stat = map.insert(Map::value_type(x, y));
+ if (!stat.second)
+   throw std::runtime_error("Partial_Function::insert(x, y) called"
+			    " with `x' already in domain");
+ if (y > max)
+   max = y;
+}
+
+PPL::Partial_Function::dim_t
+PPL::Partial_Function::max_in_codomain() const {
+  if (has_empty_codomain())
+    throw std::runtime_error("Partial_Function::max_in_codomain() called"
+			     " when has_empty_codomain()");
+  return max;
+}
+
+bool
+PPL::Partial_Function::maps(dim_t x, dim_t& y) const {
+  if (has_empty_codomain())
+    throw std::runtime_error("Partial_Function::maps() called"
+			     " when has_empty_codomain()");
+  Map::const_iterator i = map.find(x);
+  if (i != map.end()) {
+    y = (*i).second;
+    return true;
+  }
+  else
+    return false;
+}
+
+void
+PPL::Partial_Function::print(std::ostream& s) const {
+  using namespace IO_Operators;
+
+  if (has_empty_codomain())
+    s << "empty" << std::endl;
+  else
+    for (Map::const_iterator i = map.begin(),
+	   map_end = map.end(); i != map_end; ++i)
+      s << Variable((*i).first) << " --> "
+	<< Variable((*i).second)
+	<< std::endl;
+}
diff --git a/tests/Partial_Function.defs.hh b/tests/Partial_Function.defs.hh
new file mode 100644
index 0000000..232706c
--- /dev/null
+++ b/tests/Partial_Function.defs.hh
@@ -0,0 +1,53 @@
+/* Partial_Function class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Partial_Function_defs_hh
+#define PPL_Partial_Function_defs_hh 1
+
+#include "Partial_Function.types.hh"
+#include "ppl.hh"
+#include <map>
+#include <iosfwd>
+
+class Parma_Polyhedra_Library::Partial_Function {
+private:
+  typedef dimension_type dim_t;
+
+public:
+  Partial_Function();
+  bool has_empty_codomain() const;
+  dim_t max_in_codomain() const;
+  bool maps(dim_t i, dim_t& j) const;
+
+  void print(std::ostream& s) const;
+
+  void insert(dim_t x, dim_t y);
+
+private:
+  typedef std::map<unsigned, unsigned, std::less<dim_t> > Map;
+  Map map;
+  dim_t max;
+};
+
+#include "Partial_Function.inlines.hh"
+
+#endif // !defined(PPL_Partial_Function_defs_hh)
diff --git a/tests/Partial_Function.inlines.hh b/tests/Partial_Function.inlines.hh
new file mode 100644
index 0000000..5583408
--- /dev/null
+++ b/tests/Partial_Function.inlines.hh
@@ -0,0 +1,40 @@
+/* Partial_Function class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Partial_Function_inlines_hh
+#define PPL_Partial_Function_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Partial_Function::Partial_Function()
+  : max(0) {
+}
+
+inline bool
+Partial_Function::has_empty_codomain() const {
+  return map.empty();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partial_Function_inlines_hh)
diff --git a/tests/Partial_Function.types.hh b/tests/Partial_Function.types.hh
new file mode 100644
index 0000000..681fa5f
--- /dev/null
+++ b/tests/Partial_Function.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Partial_Function_types_hh
+#define PPL_Partial_Function_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Partial_Function;
+
+}
+
+#endif // !defined(PPL_Partial_Function_types_hh)
diff --git a/tests/Polyhedron/Makefile.am b/tests/Polyhedron/Makefile.am
new file mode 100644
index 0000000..dc262ea
--- /dev/null
+++ b/tests/Polyhedron/Makefile.am
@@ -0,0 +1,663 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+CHECKER =
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog \
+-I$(top_builddir)/Watchdog/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+	addcongruence1 \
+	addcongruences1 \
+	addconstraint1 \
+	addconstraints1 addconstraints2 \
+	addgenerator1 addgenerator2 \
+	addgenerators1 addgenerators2 \
+	addspacedims1 addspacedims2 \
+	affineimage1 affineimage2 \
+	affinepreimage1 \
+	affinetrans \
+	append1 append2 \
+	ascii_dump_load1 ascii_dump_load2 ascii_dump_load3 \
+	bgp99extrapolation1 \
+	bhrz03widening1 bhrz03widening2 bhrz03widening3 \
+	bhz03widening1 \
+	bounded1 \
+	boundedaffineimage1 \
+	boundedaffinepreimage1 \
+	boundedbhrz03extrapolation1 \
+	boundedh79extrapolation1 \
+	boundingbox1 boundingbox2 boundingbox3 \
+	bounds1 \
+	cnncconversion1 \
+	concatenate1 \
+	congruences1 \
+	constraints1 \
+	contains1 contains2 \
+	disjoint1 disjoint2 \
+	dualhypercubes \
+	empty1 \
+	equals1 \
+	exceptions1 exceptions2  exceptions3 \
+	expandspacedim1 expandspacedim2 \
+	foldspacedims1 foldspacedims2 \
+	generalizedaffineimage1 generalizedaffineimage2 \
+	generalizedaffinepreimage1 generalizedaffinepreimage2 \
+	generators1 \
+	geomcovers1 \
+	h79widening1 h79widening2 \
+	intersection1 \
+	limitedbhrz03extrapolation1 \
+	limitedh79extrapolation1 \
+	linearpartition1 \
+	linexpression1 \
+	linearsystem1 \
+	lpproblem1 \
+	mapspacedims1 \
+	matrix1 \
+	max_min1 \
+	maxspacedim1 \
+	mc91 \
+	membytes1 membytes2 \
+	memory1 memory2 \
+	minconstraints1 minconstraints2 \
+	mingenerators1 mingenerators2 \
+	nncminimize1 nncminimize2 \
+	numberinput1 \
+	onepoint \
+	permute \
+	polydifference1 polydifference2 \
+	polyhull1 polyhull2 \
+	polypowerset1 \
+	powerset1 \
+	randphull1 randphull2 \
+	relations1 relations2 relations3 \
+	removespacedims1 removespacedims2 \
+	smm1 \
+	timeelapse1 timeelapse2 \
+	topclosed1 \
+	topclosure1 \
+	universe1 universe2 \
+	writeconsys1 \
+	writegensys1 \
+	writepolyhedron1 writepolyhedron2 \
+	writerelation1 \
+	writevariable1
+
+DERIVED_TESTS = \
+	nnc_addcongruence1 \
+	nnc_addcongruences1 \
+	nnc_addconstraint1 \
+	nnc_addconstraints1 \
+	nnc_addgenerator1 \
+	nnc_addgenerators1 \
+	nnc_addspacedims1 \
+	nnc_affineimage1 \
+	nnc_affinepreimage1 \
+	nnc_affinetrans \
+	nnc_append1 nnc_append2 \
+	nnc_ascii_dump_load1 nnc_ascii_dump_load2 \
+	nnc_bgp99extrapolation1 \
+	nnc_bhrz03widening1 nnc_bhrz03widening2 \
+	nnc_bounded1 \
+	nnc_boundedaffineimage1 \
+	nnc_boundedaffinepreimage1 \
+	nnc_boundedbhrz03extrapolation1 \
+	nnc_boundedh79extrapolation1 \
+	nnc_boundingbox1 nnc_boundingbox2 \
+	nnc_bounds1 \
+	nnc_concatenate1 \
+	nnc_congruences1 \
+	nnc_constraints1 \
+	nnc_contains1 \
+	nnc_disjoint1 \
+	nnc_empty1 \
+	nnc_equals1 \
+	nnc_exceptions1 nnc_exceptions3 \
+	nnc_expandspacedim1 \
+	nnc_foldspacedims1 \
+	nnc_generalizedaffineimage1 \
+	nnc_generalizedaffinepreimage1 \
+	nnc_generators1 \
+	nnc_geomcovers1 \
+	nnc_h79widening1 \
+	nnc_intersection1 \
+	nnc_limitedbhrz03extrapolation1 \
+	nnc_limitedh79extrapolation1 \
+	nnc_linearpartition1 \
+	nnc_mapspacedims1 \
+	nnc_max_min1 \
+	nnc_mc91 \
+	nnc_membytes1 nnc_membytes2 \
+	nnc_minconstraints1 \
+	nnc_mingenerators1 \
+	nnc_onepoint \
+	nnc_permute \
+	nnc_polydifference1 \
+	nnc_polyhull1 \
+	nnc_randphull1 nnc_randphull2 \
+	nnc_relations1 nnc_relations2 \
+	nnc_removespacedims1 \
+	nnc_smm1 \
+	nnc_timeelapse1 \
+	nnc_universe1 \
+	nnc_writepolyhedron1
+
+#
+# Sources for the tests
+#
+
+addcongruence1_SOURCES = addcongruence1.cc
+
+addcongruences1_SOURCES = addcongruences1.cc
+
+addconstraint1_SOURCES = addconstraint1.cc
+
+addconstraints1_SOURCES = addconstraints1.cc
+addconstraints2_SOURCES = addconstraints2.cc
+
+addgenerator1_SOURCES = addgenerator1.cc
+addgenerator2_SOURCES = addgenerator2.cc
+
+addgenerators1_SOURCES = addgenerators1.cc
+addgenerators2_SOURCES = addgenerators2.cc
+
+addspacedims1_SOURCES = addspacedims1.cc
+addspacedims2_SOURCES = addspacedims2.cc
+
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+
+affinetrans_SOURCES = affinetrans.cc
+
+append1_SOURCES = append1.cc
+append2_SOURCES = append2.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+ascii_dump_load2_SOURCES = ascii_dump_load2.cc
+ascii_dump_load3_SOURCES = ascii_dump_load3.cc
+
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+
+bhrz03widening1_SOURCES = bhrz03widening1.cc
+bhrz03widening2_SOURCES = bhrz03widening2.cc
+bhrz03widening3_SOURCES = bhrz03widening3.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
+
+boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
+
+boundingbox1_SOURCES = boundingbox1.cc
+boundingbox2_SOURCES = boundingbox2.cc
+boundingbox3_SOURCES = boundingbox3.cc
+
+bounds1_SOURCES = bounds1.cc
+
+cnncconversion1_SOURCES = cnncconversion1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+contains2_SOURCES = contains2.cc
+
+disjoint1_SOURCES = disjoint1.cc
+disjoint2_SOURCES = disjoint2.cc
+
+dualhypercubes_SOURCES = dualhypercubes.cc
+
+empty1_SOURCES = empty1.cc
+
+equals1_SOURCES = equals1.cc
+
+exceptions1_SOURCES = exceptions1.cc
+exceptions2_SOURCES = exceptions2.cc
+exceptions3_SOURCES = exceptions3.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+expandspacedim2_SOURCES = expandspacedim2.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+foldspacedims2_SOURCES = foldspacedims2.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+
+generators1_SOURCES = generators1.cc
+
+geomcovers1_SOURCES = geomcovers1.cc
+
+h79widening1_SOURCES = h79widening1.cc
+h79widening2_SOURCES = h79widening2.cc
+
+intersection1_SOURCES = intersection1.cc
+
+limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+
+linearpartition1_SOURCES = linearpartition1.cc
+
+linexpression1_SOURCES = linexpression1.cc
+
+linearsystem1_SOURCES = linearsystem1.cc
+
+lpproblem1_SOURCES = lpproblem1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+matrix1_SOURCES = matrix1.cc
+
+max_min1_SOURCES = max_min1.cc
+
+maxspacedim1_SOURCES = maxspacedim1.cc
+
+mc91_SOURCES = mc91.cc
+
+membytes1_SOURCES = membytes1.cc
+membytes2_SOURCES = membytes2.cc
+
+memory1_SOURCES = memory1.cc
+memory2_SOURCES = memory2.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+minconstraints2_SOURCES = minconstraints2.cc
+
+mingenerators1_SOURCES = mingenerators1.cc
+mingenerators2_SOURCES = mingenerators2.cc
+
+numberinput1_SOURCES = numberinput1.cc
+
+nncminimize1_SOURCES = nncminimize1.cc
+nncminimize2_SOURCES = nncminimize2.cc
+
+onepoint_SOURCES = onepoint.cc
+
+permute_SOURCES = permute.cc
+
+polydifference1_SOURCES = polydifference1.cc
+polydifference2_SOURCES = polydifference2.cc
+
+polyhull1_SOURCES = polyhull1.cc
+polyhull2_SOURCES = polyhull2.cc
+
+polypowerset1_SOURCES = polypowerset1.cc
+
+powerset1_SOURCES = powerset1.cc
+
+randphull1_SOURCES = randphull1.cc
+randphull2_SOURCES = randphull2.cc
+randphull2_LDADD = $(LDADD) -lm
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
+
+smm1_SOURCES = smm1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+timeelapse2_SOURCES = timeelapse2.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+topclosure1_SOURCES = topclosure1.cc
+
+universe1_SOURCES = universe1.cc
+universe2_SOURCES = universe2.cc
+
+writeconsys1_SOURCES = writeconsys1.cc
+
+writegensys1_SOURCES = writegensys1.cc
+
+writepolyhedron1_SOURCES = writepolyhedron1.cc
+writepolyhedron2_SOURCES = writepolyhedron2.cc
+
+writerelation1_SOURCES = writerelation1.cc
+
+writevariable1_SOURCES = writevariable1.cc
+
+#
+# Sources and compilation flags for the derived check programs
+#
+
+DERIVED_CXXFLAGS = -DDERIVED_TEST $(AM_CXXFLAGS)
+
+nnc_addcongruence1_SOURCES = addcongruence1.cc
+nnc_addcongruence1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addcongruences1_SOURCES = addcongruences1.cc
+nnc_addcongruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addconstraint1_SOURCES = addconstraint1.cc
+nnc_addconstraint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addconstraints1_SOURCES = addconstraints1.cc
+nnc_addconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addgenerator1_SOURCES = addgenerator1.cc
+nnc_addgenerator1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addgenerators1_SOURCES = addgenerators1.cc
+nnc_addgenerators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addspacedims1_SOURCES = addspacedims1.cc
+nnc_addspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_affineimage1_SOURCES = affineimage1.cc
+nnc_affineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_affinepreimage1_SOURCES = affinepreimage1.cc
+nnc_affinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_affinetrans_SOURCES = affinetrans.cc
+nnc_affinetrans_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_append1_SOURCES = append1.cc
+nnc_append1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_append2_SOURCES = append2.cc
+nnc_append2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+nnc_ascii_dump_load1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_ascii_dump_load2_SOURCES = ascii_dump_load2.cc
+nnc_ascii_dump_load2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+nnc_bgp99extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_bhrz03widening1_SOURCES = bhrz03widening1.cc
+nnc_bhrz03widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bhrz03widening2_SOURCES = bhrz03widening2.cc
+nnc_bhrz03widening2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_bounded1_SOURCES = bounded1.cc
+nnc_bounded1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+nnc_boundedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+nnc_boundedaffinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
+nnc_boundedvhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
+nnc_boundedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundingbox1_SOURCES = boundingbox1.cc
+nnc_boundingbox1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundingbox2_SOURCES = boundingbox2.cc
+nnc_boundingbox2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_bounds1_SOURCES = bounds1.cc
+nnc_bounds1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_concatenate1_SOURCES = concatenate1.cc
+nnc_concatenate1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_congruences1_SOURCES = congruences1.cc
+nnc_congruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_constraints1_SOURCES = constraints1.cc
+nnc_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_contains1_SOURCES = contains1.cc
+nnc_contains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_disjoint1_SOURCES = disjoint1.cc
+nnc_disjoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_empty1_SOURCES = empty1.cc
+nnc_empty1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_equals1_SOURCES = equals1.cc
+nnc_equals1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_exceptions1_SOURCES = exceptions1.cc
+nnc_exceptions1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_exceptions3_SOURCES = exceptions3.cc
+nnc_exceptions3_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_expandspacedim1_SOURCES = expandspacedim1.cc
+nnc_expandspacedim1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_foldspacedims1_SOURCES = foldspacedims1.cc
+nnc_foldspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+nnc_generalizedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+nnc_generalizedaffinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_generators1_SOURCES = generators1.cc
+nnc_generators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_geomcovers1_SOURCES = geomcovers1.cc
+nnc_geomcovers1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_h79widening1_SOURCES = h79widening1.cc
+nnc_h79widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_intersection1_SOURCES = intersection1.cc
+nnc_intersection1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+nnc_limitedbhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+nnc_limitedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_linearpartition1_SOURCES = linearpartition1.cc
+nnc_linearpartition1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_mapspacedims1_SOURCES = mapspacedims1.cc
+nnc_mapspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_max_min1_SOURCES = max_min1.cc
+nnc_max_min1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_mc91_SOURCES = mc91.cc
+nnc_mc91_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_membytes1_SOURCES = membytes1.cc
+nnc_membytes1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_membytes2_SOURCES = membytes2.cc
+nnc_membytes2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_minconstraints1_SOURCES = minconstraints1.cc
+nnc_minconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_mingenerators1_SOURCES = mingenerators1.cc
+nnc_mingenerators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_onepoint_SOURCES = onepoint.cc
+nnc_onepoint_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_permute_SOURCES = permute.cc
+nnc_permute_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_polydifference1_SOURCES = polydifference1.cc
+nnc_polydifference1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_polyhull1_SOURCES = polyhull1.cc
+nnc_polyhull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_randphull1_SOURCES = randphull1.cc
+nnc_randphull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_randphull2_SOURCES = randphull2.cc
+nnc_randphull2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_randphull2_LDADD = $(LDADD) -lm
+
+nnc_relations1_SOURCES = relations1.cc
+nnc_relations1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_relations2_SOURCES = relations2.cc
+nnc_relations2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_removespacedims1_SOURCES = removespacedims1.cc
+nnc_removespacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_smm1_SOURCES = smm1.cc
+nnc_smm1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_timeelapse1_SOURCES = timeelapse1.cc
+nnc_timeelapse1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_universe1_SOURCES = universe1.cc
+nnc_universe1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_writepolyhedron1_SOURCES = writepolyhedron1.cc
+nnc_writepolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+watchdog1_SRCS = watchdog1.cc
+
+if BUILD_WATCHDOG_LIBRARY
+WATCHDOG_TESTS = watchdog1
+
+watchdog1_SOURCES = $(watchdog1_SRCS)
+watchdog1_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la
+
+endif BUILD_WATCHDOG_LIBRARY
+
+TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS) $(WATCHDOG_TESTS)
+
+XFAIL_ALWAYS =
+
+XFAIL_WITH_INT64 = \
+$(XFAIL_ALWAYS) \
+randphull2 \
+nnc_randphull2
+
+XFAIL_WITH_INT32 = \
+$(XFAIL_WITH_INT64)
+
+XFAIL_WITH_INT16 = \
+$(XFAIL_WITH_INT32)
+
+XFAIL_WITH_INT8 = \
+$(XFAIL_WITH_INT16) \
+membytes1 \
+randphull1 \
+smm1 \
+nnc_membytes1 \
+nnc_randphull1 \
+nnc_smm1
+
+XFAIL_WITH_INT8_A = \
+$(XFAIL_WITH_INT8) \
+membytes2 \
+nnc_membytes2
+
+if USE_INT64
+
+XFAIL_SET = $(XFAIL_WITH_INT64)
+
+else !USE_INT64
+if USE_INT32
+
+XFAIL_SET = $(XFAIL_WITH_INT32)
+
+else !USE_INT32
+if USE_INT16
+
+XFAIL_SET = $(XFAIL_WITH_INT16)
+
+else !USE_INT16
+if USE_INT8
+
+if ASSERTIONS_ENABLED
+
+XFAIL_SET = $(XFAIL_WITH_INT8_A)
+
+else !ASSERTIONS_ENABLED
+
+XFAIL_SET = $(XFAIL_WITH_INT8)
+
+endif !ASSERTIONS_ENABLED
+
+else !USE_INT8
+
+XFAIL_SET = $(XFAIL_ALWAYS)
+
+endif !USE_INT8
+endif !USE_INT16
+endif !USE_INT32
+endif !USE_INT64
+
+XFAIL_TESTS = $(XFAIL_SET)
+
+check_PROGRAMS = $(TESTS) $(BUGS)
+
+EXTRA_DIST = $(watchdog1_SRCS)
+
+BUGS = bug2
+
+bug2_SOURCES = bug2.cc
+bug2_CXXFLAGS = -DSRCDIR=\"$(srcdir)\"
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+matrix1.dat \
+linearsystem1.dat \
+writeconsys1.dat \
+writegensys1.dat \
+writepolyhedron1.dat \
+writepolyhedron2.dat \
+writerelation1.dat \
+writevariable1.dat
diff --git a/tests/Polyhedron/Makefile.in b/tests/Polyhedron/Makefile.in
new file mode 100644
index 0000000..ac247c5
--- /dev/null
+++ b/tests/Polyhedron/Makefile.in
@@ -0,0 +1,4125 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = $(am__EXEEXT_4) $(am__EXEEXT_5)
+subdir = tests/Polyhedron
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__EXEEXT_1 = addcongruence1$(EXEEXT) addcongruences1$(EXEEXT) \
+	addconstraint1$(EXEEXT) addconstraints1$(EXEEXT) \
+	addconstraints2$(EXEEXT) addgenerator1$(EXEEXT) \
+	addgenerator2$(EXEEXT) addgenerators1$(EXEEXT) \
+	addgenerators2$(EXEEXT) addspacedims1$(EXEEXT) \
+	addspacedims2$(EXEEXT) affineimage1$(EXEEXT) \
+	affineimage2$(EXEEXT) affinepreimage1$(EXEEXT) \
+	affinetrans$(EXEEXT) append1$(EXEEXT) append2$(EXEEXT) \
+	ascii_dump_load1$(EXEEXT) ascii_dump_load2$(EXEEXT) \
+	ascii_dump_load3$(EXEEXT) bgp99extrapolation1$(EXEEXT) \
+	bhrz03widening1$(EXEEXT) bhrz03widening2$(EXEEXT) \
+	bhrz03widening3$(EXEEXT) bhz03widening1$(EXEEXT) \
+	bounded1$(EXEEXT) boundedaffineimage1$(EXEEXT) \
+	boundedaffinepreimage1$(EXEEXT) \
+	boundedbhrz03extrapolation1$(EXEEXT) \
+	boundedh79extrapolation1$(EXEEXT) boundingbox1$(EXEEXT) \
+	boundingbox2$(EXEEXT) boundingbox3$(EXEEXT) bounds1$(EXEEXT) \
+	cnncconversion1$(EXEEXT) concatenate1$(EXEEXT) \
+	congruences1$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+	contains2$(EXEEXT) disjoint1$(EXEEXT) disjoint2$(EXEEXT) \
+	dualhypercubes$(EXEEXT) empty1$(EXEEXT) equals1$(EXEEXT) \
+	exceptions1$(EXEEXT) exceptions2$(EXEEXT) exceptions3$(EXEEXT) \
+	expandspacedim1$(EXEEXT) expandspacedim2$(EXEEXT) \
+	foldspacedims1$(EXEEXT) foldspacedims2$(EXEEXT) \
+	generalizedaffineimage1$(EXEEXT) \
+	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffinepreimage1$(EXEEXT) \
+	generalizedaffinepreimage2$(EXEEXT) generators1$(EXEEXT) \
+	geomcovers1$(EXEEXT) h79widening1$(EXEEXT) \
+	h79widening2$(EXEEXT) intersection1$(EXEEXT) \
+	limitedbhrz03extrapolation1$(EXEEXT) \
+	limitedh79extrapolation1$(EXEEXT) linearpartition1$(EXEEXT) \
+	linexpression1$(EXEEXT) linearsystem1$(EXEEXT) \
+	lpproblem1$(EXEEXT) mapspacedims1$(EXEEXT) matrix1$(EXEEXT) \
+	max_min1$(EXEEXT) maxspacedim1$(EXEEXT) mc91$(EXEEXT) \
+	membytes1$(EXEEXT) membytes2$(EXEEXT) memory1$(EXEEXT) \
+	memory2$(EXEEXT) minconstraints1$(EXEEXT) \
+	minconstraints2$(EXEEXT) mingenerators1$(EXEEXT) \
+	mingenerators2$(EXEEXT) nncminimize1$(EXEEXT) \
+	nncminimize2$(EXEEXT) numberinput1$(EXEEXT) onepoint$(EXEEXT) \
+	permute$(EXEEXT) polydifference1$(EXEEXT) \
+	polydifference2$(EXEEXT) polyhull1$(EXEEXT) polyhull2$(EXEEXT) \
+	polypowerset1$(EXEEXT) powerset1$(EXEEXT) randphull1$(EXEEXT) \
+	randphull2$(EXEEXT) relations1$(EXEEXT) relations2$(EXEEXT) \
+	relations3$(EXEEXT) removespacedims1$(EXEEXT) \
+	removespacedims2$(EXEEXT) smm1$(EXEEXT) timeelapse1$(EXEEXT) \
+	timeelapse2$(EXEEXT) topclosed1$(EXEEXT) topclosure1$(EXEEXT) \
+	universe1$(EXEEXT) universe2$(EXEEXT) writeconsys1$(EXEEXT) \
+	writegensys1$(EXEEXT) writepolyhedron1$(EXEEXT) \
+	writepolyhedron2$(EXEEXT) writerelation1$(EXEEXT) \
+	writevariable1$(EXEEXT)
+am__EXEEXT_2 = nnc_addcongruence1$(EXEEXT) \
+	nnc_addcongruences1$(EXEEXT) nnc_addconstraint1$(EXEEXT) \
+	nnc_addconstraints1$(EXEEXT) nnc_addgenerator1$(EXEEXT) \
+	nnc_addgenerators1$(EXEEXT) nnc_addspacedims1$(EXEEXT) \
+	nnc_affineimage1$(EXEEXT) nnc_affinepreimage1$(EXEEXT) \
+	nnc_affinetrans$(EXEEXT) nnc_append1$(EXEEXT) \
+	nnc_append2$(EXEEXT) nnc_ascii_dump_load1$(EXEEXT) \
+	nnc_ascii_dump_load2$(EXEEXT) nnc_bgp99extrapolation1$(EXEEXT) \
+	nnc_bhrz03widening1$(EXEEXT) nnc_bhrz03widening2$(EXEEXT) \
+	nnc_bounded1$(EXEEXT) nnc_boundedaffineimage1$(EXEEXT) \
+	nnc_boundedaffinepreimage1$(EXEEXT) \
+	nnc_boundedbhrz03extrapolation1$(EXEEXT) \
+	nnc_boundedh79extrapolation1$(EXEEXT) \
+	nnc_boundingbox1$(EXEEXT) nnc_boundingbox2$(EXEEXT) \
+	nnc_bounds1$(EXEEXT) nnc_concatenate1$(EXEEXT) \
+	nnc_congruences1$(EXEEXT) nnc_constraints1$(EXEEXT) \
+	nnc_contains1$(EXEEXT) nnc_disjoint1$(EXEEXT) \
+	nnc_empty1$(EXEEXT) nnc_equals1$(EXEEXT) \
+	nnc_exceptions1$(EXEEXT) nnc_exceptions3$(EXEEXT) \
+	nnc_expandspacedim1$(EXEEXT) nnc_foldspacedims1$(EXEEXT) \
+	nnc_generalizedaffineimage1$(EXEEXT) \
+	nnc_generalizedaffinepreimage1$(EXEEXT) \
+	nnc_generators1$(EXEEXT) nnc_geomcovers1$(EXEEXT) \
+	nnc_h79widening1$(EXEEXT) nnc_intersection1$(EXEEXT) \
+	nnc_limitedbhrz03extrapolation1$(EXEEXT) \
+	nnc_limitedh79extrapolation1$(EXEEXT) \
+	nnc_linearpartition1$(EXEEXT) nnc_mapspacedims1$(EXEEXT) \
+	nnc_max_min1$(EXEEXT) nnc_mc91$(EXEEXT) nnc_membytes1$(EXEEXT) \
+	nnc_membytes2$(EXEEXT) nnc_minconstraints1$(EXEEXT) \
+	nnc_mingenerators1$(EXEEXT) nnc_onepoint$(EXEEXT) \
+	nnc_permute$(EXEEXT) nnc_polydifference1$(EXEEXT) \
+	nnc_polyhull1$(EXEEXT) nnc_randphull1$(EXEEXT) \
+	nnc_randphull2$(EXEEXT) nnc_relations1$(EXEEXT) \
+	nnc_relations2$(EXEEXT) nnc_removespacedims1$(EXEEXT) \
+	nnc_smm1$(EXEEXT) nnc_timeelapse1$(EXEEXT) \
+	nnc_universe1$(EXEEXT) nnc_writepolyhedron1$(EXEEXT)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@am__EXEEXT_3 = watchdog1$(EXEEXT)
+am__EXEEXT_4 = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
+am__EXEEXT_5 = bug2$(EXEEXT)
+am_addcongruence1_OBJECTS = addcongruence1.$(OBJEXT)
+addcongruence1_OBJECTS = $(am_addcongruence1_OBJECTS)
+addcongruence1_LDADD = $(LDADD)
+addcongruence1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addcongruences1_OBJECTS = addcongruences1.$(OBJEXT)
+addcongruences1_OBJECTS = $(am_addcongruences1_OBJECTS)
+addcongruences1_LDADD = $(LDADD)
+addcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addconstraint1_OBJECTS = addconstraint1.$(OBJEXT)
+addconstraint1_OBJECTS = $(am_addconstraint1_OBJECTS)
+addconstraint1_LDADD = $(LDADD)
+addconstraint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addconstraints2_OBJECTS = addconstraints2.$(OBJEXT)
+addconstraints2_OBJECTS = $(am_addconstraints2_OBJECTS)
+addconstraints2_LDADD = $(LDADD)
+addconstraints2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addgenerator1_OBJECTS = addgenerator1.$(OBJEXT)
+addgenerator1_OBJECTS = $(am_addgenerator1_OBJECTS)
+addgenerator1_LDADD = $(LDADD)
+addgenerator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addgenerator2_OBJECTS = addgenerator2.$(OBJEXT)
+addgenerator2_OBJECTS = $(am_addgenerator2_OBJECTS)
+addgenerator2_LDADD = $(LDADD)
+addgenerator2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addgenerators1_OBJECTS = addgenerators1.$(OBJEXT)
+addgenerators1_OBJECTS = $(am_addgenerators1_OBJECTS)
+addgenerators1_LDADD = $(LDADD)
+addgenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addgenerators2_OBJECTS = addgenerators2.$(OBJEXT)
+addgenerators2_OBJECTS = $(am_addgenerators2_OBJECTS)
+addgenerators2_LDADD = $(LDADD)
+addgenerators2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addspacedims2_OBJECTS = addspacedims2.$(OBJEXT)
+addspacedims2_OBJECTS = $(am_addspacedims2_OBJECTS)
+addspacedims2_LDADD = $(LDADD)
+addspacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage2_OBJECTS = affineimage2.$(OBJEXT)
+affineimage2_OBJECTS = $(am_affineimage2_OBJECTS)
+affineimage2_LDADD = $(LDADD)
+affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinetrans_OBJECTS = affinetrans.$(OBJEXT)
+affinetrans_OBJECTS = $(am_affinetrans_OBJECTS)
+affinetrans_LDADD = $(LDADD)
+affinetrans_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_append1_OBJECTS = append1.$(OBJEXT)
+append1_OBJECTS = $(am_append1_OBJECTS)
+append1_LDADD = $(LDADD)
+append1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_append2_OBJECTS = append2.$(OBJEXT)
+append2_OBJECTS = $(am_append2_OBJECTS)
+append2_LDADD = $(LDADD)
+append2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_ascii_dump_load2_OBJECTS = ascii_dump_load2.$(OBJEXT)
+ascii_dump_load2_OBJECTS = $(am_ascii_dump_load2_OBJECTS)
+ascii_dump_load2_LDADD = $(LDADD)
+ascii_dump_load2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_ascii_dump_load3_OBJECTS = ascii_dump_load3.$(OBJEXT)
+ascii_dump_load3_OBJECTS = $(am_ascii_dump_load3_OBJECTS)
+ascii_dump_load3_LDADD = $(LDADD)
+ascii_dump_load3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bgp99extrapolation1_OBJECTS = bgp99extrapolation1.$(OBJEXT)
+bgp99extrapolation1_OBJECTS = $(am_bgp99extrapolation1_OBJECTS)
+bgp99extrapolation1_LDADD = $(LDADD)
+bgp99extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhrz03widening1_OBJECTS = bhrz03widening1.$(OBJEXT)
+bhrz03widening1_OBJECTS = $(am_bhrz03widening1_OBJECTS)
+bhrz03widening1_LDADD = $(LDADD)
+bhrz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhrz03widening2_OBJECTS = bhrz03widening2.$(OBJEXT)
+bhrz03widening2_OBJECTS = $(am_bhrz03widening2_OBJECTS)
+bhrz03widening2_LDADD = $(LDADD)
+bhrz03widening2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhrz03widening3_OBJECTS = bhrz03widening3.$(OBJEXT)
+bhrz03widening3_OBJECTS = $(am_bhrz03widening3_OBJECTS)
+bhrz03widening3_LDADD = $(LDADD)
+bhrz03widening3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedbhrz03extrapolation1_OBJECTS =  \
+	boundedbhrz03extrapolation1.$(OBJEXT)
+boundedbhrz03extrapolation1_OBJECTS =  \
+	$(am_boundedbhrz03extrapolation1_OBJECTS)
+boundedbhrz03extrapolation1_LDADD = $(LDADD)
+boundedbhrz03extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedh79extrapolation1_OBJECTS =  \
+	boundedh79extrapolation1.$(OBJEXT)
+boundedh79extrapolation1_OBJECTS =  \
+	$(am_boundedh79extrapolation1_OBJECTS)
+boundedh79extrapolation1_LDADD = $(LDADD)
+boundedh79extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundingbox1_OBJECTS = boundingbox1.$(OBJEXT)
+boundingbox1_OBJECTS = $(am_boundingbox1_OBJECTS)
+boundingbox1_LDADD = $(LDADD)
+boundingbox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundingbox2_OBJECTS = boundingbox2.$(OBJEXT)
+boundingbox2_OBJECTS = $(am_boundingbox2_OBJECTS)
+boundingbox2_LDADD = $(LDADD)
+boundingbox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundingbox3_OBJECTS = boundingbox3.$(OBJEXT)
+boundingbox3_OBJECTS = $(am_boundingbox3_OBJECTS)
+boundingbox3_LDADD = $(LDADD)
+boundingbox3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bug2_OBJECTS = bug2-bug2.$(OBJEXT)
+bug2_OBJECTS = $(am_bug2_OBJECTS)
+bug2_LDADD = $(LDADD)
+bug2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cnncconversion1_OBJECTS = cnncconversion1.$(OBJEXT)
+cnncconversion1_OBJECTS = $(am_cnncconversion1_OBJECTS)
+cnncconversion1_LDADD = $(LDADD)
+cnncconversion1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains2_OBJECTS = contains2.$(OBJEXT)
+contains2_OBJECTS = $(am_contains2_OBJECTS)
+contains2_LDADD = $(LDADD)
+contains2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint2_OBJECTS = disjoint2.$(OBJEXT)
+disjoint2_OBJECTS = $(am_disjoint2_OBJECTS)
+disjoint2_LDADD = $(LDADD)
+disjoint2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_dualhypercubes_OBJECTS = dualhypercubes.$(OBJEXT)
+dualhypercubes_OBJECTS = $(am_dualhypercubes_OBJECTS)
+dualhypercubes_LDADD = $(LDADD)
+dualhypercubes_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_equals1_OBJECTS = equals1.$(OBJEXT)
+equals1_OBJECTS = $(am_equals1_OBJECTS)
+equals1_LDADD = $(LDADD)
+equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_exceptions1_OBJECTS = exceptions1.$(OBJEXT)
+exceptions1_OBJECTS = $(am_exceptions1_OBJECTS)
+exceptions1_LDADD = $(LDADD)
+exceptions1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_exceptions2_OBJECTS = exceptions2.$(OBJEXT)
+exceptions2_OBJECTS = $(am_exceptions2_OBJECTS)
+exceptions2_LDADD = $(LDADD)
+exceptions2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_exceptions3_OBJECTS = exceptions3.$(OBJEXT)
+exceptions3_OBJECTS = $(am_exceptions3_OBJECTS)
+exceptions3_LDADD = $(LDADD)
+exceptions3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_expandspacedim2_OBJECTS = expandspacedim2.$(OBJEXT)
+expandspacedim2_OBJECTS = $(am_expandspacedim2_OBJECTS)
+expandspacedim2_LDADD = $(LDADD)
+expandspacedim2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_foldspacedims2_OBJECTS = foldspacedims2.$(OBJEXT)
+foldspacedims2_OBJECTS = $(am_foldspacedims2_OBJECTS)
+foldspacedims2_LDADD = $(LDADD)
+foldspacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS =  \
+	generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS =  \
+	$(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS =  \
+	generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS =  \
+	$(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS =  \
+	generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS =  \
+	$(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage2_OBJECTS =  \
+	generalizedaffinepreimage2.$(OBJEXT)
+generalizedaffinepreimage2_OBJECTS =  \
+	$(am_generalizedaffinepreimage2_OBJECTS)
+generalizedaffinepreimage2_LDADD = $(LDADD)
+generalizedaffinepreimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generators1_OBJECTS = generators1.$(OBJEXT)
+generators1_OBJECTS = $(am_generators1_OBJECTS)
+generators1_LDADD = $(LDADD)
+generators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_geomcovers1_OBJECTS = geomcovers1.$(OBJEXT)
+geomcovers1_OBJECTS = $(am_geomcovers1_OBJECTS)
+geomcovers1_LDADD = $(LDADD)
+geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_h79widening1_OBJECTS = h79widening1.$(OBJEXT)
+h79widening1_OBJECTS = $(am_h79widening1_OBJECTS)
+h79widening1_LDADD = $(LDADD)
+h79widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_h79widening2_OBJECTS = h79widening2.$(OBJEXT)
+h79widening2_OBJECTS = $(am_h79widening2_OBJECTS)
+h79widening2_LDADD = $(LDADD)
+h79widening2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedbhrz03extrapolation1_OBJECTS =  \
+	limitedbhrz03extrapolation1.$(OBJEXT)
+limitedbhrz03extrapolation1_OBJECTS =  \
+	$(am_limitedbhrz03extrapolation1_OBJECTS)
+limitedbhrz03extrapolation1_LDADD = $(LDADD)
+limitedbhrz03extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedh79extrapolation1_OBJECTS =  \
+	limitedh79extrapolation1.$(OBJEXT)
+limitedh79extrapolation1_OBJECTS =  \
+	$(am_limitedh79extrapolation1_OBJECTS)
+limitedh79extrapolation1_LDADD = $(LDADD)
+limitedh79extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_linearpartition1_OBJECTS = linearpartition1.$(OBJEXT)
+linearpartition1_OBJECTS = $(am_linearpartition1_OBJECTS)
+linearpartition1_LDADD = $(LDADD)
+linearpartition1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_linearsystem1_OBJECTS = linearsystem1.$(OBJEXT)
+linearsystem1_OBJECTS = $(am_linearsystem1_OBJECTS)
+linearsystem1_LDADD = $(LDADD)
+linearsystem1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_linexpression1_OBJECTS = linexpression1.$(OBJEXT)
+linexpression1_OBJECTS = $(am_linexpression1_OBJECTS)
+linexpression1_LDADD = $(LDADD)
+linexpression1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_lpproblem1_OBJECTS = lpproblem1.$(OBJEXT)
+lpproblem1_OBJECTS = $(am_lpproblem1_OBJECTS)
+lpproblem1_LDADD = $(LDADD)
+lpproblem1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_matrix1_OBJECTS = matrix1.$(OBJEXT)
+matrix1_OBJECTS = $(am_matrix1_OBJECTS)
+matrix1_LDADD = $(LDADD)
+matrix1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_max_min1_OBJECTS = max_min1.$(OBJEXT)
+max_min1_OBJECTS = $(am_max_min1_OBJECTS)
+max_min1_LDADD = $(LDADD)
+max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxspacedim1_OBJECTS = maxspacedim1.$(OBJEXT)
+maxspacedim1_OBJECTS = $(am_maxspacedim1_OBJECTS)
+maxspacedim1_LDADD = $(LDADD)
+maxspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mc91_OBJECTS = mc91.$(OBJEXT)
+mc91_OBJECTS = $(am_mc91_OBJECTS)
+mc91_LDADD = $(LDADD)
+mc91_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_membytes2_OBJECTS = membytes2.$(OBJEXT)
+membytes2_OBJECTS = $(am_membytes2_OBJECTS)
+membytes2_LDADD = $(LDADD)
+membytes2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_memory1_OBJECTS = memory1.$(OBJEXT)
+memory1_OBJECTS = $(am_memory1_OBJECTS)
+memory1_LDADD = $(LDADD)
+memory1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_memory2_OBJECTS = memory2.$(OBJEXT)
+memory2_OBJECTS = $(am_memory2_OBJECTS)
+memory2_LDADD = $(LDADD)
+memory2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
+minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS)
+minconstraints1_LDADD = $(LDADD)
+minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_minconstraints2_OBJECTS = minconstraints2.$(OBJEXT)
+minconstraints2_OBJECTS = $(am_minconstraints2_OBJECTS)
+minconstraints2_LDADD = $(LDADD)
+minconstraints2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mingenerators1_OBJECTS = mingenerators1.$(OBJEXT)
+mingenerators1_OBJECTS = $(am_mingenerators1_OBJECTS)
+mingenerators1_LDADD = $(LDADD)
+mingenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mingenerators2_OBJECTS = mingenerators2.$(OBJEXT)
+mingenerators2_OBJECTS = $(am_mingenerators2_OBJECTS)
+mingenerators2_LDADD = $(LDADD)
+mingenerators2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_addcongruence1_OBJECTS =  \
+	nnc_addcongruence1-addcongruence1.$(OBJEXT)
+nnc_addcongruence1_OBJECTS = $(am_nnc_addcongruence1_OBJECTS)
+nnc_addcongruence1_LDADD = $(LDADD)
+nnc_addcongruence1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_addcongruences1_OBJECTS =  \
+	nnc_addcongruences1-addcongruences1.$(OBJEXT)
+nnc_addcongruences1_OBJECTS = $(am_nnc_addcongruences1_OBJECTS)
+nnc_addcongruences1_LDADD = $(LDADD)
+nnc_addcongruences1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_addconstraint1_OBJECTS =  \
+	nnc_addconstraint1-addconstraint1.$(OBJEXT)
+nnc_addconstraint1_OBJECTS = $(am_nnc_addconstraint1_OBJECTS)
+nnc_addconstraint1_LDADD = $(LDADD)
+nnc_addconstraint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_addconstraints1_OBJECTS =  \
+	nnc_addconstraints1-addconstraints1.$(OBJEXT)
+nnc_addconstraints1_OBJECTS = $(am_nnc_addconstraints1_OBJECTS)
+nnc_addconstraints1_LDADD = $(LDADD)
+nnc_addconstraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_addgenerator1_OBJECTS =  \
+	nnc_addgenerator1-addgenerator1.$(OBJEXT)
+nnc_addgenerator1_OBJECTS = $(am_nnc_addgenerator1_OBJECTS)
+nnc_addgenerator1_LDADD = $(LDADD)
+nnc_addgenerator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_addgenerators1_OBJECTS =  \
+	nnc_addgenerators1-addgenerators1.$(OBJEXT)
+nnc_addgenerators1_OBJECTS = $(am_nnc_addgenerators1_OBJECTS)
+nnc_addgenerators1_LDADD = $(LDADD)
+nnc_addgenerators1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_addspacedims1_OBJECTS =  \
+	nnc_addspacedims1-addspacedims1.$(OBJEXT)
+nnc_addspacedims1_OBJECTS = $(am_nnc_addspacedims1_OBJECTS)
+nnc_addspacedims1_LDADD = $(LDADD)
+nnc_addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_affineimage1_OBJECTS = nnc_affineimage1-affineimage1.$(OBJEXT)
+nnc_affineimage1_OBJECTS = $(am_nnc_affineimage1_OBJECTS)
+nnc_affineimage1_LDADD = $(LDADD)
+nnc_affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_affinepreimage1_OBJECTS =  \
+	nnc_affinepreimage1-affinepreimage1.$(OBJEXT)
+nnc_affinepreimage1_OBJECTS = $(am_nnc_affinepreimage1_OBJECTS)
+nnc_affinepreimage1_LDADD = $(LDADD)
+nnc_affinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_affinetrans_OBJECTS = nnc_affinetrans-affinetrans.$(OBJEXT)
+nnc_affinetrans_OBJECTS = $(am_nnc_affinetrans_OBJECTS)
+nnc_affinetrans_LDADD = $(LDADD)
+nnc_affinetrans_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_append1_OBJECTS = nnc_append1-append1.$(OBJEXT)
+nnc_append1_OBJECTS = $(am_nnc_append1_OBJECTS)
+nnc_append1_LDADD = $(LDADD)
+nnc_append1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_append2_OBJECTS = nnc_append2-append2.$(OBJEXT)
+nnc_append2_OBJECTS = $(am_nnc_append2_OBJECTS)
+nnc_append2_LDADD = $(LDADD)
+nnc_append2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_ascii_dump_load1_OBJECTS =  \
+	nnc_ascii_dump_load1-ascii_dump_load1.$(OBJEXT)
+nnc_ascii_dump_load1_OBJECTS = $(am_nnc_ascii_dump_load1_OBJECTS)
+nnc_ascii_dump_load1_LDADD = $(LDADD)
+nnc_ascii_dump_load1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_ascii_dump_load2_OBJECTS =  \
+	nnc_ascii_dump_load2-ascii_dump_load2.$(OBJEXT)
+nnc_ascii_dump_load2_OBJECTS = $(am_nnc_ascii_dump_load2_OBJECTS)
+nnc_ascii_dump_load2_LDADD = $(LDADD)
+nnc_ascii_dump_load2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_bgp99extrapolation1_OBJECTS =  \
+	nnc_bgp99extrapolation1-bgp99extrapolation1.$(OBJEXT)
+nnc_bgp99extrapolation1_OBJECTS =  \
+	$(am_nnc_bgp99extrapolation1_OBJECTS)
+nnc_bgp99extrapolation1_LDADD = $(LDADD)
+nnc_bgp99extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_bhrz03widening1_OBJECTS =  \
+	nnc_bhrz03widening1-bhrz03widening1.$(OBJEXT)
+nnc_bhrz03widening1_OBJECTS = $(am_nnc_bhrz03widening1_OBJECTS)
+nnc_bhrz03widening1_LDADD = $(LDADD)
+nnc_bhrz03widening1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_bhrz03widening2_OBJECTS =  \
+	nnc_bhrz03widening2-bhrz03widening2.$(OBJEXT)
+nnc_bhrz03widening2_OBJECTS = $(am_nnc_bhrz03widening2_OBJECTS)
+nnc_bhrz03widening2_LDADD = $(LDADD)
+nnc_bhrz03widening2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_bounded1_OBJECTS = nnc_bounded1-bounded1.$(OBJEXT)
+nnc_bounded1_OBJECTS = $(am_nnc_bounded1_OBJECTS)
+nnc_bounded1_LDADD = $(LDADD)
+nnc_bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_boundedaffineimage1_OBJECTS =  \
+	nnc_boundedaffineimage1-boundedaffineimage1.$(OBJEXT)
+nnc_boundedaffineimage1_OBJECTS =  \
+	$(am_nnc_boundedaffineimage1_OBJECTS)
+nnc_boundedaffineimage1_LDADD = $(LDADD)
+nnc_boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_boundedaffinepreimage1_OBJECTS =  \
+	nnc_boundedaffinepreimage1-boundedaffinepreimage1.$(OBJEXT)
+nnc_boundedaffinepreimage1_OBJECTS =  \
+	$(am_nnc_boundedaffinepreimage1_OBJECTS)
+nnc_boundedaffinepreimage1_LDADD = $(LDADD)
+nnc_boundedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_boundedbhrz03extrapolation1_OBJECTS =  \
+	boundedbhrz03extrapolation1.$(OBJEXT)
+nnc_boundedbhrz03extrapolation1_OBJECTS =  \
+	$(am_nnc_boundedbhrz03extrapolation1_OBJECTS)
+nnc_boundedbhrz03extrapolation1_LDADD = $(LDADD)
+nnc_boundedbhrz03extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_boundedh79extrapolation1_OBJECTS = nnc_boundedh79extrapolation1-boundedh79extrapolation1.$(OBJEXT)
+nnc_boundedh79extrapolation1_OBJECTS =  \
+	$(am_nnc_boundedh79extrapolation1_OBJECTS)
+nnc_boundedh79extrapolation1_LDADD = $(LDADD)
+nnc_boundedh79extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_boundingbox1_OBJECTS = nnc_boundingbox1-boundingbox1.$(OBJEXT)
+nnc_boundingbox1_OBJECTS = $(am_nnc_boundingbox1_OBJECTS)
+nnc_boundingbox1_LDADD = $(LDADD)
+nnc_boundingbox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_boundingbox2_OBJECTS = nnc_boundingbox2-boundingbox2.$(OBJEXT)
+nnc_boundingbox2_OBJECTS = $(am_nnc_boundingbox2_OBJECTS)
+nnc_boundingbox2_LDADD = $(LDADD)
+nnc_boundingbox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_bounds1_OBJECTS = nnc_bounds1-bounds1.$(OBJEXT)
+nnc_bounds1_OBJECTS = $(am_nnc_bounds1_OBJECTS)
+nnc_bounds1_LDADD = $(LDADD)
+nnc_bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_concatenate1_OBJECTS = nnc_concatenate1-concatenate1.$(OBJEXT)
+nnc_concatenate1_OBJECTS = $(am_nnc_concatenate1_OBJECTS)
+nnc_concatenate1_LDADD = $(LDADD)
+nnc_concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_congruences1_OBJECTS = nnc_congruences1-congruences1.$(OBJEXT)
+nnc_congruences1_OBJECTS = $(am_nnc_congruences1_OBJECTS)
+nnc_congruences1_LDADD = $(LDADD)
+nnc_congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_constraints1_OBJECTS = nnc_constraints1-constraints1.$(OBJEXT)
+nnc_constraints1_OBJECTS = $(am_nnc_constraints1_OBJECTS)
+nnc_constraints1_LDADD = $(LDADD)
+nnc_constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_contains1_OBJECTS = nnc_contains1-contains1.$(OBJEXT)
+nnc_contains1_OBJECTS = $(am_nnc_contains1_OBJECTS)
+nnc_contains1_LDADD = $(LDADD)
+nnc_contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_disjoint1_OBJECTS = nnc_disjoint1-disjoint1.$(OBJEXT)
+nnc_disjoint1_OBJECTS = $(am_nnc_disjoint1_OBJECTS)
+nnc_disjoint1_LDADD = $(LDADD)
+nnc_disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_empty1_OBJECTS = nnc_empty1-empty1.$(OBJEXT)
+nnc_empty1_OBJECTS = $(am_nnc_empty1_OBJECTS)
+nnc_empty1_LDADD = $(LDADD)
+nnc_empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_equals1_OBJECTS = nnc_equals1-equals1.$(OBJEXT)
+nnc_equals1_OBJECTS = $(am_nnc_equals1_OBJECTS)
+nnc_equals1_LDADD = $(LDADD)
+nnc_equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_exceptions1_OBJECTS = nnc_exceptions1-exceptions1.$(OBJEXT)
+nnc_exceptions1_OBJECTS = $(am_nnc_exceptions1_OBJECTS)
+nnc_exceptions1_LDADD = $(LDADD)
+nnc_exceptions1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_exceptions3_OBJECTS = nnc_exceptions3-exceptions3.$(OBJEXT)
+nnc_exceptions3_OBJECTS = $(am_nnc_exceptions3_OBJECTS)
+nnc_exceptions3_LDADD = $(LDADD)
+nnc_exceptions3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_expandspacedim1_OBJECTS =  \
+	nnc_expandspacedim1-expandspacedim1.$(OBJEXT)
+nnc_expandspacedim1_OBJECTS = $(am_nnc_expandspacedim1_OBJECTS)
+nnc_expandspacedim1_LDADD = $(LDADD)
+nnc_expandspacedim1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_foldspacedims1_OBJECTS =  \
+	nnc_foldspacedims1-foldspacedims1.$(OBJEXT)
+nnc_foldspacedims1_OBJECTS = $(am_nnc_foldspacedims1_OBJECTS)
+nnc_foldspacedims1_LDADD = $(LDADD)
+nnc_foldspacedims1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_generalizedaffineimage1_OBJECTS =  \
+	nnc_generalizedaffineimage1-generalizedaffineimage1.$(OBJEXT)
+nnc_generalizedaffineimage1_OBJECTS =  \
+	$(am_nnc_generalizedaffineimage1_OBJECTS)
+nnc_generalizedaffineimage1_LDADD = $(LDADD)
+nnc_generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_generalizedaffinepreimage1_OBJECTS = nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.$(OBJEXT)
+nnc_generalizedaffinepreimage1_OBJECTS =  \
+	$(am_nnc_generalizedaffinepreimage1_OBJECTS)
+nnc_generalizedaffinepreimage1_LDADD = $(LDADD)
+nnc_generalizedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_generators1_OBJECTS = nnc_generators1-generators1.$(OBJEXT)
+nnc_generators1_OBJECTS = $(am_nnc_generators1_OBJECTS)
+nnc_generators1_LDADD = $(LDADD)
+nnc_generators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_geomcovers1_OBJECTS = nnc_geomcovers1-geomcovers1.$(OBJEXT)
+nnc_geomcovers1_OBJECTS = $(am_nnc_geomcovers1_OBJECTS)
+nnc_geomcovers1_LDADD = $(LDADD)
+nnc_geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_h79widening1_OBJECTS = nnc_h79widening1-h79widening1.$(OBJEXT)
+nnc_h79widening1_OBJECTS = $(am_nnc_h79widening1_OBJECTS)
+nnc_h79widening1_LDADD = $(LDADD)
+nnc_h79widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_intersection1_OBJECTS =  \
+	nnc_intersection1-intersection1.$(OBJEXT)
+nnc_intersection1_OBJECTS = $(am_nnc_intersection1_OBJECTS)
+nnc_intersection1_LDADD = $(LDADD)
+nnc_intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_limitedbhrz03extrapolation1_OBJECTS = nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.$(OBJEXT)
+nnc_limitedbhrz03extrapolation1_OBJECTS =  \
+	$(am_nnc_limitedbhrz03extrapolation1_OBJECTS)
+nnc_limitedbhrz03extrapolation1_LDADD = $(LDADD)
+nnc_limitedbhrz03extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_limitedh79extrapolation1_OBJECTS = nnc_limitedh79extrapolation1-limitedh79extrapolation1.$(OBJEXT)
+nnc_limitedh79extrapolation1_OBJECTS =  \
+	$(am_nnc_limitedh79extrapolation1_OBJECTS)
+nnc_limitedh79extrapolation1_LDADD = $(LDADD)
+nnc_limitedh79extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_linearpartition1_OBJECTS =  \
+	nnc_linearpartition1-linearpartition1.$(OBJEXT)
+nnc_linearpartition1_OBJECTS = $(am_nnc_linearpartition1_OBJECTS)
+nnc_linearpartition1_LDADD = $(LDADD)
+nnc_linearpartition1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_mapspacedims1_OBJECTS =  \
+	nnc_mapspacedims1-mapspacedims1.$(OBJEXT)
+nnc_mapspacedims1_OBJECTS = $(am_nnc_mapspacedims1_OBJECTS)
+nnc_mapspacedims1_LDADD = $(LDADD)
+nnc_mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_max_min1_OBJECTS = nnc_max_min1-max_min1.$(OBJEXT)
+nnc_max_min1_OBJECTS = $(am_nnc_max_min1_OBJECTS)
+nnc_max_min1_LDADD = $(LDADD)
+nnc_max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_mc91_OBJECTS = nnc_mc91-mc91.$(OBJEXT)
+nnc_mc91_OBJECTS = $(am_nnc_mc91_OBJECTS)
+nnc_mc91_LDADD = $(LDADD)
+nnc_mc91_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_membytes1_OBJECTS = nnc_membytes1-membytes1.$(OBJEXT)
+nnc_membytes1_OBJECTS = $(am_nnc_membytes1_OBJECTS)
+nnc_membytes1_LDADD = $(LDADD)
+nnc_membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_membytes2_OBJECTS = nnc_membytes2-membytes2.$(OBJEXT)
+nnc_membytes2_OBJECTS = $(am_nnc_membytes2_OBJECTS)
+nnc_membytes2_LDADD = $(LDADD)
+nnc_membytes2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_minconstraints1_OBJECTS =  \
+	nnc_minconstraints1-minconstraints1.$(OBJEXT)
+nnc_minconstraints1_OBJECTS = $(am_nnc_minconstraints1_OBJECTS)
+nnc_minconstraints1_LDADD = $(LDADD)
+nnc_minconstraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_mingenerators1_OBJECTS =  \
+	nnc_mingenerators1-mingenerators1.$(OBJEXT)
+nnc_mingenerators1_OBJECTS = $(am_nnc_mingenerators1_OBJECTS)
+nnc_mingenerators1_LDADD = $(LDADD)
+nnc_mingenerators1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_onepoint_OBJECTS = nnc_onepoint-onepoint.$(OBJEXT)
+nnc_onepoint_OBJECTS = $(am_nnc_onepoint_OBJECTS)
+nnc_onepoint_LDADD = $(LDADD)
+nnc_onepoint_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_permute_OBJECTS = nnc_permute-permute.$(OBJEXT)
+nnc_permute_OBJECTS = $(am_nnc_permute_OBJECTS)
+nnc_permute_LDADD = $(LDADD)
+nnc_permute_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_polydifference1_OBJECTS =  \
+	nnc_polydifference1-polydifference1.$(OBJEXT)
+nnc_polydifference1_OBJECTS = $(am_nnc_polydifference1_OBJECTS)
+nnc_polydifference1_LDADD = $(LDADD)
+nnc_polydifference1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_polyhull1_OBJECTS = nnc_polyhull1-polyhull1.$(OBJEXT)
+nnc_polyhull1_OBJECTS = $(am_nnc_polyhull1_OBJECTS)
+nnc_polyhull1_LDADD = $(LDADD)
+nnc_polyhull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_randphull1_OBJECTS = nnc_randphull1-randphull1.$(OBJEXT)
+nnc_randphull1_OBJECTS = $(am_nnc_randphull1_OBJECTS)
+nnc_randphull1_LDADD = $(LDADD)
+nnc_randphull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_randphull2_OBJECTS = nnc_randphull2-randphull2.$(OBJEXT)
+nnc_randphull2_OBJECTS = $(am_nnc_randphull2_OBJECTS)
+am__DEPENDENCIES_1 = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_randphull2_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_nnc_relations1_OBJECTS = nnc_relations1-relations1.$(OBJEXT)
+nnc_relations1_OBJECTS = $(am_nnc_relations1_OBJECTS)
+nnc_relations1_LDADD = $(LDADD)
+nnc_relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_relations2_OBJECTS = nnc_relations2-relations2.$(OBJEXT)
+nnc_relations2_OBJECTS = $(am_nnc_relations2_OBJECTS)
+nnc_relations2_LDADD = $(LDADD)
+nnc_relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_removespacedims1_OBJECTS =  \
+	nnc_removespacedims1-removespacedims1.$(OBJEXT)
+nnc_removespacedims1_OBJECTS = $(am_nnc_removespacedims1_OBJECTS)
+nnc_removespacedims1_LDADD = $(LDADD)
+nnc_removespacedims1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_smm1_OBJECTS = nnc_smm1-smm1.$(OBJEXT)
+nnc_smm1_OBJECTS = $(am_nnc_smm1_OBJECTS)
+nnc_smm1_LDADD = $(LDADD)
+nnc_smm1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_timeelapse1_OBJECTS = nnc_timeelapse1-timeelapse1.$(OBJEXT)
+nnc_timeelapse1_OBJECTS = $(am_nnc_timeelapse1_OBJECTS)
+nnc_timeelapse1_LDADD = $(LDADD)
+nnc_timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_universe1_OBJECTS = nnc_universe1-universe1.$(OBJEXT)
+nnc_universe1_OBJECTS = $(am_nnc_universe1_OBJECTS)
+nnc_universe1_LDADD = $(LDADD)
+nnc_universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_writepolyhedron1_OBJECTS =  \
+	nnc_writepolyhedron1-writepolyhedron1.$(OBJEXT)
+nnc_writepolyhedron1_OBJECTS = $(am_nnc_writepolyhedron1_OBJECTS)
+nnc_writepolyhedron1_LDADD = $(LDADD)
+nnc_writepolyhedron1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nncminimize1_OBJECTS = nncminimize1.$(OBJEXT)
+nncminimize1_OBJECTS = $(am_nncminimize1_OBJECTS)
+nncminimize1_LDADD = $(LDADD)
+nncminimize1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nncminimize2_OBJECTS = nncminimize2.$(OBJEXT)
+nncminimize2_OBJECTS = $(am_nncminimize2_OBJECTS)
+nncminimize2_LDADD = $(LDADD)
+nncminimize2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_numberinput1_OBJECTS = numberinput1.$(OBJEXT)
+numberinput1_OBJECTS = $(am_numberinput1_OBJECTS)
+numberinput1_LDADD = $(LDADD)
+numberinput1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_onepoint_OBJECTS = onepoint.$(OBJEXT)
+onepoint_OBJECTS = $(am_onepoint_OBJECTS)
+onepoint_LDADD = $(LDADD)
+onepoint_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_permute_OBJECTS = permute.$(OBJEXT)
+permute_OBJECTS = $(am_permute_OBJECTS)
+permute_LDADD = $(LDADD)
+permute_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polydifference1_OBJECTS = polydifference1.$(OBJEXT)
+polydifference1_OBJECTS = $(am_polydifference1_OBJECTS)
+polydifference1_LDADD = $(LDADD)
+polydifference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polydifference2_OBJECTS = polydifference2.$(OBJEXT)
+polydifference2_OBJECTS = $(am_polydifference2_OBJECTS)
+polydifference2_LDADD = $(LDADD)
+polydifference2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polyhull1_OBJECTS = polyhull1.$(OBJEXT)
+polyhull1_OBJECTS = $(am_polyhull1_OBJECTS)
+polyhull1_LDADD = $(LDADD)
+polyhull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polyhull2_OBJECTS = polyhull2.$(OBJEXT)
+polyhull2_OBJECTS = $(am_polyhull2_OBJECTS)
+polyhull2_LDADD = $(LDADD)
+polyhull2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polypowerset1_OBJECTS = polypowerset1.$(OBJEXT)
+polypowerset1_OBJECTS = $(am_polypowerset1_OBJECTS)
+polypowerset1_LDADD = $(LDADD)
+polypowerset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_powerset1_OBJECTS = powerset1.$(OBJEXT)
+powerset1_OBJECTS = $(am_powerset1_OBJECTS)
+powerset1_LDADD = $(LDADD)
+powerset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_randphull1_OBJECTS = randphull1.$(OBJEXT)
+randphull1_OBJECTS = $(am_randphull1_OBJECTS)
+randphull1_LDADD = $(LDADD)
+randphull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_randphull2_OBJECTS = randphull2.$(OBJEXT)
+randphull2_OBJECTS = $(am_randphull2_OBJECTS)
+randphull2_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations2_OBJECTS = relations2.$(OBJEXT)
+relations2_OBJECTS = $(am_relations2_OBJECTS)
+relations2_LDADD = $(LDADD)
+relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations3_OBJECTS = relations3.$(OBJEXT)
+relations3_OBJECTS = $(am_relations3_OBJECTS)
+relations3_LDADD = $(LDADD)
+relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims2_OBJECTS = removespacedims2.$(OBJEXT)
+removespacedims2_OBJECTS = $(am_removespacedims2_OBJECTS)
+removespacedims2_LDADD = $(LDADD)
+removespacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_smm1_OBJECTS = smm1.$(OBJEXT)
+smm1_OBJECTS = $(am_smm1_OBJECTS)
+smm1_LDADD = $(LDADD)
+smm1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse2_OBJECTS = timeelapse2.$(OBJEXT)
+timeelapse2_OBJECTS = $(am_timeelapse2_OBJECTS)
+timeelapse2_LDADD = $(LDADD)
+timeelapse2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_topclosed1_OBJECTS = topclosed1.$(OBJEXT)
+topclosed1_OBJECTS = $(am_topclosed1_OBJECTS)
+topclosed1_LDADD = $(LDADD)
+topclosed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_topclosure1_OBJECTS = topclosure1.$(OBJEXT)
+topclosure1_OBJECTS = $(am_topclosure1_OBJECTS)
+topclosure1_LDADD = $(LDADD)
+topclosure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_universe2_OBJECTS = universe2.$(OBJEXT)
+universe2_OBJECTS = $(am_universe2_OBJECTS)
+universe2_LDADD = $(LDADD)
+universe2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am__watchdog1_SOURCES_DIST = watchdog1.cc
+am__objects_1 = watchdog1.$(OBJEXT)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@am_watchdog1_OBJECTS = $(am__objects_1)
+watchdog1_OBJECTS = $(am_watchdog1_OBJECTS)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_DEPENDENCIES =  \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	$(am__DEPENDENCIES_1) \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@	$(top_builddir)/Watchdog/src/libpwl.la
+am_writeconsys1_OBJECTS = writeconsys1.$(OBJEXT)
+writeconsys1_OBJECTS = $(am_writeconsys1_OBJECTS)
+writeconsys1_LDADD = $(LDADD)
+writeconsys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writegensys1_OBJECTS = writegensys1.$(OBJEXT)
+writegensys1_OBJECTS = $(am_writegensys1_OBJECTS)
+writegensys1_LDADD = $(LDADD)
+writegensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writepolyhedron1_OBJECTS = writepolyhedron1.$(OBJEXT)
+writepolyhedron1_OBJECTS = $(am_writepolyhedron1_OBJECTS)
+writepolyhedron1_LDADD = $(LDADD)
+writepolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writepolyhedron2_OBJECTS = writepolyhedron2.$(OBJEXT)
+writepolyhedron2_OBJECTS = $(am_writepolyhedron2_OBJECTS)
+writepolyhedron2_LDADD = $(LDADD)
+writepolyhedron2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writerelation1_OBJECTS = writerelation1.$(OBJEXT)
+writerelation1_OBJECTS = $(am_writerelation1_OBJECTS)
+writerelation1_LDADD = $(LDADD)
+writerelation1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writevariable1_OBJECTS = writevariable1.$(OBJEXT)
+writevariable1_OBJECTS = $(am_writevariable1_OBJECTS)
+writevariable1_LDADD = $(LDADD)
+writevariable1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
+	$(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
+	$(addconstraints2_SOURCES) $(addgenerator1_SOURCES) \
+	$(addgenerator2_SOURCES) $(addgenerators1_SOURCES) \
+	$(addgenerators2_SOURCES) $(addspacedims1_SOURCES) \
+	$(addspacedims2_SOURCES) $(affineimage1_SOURCES) \
+	$(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+	$(affinetrans_SOURCES) $(append1_SOURCES) $(append2_SOURCES) \
+	$(ascii_dump_load1_SOURCES) $(ascii_dump_load2_SOURCES) \
+	$(ascii_dump_load3_SOURCES) $(bgp99extrapolation1_SOURCES) \
+	$(bhrz03widening1_SOURCES) $(bhrz03widening2_SOURCES) \
+	$(bhrz03widening3_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) \
+	$(boundedbhrz03extrapolation1_SOURCES) \
+	$(boundedh79extrapolation1_SOURCES) $(boundingbox1_SOURCES) \
+	$(boundingbox2_SOURCES) $(boundingbox3_SOURCES) \
+	$(bounds1_SOURCES) $(bug2_SOURCES) $(cnncconversion1_SOURCES) \
+	$(concatenate1_SOURCES) $(congruences1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(contains2_SOURCES) $(disjoint1_SOURCES) $(disjoint2_SOURCES) \
+	$(dualhypercubes_SOURCES) $(empty1_SOURCES) $(equals1_SOURCES) \
+	$(exceptions1_SOURCES) $(exceptions2_SOURCES) \
+	$(exceptions3_SOURCES) $(expandspacedim1_SOURCES) \
+	$(expandspacedim2_SOURCES) $(foldspacedims1_SOURCES) \
+	$(foldspacedims2_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) $(generators1_SOURCES) \
+	$(geomcovers1_SOURCES) $(h79widening1_SOURCES) \
+	$(h79widening2_SOURCES) $(intersection1_SOURCES) \
+	$(limitedbhrz03extrapolation1_SOURCES) \
+	$(limitedh79extrapolation1_SOURCES) \
+	$(linearpartition1_SOURCES) $(linearsystem1_SOURCES) \
+	$(linexpression1_SOURCES) $(lpproblem1_SOURCES) \
+	$(mapspacedims1_SOURCES) $(matrix1_SOURCES) \
+	$(max_min1_SOURCES) $(maxspacedim1_SOURCES) $(mc91_SOURCES) \
+	$(membytes1_SOURCES) $(membytes2_SOURCES) $(memory1_SOURCES) \
+	$(memory2_SOURCES) $(minconstraints1_SOURCES) \
+	$(minconstraints2_SOURCES) $(mingenerators1_SOURCES) \
+	$(mingenerators2_SOURCES) $(nnc_addcongruence1_SOURCES) \
+	$(nnc_addcongruences1_SOURCES) $(nnc_addconstraint1_SOURCES) \
+	$(nnc_addconstraints1_SOURCES) $(nnc_addgenerator1_SOURCES) \
+	$(nnc_addgenerators1_SOURCES) $(nnc_addspacedims1_SOURCES) \
+	$(nnc_affineimage1_SOURCES) $(nnc_affinepreimage1_SOURCES) \
+	$(nnc_affinetrans_SOURCES) $(nnc_append1_SOURCES) \
+	$(nnc_append2_SOURCES) $(nnc_ascii_dump_load1_SOURCES) \
+	$(nnc_ascii_dump_load2_SOURCES) \
+	$(nnc_bgp99extrapolation1_SOURCES) \
+	$(nnc_bhrz03widening1_SOURCES) $(nnc_bhrz03widening2_SOURCES) \
+	$(nnc_bounded1_SOURCES) $(nnc_boundedaffineimage1_SOURCES) \
+	$(nnc_boundedaffinepreimage1_SOURCES) \
+	$(nnc_boundedbhrz03extrapolation1_SOURCES) \
+	$(nnc_boundedh79extrapolation1_SOURCES) \
+	$(nnc_boundingbox1_SOURCES) $(nnc_boundingbox2_SOURCES) \
+	$(nnc_bounds1_SOURCES) $(nnc_concatenate1_SOURCES) \
+	$(nnc_congruences1_SOURCES) $(nnc_constraints1_SOURCES) \
+	$(nnc_contains1_SOURCES) $(nnc_disjoint1_SOURCES) \
+	$(nnc_empty1_SOURCES) $(nnc_equals1_SOURCES) \
+	$(nnc_exceptions1_SOURCES) $(nnc_exceptions3_SOURCES) \
+	$(nnc_expandspacedim1_SOURCES) $(nnc_foldspacedims1_SOURCES) \
+	$(nnc_generalizedaffineimage1_SOURCES) \
+	$(nnc_generalizedaffinepreimage1_SOURCES) \
+	$(nnc_generators1_SOURCES) $(nnc_geomcovers1_SOURCES) \
+	$(nnc_h79widening1_SOURCES) $(nnc_intersection1_SOURCES) \
+	$(nnc_limitedbhrz03extrapolation1_SOURCES) \
+	$(nnc_limitedh79extrapolation1_SOURCES) \
+	$(nnc_linearpartition1_SOURCES) $(nnc_mapspacedims1_SOURCES) \
+	$(nnc_max_min1_SOURCES) $(nnc_mc91_SOURCES) \
+	$(nnc_membytes1_SOURCES) $(nnc_membytes2_SOURCES) \
+	$(nnc_minconstraints1_SOURCES) $(nnc_mingenerators1_SOURCES) \
+	$(nnc_onepoint_SOURCES) $(nnc_permute_SOURCES) \
+	$(nnc_polydifference1_SOURCES) $(nnc_polyhull1_SOURCES) \
+	$(nnc_randphull1_SOURCES) $(nnc_randphull2_SOURCES) \
+	$(nnc_relations1_SOURCES) $(nnc_relations2_SOURCES) \
+	$(nnc_removespacedims1_SOURCES) $(nnc_smm1_SOURCES) \
+	$(nnc_timeelapse1_SOURCES) $(nnc_universe1_SOURCES) \
+	$(nnc_writepolyhedron1_SOURCES) $(nncminimize1_SOURCES) \
+	$(nncminimize2_SOURCES) $(numberinput1_SOURCES) \
+	$(onepoint_SOURCES) $(permute_SOURCES) \
+	$(polydifference1_SOURCES) $(polydifference2_SOURCES) \
+	$(polyhull1_SOURCES) $(polyhull2_SOURCES) \
+	$(polypowerset1_SOURCES) $(powerset1_SOURCES) \
+	$(randphull1_SOURCES) $(randphull2_SOURCES) \
+	$(relations1_SOURCES) $(relations2_SOURCES) \
+	$(relations3_SOURCES) $(removespacedims1_SOURCES) \
+	$(removespacedims2_SOURCES) $(smm1_SOURCES) \
+	$(timeelapse1_SOURCES) $(timeelapse2_SOURCES) \
+	$(topclosed1_SOURCES) $(topclosure1_SOURCES) \
+	$(universe1_SOURCES) $(universe2_SOURCES) $(watchdog1_SOURCES) \
+	$(writeconsys1_SOURCES) $(writegensys1_SOURCES) \
+	$(writepolyhedron1_SOURCES) $(writepolyhedron2_SOURCES) \
+	$(writerelation1_SOURCES) $(writevariable1_SOURCES)
+DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
+	$(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
+	$(addconstraints2_SOURCES) $(addgenerator1_SOURCES) \
+	$(addgenerator2_SOURCES) $(addgenerators1_SOURCES) \
+	$(addgenerators2_SOURCES) $(addspacedims1_SOURCES) \
+	$(addspacedims2_SOURCES) $(affineimage1_SOURCES) \
+	$(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+	$(affinetrans_SOURCES) $(append1_SOURCES) $(append2_SOURCES) \
+	$(ascii_dump_load1_SOURCES) $(ascii_dump_load2_SOURCES) \
+	$(ascii_dump_load3_SOURCES) $(bgp99extrapolation1_SOURCES) \
+	$(bhrz03widening1_SOURCES) $(bhrz03widening2_SOURCES) \
+	$(bhrz03widening3_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) \
+	$(boundedbhrz03extrapolation1_SOURCES) \
+	$(boundedh79extrapolation1_SOURCES) $(boundingbox1_SOURCES) \
+	$(boundingbox2_SOURCES) $(boundingbox3_SOURCES) \
+	$(bounds1_SOURCES) $(bug2_SOURCES) $(cnncconversion1_SOURCES) \
+	$(concatenate1_SOURCES) $(congruences1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(contains2_SOURCES) $(disjoint1_SOURCES) $(disjoint2_SOURCES) \
+	$(dualhypercubes_SOURCES) $(empty1_SOURCES) $(equals1_SOURCES) \
+	$(exceptions1_SOURCES) $(exceptions2_SOURCES) \
+	$(exceptions3_SOURCES) $(expandspacedim1_SOURCES) \
+	$(expandspacedim2_SOURCES) $(foldspacedims1_SOURCES) \
+	$(foldspacedims2_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) $(generators1_SOURCES) \
+	$(geomcovers1_SOURCES) $(h79widening1_SOURCES) \
+	$(h79widening2_SOURCES) $(intersection1_SOURCES) \
+	$(limitedbhrz03extrapolation1_SOURCES) \
+	$(limitedh79extrapolation1_SOURCES) \
+	$(linearpartition1_SOURCES) $(linearsystem1_SOURCES) \
+	$(linexpression1_SOURCES) $(lpproblem1_SOURCES) \
+	$(mapspacedims1_SOURCES) $(matrix1_SOURCES) \
+	$(max_min1_SOURCES) $(maxspacedim1_SOURCES) $(mc91_SOURCES) \
+	$(membytes1_SOURCES) $(membytes2_SOURCES) $(memory1_SOURCES) \
+	$(memory2_SOURCES) $(minconstraints1_SOURCES) \
+	$(minconstraints2_SOURCES) $(mingenerators1_SOURCES) \
+	$(mingenerators2_SOURCES) $(nnc_addcongruence1_SOURCES) \
+	$(nnc_addcongruences1_SOURCES) $(nnc_addconstraint1_SOURCES) \
+	$(nnc_addconstraints1_SOURCES) $(nnc_addgenerator1_SOURCES) \
+	$(nnc_addgenerators1_SOURCES) $(nnc_addspacedims1_SOURCES) \
+	$(nnc_affineimage1_SOURCES) $(nnc_affinepreimage1_SOURCES) \
+	$(nnc_affinetrans_SOURCES) $(nnc_append1_SOURCES) \
+	$(nnc_append2_SOURCES) $(nnc_ascii_dump_load1_SOURCES) \
+	$(nnc_ascii_dump_load2_SOURCES) \
+	$(nnc_bgp99extrapolation1_SOURCES) \
+	$(nnc_bhrz03widening1_SOURCES) $(nnc_bhrz03widening2_SOURCES) \
+	$(nnc_bounded1_SOURCES) $(nnc_boundedaffineimage1_SOURCES) \
+	$(nnc_boundedaffinepreimage1_SOURCES) \
+	$(nnc_boundedbhrz03extrapolation1_SOURCES) \
+	$(nnc_boundedh79extrapolation1_SOURCES) \
+	$(nnc_boundingbox1_SOURCES) $(nnc_boundingbox2_SOURCES) \
+	$(nnc_bounds1_SOURCES) $(nnc_concatenate1_SOURCES) \
+	$(nnc_congruences1_SOURCES) $(nnc_constraints1_SOURCES) \
+	$(nnc_contains1_SOURCES) $(nnc_disjoint1_SOURCES) \
+	$(nnc_empty1_SOURCES) $(nnc_equals1_SOURCES) \
+	$(nnc_exceptions1_SOURCES) $(nnc_exceptions3_SOURCES) \
+	$(nnc_expandspacedim1_SOURCES) $(nnc_foldspacedims1_SOURCES) \
+	$(nnc_generalizedaffineimage1_SOURCES) \
+	$(nnc_generalizedaffinepreimage1_SOURCES) \
+	$(nnc_generators1_SOURCES) $(nnc_geomcovers1_SOURCES) \
+	$(nnc_h79widening1_SOURCES) $(nnc_intersection1_SOURCES) \
+	$(nnc_limitedbhrz03extrapolation1_SOURCES) \
+	$(nnc_limitedh79extrapolation1_SOURCES) \
+	$(nnc_linearpartition1_SOURCES) $(nnc_mapspacedims1_SOURCES) \
+	$(nnc_max_min1_SOURCES) $(nnc_mc91_SOURCES) \
+	$(nnc_membytes1_SOURCES) $(nnc_membytes2_SOURCES) \
+	$(nnc_minconstraints1_SOURCES) $(nnc_mingenerators1_SOURCES) \
+	$(nnc_onepoint_SOURCES) $(nnc_permute_SOURCES) \
+	$(nnc_polydifference1_SOURCES) $(nnc_polyhull1_SOURCES) \
+	$(nnc_randphull1_SOURCES) $(nnc_randphull2_SOURCES) \
+	$(nnc_relations1_SOURCES) $(nnc_relations2_SOURCES) \
+	$(nnc_removespacedims1_SOURCES) $(nnc_smm1_SOURCES) \
+	$(nnc_timeelapse1_SOURCES) $(nnc_universe1_SOURCES) \
+	$(nnc_writepolyhedron1_SOURCES) $(nncminimize1_SOURCES) \
+	$(nncminimize2_SOURCES) $(numberinput1_SOURCES) \
+	$(onepoint_SOURCES) $(permute_SOURCES) \
+	$(polydifference1_SOURCES) $(polydifference2_SOURCES) \
+	$(polyhull1_SOURCES) $(polyhull2_SOURCES) \
+	$(polypowerset1_SOURCES) $(powerset1_SOURCES) \
+	$(randphull1_SOURCES) $(randphull2_SOURCES) \
+	$(relations1_SOURCES) $(relations2_SOURCES) \
+	$(relations3_SOURCES) $(removespacedims1_SOURCES) \
+	$(removespacedims2_SOURCES) $(smm1_SOURCES) \
+	$(timeelapse1_SOURCES) $(timeelapse2_SOURCES) \
+	$(topclosed1_SOURCES) $(topclosure1_SOURCES) \
+	$(universe1_SOURCES) $(universe2_SOURCES) \
+	$(am__watchdog1_SOURCES_DIST) $(writeconsys1_SOURCES) \
+	$(writegensys1_SOURCES) $(writepolyhedron1_SOURCES) \
+	$(writepolyhedron2_SOURCES) $(writerelation1_SOURCES) \
+	$(writevariable1_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+CHECKER = 
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog \
+-I$(top_builddir)/Watchdog/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+	addcongruence1 \
+	addcongruences1 \
+	addconstraint1 \
+	addconstraints1 addconstraints2 \
+	addgenerator1 addgenerator2 \
+	addgenerators1 addgenerators2 \
+	addspacedims1 addspacedims2 \
+	affineimage1 affineimage2 \
+	affinepreimage1 \
+	affinetrans \
+	append1 append2 \
+	ascii_dump_load1 ascii_dump_load2 ascii_dump_load3 \
+	bgp99extrapolation1 \
+	bhrz03widening1 bhrz03widening2 bhrz03widening3 \
+	bhz03widening1 \
+	bounded1 \
+	boundedaffineimage1 \
+	boundedaffinepreimage1 \
+	boundedbhrz03extrapolation1 \
+	boundedh79extrapolation1 \
+	boundingbox1 boundingbox2 boundingbox3 \
+	bounds1 \
+	cnncconversion1 \
+	concatenate1 \
+	congruences1 \
+	constraints1 \
+	contains1 contains2 \
+	disjoint1 disjoint2 \
+	dualhypercubes \
+	empty1 \
+	equals1 \
+	exceptions1 exceptions2  exceptions3 \
+	expandspacedim1 expandspacedim2 \
+	foldspacedims1 foldspacedims2 \
+	generalizedaffineimage1 generalizedaffineimage2 \
+	generalizedaffinepreimage1 generalizedaffinepreimage2 \
+	generators1 \
+	geomcovers1 \
+	h79widening1 h79widening2 \
+	intersection1 \
+	limitedbhrz03extrapolation1 \
+	limitedh79extrapolation1 \
+	linearpartition1 \
+	linexpression1 \
+	linearsystem1 \
+	lpproblem1 \
+	mapspacedims1 \
+	matrix1 \
+	max_min1 \
+	maxspacedim1 \
+	mc91 \
+	membytes1 membytes2 \
+	memory1 memory2 \
+	minconstraints1 minconstraints2 \
+	mingenerators1 mingenerators2 \
+	nncminimize1 nncminimize2 \
+	numberinput1 \
+	onepoint \
+	permute \
+	polydifference1 polydifference2 \
+	polyhull1 polyhull2 \
+	polypowerset1 \
+	powerset1 \
+	randphull1 randphull2 \
+	relations1 relations2 relations3 \
+	removespacedims1 removespacedims2 \
+	smm1 \
+	timeelapse1 timeelapse2 \
+	topclosed1 \
+	topclosure1 \
+	universe1 universe2 \
+	writeconsys1 \
+	writegensys1 \
+	writepolyhedron1 writepolyhedron2 \
+	writerelation1 \
+	writevariable1
+
+DERIVED_TESTS = \
+	nnc_addcongruence1 \
+	nnc_addcongruences1 \
+	nnc_addconstraint1 \
+	nnc_addconstraints1 \
+	nnc_addgenerator1 \
+	nnc_addgenerators1 \
+	nnc_addspacedims1 \
+	nnc_affineimage1 \
+	nnc_affinepreimage1 \
+	nnc_affinetrans \
+	nnc_append1 nnc_append2 \
+	nnc_ascii_dump_load1 nnc_ascii_dump_load2 \
+	nnc_bgp99extrapolation1 \
+	nnc_bhrz03widening1 nnc_bhrz03widening2 \
+	nnc_bounded1 \
+	nnc_boundedaffineimage1 \
+	nnc_boundedaffinepreimage1 \
+	nnc_boundedbhrz03extrapolation1 \
+	nnc_boundedh79extrapolation1 \
+	nnc_boundingbox1 nnc_boundingbox2 \
+	nnc_bounds1 \
+	nnc_concatenate1 \
+	nnc_congruences1 \
+	nnc_constraints1 \
+	nnc_contains1 \
+	nnc_disjoint1 \
+	nnc_empty1 \
+	nnc_equals1 \
+	nnc_exceptions1 nnc_exceptions3 \
+	nnc_expandspacedim1 \
+	nnc_foldspacedims1 \
+	nnc_generalizedaffineimage1 \
+	nnc_generalizedaffinepreimage1 \
+	nnc_generators1 \
+	nnc_geomcovers1 \
+	nnc_h79widening1 \
+	nnc_intersection1 \
+	nnc_limitedbhrz03extrapolation1 \
+	nnc_limitedh79extrapolation1 \
+	nnc_linearpartition1 \
+	nnc_mapspacedims1 \
+	nnc_max_min1 \
+	nnc_mc91 \
+	nnc_membytes1 nnc_membytes2 \
+	nnc_minconstraints1 \
+	nnc_mingenerators1 \
+	nnc_onepoint \
+	nnc_permute \
+	nnc_polydifference1 \
+	nnc_polyhull1 \
+	nnc_randphull1 nnc_randphull2 \
+	nnc_relations1 nnc_relations2 \
+	nnc_removespacedims1 \
+	nnc_smm1 \
+	nnc_timeelapse1 \
+	nnc_universe1 \
+	nnc_writepolyhedron1
+
+
+#
+# Sources for the tests
+#
+addcongruence1_SOURCES = addcongruence1.cc
+addcongruences1_SOURCES = addcongruences1.cc
+addconstraint1_SOURCES = addconstraint1.cc
+addconstraints1_SOURCES = addconstraints1.cc
+addconstraints2_SOURCES = addconstraints2.cc
+addgenerator1_SOURCES = addgenerator1.cc
+addgenerator2_SOURCES = addgenerator2.cc
+addgenerators1_SOURCES = addgenerators1.cc
+addgenerators2_SOURCES = addgenerators2.cc
+addspacedims1_SOURCES = addspacedims1.cc
+addspacedims2_SOURCES = addspacedims2.cc
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinetrans_SOURCES = affinetrans.cc
+append1_SOURCES = append1.cc
+append2_SOURCES = append2.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+ascii_dump_load2_SOURCES = ascii_dump_load2.cc
+ascii_dump_load3_SOURCES = ascii_dump_load3.cc
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+bhrz03widening1_SOURCES = bhrz03widening1.cc
+bhrz03widening2_SOURCES = bhrz03widening2.cc
+bhrz03widening3_SOURCES = bhrz03widening3.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
+boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
+boundingbox1_SOURCES = boundingbox1.cc
+boundingbox2_SOURCES = boundingbox2.cc
+boundingbox3_SOURCES = boundingbox3.cc
+bounds1_SOURCES = bounds1.cc
+cnncconversion1_SOURCES = cnncconversion1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+contains2_SOURCES = contains2.cc
+disjoint1_SOURCES = disjoint1.cc
+disjoint2_SOURCES = disjoint2.cc
+dualhypercubes_SOURCES = dualhypercubes.cc
+empty1_SOURCES = empty1.cc
+equals1_SOURCES = equals1.cc
+exceptions1_SOURCES = exceptions1.cc
+exceptions2_SOURCES = exceptions2.cc
+exceptions3_SOURCES = exceptions3.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+expandspacedim2_SOURCES = expandspacedim2.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+foldspacedims2_SOURCES = foldspacedims2.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generators1_SOURCES = generators1.cc
+geomcovers1_SOURCES = geomcovers1.cc
+h79widening1_SOURCES = h79widening1.cc
+h79widening2_SOURCES = h79widening2.cc
+intersection1_SOURCES = intersection1.cc
+limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+linearpartition1_SOURCES = linearpartition1.cc
+linexpression1_SOURCES = linexpression1.cc
+linearsystem1_SOURCES = linearsystem1.cc
+lpproblem1_SOURCES = lpproblem1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+matrix1_SOURCES = matrix1.cc
+max_min1_SOURCES = max_min1.cc
+maxspacedim1_SOURCES = maxspacedim1.cc
+mc91_SOURCES = mc91.cc
+membytes1_SOURCES = membytes1.cc
+membytes2_SOURCES = membytes2.cc
+memory1_SOURCES = memory1.cc
+memory2_SOURCES = memory2.cc
+minconstraints1_SOURCES = minconstraints1.cc
+minconstraints2_SOURCES = minconstraints2.cc
+mingenerators1_SOURCES = mingenerators1.cc
+mingenerators2_SOURCES = mingenerators2.cc
+numberinput1_SOURCES = numberinput1.cc
+nncminimize1_SOURCES = nncminimize1.cc
+nncminimize2_SOURCES = nncminimize2.cc
+onepoint_SOURCES = onepoint.cc
+permute_SOURCES = permute.cc
+polydifference1_SOURCES = polydifference1.cc
+polydifference2_SOURCES = polydifference2.cc
+polyhull1_SOURCES = polyhull1.cc
+polyhull2_SOURCES = polyhull2.cc
+polypowerset1_SOURCES = polypowerset1.cc
+powerset1_SOURCES = powerset1.cc
+randphull1_SOURCES = randphull1.cc
+randphull2_SOURCES = randphull2.cc
+randphull2_LDADD = $(LDADD) -lm
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
+smm1_SOURCES = smm1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+timeelapse2_SOURCES = timeelapse2.cc
+topclosed1_SOURCES = topclosed1.cc
+topclosure1_SOURCES = topclosure1.cc
+universe1_SOURCES = universe1.cc
+universe2_SOURCES = universe2.cc
+writeconsys1_SOURCES = writeconsys1.cc
+writegensys1_SOURCES = writegensys1.cc
+writepolyhedron1_SOURCES = writepolyhedron1.cc
+writepolyhedron2_SOURCES = writepolyhedron2.cc
+writerelation1_SOURCES = writerelation1.cc
+writevariable1_SOURCES = writevariable1.cc
+
+#
+# Sources and compilation flags for the derived check programs
+#
+DERIVED_CXXFLAGS = -DDERIVED_TEST $(AM_CXXFLAGS)
+nnc_addcongruence1_SOURCES = addcongruence1.cc
+nnc_addcongruence1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addcongruences1_SOURCES = addcongruences1.cc
+nnc_addcongruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addconstraint1_SOURCES = addconstraint1.cc
+nnc_addconstraint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addconstraints1_SOURCES = addconstraints1.cc
+nnc_addconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addgenerator1_SOURCES = addgenerator1.cc
+nnc_addgenerator1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addgenerators1_SOURCES = addgenerators1.cc
+nnc_addgenerators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addspacedims1_SOURCES = addspacedims1.cc
+nnc_addspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_affineimage1_SOURCES = affineimage1.cc
+nnc_affineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_affinepreimage1_SOURCES = affinepreimage1.cc
+nnc_affinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_affinetrans_SOURCES = affinetrans.cc
+nnc_affinetrans_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_append1_SOURCES = append1.cc
+nnc_append1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_append2_SOURCES = append2.cc
+nnc_append2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+nnc_ascii_dump_load1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_ascii_dump_load2_SOURCES = ascii_dump_load2.cc
+nnc_ascii_dump_load2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+nnc_bgp99extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bhrz03widening1_SOURCES = bhrz03widening1.cc
+nnc_bhrz03widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bhrz03widening2_SOURCES = bhrz03widening2.cc
+nnc_bhrz03widening2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bounded1_SOURCES = bounded1.cc
+nnc_bounded1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+nnc_boundedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+nnc_boundedaffinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
+nnc_boundedvhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
+nnc_boundedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundingbox1_SOURCES = boundingbox1.cc
+nnc_boundingbox1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundingbox2_SOURCES = boundingbox2.cc
+nnc_boundingbox2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bounds1_SOURCES = bounds1.cc
+nnc_bounds1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_concatenate1_SOURCES = concatenate1.cc
+nnc_concatenate1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_congruences1_SOURCES = congruences1.cc
+nnc_congruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_constraints1_SOURCES = constraints1.cc
+nnc_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_contains1_SOURCES = contains1.cc
+nnc_contains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_disjoint1_SOURCES = disjoint1.cc
+nnc_disjoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_empty1_SOURCES = empty1.cc
+nnc_empty1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_equals1_SOURCES = equals1.cc
+nnc_equals1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_exceptions1_SOURCES = exceptions1.cc
+nnc_exceptions1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_exceptions3_SOURCES = exceptions3.cc
+nnc_exceptions3_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_expandspacedim1_SOURCES = expandspacedim1.cc
+nnc_expandspacedim1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_foldspacedims1_SOURCES = foldspacedims1.cc
+nnc_foldspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+nnc_generalizedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+nnc_generalizedaffinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_generators1_SOURCES = generators1.cc
+nnc_generators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_geomcovers1_SOURCES = geomcovers1.cc
+nnc_geomcovers1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_h79widening1_SOURCES = h79widening1.cc
+nnc_h79widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_intersection1_SOURCES = intersection1.cc
+nnc_intersection1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+nnc_limitedbhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+nnc_limitedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_linearpartition1_SOURCES = linearpartition1.cc
+nnc_linearpartition1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_mapspacedims1_SOURCES = mapspacedims1.cc
+nnc_mapspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_max_min1_SOURCES = max_min1.cc
+nnc_max_min1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_mc91_SOURCES = mc91.cc
+nnc_mc91_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_membytes1_SOURCES = membytes1.cc
+nnc_membytes1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_membytes2_SOURCES = membytes2.cc
+nnc_membytes2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_minconstraints1_SOURCES = minconstraints1.cc
+nnc_minconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_mingenerators1_SOURCES = mingenerators1.cc
+nnc_mingenerators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_onepoint_SOURCES = onepoint.cc
+nnc_onepoint_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_permute_SOURCES = permute.cc
+nnc_permute_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_polydifference1_SOURCES = polydifference1.cc
+nnc_polydifference1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_polyhull1_SOURCES = polyhull1.cc
+nnc_polyhull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_randphull1_SOURCES = randphull1.cc
+nnc_randphull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_randphull2_SOURCES = randphull2.cc
+nnc_randphull2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_randphull2_LDADD = $(LDADD) -lm
+nnc_relations1_SOURCES = relations1.cc
+nnc_relations1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_relations2_SOURCES = relations2.cc
+nnc_relations2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_removespacedims1_SOURCES = removespacedims1.cc
+nnc_removespacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_smm1_SOURCES = smm1.cc
+nnc_smm1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_timeelapse1_SOURCES = timeelapse1.cc
+nnc_timeelapse1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_universe1_SOURCES = universe1.cc
+nnc_universe1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_writepolyhedron1_SOURCES = writepolyhedron1.cc
+nnc_writepolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+watchdog1_SRCS = watchdog1.cc
+ at BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_TESTS = watchdog1
+ at BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_SOURCES = $(watchdog1_SRCS)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la
+TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS) $(WATCHDOG_TESTS)
+XFAIL_ALWAYS = 
+XFAIL_WITH_INT64 = \
+$(XFAIL_ALWAYS) \
+randphull2 \
+nnc_randphull2
+
+XFAIL_WITH_INT32 = \
+$(XFAIL_WITH_INT64)
+
+XFAIL_WITH_INT16 = \
+$(XFAIL_WITH_INT32)
+
+XFAIL_WITH_INT8 = \
+$(XFAIL_WITH_INT16) \
+membytes1 \
+randphull1 \
+smm1 \
+nnc_membytes1 \
+nnc_randphull1 \
+nnc_smm1
+
+XFAIL_WITH_INT8_A = \
+$(XFAIL_WITH_INT8) \
+membytes2 \
+nnc_membytes2
+
+ at ASSERTIONS_ENABLED_FALSE@@USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_TRUE at XFAIL_SET = $(XFAIL_WITH_INT8)
+ at ASSERTIONS_ENABLED_TRUE@@USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_TRUE at XFAIL_SET = $(XFAIL_WITH_INT8_A)
+ at USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_FALSE at XFAIL_SET = $(XFAIL_ALWAYS)
+ at USE_INT16_TRUE@@USE_INT32_FALSE@@USE_INT64_FALSE at XFAIL_SET = $(XFAIL_WITH_INT16)
+ at USE_INT32_TRUE@@USE_INT64_FALSE at XFAIL_SET = $(XFAIL_WITH_INT32)
+ at USE_INT64_TRUE@XFAIL_SET = $(XFAIL_WITH_INT64)
+XFAIL_TESTS = $(XFAIL_SET)
+EXTRA_DIST = $(watchdog1_SRCS)
+BUGS = bug2
+bug2_SOURCES = bug2.cc
+bug2_CXXFLAGS = -DSRCDIR=\"$(srcdir)\"
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+matrix1.dat \
+linearsystem1.dat \
+writeconsys1.dat \
+writegensys1.dat \
+writepolyhedron1.dat \
+writepolyhedron2.dat \
+writerelation1.dat \
+writevariable1.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Polyhedron/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  tests/Polyhedron/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+addcongruence1$(EXEEXT): $(addcongruence1_OBJECTS) $(addcongruence1_DEPENDENCIES) 
+	@rm -f addcongruence1$(EXEEXT)
+	$(CXXLINK) $(addcongruence1_LDFLAGS) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS)
+addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) 
+	@rm -f addcongruences1$(EXEEXT)
+	$(CXXLINK) $(addcongruences1_LDFLAGS) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+addconstraint1$(EXEEXT): $(addconstraint1_OBJECTS) $(addconstraint1_DEPENDENCIES) 
+	@rm -f addconstraint1$(EXEEXT)
+	$(CXXLINK) $(addconstraint1_LDFLAGS) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS)
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) 
+	@rm -f addconstraints1$(EXEEXT)
+	$(CXXLINK) $(addconstraints1_LDFLAGS) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+addconstraints2$(EXEEXT): $(addconstraints2_OBJECTS) $(addconstraints2_DEPENDENCIES) 
+	@rm -f addconstraints2$(EXEEXT)
+	$(CXXLINK) $(addconstraints2_LDFLAGS) $(addconstraints2_OBJECTS) $(addconstraints2_LDADD) $(LIBS)
+addgenerator1$(EXEEXT): $(addgenerator1_OBJECTS) $(addgenerator1_DEPENDENCIES) 
+	@rm -f addgenerator1$(EXEEXT)
+	$(CXXLINK) $(addgenerator1_LDFLAGS) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS)
+addgenerator2$(EXEEXT): $(addgenerator2_OBJECTS) $(addgenerator2_DEPENDENCIES) 
+	@rm -f addgenerator2$(EXEEXT)
+	$(CXXLINK) $(addgenerator2_LDFLAGS) $(addgenerator2_OBJECTS) $(addgenerator2_LDADD) $(LIBS)
+addgenerators1$(EXEEXT): $(addgenerators1_OBJECTS) $(addgenerators1_DEPENDENCIES) 
+	@rm -f addgenerators1$(EXEEXT)
+	$(CXXLINK) $(addgenerators1_LDFLAGS) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS)
+addgenerators2$(EXEEXT): $(addgenerators2_OBJECTS) $(addgenerators2_DEPENDENCIES) 
+	@rm -f addgenerators2$(EXEEXT)
+	$(CXXLINK) $(addgenerators2_LDFLAGS) $(addgenerators2_OBJECTS) $(addgenerators2_LDADD) $(LIBS)
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) 
+	@rm -f addspacedims1$(EXEEXT)
+	$(CXXLINK) $(addspacedims1_LDFLAGS) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+addspacedims2$(EXEEXT): $(addspacedims2_OBJECTS) $(addspacedims2_DEPENDENCIES) 
+	@rm -f addspacedims2$(EXEEXT)
+	$(CXXLINK) $(addspacedims2_LDFLAGS) $(addspacedims2_OBJECTS) $(addspacedims2_LDADD) $(LIBS)
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) 
+	@rm -f affineimage1$(EXEEXT)
+	$(CXXLINK) $(affineimage1_LDFLAGS) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) 
+	@rm -f affineimage2$(EXEEXT)
+	$(CXXLINK) $(affineimage2_LDFLAGS) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) 
+	@rm -f affinepreimage1$(EXEEXT)
+	$(CXXLINK) $(affinepreimage1_LDFLAGS) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+affinetrans$(EXEEXT): $(affinetrans_OBJECTS) $(affinetrans_DEPENDENCIES) 
+	@rm -f affinetrans$(EXEEXT)
+	$(CXXLINK) $(affinetrans_LDFLAGS) $(affinetrans_OBJECTS) $(affinetrans_LDADD) $(LIBS)
+append1$(EXEEXT): $(append1_OBJECTS) $(append1_DEPENDENCIES) 
+	@rm -f append1$(EXEEXT)
+	$(CXXLINK) $(append1_LDFLAGS) $(append1_OBJECTS) $(append1_LDADD) $(LIBS)
+append2$(EXEEXT): $(append2_OBJECTS) $(append2_DEPENDENCIES) 
+	@rm -f append2$(EXEEXT)
+	$(CXXLINK) $(append2_LDFLAGS) $(append2_OBJECTS) $(append2_LDADD) $(LIBS)
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) 
+	@rm -f ascii_dump_load1$(EXEEXT)
+	$(CXXLINK) $(ascii_dump_load1_LDFLAGS) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+ascii_dump_load2$(EXEEXT): $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_DEPENDENCIES) 
+	@rm -f ascii_dump_load2$(EXEEXT)
+	$(CXXLINK) $(ascii_dump_load2_LDFLAGS) $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_LDADD) $(LIBS)
+ascii_dump_load3$(EXEEXT): $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_DEPENDENCIES) 
+	@rm -f ascii_dump_load3$(EXEEXT)
+	$(CXXLINK) $(ascii_dump_load3_LDFLAGS) $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_LDADD) $(LIBS)
+bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) 
+	@rm -f bgp99extrapolation1$(EXEEXT)
+	$(CXXLINK) $(bgp99extrapolation1_LDFLAGS) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+bhrz03widening1$(EXEEXT): $(bhrz03widening1_OBJECTS) $(bhrz03widening1_DEPENDENCIES) 
+	@rm -f bhrz03widening1$(EXEEXT)
+	$(CXXLINK) $(bhrz03widening1_LDFLAGS) $(bhrz03widening1_OBJECTS) $(bhrz03widening1_LDADD) $(LIBS)
+bhrz03widening2$(EXEEXT): $(bhrz03widening2_OBJECTS) $(bhrz03widening2_DEPENDENCIES) 
+	@rm -f bhrz03widening2$(EXEEXT)
+	$(CXXLINK) $(bhrz03widening2_LDFLAGS) $(bhrz03widening2_OBJECTS) $(bhrz03widening2_LDADD) $(LIBS)
+bhrz03widening3$(EXEEXT): $(bhrz03widening3_OBJECTS) $(bhrz03widening3_DEPENDENCIES) 
+	@rm -f bhrz03widening3$(EXEEXT)
+	$(CXXLINK) $(bhrz03widening3_LDFLAGS) $(bhrz03widening3_OBJECTS) $(bhrz03widening3_LDADD) $(LIBS)
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) 
+	@rm -f bhz03widening1$(EXEEXT)
+	$(CXXLINK) $(bhz03widening1_LDFLAGS) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) 
+	@rm -f bounded1$(EXEEXT)
+	$(CXXLINK) $(bounded1_LDFLAGS) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) 
+	@rm -f boundedaffineimage1$(EXEEXT)
+	$(CXXLINK) $(boundedaffineimage1_LDFLAGS) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) 
+	@rm -f boundedaffinepreimage1$(EXEEXT)
+	$(CXXLINK) $(boundedaffinepreimage1_LDFLAGS) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+boundedbhrz03extrapolation1$(EXEEXT): $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_DEPENDENCIES) 
+	@rm -f boundedbhrz03extrapolation1$(EXEEXT)
+	$(CXXLINK) $(boundedbhrz03extrapolation1_LDFLAGS) $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_LDADD) $(LIBS)
+boundedh79extrapolation1$(EXEEXT): $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_DEPENDENCIES) 
+	@rm -f boundedh79extrapolation1$(EXEEXT)
+	$(CXXLINK) $(boundedh79extrapolation1_LDFLAGS) $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_LDADD) $(LIBS)
+boundingbox1$(EXEEXT): $(boundingbox1_OBJECTS) $(boundingbox1_DEPENDENCIES) 
+	@rm -f boundingbox1$(EXEEXT)
+	$(CXXLINK) $(boundingbox1_LDFLAGS) $(boundingbox1_OBJECTS) $(boundingbox1_LDADD) $(LIBS)
+boundingbox2$(EXEEXT): $(boundingbox2_OBJECTS) $(boundingbox2_DEPENDENCIES) 
+	@rm -f boundingbox2$(EXEEXT)
+	$(CXXLINK) $(boundingbox2_LDFLAGS) $(boundingbox2_OBJECTS) $(boundingbox2_LDADD) $(LIBS)
+boundingbox3$(EXEEXT): $(boundingbox3_OBJECTS) $(boundingbox3_DEPENDENCIES) 
+	@rm -f boundingbox3$(EXEEXT)
+	$(CXXLINK) $(boundingbox3_LDFLAGS) $(boundingbox3_OBJECTS) $(boundingbox3_LDADD) $(LIBS)
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) 
+	@rm -f bounds1$(EXEEXT)
+	$(CXXLINK) $(bounds1_LDFLAGS) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+bug2$(EXEEXT): $(bug2_OBJECTS) $(bug2_DEPENDENCIES) 
+	@rm -f bug2$(EXEEXT)
+	$(CXXLINK) $(bug2_LDFLAGS) $(bug2_OBJECTS) $(bug2_LDADD) $(LIBS)
+cnncconversion1$(EXEEXT): $(cnncconversion1_OBJECTS) $(cnncconversion1_DEPENDENCIES) 
+	@rm -f cnncconversion1$(EXEEXT)
+	$(CXXLINK) $(cnncconversion1_LDFLAGS) $(cnncconversion1_OBJECTS) $(cnncconversion1_LDADD) $(LIBS)
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) 
+	@rm -f concatenate1$(EXEEXT)
+	$(CXXLINK) $(concatenate1_LDFLAGS) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) 
+	@rm -f congruences1$(EXEEXT)
+	$(CXXLINK) $(congruences1_LDFLAGS) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) 
+	@rm -f constraints1$(EXEEXT)
+	$(CXXLINK) $(constraints1_LDFLAGS) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) 
+	@rm -f contains1$(EXEEXT)
+	$(CXXLINK) $(contains1_LDFLAGS) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+contains2$(EXEEXT): $(contains2_OBJECTS) $(contains2_DEPENDENCIES) 
+	@rm -f contains2$(EXEEXT)
+	$(CXXLINK) $(contains2_LDFLAGS) $(contains2_OBJECTS) $(contains2_LDADD) $(LIBS)
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) 
+	@rm -f disjoint1$(EXEEXT)
+	$(CXXLINK) $(disjoint1_LDFLAGS) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+disjoint2$(EXEEXT): $(disjoint2_OBJECTS) $(disjoint2_DEPENDENCIES) 
+	@rm -f disjoint2$(EXEEXT)
+	$(CXXLINK) $(disjoint2_LDFLAGS) $(disjoint2_OBJECTS) $(disjoint2_LDADD) $(LIBS)
+dualhypercubes$(EXEEXT): $(dualhypercubes_OBJECTS) $(dualhypercubes_DEPENDENCIES) 
+	@rm -f dualhypercubes$(EXEEXT)
+	$(CXXLINK) $(dualhypercubes_LDFLAGS) $(dualhypercubes_OBJECTS) $(dualhypercubes_LDADD) $(LIBS)
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) 
+	@rm -f empty1$(EXEEXT)
+	$(CXXLINK) $(empty1_LDFLAGS) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) 
+	@rm -f equals1$(EXEEXT)
+	$(CXXLINK) $(equals1_LDFLAGS) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+exceptions1$(EXEEXT): $(exceptions1_OBJECTS) $(exceptions1_DEPENDENCIES) 
+	@rm -f exceptions1$(EXEEXT)
+	$(CXXLINK) $(exceptions1_LDFLAGS) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS)
+exceptions2$(EXEEXT): $(exceptions2_OBJECTS) $(exceptions2_DEPENDENCIES) 
+	@rm -f exceptions2$(EXEEXT)
+	$(CXXLINK) $(exceptions2_LDFLAGS) $(exceptions2_OBJECTS) $(exceptions2_LDADD) $(LIBS)
+exceptions3$(EXEEXT): $(exceptions3_OBJECTS) $(exceptions3_DEPENDENCIES) 
+	@rm -f exceptions3$(EXEEXT)
+	$(CXXLINK) $(exceptions3_LDFLAGS) $(exceptions3_OBJECTS) $(exceptions3_LDADD) $(LIBS)
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) 
+	@rm -f expandspacedim1$(EXEEXT)
+	$(CXXLINK) $(expandspacedim1_LDFLAGS) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+expandspacedim2$(EXEEXT): $(expandspacedim2_OBJECTS) $(expandspacedim2_DEPENDENCIES) 
+	@rm -f expandspacedim2$(EXEEXT)
+	$(CXXLINK) $(expandspacedim2_LDFLAGS) $(expandspacedim2_OBJECTS) $(expandspacedim2_LDADD) $(LIBS)
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) 
+	@rm -f foldspacedims1$(EXEEXT)
+	$(CXXLINK) $(foldspacedims1_LDFLAGS) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+foldspacedims2$(EXEEXT): $(foldspacedims2_OBJECTS) $(foldspacedims2_DEPENDENCIES) 
+	@rm -f foldspacedims2$(EXEEXT)
+	$(CXXLINK) $(foldspacedims2_LDFLAGS) $(foldspacedims2_OBJECTS) $(foldspacedims2_LDADD) $(LIBS)
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f generalizedaffineimage1$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage1_LDFLAGS) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) 
+	@rm -f generalizedaffineimage2$(EXEEXT)
+	$(CXXLINK) $(generalizedaffineimage2_LDFLAGS) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage1$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage1_LDFLAGS) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage2$(EXEEXT)
+	$(CXXLINK) $(generalizedaffinepreimage2_LDFLAGS) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+generators1$(EXEEXT): $(generators1_OBJECTS) $(generators1_DEPENDENCIES) 
+	@rm -f generators1$(EXEEXT)
+	$(CXXLINK) $(generators1_LDFLAGS) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS)
+geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) 
+	@rm -f geomcovers1$(EXEEXT)
+	$(CXXLINK) $(geomcovers1_LDFLAGS) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+h79widening1$(EXEEXT): $(h79widening1_OBJECTS) $(h79widening1_DEPENDENCIES) 
+	@rm -f h79widening1$(EXEEXT)
+	$(CXXLINK) $(h79widening1_LDFLAGS) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS)
+h79widening2$(EXEEXT): $(h79widening2_OBJECTS) $(h79widening2_DEPENDENCIES) 
+	@rm -f h79widening2$(EXEEXT)
+	$(CXXLINK) $(h79widening2_LDFLAGS) $(h79widening2_OBJECTS) $(h79widening2_LDADD) $(LIBS)
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) 
+	@rm -f intersection1$(EXEEXT)
+	$(CXXLINK) $(intersection1_LDFLAGS) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+limitedbhrz03extrapolation1$(EXEEXT): $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_DEPENDENCIES) 
+	@rm -f limitedbhrz03extrapolation1$(EXEEXT)
+	$(CXXLINK) $(limitedbhrz03extrapolation1_LDFLAGS) $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_LDADD) $(LIBS)
+limitedh79extrapolation1$(EXEEXT): $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_DEPENDENCIES) 
+	@rm -f limitedh79extrapolation1$(EXEEXT)
+	$(CXXLINK) $(limitedh79extrapolation1_LDFLAGS) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS)
+linearpartition1$(EXEEXT): $(linearpartition1_OBJECTS) $(linearpartition1_DEPENDENCIES) 
+	@rm -f linearpartition1$(EXEEXT)
+	$(CXXLINK) $(linearpartition1_LDFLAGS) $(linearpartition1_OBJECTS) $(linearpartition1_LDADD) $(LIBS)
+linearsystem1$(EXEEXT): $(linearsystem1_OBJECTS) $(linearsystem1_DEPENDENCIES) 
+	@rm -f linearsystem1$(EXEEXT)
+	$(CXXLINK) $(linearsystem1_LDFLAGS) $(linearsystem1_OBJECTS) $(linearsystem1_LDADD) $(LIBS)
+linexpression1$(EXEEXT): $(linexpression1_OBJECTS) $(linexpression1_DEPENDENCIES) 
+	@rm -f linexpression1$(EXEEXT)
+	$(CXXLINK) $(linexpression1_LDFLAGS) $(linexpression1_OBJECTS) $(linexpression1_LDADD) $(LIBS)
+lpproblem1$(EXEEXT): $(lpproblem1_OBJECTS) $(lpproblem1_DEPENDENCIES) 
+	@rm -f lpproblem1$(EXEEXT)
+	$(CXXLINK) $(lpproblem1_LDFLAGS) $(lpproblem1_OBJECTS) $(lpproblem1_LDADD) $(LIBS)
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) 
+	@rm -f mapspacedims1$(EXEEXT)
+	$(CXXLINK) $(mapspacedims1_LDFLAGS) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+matrix1$(EXEEXT): $(matrix1_OBJECTS) $(matrix1_DEPENDENCIES) 
+	@rm -f matrix1$(EXEEXT)
+	$(CXXLINK) $(matrix1_LDFLAGS) $(matrix1_OBJECTS) $(matrix1_LDADD) $(LIBS)
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) 
+	@rm -f max_min1$(EXEEXT)
+	$(CXXLINK) $(max_min1_LDFLAGS) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) 
+	@rm -f maxspacedim1$(EXEEXT)
+	$(CXXLINK) $(maxspacedim1_LDFLAGS) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+mc91$(EXEEXT): $(mc91_OBJECTS) $(mc91_DEPENDENCIES) 
+	@rm -f mc91$(EXEEXT)
+	$(CXXLINK) $(mc91_LDFLAGS) $(mc91_OBJECTS) $(mc91_LDADD) $(LIBS)
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) 
+	@rm -f membytes1$(EXEEXT)
+	$(CXXLINK) $(membytes1_LDFLAGS) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+membytes2$(EXEEXT): $(membytes2_OBJECTS) $(membytes2_DEPENDENCIES) 
+	@rm -f membytes2$(EXEEXT)
+	$(CXXLINK) $(membytes2_LDFLAGS) $(membytes2_OBJECTS) $(membytes2_LDADD) $(LIBS)
+memory1$(EXEEXT): $(memory1_OBJECTS) $(memory1_DEPENDENCIES) 
+	@rm -f memory1$(EXEEXT)
+	$(CXXLINK) $(memory1_LDFLAGS) $(memory1_OBJECTS) $(memory1_LDADD) $(LIBS)
+memory2$(EXEEXT): $(memory2_OBJECTS) $(memory2_DEPENDENCIES) 
+	@rm -f memory2$(EXEEXT)
+	$(CXXLINK) $(memory2_LDFLAGS) $(memory2_OBJECTS) $(memory2_LDADD) $(LIBS)
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) 
+	@rm -f minconstraints1$(EXEEXT)
+	$(CXXLINK) $(minconstraints1_LDFLAGS) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+minconstraints2$(EXEEXT): $(minconstraints2_OBJECTS) $(minconstraints2_DEPENDENCIES) 
+	@rm -f minconstraints2$(EXEEXT)
+	$(CXXLINK) $(minconstraints2_LDFLAGS) $(minconstraints2_OBJECTS) $(minconstraints2_LDADD) $(LIBS)
+mingenerators1$(EXEEXT): $(mingenerators1_OBJECTS) $(mingenerators1_DEPENDENCIES) 
+	@rm -f mingenerators1$(EXEEXT)
+	$(CXXLINK) $(mingenerators1_LDFLAGS) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS)
+mingenerators2$(EXEEXT): $(mingenerators2_OBJECTS) $(mingenerators2_DEPENDENCIES) 
+	@rm -f mingenerators2$(EXEEXT)
+	$(CXXLINK) $(mingenerators2_LDFLAGS) $(mingenerators2_OBJECTS) $(mingenerators2_LDADD) $(LIBS)
+nnc_addcongruence1$(EXEEXT): $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_DEPENDENCIES) 
+	@rm -f nnc_addcongruence1$(EXEEXT)
+	$(CXXLINK) $(nnc_addcongruence1_LDFLAGS) $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_LDADD) $(LIBS)
+nnc_addcongruences1$(EXEEXT): $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_DEPENDENCIES) 
+	@rm -f nnc_addcongruences1$(EXEEXT)
+	$(CXXLINK) $(nnc_addcongruences1_LDFLAGS) $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_LDADD) $(LIBS)
+nnc_addconstraint1$(EXEEXT): $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_DEPENDENCIES) 
+	@rm -f nnc_addconstraint1$(EXEEXT)
+	$(CXXLINK) $(nnc_addconstraint1_LDFLAGS) $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_LDADD) $(LIBS)
+nnc_addconstraints1$(EXEEXT): $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_DEPENDENCIES) 
+	@rm -f nnc_addconstraints1$(EXEEXT)
+	$(CXXLINK) $(nnc_addconstraints1_LDFLAGS) $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_LDADD) $(LIBS)
+nnc_addgenerator1$(EXEEXT): $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_DEPENDENCIES) 
+	@rm -f nnc_addgenerator1$(EXEEXT)
+	$(CXXLINK) $(nnc_addgenerator1_LDFLAGS) $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_LDADD) $(LIBS)
+nnc_addgenerators1$(EXEEXT): $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_DEPENDENCIES) 
+	@rm -f nnc_addgenerators1$(EXEEXT)
+	$(CXXLINK) $(nnc_addgenerators1_LDFLAGS) $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_LDADD) $(LIBS)
+nnc_addspacedims1$(EXEEXT): $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_DEPENDENCIES) 
+	@rm -f nnc_addspacedims1$(EXEEXT)
+	$(CXXLINK) $(nnc_addspacedims1_LDFLAGS) $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_LDADD) $(LIBS)
+nnc_affineimage1$(EXEEXT): $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_DEPENDENCIES) 
+	@rm -f nnc_affineimage1$(EXEEXT)
+	$(CXXLINK) $(nnc_affineimage1_LDFLAGS) $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_LDADD) $(LIBS)
+nnc_affinepreimage1$(EXEEXT): $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_DEPENDENCIES) 
+	@rm -f nnc_affinepreimage1$(EXEEXT)
+	$(CXXLINK) $(nnc_affinepreimage1_LDFLAGS) $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_LDADD) $(LIBS)
+nnc_affinetrans$(EXEEXT): $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_DEPENDENCIES) 
+	@rm -f nnc_affinetrans$(EXEEXT)
+	$(CXXLINK) $(nnc_affinetrans_LDFLAGS) $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_LDADD) $(LIBS)
+nnc_append1$(EXEEXT): $(nnc_append1_OBJECTS) $(nnc_append1_DEPENDENCIES) 
+	@rm -f nnc_append1$(EXEEXT)
+	$(CXXLINK) $(nnc_append1_LDFLAGS) $(nnc_append1_OBJECTS) $(nnc_append1_LDADD) $(LIBS)
+nnc_append2$(EXEEXT): $(nnc_append2_OBJECTS) $(nnc_append2_DEPENDENCIES) 
+	@rm -f nnc_append2$(EXEEXT)
+	$(CXXLINK) $(nnc_append2_LDFLAGS) $(nnc_append2_OBJECTS) $(nnc_append2_LDADD) $(LIBS)
+nnc_ascii_dump_load1$(EXEEXT): $(nnc_ascii_dump_load1_OBJECTS) $(nnc_ascii_dump_load1_DEPENDENCIES) 
+	@rm -f nnc_ascii_dump_load1$(EXEEXT)
+	$(CXXLINK) $(nnc_ascii_dump_load1_LDFLAGS) $(nnc_ascii_dump_load1_OBJECTS) $(nnc_ascii_dump_load1_LDADD) $(LIBS)
+nnc_ascii_dump_load2$(EXEEXT): $(nnc_ascii_dump_load2_OBJECTS) $(nnc_ascii_dump_load2_DEPENDENCIES) 
+	@rm -f nnc_ascii_dump_load2$(EXEEXT)
+	$(CXXLINK) $(nnc_ascii_dump_load2_LDFLAGS) $(nnc_ascii_dump_load2_OBJECTS) $(nnc_ascii_dump_load2_LDADD) $(LIBS)
+nnc_bgp99extrapolation1$(EXEEXT): $(nnc_bgp99extrapolation1_OBJECTS) $(nnc_bgp99extrapolation1_DEPENDENCIES) 
+	@rm -f nnc_bgp99extrapolation1$(EXEEXT)
+	$(CXXLINK) $(nnc_bgp99extrapolation1_LDFLAGS) $(nnc_bgp99extrapolation1_OBJECTS) $(nnc_bgp99extrapolation1_LDADD) $(LIBS)
+nnc_bhrz03widening1$(EXEEXT): $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_DEPENDENCIES) 
+	@rm -f nnc_bhrz03widening1$(EXEEXT)
+	$(CXXLINK) $(nnc_bhrz03widening1_LDFLAGS) $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_LDADD) $(LIBS)
+nnc_bhrz03widening2$(EXEEXT): $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_DEPENDENCIES) 
+	@rm -f nnc_bhrz03widening2$(EXEEXT)
+	$(CXXLINK) $(nnc_bhrz03widening2_LDFLAGS) $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_LDADD) $(LIBS)
+nnc_bounded1$(EXEEXT): $(nnc_bounded1_OBJECTS) $(nnc_bounded1_DEPENDENCIES) 
+	@rm -f nnc_bounded1$(EXEEXT)
+	$(CXXLINK) $(nnc_bounded1_LDFLAGS) $(nnc_bounded1_OBJECTS) $(nnc_bounded1_LDADD) $(LIBS)
+nnc_boundedaffineimage1$(EXEEXT): $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_DEPENDENCIES) 
+	@rm -f nnc_boundedaffineimage1$(EXEEXT)
+	$(CXXLINK) $(nnc_boundedaffineimage1_LDFLAGS) $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_LDADD) $(LIBS)
+nnc_boundedaffinepreimage1$(EXEEXT): $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_DEPENDENCIES) 
+	@rm -f nnc_boundedaffinepreimage1$(EXEEXT)
+	$(CXXLINK) $(nnc_boundedaffinepreimage1_LDFLAGS) $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_LDADD) $(LIBS)
+nnc_boundedbhrz03extrapolation1$(EXEEXT): $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_DEPENDENCIES) 
+	@rm -f nnc_boundedbhrz03extrapolation1$(EXEEXT)
+	$(CXXLINK) $(nnc_boundedbhrz03extrapolation1_LDFLAGS) $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_LDADD) $(LIBS)
+nnc_boundedh79extrapolation1$(EXEEXT): $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_DEPENDENCIES) 
+	@rm -f nnc_boundedh79extrapolation1$(EXEEXT)
+	$(CXXLINK) $(nnc_boundedh79extrapolation1_LDFLAGS) $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_LDADD) $(LIBS)
+nnc_boundingbox1$(EXEEXT): $(nnc_boundingbox1_OBJECTS) $(nnc_boundingbox1_DEPENDENCIES) 
+	@rm -f nnc_boundingbox1$(EXEEXT)
+	$(CXXLINK) $(nnc_boundingbox1_LDFLAGS) $(nnc_boundingbox1_OBJECTS) $(nnc_boundingbox1_LDADD) $(LIBS)
+nnc_boundingbox2$(EXEEXT): $(nnc_boundingbox2_OBJECTS) $(nnc_boundingbox2_DEPENDENCIES) 
+	@rm -f nnc_boundingbox2$(EXEEXT)
+	$(CXXLINK) $(nnc_boundingbox2_LDFLAGS) $(nnc_boundingbox2_OBJECTS) $(nnc_boundingbox2_LDADD) $(LIBS)
+nnc_bounds1$(EXEEXT): $(nnc_bounds1_OBJECTS) $(nnc_bounds1_DEPENDENCIES) 
+	@rm -f nnc_bounds1$(EXEEXT)
+	$(CXXLINK) $(nnc_bounds1_LDFLAGS) $(nnc_bounds1_OBJECTS) $(nnc_bounds1_LDADD) $(LIBS)
+nnc_concatenate1$(EXEEXT): $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_DEPENDENCIES) 
+	@rm -f nnc_concatenate1$(EXEEXT)
+	$(CXXLINK) $(nnc_concatenate1_LDFLAGS) $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_LDADD) $(LIBS)
+nnc_congruences1$(EXEEXT): $(nnc_congruences1_OBJECTS) $(nnc_congruences1_DEPENDENCIES) 
+	@rm -f nnc_congruences1$(EXEEXT)
+	$(CXXLINK) $(nnc_congruences1_LDFLAGS) $(nnc_congruences1_OBJECTS) $(nnc_congruences1_LDADD) $(LIBS)
+nnc_constraints1$(EXEEXT): $(nnc_constraints1_OBJECTS) $(nnc_constraints1_DEPENDENCIES) 
+	@rm -f nnc_constraints1$(EXEEXT)
+	$(CXXLINK) $(nnc_constraints1_LDFLAGS) $(nnc_constraints1_OBJECTS) $(nnc_constraints1_LDADD) $(LIBS)
+nnc_contains1$(EXEEXT): $(nnc_contains1_OBJECTS) $(nnc_contains1_DEPENDENCIES) 
+	@rm -f nnc_contains1$(EXEEXT)
+	$(CXXLINK) $(nnc_contains1_LDFLAGS) $(nnc_contains1_OBJECTS) $(nnc_contains1_LDADD) $(LIBS)
+nnc_disjoint1$(EXEEXT): $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_DEPENDENCIES) 
+	@rm -f nnc_disjoint1$(EXEEXT)
+	$(CXXLINK) $(nnc_disjoint1_LDFLAGS) $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_LDADD) $(LIBS)
+nnc_empty1$(EXEEXT): $(nnc_empty1_OBJECTS) $(nnc_empty1_DEPENDENCIES) 
+	@rm -f nnc_empty1$(EXEEXT)
+	$(CXXLINK) $(nnc_empty1_LDFLAGS) $(nnc_empty1_OBJECTS) $(nnc_empty1_LDADD) $(LIBS)
+nnc_equals1$(EXEEXT): $(nnc_equals1_OBJECTS) $(nnc_equals1_DEPENDENCIES) 
+	@rm -f nnc_equals1$(EXEEXT)
+	$(CXXLINK) $(nnc_equals1_LDFLAGS) $(nnc_equals1_OBJECTS) $(nnc_equals1_LDADD) $(LIBS)
+nnc_exceptions1$(EXEEXT): $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_DEPENDENCIES) 
+	@rm -f nnc_exceptions1$(EXEEXT)
+	$(CXXLINK) $(nnc_exceptions1_LDFLAGS) $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_LDADD) $(LIBS)
+nnc_exceptions3$(EXEEXT): $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_DEPENDENCIES) 
+	@rm -f nnc_exceptions3$(EXEEXT)
+	$(CXXLINK) $(nnc_exceptions3_LDFLAGS) $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_LDADD) $(LIBS)
+nnc_expandspacedim1$(EXEEXT): $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_DEPENDENCIES) 
+	@rm -f nnc_expandspacedim1$(EXEEXT)
+	$(CXXLINK) $(nnc_expandspacedim1_LDFLAGS) $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_LDADD) $(LIBS)
+nnc_foldspacedims1$(EXEEXT): $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_DEPENDENCIES) 
+	@rm -f nnc_foldspacedims1$(EXEEXT)
+	$(CXXLINK) $(nnc_foldspacedims1_LDFLAGS) $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_LDADD) $(LIBS)
+nnc_generalizedaffineimage1$(EXEEXT): $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f nnc_generalizedaffineimage1$(EXEEXT)
+	$(CXXLINK) $(nnc_generalizedaffineimage1_LDFLAGS) $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_LDADD) $(LIBS)
+nnc_generalizedaffinepreimage1$(EXEEXT): $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_DEPENDENCIES) 
+	@rm -f nnc_generalizedaffinepreimage1$(EXEEXT)
+	$(CXXLINK) $(nnc_generalizedaffinepreimage1_LDFLAGS) $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_LDADD) $(LIBS)
+nnc_generators1$(EXEEXT): $(nnc_generators1_OBJECTS) $(nnc_generators1_DEPENDENCIES) 
+	@rm -f nnc_generators1$(EXEEXT)
+	$(CXXLINK) $(nnc_generators1_LDFLAGS) $(nnc_generators1_OBJECTS) $(nnc_generators1_LDADD) $(LIBS)
+nnc_geomcovers1$(EXEEXT): $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_DEPENDENCIES) 
+	@rm -f nnc_geomcovers1$(EXEEXT)
+	$(CXXLINK) $(nnc_geomcovers1_LDFLAGS) $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_LDADD) $(LIBS)
+nnc_h79widening1$(EXEEXT): $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_DEPENDENCIES) 
+	@rm -f nnc_h79widening1$(EXEEXT)
+	$(CXXLINK) $(nnc_h79widening1_LDFLAGS) $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_LDADD) $(LIBS)
+nnc_intersection1$(EXEEXT): $(nnc_intersection1_OBJECTS) $(nnc_intersection1_DEPENDENCIES) 
+	@rm -f nnc_intersection1$(EXEEXT)
+	$(CXXLINK) $(nnc_intersection1_LDFLAGS) $(nnc_intersection1_OBJECTS) $(nnc_intersection1_LDADD) $(LIBS)
+nnc_limitedbhrz03extrapolation1$(EXEEXT): $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_DEPENDENCIES) 
+	@rm -f nnc_limitedbhrz03extrapolation1$(EXEEXT)
+	$(CXXLINK) $(nnc_limitedbhrz03extrapolation1_LDFLAGS) $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_LDADD) $(LIBS)
+nnc_limitedh79extrapolation1$(EXEEXT): $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_DEPENDENCIES) 
+	@rm -f nnc_limitedh79extrapolation1$(EXEEXT)
+	$(CXXLINK) $(nnc_limitedh79extrapolation1_LDFLAGS) $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_LDADD) $(LIBS)
+nnc_linearpartition1$(EXEEXT): $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_DEPENDENCIES) 
+	@rm -f nnc_linearpartition1$(EXEEXT)
+	$(CXXLINK) $(nnc_linearpartition1_LDFLAGS) $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_LDADD) $(LIBS)
+nnc_mapspacedims1$(EXEEXT): $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_DEPENDENCIES) 
+	@rm -f nnc_mapspacedims1$(EXEEXT)
+	$(CXXLINK) $(nnc_mapspacedims1_LDFLAGS) $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_LDADD) $(LIBS)
+nnc_max_min1$(EXEEXT): $(nnc_max_min1_OBJECTS) $(nnc_max_min1_DEPENDENCIES) 
+	@rm -f nnc_max_min1$(EXEEXT)
+	$(CXXLINK) $(nnc_max_min1_LDFLAGS) $(nnc_max_min1_OBJECTS) $(nnc_max_min1_LDADD) $(LIBS)
+nnc_mc91$(EXEEXT): $(nnc_mc91_OBJECTS) $(nnc_mc91_DEPENDENCIES) 
+	@rm -f nnc_mc91$(EXEEXT)
+	$(CXXLINK) $(nnc_mc91_LDFLAGS) $(nnc_mc91_OBJECTS) $(nnc_mc91_LDADD) $(LIBS)
+nnc_membytes1$(EXEEXT): $(nnc_membytes1_OBJECTS) $(nnc_membytes1_DEPENDENCIES) 
+	@rm -f nnc_membytes1$(EXEEXT)
+	$(CXXLINK) $(nnc_membytes1_LDFLAGS) $(nnc_membytes1_OBJECTS) $(nnc_membytes1_LDADD) $(LIBS)
+nnc_membytes2$(EXEEXT): $(nnc_membytes2_OBJECTS) $(nnc_membytes2_DEPENDENCIES) 
+	@rm -f nnc_membytes2$(EXEEXT)
+	$(CXXLINK) $(nnc_membytes2_LDFLAGS) $(nnc_membytes2_OBJECTS) $(nnc_membytes2_LDADD) $(LIBS)
+nnc_minconstraints1$(EXEEXT): $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_DEPENDENCIES) 
+	@rm -f nnc_minconstraints1$(EXEEXT)
+	$(CXXLINK) $(nnc_minconstraints1_LDFLAGS) $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_LDADD) $(LIBS)
+nnc_mingenerators1$(EXEEXT): $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_DEPENDENCIES) 
+	@rm -f nnc_mingenerators1$(EXEEXT)
+	$(CXXLINK) $(nnc_mingenerators1_LDFLAGS) $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_LDADD) $(LIBS)
+nnc_onepoint$(EXEEXT): $(nnc_onepoint_OBJECTS) $(nnc_onepoint_DEPENDENCIES) 
+	@rm -f nnc_onepoint$(EXEEXT)
+	$(CXXLINK) $(nnc_onepoint_LDFLAGS) $(nnc_onepoint_OBJECTS) $(nnc_onepoint_LDADD) $(LIBS)
+nnc_permute$(EXEEXT): $(nnc_permute_OBJECTS) $(nnc_permute_DEPENDENCIES) 
+	@rm -f nnc_permute$(EXEEXT)
+	$(CXXLINK) $(nnc_permute_LDFLAGS) $(nnc_permute_OBJECTS) $(nnc_permute_LDADD) $(LIBS)
+nnc_polydifference1$(EXEEXT): $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_DEPENDENCIES) 
+	@rm -f nnc_polydifference1$(EXEEXT)
+	$(CXXLINK) $(nnc_polydifference1_LDFLAGS) $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_LDADD) $(LIBS)
+nnc_polyhull1$(EXEEXT): $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_DEPENDENCIES) 
+	@rm -f nnc_polyhull1$(EXEEXT)
+	$(CXXLINK) $(nnc_polyhull1_LDFLAGS) $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_LDADD) $(LIBS)
+nnc_randphull1$(EXEEXT): $(nnc_randphull1_OBJECTS) $(nnc_randphull1_DEPENDENCIES) 
+	@rm -f nnc_randphull1$(EXEEXT)
+	$(CXXLINK) $(nnc_randphull1_LDFLAGS) $(nnc_randphull1_OBJECTS) $(nnc_randphull1_LDADD) $(LIBS)
+nnc_randphull2$(EXEEXT): $(nnc_randphull2_OBJECTS) $(nnc_randphull2_DEPENDENCIES) 
+	@rm -f nnc_randphull2$(EXEEXT)
+	$(CXXLINK) $(nnc_randphull2_LDFLAGS) $(nnc_randphull2_OBJECTS) $(nnc_randphull2_LDADD) $(LIBS)
+nnc_relations1$(EXEEXT): $(nnc_relations1_OBJECTS) $(nnc_relations1_DEPENDENCIES) 
+	@rm -f nnc_relations1$(EXEEXT)
+	$(CXXLINK) $(nnc_relations1_LDFLAGS) $(nnc_relations1_OBJECTS) $(nnc_relations1_LDADD) $(LIBS)
+nnc_relations2$(EXEEXT): $(nnc_relations2_OBJECTS) $(nnc_relations2_DEPENDENCIES) 
+	@rm -f nnc_relations2$(EXEEXT)
+	$(CXXLINK) $(nnc_relations2_LDFLAGS) $(nnc_relations2_OBJECTS) $(nnc_relations2_LDADD) $(LIBS)
+nnc_removespacedims1$(EXEEXT): $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_DEPENDENCIES) 
+	@rm -f nnc_removespacedims1$(EXEEXT)
+	$(CXXLINK) $(nnc_removespacedims1_LDFLAGS) $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_LDADD) $(LIBS)
+nnc_smm1$(EXEEXT): $(nnc_smm1_OBJECTS) $(nnc_smm1_DEPENDENCIES) 
+	@rm -f nnc_smm1$(EXEEXT)
+	$(CXXLINK) $(nnc_smm1_LDFLAGS) $(nnc_smm1_OBJECTS) $(nnc_smm1_LDADD) $(LIBS)
+nnc_timeelapse1$(EXEEXT): $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_DEPENDENCIES) 
+	@rm -f nnc_timeelapse1$(EXEEXT)
+	$(CXXLINK) $(nnc_timeelapse1_LDFLAGS) $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_LDADD) $(LIBS)
+nnc_universe1$(EXEEXT): $(nnc_universe1_OBJECTS) $(nnc_universe1_DEPENDENCIES) 
+	@rm -f nnc_universe1$(EXEEXT)
+	$(CXXLINK) $(nnc_universe1_LDFLAGS) $(nnc_universe1_OBJECTS) $(nnc_universe1_LDADD) $(LIBS)
+nnc_writepolyhedron1$(EXEEXT): $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_DEPENDENCIES) 
+	@rm -f nnc_writepolyhedron1$(EXEEXT)
+	$(CXXLINK) $(nnc_writepolyhedron1_LDFLAGS) $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_LDADD) $(LIBS)
+nncminimize1$(EXEEXT): $(nncminimize1_OBJECTS) $(nncminimize1_DEPENDENCIES) 
+	@rm -f nncminimize1$(EXEEXT)
+	$(CXXLINK) $(nncminimize1_LDFLAGS) $(nncminimize1_OBJECTS) $(nncminimize1_LDADD) $(LIBS)
+nncminimize2$(EXEEXT): $(nncminimize2_OBJECTS) $(nncminimize2_DEPENDENCIES) 
+	@rm -f nncminimize2$(EXEEXT)
+	$(CXXLINK) $(nncminimize2_LDFLAGS) $(nncminimize2_OBJECTS) $(nncminimize2_LDADD) $(LIBS)
+numberinput1$(EXEEXT): $(numberinput1_OBJECTS) $(numberinput1_DEPENDENCIES) 
+	@rm -f numberinput1$(EXEEXT)
+	$(CXXLINK) $(numberinput1_LDFLAGS) $(numberinput1_OBJECTS) $(numberinput1_LDADD) $(LIBS)
+onepoint$(EXEEXT): $(onepoint_OBJECTS) $(onepoint_DEPENDENCIES) 
+	@rm -f onepoint$(EXEEXT)
+	$(CXXLINK) $(onepoint_LDFLAGS) $(onepoint_OBJECTS) $(onepoint_LDADD) $(LIBS)
+permute$(EXEEXT): $(permute_OBJECTS) $(permute_DEPENDENCIES) 
+	@rm -f permute$(EXEEXT)
+	$(CXXLINK) $(permute_LDFLAGS) $(permute_OBJECTS) $(permute_LDADD) $(LIBS)
+polydifference1$(EXEEXT): $(polydifference1_OBJECTS) $(polydifference1_DEPENDENCIES) 
+	@rm -f polydifference1$(EXEEXT)
+	$(CXXLINK) $(polydifference1_LDFLAGS) $(polydifference1_OBJECTS) $(polydifference1_LDADD) $(LIBS)
+polydifference2$(EXEEXT): $(polydifference2_OBJECTS) $(polydifference2_DEPENDENCIES) 
+	@rm -f polydifference2$(EXEEXT)
+	$(CXXLINK) $(polydifference2_LDFLAGS) $(polydifference2_OBJECTS) $(polydifference2_LDADD) $(LIBS)
+polyhull1$(EXEEXT): $(polyhull1_OBJECTS) $(polyhull1_DEPENDENCIES) 
+	@rm -f polyhull1$(EXEEXT)
+	$(CXXLINK) $(polyhull1_LDFLAGS) $(polyhull1_OBJECTS) $(polyhull1_LDADD) $(LIBS)
+polyhull2$(EXEEXT): $(polyhull2_OBJECTS) $(polyhull2_DEPENDENCIES) 
+	@rm -f polyhull2$(EXEEXT)
+	$(CXXLINK) $(polyhull2_LDFLAGS) $(polyhull2_OBJECTS) $(polyhull2_LDADD) $(LIBS)
+polypowerset1$(EXEEXT): $(polypowerset1_OBJECTS) $(polypowerset1_DEPENDENCIES) 
+	@rm -f polypowerset1$(EXEEXT)
+	$(CXXLINK) $(polypowerset1_LDFLAGS) $(polypowerset1_OBJECTS) $(polypowerset1_LDADD) $(LIBS)
+powerset1$(EXEEXT): $(powerset1_OBJECTS) $(powerset1_DEPENDENCIES) 
+	@rm -f powerset1$(EXEEXT)
+	$(CXXLINK) $(powerset1_LDFLAGS) $(powerset1_OBJECTS) $(powerset1_LDADD) $(LIBS)
+randphull1$(EXEEXT): $(randphull1_OBJECTS) $(randphull1_DEPENDENCIES) 
+	@rm -f randphull1$(EXEEXT)
+	$(CXXLINK) $(randphull1_LDFLAGS) $(randphull1_OBJECTS) $(randphull1_LDADD) $(LIBS)
+randphull2$(EXEEXT): $(randphull2_OBJECTS) $(randphull2_DEPENDENCIES) 
+	@rm -f randphull2$(EXEEXT)
+	$(CXXLINK) $(randphull2_LDFLAGS) $(randphull2_OBJECTS) $(randphull2_LDADD) $(LIBS)
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) 
+	@rm -f relations1$(EXEEXT)
+	$(CXXLINK) $(relations1_LDFLAGS) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) 
+	@rm -f relations2$(EXEEXT)
+	$(CXXLINK) $(relations2_LDFLAGS) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) 
+	@rm -f relations3$(EXEEXT)
+	$(CXXLINK) $(relations3_LDFLAGS) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) 
+	@rm -f removespacedims1$(EXEEXT)
+	$(CXXLINK) $(removespacedims1_LDFLAGS) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+removespacedims2$(EXEEXT): $(removespacedims2_OBJECTS) $(removespacedims2_DEPENDENCIES) 
+	@rm -f removespacedims2$(EXEEXT)
+	$(CXXLINK) $(removespacedims2_LDFLAGS) $(removespacedims2_OBJECTS) $(removespacedims2_LDADD) $(LIBS)
+smm1$(EXEEXT): $(smm1_OBJECTS) $(smm1_DEPENDENCIES) 
+	@rm -f smm1$(EXEEXT)
+	$(CXXLINK) $(smm1_LDFLAGS) $(smm1_OBJECTS) $(smm1_LDADD) $(LIBS)
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) 
+	@rm -f timeelapse1$(EXEEXT)
+	$(CXXLINK) $(timeelapse1_LDFLAGS) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+timeelapse2$(EXEEXT): $(timeelapse2_OBJECTS) $(timeelapse2_DEPENDENCIES) 
+	@rm -f timeelapse2$(EXEEXT)
+	$(CXXLINK) $(timeelapse2_LDFLAGS) $(timeelapse2_OBJECTS) $(timeelapse2_LDADD) $(LIBS)
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) 
+	@rm -f topclosed1$(EXEEXT)
+	$(CXXLINK) $(topclosed1_LDFLAGS) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES) 
+	@rm -f topclosure1$(EXEEXT)
+	$(CXXLINK) $(topclosure1_LDFLAGS) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) 
+	@rm -f universe1$(EXEEXT)
+	$(CXXLINK) $(universe1_LDFLAGS) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+universe2$(EXEEXT): $(universe2_OBJECTS) $(universe2_DEPENDENCIES) 
+	@rm -f universe2$(EXEEXT)
+	$(CXXLINK) $(universe2_LDFLAGS) $(universe2_OBJECTS) $(universe2_LDADD) $(LIBS)
+watchdog1$(EXEEXT): $(watchdog1_OBJECTS) $(watchdog1_DEPENDENCIES) 
+	@rm -f watchdog1$(EXEEXT)
+	$(CXXLINK) $(watchdog1_LDFLAGS) $(watchdog1_OBJECTS) $(watchdog1_LDADD) $(LIBS)
+writeconsys1$(EXEEXT): $(writeconsys1_OBJECTS) $(writeconsys1_DEPENDENCIES) 
+	@rm -f writeconsys1$(EXEEXT)
+	$(CXXLINK) $(writeconsys1_LDFLAGS) $(writeconsys1_OBJECTS) $(writeconsys1_LDADD) $(LIBS)
+writegensys1$(EXEEXT): $(writegensys1_OBJECTS) $(writegensys1_DEPENDENCIES) 
+	@rm -f writegensys1$(EXEEXT)
+	$(CXXLINK) $(writegensys1_LDFLAGS) $(writegensys1_OBJECTS) $(writegensys1_LDADD) $(LIBS)
+writepolyhedron1$(EXEEXT): $(writepolyhedron1_OBJECTS) $(writepolyhedron1_DEPENDENCIES) 
+	@rm -f writepolyhedron1$(EXEEXT)
+	$(CXXLINK) $(writepolyhedron1_LDFLAGS) $(writepolyhedron1_OBJECTS) $(writepolyhedron1_LDADD) $(LIBS)
+writepolyhedron2$(EXEEXT): $(writepolyhedron2_OBJECTS) $(writepolyhedron2_DEPENDENCIES) 
+	@rm -f writepolyhedron2$(EXEEXT)
+	$(CXXLINK) $(writepolyhedron2_LDFLAGS) $(writepolyhedron2_OBJECTS) $(writepolyhedron2_LDADD) $(LIBS)
+writerelation1$(EXEEXT): $(writerelation1_OBJECTS) $(writerelation1_DEPENDENCIES) 
+	@rm -f writerelation1$(EXEEXT)
+	$(CXXLINK) $(writerelation1_LDFLAGS) $(writerelation1_OBJECTS) $(writerelation1_LDADD) $(LIBS)
+writevariable1$(EXEEXT): $(writevariable1_OBJECTS) $(writevariable1_DEPENDENCIES) 
+	@rm -f writevariable1$(EXEEXT)
+	$(CXXLINK) $(writevariable1_LDFLAGS) $(writevariable1_OBJECTS) $(writevariable1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerator2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerators2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinetrans.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/append1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/append2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bgp99extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhrz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhrz03widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhrz03widening3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedbhrz03extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bug2-bug2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cnncconversion1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dualhypercubes.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/geomcovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h79widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h79widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedbhrz03extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearpartition1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearsystem1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linexpression1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/lpproblem1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/matrix1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mc91.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/memory1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/memory2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mingenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mingenerators2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addcongruence1-addcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addcongruences1-addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addconstraint1-addconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addconstraints1-addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addgenerator1-addgenerator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addgenerators1-addgenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addspacedims1-addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_affineimage1-affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_affinetrans-affinetrans.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_append1-append1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_append2-append2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bounded1-bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundingbox1-boundingbox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundingbox2-boundingbox2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bounds1-bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_concatenate1-concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_congruences1-congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_constraints1-constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_contains1-contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_disjoint1-disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_empty1-empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_equals1-equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_exceptions1-exceptions1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_exceptions3-exceptions3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_generators1-generators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_geomcovers1-geomcovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_h79widening1-h79widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_intersection1-intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_linearpartition1-linearpartition1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_max_min1-max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_mc91-mc91.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_membytes1-membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_membytes2-membytes2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_minconstraints1-minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_mingenerators1-mingenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_onepoint-onepoint.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_permute-permute.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_polydifference1-polydifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_polyhull1-polyhull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_randphull1-randphull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_randphull2-randphull2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_relations1-relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_relations2-relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_removespacedims1-removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_smm1-smm1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_timeelapse1-timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_universe1-universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nncminimize1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nncminimize2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/numberinput1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/onepoint.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/permute.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polydifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polydifference2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhull2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polypowerset1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powerset1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/randphull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/randphull2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/smm1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/watchdog1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writeconsys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writegensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writepolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writepolyhedron2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writerelation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writevariable1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+bug2-bug2.o: bug2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bug2_CXXFLAGS) $(CXXFLAGS) -MT bug2-bug2.o -MD -MP -MF "$(DEPDIR)/bug2-bug2.Tpo" -c -o bug2-bug2.o `test -f 'bug2.cc' || echo '$(srcdir)/'`bug2.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/bug2-bug2.Tpo" "$(DEPDIR)/bug2-bug2.Po"; else rm -f "$(DEPDIR)/bug2-bug2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bug2.cc' object='bug2-bug2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bug2_CXXFLAGS) $(CXXFLAGS) -c -o bug2-bug2.o `test -f 'bug2.cc' || echo '$(srcdir)/'`bug2.cc
+
+bug2-bug2.obj: bug2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bug2_CXXFLAGS) $(CXXFLAGS) -MT bug2-bug2.obj -MD -MP -MF "$(DEPDIR)/bug2-bug2.Tpo" -c -o bug2-bug2.obj `if test -f 'bug2.cc'; then $(CYGPATH_W) 'bug2.cc'; else $(CYGPATH_W) '$(srcdir)/bug2.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/bug2-bug2.Tpo" "$(DEPDIR)/bug2-bug2.Po"; else rm -f "$(DEPDIR)/bug2-bug2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bug2.cc' object='bug2-bug2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bug2_CXXFLAGS) $(CXXFLAGS) -c -o bug2-bug2.obj `if test -f 'bug2.cc'; then $(CYGPATH_W) 'bug2.cc'; else $(CYGPATH_W) '$(srcdir)/bug2.cc'; fi`
+
+nnc_addcongruence1-addcongruence1.o: addcongruence1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruence1-addcongruence1.o -MD -MP -MF "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo" -c -o nnc_addcongruence1-addcongruence1.o `test -f 'addcongruence1.cc' || echo '$(srcdir)/'`addcongruence1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo" "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Po"; else rm -f "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addcongruence1.cc' object='nnc_addcongruence1-addcongruence1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruence1-addcongruence1.o `test -f 'addcongruence1.cc' || echo '$(srcdir)/'`addcongruence1.cc
+
+nnc_addcongruence1-addcongruence1.obj: addcongruence1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruence1-addcongruence1.obj -MD -MP -MF "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo" -c -o nnc_addcongruence1-addcongruence1.obj `if test -f 'addcongruence1.cc'; then $(CYGPATH_W) 'addcongruence1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruence1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo" "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Po"; else rm -f "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addcongruence1.cc' object='nnc_addcongruence1-addcongruence1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruence1-addcongruence1.obj `if test -f 'addcongruence1.cc'; then $(CYGPATH_W) 'addcongruence1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruence1.cc'; fi`
+
+nnc_addcongruences1-addcongruences1.o: addcongruences1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruences1-addcongruences1.o -MD -MP -MF "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo" -c -o nnc_addcongruences1-addcongruences1.o `test -f 'addcongruences1.cc' || echo '$(srcdir)/'`addcongruences1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo" "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Po"; else rm -f "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addcongruences1.cc' object='nnc_addcongruences1-addcongruences1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruences1-addcongruences1.o `test -f 'addcongruences1.cc' || echo '$(srcdir)/'`addcongruences1.cc
+
+nnc_addcongruences1-addcongruences1.obj: addcongruences1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruences1-addcongruences1.obj -MD -MP -MF "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo" -c -o nnc_addcongruences1-addcongruences1.obj `if test -f 'addcongruences1.cc'; then $(CYGPATH_W) 'addcongruences1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruences1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo" "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Po"; else rm -f "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addcongruences1.cc' object='nnc_addcongruences1-addcongruences1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruences1-addcongruences1.obj `if test -f 'addcongruences1.cc'; then $(CYGPATH_W) 'addcongruences1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruences1.cc'; fi`
+
+nnc_addconstraint1-addconstraint1.o: addconstraint1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraint1-addconstraint1.o -MD -MP -MF "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo" -c -o nnc_addconstraint1-addconstraint1.o `test -f 'addconstraint1.cc' || echo '$(srcdir)/'`addconstraint1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo" "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Po"; else rm -f "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addconstraint1.cc' object='nnc_addconstraint1-addconstraint1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraint1-addconstraint1.o `test -f 'addconstraint1.cc' || echo '$(srcdir)/'`addconstraint1.cc
+
+nnc_addconstraint1-addconstraint1.obj: addconstraint1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraint1-addconstraint1.obj -MD -MP -MF "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo" -c -o nnc_addconstraint1-addconstraint1.obj `if test -f 'addconstraint1.cc'; then $(CYGPATH_W) 'addconstraint1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraint1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo" "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Po"; else rm -f "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addconstraint1.cc' object='nnc_addconstraint1-addconstraint1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraint1-addconstraint1.obj `if test -f 'addconstraint1.cc'; then $(CYGPATH_W) 'addconstraint1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraint1.cc'; fi`
+
+nnc_addconstraints1-addconstraints1.o: addconstraints1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraints1-addconstraints1.o -MD -MP -MF "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo" -c -o nnc_addconstraints1-addconstraints1.o `test -f 'addconstraints1.cc' || echo '$(srcdir)/'`addconstraints1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo" "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Po"; else rm -f "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addconstraints1.cc' object='nnc_addconstraints1-addconstraints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraints1-addconstraints1.o `test -f 'addconstraints1.cc' || echo '$(srcdir)/'`addconstraints1.cc
+
+nnc_addconstraints1-addconstraints1.obj: addconstraints1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraints1-addconstraints1.obj -MD -MP -MF "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo" -c -o nnc_addconstraints1-addconstraints1.obj `if test -f 'addconstraints1.cc'; then $(CYGPATH_W) 'addconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraints1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo" "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Po"; else rm -f "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addconstraints1.cc' object='nnc_addconstraints1-addconstraints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraints1-addconstraints1.obj `if test -f 'addconstraints1.cc'; then $(CYGPATH_W) 'addconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraints1.cc'; fi`
+
+nnc_addgenerator1-addgenerator1.o: addgenerator1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerator1-addgenerator1.o -MD -MP -MF "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo" -c -o nnc_addgenerator1-addgenerator1.o `test -f 'addgenerator1.cc' || echo '$(srcdir)/'`addgenerator1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo" "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Po"; else rm -f "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addgenerator1.cc' object='nnc_addgenerator1-addgenerator1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerator1-addgenerator1.o `test -f 'addgenerator1.cc' || echo '$(srcdir)/'`addgenerator1.cc
+
+nnc_addgenerator1-addgenerator1.obj: addgenerator1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerator1-addgenerator1.obj -MD -MP -MF "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo" -c -o nnc_addgenerator1-addgenerator1.obj `if test -f 'addgenerator1.cc'; then $(CYGPATH_W) 'addgenerator1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerator1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo" "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Po"; else rm -f "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addgenerator1.cc' object='nnc_addgenerator1-addgenerator1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerator1-addgenerator1.obj `if test -f 'addgenerator1.cc'; then $(CYGPATH_W) 'addgenerator1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerator1.cc'; fi`
+
+nnc_addgenerators1-addgenerators1.o: addgenerators1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerators1-addgenerators1.o -MD -MP -MF "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo" -c -o nnc_addgenerators1-addgenerators1.o `test -f 'addgenerators1.cc' || echo '$(srcdir)/'`addgenerators1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo" "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Po"; else rm -f "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addgenerators1.cc' object='nnc_addgenerators1-addgenerators1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerators1-addgenerators1.o `test -f 'addgenerators1.cc' || echo '$(srcdir)/'`addgenerators1.cc
+
+nnc_addgenerators1-addgenerators1.obj: addgenerators1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerators1-addgenerators1.obj -MD -MP -MF "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo" -c -o nnc_addgenerators1-addgenerators1.obj `if test -f 'addgenerators1.cc'; then $(CYGPATH_W) 'addgenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerators1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo" "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Po"; else rm -f "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addgenerators1.cc' object='nnc_addgenerators1-addgenerators1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerators1-addgenerators1.obj `if test -f 'addgenerators1.cc'; then $(CYGPATH_W) 'addgenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerators1.cc'; fi`
+
+nnc_addspacedims1-addspacedims1.o: addspacedims1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addspacedims1-addspacedims1.o -MD -MP -MF "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo" -c -o nnc_addspacedims1-addspacedims1.o `test -f 'addspacedims1.cc' || echo '$(srcdir)/'`addspacedims1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo" "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addspacedims1.cc' object='nnc_addspacedims1-addspacedims1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addspacedims1-addspacedims1.o `test -f 'addspacedims1.cc' || echo '$(srcdir)/'`addspacedims1.cc
+
+nnc_addspacedims1-addspacedims1.obj: addspacedims1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addspacedims1-addspacedims1.obj -MD -MP -MF "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo" -c -o nnc_addspacedims1-addspacedims1.obj `if test -f 'addspacedims1.cc'; then $(CYGPATH_W) 'addspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/addspacedims1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo" "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='addspacedims1.cc' object='nnc_addspacedims1-addspacedims1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addspacedims1-addspacedims1.obj `if test -f 'addspacedims1.cc'; then $(CYGPATH_W) 'addspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/addspacedims1.cc'; fi`
+
+nnc_affineimage1-affineimage1.o: affineimage1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affineimage1-affineimage1.o -MD -MP -MF "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo" -c -o nnc_affineimage1-affineimage1.o `test -f 'affineimage1.cc' || echo '$(srcdir)/'`affineimage1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo" "$(DEPDIR)/nnc_affineimage1-affineimage1.Po"; else rm -f "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='affineimage1.cc' object='nnc_affineimage1-affineimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affineimage1-affineimage1.o `test -f 'affineimage1.cc' || echo '$(srcdir)/'`affineimage1.cc
+
+nnc_affineimage1-affineimage1.obj: affineimage1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affineimage1-affineimage1.obj -MD -MP -MF "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo" -c -o nnc_affineimage1-affineimage1.obj `if test -f 'affineimage1.cc'; then $(CYGPATH_W) 'affineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affineimage1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo" "$(DEPDIR)/nnc_affineimage1-affineimage1.Po"; else rm -f "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='affineimage1.cc' object='nnc_affineimage1-affineimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affineimage1-affineimage1.obj `if test -f 'affineimage1.cc'; then $(CYGPATH_W) 'affineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affineimage1.cc'; fi`
+
+nnc_affinepreimage1-affinepreimage1.o: affinepreimage1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinepreimage1-affinepreimage1.o -MD -MP -MF "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo" -c -o nnc_affinepreimage1-affinepreimage1.o `test -f 'affinepreimage1.cc' || echo '$(srcdir)/'`affinepreimage1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo" "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='affinepreimage1.cc' object='nnc_affinepreimage1-affinepreimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinepreimage1-affinepreimage1.o `test -f 'affinepreimage1.cc' || echo '$(srcdir)/'`affinepreimage1.cc
+
+nnc_affinepreimage1-affinepreimage1.obj: affinepreimage1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinepreimage1-affinepreimage1.obj -MD -MP -MF "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo" -c -o nnc_affinepreimage1-affinepreimage1.obj `if test -f 'affinepreimage1.cc'; then $(CYGPATH_W) 'affinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affinepreimage1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo" "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='affinepreimage1.cc' object='nnc_affinepreimage1-affinepreimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinepreimage1-affinepreimage1.obj `if test -f 'affinepreimage1.cc'; then $(CYGPATH_W) 'affinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affinepreimage1.cc'; fi`
+
+nnc_affinetrans-affinetrans.o: affinetrans.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinetrans-affinetrans.o -MD -MP -MF "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo" -c -o nnc_affinetrans-affinetrans.o `test -f 'affinetrans.cc' || echo '$(srcdir)/'`affinetrans.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo" "$(DEPDIR)/nnc_affinetrans-affinetrans.Po"; else rm -f "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='affinetrans.cc' object='nnc_affinetrans-affinetrans.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinetrans-affinetrans.o `test -f 'affinetrans.cc' || echo '$(srcdir)/'`affinetrans.cc
+
+nnc_affinetrans-affinetrans.obj: affinetrans.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinetrans-affinetrans.obj -MD -MP -MF "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo" -c -o nnc_affinetrans-affinetrans.obj `if test -f 'affinetrans.cc'; then $(CYGPATH_W) 'affinetrans.cc'; else $(CYGPATH_W) '$(srcdir)/affinetrans.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo" "$(DEPDIR)/nnc_affinetrans-affinetrans.Po"; else rm -f "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='affinetrans.cc' object='nnc_affinetrans-affinetrans.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinetrans-affinetrans.obj `if test -f 'affinetrans.cc'; then $(CYGPATH_W) 'affinetrans.cc'; else $(CYGPATH_W) '$(srcdir)/affinetrans.cc'; fi`
+
+nnc_append1-append1.o: append1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -MT nnc_append1-append1.o -MD -MP -MF "$(DEPDIR)/nnc_append1-append1.Tpo" -c -o nnc_append1-append1.o `test -f 'append1.cc' || echo '$(srcdir)/'`append1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_append1-append1.Tpo" "$(DEPDIR)/nnc_append1-append1.Po"; else rm -f "$(DEPDIR)/nnc_append1-append1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='append1.cc' object='nnc_append1-append1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append1-append1.o `test -f 'append1.cc' || echo '$(srcdir)/'`append1.cc
+
+nnc_append1-append1.obj: append1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -MT nnc_append1-append1.obj -MD -MP -MF "$(DEPDIR)/nnc_append1-append1.Tpo" -c -o nnc_append1-append1.obj `if test -f 'append1.cc'; then $(CYGPATH_W) 'append1.cc'; else $(CYGPATH_W) '$(srcdir)/append1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_append1-append1.Tpo" "$(DEPDIR)/nnc_append1-append1.Po"; else rm -f "$(DEPDIR)/nnc_append1-append1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='append1.cc' object='nnc_append1-append1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append1-append1.obj `if test -f 'append1.cc'; then $(CYGPATH_W) 'append1.cc'; else $(CYGPATH_W) '$(srcdir)/append1.cc'; fi`
+
+nnc_append2-append2.o: append2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -MT nnc_append2-append2.o -MD -MP -MF "$(DEPDIR)/nnc_append2-append2.Tpo" -c -o nnc_append2-append2.o `test -f 'append2.cc' || echo '$(srcdir)/'`append2.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_append2-append2.Tpo" "$(DEPDIR)/nnc_append2-append2.Po"; else rm -f "$(DEPDIR)/nnc_append2-append2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='append2.cc' object='nnc_append2-append2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append2-append2.o `test -f 'append2.cc' || echo '$(srcdir)/'`append2.cc
+
+nnc_append2-append2.obj: append2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -MT nnc_append2-append2.obj -MD -MP -MF "$(DEPDIR)/nnc_append2-append2.Tpo" -c -o nnc_append2-append2.obj `if test -f 'append2.cc'; then $(CYGPATH_W) 'append2.cc'; else $(CYGPATH_W) '$(srcdir)/append2.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_append2-append2.Tpo" "$(DEPDIR)/nnc_append2-append2.Po"; else rm -f "$(DEPDIR)/nnc_append2-append2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='append2.cc' object='nnc_append2-append2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append2-append2.obj `if test -f 'append2.cc'; then $(CYGPATH_W) 'append2.cc'; else $(CYGPATH_W) '$(srcdir)/append2.cc'; fi`
+
+nnc_ascii_dump_load1-ascii_dump_load1.o: ascii_dump_load1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load1-ascii_dump_load1.o -MD -MP -MF "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo" -c -o nnc_ascii_dump_load1-ascii_dump_load1.o `test -f 'ascii_dump_load1.cc' || echo '$(srcdir)/'`ascii_dump_load1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo" "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po"; else rm -f "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ascii_dump_load1.cc' object='nnc_ascii_dump_load1-ascii_dump_load1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load1-ascii_dump_load1.o `test -f 'ascii_dump_load1.cc' || echo '$(srcdir)/'`ascii_dump_load1.cc
+
+nnc_ascii_dump_load1-ascii_dump_load1.obj: ascii_dump_load1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load1-ascii_dump_load1.obj -MD -MP -MF "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo" -c -o nnc_ascii_dump_load1-ascii_dump_load1.obj `if test -f 'ascii_dump_load1.cc'; then $(CYGPATH_W) 'ascii_dump_load1.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo" "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po"; else rm -f "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ascii_dump_load1.cc' object='nnc_ascii_dump_load1-ascii_dump_load1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load1-ascii_dump_load1.obj `if test -f 'ascii_dump_load1.cc'; then $(CYGPATH_W) 'ascii_dump_load1.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load1.cc'; fi`
+
+nnc_ascii_dump_load2-ascii_dump_load2.o: ascii_dump_load2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load2-ascii_dump_load2.o -MD -MP -MF "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo" -c -o nnc_ascii_dump_load2-ascii_dump_load2.o `test -f 'ascii_dump_load2.cc' || echo '$(srcdir)/'`ascii_dump_load2.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo" "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po"; else rm -f "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ascii_dump_load2.cc' object='nnc_ascii_dump_load2-ascii_dump_load2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load2-ascii_dump_load2.o `test -f 'ascii_dump_load2.cc' || echo '$(srcdir)/'`ascii_dump_load2.cc
+
+nnc_ascii_dump_load2-ascii_dump_load2.obj: ascii_dump_load2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load2-ascii_dump_load2.obj -MD -MP -MF "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo" -c -o nnc_ascii_dump_load2-ascii_dump_load2.obj `if test -f 'ascii_dump_load2.cc'; then $(CYGPATH_W) 'ascii_dump_load2.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load2.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo" "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po"; else rm -f "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ascii_dump_load2.cc' object='nnc_ascii_dump_load2-ascii_dump_load2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load2-ascii_dump_load2.obj `if test -f 'ascii_dump_load2.cc'; then $(CYGPATH_W) 'ascii_dump_load2.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load2.cc'; fi`
+
+nnc_bgp99extrapolation1-bgp99extrapolation1.o: bgp99extrapolation1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bgp99extrapolation1-bgp99extrapolation1.o -MD -MP -MF "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo" -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.o `test -f 'bgp99extrapolation1.cc' || echo '$(srcdir)/'`bgp99extrapolation1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo" "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bgp99extrapolation1.cc' object='nnc_bgp99extrapolation1-bgp99extrapolation1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.o `test -f 'bgp99extrapolation1.cc' || echo '$(srcdir)/'`bgp99extrapolation1.cc
+
+nnc_bgp99extrapolation1-bgp99extrapolation1.obj: bgp99extrapolation1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bgp99extrapolation1-bgp99extrapolation1.obj -MD -MP -MF "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo" -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.obj `if test -f 'bgp99extrapolation1.cc'; then $(CYGPATH_W) 'bgp99extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/bgp99extrapolation1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo" "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bgp99extrapolation1.cc' object='nnc_bgp99extrapolation1-bgp99extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.obj `if test -f 'bgp99extrapolation1.cc'; then $(CYGPATH_W) 'bgp99extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/bgp99extrapolation1.cc'; fi`
+
+nnc_bhrz03widening1-bhrz03widening1.o: bhrz03widening1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening1-bhrz03widening1.o -MD -MP -MF "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo" -c -o nnc_bhrz03widening1-bhrz03widening1.o `test -f 'bhrz03widening1.cc' || echo '$(srcdir)/'`bhrz03widening1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo" "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po"; else rm -f "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bhrz03widening1.cc' object='nnc_bhrz03widening1-bhrz03widening1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening1-bhrz03widening1.o `test -f 'bhrz03widening1.cc' || echo '$(srcdir)/'`bhrz03widening1.cc
+
+nnc_bhrz03widening1-bhrz03widening1.obj: bhrz03widening1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening1-bhrz03widening1.obj -MD -MP -MF "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo" -c -o nnc_bhrz03widening1-bhrz03widening1.obj `if test -f 'bhrz03widening1.cc'; then $(CYGPATH_W) 'bhrz03widening1.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo" "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po"; else rm -f "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bhrz03widening1.cc' object='nnc_bhrz03widening1-bhrz03widening1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening1-bhrz03widening1.obj `if test -f 'bhrz03widening1.cc'; then $(CYGPATH_W) 'bhrz03widening1.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening1.cc'; fi`
+
+nnc_bhrz03widening2-bhrz03widening2.o: bhrz03widening2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening2-bhrz03widening2.o -MD -MP -MF "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo" -c -o nnc_bhrz03widening2-bhrz03widening2.o `test -f 'bhrz03widening2.cc' || echo '$(srcdir)/'`bhrz03widening2.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo" "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po"; else rm -f "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bhrz03widening2.cc' object='nnc_bhrz03widening2-bhrz03widening2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening2-bhrz03widening2.o `test -f 'bhrz03widening2.cc' || echo '$(srcdir)/'`bhrz03widening2.cc
+
+nnc_bhrz03widening2-bhrz03widening2.obj: bhrz03widening2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening2-bhrz03widening2.obj -MD -MP -MF "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo" -c -o nnc_bhrz03widening2-bhrz03widening2.obj `if test -f 'bhrz03widening2.cc'; then $(CYGPATH_W) 'bhrz03widening2.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening2.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo" "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po"; else rm -f "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bhrz03widening2.cc' object='nnc_bhrz03widening2-bhrz03widening2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening2-bhrz03widening2.obj `if test -f 'bhrz03widening2.cc'; then $(CYGPATH_W) 'bhrz03widening2.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening2.cc'; fi`
+
+nnc_bounded1-bounded1.o: bounded1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounded1-bounded1.o -MD -MP -MF "$(DEPDIR)/nnc_bounded1-bounded1.Tpo" -c -o nnc_bounded1-bounded1.o `test -f 'bounded1.cc' || echo '$(srcdir)/'`bounded1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bounded1-bounded1.Tpo" "$(DEPDIR)/nnc_bounded1-bounded1.Po"; else rm -f "$(DEPDIR)/nnc_bounded1-bounded1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bounded1.cc' object='nnc_bounded1-bounded1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounded1-bounded1.o `test -f 'bounded1.cc' || echo '$(srcdir)/'`bounded1.cc
+
+nnc_bounded1-bounded1.obj: bounded1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounded1-bounded1.obj -MD -MP -MF "$(DEPDIR)/nnc_bounded1-bounded1.Tpo" -c -o nnc_bounded1-bounded1.obj `if test -f 'bounded1.cc'; then $(CYGPATH_W) 'bounded1.cc'; else $(CYGPATH_W) '$(srcdir)/bounded1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bounded1-bounded1.Tpo" "$(DEPDIR)/nnc_bounded1-bounded1.Po"; else rm -f "$(DEPDIR)/nnc_bounded1-bounded1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bounded1.cc' object='nnc_bounded1-bounded1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounded1-bounded1.obj `if test -f 'bounded1.cc'; then $(CYGPATH_W) 'bounded1.cc'; else $(CYGPATH_W) '$(srcdir)/bounded1.cc'; fi`
+
+nnc_boundedaffineimage1-boundedaffineimage1.o: boundedaffineimage1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffineimage1-boundedaffineimage1.o -MD -MP -MF "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo" -c -o nnc_boundedaffineimage1-boundedaffineimage1.o `test -f 'boundedaffineimage1.cc' || echo '$(srcdir)/'`boundedaffineimage1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo" "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po"; else rm -f "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundedaffineimage1.cc' object='nnc_boundedaffineimage1-boundedaffineimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffineimage1-boundedaffineimage1.o `test -f 'boundedaffineimage1.cc' || echo '$(srcdir)/'`boundedaffineimage1.cc
+
+nnc_boundedaffineimage1-boundedaffineimage1.obj: boundedaffineimage1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffineimage1-boundedaffineimage1.obj -MD -MP -MF "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo" -c -o nnc_boundedaffineimage1-boundedaffineimage1.obj `if test -f 'boundedaffineimage1.cc'; then $(CYGPATH_W) 'boundedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffineimage1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo" "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po"; else rm -f "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundedaffineimage1.cc' object='nnc_boundedaffineimage1-boundedaffineimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffineimage1-boundedaffineimage1.obj `if test -f 'boundedaffineimage1.cc'; then $(CYGPATH_W) 'boundedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffineimage1.cc'; fi`
+
+nnc_boundedaffinepreimage1-boundedaffinepreimage1.o: boundedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffinepreimage1-boundedaffinepreimage1.o -MD -MP -MF "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo" -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.o `test -f 'boundedaffinepreimage1.cc' || echo '$(srcdir)/'`boundedaffinepreimage1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo" "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundedaffinepreimage1.cc' object='nnc_boundedaffinepreimage1-boundedaffinepreimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.o `test -f 'boundedaffinepreimage1.cc' || echo '$(srcdir)/'`boundedaffinepreimage1.cc
+
+nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj: boundedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj -MD -MP -MF "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo" -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj `if test -f 'boundedaffinepreimage1.cc'; then $(CYGPATH_W) 'boundedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffinepreimage1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo" "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundedaffinepreimage1.cc' object='nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj `if test -f 'boundedaffinepreimage1.cc'; then $(CYGPATH_W) 'boundedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffinepreimage1.cc'; fi`
+
+nnc_boundedh79extrapolation1-boundedh79extrapolation1.o: boundedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedh79extrapolation1-boundedh79extrapolation1.o -MD -MP -MF "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo" -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.o `test -f 'boundedh79extrapolation1.cc' || echo '$(srcdir)/'`boundedh79extrapolation1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo" "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundedh79extrapolation1.cc' object='nnc_boundedh79extrapolation1-boundedh79extrapolation1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.o `test -f 'boundedh79extrapolation1.cc' || echo '$(srcdir)/'`boundedh79extrapolation1.cc
+
+nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj: boundedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj -MD -MP -MF "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo" -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj `if test -f 'boundedh79extrapolation1.cc'; then $(CYGPATH_W) 'boundedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedh79e [...]
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo" "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundedh79extrapolation1.cc' object='nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj `if test -f 'boundedh79extrapolation1.cc'; then $(CYGPATH_W) 'boundedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedh79extrapolation1.cc'; fi`
+
+nnc_boundingbox1-boundingbox1.o: boundingbox1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundingbox1-boundingbox1.o -MD -MP -MF "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo" -c -o nnc_boundingbox1-boundingbox1.o `test -f 'boundingbox1.cc' || echo '$(srcdir)/'`boundingbox1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo" "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Po"; else rm -f "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundingbox1.cc' object='nnc_boundingbox1-boundingbox1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundingbox1-boundingbox1.o `test -f 'boundingbox1.cc' || echo '$(srcdir)/'`boundingbox1.cc
+
+nnc_boundingbox1-boundingbox1.obj: boundingbox1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundingbox1-boundingbox1.obj -MD -MP -MF "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo" -c -o nnc_boundingbox1-boundingbox1.obj `if test -f 'boundingbox1.cc'; then $(CYGPATH_W) 'boundingbox1.cc'; else $(CYGPATH_W) '$(srcdir)/boundingbox1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo" "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Po"; else rm -f "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundingbox1.cc' object='nnc_boundingbox1-boundingbox1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundingbox1-boundingbox1.obj `if test -f 'boundingbox1.cc'; then $(CYGPATH_W) 'boundingbox1.cc'; else $(CYGPATH_W) '$(srcdir)/boundingbox1.cc'; fi`
+
+nnc_boundingbox2-boundingbox2.o: boundingbox2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox2_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundingbox2-boundingbox2.o -MD -MP -MF "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo" -c -o nnc_boundingbox2-boundingbox2.o `test -f 'boundingbox2.cc' || echo '$(srcdir)/'`boundingbox2.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo" "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Po"; else rm -f "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundingbox2.cc' object='nnc_boundingbox2-boundingbox2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundingbox2-boundingbox2.o `test -f 'boundingbox2.cc' || echo '$(srcdir)/'`boundingbox2.cc
+
+nnc_boundingbox2-boundingbox2.obj: boundingbox2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox2_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundingbox2-boundingbox2.obj -MD -MP -MF "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo" -c -o nnc_boundingbox2-boundingbox2.obj `if test -f 'boundingbox2.cc'; then $(CYGPATH_W) 'boundingbox2.cc'; else $(CYGPATH_W) '$(srcdir)/boundingbox2.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo" "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Po"; else rm -f "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='boundingbox2.cc' object='nnc_boundingbox2-boundingbox2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundingbox2-boundingbox2.obj `if test -f 'boundingbox2.cc'; then $(CYGPATH_W) 'boundingbox2.cc'; else $(CYGPATH_W) '$(srcdir)/boundingbox2.cc'; fi`
+
+nnc_bounds1-bounds1.o: bounds1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounds1-bounds1.o -MD -MP -MF "$(DEPDIR)/nnc_bounds1-bounds1.Tpo" -c -o nnc_bounds1-bounds1.o `test -f 'bounds1.cc' || echo '$(srcdir)/'`bounds1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bounds1-bounds1.Tpo" "$(DEPDIR)/nnc_bounds1-bounds1.Po"; else rm -f "$(DEPDIR)/nnc_bounds1-bounds1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bounds1.cc' object='nnc_bounds1-bounds1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounds1-bounds1.o `test -f 'bounds1.cc' || echo '$(srcdir)/'`bounds1.cc
+
+nnc_bounds1-bounds1.obj: bounds1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounds1-bounds1.obj -MD -MP -MF "$(DEPDIR)/nnc_bounds1-bounds1.Tpo" -c -o nnc_bounds1-bounds1.obj `if test -f 'bounds1.cc'; then $(CYGPATH_W) 'bounds1.cc'; else $(CYGPATH_W) '$(srcdir)/bounds1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_bounds1-bounds1.Tpo" "$(DEPDIR)/nnc_bounds1-bounds1.Po"; else rm -f "$(DEPDIR)/nnc_bounds1-bounds1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bounds1.cc' object='nnc_bounds1-bounds1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounds1-bounds1.obj `if test -f 'bounds1.cc'; then $(CYGPATH_W) 'bounds1.cc'; else $(CYGPATH_W) '$(srcdir)/bounds1.cc'; fi`
+
+nnc_concatenate1-concatenate1.o: concatenate1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -MT nnc_concatenate1-concatenate1.o -MD -MP -MF "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo" -c -o nnc_concatenate1-concatenate1.o `test -f 'concatenate1.cc' || echo '$(srcdir)/'`concatenate1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo" "$(DEPDIR)/nnc_concatenate1-concatenate1.Po"; else rm -f "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='concatenate1.cc' object='nnc_concatenate1-concatenate1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_concatenate1-concatenate1.o `test -f 'concatenate1.cc' || echo '$(srcdir)/'`concatenate1.cc
+
+nnc_concatenate1-concatenate1.obj: concatenate1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -MT nnc_concatenate1-concatenate1.obj -MD -MP -MF "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo" -c -o nnc_concatenate1-concatenate1.obj `if test -f 'concatenate1.cc'; then $(CYGPATH_W) 'concatenate1.cc'; else $(CYGPATH_W) '$(srcdir)/concatenate1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo" "$(DEPDIR)/nnc_concatenate1-concatenate1.Po"; else rm -f "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='concatenate1.cc' object='nnc_concatenate1-concatenate1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_concatenate1-concatenate1.obj `if test -f 'concatenate1.cc'; then $(CYGPATH_W) 'concatenate1.cc'; else $(CYGPATH_W) '$(srcdir)/concatenate1.cc'; fi`
+
+nnc_congruences1-congruences1.o: congruences1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_congruences1-congruences1.o -MD -MP -MF "$(DEPDIR)/nnc_congruences1-congruences1.Tpo" -c -o nnc_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_congruences1-congruences1.Tpo" "$(DEPDIR)/nnc_congruences1-congruences1.Po"; else rm -f "$(DEPDIR)/nnc_congruences1-congruences1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='congruences1.cc' object='nnc_congruences1-congruences1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc
+
+nnc_congruences1-congruences1.obj: congruences1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_congruences1-congruences1.obj -MD -MP -MF "$(DEPDIR)/nnc_congruences1-congruences1.Tpo" -c -o nnc_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_congruences1-congruences1.Tpo" "$(DEPDIR)/nnc_congruences1-congruences1.Po"; else rm -f "$(DEPDIR)/nnc_congruences1-congruences1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='congruences1.cc' object='nnc_congruences1-congruences1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`
+
+nnc_constraints1-constraints1.o: constraints1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constraints1-constraints1.o -MD -MP -MF "$(DEPDIR)/nnc_constraints1-constraints1.Tpo" -c -o nnc_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_constraints1-constraints1.Tpo" "$(DEPDIR)/nnc_constraints1-constraints1.Po"; else rm -f "$(DEPDIR)/nnc_constraints1-constraints1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='constraints1.cc' object='nnc_constraints1-constraints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc
+
+nnc_constraints1-constraints1.obj: constraints1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constraints1-constraints1.obj -MD -MP -MF "$(DEPDIR)/nnc_constraints1-constraints1.Tpo" -c -o nnc_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_constraints1-constraints1.Tpo" "$(DEPDIR)/nnc_constraints1-constraints1.Po"; else rm -f "$(DEPDIR)/nnc_constraints1-constraints1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='constraints1.cc' object='nnc_constraints1-constraints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`
+
+nnc_contains1-contains1.o: contains1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_contains1-contains1.o -MD -MP -MF "$(DEPDIR)/nnc_contains1-contains1.Tpo" -c -o nnc_contains1-contains1.o `test -f 'contains1.cc' || echo '$(srcdir)/'`contains1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_contains1-contains1.Tpo" "$(DEPDIR)/nnc_contains1-contains1.Po"; else rm -f "$(DEPDIR)/nnc_contains1-contains1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='contains1.cc' object='nnc_contains1-contains1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_contains1-contains1.o `test -f 'contains1.cc' || echo '$(srcdir)/'`contains1.cc
+
+nnc_contains1-contains1.obj: contains1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_contains1-contains1.obj -MD -MP -MF "$(DEPDIR)/nnc_contains1-contains1.Tpo" -c -o nnc_contains1-contains1.obj `if test -f 'contains1.cc'; then $(CYGPATH_W) 'contains1.cc'; else $(CYGPATH_W) '$(srcdir)/contains1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_contains1-contains1.Tpo" "$(DEPDIR)/nnc_contains1-contains1.Po"; else rm -f "$(DEPDIR)/nnc_contains1-contains1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='contains1.cc' object='nnc_contains1-contains1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_contains1-contains1.obj `if test -f 'contains1.cc'; then $(CYGPATH_W) 'contains1.cc'; else $(CYGPATH_W) '$(srcdir)/contains1.cc'; fi`
+
+nnc_disjoint1-disjoint1.o: disjoint1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_disjoint1-disjoint1.o -MD -MP -MF "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo" -c -o nnc_disjoint1-disjoint1.o `test -f 'disjoint1.cc' || echo '$(srcdir)/'`disjoint1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo" "$(DEPDIR)/nnc_disjoint1-disjoint1.Po"; else rm -f "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='disjoint1.cc' object='nnc_disjoint1-disjoint1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_disjoint1-disjoint1.o `test -f 'disjoint1.cc' || echo '$(srcdir)/'`disjoint1.cc
+
+nnc_disjoint1-disjoint1.obj: disjoint1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_disjoint1-disjoint1.obj -MD -MP -MF "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo" -c -o nnc_disjoint1-disjoint1.obj `if test -f 'disjoint1.cc'; then $(CYGPATH_W) 'disjoint1.cc'; else $(CYGPATH_W) '$(srcdir)/disjoint1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo" "$(DEPDIR)/nnc_disjoint1-disjoint1.Po"; else rm -f "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='disjoint1.cc' object='nnc_disjoint1-disjoint1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_disjoint1-disjoint1.obj `if test -f 'disjoint1.cc'; then $(CYGPATH_W) 'disjoint1.cc'; else $(CYGPATH_W) '$(srcdir)/disjoint1.cc'; fi`
+
+nnc_empty1-empty1.o: empty1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -MT nnc_empty1-empty1.o -MD -MP -MF "$(DEPDIR)/nnc_empty1-empty1.Tpo" -c -o nnc_empty1-empty1.o `test -f 'empty1.cc' || echo '$(srcdir)/'`empty1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_empty1-empty1.Tpo" "$(DEPDIR)/nnc_empty1-empty1.Po"; else rm -f "$(DEPDIR)/nnc_empty1-empty1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='empty1.cc' object='nnc_empty1-empty1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_empty1-empty1.o `test -f 'empty1.cc' || echo '$(srcdir)/'`empty1.cc
+
+nnc_empty1-empty1.obj: empty1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -MT nnc_empty1-empty1.obj -MD -MP -MF "$(DEPDIR)/nnc_empty1-empty1.Tpo" -c -o nnc_empty1-empty1.obj `if test -f 'empty1.cc'; then $(CYGPATH_W) 'empty1.cc'; else $(CYGPATH_W) '$(srcdir)/empty1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_empty1-empty1.Tpo" "$(DEPDIR)/nnc_empty1-empty1.Po"; else rm -f "$(DEPDIR)/nnc_empty1-empty1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='empty1.cc' object='nnc_empty1-empty1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_empty1-empty1.obj `if test -f 'empty1.cc'; then $(CYGPATH_W) 'empty1.cc'; else $(CYGPATH_W) '$(srcdir)/empty1.cc'; fi`
+
+nnc_equals1-equals1.o: equals1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -MT nnc_equals1-equals1.o -MD -MP -MF "$(DEPDIR)/nnc_equals1-equals1.Tpo" -c -o nnc_equals1-equals1.o `test -f 'equals1.cc' || echo '$(srcdir)/'`equals1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_equals1-equals1.Tpo" "$(DEPDIR)/nnc_equals1-equals1.Po"; else rm -f "$(DEPDIR)/nnc_equals1-equals1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='equals1.cc' object='nnc_equals1-equals1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_equals1-equals1.o `test -f 'equals1.cc' || echo '$(srcdir)/'`equals1.cc
+
+nnc_equals1-equals1.obj: equals1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -MT nnc_equals1-equals1.obj -MD -MP -MF "$(DEPDIR)/nnc_equals1-equals1.Tpo" -c -o nnc_equals1-equals1.obj `if test -f 'equals1.cc'; then $(CYGPATH_W) 'equals1.cc'; else $(CYGPATH_W) '$(srcdir)/equals1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_equals1-equals1.Tpo" "$(DEPDIR)/nnc_equals1-equals1.Po"; else rm -f "$(DEPDIR)/nnc_equals1-equals1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='equals1.cc' object='nnc_equals1-equals1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_equals1-equals1.obj `if test -f 'equals1.cc'; then $(CYGPATH_W) 'equals1.cc'; else $(CYGPATH_W) '$(srcdir)/equals1.cc'; fi`
+
+nnc_exceptions1-exceptions1.o: exceptions1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions1-exceptions1.o -MD -MP -MF "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo" -c -o nnc_exceptions1-exceptions1.o `test -f 'exceptions1.cc' || echo '$(srcdir)/'`exceptions1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo" "$(DEPDIR)/nnc_exceptions1-exceptions1.Po"; else rm -f "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='exceptions1.cc' object='nnc_exceptions1-exceptions1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions1-exceptions1.o `test -f 'exceptions1.cc' || echo '$(srcdir)/'`exceptions1.cc
+
+nnc_exceptions1-exceptions1.obj: exceptions1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions1-exceptions1.obj -MD -MP -MF "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo" -c -o nnc_exceptions1-exceptions1.obj `if test -f 'exceptions1.cc'; then $(CYGPATH_W) 'exceptions1.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo" "$(DEPDIR)/nnc_exceptions1-exceptions1.Po"; else rm -f "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='exceptions1.cc' object='nnc_exceptions1-exceptions1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions1-exceptions1.obj `if test -f 'exceptions1.cc'; then $(CYGPATH_W) 'exceptions1.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions1.cc'; fi`
+
+nnc_exceptions3-exceptions3.o: exceptions3.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions3-exceptions3.o -MD -MP -MF "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo" -c -o nnc_exceptions3-exceptions3.o `test -f 'exceptions3.cc' || echo '$(srcdir)/'`exceptions3.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo" "$(DEPDIR)/nnc_exceptions3-exceptions3.Po"; else rm -f "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='exceptions3.cc' object='nnc_exceptions3-exceptions3.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions3-exceptions3.o `test -f 'exceptions3.cc' || echo '$(srcdir)/'`exceptions3.cc
+
+nnc_exceptions3-exceptions3.obj: exceptions3.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions3-exceptions3.obj -MD -MP -MF "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo" -c -o nnc_exceptions3-exceptions3.obj `if test -f 'exceptions3.cc'; then $(CYGPATH_W) 'exceptions3.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions3.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo" "$(DEPDIR)/nnc_exceptions3-exceptions3.Po"; else rm -f "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='exceptions3.cc' object='nnc_exceptions3-exceptions3.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions3-exceptions3.obj `if test -f 'exceptions3.cc'; then $(CYGPATH_W) 'exceptions3.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions3.cc'; fi`
+
+nnc_expandspacedim1-expandspacedim1.o: expandspacedim1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -MT nnc_expandspacedim1-expandspacedim1.o -MD -MP -MF "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo" -c -o nnc_expandspacedim1-expandspacedim1.o `test -f 'expandspacedim1.cc' || echo '$(srcdir)/'`expandspacedim1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo" "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po"; else rm -f "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='expandspacedim1.cc' object='nnc_expandspacedim1-expandspacedim1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_expandspacedim1-expandspacedim1.o `test -f 'expandspacedim1.cc' || echo '$(srcdir)/'`expandspacedim1.cc
+
+nnc_expandspacedim1-expandspacedim1.obj: expandspacedim1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -MT nnc_expandspacedim1-expandspacedim1.obj -MD -MP -MF "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo" -c -o nnc_expandspacedim1-expandspacedim1.obj `if test -f 'expandspacedim1.cc'; then $(CYGPATH_W) 'expandspacedim1.cc'; else $(CYGPATH_W) '$(srcdir)/expandspacedim1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo" "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po"; else rm -f "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='expandspacedim1.cc' object='nnc_expandspacedim1-expandspacedim1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_expandspacedim1-expandspacedim1.obj `if test -f 'expandspacedim1.cc'; then $(CYGPATH_W) 'expandspacedim1.cc'; else $(CYGPATH_W) '$(srcdir)/expandspacedim1.cc'; fi`
+
+nnc_foldspacedims1-foldspacedims1.o: foldspacedims1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_foldspacedims1-foldspacedims1.o -MD -MP -MF "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo" -c -o nnc_foldspacedims1-foldspacedims1.o `test -f 'foldspacedims1.cc' || echo '$(srcdir)/'`foldspacedims1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo" "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='foldspacedims1.cc' object='nnc_foldspacedims1-foldspacedims1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_foldspacedims1-foldspacedims1.o `test -f 'foldspacedims1.cc' || echo '$(srcdir)/'`foldspacedims1.cc
+
+nnc_foldspacedims1-foldspacedims1.obj: foldspacedims1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_foldspacedims1-foldspacedims1.obj -MD -MP -MF "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo" -c -o nnc_foldspacedims1-foldspacedims1.obj `if test -f 'foldspacedims1.cc'; then $(CYGPATH_W) 'foldspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/foldspacedims1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo" "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='foldspacedims1.cc' object='nnc_foldspacedims1-foldspacedims1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_foldspacedims1-foldspacedims1.obj `if test -f 'foldspacedims1.cc'; then $(CYGPATH_W) 'foldspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/foldspacedims1.cc'; fi`
+
+nnc_generalizedaffineimage1-generalizedaffineimage1.o: generalizedaffineimage1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffineimage1-generalizedaffineimage1.o -MD -MP -MF "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo" -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.o `test -f 'generalizedaffineimage1.cc' || echo '$(srcdir)/'`generalizedaffineimage1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo" "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po"; else rm -f "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='generalizedaffineimage1.cc' object='nnc_generalizedaffineimage1-generalizedaffineimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.o `test -f 'generalizedaffineimage1.cc' || echo '$(srcdir)/'`generalizedaffineimage1.cc
+
+nnc_generalizedaffineimage1-generalizedaffineimage1.obj: generalizedaffineimage1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffineimage1-generalizedaffineimage1.obj -MD -MP -MF "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo" -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.obj `if test -f 'generalizedaffineimage1.cc'; then $(CYGPATH_W) 'generalizedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffineima [...]
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo" "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po"; else rm -f "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='generalizedaffineimage1.cc' object='nnc_generalizedaffineimage1-generalizedaffineimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.obj `if test -f 'generalizedaffineimage1.cc'; then $(CYGPATH_W) 'generalizedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffineimage1.cc'; fi`
+
+nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o: generalizedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o -MD -MP -MF "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo" -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o `test -f 'generalizedaffinepreimage1.cc' || echo '$(srcdir)/'`generalizedaffinepreimage1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo" "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='generalizedaffinepreimage1.cc' object='nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o `test -f 'generalizedaffinepreimage1.cc' || echo '$(srcdir)/'`generalizedaffinepreimage1.cc
+
+nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj: generalizedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj -MD -MP -MF "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo" -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj `if test -f 'generalizedaffinepreimage1.cc'; then $(CYGPATH_W) 'generalizedaffinepreimage1.cc'; else $(CYGPATH_W) '$(s [...]
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo" "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='generalizedaffinepreimage1.cc' object='nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj `if test -f 'generalizedaffinepreimage1.cc'; then $(CYGPATH_W) 'generalizedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffinepreimage1.cc'; fi`
+
+nnc_generators1-generators1.o: generators1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generators1-generators1.o -MD -MP -MF "$(DEPDIR)/nnc_generators1-generators1.Tpo" -c -o nnc_generators1-generators1.o `test -f 'generators1.cc' || echo '$(srcdir)/'`generators1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_generators1-generators1.Tpo" "$(DEPDIR)/nnc_generators1-generators1.Po"; else rm -f "$(DEPDIR)/nnc_generators1-generators1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='generators1.cc' object='nnc_generators1-generators1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generators1-generators1.o `test -f 'generators1.cc' || echo '$(srcdir)/'`generators1.cc
+
+nnc_generators1-generators1.obj: generators1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generators1-generators1.obj -MD -MP -MF "$(DEPDIR)/nnc_generators1-generators1.Tpo" -c -o nnc_generators1-generators1.obj `if test -f 'generators1.cc'; then $(CYGPATH_W) 'generators1.cc'; else $(CYGPATH_W) '$(srcdir)/generators1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_generators1-generators1.Tpo" "$(DEPDIR)/nnc_generators1-generators1.Po"; else rm -f "$(DEPDIR)/nnc_generators1-generators1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='generators1.cc' object='nnc_generators1-generators1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generators1-generators1.obj `if test -f 'generators1.cc'; then $(CYGPATH_W) 'generators1.cc'; else $(CYGPATH_W) '$(srcdir)/generators1.cc'; fi`
+
+nnc_geomcovers1-geomcovers1.o: geomcovers1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -MT nnc_geomcovers1-geomcovers1.o -MD -MP -MF "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo" -c -o nnc_geomcovers1-geomcovers1.o `test -f 'geomcovers1.cc' || echo '$(srcdir)/'`geomcovers1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo" "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Po"; else rm -f "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='geomcovers1.cc' object='nnc_geomcovers1-geomcovers1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_geomcovers1-geomcovers1.o `test -f 'geomcovers1.cc' || echo '$(srcdir)/'`geomcovers1.cc
+
+nnc_geomcovers1-geomcovers1.obj: geomcovers1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -MT nnc_geomcovers1-geomcovers1.obj -MD -MP -MF "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo" -c -o nnc_geomcovers1-geomcovers1.obj `if test -f 'geomcovers1.cc'; then $(CYGPATH_W) 'geomcovers1.cc'; else $(CYGPATH_W) '$(srcdir)/geomcovers1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo" "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Po"; else rm -f "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='geomcovers1.cc' object='nnc_geomcovers1-geomcovers1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_geomcovers1-geomcovers1.obj `if test -f 'geomcovers1.cc'; then $(CYGPATH_W) 'geomcovers1.cc'; else $(CYGPATH_W) '$(srcdir)/geomcovers1.cc'; fi`
+
+nnc_h79widening1-h79widening1.o: h79widening1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_h79widening1-h79widening1.o -MD -MP -MF "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo" -c -o nnc_h79widening1-h79widening1.o `test -f 'h79widening1.cc' || echo '$(srcdir)/'`h79widening1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo" "$(DEPDIR)/nnc_h79widening1-h79widening1.Po"; else rm -f "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='h79widening1.cc' object='nnc_h79widening1-h79widening1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_h79widening1-h79widening1.o `test -f 'h79widening1.cc' || echo '$(srcdir)/'`h79widening1.cc
+
+nnc_h79widening1-h79widening1.obj: h79widening1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_h79widening1-h79widening1.obj -MD -MP -MF "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo" -c -o nnc_h79widening1-h79widening1.obj `if test -f 'h79widening1.cc'; then $(CYGPATH_W) 'h79widening1.cc'; else $(CYGPATH_W) '$(srcdir)/h79widening1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo" "$(DEPDIR)/nnc_h79widening1-h79widening1.Po"; else rm -f "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='h79widening1.cc' object='nnc_h79widening1-h79widening1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_h79widening1-h79widening1.obj `if test -f 'h79widening1.cc'; then $(CYGPATH_W) 'h79widening1.cc'; else $(CYGPATH_W) '$(srcdir)/h79widening1.cc'; fi`
+
+nnc_intersection1-intersection1.o: intersection1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -MT nnc_intersection1-intersection1.o -MD -MP -MF "$(DEPDIR)/nnc_intersection1-intersection1.Tpo" -c -o nnc_intersection1-intersection1.o `test -f 'intersection1.cc' || echo '$(srcdir)/'`intersection1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_intersection1-intersection1.Tpo" "$(DEPDIR)/nnc_intersection1-intersection1.Po"; else rm -f "$(DEPDIR)/nnc_intersection1-intersection1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='intersection1.cc' object='nnc_intersection1-intersection1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_intersection1-intersection1.o `test -f 'intersection1.cc' || echo '$(srcdir)/'`intersection1.cc
+
+nnc_intersection1-intersection1.obj: intersection1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -MT nnc_intersection1-intersection1.obj -MD -MP -MF "$(DEPDIR)/nnc_intersection1-intersection1.Tpo" -c -o nnc_intersection1-intersection1.obj `if test -f 'intersection1.cc'; then $(CYGPATH_W) 'intersection1.cc'; else $(CYGPATH_W) '$(srcdir)/intersection1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_intersection1-intersection1.Tpo" "$(DEPDIR)/nnc_intersection1-intersection1.Po"; else rm -f "$(DEPDIR)/nnc_intersection1-intersection1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='intersection1.cc' object='nnc_intersection1-intersection1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_intersection1-intersection1.obj `if test -f 'intersection1.cc'; then $(CYGPATH_W) 'intersection1.cc'; else $(CYGPATH_W) '$(srcdir)/intersection1.cc'; fi`
+
+nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o: limitedbhrz03extrapolation1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o -MD -MP -MF "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo" -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o `test -f 'limitedbhrz03extrapolation1.cc' || echo '$(srcdir)/'`limitedbhrz03extrapolation1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo" "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='limitedbhrz03extrapolation1.cc' object='nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o `test -f 'limitedbhrz03extrapolation1.cc' || echo '$(srcdir)/'`limitedbhrz03extrapolation1.cc
+
+nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj: limitedbhrz03extrapolation1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj -MD -MP -MF "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo" -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj `if test -f 'limitedbhrz03extrapolation1.cc'; then $(CYGPATH_W) 'limitedbhrz03extrapolation1.cc'; else $(CYGPAT [...]
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo" "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='limitedbhrz03extrapolation1.cc' object='nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj `if test -f 'limitedbhrz03extrapolation1.cc'; then $(CYGPATH_W) 'limitedbhrz03extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedbhrz03extrapolation1.cc'; fi`
+
+nnc_limitedh79extrapolation1-limitedh79extrapolation1.o: limitedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedh79extrapolation1-limitedh79extrapolation1.o -MD -MP -MF "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo" -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.o `test -f 'limitedh79extrapolation1.cc' || echo '$(srcdir)/'`limitedh79extrapolation1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo" "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='limitedh79extrapolation1.cc' object='nnc_limitedh79extrapolation1-limitedh79extrapolation1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.o `test -f 'limitedh79extrapolation1.cc' || echo '$(srcdir)/'`limitedh79extrapolation1.cc
+
+nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj: limitedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj -MD -MP -MF "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo" -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj `if test -f 'limitedh79extrapolation1.cc'; then $(CYGPATH_W) 'limitedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedh79e [...]
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo" "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='limitedh79extrapolation1.cc' object='nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj `if test -f 'limitedh79extrapolation1.cc'; then $(CYGPATH_W) 'limitedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedh79extrapolation1.cc'; fi`
+
+nnc_linearpartition1-linearpartition1.o: linearpartition1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -MT nnc_linearpartition1-linearpartition1.o -MD -MP -MF "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo" -c -o nnc_linearpartition1-linearpartition1.o `test -f 'linearpartition1.cc' || echo '$(srcdir)/'`linearpartition1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo" "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Po"; else rm -f "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='linearpartition1.cc' object='nnc_linearpartition1-linearpartition1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_linearpartition1-linearpartition1.o `test -f 'linearpartition1.cc' || echo '$(srcdir)/'`linearpartition1.cc
+
+nnc_linearpartition1-linearpartition1.obj: linearpartition1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -MT nnc_linearpartition1-linearpartition1.obj -MD -MP -MF "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo" -c -o nnc_linearpartition1-linearpartition1.obj `if test -f 'linearpartition1.cc'; then $(CYGPATH_W) 'linearpartition1.cc'; else $(CYGPATH_W) '$(srcdir)/linearpartition1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo" "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Po"; else rm -f "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='linearpartition1.cc' object='nnc_linearpartition1-linearpartition1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_linearpartition1-linearpartition1.obj `if test -f 'linearpartition1.cc'; then $(CYGPATH_W) 'linearpartition1.cc'; else $(CYGPATH_W) '$(srcdir)/linearpartition1.cc'; fi`
+
+nnc_mapspacedims1-mapspacedims1.o: mapspacedims1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mapspacedims1-mapspacedims1.o -MD -MP -MF "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo" -c -o nnc_mapspacedims1-mapspacedims1.o `test -f 'mapspacedims1.cc' || echo '$(srcdir)/'`mapspacedims1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo" "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mapspacedims1.cc' object='nnc_mapspacedims1-mapspacedims1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mapspacedims1-mapspacedims1.o `test -f 'mapspacedims1.cc' || echo '$(srcdir)/'`mapspacedims1.cc
+
+nnc_mapspacedims1-mapspacedims1.obj: mapspacedims1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mapspacedims1-mapspacedims1.obj -MD -MP -MF "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo" -c -o nnc_mapspacedims1-mapspacedims1.obj `if test -f 'mapspacedims1.cc'; then $(CYGPATH_W) 'mapspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/mapspacedims1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo" "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mapspacedims1.cc' object='nnc_mapspacedims1-mapspacedims1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mapspacedims1-mapspacedims1.obj `if test -f 'mapspacedims1.cc'; then $(CYGPATH_W) 'mapspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/mapspacedims1.cc'; fi`
+
+nnc_max_min1-max_min1.o: max_min1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -MT nnc_max_min1-max_min1.o -MD -MP -MF "$(DEPDIR)/nnc_max_min1-max_min1.Tpo" -c -o nnc_max_min1-max_min1.o `test -f 'max_min1.cc' || echo '$(srcdir)/'`max_min1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_max_min1-max_min1.Tpo" "$(DEPDIR)/nnc_max_min1-max_min1.Po"; else rm -f "$(DEPDIR)/nnc_max_min1-max_min1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='max_min1.cc' object='nnc_max_min1-max_min1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_max_min1-max_min1.o `test -f 'max_min1.cc' || echo '$(srcdir)/'`max_min1.cc
+
+nnc_max_min1-max_min1.obj: max_min1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -MT nnc_max_min1-max_min1.obj -MD -MP -MF "$(DEPDIR)/nnc_max_min1-max_min1.Tpo" -c -o nnc_max_min1-max_min1.obj `if test -f 'max_min1.cc'; then $(CYGPATH_W) 'max_min1.cc'; else $(CYGPATH_W) '$(srcdir)/max_min1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_max_min1-max_min1.Tpo" "$(DEPDIR)/nnc_max_min1-max_min1.Po"; else rm -f "$(DEPDIR)/nnc_max_min1-max_min1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='max_min1.cc' object='nnc_max_min1-max_min1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_max_min1-max_min1.obj `if test -f 'max_min1.cc'; then $(CYGPATH_W) 'max_min1.cc'; else $(CYGPATH_W) '$(srcdir)/max_min1.cc'; fi`
+
+nnc_mc91-mc91.o: mc91.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -MT nnc_mc91-mc91.o -MD -MP -MF "$(DEPDIR)/nnc_mc91-mc91.Tpo" -c -o nnc_mc91-mc91.o `test -f 'mc91.cc' || echo '$(srcdir)/'`mc91.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_mc91-mc91.Tpo" "$(DEPDIR)/nnc_mc91-mc91.Po"; else rm -f "$(DEPDIR)/nnc_mc91-mc91.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mc91.cc' object='nnc_mc91-mc91.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mc91-mc91.o `test -f 'mc91.cc' || echo '$(srcdir)/'`mc91.cc
+
+nnc_mc91-mc91.obj: mc91.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -MT nnc_mc91-mc91.obj -MD -MP -MF "$(DEPDIR)/nnc_mc91-mc91.Tpo" -c -o nnc_mc91-mc91.obj `if test -f 'mc91.cc'; then $(CYGPATH_W) 'mc91.cc'; else $(CYGPATH_W) '$(srcdir)/mc91.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_mc91-mc91.Tpo" "$(DEPDIR)/nnc_mc91-mc91.Po"; else rm -f "$(DEPDIR)/nnc_mc91-mc91.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mc91.cc' object='nnc_mc91-mc91.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mc91-mc91.obj `if test -f 'mc91.cc'; then $(CYGPATH_W) 'mc91.cc'; else $(CYGPATH_W) '$(srcdir)/mc91.cc'; fi`
+
+nnc_membytes1-membytes1.o: membytes1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes1-membytes1.o -MD -MP -MF "$(DEPDIR)/nnc_membytes1-membytes1.Tpo" -c -o nnc_membytes1-membytes1.o `test -f 'membytes1.cc' || echo '$(srcdir)/'`membytes1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_membytes1-membytes1.Tpo" "$(DEPDIR)/nnc_membytes1-membytes1.Po"; else rm -f "$(DEPDIR)/nnc_membytes1-membytes1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='membytes1.cc' object='nnc_membytes1-membytes1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes1-membytes1.o `test -f 'membytes1.cc' || echo '$(srcdir)/'`membytes1.cc
+
+nnc_membytes1-membytes1.obj: membytes1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes1-membytes1.obj -MD -MP -MF "$(DEPDIR)/nnc_membytes1-membytes1.Tpo" -c -o nnc_membytes1-membytes1.obj `if test -f 'membytes1.cc'; then $(CYGPATH_W) 'membytes1.cc'; else $(CYGPATH_W) '$(srcdir)/membytes1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_membytes1-membytes1.Tpo" "$(DEPDIR)/nnc_membytes1-membytes1.Po"; else rm -f "$(DEPDIR)/nnc_membytes1-membytes1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='membytes1.cc' object='nnc_membytes1-membytes1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes1-membytes1.obj `if test -f 'membytes1.cc'; then $(CYGPATH_W) 'membytes1.cc'; else $(CYGPATH_W) '$(srcdir)/membytes1.cc'; fi`
+
+nnc_membytes2-membytes2.o: membytes2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes2_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes2-membytes2.o -MD -MP -MF "$(DEPDIR)/nnc_membytes2-membytes2.Tpo" -c -o nnc_membytes2-membytes2.o `test -f 'membytes2.cc' || echo '$(srcdir)/'`membytes2.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_membytes2-membytes2.Tpo" "$(DEPDIR)/nnc_membytes2-membytes2.Po"; else rm -f "$(DEPDIR)/nnc_membytes2-membytes2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='membytes2.cc' object='nnc_membytes2-membytes2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes2-membytes2.o `test -f 'membytes2.cc' || echo '$(srcdir)/'`membytes2.cc
+
+nnc_membytes2-membytes2.obj: membytes2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes2_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes2-membytes2.obj -MD -MP -MF "$(DEPDIR)/nnc_membytes2-membytes2.Tpo" -c -o nnc_membytes2-membytes2.obj `if test -f 'membytes2.cc'; then $(CYGPATH_W) 'membytes2.cc'; else $(CYGPATH_W) '$(srcdir)/membytes2.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_membytes2-membytes2.Tpo" "$(DEPDIR)/nnc_membytes2-membytes2.Po"; else rm -f "$(DEPDIR)/nnc_membytes2-membytes2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='membytes2.cc' object='nnc_membytes2-membytes2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes2-membytes2.obj `if test -f 'membytes2.cc'; then $(CYGPATH_W) 'membytes2.cc'; else $(CYGPATH_W) '$(srcdir)/membytes2.cc'; fi`
+
+nnc_minconstraints1-minconstraints1.o: minconstraints1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_minconstraints1-minconstraints1.o -MD -MP -MF "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo" -c -o nnc_minconstraints1-minconstraints1.o `test -f 'minconstraints1.cc' || echo '$(srcdir)/'`minconstraints1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo" "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Po"; else rm -f "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='minconstraints1.cc' object='nnc_minconstraints1-minconstraints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_minconstraints1-minconstraints1.o `test -f 'minconstraints1.cc' || echo '$(srcdir)/'`minconstraints1.cc
+
+nnc_minconstraints1-minconstraints1.obj: minconstraints1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_minconstraints1-minconstraints1.obj -MD -MP -MF "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo" -c -o nnc_minconstraints1-minconstraints1.obj `if test -f 'minconstraints1.cc'; then $(CYGPATH_W) 'minconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/minconstraints1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo" "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Po"; else rm -f "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='minconstraints1.cc' object='nnc_minconstraints1-minconstraints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_minconstraints1-minconstraints1.obj `if test -f 'minconstraints1.cc'; then $(CYGPATH_W) 'minconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/minconstraints1.cc'; fi`
+
+nnc_mingenerators1-mingenerators1.o: mingenerators1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mingenerators1-mingenerators1.o -MD -MP -MF "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo" -c -o nnc_mingenerators1-mingenerators1.o `test -f 'mingenerators1.cc' || echo '$(srcdir)/'`mingenerators1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo" "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Po"; else rm -f "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mingenerators1.cc' object='nnc_mingenerators1-mingenerators1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mingenerators1-mingenerators1.o `test -f 'mingenerators1.cc' || echo '$(srcdir)/'`mingenerators1.cc
+
+nnc_mingenerators1-mingenerators1.obj: mingenerators1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mingenerators1-mingenerators1.obj -MD -MP -MF "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo" -c -o nnc_mingenerators1-mingenerators1.obj `if test -f 'mingenerators1.cc'; then $(CYGPATH_W) 'mingenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/mingenerators1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo" "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Po"; else rm -f "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='mingenerators1.cc' object='nnc_mingenerators1-mingenerators1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mingenerators1-mingenerators1.obj `if test -f 'mingenerators1.cc'; then $(CYGPATH_W) 'mingenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/mingenerators1.cc'; fi`
+
+nnc_onepoint-onepoint.o: onepoint.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -MT nnc_onepoint-onepoint.o -MD -MP -MF "$(DEPDIR)/nnc_onepoint-onepoint.Tpo" -c -o nnc_onepoint-onepoint.o `test -f 'onepoint.cc' || echo '$(srcdir)/'`onepoint.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_onepoint-onepoint.Tpo" "$(DEPDIR)/nnc_onepoint-onepoint.Po"; else rm -f "$(DEPDIR)/nnc_onepoint-onepoint.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='onepoint.cc' object='nnc_onepoint-onepoint.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -c -o nnc_onepoint-onepoint.o `test -f 'onepoint.cc' || echo '$(srcdir)/'`onepoint.cc
+
+nnc_onepoint-onepoint.obj: onepoint.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -MT nnc_onepoint-onepoint.obj -MD -MP -MF "$(DEPDIR)/nnc_onepoint-onepoint.Tpo" -c -o nnc_onepoint-onepoint.obj `if test -f 'onepoint.cc'; then $(CYGPATH_W) 'onepoint.cc'; else $(CYGPATH_W) '$(srcdir)/onepoint.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_onepoint-onepoint.Tpo" "$(DEPDIR)/nnc_onepoint-onepoint.Po"; else rm -f "$(DEPDIR)/nnc_onepoint-onepoint.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='onepoint.cc' object='nnc_onepoint-onepoint.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -c -o nnc_onepoint-onepoint.obj `if test -f 'onepoint.cc'; then $(CYGPATH_W) 'onepoint.cc'; else $(CYGPATH_W) '$(srcdir)/onepoint.cc'; fi`
+
+nnc_permute-permute.o: permute.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -MT nnc_permute-permute.o -MD -MP -MF "$(DEPDIR)/nnc_permute-permute.Tpo" -c -o nnc_permute-permute.o `test -f 'permute.cc' || echo '$(srcdir)/'`permute.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_permute-permute.Tpo" "$(DEPDIR)/nnc_permute-permute.Po"; else rm -f "$(DEPDIR)/nnc_permute-permute.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='permute.cc' object='nnc_permute-permute.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -c -o nnc_permute-permute.o `test -f 'permute.cc' || echo '$(srcdir)/'`permute.cc
+
+nnc_permute-permute.obj: permute.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -MT nnc_permute-permute.obj -MD -MP -MF "$(DEPDIR)/nnc_permute-permute.Tpo" -c -o nnc_permute-permute.obj `if test -f 'permute.cc'; then $(CYGPATH_W) 'permute.cc'; else $(CYGPATH_W) '$(srcdir)/permute.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_permute-permute.Tpo" "$(DEPDIR)/nnc_permute-permute.Po"; else rm -f "$(DEPDIR)/nnc_permute-permute.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='permute.cc' object='nnc_permute-permute.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -c -o nnc_permute-permute.obj `if test -f 'permute.cc'; then $(CYGPATH_W) 'permute.cc'; else $(CYGPATH_W) '$(srcdir)/permute.cc'; fi`
+
+nnc_polydifference1-polydifference1.o: polydifference1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polydifference1-polydifference1.o -MD -MP -MF "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo" -c -o nnc_polydifference1-polydifference1.o `test -f 'polydifference1.cc' || echo '$(srcdir)/'`polydifference1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo" "$(DEPDIR)/nnc_polydifference1-polydifference1.Po"; else rm -f "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='polydifference1.cc' object='nnc_polydifference1-polydifference1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polydifference1-polydifference1.o `test -f 'polydifference1.cc' || echo '$(srcdir)/'`polydifference1.cc
+
+nnc_polydifference1-polydifference1.obj: polydifference1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polydifference1-polydifference1.obj -MD -MP -MF "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo" -c -o nnc_polydifference1-polydifference1.obj `if test -f 'polydifference1.cc'; then $(CYGPATH_W) 'polydifference1.cc'; else $(CYGPATH_W) '$(srcdir)/polydifference1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo" "$(DEPDIR)/nnc_polydifference1-polydifference1.Po"; else rm -f "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='polydifference1.cc' object='nnc_polydifference1-polydifference1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polydifference1-polydifference1.obj `if test -f 'polydifference1.cc'; then $(CYGPATH_W) 'polydifference1.cc'; else $(CYGPATH_W) '$(srcdir)/polydifference1.cc'; fi`
+
+nnc_polyhull1-polyhull1.o: polyhull1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhull1-polyhull1.o -MD -MP -MF "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo" -c -o nnc_polyhull1-polyhull1.o `test -f 'polyhull1.cc' || echo '$(srcdir)/'`polyhull1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo" "$(DEPDIR)/nnc_polyhull1-polyhull1.Po"; else rm -f "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='polyhull1.cc' object='nnc_polyhull1-polyhull1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhull1-polyhull1.o `test -f 'polyhull1.cc' || echo '$(srcdir)/'`polyhull1.cc
+
+nnc_polyhull1-polyhull1.obj: polyhull1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhull1-polyhull1.obj -MD -MP -MF "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo" -c -o nnc_polyhull1-polyhull1.obj `if test -f 'polyhull1.cc'; then $(CYGPATH_W) 'polyhull1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhull1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo" "$(DEPDIR)/nnc_polyhull1-polyhull1.Po"; else rm -f "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='polyhull1.cc' object='nnc_polyhull1-polyhull1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhull1-polyhull1.obj `if test -f 'polyhull1.cc'; then $(CYGPATH_W) 'polyhull1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhull1.cc'; fi`
+
+nnc_randphull1-randphull1.o: randphull1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull1-randphull1.o -MD -MP -MF "$(DEPDIR)/nnc_randphull1-randphull1.Tpo" -c -o nnc_randphull1-randphull1.o `test -f 'randphull1.cc' || echo '$(srcdir)/'`randphull1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_randphull1-randphull1.Tpo" "$(DEPDIR)/nnc_randphull1-randphull1.Po"; else rm -f "$(DEPDIR)/nnc_randphull1-randphull1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='randphull1.cc' object='nnc_randphull1-randphull1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull1-randphull1.o `test -f 'randphull1.cc' || echo '$(srcdir)/'`randphull1.cc
+
+nnc_randphull1-randphull1.obj: randphull1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull1-randphull1.obj -MD -MP -MF "$(DEPDIR)/nnc_randphull1-randphull1.Tpo" -c -o nnc_randphull1-randphull1.obj `if test -f 'randphull1.cc'; then $(CYGPATH_W) 'randphull1.cc'; else $(CYGPATH_W) '$(srcdir)/randphull1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_randphull1-randphull1.Tpo" "$(DEPDIR)/nnc_randphull1-randphull1.Po"; else rm -f "$(DEPDIR)/nnc_randphull1-randphull1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='randphull1.cc' object='nnc_randphull1-randphull1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull1-randphull1.obj `if test -f 'randphull1.cc'; then $(CYGPATH_W) 'randphull1.cc'; else $(CYGPATH_W) '$(srcdir)/randphull1.cc'; fi`
+
+nnc_randphull2-randphull2.o: randphull2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull2_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull2-randphull2.o -MD -MP -MF "$(DEPDIR)/nnc_randphull2-randphull2.Tpo" -c -o nnc_randphull2-randphull2.o `test -f 'randphull2.cc' || echo '$(srcdir)/'`randphull2.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_randphull2-randphull2.Tpo" "$(DEPDIR)/nnc_randphull2-randphull2.Po"; else rm -f "$(DEPDIR)/nnc_randphull2-randphull2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='randphull2.cc' object='nnc_randphull2-randphull2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull2-randphull2.o `test -f 'randphull2.cc' || echo '$(srcdir)/'`randphull2.cc
+
+nnc_randphull2-randphull2.obj: randphull2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull2_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull2-randphull2.obj -MD -MP -MF "$(DEPDIR)/nnc_randphull2-randphull2.Tpo" -c -o nnc_randphull2-randphull2.obj `if test -f 'randphull2.cc'; then $(CYGPATH_W) 'randphull2.cc'; else $(CYGPATH_W) '$(srcdir)/randphull2.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_randphull2-randphull2.Tpo" "$(DEPDIR)/nnc_randphull2-randphull2.Po"; else rm -f "$(DEPDIR)/nnc_randphull2-randphull2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='randphull2.cc' object='nnc_randphull2-randphull2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull2-randphull2.obj `if test -f 'randphull2.cc'; then $(CYGPATH_W) 'randphull2.cc'; else $(CYGPATH_W) '$(srcdir)/randphull2.cc'; fi`
+
+nnc_relations1-relations1.o: relations1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations1-relations1.o -MD -MP -MF "$(DEPDIR)/nnc_relations1-relations1.Tpo" -c -o nnc_relations1-relations1.o `test -f 'relations1.cc' || echo '$(srcdir)/'`relations1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_relations1-relations1.Tpo" "$(DEPDIR)/nnc_relations1-relations1.Po"; else rm -f "$(DEPDIR)/nnc_relations1-relations1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='relations1.cc' object='nnc_relations1-relations1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations1-relations1.o `test -f 'relations1.cc' || echo '$(srcdir)/'`relations1.cc
+
+nnc_relations1-relations1.obj: relations1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations1-relations1.obj -MD -MP -MF "$(DEPDIR)/nnc_relations1-relations1.Tpo" -c -o nnc_relations1-relations1.obj `if test -f 'relations1.cc'; then $(CYGPATH_W) 'relations1.cc'; else $(CYGPATH_W) '$(srcdir)/relations1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_relations1-relations1.Tpo" "$(DEPDIR)/nnc_relations1-relations1.Po"; else rm -f "$(DEPDIR)/nnc_relations1-relations1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='relations1.cc' object='nnc_relations1-relations1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations1-relations1.obj `if test -f 'relations1.cc'; then $(CYGPATH_W) 'relations1.cc'; else $(CYGPATH_W) '$(srcdir)/relations1.cc'; fi`
+
+nnc_relations2-relations2.o: relations2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations2-relations2.o -MD -MP -MF "$(DEPDIR)/nnc_relations2-relations2.Tpo" -c -o nnc_relations2-relations2.o `test -f 'relations2.cc' || echo '$(srcdir)/'`relations2.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_relations2-relations2.Tpo" "$(DEPDIR)/nnc_relations2-relations2.Po"; else rm -f "$(DEPDIR)/nnc_relations2-relations2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='relations2.cc' object='nnc_relations2-relations2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations2-relations2.o `test -f 'relations2.cc' || echo '$(srcdir)/'`relations2.cc
+
+nnc_relations2-relations2.obj: relations2.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations2-relations2.obj -MD -MP -MF "$(DEPDIR)/nnc_relations2-relations2.Tpo" -c -o nnc_relations2-relations2.obj `if test -f 'relations2.cc'; then $(CYGPATH_W) 'relations2.cc'; else $(CYGPATH_W) '$(srcdir)/relations2.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_relations2-relations2.Tpo" "$(DEPDIR)/nnc_relations2-relations2.Po"; else rm -f "$(DEPDIR)/nnc_relations2-relations2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='relations2.cc' object='nnc_relations2-relations2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations2-relations2.obj `if test -f 'relations2.cc'; then $(CYGPATH_W) 'relations2.cc'; else $(CYGPATH_W) '$(srcdir)/relations2.cc'; fi`
+
+nnc_removespacedims1-removespacedims1.o: removespacedims1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_removespacedims1-removespacedims1.o -MD -MP -MF "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo" -c -o nnc_removespacedims1-removespacedims1.o `test -f 'removespacedims1.cc' || echo '$(srcdir)/'`removespacedims1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo" "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Po"; else rm -f "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='removespacedims1.cc' object='nnc_removespacedims1-removespacedims1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_removespacedims1-removespacedims1.o `test -f 'removespacedims1.cc' || echo '$(srcdir)/'`removespacedims1.cc
+
+nnc_removespacedims1-removespacedims1.obj: removespacedims1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_removespacedims1-removespacedims1.obj -MD -MP -MF "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo" -c -o nnc_removespacedims1-removespacedims1.obj `if test -f 'removespacedims1.cc'; then $(CYGPATH_W) 'removespacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/removespacedims1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo" "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Po"; else rm -f "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='removespacedims1.cc' object='nnc_removespacedims1-removespacedims1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_removespacedims1-removespacedims1.obj `if test -f 'removespacedims1.cc'; then $(CYGPATH_W) 'removespacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/removespacedims1.cc'; fi`
+
+nnc_smm1-smm1.o: smm1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -MT nnc_smm1-smm1.o -MD -MP -MF "$(DEPDIR)/nnc_smm1-smm1.Tpo" -c -o nnc_smm1-smm1.o `test -f 'smm1.cc' || echo '$(srcdir)/'`smm1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_smm1-smm1.Tpo" "$(DEPDIR)/nnc_smm1-smm1.Po"; else rm -f "$(DEPDIR)/nnc_smm1-smm1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='smm1.cc' object='nnc_smm1-smm1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_smm1-smm1.o `test -f 'smm1.cc' || echo '$(srcdir)/'`smm1.cc
+
+nnc_smm1-smm1.obj: smm1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -MT nnc_smm1-smm1.obj -MD -MP -MF "$(DEPDIR)/nnc_smm1-smm1.Tpo" -c -o nnc_smm1-smm1.obj `if test -f 'smm1.cc'; then $(CYGPATH_W) 'smm1.cc'; else $(CYGPATH_W) '$(srcdir)/smm1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_smm1-smm1.Tpo" "$(DEPDIR)/nnc_smm1-smm1.Po"; else rm -f "$(DEPDIR)/nnc_smm1-smm1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='smm1.cc' object='nnc_smm1-smm1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_smm1-smm1.obj `if test -f 'smm1.cc'; then $(CYGPATH_W) 'smm1.cc'; else $(CYGPATH_W) '$(srcdir)/smm1.cc'; fi`
+
+nnc_timeelapse1-timeelapse1.o: timeelapse1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -MT nnc_timeelapse1-timeelapse1.o -MD -MP -MF "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo" -c -o nnc_timeelapse1-timeelapse1.o `test -f 'timeelapse1.cc' || echo '$(srcdir)/'`timeelapse1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo" "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Po"; else rm -f "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='timeelapse1.cc' object='nnc_timeelapse1-timeelapse1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_timeelapse1-timeelapse1.o `test -f 'timeelapse1.cc' || echo '$(srcdir)/'`timeelapse1.cc
+
+nnc_timeelapse1-timeelapse1.obj: timeelapse1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -MT nnc_timeelapse1-timeelapse1.obj -MD -MP -MF "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo" -c -o nnc_timeelapse1-timeelapse1.obj `if test -f 'timeelapse1.cc'; then $(CYGPATH_W) 'timeelapse1.cc'; else $(CYGPATH_W) '$(srcdir)/timeelapse1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo" "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Po"; else rm -f "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='timeelapse1.cc' object='nnc_timeelapse1-timeelapse1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_timeelapse1-timeelapse1.obj `if test -f 'timeelapse1.cc'; then $(CYGPATH_W) 'timeelapse1.cc'; else $(CYGPATH_W) '$(srcdir)/timeelapse1.cc'; fi`
+
+nnc_universe1-universe1.o: universe1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -MT nnc_universe1-universe1.o -MD -MP -MF "$(DEPDIR)/nnc_universe1-universe1.Tpo" -c -o nnc_universe1-universe1.o `test -f 'universe1.cc' || echo '$(srcdir)/'`universe1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_universe1-universe1.Tpo" "$(DEPDIR)/nnc_universe1-universe1.Po"; else rm -f "$(DEPDIR)/nnc_universe1-universe1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='universe1.cc' object='nnc_universe1-universe1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_universe1-universe1.o `test -f 'universe1.cc' || echo '$(srcdir)/'`universe1.cc
+
+nnc_universe1-universe1.obj: universe1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -MT nnc_universe1-universe1.obj -MD -MP -MF "$(DEPDIR)/nnc_universe1-universe1.Tpo" -c -o nnc_universe1-universe1.obj `if test -f 'universe1.cc'; then $(CYGPATH_W) 'universe1.cc'; else $(CYGPATH_W) '$(srcdir)/universe1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_universe1-universe1.Tpo" "$(DEPDIR)/nnc_universe1-universe1.Po"; else rm -f "$(DEPDIR)/nnc_universe1-universe1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='universe1.cc' object='nnc_universe1-universe1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_universe1-universe1.obj `if test -f 'universe1.cc'; then $(CYGPATH_W) 'universe1.cc'; else $(CYGPATH_W) '$(srcdir)/universe1.cc'; fi`
+
+nnc_writepolyhedron1-writepolyhedron1.o: writepolyhedron1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_writepolyhedron1-writepolyhedron1.o -MD -MP -MF "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo" -c -o nnc_writepolyhedron1-writepolyhedron1.o `test -f 'writepolyhedron1.cc' || echo '$(srcdir)/'`writepolyhedron1.cc; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo" "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po"; else rm -f "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='writepolyhedron1.cc' object='nnc_writepolyhedron1-writepolyhedron1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_writepolyhedron1-writepolyhedron1.o `test -f 'writepolyhedron1.cc' || echo '$(srcdir)/'`writepolyhedron1.cc
+
+nnc_writepolyhedron1-writepolyhedron1.obj: writepolyhedron1.cc
+ at am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_writepolyhedron1-writepolyhedron1.obj -MD -MP -MF "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo" -c -o nnc_writepolyhedron1-writepolyhedron1.obj `if test -f 'writepolyhedron1.cc'; then $(CYGPATH_W) 'writepolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/writepolyhedron1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo" "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po"; else rm -f "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='writepolyhedron1.cc' object='nnc_writepolyhedron1-writepolyhedron1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_writepolyhedron1-writepolyhedron1.obj `if test -f 'writepolyhedron1.cc'; then $(CYGPATH_W) 'writepolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/writepolyhedron1.cc'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	srcdir=$(srcdir); export srcdir; \
+	list='$(TESTS)'; \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *" $$tst "*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		echo "XPASS: $$tst"; \
+	      ;; \
+	      *) \
+		echo "PASS: $$tst"; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *" $$tst "*) \
+		xfail=`expr $$xfail + 1`; \
+		echo "XFAIL: $$tst"; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		echo "FAIL: $$tst"; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      echo "SKIP: $$tst"; \
+	    fi; \
+	  done; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="All $$all tests passed"; \
+	    else \
+	      banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all tests failed"; \
+	    else \
+	      banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    skipped="($$skip tests were not run)"; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  echo "$$dashes"; \
+	  echo "$$banner"; \
+	  test -z "$$skipped" || echo "$$skipped"; \
+	  test -z "$$report" || echo "$$report"; \
+	  echo "$$dashes"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Polyhedron/README b/tests/Polyhedron/README
new file mode 100644
index 0000000..9568d6c
--- /dev/null
+++ b/tests/Polyhedron/README
@@ -0,0 +1,115 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+See below for the copying conditions.
+
+How To Use the Test Programs (If You Really Want To Use Them)
+=============================================================
+
+The programs in this directory are part of the test suite of the Parma
+Polyhedra Library (PPL).  They have various origins:
+
+1) some have been written to test the expressivity of the library;
+2) some have been written to reproduce bugs that have now been fixed;
+3) some have been written in order to increase the proportion of the
+   library's code exercised by test suite.
+
+Regardless of their origin, they are only used for the regression
+testing of the library.  For this reason, we do not pay much attention
+to them; we simply keep adding new tests to the test suite and, once
+in, they stay there forever.  Despite any defects, they serve this
+purpose well.
+
+On the other hand, in order to get an idea of how to use the PPL,
+several new users have found it convenient to take one of these test
+programs, change it a bit, and then try to compile it.  If you want to
+do something similar, here is some advice that may help you get
+something working and completely self-contained in a matter of
+minutes:
+
+a) Replace the line
+
+     #include "ppl_test.hh"
+
+   with
+
+     #include <ppl.hh>
+
+b) Erase the line reading
+
+     set_handlers();
+
+c) Either remove the `TRY' and `CATCH' macro invocations from the program
+   or substitute `TRY' with `try' and `CATCH' with something like
+
+     catch (const std::exception& e) {
+       cerr << "std::exception caught: "
+            << e.what() << " (type == " << typeid(e).name() << ")"
+            << endl;
+       exit(1);
+     }
+     catch (...) {
+       cerr << "unknown exception caught"
+            << endl;
+       exit(1);
+     }
+
+d) If you want to print something make sure the expansion of the `NOISY'
+   macro evaluates to true; add the line
+
+     using namespace Parma_Polyhedra_Library::IO_Operators;
+
+   just after the other two using directives of the program; and then
+   use the PPL output facilities directly.  For instance, the effect of a
+   line like
+
+     print_constraints(ph, "*** ph ***");
+
+   can be obtained, more or less, by replacing it with
+
+     cout << "*** ph ***" << endl << ph.constraints() << endl;
+
+   Similarly, a line of the form
+
+     print_generators(ph, "*** ph ***");
+
+   can be replaced by
+
+     cout << "*** ph ***" << endl << ph.generators() << endl;
+
+e) Compile the program with a command like
+
+     g++ mytest.cc -o mytest -lppl -lgmpxx -lgmp
+
+f) Run `mytest' and enjoy!
+
+
+--------
+
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files called `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files are called `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ .
diff --git a/tests/Polyhedron/addcongruence1.cc b/tests/Polyhedron/addcongruence1.cc
new file mode 100644
index 0000000..027a9f4
--- /dev/null
+++ b/tests/Polyhedron/addcongruence1.cc
@@ -0,0 +1,129 @@
+/* Test Polyhedron::add_congruence().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_congruence(A %= 0);
+  ph.add_congruence((B == 5) / 0);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B == 5);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+
+  ph.add_congruence((A + B %= 3) / 4);
+  ph.add_congruence((A == -1) / 0);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == -1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.add_congruence((A - B == 0) / 0);
+  ph.add_congruence((A + B %= 1) / 2);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph after adding congruences ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  C_Polyhedron ph(0);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(0);
+
+  ph.add_congruence((Linear_Expression::zero() %= 0) / 2);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph after adding congruence ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  C_Polyhedron ph(0);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.add_congruence((Linear_Expression::zero() %= 1) / 0);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph after adding congruence ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/addcongruences1.cc b/tests/Polyhedron/addcongruences1.cc
new file mode 100644
index 0000000..677a9fc
--- /dev/null
+++ b/tests/Polyhedron/addcongruences1.cc
@@ -0,0 +1,166 @@
+/* Test Polyhedron::add_congruences().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(x));
+  gs.insert(ray(x + y));
+
+  Congruence_System cgs;
+  cgs.insert(x %= 3);
+  cgs.insert(y == 3);
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph.add_congruences(cgs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y == 3);
+  known_result.add_constraint(x - y >= 0);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** After add_congruences ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  Congruence_System cgs;
+  cgs.insert(A - B %= 0);
+  cgs.insert(B == 7);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.add_congruences(cgs);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  Constraint_System cs;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.add_constraints(cs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x + y >= 0);
+  C_Polyhedron ph(cs);
+
+  print_constraints(ph, "*** ph ***");
+
+  Linear_Expression e(1);
+  Congruence_System cgs;
+  cgs.insert(e == 0);
+
+  ph.add_congruences(cgs);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool test05() {
+  C_Polyhedron ph;
+  ph.add_constraint(Linear_Expression(-2) >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  Congruence_System cgs;
+  cgs.insert(Linear_Expression(-1) %= 0);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  ph.add_congruences(cgs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** After add_constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
+
diff --git a/tests/Polyhedron/addconstraint1.cc b/tests/Polyhedron/addconstraint1.cc
new file mode 100644
index 0000000..2d3c83c
--- /dev/null
+++ b/tests/Polyhedron/addconstraint1.cc
@@ -0,0 +1,106 @@
+/* Test Polyhedron::add_constraint().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B == 5);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2);
+  for (Constraint_System::const_iterator i = ph1.constraints().begin(),
+	 cs_end = ph1.constraints().end(); i != cs_end; ++i)
+    ph2.add_constraint(*i);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.add_constraint(A == B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.add_constraint(A == B) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 2);
+  ph.add_constraint(A >= -1);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.add_constraint_and_minimize(B >= 1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph,
+		    "*** After ph.add_constraint_and_minimize(B >= 1) ***");
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/addconstraints1.cc b/tests/Polyhedron/addconstraints1.cc
new file mode 100644
index 0000000..7354187
--- /dev/null
+++ b/tests/Polyhedron/addconstraints1.cc
@@ -0,0 +1,363 @@
+/* Test Polyhedron::add_constrains().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // For const-correctness, making a copy is required.
+  Constraint_System cs1 = Constraint_System::zero_dim_empty();
+  C_Polyhedron ph1;
+  ph1.add_constraints_and_minimize(cs1);
+
+  Constraint_System cs2;
+  cs2.insert(Linear_Expression::zero() >= 7);
+  C_Polyhedron ph2;
+  ph2.add_constraints_and_minimize(cs2);
+
+  Constraint_System cs3;
+  cs3.insert(Linear_Expression::zero() >= -3);
+  C_Polyhedron ph3;
+  ph3.add_constraints_and_minimize(cs3);
+
+  C_Polyhedron empty_result(0, EMPTY);
+  C_Polyhedron univ_result;
+
+  bool ok = (ph1 == empty_result
+	     && ph2 == empty_result
+	     && ph3 == univ_result);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(ph3, "*** ph3 ***");
+  print_constraints(empty_result, "*** empty_result ***");
+  print_constraints(univ_result, "*** univ_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  Constraint_System cs;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.add_constraints(cs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x + y >= 0);
+  C_Polyhedron ph(cs1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Linear_Expression e(1);
+  Constraint_System cs2;
+  cs2.insert(e == 0);
+  ph.add_constraints(cs2);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.add_constraints(cs2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(x >= 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Constraint_System cs;
+
+  C_Polyhedron computed_result(ph);
+
+  computed_result.add_constraints_and_minimize(cs);
+
+  bool ok = (computed_result == ph);
+
+  print_constraints(computed_result,
+		    "*** After add_constraints_and_minimize ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+
+  C_Polyhedron ph(3, EMPTY);
+
+  Constraint_System cs;
+  cs.insert(x >= 4);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.add_constraints_and_minimize(cs);
+
+  C_Polyhedron computed_result(3, EMPTY);
+
+  bool ok = (ph == computed_result);
+
+  print_constraints(ph, "*** After add_constraints_and_minimize(cs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+
+  Constraint_System cs;
+  cs.insert(x >= 4);
+  cs.insert(x - y >= 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.add_constraints_and_minimize(cs);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(x >= 4);
+  known_result.add_constraint(x - y >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After add_constraints_and_minimize(cs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(y >= 1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y <= 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.add_constraints_and_minimize(cs);
+
+  C_Polyhedron known_result(3, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After add_constraints_and_minimize(cs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  C_Polyhedron ph;
+  ph.add_constraint(Linear_Expression(-2) >= 0);
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(-1) >= 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.add_constraints(cs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** After add_constraints ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(x));
+  gs.insert(ray(x + y));
+
+  C_Polyhedron ph(gs);
+
+  Constraint_System cs;
+  cs.insert(x <= 3);
+
+  print_generators(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.add_constraints(cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x - y >= 0);
+  known_result.add_constraint(x <= 3);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** After add_constraints ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  Constraint_System cs;
+  cs.insert(A - B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.add_constraints(cs);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.add_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  C_Polyhedron copy_ph(ph);
+
+  Constraint_System cs1;
+  cs1.insert(A == 0);
+  cs1.insert(B >= 0);
+  Constraint_System cs2(cs1);
+
+  ph.add_constraints(cs1);
+  copy_ph.add_constraints_and_minimize(cs2);
+
+  bool ok = (ph == copy_ph);
+
+  print_constraints(ph, "*** After ph.add_constraints(cs1) ***");
+  print_constraints(ph,
+		    "*** After copy_ph.add_constraints_and_minimize(cs2) ***");
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(line(A + B));
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point());
+  ph2.constraints();
+  ph2.add_generator(ray(A));
+  ph2.add_generator(ray(B));
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  Constraint_System cs1 = ph2.constraints();
+  Constraint_System cs2 = ph2.constraints();
+
+  ph1.add_constraints(cs1);
+  copy_ph1.add_constraints_and_minimize(cs2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_constraints(ph1, "*** After add_constraints_assign ***");
+  print_constraints(copy_ph1,
+		    "*** After add_constraints_and_minimize ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/addconstraints2.cc b/tests/Polyhedron/addconstraints2.cc
new file mode 100644
index 0000000..1203f93
--- /dev/null
+++ b/tests/Polyhedron/addconstraints2.cc
@@ -0,0 +1,93 @@
+/* Test Polyhedron::add_constrains().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A - B >= 0);
+  ph1.add_constraint(B >= 0);
+
+  NNC_Polyhedron ph2(1);
+  ph2.add_constraint(A == 0);
+
+  Constraint_System cs = ph2.constraints();
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.add_constraints_and_minimize(cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.add_constraints_and_minimize(cs) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+
+  Constraint_System cs = ph1.constraints();
+
+  C_Polyhedron ph2(3);
+  ph2.add_constraint(A <= 2);
+
+  print_constraints(cs, "*** cs ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph2.add_constraints_and_minimize(cs);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerator1.cc b/tests/Polyhedron/addgenerator1.cc
new file mode 100644
index 0000000..66193f5
--- /dev/null
+++ b/tests/Polyhedron/addgenerator1.cc
@@ -0,0 +1,101 @@
+/* Test Polyhedron::add_generator().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A + 2*B));
+  gs.insert(point(A + B));
+  gs.insert(point(2*A + 2*B));
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.add_generator_and_minimize(ray(A));
+
+  Generator_System known_gs;
+  known_gs.insert(point());
+  known_gs.insert(point(A + 2*B));
+  known_gs.insert(ray(A));
+  C_Polyhedron known_result(known_gs);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph,
+		    "*** After ph.add_generator_and_minimize(ray(A)) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph_empty(2, EMPTY);
+  Generator_System gs1 = ph_empty.generators();
+  assert(gs1.space_dimension() == ph_empty.space_dimension());
+
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  C_Polyhedron ph1(gs1);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  C_Polyhedron known_result1(2);
+  known_result1.add_constraint(A >= 0);
+  known_result1.add_constraint(B == 0);
+
+  Generator_System gs2 = ph_empty.generators();
+  assert(gs2.space_dimension() == ph_empty.space_dimension());
+
+  gs2.insert(point(C));
+  gs2.insert(line(C));
+  gs2.insert(ray(A));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result2(3);
+  known_result2.add_constraint(A >= 0);
+  known_result2.add_constraint(B == 0);
+
+  bool ok = (ph1 == known_result1 && ph2 == known_result2);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerator2.cc b/tests/Polyhedron/addgenerator2.cc
new file mode 100644
index 0000000..54ff899
--- /dev/null
+++ b/tests/Polyhedron/addgenerator2.cc
@@ -0,0 +1,129 @@
+/* Test Polyhedron::add_generator().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(line(B));
+  NNC_Polyhedron ph1(gs);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point(-A));
+
+  print_generators(ph2, "*** ph2 ***");
+
+  const Generator_System& gs1 = ph1.minimized_generators();
+  for (Generator_System::const_iterator i = gs1.begin(),
+	 gs1_end = gs1.end(); i != gs1_end; ++i)
+    ph2.add_generator(*i);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= -1);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2add_generator(*i) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(A + B));
+  NNC_Polyhedron ph1(gs);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  const Generator_System& gs1 = ph1.minimized_generators();
+  for (Generator_System::const_iterator i = gs1.begin(),
+	 gs1_end = gs1.end(); i != gs1_end; ++i)
+    ph2.add_generator(*i);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B == 1);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.add_generator(*i) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(closure_point(3*A, 2));
+  gs.insert(point(7*A, 4));
+  gs.insert(ray(A - B));
+
+  print_generators(gs, "*** gs ***");
+
+  C_Polyhedron ph(2, EMPTY);
+
+  for (Generator_System::const_iterator i = gs.begin(),
+	 gs_end = gs.end(); i != gs_end; ++i)
+    if (!(*i).is_closure_point())
+      ph.add_generator(*i);
+
+  Generator_System gs_known;
+  gs_known.insert(point(7*A + 0*B, 4));
+  gs_known.insert(ray(A - B));
+  C_Polyhedron known_result(gs_known);
+
+  bool ok = (ph == known_result);
+
+  print_generators(gs, "*** gs ***");
+  print_generators(ph, "*** ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerators1.cc b/tests/Polyhedron/addgenerators1.cc
new file mode 100644
index 0000000..2c6e813
--- /dev/null
+++ b/tests/Polyhedron/addgenerators1.cc
@@ -0,0 +1,336 @@
+/* Test Polyhedron::add_generators().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(point(x));
+  gs1.insert(point(y));
+  gs1.insert(line(x));
+  C_Polyhedron ph1(gs1);
+
+  print_generators(ph1, "*** before ***");
+
+  Generator_System gs2;
+  gs2.insert(point());
+
+  ph1.add_generators_and_minimize(gs2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(point(y));
+  known_result.add_generator(line(x));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** add_generators_and_minimize ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_generators(ph1, "*** before ***");
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(line(x));
+
+  ph1.add_generators(gs);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(line(x));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** add_generators ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  C_Polyhedron ph;
+  ph.add_generator(point());
+
+  print_generators(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(point());
+
+  print_generators(gs, "*** gs ***");
+
+  ph.add_generators_and_minimize(gs);
+
+  C_Polyhedron known_result;
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** After add_generators ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 1);
+  ph.add_constraint(x <= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(ray(x));
+  gs.insert(point());
+
+  print_generators(gs, "*** gs ***");
+
+  ph.add_generators(gs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y == 0);
+  known_result.add_constraint(x >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** After add_generators ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(x <= -1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(ray(x + y));
+  gs.insert(point());
+
+  print_generators(gs, "--- gs ---");
+
+  ph.add_generators_and_minimize(gs);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point());
+  gs_known_result.insert(ray(x + y));
+  C_Polyhedron known_result(gs_known_result);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** After add_generators_and_minimize ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(ray(x + y));
+  gs1.insert(point());
+
+  C_Polyhedron ph(gs1);
+
+  print_generators(ph, "*** ph ***");
+
+  Generator_System gs2;
+  gs2.insert(ray(x));
+  gs2.insert(point());
+
+  print_generators(gs2, "--- gs2 ---");
+
+  ph.add_generators(gs2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(ray(x));
+  known_result.add_generator(ray(x + y));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** After add_generators ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 3);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  Generator_System gs;
+  ph.add_generators_and_minimize(gs);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** After ph .add_generators_and_minimize(gs)***");
+
+  return ok;
+}
+
+bool
+test08() {
+  C_Polyhedron ph(0, EMPTY);
+
+  print_generators(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(point());
+
+  print_generators(gs, "*** gs ***");
+
+  ph.add_generators(gs);
+
+  C_Polyhedron known_result;
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** After ph.add_generators(gs); ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  C_Polyhedron copy_ph(ph);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-A));
+  Generator_System gs2(gs1);
+
+  ph.add_generators(gs1);
+  copy_ph.add_generators_and_minimize(gs2);
+
+  bool ok = (ph == copy_ph);
+
+  print_generators(ph, "*** After ph.add_generators(gs1) ***");
+  print_generators(ph,
+		   "*** After copy_ph.add_generators_and_minimize(gs2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(line(A + B));
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point());
+  ph2.constraints();
+  ph2.add_generator(ray(A));
+  ph2.add_generator(ray(B));
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  Generator_System gs1 = ph2.generators();
+  Generator_System gs2 = ph2.generators();
+
+  ph1.add_generators(gs1);
+  copy_ph1.add_generators_and_minimize(gs2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_generators(ph1, "*** After add_generators_assign ***");
+  print_generators(copy_ph1,
+		    "*** After add_generators_and_minimize ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  C_Polyhedron ph(1, EMPTY);
+  Generator_System gs(point());
+
+  print_generators(gs, "*** gs ***");
+
+  ph.add_generators(gs);
+
+  C_Polyhedron known_result(1, EMPTY);
+  known_result.add_generator(point());
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** add_generators_and_minimize ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerators2.cc b/tests/Polyhedron/addgenerators2.cc
new file mode 100644
index 0000000..cdc521d
--- /dev/null
+++ b/tests/Polyhedron/addgenerators2.cc
@@ -0,0 +1,137 @@
+/* Test Polyhedron::add_generators().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(closure_point());
+  gs1.insert(closure_point(4*x));
+  gs1.insert(closure_point(4*y));
+  gs1.insert(closure_point(4*x + 4*y));
+  gs1.insert(point(2*x));
+  gs1.insert(point(4*x + y));
+  gs1.insert(point(x + 4*y));
+  gs1.insert(point(3*y));
+
+  NNC_Polyhedron ph(gs1);
+
+  print_generators(ph, "*** ph ***");
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(point(4*x));
+  gs2.insert(point(4*y));
+  gs2.insert(point(4*x + 4*y));
+
+  ph.add_generators_and_minimize(gs2);
+
+  Generator_System gs3;
+  gs3.insert(point());
+  gs3.insert(point(4*x));
+  gs3.insert(point(4*y));
+  gs3.insert(point(4*x + 4*y));
+
+  NNC_Polyhedron known_result(gs3);
+
+  C_Polyhedron closed_ph(ph);
+  C_Polyhedron closed_known_result(known_result);
+
+  bool ok = (ph == known_result
+	     && closed_ph == closed_known_result);
+
+  print_generators(ph, "*** After add_generators_and_minimize(gs) ***");
+  print_generators(closed_ph, "*** closed_ph ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  NNC_Polyhedron ph1(3, EMPTY);
+
+  ph1.add_generator(point(x));
+
+  Generator_System gs;
+  gs.insert(point(1*x + 0*y + 0*z));
+  NNC_Polyhedron known_result(gs);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point(A + B));
+  gs1.insert(closure_point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(B));
+  NNC_Polyhedron ph1(gs1);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.topological_closure_assign();
+  Generator_System gs2 = ph1.minimized_generators();
+
+  print_generators(gs2, "*** gs2 ***");
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generators_and_minimize(gs2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/addspacedims1.cc b/tests/Polyhedron/addspacedims1.cc
new file mode 100644
index 0000000..1baf500
--- /dev/null
+++ b/tests/Polyhedron/addspacedims1.cc
@@ -0,0 +1,201 @@
+/* Test Polyhedron::add_space_dimensions_and_project()
+   and  Polyhedron::add_space_dimensions_and_embed().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(x));
+  gs.insert(point(y));
+  gs.insert(point(x + y));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.add_space_dimensions_and_project(1);
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(point(x));
+  known_result.add_generator(point(y));
+  known_result.add_generator(point(x + y));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** After add_space_dimensions_and_project ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph(3, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron computed_result1(ph);
+  C_Polyhedron computed_result2(ph);
+
+  computed_result1.add_space_dimensions_and_project(4);
+  computed_result2.add_space_dimensions_and_embed(4);
+
+  C_Polyhedron known_result(7, EMPTY);
+
+  bool ok = (computed_result1 == known_result
+	     && computed_result2 == known_result);
+
+  print_constraints(computed_result1, "*** computed_result1 ***");
+  print_constraints(computed_result2, "*** computed_result2 ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable u(3);
+  Variable v(4);
+  Variable w(5);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(x + y));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  Constraint_System cs = ph.constraints();
+
+  ph.add_space_dimensions_and_embed(2);
+
+  print_generators(ph, "*** After add_space_dimensions_and_embed(2) ***");
+
+  ph.add_space_dimensions_and_embed(2);
+
+  C_Polyhedron known_result(6, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(ray(x + y));
+  known_result.add_generator(line(z));
+  known_result.add_generator(line(u));
+  known_result.add_generator(line(v));
+  known_result.add_generator(line(w));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  C_Polyhedron ph1;
+
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.add_space_dimensions_and_project(3);
+
+  print_generators(ph1, "*** After add_space_dimensions_and_project(3) ***");
+
+  C_Polyhedron ph2;
+  Constraint_System cs = ph2.constraints();
+
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.add_space_dimensions_and_project(3);
+
+  bool ok = (ph1 == ph2);
+
+  print_generators(ph2, "*** After add_space_dimensions_and_project(3) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable C(2);
+
+  C_Polyhedron ph(2);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.add_space_dimensions_and_project(1);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(C == 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph,
+		    "*** After ph.add_space_dimensions_and_project(1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+
+  C_Polyhedron ph2(ph1);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.add_space_dimensions_and_embed(0);
+  ph2.add_space_dimensions_and_project(0);
+
+  bool ok = (ph1 == ph2);
+
+  print_constraints(ph1,
+		    "*** After ph1.add_space_dimensions_and_embed(0) ***");
+  print_constraints(ph2,
+		    "*** After ph2.add_space_dimensions_and_project(0) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/addspacedims2.cc b/tests/Polyhedron/addspacedims2.cc
new file mode 100644
index 0000000..1dc5cf6
--- /dev/null
+++ b/tests/Polyhedron/addspacedims2.cc
@@ -0,0 +1,248 @@
+/* Test Polyhedron::add_space_dimensions_and_project()
+   and  Polyhedron::add_space_dimensions_and_embed().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Constraint_System cs;
+  cs.insert(x > 2);
+  cs.insert(y > 2);
+  cs.insert(x < 6);
+  cs.insert(y < 6);
+
+  NNC_Polyhedron ph(cs);
+
+  ph.generators();
+
+  print_constraints(ph, "*** ph ***");
+  print_generators(ph, "*** ph ***");
+
+  ph.add_space_dimensions_and_project(2);
+
+  NNC_Polyhedron known_result(4);
+  known_result.add_constraint(z == 0);
+  known_result.add_constraint(w == 0);
+  known_result.add_constraint(x > 2);
+  known_result.add_constraint(y > 2);
+  known_result.add_constraint(x < 6);
+  known_result.add_constraint(y < 6);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After add_space_dimensions_and_project ***");
+  print_generators(ph, "*** After add_space_dimensions_and_project ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+
+  NNC_Polyhedron ph1(1);
+
+  ph1.add_constraint(x > 1);
+  ph1.add_constraint(x < 5);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.add_space_dimensions_and_embed(2);
+
+  Generator_System gs;
+  gs.insert(point(2*x));
+  gs.insert(closure_point(x));
+  gs.insert(closure_point(5*x));
+
+  NNC_Polyhedron ph2(gs);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.add_space_dimensions_and_embed(2);
+
+  bool ok = (ph1 == ph2);
+
+  print_constraints(ph1, "*** ph1 after add_space_dimensions_and_embed ***");
+  print_generators(ph2, "*** ph2 after add_space_dimensions_and_embed ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+
+  NNC_Polyhedron ph1(1);
+
+  ph1.add_constraint(x > -3);
+  ph1.add_constraint(x < 3);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.add_space_dimensions_and_project(2);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(closure_point(-3*x));
+  gs.insert(closure_point(3*x));
+
+  NNC_Polyhedron ph2(gs);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.add_space_dimensions_and_project(2);
+
+  bool ok = (ph1 == ph2);
+
+  print_constraints(ph1, "*** ph1 after add_space_dimensions_and_embed ***");
+  print_generators(ph2, "*** ph2 after add_space_dimensions_and_embed ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  NNC_Polyhedron ph(1, EMPTY);
+  ph.add_generator(point(A));
+  ph.add_generator(closure_point());
+  ph.add_generator(closure_point(3*A));
+
+  print_generators(ph, "*** ph ***");
+
+  ph.add_space_dimensions_and_embed(1);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A > 0);
+  known_result.add_constraint(A < 3);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.add_space_dimensions_and_embed(1) ***");
+  print_generators(ph, "*** After ph.add_space_dimensions_and_embed(1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point(A));
+  NNC_Polyhedron ph(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(A));
+  gs2.insert(ray(A));
+  ph.add_generators(gs2);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.add_space_dimensions_and_embed(1);
+
+  Generator_System known_gs;
+  known_gs.insert(point(A));
+  known_gs.insert(line(B));
+  known_gs.insert(ray(A));
+  NNC_Polyhedron known_result(known_gs);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point(A + B));
+  gs1.insert(closure_point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(B));
+  NNC_Polyhedron ph1(gs1);
+
+  ph1.minimized_constraints();
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.add_space_dimensions_and_embed(1);
+
+  NNC_Polyhedron known_result(3);
+  known_result.add_constraint(A > 0);
+  known_result.add_constraint(B > 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+		    "*** After ph1.add_space_dimensions_and_embed(1) ***");
+  print_generators(ph1, "*** After ph1.add_space_dimensions_and_embed(1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+
+  // This will change the size of the rows, but not their capacity.
+  ph1.add_space_dimensions_and_embed(1);
+
+  // Assigning the polyhedron to itself:
+  // this used to recompute the row capacity based on row size,
+  // without actually increasing the capacity of the rows,
+  // leading to an inconsistent state.
+  ph1 = ph1;
+
+  return ph1.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/affineimage1.cc b/tests/Polyhedron/affineimage1.cc
new file mode 100644
index 0000000..8184a4a
--- /dev/null
+++ b/tests/Polyhedron/affineimage1.cc
@@ -0,0 +1,265 @@
+/* Test Polyhedron::affine_image().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(C == -2);
+  ph.add_constraint(A == 0);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.affine_image(B, A+2, 1);
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point(2*B - 2*C));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after ph.affine_image(B, A+2, 1) ---");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= B);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A <= 3);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.affine_image(A, A+B+1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A -2*B - 1 >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B <= 4);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "--- ph after ph.affine_image(A, A+B+1) ---");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(ray(B));
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.affine_image(A, A + 1, 2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(2*A >= 1);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** After ph.affine_image(A, A + 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A));
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.affine_image(A, B+2, -3);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(-2*A, 3));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after ph.affine_image(A, B+2, -3) ---");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 2);
+  ph.add_constraint(A <= 3);
+  ph.add_constraint(B >= 1);
+  ph.add_constraint(2*A >= B);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.affine_image(B, A-B+2, -3);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(2*A));
+  known_result.add_generator(point(2*A - B));
+  known_result.add_generator(point(9*A + B, 3));
+  known_result.add_generator(point(9*A - 4*B, 3));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after ph.affine_image(B, A-B+2, -3) ---");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.affine_image(A, 2*A + B + 1);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.affine_image(A, 2*A + B + 1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A));
+  gs.insert(point(B));
+  gs.insert(point(A + B));
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.affine_image(A, -A - 1, -1);
+
+  Generator_System known_gs;
+  known_gs.insert(point(A));
+  known_gs.insert(point(2*A));
+  known_gs.insert(point(A + B));
+  known_gs.insert(point(2*A + B));
+  C_Polyhedron known_result(known_gs);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** After ph.affine_image(A, -A - 1, -1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  C_Polyhedron copy_ph(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_image(A, A + 1);
+  copy_ph.affine_image(A, -A - 1, -1);
+
+  bool ok = (ph == copy_ph);
+
+  print_generators(ph, "*** After ph.affine_image(A, A + 1) ***");
+  print_generators(copy_ph,
+		   "*** After copy_ph.affine_image(A, -A - 1, -1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  C_Polyhedron copy_ph(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_image(B, A + 1);
+  copy_ph.affine_image(B, -A - 1, -1);
+
+  bool ok = (ph == copy_ph);
+
+  print_generators(ph, "*** After ph.affine_image(B, A + 1) ***");
+  print_generators(copy_ph,
+		   "*** After copy_ph.affine_image(B, -A - 1, -1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/affineimage2.cc b/tests/Polyhedron/affineimage2.cc
new file mode 100644
index 0000000..ffe4069
--- /dev/null
+++ b/tests/Polyhedron/affineimage2.cc
@@ -0,0 +1,74 @@
+/* Test Polyhedron::affine_image().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+aux_test01(std::ostream& s, const Variable& v) {
+  s << char('i' + v.id());
+}
+
+bool
+test01() {
+  Variable i(0);
+  Variable j(1);
+
+  // Install the alternate output function.
+  Variable::set_output_function(aux_test01);
+
+  NNC_Polyhedron p1(2);
+  p1.add_constraint(j == 0);
+  p1.add_constraint(i >= 0);
+
+  NNC_Polyhedron p2(2);
+  p2.add_constraint(j == 0);
+  p2.add_constraint(-i > 0);
+
+  print_constraints(p1, "*** p1 ***");
+  print_constraints(p2, "*** p2 ***");
+
+  p1.affine_image(j, i+2);
+  p2.affine_image(j, i);
+
+  print_constraints(p1, "*** p1.affine_image(j, i+2) ***");
+  print_constraints(p2, "*** p2.affine_image(j, i) ***");
+
+  p1.poly_hull_assign_and_minimize(p2);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(i - j >= -2);
+  known_result.add_constraint(-i + j >= 0);
+
+  bool ok = (p1 == known_result);
+
+  print_constraints(p1, "*** p1.poly_hull_assign_and_minimize(p2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/affinepreimage1.cc b/tests/Polyhedron/affinepreimage1.cc
new file mode 100644
index 0000000..91e6e23
--- /dev/null
+++ b/tests/Polyhedron/affinepreimage1.cc
@@ -0,0 +1,437 @@
+/* Test Polyhedron::affine_preimage().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A + B));
+  gs.insert(point(A));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "--- ph ---");
+
+  ph.affine_preimage(A, A+2);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point(-2*A));
+  gs_known_result.insert(ray(A + B));
+  gs_known_result.insert(point(-A));
+
+  C_Polyhedron known_result(gs_known_result);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after ph.affine_preimage(A, A+2) ---");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(A + C == 0);
+  ph.add_constraint(A + B >= 0);
+  ph.add_constraint(A + B - 1 >= 0);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.affine_preimage(A, A + B);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A + B + C == 0);
+  known_result.add_constraint(A + 2*B >= 0);
+  known_result.add_constraint(A + 2*B -1 >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "--- ph after ph.affine_preimage(A, A+B) ---");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A + B - 3 >= 0);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.affine_preimage(A, B+1);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(B));
+  known_result.add_generator(line(A));
+  known_result.add_generator(ray(B));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after ph.affine_preimage(A, B+2) ---");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point(x + y));
+  gs.insert(ray(x + 2*y));
+  gs.insert(ray(x));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.affine_preimage(x, y+1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After affine_preimage(x, y+1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 2);
+  ph.add_constraint(B >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(A, A + 1, 2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 3);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.affine_preimage(A, A + 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 2);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(B, A + 1, 2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 3);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.affine_preimage(B, A + 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(ray(A + B));
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.affine_preimage(B, A - B, -1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B <= 0);
+  known_result.add_constraint(2*A - B >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.affine_preimage(B, A - B, -1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(A, 2*A +B + 1);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.affine_preimage(A, 2*A + B + 1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A <= 1);
+  ph.add_constraint(B <= 1);
+
+  ph.affine_preimage(A, -A - 1, -1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A >= -1);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.affine_preimage(A, -A - 1, -1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A <= 1);
+  ph.add_constraint(B <= 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(B, -A - 1, -1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.affine_preimage(B, -A - 1, -1) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  C_Polyhedron copy_ph(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(A, A + 1);
+  copy_ph.affine_preimage(A, -A - 1, -1);
+
+  bool ok = (ph == copy_ph);
+
+  print_generators(ph, "*** After ph.affine_preimage(A, A + 1) ***");
+  print_generators(copy_ph,
+		   "*** After copy_ph.affine_preimage(A, -A - 1, -1) ***");
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  C_Polyhedron copy_ph(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(B, A + 1);
+  copy_ph.affine_preimage(B, -A - 1, -1);
+
+  bool ok = (ph == copy_ph);
+
+  print_generators(ph, "*** After ph.affine_preimage(B, A + 1) ***");
+  print_generators(copy_ph,
+		   "*** After copy_ph.affine_preimage(B, -A - 1, -1) ***");
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A + B));
+  gs.insert(point(A));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "--- ph ---");
+
+  ph.affine_preimage(B, Linear_Expression(1));
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point(A));
+  gs_known_result.insert(point(2*A));
+  gs_known_result.insert(line(B));
+
+  C_Polyhedron known_result(gs_known_result);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after ph.affine_preimage(B, 1) ---");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(0*A + 3*B));
+  gs.insert(point(3*A + 0*B));
+  gs.insert(point(3*A + 3*B));
+
+  C_Polyhedron ph(gs);
+
+  C_Polyhedron known_result = ph;
+
+  print_generators(ph, "--- ph before ph.affine_image(A, A + 2*B + 4) ---");
+
+  ph.affine_image(A, A + 2*B + 4);
+
+  print_generators(ph, "--- ph after ph.affine_image(A, A + 2*B + 4) ---");
+
+  ph.affine_preimage(A, A + 2*B + 4);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after ph.affine_preimage(A, A + 2*B + 4) ---");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(0*A + 3*B));
+  gs.insert(point(3*A + 0*B));
+  gs.insert(point(3*A + 3*B));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "--- ph before ph.affine_image(A, B) ---");
+
+  ph.affine_image(A, B);
+
+  print_generators(ph, "--- ph after ph.affine_image(A, B) ---");
+
+  ph.affine_preimage(A, B);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after ph.affine_preimage(A, B) ---");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Polyhedron/affinetrans.cc b/tests/Polyhedron/affinetrans.cc
new file mode 100644
index 0000000..ac4b425
--- /dev/null
+++ b/tests/Polyhedron/affinetrans.cc
@@ -0,0 +1,81 @@
+/* Use of the functions affine_image and affine_preimage.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 3*y));
+  gs.insert(point(3*x + 0*y));
+  gs.insert(point(3*x + 3*y));
+  C_Polyhedron ph(gs);
+
+  Linear_Expression expr = x + 4;
+
+  C_Polyhedron p1(ph);
+
+  print_generators(p1, "*** p1 ***");
+
+  p1.affine_image(x, expr);
+
+  C_Polyhedron p2(ph);
+
+  print_generators(p2, "*** p2 ***");
+
+  p2.affine_preimage(x, expr);
+
+  Generator_System gs1_known_result;
+  gs1_known_result.insert(point(4*x + 0*y));
+  gs1_known_result.insert(point(4*x + 3*y));
+  gs1_known_result.insert(point(7*x + 0*y));
+  gs1_known_result.insert(point(7*x + 3*y));
+  C_Polyhedron p1_known_result(gs1_known_result);
+
+  Generator_System gs2_known_result;
+  gs2_known_result.insert(point(-4*x + 0*y));
+  gs2_known_result.insert(point(-4*x + 3*y));
+  gs2_known_result.insert(point(-1*x + 0*y));
+  gs2_known_result.insert(point(-1*x + 3*y));
+  C_Polyhedron p2_known_result(gs2_known_result);
+
+  bool ok = (p1 == p1_known_result && p2 == p2_known_result);
+
+  print_generators(p1 ,"*** p1 ***");
+  print_generators(p1_known_result, "*** p1_known_result ***");
+  print_generators(p2 ,"*** p2 ***");
+  print_generators(p2_known_result, "*** p2_known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/append1.cc b/tests/Polyhedron/append1.cc
new file mode 100644
index 0000000..bb8af7f
--- /dev/null
+++ b/tests/Polyhedron/append1.cc
@@ -0,0 +1,108 @@
+/* An example of iteration to a post-fixpoint.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+shift_rename_add(const C_Polyhedron& p,
+		 dimension_type offset,
+		 C_Polyhedron& q) {
+  C_Polyhedron r(offset);
+  r.concatenate_assign(p);
+  q.intersection_assign(r);
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  // This is the base case:
+  // append(A,B,C) :- A = [], B = C.
+  C_Polyhedron base(3);
+  base.add_constraint(A == 0);
+  base.add_constraint(B >= 0);
+  base.add_constraint(C == B);
+
+  print_constraints(base, "*** base ***");
+
+  // This is the inductive case:
+  // append(A,B,C) :- A = [X|D], B = E, C = [X|F], append(D,E,F).
+  C_Polyhedron inductive(6);
+  inductive.add_constraint(A + F == C + D);
+  inductive.add_constraint(B == E);
+  inductive.add_constraint(C + D >= A);
+  inductive.add_constraint(D >= 0);
+  inductive.add_constraint(B >= 0);
+  inductive.add_constraint(A >= D + 1);
+
+  print_constraints(inductive, "*** inductive ***");
+
+  // Initialize the fixpoint iteration.
+  C_Polyhedron current = base;
+
+  print_constraints(current, "*** start ***");
+
+  // Contains the polyhedron computed at the previous iteration.
+  C_Polyhedron previous;
+  do {
+    previous = current;
+    current = inductive;
+    shift_rename_add(previous, 3, current);
+
+    print_constraints(current, "*** after shift_rename_add ***");
+
+    Variables_Set dimensions_to_remove;
+    // Deliberately inserted out of order (!).
+    dimensions_to_remove.insert(D);
+    dimensions_to_remove.insert(F);
+    dimensions_to_remove.insert(E);
+    current.remove_space_dimensions(dimensions_to_remove);
+
+    print_constraints(current, "*** after remove_space_dimensions ***");
+
+    current.poly_hull_assign_and_minimize(previous);
+
+    print_constraints(current, "*** after poly_hull_assign_and_minimize***");
+
+  } while (current != previous);
+
+  C_Polyhedron expected(3);
+  expected.add_constraint(A + B == C);
+  expected.add_constraint(B >= 0);
+  expected.add_constraint(C >= B);
+
+  print_constraints(expected, "*** expected ***");
+
+  return current == expected ? 0 : 1;
+}
+CATCH
diff --git a/tests/Polyhedron/append2.cc b/tests/Polyhedron/append2.cc
new file mode 100644
index 0000000..342264a
--- /dev/null
+++ b/tests/Polyhedron/append2.cc
@@ -0,0 +1,129 @@
+/* An example of iteration to a post-fixpoint.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+shift_rename_add(const C_Polyhedron& p,
+		 dimension_type offset,
+		 C_Polyhedron& q) {
+  C_Polyhedron r(offset);
+  r.concatenate_assign(p);
+  q.intersection_assign(r);
+}
+
+void
+append_init(C_Polyhedron& base, C_Polyhedron& induct, C_Polyhedron& expect,
+            dimension_type& offset, unsigned int& arity,
+	    unsigned int& num_vars) {
+  offset = 3;
+  arity = 3;
+  num_vars = 6;
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  // This is the base case:
+  // append(A,B,C) :- A = [], B = C.
+  base.add_space_dimensions_and_embed(3);
+  base.add_constraint(A == 0);
+  base.add_constraint(B >= 0);
+  base.add_constraint(C == B);
+
+  print_constraints(base, "*** base ***");
+
+  // This is the inductive case:
+  // append(A,B,C) :- A = [X|D], B = E, C = [X|F], append(D,E,F).
+  induct.add_space_dimensions_and_embed(6);
+  induct.add_constraint(A + F == C + D);
+  induct.add_constraint(B == E);
+  induct.add_constraint(C + D >= A);
+  induct.add_constraint(D >= 0);
+  induct.add_constraint(B >= 0);
+  induct.add_constraint(A >= D + 1);
+
+  print_constraints(induct, "*** inductive ***");
+
+  expect.add_space_dimensions_and_embed(3);
+  expect.add_constraint(A + B == C);
+  expect.add_constraint(B >= 0);
+  expect.add_constraint(C >= B);
+}
+
+void
+fix_point(C_Polyhedron& start, C_Polyhedron& induct, C_Polyhedron& finish,
+          dimension_type offset, unsigned int arity, unsigned int num_vars) {
+  // Initialize the fixpoint iteration.
+  C_Polyhedron current = start;
+
+  print_constraints(current, "*** start ***");
+
+  // Contains the polyhedron computed at the previous iteration.
+  C_Polyhedron previous;
+  do {
+    previous = current;
+    current = induct;
+    shift_rename_add(previous, offset, current);
+
+    print_constraints(current, "*** after shift_rename_add ***");
+
+    Variables_Set dimensions_to_remove;
+    for (unsigned int i = num_vars-1 ; i >= arity; --i )
+      dimensions_to_remove.insert(Variable(i));
+    current.remove_space_dimensions(dimensions_to_remove);
+
+    print_constraints(current, "*** after remove_space_dimensions ***");
+
+    current.poly_hull_assign_and_minimize(previous);
+
+    print_constraints(current, "*** after poly_hull_assign_and_minimize***");
+
+  } while (current != previous);
+  finish = current;
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  C_Polyhedron start;
+  C_Polyhedron induct;
+  C_Polyhedron expect;
+  dimension_type recursive_offset;
+  unsigned int arity;
+  unsigned int num_vars;
+  append_init(start, induct, expect, recursive_offset, arity, num_vars);
+  C_Polyhedron final;
+  fix_point(start, induct, final, recursive_offset, arity, num_vars);
+
+    print_constraints(expect, "*** expected ***");
+
+  return final == expect ? 0 : 1;
+}
+CATCH
diff --git a/tests/Polyhedron/ascii_dump_load1.cc b/tests/Polyhedron/ascii_dump_load1.cc
new file mode 100644
index 0000000..bfe6d23
--- /dev/null
+++ b/tests/Polyhedron/ascii_dump_load1.cc
@@ -0,0 +1,601 @@
+/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A - B >= 2);
+  ph1.add_constraint(B >= 0);
+
+  ph1.minimized_generators();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  ph2.ascii_load(f);
+  close(f);
+
+  bool ok = (ph1 == ph2);
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A - B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  f.seekp(0);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "space_dim");
+  f.seekp(0, ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-ZE");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "con_sys");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test06() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(up-to-date)");
+  f.seekp(0, ios_base::cur);
+  f << "A\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test07() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "gen_sys");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test08() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(not_up-to-date)" );
+  f.seekp(0, ios_base::cur);
+  f << "A\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test09() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "sat_c");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test10() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "sat_g");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test11() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(up-to-date)");
+  f.seekp(0, ios_base::cur);
+  f << "\nA";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test12() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(not_up-to-date)" );
+  f.seekp(0, ios_base::cur);
+  f << "\nA";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test13() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "sat_c");
+  f.seekp(0, ios_base::cur);
+  f << "\nA";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test14() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "sat_g");
+  f.seekp(0, ios_base::cur);
+  f << "\nA";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test15() {
+  const char* my_file = "ascii_dump_load1.dat";
+  C_Polyhedron ph1;
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  ph2.ascii_load(f);
+  close(f);
+
+  bool ok = (ph1 == ph2);
+
+  return ok;
+}
+
+bool
+test16() {
+  const char* my_file = "ascii_dump_load1.dat";
+  C_Polyhedron ph1(2, EMPTY);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  ph2.ascii_load(f);
+  close(f);
+
+  bool ok = (ph1 == ph2);
+
+  return ok;
+}
+
+bool
+test17() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok =! ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test18() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok =! ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test19() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok =! ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test20() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM +GM";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Polyhedron/ascii_dump_load2.cc b/tests/Polyhedron/ascii_dump_load2.cc
new file mode 100644
index 0000000..848528f
--- /dev/null
+++ b/tests/Polyhedron/ascii_dump_load2.cc
@@ -0,0 +1,138 @@
+/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "ascii_dump_load2.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM +GM  +CS";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load2.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM +GM  +CS  +SC";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load2.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM +GM  +CS  +GS";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load2.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM +GM  +CS  +GS  -SC";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load2.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A + B));
+  C_Polyhedron ph1(gs);
+  ph1.constraints();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  ph2.ascii_load(f);
+  close(f);
+
+  bool ok = (ph1 == ph2);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/ascii_dump_load3.cc b/tests/Polyhedron/ascii_dump_load3.cc
new file mode 100644
index 0000000..aee0efd
--- /dev/null
+++ b/tests/Polyhedron/ascii_dump_load3.cc
@@ -0,0 +1,433 @@
+/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A == 2);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A == 2);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "=");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A == 2);
+  ph1.add_constraint(B >= 0);
+
+  Constraint_System cs = ph1.constraints();
+
+  C_Polyhedron ph(6);
+  ph.add_constraints(cs);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "=");
+  f.seekp(-6, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "NECESSARILY_CLOSED");
+  f.seekp(-2, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "x");
+  f.seekp(1, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test06() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(not_sorted)");
+  f.seekp(-2, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test07() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  ph.generators();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "sat_c");
+  do
+    f >> str;
+  while (str != "x");
+  f.seekp(0, ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test08() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  ph.generators();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "sat_c");
+  f.seekp(8, ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test09() {
+  const char* my_file = "ascii_dump_load3.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  -CM -GM  +CS -GS  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "topology NECESSARILY_CLOSED\n"
+    << "3 x 3 (not_sorted)\n"
+    << "1 0 0";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok =! ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test10() {
+  const char* my_file = "ascii_dump_load3.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  -CM -GM  +CS -GS  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "topology NECESSARILY_CLOSED\n"
+    << "3 x 3 (not_sorted)\n"
+    << "1 0 0   >=\n"
+    << "0 1 0   >=\n"
+    << "0 0 1   >=\n\n"
+    << "gen_sys (not_up-to-date)\n"
+    << "topology NECESSARILY_CLOSED\n"
+    <<" 3 x 3 (not_sorted)\n"
+    << "1 0 0";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok =! ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test11() {
+  const char* my_file = "ascii_dump_load3.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  -CM -GM  +CS -GS  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "topology NECESSARILY_CLOSED\n"
+    << "3";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok =! ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test12() {
+  const char* my_file = "ascii_dump_load3.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  -CM -GM  +CS -GS  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "topology";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok =! ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test13() {
+  const char* my_file = "ascii_dump_load3.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 3\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  +SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "topology NOT_NECESSARILY_CLOSED\n"
+    << "4 x 5 (sorted)\n"
+    << "1 0 0 0 -1   >\n"
+    << "0 0 0 0 1   >=\n"
+    << "0 0 1 0 0   >=\n"
+    << "-2 1 -1 0 0   >=\n"
+    << "\n"
+    << "gen_sys (up-to-date)\n"
+    << "topology NOT_NECESSARILY_CLOSED\n"
+    << "5 x 5 (sorted)\n"
+    << "0 0 0 1 0   L\n"
+    << "0 1 0 0 0   R\n"
+    << "0 1 1 0 0   R\n"
+    << "1 2 0 0 0   C\n"
+    << "1 2 0 0 1   P\n"
+    << "\n"
+    << "sat_c\n"
+    << "5";
+    close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok =! ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Polyhedron/bgp99extrapolation1.cc b/tests/Polyhedron/bgp99extrapolation1.cc
new file mode 100644
index 0000000..3eb79a5
--- /dev/null
+++ b/tests/Polyhedron/bgp99extrapolation1.cc
@@ -0,0 +1,269 @@
+/* Test Polyhedra_Powerset<PH>::BGP99_extrapolation_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <vector>
+
+namespace {
+
+const C_Polyhedron&
+aux1_test01(unsigned n) {
+  Variable x(0);
+  Variable y(1);
+
+  static std::vector<C_Polyhedron> p;
+  if (p.size() < 5) {
+    p.resize(5, C_Polyhedron(2));
+    p[2].add_constraint(0 <= x);
+    p[2].add_constraint(x <= 4);
+    p[2].add_constraint(0 <= y);
+    p[2].add_constraint(y <= 4);
+    p[1] = p[2];
+    p[1].add_constraint(x-y <= 3);
+    p[0] = p[1];
+    p[0].add_constraint(x+y >= 1);
+
+    p[3].add_constraint(0 <= x);
+    p[3].add_constraint(x <= 8);
+    p[3].add_constraint(0 <= y);
+    p[3].add_constraint(y <= 8);
+    p[3].add_constraint(x+y <= 14);
+    p[3].add_constraint(x-y >= -6);
+    p[4] = p[3];
+    p[3].add_constraint(5*x-y >= -2);
+    p[3].add_constraint(x+3*y >= 3);
+    p[4].add_constraint(4*x-y >= -3);
+    p[4].add_constraint(x+2*y >= 2);
+  }
+
+  if (n >= p.size()) {
+    unsigned new_size = p.size();
+    while (n >= new_size)
+      new_size *= 2;
+    p.resize(p.size()*2);
+  }
+
+  if (p[n].is_universe()) {
+    p[n] = aux1_test01(n-4);
+    p[n].affine_image(x, 2*x);
+    p[n].affine_image(y, 8 - 2*y);
+  }
+
+  return p[n];
+}
+
+Polyhedra_Powerset<C_Polyhedron>
+aux2_test01(unsigned n) {
+  Polyhedra_Powerset<C_Polyhedron> s(2, EMPTY);
+  if (n == 0) {
+
+    nout << "S0 = { P0 }" << endl;
+
+    s.add_disjunct(aux1_test01(0));
+    return s;
+  }
+
+  const int p_base = (n-1)/3*4;
+
+  switch (n % 3) {
+  case 1:
+
+    nout << "S" << n << " = { "
+	 << "P" << p_base + 1 << ", "
+	 << "P" << p_base + 3 << " }" << endl;
+
+    s.add_disjunct(aux1_test01(p_base + 1));
+    s.add_disjunct(aux1_test01(p_base + 3));
+    break;
+  case 2:
+
+    nout << "S" << n << " = { "
+	 << "P" << p_base + 2 << ", "
+	 << "P" << p_base + 3 << " }" << endl;
+
+    s.add_disjunct(aux1_test01(p_base + 2));
+    s.add_disjunct(aux1_test01(p_base + 3));
+    break;
+  case 0:
+
+    nout << "S" << n << " = { "
+	 << "P" << p_base + 2 << ", "
+	 << "P" << p_base + 4 << " }" << endl;
+
+    s.add_disjunct(aux1_test01(p_base + 2));
+    s.add_disjunct(aux1_test01(p_base + 4));
+    break;
+  }
+  return s;
+}
+
+void
+aux3_test01(std::ostream& s, const Variable& v) {
+  s << char('x' + v.id());
+}
+
+bool
+test01() {
+  // Install the alternate output function.
+  Variable::set_output_function(aux3_test01);
+
+  Polyhedra_Powerset<C_Polyhedron> T = aux2_test01(0);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+
+  nout << "T0 = " << T << endl;
+
+  bool converged = false;
+  for (unsigned n = 1; !converged && n <= 20; ++n) {
+    Polyhedra_Powerset<C_Polyhedron> Sn = aux2_test01(n);
+
+    nout << "S" << n << " = " << Sn << endl;
+
+    Sn.BGP99_extrapolation_assign
+      (T, widen_fun_ref(&Polyhedron::H79_widening_assign), 2);
+
+    nout << "T" << n << " = " << Sn << endl;
+
+    if (Sn.definitely_entails(T))
+      converged = true;
+    else
+      std::swap(Sn, T);
+  }
+
+  return !converged;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ps1_1(2);
+  ps1_1.add_constraint(-A + B >= 5);
+  ps1_1.add_constraint(A - B >= -13);
+  ps1_1.add_constraint(A >= 3);
+  C_Polyhedron ps1_2(2);
+  ps1_2.add_constraint(-A + B >= 6);
+  ps1_2.add_constraint(A - B >= -16);
+  ps1_2.add_constraint(A >= 3);
+  C_Polyhedron ps1_3(2);
+  ps1_3.add_constraint(-A + B >= 7);
+  ps1_3.add_constraint(A - B >= -20);
+  ps1_3.add_constraint(A >= 4);
+  C_Polyhedron ps1_4(2);
+  ps1_4.add_constraint(-A + B >= 8);
+  ps1_4.add_constraint(A - B >= -24);
+  ps1_4.add_constraint(A >= 5);
+  C_Polyhedron ps1_5(2);
+  ps1_5.add_constraint(-A + B >= 10);
+  ps1_5.add_constraint(A - B >= -28);
+  ps1_5.add_constraint(A >= 6);
+  C_Polyhedron ps1_6(2);
+  ps1_6.add_constraint(-A + B >= 12);
+  ps1_6.add_constraint(A - B >= -32);
+  ps1_6.add_constraint(A >= 7);
+  C_Polyhedron ps1_7(2);
+  ps1_7.add_constraint(-A + B >= 2);
+  ps1_7.add_constraint(A - B >= -4);
+  ps1_7.add_constraint(A >= 0);
+  C_Polyhedron ps1_8(2);
+  ps1_8.add_constraint(-A + B >= 3);
+  ps1_8.add_constraint(A - B >= -8);
+  ps1_8.add_constraint(A >= 1);
+  C_Polyhedron ps1_9(2);
+  ps1_9.add_constraint(-A + B >= 4);
+  ps1_9.add_constraint(A - B >= -12);
+  ps1_9.add_constraint(A >= 2);
+
+  Polyhedra_Powerset<C_Polyhedron> ps1(2, EMPTY);
+  ps1.add_disjunct(ps1_1);
+  ps1.add_disjunct(ps1_2);
+  ps1.add_disjunct(ps1_3);
+  ps1.add_disjunct(ps1_4);
+  ps1.add_disjunct(ps1_5);
+  ps1.add_disjunct(ps1_6);
+  ps1.add_disjunct(ps1_7);
+  ps1.add_disjunct(ps1_8);
+  ps1.add_disjunct(ps1_9);
+
+  C_Polyhedron ps2_1(2);
+  ps2_1.add_constraint(-A + B >= 2);
+  ps2_1.add_constraint(A - B >= -4);
+  ps2_1.add_constraint(A >= 0);
+  C_Polyhedron ps2_2(2);
+  ps2_2.add_constraint(-A + B >= 3);
+  ps2_2.add_constraint(A - B >= -8);
+  ps2_2.add_constraint(A >= 1);
+  C_Polyhedron ps2_3(2);
+  ps2_3.add_constraint(-A + B >= 4);
+  ps2_3.add_constraint(A - B >= -12);
+  ps2_3.add_constraint(A >= 2);
+  C_Polyhedron ps2_4(2);
+  ps2_4.add_constraint(-A + B >= 6);
+  ps2_4.add_constraint(A - B >= -16);
+  ps2_4.add_constraint(A >= 3);
+
+  Polyhedra_Powerset<C_Polyhedron> ps2(2, EMPTY);
+  ps2.add_disjunct(ps2_1);
+  ps2.add_disjunct(ps2_2);
+  ps2.add_disjunct(ps2_3);
+  ps2.add_disjunct(ps2_4);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** ps1 ***" << endl
+       << ps1 << endl;
+  nout << "*** ps2 ***" << endl
+       << ps2 << endl;
+
+  ps1.BGP99_extrapolation_assign
+    (ps2, widen_fun_ref(&Polyhedron::H79_widening_assign), 7);
+
+  Polyhedra_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  C_Polyhedron kr_1(2);
+  kr_1.add_constraint(A - B >= -16);
+  kr_1.add_constraint(A >= 3);
+  C_Polyhedron kr_2(2);
+  kr_2.add_constraint(-A + B >= 3);
+  kr_2.add_constraint(A >= 1);
+  C_Polyhedron kr_3(2);
+  kr_3.add_constraint(A - B >= -12);
+  known_result.add_disjunct(kr_1);
+  known_result.add_disjunct(kr_2);
+  known_result.add_disjunct(kr_3);
+
+  bool ok = ps1.geometrically_equals(known_result);
+
+  nout
+    << "*** ps1.BGP99_extrapolation_assign"
+    << "(ps2, widen_fun_ref(&H79_widening_assign), 7) ***"
+    << endl
+    << ps1 << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F16(test01);
+  DO_TEST_F8(test02);
+END_MAIN
diff --git a/tests/Polyhedron/bhrz03widening1.cc b/tests/Polyhedron/bhrz03widening1.cc
new file mode 100644
index 0000000..e8cf0fb
--- /dev/null
+++ b/tests/Polyhedron/bhrz03widening1.cc
@@ -0,0 +1,754 @@
+/* Test Polyhedron::BHRZ03_widening_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(A));
+  gs1.insert(point(B));
+  gs1.insert(point(A + B));
+  gs1.insert(point(C));
+  gs1.insert(point(A + C));
+  gs1.insert(point(B + C));
+  gs1.insert(point(A + B + C));
+  C_Polyhedron ph1(gs1);
+
+  C_Polyhedron ph1_copy(ph1);
+
+  Generator_System gs2;
+  gs2.insert(point(0*C));
+  gs2.insert(point(A));
+  gs2.insert(point(B));
+  gs2.insert(point(A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  bool ok = (ph1 == ph1_copy);
+
+  print_constraints(ph1, "*** After BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+
+  C_Polyhedron ph1_copy(ph1);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  bool ok = (ph1 == ph1_copy);
+
+  print_constraints(ph1, "*** After BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(2*A));
+  gs1.insert(point(2*B));
+
+  C_Polyhedron ph1(gs1);
+  C_Polyhedron ph1_copy(ph1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(point(A));
+  gs2.insert(point(B));
+  gs2.insert(point(A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  bool ok = (ph1 == ph1_copy);
+
+  print_constraints(ph1, "*** After BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point(2*A));
+  gs1.insert(closure_point(A+B));
+  gs1.insert(closure_point(3*A+B));
+  NNC_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(2*A));
+  gs2.insert(closure_point(B));
+  gs2.insert(closure_point(4*A+B));
+  NNC_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B < 1);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** After BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A - B >= 0);
+  ph1.add_constraint(A + B <= 2);
+  ph1.add_constraint(B >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(2*A - B >= 0);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(2*A + B <= 4);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(2*A + B >= 0);
+  known_result.add_constraint(2*A - B <= 4);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** After BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A - B <= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(2*A - B <= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(B));
+  gs1.insert(ray(A + 4*B + 2*C));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(B));
+  gs2.insert(ray(A + 2*B + 4*C));
+  C_Polyhedron ph2(gs2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** After BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(line(A));
+  gs1.insert(ray(B));
+  gs1.insert(ray(A + B + C));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(line(A));
+  gs2.insert(ray(B));
+  gs2.insert(ray(A + B + 2*C));
+  C_Polyhedron ph2(gs2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** After BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+const Generator_System&
+aux1_test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  static Generator_System gs;
+  static bool initialized = false;
+  if (!initialized) {
+    gs.insert(point());
+    gs.insert(ray(C));
+    gs.insert(ray(D));
+    gs.insert(ray(E));
+    gs.insert(ray(A + D));
+    gs.insert(ray(A + B + E));
+    initialized = true;
+  }
+  return gs;
+}
+
+C_Polyhedron
+aux2_test09(unsigned n) {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  C_Polyhedron ph(aux1_test09());
+  n += 2;
+  ph.add_generator(ray(A + (n-1)*B + E));
+  if (n % 2 == 0) {
+    // Even.
+    unsigned m = n / 2;
+    ph.add_generator(ray(m*B + E));
+    ph.add_generator(ray(A + (m-1)*B + D));
+  }
+  else {
+    // Odd.
+    ph.add_generator(ray(n*B + 2*E));
+    ph.add_generator(ray(2*A + (n-2)*B + 2*D));
+  }
+  return ph;
+}
+
+bool
+test09() {
+  // Chain condition for widenings:
+  // for each increasing chain of descriptions p_0, p_1, ..., p_i, ...,
+  // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and
+  // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary.
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  // Initialization: set q_0.
+  C_Polyhedron q_i_minus_1 = aux2_test09(0);
+
+  for (unsigned i = 1; i <= 100; ++i) {
+    print_generators(q_i_minus_1.generators(),
+		     "*** Result of the previous iteration ***");
+
+    C_Polyhedron p_i = aux2_test09(i);
+    print_generators(p_i.generators(), "*** New stuff ***");
+
+    C_Polyhedron q_i = q_i_minus_1;
+    q_i.poly_hull_assign(p_i);
+    print_generators(q_i.generators(),
+		     "*** Poly-hull of previous with new ***");
+
+    q_i.BHRZ03_widening_assign(q_i_minus_1);
+    print_generators(q_i.generators(),
+		     "*** Result of widening poly-hull with new ***");
+
+    if (q_i == q_i_minus_1) {
+
+      C_Polyhedron known_result(5);
+      known_result.add_constraint(A >= 0);
+      known_result.add_constraint(B >= 0);
+      known_result.add_constraint(C >= 0);
+      known_result.add_constraint(D >= 0);
+      known_result.add_constraint(E >= 0);
+      known_result.add_constraint(-A + B + D >= 0);
+
+      bool ok = (q_i == known_result);
+
+      print_constraints(q_i, "*** The constraints of the fix point ***");
+      print_generators(q_i, "*** The generators of the fix point ***");
+
+      return ok;
+    }
+    q_i_minus_1 = q_i;
+  }
+  return false;
+}
+
+bool
+test10() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2(0, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  C_Polyhedron known_result;
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.H79_widening_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(B >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 2);
+  ph2.add_constraint(A <= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.BHRZ03_widening_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(A + 2*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-A));
+  gs1.insert(ray(-A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-A));
+  gs2.insert(ray(-A + 2*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-A));
+  gs1.insert(ray(-A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-A));
+  gs2.insert(ray(-A - 2*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(A - 2*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(B));
+  gs1.insert(ray(A + 2*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(B));
+  gs2.insert(ray(A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(B));
+  gs1.insert(ray(-A + 2*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(B));
+  gs2.insert(ray(-A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-B));
+  gs1.insert(ray(-A - 2*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-B));
+  gs2.insert(ray(-A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-B));
+  gs1.insert(ray(A - 2*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-B));
+  gs2.insert(ray(A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(-A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Polyhedron/bhrz03widening2.cc b/tests/Polyhedron/bhrz03widening2.cc
new file mode 100644
index 0000000..17b1895
--- /dev/null
+++ b/tests/Polyhedron/bhrz03widening2.cc
@@ -0,0 +1,261 @@
+/* Test Polyhedron::BHRZ03_widening_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(B));
+  gs1.insert(ray(-A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(B));
+  gs2.insert(ray(-A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-A));
+  gs1.insert(ray(-A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-A));
+  gs2.insert(ray(A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-B));
+  gs1.insert(ray(A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-B));
+  gs2.insert(ray(A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-A));
+  gs1.insert(ray(-A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-A));
+  gs2.insert(ray(A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-B));
+  gs1.insert(ray(-A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-B));
+  gs2.insert(ray(-A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(-A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(B));
+  gs1.insert(ray(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(B));
+  gs2.insert(ray(A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/bhrz03widening3.cc b/tests/Polyhedron/bhrz03widening3.cc
new file mode 100644
index 0000000..c27e09b
--- /dev/null
+++ b/tests/Polyhedron/bhrz03widening3.cc
@@ -0,0 +1,607 @@
+/* Test Polyhedron::BHRZ03_widening_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A + B > 0);
+  ph1.add_constraint(A - B < 1);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(A > 0);
+  ph2.add_constraint(A < 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System gs1;
+  gs1.insert(point(A));
+  gs1.insert(closure_point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(B));
+  gs1.insert(ray(A + B + 2*C));
+  NNC_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(A));
+  gs2.insert(closure_point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(B));
+  gs2.insert(ray(A + B + C));
+  NNC_Polyhedron ph2(gs2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  NNC_Polyhedron known_result(3);
+  known_result.add_constraint(A > 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+Generator_System
+aux1_test03(const Coefficient& half_side) {
+  // Square.
+  Variable A(0);
+  Variable B(1);
+  Generator_System gs;
+  gs.insert(point(half_side*A + half_side*B));
+  gs.insert(point(half_side*A - half_side*B));
+  gs.insert(point(-half_side*A - half_side*B));
+  gs.insert(point(-half_side*A + half_side*B));
+  return gs;
+}
+
+Generator_System
+aux2_test03(const Coefficient& half_diagonal) {
+  // Rhombus.
+  Variable A(0);
+  Variable B(1);
+  Generator_System gs;
+  gs.insert(point(half_diagonal*A));
+  gs.insert(point(half_diagonal*B));
+  gs.insert(point(-half_diagonal*A));
+  gs.insert(point(-half_diagonal*B));
+  return gs;
+}
+
+C_Polyhedron
+aux3_test03(unsigned n) {
+
+  Coefficient half_diagonal = 2;
+  for (unsigned i = n / 8; i-- > 0; ) {
+    half_diagonal *= 2;
+  }
+  Coefficient half_side = half_diagonal;
+
+  Generator_System gs;
+  if (n % 8 < 4) {
+    half_side /= 2;
+    gs = aux1_test03(half_side);
+    Generator_System gs2 = aux2_test03(half_diagonal);
+    Generator_System::const_iterator gi = gs2.begin();
+    for (int i = n % 8; i-- > 0; )
+      gs.insert(*gi++);
+  }
+  else {
+    gs = aux2_test03(half_diagonal);
+    Generator_System gs2 = aux1_test03(half_side);
+    Generator_System::const_iterator gi = gs2.begin();
+    for (int i = n % 8 - 4; i-- > 0; )
+      gs.insert(*gi++);
+  }
+  C_Polyhedron ph = C_Polyhedron(gs);
+
+  return ph;
+}
+
+bool
+test03() {
+  // Chain condition for widenings:
+  // for each increasing chain of descriptions p_0, p_1, ..., p_i, ...,
+  // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and
+  // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary.
+
+  // Initialization: set q_0.
+  C_Polyhedron q_i_minus_1 = aux3_test03(0);
+
+  for (unsigned i = 1; i <= 100; ++i) {
+    print_generators(q_i_minus_1.generators(),
+		     "*** Result of the previous iteration ***");
+
+    C_Polyhedron p_i = aux3_test03(i);
+    print_generators(p_i.generators(), "*** New stuff ***");
+
+    C_Polyhedron q_i = q_i_minus_1;
+    q_i.poly_hull_assign(p_i);
+    print_generators(q_i.generators(),
+		     "*** Poly-hull of previous with new ***");
+
+    q_i.BHRZ03_widening_assign(q_i_minus_1);
+    print_generators(q_i.generators(),
+		     "*** Result of widening poly-hull with new ***");
+
+    if (q_i == q_i_minus_1) {
+      C_Polyhedron known_result(2);
+
+      bool ok = (q_i == known_result);
+
+      print_constraints(q_i, "*** The constraints of the fix point ***");
+      print_generators(q_i, "*** The generators of the fix point ***");
+
+      return ok;
+    }
+    q_i_minus_1 = q_i;
+  }
+  return false;
+}
+
+Generator_System
+aux1_test04() {
+  Variable A(0);
+  Variable B(1);
+  Generator_System new_gs;
+  new_gs.insert(point(A));
+  new_gs.insert(point(-B));
+  new_gs.insert(point(-A));
+  new_gs.insert(point(B));
+  return new_gs;
+}
+
+Generator
+aux2_test04(const Generator& p1, const Generator& p2, unsigned magic_number) {
+  // Splitting segment.
+  const Coefficient& d1 = p1.divisor();
+  const Coefficient& d2 = p2.divisor();
+  Linear_Expression expr = d2 * Linear_Expression(p1);
+  expr += d1 * Linear_Expression(p2);
+  // The divisor for the average is 2 * d1 * d2.
+  // by carefully taking a smaller divisor, we obtain a point
+  // that won't be redundant in the polyhedron.
+  // NOTE: I am not *sure* this dirty kludge of using such
+  // a magic number will always succeed.
+  return point((magic_number+1)*expr, magic_number*2*d1*d2);
+}
+
+Generator_System
+aux3_test04(const Generator_System& gs, unsigned magic_number) {
+  // Double generators.
+  Generator_System new_gs;
+  Generator_System::const_iterator i = gs.begin();
+  Generator_System::const_iterator gs_end = gs.end();
+  while (true) {
+    const Generator& g = *i;
+    new_gs.insert(g);
+    ++i;
+    if (i != gs_end)
+      new_gs.insert(aux2_test04(g, *i, magic_number));
+    else {
+      // Split the last segment.
+      Generator_System::const_iterator gs_begin = gs.begin();
+      new_gs.insert(aux2_test04(g, *gs_begin, magic_number));
+      break;
+    }
+  }
+  return new_gs;
+}
+
+C_Polyhedron
+aux4_test04(unsigned n) {
+
+  unsigned needed_vertices = n + 4;
+
+  unsigned magic_number = 1;
+  unsigned magic_factor = 4;
+  Generator_System gs = aux1_test04();
+  unsigned gs_vertices = 4;
+
+  while (gs_vertices * 2 <= needed_vertices) {
+    magic_number *= magic_factor;
+    gs = aux3_test04(gs, magic_number);
+    gs_vertices *= 2;
+  }
+
+  if (gs_vertices < needed_vertices) {
+    magic_number *= magic_factor;
+    Generator_System gs2 = aux3_test04(gs, magic_number);
+    Generator_System::const_iterator gs2_i = gs2.begin();
+    for ( ; gs_vertices < needed_vertices; ++gs_vertices) {
+      // Skip the even indexed vertices of gs2.
+      ++gs2_i;
+      // Add the odd indexed vertices of gs2.
+      gs.insert(*gs2_i++);
+    }
+  }
+
+  C_Polyhedron ph = C_Polyhedron(gs);
+  return ph;
+}
+
+bool
+test04() {
+  // Chain condition for widenings:
+  // for each increasing chain of descriptions p_0, p_1, ..., p_i, ...,
+  // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and
+  // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary.
+
+  // Initialization: set q_0.
+  C_Polyhedron q_i_minus_1 = aux4_test04(0);
+
+  for (unsigned i = 1; i <= 100; ++i) {
+    print_generators(q_i_minus_1.generators(),
+		     "*** Result of the previous iteration ***");
+
+    C_Polyhedron p_i = aux4_test04(i);
+    print_generators(p_i.generators(), "*** New stuff ***");
+
+    C_Polyhedron q_i = q_i_minus_1;
+    q_i.poly_hull_assign(p_i);
+    print_generators(q_i.generators(),
+		     "*** Poly-hull of previous with new ***");
+
+    q_i.BHRZ03_widening_assign(q_i_minus_1);
+    print_generators(q_i.generators(),
+		     "*** Result of widening poly-hull with new ***");
+
+    if (q_i == q_i_minus_1) {
+      C_Polyhedron known_result(2);
+
+      bool ok = (q_i == known_result);
+
+      print_constraints(q_i, "*** The constraints of the fix point ***");
+      print_generators(q_i, "*** The generators of the fix point ***");
+
+      return ok;
+    }
+    q_i_minus_1 = q_i;
+  }
+  return false;
+}
+
+Generator_System
+aux1_test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System new_gs;
+  new_gs.insert(ray(A + C));
+  new_gs.insert(ray(-B + C));
+  new_gs.insert(ray(-A + C));
+  new_gs.insert(ray(B + C));
+  return new_gs;
+}
+
+Generator
+aux2_test05(const Generator& r1, const Generator& r2, unsigned magic_number) {
+  // Splitting facet.
+  //  Variable A(0);
+  //  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression expr;
+  expr += Linear_Expression(r1);
+  expr += Linear_Expression(r2);
+  // NOTE: I am not *sure* this dirty kludge of using such
+  // a magic number will always succeed.
+  expr *= magic_number + 1;
+  expr -= C;
+  return ray(expr);
+}
+
+Generator_System
+aux3_test05(const Generator_System& gs, unsigned magic_number) {
+  // Double generators.
+  Generator_System new_gs;
+  Generator_System::const_iterator i = gs.begin();
+  Generator_System::const_iterator gs_end = gs.end();
+  while (true) {
+    const Generator& g = *i;
+    new_gs.insert(g);
+    ++i;
+    if (i != gs_end)
+      new_gs.insert(aux2_test05(g, *i, magic_number));
+    else {
+      // Split the last facet.
+      Generator_System::const_iterator gs_begin = gs.begin();
+      new_gs.insert(aux2_test05(g, *gs_begin, magic_number));
+      break;
+    }
+  }
+  return new_gs;
+}
+
+C_Polyhedron
+aux4_test05(unsigned n) {
+  unsigned needed_facets = n + 4;
+  unsigned magic_number = 1;
+  unsigned magic_factor = 4;
+  Generator_System gs = aux1_test05();
+  unsigned gs_facets = 4;
+
+  while (gs_facets * 2 <= needed_facets) {
+    magic_number *= magic_factor;
+    gs = aux3_test05(gs, magic_number);
+    gs_facets *= 2;
+  }
+
+  if (gs_facets < needed_facets) {
+    magic_number *= magic_factor;
+    Generator_System gs2 = aux3_test05(gs, magic_number);
+    Generator_System::const_iterator gs2_i = gs2.begin();
+    for ( ; gs_facets < needed_facets; ++gs_facets) {
+      // Skip the even indexed facets of gs2.
+      ++gs2_i;
+      // Add the odd indexed facets of gs2.
+      gs.insert(*gs2_i++);
+    }
+  }
+  gs.insert(point());
+  C_Polyhedron ph = C_Polyhedron(gs);
+  return ph;
+}
+
+bool
+test05() {
+  // Chain condition for widenings:
+  // for each increasing chain of descriptions p_0, p_1, ..., p_i, ...,
+  // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and
+  // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary.
+  //  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  // Initialization: set q_0.
+  C_Polyhedron q_i_minus_1 = aux4_test05(0);
+
+  for (unsigned i = 1; i <= 100; ++i) {
+    print_generators(q_i_minus_1, "*** Result of the previous iteration ***");
+
+    C_Polyhedron p_i = aux4_test05(i);
+    print_generators(p_i, "*** New stuff ***");
+
+    C_Polyhedron q_i = q_i_minus_1;
+    q_i.poly_hull_assign(p_i);
+    print_generators(q_i, "*** Poly-hull of previous with new ***");
+
+    q_i.BHRZ03_widening_assign(q_i_minus_1);
+    print_generators(q_i, "*** Result of widening poly-hull with new ***");
+
+    if (q_i == q_i_minus_1) {
+      C_Polyhedron known_result(3, UNIVERSE);
+      known_result.add_constraint(-B + C >= 0);
+
+      bool ok = (q_i == known_result);
+
+      print_constraints(q_i, "*** The constraints of the fix point ***");
+      print_generators(q_i, "*** The generators of the fix point ***");
+
+      return ok;
+    }
+    q_i_minus_1 = q_i;
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(A + 2*B));
+  gs1.insert(ray(A));
+  gs1.insert(ray(2*A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(point(A + 2*B));
+  gs2.insert(ray(A));
+  gs2.insert(ray(A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(2*A- B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(A + 3*B));
+  gs1.insert(ray(A));
+  gs1.insert(ray(2*A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(point(A + 3*B));
+  gs2.insert(ray(A + B));
+  gs2.insert(ray(A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(3*A - B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(6*A - B));
+  gs1.insert(point(6*B));
+  gs1.insert(point(A + 10*B));
+  gs1.insert(ray(A + 2*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(point(6*A - B));
+  gs2.insert(point(6*B));
+  gs2.insert(point(A + 10*B));
+  gs2.insert(ray(A + B));
+  gs2.insert(ray(A + 3*B));
+  gs2.insert(point(-4*A + 3*B, 13));
+  gs2.insert(point(-2*A + B, 8));
+  gs2.insert(point(-A + 12*B, 4));
+
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  // This is the result of applying H79.
+  Generator_System gs_known_result;
+  gs_known_result.insert(point(-36*A + 6*B, 25));
+  gs_known_result.insert(ray(A + 4*B));
+  gs_known_result.insert(ray(6*A - B));
+
+  C_Polyhedron known_result(gs_known_result);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+  print_constraints(ph2, "*** After ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(closure_point());
+  gs1.insert(closure_point(A + B));
+  gs1.insert(point(2*A + B, 2));
+  gs1.insert(ray(A));
+  NNC_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(closure_point());
+  gs2.insert(closure_point(A + B));
+  gs2.insert(closure_point(B, 2));
+  gs2.insert(point(2*A + B, 2));
+  gs2.insert(ray(A));
+  NNC_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(B > 0);
+  known_result.add_constraint(B < 1);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** After  ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST_F8(test04);
+  DO_TEST_F8(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST_F8(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/bhz03widening1.cc b/tests/Polyhedron/bhz03widening1.cc
new file mode 100644
index 0000000..1c9d2c9
--- /dev/null
+++ b/tests/Polyhedron/bhz03widening1.cc
@@ -0,0 +1,723 @@
+/* Test Polyhedra_Powerset<PH>::BHZ03_widening_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <vector>
+
+namespace {
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+const C_Polyhedron&
+aux1_test01(unsigned n) {
+  Variable x(0);
+  Variable y(1);
+
+  static std::vector<C_Polyhedron> p;
+  if (p.size() < 5) {
+    p.resize(5, C_Polyhedron(2));
+    p[2].add_constraint(0 <= x);
+    p[2].add_constraint(x <= 4);
+    p[2].add_constraint(0 <= y);
+    p[2].add_constraint(y <= 4);
+    p[1] = p[2];
+    p[1].add_constraint(x-y <= 3);
+    p[0] = p[1];
+    p[0].add_constraint(x+y >= 1);
+
+    p[3].add_constraint(0 <= x);
+    p[3].add_constraint(x <= 8);
+    p[3].add_constraint(0 <= y);
+    p[3].add_constraint(y <= 8);
+    p[3].add_constraint(x+y <= 14);
+    p[3].add_constraint(x-y >= -6);
+    p[4] = p[3];
+    p[3].add_constraint(5*x-y >= -2);
+    p[3].add_constraint(x+3*y >= 3);
+    p[4].add_constraint(4*x-y >= -3);
+    p[4].add_constraint(x+2*y >= 2);
+  }
+
+  if (n >= p.size()) {
+    unsigned new_size = p.size();
+    while (n >= new_size)
+      new_size *= 2;
+    p.resize(p.size()*2);
+  }
+
+  if (p[n].is_universe()) {
+    p[n] = aux1_test01(n-4);
+    p[n].affine_image(x, 2*x);
+    p[n].affine_image(y, 8 - 2*y);
+  }
+
+  return p[n];
+}
+
+Polyhedra_Powerset<C_Polyhedron>
+aux2_test01(unsigned n) {
+  Polyhedra_Powerset<C_Polyhedron> s(2, EMPTY);
+  if (n == 0) {
+
+    nout << "S0 = { P0 }" << endl;
+
+    s.add_disjunct(aux1_test01(0));
+    return s;
+  }
+
+  const int p_base = (n-1)/3*4;
+
+  switch (n % 3) {
+  case 1:
+
+    nout << "S" << n << " = { "
+	 << "P" << p_base + 1 << ", "
+	 << "P" << p_base + 3 << " }" << endl;
+
+    s.add_disjunct(aux1_test01(p_base + 1));
+    s.add_disjunct(aux1_test01(p_base + 3));
+    break;
+  case 2:
+
+    nout << "S" << n << " = { "
+	 << "P" << p_base + 2 << ", "
+	 << "P" << p_base + 3 << " }" << endl;
+
+    s.add_disjunct(aux1_test01(p_base + 2));
+    s.add_disjunct(aux1_test01(p_base + 3));
+    break;
+  case 0:
+
+    nout << "S" << n << " = { "
+	 << "P" << p_base + 2 << ", "
+	 << "P" << p_base + 4 << " }" << endl;
+
+    s.add_disjunct(aux1_test01(p_base + 2));
+    s.add_disjunct(aux1_test01(p_base + 4));
+    break;
+  }
+  return s;
+}
+
+void
+aux3_test01(std::ostream& s, const Variable& v) {
+  s << char('x' + v.id());
+}
+
+bool
+test01() {
+  // Install the alternate output function.
+  Variable::set_output_function(aux3_test01);
+
+  Polyhedra_Powerset<C_Polyhedron> T = aux2_test01(0);
+
+  nout << "T0 = " << T << endl;
+
+  bool converged = false;
+  for (unsigned n = 1; !converged && n <= 20; ++n) {
+    Polyhedra_Powerset<C_Polyhedron> Sn = aux2_test01(n);
+
+    nout << "S" << n << " = " << Sn << endl;
+
+    Sn.upper_bound_assign(T);
+    Sn.BHZ03_widening_assign<BHRZ03_Certificate>
+      (T, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+    nout << "T" << n << " = " << Sn << endl;
+
+    if (Sn.definitely_entails(T))
+      converged = true;
+    else
+      std::swap(Sn, T);
+  }
+
+  return converged;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron p(2);
+  C_Polyhedron q(2);
+  C_Polyhedron r(2);
+  C_Polyhedron s(2);
+  p.add_constraint(A >= 1);
+  p.add_constraint(B == 0);
+  q.add_constraint(A >= 2);
+  q.add_constraint(A <= 7);
+  q.add_constraint(B == 1);
+  r.add_constraint(A >= 3);
+  r.add_constraint(A <= 8);
+  r.add_constraint(B == 1);
+  s.add_constraint(A >= 1);
+  s.add_constraint(A <= 6);
+  s.add_constraint(B == 1);
+  Polyhedra_Powerset<C_Polyhedron> P(2, EMPTY);
+  P.add_disjunct(p);
+  P.add_disjunct(q);
+  P.add_disjunct(r);
+  P.add_disjunct(s);
+  Polyhedra_Powerset<C_Polyhedron> Q(2, EMPTY);
+  Q.add_disjunct(p);
+  Q.add_disjunct(q);
+  Q.add_disjunct(s);
+
+  nout << "P = " << P << endl
+       << "Q = " << Q << endl;
+
+  Polyhedra_Powerset<C_Polyhedron> old_P = P;
+  P.BHZ03_widening_assign<BHRZ03_Certificate>
+    (Q, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  nout << "P.BHZ03(Q, H79)" << " = " << P << endl;
+
+  return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+bool
+test03() {
+  Variable X(0);
+  Variable Y(1);
+
+  C_Polyhedron p1(2);
+  p1.add_constraint(X >= 0);
+  p1.add_constraint(Y >= 0);
+  p1.add_constraint(X <= 2);
+  p1.add_constraint(Y <= 1);
+
+  C_Polyhedron p2(2);
+  p2.add_constraint(X >= 0);
+  p2.add_constraint(Y >= 2);
+  p2.add_constraint(X <= 1);
+  p2.add_constraint(Y <= 3);
+
+  C_Polyhedron p3(2);
+  p3.add_constraint(X >= 3);
+  p3.add_constraint(Y >= 1);
+  p3.add_constraint(X <= 4);
+  p3.add_constraint(Y <= 3);
+
+  Polyhedra_Powerset<C_Polyhedron> T1(2, EMPTY);
+  T1.add_disjunct(p1);
+  T1.add_disjunct(p2);
+  T1.add_disjunct(p3);
+
+  C_Polyhedron p4(2);
+  p4.add_constraint(X >= 0);
+  p4.add_constraint(Y >= 4);
+  p4.add_constraint(X <= 2);
+  p4.add_constraint(Y <= 5);
+
+  Polyhedra_Powerset<C_Polyhedron> T2(2, EMPTY);
+  T2.add_disjunct(p1);
+  T2.add_disjunct(p2);
+  T2.add_disjunct(p3);
+  T2.add_disjunct(p4);
+
+  nout << "T1 = " << T1 << endl
+       << "T2 = " << T2 << endl;
+
+  Polyhedra_Powerset<C_Polyhedron> old_T2 = T2;
+  T2.BHZ03_widening_assign<BHRZ03_Certificate>
+    (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  C_Polyhedron pd(2);
+  pd.add_constraint(X >= 0);
+  pd.add_constraint(X <= 4);
+  pd.add_constraint(X + 2*Y >= 10);
+
+  Polyhedra_Powerset<C_Polyhedron> known_result = old_T2;
+  known_result.add_disjunct(pd);
+
+  nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+  nout << "known result" << " = " << known_result << endl;
+
+  return T2 == known_result
+    && T2.geometrically_covers(old_T2)
+    && T2.geometrically_covers(T1);
+}
+
+const C_Polyhedron&
+aux1_test04(unsigned n) {
+  Variable x(0);
+  Variable y(1);
+  static std::vector<C_Polyhedron> p;
+  if (p.size() < 5) {
+    p.resize(5, C_Polyhedron(2));
+    p[2].add_constraint(0 <= x);
+    p[2].add_constraint(x <= 4);
+    p[2].add_constraint(0 <= y);
+    p[2].add_constraint(y <= 4);
+    p[1] = p[2];
+    p[1].add_constraint(x-y <= 3);
+    p[0] = p[1];
+    p[0].add_constraint(x+y >= 1);
+
+    p[3].add_constraint(0 <= x);
+    p[3].add_constraint(x <= 8);
+    p[3].add_constraint(0 <= y);
+    p[3].add_constraint(y <= 8);
+    p[3].add_constraint(x+y <= 14);
+    p[3].add_constraint(x-y >= -6);
+    p[4] = p[3];
+    p[3].add_constraint(5*x-y >= -2);
+    p[3].add_constraint(x+3*y >= 3);
+    p[4].add_constraint(4*x-y >= -3);
+    p[4].add_constraint(x+2*y >= 2);
+  }
+
+  if (n >= p.size()) {
+    unsigned new_size = p.size();
+    while (n >= new_size)
+      new_size *= 2;
+    p.resize(p.size()*2);
+  }
+
+  if (p[n].is_universe()) {
+    p[n] = aux1_test04(n-4);
+    p[n].affine_image(x, 2*x);
+    p[n].affine_image(y, 8 - 2*y);
+  }
+
+  return p[n];
+}
+
+Polyhedra_Powerset<C_Polyhedron>
+aux2_test04(unsigned n) {
+  Polyhedra_Powerset<C_Polyhedron> s(2, EMPTY);
+  if (n == 0) {
+
+    nout << "S0 = { P0 }" << endl;
+
+    s.add_disjunct(aux1_test04(0));
+    return s;
+  }
+
+  const int p_base = (n-1)/3*4;
+
+  switch (n % 3) {
+  case 1:
+
+    nout << "S" << n << " = { "
+	 << "P" << p_base + 1 << ", "
+	 << "P" << p_base + 3 << " }" << endl;
+
+    s.add_disjunct(aux1_test04(p_base + 1));
+    s.add_disjunct(aux1_test04(p_base + 3));
+    break;
+  case 2:
+
+    nout << "S" << n << " = { "
+	 << "P" << p_base + 2 << ", "
+	 << "P" << p_base + 3 << " }" << endl;
+
+    s.add_disjunct(aux1_test04(p_base + 2));
+    s.add_disjunct(aux1_test04(p_base + 3));
+    break;
+  case 0:
+
+    nout << "S" << n << " = { "
+	 << "P" << p_base + 2 << ", "
+	 << "P" << p_base + 4 << " }" << endl;
+
+    s.add_disjunct(aux1_test04(p_base + 2));
+    s.add_disjunct(aux1_test04(p_base + 4));
+    break;
+  }
+  return s;
+}
+
+void
+aux3_test04(std::ostream& s, const Variable& v) {
+  s << char('x' + v.id());
+}
+
+bool
+test04() {
+  // Install the alternate output function.
+  Variable::set_output_function(aux3_test04);
+
+  Polyhedra_Powerset<C_Polyhedron> T = aux2_test04(0);
+
+  nout << "T0 = " << T << endl;
+
+  bool converged = false;
+  for (unsigned n = 1; !converged && n <= 20; ++n) {
+    Polyhedra_Powerset<C_Polyhedron> Sn = aux2_test04(n);
+
+    nout << "S" << n << " = " << Sn << endl;
+
+    Sn.upper_bound_assign(T);
+    Sn.BHZ03_widening_assign<H79_Certificate>
+      (T, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+    nout << "T" << n << " = " << Sn << endl;
+
+    if (Sn.definitely_entails(T))
+      converged = true;
+    else
+      std::swap(Sn, T);
+  }
+
+  return converged;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron p(2);
+  C_Polyhedron q(2);
+  C_Polyhedron r(2);
+  C_Polyhedron s(2);
+  p.add_constraint(A >= 1);
+  p.add_constraint(B == 0);
+  q.add_constraint(A >= 2);
+  q.add_constraint(A <= 7);
+  q.add_constraint(B == 1);
+  r.add_constraint(A >= 3);
+  r.add_constraint(A <= 8);
+  r.add_constraint(B == 1);
+  s.add_constraint(A >= 1);
+  s.add_constraint(A <= 6);
+  s.add_constraint(B == 1);
+  Polyhedra_Powerset<C_Polyhedron> P(2, EMPTY);
+  P.add_disjunct(p);
+  P.add_disjunct(q);
+  P.add_disjunct(r);
+  P.add_disjunct(s);
+  Polyhedra_Powerset<C_Polyhedron> Q(2, EMPTY);
+  Q.add_disjunct(p);
+  Q.add_disjunct(q);
+  Q.add_disjunct(s);
+
+  nout << "P = " << P << endl
+       << "Q = " << Q << endl;
+
+  Polyhedra_Powerset<C_Polyhedron> old_P = P;
+  P.BHZ03_widening_assign<H79_Certificate>
+    (Q, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  nout << "P.BHZ03(Q, H79)" << " = " << P << endl;
+
+  return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+bool
+test06() {
+  Variable X(0);
+  Variable Y(1);
+
+  C_Polyhedron p1(2);
+  p1.add_constraint(X >= 0);
+  p1.add_constraint(Y >= 0);
+  p1.add_constraint(X <= 2);
+  p1.add_constraint(Y <= 1);
+
+  C_Polyhedron p3(2);
+  p3.add_constraint(X >= 3);
+  p3.add_constraint(Y >= 1);
+  p3.add_constraint(X <= 4);
+  p3.add_constraint(Y <= 3);
+
+  C_Polyhedron p4(2);
+  p4.add_constraint(X >= 0);
+  p4.add_constraint(Y >= 4);
+  p4.add_constraint(X <= 2);
+  p4.add_constraint(Y <= 5);
+
+  Polyhedra_Powerset<C_Polyhedron> T1(2, EMPTY);
+  T1.add_disjunct(p1);
+  T1.add_disjunct(p3);
+  T1.add_disjunct(p4);
+
+  C_Polyhedron p2(2);
+  p2.add_constraint(X >= 0);
+  p2.add_constraint(Y >= 2);
+  p2.add_constraint(X <= 1);
+  p2.add_constraint(Y <= 3);
+
+  Polyhedra_Powerset<C_Polyhedron> T2(2, EMPTY);
+  T2.add_disjunct(p1);
+  T2.add_disjunct(p2);
+  T2.add_disjunct(p3);
+  T2.add_disjunct(p4);
+
+  nout << "T1 = " << T1 << endl
+       << "T2 = " << T2 << endl;
+
+  Polyhedra_Powerset<C_Polyhedron> old_T2 = T2;
+  T2.BHZ03_widening_assign<BHRZ03_Certificate>
+    (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  C_Polyhedron phull_T2(2);
+  phull_T2.add_constraint(X >= 0);
+  phull_T2.add_constraint(X <= 4);
+  phull_T2.add_constraint(Y >= 0);
+  phull_T2.add_constraint(Y <= 5);
+  phull_T2.add_constraint(X - 2*Y <= 2);
+  phull_T2.add_constraint(X + Y <= 7);
+
+  Polyhedra_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  known_result.add_disjunct(phull_T2);
+
+  nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+  nout << "known result" << " = " << known_result << endl;
+
+  return T2 == known_result
+    && T2.geometrically_covers(old_T2)
+    && T2.geometrically_covers(T1);
+}
+
+// This tests the first case of the widening definition when the widening
+// does nothing as the lgo for the polyhull is decreasing.
+bool
+test07() {
+  Variable X(0);
+  Variable Y(1);
+
+  C_Polyhedron p1(2);
+  p1.add_constraint(Y >= 2);
+  p1.add_constraint(Y - X <= 2);
+  p1.add_constraint(X + Y <= 4);
+
+  C_Polyhedron p2(2);
+  p2.add_constraint(X >= 0);
+  p2.add_constraint(Y >= 0);
+  p2.add_constraint(X <= 1);
+  p2.add_constraint(Y <= 1);
+
+  C_Polyhedron p3(2);
+  p3.add_constraint(X >= 2);
+  p3.add_constraint(Y >= 0);
+  p3.add_constraint(X <= 4);
+  p3.add_constraint(Y <= 1);
+
+  C_Polyhedron p4(2);
+  p4.add_constraint(X >= 3);
+  p4.add_constraint(Y >= 2);
+  p4.add_constraint(X <= 4);
+  p4.add_constraint(Y <= 3);
+
+  Polyhedra_Powerset<C_Polyhedron> T1(2, EMPTY);
+  T1.add_disjunct(p1);
+  T1.add_disjunct(p2);
+  T1.add_disjunct(p3);
+  T1.add_disjunct(p4);
+
+  C_Polyhedron q1(2);
+  q1.add_constraint(X >= 0);
+  q1.add_constraint(Y >= 0);
+  q1.add_constraint(X <= 4);
+  q1.add_constraint(Y <= 4);
+
+  C_Polyhedron q2(2);
+  q2.add_constraint(X >= 5);
+  q2.add_constraint(Y >= 3);
+  q2.add_constraint(X <= 6);
+  q2.add_constraint(Y <= 4);
+
+  C_Polyhedron q3(2);
+  q3.add_constraint(X >= 5);
+  q3.add_constraint(Y >= 0);
+  q3.add_constraint(X <= 6);
+  q3.add_constraint(Y <= 2);
+
+  Polyhedra_Powerset<C_Polyhedron> T2(2, EMPTY);
+  T2.add_disjunct(q1);
+  T2.add_disjunct(q2);
+  T2.add_disjunct(q3);
+
+  nout << "T1 = " << T1 << endl
+       << "T2 = " << T2 << endl;
+
+  Polyhedra_Powerset<C_Polyhedron> old_T2 = T2;
+  T2.BHZ03_widening_assign<BHRZ03_Certificate>
+    (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+
+  return T2 == old_T2
+    && T2.geometrically_covers(old_T2)
+    && T2.geometrically_covers(T1);
+}
+
+// This tests the first case of the widening definition when the widening
+// does nothing; the polyhull is stable with respect to the certificate
+// and the multiset ordering for this certificate is decreasing.
+bool
+test08() {
+  Variable X(0);
+  Variable Y(1);
+
+  C_Polyhedron p1(2);
+  p1.add_constraint(X >= 1);
+  p1.add_constraint(Y >= 4);
+  p1.add_constraint(X <= 7);
+  p1.add_constraint(Y <= 7);
+  p1.add_constraint(X - Y <= 2);
+  p1.add_constraint(X + Y >= 6);
+
+  C_Polyhedron p2(2);
+  p2.add_constraint(X >= 1);
+  p2.add_constraint(Y >= 1);
+  p2.add_constraint(X <= 3);
+  p2.add_constraint(Y <= 3);
+
+  C_Polyhedron p3(2);
+  p3.add_constraint(X >= 5);
+  p3.add_constraint(Y >= 1);
+  p3.add_constraint(X <= 7);
+  p3.add_constraint(Y <= 3);
+
+  Polyhedra_Powerset<C_Polyhedron> T1(2, EMPTY);
+  T1.add_disjunct(p1);
+  T1.add_disjunct(p2);
+  T1.add_disjunct(p3);
+
+  C_Polyhedron q1(2);
+  q1.add_constraint(X >= 0);
+  q1.add_constraint(Y >= 0);
+  q1.add_constraint(X <= 8);
+  q1.add_constraint(Y <= 8);
+
+  C_Polyhedron q2(2);
+  q2.add_constraint(X >= 10);
+  q2.add_constraint(Y >= 6);
+  q2.add_constraint(X <= 12);
+  q2.add_constraint(Y <= 8);
+
+  C_Polyhedron q3(2);
+  q3.add_constraint(X >= 10);
+  q3.add_constraint(Y >= 0);
+  q3.add_constraint(X <= 12);
+  q3.add_constraint(Y <= 4);
+
+  Polyhedra_Powerset<C_Polyhedron> T2(2, EMPTY);
+  T2.add_disjunct(q1);
+  T2.add_disjunct(q2);
+  T2.add_disjunct(q3);
+
+  nout << "T1 = " << T1 << endl
+       << "T2 = " << T2 << endl;
+
+  Polyhedra_Powerset<C_Polyhedron> old_T2 = T2;
+  T2.BHZ03_widening_assign<BHRZ03_Certificate>
+    (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+
+  return T2 == old_T2
+    && T2.geometrically_covers(old_T2)
+    && T2.geometrically_covers(T1);
+}
+
+// This tests the first case of the widening definition when the widening
+// of the elements of the set reduces the multiset ordering.
+bool
+test09() {
+  Variable X(0);
+  Variable Y(1);
+
+  C_Polyhedron p1(2);
+  p1.add_constraint(Y >= 2);
+  p1.add_constraint(Y <= 3);
+  p1.add_constraint(Y - X <= 2);
+  p1.add_constraint(X + Y <= 8);
+
+  C_Polyhedron p2(2);
+  p2.add_constraint(X >= 0);
+  p2.add_constraint(Y >= 0);
+  p2.add_constraint(X <= 1);
+  p2.add_constraint(Y <= 1);
+
+  C_Polyhedron p3(2);
+  p3.add_constraint(X >= 5);
+  p3.add_constraint(Y >= 0);
+  p3.add_constraint(X <= 8);
+  p3.add_constraint(Y <= 1);
+
+  C_Polyhedron p4(2);
+  p4.add_constraint(X >= 7);
+  p4.add_constraint(Y >= 4);
+  p4.add_constraint(X <= 8);
+  p4.add_constraint(Y <= 5);
+
+  Polyhedra_Powerset<C_Polyhedron> T1(2, EMPTY);
+  T1.add_disjunct(p1);
+  T1.add_disjunct(p2);
+  T1.add_disjunct(p3);
+  T1.add_disjunct(p4);
+
+  C_Polyhedron q1(2);
+  q1.add_constraint(Y >= 2);
+  q1.add_constraint(Y <= 4);
+  q1.add_constraint(Y - X <= 2);
+  q1.add_constraint(X + Y <= 8);
+
+  Polyhedra_Powerset<C_Polyhedron> T2(2, EMPTY);
+  T2.add_disjunct(q1);
+  T2.add_disjunct(p2);
+  T2.add_disjunct(p3);
+  T2.add_disjunct(p4);
+
+  nout << "T1 = " << T1 << endl
+       << "T2 = " << T2 << endl;
+
+  Polyhedra_Powerset<C_Polyhedron> old_T2 = T2;
+  T2.BHZ03_widening_assign<BHRZ03_Certificate>
+    (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  C_Polyhedron r1(2);
+  r1.add_constraint(Y >= 2);
+  r1.add_constraint(Y - X <= 2);
+  r1.add_constraint(X + Y <= 8);
+
+  Polyhedra_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  known_result.add_disjunct(r1);
+  known_result.add_disjunct(p2);
+  known_result.add_disjunct(p3);
+  known_result.add_disjunct(p4);
+
+  nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+
+  return T2 == known_result
+    && T2.geometrically_covers(old_T2)
+    && T2.geometrically_covers(T1);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST_F8(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST_F8(test09);
+END_MAIN
diff --git a/tests/Polyhedron/bounded1.cc b/tests/Polyhedron/bounded1.cc
new file mode 100644
index 0000000..96d0cf9
--- /dev/null
+++ b/tests/Polyhedron/bounded1.cc
@@ -0,0 +1,106 @@
+/* Test Polyhedron::is_bounded().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is a non-bounded polyhedron.
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  return !ph1.is_bounded();
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is a bounded polyhedron (it is a square);
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(x >= 2);
+  ph2.add_constraint(y >= 2);
+  ph2.add_constraint(x <= 4);
+  ph2.add_constraint(y <= 4);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ph2.is_bounded();
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is a universal, zero-dimensional polyhedron.
+  C_Polyhedron ph3;
+
+  print_constraints(ph3, "*** ph3 ***");
+
+  return ph3.is_bounded();
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is an empty, zero-dimensional polyhedron.
+  C_Polyhedron ph4;
+  ph4.add_constraint(Linear_Expression(-3) >= 0);
+
+  print_constraints(ph4, "*** ph4 ***");
+
+  return ph4.is_bounded();
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is an empty polyhedron.
+  C_Polyhedron ph5(4, EMPTY);
+
+  print_constraints(ph5, "*** ph5 ***");
+
+  return ph5.is_bounded();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/boundedaffineimage1.cc b/tests/Polyhedron/boundedaffineimage1.cc
new file mode 100644
index 0000000..aaae9a5
--- /dev/null
+++ b/tests/Polyhedron/boundedaffineimage1.cc
@@ -0,0 +1,120 @@
+/* Test Polyhedron::bounded_affine_image().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(B <= 4);
+  ph.add_constraint(A - B <= 2);
+  ph.add_constraint(A - B >= -2);
+
+  print_constraints(ph, "--- ph ---");
+
+  C_Polyhedron kr1 = ph;
+  C_Polyhedron kr2 = ph;
+
+  ph.bounded_affine_image(A, 7-B, B+3);
+
+  kr1.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, 7-B);
+  kr2.generalized_affine_image(A, LESS_THAN_OR_EQUAL, B+3);
+  kr1.intersection_assign(kr2);
+
+  bool ok = (ph == kr1);
+
+  print_generators(ph,
+		   "--- ph.bounded_affine_image(A, 7-B, B+3) ---");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(B <= 4);
+  ph.add_constraint(A - B <= 2);
+  ph.add_constraint(A - B >= -2);
+
+  print_constraints(ph, "--- ph ---");
+
+  C_Polyhedron kr1 = ph;
+  C_Polyhedron kr2 = ph;
+
+  ph.bounded_affine_image(A, 7-3*A+2*B, B+5*A-3);
+
+  kr1.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, 7-3*A+2*B);
+  kr2.generalized_affine_image(A, LESS_THAN_OR_EQUAL, B+5*A-3);
+  kr1.intersection_assign(kr2);
+
+  bool ok = (ph == kr1);
+
+  print_generators(ph,
+		   "--- ph.bounded_affine_image(A, 7-3*A+2*B, B+5*A-3) ---");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(A == B);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.bounded_affine_image(A, A+5, B);
+
+  C_Polyhedron kr1(2, EMPTY);
+
+  bool ok = (ph == kr1);
+
+  print_generators(ph, "--- ph.bounded_affine_image(A, A+5, B) ---");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/boundedaffinepreimage1.cc b/tests/Polyhedron/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..d438f02
--- /dev/null
+++ b/tests/Polyhedron/boundedaffinepreimage1.cc
@@ -0,0 +1,124 @@
+/* Test Polyhedron::bounded_affine_preimage().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(B <= 4);
+  ph.add_constraint(A - B <= 2);
+  ph.add_constraint(A - B >= -2);
+
+  print_constraints(ph, "--- ph ---");
+
+  // A longer way of computing the bounded affine preimage below.
+  C_Polyhedron known_result(ph);
+  known_result.add_space_dimensions_and_embed(1);
+  known_result.add_constraint(7-A <= B);
+  known_result.add_constraint(B <= A+3);
+  Variables_Set var_set;
+  var_set.insert(B);
+  known_result.remove_space_dimensions(var_set);
+
+  ph.bounded_affine_preimage(B, 7-A, A+3);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph.bounded_affine_preimage(B, 7-A, A+3) ---");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(B <= 4);
+  ph.add_constraint(A - B <= 2);
+  ph.add_constraint(A - B >= -2);
+
+  print_constraints(ph, "--- ph ---");
+
+  // A longer way of computing the bounded affine preimage below.
+  C_Polyhedron known_result(ph);
+  known_result.add_space_dimensions_and_embed(1);
+  Variable C(2);
+  known_result.add_constraint(7 - 3*A + 2*C <= B);
+  known_result.add_constraint(B <= C + 5*A - 3);
+  Variables_Set var_set;
+  var_set.insert(B);
+  known_result.remove_space_dimensions(var_set);
+
+  ph.bounded_affine_preimage(B, 7-3*A+2*B, B+5*A-3);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- "
+		   "ph.bounded_affine_preimage(B, 7-3*A+2*B, B+5*A-3) ---");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(A == B);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.bounded_affine_preimage(A, B+5, A-3);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph.bounded_affine_preimage(A, B+5, A-3) ---");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/boundedbhrz03extrapolation1.cc b/tests/Polyhedron/boundedbhrz03extrapolation1.cc
new file mode 100644
index 0000000..909744c
--- /dev/null
+++ b/tests/Polyhedron/boundedbhrz03extrapolation1.cc
@@ -0,0 +1,111 @@
+/* Test Polyhedron::bounded_BHRZ03_extrapolation_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define PROPAGATION_STEPS 1
+#define NUMBER_OF_TOKENS 1
+
+namespace {
+
+void
+aux_test01(std::ostream& s, const Variable& v) {
+  s << char('i' + v.id());
+}
+
+bool
+test01() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+  Variable::set_output_function(aux_test01);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(i == 1);
+  ph.add_constraint(j == 1);
+  ph.add_constraint(0 <= k);
+  ph.add_constraint(k <= 1);
+
+  C_Polyhedron old_ph(3, EMPTY);
+
+  // Propagation.
+  for (int steps = 0; steps < PROPAGATION_STEPS; ++steps) {
+    old_ph = ph;
+
+    ph.affine_image(i, i+1);
+    ph.affine_image(j, j+k);
+    ph.affine_image(k, k-1);
+
+    old_ph.poly_hull_assign(ph);
+
+    ph = old_ph;
+  }
+
+  // Widening.
+  Constraint_System up_to_constraints = ph.constraints();
+
+  print_constraints(up_to_constraints, "*** up_to_constraints ***");
+
+  unsigned tokens = NUMBER_OF_TOKENS;
+
+  for (int step = 1; ; ++step) {
+
+    nout << "\nAt step " << step << endl;
+    print_constraints(ph);
+
+    old_ph = ph;
+
+    ph.affine_image(i, i+1);
+    ph.affine_image(j, j+k);
+    ph.affine_image(k, k-1);
+
+    ph.poly_hull_assign(old_ph);
+    if (old_ph.contains(ph))
+      break;
+
+    // Notice that neither the H79 nor the BHRZ03 limited
+    // extrapolations (used as widenings here) allow to obtain the
+    // desired postfixpoint for this example.  Both the H79 and the
+    // BHRZ03 bounded extrapolation operators do achieve this result.
+    ph.bounded_H79_extrapolation_assign(old_ph, up_to_constraints, &tokens);
+  }
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(-i - k >= -2);
+  known_result.add_constraint(i - j + k >= 0);
+  known_result.add_constraint(i - j + 2*k >= -1);
+  known_result.add_constraint(i + k >= 1);
+  known_result.add_constraint(i >= 1);
+  known_result.add_constraint(i - j >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "\nPostfixpoint");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/boundedh79extrapolation1.cc b/tests/Polyhedron/boundedh79extrapolation1.cc
new file mode 100644
index 0000000..3595dd8
--- /dev/null
+++ b/tests/Polyhedron/boundedh79extrapolation1.cc
@@ -0,0 +1,74 @@
+/* Test Polyhedron::bounded_H79_extrapolation_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x-3 >= 0);
+  ph1.add_constraint(x-3 <= 1);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(y <= 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(2*x-5 >= 0);
+  ph2.add_constraint(x-3 <= 1);
+  ph2.add_constraint(2*y+3 >= 0);
+  ph2.add_constraint(2*y-5 <= 0);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  Constraint_System cs;
+  cs.insert(x >= y);
+
+  print_constraints(cs, "*** cs ***");
+
+  ph2.bounded_H79_extrapolation_assign(ph1, cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 2);
+  known_result.add_constraint(x <= 4);
+  known_result.add_constraint(y >= -2);
+  known_result.add_constraint(x >= y);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2,
+		    "*** After ph2.bounded_H79_extrapolation_assign(ph1, cs) "
+		    "***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8A(test01);
+END_MAIN
diff --git a/tests/Polyhedron/boundingbox1.cc b/tests/Polyhedron/boundingbox1.cc
new file mode 100644
index 0000000..9750a9b
--- /dev/null
+++ b/tests/Polyhedron/boundingbox1.cc
@@ -0,0 +1,594 @@
+/* Test Polyhedron::shrink_bounding_box().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "BBox.hh"
+
+namespace {
+
+// A non-bounded closed polyhedron consisting of the line x = y.
+// The bounding box is the xy plane - the universal polyhedron.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x - y >= 0);
+
+  BBox pbox(2);
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  BBox nbox(2);
+  ph.shrink_bounding_box(nbox);
+
+  print_constraints(ph, "*** test01 ph ***");
+  nbox.print(nout, "*** test01 nbox ***");
+  pbox.print(nout, "*** test01 pbox ***");
+
+  BBox known_box(2);
+
+  known_box.print(nout, "*** test01 known_box ***");
+
+  return nbox == known_box && pbox == known_box;
+}
+
+// A non-bounded closed polyhedron  in 2D consisting of a wedge bounded
+// by y >= 0 and x >= y.
+// The resulting bounding box depends on the complexity class.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= y);
+  ph.add_constraint(y >= 0);
+
+  BBox pbox(ph.space_dimension());
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  BBox nbox(ph.space_dimension());
+  ph.shrink_bounding_box(nbox);
+
+  print_constraints(ph, "*** test02 ph ***");
+  nbox.print(nout, "*** test02 nbox ***");
+  pbox.print(nout, "*** test02 pbox ***");
+
+  BBox known_nbox(2);
+  known_nbox.raise_lower_bound(0, true, 0, 1);
+  known_nbox.raise_lower_bound(1, true, 0, 1);
+
+  BBox known_pbox(2);
+  known_pbox.raise_lower_bound(1, true, 0, 1);
+
+  known_nbox.print(nout, "*** test02 known_nbox ***");
+  known_pbox.print(nout, "*** test02 known_pbox ***");
+
+  return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
+}
+
+// A bounded non-rectangular closed polyhedron in 2D.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(3*x + y >= 2);
+  ph.add_constraint(x <= 4);
+  ph.add_constraint(y <= 4);
+
+  BBox pbox(ph.space_dimension());
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  BBox nbox(ph.space_dimension());
+  ph.shrink_bounding_box(nbox);
+
+  print_constraints(ph, "*** test03 ph ***");
+  nbox.print(nout, "*** test03 nbox ***");
+  pbox.print(nout, "*** test03 pbox ***");
+
+  BBox known_nbox(2);
+  known_nbox.raise_lower_bound(0, true, -2, 3);
+  known_nbox.lower_upper_bound(0, true, 4, 1);
+  known_nbox.raise_lower_bound(1, true, -10, 1);
+  known_nbox.lower_upper_bound(1, true, 12, 3);
+
+  BBox known_pbox(2);
+  known_pbox.lower_upper_bound(0, true, 4, 1);
+  known_pbox.lower_upper_bound(1, true, 4, 1);
+
+  known_nbox.print(nout, "*** test03 known_nbox ***");
+  known_pbox.print(nout, "*** test03 known_pbox ***");
+
+  return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
+}
+
+// An unbounded closed polyhedron in 4D but bounded in 2D.
+bool
+test04() {
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x + y >= 2);
+  ph.add_constraint(x <= 4);
+  ph.add_constraint(y <= 4);
+  ph.add_constraint(z >= 5);
+
+  BBox pbox(ph.space_dimension());
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  BBox nbox(ph.space_dimension());
+  ph.shrink_bounding_box(nbox);
+
+  print_constraints(ph, "*** test04 ph ***");
+  nbox.print(nout, "*** test04 nbox ***");
+  pbox.print(nout, "*** test04 pbox ***");
+
+  BBox known_nbox(4);
+  known_nbox.raise_lower_bound(1, true, -2, 3);
+  known_nbox.lower_upper_bound(1, true, 4, 1);
+  known_nbox.raise_lower_bound(2, true, -10, 1);
+  known_nbox.lower_upper_bound(2, true, 12, 3);
+  known_nbox.raise_lower_bound(3, true, 15, 3);
+
+  BBox known_pbox(4);
+  known_pbox.lower_upper_bound(1, true, 4, 1);
+  known_pbox.lower_upper_bound(2, true, 4, 1);
+  known_pbox.raise_lower_bound(3, true, 5, 1);
+
+  known_nbox.print(nout, "*** test04 known_nbox ***");
+  known_pbox.print(nout, "*** test04 known_pbox ***");
+
+  return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
+}
+
+// This is the universal, 2-dimensional closed polyhedron.
+bool
+test05() {
+  C_Polyhedron ph(2);
+
+  BBox pbox(ph.space_dimension());
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  BBox nbox(ph.space_dimension());
+  ph.shrink_bounding_box(nbox);
+
+  print_constraints(ph, "*** test05 ph ***");
+  nbox.print(nout, "*** test05 nbox ***");
+  pbox.print(nout, "*** test05 pbox ***");
+
+  BBox known_box(2);
+
+  known_box.print(nout, "*** test05 known_box ***");
+
+  return nbox == known_box && pbox == known_box;
+}
+
+// A zero-dimensional closed polyhedron.
+bool
+test06() {
+  C_Polyhedron ph;
+
+  BBox pbox(ph.space_dimension());
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  BBox nbox(ph.space_dimension());
+  ph.shrink_bounding_box(nbox);
+
+  print_constraints(ph, "*** test06 ph ***");
+  nbox.print(nout, "*** test06 nbox ***");
+  pbox.print(nout, "*** test06 pbox ***");
+
+  BBox known_box(0);
+
+  known_box.print(nout, "*** test06 known_box ***");
+
+  return nbox == known_box && pbox == known_box;
+}
+
+// An empty closed polyhedron in 2D.
+bool
+test07() {
+  C_Polyhedron ph(2, EMPTY);
+
+  BBox pbox(ph.space_dimension());
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  BBox nbox(ph.space_dimension());
+  ph.shrink_bounding_box(nbox);
+
+  print_constraints(ph, "*** test07 ph ***");
+  nbox.print(nout, "*** test07 nbox ***");
+  pbox.print(nout, "*** test07 pbox ***");
+
+  BBox known_box(ph.space_dimension());
+  known_box.set_empty();
+
+  known_box.print(nout, "*** test07 known_box ***");
+
+  return nbox == known_box && pbox == known_box;
+}
+
+// A bounded polyhedron that is a single point.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x == 2);
+  ph.add_constraint(y == 4);
+
+  BBox pbox(ph.space_dimension());
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  BBox nbox(ph.space_dimension());
+  ph.shrink_bounding_box(nbox);
+
+  print_constraints(ph, "*** test08 ph ***");
+  nbox.print(nout, "*** test08 nbox ***");
+  pbox.print(nout, "*** test08 pbox ***");
+
+  BBox known_box(2);
+  known_box.raise_lower_bound(0, true, 2, 1);
+  known_box.lower_upper_bound(0, true, 2, 1);
+  known_box.raise_lower_bound(1, true, 4, 1);
+  known_box.lower_upper_bound(1, true, 4, 1);
+
+  known_box.print(nout, "*** test08 known_box ***");
+
+  return nbox == known_box && pbox == known_box;
+}
+
+// A unit square closed polyhedron.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+
+  C_Polyhedron ph(cs);
+
+  BBox pbox(ph.space_dimension());
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  BBox nbox(ph.space_dimension());
+  ph.shrink_bounding_box(nbox);
+
+  print_constraints(ph, "*** test09 ph ***");
+  nbox.print(nout, "*** test09 nbox ***");
+  pbox.print(nout, "*** test09 pbox ***");
+
+  BBox known_box(2);
+  known_box.raise_lower_bound(0, true, 0, 1);
+  known_box.lower_upper_bound(0, true, 1, 1);
+  known_box.raise_lower_bound(1, true, 0, 1);
+  known_box.lower_upper_bound(1, true, 1, 1);
+
+  known_box.print(nout, "*** test09 known_box ***");
+
+  return nbox == known_box && pbox == known_box;
+}
+
+// A bounded rectangular closed polyhedron;
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(x >= 1);
+  ph.add_constraint(x <= 3);
+  ph.add_constraint(y <= 3);
+  ph.add_constraint(y >= 1);
+
+  print_constraints(ph, "*** test10 ph ***");
+
+  BBox pbox(ph.space_dimension());
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  BBox nbox(ph.space_dimension());
+  ph.shrink_bounding_box(nbox);
+
+  nbox.print(nout, "*** test10 nbox ***");
+  pbox.print(nout, "*** test10 pbox ***");
+
+  BBox known_box(2);
+  known_box.raise_lower_bound(0, true, 1, 1);
+  known_box.lower_upper_bound(0, true, 3, 1);
+  known_box.raise_lower_bound(1, true, 1, 1);
+  known_box.lower_upper_bound(1, true, 3, 1);
+
+  known_box.print(nout, "*** test10 known_box ***");
+
+  return nbox == known_box && pbox == known_box;
+}
+
+// A bounded polyhedron having redundant constraints.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x == 3);
+  ph.add_constraint(y == 1);
+  ph.add_constraint(x + y == 4);
+  ph.add_constraint(x - y == 2);
+  ph.add_constraint(3*x + y == 10);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(y <= 5);
+  ph.add_constraint(x + 2*y >= 5);
+
+  print_constraints(ph, "*** test11 ph ***");
+
+  BBox pbox(ph.space_dimension());
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  pbox.print(nout, "*** test11 pbox ***");
+
+  BBox known_box(2);
+  known_box.raise_lower_bound(0, true, 3, 1);
+  known_box.lower_upper_bound(0, true, 3, 1);
+  known_box.raise_lower_bound(1, true, 1, 1);
+  known_box.lower_upper_bound(1, true, 1, 1);
+
+  known_box.print(nout, "*** test11 known_box ***");
+
+  return pbox == known_box;
+}
+
+// The box is the xy plane.
+bool
+test12() {
+  Bounding_Box box(2);
+
+  C_Polyhedron ph(box, From_Bounding_Box());
+
+  C_Polyhedron known_ph(box.space_dimension());
+
+  print_generators(ph, "*** test12 ph ***");
+  print_generators(known_ph, "*** test12 known_ph ***");
+
+  return ph == known_ph;
+}
+
+// This box is the closed +ve quadrant.
+bool
+test13() {
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 0, 1);
+  box.raise_lower_bound(1, true, 0, 1);
+
+  C_Polyhedron ph(box, From_Bounding_Box());
+
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(x >= 0);
+  known_ph.add_constraint(y >= 0);
+
+  print_generators(ph, "*** test13 ph ***");
+  print_generators(known_ph, "*** test13 known_ph ***");
+
+  return ph == known_ph;
+}
+
+// A bounded box in 2D.
+bool
+test14() {
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, -2, 3);
+  box.lower_upper_bound(0, true, 4, 1);
+  box.raise_lower_bound(1, true, -10, 1);
+  box.lower_upper_bound(1, true, 12, 3);
+
+  C_Polyhedron ph(box, From_Bounding_Box());
+
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(3*x >= -2);
+  known_ph.add_constraint(x <= 4);
+  known_ph.add_constraint(y <= 4);
+  known_ph.add_constraint(y >= -10);
+
+  print_generators(ph, "*** test14 ph ***");
+  print_generators(known_ph, "*** test14 known_ph ***");
+
+  return ph == known_ph;
+}
+
+// An unbounded closed box in 4D but bounded in 2D.
+bool
+test15() {
+  Bounding_Box box(4);
+  box.raise_lower_bound(1, true, -2, 3);
+  box.lower_upper_bound(1, true, 4, 1);
+  box.raise_lower_bound(2, true, -10, 1);
+  box.lower_upper_bound(2, true, 12, 3);
+  box.raise_lower_bound(3, true, 15, 3);
+
+  C_Polyhedron ph(box, From_Bounding_Box());
+
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(3*x >= -2);
+  known_ph.add_constraint(x <= 4);
+  known_ph.add_constraint(y <= 4);
+  known_ph.add_constraint(y >= -10);
+  known_ph.add_constraint(z >= 5);
+
+  print_generators(ph, "*** test15 ph ***");
+  print_generators(known_ph, "*** test15 known_ph ***");
+
+  return ph == known_ph;
+}
+
+// A zero-dimensional box.
+bool
+test16() {
+  Bounding_Box box(0);
+
+  C_Polyhedron ph(box, From_Bounding_Box());
+
+  C_Polyhedron known_ph;
+
+  print_generators(ph, "*** test16 ph ***");
+  print_generators(known_ph, "*** test16 known_ph ***");
+
+  return ph == known_ph;
+}
+
+// An empty closed box in 2D.
+bool
+test17() {
+  Bounding_Box box(2);
+  box.set_empty();
+
+  C_Polyhedron ph(box, From_Bounding_Box());
+
+  print_constraints(ph, "*** test17 ph ***");
+
+  C_Polyhedron known_ph(2, EMPTY);
+
+  print_constraints(known_ph, "*** test17 known_ph ***");
+
+  return ph == known_ph;
+}
+
+// A single point.
+bool
+test18() {
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 2, 1);
+  box.lower_upper_bound(0, true, 2, 1);
+  box.raise_lower_bound(1, true, 4, 1);
+  box.lower_upper_bound(1, true, 4, 1);
+
+  C_Polyhedron ph(box, From_Bounding_Box());
+
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(x == 2);
+  known_ph.add_constraint(y == 4);
+
+  print_generators(ph, "*** test18 ph ***");
+  print_generators(known_ph, "*** test18 known_ph ***");
+
+  return ph == known_ph;
+}
+
+// A closed unit square.
+bool
+test19() {
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 0, 1);
+  box.lower_upper_bound(0, true, 1, 1);
+  box.raise_lower_bound(1, true, 0, 1);
+  box.lower_upper_bound(1, true, 1, 1);
+
+  C_Polyhedron ph(box, From_Bounding_Box());
+
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System known_cs;
+  known_cs.insert(x >= 0);
+  known_cs.insert(x <= 1);
+  known_cs.insert(y >= 0);
+  known_cs.insert(y <= 1);
+
+  C_Polyhedron known_ph(known_cs);
+
+  print_generators(ph, "*** test19 ph generators ***");
+  print_generators(known_ph, "*** test19 known_ph ***");
+
+  return ph == known_ph;
+}
+
+// Constructs the polyhedron { x >= 0, x <= 1/2, y >= 0 }
+// from the corresponding box.
+bool
+test20() {
+  Bounding_Box box(2);
+  box.raise_lower_bound(0, true, 0, 1);
+  box.lower_upper_bound(0, true, 1, 2);
+  box.raise_lower_bound(1, true, 0, 1);
+
+  C_Polyhedron ph(box, From_Bounding_Box());
+
+  print_generators(ph, "*** test20 ph ***");
+
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(x >= 0);
+  known_ph.add_constraint(2*x <= 1);
+  known_ph.add_constraint(y >= 0);
+
+  print_generators(known_ph, "*** test20 known_ph ***");
+
+  return ph == known_ph;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Polyhedron/boundingbox2.cc b/tests/Polyhedron/boundingbox2.cc
new file mode 100644
index 0000000..2fe0ded
--- /dev/null
+++ b/tests/Polyhedron/boundingbox2.cc
@@ -0,0 +1,50 @@
+/* Test Polyhedron::shrink_bounding_box().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "BBox.hh"
+
+namespace {
+
+bool
+test01() {
+  C_Polyhedron ph(1, EMPTY);
+
+  BBox nbox(ph.space_dimension());
+  ph.shrink_bounding_box(nbox);
+
+  print_constraints(ph, "*** ph ***");
+  nbox.print(nout, "*** nbox ***");
+
+  BBox known_box(ph.space_dimension());
+  known_box.set_empty();
+
+  known_box.print(nout, "*** known_box ***");
+
+  return nbox == known_box;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/boundingbox3.cc b/tests/Polyhedron/boundingbox3.cc
new file mode 100644
index 0000000..a43bcf3
--- /dev/null
+++ b/tests/Polyhedron/boundingbox3.cc
@@ -0,0 +1,218 @@
+/* Test NNC_Polyhedron::shrink_bounding_box().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "BBox.hh"
+
+namespace {
+
+// An unbounded NNC polyhedron in 4D but bounded in 2D
+// with strict inequality and closure points at the lower bound.
+bool
+test01() {
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  NNC_Polyhedron ph(4);
+  ph.add_constraint(3 * x + y > 2);
+  ph.add_constraint(x <= 4);
+  ph.add_constraint(y <= 4);
+  ph.add_constraint(z >= 5);
+
+  BBox pbox(ph.space_dimension());
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  BBox nbox(ph.space_dimension());
+  ph.shrink_bounding_box(nbox);
+
+  print_constraints(ph, "*** test01 ph ***");
+  nbox.print(nout, "*** test01 nbox ***");
+  pbox.print(nout, "*** test01 pbox ***");
+
+  BBox known_nbox(4);
+  known_nbox.raise_lower_bound(1, false, -2, 3);
+  known_nbox.lower_upper_bound(1, true, 4, 1);
+  known_nbox.raise_lower_bound(2, false, -10, 1);
+  known_nbox.lower_upper_bound(2, true, 4, 1);
+  known_nbox.raise_lower_bound(3, true, 5, 1);
+
+  BBox known_pbox(4);
+  known_pbox.lower_upper_bound(1, true, 4, 1);
+  known_pbox.lower_upper_bound(2, true, 4, 1);
+  known_pbox.raise_lower_bound(3, true, 5, 1);
+
+  known_nbox.print(nout, "*** test9 known_nbox ***");
+  known_pbox.print(nout, "*** test9 known_pbox ***");
+
+  return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
+}
+
+// A bounded NNC polyhedron with strict inequalities
+// causing upper and lower bounds of the box to be open.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(3 * x + y >= 2);
+  ph.add_constraint(x < 4);
+  ph.add_constraint(y <= 4);
+
+  BBox pbox(ph.space_dimension());
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  BBox nbox(ph.space_dimension());
+  ph.shrink_bounding_box(nbox);
+
+  print_constraints(ph, "*** test02 ph ***");
+  nbox.print(nout, "*** test02 nbox ***");
+  pbox.print(nout, "*** test02 pbox ***");
+
+  BBox known_nbox(2);
+  known_nbox.raise_lower_bound(0, true, -2, 3);
+  known_nbox.lower_upper_bound(0, false, 4, 1);
+  known_nbox.raise_lower_bound(1, false, -10, 1);
+  known_nbox.lower_upper_bound(1, true, 4, 1);
+
+  BBox known_pbox(2);
+  known_pbox.lower_upper_bound(0, false, 4, 1);
+  known_pbox.lower_upper_bound(1, true, 4, 1);
+
+  known_nbox.print(nout, "*** test02 known_nbox ***");
+  known_pbox.print(nout, "*** test02 known_pbox ***");
+
+  return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
+}
+
+// An empty polyhedron in 2D defined using strict constraints.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(x > 0);
+  ph.add_constraint(x < 0);
+  ph.add_constraint(y > 0);
+  ph.add_constraint(y < 0);
+
+  Bounding_Box pbox(2);
+  ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+  Bounding_Box nbox(2);
+  ph.shrink_bounding_box(nbox);
+
+  NNC_Polyhedron known_ph(2, EMPTY);
+  NNC_Polyhedron known_pph(pbox, From_Bounding_Box());
+  NNC_Polyhedron known_nph(nbox, From_Bounding_Box());
+
+  print_generators(ph, "*** test03 ph ***");
+  print_generators(known_pph, "*** test03 known_pph ***");
+  print_generators(known_nph, "*** test03 known_nph ***");
+
+  return ph == known_ph && ph == known_nph && ph == known_ph;
+}
+
+// An unbounded box in 4D but bounded in 2D with strict inequalities.
+bool
+test04() {
+  Bounding_Box box(4);
+  box.raise_lower_bound(1, false, -2, 3);
+  box.lower_upper_bound(1, true, 4, 1);
+  box.raise_lower_bound(2, false, -10, 1);
+  box.lower_upper_bound(2, true, 12, 3);
+  box.raise_lower_bound(3, true, 15, 3);
+
+  NNC_Polyhedron ph(box, From_Bounding_Box());
+
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  NNC_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(3*x > -2);
+  known_ph.add_constraint(x <= 4);
+  known_ph.add_constraint(y <= 4);
+  known_ph.add_constraint(y > -10);
+  known_ph.add_constraint(z >= 5);
+
+  print_generators(ph, "*** test04 ph ***");
+  print_generators(known_ph, "*** test04 known_ph ***");
+
+  return ph == known_ph;
+}
+
+// A bounded NNC polyhedron with strict inequalities
+// causing upper and lower bounds of the box to be open.
+bool
+test05() {
+  Bounding_Box box(4);
+  box.raise_lower_bound(1, true, -2, 3);
+  box.lower_upper_bound(1, false, 4, 1);
+  box.raise_lower_bound(2, false, -10, 1);
+  box.lower_upper_bound(2, true, 12, 3);
+
+  NNC_Polyhedron ph(box, From_Bounding_Box());
+
+  Variable x(1);
+  Variable y(2);
+
+  NNC_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(3*x >= -2);
+  known_ph.add_constraint(x < 4);
+  known_ph.add_constraint(y <= 4);
+  known_ph.add_constraint(y > -10);
+
+  print_generators(ph, "*** test05 ph ***");
+  print_generators(known_ph, "*** test05 known_ph ***");
+
+  return ph == known_ph;
+}
+
+// An empty box in 2D.
+bool
+test06() {
+  Bounding_Box box(2);
+  box.set_empty();
+
+  NNC_Polyhedron ph(box, From_Bounding_Box());
+
+  print_constraints(ph, "*** test06 ph ***");
+
+  NNC_Polyhedron known_ph(2, EMPTY);
+
+  print_constraints(known_ph, "*** test06 known_ph ***");
+
+  return ph == known_ph;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST_F8A(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/bounds1.cc b/tests/Polyhedron/bounds1.cc
new file mode 100644
index 0000000..bf82834
--- /dev/null
+++ b/tests/Polyhedron/bounds1.cc
@@ -0,0 +1,64 @@
+/* Test Polyhedron::bounds_from_below() and Polyhedron::bounds_from_above().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  C_Polyhedron ph1;
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  bool ok = ph1.bounds_from_above(Linear_Expression(3))
+    && ph2.bounds_from_below(A);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 1);
+  ph.add_constraint(B >= 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool ok = !ph.bounds_from_above(A + B) && ph.bounds_from_below(A + B);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/bug2.cc b/tests/Polyhedron/bug2.cc
new file mode 100644
index 0000000..f80e9eb
--- /dev/null
+++ b/tests/Polyhedron/bug2.cc
@@ -0,0 +1,62 @@
+/* Try to reproduce a strange behavior observed on MacOs X.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <fstream>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+int
+main() TRY {
+  std::ifstream s(SRCDIR "/bug2.dat");
+  if (!s) {
+    std::cerr << "Cannot open data file!!!" << endl;
+    exit(1);
+  }
+
+  NNC_Polyhedron ph;
+  ph.ascii_load(s);
+
+  const Constraint_System& cs = ph.constraints();
+  unsigned num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(), cs_end = cs.end();
+       i != cs_end;
+       ++i)
+    ++num_constraints;
+  ph.ascii_dump(nout);
+  const Generator_System& gs = ph.generators();
+  unsigned num_points = 0;
+  for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
+       i != gs_end;
+       ++i) {
+    if (i->type() != Generator::POINT) {
+
+      nout << "i->type() == " << i->type() << endl;
+
+      exit(1);
+    }
+    ++num_points;
+  }
+
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/cnncconversion1.cc b/tests/Polyhedron/cnncconversion1.cc
new file mode 100644
index 0000000..b64a6a4
--- /dev/null
+++ b/tests/Polyhedron/cnncconversion1.cc
@@ -0,0 +1,103 @@
+/* Test conversions between C_Polyhedron and NNC_Polyhedron.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A - B >= 0);
+  ph1.add_constraint(A >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(ph1);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A - B >= 0);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(3);
+  ph1.add_constraint(x >= 5);
+  ph1.add_constraint(y > x - 3);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(ph1);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(x >= 5);
+  known_result.add_constraint(y >= x - 3);
+
+  return ph2 == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A < 2);
+  ph1.add_constraint(B > 0);
+  ph1.add_constraint(A - B > 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(ph1);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B >= 0);
+
+  return ph2 == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/concatenate1.cc b/tests/Polyhedron/concatenate1.cc
new file mode 100644
index 0000000..11714e3
--- /dev/null
+++ b/tests/Polyhedron/concatenate1.cc
@@ -0,0 +1,283 @@
+/* Test Polyhedron::concatenate_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+  C_Polyhedron ph(cs1);
+
+  print_constraints(ph, "*** ph before ***");
+
+  Constraint_System cs2;
+  cs2.insert(x >= 1);
+  cs2.insert(y >= 1);
+  cs2.insert(x - y >= -1);
+  C_Polyhedron qh(cs2);
+
+  C_Polyhedron copy_ph = ph;
+
+  ph.concatenate_assign(qh);
+
+  copy_ph.add_space_dimensions_and_embed(2);
+  copy_ph.add_constraint(z >= 1);
+  copy_ph.add_constraint(w >= 1);
+  copy_ph.add_constraint(z - w >= -1);
+
+  bool ok = (ph == copy_ph);
+
+  print_constraints(ph, "*** concatenate_assign ***");
+  print_constraints(copy_ph, "*** embed + renaming + insert ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "--- ph ---");
+
+  Constraint_System cs;
+  cs.insert(x >= y);
+  cs.insert(x >= 2);
+  C_Polyhedron qh(cs);
+
+  print_constraints(qh, "--- qh ---");
+
+  ph.concatenate_assign(qh);
+
+  C_Polyhedron known_result(4, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "--- After concatenate_assign(qh) ---");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph;
+
+  print_constraints(ph, "--- ph ---");
+
+  Constraint_System cs;
+  cs.insert(x - 3 >= y);
+  cs.insert(y >= 0);
+  C_Polyhedron qh(cs);
+
+  print_constraints(qh, "--- qh ---");
+
+  ph.concatenate_assign(qh);
+
+  bool ok = (ph == qh);
+
+  print_constraints(ph, "--- After concatenate_assign(qh) ---");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(2*A));
+  gs1.insert(point(2*B));
+  gs1.insert(point(2*A + 2*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(2*A));
+  gs2.insert(point(2*A + 3*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.concatenate_assign(ph2);
+
+  C_Polyhedron known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(C == 2);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D <= 3);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After concatenate_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A - B >= 0);
+
+  C_Polyhedron ph2;
+
+  C_Polyhedron known_result(ph1);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.concatenate_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.concatenate_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(1);
+  ph1.generators();
+  ph1.add_constraint(A >= 0);
+
+  C_Polyhedron ph2(1);
+  ph2.generators();
+  ph2.add_constraint(A == 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.concatenate_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.concatenate_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(1, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(ray(A));
+
+  C_Polyhedron ph2(1, EMPTY);
+  ph2.add_generator(point(2*A));
+  ph2.constraints();
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.concatenate_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** After ph1.concatenate_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(-A >= -2);
+  ph1.generators();
+  ph1.add_generator(point(0*A));
+  ph1.add_generator(point(2*A));
+
+  C_Polyhedron ph2(1, EMPTY);
+  ph2.add_generator(point(10*A));
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.concatenate_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(-A >= -2);
+  known_result.add_constraint(B == 10);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.concatenate_assign(ph2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/congruences1.cc b/tests/Polyhedron/congruences1.cc
new file mode 100644
index 0000000..4bc5f07
--- /dev/null
+++ b/tests/Polyhedron/congruences1.cc
@@ -0,0 +1,53 @@
+/* Test C_Polyhedron(Congruence_System&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Congruence_System cgs;
+  cgs.insert(x %= 3);
+  cgs.insert(y == 3);
+
+  C_Polyhedron ph(cgs);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y == 3);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After add_congruences ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/constraints1.cc b/tests/Polyhedron/constraints1.cc
new file mode 100644
index 0000000..7254483
--- /dev/null
+++ b/tests/Polyhedron/constraints1.cc
@@ -0,0 +1,165 @@
+/* Test Polyhedron::constraints().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(0*A == 1);
+
+  print_constraints(ph1, "*** ph constraints ***");
+
+  C_Polyhedron known_result = ph1;
+
+  Constraint_System cs = ph1.constraints();
+  C_Polyhedron ph2(cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph1(3, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron known_result = ph1;
+
+  Constraint_System cs = ph1.constraints();
+  C_Polyhedron ph2(cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  C_Polyhedron ph1(0);
+  ph1.add_constraint(Linear_Expression::zero() == 1);
+  C_Polyhedron known_result(ph1);
+
+  const Constraint_System cs = ph1.constraints();
+
+  C_Polyhedron ph2(cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.generators();
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+
+  C_Polyhedron known_result(ph1);
+
+  Constraint_System cs = ph1.constraints();
+  C_Polyhedron ph2(cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(ray(A));
+  ph1.add_generator(ray(B));
+
+  C_Polyhedron known_result(ph1);
+
+  Constraint_System cs = ph1.constraints();
+  C_Polyhedron ph2(cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint_and_minimize(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  Constraint_System cs = ph.constraints();
+  cs.insert(A >= B);
+
+  print_constraints(cs, "*** cs ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A >= B);
+
+  return C_Polyhedron(cs) == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/contains1.cc b/tests/Polyhedron/contains1.cc
new file mode 100644
index 0000000..e8768e1
--- /dev/null
+++ b/tests/Polyhedron/contains1.cc
@@ -0,0 +1,114 @@
+/* Test Polyhedron::contains(const Polyhedron&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron segment(2);
+  segment.add_constraint(x >= 0);
+  segment.add_constraint(x <= 1);
+  segment.add_constraint(y == 0);
+
+  print_constraints(segment, "*** segment constraints ***");
+  print_generators(segment, "*** segment generators ***");
+
+  C_Polyhedron halfline(2);
+  halfline.add_constraint(x >= 0);
+  halfline.add_constraint(y == 0);
+
+  print_constraints(halfline, "*** halfline constraints ***");
+  print_generators(halfline, "*** halfline generators ***");
+
+  bool segment_includes_halfline = segment.contains(halfline);
+
+  nout << "segment ";
+  if (segment_includes_halfline)
+    nout << "includes ";
+  else
+    nout << "does not include ";
+  nout << "or is equal to halfline" << endl;
+
+  bool halfline_includes_segment = halfline.contains(segment);
+
+  nout << "halfline ";
+  if (halfline_includes_segment)
+    nout << "includes ";
+  else
+    nout << "does not include ";
+  nout << "or is equal to segment" << endl;
+
+  return halfline_includes_segment && !segment_includes_halfline;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x + 0*y >= 2);
+  C_Polyhedron p_half_space(cs);
+
+  print_constraints(p_half_space, "*** p_half_space constraints ***");
+  print_generators(p_half_space, "*** p_half_space generators ***");
+
+  Generator_System gs;
+  gs.insert(point(2*x));
+  gs.insert(line(x+y));
+  C_Polyhedron p_line(gs);
+
+  print_constraints(p_line, "*** p_line constraints ***");
+  print_generators(p_line, "*** p_line generators ***");
+
+  bool p_half_space_includes_p_line = p_half_space.contains(p_line);
+
+  nout << "p_half_space ";
+  if (p_half_space_includes_p_line)
+    nout << "includes ";
+  else
+    nout << "does not include ";
+  nout << "or is equal to p_line" << endl;
+
+  bool p_line_includes_p_half_space = p_line.contains(p_half_space);
+
+  nout << "p_line ";
+  if (p_line_includes_p_half_space)
+    nout << "includes ";
+  else
+    nout << "does not include ";
+  nout << "or is equal to p_half_space" << endl;
+
+  return !p_line_includes_p_half_space && !p_half_space_includes_p_line;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/contains2.cc b/tests/Polyhedron/contains2.cc
new file mode 100644
index 0000000..ed2cd3d
--- /dev/null
+++ b/tests/Polyhedron/contains2.cc
@@ -0,0 +1,176 @@
+/* Test NNC_Polyhedron::contains(const Polyhedron&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  // Building a square without vertices.
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 2);
+  cs.insert(x - y < 1);
+  cs.insert(x - y > -1);
+
+  NNC_Polyhedron ph1(cs);
+
+  // Building an equivalent square.
+  Generator_System gs;
+  gs.insert(closure_point());
+  gs.insert(closure_point(x));
+  gs.insert(closure_point(y));
+  gs.insert(closure_point(x + y));
+  gs.insert(point(x, 10));
+  gs.insert(point(y, 10));
+  gs.insert(point(x + 10*y, 10));
+  gs.insert(point(10*x + y, 10));
+
+  NNC_Polyhedron ph2(gs);
+
+  bool ok = ph1.contains(ph2);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A > 0);
+  ph1.add_constraint(B > 0);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(line(A + B));
+  NNC_Polyhedron ph2(gs2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  bool ok = !ph1.contains(ph2);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= B);
+  cs.insert(B >= 0);
+  C_Polyhedron ph1(cs);
+  C_Polyhedron ph2(ph1);
+  ph2.add_constraint(A == B);
+
+  bool ok = ph1.contains(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= B);
+  cs.insert(B >= 0);
+  NNC_Polyhedron ph1(cs);
+  NNC_Polyhedron ph2(ph1);
+  ph2.add_constraint(A > B);
+
+  bool ok = ph1.strictly_contains(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs1;
+  cs1.insert(A >= B);
+  cs1.insert(B >= 0);
+  C_Polyhedron ph1(cs1);
+  Constraint_System cs2;
+  cs2.insert(A >= B);
+  cs2.insert(A <= 0);
+  C_Polyhedron ph2(cs2);
+
+  bool ok = (ph1 != ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  NNC_Polyhedron ph1(cs);
+  NNC_Polyhedron ph2(ph1);
+  ph2.add_constraint(A > 0);
+
+  bool ok = ph1.strictly_contains(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/disjoint1.cc b/tests/Polyhedron/disjoint1.cc
new file mode 100644
index 0000000..ad2ce3b
--- /dev/null
+++ b/tests/Polyhedron/disjoint1.cc
@@ -0,0 +1,145 @@
+/* Test Polyhedron::is_disjoint_from(const Polyhedron& y).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(B == 0);
+  ph1.add_constraint(A >= 1);
+  ph1.add_constraint(A <= 2);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A == 0);
+  ph2.add_constraint(B >= 1);
+  ph2.add_constraint(B <= 2);
+
+  bool ok = ph1.is_disjoint_from(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+C_Polyhedron
+half_strip(const Generator& p, const Linear_Expression& e) {
+  assert(p.is_point());
+
+  Linear_Expression e1(p);
+  e1 += 3*Variable(0);
+
+  Generator_System gs;
+  gs.insert(p);
+  gs.insert(ray(e));
+  gs.insert(point(e1, p.divisor()));
+  C_Polyhedron ph(gs);
+  return ph;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1 = half_strip(point(A + B), B);
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point(2*A + B));
+  ph2.add_generator(point(4*A + 3*B));
+  ph2.add_generator(ray(A - B));
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return !disjoint;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1 = half_strip(point(A + B), B);
+  C_Polyhedron ph2 = half_strip(point(4*A + B), B);
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return !disjoint;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1 = half_strip(point(A + B), B);
+  C_Polyhedron ph2 = half_strip(point(A + B), -B);
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return !disjoint;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1 = half_strip(point(), B);
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point(2*A - 2*B));
+  ph2.add_generator(point(-2*A + 2*B));
+  ph2.add_generator(ray(-A - B));
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return !disjoint;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/disjoint2.cc b/tests/Polyhedron/disjoint2.cc
new file mode 100644
index 0000000..a877ea7
--- /dev/null
+++ b/tests/Polyhedron/disjoint2.cc
@@ -0,0 +1,132 @@
+/* Test Polyhedron::is_disjoint_from(const Polyhedron& y).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+NNC_Polyhedron
+half_strip(const Generator& p,
+	   const Linear_Expression& e,
+	   bool closed = true) {
+  assert((p.is_point() && closed) || (p.is_closure_point() && ! closed));
+
+  Linear_Expression e1(p);
+  e1 += 3*Variable(0);
+
+  Generator_System gs;
+  gs.insert(p);
+  gs.insert(ray(e));
+  if (closed)
+    gs.insert(point(e1, p.divisor()));
+  else {
+    gs.insert(closure_point(e1, p.divisor()));
+    e1 -= Variable(0);
+    e1 += e.coefficient(Variable(1)) * p.divisor() * Variable(1);
+    gs.insert(point(e1));
+  }
+  NNC_Polyhedron ph(gs);
+  return ph;
+}
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1 = half_strip(point(A + B), B);
+
+  NNC_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point(3*A + B));
+  ph2.add_generator(closure_point(2*A + B));
+  ph2.add_generator(closure_point(4*A + 3*B));
+  ph2.add_generator(ray(A - B));
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return !disjoint;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1 = half_strip(point(A + B), B);
+  NNC_Polyhedron ph2 = half_strip(closure_point(4*A + B), B, false);
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return disjoint;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1 = half_strip(point(A + B), B);
+  NNC_Polyhedron ph2 = half_strip(closure_point(A + B), -B, false);
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return disjoint;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1 = half_strip(point(), B);
+
+  NNC_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point(-2*A - 2*B));
+  ph2.add_generator(closure_point(2*A - 2*B));
+  ph2.add_generator(closure_point(-2*A + 2*B));
+  ph2.add_generator(ray(-A - B));
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return disjoint;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/dualhypercubes.cc b/tests/Polyhedron/dualhypercubes.cc
new file mode 100644
index 0000000..8904361
--- /dev/null
+++ b/tests/Polyhedron/dualhypercubes.cc
@@ -0,0 +1,290 @@
+/* Exploit smf when computing the intersection of NNC dual hypercubes.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "timings.hh"
+#include <vector>
+
+#ifndef EXP_EVAL
+#define EXP_EVAL 0
+#endif
+
+namespace {
+
+void
+closure_points_dual_hypercube(const dimension_type dims,
+			      const Linear_Expression& weight_center,
+			      const Coefficient& half_diagonal,
+			      Generator_System& gs) {
+  // An ill-formed (it has no points at all) generator system
+  // for a dual hypercube.
+  for (dimension_type axis = dims; axis-- > 0; ) {
+    gs.insert(closure_point(weight_center + half_diagonal * Variable(axis)));
+    gs.insert(closure_point(weight_center - half_diagonal * Variable(axis)));
+  }
+}
+
+void
+add_facets(dimension_type& to_be_added,
+	   Generator_System& gs,
+	   const Linear_Expression& expr,
+	   const dimension_type axis,
+	   const dimension_type dims,
+	   const Linear_Expression& weight_center,
+	   const Coefficient& half_diagonal) {
+  // Return if we have already added all facets.
+  if (to_be_added == 0)
+    return;
+
+  Linear_Expression expr1 = expr;
+  expr1 += half_diagonal * Variable(axis);
+  Linear_Expression expr2 = expr;
+  expr2 -= half_diagonal * Variable(axis);
+
+  if (axis == 0) {
+    gs.insert(point(dims * weight_center + expr1, dims));
+    --to_be_added;
+    if (to_be_added == 0)
+      return;
+    gs.insert(point(dims * weight_center + expr2, dims));
+    --to_be_added;
+    return;
+  }
+
+  // Here axis > 0.
+  // First recursive call with variable with index `axis'
+  // having coordinate 1/dims.
+  add_facets(to_be_added, gs, expr1,
+	     axis-1, dims, weight_center, half_diagonal);
+  if (to_be_added == 0)
+    return;
+  // Second recursive call with variable with index `axis'
+  // having coordinate -1/dims.
+  add_facets(to_be_added, gs, expr2,
+	     axis-1, dims, weight_center, half_diagonal);
+}
+
+NNC_Polyhedron
+NNC_dual_hypercube(const dimension_type dims,
+		   const Linear_Expression& weight_center,
+		   const Coefficient& half_diagonal,
+		   const int facet_percentage) {
+  Generator_System gs;
+  closure_points_dual_hypercube(dims, weight_center, half_diagonal, gs);
+  // Number of facets in the closed dual hypercube.
+  dimension_type num_facets = 1;
+  for (dimension_type axis = dims; axis-- > 0; )
+    num_facets *= 2;
+  dimension_type facets_to_be_added = (num_facets * facet_percentage) / 100;
+  if (facets_to_be_added == 0)
+    // There has to be a point, at least.
+    gs.insert(point(weight_center));
+  else
+    add_facets(facets_to_be_added, gs, Linear_Expression(0),
+	       dims-1, dims, weight_center, half_diagonal);
+  // Actually build the polyhedron.
+  return NNC_Polyhedron(gs);
+}
+
+void
+build_polyhedra(const dimension_type dims,
+		const int perc,
+		std::vector<NNC_Polyhedron>& ph) {
+
+  Linear_Expression weight_center;
+
+  // 1st-polyhedron.
+  weight_center = Linear_Expression(0);
+  for (dimension_type axis = dims; axis-- > 0; )
+    weight_center += Variable(axis);
+  ph.push_back(NNC_dual_hypercube(dims, weight_center, 5, perc));
+
+  // 2nd-polyhedron.
+  weight_center = Linear_Expression(0);
+  for (dimension_type axis = dims; axis-- > 0; )
+    weight_center += 2*Variable(axis);
+  ph.push_back(NNC_dual_hypercube(dims, weight_center, 4, perc));
+
+  // 3rd-polyhedron.
+  weight_center = Linear_Expression(0);
+  for (dimension_type axis = dims; axis-- > 0; )
+    if (axis % 2 == 0)
+      weight_center += 10*Variable(axis);
+    else
+      weight_center += 2*Variable(axis);
+  ph.push_back(NNC_dual_hypercube(dims, weight_center, 5, perc));
+
+  // 4th-polyhedron.
+  weight_center = Linear_Expression(0);
+  for (dimension_type axis = dims; axis-- > 0; )
+    if (axis % 2 == 0)
+      weight_center += 10*Variable(axis);
+    else
+      weight_center += Variable(axis);
+  ph.push_back(NNC_dual_hypercube(dims, weight_center, 4, perc));
+}
+
+void
+computation(std::vector<NNC_Polyhedron>& ph, bool enhanced) {
+  nout << endl;
+  if (enhanced)
+    nout << "Enhanced computation: ";
+  else
+    nout << "Standard computation: ";
+  nout << "working with 4 NNC dual hypercubes of dimension "
+       << ph[0].space_dimension() << endl;
+  start_clock();
+
+  // Compute the intersection of ph[0] and ph[1].
+
+  // Print dimensions of arguments
+  // (being careful to override library laziness).
+  vnout << "Computing intersection of ph[0] and ph[1]:" << endl;
+  vnout << "===  ph[0] generators ===" << endl;
+  ph[0].generators().ascii_dump(vnout);
+  vnout << "===  ph[1] generators ===" << endl;
+  ph[1].generators().ascii_dump(vnout);
+
+  if (enhanced) {
+    ph[0].minimized_constraints();
+    ph[1].minimized_constraints();
+
+    // Print dimensions of arguments.
+    vnout << "After the computation of smf for constraints" << endl;
+  }
+
+  vnout << "===  ph[0] constraints ===" << endl;
+  ph[0].constraints().ascii_dump(vnout);
+  vnout << "===  ph[1] constraints ===" << endl;
+  ph[1].constraints().ascii_dump(vnout);
+  vnout << endl;
+
+  ph[0].intersection_assign(ph[1]);
+
+  // Compute the intersection of ph[2] and ph[3].
+
+  // Print dimensions of arguments
+  // (being careful to override library laziness).
+  vnout << "Computing intersection of ph[2] and ph[3]:" << endl;
+  vnout << "===  ph[2] generators ===" << endl;
+  ph[2].generators().ascii_dump(vnout);
+  vnout << "===  ph[3] generators ===" << endl;
+  ph[3].generators().ascii_dump(vnout);
+
+  if (enhanced) {
+    ph[2].minimized_constraints();
+    ph[3].minimized_constraints();
+
+    // Print dimensions of arguments.
+    vnout << "After the computation of smf for constraints" << endl;
+  }
+  vnout << "===  ph[2] constraints ===" << endl;
+  ph[2].constraints().ascii_dump(vnout);
+  vnout << "===  ph[3] constraints ===" << endl;
+  ph[3].constraints().ascii_dump(vnout);
+  vnout << endl;
+
+  ph[2].intersection_assign(ph[3]);
+
+  // Compute the poly-hull of ph[0] and ph[2].
+  vnout << "Computing poly-hull of ph[0] and ph[2]:" << endl;
+  if (enhanced) {
+    ph[0].minimized_generators();
+    ph[2].minimized_generators();
+
+    // Print dimensions of arguments.
+    vnout << "After the computation of smf for generators" << endl;
+  }
+
+  // Print dimensions of arguments
+  // (being careful to override library laziness).
+  vnout << "===  ph[0] generators ===" << endl;
+  ph[0].generators().ascii_dump(vnout);
+  vnout << "===  ph[2] generators ===" << endl;
+  ph[2].generators().ascii_dump(vnout);
+  vnout << endl;
+
+  ph[0].poly_hull_assign(ph[2]);
+  ph[0].constraints();
+
+  nout << "Wmf final result timing: ";
+  print_clock(nout);
+  nout << endl;
+
+  // How many constraints and generators obtained?
+  vnout << "Final result (wmf)" << endl;
+  vnout << "===  ph[0] constraints ===" << endl;
+  ph[0].constraints().ascii_dump(vnout);
+  vnout << endl;
+
+  nout << "Smf (cons) final result timing: ";
+  start_clock();
+  ph[0].minimized_constraints();
+  print_clock(nout);
+  nout << endl;
+
+  // How many constraints and generators obtained?
+  vnout << "Final result (smf cons)" << endl;
+  vnout << "===  ph[0] constraints ===" << endl;
+  ph[0].constraints().ascii_dump(vnout);
+}
+
+bool
+test01() {
+  std::vector<NNC_Polyhedron> ph;
+
+#if EXP_EVAL
+  dimension_type first_dim = 4;
+  dimension_type last_dim = 5;
+#else
+  dimension_type first_dim = 2;
+  dimension_type last_dim = 4;
+#endif
+
+  for (dimension_type dims = first_dim; dims <= last_dim; dims++)
+    for (int perc = 25; perc <= 50; perc += 25) {
+
+      nout << endl
+	   << "++++++++ DIM = " << dims << "  ++++++++"
+	   << endl
+	   << "++++++++ PERC = " << perc << " ++++++++"
+	   << endl;
+
+      // Standard evaluation strategy.
+      ph.clear();
+      build_polyhedra(dims, perc, ph);
+      computation(ph, false);
+
+      // Enhanced evaluation strategy.
+      ph.clear();
+      build_polyhedra(dims, perc, ph);
+      computation(ph, true);
+    }
+  // FIXME: check the cardinalities of the results obtained.
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F64(test01);
+END_MAIN
diff --git a/tests/Polyhedron/empty1.cc b/tests/Polyhedron/empty1.cc
new file mode 100644
index 0000000..9491ab5
--- /dev/null
+++ b/tests/Polyhedron/empty1.cc
@@ -0,0 +1,50 @@
+/* Different ways of creating an empty polyhedron.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // This is the easy way to create
+  // the empty polyhedron in the zero-dimension space.
+  C_Polyhedron ph1(0, EMPTY);
+
+  // This is a more convoluted way of doing the same thing
+  // using an empty system of generators.
+  Generator_System gs;
+  C_Polyhedron ph2(gs);
+
+  bool ok = (ph1 == ph2 && ph1.is_empty() && ph2.is_empty());
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/equals1.cc b/tests/Polyhedron/equals1.cc
new file mode 100644
index 0000000..66fca88
--- /dev/null
+++ b/tests/Polyhedron/equals1.cc
@@ -0,0 +1,61 @@
+/* Test operator==(const Polyhedron&, const Polyhedron&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(100*A-100*B <= 0);
+  ph1.add_constraint(-100*A <= -300);
+  ph1.add_constraint(-100*B <= -300);
+  ph1.add_constraint(100*A <= 30400);
+  ph1.add_constraint(100*B <= 30400);
+  ph1.add_constraint(-258*A+209*B <= 7093);
+  ph1.add_constraint(258*A-209*B <= 8907);
+  ph1.add_constraint(151*A-214*B <= 5393);
+  ph1.add_constraint(-151*A+214*B <= 10606);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(258*A - 209*B >= -7093);
+  ph2.add_constraint(151*A - 214*B >= -10606);
+  ph2.add_constraint(A >= 3);
+  ph2.add_constraint(-A + B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  bool ok = (ph1 == ph2);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F32(test01);
+END_MAIN
diff --git a/tests/Polyhedron/exceptions1.cc b/tests/Polyhedron/exceptions1.cc
new file mode 100644
index 0000000..4544c64
--- /dev/null
+++ b/tests/Polyhedron/exceptions1.cc
@@ -0,0 +1,1375 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using std::invalid_argument;
+
+namespace {
+
+void
+error1() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Generator_System gs;
+  try {
+    // This is an incorrect use of the function Generator::point(expr, d):
+    // it is illegal to build a point with the denominator
+    // equal to zero.
+    gs.insert(point(x + y + z, 0));
+
+    // It is an error if the exception is not thrown.
+    exit(1);
+  }
+
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    exit(1);
+  }
+}
+
+void
+error2() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point(x + y));
+  gs.insert(ray(x + 0*y));
+  gs.insert(ray(0*x + y));
+  C_Polyhedron ph(gs);
+  Linear_Expression coeff1 = x + y + 1;
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::affine_image(v, expr,d): it is illegal applying
+    // the function with a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    ph.affine_image(x, coeff1, d);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+ catch (...) {
+    exit(1);
+  }
+}
+
+void
+error3() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1;
+  Generator_System gs;
+  gs.insert(point(x + y));
+  C_Polyhedron ph2(gs);
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::poly_hull_assign(p): it is illegal to use
+    // it with two polyhedra of different dimensions.
+    ph1.poly_hull_assign_and_minimize(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error4() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Generator_System gs;
+  gs.insert(line(x + y + z));
+
+  try {
+    // This is an incorrect use of the function
+    // C_Polyhedron::C_Polyhedron(gs): it is illegal to build a
+    // polyhedron starting from a system of generators that does not
+    // contain a point.
+    C_Polyhedron ph(gs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error5() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Generator_System gs;
+  gs.insert(point(0*x + 1*y +2*z));
+  C_Polyhedron ph(gs);
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(z);
+
+  ph.remove_space_dimensions(to_be_removed);
+
+  try {
+    to_be_removed.insert(x);
+    // This is an incorrect use use of function
+    // C_Polyhedron::remove_space_dimensions(to_be_remove).
+    // Here the set `to_be_removed' still contains variable `z'.
+    // This variable is now beyond the space dimension,
+    // so that a dimension-incompatibility exception is obtained.
+    ph.remove_space_dimensions(to_be_removed);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error6() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid used of the function
+    // C_Polyhedron::affine_image(v, expr, d): it is illegal to
+    // apply this function to a variable that is not in the space of
+    // the polyhedron.
+    ph.affine_image(y, x + 1);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error7() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 1);
+  ph.add_constraint(y >= 1);
+
+  try {
+    // This is an invalid used of the function
+    // C_Polyhedron::affine_image(v, expr, d): it is illegal to
+    // use a variable in the expression that does not appear in the
+    // space of the polyhedron.
+    ph.affine_image(y, x + z + 1);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error8() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= y);
+  Linear_Expression coeff = x + y + 1;
+  try {
+    // This is an incorrect use of the function
+    // C_Polyhedron::affine_preimage(v, expr, d): it is illegal
+    // to apply to a polyhedron an expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    ph.affine_preimage(x, coeff, d);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error9() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(x + y));
+  gs.insert(ray(x));
+
+  C_Polyhedron ph(gs);
+  try {
+    // This is an invalid used of the function
+    // C_Polyhedron::affine_image(v, expr, d): it is illegal apply
+    // the transformation to a variable that is not in the space
+    // of the polyhedron.
+    ph.affine_preimage(z, x + 1);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(x));
+  gs.insert(line(x + y));
+
+  C_Polyhedron ph(gs);
+  try {
+    // This is an invalid used of the function
+    // C_Polyhedron::affine_preimage(v, expr, d): it is illegal to
+    // apply to a polyhedron an expression that contains a variable that
+    // is not in the space of the polyhedron.
+    ph.affine_preimage(y, x + z + 1);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error11() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= y);
+
+  C_Polyhedron ph2(3);
+
+  try {
+    // This is an invalid use of function
+    // C_Polyhedron::intersection_assign_and_minimize(ph2): it is illegal
+    // to apply this function to two polyhedra of different dimensions.
+    ph1.intersection_assign_and_minimize(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error12() {
+  C_Polyhedron ph1(7);
+
+  C_Polyhedron ph2(15);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::intersection_assign(ph2): it is illegal to apply
+    // this function to two polyhedron of different dimensions.
+    ph1.intersection_assign(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error13() {
+  Variable w(4);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_generators_and_minimize(gs): it is illegal
+    // to add a system of generator that is not dimension-compatible
+    // with the polyhedron.
+    Generator_System gs;
+    gs.insert(point(w));
+    ph.add_generators_and_minimize(gs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error14() {
+  C_Polyhedron ph(5);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::remove_higher_space_dimensions(n): it is illegal to
+    // erase a variable that is not in the space of the polyhedron.
+    ph.remove_higher_space_dimensions(7);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error15() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_constraints_and_minimize(cs): it is illegal to
+    // add a system of constraints that is not dimensional incompatible
+    // with the polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y >= 0);
+    ph.add_constraints_and_minimize(cs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error16() {
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_constraint(c): it is illegal to insert a
+    // constraints that contains a variable that is not in the space
+    // of the polyhedron.
+    ph.add_constraint(y >= 0);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error17() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_constraints(cs): it is illegal to add a system
+    // of constraints that is dimensional incompatible with the
+    // polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y == 0);
+    ph.add_constraints(cs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error18() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(x));
+
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(x));
+  gs2.insert(ray(x + y));
+
+  C_Polyhedron ph2(gs2);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::poly_hull_assign(ph2): it is illegal to apply
+    // this function to two polyhedra with different dimensions.
+    ph1.poly_hull_assign(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error19() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1, EMPTY);
+
+  try {
+    // This is an invalid use of the function C_Polyhedron::add_generator(g):
+    // it is illegal to insert a generator that is dimensional
+    // incompatible with the polyhedron.
+    ph.add_generator(point(x + y));
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error20() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1, EMPTY);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_generators(gs): it is illegal to a system of
+    // generators that is dimensional incompatible with the
+    // polyhedron.
+    Generator_System gs;
+    gs.insert(point());
+    gs.insert(line(x + y));
+    ph.add_generators(gs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error21() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Generator_System gs;
+  gs.insert(ray(x + y));
+  gs.insert(point());
+
+  C_Polyhedron ph(gs);
+  try {
+    // This is an invalid use of the function C_Polyhedron::relation_with(c):
+    // it is illegal to use a constraints that is dimensional
+    // incompatible with the polyhedron.
+    Constraint c(z >= 0);
+    ph.relation_with(c);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error22() {
+  Variable z(2);
+
+  C_Polyhedron ph(2);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::relation_with(g): it is illegal to apply this
+    // function to a generator that is not dimension-compatible with
+    // the polyhedron.
+    Generator g(point(z));
+    ph.relation_with(g);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error23() {
+  C_Polyhedron ph1(5);
+  C_Polyhedron ph2(10);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::H79_widening_assign(ph2): it is illegal to apply
+    // this function to two polyhedra that are not dimensional
+    // compatible.
+    ph2.H79_widening_assign(ph1);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error24() {
+  Variable y(1);
+
+  C_Polyhedron ph1(1);
+  C_Polyhedron ph2(2);
+
+  Constraint_System cs;
+  cs.insert(y <= 9);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::limited_H79_extrapolation_assign(ph2, cs): it is
+    // illegal to apply this function to two polyhedra that are not
+    // dimension-compatible.
+    ph2.limited_H79_extrapolation_assign(ph1, cs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error25() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x - y >= 0);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(x <= 2);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(x - y >= 0);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(z <= 5);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::limited_H79_extrapolation_assign(ph, cs): it is
+    // illegal to apply this function to a system of constraints that
+    // is not dimension-compatible with the two polyhedra.
+    ph2.limited_H79_extrapolation_assign(ph1, cs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error26() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(x - y >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(x - y == 0);
+
+  try {
+    // This is an invalid use of Polyhedron::contains(): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    ph1.contains(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error27() {
+  Variable x(0);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  try {
+    // This is an invalid use of method
+    // C_Polyhedron::add_generator(g): it is illegal to insert a
+    // generator that is not dimension-compatible with the
+    // polyhedron.
+    Generator g(ray(x));
+    ph.add_generator(g);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error28() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3, EMPTY);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_generators(gs): it is illegal to add a system
+    // of generators with no points to an empty polyhedron.
+    Generator_System gs;
+    gs.insert(ray(x + y));
+    gs.insert(ray(x - y));
+    ph.add_generators(gs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error29() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_generators_and_minimize(gs): it is illegal
+    // to apply this function with a system of generators with no
+    // points to an empty polyhedron.
+    Generator_System gs;
+    gs.insert(line(x));
+    gs.insert(line(y));
+    ph.add_generators_and_minimize(gs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error30() {
+
+  C_Polyhedron ph1(3);
+  C_Polyhedron ph2(5);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::poly_difference_assign(ph2): it is impossible to apply
+    // this function to two polyhedra of different dimensions.
+    ph1.poly_difference_assign(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error31() {
+  C_Polyhedron ph1(3);
+  C_Polyhedron ph2(8);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::time_elapse_assign(p): it is illegal to use
+    // it with two polyhedra of different dimensions.
+    ph1.time_elapse_assign(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error32() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(ray(A));
+  gs1.insert(line(B));
+
+  const Generator_System gs2 = gs1;
+
+  print_generators(gs2, "*** gs2 ***");
+
+  try {
+    // This is an incorrect use of the function
+    // `C_Polyhedron::C_Polyhedron(gs)': it is illegal to build a
+    // closed polyhedron starting from a constant system of
+    // generators that does not contain points.
+    C_Polyhedron ph2(gs2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error33() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  try {
+    // This is an incorrect use of the function
+    // `add_generator(g)': it is illegal to add a
+    // ray to an empty polyhedron.
+    ph1.add_generator(ray(A));
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error34() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 3);
+  ph.add_constraint(A <= 5);
+
+  try {
+    // This is an invalid used of the function
+    // `C_Polyhedron::bounds_from_above(v, expr, d)': it is illegal to
+    // use a variable in the expression that does not appear in the
+    // space of the polyhedron.
+    ph.bounds_from_above(A + B);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error35() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(line(A));
+  gs.insert(ray(B));
+
+  try {
+    // This is an invalid used of the function
+    // `add_generators_and_minimize(gs)': it is illegal to
+    // add a system of generators that does not contain points
+    // to an empty polyhedron.
+    ph.add_generators_and_minimize(gs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error36() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(ray(A));
+  gs.insert(ray(B));
+
+  try {
+    // This is an invalid used of the function
+    // `add_generators(gs)': it is illegal to
+    // add a system of generators that does not contain points
+    // to an empty polyhedron.
+    ph.add_generators(gs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error37() {
+  C_Polyhedron ph1(5);
+  C_Polyhedron ph2(10);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::BHRZ03_widening_assign(ph2): it is illegal to apply
+    // this function to two polyhedra that are not dimensional
+    // compatible.
+    ph2.BHRZ03_widening_assign(ph1);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error38() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A - B >= 0);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::generalized_affine_image(v, r, expr, d): it is illegal
+    // applying the function with a linear expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, B + 2, d);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+ catch (...) {
+    exit(1);
+  }
+}
+
+void
+error39() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::generalized_affine_image(v, r, expr, d): it is illegal to
+    // use a variable in the expression that does not appear in the polyhedron.
+    ph.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, B);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error40() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 1);
+
+  try {
+    // This is an invalid used of the function
+    // C_Polyhedron::generalized_affine_image(v, r, expr, d): it is illegal to
+    // apply this function to a variable that is not in the space of
+    // the polyhedron.
+    ph.generalized_affine_image(B, LESS_THAN_OR_EQUAL, A + 1);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error41() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::generalized_affine_image(lhs, r, rhs):
+    // it is illegal to use a variable in the `rhs' expression that
+    // does not appear in the polyhedron.
+    ph.generalized_affine_image(A + B, GREATER_THAN_OR_EQUAL, B + C);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error42() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::generalized_affine_image(lhs, r, rhs):
+    // it is illegal to use a variable in the `lhs' expression that
+    // does not appear in the polyhedron.
+    ph.generalized_affine_image(B + C, LESS_THAN_OR_EQUAL, A + 1);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error43() {
+  Generator_System gs;
+  Linear_Expression e;
+  try {
+    // This is an incorrect use of function
+    // Generator::ray(e):
+    // the origin can not be a ray.
+    gs.insert(ray(e));
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error44() {
+  Generator_System gs;
+  Linear_Expression e;
+  try {
+    // This is an incorrect use of function
+    // Generator::line(e):
+    // the origin can not be a line.
+    gs.insert(line(e));
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error45() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator g = point(3*A - 2*B);
+  try {
+    // This is an incorrect use of function
+    // Generator::coefficient(v):
+    // it is impossible to compute the coefficient
+    // of a variable that is not in the space of the
+    // generator.
+    g.coefficient(C);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error46() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator g = line(3*A - 2*B);
+  try {
+    // This is an incorrect use of method Generator::divisor(): it is
+    // illegal to ask for the divisor of a line.
+    g.divisor();
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error47() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint c(2*A - 3*B <= 2);
+  try {
+    // This is an incorrect use of function
+    // Constraint::coefficient(v):
+    // it is impossible to compute the coefficient
+    // of a variable that is not in the space of the
+    // constraint.
+    c.coefficient(C);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error48() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A - B >= 0);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // any call with a denominator equal to zero is illegal.
+    Coefficient d = 0;
+    ph.bounded_affine_image(B, A - 7, B + 2, d);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+ catch (...) {
+    exit(1);
+  }
+}
+
+void
+error49() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to use a variable in the lower bounding expression
+    // that does not appear in the polyhedron.
+    ph.bounded_affine_image(A, B, A + 7);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error50() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to use a variable in the upper bounding expression
+    // that does not appear in the polyhedron.
+    ph.bounded_affine_image(A, A + 7, B);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error51() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to bound a variable not occurring in the
+    // vector space embedding the polyhedron.
+    ph.bounded_affine_image(B, A - 7, 2*A - 2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error52() {
+  Variable A(0);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 1);
+
+  Polyhedra_Powerset<C_Polyhedron> ps(2, EMPTY);
+
+  try {
+    // This is an incorrect use of function
+    // Polyhedra_Powerset::add_disjunct(ph): the powerset and
+    // the added disjunct should have the same space dimension.
+    ps.add_disjunct(ph);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  error1();
+  error2();
+  error3();
+  error4();
+  error5();
+  error6();
+  error7();
+  error8();
+  error9();
+  error10();
+  error11();
+  error12();
+  error13();
+  error14();
+  error15();
+  error16();
+  error17();
+  error18();
+  error19();
+  error20();
+  error21();
+  error22();
+  error23();
+  error24();
+  error25();
+  error26();
+  error27();
+  error28();
+  error29();
+  error30();
+  error31();
+  error32();
+  error33();
+  error34();
+  error35();
+  error36();
+  error37();
+  error38();
+  error39();
+  error40();
+  error41();
+  error42();
+  error43();
+  error44();
+  error45();
+  error46();
+  error47();
+  error48();
+  error49();
+  error50();
+  error51();
+  error52();
+
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/exceptions2.cc b/tests/Polyhedron/exceptions2.cc
new file mode 100644
index 0000000..400d1ee
--- /dev/null
+++ b/tests/Polyhedron/exceptions2.cc
@@ -0,0 +1,1098 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using std::invalid_argument;
+using std::domain_error;
+
+namespace {
+
+void
+error1() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x - y > 0);
+  cs.insert(x >= 0);
+
+  try {
+    // This is an invalid use of the constructor of a polyhedron:
+    // it is illegal to build a closed polyhedron starting from
+    // a system of constraints that contains strict-inequalities.
+    C_Polyhedron ph(cs);
+
+    // It is an error if the exception is not thrown.
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    exit(1);
+  }
+}
+
+void
+error2() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(closure_point(2*x + y));
+  gs.insert(point(x + y));
+  gs.insert(ray(x));
+  gs.insert(ray(y));
+
+  try {
+    // This is an invalid use of the constructor of a polyhedron:
+    // it is illegal to build a closed polyhedron starting from
+    // a system of generators that contains closure points.
+    C_Polyhedron ph(gs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error3() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+
+  try {
+    // This is an invalid use of the function add_constraint(c): it is
+    // illegal to insert a strict-inequality into a system of
+    // constraints of a closed polyhedron.
+    ph.add_constraint(x - y > 0);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error4() {
+  C_Polyhedron ph(3, EMPTY);
+
+  try {
+    // This is an incorrect use of the function add_generator(g): it
+    // is illegal to insert a closure-point into a system of
+    // generators of a closed polyhedron.
+    ph.add_generator(closure_point(Linear_Expression(2)));
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error5() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(x >= 2);
+  ph.add_constraint(y >= 2);
+
+  Constraint_System cs;
+  cs.insert(x == y);
+  cs.insert(x < 5);
+
+  try {
+    // This is an incorrect use of the function
+    // add_constraints_and_minimize(cs): it is illegal to add a system of
+    // constraints that contains strict-inequalities to a closed polyhedron.
+    ph.add_constraints_and_minimize(cs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error6() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+  Constraint_System cs;
+  cs.insert(x > 3);
+  cs.insert(x > y);
+
+  try {
+    // This is an invalid use of the function add_constraints(cs):
+    // it is illegal to add a system of constraints that contains
+    // strict-inequalities to a closed polyhedron.
+    ph.add_constraints(cs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error7() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+
+  Constraint_System cs;
+  cs.insert(x > 2);
+  cs.insert(x == y);
+  NNC_Polyhedron qh(cs);
+
+  try {
+    // This is an incorrect use of the method concatenate_assign(): it
+    // is illegal to apply this method to a closed polyhedron with a
+    // NNC Polyhedron.
+    ph.concatenate_assign(qh);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error8() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(closure_point(-x));
+  gs.insert(ray(x));
+  gs.insert(ray(y));
+
+  try {
+    // This is an incorrect use of the function
+    // add_generators_and_minimize(gs): it is illegal to add a
+    // system of generators that contains closure-points to a closed
+    // polyhedron.
+    ph.add_generators_and_minimize(gs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error9() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+  Generator_System gs;
+  gs.insert(point(x));
+  gs.insert(closure_point());
+  gs.insert(ray(x+y));
+
+  try {
+    // This is an incorrect use of the function add_generators(gs): it is
+    // illegal to add a system of generators that contains closure-points
+    // to a closed polyhedron.
+    ph.add_generators(gs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 1);
+  ph.add_constraint(B >= 1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::generalized_affine_image(v, expr, d):
+    // `GREATER_THAN' is an illegal relation for necessarily closed
+    // polyhedron.
+    ph.generalized_affine_image(A + B, GREATER_THAN, A - B);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 2);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A - B > 0);
+  ph2.add_constraint(A >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  try {
+    // This is an invalid use of the function
+    // `intersection_assign_and_minimize': it is illegal to apply
+    // to a closed polyhedron and a non-closed polyhedron.
+    ph1.intersection_assign_and_minimize(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(B >= 2);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A - B > 0);
+  ph2.add_constraint(B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  try {
+    // This is an invalid use of the function
+    // `intersection_assign': it is illegal to apply this function
+    // to a closed polyhedron and a non-closed polyhedron.
+    ph1.intersection_assign(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error13() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(3*A));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(B));
+  gs2.insert(closure_point());
+  gs2.insert(closure_point(3*B));
+  NNC_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+   try {
+     // This is an invalid use of the function
+     // `poly_hull_assign_and_minimize': it is illegal to apply
+     // this function to a closed polyhedron and a
+     // non-closed polyhedron.
+    ph1.poly_hull_assign_and_minimize(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error14() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(3*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(2*A));
+  gs2.insert(closure_point());
+  gs2.insert(closure_point(3*A));
+  NNC_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+   try {
+    // This is an invalid use of the function
+    // `poly_hull_assign': it is illegal to apply this function
+    // to a closed polyhedron and a non-closed polyhedron.
+    ph1.poly_hull_assign(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error15() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 4);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(B <= 4);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 2);
+  ph2.add_constraint(A <= 6);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(B <= 4);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  try {
+    // This is an invalid use of the function
+    // `poly_difference_assign': it is illegal to apply this function
+    // to a closed polyhedron and a non-closed polyhedron.
+    ph1.poly_difference_assign(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error16() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(A - B >= 0);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(A <= 4);
+  ph2.add_constraint(A - B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  try {
+    // This is an invalid use of the function
+    // `H79_widening_assign': it is illegal to apply this function
+    // to a closed polyhedron and a non-closed polyhedron.
+    ph2.H79_widening_assign(ph1);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error17() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(A - B >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(A <= 4);
+  ph2.add_constraint(A - B >= 0);
+
+  Constraint_System cs;
+  cs.insert(A <= 8);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  try {
+    // This is an invalid use of the function
+    // `limited_H79_widening_assign': it is illegal to
+    // apply this function to a closed polyhedron and
+    // a non-closed polyhedron.
+    ph2.limited_H79_extrapolation_assign(ph1, cs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error18() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(A - B >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(A <= 4);
+  ph2.add_constraint(A - B >= 0);
+
+  Constraint_System cs;
+  cs.insert(A < 8);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  try {
+    // This is an invalid use of the function
+    // `limited_H79_extrapolation_assign': it is illegal to
+    // apply this function to two closed polyhedra and
+    // to a non-closed system of constraints.
+    ph2.limited_H79_extrapolation_assign(ph1, cs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error19() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A + B <= 1);
+
+  Generator_System gs;
+  gs.insert(point(2*A + 2*B));
+  gs.insert(ray(A + B));
+  NNC_Polyhedron ph2(gs);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+ try {
+    // This is an invalid use of the function
+    // `time_elapse_assign': it is illegal to
+    // apply this function to a closed polyhedron and
+    // a non-closed polyhedron.
+    ph1.time_elapse_assign(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error20() {
+  Variable A(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(A >= 5);
+
+  NNC_Polyhedron ph2(1);
+  ph2.add_constraint(A > 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  try {
+    // This is an invalid use of the Polyhedron::contains(): it is
+    // illegal to apply this method to a closed polyhedron and a
+    // non-closed polyhedron.
+    ph1.contains(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error21() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A - B > 0);
+
+  const Constraint_System cs = ph1.constraints();
+
+  print_constraints(cs, "*** cs ***");
+
+  try {
+    // This is an incorrect use of the function
+    // C_Polyhedron::C_Polyhedron(cs): it is illegal to build a
+    // closed polyhedron starting from a system of constraints
+    // that contains strict inequalities.
+    C_Polyhedron ph2(cs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error22() {
+  Variable A(0);
+
+  Generator_System gs1;
+  gs1.insert(point(3*A));
+  gs1.insert(closure_point(2*A));
+  gs1.insert(ray(A));
+
+  NNC_Polyhedron ph1(gs1);
+
+  const Generator_System gs2 = ph1.generators();
+
+  try {
+    // This is an incorrect use of the function
+    // `C_Polyhedron(const Generator_System)': it is illegal to build
+    // a closed polyhedron starting from a constant non-closed
+    // system of generators.
+    C_Polyhedron ph2(gs2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error23() {
+  NNC_Polyhedron ph(0, EMPTY);
+
+  try {
+    // This is an incorrect use of the function
+    // `add_generator(g)': it is illegal add a closure point
+    // to a zero-dimensional and empty non-closed polyhedron.
+    ph.add_generator(closure_point());
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error24() {
+  NNC_Polyhedron ph(0, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(closure_point());
+
+  try {
+    // This is an invalid used of the function
+    // `add_generators_and_minimize(gs)': it is illegal to
+    // add a system of generators that does not contain points
+    // to an empty zero-dimensional polyhedron.
+    ph.add_generators_and_minimize(gs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error25() {
+  NNC_Polyhedron ph(0, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(closure_point());
+
+  try {
+    // This is an invalid used of the function
+    // `add_generators(gs)': it is illegal to
+    // add a system of generators that does not contain points
+    // to an empty zero-dimensional polyhedron.
+    ph.add_generators(gs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error26() {
+  Variable A(0);
+
+  NNC_Polyhedron ph1(1);
+  ph1.add_constraint(A > 5);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(A >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  try {
+    // This is an invalid use of Polyhedron::contains():
+    // it is illegal to apply this method to a
+    // closed polyhedron and a non-closed polyhedron.
+    ph2.contains(ph1);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error27() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(A - B >= 0);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(A <= 4);
+  ph2.add_constraint(A - B >= 0);
+
+  Constraint_System cs;
+  cs.insert(A < 8);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  try {
+    // This is an invalid use of the function
+    // `limited_H79_extrapolation_assign': it is illegal to
+    // apply this function to a non-closed polyhedron,
+    // a non-closed polyhedron and a system of
+    // constraints that contains strict inequalities.
+    ph2.limited_H79_extrapolation_assign(ph1, cs);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error28() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A - B >= 0);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A < 5);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(A - B >= 0);
+
+  try {
+    // This is an invalid use of the function
+    // `BHRZ03_widening_assign': it is illegal to
+    // apply this function to a non-closed polyhedron and
+    // a non-closed polyhedron.
+    ph2.BHRZ03_widening_assign(ph1);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error29() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  try {
+    // This is an incorrect use of function
+    // Generator::closure_point(e, d):
+    // it is illegal to use a denominator
+    // equal to zero.
+    gs.insert(closure_point(A + 2*B, 0));
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error30() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A < 2);
+  ph1.add_constraint(B > 0);
+
+  C_Polyhedron ph2;
+
+  try {
+    // This is an invalid use of the function
+    // `Polyhedron::swap(Polyhedron&)': it is illegal
+    // to apply this function to a closed and a
+    // not necessarily closed polyhedron.
+    ph1.swap(ph2);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error31() {
+  Variable A(0);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::generalized_affine_image(v, r, expr,d ):
+    // `GREATER_THAN' is an illegal relation for necessarily closed
+    // polyhedron.
+    ph.generalized_affine_image(A, GREATER_THAN, A + 1);
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error32() {
+  Variable A(0);
+  LP_Problem lp;
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(A > -6);
+
+  try {
+    // This tries to build an invalid LP_Problem object: the feasible
+    // region can not be defined using strict inequalities.
+    lp.add_constraints(cs);
+
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error33() {
+  Variable A(0);
+  LP_Problem lp;
+
+  try {
+    // This tries to build an invalid LP_Problem object: the space dimension
+    // of the objective function can not be greater than the space dimension
+    // of the feasible region.
+    lp.set_objective_function(A);
+
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error34() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(A <= 0);
+  LP_Problem lp(cs, A, MAXIMIZATION);
+
+  try {
+    // We cannot extract a feasible point from an unsatisfiable LP_Problem.
+    Generator fp = lp.feasible_point();
+
+    exit(1);
+  }
+  catch (domain_error& e) {
+    nout << "domain_error: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error35() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  LP_Problem lp(cs, A, MAXIMIZATION);
+
+  try {
+    // We cannot extract an optimizing point from an unbounded LP_Problem.
+    Generator fp = lp.optimizing_point();
+
+    exit(1);
+  }
+  catch (domain_error& e) {
+    nout << "domain_error: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error36() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  LP_Problem lp(cs, A, MAXIMIZATION);
+  Generator p = point(A + B);
+  Coefficient num;
+  Coefficient den;
+
+  try {
+    // This tries to evaluate the objective function on a space dimension
+    // incompatible generator.
+    lp.evaluate_objective_function(p, num, den);
+
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+void
+error37() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  LP_Problem lp(cs, A, MAXIMIZATION);
+  Generator r = ray(A);
+  Coefficient num;
+  Coefficient den;
+
+  try {
+    // This tries to evaluate the objective function on a ray.
+    lp.evaluate_objective_function(r, num, den);
+
+    exit(1);
+  }
+  catch (invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    exit(1);
+  }
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  error1();
+  error2();
+  error3();
+  error4();
+  error5();
+  error6();
+  error7();
+  error8();
+  error9();
+  error10();
+  error11();
+  error12();
+  error13();
+  error14();
+  error15();
+  error16();
+  error17();
+  error18();
+  error19();
+  error20();
+  error21();
+  error22();
+  error23();
+  error24();
+  error25();
+  error26();
+  error27();
+  error28();
+  error29();
+  error30();
+  error31();
+  error32();
+  error33();
+  error34();
+  error35();
+  error36();
+  error37();
+
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/exceptions3.cc b/tests/Polyhedron/exceptions3.cc
new file mode 100644
index 0000000..b25df41
--- /dev/null
+++ b/tests/Polyhedron/exceptions3.cc
@@ -0,0 +1,242 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using std::length_error;
+
+namespace {
+
+void
+error1() {
+  try {
+    // This is an invalid use of the constructor of a Variable:
+    // it is illegal to (try to) build a variable with an id()
+    // greater than or equal to Variable::max_space_dimension().
+    Variable v(Variable::max_space_dimension());
+
+    // This is only to avoid a compiler warning.
+    (void) v.id();
+
+    // It is an error if the exception is not thrown.
+    exit(1);
+  }
+  catch (length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    exit(1);
+  }
+}
+
+void
+error2() {
+  try {
+    Variable v(Linear_Expression::max_space_dimension());
+    // This is an invalid use of the constructor of a Linear_Expression:
+    // it is illegal to (try to) build a linear expression with a dimensions
+    // greater than Linear_Expression::max_space_dimension().
+    Linear_Expression e(v);
+
+    // It is an error if the exception is not thrown.
+    exit(1);
+  }
+  catch (length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    exit(1);
+  }
+}
+
+void
+error3() {
+  try {
+    Variable v(Linear_Expression::max_space_dimension());
+    // This is an invalid use of the constructor of a Linear_Expression:
+    // it is illegal to (try to) build a linear expression with a dimensions
+    // greater than Linear_Expression::max_space_dimension().
+    Linear_Expression e;
+    e += v;
+
+    // It is an error if the exception is not thrown.
+    exit(1);
+  }
+  catch (length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    exit(1);
+  }
+}
+
+void
+error4() {
+  try {
+    Variable v(Linear_Expression::max_space_dimension());
+    // This is an invalid use of the constructor of a Linear_Expression:
+    // it is illegal to (try to) build a linear expression with a dimensions
+    // greater than Linear_Expression::max_space_dimension().
+    Linear_Expression e;
+    e -= v;
+
+    // It is an error if the exception is not thrown.
+    exit(1);
+  }
+  catch (length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    exit(1);
+  }
+}
+
+void
+error5() {
+  try {
+    // This is an invalid use of the constructor of a polyhedron:
+    // it is illegal to (try to) build a polyhedron with a dimensions
+    // greater than C_Polyhedron::max_space_dimension().
+    C_Polyhedron ph(C_Polyhedron::max_space_dimension() + 1);
+
+    // It is an error if the exception is not thrown.
+    exit(1);
+  }
+  catch (length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    exit(1);
+  }
+}
+
+void
+error6() {
+  try {
+    C_Polyhedron ph(1);
+    // This is an invalid use of the method for adding dimensions:
+    // it is illegal to (try to) embed a polyhedron into a vector space
+    // whose dimension is greater than C_Polyhedron::max_space_dimension().
+    ph.add_space_dimensions_and_embed(C_Polyhedron::max_space_dimension());
+
+    // It is an error if the exception is not thrown.
+    exit(1);
+  }
+  catch (length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    exit(1);
+  }
+}
+
+void
+error7() {
+  try {
+    C_Polyhedron ph(1);
+    // This is an invalid use of the method for adding dimensions:
+    // it is illegal to (try to) project a polyhedron into a vector space
+    // whose dimension is greater than C_Polyhedron::max_space_dimension().
+    ph.add_space_dimensions_and_project(C_Polyhedron::max_space_dimension());
+
+    // It is an error if the exception is not thrown.
+    exit(1);
+  }
+  catch (length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    exit(1);
+  }
+}
+
+void
+error8() {
+  try {
+    C_Polyhedron ph(C_Polyhedron::max_space_dimension(), EMPTY);
+    // This is an invalid use of the method for concatenating polyhedra:
+    // it is illegal to (try to) concatenate polyhedra if the resulting
+    // vector space will have a dimension greater than
+    // C_Polyhedron::max_space_dimension().
+    ph.concatenate_assign(C_Polyhedron(1));
+
+    // It is an error if the exception is not thrown.
+    exit(1);
+  }
+  catch (length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    exit(1);
+  }
+}
+
+void
+error9() {
+  try {
+    C_Polyhedron ph(1);
+    // This is an invalid use of the method for expanding space dimensions:
+    // it is illegal to (try to) expand a space dimension if the resulting
+    // vector space will have a dimension greater than
+    // C_Polyhedron::max_space_dimension().
+    ph.expand_space_dimension(Variable(0),
+			      C_Polyhedron::max_space_dimension());
+
+    // It is an error if the exception is not thrown.
+    exit(1);
+  }
+  catch (length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    exit(1);
+  }
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  error1();
+  error2();
+  error3();
+  error4();
+  error5();
+  error6();
+  error7();
+  error8();
+  error9();
+
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/expandspacedim1.cc b/tests/Polyhedron/expandspacedim1.cc
new file mode 100644
index 0000000..db0e3e5
--- /dev/null
+++ b/tests/Polyhedron/expandspacedim1.cc
@@ -0,0 +1,268 @@
+/* Test Polyhedron::expand_space_dimension().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test with a universe polyhedron.
+bool
+test01() {
+  Variable A(0);
+
+  C_Polyhedron ph1(3);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 1);
+
+  C_Polyhedron known_result(4);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+// Test with an empty polyhedron.
+bool
+test02() {
+  //  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(B, 1);
+
+  C_Polyhedron known_result(4, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.expand_space_dimension(B, 1) ***");
+
+  return ok;
+}
+
+// Test trivial expansion.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 0);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A + B <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.expand_space_dimension(A, 0) ***");
+
+  return ok;
+}
+
+// Test with given generators.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point(A));
+  ph1.add_generator(point(A + B));
+  ph1.add_generator(point(B));
+
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 1);
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point(A + C));
+  known_result.add_generator(point(A + B));
+  known_result.add_generator(point(A + B + C));
+  known_result.add_generator(point(B));
+  known_result.add_generator(point(B + C));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "***  After ph1.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+// Test with given constraints.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 1);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A + B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C + B <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+// Test using constraints expanding 2 dimensions.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 2);
+
+  C_Polyhedron known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A + B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C + B <= 2);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D + B <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+// Test using constraints with equality constraint.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A <= 1);
+  ph1.add_constraint(C == 1);
+  ph1.add_constraint(A + B >= 1);
+  ph1.add_constraint(B <= 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 1);
+  ph1.expand_space_dimension(C, 1);
+
+  C_Polyhedron known_result(5);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(A + B >= 1);
+  known_result.add_constraint(C == 1);
+  known_result.add_constraint(E == 1);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(D <= 1);
+  known_result.add_constraint(D + B >= 1);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+		    "***  After ph1.expand_space_dimension(A, 1);"
+		    " ph1.expand_space_dimension(C, 1) ***");
+
+  return ok;
+}
+
+// Test as given in [GopanDMDRS04] on page 519.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point(A + 2*B));
+  ph1.add_generator(point(A + 3*B));
+  ph1.add_generator(point(A + 4*B));
+
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(B, 1);
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point(A + 2*B + 2*C));
+  known_result.add_generator(point(A + 2*B + 3*C));
+  known_result.add_generator(point(A + 2*B + 4*C));
+  known_result.add_generator(point(A + 3*B + 2*C));
+  known_result.add_generator(point(A + 3*B + 3*C));
+  known_result.add_generator(point(A + 3*B + 4*C));
+  known_result.add_generator(point(A + 4*B + 2*C));
+  known_result.add_generator(point(A + 4*B + 3*C));
+  known_result.add_generator(point(A + 4*B + 4*C));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "***  After ph1.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/expandspacedim2.cc b/tests/Polyhedron/expandspacedim2.cc
new file mode 100644
index 0000000..3834b9a
--- /dev/null
+++ b/tests/Polyhedron/expandspacedim2.cc
@@ -0,0 +1,102 @@
+/* Test Polyhedron::expand_space_dimension().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test using constraints for NNC polyhedron.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A - B > 2);
+  ph1.add_constraint(A + 2*B < 6);
+  ph1.add_constraint(B < 6);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(B, 2);
+
+  NNC_Polyhedron known_result(4);
+  known_result.add_constraint(A - B > 2);
+  known_result.add_constraint(A + 2*B < 6);
+  known_result.add_constraint(B < 6);
+  known_result.add_constraint(A - C > 2);
+  known_result.add_constraint(A + 2*C < 6);
+  known_result.add_constraint(C < 6);
+  known_result.add_constraint(A - D > 2);
+  known_result.add_constraint(A + 2*D < 6);
+  known_result.add_constraint(D < 6);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.expand_space_dimension(B, 2) ***");
+
+  return ok;
+}
+
+// Test using generators for NNC polyhedron.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  NNC_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point(A));
+  ph1.add_generator(closure_point(A + B));
+  ph1.add_generator(ray(A - B));
+
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 2);
+
+  NNC_Polyhedron known_result(4, EMPTY);
+  known_result.add_generator(point(A + C + D));
+  known_result.add_generator(ray(A -B + C + D));
+  known_result.add_generator(closure_point(A + C + 2*D));
+  known_result.add_generator(closure_point(A + 2*C + D));
+  known_result.add_generator(closure_point(A + 2*C + 2*D));
+  known_result.add_generator(closure_point(A + B + C + D));
+  known_result.add_generator(closure_point(2*A + C + D));
+  known_result.add_generator(closure_point(2*A + C + 2*D));
+  known_result.add_generator(closure_point(2*A + 2*C + D));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "***  After ph1.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/foldspacedims1.cc b/tests/Polyhedron/foldspacedims1.cc
new file mode 100644
index 0000000..33fb5fd
--- /dev/null
+++ b/tests/Polyhedron/foldspacedims1.cc
@@ -0,0 +1,336 @@
+/* Test Polyhedron::fold_space_dimensions().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test with a universe polyhedron.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  C_Polyhedron known_result(2);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** After folding {A} into B ***");
+
+  return ok;
+}
+
+// Test with an empty polyhedron.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After folding {A} into B ***");
+
+  return ok;
+}
+
+// Trivial fold.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A + B + C <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A + B + C <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After folding {} into B ***");
+
+  return ok;
+}
+
+// Test as given in [GopanDMDRS04] on page 519.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 1);
+  ph1.add_constraint(A <= 3);
+  ph1.add_constraint(B >= 7);
+  ph1.add_constraint(B <= 12);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  C_Polyhedron known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 12);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "***  After folding {A} into B ***");
+
+  return ok;
+}
+
+// Test that takes the expected result of the expand operation
+// example given in [GopanDMDRS04] on page 519 and folds it to recover
+// the unexpanded polyhedron.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(3, EMPTY);
+  ph1.add_generator(point(A + 2*B + 2*C));
+  ph1.add_generator(point(A + 2*B + 3*C));
+  ph1.add_generator(point(A + 2*B + 4*C));
+  ph1.add_generator(point(A + 3*B + 2*C));
+  ph1.add_generator(point(A + 3*B + 3*C));
+  ph1.add_generator(point(A + 3*B + 4*C));
+  ph1.add_generator(point(A + 4*B + 2*C));
+  ph1.add_generator(point(A + 4*B + 3*C));
+  ph1.add_generator(point(A + 4*B + 4*C));
+
+  print_generators(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(A + 2*B));
+  known_result.add_generator(point(A + 3*B));
+  known_result.add_generator(point(A + 4*B));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "***  After folding {C} into B ***");
+
+  return ok;
+}
+
+// Test folding several dimensions into a higher dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A >= 1);
+  ph1.add_constraint(A <= 3);
+  ph1.add_constraint(B >= 7);
+  ph1.add_constraint(B <= 12);
+  ph1.add_constraint(C == 15);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(B);
+
+  ph1.fold_space_dimensions(to_fold, C);
+
+  C_Polyhedron known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 15);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "***  After folding {A,B} into C ***");
+
+  return ok;
+}
+
+// Test fold_space_dimensions() when there are rays.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(3, EMPTY);
+  ph1.add_generator(point(A));
+  ph1.add_generator(ray(A + B));
+  ph1.add_generator(ray(A + 2*C));
+
+  print_generators(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(A));
+  known_result.add_generator(ray(A));
+  known_result.add_generator(ray(A + B));
+  known_result.add_generator(ray(A + 2*B));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "***  After folding {C} into B ***");
+
+  return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A + B <= 2);
+  ph1.add_constraint(C >= 0);
+  ph1.add_constraint(C + B <= 2);
+  ph1.add_constraint(D >= 0);
+  ph1.add_constraint(D + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+  to_fold.insert(D);
+
+  ph1.fold_space_dimensions(to_fold, A);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A + B <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "***  After folding {C,D} into A ***");
+
+  return ok;
+}
+
+// Test folding dimensions into an intermediate dimension.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A + B <= 2);
+  ph1.add_constraint(C >= 0);
+  ph1.add_constraint(C + B <= 2);
+  ph1.add_constraint(D >= 0);
+  ph1.add_constraint(D + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  ph1.fold_space_dimensions(to_fold, C);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "***  After folding {B,D} into C ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  // test06() only fails when using C_Polyhedron and 8 bit coefficients.
+#ifdef DERIVED_TEST
+  DO_TEST(test06);
+#else
+  DO_TEST_F8(test06);
+#endif // !defined(DERIVED_TEST)
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/foldspacedims2.cc b/tests/Polyhedron/foldspacedims2.cc
new file mode 100644
index 0000000..3083d0d
--- /dev/null
+++ b/tests/Polyhedron/foldspacedims2.cc
@@ -0,0 +1,230 @@
+/* Test Polyhedron::fold_space_dimensions() for non-closed polyhedra.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test with an empty polyhedron.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(3, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  NNC_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After folding {A} into B ***");
+
+  return ok;
+}
+
+// Trivial fold.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  NNC_Polyhedron ph1(3);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A + B + C < 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  NNC_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A + B + C < 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After folding {} into B ***");
+
+  return ok;
+}
+
+// Test as given in [GopanDMDRS04] on page 519 but with strict constraints.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A > 1);
+  ph1.add_constraint(A < 3);
+  ph1.add_constraint(B > 7);
+  ph1.add_constraint(B < 12);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  NNC_Polyhedron known_result(1);
+  known_result.add_constraint(A > 1);
+  known_result.add_constraint(A < 12);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "***  After folding {A} into B ***");
+
+  return ok;
+}
+
+// Test folding several dimensions into a higher dimension.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  NNC_Polyhedron ph1(3);
+  ph1.add_constraint(A > 1);
+  ph1.add_constraint(A <= 3);
+  ph1.add_constraint(B > 7);
+  ph1.add_constraint(B < 12);
+  ph1.add_constraint(C == 15);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(B);
+
+  ph1.fold_space_dimensions(to_fold, C);
+
+  NNC_Polyhedron known_result(1);
+  known_result.add_constraint(A > 1);
+  known_result.add_constraint(A <= 15);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "***  After folding {A,B} into C ***");
+
+  return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  NNC_Polyhedron ph1(4);
+  ph1.add_constraint(A > 0);
+  ph1.add_constraint(A + B < 2);
+  ph1.add_constraint(C > 0);
+  ph1.add_constraint(C + B < 2);
+  ph1.add_constraint(D > 0);
+  ph1.add_constraint(D + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+  to_fold.insert(D);
+
+  ph1.fold_space_dimensions(to_fold, A);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A > 0);
+  known_result.add_constraint(A + B <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "***  After folding {C,D} into A ***");
+
+  return ok;
+}
+
+// Test folding dimensions into an intermediate dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  NNC_Polyhedron ph1(4);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B > 0);
+  ph1.add_constraint(A + B <= 2);
+  ph1.add_constraint(C > 0);
+  ph1.add_constraint(C + B <= 2);
+  ph1.add_constraint(D > 0);
+  ph1.add_constraint(D + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  ph1.fold_space_dimensions(to_fold, C);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A < 2);
+  known_result.add_constraint(B > 0);
+  known_result.add_constraint(B < 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "***  After folding {B,D} into C ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST_F8(test03);
+  DO_TEST_F8A(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffineimage1.cc b/tests/Polyhedron/generalizedaffineimage1.cc
new file mode 100644
index 0000000..fc8250a
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffineimage1.cc
@@ -0,0 +1,268 @@
+/* Test Polyhedron::generalized_affine_image().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B <= 5);
+  ph.add_constraint(A <= B);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, A+2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(2*B));
+  known_result.add_generator(point(4*A + 6*B));
+  known_result.add_generator(ray(B));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, A+2)"
+		   " ---");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B <= 5);
+  ph.add_constraint(A <= B);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, A+2, -2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(-B));
+  known_result.add_generator(point(4*A - 3*B));
+  known_result.add_generator(ray(B));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL,"
+		   " A+2, -2) ---");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(2*A <= 3);
+  ph.add_constraint(7*A >= 2);
+  ph.add_constraint(3*B >= 1);
+  ph.add_constraint(2*A >= B);
+
+  print_generators(ph, "--- ph ---");
+
+  ph.generalized_affine_image(B, LESS_THAN_OR_EQUAL, A-B+2, -3);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(9*A - B, 6));
+  known_result.add_generator(point(2*A - 4*B, 7));
+  known_result.add_generator(ray(-B));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_image(B, LESS_THAN_OR_EQUAL,"
+		   " A-B+2, -3) ---");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A - B >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.generalized_affine_image(A, EQUAL, A + 2);
+
+  known_result.affine_image(A, A + 2);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph,
+		   "*** After ph.generalized_affine_image"
+		   "(A, EQUAL, A + 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A + B));
+  ph.add_generator(point(3*A + B));
+  ph.add_generator(point(A + 3*B));
+  ph.add_generator(point(3*A + 3*B));
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A + B >= 1);
+
+  ph.generalized_affine_image(A + B, GREATER_THAN_OR_EQUAL, 2*A - B + 2);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph,
+		   "*** After ph.generalized_affine_image"
+		   "(A + B, GREATER_THAN_OR_EQUAL, 2*A - B + 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.generalized_affine_image(A, LESS_THAN_OR_EQUAL, B + 1);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.generalized_affine_image"
+		    "(A, LESS_THAN_OR_EQUAL, B + 1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.generalized_affine_image(A + B, GREATER_THAN_OR_EQUAL, A + B + 1);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.generalized_affine_image"
+		    "(A + B, GREATER_THAN_OR_EQUAL, A + B + 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= -2);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, A+2);
+
+  C_Polyhedron known_result(1, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_image(A, GREATER_THAN_OR_EQUAL, A+2)"
+		   " ---");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= -2);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.generalized_affine_image(A+1, GREATER_THAN_OR_EQUAL, A+2);
+
+  C_Polyhedron known_result(1, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_image"
+                   "(A+1, GREATER_THAN_OR_EQUAL, A+2)"
+		   " ---");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST_F8(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffineimage2.cc b/tests/Polyhedron/generalizedaffineimage2.cc
new file mode 100644
index 0000000..b834409
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffineimage2.cc
@@ -0,0 +1,559 @@
+/* Test Polyhedron::generalized_affine_image().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A + B));
+  ph.add_generator(closure_point(2*A));
+  ph.add_generator(closure_point(2*A + 2*B));
+  ph.add_generator(closure_point(3*A + B));
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.generalized_affine_image(B, LESS_THAN, B+2);
+
+  NNC_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(A));
+  known_result.add_generator(closure_point(A + 3*B));
+  known_result.add_generator(closure_point(2*A + 4*B));
+  known_result.add_generator(closure_point(3*A + 3*B));
+  known_result.add_generator(ray(-B));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_image(B, LESS_THAN, B+2) ---");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B <= 5);
+  ph.add_constraint(A <= B);
+
+  print_constraints(ph, "--- ph ---");
+
+  C_Polyhedron ph2 = ph;
+
+  ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, A+2);
+  ph2.generalized_affine_image(-2*B, LESS_THAN_OR_EQUAL, -2*(A+2));
+
+  bool ok = (ph == ph2);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL,"
+		   " A+2) ---");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B <= 5);
+  ph.add_constraint(A <= B);
+
+  print_constraints(ph, "--- ph ---");
+
+  C_Polyhedron ph2 = ph;
+
+  ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL, A+2, -2);
+  ph2.generalized_affine_image(-2*B, LESS_THAN_OR_EQUAL, A+2);
+
+  bool ok = (ph == ph2);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_image(B, GREATER_THAN_OR_EQUAL,"
+		   " A+2, -2) ---");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(2*A <= 3);
+  ph.add_constraint(7*A >= 2);
+  ph.add_constraint(3*B >= 1);
+  ph.add_constraint(2*A >= B);
+
+  print_generators(ph, "--- ph ---");
+
+  C_Polyhedron ph2 = ph;
+
+  ph.generalized_affine_image(B, LESS_THAN_OR_EQUAL, A-B+2, -3);
+  ph2.generalized_affine_image(-3*B, GREATER_THAN_OR_EQUAL, A-B+2);
+
+  bool ok = (ph == ph2);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_image(B, LESS_THAN_OR_EQUAL,"
+		   " A-B+2, -3) ---");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A + B));
+  ph.add_generator(closure_point(2*A));
+  ph.add_generator(closure_point(2*A + 2*B));
+  ph.add_generator(closure_point(3*A + B));
+
+  print_constraints(ph, "--- ph ---");
+
+  NNC_Polyhedron ph2 = ph;
+
+  ph.generalized_affine_image(B, LESS_THAN, B+2);
+  ph2.generalized_affine_image(-2*B, GREATER_THAN, -2*(B+2));
+
+  bool ok = (ph == ph2);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_image(B, LESS_THAN, B+2) ---");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A - B >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron ph2 = ph;
+
+  ph.generalized_affine_image(A, EQUAL, A + 2);
+  ph2.generalized_affine_image(-2*A, EQUAL, -2*(A + 2));
+
+  bool ok = (ph == ph2);
+
+  print_generators(ph,
+		   "*** After ph.generalized_affine_image"
+		   "(A, EQUAL, A + 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A + B));
+  ph.add_generator(point(3*A + B));
+  ph.add_generator(point(A + 3*B));
+  ph.add_generator(point(3*A + 3*B));
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron ph2 = ph;
+
+  ph.generalized_affine_image(A + B, GREATER_THAN_OR_EQUAL, 2*A - B + 2);
+  ph2.generalized_affine_image(-3*(A + B),
+			       LESS_THAN_OR_EQUAL,
+			       -3*(2*A - B + 2));
+
+  bool ok = (ph == ph2);
+
+  print_generators(ph,
+		   "*** After ph.generalized_affine_image"
+		   "(A + B, GREATER_THAN_OR_EQUAL, 2*A - B + 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(A == 1);
+  ph.add_constraint(B > 1);
+  ph.add_constraint(B < 2);
+
+  print_constraints(ph, "*** ph ***");
+  print_generators(ph, "*** ph ***");
+
+  ph.generalized_affine_image(B, GREATER_THAN, A + B + 1);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B > 3);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(B, GREATER_THAN, A + B + 1) ***");
+  print_generators(ph, "*** After ph.generalized_affine_image"
+		   "(B, PPLGT, A + B + 1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A >= 1);
+
+  C_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(Linear_Expression(2), EQUAL, A + B);
+
+  known_result.add_constraint(A + B == 2);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(Linear_Expression(2), EQUAL, A + B) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A - B >= 1);
+
+  C_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(Linear_Expression(2),
+			      GREATER_THAN_OR_EQUAL,
+			      A + B);
+
+  known_result.add_constraint(2 >= A + B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(Linear_Expression(2), GREATER_THAN_OR_EQUAL, A + B)"
+		    "***");
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A - B >= 1);
+
+  C_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(Linear_Expression(2), LESS_THAN_OR_EQUAL, A + B);
+
+  known_result.add_constraint(2 <= A + B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(Linear_Expression(2), LESS_THAN_OR_EQUAL, A + B) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(B > 0);
+  ph.add_constraint(A - B > 1);
+
+  NNC_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(Linear_Expression(2), GREATER_THAN, A + B);
+
+  known_result.add_constraint(2 > A + B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(Linear_Expression(2), GREATER_THAN, A + B) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(B > 0);
+  ph.add_constraint(A >= 1);
+
+  NNC_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(Linear_Expression(2), LESS_THAN, A + B);
+
+  known_result.add_constraint(2 < A + B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(Linear_Expression(2), LESS_THAN, A + B) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(C == 0);
+  ph.add_constraint(A + 3*B == 2);
+
+  print_constraints(ph, "*** ph ***");
+  print_generators(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A - C, EQUAL, B + 3);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A - C == B + 3);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** After ph.generalized_affine_image"
+		    "(A - C, EQUAL, B + 3) ***");
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(A - C, EQUAL, B + 3) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(C == 0);
+  ph.add_constraint(A - 2*B >= 2);
+
+  print_constraints(ph, "*** ph ***");
+  print_generators(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A - C, GREATER_THAN_OR_EQUAL, B + 3);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A - B - C >= 3);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(A - C, GREATER_THAN_OR_EQUAL, B + 3) ***");
+  print_generators(ph, "*** After ph.generalized_affine_image"
+		    "(A - C, GREATER_THAN_OR_EQUAL, B + 3) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(C == 0);
+  ph.add_constraint(A >= B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A - C, LESS_THAN_OR_EQUAL, B - 1);
+
+  C_Polyhedron known_result(ph);
+  known_result.add_constraint(A - B - C <= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(A - C, LESS_THAN_OR_EQUAL, B - 1) ***");
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(A - C, LESS_THAN_OR_EQUAL, B - 1) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  NNC_Polyhedron ph(3);
+  ph.add_constraint(A - C == 0);
+  ph.add_constraint(A >= B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A - 2*C, LESS_THAN, B - 1);
+
+  NNC_Polyhedron known_result(ph);
+  known_result.add_constraint(A - B - 2*C < 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(A - 2*C, LESS_THAN, B - 1) ***");
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(A - 2*C, LESS_THAN, B - 1) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  NNC_Polyhedron ph(3);
+  ph.add_constraint(A - 2*C == 0);
+  ph.add_constraint(A > B - 2);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A - 2*C + 3, GREATER_THAN, B - 1);
+
+  NNC_Polyhedron known_result(ph);
+  known_result.add_constraint(A - B - 2*C + 4 > 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(A - 2*C + 3, GREATER_THAN, B - 1) ***");
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(A - 2*C + 3, GREATER_THAN, B - 1) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 2);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(B <= 2);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A + B, LESS_THAN, 2*A - 3*B);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A + B < 4);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.generalized_affine_image"
+		    "(A + B, LESS_THAN, 2*A - 3*B) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST_F8(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffinepreimage1.cc b/tests/Polyhedron/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..cf45fe8
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffinepreimage1.cc
@@ -0,0 +1,123 @@
+/* Test Polyhedron::generalized_affine_preimage().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B <= 5);
+  ph.add_constraint(A <= B);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL, A+2);
+
+  C_Polyhedron known_result(2, UNIVERSE);
+  known_result.add_constraint(0 <= A);
+  known_result.add_constraint(A <= 3);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_preimage"
+		   "(B, GREATER_THAN_OR_EQUAL, A+2) ---");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B <= 5);
+  ph.add_constraint(A <= B);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL, A+2, -2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(point(4*A));
+  known_result.add_generator(line(B));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_preimage"
+                   "(B, GREATER_THAN_OR_EQUAL, A+2, -2) ---");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(2*A <= 3);
+  ph.add_constraint(7*A >= 2);
+  ph.add_constraint(3*B >= 1);
+  ph.add_constraint(2*A >= B);
+
+  print_generators(ph, "--- ph ---");
+
+  // A longer way of computing the generalized affine preimage below.
+  C_Polyhedron known_result(ph);
+  known_result.add_space_dimensions_and_embed(1);
+  Variable C(2);
+  known_result.add_constraint(-3*B >= A-C+2);
+  Variables_Set vset;
+  vset.insert(B);
+  known_result.remove_space_dimensions(vset);
+
+  ph.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, A-B+2, -3);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_preimage"
+		   "(B, LESS_THAN_OR_EQUAL, A-B+2, -3) ---");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST_F8(test03);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffinepreimage2.cc b/tests/Polyhedron/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..a689517
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffinepreimage2.cc
@@ -0,0 +1,63 @@
+/* Test Polyhedron::generalized_affine_preimage().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A + B));
+  ph.add_generator(closure_point(2*A));
+  ph.add_generator(closure_point(2*A + 2*B));
+  ph.add_generator(closure_point(3*A + B));
+
+  print_constraints(ph, "--- ph ---");
+
+  // A longer way of computing the generalized affine preimage below.
+  NNC_Polyhedron known_result(ph);
+  known_result.add_space_dimensions_and_embed(1);
+  Variable C(2);
+  known_result.add_constraint(B < C+2);
+  Variables_Set vset;
+  vset.insert(B);
+  known_result.remove_space_dimensions(vset);
+
+  ph.generalized_affine_preimage(B, LESS_THAN, B+2);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "--- ph after "
+		   "ph.generalized_affine_preimage(B, LESS_THAN, B+2) ---");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/generators1.cc b/tests/Polyhedron/generators1.cc
new file mode 100644
index 0000000..2387c7c
--- /dev/null
+++ b/tests/Polyhedron/generators1.cc
@@ -0,0 +1,234 @@
+/* Test the construction of a polyhedron using generators.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point(x + y, -1));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  Constraint_System cs = ph.constraints();
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x == -1);
+  known_result.add_constraint(y == -1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph constraints ***");
+  print_generators(ph, "*** ph generators ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x + y >= 2);
+  cs.insert(x + y <= 1);
+
+  C_Polyhedron known_result(cs);
+
+  const Generator_System& gs = known_result.generators();
+
+  print_generators(gs, "*** gs ***");
+
+  C_Polyhedron ph(gs);
+
+  bool ok = (gs.space_dimension() == known_result.space_dimension()
+	     && gs.begin() == gs.end()
+	     && ph == known_result);
+
+  print_generators(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  C_Polyhedron ph2(0);
+
+  C_Polyhedron ph3(2);
+  ph3.add_constraint(A >= 1);
+  ph3.add_constraint(A <= -1);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+  print_generators(ph3, "*** ph3 ***");
+
+  Generator_System gs1 = ph1.generators();
+  Generator_System gs2 = ph2.generators();
+  Generator_System gs3 = ph3.generators();
+
+  Generator_System known_result2;
+  known_result2.insert(point());
+
+  bool ok = (gs1.begin() == gs1.end()
+	     && C_Polyhedron(gs2) == C_Polyhedron(known_result2)
+	     && gs3.begin() == gs3.end());
+
+  print_generators(gs1, "*** gs1 ***");
+  print_generators(gs2, "*** gs2 ***");
+  print_generators(gs3, "*** gs3 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  const Generator_System gs;
+
+  C_Polyhedron ph(gs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Generator_System gs1;
+  gs1.insert(point());
+
+  C_Polyhedron ph1(gs1);
+  C_Polyhedron known_result(ph1);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  const Generator_System gs2 = ph1.generators();
+
+  C_Polyhedron ph2(gs2);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.generators();
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+
+  C_Polyhedron known_result(ph1);
+
+  Generator_System gs = ph1.generators();
+  C_Polyhedron ph2(gs);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+  print_generators(gs, "*** gs ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(ray(A));
+  ph1.add_generator(ray(B));
+
+  C_Polyhedron known_result(ph1);
+
+  Generator_System gs = ph1.generators();
+  C_Polyhedron ph2(gs);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+  print_generators(gs, "*** gs ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point());
+  ph.add_generator_and_minimize(ray(A));
+  ph.add_generator(ray(B));
+
+  print_generators(ph, "*** ph ***");
+
+  Generator_System gs = ph.generators();
+  gs.insert(point(A));
+  gs.insert(point(B));
+
+  print_generators(gs, "*** gs ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  return (C_Polyhedron(gs) == known_result);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/geomcovers1.cc b/tests/Polyhedron/geomcovers1.cc
new file mode 100644
index 0000000..e828ca2
--- /dev/null
+++ b/tests/Polyhedron/geomcovers1.cc
@@ -0,0 +1,60 @@
+/* Test Polyhedra_Powerset<PH>::geometrically_covers().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  Constraint_System cs1, cs2, cs3, cs4;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 4);
+  cs2.insert(x >= 4);
+  cs2.insert(x <= 6);
+  cs3.insert(x >= 1);
+  cs3.insert(x <= 5);
+  C_Polyhedron ph1(cs1), ph2(cs2), ph3(cs3);
+
+  Polyhedra_Powerset<C_Polyhedron> ps12(1, EMPTY);
+  ps12.add_disjunct(ph1);
+  ps12.add_disjunct(ph2);
+
+  Polyhedra_Powerset<C_Polyhedron> ps3(1, EMPTY);
+  ps3.add_disjunct(ph3);
+
+  bool ok = ps12.geometrically_covers(ps3);
+
+  using namespace IO_Operators;
+  nout << "ps12 = " << ps12 << endl
+       << " ps3 = " << ps3 << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/h79widening1.cc b/tests/Polyhedron/h79widening1.cc
new file mode 100644
index 0000000..295afd0
--- /dev/null
+++ b/tests/Polyhedron/h79widening1.cc
@@ -0,0 +1,254 @@
+/* Test Polyhedron::H79_widening_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+aux_test01(C_Polyhedron& ph1, const C_Polyhedron& ph2,
+	   // Note intentional call-by-value!
+	   C_Polyhedron known_result) {
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.H79_widening_assign(ph2);
+
+  print_generators(ph1, "*** After H79_widening_assign ***");
+
+  return ph1 == known_result;
+}
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1_1(2);
+  ph1_1.add_constraint(x >= 0);
+  ph1_1.add_constraint(y >= 0);
+  ph1_1.add_constraint(x <= 2);
+  ph1_1.add_constraint(y <= 2);
+  C_Polyhedron ph1_2(ph1_1);
+
+  C_Polyhedron ph2_1(2);
+  ph2_1.add_constraint(x+y <= 0);
+  ph2_1.add_constraint(x+y >= 2);
+  C_Polyhedron ph2_2(ph2_1);
+  C_Polyhedron ph2_3(ph2_1);
+  C_Polyhedron ph2_4(ph2_1);
+
+  bool ok = aux_test01(ph1_1, ph2_1, ph1_1)
+    && aux_test01(ph2_3, ph2_4, ph2_3);
+
+  // FIXME: this must be reactivated (in some form) when we will
+  //        have a decent error policy for H79_widening_assign().
+#if 0
+  if (!try_H79_widening_assign(ph2_2, ph1_2, ph1_2))
+    return false;
+#endif
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 2);
+  ph1.add_constraint(B >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(A-B >= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.H79_widening_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After H79_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(A + 2*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.H79_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** After ph2.H79_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2(0, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.H79_widening_assign(ph2);
+
+  C_Polyhedron known_result;
+  known_result = ph1;
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.H79_widening_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(-A - 2*B >= -6);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A - 2*B >= 2);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(-A - 2*B >= -10);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(A - 2*B >= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph2.H79_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - 2*B >= 2);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** After ph2.H79_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(-A + B >= 2);
+  ph1.add_constraint(A >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(-A + B >= 3);
+  ph2.add_constraint(A - B >= -8);
+  ph2.add_constraint(A >= 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.H79_widening_assign(ph2);
+
+  bool ok = ph1.is_universe();
+
+  print_constraints(ph1, "*** After H79_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+  // The addition of the following generator shows a bug
+  // that was affecting PPL version 0.6.1 (now corrected).
+  ph1.add_generator(line(A));
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(B >= 0);
+
+  // Avoid computing the constraints of ph1.
+  C_Polyhedron ph1_copy = ph1;
+  print_constraints(ph1_copy, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.H79_widening_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After H79_widening_assign ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/h79widening2.cc b/tests/Polyhedron/h79widening2.cc
new file mode 100644
index 0000000..856b162
--- /dev/null
+++ b/tests/Polyhedron/h79widening2.cc
@@ -0,0 +1,63 @@
+/* Test Polyhedron::H79_widening_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// This is the example of Figure 3 in [BagnaraRZH02TR].
+bool
+test01() {
+  Variable A(0);
+
+  NNC_Polyhedron ph1(1);
+  ph1.add_constraint(A > 0);
+  ph1.add_constraint(A < 2);
+
+  NNC_Polyhedron ph4(1);
+  ph4.add_constraint(4*A >= 1);
+  ph4.add_constraint(4*A <= 3);
+
+  NNC_Polyhedron ph = ph4;
+  ph.intersection_assign_and_minimize(ph1);
+  // At this point, ph and ph4 are two different representations
+  // of the same NNC polyhedron.
+
+  print_constraints(ph4, "*** ph4 ***");
+  print_constraints(ph, "*** ph ***");
+
+  NNC_Polyhedron known_result(ph4);
+
+  ph.H79_widening_assign(ph4);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After H79_widening_assign ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/intersection1.cc b/tests/Polyhedron/intersection1.cc
new file mode 100644
index 0000000..cd773a6
--- /dev/null
+++ b/tests/Polyhedron/intersection1.cc
@@ -0,0 +1,516 @@
+/* Testing Polyhedron::intersection_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Intersection of an icosahedron with a column.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron icosahedron(3);
+  icosahedron.add_constraint(4*x - 2*y - z + 14 >= 0);
+  icosahedron.add_constraint(4*x + 2*y - z + 2 >= 0);
+  icosahedron.add_constraint(x + y - 1 >= 0);
+  icosahedron.add_constraint(x + y + 2*z - 5 >= 0);
+  icosahedron.add_constraint(x + 1 >= 0);
+  icosahedron.add_constraint(x + z - 1 >= 0);
+  icosahedron.add_constraint(2*x + y -2*z + 7 >= 0);
+  icosahedron.add_constraint(x - y + 2*z + 1 >= 0);
+  icosahedron.add_constraint(x - y + 5 >= 0);
+  icosahedron.add_constraint(2*x - y - 2*z + 13 >= 0);
+  icosahedron.add_constraint(-2*x - y + 2*z + 1 >= 0);
+  icosahedron.add_constraint(-x + y - 1 >= 0);
+  icosahedron.add_constraint(-x + y -2*z + 7 >= 0);
+  icosahedron.add_constraint(-4*x + 2*y + z - 4 >= 0);
+  icosahedron.add_constraint(-2*x + y + 2*z - 5 >= 0);
+  icosahedron.add_constraint(-x + 1 >= 0);
+  icosahedron.add_constraint(-x - z + 5 >= 0);
+  icosahedron.add_constraint(-4*x - 2*y + z + 8 >= 0);
+  icosahedron.add_constraint(-x - y + 5 >= 0);
+  icosahedron.add_constraint(-x - y -2*z +13 >= 0);
+
+  C_Polyhedron column(3);
+  column.add_constraint(y >= 2);
+  column.add_constraint(y <= 4);
+  column.add_constraint(x >= 0);
+  column.add_constraint(x <= 1);
+
+  C_Polyhedron computed_result = icosahedron;
+  computed_result.intersection_assign_and_minimize(column);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(-4*x - 2*y + z >= -8);
+  known_result.add_constraint(-4*x + 2*y + z >= 4);
+  known_result.add_constraint(-2*x - y + 2*z >= -1);
+  known_result.add_constraint(-2*x + y + 2*z >= 5);
+  known_result.add_constraint(-x - y - 2*z >= -13);
+  known_result.add_constraint(-x - z >= -5);
+  known_result.add_constraint(-x >= -1);
+  known_result.add_constraint(-x + y - 2*z >= -7);
+  known_result.add_constraint(-y >= -4);
+  known_result.add_constraint(y >= 2);
+  known_result.add_constraint(x >= 0);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(icosahedron, "*** icosahedron ***");
+  print_constraints(column, "*** column ***");
+  print_constraints(computed_result, "*** computed_result ***");
+
+  return ok;
+}
+
+int
+aux_test02(const C_Polyhedron& ph) {
+  if (ph.is_empty() || ph.space_dimension() == 0)
+    return 0;
+
+  int count = 0;
+  const Generator_System& gs = ph.generators();
+  for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
+       i != gs_end;
+       ++i)
+    if (i->type() == Generator::POINT)
+      ++count;
+  return count;
+}
+
+// Intersection of a pyramid with an half-space of variable height.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  // This is the height of the pyramid.
+  const Coefficient pyramid_height = 16;
+
+  // We will intersect it with the half-spaces `z <= k' and `z >= k'
+  // with k = i*(height/4) for i = -1, 0, 1, ..., 5.
+  struct {
+    Coefficient plane_height;
+    int num_points_above;
+    int num_points_below;
+  } ph_nv[]
+      = { {-1*(pyramid_height/4), 5, 0},
+	  { 0*(pyramid_height/4), 5, 4},
+	  { 1*(pyramid_height/4), 5, 8},
+	  { 2*(pyramid_height/4), 5, 8},
+	  { 3*(pyramid_height/4), 5, 8},
+	  { 4*(pyramid_height/4), 1, 5},
+	  { 5*(pyramid_height/4), 0, 5}
+      };
+
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y + 0*z));
+  gs.insert(point(2*x + 0*y + 0*z));
+  gs.insert(point(0*x + 2*y + 0*z));
+  gs.insert(point(2*x + 2*y + 0*z));
+  gs.insert(point(x + y + pyramid_height*z));
+  C_Polyhedron pyramid(gs);
+
+    print_constraints(pyramid, "*** pyramid constraints ***");
+    print_generators(pyramid, "*** pyramid generators ***");
+
+  bool ok = true;
+
+  for (dimension_type i = 0; i <= 6; ++i) {
+    // Above.
+    C_Polyhedron hyper_space_above(3);
+    hyper_space_above.add_constraint(z >= ph_nv[i].plane_height);
+
+    C_Polyhedron computed_result = pyramid;
+    computed_result.intersection_assign_and_minimize(hyper_space_above);
+
+    if (ok
+	&& aux_test02(computed_result) != ph_nv[i].num_points_above)
+      ok = false;
+
+    print_constraints(hyper_space_above, "*** hyper_space_above ***");
+    print_generators(computed_result, "*** computed_result ***");
+
+    // Below.
+    C_Polyhedron hyper_space_below(3);
+    hyper_space_below.add_constraint(z <= ph_nv[i].plane_height);
+
+    computed_result = pyramid;
+    computed_result.intersection_assign_and_minimize(hyper_space_below);
+
+    if (ok
+	&& aux_test02(computed_result) != ph_nv[i].num_points_below)
+      ok = false;
+
+    print_constraints(hyper_space_below, "*** hyper_space_below ***");
+    print_generators(computed_result, "*** computed_result ***");
+
+  }
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x - y >= 0);
+  ph1.add_constraint(x - y <= 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(y >= 0);
+  ph2.add_constraint(x <= 1);
+  ph2.add_constraint(y <= 1);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result = ph1;
+
+  computed_result.intersection_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x - y >= 0);
+  known_result.add_constraint(x <= 1);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(computed_result, "*** After intersection_assign ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= y);
+  ph1.add_constraint(x >= 0);
+
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result1(ph1);
+  computed_result1.intersection_assign_and_minimize(ph2);
+
+  Constraint_System cs_computed_result2 = ph1.constraints();
+  C_Polyhedron computed_result2(cs_computed_result2);
+  computed_result2.intersection_assign(ph2);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (computed_result1 == known_result
+	     && computed_result2 == known_result);
+
+  print_constraints(computed_result1,
+		    "*** After intersection_assign_and_minimize ***");
+  print_constraints(computed_result2, "*** After intersection_assign ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= y);
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point());
+  ph2.add_generator(line(x));
+  ph2.add_generator(ray(y));
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign_and_minimize(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x >= y);
+
+  bool ok = (known_result == ph1);
+
+  print_constraints(ph1, "*** After intersection_assign_and_minimize ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(3*x));
+  gs1.insert(point(3*y));
+  gs1.insert(point(3*x+ 3*y));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(x));
+  gs2.insert(point(4*x));
+  gs2.insert(point(x + 3*y));
+  gs2.insert(point(4*x+ 3*y));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign(ph2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(x));
+  known_result.add_generator(point(3*x));
+  known_result.add_generator(point(x + 3*y));
+  known_result.add_generator(point(3*x + 3*y));
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After intersection_assign ***");
+
+  return ok;
+}
+
+bool
+aux_test07(C_Polyhedron& ph1,
+	   const C_Polyhedron& ph2,
+	   // Note intentional call-by-value!
+	   C_Polyhedron known_result) {
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign_and_minimize(ph2);
+
+  print_generators(ph1, "*** After intersection_assign ***");
+
+  return ph1 == known_result;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1_1(2);
+  ph1_1.add_constraint(x >= 0);
+  ph1_1.add_constraint(y >= 0);
+  ph1_1.add_constraint(x <= 2);
+  ph1_1.add_constraint(y <= 2);
+  C_Polyhedron ph1_2(ph1_1);
+
+  C_Polyhedron ph2_1(2);
+  ph2_1.add_constraint(x+y <= 0);
+  ph2_1.add_constraint(x+y >= 2);
+  C_Polyhedron ph2_2(ph2_1);
+  C_Polyhedron ph2_3(ph2_1);
+  C_Polyhedron ph2_4(ph2_1);
+
+  bool ok = aux_test07(ph1_1, ph2_1, ph2_1)
+    && aux_test07(ph2_2, ph1_2, ph2_2)
+    && aux_test07(ph2_3, ph2_4, ph2_3);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2, EMPTY);
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A == 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.intersection_assign_and_minimize(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+		    "*** After ph1.intersection_assign_and_minimize(ph2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2(0, EMPTY);
+  ph2.add_generator(point());
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result = ph1;
+
+  ph1.intersection_assign_and_minimize(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+		    "*** After ph1.intersection_assign_and_minimize(ph2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A - B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.intersection_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.intersection_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.intersection_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.intersection_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.generators();
+  ph1.add_constraint(A == B);
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2);
+  ph2.generators();
+  ph2.add_constraint(A >= B + 1);
+  C_Polyhedron copy_ph2 = ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign(ph2);
+  copy_ph1.intersection_assign_and_minimize(copy_ph2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_constraints(ph1, "*** After intersection_assign ***");
+  print_constraints(copy_ph1,
+		    "*** After intersection_assign_and_minimize ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(line(A + B));
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point());
+  ph2.constraints();
+  ph2.add_generator(ray(A));
+  ph2.add_generator(ray(B));
+
+  C_Polyhedron copy_ph2 = ph2;
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign(ph2);
+  copy_ph1.intersection_assign_and_minimize(copy_ph2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_constraints(ph1, "*** After intersection_assign ***");
+  print_constraints(copy_ph1,
+		    "*** After intersection_assign_and_minimize ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8A(test01);
+  DO_TEST_F8A(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Polyhedron/limitedbhrz03extrapolation1.cc b/tests/Polyhedron/limitedbhrz03extrapolation1.cc
new file mode 100644
index 0000000..061e86c
--- /dev/null
+++ b/tests/Polyhedron/limitedbhrz03extrapolation1.cc
@@ -0,0 +1,66 @@
+/* Test Polyhedron::limited_BHRZ03_extrapolation_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+int
+main() TRY {
+  set_handlers();
+
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(A + B));
+  gs1.insert(point(A));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(point(2*A));
+  gs2.insert(point(2*A + 2*B));
+  C_Polyhedron ph2(gs2);
+
+  Constraint_System cs;
+  cs.insert(A <= 5);
+  cs.insert(B <= 4);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph2.limited_BHRZ03_extrapolation_assign(ph1, cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(A <= 5);
+
+  int retval = (ph2 == known_result) ? 0 : 1;
+
+  print_constraints(ph2, "*** After ph2.limited_BHRZ03_widening(ph1, cs)***");
+
+  return retval;
+}
+CATCH
diff --git a/tests/Polyhedron/limitedh79extrapolation1.cc b/tests/Polyhedron/limitedh79extrapolation1.cc
new file mode 100644
index 0000000..deddc79
--- /dev/null
+++ b/tests/Polyhedron/limitedh79extrapolation1.cc
@@ -0,0 +1,273 @@
+/* Test Polyhedron::limited_H79_extrapolation_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+
+  C_Polyhedron ph1(cs1);
+
+  print_constraints(ph1, "*** ph1 ****");
+
+  Constraint_System cs2;
+  cs2.insert(x >= 0);
+  cs2.insert(x <= 2);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+
+  C_Polyhedron ph2(cs2);
+
+  print_constraints(ph2, "*** ph2 ****");
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+
+  print_constraints(cs, "*** cs ****");
+
+  C_Polyhedron computed_result = ph2;
+  computed_result.limited_H79_extrapolation_assign(ph1, cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x - y >= 0);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x <= 5);
+
+  print_constraints(computed_result,
+		    "*** After limited_H79_extrapolation_assign ****");
+
+  return computed_result == known_result;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y == 0);
+
+  C_Polyhedron ph1(cs1);
+
+  print_constraints(ph1, "*** ph1 ****");
+
+  Constraint_System cs2;
+  cs2.insert(x <= 2);
+  cs2.insert(y >= 0);
+  cs2.insert(y <= x);
+
+  C_Polyhedron ph2(cs2);
+
+  print_constraints(ph2, "*** ph2 ****");
+
+  Constraint_System cs;
+  cs.insert(y <= -1);
+  cs.insert(x <= 5);
+
+  print_constraints(cs, "*** cs ****");
+
+  C_Polyhedron computed_result = ph2;
+  computed_result.limited_H79_extrapolation_assign(ph1, cs);
+
+  C_Polyhedron known_result = ph2;
+  known_result.add_generator(point(5*x));
+  known_result.add_generator(point(5*x + 5*y));
+
+  print_constraints(computed_result,
+		    "*** After limited_H79_extrapolation_assign ****");
+
+  return computed_result == known_result;
+}
+
+bool
+test03() {
+  Variable x(0);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  C_Polyhedron ph1(cs1);
+
+  print_constraints(ph1, "*** ph1 ****");
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  C_Polyhedron ph2(cs2);
+
+  print_constraints(ph2, "*** ph2 ****");
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+
+  print_constraints(cs, "*** cs ****");
+
+  C_Polyhedron computed_result = ph1;
+  computed_result.limited_H79_extrapolation_assign(ph2, cs);
+
+  C_Polyhedron known_result(cs);
+
+  print_constraints(computed_result,
+		    "*** After limited_H79_extrapolation_assign ****");
+
+  return computed_result == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(A - B >= 0);
+  ph2.add_constraint(A <= 2);
+
+  Constraint_System cs;
+  cs.insert(B <= 4);
+
+  C_Polyhedron known_result(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph2.limited_H79_extrapolation_assign(ph1, cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2,
+		    "*** After ph2.limited_H79_extrapolation_assign(ph1, cs)"
+		    " ***");
+  return ok;
+}
+
+bool
+test05() {
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  C_Polyhedron ph2(2, EMPTY);
+
+  Constraint_System cs;
+  cs.insert(B <= 4);
+
+  C_Polyhedron known_result(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph2.limited_H79_extrapolation_assign(ph1, cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2,
+		    "*** After ph2.limited_H79_extrapolation_assign(ph1, cs)"
+		    " ***");
+  return ok;
+}
+
+bool
+test06() {
+  C_Polyhedron ph1;
+
+  C_Polyhedron ph2;
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(2) <= 4);
+
+  C_Polyhedron known_result(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph2.limited_H79_extrapolation_assign(ph1, cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2,
+		    "*** After ph2.limited_H79_extrapolation_assign(ph1, cs)"
+		    " ***");
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 2);
+  ph1.add_constraint(A <= -2);
+  ph1.add_constraint(B == 0);
+  C_Polyhedron ph2(2);
+  ph1.add_constraint(A >= 2);
+
+  Constraint_System cs;
+  cs.insert(B <= 4);
+
+  C_Polyhedron known_result(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph2.limited_H79_extrapolation_assign(ph1, cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2,
+		    "*** After ph2.limited_H79_extrapolation_assign(ph1, cs)"
+		    " ***");
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/linearpartition1.cc b/tests/Polyhedron/linearpartition1.cc
new file mode 100644
index 0000000..4a9361a
--- /dev/null
+++ b/tests/Polyhedron/linearpartition1.cc
@@ -0,0 +1,298 @@
+/* Test linear_partition().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+aux_test01(const C_Polyhedron& p,
+	   const C_Polyhedron& q,
+	   const std::pair<C_Polyhedron,
+	   Powerset<Determinate<NNC_Polyhedron> > >& partition) {
+  const C_Polyhedron& r = partition.first;
+  // `r' must be a subset of or equal to `q'.
+  if (!q.contains(r))
+    return false;
+  const Powerset<Determinate<NNC_Polyhedron> >& s = partition.second;
+  NNC_Polyhedron the_union(r);
+  // These are the NNC versions of `p' and `q'.
+  NNC_Polyhedron nnc_p(p);
+  NNC_Polyhedron nnc_q(q);
+  typedef Powerset<Determinate<NNC_Polyhedron> >::const_iterator iter;
+  for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
+    const NNC_Polyhedron& a = i->element();
+    // All elements of `s' must be disjoint from `p'.
+    if (!a.is_disjoint_from(nnc_p))
+      return false;
+    iter j = i;
+    for (++j; j != s_end; ++j) {
+      const NNC_Polyhedron& b = j->element();
+      // All elements of `s' must be pairwise disjoint.
+      if (!a.is_disjoint_from(b))
+	return false;
+    }
+    the_union.poly_hull_assign(a);
+  }
+  // The union of all the elements in `partition' must be exactly `q'.
+  return the_union == nnc_q;
+}
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron p(2);
+  p.add_constraint(x == 0);
+  p.add_constraint(y >= 0);
+  p.add_constraint(y <= 2);
+
+  using namespace IO_Operators;
+  nout << "p = " << p << endl;
+
+  C_Polyhedron q(2);
+  q.add_constraint(x >= -1);
+  q.add_constraint(x <=  1);
+  q.add_constraint(y >=  1);
+  q.add_constraint(y <=  3);
+
+  nout << "q = " << q << endl;
+
+  std::pair<C_Polyhedron, Powerset<Determinate<NNC_Polyhedron> > >
+    result = linear_partition(p, q);
+
+  nout << "*** q partition ***" << endl;
+  nout << "  === p inters q === " << endl << "  " << result.first << endl;
+  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+
+  if (!aux_test01(p, q, result))
+    return false;
+
+  result = linear_partition(q, p);
+
+  nout << "*** p partition ***" << endl;
+  nout << "  === q inters p === " << endl << "  " << result.first << endl;
+  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+
+  return aux_test01(q, p, result);
+}
+
+bool
+aux_test02(const C_Polyhedron& p,
+	   const C_Polyhedron& q,
+	   const std::pair<C_Polyhedron,
+	   Powerset<Determinate<NNC_Polyhedron> > >& partition) {
+  const C_Polyhedron& r = partition.first;
+  // `r' must be a subset of or equal to `q'.
+  if (!q.contains(r))
+    return false;
+  const Powerset<Determinate<NNC_Polyhedron> >& s = partition.second;
+  NNC_Polyhedron the_union(r);
+  // These are the NNC versions of `p' and `q'.
+  NNC_Polyhedron nnc_p(p);
+  NNC_Polyhedron nnc_q(q);
+  typedef Powerset<Determinate<NNC_Polyhedron> >::const_iterator iter;
+  for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
+    const NNC_Polyhedron& a = i->element();
+    // All elements of `s' must be disjoint from `p'.
+    if (!a.is_disjoint_from(nnc_p))
+      return false;
+    iter j = i;
+    for (++j; j != s_end; ++j) {
+      const NNC_Polyhedron& b = j->element();
+      // All elements of `s' must be pairwise disjoint.
+      if (!a.is_disjoint_from(b))
+	return false;
+    }
+    the_union.poly_hull_assign(a);
+  }
+  // The union of all the elements in `partition' must be exactly `q'.
+  return the_union == nnc_q;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron p(2);
+  p.add_constraint(x == 5);
+  p.add_constraint(y >= 0);
+  p.add_constraint(y <= 2);
+
+  using namespace IO_Operators;
+  nout << "p = " << p << endl;
+
+  C_Polyhedron q(2);
+  q.add_constraint(x >= -1);
+  q.add_constraint(x <=  1);
+  q.add_constraint(y >=  1);
+  q.add_constraint(y <=  3);
+
+  nout << "q = " << q << endl;
+
+  std::pair<C_Polyhedron, Powerset<Determinate<NNC_Polyhedron> > >
+    result = linear_partition(p, q);
+
+  nout << "*** q partition ***" << endl;
+  nout << "  === p inters q === " << endl << "  " << result.first << endl;
+  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+
+  if (!aux_test01(p, q, result))
+    return false;
+
+  result = linear_partition(q, p);
+
+  nout << "*** p partition ***" << endl;
+  nout << "  === q inters p === " << endl << "  " << result.first << endl;
+  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+
+  return aux_test02(q, p, result);
+}
+
+bool
+aux_test03(const C_Polyhedron& p,
+	   const C_Polyhedron& q,
+	   const std::pair<C_Polyhedron,
+	   Powerset<Determinate<NNC_Polyhedron> > >& partition) {
+  const C_Polyhedron& r = partition.first;
+  // `r' must be a subset of or equal to `q'.
+  if (!q.contains(r))
+    return false;
+  const Powerset<Determinate<NNC_Polyhedron> >& s = partition.second;
+  NNC_Polyhedron the_union(r);
+  // These are the NNC versions of `p' and `q'.
+  NNC_Polyhedron nnc_p(p);
+  NNC_Polyhedron nnc_q(q);
+  typedef Powerset<Determinate<NNC_Polyhedron> >::const_iterator iter;
+  for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
+    const NNC_Polyhedron& a = i->element();
+    // All elements of `s' must be disjoint from `p'.
+    if (!a.is_disjoint_from(nnc_p))
+      return false;
+    iter j = i;
+    for (++j; j != s_end; ++j) {
+      const NNC_Polyhedron& b = j->element();
+      // All elements of `s' must be pairwise disjoint.
+      if (!a.is_disjoint_from(b))
+	return false;
+    }
+    the_union.poly_hull_assign(a);
+  }
+  // The union of all the elements in `partition' must be exactly `q'.
+  return the_union == nnc_q;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron p(2);
+  p.add_constraint(x >= -2);
+  p.add_constraint(x <=  2);
+  p.add_constraint(y >=  0);
+  p.add_constraint(y <=  4);
+
+  using namespace IO_Operators;
+  nout << "p = " << p << endl;
+
+  C_Polyhedron q(2);
+  q.add_constraint(x >= -1);
+  q.add_constraint(x <=  1);
+  q.add_constraint(y >=  1);
+  q.add_constraint(y <=  3);
+
+  nout << "q = " << q << endl;
+
+  std::pair<C_Polyhedron, Powerset<Determinate<NNC_Polyhedron> > >
+    result = linear_partition(p, q);
+
+  nout << "*** q partition ***" << endl;
+  nout << "  === p inters q === " << endl << "  " << result.first << endl;
+  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+
+  if (!aux_test03(p, q, result))
+    return false;
+
+  result = linear_partition(q, p);
+
+  nout << "*** p partition ***" << endl;
+  nout << "  === q inters p === " << endl << "  " << result.first << endl;
+  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+
+  return aux_test03(q, p, result);
+}
+
+// Compute the complement.
+template <typename PH>
+Polyhedra_Powerset<NNC_Polyhedron>
+aux_test04(const PH& ph) {
+  std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> > partition
+    = linear_partition(ph, PH(ph.space_dimension(), UNIVERSE));
+  return partition.second;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron p(2, EMPTY);
+  p.add_generator(point(x));
+  p.add_generator(point(y));
+  p.add_generator(point(-x));
+  p.add_generator(point(-y));
+
+  using namespace IO_Operators;
+  nout << "p = " << p << endl;
+
+  Polyhedra_Powerset<NNC_Polyhedron> p_c = aux_test04(p);
+
+  nout << "complement(p) = " << p_c << endl;
+
+  C_Polyhedron q(2);
+  q.add_constraint(x >= -1);
+  q.add_constraint(x <=  1);
+  q.add_constraint(y >=  1);
+  q.add_constraint(y <=  3);
+
+  nout << "q = " << q << endl;
+
+  Polyhedra_Powerset<NNC_Polyhedron> q_c = aux_test04(q);
+
+  nout << "complement(q) = " << q_c << endl;
+
+  // FIXME
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/linearsystem1.cc b/tests/Polyhedron/linearsystem1.cc
new file mode 100644
index 0000000..5172e6c
--- /dev/null
+++ b/tests/Polyhedron/linearsystem1.cc
@@ -0,0 +1,105 @@
+/* Test some functionality of class Linear_System.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <fstream>
+
+namespace {
+
+bool
+test01() {
+  const char* data_file = "linearsystem1.dat";
+
+  Variable A(0);
+  Variable B(1);
+
+#if 0
+  // Using this seed and the checked 8-bit integer coefficients,
+  // the random number generator produces the minimum value during
+  // the following computations.
+  unsigned long problematic_seed = 1141853716;
+  Random_Number_Generator rng(problematic_seed);
+#else
+  Random_Number_Generator rng;
+#endif
+
+#define ROWS 7
+#define COLS 3
+
+  Linear_System ls1(NOT_NECESSARILY_CLOSED);
+  TEMP_INTEGER(tem);
+  for (dimension_type rowi = 0; rowi < ROWS; ++rowi) {
+    Linear_Row row(COLS,
+		   Linear_Row::Flags(NOT_NECESSARILY_CLOSED,
+				     Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+    for (dimension_type col = 0; col < COLS; ++col) {
+      rng.get(row[col], 0);
+      // The following workaround is to avoid trivial positive overflows
+      // when using bounded coefficients.
+      if (std::numeric_limits<Coefficient>::is_bounded
+	  && row[col] == std::numeric_limits<Coefficient>::min())
+	// Here the randomly generated coefficients is equal to the
+	// allowed minimum value for a signed integer datatype that
+	// might adopt the 2's complement representation
+	// (e.g., -128 for 8 bit signed integers).
+	// Thus, it would cause a positive overflow during the normalization
+	// of the Linear_Row, because the GCD computation will try to negate
+	// such a coefficient.
+	// To avoid the problem, we simply increment the coefficient.
+	++row[col];
+    }
+
+    row.strong_normalize();
+    ls1.insert(row);
+
+    using std::fstream;
+    using std::ios_base;
+    fstream f;
+    open(f, data_file, ios_base::out);
+    ls1.ascii_dump(f);
+    close(f);
+
+    open(f, data_file, ios_base::in);
+    Linear_System ls2(NECESSARILY_CLOSED);
+    ls2.ascii_load(f);
+    close(f);
+
+    if (ls1 == ls2)
+      continue;
+
+    nout << "Linear_System::ascii_dump/load test failed." << endl
+	 << "m1.ascii_dump() gives" << endl;
+    ls1.ascii_dump(nout);
+    nout << "m2.ascii_dump() gives" << endl;
+    ls2.ascii_dump(nout);
+
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/linexpression1.cc b/tests/Polyhedron/linexpression1.cc
new file mode 100644
index 0000000..a340f05
--- /dev/null
+++ b/tests/Polyhedron/linexpression1.cc
@@ -0,0 +1,56 @@
+/* Testing Linear_Expression.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test operator-=(Linear_Expression& e1, const Linear_Expression& e2):
+// in this case the dimension of e2 is strictly greater than
+// the dimension of e1.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1 = A;
+  Linear_Expression e2 = B;
+  e1 -= e2;
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(e1 >= 0);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/lpproblem1.cc b/tests/Polyhedron/lpproblem1.cc
new file mode 100644
index 0000000..631a0ce
--- /dev/null
+++ b/tests/Polyhedron/lpproblem1.cc
@@ -0,0 +1,764 @@
+/* Test the LP_Problem class.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // Variable declaration.
+  Variable X01(0);
+  Variable X02(1);
+  Variable X03(2);
+  Variable X04(3);
+  Variable X05(4);
+  Variable X06(5);
+  Variable X07(6);
+  Variable X08(7);
+  Variable X09(8);
+  Variable X10(9);
+  Variable X11(10);
+  Variable X12(11);
+  Variable X13(12);
+  Variable X14(13);
+  Variable X15(14);
+  Variable X16(15);
+  Variable X17(16);
+  Variable X18(17);
+  Variable X19(18);
+  Variable X20(19);
+  Variable X21(20);
+  Variable X22(21);
+  Variable X23(22);
+  Variable X24(23);
+  Variable X25(24);
+  Variable X26(25);
+  Variable X27(26);
+  Variable X28(27);
+  Variable X29(28);
+  Variable X30(29);
+  Variable X31(30);
+  Variable X32(31);
+  Variable X33(32);
+  Variable X34(33);
+  Variable X35(34);
+  Variable X36(35);
+  Variable X37(36);
+  Variable X38(37);
+  Variable X39(38);
+
+  Constraint_System cs;
+  cs.insert(X01 - X02 - X03 + 0*X39 == 0);
+  cs.insert(Coefficient("2386907802506363")*X01 - X04 == 0);
+  cs.insert(-X01 >= -80);
+  cs.insert(X02 - Coefficient("3152519739159347")*X14 >= 0);
+  cs.insert(X06 + X07 + X08 + X09 - X14 - X15 == 0);
+  cs.insert(Coefficient("2386907802506363")*X06
+	    + Coefficient("2386907802506363")*X07
+	    + Coefficient("1080863910568919")*X08
+	    + Coefficient("7746191359077253")*X09
+	    - X16 == 0);
+  cs.insert(-X06 + X10 >= -80);
+  cs.insert(-X07 + X11 >= 0);
+  cs.insert(-X08 + X12 >= 0);
+  cs.insert(-X09 + X13 >= 0);
+  cs.insert(X22 - X23 - X24 - X25 == 0);
+  cs.insert(Coefficient("7746191359077253")*X22 - X26 == 0);
+  cs.insert(-X22 >= -500);
+  cs.insert(X23 - Coefficient("3152519739159347")*X36 >= 0);
+  cs.insert(Coefficient("7746191359077253")*X28
+	    + Coefficient("7746191359077253")*X29
+	    + Coefficient("3512807709348987")*X30
+	    + Coefficient("3332663724254167")*X31
+	    - X38 == 0);
+  cs.insert(X28 + X29 + X30 + X31 - X36 + X37 + X39 == 44);
+  cs.insert(-X28 + X32 >= -500);
+  cs.insert(-X29 + X33 >= 0);
+  cs.insert(-X30 + X34 >= 0);
+  cs.insert(-X31 + X35 >= 0);
+  cs.insert(Coefficient("-2661627379775963")*X10
+	    - Coefficient("2686397177726501")*X11
+	    - Coefficient("5422333951354077")*X12
+	    - Coefficient("5469621747441467")*X13
+	    + X25
+	    - Coefficient("2466846695892189")*X32
+	    - Coefficient("4996743786567565")*X33
+	    - Coefficient("5064297780978123")*X34
+	    - Coefficient("641481471923585")*X35 >= 0);
+  cs.insert(X03 - Coefficient("7854277750134145")*X22 >= 0);
+  cs.insert(X15
+	    - Coefficient("7854277750134145")*X28
+	    - Coefficient("7782220156096217")*X29
+	    - Coefficient("7782220156096217")*X30
+	    - Coefficient("7710162562058289")*X31 >= 0);
+  cs.insert(Coefficient("-5422333951354077")*X01 + X24 >= 0);
+  cs.insert(X21 >= 2);
+  cs.insert(-X16 - X38 >= -300);
+  for (dimension_type i = X01.id(); i <= X39.id(); ++i)
+    cs.insert(Variable(i) >= 0);
+
+  // Cost function.
+  Linear_Expression cost(-10*X02 - 8*X14 - 15*X23 - 12*X36 + 250*X39);
+
+  LP_Problem lp = LP_Problem(cs, cost, MAXIMIZATION);
+
+  if (lp.solve() != OPTIMIZED_LP_PROBLEM)
+    return false;
+
+  // Computed numerator and denominator.
+  Coefficient num;
+  Coefficient den;
+  lp.optimal_value(num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = 11000;
+  Coefficient den_kr = 1;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // The feasible / optimizing point.
+  Generator pg = lp.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point(300*X06 + 300*X15
+			  + Coefficient("716072340751908900")*X16
+			  + Coefficient("4773815605012726")*X21
+			  + Coefficient("105023943310279972")*X39,
+			  Coefficient("2386907802506363"));
+  if (pg != pg_kr)
+    return false;
+
+  // Making lp unfeasible.
+  Constraint_System further_cs;
+  further_cs.insert(X05 >= 5);
+  further_cs.insert(X05 <= 3);
+  lp.add_constraints(further_cs);
+
+  return !lp.is_satisfiable();
+}
+
+bool
+test02() {
+  // Variable definition.
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+
+  // Cost function
+  Linear_Expression cost(-26*A + 343*B + 1233*D - C + F);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A - B + C >= 24);
+  cs.insert(B <= 320);
+  cs.insert(A + B + 2*D == 23);
+  cs.insert(A + 2*B + E == 4112);
+  cs.insert(7*A + 5*B + F <= 200);
+  cs.insert(138*A + 2*G == 25);
+  cs.insert(23*A + 342*B - 34*H == 99);
+  for (dimension_type i = A.id(); i <= H.id(); ++i)
+    cs.insert(Variable(i) >= 0);
+
+  LP_Problem lp = LP_Problem(cs, cost, MAXIMIZATION);
+
+  Generator pg = lp.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point();
+  pg_kr = point(22*B + 1846*C + 863*D + 312468*E + 15090*F + 950*G + 0*H, 76);
+  if (pg != pg_kr)
+    return false;
+
+  Coefficient num;
+  Coefficient den;
+  lp.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = 1084869;
+  Coefficient den_kr = 76;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // Reoptimizing using another objective function.
+  Linear_Expression new_cost = -51*A + 632*B;
+  lp.set_objective_function(new_cost);
+  pg = lp.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  pg_kr = point(782*B + 1598*C + 138244*E + 2890*F + 425*G + 7767*H, 34);
+  if (pg != pg_kr)
+    return false;
+
+  lp.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  num_kr = 14536;
+  den_kr = 1;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // Reoptimizing after changing optimization mode.
+  lp.set_optimization_mode(MINIMIZATION);
+  pg = lp.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  pg_kr = point(17100*A + 26174*B + 2274482*C
+		+ 1063871*D + 388070456*E + 18627830*F + 0*H,
+		94392);
+  if (pg != pg_kr)
+    return false;
+
+  lp.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  num_kr = 3917467;
+  den_kr = 23598;
+
+  return num == num_kr && den == den_kr;
+}
+
+bool
+test03() {
+  // Variable declaration.
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Constraint_System cs;
+  cs.insert(Coefficient("2251799813685248")*A
+	    >= Coefficient("-5895288448651847"));
+  cs.insert(Coefficient("5895288437392848")*A
+	    + Coefficient("3643488632714799")*B
+	    - Coefficient("2251799813685248")*C
+	    >= Coefficient("-19077554137963492"));
+  cs.insert(Coefficient("5895288437392848")*A +
+	    Coefficient("3643488632714799")*B
+	    + Coefficient("2251799813685248")*C >=
+	    Coefficient("-19077554137963492"));
+  cs.insert(Coefficient("11790576874785696")*A
+	    + Coefficient("4503599627370496")*B
+	    + Coefficient("7286977274436797")*D
+	    >= Coefficient("-38155108284934184"));
+  cs.insert(Coefficient("11790576874785696")*A
+	    + Coefficient("4503599627370496")*B
+	    - Coefficient("7286977274436797")*D
+	    >= Coefficient("-38155108284934184"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    + Coefficient("7286977274436797")*C
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    + Coefficient("7286977274436797")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    - Coefficient("7286977274436797")*C
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+	    - Coefficient("7286977274436797")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("2947644225451823")*A
+	    - Coefficient("1125899906842624")*B
+	    + Coefficient("1821744319735099")*D
+	    >= Coefficient("-9538777088122044"));
+  cs.insert(Coefficient("11790576892800094")*A
+	    - Coefficient("4503599627370496")*B
+	    - Coefficient("7286977274436797")*D
+	    >= Coefficient("-38155108325466584"));
+  cs.insert(Coefficient("5895288437392848")*A
+	    - Coefficient("3643488630462999")*B
+	    + Coefficient("2251799813685248")*C
+	    >= Coefficient("-19077554133459892"));
+  cs.insert(Coefficient("2947644218696424")*A
+	    - Coefficient("1821744320860999")*B
+	    - Coefficient("1125899906842624")*C
+	    >= Coefficient("-9538777072359446"));
+  cs.insert(Coefficient("7286977269933197")*A
+	    + Coefficient("11790576924325290")*B
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108379509776"));
+  cs.insert(Coefficient("7286977269933197")*A
+	    + Coefficient("11790576924325290")*B
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108379509776"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("562949953421312")*A
+	    + Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("7286977269933197")*A
+	    + Coefficient("4503599627370496")*B
+	    + Coefficient("11790576865778496")*C
+	    >= Coefficient("-38155108266919784"));
+  cs.insert(Coefficient("7286977251918799")*A
+	    + Coefficient("4503599627370496")*B
+	    - Coefficient("11790576870282096")*C
+	    >= Coefficient("-38155108244401792"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    + Coefficient("1125899906842624")*C
+	    + Coefficient("2947644226577723")*D
+	    >= Coefficient("-9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    + Coefficient("1125899906842624")*C
+	    - Coefficient("2947644226577723")*
+	    D >= Coefficient("-9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    - Coefficient("1125899906842624")*C
+	    + Coefficient("2947644228829523")*D
+	    >= Coefficient("-9538777096003344"));
+  cs.insert(Coefficient("1821744320860999")*A
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("2947644228829523")*D
+	    >= Coefficient("-9538777096003344"));
+  cs.insert(Coefficient("3643488664239996")*A
+	    - Coefficient("2251799813685248")*B
+	    + Coefficient("5895288468918045")*C
+	    >= Coefficient("-19077554257308884"));
+  cs.insert(Coefficient("3643488652980997")*A
+	    - Coefficient("2251799813685248")*B
+	    - Coefficient("5895288468918045")*C
+	    >= Coefficient("-19077554232539084"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644229392473"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644227140673"));
+  cs.insert(Coefficient("562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    - Coefficient("562949953421312")*C
+	    - Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644227703623"));
+  cs.insert(Coefficient("7286977314969193")*A
+	    - Coefficient("11790576906310892")*B
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108447063768"));
+  cs.insert(Coefficient("3643488655232797")*A
+	    - Coefficient("5895288446400047")*B
+	    - Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554203265688"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("11790576753188506")*B
+	    + Coefficient("7286977179861205")*C
+	    >= Coefficient("-38155107920142616"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("11790576766699304")*B
+	    - Coefficient("7286977179861205")*C
+	    >= Coefficient("-38155107965178608"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("7286977157343207")*B
+	    + Coefficient("11790576712656108")*D
+	    >= Coefficient("-38155107816559824"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    + Coefficient("3643488592182402")*B
+	    - Coefficient("5895288374342453")*D
+	    >= Coefficient("-19077553960071308"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    + Coefficient("11790576753188506")*C
+	    + Coefficient("7286977175357605")*D
+	    >= Coefficient("-38155107924646216"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    + Coefficient("5895288390105051")*C
+	    - Coefficient("3643488594434202")*D
+	    >= Coefficient("-19077553996100104"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    - Coefficient("5895288421630249")*C
+	    + Coefficient("3643488619204000")*D
+	    >= Coefficient("-19077554088423896"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    - Coefficient("11790576865778496")*C
+	    - Coefficient("7286977247415199")*D
+	    >= Coefficient("-38155108244401792"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    - Coefficient("7286977247415199")*B
+	    + Coefficient("11790576888296494")*D
+	    >= Coefficient("-38155108307452184"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    - Coefficient("3643488639470198")*B
+	    - Coefficient("5895288464414445")*D
+	    >= Coefficient("-19077554210021088"));
+  cs.insert(Coefficient("2251799813685248")*A
+	    - Coefficient("5895288428385648")*B
+	    + Coefficient("3643488630462999")*C
+	    >= Coefficient("-19077554131208092"));
+  cs.insert(Coefficient("4503599627370496")*A
+	    - Coefficient("11790576843260498")*B
+	    - Coefficient("7286977224897201")*C
+	    >= Coefficient("-38155108163336992"));
+  cs.insert(Coefficient("1125899906842624")*B
+	    >= Coefficient("-2947644227703623"));
+  cs.insert(Coefficient("5895288459910846")*B
+	    + Coefficient("2251799813685248")*C
+	    + Coefficient("3643488630462999")*D
+	    >= Coefficient("-19077554198762088"));
+  cs.insert(Coefficient("5895288457659046")*B
+	    + Coefficient("2251799813685248")*C
+	    - Coefficient("3643488628211199")*D
+	    >= Coefficient("-19077554189754888"));
+  cs.insert(Coefficient("11790576915318092")*B
+	    - Coefficient("4503599627370496")*C
+	    + Coefficient("7286977269933197")*D
+	    >= Coefficient("-38155108393020576"));
+  cs.insert(Coefficient("5895288457659046")*B
+	    - Coefficient("2251799813685248")*C
+	    - Coefficient("3643488632714799")*D
+	    >= Coefficient("-19077554187503088"));
+  cs.insert(Coefficient("7286977292451195")*B
+	    + Coefficient("11790576919821692")*C
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108433552976"));
+  cs.insert(Coefficient("3643488664239996")*B
+	    + Coefficient("5895288486932443")*C
+	    - Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554304596680"));
+  cs.insert(Coefficient("3643488643973798")*B
+	    - Coefficient("5895288446400047")*C
+	    + Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554180747688"));
+  cs.insert(Coefficient("7286977314969193")*B
+	    - Coefficient("11790576937836090")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108510114168"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    + Coefficient("7286977247415199")*C
+	    + Coefficient("11790576883792894")*D
+	    >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    + Coefficient("7286977251918799")*C
+	    - Coefficient("11790576883792894")*D
+	    >= Coefficient("-38155108280430584"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    - Coefficient("7286977229400801")*C
+	    + Coefficient("11790576852267696")*D
+	    >= Coefficient("-38155108181351392"));
+  cs.insert(Coefficient("1125899906842624")*D
+	    >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("4503599627370496")*B
+	    - Coefficient("7286977229400801")*C
+	    - Coefficient("11790576852267696")*D
+	    >= Coefficient("-38155108167840592"));
+  cs.insert(Coefficient("-2251799813685248")*D
+	    >= Coefficient("-5895288448651847"));
+  cs.insert(Coefficient("2251799813685248")*C
+	    >= Coefficient("-5895288446400047"));
+  cs.insert(Coefficient("-2251799813685248")*C
+	    >= Coefficient("-5895288444148247"));
+  cs.insert(Coefficient("-1125899906842624")*B
+	    + Coefficient("1821744321986899")*C
+	    + Coefficient("2947644226577723")*D
+	    >= Coefficient("-9538777088122044"));
+  cs.insert(Coefficient("-3643488607945001")*B
+	    + Coefficient("5895288414874849")*C
+	    + Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554059150500"));
+  cs.insert(Coefficient("-4503599627370496")*B
+	    + Coefficient("7286977292451195")*C
+	    - Coefficient("11790576906310892")*D
+	    >= Coefficient("-38155108343480984"));
+  cs.insert(Coefficient("-7286977220393601")*B
+	    + Coefficient("11790576829749698")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108086775800"));
+  cs.insert(Coefficient("-4503599627370496")*B
+	    - Coefficient("7286977274436797")*C
+	    + Coefficient("11790576901807292")*D
+	    >= Coefficient("-38155108325466584"));
+  cs.insert(Coefficient("-3643488605693201")*B
+	    - Coefficient("5895288414874849")*C
+	    + Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554059150500"));
+  cs.insert(Coefficient("-1125899906842624")*B
+	    - Coefficient("1821744319735099")*C
+	    - Coefficient("2947644225451823")*D
+	    >= Coefficient("-9538777079114846"));
+  cs.insert(Coefficient("-7286977220393601")*B
+	    - Coefficient("11790576834253298")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108113797400"));
+  cs.insert(Coefficient("-5895288462162645")*B
+	    + Coefficient("2251799813685248")*C
+	    + Coefficient("3643488639470198")*D
+	    >= Coefficient("-19077554144718892"));
+  cs.insert(Coefficient("-11790576924325290")*B
+	    - Coefficient("4503599627370496")*C
+	    + Coefficient("7286977292451195")*D
+	    >= Coefficient("-38155108320962984"));
+  cs.insert(Coefficient("-5895288468918045")*B
+	    + Coefficient("2251799813685248")*C
+	    - Coefficient("3643488641721998")*D
+	    >= Coefficient("-19077554160481492"));
+  cs.insert(Coefficient("-11790576928828890")*B
+	    - Coefficient("4503599627370496")*C
+	    - Coefficient("7286977292451195")*D
+	    >= Coefficient("-38155108329970184"));
+  cs.insert(Coefficient("-281474976710656")*B
+	    >= Coefficient("-736911053829681"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    + Coefficient("11790576658612912")*B
+	    + Coefficient("7286977125818009")*C
+	    >= Coefficient("-38155107627408640"));
+  cs.insert(Coefficient("-2251799813685248")*A
+	    + Coefficient("5895288336061856")*B
+	    - Coefficient("3643488560657205")*C
+	    >= Coefficient("-19077553829466920"));
+  cs.insert(Coefficient("-2251799813685248")*A
+	    + Coefficient("3643488535887407")*B
+	    + Coefficient("5895288288774060")*D
+	    >= Coefficient("-19077553683099932"));
+  cs.insert(Coefficient("-7286977274436797")*A
+	    + Coefficient("11790576766699304")*B
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108032732608"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    + Coefficient("7286977098796411")*B
+	    - Coefficient("11790576609073318")*D
+	    >= Coefficient("-38155107483293448"));
+  cs.insert(Coefficient("-7286977301458395")*A
+	    + Coefficient("11790576735174106")*B
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155107983193008"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    + Coefficient("11790576708152508")*C
+	    + Coefficient("7286977148336007")*D
+	    >= Coefficient("-38155107771523824"));
+  cs.insert(Coefficient("-281474976710656")*A
+	    + Coefficient("281474976710656")*B
+	    + Coefficient("281474976710656")*C
+	    + Coefficient("281474976710656")*D
+	    >= Coefficient("-1473822119481311"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    + Coefficient("2947644178164027")*C
+	    - Coefficient("1821744285958102")*D
+	    >= Coefficient("-9538776941755056"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    + Coefficient("1125899906842624")*B
+	    + Coefficient("1125899906842624")*C
+	    - Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288471169845"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("11790576856771296")*C
+	    + Coefficient("7286977247415199")*D
+	    >= Coefficient("-38155108221883792"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    + Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    + Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288471169845"));
+  cs.insert(Coefficient("-140737488355328")*A
+	    - Coefficient("368455526774103")*C
+	    - Coefficient("227718038700250")*D
+	    >= Coefficient("-1192347131793131"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    + Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288464414445"));
+  cs.insert(Coefficient("-3643488643973798")*A
+	    + Coefficient("2251799813685248")*B
+	    + Coefficient("5895288441896447")*C
+	    >= Coefficient("-19077554158229692"));
+  cs.insert(Coefficient("-7286977296954795")*A
+	    + Coefficient("4503599627370496")*B
+	    - Coefficient("11790576892800094")*C
+	    >= Coefficient("-38155108352488176"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("7286977269933197")*B
+	    + Coefficient("11790576924325290")*D
+	    >= Coefficient("-38155108411034976"));
+  cs.insert(Coefficient("-3643488639470198")*A
+	    + Coefficient("2251799813685248")*C
+	    + Coefficient("5895288466666245")*D
+	    >= Coefficient("-19077554219028288"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("7286977296954795")*B
+	    - Coefficient("11790576955850488")*D
+	    >= Coefficient("-38155108514617768"));
+  cs.insert(Coefficient("-7286977251918799")*A
+	    + Coefficient("4503599627370496")*C
+	    - Coefficient("11790576892800094")*D
+	    >= Coefficient("-38155108311955784"));
+  cs.insert(Coefficient("-3643488655232797")*A
+	    - Coefficient("2251799813685248")*C
+	    + Coefficient("5895288480177044")*D
+	    >= Coefficient("-19077554264064284"));
+  cs.insert(Coefficient("-1821744320860999")*A
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("2947644229955423")*D
+	    >= Coefficient("-9538777099381044"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("11790576874785696")*B
+	    + Coefficient("7286977269933197")*C
+	    >= Coefficient("-38155108302948584"));
+  cs.insert(Coefficient("-7286977274436797")*A
+	    - Coefficient("4503599627370496")*B
+	    + Coefficient("11790576937836090")*C
+	    >= Coefficient("-38155108424545776"));
+  cs.insert(Coefficient("-4503599627370496")*A
+	    - Coefficient("11790576802728102")*B
+	    - Coefficient("7286977197875603")*C
+	    >= Coefficient("-38155108019221808"));
+  cs.insert(Coefficient("-3643488664239996")*A
+	    - Coefficient("2251799813685248")*B
+	    - Coefficient("5895288493687843")*C
+	    >= Coefficient("-19077554284330480"));
+  cs.insert(Coefficient("-562949953421312")*A
+	    - Coefficient("562949953421312")*B
+	    + Coefficient("562949953421312")*C
+	    + Coefficient("562949953421312")*D
+	    >= Coefficient("-2947644250784571"));
+  cs.insert(Coefficient("-281474976710656")*A
+	    - Coefficient("281474976710656")*B
+	    + Coefficient("281474976710656")*C
+	    - Coefficient("281474976710656")*D
+	    >= Coefficient("-1473822131021785"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    - Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    + Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288464414445"));
+  cs.insert(Coefficient("-1125899906842624")*A
+	    - Coefficient("1125899906842624")*B
+	    - Coefficient("1125899906842624")*C
+	    - Coefficient("1125899906842624")*D
+	    >= Coefficient("-5895288468918045"));
+  cs.insert(Coefficient("-3643488412038417")*A
+	    - Coefficient("5895288318047457")*B
+	    + Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077553665085532"));
+  cs.insert(Coefficient("-1821744199263809")*A
+	    - Coefficient("2947644153394229")*B
+	    - Coefficient("1125899906842624")*D
+	    >= Coefficient("-9538776813402468"));
+  cs.insert(Coefficient("-5895288378846052")*A
+	    + Coefficient("3643488632714799")*B
+	    + Coefficient("2251799813685248")*C
+	    >= Coefficient("-19077554023121704"));
+  cs.insert(Coefficient("-11790576834253298")*A
+	    + Coefficient("7286977314969193")*B
+	    - Coefficient("4503599627370496")*C
+	    >= Coefficient("-38155108302948584"));
+  cs.insert(Coefficient("-736911041726257")*A
+	    + Coefficient("281474976710656")*B
+	    + Coefficient("455436077400500")*D
+	    >= Coefficient("-2384694241068264"));
+  cs.insert(Coefficient("-5895288347320855")*A
+	    + Coefficient("2251799813685248")*B
+	    - Coefficient("3643488616952200")*D
+	    >= Coefficient("-19077553951064108"));
+  cs.insert(Coefficient("-2947644201807925")*A
+	    + Coefficient("1821744319735099")*C
+	    + Coefficient("1125899906842624")*D
+	    >= Coefficient("-9538777048715548"));
+  cs.insert(Coefficient("-11790576820742500")*A
+	    + Coefficient("7286977296954795")*C
+	    - Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108248905384"));
+  cs.insert(Coefficient("-11790576996382886")*A
+	    - Coefficient("7286977251918799")*C
+	    + Coefficient("4503599627370496")*D
+	    >= Coefficient("-38155108523624968"));
+  cs.insert(Coefficient("-5895288507198642")*A
+	    - Coefficient("3643488632714799")*C
+	    - Coefficient("2251799813685248")*D
+	    >= Coefficient("-19077554291085880"));
+  cs.insert(Coefficient("-11790577113476476")*A
+	    - Coefficient("4503599627370496")*B
+	    + Coefficient("7286977319472793")*D
+	    >= Coefficient("-38155108861394936"));
+  cs.insert(Coefficient("-5895288572500836")*A
+	    - Coefficient("2251799813685248")*B
+	    - Coefficient("3643488652980997")*D
+	    >= Coefficient("-19077554450963668"));
+  cs.insert(Coefficient("-5895288484680644")*A
+	    - Coefficient("3643488607945001")*B
+	    + Coefficient("2251799813685248")*C
+	    >= Coefficient("-19077554212272888"));
+  cs.insert(Coefficient("-2947644274991419")*A
+	    - Coefficient("1821744320860999")*B
+	    - Coefficient("1125899906842624")*C
+	    >= Coefficient("-9538777190578936"));
+  cs.insert(Coefficient("-2251799813685248")*A
+	    >= Coefficient("-5895288448651847"));
+
+  // Cost function
+  Linear_Expression cost(10*A + 21*B + 31*C + 45*D);
+
+  LP_Problem lp = LP_Problem(cs, cost, MAXIMIZATION);
+
+  Generator pg = lp.optimizing_point();
+  nout << "Optimizing point obtained by simplex:\n";
+  print_generator(pg);
+
+  Coefficient num;
+  Coefficient den;
+  lp.evaluate_objective_function(pg, num, den);
+  nout << "\nOptimum value = " << num << "/" << den << endl;
+
+  C_Polyhedron ph(cs);
+  Coefficient num1;
+  Coefficient den1;
+  bool maximum;
+  Generator pg1 = point();
+  ph.maximize(cost, num1, den1, maximum, pg1);
+
+  nout << "\nOptimizing point obtained by enumeration:\n";
+  print_generator(pg1);
+  nout << "\nOptimum value = " << num1 << "/" << den1 << endl;
+
+  return maximum && num == num1 && den == den1 && pg == pg1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F64(test01);
+  DO_TEST_F64(test02);
+  DO_TEST_F64(test03);
+END_MAIN
diff --git a/tests/Polyhedron/mapspacedims1.cc b/tests/Polyhedron/mapspacedims1.cc
new file mode 100644
index 0000000..66cea1b
--- /dev/null
+++ b/tests/Polyhedron/mapspacedims1.cc
@@ -0,0 +1,443 @@
+/* Test Polyhedron::map_space_dimensions().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Partial_Function function;
+
+  C_Polyhedron ph1(3);
+
+  print_function(function, "*** function ***");
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result;
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Partial_Function function;
+
+  C_Polyhedron ph1(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Partial_Function function;
+  function.insert(0, 2);
+  function.insert(2, 0);
+  function.insert(1, 1);
+
+  Generator_System gs;
+  gs.insert(point(2*C));
+  gs.insert(line(A + B));
+  gs.insert(ray(A + C));
+
+  C_Polyhedron ph1(gs);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  Generator_System known_gs;
+  known_gs.insert(point(2*A));
+  known_gs.insert(line(C + B));
+  known_gs.insert(ray(C + A));
+  C_Polyhedron known_result(known_gs);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** After ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(2, 0);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A + B));
+  gs.insert(ray(A - C));
+
+  C_Polyhedron ph1(gs);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  Generator_System known_gs;
+  known_gs.insert(point());
+  known_gs.insert(ray(B));
+  known_gs.insert(ray(B - A));
+  C_Polyhedron known_result(known_gs);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** After ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(2, 0);
+  function.insert(3, 2);
+  function.insert(4, 1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(ray(B));
+
+  C_Polyhedron ph1(gs);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point());
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** After ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(1, 1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A));
+  gs.insert(point(B));
+  gs.insert(point(A + B));
+
+  C_Polyhedron ph1(gs);
+  C_Polyhedron known_result(ph1);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** After ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+  function.insert(2, 2);
+  function.insert(3, 3);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A));
+  gs.insert(point(2*B));
+  gs.insert(point(A + 2*B));
+
+  C_Polyhedron ph1(gs);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result(4, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(point(B));
+  known_result.add_generator(point(2*A));
+  known_result.add_generator(point(2*A + B));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** After ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(2, 1);
+  function.insert(3, 2);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A));
+  gs.insert(ray(B));
+  gs.insert(ray(A + B));
+
+  C_Polyhedron ph1(gs);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(ray(A));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** After ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  C_Polyhedron ph1(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function rotate_right;
+  rotate_right.insert(0, 1);
+  rotate_right.insert(1, 2);
+  rotate_right.insert(2, 0);
+
+  Partial_Function rotate_left;
+  rotate_left.insert(0, 2);
+  rotate_left.insert(1, 0);
+  rotate_left.insert(2, 1);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(-4*x - 2*y + z >= -8);
+  ph.add_constraint(-4*x + 2*y + z >= 4);
+  ph.add_constraint(-2*x - y + 2*z >= -1);
+  ph.add_constraint(-2*x + y + 2*z >= 5);
+  ph.add_constraint(-x - y - 2*z >= -13);
+  ph.add_constraint(-x - z >= -5);
+  ph.add_constraint(-x >= -1);
+  ph.add_constraint(-x + y - 2*z >= -7);
+  ph.add_constraint(-y >= -4);
+  ph.add_constraint(y >= 2);
+  ph.add_constraint(x >= 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_function(rotate_right, "*** rotate_right ***");
+  print_function(rotate_left, "*** rotate_left ***");
+
+  C_Polyhedron rs[4];
+  rs[0] = ph;
+
+  print_constraints(rs[0], "*** rs[0] ***");
+
+  for (int i = 1; i <= 3; ++i) {
+    rs[i] = rs[i-1];
+    rs[i].map_space_dimensions(rotate_right);
+
+    print_constraints(rs[i], "*** rs[i] ***");
+
+  }
+
+  C_Polyhedron ls[4];
+  ls[3] = ph;
+
+  print_constraints(ls[3], "*** ls[3] ***");
+
+  for (int i = 2; i >= 0; --i) {
+    ls[i] = ls[i+1];
+    // Force generators to be up-to-date, for a change.
+    (void) ls[i].generators();
+    ls[i].map_space_dimensions(rotate_left);
+
+    print_constraints(ls[i], "*** ls[i] ***");
+
+  }
+
+  for (int i = 0; i <= 3; ++i)
+    if (rs[i] != ls[i]) {
+      nout << "rs[" << i << "] != ls[" << i << "]" << endl;
+      return false;
+    }
+
+  return true;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(A >= 2);
+  ph.add_constraint(B >= 1);
+  ph.add_constraint(C >= 0);
+
+  Partial_Function rotate_right;
+  rotate_right.insert(0, 1);
+  rotate_right.insert(1, 2);
+  rotate_right.insert(2, 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_function(rotate_right, "*** rotate_right ***");
+
+  ph.map_space_dimensions(rotate_right);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(C >= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.map_space_dimensions(rotate_right) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(-A + B == 0);
+
+  Partial_Function rotate_right;
+  rotate_right.insert(0, 1);
+  rotate_right.insert(1, 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_function(rotate_right, "*** rotate_right ***");
+
+  ph.map_space_dimensions(rotate_right);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.map_space_dimensions(rotate_right) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  // test10() only fails when using C_Polyhedron and 8 bit coefficients.
+#ifdef DERIVED_TEST
+  DO_TEST(test10);
+#else
+  DO_TEST_F8(test10);
+#endif // !defined(DERIVED_TEST)
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/matrix1.cc b/tests/Polyhedron/matrix1.cc
new file mode 100644
index 0000000..a1a8b3c
--- /dev/null
+++ b/tests/Polyhedron/matrix1.cc
@@ -0,0 +1,80 @@
+/* Test some functionality of class Matrix.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <fstream>
+
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+const char* data_file = "matrix1.dat";
+
+void
+ascii_dump_load() {
+  Variable A(0);
+  Variable B(1);
+  Random_Number_Generator r;
+
+  for (dimension_type num_rows = 0; num_rows <= 3; ++num_rows)
+    for (dimension_type num_cols = 0; num_cols <= 3; ++num_cols) {
+      Matrix m1(num_rows, num_cols);
+      for (dimension_type row = 0; row < num_rows; ++row)
+	for (dimension_type col = 0; col < num_cols; ++col)
+	  r.get(m1[row][col], 0);
+
+      fstream f;
+      open(f, data_file, ios_base::out);
+      m1.ascii_dump(f);
+      close(f);
+
+      open(f, data_file, ios_base::in);
+      Matrix m2;
+      m2.ascii_load(f);
+      close(f);
+
+      if (m1 != m2) {
+
+	nout << "Matrix::ascii_dump/load test failed." << endl
+	     << "m1.ascii_dump() gives" << endl;
+	m1.ascii_dump(nout);
+	nout << "m2.ascii_dump() gives" << endl;
+	m2.ascii_dump(nout);
+
+	exit(1);
+      }
+    }
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  ascii_dump_load();
+
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/max_min1.cc b/tests/Polyhedron/max_min1.cc
new file mode 100644
index 0000000..b87c1f8
--- /dev/null
+++ b/tests/Polyhedron/max_min1.cc
@@ -0,0 +1,138 @@
+/* Test Polyhedron::maximize(const Linear_Expression&, ...)
+   and Polyhedron::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(-2*x1-x2 >= -5);
+  ph.add_constraint(4*x1-4*x2 >= -5);
+  ph.add_constraint(x1 >= 0);
+  ph.add_constraint(x2 >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  bool ok = ph.maximize(x1-2*x2, num, den, included, g)
+    && num == 5 && den == 2 && included
+    && g.is_point()
+    && g.coefficient(x1) == 5 && g.coefficient(x2) == 0
+    && g.divisor() == 2;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = ph.minimize(x1-2*x2, num, den, included, g)
+    && num == -15 && den == 4 && included
+    && g.is_point()
+    && g.coefficient(x1) == 5 && g.coefficient(x2) == 10
+    && g.divisor() == 4;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(-x1-x2-x3 >= -100);
+  ph.add_constraint(-10*x1-4*x2-5*x3 >= -600);
+  ph.add_constraint(-x1-x2-3*x3 >= -150);
+  ph.add_constraint(x1 >= 0);
+  ph.add_constraint(x2 >= 0);
+  ph.add_constraint(x3 >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  bool ok = ph.maximize(-10*x1-6*x2-4*x3+4, num, den, included, g)
+    && num == 4 && den == 1 && included
+    && g.is_point()
+    && g.coefficient(x1) == 0
+    && g.coefficient(x2) == 0
+    && g.coefficient(x3) == 0
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = ph.minimize(-10*x1-6*x2-4*x3+4, num, den, included, g)
+    && num == -2188 && den == 3 && included
+    && g.is_point()
+    && g.coefficient(x1) == 100
+    && g.coefficient(x2) == 200
+    && g.coefficient(x3) == 0
+    && g.divisor() == 3;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8(test02);
+END_MAIN
diff --git a/tests/Polyhedron/maxspacedim1.cc b/tests/Polyhedron/maxspacedim1.cc
new file mode 100644
index 0000000..2fea90a
--- /dev/null
+++ b/tests/Polyhedron/maxspacedim1.cc
@@ -0,0 +1,62 @@
+/* Test the *::max_space_dimension() methods.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+template <typename T>
+dimension_type foo() {
+  return T::max_space_dimension();
+}
+
+template dimension_type foo<Variable>();
+template dimension_type foo<Linear_Expression>();
+template dimension_type foo<Constraint>();
+template dimension_type foo<Generator>();
+template dimension_type foo<Constraint_System>();
+template dimension_type foo<Generator_System>();
+template dimension_type foo<C_Polyhedron>();
+template dimension_type foo<NNC_Polyhedron>();
+template dimension_type foo<Polyhedra_Powerset<C_Polyhedron> >();
+template dimension_type foo<Polyhedra_Powerset<NNC_Polyhedron> >();
+
+#define PRINT(T) \
+nout << #T "::max_space_dimension() = " << T::max_space_dimension() << endl
+
+int
+main() TRY {
+  set_handlers();
+
+  PRINT(Variable);
+  PRINT(Linear_Expression);
+  PRINT(Constraint);
+  PRINT(Generator);
+  PRINT(Constraint_System);
+  PRINT(Generator_System);
+  PRINT(C_Polyhedron);
+  PRINT(NNC_Polyhedron);
+  PRINT(Polyhedra_Powerset<C_Polyhedron>);
+  PRINT(Polyhedra_Powerset<NNC_Polyhedron>);
+
+  // FIXME.
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/mc91.cc b/tests/Polyhedron/mc91.cc
new file mode 100644
index 0000000..d02df7b
--- /dev/null
+++ b/tests/Polyhedron/mc91.cc
@@ -0,0 +1,117 @@
+/* Test the Polyhedra_Powerset construction with McCarthy's 91 function.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  typedef Polyhedra_Powerset<C_Polyhedron> PCS;
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  // This is the base case:
+  // mc91(A, B) :- A >= 101, B = A-10.
+  C_Polyhedron base_ph(2);
+  base_ph.add_constraint(A >= 101);
+  base_ph.add_constraint(B == A-10);
+  PCS base(2, EMPTY);
+  base.add_disjunct(base_ph);
+
+  print_constraints(base, "*** base ***");
+
+  // This is the inductive case:
+  // mc91(A, B) :- A =< 100, C = A+11, E = D, F = B, mc91(C, D), mc91(E, F).
+  C_Polyhedron inductive_ph(6);
+  inductive_ph.add_constraint(A <= 100);
+  inductive_ph.add_constraint(C == A+11);
+  inductive_ph.add_constraint(E == D);
+  inductive_ph.add_constraint(F == B);
+  PCS inductive(6, EMPTY);
+  inductive.add_disjunct(inductive_ph);
+
+  print_constraints(inductive, "*** inductive ***");
+
+  // Initialize the fixpoint iteration.
+  PCS current = base;
+
+  print_constraints(current, "*** start ***");
+
+  // Contains the description computed at the previous iteration.
+  PCS previous;
+  do {
+    previous = current;
+    current = inductive;
+    Polyhedra_Powerset<C_Polyhedron> b1(2);
+    b1.concatenate_assign(previous);
+    b1.add_space_dimensions_and_embed(2);
+    current.intersection_assign(b1);
+    Polyhedra_Powerset<C_Polyhedron> b2(4);
+    b2.concatenate_assign(previous);
+    current.intersection_assign(b2);
+
+    print_constraints(current, "*** after body solving ***");
+
+    Variables_Set dimensions_to_remove;
+    // Deliberately inserted out of order (!).
+    dimensions_to_remove.insert(D);
+    dimensions_to_remove.insert(C);
+    dimensions_to_remove.insert(F);
+    dimensions_to_remove.insert(E);
+    current.remove_space_dimensions(dimensions_to_remove);
+
+    print_constraints(current, "*** after remove_space_dimensions ***");
+
+    current.least_upper_bound_assign(previous);
+
+    current.BHZ03_widening_assign<BHRZ03_Certificate>
+      (previous, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+    print_constraints(current, "*** after lub+widening ***");
+
+  } while (current != previous);
+
+  C_Polyhedron expected_ph(2);
+  expected_ph.add_constraint(A - B <= 10);
+  expected_ph.add_constraint(B >= 91);
+  Polyhedra_Powerset<C_Polyhedron> expected(2, EMPTY);
+  expected.add_disjunct(expected_ph);
+
+  bool ok = (expected == current);
+
+  print_constraints(expected, "*** expected ***");
+  print_constraints(current, "*** final result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/membytes1.cc b/tests/Polyhedron/membytes1.cc
new file mode 100644
index 0000000..2952e5b
--- /dev/null
+++ b/tests/Polyhedron/membytes1.cc
@@ -0,0 +1,218 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+add_constraint(C_Polyhedron& ph, const Constraint& c) {
+  const memory_size_type ph_memory_before = ph.total_memory_in_bytes();
+  const memory_size_type c_memory = c.total_memory_in_bytes();
+  ph.add_constraint(c);
+  const memory_size_type ph_memory_after = ph.total_memory_in_bytes();
+
+  nout << ph_memory_before
+       << " + " << c_memory
+       << " -> " << ph_memory_after
+       << endl;
+}
+
+void
+add_generator(C_Polyhedron& ph, const Generator& g) {
+  const memory_size_type ph_memory_before = ph.total_memory_in_bytes();
+  const memory_size_type g_memory = g.total_memory_in_bytes();
+  ph.add_generator(g);
+  const memory_size_type ph_memory_after = ph.total_memory_in_bytes();
+
+  nout << ph_memory_before
+       << " + " << g_memory
+       << " -> " << ph_memory_after
+       << endl;
+}
+
+void
+minimize(C_Polyhedron& ph) {
+  const memory_size_type ph_memory_before = ph.total_memory_in_bytes();
+  (void) ph.minimized_generators();
+  const memory_size_type ph_memory_after = ph.total_memory_in_bytes();
+
+  nout << ph_memory_before
+       << " -m-> " << ph_memory_after
+       << endl;
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  const memory_size_type x_total_size = x.total_memory_in_bytes();
+  const memory_size_type x_external_size = x.external_memory_in_bytes();
+
+  nout << "*** Size of variables ***"
+       << endl
+       << "x.total_memory_in_bytes() = " << x_total_size
+       << endl
+       << "x.external_memory_in_bytes() = " << x_external_size
+       << endl << endl;
+  nout << "*** Size of linear expressions ***"
+       << endl;
+
+  Linear_Expression le(0);
+  memory_size_type le_total_size = le.total_memory_in_bytes();
+  memory_size_type le_external_size = le.external_memory_in_bytes();
+
+  using namespace IO_Operators;
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += x;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += 2*y;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += 4*z;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl << endl;
+
+  nout << "*** Adding constraints to a polyhedron ***" << endl;
+
+  C_Polyhedron ph(3);
+  add_constraint(ph, 4*x - 2*y - z + 14 >= 0);
+  add_constraint(ph, 4*x + 2*y - z + 2 >= 0);
+  add_constraint(ph, x + y - 1 >= 0);
+  add_constraint(ph, x + y + 2*z - 5 >= 0);
+  minimize(ph);
+  add_constraint(ph, x + 1 >= 0);
+  add_constraint(ph, x + z - 1 >= 0);
+  add_constraint(ph, 2*x + y -2*z + 7 >= 0);
+  add_constraint(ph, x - y + 2*z + 1 >= 0);
+  minimize(ph);
+  add_constraint(ph, x - y + 5 >= 0);
+  add_constraint(ph, 2*x - y - 2*z + 13 >= 0);
+  add_constraint(ph, -2*x - y + 2*z + 1 >= 0);
+  add_constraint(ph, -x + y - 1 >= 0);
+  minimize(ph);
+  add_constraint(ph, -x + y -2*z + 7 >= 0);
+  add_constraint(ph, -4*x + 2*y + z - 4 >= 0);
+  add_constraint(ph, -2*x + y + 2*z - 5 >= 0);
+  add_constraint(ph, -x + 1 >= 0);
+  minimize(ph);
+  add_constraint(ph, -x - z + 5 >= 0);
+  add_constraint(ph, -4*x - 2*y + z + 8 >= 0);
+  add_constraint(ph, -x - y + 5 >= 0);
+  add_constraint(ph, -x - y -2*z +13 >= 0);
+  minimize(ph);
+
+  const memory_size_type ph_total_size = ph.total_memory_in_bytes();
+  const memory_size_type ph_external_size = ph.external_memory_in_bytes();
+  const Constraint_System& cs = ph.constraints();
+  const memory_size_type cs_total_size = cs.total_memory_in_bytes();
+  const memory_size_type cs_external_size = cs.external_memory_in_bytes();
+  const Generator_System& gs = ph.generators();
+  const memory_size_type gs_total_size = gs.total_memory_in_bytes();
+  const memory_size_type gs_external_size = gs.external_memory_in_bytes();
+
+  nout << endl;
+
+  nout << "*** Size of the user-visible polyhedra components ***"
+       << endl
+       << "ph.total_memory_in_bytes() = " << ph_total_size
+       << endl
+       << "cs.total_memory_in_bytes() = " << cs_total_size
+       << endl
+       << "gs.total_memory_in_bytes() = " << gs_total_size
+       << endl
+       << "ph.external_memory_in_bytes() = " << ph_external_size
+       << endl
+       << "cs.external_memory_in_bytes() = " << cs_external_size
+       << endl
+       << "gs.external_memory_in_bytes() = " << gs_external_size
+       << endl << endl;
+  nout << "*** Adding generators to a polyhedron ***" << endl;
+
+  C_Polyhedron qh(3, EMPTY);
+  unsigned n = 0;
+  for (Generator_System::const_iterator i = gs.begin(),
+	 gs_end = gs.end(); i != gs_end; ++i) {
+    add_generator(qh, *i);
+    if (++n % 4 == 0)
+      minimize(qh);
+  }
+
+  nout << endl;
+
+  nout << "*** Size of a constraint system vs size of contained constraints"
+       << endl
+       << "cs.total_memory_in_bytes() = " << cs_total_size
+       << endl;
+
+  memory_size_type cs_elements_size = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+	 cs_end = cs.end(); i != cs_end; ++i)
+    cs_elements_size += i->total_memory_in_bytes();
+
+  nout << "Sum of sizes of contained constraints = " << cs_elements_size
+       << endl << endl;
+
+  nout << "*** Size of a generator system vs size of contained generators"
+       << endl
+       << "gs.total_memory_in_bytes() = " << gs_total_size
+       << endl;
+
+  memory_size_type gs_elements_size = 0;
+  for (Generator_System::const_iterator i = gs.begin(),
+	 gs_end = gs.end(); i != gs_end; ++i)
+    gs_elements_size += i->total_memory_in_bytes();
+
+  nout << "Sum of sizes of contained generators = " << gs_elements_size
+       << endl << endl;
+
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/membytes2.cc b/tests/Polyhedron/membytes2.cc
new file mode 100644
index 0000000..f729bdc
--- /dev/null
+++ b/tests/Polyhedron/membytes2.cc
@@ -0,0 +1,92 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+int
+main() TRY {
+  set_handlers();
+
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(4*x - 2*y - z + 14 >= 0);
+  ph.add_constraint(4*x + 2*y - z + 2 >= 0);
+  ph.add_constraint(x + y - 1 >= 0);
+  ph.add_constraint(x + y + 2*z - 5 >= 0);
+
+  const memory_size_type ph_total_size = ph.total_memory_in_bytes();
+  const memory_size_type ph_external_size = ph.external_memory_in_bytes();
+
+  Determinate<C_Polyhedron> dph(ph);
+
+  const memory_size_type dph_total_size = dph.total_memory_in_bytes();
+  const memory_size_type dph_external_size = dph.external_memory_in_bytes();
+
+  nout << "ph.total_memory_in_bytes() = " << ph_total_size
+       << endl
+       << "ph.external_memory_in_bytes() = " << ph_external_size
+       << endl
+       << "dph.total_memory_in_bytes() = " << dph_total_size
+       << endl
+       << "dph.external_memory_in_bytes() = " << dph_external_size
+       << endl;
+
+  Polyhedra_Powerset<C_Polyhedron> pph(ph);
+
+  C_Polyhedron qh(3);
+  qh.add_constraint(x >= 0);
+  qh.add_constraint(y >= 0);
+  qh.add_constraint(z >= 0);
+  qh.add_constraint(x <= 1);
+  qh.add_constraint(y <= 1);
+  qh.add_constraint(z <= 1);
+  Polyhedra_Powerset<C_Polyhedron> pqh(qh);
+
+  Polyhedra_Powerset<C_Polyhedron> prh = pqh;
+  prh.poly_difference_assign(pph);
+
+  const memory_size_type pph_total_size = pph.total_memory_in_bytes();
+  const memory_size_type pph_external_size = pph.external_memory_in_bytes();
+  const memory_size_type pqh_total_size = pqh.total_memory_in_bytes();
+  const memory_size_type pqh_external_size = pqh.external_memory_in_bytes();
+  const memory_size_type prh_total_size = prh.total_memory_in_bytes();
+  const memory_size_type prh_external_size = prh.external_memory_in_bytes();
+
+  nout << "pph.total_memory_in_bytes() = " << pph_total_size
+       << endl
+       << "pph.external_memory_in_bytes() = " << pph_external_size
+       << endl
+       << "pqh.total_memory_in_bytes() = " << pqh_total_size
+       << endl
+       << "pqh.external_memory_in_bytes() = " << pqh_external_size
+       << endl
+       << "prh.total_memory_in_bytes() = " << prh_total_size
+       << endl
+       << "prh.external_memory_in_bytes() = " << prh_external_size
+       << endl;
+
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/memory1.cc b/tests/Polyhedron/memory1.cc
new file mode 100644
index 0000000..f210872
--- /dev/null
+++ b/tests/Polyhedron/memory1.cc
@@ -0,0 +1,195 @@
+/* Test the allocation error recovery facility of the library.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <new>
+#include <cstring>
+#include <cerrno>
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., `ru_utime'.
+# include <sys/resource.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+// If GMP does not support exceptions the test is pointless.
+// Cygwin has an almost dummy definition of setrlimit().
+// For some reason, this test does not work on Alpha machines.
+#if !GMP_SUPPORTS_EXCEPTIONS				\
+  || defined(__CYGWIN__)				\
+  || defined(__alpha)					\
+  || !(HAVE_DECL_RLIMIT_DATA || HAVE_DECL_RLIMIT_RSS	\
+       || HAVE_DECL_RLIMIT_VMEM || HAVE_DECL_RLIMIT_AS)
+
+int
+main() TRY {
+  return 0;
+}
+CATCH
+
+#else // GMP_SUPPORTS_EXCEPTIONS && !defined(__CYGWIN__) && ...
+
+namespace {
+
+void
+compute_open_hypercube_generators(dimension_type dimension) {
+  NNC_Polyhedron hypercube(dimension);
+  for (dimension_type i = 0; i < dimension; ++i) {
+    Variable x(i);
+    hypercube.add_constraint(x > 0);
+    hypercube.add_constraint(x < 1);
+  }
+  (void) hypercube.generators();
+}
+
+#define LIMIT(WHAT) \
+do { \
+  if (getrlimit(WHAT, &t) != 0) { \
+    std::cerr << "getrlimit failed: " << strerror(errno) << endl;	\
+    exit(1); \
+  } \
+  t.rlim_cur = bytes; \
+  if (setrlimit(WHAT, &t) != 0) { \
+    std::cerr << "setrlimit failed: " << strerror(errno) << endl;	\
+    exit(1); \
+  } \
+} while (0)
+
+void
+limit_memory(unsigned long bytes) {
+  struct rlimit t;
+#if HAVE_DECL_RLIMIT_DATA
+  // Limit heap size.
+  LIMIT(RLIMIT_DATA);
+#endif
+#if HAVE_DECL_RLIMIT_RSS
+  // Limit resident set size.
+  LIMIT(RLIMIT_RSS);
+#endif
+#if HAVE_DECL_RLIMIT_VMEM
+  // Limit mapped memory (brk + mmap).
+  LIMIT(RLIMIT_VMEM);
+#endif
+#if HAVE_DECL_RLIMIT_AS
+  // Limit virtual memory.
+  LIMIT(RLIMIT_AS);
+#endif
+}
+
+bool
+guarded_compute_open_hypercube_generators(dimension_type dimension,
+					  unsigned long max_memory_in_bytes) {
+  try {
+    limit_memory(max_memory_in_bytes);
+    compute_open_hypercube_generators(dimension);
+    return true;
+  }
+  catch (const std::bad_alloc&) {
+    nout << "out of virtual memory" << endl;
+    return false;
+  }
+  catch (...) {
+    exit(1);
+  }
+  // Should never get here.
+  exit(1);
+}
+
+} // namespace
+
+extern "C" void*
+cxx_malloc(size_t size) {
+  return ::operator new(size);
+}
+
+extern "C" void*
+cxx_realloc(void* p, size_t old_size, size_t new_size) {
+  if (new_size <= old_size)
+    return p;
+  else {
+    void* new_p = ::operator new(new_size);
+    memcpy(new_p, p, old_size);
+    ::operator delete(p);
+    return new_p;
+  }
+}
+
+extern "C" void
+cxx_free(void* p, size_t) {
+  ::operator delete(p);
+}
+
+#define INIT_MEMORY 3*1024*1024
+
+int
+main() TRY {
+  mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+
+  set_handlers();
+
+  // Find a dimension that cannot be computed with INIT_MEMORY bytes.
+  dimension_type dimension = 0;
+  do {
+    ++dimension;
+    nout << "Trying dimension " << dimension << endl;
+  }
+  while (guarded_compute_open_hypercube_generators(dimension, INIT_MEMORY));
+
+  // Now find an upper bound to the memory necessary to compute it.
+  unsigned long upper_bound = INIT_MEMORY;
+  do {
+    upper_bound *= 2;
+    nout << "Trying upper bound " << upper_bound << endl;
+  }
+  while (!guarded_compute_open_hypercube_generators(dimension, upper_bound));
+
+  // Search the "exact" amount of memory.
+  int lower_bound = upper_bound/2;
+  do {
+    int test_memory = (lower_bound+upper_bound)/2;
+    nout << "Probing " << test_memory << endl;
+    if (guarded_compute_open_hypercube_generators(dimension, test_memory))
+      upper_bound = test_memory;
+    else
+      lower_bound = test_memory;
+  } while (upper_bound-lower_bound > 1024);
+
+  nout << "Estimated memory for dimension " << dimension
+       << ": " << (lower_bound+upper_bound)/2 << " bytes" << endl;
+
+  return 0;
+}
+CATCH
+
+#endif // GMP_SUPPORTS_EXCEPTIONS && !defined(__CYGWIN__) && ...
diff --git a/tests/Polyhedron/memory2.cc b/tests/Polyhedron/memory2.cc
new file mode 100644
index 0000000..a4d55e2
--- /dev/null
+++ b/tests/Polyhedron/memory2.cc
@@ -0,0 +1,222 @@
+/* Test the allocation error recovery facility of the library.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <new>
+#include <limits>
+
+// If GMP does not support exceptions the test is pointless.
+#if !GMP_SUPPORTS_EXCEPTIONS
+
+int
+main() TRY {
+  return 0;
+}
+CATCH
+
+#else // GMP_SUPPORTS_EXCEPTIONS
+
+namespace {
+
+unsigned long mallocated = 0;
+unsigned long reallocated = 0;
+unsigned long freed = 0;
+unsigned long malloc_threshold = 0;
+unsigned long realloc_threshold = 0;
+
+void
+reset_allocators(unsigned long new_malloc_threshold,
+		 unsigned long new_realloc_threshold) {
+  mallocated = reallocated = freed = 0;
+  malloc_threshold = new_malloc_threshold;
+  realloc_threshold = new_realloc_threshold;
+}
+
+void
+fail_if_leaked() {
+  if (mallocated != freed) {
+    nout << "Memory leak: allocated " << mallocated
+	 << ", freed " << freed
+	 << endl;
+    exit(1);
+  }
+  else {
+    nout << "allocated = freed = " << mallocated
+	 << endl;
+  }
+}
+
+extern "C" void*
+cxx_malloc(size_t size) {
+  if (mallocated >= malloc_threshold) {
+    nout << "std::bad_alloc thrown from cxx_malloc()" << endl;
+    throw std::bad_alloc();
+  }
+  void* p = ::operator new(size);
+  vnout << "allocated " << size << " @ " << p << endl;
+  ++mallocated;
+  return p;
+}
+
+extern "C" void
+cxx_free(void* p, size_t) {
+  vnout << "freed " << p << endl;
+  ::operator delete(p);
+  ++freed;
+}
+
+extern "C" void*
+cxx_realloc(void* p, size_t old_size, size_t new_size) {
+  if (p == 0)
+    return cxx_malloc(new_size);
+
+  if (new_size == 0) {
+    cxx_free(p, old_size);
+    return 0;
+  }
+
+  if (new_size <= old_size) {
+  vnout << "reallocated " << old_size << " @ " << p
+	<< " down to " << new_size << " @ " << p
+	<< endl;
+    return p;
+  }
+  else {
+    if (reallocated >= realloc_threshold) {
+      nout << "std::bad_alloc thrown from cxx_realloc()" << endl;
+      throw std::bad_alloc();
+    }
+    void* new_p = ::operator new(new_size);
+    memcpy(new_p, p, old_size);
+    ::operator delete(p);
+    vnout << "reallocated " << old_size << " @ " << p
+	  << " up to " << new_size << " @ " << new_p
+	  << endl;
+    ++reallocated;
+    return new_p;
+  }
+}
+
+void
+test1() {
+  nout << "test1()" << endl;
+
+  reset_allocators(6, ULONG_MAX);
+  try {
+    Matrix* matrix = new Matrix(2, 5);
+    // We will get here only if no exception is thrown:
+    // this happens when using native coefficients.
+    delete matrix;
+  }
+  catch (const std::bad_alloc&) {
+    nout << "std::bad_alloc caught" << endl;
+    fail_if_leaked();
+  }
+  catch (...) {
+    nout << "exception different from std::bad_alloc caught" << endl;
+    fail_if_leaked();
+  }
+}
+
+enum Threshold { Malloc, Realloc };
+
+void
+test_every_allocation(const dimension_type d, const Threshold threshold) {
+  // Run once without checking so as to allow for the allocation of
+  // statically allocated coefficients.
+  bool dry_run = true;
+  unsigned long k = ULONG_MAX;
+  bool go_ahead;
+  do {
+    nout << "**************** k = " << k << " ****************" << endl;
+    if (dry_run)
+      nout << "*************** dry run ***************" << endl;
+    go_ahead = dry_run;
+    if (threshold == Malloc)
+      reset_allocators(k, ULONG_MAX);
+    else
+      reset_allocators(ULONG_MAX, k);
+    try {
+      C_Polyhedron ph(d);
+      ph.add_constraint(Variable(0) == ULONG_MAX);
+      for (dimension_type i = 1; i < d; ++i)
+	ph.add_constraint(Variable(i) == ULONG_MAX*Variable(i-1));
+
+      (void) ph.minimized_generators();
+    }
+    catch (const std::bad_alloc&) {
+      nout << "std::bad_alloc caught" << endl;
+      fail_if_leaked();
+      go_ahead = true;
+      ++k;
+    }
+    catch (...) {
+      nout << "exception different from std::bad_alloc caught" << endl;
+      fail_if_leaked();
+      // Notice that we do not go ahead if we did not catch a bad_alloc.
+    }
+    if (dry_run) {
+      dry_run = false;
+      k = 0;
+    }
+  } while (go_ahead);
+}
+
+void
+test2() {
+  nout << "test2()" << endl;
+  test_every_allocation(5, Malloc);
+}
+
+void
+test3() {
+  nout << "test3()" << endl;
+  test_every_allocation(10, Realloc);
+}
+
+
+} // namespace
+
+#define IGNORE_OVERFLOWS(fun) \
+try { \
+  fun; \
+} \
+catch (const std::overflow_error&) { \
+}
+
+int
+main() TRY {
+  mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+
+  set_handlers();
+
+  // The point of this test is to detect memory leaks.
+  // So we plainly ignore overflow exceptions.
+  IGNORE_OVERFLOWS(test1());
+  IGNORE_OVERFLOWS(test2());
+  IGNORE_OVERFLOWS(test3());
+
+  return 0;
+}
+CATCH
+
+#endif // GMP_SUPPORTS_EXCEPTIONS
diff --git a/tests/Polyhedron/minconstraints1.cc b/tests/Polyhedron/minconstraints1.cc
new file mode 100644
index 0000000..22cac6f
--- /dev/null
+++ b/tests/Polyhedron/minconstraints1.cc
@@ -0,0 +1,77 @@
+/* Test Polyhedron::minimized_constraints().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A + B >= -2);
+  ph1.add_constraint(A >= -3);
+
+  const Constraint_System cs = ph1.minimized_constraints();
+
+  C_Polyhedron ph2(cs);
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (known_result == ph2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron known_result;
+  known_result = ph1;
+
+  Constraint_System cs = ph1.minimized_constraints();
+
+  C_Polyhedron ph2(cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/minconstraints2.cc b/tests/Polyhedron/minconstraints2.cc
new file mode 100644
index 0000000..14c671a
--- /dev/null
+++ b/tests/Polyhedron/minconstraints2.cc
@@ -0,0 +1,70 @@
+/* Test Polyhedron::minimized_constraints().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <algorithm>
+
+namespace {
+
+bool
+test01() {
+  NNC_Polyhedron ph1;
+
+  Constraint_System cs = ph1.minimized_constraints();
+
+  NNC_Polyhedron ph2(cs);
+
+  const Constraint_System& min_cs = ph2.minimized_constraints();
+
+  bool ok = (ph1 == ph2
+	     && min_cs.begin() == min_cs.end());
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x < 1);
+  cs.insert(y > 0);
+
+  NNC_Polyhedron ph(cs);
+  const Constraint_System& min_cs = ph.minimized_constraints();
+  return std::distance(min_cs.begin(), min_cs.end()) == 3;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
+
diff --git a/tests/Polyhedron/mingenerators1.cc b/tests/Polyhedron/mingenerators1.cc
new file mode 100644
index 0000000..23e7fa7
--- /dev/null
+++ b/tests/Polyhedron/mingenerators1.cc
@@ -0,0 +1,85 @@
+/* Test Polyhedron::minimized_generators().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(B));
+  gs1.insert(line(A));
+  gs1.insert(ray(B));
+  gs1.insert(ray(A + B));
+  gs1.insert(ray(-A + B));
+
+  C_Polyhedron ph1(gs1);
+
+  const Generator_System gs2 = ph1.minimized_generators();
+
+  print_generators(gs2, "*** gs2 ***");
+
+  C_Polyhedron ph2(gs2);
+  Generator_System known_gs;
+  known_gs.insert(point());
+  known_gs.insert(line(A));
+  known_gs.insert(ray(B));
+  C_Polyhedron known_result(known_gs);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  C_Polyhedron known_result = ph1;
+
+  Generator_System gs = ph1.minimized_generators();
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generators(gs);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(gs, "*** gs ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/mingenerators2.cc b/tests/Polyhedron/mingenerators2.cc
new file mode 100644
index 0000000..df77663
--- /dev/null
+++ b/tests/Polyhedron/mingenerators2.cc
@@ -0,0 +1,48 @@
+/* Test Polyhedron::minimized_generators().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  NNC_Polyhedron ph1;
+
+  Generator_System gs = ph1.minimized_generators();
+
+  NNC_Polyhedron ph2(gs);
+
+  bool ok = (ph1 == ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(gs, "*** gs ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/nncminimize1.cc b/tests/Polyhedron/nncminimize1.cc
new file mode 100644
index 0000000..7dd050f
--- /dev/null
+++ b/tests/Polyhedron/nncminimize1.cc
@@ -0,0 +1,378 @@
+/* Test minimization of NNC polyhedra.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <algorithm>
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  // Building a square.
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 6);
+  cs.insert(y >= 0);
+  cs.insert(y <= 6);
+
+  NNC_Polyhedron ph(cs);
+
+  nout << "Topologically closed square" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  // Removing all the vertices using strict inequalities.
+  cs.clear();
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 12);
+  cs.insert(x - y < 6);
+  cs.insert(x - y > -6);
+
+  ph.add_constraints_and_minimize(cs);
+
+  nout << "After vertices removal" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  ph.minimized_generators();
+
+  Generator_System gs;
+  gs.insert(closure_point());
+  gs.insert(closure_point(6*x));
+  gs.insert(closure_point(6*y));
+  gs.insert(closure_point(6*x + 6*y));
+  gs.insert(point(3*x));
+  gs.insert(point(3*y));
+  gs.insert(point(3*x + 6*y));
+  gs.insert(point(6*x + 3*y));
+
+  NNC_Polyhedron known_result(gs);
+
+  bool ok = (ph == known_result);
+
+  const Generator_System& min_gs = ph.minimized_generators();
+  bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 8);
+
+  nout << "After NNC minimization" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  return ok && ok1;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  // Building a square.
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+
+  NNC_Polyhedron ph(cs);
+
+  nout << "Topologically closed square" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  // Removing all the vertices using strict inequalities.
+  cs.clear();
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 2);
+  cs.insert(x - y < 1);
+  cs.insert(x - y > -1);
+
+  ph.add_constraints_and_minimize(cs);
+
+  nout << "After vertices removal" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  ph.minimized_generators();
+
+  Generator_System gs;
+  gs.insert(closure_point());
+  gs.insert(closure_point(x));
+  gs.insert(closure_point(y));
+  gs.insert(closure_point(x + y));
+  gs.insert(point(x, 10));
+  gs.insert(point(y, 10));
+  gs.insert(point(x + 10*y, 10));
+  gs.insert(point(10*x + y, 10));
+
+  NNC_Polyhedron known_result(gs);
+
+  bool ok = (ph == known_result);
+
+  const Generator_System& min_gs = ph.minimized_generators();
+  bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 8);
+
+  nout << "After NNC minimization" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+  nout << endl;
+  nout << "known result" << endl;
+  print_constraints(known_result.constraints(), "*** known constraints ***");
+  print_generators(known_result.generators(), "*** known generators ***");
+
+  return ok && ok1;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  // Building a square.
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+
+  NNC_Polyhedron ph(cs);
+
+  nout << "Topologically closed square" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  // Removing all the vertices using strict inequalities.
+  cs.clear();
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 2);
+  cs.insert(x - y < 1);
+  cs.insert(x - y > -1);
+
+  ph.add_constraints_and_minimize(cs);
+
+  nout << "After vertices removal" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  Generator_System gs;
+  gs.insert(point(x + y, 4));
+  gs.insert(point(x + 5*y, 4));
+  gs.insert(point(5*x + y, 4));
+  gs.insert(point(5*x + 5*y, 4));
+
+  NNC_Polyhedron ph2(gs);
+
+  ph.intersection_assign(ph2);
+
+  nout << "After intersection" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  ph.minimized_generators();
+
+  gs.clear();
+  gs.insert(closure_point(x + y));
+  gs.insert(point(x + y, 4));
+  gs.insert(point(x + 4*y, 4));
+  gs.insert(point(4*x + y, 4));
+  NNC_Polyhedron known_result(gs);
+
+  bool ok = (ph == known_result);
+
+  const Generator_System& min_gs = ph.minimized_generators();
+  bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 4);
+
+  nout << "After NNC minimization" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  return ok && ok1;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  // Building an open square.
+  Generator_System gs;
+  gs.insert(closure_point());
+  gs.insert(closure_point(15*x));
+  gs.insert(closure_point(15*y));
+  gs.insert(closure_point(15*x + 15*y));
+
+  // All of these points, but a (any) single one of them, are redundant.
+  gs.insert(point(3*x + 3*y));
+  gs.insert(point(6*x + y));
+  gs.insert(point(9*x + y));
+  gs.insert(point(12*x + 3*y));
+  gs.insert(point(3*x + 12*y));
+  gs.insert(point(6*x + 14*y));
+  gs.insert(point(9*x + 14*y));
+  gs.insert(point(12*x + 12*y));
+  gs.insert(point(x + 6*y));
+  gs.insert(point(x + 9*y));
+  gs.insert(point(14*x + 6*y));
+  gs.insert(point(14*x + 9*y));
+
+  NNC_Polyhedron ph(gs);
+
+  nout << endl << "Before NNC minimization" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  ph.minimized_constraints();
+
+  nout << endl << "After NNC minimization" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  gs.clear();
+  gs.insert(closure_point());
+  gs.insert(closure_point(15*x));
+  gs.insert(closure_point(15*y));
+  gs.insert(closure_point(15*x + 15*y));
+  gs.insert(point(x + y));
+
+  NNC_Polyhedron known_result(gs);
+  bool ok = (ph == known_result);
+
+  const Generator_System& min_gs = ph.minimized_generators();
+  bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 5);
+
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  print_constraints(known_result.constraints(),
+		    "*** known_result constraints ***");
+  print_generators(known_result.generators(),
+		   "*** known_result generators ***");
+  return ok && ok1;
+}
+
+bool
+test05() {
+  Variable x(0);
+
+  Constraint_System cs;
+  cs.insert(x > 0);
+  cs.insert(x < 2);
+
+  NNC_Polyhedron ph1(cs);
+
+  cs.clear();
+  cs.insert(x > 2);
+  cs.insert(x < 3);
+
+  NNC_Polyhedron ph2(cs);
+
+  ph1.poly_hull_assign_and_minimize(ph2);
+
+  nout << "(Weakly) minimized poly hull" << endl;
+  print_constraints(ph1.constraints(), "*** ph1 constraints ***");
+  print_generators(ph1.generators(), "*** ph1 generators ***");
+
+  NNC_Polyhedron copy_ph1(ph1);
+
+  const Constraint_System& ph1_cs = ph1.constraints();
+  const int num_constraints = std::distance(ph1_cs.begin(), ph1_cs.end());
+
+  const Constraint_System& ph1_min_cs = ph1.minimized_constraints();
+  const int num_minimized_constraints = std::distance(ph1_min_cs.begin(),
+						      ph1_min_cs.end());
+
+  print_constraints(ph1, "*** After ph1.minimized_constraints() ***");
+  nout << "num_constraints = " << num_constraints << endl;
+  nout << "num_minimized_constraints = "
+       << num_minimized_constraints << endl;
+
+  int num_points = 0;
+  for (Generator_System::const_iterator i = copy_ph1.generators().begin(),
+	 gs_end = copy_ph1.generators().end(); i != gs_end; ++i)
+    if ((*i).is_point() || (*i).is_closure_point())
+      ++num_points;
+
+  copy_ph1.minimized_generators();
+
+  int num_minimized_points = 0;
+  for (Generator_System::const_iterator i = copy_ph1.generators().begin(),
+	 gs_end = copy_ph1.generators().end(); i != gs_end; ++i)
+    if ((*i).is_point() || (*i).is_closure_point())
+      ++num_minimized_points;
+
+  bool ok = (num_constraints == num_minimized_constraints + 1
+	     && num_points == num_minimized_points + 1);
+
+  print_generators(copy_ph1,
+		   "*** After copy_ph1_minimized_generators() ***");
+  nout << "num_points = " << num_points << endl;
+  nout << "num_minimized_points = "
+       << num_minimized_points << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+
+  Constraint_System cs;
+  cs.insert(x > 0);
+
+  NNC_Polyhedron ph(cs);
+
+  cs.clear();
+  cs.insert(3*x >= 1);
+  cs.insert(2*x <= 1);
+
+  ph.add_constraints(cs);
+
+  nout << endl << "Before NNC minimization" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  ph.minimized_constraints();
+
+  NNC_Polyhedron known_result(1);
+  known_result.add_constraint(3*x >= 1);
+  known_result.add_constraint(2*x <= 1);
+
+  bool ok = (ph == known_result);
+
+  nout << endl << "After NNC minimization" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8A(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+  DO_TEST_F8(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/nncminimize2.cc b/tests/Polyhedron/nncminimize2.cc
new file mode 100644
index 0000000..5b2f9de
--- /dev/null
+++ b/tests/Polyhedron/nncminimize2.cc
@@ -0,0 +1,80 @@
+/* Test NNC_Polyhedron::ph.minimized_generators().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  NNC_Polyhedron ph(5, EMPTY);
+  ph.add_generator(point(52131*A + 11369*B - 483036*C - 776212*D - 401649*E));
+  ph.add_generator(point(-80461*A + 86836*B + 88698*C - 269590*D + 951545*E));
+  ph.add_generator(point(215169*A - 42532*B + 234755*C + 705077*D - 632177*E));
+  ph.add_generator(point(-294493*A - 44546*B + 861680*C + 344228*D + 224283*E));
+  ph.add_generator(point(-158536*A + 273936*B - 854715*C - 151614*D + 382491*E));
+  ph.add_generator(point(-207881*A - 205091*B - 385540*C + 729319*D + 483915*E));
+  ph.add_generator(point(-1084*A + 2507*B - 28428*C + 1882*D - 999590*E));
+
+  ph.add_generator(point(450943*A - 416394*B + 883*C + 680432*D - 400345*E));
+  ph.add_generator(point(-483589*A - 16983*B - 824243*C + 106969*D - 273921*E));
+  ph.add_generator(point(554952*A - 155460*B - 572886*C - 91530*D + 575571*E));
+  ph.ascii_dump(vnout);
+  vnout << endl;
+
+  const Generator_System& gs = ph.minimized_generators();
+  ph.ascii_dump(vnout);
+  vnout << endl;
+
+  if (!ph.OK())
+    return false;
+
+  bool ok = true;
+  unsigned num_points = 0;
+  for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
+       i != gs_end;
+       ++i) {
+    using namespace IO_Operators;
+    nout << *i << endl;
+    if (i->type() != Generator::POINT) {
+      nout << "i->type() == " << i->type() << endl;
+      ok = false;
+    }
+    ++num_points;
+  }
+
+  nout << "points = " << num_points << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F64(test01);
+END_MAIN
diff --git a/tests/Polyhedron/numberinput1.cc b/tests/Polyhedron/numberinput1.cc
new file mode 100644
index 0000000..e0d718f
--- /dev/null
+++ b/tests/Polyhedron/numberinput1.cc
@@ -0,0 +1,341 @@
+/* Test number input.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <string>
+#include <sstream>
+#include <cstdlib>
+
+namespace {
+
+using namespace Checked;
+
+struct Test_Extended_Number_Policy {
+  static const int check_overflow = 1;
+  static const int check_inf_add_inf = 0;
+  static const int check_inf_sub_inf = 0;
+  static const int check_inf_mul_zero = 0;
+  static const int check_div_zero = 0;
+  static const int check_inf_div_inf = 0;
+  static const int check_inf_mod = 0;
+  static const int check_sqrt_neg = 0;
+  static const int handle_nan = 1;
+  static const int handle_infinity = 1;
+  static const int fpu_check_inexact = 0;
+  static const int check_nan_args = 1;
+  static const Rounding_Dir ROUND_DEFAULT = ROUND_UP;
+  static void handle_result(Result r);
+};
+
+inline void
+Test_Extended_Number_Policy::handle_result(Result r) {
+  if (r == VC_NAN)
+    return;
+  Extended_Number_Policy::handle_result(r);
+}
+
+bool
+aux_test(std::string input_string,
+	 std::string expected_output,
+	 std::string expected_residual,
+	 Result expected_result) {
+  std::stringstream input_stream(input_string);
+  Checked_Number<mpq_class, Test_Extended_Number_Policy> value;
+  Result result = input(value, input_stream, ROUND_UP);
+  std::string residual;
+  getline(input_stream, residual, '\0');
+  std::stringstream output_stream;
+  output_stream << value;
+  std::string output = output_stream.str();
+
+  bool ok = (result == expected_result
+	     && residual == expected_residual
+	     && output == expected_output);
+
+  nout << "input = " << input_string
+       << endl
+       << "expected result = " << expected_result
+       << ", actual result = " << result
+       << endl
+       << "expected value = " << expected_output
+       << ", actual value = " << output
+       << endl
+       << "expected residual = " << expected_residual
+       << ", actual residual = " << residual
+       << endl;
+
+  return ok;
+}
+
+// Testing symbols.
+bool
+test01() {
+  return aux_test("inf", "+inf", "", V_EQ)
+    && aux_test("InF", "+inf", "", V_EQ)
+    && aux_test("+inF", "+inf", "", V_EQ)
+    && aux_test("-InF", "-inf", "", V_EQ)
+    && aux_test("-InFinity", "-inf", "inity", V_EQ)
+    && aux_test("Inf7", "+inf", "7", V_EQ)
+    && aux_test("nan", "nan", "", VC_NAN)
+    && aux_test("NAN", "nan", "", VC_NAN)
+    && aux_test("Nan", "nan", "", VC_NAN);
+}
+
+// Testing symbols with trailing input and errors.
+bool
+test02() {
+  return aux_test("nAn+", "nan", "+", VC_NAN)
+    && aux_test("naN/", "nan", "/", VC_NAN)
+    && aux_test("nAN/0", "nan", "/0", VC_NAN)
+    && aux_test("nAN/-3", "nan", "/-3", VC_NAN)
+    && aux_test("inF/3", "+inf", "/3", V_EQ)
+    && aux_test("Inf/-3", "+inf", "/-3", V_EQ)
+    && aux_test("-inf/-3", "-inf", "/-3", V_EQ)
+    && aux_test("-NAn", "nan", "NAn", V_CVT_STR_UNK);
+}
+
+// Testing integers.
+bool
+test03() {
+  return aux_test("  -  2", "nan", "  2", V_CVT_STR_UNK)
+    && aux_test("15", "15", "", V_EQ)
+    && aux_test("34976098", "34976098", "", V_EQ)
+    && aux_test("34976098349760983497609834976098",
+		"34976098349760983497609834976098", "", V_EQ)
+    && aux_test("3/-inf", "nan", "", V_CVT_STR_UNK)
+    && aux_test("+77", "77", "", V_EQ)
+    && aux_test("-77", "-77", "", V_EQ)
+    && aux_test("-7777777777777777777777777",
+		"-7777777777777777777777777", "", V_EQ)
+    && aux_test("-77 ", "-77", " ", V_EQ)
+    && aux_test("-77   ", "-77", "   ", V_EQ)
+    && aux_test("-77ab", "-77", "ab", V_EQ)
+    && aux_test("-77,33", "-77", ",33", V_EQ)
+    && aux_test(" -  2", "nan", "  2", V_CVT_STR_UNK);
+}
+
+// Testing fractions.
+bool
+test04() {
+  return aux_test("71.3", "713/10", "", V_EQ)
+    && aux_test("0.123456", "1929/15625", "", V_EQ)
+    && aux_test("12345678910111213141516.12345678910111213141516",
+		"308641972752780328537903086419727527803285379/25000000000000000000000",
+		"", V_EQ)
+    && aux_test("0.123456 101", "1929/15625", " 101", V_EQ)
+    && aux_test("0.123456   101", "1929/15625", "   101", V_EQ)
+    && aux_test("0.123456     ", "1929/15625", "     ", V_EQ)
+    && aux_test(".333", "nan", ".333", V_CVT_STR_UNK);
+}
+
+// Testing exponent.
+bool
+test05() {
+  return aux_test("15e1", "150", "", V_EQ)
+    && aux_test("15*^8", "1500000000", "", V_EQ)
+    && aux_test("1*^009", "1000000000", "", V_EQ)
+    && aux_test("15*^111",
+		"15000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+		"", V_EQ)
+    && aux_test("151515e+1", "1515150", "", V_EQ)
+    && aux_test("151515151515151515e+1", "1515151515151515150", "", V_EQ)
+    && aux_test("9200e-2", "92", "", V_EQ)
+    && aux_test("15*^7e4", "150000000", "e4", V_EQ)
+    && aux_test("15*^6/", "nan", "", V_CVT_STR_UNK)
+    && aux_test("9200e", "nan", "", V_CVT_STR_UNK)
+    && aux_test("9200ea", "nan", "a", V_CVT_STR_UNK)
+    && aux_test("9200*^", "nan", "", V_CVT_STR_UNK)
+    && aux_test("9200*^b", "nan", "b", V_CVT_STR_UNK)
+    // Exponent and fraction.
+    && aux_test("5.3e3", "5300", "", V_EQ)
+    && aux_test("2.2e-1", "11/50", "", V_EQ)
+    && aux_test("5.33333*^-4", "533333/1000000000", "", V_EQ)
+    && aux_test("-2.20001*^+3", "-220001/100", "", V_EQ)
+    && aux_test("7.e", "nan", "", V_CVT_STR_UNK)
+    && aux_test("7.0 e3", "7", " e3", V_EQ);
+}
+
+// Testing exponent size limit.
+bool
+test06() {
+  std::stringstream ss;
+  ss << "1e" << (LONG_MAX / 10) + 1 << "0";
+  std::stringstream ss2;
+  ss2 << "1e" << (LONG_MAX / 10) << (LONG_MAX % 10) + 1;
+  return aux_test(ss.str(), "nan", "", V_CVT_STR_UNK)
+    && aux_test(ss2.str(), "nan", "", V_CVT_STR_UNK);
+}
+
+// Testing hexadecimals.
+bool
+test07() {
+  return aux_test("0x", "nan", "", V_CVT_STR_UNK)
+    && aux_test("0xx", "nan", "x", V_CVT_STR_UNK)
+    && aux_test("0x0.f", "15/16", "", V_EQ)
+    && aux_test("0x.f", "15/16", "", V_EQ)
+    && aux_test("0x.f*^1", "15", "", V_EQ)
+    && aux_test("0x-f", "nan", "-f", V_CVT_STR_UNK)
+    && aux_test("0xfa", "250", "", V_EQ)
+    && aux_test("-0xfa", "-250", "", V_EQ)
+    && aux_test("-0x000000000000000000000000fa", "-250", "", V_EQ)
+    && aux_test("-0xfaz", "-250", "z", V_EQ)
+    && aux_test("-0xfa .", "-250", " .", V_EQ)
+    && aux_test("0xfa0xfa", "4000", "xfa", V_EQ)
+    && aux_test("0x0b123", "45347", "", V_EQ);
+}
+
+// Testing hexadecimals fractions and exponents.
+bool
+test08() {
+  return
+    // Fraction.
+    aux_test("0xfa.a", "2005/8", "", V_EQ)
+    && aux_test("0xfa.ay", "2005/8", "y", V_EQ)
+    && aux_test("-0xfa.", "-250", "", V_EQ)
+    // Exponent.
+    && aux_test("0x1e2", "482", "", V_EQ)
+    && aux_test("0x1*^2", "256", "", V_EQ)
+    && aux_test("0x1*^2-1", "256", "-1", V_EQ)
+    // Fraction and exponent.
+    && aux_test("0x0.1*^3", "256", "", V_EQ)
+    && aux_test("-0x29382a093589c501594f729e672567.2f09f342582b4598*^-2",
+		"-493504168323155221903720496056512238754896365637429427/590295810358705651712",
+		"", V_EQ)
+    && aux_test("-0x29382a093589c501594f729e672567.2f09f342582b4598*^-20",
+		"-493504168323155221903720496056512238754896365637429427/2787593149816327892691964784081045188247552",
+		"", V_EQ)
+    && aux_test("-0x29382a093589c501594f729e672567.2f09f342582b4598*^-20b",
+		"-493504168323155221903720496056512238754896365637429427/2787593149816327892691964784081045188247552",
+		"b", V_EQ)
+    && aux_test("0x0.1*^3   -0", "256", "   -0", V_EQ);
+}
+
+// Testing bases.
+bool
+test09() {
+  return aux_test("3^^", "nan", "", V_CVT_STR_UNK)
+    && aux_test("3^^z", "nan", "z", V_CVT_STR_UNK)
+    && aux_test("^^3", "nan", "^^3", V_CVT_STR_UNK)
+    && aux_test("3^^1", "1", "", V_EQ)
+    && aux_test("2^^0", "0", "", V_EQ)
+    && aux_test("2^^1", "1", "", V_EQ)
+    && aux_test("2^^10", "2", "", V_EQ)
+    && aux_test("2^^11", "3", "", V_EQ)
+    && aux_test("36^^z", "35", "", V_EQ)
+    && aux_test("36^^yz", "1259", "", V_EQ)
+    && aux_test("36^^xyz", "44027", "", V_EQ)
+    && aux_test("37^^2", "nan", "^2", V_CVT_STR_UNK)
+    && aux_test("37^^1.1", "nan", "^1.1", V_CVT_STR_UNK)
+    && aux_test("2^^113", "3", "3", V_EQ)
+    && aux_test("2^^11 3", "3", " 3", V_EQ)
+    && aux_test("3^^e2", "nan", "e2", V_CVT_STR_UNK);
+}
+
+// Testing bases with fractions and exponents.
+bool
+test10() {
+  return
+  // Fraction.
+    aux_test("2^^11.1", "7/2", "", V_EQ)
+    && aux_test("2^^11.1a", "7/2", "a", V_EQ)
+    && aux_test("2^^11.1.", "7/2", ".", V_EQ)
+    && aux_test("2^^11.1   ", "7/2", "   ", V_EQ)
+    // Exponent.
+    && aux_test("10^^2e3", "2000", "", V_EQ)
+    && aux_test("8^^2e3", "1024", "", V_EQ)
+    && aux_test("8^^2e38", "41538374868278621028243970633760768", "", V_EQ)
+    && aux_test("8^^2e3e", "1024", "e", V_EQ)
+    // Fraction and exponent.
+    && aux_test("8^^2.1e3", "1088", "", V_EQ)
+    && aux_test("8^^20402543.120347e7", "9073863231288", "", V_EQ)
+    && aux_test("8^^2.18e3", "17/8", "8e3", V_EQ);
+}
+
+// Testing denominators.
+bool
+test11() {
+  return aux_test("15/0", "nan", "", VC_NAN)
+    && aux_test("15/1", "15", "", V_EQ)
+    && aux_test("15/3", "5", "", V_EQ)
+    && aux_test("15/-3", "-5", "", V_EQ)
+    && aux_test("15/3f", "5", "f", V_EQ);
+}
+
+// Testing denominators with fractions and exponents.
+bool
+test12() {
+  return
+    // Fraction.
+    aux_test("27.9/3.1", "9", "", V_EQ)
+    && aux_test("27.9/3.1=9", "9", "=9", V_EQ)
+    // Exponent.
+    && aux_test("15/30e-1", "5", "", V_EQ)
+    && aux_test("27e3/30e-1", "9000", "", V_EQ)
+    && aux_test("15*^-3/29e2", "3/580000", "", V_EQ)
+    && aux_test("15/30e-1,2", "5", ",2", V_EQ)
+    && aux_test("15/30e-1.2", "5", ".2", V_EQ)
+    // Exponent and fraction.
+    && aux_test("27.9e3/30e-1", "9300", "", V_EQ)
+    && aux_test("27.9e3/30e-1/2", "9300", "/2", V_EQ)
+    && aux_test("27.9e3/30e-1^^", "9300", "^^", V_EQ);
+}
+
+// Testing denominators with hexadecimals and bases.
+bool
+test13() {
+  return
+    // Hexadecimal.
+    aux_test("0xf/0x3", "5", "", V_EQ)
+    && aux_test("3048227.23429e3/0x230abc43",
+		"304822723429/58790611500", "", V_EQ)
+    && aux_test("0xf/0x3g", "5", "g", V_EQ)
+    // Base.
+    && aux_test("16^^f/4^^3.0e0*^3", "5", "*^3", V_EQ);
+}
+
+// LARGE_NUM has 14057 digits.
+#define LARGE_NUM "29382093589501594796725672938209358950159472967256372938209358950159472967256729382093589501594729672567293820935899501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938 [...]
+
+// Testing a very large number.
+bool
+test14() {
+  return aux_test(LARGE_NUM, LARGE_NUM, "", V_EQ);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test03);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Polyhedron/onepoint.cc b/tests/Polyhedron/onepoint.cc
new file mode 100644
index 0000000..a16680b
--- /dev/null
+++ b/tests/Polyhedron/onepoint.cc
@@ -0,0 +1,56 @@
+/* Creation of a one-point polyhedron.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  ph.add_generator(point(-1000*x - 9*y, 16));
+
+  print_generators(ph, "*** generators ***");
+  print_constraints(ph, "*** constraints ***");
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(2*x == -125);
+  known_result.add_constraint(16*y == -9);
+  known_result.add_constraint(z == 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/permute.cc b/tests/Polyhedron/permute.cc
new file mode 100644
index 0000000..c593207
--- /dev/null
+++ b/tests/Polyhedron/permute.cc
@@ -0,0 +1,221 @@
+/* An example of iteration to a post-fixpoint.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+shift_rename_add(const C_Polyhedron& p,
+		 dimension_type offset,
+		 C_Polyhedron& q) {
+  C_Polyhedron r(offset);
+  r.concatenate_assign(p);
+  q.intersection_assign(r);
+}
+
+void
+append_init(C_Polyhedron& base, C_Polyhedron& induct, C_Polyhedron& expect,
+            dimension_type& offset, unsigned int& arity) {
+  offset = 3;
+  arity = 3;
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  // This is the base case:
+  // append(A,B,C) :- A = [], B = C.
+  base.add_space_dimensions_and_embed(3);
+  base.add_constraint(A == 0);
+  base.add_constraint(B >= 0);
+  base.add_constraint(C == B);
+
+  print_constraints(base, "*** base ***");
+
+  // This is the inductive case:
+  // append(A,B,C) :- A = [X|D], B = E, C = [X|F], append(D,E,F).
+  induct.add_space_dimensions_and_embed(6);
+  induct.add_constraint(A + F == C + D);
+  induct.add_constraint(B == E);
+  induct.add_constraint(C + D >= A);
+  induct.add_constraint(D >= 0);
+  induct.add_constraint(B >= 0);
+  induct.add_constraint(A >= D + 1);
+
+  print_constraints(induct, "*** inductive ***");
+
+  expect.add_space_dimensions_and_embed(3);
+  expect.add_constraint(A + B == C);
+  expect.add_constraint(B >= 0);
+  expect.add_constraint(C >= B);
+}
+
+void
+fix_point(C_Polyhedron& start, C_Polyhedron& induct, C_Polyhedron& finish,
+          dimension_type offset, unsigned int arity) {
+  // Initialize the fixpoint iteration.
+  C_Polyhedron current = start;
+
+  print_constraints(current, "*** start ***");
+
+  // Contains the polyhedron computed at the previous iteration.
+  C_Polyhedron previous;
+  do {
+    previous = current;
+    current = induct;
+    shift_rename_add(previous, offset, current);
+
+    print_constraints(current, "*** after shift_rename_add ***");
+
+    Variables_Set dimensions_to_remove;
+    dimension_type current_dim;
+    current_dim = current.space_dimension();
+    for (dimension_type i = current_dim-1 ; i >= arity; --i )
+      dimensions_to_remove.insert(Variable(i));
+    current.remove_space_dimensions(dimensions_to_remove);
+
+    print_constraints(current, "*** after remove_space_dimensions ***");
+
+    current.poly_hull_assign_and_minimize(previous);
+
+    print_constraints(current, "*** after poly_hull_assign_and_minimize***");
+
+    current.H79_widening_assign(previous);
+
+    print_constraints(current, "*** after H79_widening_assign ***");
+
+  } while (current != previous);
+  finish = current;
+}
+
+void
+append_size_rel(C_Polyhedron& ph) {
+  C_Polyhedron start;
+  C_Polyhedron induct;
+  C_Polyhedron expect;
+  dimension_type recursive_offset;
+  unsigned int arity;
+  append_init(start, induct, expect, recursive_offset, arity);
+  fix_point(start, induct, ph, recursive_offset, arity);
+}
+
+void
+permute_init(C_Polyhedron& base, C_Polyhedron& induct, C_Polyhedron& expect,
+             C_Polyhedron& ph_append,
+             dimension_type& offset, unsigned int& arity) {
+  arity = 2;
+  offset = 10;
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+  Variable J(9);
+  Variable K(10);
+  Variable L(11);
+
+  // This is the base case:
+  // permute(A,B) :- A = [], B = [].
+  base.add_space_dimensions_and_embed(2);
+  base.add_constraint(A == 0);
+  base.add_constraint(B == 0);
+
+  print_constraints(base, "*** base ***");
+
+  // This is the inductive case:
+  // permute(A,B) :- B = [X|C],
+  //                 E = [X|G], F = A, append(D,E,F),
+  //                 D = H, I = G, append(H,I,J),
+  //                 K = J, L = C, permute(K,L).
+  induct.add_space_dimensions_and_embed(6);
+  induct.add_constraint(B == C + 1);
+  induct.add_constraint(F == A);
+  shift_rename_add(ph_append, 3, induct);
+  induct.add_space_dimensions_and_embed(4);
+  induct.add_constraint(E == G + 1);
+  shift_rename_add(ph_append, 7, induct);
+  induct.add_space_dimensions_and_embed(2);
+  induct.add_constraint(D + G == H + I);
+  induct.add_constraint(D == H);
+  induct.add_constraint(I == G);
+  induct.add_constraint(K == J);
+  induct.add_constraint(L == C);
+  induct.add_constraint(A >= 0);
+  induct.add_constraint(C >= 0);
+
+  print_constraints(induct, "*** inductive ***");
+
+  expect.add_space_dimensions_and_embed(2);
+  expect.add_constraint(A == B);
+  expect.add_constraint(A >= 0);
+  expect.add_constraint(B >= 0);
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  C_Polyhedron start;
+  C_Polyhedron induct;
+  C_Polyhedron expect;
+  dimension_type recursive_offset;
+  unsigned int arity;
+  C_Polyhedron ph_append;
+  append_size_rel(ph_append);
+  permute_init(start, induct, expect, ph_append, recursive_offset, arity);
+  C_Polyhedron final;
+  fix_point(start, induct, final, recursive_offset, arity);
+
+  print_constraints(expect, "*** expected ***");
+
+  C_Polyhedron final1;
+  final1 = induct;
+  shift_rename_add(final, recursive_offset, final1);
+
+  print_constraints(final1, "*** after shift_rename_add ***");
+
+  C_Polyhedron final2;
+  final2 = final1;
+  Variable A(0);
+  Variable B(1);
+  Variable K(10);
+  Variable L(11);
+  final2.add_constraint(B - L >= 1);
+  final2.add_constraint(A - K >= 1);
+
+  if (final2 == final1)
+    print_constraints(final2, "*** termination condition satisfied ***");
+  else
+    print_constraints(final2, "*** termination condition not satisfied ***");
+
+  return final2 == final1 ? 0 : 1;
+}
+CATCH
diff --git a/tests/Polyhedron/polydifference1.cc b/tests/Polyhedron/polydifference1.cc
new file mode 100644
index 0000000..86034ac
--- /dev/null
+++ b/tests/Polyhedron/polydifference1.cc
@@ -0,0 +1,276 @@
+/* Test Polyhedron::poly_difference_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(point(0*x + 0*y));
+  gs1.insert(point(4*x + 0*y));
+  gs1.insert(point(2*x + 2*y));
+
+  C_Polyhedron ph1(gs1);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  Generator_System gs2;
+  gs2.insert(point(0*x + 3*y));
+  gs2.insert(point(4*x + 3*y));
+  gs2.insert(point(2*x + 1*y));
+
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result = ph1;
+
+  computed_result.poly_difference_assign(ph2);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point());
+  gs_known_result.insert(point(3*x + 3*y, 2));
+  gs_known_result.insert(point(4*x));
+  gs_known_result.insert(point(5*x + 3*y, 2));
+
+  C_Polyhedron known_result(gs_known_result);
+
+  C_Polyhedron ph3(2);
+  ph3.add_constraint(2*y >= 3);
+
+  known_result.poly_difference_assign(ph3);
+
+  bool ok = (computed_result == known_result);
+
+  print_generators(computed_result, "*** After poly_difference_assign ***");
+  print_generators(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(-4) >= 0);
+  C_Polyhedron known_result(cs);
+
+  ph1.poly_difference_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.poly_difference_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(B == 0);
+
+  C_Polyhedron ph2(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  ph1.poly_difference_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.poly_difference_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 7);
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(A == 5);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.poly_difference_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+		    "**After ph1.poly_difference_assign(ph2)**");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A == B);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.poly_difference_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.poly_difference_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A + B == 0);
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.poly_difference_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.poly_difference_assign(ph2) ***");
+
+  return ok;
+}
+
+// Creating a rectangle.
+C_Polyhedron
+aux_test07(int lx, int ly, int dx, int dy) {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point((lx+0*dx)*x + (ly+0*dy)*y));
+  ph.add_generator(point((lx+1*dx)*x + (ly+0*dy)*y));
+  ph.add_generator(point((lx+1*dx)*x + (ly+1*dy)*y));
+  ph.add_generator(point((lx+0*dx)*x + (ly+1*dy)*y));
+  return ph;
+}
+
+bool
+test07() {
+  Polyhedra_Powerset<C_Polyhedron> cross(2, EMPTY);
+  cross.add_disjunct(aux_test07(0, 3, 9, 3));
+  cross.add_disjunct(aux_test07(3, 0, 3, 9));
+
+  using namespace IO_Operators;
+  nout << "cross = " << cross << endl;
+
+  Polyhedra_Powerset<C_Polyhedron> squares(2, EMPTY);
+  squares.add_disjunct(aux_test07(1, 4, 1, 1));
+  squares.add_disjunct(aux_test07(4, 4, 1, 1));
+  squares.add_disjunct(aux_test07(7, 4, 1, 1));
+  squares.add_disjunct(aux_test07(4, 1, 1, 1));
+  squares.add_disjunct(aux_test07(4, 7, 1, 1));
+
+  nout << "squares = " << squares << endl;
+
+  Polyhedra_Powerset<C_Polyhedron> difference = cross;
+  difference.poly_difference_assign(squares);
+
+  nout << "cross - squares = " << difference << endl;
+
+  Polyhedra_Powerset<C_Polyhedron> intersection = difference;
+  intersection.meet_assign(squares);
+
+  nout << "(cross - squares) inters squares = " << intersection << endl;
+
+  // When using Polyhedra_Powerset<NNC_Polyhedron>, intersection will be
+  // empty.  When using Polyhedra_Powerset<C_Polyhedron>,
+  // intersection will consist of objects of affine dimension at most 1.
+  bool ok1 = true;
+  for (Polyhedra_Powerset<C_Polyhedron>::const_iterator
+	 i = intersection.begin(), in_end = intersection.end();
+       i != in_end; ++i)
+    if (i->element().affine_dimension() > 1) {
+      nout << "intersection contains " << i->element() << "," << endl
+	   << "which is of affine dimension greater than 1" << endl;
+      ok1 = false;
+    }
+
+  Polyhedra_Powerset<C_Polyhedron> re_union = difference;
+  re_union.upper_bound_assign(squares);
+
+  nout << "(cross - squares) union squares = " << re_union << endl;
+  re_union.pairwise_reduce();
+  nout << "<Above union pairwise reduced>  = " << re_union << endl;
+
+  bool ok2 = re_union.geometrically_equals(cross);
+
+  if (!ok2)
+    nout << "Union does not give back the original!" << endl;
+
+  return ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST_F8(test07);
+END_MAIN
diff --git a/tests/Polyhedron/polydifference2.cc b/tests/Polyhedron/polydifference2.cc
new file mode 100644
index 0000000..98979bd
--- /dev/null
+++ b/tests/Polyhedron/polydifference2.cc
@@ -0,0 +1,150 @@
+/* Test Polyhedron::poly_difference_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(point(0*x + 0*y));
+  gs1.insert(point(0*x + 3*y));
+  gs1.insert(point(3*x + 0*y));
+  gs1.insert(point(3*x + 3*y));
+
+  NNC_Polyhedron ph1(gs1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(1*x + 0*y == 0);
+
+  NNC_Polyhedron ph2(cs2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron computed_result = ph1;
+
+  computed_result.poly_difference_assign(ph2);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(closure_point(0*x + 0*y));
+  gs_known_result.insert(closure_point(0*x + 3*y));
+  gs_known_result.insert(point(3*x + 0*y));
+  gs_known_result.insert(point(3*x + 3*y));
+
+  NNC_Polyhedron known_result(gs_known_result);
+
+  bool ok = (computed_result == known_result);
+
+  print_generators(computed_result, "*** After poly_difference_assign ***");
+  print_generators(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A > 2);
+  ph2.add_constraint(B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.poly_difference_assign(ph2);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.poly_difference_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(y >= 0);
+  cs1.insert(x <= 4);
+  cs1.insert(x - 2*y <= 2);
+
+  C_Polyhedron ph1(cs1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x >= 0);
+  cs2.insert(y >= 0);
+  cs2.insert(x <= 4);
+  cs2.insert(y <= 5);
+  cs2.insert(x - 2*y <= 2);
+  cs2.insert(x + y <= 7);
+
+  C_Polyhedron ph2(cs2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result = ph1;
+  computed_result.poly_difference_assign(ph2);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point(0*x + 5*y));
+  gs_known_result.insert(point(4*x + 3*y));
+  gs_known_result.insert(ray(0*x + 1*y));
+
+  C_Polyhedron known_result(gs_known_result);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(computed_result, "*** After poly_difference_assign ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/polyhull1.cc b/tests/Polyhedron/polyhull1.cc
new file mode 100644
index 0000000..9576c94
--- /dev/null
+++ b/tests/Polyhedron/polyhull1.cc
@@ -0,0 +1,404 @@
+/* Test Polyhedron::poly_hull_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(x));
+  gs1.insert(ray(y));
+
+  C_Polyhedron ph1(gs1);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  Generator_System gs2;
+  gs2.insert(point(-x + y));
+  gs2.insert(point(x + y));
+  gs2.insert(point(3*x));
+
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result = ph1;
+
+  computed_result.poly_hull_assign(ph2);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point());
+  gs_known_result.insert(point(-x + y));
+  gs_known_result.insert(ray(x));
+  gs_known_result.insert(ray(y));
+
+  C_Polyhedron known_result(gs_known_result);
+
+  print_generators(computed_result, "*** ph1.poly_hull_assign(ph2) ***");
+
+  return (computed_result == known_result);
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(x + y));
+  C_Polyhedron ph2(gs);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result1(ph1);
+
+  computed_result1.poly_hull_assign_and_minimize(ph2);
+
+  C_Polyhedron computed_result2(ph1);
+  computed_result2.poly_hull_assign(ph2);
+
+  C_Polyhedron known_result(ph2);
+
+  bool ok = (computed_result1 == known_result
+	     && computed_result2 == known_result);
+
+  print_generators(computed_result1,
+		   "*** After poly_hull_assign_and_minimize ***");
+  print_generators(computed_result2, "*** After poly_hull_assign ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(x <= 2);
+  ph1.add_constraint(y <= 2);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(y >= 2);
+  ph2.add_constraint(y <= 4);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(x <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.poly_hull_assign(ph2);
+
+  print_generators(ph1, "*** After poly_hull_assign ***");
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(point(2*x));
+  known_result.add_generator(point(4*y));
+  known_result.add_generator(point(2*x + 4*y));
+
+  bool ok = (ph1 == known_result);
+
+  return ok;
+}
+
+bool
+aux_test04(C_Polyhedron& ph1, const C_Polyhedron& ph2,
+	   // Note intentional call-by-value!
+	   C_Polyhedron known_result) {
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.poly_hull_assign_and_minimize(ph2);
+
+  print_generators(ph1, "*** After poly_hull_assign ***");
+
+  return ph1 == known_result;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1_1(2);
+  ph1_1.add_constraint(x >= 0);
+  ph1_1.add_constraint(y >= 0);
+  ph1_1.add_constraint(x <= 2);
+  ph1_1.add_constraint(y <= 2);
+  C_Polyhedron ph1_2(ph1_1);
+
+  C_Polyhedron ph2_1(2);
+  ph2_1.add_constraint(x+y <= 0);
+  ph2_1.add_constraint(x+y >= 2);
+  C_Polyhedron ph2_2(ph2_1);
+  C_Polyhedron ph2_3(ph2_1);
+  C_Polyhedron ph2_4(ph2_1);
+
+  bool ok = aux_test04(ph1_1, ph2_1, ph1_1)
+    && aux_test04(ph2_2, ph1_2, ph1_2)
+    && aux_test04(ph2_3, ph2_4, ph2_3);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point(A));
+  ph1.add_generator(ray(A));
+  ph1.add_generator(ray(B));
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.poly_hull_assign_and_minimize(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1,
+		   "*** After ph1.poly_hull_assign_and_minimize(ph2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2;
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.poly_hull_assign_and_minimize(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1,
+		   "*** After ph1.poly_hull_assign_and_minimize(ph2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(point(B));
+  C_Polyhedron ph1(gs1);
+  ph1.generators();
+  ph1.constraints();
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(B));
+  C_Polyhedron ph2(gs2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.poly_hull_assign_and_minimize(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1,
+		   "*** After ph1.poly_hull_assugn_and_minimize(ph2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A - B >= 0);
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.poly_hull_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.poly_hull_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.poly_hull_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.poly_hull_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.generators();
+  ph1.add_constraint(A == B);
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2);
+  ph2.generators();
+  ph2.add_constraint(A >= B + 1);
+  C_Polyhedron copy_ph2 = ph2;
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.poly_hull_assign(ph2);
+  copy_ph1.poly_hull_assign(copy_ph2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_generators(ph1, "*** After poly_hull_assign ***");
+  print_generators(copy_ph1,
+		    "*** After poly_hull_assign_and_minimize ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(line(A + B));
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point());
+  ph2.constraints();
+  ph2.add_generator(ray(A));
+  ph2.add_generator(ray(B));
+
+  C_Polyhedron copy_ph2 = ph2;
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.poly_hull_assign(ph2);
+  copy_ph1.poly_hull_assign(copy_ph2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_generators(ph1, "*** After poly_hull_assign ***");
+  print_generators(copy_ph1,
+		    "*** After poly_hull_assign_and_minimize ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  // Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron p(3);
+  p.add_constraint(B >= 0);
+  p.add_constraint(C >= 0);
+
+  C_Polyhedron q(3);
+  q.add_constraint(C >= 0);
+
+  print_constraints(p, "*** p ***");
+  print_constraints(q, "*** q ***");
+
+  p.poly_hull_assign_and_minimize(q);
+
+  bool ok = (p == q);
+
+  print_constraints(p, "*** p.poly_hull_assign_and_minimize(q) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/polyhull2.cc b/tests/Polyhedron/polyhull2.cc
new file mode 100644
index 0000000..9010abe
--- /dev/null
+++ b/tests/Polyhedron/polyhull2.cc
@@ -0,0 +1,58 @@
+/* Test Polyhedron::poly_hull_assign_and_minimize().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable i(0);
+  Variable j(1);
+
+  NNC_Polyhedron p1(2);
+  p1.add_constraint(j == 0);
+  p1.add_constraint(i >= 0);
+  p1.add_constraint(j-i == 2);
+
+  NNC_Polyhedron p2(2);
+  p2.add_constraint(j == 0);
+  p2.add_constraint(-i > 0);
+  p2.add_constraint(j-i == 0);
+
+  print_constraints(p1, "*** p1 ***");
+  print_constraints(p2, "*** p2 ***");
+
+  p1.poly_hull_assign_and_minimize(p2);
+
+  bool ok = p1.is_empty();
+
+  print_constraints(p1, "*** p1.poly_hull_assign_and_minimize(p2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/polypowerset1.cc b/tests/Polyhedron/polypowerset1.cc
new file mode 100644
index 0000000..6f4ca8a
--- /dev/null
+++ b/tests/Polyhedron/polypowerset1.cc
@@ -0,0 +1,382 @@
+/* Test Polyhedra_Powerset<PH>.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Constraint_System cs = Constraint_System::zero_dim_empty();
+  Polyhedra_Powerset<C_Polyhedron> ps(cs);
+  return ps.OK();
+}
+
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Polyhedra_Powerset<NNC_Polyhedron> nnc_ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  nnc_ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x < 1);
+  nnc_ps.add_disjunct(NNC_Polyhedron(cs));
+
+  Polyhedra_Powerset<C_Polyhedron> c_ps(nnc_ps);
+
+  return c_ps.OK();
+}
+
+bool
+test03() {
+  Variable x(0);
+  Constraint_System cs;
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  c_ps.add_constraint(x == 1);
+
+  Polyhedra_Powerset<NNC_Polyhedron> nnc_ps(c_ps);
+
+  return nnc_ps.OK();
+}
+
+bool
+test04() {
+  Variable x(0);
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  c_ps.concatenate_assign(c_ps);
+
+  return c_ps.OK();
+}
+
+bool
+test05() {
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+
+  bool ok = c_ps.is_bottom();
+
+  c_ps.add_disjunct(C_Polyhedron(1, UNIVERSE));
+
+  bool ok1 = c_ps.is_top();
+
+  c_ps.total_memory_in_bytes();
+  c_ps.external_memory_in_bytes();
+
+  return ok && ok1;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Polyhedra_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  c_ps1.add_disjunct(C_Polyhedron(cs1));
+
+  bool ok = c_ps1.definitely_entails(c_ps);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = (c_ps.size() == 2);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+  c_ps.omega_reduce();
+
+  bool ok = (c_ps.size() == 1);
+
+  return ok;
+}
+
+bool
+test09() {
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  bool ok = (c_ps.space_dimension() == 1);
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  Constraint_System cs1 = cs;
+  c_ps.add_disjunct(C_Polyhedron(cs));
+  c_ps.drop_disjunct(c_ps.begin());
+
+  bool ok = c_ps.empty();
+
+  Constraint_System cs2 = cs1;
+  c_ps.add_disjunct(C_Polyhedron(cs1));
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+  c_ps.drop_disjuncts(c_ps.begin(), c_ps.end());
+
+  bool ok1 = c_ps.empty();
+
+  return ok && ok1;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Polyhedra_Powerset<C_Polyhedron> c_ps1;
+  c_ps1 = c_ps;
+
+  bool ok = !c_ps.empty();
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Polyhedra_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+  c_ps.swap(c_ps1);
+
+  bool ok = (c_ps.empty() && !c_ps1.empty());
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  Polyhedra_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+  c_ps.least_upper_bound_assign(c_ps1);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+
+  Polyhedra_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
+  c_ps2.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps2);
+  bool ok1 = !c_ps2.definitely_entails(c_ps);
+
+  return ok && ok1;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  Polyhedra_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+  c_ps.upper_bound_assign(c_ps1);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+
+  Polyhedra_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
+  c_ps2.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps2);
+  bool ok1 = !c_ps2.definitely_entails(c_ps);
+
+  return ok && ok1;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Polyhedra_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  c_ps.meet_assign(c_ps1);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 2);
+  Polyhedra_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+  c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps_expected);
+  bool ok1 = !c_ps_expected.definitely_entails(c_ps);
+
+  return ok && ok1;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  c_ps.collapse();
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  Polyhedra_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+  c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps_expected);
+  bool ok1 = c_ps_expected.definitely_entails(c_ps);
+  bool ok2 = (c_ps.size() == 1);
+
+  return ok && ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Polyhedron/powerset1.cc b/tests/Polyhedron/powerset1.cc
new file mode 100644
index 0000000..43ebc31
--- /dev/null
+++ b/tests/Polyhedron/powerset1.cc
@@ -0,0 +1,249 @@
+/* Test Powerset<CS>.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <algorithm>
+#include <set>
+
+namespace {
+
+class Fcaibvp;
+
+bool operator==(const Fcaibvp& x, const Fcaibvp& y);
+bool operator!=(const Fcaibvp& x, const Fcaibvp& y);
+
+std::ostream& operator<<(std::ostream& s, const Fcaibvp& x);
+
+// A class for representing Finite Conjunctions of Attribute
+// Independent Boolean Variable Properties.
+class Fcaibvp {
+private:
+  typedef Variable::Compare Compare;
+  typedef std::set<Variable, Compare> Set;
+
+  Set set;
+
+public:
+  Fcaibvp()
+    : set() {
+  }
+
+  explicit Fcaibvp(const Variable& x)
+    : set() {
+    set.insert(x);
+  }
+
+  memory_size_type total_memory_in_bytes() const {
+    return 1;
+  }
+
+  bool is_top() const {
+    return set.empty();
+  }
+
+  bool is_bottom() const {
+    return false;
+  }
+
+  bool definitely_entails(const Fcaibvp& y) const{
+    const Fcaibvp& x = *this;
+    return std::includes(x.set.begin(), x.set.end(),
+			 y.set.begin(), y.set.end(),
+			 Compare());
+  }
+
+  void upper_bound_assign(const Fcaibvp& y) {
+    set.insert(y.set.begin(), y.set.end());
+  }
+
+  void meet_assign(const Fcaibvp& y) {
+    Fcaibvp& x = *this;
+    Fcaibvp z;
+    std::set_intersection(x.set.begin(), x.set.end(),
+			  y.set.begin(), y.set.end(),
+			  std::inserter(z.set, z.set.begin()),
+			  Compare());
+    std::swap(x, z);
+  }
+
+  bool OK() const {
+    return true;
+  }
+
+  friend std::ostream& operator<<(std::ostream& s, const Fcaibvp& x);
+};
+
+std::ostream&
+operator<<(std::ostream& s, const Fcaibvp& x) {
+  s << "{";
+  for (Fcaibvp::Set::const_iterator i = x.set.begin(),
+	 x_end = x.set.end(); i != x_end; ++i) {
+    const Variable& v = *i;
+#if 0 // Old compilers may not understand the following.
+    using IO_Operators::operator<<;
+    s << v;
+#else
+    Parma_Polyhedra_Library::IO_Operators::operator<<(s, v);
+#endif
+    if (i != x_end)
+      s << ", ";
+  }
+  s << "}";
+  return s;
+}
+
+bool
+operator==(const Fcaibvp& x, const Fcaibvp& y) {
+  return x.definitely_entails(y) && y.definitely_entails(x);
+}
+
+bool
+operator!=(const Fcaibvp& x, const Fcaibvp& y) {
+  return !(x == y);
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  // Use every public Powerset method.
+
+  typedef Powerset<Fcaibvp> PS;
+
+  Variable A(0);
+
+  PS ps1;
+  ps1.add_disjunct(Fcaibvp(A));
+
+  PS ps2 = ps1;
+
+  if (ps2 != ps1 || !(ps2 == ps1))
+    exit(1);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "ps1:" << std::endl << ps1 << std::endl;
+
+  Fcaibvp d(A);
+  PS ps3(d);
+
+  if (!ps1.definitely_entails(ps3))
+    exit(1);
+
+  if (ps3.is_top())
+    exit(1);
+
+  if (ps1.is_bottom())
+    exit(1);
+
+  nout << "Total memory: " << ps3.total_memory_in_bytes() << std::endl
+       << "External memory: " << ps3.external_memory_in_bytes() << std::endl;
+
+  ps3.omega_reduce();
+
+  if (ps3.size() == 0)
+    exit(1);
+
+  if (ps3.empty())
+    exit(1);
+
+  // Iterator.
+  dimension_type count = 0;
+  for (PS::iterator i = ps3.begin(); i != ps3.end(); ++i)
+    ++count;
+  if (count != 1)
+    exit(1);
+
+  // Constant iterator.
+  count = 0;
+  for (PS::const_iterator i = ps3.begin(); i != ps3.end(); ++i)
+    ++count;
+  if (count != 1)
+    exit(1);
+
+  // Reverse iterator.
+  count = 0;
+  for (PS::reverse_iterator i = ps3.rbegin(); i != ps3.rend(); ++i)
+    ++count;
+  if (count != 1)
+    exit(1);
+
+  // Constant reverse iterator.
+  count = 0;
+  for (PS::const_reverse_iterator i = ps3.rbegin(),
+	 ps3_rend = ps3.rend(); i != ps3_rend; ++i)
+    ++count;
+  if (count != 1)
+    exit(1);
+
+  // Omega iterator typedef.
+  count = 0;
+  for (PS::omega_iterator i = ps3.begin(); i != ps3.end(); ++i)
+    ++count;
+  if (count != 1)
+    exit(1);
+
+  ps2 = ps3;
+  PS ps_empty;
+  ps2.drop_disjunct(ps2.begin());
+  if (ps2 != ps_empty)
+    exit(1);
+
+  ps2 = ps3;
+  ps2.drop_disjuncts(ps2.begin(),ps2.end());
+  if (ps2 != ps_empty)
+    exit(1);
+
+  ps2 = ps3;
+  ps2.clear();
+  if (ps2 != ps_empty)
+    exit(1);
+
+  ps3.swap(ps2);
+  ps3.swap(ps2);
+  if (ps3 != ps1 || ps2 != ps_empty)
+    exit(1);
+
+  ps2 = ps_empty;
+  ps2.least_upper_bound_assign(ps3);
+  if (ps2 != ps3)
+    exit(1);
+
+  ps2 = ps_empty;
+  ps2.upper_bound_assign(ps3);
+  if (ps2 != ps3)
+    exit(1);
+
+  Variable B(1);
+  ps2 = ps1;
+  ps2.meet_assign(ps3);
+  if (ps2 != ps3)
+    exit(1);
+
+  ps3.collapse();
+  if (ps3.size() != 1)
+    exit(1);
+
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/randphull1.cc b/tests/Polyhedron/randphull1.cc
new file mode 100644
index 0000000..31b8416
--- /dev/null
+++ b/tests/Polyhedron/randphull1.cc
@@ -0,0 +1,68 @@
+/* Compute poly-hulls of random polytopes.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+int
+count_points(const C_Polyhedron& ph) {
+  if (ph.is_empty() || ph.space_dimension() == 0)
+    return 0;
+
+  int count = 0;
+  const Generator_System& gs = ph.generators();
+  for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
+       i != gs_end;
+       ++i)
+    if (i->type() == Generator::POINT)
+      ++count;
+  return count;
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  // Set up a random numbers' generator.
+  gmp_randclass rg(gmp_randinit_default);
+
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  const int maxc = 10000;
+  C_Polyhedron ph(3, EMPTY);
+  nout << count_points(ph) << endl;
+  for (int n = 1; n <= 200; ++n) {
+    const Coefficient cx = mpz_class(rg.get_z_range(maxc));
+    const Coefficient cy = mpz_class(rg.get_z_range(maxc));
+    const Coefficient cz = mpz_class(rg.get_z_range(maxc));
+    ph.add_generator(point(cx*x + cy*y + cz*z));
+    nout << count_points(ph) << endl;
+  }
+
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/randphull2.cc b/tests/Polyhedron/randphull2.cc
new file mode 100644
index 0000000..b41809d
--- /dev/null
+++ b/tests/Polyhedron/randphull2.cc
@@ -0,0 +1,131 @@
+/* Compute random polytopes by generating points on the surface
+   of an n-dimensional sphere.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <vector>
+#include <cmath>
+
+using std::vector;
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+#ifndef M_PI
+# define M_PI           3.14159265358979323846  /* pi */
+#endif
+
+// Please note: the following function picks up random point on the
+// n-dimensional sphere, but they are not uniformly distributed.
+// See the following paper on how to obtain a uniform distribution:
+
+// J. S. Hicks, R. F. Wheeling.
+// An efficient method for generating uniformly distributed points
+// on the surface of an n-dimensional sphere,
+// Communications of the ACM, Volume 2, Issue 4, pp. 17-19, April 1959.
+//
+// M. E. Muller.
+// A note on a method for generating points uniformly on n-dimensional spheres,
+// Communications of the ACM, Volume 2 Issue 4, pp. 19-20, April 1959.
+//
+// G. F. Schrack.
+// Remark on algorithm 381 [G5],
+// Communications of the ACM, Volume 15 Issue 6, p. 468, June 1972.
+
+namespace {
+
+void
+point_on_the_unit_n_sphere(unsigned n,
+			   const vector<float>& theta,
+			   vector<float>& coordinate) {
+  assert(n >= 2);
+  if (n == 2) {
+    coordinate[0] *= sin(theta[0]);
+    coordinate[1] *= cos(theta[0]);
+  }
+  else {
+    point_on_the_unit_n_sphere(n-1, theta, coordinate);
+    float sin_theta_n_2 = sin(theta[n-2]);
+    for (unsigned i = n-1; i-- > 0; )
+      coordinate[i] *= sin_theta_n_2;
+    coordinate[n-1] *= cos(theta[n-2]);
+  }
+}
+
+void
+random_polytope(C_Polyhedron& ph, unsigned dimension, unsigned num_points,
+		float radius = 1.0) {
+  if (dimension < 2)
+    abort();
+
+  vector<float> theta(dimension-1);
+  vector<float> coordinate(dimension);
+
+  for (unsigned n = num_points; n > 0; --n) {
+    // Compute n-1 random angles.
+    for (unsigned i = dimension-1; i-- > 0; )
+      theta[i] = 2.0*M_PI*static_cast<double>(rand())/RAND_MAX;
+    // Compute float coordinates.
+    for (unsigned i = dimension; i-- > 0; )
+      coordinate[i] = radius;
+    point_on_the_unit_n_sphere(dimension, theta, coordinate);
+
+    Linear_Expression le;
+    for (unsigned i = dimension; i-- > 0; )
+      le += Variable(i)*Coefficient(coordinate[i]*1000000.0);
+    ph.add_generator(point(le));
+  }
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  for (int dimension = 2; dimension <= 6; ++dimension) {
+    C_Polyhedron ph(dimension, EMPTY);
+    random_polytope(ph, dimension, dimension*dimension);
+    const Constraint_System& cs = ph.constraints();
+    unsigned num_constraints = 0;
+    for (Constraint_System::const_iterator i = cs.begin(), cs_end = cs.end();
+	 i != cs_end;
+	 ++i)
+      ++num_constraints;
+    const Generator_System& gs = ph.generators();
+    unsigned num_points = 0;
+    for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
+	 i != gs_end;
+	 ++i) {
+      if (i->type() != Generator::POINT) {
+	nout << "i->type() == " << i->type() << endl;
+	exit(1);
+      }
+      ++num_points;
+    }
+
+    nout << "dimension = " << dimension
+	 << ", points = " << num_points << " (" << dimension*dimension << ")"
+	 << ", constraints = " << num_constraints << endl;
+  }
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/relations1.cc b/tests/Polyhedron/relations1.cc
new file mode 100644
index 0000000..4d4ef3c
--- /dev/null
+++ b/tests/Polyhedron/relations1.cc
@@ -0,0 +1,484 @@
+/* Test Polyhedron::relation_with(g) and Polyhedron::relation_with(c).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(2*x - y >= 0);
+  cs.insert(y >= 0);
+  C_Polyhedron ph(cs);
+  print_constraints(ph, "*** ph ***");
+
+  Generator g = ray(x + y);
+  print_generator(g, "*** g ***");
+
+  Poly_Gen_Relation rel = ph.relation_with(g);
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes();
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(r(A + B)) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+
+  C_Polyhedron ph(2, EMPTY);
+  print_constraints(ph, "--- ph ---");
+
+  Generator g = point(x);
+  print_generator(g, "--- g ---");
+
+  Poly_Gen_Relation rel = ph.relation_with(g);
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::nothing();
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(v(A)) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test03() {
+  C_Polyhedron ph;
+  print_constraints(ph, "--- ph ---");
+
+  Generator g = point();
+  print_generator(g, "--- g ---");
+
+  Poly_Gen_Relation rel = ph.relation_with(g);
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes();
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(v()) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(y));
+  gs.insert(line(x));
+  C_Polyhedron ph(gs);
+  print_generators(ph, "--- ph ---");
+
+  Generator g = point(x + y);
+  print_generator(g, "--- g ---");
+
+  Poly_Gen_Relation rel = ph.relation_with(g);
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes();
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(v(A + B)) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(1*A + 1*B));
+  C_Polyhedron ph(gs);
+  print_generators(ph, "--- ph ---");
+
+  Poly_Con_Relation rel = ph.relation_with(A >= 0);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::is_included();
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(A >= 0) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable y(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  print_generators(ph, "--- ph ---");
+
+  Constraint c(y >= 0);
+  print_constraint(c, "--- c ---");
+
+  Poly_Con_Relation rel = ph.relation_with(c);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(c) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test07() {
+  Poly_Con_Relation rel = Poly_Con_Relation::nothing();
+  Poly_Con_Relation known_result = Poly_Con_Relation::nothing();
+
+  C_Polyhedron ph;
+  print_generators(ph, "--- ph ---");
+
+  // A false inequality constraint.
+  Constraint c_false1(Linear_Expression(-1) >= 0);
+  print_constraint(c_false1, "--- c_false1 ---");
+
+  rel = ph.relation_with(c_false1);
+
+  nout << "ph.relation_with(c_false1) == " << rel << endl;
+
+  known_result = Poly_Con_Relation::is_disjoint();
+  bool ok = (rel == known_result);
+
+  // A false equality constraint.
+  Constraint c_false2(Linear_Expression(5) == -2);
+  print_constraint(c_false2, "--- c_false2 ---");
+
+  rel = ph.relation_with(c_false2);
+
+  nout << "ph.relation_with(c_false2) == " << rel << endl;
+
+  known_result = Poly_Con_Relation::is_disjoint();
+  bool ok1 = (rel == known_result);
+
+  // A saturated inequality.
+  Constraint c_saturated1(Linear_Expression(3) >= 3);
+  print_constraint(c_saturated1, "--- c_saturated1 ---");
+
+  rel = ph.relation_with(c_saturated1);
+
+  nout << "ph.relation_with(c_saturated1) == " << rel << endl;
+
+  known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+  bool ok2 = (rel == known_result);
+
+  // A saturated equality.
+  Constraint c_saturated2(Linear_Expression(1) == 1);
+  print_constraint(c_saturated2, "--- c_saturated2 ---");
+
+  rel = ph.relation_with(c_saturated2);
+
+  nout << "ph.relation_with(c_saturated2) == " << rel << endl;
+
+  known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+  bool ok3 = (rel == known_result);
+
+  // A satisfied inequality which is not saturated.
+  Constraint c_satisfied(Linear_Expression(7) >= 5);
+  print_constraint(c_satisfied, "--- c_satisfied ---");
+
+  rel = ph.relation_with(c_satisfied);
+
+  nout << "ph.relation_with(c_satisfied) == " << rel << endl;
+
+  known_result = Poly_Con_Relation::is_included();
+  bool ok4 = (rel == known_result);
+
+  return ok && ok1 && ok2 && ok3 && ok4;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x + y >= 1);
+  cs.insert(y >= 5);
+
+  C_Polyhedron ph(cs);
+
+  print_generators(ph, "--- ph ---");
+
+  // An equality constraint non-intersecting the polyhedron.
+  Constraint c(y == -1);
+
+  print_constraint(c, "--- c ---");
+
+  Poly_Con_Relation rel = ph.relation_with(c);
+
+  nout << "ph.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+  return (rel == known_result);
+}
+
+bool
+test09() {
+  // The zero-dim universe polyhedron.
+  C_Polyhedron ph;
+  Poly_Con_Relation rel = ph.relation_with(Linear_Expression(0) > 0);
+
+  print_generators(ph, "--- ph ---");
+  nout << "ph.relation_with(0 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  // The zero-dim universe polyhedron.
+  C_Polyhedron ph;
+  Poly_Con_Relation rel = ph.relation_with(Linear_Expression(0) > 1);
+
+  print_generators(ph, "--- ph ---");
+  nout << "ph.relation_with(0 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  // The zero-dim universe polyhedron.
+  C_Polyhedron ph;
+  Poly_Con_Relation rel = ph.relation_with(Linear_Expression(1) > 0);
+
+  print_generators(ph, "--- ph ---");
+  nout << "ph.relation_with(1 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  // An empty polyhedron.
+  C_Polyhedron ph(1);
+  ph.add_constraint(Linear_Expression(0) >= 1);
+  Variable A(0);
+  Poly_Con_Relation rel = ph.relation_with(A > 0);
+
+  print_generators(ph, "--- ph ---");
+  nout << "ph.relation_with(A > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A + B == 3);
+  C_Polyhedron ph(cs);
+
+  Poly_Con_Relation rel = ph.relation_with(A + B > 3);
+
+  print_generators(ph, "--- ph ---");
+  nout << "ph.relation_with(A + B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A + B <= 3);
+  C_Polyhedron ph(cs);
+
+  Poly_Con_Relation rel = ph.relation_with(A + B > 3);
+
+  print_generators(ph, "--- ph ---");
+  nout << "ph.relation_with(A + B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  C_Polyhedron ph(cs);
+
+  Poly_Con_Relation rel = ph.relation_with(A + 2*B < 10);
+
+  print_generators(ph, "--- ph ---");
+  nout << "ph.relation_with(A + 2*B < 10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  C_Polyhedron ph(cs);
+
+  Poly_Con_Relation rel = ph.relation_with(A + B > 1);
+
+  print_generators(ph, "--- ph ---");
+  nout << "ph.relation_with(A + B > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A == 0);
+
+  Poly_Gen_Relation rel = ph.relation_with(point(2*A));
+
+  print_generators(ph, "--- ph ---");
+  nout << "ph.relation_with(point(2*A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(A + 0*B));
+  gs.insert(point(3*A));
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  Poly_Con_Relation rel = ph.relation_with(B == 0);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(B == 0) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+
+  Poly_Gen_Relation rel = ph.relation_with(ray(-A));
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(ray(-A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+  return rel == known_result;
+}
+
+bool
+test20() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+
+  Poly_Gen_Relation rel = ph.relation_with(line(A));
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Polyhedron/relations2.cc b/tests/Polyhedron/relations2.cc
new file mode 100644
index 0000000..b30a4d1
--- /dev/null
+++ b/tests/Polyhedron/relations2.cc
@@ -0,0 +1,128 @@
+/* Test Polyhedron::relation_with(c) and Polyhedron::relation_with(g).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(line(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(ray(A));
+  gs2.insert(point(B));
+  gs2.insert(point(-B));
+  C_Polyhedron ph2(gs2);
+
+  Poly_Con_Relation rel1 = ph1.relation_with(A == 0);
+  Poly_Con_Relation rel2 = ph2.relation_with(A == 0);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+  nout << "ph1.relation_with(A == 0) == " << rel1 << endl;
+  nout << "ph2.relation_with(A == 0) == " << rel2 << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+  return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(A));
+  gs.insert(line(B));
+  C_Polyhedron ph(gs);
+
+  Poly_Con_Relation rel = ph.relation_with(B > 0);
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(B > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 2);
+  ph.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel = ph.relation_with(ray(A + B));
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::nothing();
+
+  bool ok = (rel == known_rel);
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(ray(A + B)) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point());
+  ph.constraints();
+  ph.add_generator(ray(A));
+  ph.add_generator(ray(B));
+
+  Poly_Con_Relation rel = ph.relation_with(A == 0);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(A == 0) == " << rel << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/relations3.cc b/tests/Polyhedron/relations3.cc
new file mode 100644
index 0000000..ddacb5f
--- /dev/null
+++ b/tests/Polyhedron/relations3.cc
@@ -0,0 +1,294 @@
+/* Test Polyhedron::relation_with(c) and Polyhedron::relation_with(g).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(A - B > 0);
+  ph.add_constraint(B >= 0);
+
+  Poly_Gen_Relation rel1 = ph.relation_with(point(B));
+  Poly_Gen_Relation rel2 = ph.relation_with(point(-B));
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(point(B)) == " << rel1 << endl;
+  nout << "ph.relation_with(point(-B)) == " << rel2 << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+  return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point(A + B));
+
+  Poly_Con_Relation rel = ph1.relation_with(A - B == 0);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(A - B == 0) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(line(B));
+
+  NNC_Polyhedron ph1(gs);
+
+  Poly_Con_Relation rel = ph1.relation_with(A >= 1);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(A >= 1) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(line(A));
+  gs.insert(ray(B));
+  gs.insert(point());
+  NNC_Polyhedron ph1(gs);
+
+  Poly_Con_Relation rel = ph1.relation_with(A > 1);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(A > 1) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(line(B));
+  gs.insert(point());
+  gs.insert(ray(A));
+  NNC_Polyhedron ph(gs);
+  Generator_System gs1;
+  for (Generator_System::const_iterator i = ph.generators().begin(),
+	 gs_end = ph.generators().end(); i != gs_end; ++i)
+    if (!(*i).is_closure_point())
+      gs.insert(*i);
+  C_Polyhedron ph1(gs);
+
+  Poly_Con_Relation rel = ph1.relation_with(B >= 1);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(B >= 1) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(A));
+  NNC_Polyhedron ph(gs);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A == 1);
+  ph1.add_constraint(B == 1);
+  Generator_System gs1;
+  for (Generator_System::const_iterator i = ph.generators().begin(),
+	 gs_end = ph.generators().end(); i != gs_end; ++i)
+    if (!(*i).is_closure_point())
+      gs1.insert(*i);
+  ph1.add_generators(gs1);
+
+  Poly_Con_Relation rel = ph1.relation_with(B == 1);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(B == 1) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(ray(B));
+  gs.insert(point(-A));
+  C_Polyhedron ph1(gs);
+  ph1.generators();
+
+  Poly_Con_Relation rel = ph1.relation_with(B <= 0);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(B <= 0) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(A + B));
+  gs.insert(point(-A + B));
+  C_Polyhedron ph1(gs);
+  ph1.generators();
+
+  Poly_Con_Relation rel = ph1.relation_with(A >= 0);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(A >= 0) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(-A));
+  gs.insert(ray(-B));
+  gs.insert(ray(A + B));
+  NNC_Polyhedron ph1(gs);
+  ph1.generators();
+
+  Poly_Con_Relation rel = ph1.relation_with(B < 0);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(B < 0) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(ray(A));
+  gs.insert(ray(A + B));
+  gs.insert(point(-B));
+  NNC_Polyhedron ph1(gs);
+  ph1.generators();
+
+  Poly_Con_Relation rel = ph1.relation_with(A < 0);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::is_disjoint();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(A < 0) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(A == 0);
+  ph.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel = ph.relation_with(closure_point(A));
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Polyhedron/removespacedims1.cc b/tests/Polyhedron/removespacedims1.cc
new file mode 100644
index 0000000..fea3341
--- /dev/null
+++ b/tests/Polyhedron/removespacedims1.cc
@@ -0,0 +1,298 @@
+/* Removing space dimensions from a polyhedron.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+  Generator_System gs;
+  gs.insert(point(0*x + y +0*z + 2*w));
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  ph.remove_space_dimensions(to_be_removed);
+
+  Generator_System known_result_gs;
+  known_result_gs.insert(point(0*x +2*y));
+  C_Polyhedron known_result(known_result_gs);
+
+  bool ok = (known_result == ph);
+
+  print_generators(ph, "*** ph ***");
+  print_generators(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Generator_System gs;
+
+  // Creating 10 points.
+  for (int i = 0; i < 10; i++) {
+    Linear_Expression e;
+    for (int j = 0; j < 10; j++)
+      e += (10*i + j) * Variable(j);
+    gs.insert(point(e));
+  }
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** before ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(Variable(0));
+  to_be_removed.insert(Variable(5));
+  to_be_removed.insert(Variable(3));
+  to_be_removed.insert(Variable(4));
+  to_be_removed.insert(Variable(8));
+
+  ph.remove_space_dimensions(to_be_removed);
+
+  // Useless, but much clearer.
+  gs.clear();
+
+  Variable a(0);
+  Variable b(1);
+  Variable c(2);
+  Variable d(3);
+  Variable e(4);
+
+  Linear_Expression expr01 = (1*a + 2*b + 6*c + 7*d + 9*e);
+  Linear_Expression expr10 = 10 * (a + b + c + d + e);
+
+  for (int i = 0; i < 10; i++) {
+    Linear_Expression expr = i * expr10 + expr01;
+    gs.insert(point(expr));
+  }
+
+  C_Polyhedron known_result(gs);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ***");
+  print_generators(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable y(1);
+  Variable z(2);
+  Variable w(6);
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  to_be_removed.insert(w);
+
+  // A 10-dim space, empty polyhedron.
+  C_Polyhedron ph(10, EMPTY);
+  ph.remove_space_dimensions(to_be_removed);
+
+  // A 7-dim space, empty polyhedron.
+  C_Polyhedron known_result(7, EMPTY);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Generator_System gs;
+  gs.insert(point(x + y + 2*z - w));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.remove_higher_space_dimensions(2);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point(x + y));
+  C_Polyhedron known_result(gs_known_result);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** After remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  C_Polyhedron ph(4, EMPTY);
+
+  print_constraints(ph, "--- ph ---");
+
+  ph.remove_higher_space_dimensions(0);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "--- ph after remove_higher_space_dimensions(0)---");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(x >= 3);
+  ph1.add_constraint(x - y >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2 = ph1;
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  to_be_removed.insert(x);
+
+  ph1.remove_space_dimensions(to_be_removed);
+  ph2.remove_higher_space_dimensions(0);
+
+  bool ok = (ph1 == ph2);
+
+  print_generators(ph1, "*** ph1 after remove_space_dimensions ***");
+  print_generators(ph2, "*** ph2 after remove_higher_space_dimensions ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  C_Polyhedron ph(gs);
+  ph.add_constraint(A >= 2);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+
+  ph.remove_space_dimensions(to_be_removed);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph,
+		    "*** After ph.remove_space_dimensions(to_be_removed) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 3);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.remove_higher_space_dimensions(2);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(2*A + B, 4));
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.remove_higher_space_dimensions(1);
+
+  C_Polyhedron known_result(1, EMPTY);
+  known_result.add_generator(point(A, 2));
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.remove_higher_space_dimensions(1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+#ifdef DERIVED_TEST
+  DO_TEST_F8A(test02);
+#else
+  DO_TEST_F8(test02);
+#endif // !defined(DERIVED_TEST)
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/removespacedims2.cc b/tests/Polyhedron/removespacedims2.cc
new file mode 100644
index 0000000..c51c98c
--- /dev/null
+++ b/tests/Polyhedron/removespacedims2.cc
@@ -0,0 +1,66 @@
+/* Removing space dimensions form an NNC polyhedron.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  NNC_Polyhedron ph1(4);
+
+  ph1.add_constraint(x - y == 3);
+  ph1.add_constraint(z > x + 4);
+  ph1.add_constraint(y < 6);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(ph1);
+
+  ph1.remove_higher_space_dimensions(1);
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  to_be_removed.insert(Variable(3));
+
+  ph2.remove_space_dimensions(to_be_removed);
+
+  bool ok = (ph1 == ph2);
+
+  print_constraints(ph1, "*** After remove_higher_space_dimensions(1) ***");
+  print_constraints(ph2,
+		    "*** After remove_space_dimensions(to_be_removed) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/smm1.cc b/tests/Polyhedron/smm1.cc
new file mode 100644
index 0000000..1674cac
--- /dev/null
+++ b/tests/Polyhedron/smm1.cc
@@ -0,0 +1,149 @@
+/* SEND + MORE = MONEY.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace Parma_Polyhedra_Library {
+  // Import all the output operators into the main PPL namespace.
+  using IO_Operators::operator<<;
+}
+
+// The classic cryptarithmetic puzzle:
+//
+//      S E N D
+//    + M O R E
+//    ---------
+//    M O N E Y
+
+namespace {
+
+void
+less_than(C_Polyhedron& ph, Variable X, Variable Y) {
+  ph.add_constraint(X+1 <= Y);
+}
+
+void
+constraints(C_Polyhedron& ph,
+	    Variable S,
+	    Variable E,
+	    Variable N,
+	    Variable D,
+	    Variable M,
+	    Variable O,
+	    Variable R,
+	    Variable Y,
+	    int C1,
+	    int C2,
+	    int C3,
+	    int C4) {
+  ph.add_constraint(S >= 0);
+  ph.add_constraint(E >= 0);
+  ph.add_constraint(N >= 0);
+  ph.add_constraint(D >= 0);
+  ph.add_constraint(M >= 0);
+  ph.add_constraint(O >= 0);
+  ph.add_constraint(R >= 0);
+  ph.add_constraint(Y >= 0);
+  ph.add_constraint(S <= 9);
+  ph.add_constraint(E <= 9);
+  ph.add_constraint(N <= 9);
+  ph.add_constraint(D <= 9);
+  ph.add_constraint(M <= 9);
+  ph.add_constraint(O <= 9);
+  ph.add_constraint(R <= 9);
+  ph.add_constraint(Y <= 9);
+  ph.add_constraint(S >= 1);
+  ph.add_constraint(M >= 1);
+  ph.add_constraint(M == C1);
+  ph.add_constraint(C2 + S + M == O + C1 * 10);
+  ph.add_constraint(C3 + E + O == N + 10 * C2);
+  ph.add_constraint(C4 + N + R == E + 10 * C3);
+  ph.add_constraint(D + E == Y + 10*C4);
+
+  less_than(ph, O, M);
+  less_than(ph, M, Y);
+  less_than(ph, Y, E);
+  less_than(ph, E, N);
+  less_than(ph, N, D);
+  less_than(ph, D, R);
+  less_than(ph, R, S);
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  Variable S(0);
+  Variable E(1);
+  Variable N(2);
+  Variable D(3);
+  Variable M(4);
+  Variable O(5);
+  Variable R(6);
+  Variable Y(7);
+
+  bool solution_found = false;
+
+  for (int C1 = 0; C1 <= 1; ++C1)
+    for (int C2 = 0; C2 <= 1; ++C2)
+      for (int C3 = 0; C3 <= 1; ++C3)
+	for (int C4 = 0; C4 <= 1; ++C4) {
+	  C_Polyhedron ph(8);
+	  constraints(ph,
+		      S, E, N, D, M, O, R, Y,
+		      C1, C2, C3, C4);
+	  if (!ph.is_empty()) {
+	    nout << "Solution constraints" << endl;
+	    const Constraint_System& cs = ph.constraints();
+	    std::copy(cs.begin(), cs.end(),
+		      std::ostream_iterator<Constraint>(nout, "\n"));
+	    nout << "Solution generators" << endl;
+	    const Generator_System& gs = ph.generators();
+	    std::copy(gs.begin(), gs.end(),
+		      std::ostream_iterator<Generator>(nout, "\n"));
+
+	    if (solution_found)
+	      return 1;
+
+	    solution_found = true;
+
+	    C_Polyhedron expected(8);
+	    expected.add_constraint(S == 9);
+	    expected.add_constraint(E == 5);
+	    expected.add_constraint(N == 6);
+	    expected.add_constraint(D == 7);
+	    expected.add_constraint(M == 1);
+	    expected.add_constraint(O == 0);
+	    expected.add_constraint(R == 8);
+	    expected.add_constraint(Y == 2);
+
+	    if (ph != expected)
+	      return 1;
+	  }
+	}
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/timeelapse1.cc b/tests/Polyhedron/timeelapse1.cc
new file mode 100644
index 0000000..9d624c7
--- /dev/null
+++ b/tests/Polyhedron/timeelapse1.cc
@@ -0,0 +1,250 @@
+/* Test Polyhedron::time_elapse_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= 1);
+  ph1.add_constraint(x <= 3);
+  ph1.add_constraint(y >= 1);
+  ph1.add_constraint(y <= 3);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(y == 5);
+
+  print_constraints(ph1, "**** ph1 ****");
+  print_constraints(ph2, "**** ph2 ****");
+
+  ph1.time_elapse_assign(ph2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(y));
+  known_result.add_generator(ray(y));
+  known_result.add_generator(line(x));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "**** ph1_time_elapse_assign(ph2) ****");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph1(0, EMPTY);
+  C_Polyhedron ph2;
+
+  print_constraints(ph1, "**** ph1 ****");
+  print_constraints(ph2, "**** ph2 ****");
+
+  ph1.time_elapse_assign(ph2);
+
+  C_Polyhedron ph3(2, EMPTY);
+  C_Polyhedron ph4(2);
+
+  print_constraints(ph3, "**** ph3 ****");
+  print_constraints(ph4, "**** ph4 ****");
+
+  ph3.time_elapse_assign(ph4);
+
+  C_Polyhedron ph5(2);
+  C_Polyhedron ph6(2, EMPTY);
+
+  print_constraints(ph5, "**** ph5 ****");
+  print_constraints(ph6, "**** ph6 ****");
+
+  ph5.time_elapse_assign(ph6);
+
+  bool ok = ph1.is_empty() && ph3.is_empty() && ph5.is_empty();
+
+  print_generators(ph1, "**** ph1_time_elapse_assign(ph2) ****");
+  print_generators(ph3, "**** ph3_time_elapse_assign(ph4) ****");
+  print_generators(ph5, "**** ph5_time_elapse_assign(ph6) ****");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point(A));
+  gs1.insert(point(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(0*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.time_elapse_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2(0, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.time_elapse_assign(ph2);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** After ph1.time_elapse_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.generators();
+  ph1.add_constraint(A == 0);
+  ph1.add_constraint(B == 0);
+
+  C_Polyhedron ph2(2);
+  ph2.generators();
+  ph2.add_constraint(A == 2);
+  ph2.add_constraint(B == 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.time_elapse_assign(ph2);
+
+  C_Polyhedron ph3(2, EMPTY);
+  ph3.add_generator(point());
+  ph3.constraints();
+
+  C_Polyhedron ph4(2, EMPTY);
+  ph4.add_generator(point(2*A + 2*B));
+
+  print_generators(ph3, "*** ph3 ***");
+  print_generators(ph4, "*** ph4 ***");
+
+  ph3.time_elapse_assign(ph4);
+
+  bool ok = (ph1 ==  ph3);
+
+  print_generators(ph1, "*** After ph1.time_elapse_assign(ph2) ***");
+  print_generators(ph3, "*** After ph3.time_elapse_assign(ph4) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(x + y - 2 <= 0);
+
+  C_Polyhedron ph2(2);
+
+  ph2.add_constraint(x == -1);
+  ph2.add_constraint(y == -1);
+
+  Polyhedra_Powerset<C_Polyhedron> ps1(2, EMPTY);
+  ps1.add_disjunct(ph1);
+  ps1.add_disjunct(ph2);
+
+  C_Polyhedron ph3(2);
+
+  ph3.add_constraint(x >= 2);
+  ph3.add_constraint(x <= 4);
+  ph3.add_constraint(y == 3);
+
+  Polyhedra_Powerset<C_Polyhedron> ps2(2, EMPTY);
+  ps2.add_disjunct(ph3);
+
+  print_constraints(ps1, "=== ps1 ===");
+  print_constraints(ps2, "=== ps2 ===");
+
+  ps1.time_elapse_assign(ps2);
+
+  Generator_System known_gs;
+  known_gs.insert(point());
+  known_gs.insert(point(2*x));
+  known_gs.insert(point(2*y));
+  known_gs.insert(ray(2*x + 3*y));
+  known_gs.insert(ray(4*x + 3*y));
+
+  C_Polyhedron known_ph1(known_gs);
+
+  known_gs.clear();
+  known_gs.insert(point(-x - y));
+  known_gs.insert(ray(2*x + 3*y));
+  known_gs.insert(ray(4*x + 3*y));
+  C_Polyhedron known_ph2(known_gs);
+
+  Polyhedra_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  // Inserting out of order on purpose.
+  known_result.add_disjunct(known_ph2);
+  known_result.add_disjunct(known_ph1);
+
+  bool ok = (ps1 == known_result);
+
+  print_constraints(ps1, "=== ps1.time_elapse_assign(ps2) ===");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/timeelapse2.cc b/tests/Polyhedron/timeelapse2.cc
new file mode 100644
index 0000000..a20455b
--- /dev/null
+++ b/tests/Polyhedron/timeelapse2.cc
@@ -0,0 +1,132 @@
+/* Test time_elapse_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(x + y - 2 <= 0);
+
+  NNC_Polyhedron ph2(2);
+
+  ph2.add_constraint(x > 2);
+  ph2.add_constraint(x < 4);
+  ph2.add_constraint(y == 3);
+
+  print_constraints(ph1, "**** ph1 ****");
+  print_constraints(ph2, "**** ph2 ****");
+
+  ph1.time_elapse_assign(ph2);
+
+  Generator_System known_gs;
+  known_gs.insert(point());
+  known_gs.insert(point(2*x));
+  known_gs.insert(point(2*y));
+  known_gs.insert(ray(2*x + 3*y));
+  known_gs.insert(ray(4*x + 3*y));
+
+  NNC_Polyhedron known_result(known_gs);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "**** ph1_time_elapse_assign(ph2) ****");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x > 3);
+  cs1.insert(y > 3);
+  NNC_Polyhedron ph(cs1);
+
+  NNC_Polyhedron ph1(ph);
+
+  Generator_System gs;
+  gs.insert(point(x + y));
+  NNC_Polyhedron ph2(gs);
+
+  print_constraints(ph1, "**** ph1 ****");
+  print_generators(ph2, "**** ph2 ****");
+
+  ph1.time_elapse_assign(ph2);
+
+  bool ok = (ph1 == ph);
+
+  print_generators(ph1, "**** ph1_time_elapse_assign(ph2) ****");
+
+ return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(x == 3);
+  ph1.add_constraint(y > 2);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(x > 3);
+  ph2.add_constraint(y > 2);
+
+  print_constraints(ph1, "**** ph1 ****");
+  print_constraints(ph2, "**** ph2 ****");
+
+  ph1.time_elapse_assign(ph2);
+
+  Generator_System gs;
+  gs.insert(closure_point(3*x + 2*y));
+  gs.insert(point(3*x + 3*y));
+  gs.insert(ray(y));
+  gs.insert(ray(x));
+
+  NNC_Polyhedron known_result(gs);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "**** ph1_time_elapse_assign(ph2) ****");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/topclosed1.cc b/tests/Polyhedron/topclosed1.cc
new file mode 100644
index 0000000..2c0c473
--- /dev/null
+++ b/tests/Polyhedron/topclosed1.cc
@@ -0,0 +1,95 @@
+/* Test Polyhedron::is_topologically_closed().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(A >= 0);
+
+  NNC_Polyhedron ph2(2, EMPTY);
+
+  NNC_Polyhedron ph3;
+
+  bool ok = ph1.is_topologically_closed()
+    && ph2.is_topologically_closed()
+    && ph3.is_topologically_closed();
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(ph3, "*** ph3 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+
+  NNC_Polyhedron ph1(1, EMPTY);
+
+  Generator_System gs1;
+  gs1.insert(point(A));
+  gs1.insert(closure_point());
+  gs1.insert(closure_point(A));
+  ph1.add_generators_and_minimize(gs1);
+
+  bool ok = !ph1.is_topologically_closed();
+
+  print_generators(ph1, "*** ph1 ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(0*B));
+  gs.insert(closure_point(-A));
+  gs.insert(closure_point(A));
+  gs.insert(line(A));
+
+  NNC_Polyhedron ph(gs);
+
+  bool ok = ph.is_topologically_closed();
+
+  print_constraints(ph, "*** ph ***");
+  print_generators(ph, "*** ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/topclosure1.cc b/tests/Polyhedron/topclosure1.cc
new file mode 100644
index 0000000..a80bc6d
--- /dev/null
+++ b/tests/Polyhedron/topclosure1.cc
@@ -0,0 +1,160 @@
+/* Test Polyhedron::topological_closure_assign().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A > 1);
+  ph1.add_constraint(A - B > 0);
+  Generator_System gs;
+  gs.insert(point(2*A));
+  gs.insert(closure_point(A + B));
+  gs.insert(ray(-B));
+  gs.insert(ray(A + B));
+  NNC_Polyhedron ph2(gs);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.topological_closure_assign();
+  ph2.topological_closure_assign();
+
+  bool ok = (ph1 == ph2);
+
+  print_constraints(ph1, "*** After ph1.topological_closure_assign() ***");
+  print_generators(ph2, "*** After ph2.topological_closure_assign() ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  NNC_Polyhedron ph1;
+  NNC_Polyhedron ph2(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result1 = ph1;
+  NNC_Polyhedron known_result2 = ph2;
+
+  ph1.topological_closure_assign();
+  ph2.topological_closure_assign();
+
+  bool ok = (ph1 == known_result1 && ph2 == known_result2);
+
+  print_constraints(ph1, "*** After ph1.topological_closure_assign() ***");
+  print_constraints(ph2, "*** After ph2.topological_closure_assign() ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A - B == 0);
+  ph.add_constraint(A >= 0);
+
+  C_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.topological_closure_assign();
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.topological_closure_assign() ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A > 0);
+  ph.add_constraint(A == B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.topological_closure_assign();
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A == B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.topological_closure_assign() ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A));
+  ph.constraints();
+  ph.add_generator(closure_point());
+  ph.add_generator(ray(A));
+  ph.add_generator(ray(B));
+
+  print_generators(ph, "*** ph ***");
+
+  ph.topological_closure_assign();
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** After ph.topological_closure_assign() ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/universe1.cc b/tests/Polyhedron/universe1.cc
new file mode 100644
index 0000000..1713ae1
--- /dev/null
+++ b/tests/Polyhedron/universe1.cc
@@ -0,0 +1,164 @@
+/* Test Polyhedron::is_universe().
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  C_Polyhedron ph(3);
+  print_constraints(ph, "--- ph ---");
+
+  bool universe = ph.is_universe();
+
+  nout << "*** ph.is_universe() ***"
+       << endl
+       << (universe ? "true" : "false")
+       << endl;
+
+  return universe;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable z(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(x >= z);
+  ph.add_constraint(z == 3);
+
+  print_constraints(ph, "--- ph ---");
+
+  bool universe = ph.is_universe();
+
+  nout << "*** ph.is_universe() ***"
+       << endl
+       << (universe ? "true" : "false")
+       << endl;
+
+  return !universe;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(y == 0);
+  ph.add_constraint(x >= 1);
+  ph.add_constraint(x <= 3);
+
+  Constraint_System cs = ph.constraints();
+  print_constraints(ph, "--- ph ---");
+
+  bool universe = ph.is_universe();
+
+  nout << "*** ph.is_universe() ***"
+       << endl
+       << (universe ? "true" : "false")
+       << endl;
+
+  return !universe;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(x >= 1);
+  ph.add_constraint(y >= 1);
+  ph.add_constraint(x <= 4);
+  ph.add_constraint(y <= 4);
+
+  Constraint_System cs = ph.constraints();
+  print_constraints(ph, "--- ph ---");
+
+  bool universe = ph.is_universe();
+
+  nout << "*** ph.is_universe() ***"
+       << endl
+       << (universe ? "true" : "false")
+       << endl;
+
+  return !universe;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(x - y - z >= 0);
+
+  print_constraints(ph, "--- ph ---");
+
+  bool universe = ph.is_universe();
+
+  nout << "*** ph.is_universe() ***"
+       << endl
+       << (universe ? "true" : "false")
+       << endl;
+
+  return !universe;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(-x));
+  gs.insert(ray(x + y));
+  gs.insert(ray(x - y));
+
+  C_Polyhedron ph(gs);
+  print_generators(ph, "--- ph ---");
+
+  bool universe = ph.is_universe();
+
+  nout << "*** ph.is_universe() ***"
+       << endl
+       << (universe ? "true" : "false")
+       << endl;
+
+  return universe;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/universe2.cc b/tests/Polyhedron/universe2.cc
new file mode 100644
index 0000000..a2d8be1
--- /dev/null
+++ b/tests/Polyhedron/universe2.cc
@@ -0,0 +1,79 @@
+/* Test the function is_universe() for a NNC_polyhedron.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  NNC_Polyhedron ph1(4);
+  NNC_Polyhedron ph2(3);
+  NNC_Polyhedron ph3(3);
+
+  ph2.add_constraint(Linear_Expression(1) > 0);
+  ph3.add_constraint(Linear_Expression(1) < 0);
+
+  Constraint_System cs;
+  NNC_Polyhedron ph4(cs);
+
+  print_constraints(ph1, "--- ph1 ---");
+  print_constraints(ph2, "--- ph2 ---");
+  print_constraints(ph3, "--- ph3 ---");
+  print_constraints(ph4, "--- ph4 ---");
+
+  bool universe1 = ph1.is_universe();
+
+  nout << "*** ph1.is_universe() ***"
+       << endl
+       << (universe1 ? "true" : "false")
+       << endl;
+
+  bool universe2 = ph2.is_universe();
+
+  nout << "*** ph2.is_universe() ***"
+       << endl
+       << (universe2 ? "true" : "false")
+       << endl;
+
+  bool universe3 = ph3.is_universe();
+
+  nout << "*** ph3.is_universe() ***"
+       << endl
+       << (universe3 ? "true" : "false")
+       << endl;
+
+  bool universe4 = ph4.is_universe();
+
+  nout << "*** ph4.is_universe() ***"
+       << endl
+       << (universe4 ? "true" : "false")
+       << endl;
+
+  return universe1 && universe2 && !universe3 && universe4;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/watchdog1.cc b/tests/Polyhedron/watchdog1.cc
new file mode 100644
index 0000000..0b47a0d
--- /dev/null
+++ b/tests/Polyhedron/watchdog1.cc
@@ -0,0 +1,131 @@
+/* Test the timeout facility of the library.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "pwl.hh"
+#include "timings.hh"
+
+namespace {
+
+void
+compute_open_hypercube_generators(dimension_type dimension) {
+  NNC_Polyhedron hypercube(dimension);
+  for (dimension_type i = 0; i < dimension; ++i) {
+    Variable x(i);
+    hypercube.add_constraint(x > 0);
+    hypercube.add_constraint(x < 1);
+  }
+  (void) hypercube.generators();
+}
+
+class Timeout : virtual public std::exception,
+		public Parma_Polyhedra_Library::Throwable {
+public:
+  const char* what() const throw() {
+    return "Timeout in watchdog1.cc";
+  }
+
+  void throw_me() const {
+    throw *this;
+  }
+
+  int priority() const {
+    return 0;
+  }
+
+  Timeout() {
+  }
+
+  ~Timeout() throw() {
+  }
+};
+
+Timeout t;
+
+bool
+timed_compute_open_hypercube_generators(dimension_type dimension,
+					int hundredth_secs) {
+  try {
+    Parma_Watchdog_Library::Watchdog
+      w(hundredth_secs, abandon_expensive_computations, t);
+
+    start_clock();
+
+    compute_open_hypercube_generators(dimension);
+    abandon_expensive_computations = 0;
+    return true;
+  }
+  catch (const Timeout& e) {
+    abandon_expensive_computations = 0;
+    nout << e.what() << " after ";
+    print_clock(nout);
+    nout << " s" << endl;
+    return false;
+  }
+  catch (...) {
+    exit(1);
+  }
+  // Should never get here.
+  return false;
+}
+
+} // namespace
+
+#define INIT_TIME 20
+
+int
+main() TRY {
+  set_handlers();
+
+  // Find a dimension that cannot be computed with a INIT_TIME timeout.
+  dimension_type dimension = 0;
+  do {
+    ++dimension;
+    nout << "Trying dimension " << dimension << endl;
+  }
+  while (timed_compute_open_hypercube_generators(dimension, INIT_TIME));
+
+  // Now find an upper bound to the time necessary to compute it.
+  int upper_bound = INIT_TIME;
+  do {
+    upper_bound *= 2;
+    nout << "Trying upper bound " << upper_bound << endl;
+  }
+  while (!timed_compute_open_hypercube_generators(dimension, upper_bound));
+
+  // Search the "exact" time.
+  int lower_bound = upper_bound/2;
+  do {
+    int test_time = (lower_bound+upper_bound)/2;
+    nout << "Probing " << test_time << endl;
+    if (timed_compute_open_hypercube_generators(dimension, test_time))
+      upper_bound = test_time;
+    else
+      lower_bound = test_time;
+  } while (upper_bound-lower_bound > 4);
+
+  nout << "Estimated time for dimension " << dimension
+       << ": " << (lower_bound+upper_bound)/2 << " 100th of sec" << endl;
+
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/writeconsys1.cc b/tests/Polyhedron/writeconsys1.cc
new file mode 100644
index 0000000..a7b322a
--- /dev/null
+++ b/tests/Polyhedron/writeconsys1.cc
@@ -0,0 +1,58 @@
+/* Test operator<<(std::ostream&, const Constraint_System&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <fstream>
+
+using std::fstream;
+using std::ios_base;
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "writeconsys1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(A - 2*B > 2);
+  ph.add_constraint(Linear_Expression(0) <= -1);
+  ph.add_constraint(A == 2);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << ph.constraints() << endl;
+  close(f);
+
+  // FIXME.
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/writegensys1.cc b/tests/Polyhedron/writegensys1.cc
new file mode 100644
index 0000000..49cc20b
--- /dev/null
+++ b/tests/Polyhedron/writegensys1.cc
@@ -0,0 +1,97 @@
+/* Test operator<<(std::ostream&, const Generator_System&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <fstream>
+
+using std::fstream;
+using std::ios_base;
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "writegensys1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A - B));
+  gs.insert(point(A + C));
+  gs.insert(ray(B + C));
+  gs.insert(line(C));
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << gs << endl;
+  close(f);
+  // FIXME.
+  return true;
+}
+
+bool
+test02() {
+  const char* my_file = "writegensys1.dat";
+  C_Polyhedron ph(3, EMPTY);
+
+  Generator_System gs = ph.generators();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << gs << endl;
+  close(f);
+  // FIXME.
+  return true;
+}
+
+bool
+test03() {
+  const char* my_file = "writegensys1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1 = 2*A + 4;
+  e1 += B;
+  Generator_System gs;
+  gs.insert(ray(e1));
+  gs.insert(point(3*A + B, 2));
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << gs << endl;
+  close(f);
+  // FIXME.
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/writepolyhedron1.cc b/tests/Polyhedron/writepolyhedron1.cc
new file mode 100644
index 0000000..9a690b3
--- /dev/null
+++ b/tests/Polyhedron/writepolyhedron1.cc
@@ -0,0 +1,77 @@
+/* Test operator<<(std::ostream&, const Polyhedron&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <fstream>
+
+using std::fstream;
+using std::ios_base;
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "writepolyhedron1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(  A - B       >= 3);
+  ph.add_constraint(    - B +   C >= 3);
+  ph.add_constraint(  A - B       <= 1);
+  ph.add_constraint(  A - B + 3*C >= 3);
+  ph.add_constraint(3*A     + 2*C >= 3);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << ph << endl;
+  close(f);
+  // FIXME.
+  return true;
+}
+
+bool
+test02() {
+  const char* my_file = "writepolyhedron1.dat";
+  NNC_Polyhedron ph1;
+
+  C_Polyhedron ph(ph1.constraints());
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << ph << endl;
+  close(f);
+  // FIXME.
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/writepolyhedron2.cc b/tests/Polyhedron/writepolyhedron2.cc
new file mode 100644
index 0000000..b5a3696
--- /dev/null
+++ b/tests/Polyhedron/writepolyhedron2.cc
@@ -0,0 +1,71 @@
+/* Test operator<<(std::ostream&, const Polyhedron&).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <fstream>
+
+using std::fstream;
+using std::ios_base;
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "writepolyhedron2.dat";
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  NNC_Polyhedron ph(4);
+
+  ph.add_constraint(     +x2-x3-x4 <= 0);
+  ph.add_constraint(-  x1   +x3-x4 <  0);
+  ph.add_constraint(+  x1   -x3-x4 <= 0);
+  ph.add_constraint(-2*x1+x2+x3-x4 <  0);
+  ph.add_constraint(           +x4 <= 1);
+  ph.add_constraint(        +x3    <  1);
+  ph.add_constraint(-  x1+x2+x3    <= 1);
+  ph.add_constraint(        -x3    <  0);
+  ph.add_constraint(-  x1          <= 0);
+  ph.add_constraint(     -x2       <  0);
+  ph.add_constraint(     +x2       <= 1);
+  ph.add_constraint(+  x1          <  1);
+  ph.add_constraint(+  x1-x2+x3+x4 <= 2);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << ph << endl;
+  close(f);
+  // FIXME.
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/writerelation1.cc b/tests/Polyhedron/writerelation1.cc
new file mode 100644
index 0000000..8310444
--- /dev/null
+++ b/tests/Polyhedron/writerelation1.cc
@@ -0,0 +1,95 @@
+/* Test operator<<(std::ostream& s, const Poly_Con_Relation& r)
+   and operator<<(std::ostream& s, const Poly_Gen_Relation& r).
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::fstream;
+using std::ios_base;
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "writerelation1.dat";
+  Poly_Con_Relation rel(Poly_Con_Relation::nothing());
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << rel << endl;
+  close(f);
+  // FIXME.
+  return true;
+}
+
+bool
+test02() {
+  const char* my_file = "writerelation1.dat";
+  Poly_Gen_Relation rel(Poly_Gen_Relation::nothing());
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << rel << endl;
+  close(f);
+  // FIXME.
+  return true;
+}
+
+bool
+test03() {
+  const char* my_file = "writerelation1.dat";
+  Poly_Con_Relation rel(Poly_Con_Relation::is_disjoint());
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << rel << endl;
+  close(f);
+  // FIXME.
+  return true;
+}
+
+bool
+test04() {
+  const char* my_file = "writerelation1.dat";
+  Poly_Gen_Relation rel(Poly_Gen_Relation::subsumes());
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << rel << endl;
+  close(f);
+  // FIXME.
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/writevariable1.cc b/tests/Polyhedron/writevariable1.cc
new file mode 100644
index 0000000..be7dafb
--- /dev/null
+++ b/tests/Polyhedron/writevariable1.cc
@@ -0,0 +1,103 @@
+/* Test operator<<(std::ostream& s, Variable v)
+   and the related machinery.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+const char* my_file = "writevariable1.dat";
+
+void
+write_variables() {
+  fstream f;
+  open(f, my_file, ios_base::out);
+  for (dimension_type id = 0; id <= 100; id += 5)
+    f << Variable(id) << " ";
+  f << endl;
+  close(f);
+}
+
+void
+read_variables_and_check(const string& s) {
+  fstream f;
+  open(f, my_file, ios_base::in);
+  string t;
+  getline(f, t);
+  close(f);
+  if (s != t)
+    exit(1);
+}
+
+void
+my_output_function(std::ostream& s, const Variable& v) {
+  s << "x" << v.id();
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  // Default output function: write...
+  write_variables();
+  // ... read back.
+  read_variables_and_check("A F K P U Z E1 J1 O1 T1 Y1 "
+			   "D2 I2 N2 S2 X2 C3 H3 M3 R3 W3 ");
+
+  // Save the default output function.
+  Variable::output_function_type* p_default_output_function
+    = Variable::get_output_function();
+
+  // Install an alternate output function.
+  Variable::set_output_function(my_output_function);
+
+  // Check that the installation worked as expected.
+  if (Variable::get_output_function() != my_output_function)
+    return 1;
+
+  // Alternate output function: write...
+  write_variables();
+  // ... read back.
+  read_variables_and_check("x0 x5 x10 x15 x20 x25 x30 x35 x40 x45 "
+			   "x50 x55 x60 x65 x70 x75 x80 x85 x90 x95 x100 ");
+
+  // Restore the default output function.
+  Variable::set_output_function(p_default_output_function);
+
+  // Check that the restoration worked as expected.
+  if (Variable::get_output_function() != p_default_output_function)
+    return 1;
+
+  return 0;
+}
+CATCH
diff --git a/tests/Random_Number_Generator.defs.hh b/tests/Random_Number_Generator.defs.hh
new file mode 100644
index 0000000..154c668
--- /dev/null
+++ b/tests/Random_Number_Generator.defs.hh
@@ -0,0 +1,46 @@
+/* Random_Number_Generator class declaration.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Random_Number_Generator_defs_hh
+#define PPL_Random_Number_Generator_defs_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Random_Number_Generator {
+public:
+  Random_Number_Generator();
+
+  explicit Random_Number_Generator(unsigned long seed);
+
+  template <typename T>
+  void get(T& x, unsigned int info);
+
+private:
+  gmp_randclass rand;
+  unsigned int max_bits;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Random_Number_Generator.inlines.hh"
+
+#endif // !defined(PPL_Random_Number_Generator_defs_hh)
diff --git a/tests/Random_Number_Generator.inlines.hh b/tests/Random_Number_Generator.inlines.hh
new file mode 100644
index 0000000..d79654d
--- /dev/null
+++ b/tests/Random_Number_Generator.inlines.hh
@@ -0,0 +1,90 @@
+/* Random_Number_Generator class implementation: inline functions.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Random_Number_Generator_inlines_hh
+#define PPL_Random_Number_Generator_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+namespace Random_Numbers {
+
+template <typename T>
+class Random_Number_Generator_Aux {
+public:
+  Random_Number_Generator_Aux(unsigned int max_bits) {
+    if (std::numeric_limits<T>::is_bounded) {
+      assign_r(zmin, std::numeric_limits<T>::min(), ROUND_NOT_NEEDED);
+      assign_r(zrange, std::numeric_limits<T>::max(), ROUND_NOT_NEEDED);
+      zrange -= zmin;
+      ++zrange;
+    }
+    else if (std::numeric_limits<T>::is_signed) {
+      zmin = 1;
+      zmin <<= (max_bits - 1);
+      zmin = -zmin;
+    }
+    else {
+      assign_r(zmin, std::numeric_limits<T>::min(), ROUND_NOT_NEEDED);
+    }
+  }
+  mpz_class zmin;
+  mpz_class zrange;
+};
+
+} // namespace Random_Numbers
+} // namespace Implementation
+
+inline
+Random_Number_Generator::Random_Number_Generator()
+  : rand(gmp_randinit_default), max_bits(512) {
+  // Seed the random number generator with the current time.
+  rand.seed((unsigned long) time(0));
+}
+
+inline
+Random_Number_Generator::Random_Number_Generator(const unsigned long seed)
+  : rand(gmp_randinit_default), max_bits(512) {
+  // Seed the random number generator with the given value.
+  rand.seed(seed);
+}
+
+template <typename T>
+inline void
+Random_Number_Generator::get(T& x, unsigned int info) {
+  using Implementation::Random_Numbers::Random_Number_Generator_Aux;
+  used(info);
+  static Random_Number_Generator_Aux<T> aux(max_bits);
+  mpz_class n;
+  if (std::numeric_limits<T>::is_bounded) {
+    n = rand.get_z_range(aux.zrange);
+  }
+  else {
+    n = rand.get_z_bits(max_bits);
+  }
+  n += aux.zmin;
+  assign_r(x, n, ROUND_NOT_NEEDED);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Random_Number_Generator_inlines_hh)
diff --git a/tests/Random_Number_Generator.types.hh b/tests/Random_Number_Generator.types.hh
new file mode 100644
index 0000000..87f2f01
--- /dev/null
+++ b/tests/Random_Number_Generator.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Random_Number_Generator_types_hh
+#define PPL_Random_Number_Generator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Random_Number_Generator;
+
+}
+
+#endif // !defined(PPL_Random_Number_Generator_types_hh)
diff --git a/tests/files.cc b/tests/files.cc
new file mode 100644
index 0000000..efb5cb1
--- /dev/null
+++ b/tests/files.cc
@@ -0,0 +1,49 @@
+/* Definition of simple helper functions to open and close files.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "files.hh"
+#include <fstream>
+#include <iostream>
+
+using namespace std;
+
+void
+open(fstream& s, const char* path, ios_base::openmode mode) {
+  s.open(path, mode);
+  if (!s) {
+    cerr << "Cannot open `" << path << "'";
+    if (mode == ios_base::in)
+      cerr << " for reading";
+    else if (mode == ios_base::out)
+      cerr << " for writing";
+    else if (mode == ios_base::in | ios_base::out)
+      cerr << " for reading/writing";
+    cerr << endl;
+    exit(1);
+  }
+}
+
+void
+close(fstream& s) {
+  if (s)
+    s.close();
+}
diff --git a/tests/files.hh b/tests/files.hh
new file mode 100644
index 0000000..6dd97d6
--- /dev/null
+++ b/tests/files.hh
@@ -0,0 +1,35 @@
+/* Declaration of simple helper functions to open and close files.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_files_hh
+#define PPL_files_hh 1
+
+#include <iostream>
+#include <fstream>
+
+void
+open(std::fstream& s, const char* path, std::ios_base::openmode mode);
+
+void
+close(std::fstream& s);
+
+#endif // !defined(PPL_files_hh)
diff --git a/tests/ppl_test.cc b/tests/ppl_test.cc
new file mode 100644
index 0000000..15abd2e
--- /dev/null
+++ b/tests/ppl_test.cc
@@ -0,0 +1,137 @@
+/* Implementation of simple print functions used in test programs.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <csignal>
+#ifdef HAVE_FENV_H
+#include <fenv.h>
+#endif
+
+namespace PPL = Parma_Polyhedra_Library;
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+void
+unexpected_exception_handler() {
+  cerr << "unexpected exception thrown" << endl;
+  exit(1);
+}
+
+void
+uncaught_exception_handler() {
+  cerr << "uncaught exception" << endl;
+  exit(1);
+}
+
+void
+fpe_handler(int sig, siginfo_t* sip, void*) {
+  if (sig != SIGFPE) {
+    cerr << "fpe_handler called on signal different from SIGFPE" << endl;
+    exit(1);
+  }
+  const char* s = 0;
+  switch (sip->si_code) {
+  case FPE_INTDIV:
+    s = "integer divide by zero";
+    break;
+  case FPE_INTOVF:
+    s = "integer overflow";
+    break;
+  case FPE_FLTDIV:
+    s = "floating point divide by zero";
+    break;
+  case FPE_FLTOVF:
+    s = "floating point overflow";
+    break;
+  case FPE_FLTUND:
+    s = "floating point underflow";
+    break;
+  case FPE_FLTRES:
+    s = "floating point inexact result";
+    break;
+  case FPE_FLTINV:
+    s = "floating point invalid operation";
+    break;
+  case FPE_FLTSUB:
+    s = "subscript out of range";
+    break;
+  default:
+    break;
+  }
+  if (s != 0)
+    cerr << "SIGFPE caught (cause: " << s << ")" << endl;
+  else {
+    cerr << "SIGFPE caught (unknown si_code " << sip->si_code << ")" << endl;
+#ifdef HAVE_FENV_H
+    cerr << "Inquire with fetestexcept(): ";
+    if (fetestexcept(FE_INEXACT))
+      cerr << "FE_INEXACT ";
+    if (fetestexcept(FE_DIVBYZERO))
+      cerr << "FE_DIVBYZERO ";
+    if (fetestexcept(FE_UNDERFLOW))
+      cerr << "FE_UNDERFLOW ";
+    if (fetestexcept(FE_OVERFLOW))
+      cerr << "FE_OVERFLOW ";
+    if (fetestexcept(FE_INVALID))
+      cerr << "FE_INVALID ";
+    cerr << endl;
+#endif
+  }
+  exit(1);
+}
+
+} // namespace
+
+void
+set_handlers() {
+  struct sigaction action;
+  action.sa_sigaction = fpe_handler;
+  sigemptyset(&action.sa_mask);
+  action.sa_flags = SA_SIGINFO;
+  if (sigaction(SIGFPE, &action, NULL) != 0) {
+    cerr << "sigaction() failed" << endl;
+    abort();
+  }
+
+  set_unexpected(unexpected_exception_handler);
+  set_terminate(uncaught_exception_handler);
+}
+
+bool
+PPL::check_distance(const Checked_Number<mpq_class, Extended_Number_Policy>& d,
+		    const char* max_d_s, const char* d_name) {
+  Checked_Number<mpq_class, Extended_Number_Policy>
+    max_d((max_d_s ? max_d_s : "0"), ROUND_NOT_NEEDED);
+  assert(max_d >= 0);
+  if (d > max_d) {
+    Checked_Number<float, Extended_Number_Policy> dd(d, ROUND_UP);
+    nout << "Excessive " << d_name << " distance " << dd
+	 << ": should be at most " << max_d << "."
+	 << endl;
+    return false;
+  }
+  else
+    return true;
+}
diff --git a/tests/ppl_test.hh b/tests/ppl_test.hh
new file mode 100644
index 0000000..c9e5513
--- /dev/null
+++ b/tests/ppl_test.hh
@@ -0,0 +1,390 @@
+/* Header file for test programs.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_test_hh
+#define PPL_ppl_test_hh 1
+
+#include "ppl.hh"
+#include "print.hh"
+#include "Partial_Function.defs.hh"
+#include "Random_Number_Generator.defs.hh"
+#include <stdexcept>
+#include <sstream>
+#include <list>
+#include <string>
+
+using namespace std;
+using namespace Parma_Polyhedra_Library;
+
+void
+set_handlers();
+
+#define TRY try
+
+#define CATCH \
+catch (const std::overflow_error& e) { \
+  std::cerr << "arithmetic overflow (" << e.what() << ")" \
+            << std::endl; \
+  exit(1); \
+} \
+catch (const std::exception& e) { \
+  std::cerr << "std::exception caught: " \
+            << e.what() << " (type == " << typeid(e).name() << ")" \
+            << std::endl; \
+  exit(1); \
+}
+
+#define BEGIN_MAIN				\
+int						\
+main() try {					\
+  set_handlers();				\
+  bool succeeded = false;			\
+  list<string> failed_tests;
+
+#define END_MAIN							\
+  if (failed_tests.empty())						\
+    return 0;								\
+  else {								\
+    std::cerr << "failed tests: ";					\
+    copy(failed_tests.begin(), failed_tests.end(),			\
+	 ostream_iterator<string>(cerr, " "));				\
+    std::cerr << std::endl;						\
+    return 1;								\
+  }									\
+}									\
+catch (const std::overflow_error& e) {					\
+  std::cerr << "arithmetic overflow (" << e.what() << ")"		\
+            << std::endl;						\
+  exit(1);								\
+}									\
+catch (const std::exception& e) {					\
+  std::cerr << "std::exception caught: "				\
+	    << e.what() << " (type == " << typeid(e).name() << ")"	\
+	    << std::endl;						\
+  exit(1);								\
+}
+
+#define ANNOUNCE_TEST(test)		 \
+  nout << "\n=== " #test " ===" << endl
+
+#define RUN_TEST(test)							\
+  try {									\
+    succeeded = test();							\
+  }									\
+  catch (const std::overflow_error& e) {				\
+    nout << "arithmetic overflow (" << e.what() << ")"			\
+	 << std::endl;							\
+    succeeded = false;							\
+  }									\
+  catch (const std::exception& e) {					\
+    nout << "std::exception caught: "					\
+	 << e.what() << " (type == " << typeid(e).name() << ")"		\
+	 << std::endl;							\
+    succeeded = false;							\
+  }									\
+  catch (...) {								\
+    nout << "unknown exception caught"					\
+	 << std::endl;							\
+    succeeded = false;							\
+  }
+
+#define DO_TEST(test)			 \
+  ANNOUNCE_TEST(test);			 \
+  RUN_TEST(test);			 \
+  if (!succeeded)			 \
+    failed_tests.push_back(#test);
+
+#define DO_TEST_F(test)			 \
+  ANNOUNCE_TEST(test);			 \
+  RUN_TEST(test);			 \
+  if (succeeded)			 \
+    failed_tests.push_back(#test);
+
+#if COEFFICIENT_BITS == 0
+
+#define DO_TEST_F64(test) DO_TEST(test)
+#define DO_TEST_F32(test) DO_TEST(test)
+#define DO_TEST_F16(test) DO_TEST(test)
+#define DO_TEST_F16A(test) DO_TEST(test)
+#define DO_TEST_F8(test) DO_TEST(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#elif COEFFICIENT_BITS == 64
+
+#define DO_TEST_F64(test) DO_TEST_F(test)
+#define DO_TEST_F32(test) DO_TEST(test)
+#define DO_TEST_F16(test) DO_TEST(test)
+#define DO_TEST_F16A(test) DO_TEST(test)
+#define DO_TEST_F8(test) DO_TEST(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#elif COEFFICIENT_BITS == 32
+
+#define DO_TEST_F64(test) DO_TEST_F(test)
+#define DO_TEST_F32(test) DO_TEST_F(test)
+#define DO_TEST_F16(test) DO_TEST(test)
+#define DO_TEST_F16A(test) DO_TEST(test)
+#define DO_TEST_F8(test) DO_TEST(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#elif COEFFICIENT_BITS == 16
+
+#ifdef NDEBUG
+
+#define DO_TEST_F64(test) DO_TEST_F(test)
+#define DO_TEST_F32(test) DO_TEST_F(test)
+#define DO_TEST_F16(test) DO_TEST_F(test)
+#define DO_TEST_F16A(test) DO_TEST(test)
+#define DO_TEST_F8(test) DO_TEST(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#else
+
+#define DO_TEST_F64(test) DO_TEST_F(test)
+#define DO_TEST_F32(test) DO_TEST_F(test)
+#define DO_TEST_F16(test) DO_TEST_F(test)
+#define DO_TEST_F16A(test) DO_TEST_F(test)
+#define DO_TEST_F8(test) DO_TEST(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#endif // !defined(NDEBUG)
+
+#elif COEFFICIENT_BITS == 8
+
+#ifdef NDEBUG
+
+#define DO_TEST_F64(test) DO_TEST_F(test)
+#define DO_TEST_F32(test) DO_TEST_F(test)
+#define DO_TEST_F16(test) DO_TEST_F(test)
+#define DO_TEST_F16A(test) DO_TEST_F(test)
+#define DO_TEST_F8(test) DO_TEST_F(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#else
+
+#define DO_TEST_F64(test) DO_TEST_F(test)
+#define DO_TEST_F32(test) DO_TEST_F(test)
+#define DO_TEST_F16(test) DO_TEST_F(test)
+#define DO_TEST_F16A(test) DO_TEST_F(test)
+#define DO_TEST_F8(test) DO_TEST_F(test)
+#define DO_TEST_F8A(test) DO_TEST_F(test)
+
+#endif // !defined(NDEBUG)
+
+#endif // COEFFICIENT_BITS == 8
+
+
+// Turn s into a string: PPL_TEST_STR(x + y) => "x + y".
+#define PPL_TEST_STR(s) #s
+
+// Turn the expansion of s into a string: PPL_TEST_XSTR(x) => "s expanded".
+#define PPL_TEST_XSTR(s) PPL_TEST_STR(s)
+
+// These using directive and declaration are just to avoid the
+// corresponding namespace qualifications in all the tests.
+using namespace Parma_Polyhedra_Library;
+using std::endl;
+
+
+#ifdef DERIVED_TEST
+#define C_Polyhedron NNC_Polyhedron
+#endif
+
+#ifndef BD_SHAPE_INSTANCE
+#define BD_SHAPE_INSTANCE mpq_class
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+//! Utility typedef to allow a macro argument to denote the long double type.
+typedef long double long_double;
+
+//! The incarnation of BD_Shape under test.
+typedef BD_Shape<BD_SHAPE_INSTANCE> TBD_Shape;
+
+bool
+check_distance(const Checked_Number<mpq_class, Extended_Number_Policy>& d,
+	       const char* max_d_s, const char* d_name);
+
+template <typename T>
+bool
+check_result_i(const BD_Shape<T>& computed_result,
+	       const BD_Shape<mpq_class>& known_result,
+	       const char* max_r_d_s,
+	       const char* max_e_d_s,
+	       const char* max_l_d_s) {
+  using namespace IO_Operators;
+  BD_Shape<mpq_class> q_computed_result(computed_result);
+  // Handle in a more efficient way the case where equality is expected.
+  if (max_r_d_s == 0 && max_e_d_s == 0 && max_l_d_s == 0) {
+    if (q_computed_result != known_result) {
+      nout << "Equality does not hold:"
+	   << "\ncomputed result is\n"
+	   << q_computed_result
+	   << "\nknown result is\n"
+	   << known_result
+	   << endl;
+      return false;
+    }
+    else
+      return true;
+  }
+
+  if (!q_computed_result.contains(known_result)) {
+    nout << "Containment does not hold:"
+	 << "\ncomputed result is\n"
+	 << q_computed_result
+	 << "\nknown result is\n"
+	 << known_result
+	 << endl;
+    return false;
+  }
+
+  Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+  rectilinear_distance_assign(r_d, known_result, q_computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> e_d;
+  euclidean_distance_assign(e_d, known_result, q_computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> l_d;
+  l_infinity_distance_assign(l_d, known_result, q_computed_result, ROUND_UP);
+  bool ok_r = check_distance(r_d, max_r_d_s, "rectilinear");
+  bool ok_e = check_distance(e_d, max_e_d_s, "euclidean");
+  bool ok_l = check_distance(l_d, max_l_d_s, "l_infinity");
+  bool ok = ok_r && ok_e && ok_l;
+  if (!ok) {
+    nout << "Computed result is\n"
+	 << q_computed_result
+	 << "\nknown result is\n"
+	 << known_result
+	 << endl;
+  }
+  return ok;
+}
+
+template <typename T>
+bool
+check_result(const BD_Shape<T>& computed_result,
+	     const BD_Shape<mpq_class>& known_result,
+	     const char* max_r_d_s,
+	     const char* max_e_d_s,
+	     const char* max_l_d_s) {
+  return std::numeric_limits<T>::is_integer
+    ? check_result_i(computed_result, known_result,
+		     "+inf", "+inf", "+inf")
+    : check_result_i(computed_result, known_result,
+		     max_r_d_s, max_e_d_s, max_l_d_s);
+}
+
+template <>
+inline bool
+check_result(const BD_Shape<mpq_class>& computed_result,
+	     const BD_Shape<mpq_class>& known_result,
+	     const char*,
+	     const char*,
+	     const char*) {
+  return check_result_i(computed_result, known_result,
+			0, 0, 0);
+}
+
+template <typename T>
+bool
+check_result(const BD_Shape<T>& computed_result,
+	     const BD_Shape<mpq_class>& known_result) {
+  return std::numeric_limits<T>::is_integer
+    ? check_result_i(computed_result, known_result, "+inf", "+inf", "+inf")
+    : check_result_i(computed_result, known_result, 0, 0, 0);
+}
+
+//! Compare copies of \p a and \p b.
+/*!
+  Comparing temporary copies ensures that the underlying
+  representation of \p a and \p b stays the same.
+*/
+template <typename T>
+inline bool
+copy_compare(const T& a, const T& b) {
+  const T tem_a = a;
+  const T tem_b = b;
+  return tem_a == tem_b;
+}
+
+//! Look for variation in \p a.
+/*!
+  Return <CODE>true</CODE> if \p a contains variation from
+  consistency, else return <CODE>false</CODE>.  Variation can be found
+  via the OK method, or via a comparison between \p a and an object
+  created from the ASCII dump of \p a.
+
+  It is assumed that \p a is up to date.
+
+  If the loading of the ASCII dump fails then an error message is
+  printed and `exit' is called.
+
+  \p T must provide:
+    void ascii_dump(std::ostream& s) const;
+    bool ascii_load(std::istream& s);
+  and there must be a:
+    bool operator==(const T& x, const T& y);
+*/
+template <typename T>
+static bool
+find_variation(T& a) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+
+  if (!a.OK()) {
+    nout << "OK() failed\nASCII dump:" << endl;
+    a.ascii_dump(nout);
+    return true;
+  }
+
+  /* FIX In some PPL classes (e.g. Congruence) the simple constructors
+     are private. */
+  //T b;
+  T b(a);
+  stringstream dump;
+  a.ascii_dump(dump);
+  if (!b.ascii_load(dump)) {
+    nout << "Failed to load `b' from the ASCII dump of `a'." << endl;
+    nout << "ASCII dump of `a':" << endl;
+    nout << dump.str();
+    exit(1);
+  }
+
+  if (a == b)
+    return false;
+
+  nout << "`b' loaded from ASCII dump of `a' should equal `a'" << endl
+       << "ASCII dump of `a':" << endl
+       << "------------------" << endl;
+  a.ascii_dump(nout);
+  nout << "ASCII dump of `b' (after comparison):" << endl
+       << "-------------------------------------" << endl;
+  b.ascii_dump(nout);
+  nout << "ASCII dump of `a' (after comparison):" << endl
+       << "-------------------------------------" << endl;
+  a.ascii_dump(nout);
+
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_ppl_test_hh)
diff --git a/tests/print.cc b/tests/print.cc
new file mode 100644
index 0000000..48f62a7
--- /dev/null
+++ b/tests/print.cc
@@ -0,0 +1,158 @@
+/* Implementation of simple print functions used in test programs.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "print.hh"
+#include "ppl.hh"
+#include "Partial_Function.defs.hh"
+#include <iostream>
+#include <string>
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+void
+print_constraint(const Constraint& c,
+		 const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  s << c << std::endl;
+}
+
+void
+print_constraints(const Polyhedron& ph,
+		  const std::string& intro, std::ostream& s) {
+  print_constraints(ph.constraints(), intro, s);
+}
+
+void
+print_constraints(const Constraint_System& cs,
+		  const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  Constraint_System::const_iterator i = cs.begin();
+  Constraint_System::const_iterator cs_end = cs.end();
+  bool printed_something = i != cs_end;
+  while (i != cs_end) {
+    s << *i++;
+    if (i != cs_end)
+      s << ",\n";
+  }
+  s << (printed_something ? "." : "true.") << std::endl;
+}
+
+void
+print_congruence(const Congruence& c,
+		 const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  s << c << std::endl;
+}
+
+void
+print_congruences(const Congruence_System& cs,
+		  const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << std::endl;
+  Congruence_System::const_iterator i = cs.begin();
+  Congruence_System::const_iterator cs_end = cs.end();
+  bool printed_something = i != cs_end;
+  while (i != cs_end) {
+    s << *i++;
+    if (i != cs_end)
+      s << "," << std::endl;
+  }
+  s << (printed_something ? "." : "true.") << std::endl;
+}
+
+void
+print_congruences(const Grid& gr,
+		  const std::string& intro, std::ostream& s) {
+  print_congruences(gr.congruences(), intro, s);
+}
+
+void
+print_generator(const Generator& g,
+		const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  s << g << std::endl;
+}
+
+void
+print_generator(const Grid_Generator& g,
+		const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  s << g << std::endl;
+}
+
+void
+print_generators(const Polyhedron& ph,
+		 const std::string& intro, std::ostream& s) {
+  print_generators(ph.generators(), intro, s);
+}
+
+void
+print_generators(const Grid& gr,
+		 const std::string& intro, std::ostream& s) {
+  print_generators(gr.generators(), intro, s);
+}
+
+void
+print_generators(const Generator_System& gs,
+		 const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  Generator_System::const_iterator i = gs.begin();
+  Generator_System::const_iterator gs_end = gs.end();
+  bool printed_something = i != gs_end;
+  while (i != gs_end) {
+    s << *i++;
+    if (i != gs_end)
+      s << ",\n";
+  }
+  s << (printed_something ? "." : "false.") << std::endl;
+}
+
+void
+print_generators(const Grid_Generator_System& gs,
+		 const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  Grid_Generator_System::const_iterator i = gs.begin();
+  Grid_Generator_System::const_iterator gs_end = gs.end();
+  bool printed_something = i != gs_end;
+  while (i != gs_end) {
+    s << *i++;
+    if (i != gs_end)
+      s << ",\n";
+  }
+  s << (printed_something ? "." : "false.") << std::endl;
+}
+
+void
+print_function(const Partial_Function& function,
+	       const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << std::endl;
+  function.print(s);
+}
diff --git a/tests/print.hh b/tests/print.hh
new file mode 100644
index 0000000..4f9bdf6
--- /dev/null
+++ b/tests/print.hh
@@ -0,0 +1,186 @@
+/* Declaration of simple print functions used in test programs.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_print_hh
+#define PPL_print_hh 1
+
+#include "ppl.hh"
+#include "Partial_Function.types.hh"
+#include <string>
+#include <iostream>
+
+#ifndef NOISY
+#define NOISY 0
+#endif
+
+#ifndef VERY_NOISY
+#define VERY_NOISY 0
+#endif
+
+static bool
+check_noisy(const char* environment_variable) {
+#if HAVE_DECL_GETENV 
+  return getenv(environment_variable) != 0;
+#else
+#if NOISY
+  if (strcmp(environment_variable, "PPL_NOISY_TESTS") == 0)
+    return true;
+#endif
+#if VERY_NOISY
+  if (strcmp(environment_variable, "PPL_VERY_NOISY_TESTS") == 0)
+    return true;
+#endif
+  return false;
+#endif
+}
+
+template<typename CharT, typename Traits = std::char_traits<CharT> >
+class nullbuf : public std::basic_streambuf<CharT, Traits> {
+protected:
+  virtual typename Traits::int_type overflow(typename Traits::int_type c) {
+    return Traits::not_eof(c);
+  }
+};
+
+template <class CharT, class Traits = std::char_traits<CharT> >
+class noisy_ostream : public std::basic_ostream<CharT, Traits> {
+private:
+  nullbuf<CharT, Traits> black_hole;
+
+public:
+  noisy_ostream(const std::basic_ostream<CharT, Traits>& os,
+		const char* environment_variable)
+    : std::basic_ostream<CharT, Traits>(check_noisy(environment_variable)
+					? os.rdbuf()
+					: &black_hole) {
+  }
+};
+
+static noisy_ostream<char> nout(std::cout, "PPL_NOISY_TESTS");
+static noisy_ostream<char> vnout(std::cout, "PPL_VERY_NOISY_TESTS");
+
+// FIX use inline function?
+#define dump_grids(grid,known_grid)			\
+  nout << endl << "ASCII dump of grid:" << endl;	\
+  grid.ascii_dump(nout);				\
+  nout << endl << "ASCII dump of known grid:" << endl;	\
+  known_grid.ascii_dump(nout);
+
+void
+print_constraint(const Parma_Polyhedra_Library::Constraint& c,
+		 const std::string& intro = "",
+		 std::ostream& s = nout);
+
+void
+print_constraints(const Parma_Polyhedra_Library::Constraint_System& cs,
+		  const std::string& intro = "",
+		  std::ostream& s = nout);
+
+void
+print_constraints(const Parma_Polyhedra_Library::Polyhedron& ph,
+		  const std::string& intro = "",
+		  std::ostream& s = nout);
+
+template <typename T>
+void
+print_constraints(const Parma_Polyhedra_Library::BD_Shape<T>& bd,
+		  const std::string& intro = "",
+		  std::ostream& s = nout) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  if (!intro.empty())
+    s << intro << std::endl;
+  s << bd << std::endl;
+}
+
+template <typename PH>
+void
+print_constraints(const Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& pps,
+		  const std::string& intro = "",
+		  std::ostream& s = nout) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  if (!intro.empty())
+    s << intro << std::endl;
+  s << pps << std::endl;
+}
+
+template <typename PH>
+void
+print_congruences(const Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& pps,
+		  const std::string& intro = "",
+		  std::ostream& s = nout) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  if (!intro.empty())
+    s << intro << std::endl;
+  s << pps << std::endl;
+}
+
+void
+print_congruence(const Parma_Polyhedra_Library::Congruence& c,
+		 const std::string& intro = "",
+		 std::ostream& s = nout);
+
+void
+print_congruences(const Parma_Polyhedra_Library::Congruence_System& cgs,
+		  const std::string& intro = "",
+		  std::ostream& s = nout);
+
+void
+print_congruences(const Parma_Polyhedra_Library::Grid& gr,
+		  const std::string& intro = "",
+		  std::ostream& s = nout);
+
+void
+print_generator(const Parma_Polyhedra_Library::Generator& g,
+		const std::string& intro = "",
+		std::ostream& s = nout);
+
+void
+print_generator(const Parma_Polyhedra_Library::Grid_Generator& g,
+		const std::string& intro = "",
+		std::ostream& s = nout);
+
+void
+print_generators(const Parma_Polyhedra_Library::Generator_System& gs,
+		 const std::string& intro = "",
+		 std::ostream& s = nout);
+
+void
+print_generators(const Parma_Polyhedra_Library::Grid_Generator_System& gs,
+		 const std::string& intro = "",
+		 std::ostream& s = nout);
+
+void
+print_generators(const Parma_Polyhedra_Library::Polyhedron& ph,
+		 const std::string& intro = "",
+		 std::ostream& s = nout);
+
+void
+print_generators(const Parma_Polyhedra_Library::Grid& gr,
+		 const std::string& intro = "",
+		 std::ostream& s = nout);
+
+void
+print_function(const Parma_Polyhedra_Library::Partial_Function& function,
+	       const std::string& intro = "",
+	       std::ostream& s = nout);
+
+#endif // !defined(PPL_print_hh)
diff --git a/utils/Makefile.am b/utils/Makefile.am
new file mode 100644
index 0000000..364c235
--- /dev/null
+++ b/utils/Makefile.am
@@ -0,0 +1,58 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+AM_CPPFLAGS = @extra_includes@
+
+noinst_LIBRARIES = libppl_utils.a
+libppl_utils_a_SOURCES = \
+timings.hh \
+timings.cc
+
+dist_noinst_SCRIPTS = \
+build_header.in \
+text2cxxarray.in
+
+noinst_SCRIPTS = \
+build_header \
+text2cxxarray
+
+# Even if the scripts listed in noinst_SCRIPTS are not distributed
+# (only the corresponding *.in files are), we need them to actually
+# generating the distribution.  Using dist-hook is the best solution
+# we came up with to obtain this effect.
+dist-hook: $(noinst_SCRIPTS)
+
+generated_automatically = Generated automatically: \
+do not modify; modify the .in file instead.
+
+do_subst = sed -e 's,[@]PERL[@],$(PERL),g' \
+	-e 's,[@]generated_automatically[@],$(generated_automatically),g'
+
+build_header: build_header.in Makefile
+	$(do_subst) < $(srcdir)/build_header.in > build_header
+	chmod +x build_header
+
+text2cxxarray: text2cxxarray.in Makefile
+	$(do_subst) < $(srcdir)/text2cxxarray.in > text2cxxarray
+	chmod +x text2cxxarray
+
+CLEANFILES = $(noinst_SCRIPTS)
diff --git a/utils/Makefile.in b/utils/Makefile.in
new file mode 100644
index 0000000..2375330
--- /dev/null
+++ b/utils/Makefile.in
@@ -0,0 +1,592 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = utils
+DIST_COMMON = $(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+libppl_utils_a_AR = $(AR) $(ARFLAGS)
+libppl_utils_a_LIBADD =
+am_libppl_utils_a_OBJECTS = timings.$(OBJEXT)
+libppl_utils_a_OBJECTS = $(am_libppl_utils_a_OBJECTS)
+SCRIPTS = $(dist_noinst_SCRIPTS) $(noinst_SCRIPTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_utils_a_SOURCES)
+DIST_SOURCES = $(libppl_utils_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+AM_CPPFLAGS = @extra_includes@
+noinst_LIBRARIES = libppl_utils.a
+libppl_utils_a_SOURCES = \
+timings.hh \
+timings.cc
+
+dist_noinst_SCRIPTS = \
+build_header.in \
+text2cxxarray.in
+
+noinst_SCRIPTS = \
+build_header \
+text2cxxarray
+
+generated_automatically = Generated automatically: \
+do not modify; modify the .in file instead.
+
+do_subst = sed -e 's,[@]PERL[@],$(PERL),g' \
+	-e 's,[@]generated_automatically[@],$(generated_automatically),g'
+
+CLEANFILES = $(noinst_SCRIPTS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  utils/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  utils/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libppl_utils.a: $(libppl_utils_a_OBJECTS) $(libppl_utils_a_DEPENDENCIES) 
+	-rm -f libppl_utils.a
+	$(libppl_utils_a_AR) libppl_utils.a $(libppl_utils_a_OBJECTS) $(libppl_utils_a_LIBADD)
+	$(RANLIB) libppl_utils.a
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timings.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES) $(SCRIPTS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-libtool clean-noinstLIBRARIES ctags dist-hook distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags uninstall uninstall-am \
+	uninstall-info-am
+
+
+# Even if the scripts listed in noinst_SCRIPTS are not distributed
+# (only the corresponding *.in files are), we need them to actually
+# generating the distribution.  Using dist-hook is the best solution
+# we came up with to obtain this effect.
+dist-hook: $(noinst_SCRIPTS)
+
+build_header: build_header.in Makefile
+	$(do_subst) < $(srcdir)/build_header.in > build_header
+	chmod +x build_header
+
+text2cxxarray: text2cxxarray.in Makefile
+	$(do_subst) < $(srcdir)/text2cxxarray.in > text2cxxarray
+	chmod +x text2cxxarray
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/utils/build_header.in b/utils/build_header.in
new file mode 100644
index 0000000..4ebe2f3
--- /dev/null
+++ b/utils/build_header.in
@@ -0,0 +1,102 @@
+#! @PERL@
+# -*- Perl -*-
+# @generated_automatically@
+
+eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
+    if 0;
+
+# Builds a self-contained C++ header file by performing recursive inclusion.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+sub filter($$$$);
+sub filter($$$$) {
+    my ($file, $dirs, $level, $files) = @_;
+    return if (exists($$files{$file}));
+    $$files{$file} = undef;
+    my $fh;
+    open $fh, $file or die "Cannot open $file";
+    my $comment = 0;
+    my $copyright = 0;
+    my $print_from = 1;
+    while (my $line = <$fh>) {
+	my $iname;
+	if (($iname) = ($line =~ '^\s*#include\s+"([^"]+)"\s*\n$')) {
+	    my $lineno = $.;
+	    my $ifile;
+	    foreach my $idir (@$dirs) {
+		$ifile = $idir . '/' . $iname;
+		last if -e $ifile;
+	    }
+	    filter($ifile, $dirs, $level+1, $files);
+	    $print_from = 1;
+	    next;
+	}
+	if ($level > 0) {
+	    if ($print_from) {
+		print "// Automatically generated from PPL source file $file line $.\n";
+		$print_from = 0;
+	    }
+	    next if ($line =~ '^\s*#ifndef\s+PPL_[A-Za-z0-9_]+_hh\s*$');
+	    next if ($line =~ '^\s*#define\s+PPL_[A-Za-z0-9_]+_hh(\s+1)?\s*$');
+	    next if ($line =~ '^\s*#endif\s*//\s*!defined\(PPL_[A-Za-z0-9_]+_hh\)\s*$');
+	    if ($line =~ '/\*') {
+		$comment = 1;
+	    }
+	    if ($comment && $line =~ 'Copyright.*Roberto Bagnara <bagnara at cs.unipr.it>') {
+		$copyright = 1;
+		print "*/\n" unless $line =~ '/\*';
+	    }
+	    if ($line =~ '\*/') {
+		$comment = 0;
+		if ($copyright) {
+		    $copyright = 0;
+		    next;
+		}
+	    }
+	    next if $copyright;
+	}
+	print $line;
+    }
+    close $fh;
+
+}
+
+
+my @dirs;
+
+unless (GetOptions("I=s" => \@dirs) && @ARGV == 1) {
+    print STDERR "Usage: $0 [-I dir]... file\n";
+    exit;
+}
+my $file = $ARGV[0];
+
+my ($dir, $name) = ($file =~ '^(?:(.*)/)?([^/]+)$');
+$dir = '.' unless defined($dir);
+unshift @dirs, $dir; 
+
+my %files;
+
+filter($file, \@dirs, 0, \%files);
diff --git a/utils/text2cxxarray.in b/utils/text2cxxarray.in
new file mode 100644
index 0000000..2dcac65
--- /dev/null
+++ b/utils/text2cxxarray.in
@@ -0,0 +1,61 @@
+#! @PERL@
+# -*- Perl -*-
+# @configure_input@
+
+eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
+    if 0;
+
+# Convert an ASCII text into the declaration of a C++ array.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+use Getopt::Long;
+
+sub usage {
+	print STDERR <<EOF;
+Convert ASCII text into the declaration of a C++ array.
+Usage: text2cxxarray [OPTIONS] [FILE ...]
+  [FILE ...]                  ASCII text file(s) to convert.
+
+  [OPTIONS]
+    --name=NAME               Use NAME as the array name.
+    -h, --help                Display this help message.
+EOF
+        exit 1;
+}
+
+my $array_name = "a";
+
+GetOptions(
+	'name=s' => \$array_name,
+	'help|h' => \&usage,
+) || usage();
+
+print "extern const char* const $array_name" . "[] = {\n";
+while (<>) {
+    chop;
+    s/\\/\\\\/g;
+    s/\t/\\t/g;
+    s/\"/\\"/g;
+    print "  \"$_\",\n";
+}
+print "  0";
+print "};\n";
diff --git a/utils/timings.cc b/utils/timings.cc
new file mode 100644
index 0000000..1c30d82
--- /dev/null
+++ b/utils/timings.cc
@@ -0,0 +1,88 @@
+/* Definitions of simple functions for printing timings.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "timings.hh"
+#include <cassert>
+#include <ctime>
+#include <iostream>
+#include <iomanip>
+#include <cstring>
+#include <cerrno>
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., `ru_utime'.
+# include <sys/resource.h>
+#endif
+
+using namespace std;
+
+// To save the time when start_clock is called.
+static struct timeval saved_ru_utime;
+
+void
+start_clock() {
+  struct rusage rsg;
+  if (getrusage(RUSAGE_SELF, &rsg) != 0) {
+    cerr << "getrusage failed: " << strerror(errno) << endl;
+    exit(1);
+  }
+  else
+    saved_ru_utime = rsg.ru_utime;
+}
+
+void
+print_clock(ostream& s) {
+  struct rusage rsg;
+  if (getrusage(RUSAGE_SELF, &rsg) != 0) {
+    cerr << "getrusage failed: " << strerror(errno) << endl;
+    exit(1);
+  }
+  else {
+    time_t current_secs = rsg.ru_utime.tv_sec;
+    time_t current_usecs = rsg.ru_utime.tv_usec;
+    time_t saved_secs = saved_ru_utime.tv_sec;
+    time_t saved_usecs = saved_ru_utime.tv_usec;
+    time_t secs;
+    time_t hsecs;
+    secs = current_secs - saved_secs;
+    if (current_usecs < saved_usecs) {
+      hsecs = (((1000000 + current_usecs) - saved_usecs) + 5000) / 10000;
+      if (hsecs < 100)
+	--secs;
+      else
+	hsecs = 0;
+    }
+    else
+      hsecs = ((current_usecs - saved_usecs) + 5000) / 10000;
+    assert(hsecs >= 0 && hsecs < 100 && secs >= 0);
+    int fill_char = s.fill();
+    s << secs << "." << setfill('0') << setw(2) << hsecs;
+    s.fill(fill_char);
+  }
+}
diff --git a/utils/timings.hh b/utils/timings.hh
new file mode 100644
index 0000000..73a8fb4
--- /dev/null
+++ b/utils/timings.hh
@@ -0,0 +1,31 @@
+/* Declaration of simple functions for printing timings.
+   Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_timings_hh
+#define PPL_timings_hh 1
+
+#include <iosfwd>
+
+void start_clock();
+void print_clock(std::ostream& s);
+
+#endif // !defined(PPL_timings_hh)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ppl.git



More information about the debian-science-commits mailing list